{ config, lib, pkgs, ... }: with lib; let cfg = config.services.stanchion; in { ###### interface options = { services.stanchion = { enable = mkEnableOption "stanchion"; package = mkOption { type = types.package; default = pkgs.stanchion; defaultText = "pkgs.stanchion"; example = literalExample "pkgs.stanchion"; description = '' Stanchion package to use. ''; }; nodeName = mkOption { type = types.str; default = "stanchion@127.0.0.1"; description = '' Name of the Erlang node. ''; }; adminKey = mkOption { type = types.str; default = ""; description = '' Name of admin user. ''; }; adminSecret = mkOption { type = types.str; default = ""; description = '' Name of admin secret ''; }; riakHost = mkOption { type = types.str; default = "127.0.0.1:8087"; description = '' Name of riak hosting service. ''; }; listener = mkOption { type = types.str; default = "127.0.0.1:8085"; description = '' Name of Riak CS listening service. ''; }; stanchionHost = mkOption { type = types.str; default = "127.0.0.1:8085"; description = '' Name of stanchion hosting service. ''; }; distributedCookie = mkOption { type = types.str; default = "riak"; description = '' Cookie for distributed node communication. All nodes in the same cluster should use the same cookie or they will not be able to communicate. ''; }; dataDir = mkOption { type = types.path; default = "/var/db/stanchion"; description = '' Data directory for Stanchion. ''; }; logDir = mkOption { type = types.path; default = "/var/log/stanchion"; description = '' Log directory for Stanchion. ''; }; extraConfig = mkOption { type = types.lines; default = ""; description = '' Additional text to be appended to stanchion.conf. ''; }; }; }; ###### implementation config = mkIf cfg.enable { environment.systemPackages = [ cfg.package ]; environment.etc."stanchion/advanced.config".text = '' [{stanchion, []}]. ''; environment.etc."stanchion/stanchion.conf".text = '' listener = ${cfg.listener} riak_host = ${cfg.riakHost} ${optionalString (cfg.adminKey == "") "#"} admin.key=${optionalString (cfg.adminKey != "") cfg.adminKey} ${optionalString (cfg.adminSecret == "") "#"} admin.secret=${optionalString (cfg.adminSecret != "") cfg.adminSecret} platform_bin_dir = ${pkgs.stanchion}/bin platform_data_dir = ${cfg.dataDir} platform_etc_dir = /etc/stanchion platform_lib_dir = ${pkgs.stanchion}/lib platform_log_dir = ${cfg.logDir} nodename = ${cfg.nodeName} distributed_cookie = ${cfg.distributedCookie} ${cfg.extraConfig} ''; users.users.stanchion = { name = "stanchion"; uid = config.ids.uids.stanchion; group = "stanchion"; description = "Stanchion server user"; }; users.groups.stanchion.gid = config.ids.gids.stanchion; systemd.tmpfiles.rules = [ "d '${cfg.logDir}' - stanchion stanchion --" "d '${cfg.dataDir}' 0700 stanchion stanchion --" ]; systemd.services.stanchion = { description = "Stanchion Server"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; path = [ pkgs.utillinux # for `logger` pkgs.bash ]; environment.HOME = "${cfg.dataDir}"; environment.STANCHION_DATA_DIR = "${cfg.dataDir}"; environment.STANCHION_LOG_DIR = "${cfg.logDir}"; environment.STANCHION_ETC_DIR = "/etc/stanchion"; serviceConfig = { ExecStart = "${cfg.package}/bin/stanchion console"; ExecStop = "${cfg.package}/bin/stanchion stop"; StandardInput = "tty"; User = "stanchion"; Group = "stanchion"; # Give Stanchion a decent amount of time to clean up. TimeoutStopSec = 120; LimitNOFILE = 65536; }; unitConfig.RequiresMountsFor = [ "${cfg.dataDir}" "${cfg.logDir}" "/etc/stanchion" ]; }; }; }