package main import ( "bufio" "database/sql" "fmt" _ "github.com/alexbrainman/odbc" "log" "net" "net/url" "os" "strings" ) func main() { // Open connection to DB db, err := sql.Open("odbc", "DSN=dsn;UID=username;PWD=password") if err != nil { log.Fatal(err) } // Accept Standard Input scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { // Put the squid input into an array fields := strings.Fields(scanner.Text()) // Database query variables var ( blockReason int override int userType int exam int banned int realTime int typeOverride int ) // Assorted variables and IP manipulation username := fields[2] ip := strings.TrimLeft(fields[1], "/") split := strings.Split(ip, ".") roomIP := split[2] // URL parsing and trimming url, err := url.Parse(fields[0]) if err != nil { log.Fatal(err) } host, _, err := net.SplitHostPort(url.Host) if err != nil { host = url.Host } if strings.HasPrefix(host, "www.") { host = strings.TrimPrefix(host, "www.") } // Database query err = db.QueryRow(`SELECT TOP 1 ISNULL((SELECT reason FROM urlAddress WHERE urlAddress = ?),0) AS blockReason, (SELECT COUNT(*) FROM override O INNER JOIN urlAddress A ON O.add_id = A.add_id WHERE A.urlAddress = ? AND roomIP = ? AND DATEDIFF(SECOND, allowFrom, GETDATE()) >=0 AND DATEDIFF(SECOND, GETDATE(), allowTo) >= 0) AS override, ISNULL((SELECT userType FROM userCache WHERE userName = ?),1) AS userType, (SELECT COUNT(*) FROM userCache WHERE userName = ? AND userType = 4) AS exam, (SELECT COUNT(*) FROM userBanned WHERE userName = ?) AS banned, 1- (SELECT COUNT(*) FROM realTimeBan B INNER JOIN realTimeURL U ON B.radd_id = U.radd_id WHERE machineIP = ? AND urlAddress = ? AND DATEDIFF(MINUTE, GETDATE(), DATEADD(MINUTE, override, overrideTime)) >= 0) AS realTime, (SELECT COUNT(*) FROM userTypeOverride O INNER JOIN urlAddress A ON O.add_id = A.add_id WHERE A.urlAddress = ? AND userType = (SELECT userType FROM userCache WHERE userName = ?)) AS typeOverride `, host, host, roomIP, username, username, username, ip, host, host, username).Scan(&blockReason, &override, &userType, &exam, &banned, &realTime, &typeOverride) if err != nil { log.Fatal(err) } // Blocking if roomIP == "18" && host == "youtube.com" { if realTime != 1 { fmt.Println("") } else { fmt.Println("http://10.10.254.254/block.php") } } if blockReason == 0 && banned == 0 { fmt.Println("") } else { if exam == 1 { fmt.Println("http://10.10.254.254/exam.php") } if typeOverride != 1 { fmt.Println("http://10.10.254.254/block.php") } else { fmt.Println("") } } } // Close connection to DB defer db.Close() }