diff --git a/Dockerfile b/Dockerfile index 88fa7e6..1b24728 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build stage -FROM golang:1.14.2-alpine3.11 as builder +FROM golang:1.16.7-alpine3.14 as builder LABEL maintainer="Khanh Ngo 0 { + m := make(map[string]*model.Client) + clients, err := db.GetClients(false) + if err != nil { + return c.Render(http.StatusInternalServerError, "status.html", map[string]interface{}{ + "baseData": model.BaseData{Active: "status", CurrentUser: currentUser(c)}, + "error": err.Error(), + "devices": nil, + }) + } + for i := range clients { + if clients[i].Client != nil { + m[clients[i].Client.PublicKey] = clients[i].Client + } + } + + conv := map[bool]int{true: 1, false: 0} + for i := range devices { + devVm := DeviceVM{Name: devices[i].Name} + for j := range devices[i].Peers { + pVm := PeerVM{ + PublicKey: devices[i].Peers[j].PublicKey.String(), + ReceivedBytes: devices[i].Peers[j].ReceiveBytes, + TransmitBytes: devices[i].Peers[j].TransmitBytes, + LastHandshakeTime: devices[i].Peers[j].LastHandshakeTime, + LastHandshakeRel: time.Since(devices[i].Peers[j].LastHandshakeTime), + } + pVm.Connected = pVm.LastHandshakeRel.Minutes() < 3. + + if _client, ok := m[pVm.PublicKey]; ok { + pVm.Name = _client.Name + pVm.Email = _client.Email + } + devVm.Peers = append(devVm.Peers, pVm) + } + sort.SliceStable(devVm.Peers, func(i, j int) bool { return devVm.Peers[i].Name < devVm.Peers[j].Name }) + sort.SliceStable(devVm.Peers, func(i, j int) bool { return conv[devVm.Peers[i].Connected] > conv[devVm.Peers[j].Connected] }) + devicesVm = append(devicesVm, devVm) + } + } + + return c.Render(http.StatusOK, "status.html", map[string]interface{}{ + "baseData": model.BaseData{Active: "status", CurrentUser: currentUser(c)}, + "devices": devicesVm, + "error": "", + }) + } +} + // GlobalSettingSubmit handler to update the global settings func GlobalSettingSubmit(db store.IStore) echo.HandlerFunc { return func(c echo.Context) error { diff --git a/main.go b/main.go index ea1720b..abd7b19 100644 --- a/main.go +++ b/main.go @@ -102,6 +102,7 @@ func main() { app.POST("wg-server/keypair", handler.WireGuardServerKeyPair(db), handler.ValidSession) app.GET("/global-settings", handler.GlobalSettings(db), handler.ValidSession) app.POST("/global-settings", handler.GlobalSettingSubmit(db), handler.ValidSession) + app.GET("/status", handler.Status(db), handler.ValidSession) app.GET("/api/clients", handler.GetClients(db), handler.ValidSession) app.GET("/api/client/:id", handler.GetClient(db), handler.ValidSession) app.GET("/api/machine-ips", handler.MachineIPAddresses(), handler.ValidSession) diff --git a/router/router.go b/router/router.go index bb14431..2c91d49 100644 --- a/router/router.go +++ b/router/router.go @@ -74,12 +74,18 @@ func New(tmplBox *rice.Box, extraData map[string]string, secret []byte) *echo.Ec log.Fatal(err) } + tmplStatusString, err := tmplBox.String("status.html") + if err != nil { + log.Fatal(err) + } + // create template list templates := make(map[string]*template.Template) templates["login.html"] = template.Must(template.New("login").Parse(tmplLoginString)) templates["clients.html"] = template.Must(template.New("clients").Parse(tmplBaseString + tmplClientsString)) templates["server.html"] = template.Must(template.New("server").Parse(tmplBaseString + tmplServerString)) templates["global_settings.html"] = template.Must(template.New("global_settings").Parse(tmplBaseString + tmplGlobalSettingsString)) + templates["status.html"] = template.Must(template.New("status").Parse(tmplBaseString + tmplStatusString)) e.Logger.SetLevel(log.DEBUG) e.Pre(middleware.RemoveTrailingSlash()) diff --git a/templates/base.html b/templates/base.html index 3ba800c..6b09a32 100644 --- a/templates/base.html +++ b/templates/base.html @@ -120,6 +120,14 @@

+ @@ -446,4 +454,4 @@ -{{end}} \ No newline at end of file +{{end}} diff --git a/templates/status.html b/templates/status.html new file mode 100644 index 0000000..4d223d3 --- /dev/null +++ b/templates/status.html @@ -0,0 +1,210 @@ +{{define "title"}} +Connected Peers +{{end}} + +{{define "top_css"}} +{{end}} + +{{define "username"}} +{{ .username }} +{{end}} + +{{define "page_title"}} +Connected Peers +{{end}} + +{{define "page_content"}} +
+
+ {{ if .error }} + + {{ end}} + {{ range $dev := .devices }} + + + + + + + + + + + + + + + + {{ range $idx, $peer := $dev.Peers }} + + + + + + + + + + + {{ end }} + +
List of connected peers for device with name {{ $dev.Name }}
#NameEmailPublic KeyReceiveBytesTransmitBytesConnected (Approximation)LastHandshakeTime
{{ $idx }}{{ $peer.Name }}{{ $peer.Email }}{{ $peer.PublicKey }}{{ $peer.ReceivedBytes }}{{ $peer.TransmitBytes }}{{ $peer.Connected }}{{ $peer.LastHandshakeTime }}
+ {{ end }} + + +
+
+ + + +{{end}} + +{{define "bottom_js"}} + + +{{end}}