Skip to content

Commit fb7fc9c

Browse files
authored
feat: cronjob to monitor server status (#421)
1 parent 1c757f3 commit fb7fc9c

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

swiftwave_service/core/server.operations.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package core
33
import (
44
"errors"
55
"gorm.io/gorm"
6+
"time"
67
)
78

89
// CreateServer creates a new server in the database
@@ -13,6 +14,7 @@ func CreateServer(db *gorm.DB, server *Server) error {
1314
if server.User == "" {
1415
return errors.New("user is required")
1516
}
17+
server.LastPing = time.Now()
1618
return db.Create(server).Error
1719
}
1820

@@ -109,3 +111,13 @@ func FetchAllProxyServersIrrespectiveOfStatus(db *gorm.DB) ([]Server, error) {
109111
err := db.Where("proxy_enabled = ?", true).Find(&servers).Error
110112
return servers, err
111113
}
114+
115+
// MarkServerAsOnline marks a server as online in the database
116+
func MarkServerAsOnline(db *gorm.DB, server *Server) error {
117+
return db.Model(server).Updates(map[string]interface{}{"status": ServerOnline, "last_ping": time.Now()}).Error
118+
}
119+
120+
// MarkServerAsOffline marks a server as offline in the database
121+
func MarkServerAsOffline(db *gorm.DB, server *Server) error {
122+
return db.Model(server).Update("status", ServerOffline).Error
123+
}

swiftwave_service/cronjob/init.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ func (m Manager) Start(nowait bool) {
2828
go m.SyncProxy()
2929
m.wg.Add(1)
3030
go m.SyncBackupProxyServer()
31+
m.wg.Add(1)
32+
go m.MonitorServerStatus()
3133
if !nowait {
3234
m.wg.Wait()
3335
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package cronjob
2+
3+
import (
4+
"bytes"
5+
"github.com/swiftwave-org/swiftwave/ssh_toolkit"
6+
"github.com/swiftwave-org/swiftwave/swiftwave_service/core"
7+
"github.com/swiftwave-org/swiftwave/swiftwave_service/logger"
8+
"strings"
9+
"time"
10+
)
11+
12+
func (m Manager) MonitorServerStatus() {
13+
for {
14+
m.monitorServerStatus()
15+
time.Sleep(5 * time.Minute)
16+
}
17+
}
18+
19+
func (m Manager) monitorServerStatus() {
20+
logger.CronJobLogger.Println("Triggering Server Status Monitor Job")
21+
// Fetch all servers
22+
servers, err := core.FetchAllServers(&m.ServiceManager.DbClient)
23+
if err != nil {
24+
logger.CronJobLoggerError.Println("Failed to fetch server list")
25+
logger.CronJobLoggerError.Println(err)
26+
return
27+
}
28+
if len(servers) == 0 {
29+
logger.CronJobLogger.Println("Skipping ! No server found")
30+
return
31+
} else {
32+
for _, server := range servers {
33+
go func(server core.Server) {
34+
if m.isServerOnline(server) {
35+
err = core.MarkServerAsOnline(&m.ServiceManager.DbClient, &server)
36+
if err != nil {
37+
logger.CronJobLoggerError.Println("DB Error : Failed to mark server as online > ", server.HostName)
38+
} else {
39+
logger.CronJobLogger.Println("Server marked as online > ", server.HostName)
40+
}
41+
} else {
42+
err = core.MarkServerAsOffline(&m.ServiceManager.DbClient, &server)
43+
if err != nil {
44+
logger.CronJobLoggerError.Println("DB Error : Failed to mark server as offline > ", server.HostName)
45+
} else {
46+
logger.CronJobLogger.Println("Server marked as offline > ", server.HostName)
47+
}
48+
}
49+
}(server)
50+
}
51+
}
52+
}
53+
54+
func (m Manager) isServerOnline(server core.Server) bool {
55+
cmd := "echo ok"
56+
stdoutBuf := new(bytes.Buffer)
57+
err := ssh_toolkit.ExecCommandOverSSH(cmd, stdoutBuf, nil, 5, server.IP, 22, server.User, m.Config.SystemConfig.SshPrivateKey, 30)
58+
if err != nil {
59+
return false
60+
}
61+
if strings.Compare(stdoutBuf.String(), "ok") == 0 {
62+
return false
63+
}
64+
return true
65+
}

0 commit comments

Comments
 (0)