k: add syncthing module
This commit is contained in:
parent
9a58e882ac
commit
67d3a55df5
@ -48,6 +48,7 @@ let
|
|||||||
./rtorrent.nix
|
./rtorrent.nix
|
||||||
./secret.nix
|
./secret.nix
|
||||||
./setuid.nix
|
./setuid.nix
|
||||||
|
./syncthing.nix
|
||||||
./tinc.nix
|
./tinc.nix
|
||||||
./tinc_graphs.nix
|
./tinc_graphs.nix
|
||||||
./urlwatch.nix
|
./urlwatch.nix
|
||||||
|
129
krebs/3modules/syncthing.nix
Normal file
129
krebs/3modules/syncthing.nix
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
{ config, pkgs, ... }: with import <stockholm/lib>;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
cfg = config.krebs.syncthing;
|
||||||
|
|
||||||
|
devices = mapAttrsToList (name: peer: {
|
||||||
|
name = name;
|
||||||
|
deviceID = peer.id;
|
||||||
|
addresses = peer.addresses;
|
||||||
|
}) cfg.peers;
|
||||||
|
|
||||||
|
folders = map (folder: {
|
||||||
|
inherit (folder) path type;
|
||||||
|
id = folder.path;
|
||||||
|
devices = map (peer: { deviceId = cfg.peers.${peer}.id; }) folder.peers;
|
||||||
|
rescanIntervalS = folder.rescanInterval;
|
||||||
|
}) cfg.folders;
|
||||||
|
|
||||||
|
getApiKey = pkgs.writeDash "getAPIKey" ''
|
||||||
|
${pkgs.libxml2}/bin/xmllint \
|
||||||
|
--xpath 'string(configuration/gui/apikey)'\
|
||||||
|
${config.services.syncthing.dataDir}/config.xml
|
||||||
|
'';
|
||||||
|
|
||||||
|
updateConfig = pkgs.writeDash "merge-syncthing-config" ''
|
||||||
|
set -efu
|
||||||
|
API_KEY=$(${getApiKey})
|
||||||
|
CFG=$(${pkgs.curl}/bin/curl -Ss -H "X-API-Key: $API_KEY" localhost:8384/rest/system/config)
|
||||||
|
echo "$CFG" | ${pkgs.jq}/bin/jq -s '.[] * {
|
||||||
|
"devices": ${builtins.toJSON devices},
|
||||||
|
"folders": ${builtins.toJSON folders}
|
||||||
|
}' | ${pkgs.curl}/bin/curl -Ss -H "X-API-Key: $API_KEY" localhost:8384/rest/system/config -d @-
|
||||||
|
${pkgs.curl}/bin/curl -Ss -H "X-API-Key: $API_KEY" localhost:8384/rest/system/restart -X POST
|
||||||
|
'';
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
options.krebs.syncthing = {
|
||||||
|
|
||||||
|
enable = mkEnableOption "syncthing-init";
|
||||||
|
|
||||||
|
id = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = config.krebs.build.host.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
cert = mkOption {
|
||||||
|
type = types.nullOr types.absolute-pathname;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
key = mkOption {
|
||||||
|
type = types.nullOr types.absolute-pathname;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
folders = mkOption {
|
||||||
|
default = [];
|
||||||
|
type = types.listOf (types.submodule ({
|
||||||
|
options = {
|
||||||
|
|
||||||
|
path = mkOption {
|
||||||
|
type = types.absolute-pathname;
|
||||||
|
};
|
||||||
|
|
||||||
|
peers = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
rescanInterval = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = 60;
|
||||||
|
};
|
||||||
|
|
||||||
|
type = mkOption {
|
||||||
|
type = types.enum [ "sendreceive" "sendonly" "receiveonly" ];
|
||||||
|
default = "sendreceive";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = (mkIf cfg.enable) {
|
||||||
|
|
||||||
|
systemd.services.syncthing = mkIf (cfg.cert != null || cfg.key != null) {
|
||||||
|
preStart = ''
|
||||||
|
${optionalString (cfg.cert != null) "cp ${toString cfg.cert} ${config.services.syncthing.dataDir}/cert.pem"}
|
||||||
|
${optionalString (cfg.key != null) "cp ${toString cfg.key} ${config.services.syncthing.dataDir}/key.pem"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.syncthing-init = {
|
||||||
|
after = [ "syncthing.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
User = config.services.syncthing.user;
|
||||||
|
RemainAfterExit = true;
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = updateConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user