summaryrefslogtreecommitdiff
path: root/accounts/gkleen@sif/systemd.nix
diff options
context:
space:
mode:
Diffstat (limited to 'accounts/gkleen@sif/systemd.nix')
-rw-r--r--accounts/gkleen@sif/systemd.nix245
1 files changed, 154 insertions, 91 deletions
diff --git a/accounts/gkleen@sif/systemd.nix b/accounts/gkleen@sif/systemd.nix
index 119d8cc3..e601b49c 100644
--- a/accounts/gkleen@sif/systemd.nix
+++ b/accounts/gkleen@sif/systemd.nix
@@ -6,7 +6,7 @@ let
6 cfg = config.home-manager.users.${userName}; 6 cfg = config.home-manager.users.${userName};
7 7
8 autossh-socks-script = pkgs.writeScript "autossh" '' 8 autossh-socks-script = pkgs.writeScript "autossh" ''
9 #!${pkgs.zsh}/bin/zsh -xe 9 #!${lib.getExe pkgs.zsh} -xe
10 10
11 host="''${1%:*}" 11 host="''${1%:*}"
12 port="''${1#*:}" 12 port="''${1#*:}"
@@ -15,31 +15,29 @@ let
15 cmd=() 15 cmd=()
16 16
17 if [[ -n "''${SSHPASS_SECRET}" ]]; then 17 if [[ -n "''${SSHPASS_SECRET}" ]]; then
18 cmd+=(${pkgs.sshpassSecret}/bin/sshpass-secret) 18 cmd+=(${lib.getExe' pkgs.sshpassSecret "sshpass-secret"})
19 cmd+=("''${(@s/:/)SSHPASS_SECRET}") 19 cmd+=("''${(@s/:/)SSHPASS_SECRET}")
20 cmd+=(--) 20 cmd+=(--)
21 fi 21 fi
22 22
23 cmd+=(${pkgs.openssh}/bin/ssh -vN -D localhost:''${port} "''${host}") 23 cmd+=(${lib.getExe' pkgs.openssh "ssh"} -vN -D 127.0.0.1:''${port} "''${host}")
24 24
25 ( exec -a "''${cmd[1]}" -- ''${cmd} ) & 25 ( exec -a "''${cmd[1]}" -- ''${cmd} ) &
26 pid=$! 26 pid=$!
27 27
28 newpid="" 28 newpid=""
29 i=200 29 i=200
30 while ! newpid=$(${pkgs.lsof}/bin/lsof -Pi @localhost:"''${port}" -sTCP:LISTEN -t); do 30 while ! newpid=$(${lib.getExe pkgs.lsof} -Pi @localhost:"''${port}" -sTCP:LISTEN -t); do
31 if ! kill -0 "''${pid}"; then 31 if ! kill -0 "''${pid}"; then
32 wait "''${pid}" 32 wait "''${pid}"
33 exit $? 33 exit $?
34 fi 34 fi
35 [[ "''${i}" -gt 0 ]] || exit 1 35 [[ "''${i}" -gt 0 ]] || exit 1
36 i=$((''${i} - 1)) 36 i=$((''${i} - 1))
37 ${pkgs.coreutils}/bin/sleep 0.1 37 ${lib.getExe' pkgs.coreutils "sleep"} 0.1
38 done 38 done
39 39
40 ${config.systemd.package}/bin/systemd-notify --ready 40 ${lib.getExe' config.systemd.package "systemd-notify"} --pid=''${newpid} --ready
41
42 wait "''${pid}" "''${newpid}"
43 ''; 41 '';
44in { 42in {
45 tmpfiles.rules = [ 43 tmpfiles.rules = [
@@ -48,11 +46,11 @@ in {
48 ]; 46 ];
49 47
50 services = { 48 services = {
51 sync-keepass = { 49 "sync-keepass@" = {
52 Service = { 50 Service = {
53 Type = "oneshot"; 51 Type = "oneshot";
54 WorkingDirectory = "~"; 52 WorkingDirectory = "~";
55 ExecStart = toString (pkgs.writers.writePython3 "sync-keepass" { 53 ExecStart = "${pkgs.writers.writePython3 "sync-keepass" {
56 libraries = with pkgs.python3Packages; [ python-dateutil ]; 54 libraries = with pkgs.python3Packages; [ python-dateutil ];
57 } '' 55 } ''
58 import json 56 import json
@@ -61,13 +59,13 @@ in {
61 from datetime import datetime 59 from datetime import datetime
62 from dateutil.tz import tzlocal 60 from dateutil.tz import tzlocal
63 from dateutil.parser import isoparse 61 from dateutil.parser import isoparse
64 from sys import stderr 62 from sys import stderr, argv
65 63
66 64
67 remote_fs = 'surtr' 65 remote_fs = 'surtr' if argv[1] == 'store.kdbx' else 'mathcloud'
68 remote_file = 'store.kdbx' 66 remote_file = argv[1]
69 target_file = expanduser('~/store.kdbx') 67 target_file = expanduser(f'~/{argv[1]}')
70 meta_file = expanduser('~/.store.kdbx.json') 68 meta_file = expanduser(f'~/.{argv[1]}.json')
71 69
72 upload_time = None 70 upload_time = None
73 our_last_upload_time = None 71 our_last_upload_time = None
@@ -117,22 +115,14 @@ in {
117 do_upload() 115 do_upload()
118 elif upload_time is not None and (mod_time is None or upload_time > mod_time) and (our_last_upload_time is None or upload_time > our_last_upload_time): # noqa: E501 116 elif upload_time is not None and (mod_time is None or upload_time > mod_time) and (our_last_upload_time is None or upload_time > our_last_upload_time): # noqa: E501
119 do_download() 117 do_download()
120 ''); 118 ''} \"%I\"";
121 Environment = [ "RCLONE_PASSWORD_COMMAND=\"${pkgs.coreutils}/bin/cat ${config.sops.secrets.gkleen-rclone.path}\"" "PATH=${pkgs.rclone}/bin" ]; 119 Environment = [ "RCLONE_PASSWORD_COMMAND=\"${pkgs.coreutils}/bin/cat ${config.sops.secrets.gkleen-rclone.path}\"" "PATH=${pkgs.rclone}/bin" ];
122 }; 120 };
123 }; 121 };
124 emacs = { 122 emacs = {
125 Unit = { 123 Unit = {
126 After = ["graphical-session-pre.target"]; 124 After = [ "graphical-session.target" ];
127 }; 125 BindsTo = [ "graphical-session.target" ];
128 };
129 dunst = {
130 Service = {
131 ExecStart = lib.mkForce "${cfg.services.dunst.package}/bin/dunst";
132 Restart = "always";
133 };
134 Install = {
135 WantedBy = ["graphical-session.target"];
136 }; 126 };
137 }; 127 };
138 keepassxc = { 128 keepassxc = {
@@ -144,8 +134,8 @@ in {
144 Environment = [ "QT_QPA_PLATFORM=wayland" ]; 134 Environment = [ "QT_QPA_PLATFORM=wayland" ];
145 }; 135 };
146 Unit = { 136 Unit = {
147 Requires = ["graphical-session-pre.target"]; 137 After = [ "graphical-session.target" ];
148 After = ["graphical-session-pre.target"]; 138 BindsTo = [ "graphical-session.target" ];
149 }; 139 };
150 }; 140 };
151 mpris-proxy = { 141 mpris-proxy = {
@@ -154,7 +144,7 @@ in {
154 Service.ExecStart = "${pkgs.bluez}/bin/mpris-proxy"; 144 Service.ExecStart = "${pkgs.bluez}/bin/mpris-proxy";
155 Install.WantedBy = [ "default.target" ]; 145 Install.WantedBy = [ "default.target" ];
156 }; 146 };
157 "autossh-socks@proxy.mathw0h:8119" = { 147 "autossh-socks@proxy.ssh.math.lmu.de:8119" = {
158 Service = { 148 Service = {
159 Type = "notify"; 149 Type = "notify";
160 NotifyAccess = "all"; 150 NotifyAccess = "all";
@@ -162,7 +152,7 @@ in {
162 Restart = "always"; 152 Restart = "always";
163 RestartSec = "23s"; 153 RestartSec = "23s";
164 ExecStart = "${autossh-socks-script} \"%I\""; 154 ExecStart = "${autossh-socks-script} \"%I\"";
165 Environment = [ "SSHPASS_SECRET=gkleen@mathw0g.math.lmu.de" ]; 155 Environment = [ "SSHPASS_SECRET=gkleen@ssh.math.lmu.de" ];
166 }; 156 };
167 Unit = { 157 Unit = {
168 StopWhenUnneeded = true; 158 StopWhenUnneeded = true;
@@ -183,9 +173,36 @@ in {
183 StopWhenUnneeded = true; 173 StopWhenUnneeded = true;
184 }; 174 };
185 }; 175 };
186 swayidle = { 176 "autossh-socks@proxy.mathw0h:8123" = {
177 Service = {
178 Type = "notify";
179 NotifyAccess = "all";
180 WorkingDirectory = "~";
181 Restart = "always";
182 RestartSec = "23s";
183 ExecStart = "${autossh-socks-script} \"%I\"";
184 Environment = [ "SSHPASS_SECRET=gkleen@mathw0h.mathinst.loc" ];
185 };
186 Unit = {
187 StopWhenUnneeded = true;
188 StartLimitInterval = "180s";
189 StartLimitBurst = 7;
190 };
191 };
192 "autossh-socks@proxy.mathw0e:8125" = {
187 Service = { 193 Service = {
188 RuntimeDirectory = "swayidle"; 194 Type = "notify";
195 NotifyAccess = "all";
196 WorkingDirectory = "~";
197 Restart = "always";
198 RestartSec = "23s";
199 ExecStart = "${autossh-socks-script} \"%I\"";
200 Environment = [ "SSHPASS_SECRET=gkleen@mathw0e.mathinst.loc" ];
201 };
202 Unit = {
203 StopWhenUnneeded = true;
204 StartLimitInterval = "180s";
205 StartLimitBurst = 7;
189 }; 206 };
190 }; 207 };
191 psi-notify = { 208 psi-notify = {
@@ -193,8 +210,8 @@ in {
193 WantedBy = ["graphical-session.target"]; 210 WantedBy = ["graphical-session.target"];
194 }; 211 };
195 Unit = { 212 Unit = {
196 Requires = ["graphical-session-pre.target"]; 213 After = [ "graphical-session.target" ];
197 After = ["graphical-session-pre.target"]; 214 PartOf = [ "graphical-session.target" ];
198 }; 215 };
199 Service = { 216 Service = {
200 ExecStart = lib.getExe pkgs.psi-notify; 217 ExecStart = lib.getExe pkgs.psi-notify;
@@ -207,6 +224,7 @@ in {
207 gtklock = { 224 gtklock = {
208 Unit = { 225 Unit = {
209 Requisite = ["graphical-session.target"]; 226 Requisite = ["graphical-session.target"];
227 After = [ "graphical-session.target" ];
210 PartOf = ["graphical-session.target"]; 228 PartOf = ["graphical-session.target"];
211 }; 229 };
212 Service = { 230 Service = {
@@ -214,53 +232,55 @@ in {
214 RuntimeDirectory = "gtklock"; 232 RuntimeDirectory = "gtklock";
215 CacheDirectory = "gtklock"; 233 CacheDirectory = "gtklock";
216 ExecStartPre = [ 234 ExecStartPre = [
217 "${pkgs.libsForQt5.qt5.qttools.bin}/bin/qdbus org.keepassxc.KeePassXC.MainWindow /keepassxc org.keepassxc.KeePassXC.MainWindow.lockAllDatabases" 235 "-${lib.getExe' pkgs.libsForQt5.qt5.qttools.bin "qdbus"} org.keepassxc.KeePassXC.MainWindow /keepassxc org.keepassxc.KeePassXC.MainWindow.lockAllDatabases"
218 "${config.systemd.package}/bin/systemctl --user stop gpg-agent.service" 236 "-${lib.getExe' config.systemd.package "systemctl"} --user stop gpg-agent.service"
219 (pkgs.writeShellScript "generate-css" '' 237 "-${lib.getExe pkgs.playerctl} -a pause"
220 set -x 238 "-${lib.getExe (pkgs.writeShellApplication {
221 export PATH="${lib.makeBinPath [cfg.programs.wpaperd.package pkgs.jq pkgs.coreutils pkgs.imagemagick pkgs.findutils]}:$PATH" 239 name = "generate-css";
222 240 runtimeInputs = with pkgs; [cfg.services.wpaperd.package jq coreutils imagemagick findutils];
223 declare -A monitors 241 text = ''
224 monitors=() 242 declare -A monitors
225 while IFS= read -r entry; do 243 monitors=()
226 path=$(jq -r ".path" <<<"$entry") 244 while IFS= read -r entry; do
227 [[ -z "$path" || ! -f "$path" ]] && continue 245 path=$(jq -r ".path" <<<"$entry")
228 blurred_path="$CACHE_DIRECTORY"/"$(b2sum -l 128 <<<"$path" | cut -d' ' -f1)"."''${path##*.}" 246 [[ -z "$path" || ! -f "$path" ]] && continue
229 monitor=$(jq -r ".display" <<<"$entry") 247 blurred_path="$CACHE_DIRECTORY"/"$(b2sum -l 128 <<<"$path" | cut -d' ' -f1)"."''${path##*.}"
230 if [[ ! -f "$blurred_path" ]]; then 248 monitor=$(jq -r ".display" <<<"$entry")
231 mkdir -p "$(dirname "$blurred_path")" 249 if [[ ! -f "$blurred_path" ]]; then
232 magick "$path" -filter Gaussian -resize 6.25% -define filter:sigma=2.5 -resize 1600% "$blurred_path" & 250 mkdir -p "$(dirname "$blurred_path")"
233 fi 251 magick "$path" -filter Gaussian -resize 6.25% -define filter:sigma=2.5 -resize 1600% "$blurred_path" &
234 monitors+=([$monitor]="$blurred_path") 252 fi
235 done < <(wpaperctl all-wallpapers -j | jq -c ".[]") 253 monitors+=([$monitor]="$blurred_path")
236 wait 254 done < <(wpaperctl all-wallpapers -j | jq -c ".[]")
255 # wait
237 256
238 cp --no-preserve=mode ${pkgs.writeText "gtklock.css" '' 257 cp --no-preserve=mode ${pkgs.writeText "gtklock.css" ''
239 #window-box { 258 #window-box {
240 padding: 64px; 259 padding: 64px;
241 /* border: 1px solid black; */ 260 /* border: 1px solid black; */
242 border-radius: 4px; 261 border-radius: 4px;
243 box-shadow: rgba(0, 0, 0, 0.8) 0px 4px 12px; 262 box-shadow: rgba(0, 0, 0, 0.8) 0px 4px 12px;
244 /* background-color: white; */ 263 /* background-color: white; */
245 background-color: rgba(0, 0, 0, 0.5); 264 background-color: rgba(0, 0, 0, 0.5);
265 }
266 ''} "$RUNTIME_DIRECTORY"/style.css
267 for monitor in "''${!monitors[@]}"; do
268 cat >>"$RUNTIME_DIRECTORY"/style.css <<EOF
269 window#''${monitor} {
270 background-image: url("''${monitors[$monitor]}");
271 background-repeat: no-repeat;
272 background-size: 100% 100%;
273 background-origin: content-box;
246 } 274 }
247 ''} "$RUNTIME_DIRECTORY"/style.css 275 EOF
248 for monitor in "''${!monitors[@]}"; do 276 done
249 cat >>"$RUNTIME_DIRECTORY"/style.css <<EOF 277 '';
250 window#''${monitor} { 278 })}"
251 background-image: url("''${monitors[$monitor]}");
252 background-repeat: no-repeat;
253 background-size: 100% 100%;
254 background-origin: content-box;
255 }
256 EOF
257 done
258 '')
259 ]; 279 ];
260 NotifyAccess = "all"; 280 NotifyAccess = "all";
261 ExecStart = ''${lib.getExe pkgs.gtklock} -s "''${RUNTIME_DIRECTORY}/style.css" -L ${pkgs.writeShellScript "after-lock" '' 281 ExecStart = ''${lib.getExe pkgs.gtklock} -s "''${RUNTIME_DIRECTORY}/style.css" -L ${pkgs.writeShellScript "after-lock" ''
262 ${cfg.wayland.windowManager.hyprland.package}/bin/hyprctl dispatch dpms off 282 ${lib.getExe cfg.programs.niri.package} msg action power-off-monitors
263 ${config.systemd.package}/bin/systemd-notify --ready 283 ${lib.getExe' config.systemd.package "systemd-notify"} --ready
264 ''}''; 284 ''}'';
265 }; 285 };
266 }; 286 };
@@ -308,30 +328,60 @@ in {
308 ExecStopPost = "${pkgs.coreutils}/bin/rm -rfv \"$CACHE_DIRECTORY\""; 328 ExecStopPost = "${pkgs.coreutils}/bin/rm -rfv \"$CACHE_DIRECTORY\"";
309 }; 329 };
310 }; 330 };
311 wpaperd = { 331 # wpaperd = {
312 Install = { 332 # Install = {
313 WantedBy = ["graphical-session.target"]; 333 # WantedBy = ["graphical-session.target"];
334 # };
335 # Unit = {
336 # After = [ "graphical-session.target" ];
337 # PartOf = [ "graphical-session.target" ];
338 # };
339 # Service = {
340 # ExecStart = lib.getExe cfg.services.wpaperd.package;
341 # Type = "simple";
342 # Restart = "always";
343 # RestartSec = "2s";
344 # };
345 # };
346 xembed-sni-proxy = {
347 Unit = {
348 PartOf = lib.mkForce ["tray.target"];
314 }; 349 };
350 };
351 poweralertd = {
315 Unit = { 352 Unit = {
316 BindsTo = ["graphical-session-pre.target"]; 353 After = ["graphical-session.target"];
317 After = ["graphical-session-pre.target"];
318 }; 354 };
319 Service = { 355 };
320 ExecStart = lib.getExe cfg.programs.wpaperd.package; 356 network-manager-applet = {
321 Type = "simple"; 357 Unit = {
322 Restart = "always"; 358 PartOf = lib.mkForce ["tray.target"];
323 RestartSec = "2s"; 359 };
360 };
361 udiskie = {
362 Unit = {
363 PartOf = lib.mkForce ["tray.target"];
364 };
365 };
366 blueman-applet = {
367 Unit = {
368 PartOf = lib.mkForce ["tray.target"];
369 };
370 Install = {
371 WantedBy = lib.mkForce ["tray.target"];
324 }; 372 };
325 }; 373 };
326 } // listToAttrs (map ({host, port}: nameValuePair "proxy-to-autossh-socks@${toString port}" { 374 } // listToAttrs (map ({host, port}: nameValuePair "proxy-to-autossh-socks@${toString port}" {
327 Unit = { 375 Unit = {
328 Requires = ["autossh-socks@${host}:${toString (port + 1)}.service" "proxy-to-autossh-socks@${toString port}.socket"]; 376 BindsTo = ["autossh-socks@${host}:${toString (port + 1)}.service" "proxy-to-autossh-socks@${toString port}.socket"];
329 After = ["autossh-socks@${host}:${toString (port + 1)}.service" "proxy-to-autossh-socks@${toString port}.socket"]; 377 After = ["autossh-socks@${host}:${toString (port + 1)}.service" "proxy-to-autossh-socks@${toString port}.socket"];
330 }; 378 };
331 Service = { 379 Service = {
332 ExecStart = "${config.systemd.package}/lib/systemd/systemd-socket-proxyd --exit-idle-time=10s localhost:${toString (port + 1)}"; 380 ExecStart = "${config.systemd.package}/lib/systemd/systemd-socket-proxyd --exit-idle-time=60s 127.0.0.1:${toString (port + 1)}";
381 Restart = "always";
382 RestartSec = "23s";
333 }; 383 };
334 }) [{ host = "proxy.mathw0h"; port = 8118; } { host = "proxy.vidhar"; port = 8120; }]); 384 }) [{ host = "proxy.ssh.math.lmu.de"; port = 8118; } { host = "proxy.vidhar"; port = 8120; } { host = "proxy.mathw0h"; port = 8122; } { host = "proxy.mathw0e"; port = 8124; }]);
335 sockets = listToAttrs (map (port: nameValuePair "proxy-to-autossh-socks@${toString port}" { 385 sockets = listToAttrs (map (port: nameValuePair "proxy-to-autossh-socks@${toString port}" {
336 Socket = { 386 Socket = {
337 ListenStream = "%I"; 387 ListenStream = "%I";
@@ -339,7 +389,7 @@ in {
339 Install = { 389 Install = {
340 WantedBy = ["default.target"]; 390 WantedBy = ["default.target"];
341 }; 391 };
342 }) [8118 8120]) // { 392 }) [8118 8120 8122 8124]) // {
343 "yt-dlp" = { 393 "yt-dlp" = {
344 Socket = { 394 Socket = {
345 SocketMode = "0600"; 395 SocketMode = "0600";
@@ -353,7 +403,7 @@ in {
353 }; 403 };
354 }; 404 };
355 timers = { 405 timers = {
356 sync-keepass = { 406 "sync-keepass@store.kdbx" = {
357 Timer = { 407 Timer = {
358 OnActiveSec = "1m"; 408 OnActiveSec = "1m";
359 OnUnitActiveSec = "1m"; 409 OnUnitActiveSec = "1m";
@@ -363,6 +413,16 @@ in {
363 WantedBy = ["default.target"]; 413 WantedBy = ["default.target"];
364 }; 414 };
365 }; 415 };
416 "sync-keepass@rz.kdbx" = {
417 Timer = {
418 OnActiveSec = "1d";
419 OnUnitActiveSec = "1d";
420 };
421
422 Install = {
423 WantedBy = ["default.target"];
424 };
425 };
366 }; 426 };
367 targets = { 427 targets = {
368 graphical-session = { 428 graphical-session = {
@@ -373,6 +433,9 @@ in {
373 }; 433 };
374 tray = { 434 tray = {
375 Unit = { 435 Unit = {
436 PartOf = [ "graphical-session.target" ];
437 # Requires = [ "waybar.service" ];
438 After = [ "graphical-session.target" ]; # "waybar.service" ];
376 Wants = ["blueman-applet.service" "udiskie.service" "network-manager-applet.service"]; 439 Wants = ["blueman-applet.service" "udiskie.service" "network-manager-applet.service"];
377 }; 440 };
378 }; 441 };