Compare commits

...

2 Commits

Author SHA1 Message Date
25a44e79fa Merge pull request 'fix: pi settings sync' (#7) from fix/pi-sync-settings into master
Some checks failed
Update Nix Packages with nix-update / nix-update (push) Failing after 7m1s
Reviewed-on: #7
2026-04-14 20:16:38 +02:00
sascha.koenig
c615eb5c1e fix: pi settings sync 2026-04-14 20:15:20 +02:00

View File

@@ -42,7 +42,11 @@ with lib; let
mapAttrsToList ( mapAttrsToList (
user: userCfg: '' user: userCfg: ''
${escapeShellArg user}) ${escapeShellArg user})
USER_CONFIG_PATH=${escapeShellArg (if userCfg.configPath != null then userCfg.configPath else cfg.wrapper.hostConfigPath)} USER_CONFIG_PATH=${escapeShellArg (
if userCfg.configPath != null
then userCfg.configPath
else cfg.wrapper.hostConfigPath
)}
USER_ROOTS=(${concatStringsSep " " (map escapeShellArg userCfg.projectRoots)}) USER_ROOTS=(${concatStringsSep " " (map escapeShellArg userCfg.projectRoots)})
;; ;;
'' ''
@@ -98,8 +102,11 @@ with lib; let
printf '%s\n' "$user_home" printf '%s\n' "$user_home"
elif ${pkgs.gnugrep}/bin/grep -q '^~/' <<<"$input"; then elif ${pkgs.gnugrep}/bin/grep -q '^~/' <<<"$input"; then
printf '%s\n' "$user_home/''${input:2}" printf '%s\n' "$user_home/''${input:2}"
else elif ${pkgs.gnugrep}/bin/grep -q '^/' <<<"$input"; then
printf '%s\n' "$input" printf '%s\n' "$input"
else
# Bare relative path resolve from user's home
printf '%s\n' "$user_home/$input"
fi fi
} }
@@ -162,7 +169,11 @@ with lib; let
fi fi
if [ "${if cfg.wrapper.syncConfigFromHost then "1" else "0"}" = "1" ] && [ -d "$source_dir" ]; then if [ "${
if cfg.wrapper.syncConfigFromHost
then "1"
else "0"
}" = "1" ] && [ -d "$source_dir" ]; then
${pkgs.rsync}/bin/rsync -a --delete "$source_dir/" ${escapeShellArg "${cfg.stateDir}/.pi/agent/"} ${pkgs.rsync}/bin/rsync -a --delete "$source_dir/" ${escapeShellArg "${cfg.stateDir}/.pi/agent/"}
${pkgs.coreutils}/bin/chown -R ${escapeShellArg "${cfg.user}:${cfg.group}"} ${escapeShellArg "${cfg.stateDir}/.pi/agent"} ${pkgs.coreutils}/bin/chown -R ${escapeShellArg "${cfg.user}:${cfg.group}"} ${escapeShellArg "${cfg.stateDir}/.pi/agent"}
fi fi
@@ -171,12 +182,12 @@ with lib; let
# Precedence: host settings first, Nix-managed keys override recursively. # Precedence: host settings first, Nix-managed keys override recursively.
settings_target=${escapeShellArg "${cfg.stateDir}/.pi/agent/settings.json"} settings_target=${escapeShellArg "${cfg.stateDir}/.pi/agent/settings.json"}
${pkgs.python3}/bin/python3 - "$settings_target" ${escapeShellArg managedSettingsFile} <<'PY_PI_SETTINGS_MERGE' ${pkgs.python3}/bin/python3 - "$settings_target" ${escapeShellArg managedSettingsFile} <<'PY_PI_SETTINGS_MERGE'
import json import json
import os import os
import sys import sys
def load_obj(path): def load_obj(path):
if not os.path.exists(path): if not os.path.exists(path):
return {} return {}
try: try:
@@ -187,7 +198,7 @@ def load_obj(path):
return {} return {}
def deep_merge(base, override): def deep_merge(base, override):
if isinstance(base, dict) and isinstance(override, dict): if isinstance(base, dict) and isinstance(override, dict):
out = dict(base) out = dict(base)
for key, value in override.items(): for key, value in override.items():
@@ -196,7 +207,7 @@ def deep_merge(base, override):
return override return override
def main(): def main():
target = sys.argv[1] target = sys.argv[1]
managed = sys.argv[2] managed = sys.argv[2]
base_obj = load_obj(target) base_obj = load_obj(target)
@@ -211,9 +222,9 @@ def main():
os.replace(tmp, target) os.replace(tmp, target)
if __name__ == "__main__": if __name__ == "__main__":
main() main()
PY_PI_SETTINGS_MERGE PY_PI_SETTINGS_MERGE
${pkgs.coreutils}/bin/chown ${escapeShellArg "${cfg.user}:${cfg.group}"} "$settings_target" ${pkgs.coreutils}/bin/chown ${escapeShellArg "${cfg.user}:${cfg.group}"} "$settings_target"
${pkgs.coreutils}/bin/chmod 0640 "$settings_target" ${pkgs.coreutils}/bin/chmod 0640 "$settings_target"
@@ -239,7 +250,8 @@ PY_PI_SETTINGS_MERGE
${pkgs.coreutils}/bin/cat ${escapeShellArg f} >> "$env_target" ${pkgs.coreutils}/bin/cat ${escapeShellArg f} >> "$env_target"
printf '\n' >> "$env_target" printf '\n' >> "$env_target"
fi fi
'') cfg.environmentFiles)} '')
cfg.environmentFiles)}
${pkgs.coreutils}/bin/chown ${escapeShellArg "${cfg.user}:${cfg.group}"} "$env_target" ${pkgs.coreutils}/bin/chown ${escapeShellArg "${cfg.user}:${cfg.group}"} "$env_target"
${pkgs.coreutils}/bin/chmod 0640 "$env_target" ${pkgs.coreutils}/bin/chmod 0640 "$env_target"
@@ -410,8 +422,10 @@ PY_PI_SETTINGS_MERGE
printf '%s\n' "$user_home" printf '%s\n' "$user_home"
elif ${pkgs.gnugrep}/bin/grep -q '^~/' <<<"$input"; then elif ${pkgs.gnugrep}/bin/grep -q '^~/' <<<"$input"; then
printf '%s\n' "$user_home/''${input:2}" printf '%s\n' "$user_home/''${input:2}"
else elif ${pkgs.gnugrep}/bin/grep -q '^/' <<<"$input"; then
printf '%s\n' "$input" printf '%s\n' "$input"
else
printf '%s\n' "$user_home/$input"
fi fi
} }
@@ -657,7 +671,8 @@ in {
++ mapAttrsToList (user: userCfg: { ++ mapAttrsToList (user: userCfg: {
assertion = userCfg.projectRoots != []; assertion = userCfg.projectRoots != [];
message = "m3ta.pi-agent.hostUsers.${user}.projectRoots must not be empty."; message = "m3ta.pi-agent.hostUsers.${user}.projectRoots must not be empty.";
}) cfg.hostUsers; })
cfg.hostUsers;
users.groups = mkIf cfg.createUser { users.groups = mkIf cfg.createUser {
"${cfg.group}" = {}; "${cfg.group}" = {};