summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--contrib/package/freifunk-watchdog/Makefile2
-rw-r--r--contrib/package/freifunk-watchdog/src/watchdog.c169
-rw-r--r--contrib/package/freifunk-watchdog/src/watchdog.h7
3 files changed, 90 insertions, 88 deletions
diff --git a/contrib/package/freifunk-watchdog/Makefile b/contrib/package/freifunk-watchdog/Makefile
index e3ff674010..563b5d029f 100644
--- a/contrib/package/freifunk-watchdog/Makefile
+++ b/contrib/package/freifunk-watchdog/Makefile
@@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=freifunk-watchdog
-PKG_RELEASE:=4
+PKG_RELEASE:=5
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
PKG_BUILD_DEPENDS := uci
diff --git a/contrib/package/freifunk-watchdog/src/watchdog.c b/contrib/package/freifunk-watchdog/src/watchdog.c
index a0d4e43b1f..b87bed0a92 100644
--- a/contrib/package/freifunk-watchdog/src/watchdog.c
+++ b/contrib/package/freifunk-watchdog/src/watchdog.c
@@ -31,14 +31,6 @@ static void shutdown_watchdog(int sig)
{
syslog(LOG_INFO, "Stopping watchdog timer");
write(wdfd, &wshutdown, 1);
-
- /* Older Kamikaze versions are compiled with
- * CONFIG_WATCHDOG_NOWAYOUT=y, this can be
- * harmful if we're in the middle of an upgrade.
- * Increase the watchdog timeout to 3600 seconds
- * here to avoid unplanned reboots. */
- ioctl(wdfd, WDIOC_SETTIMEOUT, &wdelay);
-
close(wdfd);
wdfd = -1;
}
@@ -191,11 +183,9 @@ static int check_uci_update(const char *config, time_t *mtime)
*mtime = s.st_mtime;
return 1;
}
-
- return 0;
}
- return -1;
+ return 0;
}
/* Add tuple */
@@ -290,7 +280,7 @@ static wifi_tuple_t * load_wifi_uci(wifi_tuple_t *ifs, time_t *modtime)
static int do_daemon(void)
{
static int wdtrigger = 1;
- static int wdtimeout = INTERVAL * 2;
+ static int wdtimeout = BASE_INTERVAL * 2;
static const char wdkeepalive = WATCH_KEEPALIVE;
int iwfd;
@@ -301,6 +291,7 @@ static int do_daemon(void)
wifi_tuple_t *ifs = NULL, *curif;
time_t modtime = 0;
+ int action_intv = 0;
int restart_wifi = 0;
int restart_cron = 0;
int restart_sshd = 0;
@@ -320,7 +311,7 @@ static int do_daemon(void)
if( (wdfd = open(WATCH_DEVICE, O_WRONLY)) > -1 )
{
syslog(LOG_INFO, "Opened %s - polling every %i seconds",
- WATCH_DEVICE, INTERVAL);
+ WATCH_DEVICE, BASE_INTERVAL);
/* Install signal handler to halt watchdog on shutdown */
sa.sa_handler = shutdown_watchdog;
@@ -338,98 +329,106 @@ static int do_daemon(void)
while( 1 )
{
- /* Check average load */
- if( find_loadavg() >= LOAD_TRESHOLD )
- loadavg_panic++;
- else
- loadavg_panic = 0;
-
- /* Check crond */
- if( find_process("crond") < 0 )
- restart_cron++;
- else
- restart_cron = 0;
-
- /* Check SSHd */
- if( find_process("dropbear") < 0 )
- restart_sshd++;
- else
- restart_sshd = 0;
-
- /* Check wireless interfaces */
- ifs = load_wifi_uci(ifs, &modtime);
- for( curif = ifs; curif; curif = curif->next )
+ /* Check/increment action interval */
+ if( ++action_intv >= ACTION_INTERVAL )
{
- /* Get current channel and bssid */
- if( (iw_get_bssid(iwfd, curif->ifname, bssid) == 0) &&
- (iw_get_channel(iwfd, curif->ifname, &channel) == 0) )
+ /* Reset action interval */
+ action_intv = 0;
+
+ /* Check average load */
+ if( find_loadavg() >= LOAD_TRESHOLD )
+ loadavg_panic++;
+ else
+ loadavg_panic = 0;
+
+ /* Check crond */
+ if( find_process("crond") < 0 )
+ restart_cron++;
+ else
+ restart_cron = 0;
+
+ /* Check SSHd */
+ if( find_process("dropbear") < 0 )
+ restart_sshd++;
+ else
+ restart_sshd = 0;
+
+ /* Check wireless interfaces */
+ ifs = load_wifi_uci(ifs, &modtime);
+ for( curif = ifs; curif; curif = curif->next )
{
- /* Check BSSID */
- if( strcasecmp(bssid, curif->bssid) != 0 )
+ /* Get current channel and bssid */
+ if( (iw_get_bssid(iwfd, curif->ifname, bssid) == 0) &&
+ (iw_get_channel(iwfd, curif->ifname, &channel) == 0) )
{
- syslog(LOG_WARNING, "BSSID mismatch on %s: current=%s wanted=%s",
- curif->ifname, bssid, curif->bssid);
-
- restart_wifi++;
+ /* Check BSSID */
+ if( strcasecmp(bssid, curif->bssid) != 0 )
+ {
+ syslog(LOG_WARNING, "BSSID mismatch on %s: current=%s wanted=%s",
+ curif->ifname, bssid, curif->bssid);
+
+ restart_wifi++;
+ }
+
+ /* Check channel */
+ else if( channel != curif->channel )
+ {
+ syslog(LOG_WARNING, "Channel mismatch on %s: current=%d wanted=%d",
+ curif->ifname, channel, curif->channel);
+
+ restart_wifi++;
+ }
}
-
- /* Check channel */
- else if( channel != curif->channel )
+ else
{
- syslog(LOG_WARNING, "Channel mismatch on %s: current=%d wanted=%d",
- curif->ifname, channel, curif->channel);
-
- restart_wifi++;
+ syslog(LOG_WARNING, "Requested interface %s not present", curif->ifname);
}
}
- else
+
+
+ /* Wifi restart required? */
+ if( restart_wifi >= HYSTERESIS )
{
- syslog(LOG_WARNING, "Requested interface %s not present", curif->ifname);
+ restart_wifi = 0;
+ syslog(LOG_WARNING, "Channel or BSSID mismatch on wireless interface, restarting");
+ EXEC(WIFI_ACTION);
}
- }
+ /* Cron restart required? */
+ if( restart_cron >= HYSTERESIS )
+ {
+ restart_cron = 0;
+ syslog(LOG_WARNING, "The cron process died, restarting");
+ EXEC(CRON_ACTION);
+ }
- /* Wifi restart required? */
- if( restart_wifi >= HYSTERESIS )
- {
- restart_wifi = 0;
- syslog(LOG_WARNING, "Channel or BSSID mismatch on wireless interface, restarting");
- EXEC(WIFI_ACTION);
- }
+ /* SSHd restart required? */
+ if( restart_sshd >= HYSTERESIS )
+ {
+ restart_sshd = 0;
+ syslog(LOG_WARNING, "The ssh process died, restarting");
+ EXEC(SSHD_ACTION);
+ }
- /* Cron restart required? */
- if( restart_cron >= HYSTERESIS )
- {
- restart_cron = 0;
- syslog(LOG_WARNING, "The cron process died, restarting");
- EXEC(CRON_ACTION);
- }
+ /* Is there a load problem? */
+ if( loadavg_panic >= HYSTERESIS )
+ {
+ syslog(LOG_EMERG, "Critical system load level, triggering reset!");
- /* SSHd restart required? */
- if( restart_sshd >= HYSTERESIS )
- {
- restart_sshd = 0;
- syslog(LOG_WARNING, "The ssh process died, restarting");
- EXEC(SSHD_ACTION);
+ /* Try watchdog, fall back to reboot */
+ if( wdfd > -1 )
+ ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtrigger);
+ else
+ EXEC(LOAD_ACTION);
+ }
}
- /* Is there a load problem? */
- if( loadavg_panic >= HYSTERESIS )
- {
- syslog(LOG_EMERG, "Critical system load level, triggering reset!");
-
- /* Try watchdog, fall back to reboot */
- if( wdfd > -1 )
- ioctl(wdfd, WDIOC_SETTIMEOUT, &wdtrigger);
- else
- EXEC(LOAD_ACTION);
- }
/* Reset watchdog timer */
if( wdfd > -1 )
write(wdfd, &wdkeepalive, 1);
- sleep(INTERVAL);
+ sleep(BASE_INTERVAL);
}
shutdown_watchdog(0);
diff --git a/contrib/package/freifunk-watchdog/src/watchdog.h b/contrib/package/freifunk-watchdog/src/watchdog.h
index d3dc286fdd..9c4d5570e5 100644
--- a/contrib/package/freifunk-watchdog/src/watchdog.h
+++ b/contrib/package/freifunk-watchdog/src/watchdog.h
@@ -39,8 +39,11 @@
#include "wireless.22.h"
-/* Check interval */
-#define INTERVAL 30
+/* Watchdog poll interval */
+#define BASE_INTERVAL 5
+
+/* Action interval (N * BASE_INTERVAL) */
+#define ACTION_INTERVAL 6
/* Hysteresis */
#define HYSTERESIS 3