.github
.vscode
disko
docs
hydra
keys
lib
modules
autopull.nix
base.nix
boot.nix
docker.nix
endlessh.nix
fail2ban.nix
generators.nix
kub_net.nix
libs.nix
locale.nix
nix.nix
openssh.nix
pam-fingerprint-swap.nix
plocate.nix
programs.nix
update.nix
yubikey.nix
pkgs
systems
users
utils
.envrc
.gitconfig
.gitignore
.sops.yaml
CONTRIBUTING.md
README.md
checks.nix
flake.lock
flake.nix
shell.nix
statix.toml
treefmt.toml
106 lines
2.6 KiB
Nix
106 lines
2.6 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
|
|
let
|
|
cfg = config.services.autopull;
|
|
|
|
autopull-type =
|
|
with lib.types;
|
|
attrsOf (
|
|
submodule (
|
|
{ name, ... }:
|
|
{
|
|
options = {
|
|
enable = lib.mkEnableOption "autopull repo";
|
|
|
|
repo-name = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = name;
|
|
|
|
description = "A name for the service which needs to be pulled";
|
|
};
|
|
|
|
path = lib.mkOption {
|
|
type = lib.types.path;
|
|
description = "Path that needs to be updated via git pull";
|
|
};
|
|
|
|
frequency = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = "systemd-timer compatible time between pulls";
|
|
default = "1h";
|
|
};
|
|
|
|
ssh-key = lib.mkOption {
|
|
type = lib.types.str;
|
|
default = "";
|
|
description = "ssh-key used to pull the repository";
|
|
};
|
|
};
|
|
}
|
|
)
|
|
);
|
|
in
|
|
{
|
|
options = {
|
|
services.autopull = {
|
|
enable = lib.mkEnableOption "autopull";
|
|
|
|
repo = lib.mkOption { type = autopull-type; };
|
|
};
|
|
};
|
|
|
|
config =
|
|
let
|
|
repos = lib.filterAttrs (_: { enable, ... }: enable) cfg.repo;
|
|
in
|
|
lib.mkIf cfg.enable {
|
|
environment.systemPackages =
|
|
[ pkgs.git ]
|
|
++ lib.optionals (lib.any (ssh-key: ssh-key != "") (lib.rad-dev.mapGetAttr "ssh-key" repos)) [
|
|
pkgs.openssh
|
|
];
|
|
|
|
systemd.services = lib.mapAttrs' (
|
|
_:
|
|
{
|
|
repo-name,
|
|
ssh-key,
|
|
path,
|
|
...
|
|
}:
|
|
lib.nameValuePair "autopull@${repo-name}" {
|
|
requires = [ "multi-user.target" ];
|
|
after = [ "multi-user.target" ];
|
|
description = "Pull the latest data for ${repo-name}";
|
|
environment = lib.mkIf (ssh-key != "") {
|
|
GIT_SSH_COMMAND = "${pkgs.openssh}/bin/ssh -i ${ssh-key} -o IdentitiesOnly=yes";
|
|
};
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
User = "root";
|
|
WorkingDirectory = path;
|
|
ExecStart = "${pkgs.git}/bin/git pull --all --prune";
|
|
};
|
|
}
|
|
) repos;
|
|
|
|
systemd.timers = lib.mapAttrs' (
|
|
_:
|
|
{ repo-name, frequency, ... }:
|
|
lib.nameValuePair "autopull@${repo-name}" {
|
|
wantedBy = [ "timers.target" ];
|
|
timerConfig = {
|
|
OnBootSec = frequency;
|
|
OnUnitActiveSec = frequency;
|
|
Unit = "autopull@${repo-name}.service";
|
|
};
|
|
}
|
|
) repos;
|
|
};
|
|
}
|