add watchdog service
This commit is contained in:
parent
6805e0090d
commit
83092b7b73
5 changed files with 66 additions and 40 deletions
|
@ -146,10 +146,6 @@
|
||||||
NET_RALINK_SOC="y";
|
NET_RALINK_SOC="y";
|
||||||
SWPHY = "y";
|
SWPHY = "y";
|
||||||
|
|
||||||
WATCHDOG = "y";
|
|
||||||
RALINK_WDT = "y"; # watchdog
|
|
||||||
MT7621_WDT = "y"; # or it might be this one
|
|
||||||
|
|
||||||
GPIOLIB="y";
|
GPIOLIB="y";
|
||||||
GPIO_MT7621 = "y";
|
GPIO_MT7621 = "y";
|
||||||
|
|
||||||
|
@ -162,6 +158,9 @@
|
||||||
PRINTK_TIME = "y";
|
PRINTK_TIME = "y";
|
||||||
} // lib.optionalAttrs (config.system.service ? vlan) {
|
} // lib.optionalAttrs (config.system.service ? vlan) {
|
||||||
SWCONFIG = "y";
|
SWCONFIG = "y";
|
||||||
|
} // lib.optionalAttrs (config.system.service ? watchdog) {
|
||||||
|
RALINK_WDT = "y"; # watchdog
|
||||||
|
MT7621_WDT = "y"; # or it might be this one
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -29,6 +29,7 @@ in rec {
|
||||||
../modules/network
|
../modules/network
|
||||||
../modules/vlan
|
../modules/vlan
|
||||||
../modules/ssh
|
../modules/ssh
|
||||||
|
../modules/watchdog
|
||||||
];
|
];
|
||||||
|
|
||||||
hostname = "arhcive";
|
hostname = "arhcive";
|
||||||
|
@ -67,43 +68,10 @@ in rec {
|
||||||
|
|
||||||
services.sshd = svc.ssh.build { };
|
services.sshd = svc.ssh.build { };
|
||||||
|
|
||||||
services.watchdog =
|
services.watchdog = svc.watchdog.build {
|
||||||
let
|
|
||||||
watched = with config.services ; [ sshd dhcpc ];
|
watched = with config.services ; [ sshd dhcpc ];
|
||||||
spinupGrace = 60;
|
|
||||||
script = pkgs.writeAshScript "gaspode" {
|
|
||||||
runtimeInputs = [ pkgs.s6 ];
|
|
||||||
} ''
|
|
||||||
deadline=$(expr $(date +%s) + ${toString spinupGrace})
|
|
||||||
services=$@
|
|
||||||
echo started feeding the dog
|
|
||||||
exec 3> ''${WATCHDOG-/dev/watchdog}
|
|
||||||
|
|
||||||
healthy(){
|
|
||||||
test $(date +%s) -le $deadline && return 0
|
|
||||||
|
|
||||||
for i in $services; do
|
|
||||||
if test "$(s6-svstat -o up /run/service/$i)" != "true" ; then
|
|
||||||
echo "service $i is down"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
while healthy ;do
|
|
||||||
sleep 10
|
|
||||||
echo >&3
|
|
||||||
done
|
|
||||||
echo "stopped feeding the dog"
|
|
||||||
sleep 6000 # don't want s6-rc to restart
|
|
||||||
'';
|
|
||||||
in longrun {
|
|
||||||
name = "watchdog";
|
|
||||||
run =
|
|
||||||
"${script} ${lib.concatStringsSep " " (builtins.map (s: s.name) watched)}";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
services.resolvconf = oneshot rec {
|
services.resolvconf = oneshot rec {
|
||||||
dependencies = [ services.dhcpc ];
|
dependencies = [ services.dhcpc ];
|
||||||
name = "resolvconf";
|
name = "resolvconf";
|
||||||
|
|
24
modules/watchdog/default.nix
Normal file
24
modules/watchdog/default.nix
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
{ lib, pkgs, config, ...}:
|
||||||
|
let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
inherit (pkgs) liminix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
system.service.watchdog = mkOption {
|
||||||
|
type = liminix.lib.types.serviceDefn;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.system.service.watchdog = liminix.callService ./watchdog.nix {
|
||||||
|
watched = mkOption {
|
||||||
|
description = "services to watch";
|
||||||
|
type = types.listOf liminix.lib.types.service;
|
||||||
|
};
|
||||||
|
headStart = mkOption {
|
||||||
|
description = "delay in seconds before watchdog starts checking service health";
|
||||||
|
default = 60;
|
||||||
|
type = types.int;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
config.kernel.config.WATCHDOG = "y";
|
||||||
|
}
|
23
modules/watchdog/gaspode.sh
Executable file
23
modules/watchdog/gaspode.sh
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
#!/bin/sh
|
||||||
|
deadline=$(expr $(date +%s) + ${HEADSTART})
|
||||||
|
services=$@
|
||||||
|
echo started feeding the dog
|
||||||
|
exec 3> ${WATCHDOG-/dev/watchdog}
|
||||||
|
|
||||||
|
healthy(){
|
||||||
|
test $(date +%s) -le $deadline && return 0
|
||||||
|
|
||||||
|
for i in $services; do
|
||||||
|
if test "$(s6-svstat -o up /run/service/$i)" != "true" ; then
|
||||||
|
echo "service $i is down"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
while healthy ;do
|
||||||
|
sleep 10
|
||||||
|
echo >&3
|
||||||
|
done
|
||||||
|
echo "stopped feeding the dog"
|
||||||
|
sleep 6000 # don't want s6-rc to restart
|
12
modules/watchdog/watchdog.nix
Normal file
12
modules/watchdog/watchdog.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
liminix
|
||||||
|
, lib
|
||||||
|
}:
|
||||||
|
{ watched, headStart } :
|
||||||
|
let
|
||||||
|
inherit (liminix.services) longrun;
|
||||||
|
in longrun {
|
||||||
|
name = "watchdog";
|
||||||
|
run =
|
||||||
|
"HEADSTART=${toString headStart} ${./gaspode.sh} ${lib.concatStringsSep " " (builtins.map (s: s.name) watched)}";
|
||||||
|
}
|
Loading…
Reference in a new issue