1{ config, lib, pkgs, ... }:
2
3let
4 inherit (lib) mkEnableOption mkIf mkOption singleton types;
5 inherit (pkgs) coreutils charybdis;
6 cfg = config.services.charybdis;
7
8 configFile = pkgs.writeText "charybdis.conf" ''
9 ${cfg.config}
10 '';
11in
12
13{
14
15 ###### interface
16
17 options = {
18
19 services.charybdis = {
20
21 enable = mkEnableOption (lib.mdDoc "Charybdis IRC daemon");
22
23 config = mkOption {
24 type = types.str;
25 description = lib.mdDoc ''
26 Charybdis IRC daemon configuration file.
27 '';
28 };
29
30 statedir = mkOption {
31 type = types.path;
32 default = "/var/lib/charybdis";
33 description = lib.mdDoc ''
34 Location of the state directory of charybdis.
35 '';
36 };
37
38 user = mkOption {
39 type = types.str;
40 default = "ircd";
41 description = lib.mdDoc ''
42 Charybdis IRC daemon user.
43 '';
44 };
45
46 group = mkOption {
47 type = types.str;
48 default = "ircd";
49 description = lib.mdDoc ''
50 Charybdis IRC daemon group.
51 '';
52 };
53
54 motd = mkOption {
55 type = types.nullOr types.lines;
56 default = null;
57 description = lib.mdDoc ''
58 Charybdis MOTD text.
59
60 Charybdis will read its MOTD from /etc/charybdis/ircd.motd .
61 If set, the value of this option will be written to this path.
62 '';
63 };
64
65 };
66
67 };
68
69
70 ###### implementation
71
72 config = mkIf cfg.enable (lib.mkMerge [
73 {
74 users.users.${cfg.user} = {
75 description = "Charybdis IRC daemon user";
76 uid = config.ids.uids.ircd;
77 group = cfg.group;
78 };
79
80 users.groups.${cfg.group} = {
81 gid = config.ids.gids.ircd;
82 };
83
84 systemd.tmpfiles.rules = [
85 "d ${cfg.statedir} - ${cfg.user} ${cfg.group} - -"
86 ];
87
88 environment.etc."charybdis/ircd.conf".source = configFile;
89
90 systemd.services.charybdis = {
91 description = "Charybdis IRC daemon";
92 wantedBy = [ "multi-user.target" ];
93 reloadIfChanged = true;
94 restartTriggers = [
95 configFile
96 ];
97 environment = {
98 BANDB_DBPATH = "${cfg.statedir}/ban.db";
99 };
100 serviceConfig = {
101 ExecStart = "${charybdis}/bin/charybdis -foreground -logfile /dev/stdout -configfile /etc/charybdis/ircd.conf";
102 ExecReload = "${coreutils}/bin/kill -HUP $MAINPID";
103 Group = cfg.group;
104 User = cfg.user;
105 };
106 };
107
108 }
109
110 (mkIf (cfg.motd != null) {
111 environment.etc."charybdis/ircd.motd".text = cfg.motd;
112 })
113 ]);
114}