This commit is contained in:
Henry Dollman
2024-07-09 22:17:50 -04:00
parent 7af8671134
commit 03755ad85f

131
main.go
View File

@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"log" "log"
_ "monitor-site/migrations" _ "monitor-site/migrations"
"net/http"
"net/http/httputil" "net/http/httputil"
"net/url" "net/url"
"os" "os"
@@ -93,8 +94,31 @@ func main() {
return nil return nil
}) })
// create ssh key if it doesn't exist
app.OnBeforeServe().Add(func(e *core.ServeEvent) error { app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
go serverUpdateTicker() e.Router.GET("/getkey", func(c echo.Context) error {
requestData := apis.RequestInfo(c)
if requestData.Admin == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
key, err := os.ReadFile("./pb_data/id_ed25519.pub")
if err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]string{"key": strings.TrimSuffix(string(key), "\n")})
})
return nil
})
// start ticker for server updates
app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
// go serverUpdateTicker()
return nil
})
// immediately create connection for new servers
app.OnRecordAfterCreateRequest("systems").Add(func(e *core.RecordCreateEvent) error {
go updateServer(e.Record)
return nil return nil
}) })
@@ -104,7 +128,7 @@ func main() {
} }
func serverUpdateTicker() { func serverUpdateTicker() {
ticker := time.NewTicker(5 * time.Second) ticker := time.NewTicker(15 * time.Second)
for range ticker.C { for range ticker.C {
updateServers() updateServers()
} }
@@ -114,10 +138,9 @@ func updateServers() {
// serverCount := len(serverConnections) // serverCount := len(serverConnections)
// fmt.Println("server count: ", serverCount) // fmt.Println("server count: ", serverCount)
query := app.Dao().RecordQuery("systems"). query := app.Dao().RecordQuery("systems").
// todo check that asc is correct
OrderBy("updated ASC"). OrderBy("updated ASC").
// todo get total count of servers and divide by 4 or something // todo get total count of servers and divide by 4 or something
Limit(1) Limit(5)
records := []*models.Record{} records := []*models.Record{}
if err := query.All(&records); err != nil { if err := query.All(&records); err != nil {
@@ -126,62 +149,66 @@ func updateServers() {
} }
for _, record := range records { for _, record := range records {
var server Server updateServer(record)
// check if server connection data exists }
if _, ok := serverConnections[record.Id]; ok { }
server = serverConnections[record.Id]
} else { func updateServer(record *models.Record) {
// create server connection struct var server Server
server = Server{ // check if server connection data exists
Ip: record.Get("ip").(string), if _, ok := serverConnections[record.Id]; ok {
Port: record.Get("port").(string), server = serverConnections[record.Id]
} } else {
client, err := getServerConnection(&server) // create server connection struct
if err != nil { server = Server{
app.Logger().Error("Failed to connect:", "err", err, "server", server.Ip, "port", server.Port) Ip: record.Get("ip").(string),
// todo update record to not connected Port: record.Get("port").(string),
record.Set("active", false)
delete(serverConnections, record.Id)
continue
}
server.Client = client
serverConnections[record.Id] = server
} }
// get server stats client, err := getServerConnection(&server)
systemData, err := requestJson(&server)
if err != nil { if err != nil {
app.Logger().Error("Failed to get server stats: ", "err", err) app.Logger().Error("Failed to connect:", "err", err, "server", server.Ip, "port", server.Port)
// todo update record to not connected
record.Set("active", false) record.Set("active", false)
if server.Client != nil {
server.Client.Close()
}
delete(serverConnections, record.Id) delete(serverConnections, record.Id)
continue return
} }
// update system record server.Client = client
record.Set("active", true) serverConnections[record.Id] = server
record.Set("stats", systemData.System) }
if err := app.Dao().SaveRecord(record); err != nil { // get server stats from agent
app.Logger().Error("Failed to update record: ", "err", err) systemData, err := requestJson(&server)
if err != nil {
app.Logger().Error("Failed to get server stats: ", "err", err)
record.Set("active", false)
if server.Client != nil {
server.Client.Close()
} }
// add new system_stats record delete(serverConnections, record.Id)
system_stats, _ := app.Dao().FindCollectionByNameOrId("system_stats") return
system_stats_record := models.NewRecord(system_stats) }
system_stats_record.Set("system", record.Id) // update system record
system_stats_record.Set("stats", systemData.System) record.Set("active", true)
if err := app.Dao().SaveRecord(system_stats_record); err != nil { record.Set("stats", systemData.System)
if err := app.Dao().SaveRecord(record); err != nil {
app.Logger().Error("Failed to update record: ", "err", err)
}
// add new system_stats record
system_stats, _ := app.Dao().FindCollectionByNameOrId("system_stats")
system_stats_record := models.NewRecord(system_stats)
system_stats_record.Set("system", record.Id)
system_stats_record.Set("stats", systemData.System)
if err := app.Dao().SaveRecord(system_stats_record); err != nil {
app.Logger().Error("Failed to save record: ", "err", err)
}
// add new container_stats record
if len(systemData.Containers) > 0 {
container_stats, _ := app.Dao().FindCollectionByNameOrId("container_stats")
container_stats_record := models.NewRecord(container_stats)
container_stats_record.Set("system", record.Id)
container_stats_record.Set("stats", systemData.Containers)
if err := app.Dao().SaveRecord(container_stats_record); err != nil {
app.Logger().Error("Failed to save record: ", "err", err) app.Logger().Error("Failed to save record: ", "err", err)
} }
// add new container_stats record
if len(systemData.Containers) > 0 {
container_stats, _ := app.Dao().FindCollectionByNameOrId("container_stats")
container_stats_record := models.NewRecord(container_stats)
container_stats_record.Set("system", record.Id)
container_stats_record.Set("stats", systemData.Containers)
if err := app.Dao().SaveRecord(container_stats_record); err != nil {
app.Logger().Error("Failed to save record: ", "err", err)
}
}
} }
} }