{ pkgs, config, lib, ... }: with import ./. { inherit pkgs; }; let inherit (pkgs.lib) mkOption types; cfg = config.services.ticker; defaultTickerConfig = { db_url = "postgres:///ticker"; calendars = {}; weekdays = [ "Montag" "Dienstag" "Mittwoch" "Donnerstag" "Freitag" "Sonnabend" "Sonntag" ]; months = [ "Januar" "Februar" "März" "April" "Mai" "Juni" "Juli" "August" "September" "Oktober" "November" "Dezember" ]; }; tickerConfig = defaultTickerConfig // cfg.config; configFile = pkgs.writeText "config.yaml" (lib.generators.toYAML {} tickerConfig); workDir = pkgs.runCommandLocal "ticker-env" {} '' mkdir $out ln -s ${ticker-serve}/shared/ticker-serve/static $out/ ln -s ${configFile} $out/config.yaml ''; in { options.services.ticker = { stateDir = mkOption { type = types.str; default = "/var/lib/ticker"; description = '' Directory where ticker files will be placed by default. ''; }; user = mkOption { type = types.str; default = "ticker"; description = "User account under which ticker runs."; }; group = mkOption { type = types.str; default = "ticker"; description = "Group account under which ticker runs."; }; config = mkOption { type = types.attrs; default = defaultTickerConfig; }; updateInterval = mkOption { type = types.str; default = "hourly"; description = "Timer interval"; }; }; config = { users.users.${cfg.user} = { inherit (cfg) group; }; users.groups.${cfg.group} = {}; services.postgresql = { enable = true; }; systemd.services.ticker-setup = { wantedBy = [ "multi-user.target" ]; after = [ "postgresql.service" ]; preStart = let pgsu = config.services.postgresql.superUser; psql = config.services.postgresql.package; in '' mkdir -p ${cfg.stateDir} chown ${cfg.user}:${cfg.group} -R ${cfg.stateDir} if ! test -e "${cfg.stateDir}/db-created"; then ${pkgs.sudo}/bin/sudo -u ${pgsu} ${psql}/bin/createuser --no-superuser --no-createdb --no-createrole ${cfg.user} ${pkgs.sudo}/bin/sudo -u ${pgsu} ${psql}/bin/createdb --owner ${cfg.user} ticker ${pkgs.sudo}/bin/sudo -u ${cfg.user} ${psql}/bin/psql -f ${ticker-serve}/shared/libticker/schema.sql ticker touch "${cfg.stateDir}/db-created" fi ''; serviceConfig = { Type = "oneshot"; ExecStart = "${pkgs.coreutils}/bin/test -f ${cfg.stateDir}/db-created"; }; }; systemd.services.ticker-update = { wantedBy = [ "multi-user.target" ]; after = [ "postgresql.service" "ticker-setup.service" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${ticker-update}/bin/ticker-update"; WorkingDirectory = "${workDir}"; User = cfg.user; Group = cfg.group; }; }; systemd.timers.ticker-update = { wantedBy = [ "multi-user.target" ]; partOf = [ "ticker-update.service" ]; timerConfig = { OnCalendar = cfg.updateInterval; }; }; systemd.services.ticker-serve = { wantedBy = [ "multi-user.target" ]; after = [ "postgresql.service" "ticker-setup.service" ]; serviceConfig = { Type = "simple"; ExecStart = "${ticker-serve}/bin/ticker-serve"; WorkingDirectory = "${workDir}"; User = cfg.user; Group = cfg.group; }; }; }; }