1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 quassel = pkgs.quasselDaemon_qt5;
7 cfg = config.services.quassel;
8 user = if cfg.user != null then cfg.user else "quassel";
9in
10
11{
12
13 ###### interface
14
15 options = {
16
17 services.quassel = {
18
19 enable = mkOption {
20 default = false;
21 description = ''
22 Whether to run the Quassel IRC client daemon.
23 '';
24 };
25
26 interfaces = mkOption {
27 default = [ "127.0.0.1" ];
28 description = ''
29 The interfaces the Quassel daemon will be listening to. If `[ 127.0.0.1 ]',
30 only clients on the local host can connect to it; if `[ 0.0.0.0 ]', clients
31 can access it from any network interface.
32 '';
33 };
34
35 portNumber = mkOption {
36 default = 4242;
37 description = ''
38 The port number the Quassel daemon will be listening to.
39 '';
40 };
41
42 dataDir = mkOption {
43 default = ''/home/${user}/.config/quassel-irc.org'';
44 description = ''
45 The directory holding configuration files, the SQlite database and the SSL Cert.
46 '';
47 };
48
49 user = mkOption {
50 default = null;
51 description = ''
52 The existing user the Quassel daemon should run as. If left empty, a default "quassel" user will be created.
53 '';
54 };
55
56 };
57
58 };
59
60
61 ###### implementation
62
63 config = mkIf cfg.enable {
64
65 users.extraUsers = mkIf (cfg.user == null) [
66 { name = "quassel";
67 description = "Quassel IRC client daemon";
68 group = "quassel";
69 uid = config.ids.uids.quassel;
70 }];
71
72 users.extraGroups = mkIf (cfg.user == null) [
73 { name = "quassel";
74 gid = config.ids.gids.quassel;
75 }];
76
77 systemd.services.quassel =
78 { description = "Quassel IRC client daemon";
79
80 wantedBy = [ "multi-user.target" ];
81 after = [ "network.target" ] ++ optional config.services.postgresql.enable "postgresql.service"
82 ++ optional config.services.mysql.enable "mysql.service";
83
84 preStart = ''
85 mkdir -p ${cfg.dataDir}
86 chown ${user} ${cfg.dataDir}
87 '';
88
89 serviceConfig =
90 {
91 ExecStart = "${quassel}/bin/quasselcore --listen=${concatStringsSep '','' cfg.interfaces} --port=${toString cfg.portNumber} --configdir=${cfg.dataDir}";
92 User = user;
93 PermissionsStartOnly = true;
94 };
95 };
96
97 };
98
99}