diff --git a/server/config.json b/server/config.json index 4c86ca8..290b195 100644 --- a/server/config.json +++ b/server/config.json @@ -1,5 +1,5 @@ -{"servers": - [ +{ + "servers": [ { "username": "s01", "name": "node1", @@ -37,5 +37,27 @@ "password": "USER_DEFAULT_PASSWORD", "monthstart": 1 } + ], + "watchdog": [ + { + "name": "cpu high warning", + "rule": "cpu>90", + "callback": "https://yourSMSurl" + }, + { + "name": "memory high warning", + "rule": "(memory_used/memory_total)*100>90", + "callback": "https://yourSMSurl" + }, + { + "name": "ipv4 offline warning", + "rule": "online4=false", + "callback": "https://yourSMSurl" + }, + { + "name": "you can parse an expression combining any known field", + "rule": "(hdd_used/hdd_total)*100>95", + "callback": "https://yourSMSurl" + } ] } diff --git a/server/src/main.cpp b/server/src/main.cpp index 22ebf1d..504e39c 100644 --- a/server/src/main.cpp +++ b/server/src/main.cpp @@ -411,6 +411,25 @@ int CMain::ReadConfig() } } + // watch dog + // support by: https://cpp.la + ID = 0; + const json_value &jStart = (*pJsonData)["watchdog"]; + if(jStart.type == json_array) + { + for(unsigned i = 0; i < jStart.u.array.length; i++) + { + if(ID < 0 || ID >= NET_MAX_CLIENTS) + continue; + + str_copy(Watchdog(ID)->m_aName, jStart[i]["name"].u.string.ptr, sizeof(Watchdog(ID)->m_aName)); + str_copy(Watchdog(ID)->m_aRule, jStart[i]["rule"].u.string.ptr, sizeof(Watchdog(ID)->m_aRule)); + str_copy(Watchdog(ID)->m_aCallback, jStart[i]["callback"].u.string.ptr, sizeof(Watchdog(ID)->m_aCallback)); + + ID++; + } + } + // if file exists, read last network traffic record,reset m_LastNetworkIN and m_LastNetworkOUT // support by: https://cpp.la IOHANDLE nFile = io_open(m_Config.m_aJSONFile, IOFLAG_READ); diff --git a/server/src/main.h b/server/src/main.h index 2993809..7cb6592 100644 --- a/server/src/main.h +++ b/server/src/main.h @@ -82,6 +82,12 @@ class CMain } m_Stats; } m_aClients[NET_MAX_CLIENTS]; + struct CWatchDog{ + char m_aName[128]; + char m_aRule[128]; + char m_aCallback[128]; + } m_aCWatchDogs[NET_MAX_CLIENTS]; + struct CJSONUpdateThreadData { CClient *pClients; @@ -99,6 +105,8 @@ public: int ReadConfig(); int Run(); + CWatchDog *Watchdog(int ruleID) { return &m_aCWatchDogs[ruleID]; } + CClient *Client(int ClientID) { return &m_aClients[ClientID]; } CClient *ClientNet(int ClientNetID); const CConfig *Config() const { return &m_Config; }