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 @@
+
+
+
+
+ Status
+
+
+
@@ -446,4 +454,4 @@