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 "Charybdis IRC daemon";
22
23 config = mkOption {
24 type = types.string;
25 description = ''
26 Charybdis IRC daemon configuration file.
27 '';
28 };
29
30 statedir = mkOption {
31 type = types.string;
32 default = "/var/lib/charybdis";
33 description = ''
34 Location of the state directory of charybdis.
35 '';
36 };
37
38 user = mkOption {
39 type = types.string;
40 default = "ircd";
41 description = ''
42 Charybdis IRC daemon user.
43 '';
44 };
45
46 group = mkOption {
47 type = types.string;
48 default = "ircd";
49 description = ''
50 Charybdis IRC daemon group.
51 '';
52 };
53
54 };
55
56 };
57
58
59 ###### implementation
60
61 config = mkIf cfg.enable {
62
63 users.extraUsers = singleton {
64 name = cfg.user;
65 description = "Charybdis IRC daemon user";
66 uid = config.ids.uids.ircd;
67 group = cfg.group;
68 };
69
70 users.extraGroups = singleton {
71 name = cfg.group;
72 gid = config.ids.gids.ircd;
73 };
74
75 systemd.services.charybdis = {
76 description = "Charybdis IRC daemon";
77 wantedBy = [ "multi-user.target" ];
78 environment = {
79 BANDB_DBPATH = "${cfg.statedir}/ban.db";
80 };
81 serviceConfig = {
82 ExecStart = "${charybdis}/bin/charybdis-ircd -foreground -logfile /dev/stdout -configfile ${configFile}";
83 Group = cfg.group;
84 User = cfg.user;
85 PermissionsStartOnly = true; # preStart needs to run with root permissions
86 };
87 preStart = ''
88 ${coreutils}/bin/mkdir -p ${cfg.statedir}
89 ${coreutils}/bin/chown ${cfg.user}:${cfg.group} ${cfg.statedir}
90 '';
91
92 };
93
94 };
95
96}