-
- { config, lib, pkgs, ... }:
-
- with lib;
-
- let
- sheepdog = pkgs.sheepdog;
- cfg = config.services.sheepdog;
- stateDir = "/var/lib/sheepdog";
- pidFile = "${stateDir}/run/sheep.pid";
- in
- {
- ###### interface
-
- options = {
- services.sheepdog = {
- enable = mkEnableOption "Sheepdog Daemon";
-
- config = mkOption {
- type = types.lines;
- default = "--cluster local --log dst=syslog --upgrade";
- description = ''
- Configuration directives that should be added to
- <literal>sheep commandline</literal>.
- '';
- };
-
- pidFile = mkOption {
- type = types.string;
- default = "${pidFile}";
- description = ''
- Where to write the pidfile
- '';
- };
-
- stateDir = mkOption {
- type = types.string;
- default = "${stateDir}";
- description = ''
- Where to store the cluster metadata and objects
- '';
- };
- };
- };
-
- ###### implementation
-
- config = mkIf config.services.sheepdog.enable {
- users.extraUsers = singleton {
- name = "sheepdog";
- uid = config.ids.uids.sheepdog;
- description = "Sheepdog daemon user";
- };
-
- users.extraGroups = singleton {
- name = "sheepdog";
- gid = config.ids.gids.sheepdog;
- };
-
- systemd.services.sheepdog = {
- description = "Sheepdog daemon";
- after = [ "network.target" "systemd-resolved.service" ];
- wants = [ "syslog.target" ];
- wantedBy = [ "multi-user.target" ];
- path = [ sheepdog ];
- preStart = ''
- if [ ! -d ${cfg.stateDir} ]; then
- mkdir -m 755 -p ${cfg.stateDir}
- chown -R sheepdog:sheepdog ${cfg.stateDir}
- fi
-
- pidFileDir=$(dirname ${cfg.pidFile})
- if [ ! -d ''${pidFileDir} ]; then
- mkdir -m 755 -p ''${pidFileDir}
- chown -R sheepdog:sheepdog ''${pidFileDir}
- fi
- '';
-
- serviceConfig = {
- Type = "forking";
- ExecStart = "${sheepdog}/bin/sheep --pidfile ${cfg.pidFile} ${cfg.config} ${cfg.stateDir}";
- PIDFile = "${stateDir}/run/sheep.pid";
- PermissionsStartOnly = true;
- User = "sheepdog";
- Group = "sheepdog";
- };
- };
- };
- }
-