There was a race condition that lead to incorrect user permissions on the sounds directory. The solution to use the preStart script is better and fixes this issue as well.
255 lines
7.8 KiB
Nix
255 lines
7.8 KiB
Nix
{ config, lib, pkgs, ... }:
|
|
let
|
|
secretConfigFiles = [
|
|
"ari"
|
|
"pjsip"
|
|
"voicemail"
|
|
];
|
|
rtp = {
|
|
start = 10000;
|
|
end = 10200;
|
|
};
|
|
in
|
|
{
|
|
services.asterisk = {
|
|
enable = true;
|
|
confFiles = {
|
|
"extensions.conf" = ''
|
|
[doorbell]
|
|
exten = s,1,Set(__DYNAMIC_FEATURES=doorOpen)
|
|
same = n,Dial(PJSIP/10&PJSIP/11,${toString config.services.myintercom-doorbell.dialTime})
|
|
same = n,Hangup()
|
|
|
|
[door-open]
|
|
exten = s,1,Verbose(0, "opening the door")
|
|
same = n,System("${pkgs.myintercom-doorbell}/bin/myintercom-doorbell-open-door")
|
|
same = n,Hangup()
|
|
|
|
[sipgate-in]
|
|
exten = _499846876,1,Noop(Processing an incoming call)
|
|
same = n,Dial(PJSIP/10&PJSIP/11,25,tT)
|
|
same = n,VoiceMail(876@lechner,u)
|
|
same = n,Hangup()
|
|
|
|
exten => _4998469779781,1,Verbose(3,Incoming fax)
|
|
; folder where your incoming faxes will initially be stored
|
|
same => n,Set(FAXDEST=/tmp)
|
|
|
|
exten = _4998469779782,1,Noop(Test call)
|
|
same = n,Dial(PJSIP/10)
|
|
|
|
; put a timestamp on this call so the resulting file is unique
|
|
same => n,Set(tempfax=''${STRFTIME(,,%C%y%m%d%H%M)})
|
|
same => n,ReceiveFax(''${FAXDEST}/''${tempfax}.tif)
|
|
same => n,Verbose(3,- Fax receipt completed with status: ''${FAXSTATUS})
|
|
same => n,System(echo | s-nail -a ''${FAXDEST}/''${tempfax} -s "Asterisk Fax" mail@jalr.de)
|
|
|
|
exten = _499846977892,1,Noop(Processing an incoming call)
|
|
same = n,Dial(PJSIP/12,30,tT)
|
|
;same = n,VoiceMail(977892@pauline,u)
|
|
same = n,Hangup()
|
|
|
|
exten = _499846977891,1,Noop(Processing an incoming call)
|
|
same = n,Dial(PJSIP/13&PJSIP/16,30,tT)
|
|
same = n,VoiceMail(977891@jakob,u)
|
|
same = n,Hangup()
|
|
|
|
[dect]
|
|
exten = 100,1,Answer()
|
|
same = n,Wait(1)
|
|
same = n,Playback(hello-world)
|
|
same = n,Hangup()
|
|
|
|
;exten = 10,1,Dial(PJSIP/10,10)
|
|
;same = n,VoiceMail(876@lechner,u)
|
|
|
|
exten = _1X,1,Dial(PJSIP/''${EXTEN},30)
|
|
same = n,Hangup()
|
|
|
|
exten = 50,1,Dial(PJSIP/10&PJSIP/11,30,tT)
|
|
same = n,Hangup()
|
|
|
|
exten = 99,1,Answer()
|
|
same = n,VoiceMailMain(876@lechner)
|
|
|
|
exten = 98,1,Answer()
|
|
same = n,VoiceMailMain(977892@pauline)
|
|
|
|
exten = _ZX.,1,Noop(Ortsgespraech)
|
|
same = n,Dial(PJSIP/09846''${EXTEN}@sipgate,300)
|
|
same = n,Hangup()
|
|
|
|
exten = _0ZXXXXX.,1,Noop(Deutsches Festnetz)
|
|
same = n,Dial(PJSIP/''${EXTEN}@sipgate,300)
|
|
same = n,Hangup()
|
|
|
|
exten = _00XXXXX.,1,Noop(Internationales Gespraech)
|
|
same = n,Dial(PJSIP/''${EXTEN}@sipgate,300)
|
|
same = n,Hangup()
|
|
|
|
[voicemail-callback]
|
|
exten = s,1,HasNewVoicemail(876@lechner)
|
|
exten = s,2,Hangup
|
|
exten = s,102,Dial(PJSIP/10&PJSIP/11,15)
|
|
exten = s,n,VoiceMailMain(876@lechner)
|
|
exten = s,n,Hangup
|
|
|
|
|
|
[fax-tx]
|
|
exten => s,1,NoOp(**** SENDING FAX ****)
|
|
;exten => s,n,Set(FAXFILE=output.tif)
|
|
|
|
exten => s,n,NoOp(**** SETTING FAXOPT ****)
|
|
exten => s,n,Set(FAXOPT(ecm)=yes)
|
|
;exten => s,n,Set(FAXOPT(localstationid)=098469779780)
|
|
exten => s,n,Set(FAXOPT(maxrate)=14400)
|
|
exten => s,n,Set(FAXOPT(minrate)=2400)
|
|
exten => s,n,NoOp(**** SENDING FAX : ''${FAXFILE} ****)
|
|
exten => s,n,SendFAX(/var/lib/asterisk/fax-outgoing/''${FAXFILE},d)
|
|
|
|
;exten => send,n,Wait(6)
|
|
;exten => send,n,Set(GLOBAL(FAXCOUNT)=''$[ ''${GLOBAL(FAXCOUNT)} + 1 ])
|
|
;exten => send,n,Set(FAXCOUNT=''${GLOBAL(FAXCOUNT)})
|
|
;exten => send,n,Set(FAXFILE=dw-faxout.tif)
|
|
; Set FAXOPTs
|
|
;exten => send,n,NoOp(**** SETTING FAXOPT ****)
|
|
;exten => send,n,Set(FAXOPT(ecm)=yes)
|
|
;exten => send,n,Set(FAXOPT(headerinfo)=Fax from ''${GLOBAL(LASTFAXCALLERNAME)} at ''${GLOBAL(LASTFAXCALLERNUM)} was received.)
|
|
;exten => send,n,Set(FAXOPT(maxrate)=14400)
|
|
; Send the fax
|
|
exten => send,n,SendFAX(/home/jalr/fax.tif,d)
|
|
'';
|
|
"features.conf" = ''
|
|
[applicationmap]
|
|
doorOpen => #9,peer,Gosub,"door-open,s,1"
|
|
'';
|
|
"http.conf" = ''
|
|
[general]
|
|
enabled=yes
|
|
bindaddr=127.0.0.1
|
|
|
|
; Port to bind to for HTTP sessions (default is 8088)
|
|
;bindport=8088
|
|
|
|
tlsdisablev1=yes
|
|
tlsdisablev11=yes
|
|
tlsdisablev12=yes
|
|
|
|
tlsservercipherorder=yes
|
|
'';
|
|
"rtp.conf" = ''
|
|
[general]
|
|
rtpstart=${toString rtp.start}
|
|
rtpend=${toString rtp.end}
|
|
'';
|
|
"dnsmgr.conf" = ''
|
|
[general]
|
|
enable=yes
|
|
refreshinterval=300
|
|
'';
|
|
};
|
|
useTheseDefaultConfFiles = [ ];
|
|
};
|
|
|
|
sops.secrets = (lib.listToAttrs (map
|
|
(name: lib.nameValuePair "asterisk-${name}" {
|
|
sopsFile = ../secrets.yaml;
|
|
owner = config.users.users.asterisk.name;
|
|
})
|
|
secretConfigFiles));
|
|
environment.etc = lib.mapAttrs'
|
|
(name: _: lib.nameValuePair
|
|
"asterisk/${name}.conf"
|
|
{ source = config.sops.secrets."asterisk-${name}".path; })
|
|
(lib.listToAttrs (map (name: lib.nameValuePair name { }) secretConfigFiles));
|
|
|
|
networking.firewall = {
|
|
allowedUDPPortRanges = [
|
|
{
|
|
from = rtp.start;
|
|
to = rtp.end;
|
|
}
|
|
];
|
|
};
|
|
|
|
systemd.services."asterisk-reload-endpoint@" = {
|
|
description = "Check if asterisk endpoint is identified and reload it when it is not.";
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
};
|
|
environment = {
|
|
ENDPOINT = "%I";
|
|
};
|
|
script = ''
|
|
export PATH=${pkgs.lib.makeBinPath [pkgs.asterisk pkgs.gnused pkgs.gnugrep]}
|
|
if ! asterisk -r -x "pjsip show endpoint $ENDPOINT" | sed -n '/^===/,/^\s*ParameterName/{//!p}' | grep -q 'Identify:'; then
|
|
asterisk -r -x "module reload res_pjsip_endpoint_identifier_ip.so"
|
|
fi
|
|
'';
|
|
};
|
|
|
|
systemd.timers.asterisk-reload-endpoint = {
|
|
description = "Check if asterisk endpoint is identified and reload it when it is not.";
|
|
after = [ "asterisk.service" ];
|
|
wantedBy = [ "timers.target" ];
|
|
timerConfig = {
|
|
Persistent = true;
|
|
OnCalendar = "*-*-* *:*:00";
|
|
Unit = "asterisk-reload-endpoint@sipgate.service";
|
|
};
|
|
};
|
|
|
|
systemd.services."asterisk-voicemail-call@" = {
|
|
description = "Check if voicemail exists and place a call to the voicemail application.";
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
};
|
|
scriptArgs = "%I";
|
|
script = ''
|
|
export PATH=${pkgs.lib.makeBinPath [pkgs.asterisk pkgs.coreutils pkgs.findutils]}
|
|
number="$(echo "$1" | cut -d ':' -f 1)"
|
|
user="$(echo "$1" | cut -d ':' -f 2)"
|
|
channel="PJSIP/$(echo "$1" | cut -d ':' -f 3)"
|
|
|
|
if ! find "/var/spool/asterisk/voicemail/$user/$number/INBOX/" -mindepth 1 -maxdepth 1 | read; then
|
|
exit
|
|
fi
|
|
|
|
callfile="$(mktemp -p /tmp XXXXXXXXXX.call)"
|
|
chmod 644 "$callfile"
|
|
|
|
cat > "$callfile" << EOF
|
|
Channel: $channel
|
|
WaitTime: 15
|
|
Application: VoiceMailMain
|
|
Data: $number@$user
|
|
CallerID: Voicemail
|
|
EOF
|
|
|
|
mv "$callfile" /var/spool/asterisk/outgoing/
|
|
'';
|
|
};
|
|
|
|
systemd.timers.asterisk-voicemail-call-10 = {
|
|
description = "Check if voicemail exists and place a call to the voicemail application.";
|
|
after = [ "asterisk.service" ];
|
|
wantedBy = [ "timers.target" ];
|
|
timerConfig = {
|
|
Persistent = true;
|
|
OnCalendar = "*-*-* 07..22:00,20,40:00";
|
|
Unit = "asterisk-voicemail-call@876:lechner:10.service";
|
|
};
|
|
};
|
|
systemd.timers.asterisk-voicemail-call-11 = {
|
|
description = "Check if voicemail exists and place a call to the voicemail application.";
|
|
after = [ "asterisk.service" ];
|
|
wantedBy = [ "timers.target" ];
|
|
timerConfig = {
|
|
Persistent = true;
|
|
OnCalendar = "*-*-* 07..22:00,10,30:50";
|
|
Unit = "asterisk-voicemail-call@876:lechner:11.service";
|
|
};
|
|
};
|
|
|
|
#voicemailCallScript
|
|
}
|