38 lines
1.1 KiB
Nix
38 lines
1.1 KiB
Nix
|
{
|
||
|
liminix, lib, lim, s6
|
||
|
}:
|
||
|
{ service, interval, threshold, healthCheck } :
|
||
|
let
|
||
|
inherit (liminix.services) oneshot longrun;
|
||
|
inherit (builtins) toString;
|
||
|
inherit (service) name;
|
||
|
checker = let name' = "check-${name}"; in longrun {
|
||
|
name = name';
|
||
|
run = ''
|
||
|
fails=0
|
||
|
echo waiting for /run/service/${name}
|
||
|
${s6}/bin/s6-svwait -U /run/service/${name} || exit
|
||
|
while sleep ${toString interval} ; do
|
||
|
${healthCheck}
|
||
|
if test $? -gt 0; then
|
||
|
fails=$(expr $fails + 1)
|
||
|
else
|
||
|
fails=0
|
||
|
fi
|
||
|
echo fails $fails/${toString threshold} for ${name}
|
||
|
if test "$fails" -gt "${toString threshold}" ; then
|
||
|
echo time to die
|
||
|
${s6}/bin/s6-svc -r /run/service/${name}
|
||
|
echo bounced
|
||
|
fails=0
|
||
|
echo waiting for /run/service/${name}
|
||
|
${s6}/bin/s6-svwait -U /run/service/${name}
|
||
|
fi
|
||
|
done
|
||
|
'';
|
||
|
};
|
||
|
in service.overrideAttrs(o: {
|
||
|
buildInputs = (lim.orEmpty o.buildInputs) ++ [ checker ];
|
||
|
dependencies = (lim.orEmpty o.dependencies) ++ [ checker ];
|
||
|
})
|