diff --git a/check_http.go b/check_http.go new file mode 100644 index 0000000..faddc20 --- /dev/null +++ b/check_http.go @@ -0,0 +1,144 @@ +package main + +import ( + "io/ioutil" + "net" + "strings" + "os" + "sync" + "log" + "regexp" + "crypto/tls" +// "encoding/json" + "gopkg.in/yaml.v2" + "github.com/olekukonko/tablewriter" +) + +type Domain struct{ + Domain string `yaml:"domain"` + Find string `yaml:"regex"` +} + +type Settings struct { + Ipv4 bool `yaml:"ipv4"` + Ipv6 bool `yaml:"ipv6"` + Domains []Domain `yaml:"domains"` +} + +type StatusDomain struct{ + Domain string + Ipv4_http int + Ipv6_http int + Ipv4_https int + Ipv6_https int +} + +var ( + statusoutput = make(chan StatusDomain,5) + outputwg = sync.WaitGroup{} + domainwg = sync.WaitGroup{} + config = &Settings{} +) +func main() { + readConfig() + outputwg.Add(1) + go printTable() + + for _,domain := range config.Domains{ + domainwg.Add(1) + fetchDomain(domain) + } + domainwg.Wait() + close(statusoutput) + outputwg.Wait() + +} +func fetchDomain(domain Domain){ + n := StatusDomain{Domain:domain.Domain} + find,err := regexp.Compile(domain.Find) + if err !=nil{ + log.Println(err) + } + + if config.Ipv4 { + n.Ipv4_http = requestHttp("tcp4",domain.Domain,find) + n.Ipv4_https = requestHttps("tcp4",domain.Domain,find) + } + if config.Ipv6 { + n.Ipv6_http = requestHttp("tcp6",domain.Domain,find) + n.Ipv6_https = requestHttps("tcp6",domain.Domain,find) + } + statusoutput <- n + domainwg.Done() +} +func printTable(){ + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Domain", "IPv4", "IPv6", "SSL-IPv4", "SSL-IPv6"}) + for v := range statusoutput { + table.Append([]string{v.Domain,printStatus(v.Ipv4_http),printStatus(v.Ipv6_http),printStatus(v.Ipv4_https),printStatus(v.Ipv6_https)}) + } + table.Render() + outputwg.Done() +} +func printStatus(s int) string{ + switch s { + case 1: + return "0"; + case 200: + return "W"; + case 300: + return "30"; + + } + return "E"; +} + +func requestHttp(tcp, domain string,find *regexp.Regexp) int { + conn, err := net.Dial(tcp, domain+":http") + handleError(err) + _, err = conn.Write([]byte("GET / HTTP/1.0\nHOST: "+domain+"\r\n\r\n")) + handleError(err) + result, _ := ioutil.ReadAll(conn) + return requestOutputInterpreter(result,find,false,false) +} +func requestHttps(tcp, domain string,find *regexp.Regexp) int { + conf := tls.Config{} + conn, err := tls.Dial(tcp, domain+":https",&conf) + handleError(err) + _, err = conn.Write([]byte("GET / HTTP/1.0\nHOST: "+domain+"\r\n\r\n")) + handleError(err) + result, _ := ioutil.ReadAll(conn) + ssl := false; + out := requestOutputInterpreter(result,find,true,ssl) + return out; +} + +func requestOutputInterpreter(result []byte,find *regexp.Regexp,ssl bool, sslwork bool) int{ + result_s := string(result) + if strings.Contains(result_s,"HTTP/1.1 200") || strings.Contains(result_s,"HTTP/1.1 30"){ + if find.Match(result){ + return 1; + }else{ + if strings.Contains(result_s,"HTTP/1.1 200"){ + return 200 + }else{ + return 300 + } + } + } + return -1; +} +func readConfig() { + file, _ := ioutil.ReadFile("/home/geno/.checkhttprc") + err := yaml.Unmarshal(file,&config) + if err != nil { + log.Panic("error:", err) + } +} + +func handleError(err error){ + if err != nil { + log.Println(err) + os.Exit(1) + } +}