summaryrefslogtreecommitdiff
path: root/pkgs
diff options
context:
space:
mode:
authoraristote <quentin.aristote@irif.fr>2025-11-21 09:49:24 +0100
committeraristote <quentin.aristote@irif.fr>2025-11-21 10:15:47 +0100
commitc032f4c09c83feb933d520ccce80e70a1516ca35 (patch)
tree6c4a861632f3979c9c287b5983a36776317a5932 /pkgs
parent4d3eeda464341243be3fc6c3fbb4a5f1d0ead906 (diff)
home: check network before daily services
Diffstat (limited to 'pkgs')
-rw-r--r--pkgs/default.nix2
-rw-r--r--pkgs/lib/default.nix4
-rw-r--r--pkgs/lib/home-manager/default.nix22
-rw-r--r--pkgs/lib/services/default.nix78
4 files changed, 81 insertions, 25 deletions
diff --git a/pkgs/default.nix b/pkgs/default.nix
index 2fdae90..01b3713 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -1,7 +1,7 @@
super:
let
self = {
- lib = import ./lib { inherit (super) lib; };
+ lib = import ./lib { inherit (super) lib pkgs; };
lockscreen = super.callPackage ./lockscreen { };
diff --git a/pkgs/lib/default.nix b/pkgs/lib/default.nix
index 22c9e07..7b11956 100644
--- a/pkgs/lib/default.nix
+++ b/pkgs/lib/default.nix
@@ -1,8 +1,8 @@
-{ lib }:
+{ lib, pkgs }:
let
self = {
- homeManager = import ./home-manager { };
+ services = import ./services { inherit lib pkgs; };
toUserJS = prefs: ''
${lib.concatStrings (
lib.mapAttrsToList (name: value: ''
diff --git a/pkgs/lib/home-manager/default.nix b/pkgs/lib/home-manager/default.nix
deleted file mode 100644
index 91149d6..0000000
--- a/pkgs/lib/home-manager/default.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{ }:
-
-{
- 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";
- };
- };
- };
-}
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
+ };
+ };
+}