diff --git a/git-auto-update.nix b/git-auto-update.nix index 53da1d2..5581416 100644 --- a/git-auto-update.nix +++ b/git-auto-update.nix @@ -1,58 +1,74 @@ { config, pkgs, ... }: +let + gitUpdateScript = pkgs.writeShellScript "nix-git-auto-update" '' + set -euo pipefail + + LOCAL_PATH="/var/lib/nixos-config" + REPO_URL="https://git.skarockoi.de/ska/nixos-production.git" + + if [ ! -d "$LOCAL_PATH/.git" ]; then + mkdir -p "$LOCAL_PATH" + chmod 700 "$LOCAL_PATH" + ${pkgs.git}/bin/git clone "$REPO_URL" "$LOCAL_PATH" + exit 0 + fi + + cd "$LOCAL_PATH" + + ${pkgs.git}/bin/git fetch origin + + LOCAL_HEAD=$(${pkgs.git}/bin/git rev-parse HEAD) + REMOTE_HEAD=$(${pkgs.git}/bin/git rev-parse origin/main) + + if [ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]; then + ${pkgs.git}/bin/git reset --hard origin/main + ${pkgs.nixos-rebuild}/bin/nixos-rebuild boot \ + -I nixos-config="$LOCAL_PATH/configuration.nix" + fi + ''; +in { + ############################## + # Git Auto Update Script + ############################## + environment.etc."nix-git-auto-update.sh" = { mode = "0700"; - text = '' - #!/run/current-system/sw/bin/bash - set -e - - export PATH="/run/current-system/sw/bin:/nix/var/nix/profiles/default/bin" - export NIX_PATH="nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos" - - LOCAL_PATH="/var/lib/nixos-config" - REPO_URL="https://git.skarockoi.de/ska/nixos-production.git" - - if [ ! -d "$LOCAL_PATH/.git" ]; then - mkdir -p "$LOCAL_PATH" - chmod 700 "$LOCAL_PATH" - git clone "$REPO_URL" "$LOCAL_PATH" - exit 0 - fi - - cd "$LOCAL_PATH" - - git fetch origin - LOCAL_HEAD=$(git rev-parse HEAD) - REMOTE_HEAD=$(git rev-parse origin/main) - - if [ "$LOCAL_HEAD" != "$REMOTE_HEAD" ]; then - git reset --hard origin/main - nixos-rebuild boot -I nixos-config="$LOCAL_PATH/configuration.nix" - fi - ''; + source = gitUpdateScript; }; + ############################## + # systemd service + ############################## + systemd.services.nix-git-auto-update = { description = "Automatically update NixOS from Git"; - script = "/etc/nix-git-auto-update.sh"; + + wants = [ "network-online.target" ]; + after = [ "network-online.target" ]; + serviceConfig = { Type = "oneshot"; - User = "root"; - Group = "root"; + ExecStart = "/etc/nix-git-auto-update.sh"; TimeoutStartSec = "10min"; Restart = "on-failure"; - StandardOutput = "journal"; - StandardError = "journal"; }; }; + ############################## + # systemd timer + ############################## + systemd.timers.nix-git-auto-update = { description = "Periodic NixOS Git update check"; + wantedBy = [ "timers.target" ]; + timerConfig = { - OnBootSec = "60s"; + OnBootSec = "2min"; OnUnitActiveSec = "5min"; + Persistent = true; }; }; } \ No newline at end of file