programm init
This commit is contained in:
parent
88726f6557
commit
3a6a29ddb1
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue