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