2020-10-27 19:20:34 +01:00
|
|
|
{ pkgs, config, lib, ... }:
|
|
|
|
|
2020-10-27 20:00:09 +01:00
|
|
|
with import ./. { inherit pkgs; };
|
2020-10-27 19:20:34 +01:00
|
|
|
|
|
|
|
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;
|
2020-10-28 20:20:25 +01:00
|
|
|
default = "hourly";
|
2020-10-27 19:20:34 +01:00
|
|
|
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;
|
|
|
|
};
|
|
|
|
};
|
2020-10-28 09:09:53 +01:00
|
|
|
systemd.timers.ticker-update = {
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
partOf = [ "ticker-update.service" ];
|
|
|
|
timerConfig = {
|
|
|
|
OnCalendar = cfg.updateInterval;
|
|
|
|
};
|
|
|
|
};
|
2020-10-27 19:20:34 +01:00
|
|
|
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|