{ config, pkgs, ... }: with pkgs.lib; let cfg = config.services.supybot; in { ###### interface options = { services.supybot = { enable = mkOption { default = false; description = "Enable Supybot, an IRC bot"; }; stateDir = mkOption { default = "/var/lib/supybot"; description = " "; }; configFile = mkOption { type = types.path; default = /dev/null; description = '' Verbatim contents of the supybot config, this can be generated by supybot-wizard ''; }; user = mkOption { default = "supybot"; description = "User account under which supybot runs."; }; group = mkOption { default = "supybot"; description = "Group account under which supybot runs."; }; }; }; ###### implementation config = mkIf cfg.enable { environment.systemPackages = [ pkgs.pythonPackages.limnoria ]; users.extraUsers = singleton { name = cfg.user; uid = config.ids.uids.supybot; group = "supybot"; description = "Supybot IRC bot user"; home = cfg.stateDir; createHome = true; }; users.extraGroups.supybot = {}; systemd.services.supybot = { description = "Supybot IRC bot"; after = [ "network.target" ]; wantedBy = [ "multi-user.target" ]; path = [ pkgs.pythonPackages.limnoria ]; preStart = '' mkdir -m 0755 -p ${cfg.stateDir} chown ${cfg.user}:${cfg.group} ${cfg.stateDir} cd ${cfg.stateDir} mkdir -p logs/plugins backup conf data plugins tmp ln -sf ${cfg.configFile} supybot.cfg rm -f supybot.cfg.bak ''; serviceConfig = { ExecStart = "${pkgs.pythonPackages.limnoria}/bin/supybot ${cfg.stateDir}/supybot.cfg"; PIDFile = "/run/supybot.pid"; User = "${cfg.user}"; Group = "${cfg.group}"; UMask = "0007"; Restart = "on-abort"; StartLimitInterval = "5m"; StartLimitBurst = "1"; }; }; }; }