summaryrefslogtreecommitdiff
path: root/pkgs/lib/services/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/lib/services/default.nix')
-rw-r--r--pkgs/lib/services/default.nix78
1 files changed, 78 insertions, 0 deletions
diff --git a/pkgs/lib/services/default.nix b/pkgs/lib/services/default.nix
new file mode 100644
index 0000000..148126c
--- /dev/null
+++ b/pkgs/lib/services/default.nix
@@ -0,0 +1,78 @@
+{ lib, pkgs }:
+
+let
+ checkNetwork =
+ hosts:
+ let
+ pkg = pkgs.writeShellApplication {
+ name = "check-network";
+ runtimeInputs = [ pkgs.unixtools.ping ];
+ text = ''
+ (${lib.concatMapStringsSep " && " (host: "ping -c 1 ${host}") hosts}) || kill -s SIGUSR1 $$
+ '';
+ };
+ in
+ "${pkg}/bin/check-network";
+in
+{
+ home.serviceWithTimer =
+ name:
+ {
+ Unit,
+ Service,
+ # Timer,
+ Install,
+ ...
+ }@config:
+ {
+ services.${name} = { inherit (config) Unit Service; };
+ timers.${name} = {
+ inherit (config) Unit Install;
+ Timer = config.Timer // {
+ Unit = "${name}.service";
+ };
+ };
+ };
+
+ home.checkNetwork =
+ {
+ hosts,
+ restart ? true,
+ }:
+ {
+ # Check network connectivity
+ Unit = {
+ StartLimitIntervalSec = 300;
+ StartLimitBurst = 5;
+ };
+ Service = lib.mkMerge [
+ {
+ ExecStartPre = checkNetwork hosts;
+ }
+ (lib.mkIf restart {
+ Restart = "on-abort";
+ RestartSec = 30;
+ RestartMode = "direct"; # dependent units will not fail
+ })
+ ];
+ };
+
+ checkNetwork =
+ {
+ hosts,
+ restart ? true,
+ }:
+ {
+ # Check network connectivity
+ preStart = checkNetwork hosts;
+ unitConfig = {
+ StartLimitIntervalSec = 300;
+ StartLimitBurst = 5;
+ };
+ serviceConfig = lib.mkIf restart {
+ Restart = "on-abort";
+ RestartSec = 30;
+ RestartMode = "direct"; # dependent units will not fail
+ };
+ };
+}