update
parent
d51ccc456b
commit
8e07df263d
109
main.go
109
main.go
|
@ -1,8 +1,10 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
_ "embed"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
|
@ -10,6 +12,7 @@ import (
|
|||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"text/template"
|
||||
"time"
|
||||
|
@ -21,6 +24,7 @@ var tmpl string
|
|||
var report = template.Must(template.New("").Parse(tmpl))
|
||||
var write_report chan bool
|
||||
var interval = time.Second * 2
|
||||
var wr sync.Mutex
|
||||
|
||||
type Network struct {
|
||||
Name string
|
||||
|
@ -67,13 +71,17 @@ func main() {
|
|||
perr = true
|
||||
log.Println(err)
|
||||
}
|
||||
wr.Lock()
|
||||
fmt.Fprintf(file, `{"x": "%s", "y": "%s", "name": "%s"},`, now, "failed", "Public")
|
||||
fmt.Fprintf(file, "\n")
|
||||
wr.Unlock()
|
||||
} else {
|
||||
perr = false
|
||||
if print {
|
||||
wr.Lock()
|
||||
fmt.Fprintf(file, `{"x": "%s", "y": "%s", "name": "%s"},`, now, "ok", "Public")
|
||||
fmt.Fprintf(file, "\n")
|
||||
wr.Unlock()
|
||||
}
|
||||
}
|
||||
}(reducer == 0)
|
||||
|
@ -87,14 +95,18 @@ func main() {
|
|||
derr = true
|
||||
log.Println(err)
|
||||
}
|
||||
wr.Lock()
|
||||
fmt.Fprintf(file, `{"x": "%s", "y": "%s", "name": "%s"},`, now, "failed", Networks[i].Name)
|
||||
fmt.Fprintf(file, "\n")
|
||||
wr.Unlock()
|
||||
// fmt.Fprintf(file, "%s\t%s\t%s\n", now, Networks[i].Name, "failed")
|
||||
} else {
|
||||
derr = false
|
||||
if print {
|
||||
wr.Lock()
|
||||
fmt.Fprintf(file, `{"x": "%s", "y": "%s", "name": "%s"},`, now, "ok", Networks[i].Name)
|
||||
fmt.Fprintf(file, "\n")
|
||||
wr.Unlock()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -109,7 +121,8 @@ func main() {
|
|||
|
||||
go func() {
|
||||
for {
|
||||
<-time.After(time.Minute * 10)
|
||||
<-time.After(time.Minute * 5)
|
||||
CleanLog()
|
||||
WriteReport()
|
||||
}
|
||||
}()
|
||||
|
@ -118,7 +131,11 @@ func main() {
|
|||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
http.ServeFile(w, r, strings.TrimPrefix(r.URL.Path, "/"))
|
||||
})
|
||||
if err := http.ListenAndServe("0.0.0.0:1080", nil); err != nil {
|
||||
port, ok := os.LookupEnv("PORT")
|
||||
if !ok {
|
||||
port = "1080"
|
||||
}
|
||||
if err := http.ListenAndServe("0.0.0.0:"+port, nil); err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
}()
|
||||
|
@ -127,6 +144,8 @@ func main() {
|
|||
signal.Notify(wait, syscall.SIGINT, syscall.SIGTERM)
|
||||
|
||||
<-wait
|
||||
|
||||
CleanLog()
|
||||
WriteReport()
|
||||
}
|
||||
|
||||
|
@ -147,7 +166,9 @@ func WriteReport() {
|
|||
}
|
||||
defer f.Close()
|
||||
|
||||
wr.Lock()
|
||||
data, err := os.ReadFile("network.log")
|
||||
wr.Unlock()
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
|
@ -162,6 +183,90 @@ func WriteReport() {
|
|||
|
||||
}
|
||||
|
||||
type point struct {
|
||||
Time string `json:"x"`
|
||||
Stat string `json:"y"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
func (p point) GetTime() time.Time {
|
||||
t, _ := time.Parse("2006-01-02 15:04:05", p.Time)
|
||||
return t
|
||||
}
|
||||
|
||||
func CleanLog() error {
|
||||
|
||||
file, err := os.OpenFile("network.log", os.O_RDONLY|os.O_CREATE, os.ModePerm)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
|
||||
last := map[string]*point{}
|
||||
end := map[string]*point{}
|
||||
queue := []*point{}
|
||||
|
||||
scanner := bufio.NewScanner(file)
|
||||
for scanner.Scan() {
|
||||
pt := &point{}
|
||||
data := scanner.Bytes()
|
||||
err = json.Unmarshal(data[:len(data)-1], pt)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
file.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
end[pt.Name] = pt
|
||||
|
||||
last_pt, ok := last[pt.Name]
|
||||
if !ok {
|
||||
last[pt.Name] = pt
|
||||
queue = append(queue, pt)
|
||||
} else {
|
||||
if last_pt.Stat != pt.Stat {
|
||||
last[pt.Name] = pt
|
||||
queue = append(queue, pt)
|
||||
}
|
||||
}
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
file.Close()
|
||||
|
||||
for k, v := range end {
|
||||
if pt, ok := last[k]; ok {
|
||||
if pt.Time != v.Time {
|
||||
queue = append(queue, v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wr.Lock()
|
||||
defer wr.Unlock()
|
||||
file, err = os.OpenFile("network.log", os.O_WRONLY|os.O_TRUNC, os.ModePerm)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
for i := range queue {
|
||||
b, err := json.Marshal(queue[i])
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
file.Write(b)
|
||||
file.Write([]byte{',', '\n'})
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
// Get preferred outbound ip of this machine
|
||||
func GetOutboundIP(addr string) (net.IP, error) {
|
||||
|
||||
|
|
Loading…
Reference in New Issue