37 lines
1.1 KiB
Nix
37 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 ];
|
|
})
|