@@ -6,29 +6,38 @@ let
66 cfg = config.services.asterisk;
77
88 asteriskUser = "asterisk";
9+ asteriskGroup = "asterisk";
910
1011 varlibdir = "/var/lib/asterisk";
1112 spooldir = "/var/spool/asterisk";
1213 logdir = "/var/log/asterisk";
1314
15+ # Add filecontents from files of useTheseDefaultConfFiles to confFiles, do not override
16+ defaultConfFiles = subtractLists (attrNames cfg.confFiles) cfg.useTheseDefaultConfFiles;
17+ allConfFiles =
18+ cfg.confFiles //
19+ builtins.listToAttrs (map (x: { name = x;
20+ value = builtins.readFile (pkgs.asterisk + "/etc/asterisk/" + x); })
21+ defaultConfFiles);
22+
1423 asteriskEtc = pkgs.stdenv.mkDerivation
1524 ((mapAttrs' (name: value: nameValuePair
1625 # Fudge the names to make bash happy
1726 ((replaceChars ["."] ["_"] name) + "_")
1827 (value)
19− ) cfg.confFiles) //
28+ ) allConfFiles) //
2029 {
2130 confFilesString = concatStringsSep " " (
22− attrNames cfg.confFiles
31+ attrNames allConfFiles
2332 );
2433
25− name = "asterisk.etc";
34+ name = "asterisk-etc";
2635
2736 # Default asterisk.conf file
2837 # (Notice that astetcdir will be set to the path of this derivation)
2938 asteriskConf = ''
3039 [directories]
31− astetcdir => @out@
40+ astetcdir => /etc/asterisk
3241 astmoddir => ${pkgs.asterisk}/lib/asterisk/modules
3342 astvarlibdir => /var/lib/asterisk
3443 astdbdir => /var/lib/asterisk
@@ -169,6 +178,16 @@ in
169178 '';
170179 };
171180
181+ useTheseDefaultConfFiles = mkOption {
182+ default = [ "ari.conf" "acl.conf" "agents.conf" "amd.conf" "calendar.conf" "cdr.conf" "cdr_syslog.conf" "cdr_custom.conf" "cel.conf" "cel_custom.conf" "cli_aliases.conf" "confbridge.conf" "dundi.conf" "features.conf" "hep.conf" "iax.conf" "pjsip.conf" "pjsip_wizard.conf" "phone.conf" "phoneprov.conf" "queues.conf" "res_config_sqlite3.conf" "res_parking.conf" "statsd.conf" "udptl.conf" "unistim.conf" ];
183+ type = types.listOf types.str;
184+ example = [ "sip.conf" "dundi.conf" ];
185+ description = ''Sets these config files to the default content. The default value for
186+ this option contains all necesscary files to avoid errors at startup.
187+ This does not override settings via <option>services.asterisk.confFiles</option>.
188+ '';
189+ };
190+
172191 extraArguments = mkOption {
173192 default = [];
174193 type = types.listOf types.str;
@@ -182,12 +201,22 @@ in
182201 };
183202
184203 config = mkIf cfg.enable {
185− users.extraUsers = singleton
186− { name = asteriskUser;
187− uid = config.ids.uids.asterisk;
188− description = "Asterisk daemon user";
189− home = varlibdir;
190− };
204+ environment.systemPackages = [ pkgs.asterisk ];
205+
206+ environment.etc.asterisk.source = asteriskEtc;
207+
208+ users.extraUsers.asterisk =
209+ { name = asteriskUser;
210+ group = asteriskGroup;
211+ uid = config.ids.uids.asterisk;
212+ description = "Asterisk daemon user";
213+ home = varlibdir;
214+ };
215+
216+ users.extraGroups.asterisk =
217+ { name = asteriskGroup;
218+ gid = config.ids.gids.asterisk;
219+ };
191220
192221 systemd.services.asterisk = {
193222 description = ''
@@ -196,14 +225,17 @@ in
196225
197226 wantedBy = [ "multi-user.target" ];
198227
228+ # Do not restart, to avoid disruption of running calls. Restart unit by yourself!
229+ restartIfChanged = false;
230+
199231 preStart = ''
200232 # Copy skeleton directory tree to /var
201233 for d in '${varlibdir}' '${spooldir}' '${logdir}'; do
202234 # TODO: Make exceptions for /var directories that likely should be updated
203235 if [ ! -e "$d" ]; then
204236 mkdir -p "$d"
205− cp --recursive ${pkgs.asterisk}/"$d" "$d"
206− chown --recursive ${asteriskUser} "$d"
237+ cp --recursive ${pkgs.asterisk}/"$d"/* "$d"/
238+ chown --recursive ${asteriskUser}:${asteriskGroup} "$d"
207239 find "$d" -type d | xargs chmod 0755
208240 fi
209241 done
@@ -215,7 +247,9 @@ in
215247 # FIXME: This doesn't account for arguments with spaces
216248 argString = concatStringsSep " " cfg.extraArguments;
217249 in
218− "${pkgs.asterisk}/bin/asterisk -U ${asteriskUser} -C ${asteriskEtc}/asterisk.conf ${argString} -F";
250+ "${pkgs.asterisk}/bin/asterisk -U ${asteriskUser} -C /etc/asterisk/asterisk.conf ${argString} -F";
251+ ExecReload = ''${pkgs.asterisk}/bin/asterisk -x "core reload"
252+ '';
219253 Type = "forking";
220254 PIDFile = "/var/run/asterisk/asterisk.pid";
221255 };