calendar-bot/module.nix

76 lines
2.2 KiB
Nix

{ config, lib, pkgs, ... }:
let
cfg = config.services.pvv-calendar-bot;
inherit (lib) mkDefault mkEnableOption mkPackageOption mkIf mkOption types mdDoc;
in {
options.services.pvv-calendar-bot = {
enable = mkEnableOption (lib.mdDoc "Enable pvv-calendar-bot to post to matrix");
package = mkPackageOption pkgs "pvv-calendar-bot" {};
settings = {
onCalendar = mkOption {
type = types.str;
default = "9 0 * * *";
description = mdDoc "OnCalendar string for the systemd service(e.g. crontab format)";
};
matrix = {
user = mkOption {
type = types.str;
description = mdDoc "Matrix username to authenticate with";
example = "@bot_calendar:pvv.ntnu.no";
};
channel = mkOption {
type = types.str;
description = mdDoc "Room ID of the channel to post announcements in";
example = "!abcdef:matrix.org";
};
homeserver = mkOption {
type = types.str;
description = mdDoc "Matrix homeserver URL to connect to";
example = "https://matrix.org";
};
};
secretsFile = mkOption {
type = types.path;
description = mdDoc "Path to secrets file that defines MATRIX_ACCESS_TOKEN";
};
};
};
config = mkIf cfg.enable {
systemd.timers."pvv-calendar-bot" = {
wantedBy = [ "timers.target" ];
timerConfig = {
OnCalendar = cfg.settings.onCalendar;
Unit = "pvv-calendar-bot";
};
};
systemd.services."pvv-calendar-bot" = {
preStart = let
envFile = pkgs.writeText "pvv-calendar-bot-env" ''
MATRIX_URL=${cfg.settings.matrix.homeserver}
MATRIX_USER=${cfg.settings.matrix.user}
ANNOUNCEMENT_CHANNEL=${cfg.settings.matrix.channel}
MATRIX_TOKEN=@MATRIX_ACCESS_TOKEN@
'';
in ''
${pkgs.replace-secret}/bin/replace-secret '@MATRIX_ACCESS_TOKEN@' ${cfg.settings.secretsFile} /run/pvv-calendar-bot/env
'';
serviceConfig = {
ExecStart = "${cfg.package}/bin/pvv-calendar-bot";
RuntimeDirectory = "pvv-calendar-bot";
DynamicUser = true;
EnvironmentFile = [ "-/run/pvv-calendar-bot/env" ];
};
};
};
}