syncthing: use upstream module
This commit is contained in:
parent
0a9aa4bc57
commit
0578d85188
@ -50,7 +50,6 @@ let
|
|||||||
./secret.nix
|
./secret.nix
|
||||||
./setuid.nix
|
./setuid.nix
|
||||||
./shadow.nix
|
./shadow.nix
|
||||||
./syncthing.nix
|
|
||||||
./tinc.nix
|
./tinc.nix
|
||||||
./tinc_graphs.nix
|
./tinc_graphs.nix
|
||||||
./urlwatch.nix
|
./urlwatch.nix
|
||||||
|
@ -1,206 +0,0 @@
|
|||||||
{ config, pkgs, ... }: with import <stockholm/lib>;
|
|
||||||
|
|
||||||
let
|
|
||||||
|
|
||||||
kcfg = config.krebs.syncthing;
|
|
||||||
scfg = config.services.syncthing;
|
|
||||||
|
|
||||||
devices = mapAttrsToList (name: peer: {
|
|
||||||
name = name;
|
|
||||||
deviceID = peer.id;
|
|
||||||
addresses = peer.addresses;
|
|
||||||
}) kcfg.peers;
|
|
||||||
|
|
||||||
folders = mapAttrsToList ( _: folder: {
|
|
||||||
inherit (folder) path id type;
|
|
||||||
devices = map (peer: { deviceId = kcfg.peers.${peer}.id; }) folder.peers;
|
|
||||||
rescanIntervalS = folder.rescanInterval;
|
|
||||||
fsWatcherEnabled = folder.watch;
|
|
||||||
fsWatcherDelayS = folder.watchDelay;
|
|
||||||
ignoreDelete = folder.ignoreDelete;
|
|
||||||
ignorePerms = folder.ignorePerms;
|
|
||||||
}) kcfg.folders;
|
|
||||||
|
|
||||||
getApiKey = pkgs.writeDash "getAPIKey" ''
|
|
||||||
${pkgs.libxml2}/bin/xmllint \
|
|
||||||
--xpath 'string(configuration/gui/apikey)'\
|
|
||||||
${scfg.configDir}/config.xml
|
|
||||||
'';
|
|
||||||
|
|
||||||
updateConfig = pkgs.writeDash "merge-syncthing-config" ''
|
|
||||||
set -efu
|
|
||||||
|
|
||||||
# XXX this assumes the GUI address to be "IPv4 address and port"
|
|
||||||
host=${shell.escape (elemAt (splitString ":" scfg.guiAddress) 0)}
|
|
||||||
port=${shell.escape (elemAt (splitString ":" scfg.guiAddress) 1)}
|
|
||||||
|
|
||||||
# wait for service to restart
|
|
||||||
${pkgs.untilport}/bin/untilport "$host" "$port"
|
|
||||||
|
|
||||||
API_KEY=$(${getApiKey})
|
|
||||||
|
|
||||||
_curl() {
|
|
||||||
${pkgs.curl}/bin/curl \
|
|
||||||
-Ss \
|
|
||||||
-H "X-API-Key: $API_KEY" \
|
|
||||||
"http://$host:$port/rest""$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
old_config=$(_curl /system/config)
|
|
||||||
new_config=${shell.escape (toJSON {
|
|
||||||
inherit devices folders;
|
|
||||||
})}
|
|
||||||
new_config=$(${pkgs.jq}/bin/jq -en \
|
|
||||||
--argjson old_config "$old_config" \
|
|
||||||
--argjson new_config "$new_config" \
|
|
||||||
'
|
|
||||||
$old_config * $new_config
|
|
||||||
${optionalString (!kcfg.overridePeers) ''
|
|
||||||
* { devices: $old_config.devices }
|
|
||||||
''}
|
|
||||||
${optionalString (!kcfg.overrideFolders) ''
|
|
||||||
* { folders: $old_config.folders }
|
|
||||||
''}
|
|
||||||
'
|
|
||||||
)
|
|
||||||
echo $new_config | _curl /system/config -d @-
|
|
||||||
_curl /system/restart -X POST
|
|
||||||
'';
|
|
||||||
|
|
||||||
in
|
|
||||||
|
|
||||||
{
|
|
||||||
options.krebs.syncthing = {
|
|
||||||
|
|
||||||
enable = mkEnableOption "syncthing-init";
|
|
||||||
|
|
||||||
cert = mkOption {
|
|
||||||
type = types.nullOr types.absolute-pathname;
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
key = mkOption {
|
|
||||||
type = types.nullOr types.absolute-pathname;
|
|
||||||
default = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
overridePeers = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = ''
|
|
||||||
Whether to delete the peers which are not configured via the peers option
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
peers = mkOption {
|
|
||||||
default = {};
|
|
||||||
type = types.attrsOf (types.submodule ({
|
|
||||||
options = {
|
|
||||||
|
|
||||||
# TODO make into addr + port submodule
|
|
||||||
addresses = mkOption {
|
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
#TODO check
|
|
||||||
id = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
overrideFolders = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
description = ''
|
|
||||||
Whether to delete the folders which are not configured via the peers option
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
folders = mkOption {
|
|
||||||
default = {};
|
|
||||||
type = types.attrsOf (types.submodule ({ config, ... }: {
|
|
||||||
options = {
|
|
||||||
|
|
||||||
path = mkOption {
|
|
||||||
type = types.absolute-pathname;
|
|
||||||
default = config._module.args.name;
|
|
||||||
};
|
|
||||||
|
|
||||||
id = mkOption {
|
|
||||||
type = types.str;
|
|
||||||
default = config._module.args.name;
|
|
||||||
};
|
|
||||||
|
|
||||||
peers = mkOption {
|
|
||||||
type = types.listOf types.str;
|
|
||||||
default = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
rescanInterval = mkOption {
|
|
||||||
type = types.int;
|
|
||||||
default = 3600;
|
|
||||||
};
|
|
||||||
|
|
||||||
type = mkOption {
|
|
||||||
type = types.enum [ "sendreceive" "sendonly" "receiveonly" ];
|
|
||||||
default = "sendreceive";
|
|
||||||
};
|
|
||||||
|
|
||||||
watch = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
watchDelay = mkOption {
|
|
||||||
type = types.int;
|
|
||||||
default = 10;
|
|
||||||
};
|
|
||||||
|
|
||||||
ignoreDelete = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
ignorePerms = mkOption {
|
|
||||||
type = types.bool;
|
|
||||||
default = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = mkIf kcfg.enable {
|
|
||||||
|
|
||||||
systemd.services.syncthing = mkIf (kcfg.cert != null || kcfg.key != null) {
|
|
||||||
serviceConfig.PermissionsStartOnly = mkDefault true;
|
|
||||||
preStart = ''
|
|
||||||
${optionalString (kcfg.cert != null) ''
|
|
||||||
cp ${toString kcfg.cert} ${scfg.configDir}/cert.pem
|
|
||||||
chown ${scfg.user}:${scfg.group} ${scfg.configDir}/cert.pem
|
|
||||||
chmod 400 ${scfg.configDir}/cert.pem
|
|
||||||
''}
|
|
||||||
${optionalString (kcfg.key != null) ''
|
|
||||||
cp ${toString kcfg.key} ${scfg.configDir}/key.pem
|
|
||||||
chown ${scfg.user}:${scfg.group} ${scfg.configDir}/key.pem
|
|
||||||
chmod 400 ${scfg.configDir}/key.pem
|
|
||||||
''}
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.syncthing-init = {
|
|
||||||
after = [ "syncthing.service" ];
|
|
||||||
wantedBy = [ "multi-user.target" ];
|
|
||||||
|
|
||||||
serviceConfig = {
|
|
||||||
User = scfg.user;
|
|
||||||
RemainAfterExit = true;
|
|
||||||
Type = "oneshot";
|
|
||||||
ExecStart = updateConfig;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
@ -49,17 +49,17 @@ with import <stockholm/lib>;
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
krebs.syncthing = {
|
services.syncthing.declarative = {
|
||||||
peers.schasch.addresses = [ "schasch.r:22000" ];
|
devices.schasch.addresses = [ "schasch.r:22000" ];
|
||||||
folders = {
|
folders = {
|
||||||
the_playlist = {
|
the_playlist = {
|
||||||
path = "/home/lass/tmp/the_playlist";
|
path = "/home/lass/tmp/the_playlist";
|
||||||
peers = [ "mors" "phone" "prism" "xerxes" ];
|
devices = [ "mors" "phone" "prism" "xerxes" ];
|
||||||
};
|
};
|
||||||
free_music = {
|
free_music = {
|
||||||
id = "mu9mn-zgvsw";
|
id = "mu9mn-zgvsw";
|
||||||
path = "/home/lass/tmp/free_music";
|
path = "/home/lass/tmp/free_music";
|
||||||
peers = [ "mors" "schasch" ];
|
devices = [ "mors" "schasch" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -41,11 +41,11 @@
|
|||||||
displayManager.lightdm.autoLogin.user = "lass";
|
displayManager.lightdm.autoLogin.user = "lass";
|
||||||
};
|
};
|
||||||
|
|
||||||
krebs.syncthing = {
|
services.syncthing.declarative = {
|
||||||
folders = {
|
folders = {
|
||||||
the_playlist = {
|
the_playlist = {
|
||||||
path = "/home/lass/tmp/the_playlist";
|
path = "/home/lass/tmp/the_playlist";
|
||||||
peers = [ "mors" "phone" "prism" "xerxes" ];
|
devices = [ "mors" "phone" "prism" "xerxes" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -20,7 +20,7 @@ with import <stockholm/lib>;
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
krebs.syncthing.folders."/var/lib/sync-containers".peers = [ "icarus" "skynet" "littleT" "shodan" ];
|
services.syncthing.declarative.folders."/var/lib/sync-containers".devices = [ "icarus" "skynet" "littleT" "shodan" ];
|
||||||
krebs.permown."/var/lib/sync-containers" = {
|
krebs.permown."/var/lib/sync-containers" = {
|
||||||
owner = "root";
|
owner = "root";
|
||||||
group = "syncthing";
|
group = "syncthing";
|
||||||
|
@ -277,9 +277,9 @@ in {
|
|||||||
alias ${html};
|
alias ${html};
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
krebs.syncthing.folders."the_playlist" = {
|
services.syncthing.declarative.folders."the_playlist" = {
|
||||||
path = "/home/radio/music/the_playlist";
|
path = "/home/radio/music/the_playlist";
|
||||||
peers = [ "mors" "phone" "prism" "xerxes" ];
|
devices = [ "mors" "phone" "prism" "xerxes" ];
|
||||||
};
|
};
|
||||||
krebs.permown."/home/radio/music/the_playlist" = {
|
krebs.permown."/home/radio/music/the_playlist" = {
|
||||||
owner = "radio";
|
owner = "radio";
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
krebs.syncthing.folders.decsync = {
|
services.syncthing.declarative.folders.decsync = {
|
||||||
path = "/home/lass/decsync";
|
path = "/home/lass/decsync";
|
||||||
peers = [ "mors" "blue" "green" "phone" ];
|
devices = [ "mors" "blue" "green" "phone" ];
|
||||||
};
|
};
|
||||||
krebs.permown."/home/lass/decsync" = {
|
krebs.permown."/home/lass/decsync" = {
|
||||||
owner = "lass";
|
owner = "lass";
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
krebs.syncthing.folders."/home/lass/.weechat".peers = [ "blue" "green" "mors" ];
|
services.syncthing.declarative.folders."/home/lass/.weechat".devices = [ "blue" "green" "mors" ];
|
||||||
krebs.permown."/home/lass/.weechat" = {
|
krebs.permown."/home/lass/.weechat" = {
|
||||||
owner = "lass";
|
owner = "lass";
|
||||||
group = "syncthing";
|
group = "syncthing";
|
||||||
|
@ -7,18 +7,20 @@ in {
|
|||||||
enable = true;
|
enable = true;
|
||||||
group = "syncthing";
|
group = "syncthing";
|
||||||
configDir = "/var/lib/syncthing";
|
configDir = "/var/lib/syncthing";
|
||||||
|
declarative = {
|
||||||
|
key = toString <secrets/syncthing.key>;
|
||||||
|
cert = toString <secrets/syncthing.cert>;
|
||||||
|
devices = mk_peers all_peers;
|
||||||
|
folders."/home/lass/sync" = {
|
||||||
|
devices = attrNames (filterAttrs (n: v: n != "phone") own_peers);
|
||||||
|
# ignorePerms = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
krebs.iptables.tables.filter.INPUT.rules = [
|
krebs.iptables.tables.filter.INPUT.rules = [
|
||||||
{ predicate = "-p tcp --dport 22000"; target = "ACCEPT";}
|
{ predicate = "-p tcp --dport 22000"; target = "ACCEPT";}
|
||||||
{ predicate = "-p udp --dport 21027"; target = "ACCEPT";}
|
{ predicate = "-p udp --dport 21027"; target = "ACCEPT";}
|
||||||
];
|
];
|
||||||
krebs.syncthing = {
|
|
||||||
enable = true;
|
|
||||||
cert = toString <secrets/syncthing.cert>;
|
|
||||||
key = toString <secrets/syncthing.key>;
|
|
||||||
peers = mk_peers all_peers;
|
|
||||||
folders."/home/lass/sync".peers = attrNames (filterAttrs (n: v: n != "phone") own_peers);
|
|
||||||
};
|
|
||||||
|
|
||||||
system.activationScripts.syncthing-home = ''
|
system.activationScripts.syncthing-home = ''
|
||||||
${pkgs.coreutils}/bin/chmod a+x /home/lass
|
${pkgs.coreutils}/bin/chmod a+x /home/lass
|
||||||
|
@ -270,14 +270,14 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
boot.kernel.sysctl."fs.inotify.max_user_watches" = "1048576";
|
boot.kernel.sysctl."fs.inotify.max_user_watches" = "1048576";
|
||||||
krebs.syncthing.folders = {
|
services.syncthing.declarative.folders = {
|
||||||
domsen-backups = {
|
domsen-backups = {
|
||||||
path = "/backups/domsen";
|
path = "/backups/domsen";
|
||||||
peers = [ "domsen-backup" ];
|
devices = [ "domsen-backup" ];
|
||||||
};
|
};
|
||||||
domsen-backup-srv-http = {
|
domsen-backup-srv-http = {
|
||||||
path = "/srv/http";
|
path = "/srv/http";
|
||||||
peers = [ "domsen-backup" ];
|
devices = [ "domsen-backup" ];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user