Telefoon2.0: Difference between revisions

From RevSpace
Jump to navigation Jump to search
No edit summary
No edit summary
Line 31: Line 31:


== Configuratie ==
== Configuratie ==
=== shell-bullseye ===
==== ssh-tunnel ====
De Asterisk-bak kan niet in het Revspace-net draaien omdat CheapConnect geen IPv6 doet, dus is er voor een hetzner bak gekozen dus moet er een tunnel draaien.
===== /home/flimpie/.local/share/systemd/user/tunnel.service =====
<pre>[Unit]
Description=Tunnel revspace MQTT to revphone.flimpie.net
After=network.target
[Service]
ExecStart=/usr/bin/ssh -vvvv -p 20422 -i /home/flimpie/.ssh/id_rsa -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R 127.0.0.1:41883:mosquitto.space.revspace.nl:1883 portforward@revphone.flimpie.net
# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=5
Restart=always
[Install]
WantedBy=default.target</pre>


=== revphone.flimpie.net ===
=== revphone.flimpie.net ===


==== extensions.conf ====
==== asterisk ====
 
===== extensions.conf =====
<pre>[inbound]
<pre>[inbound]
; the generic inbound call context. if specific treatment (like CID translation) is needed per trunk, create a separate context and let it call 'inbound' using Gosub
; the generic inbound call context. if specific treatment (like CID translation) is needed per trunk, create a separate context and let it call 'inbound' using Gosub
Line 112: Line 136:
same = n,Hangup()</pre>
same = n,Hangup()</pre>


==== pjsip.conf ====
===== pjsip.conf =====
<pre>[transport-udp-internet-v4]
<pre>[transport-udp-internet-v4]
type=transport
type=transport
Line 224: Line 248:
qualify_frequency = 30</pre>
qualify_frequency = 30</pre>


==== /var/lib/asterisk/agi-bin/revspace-state.sh ====
===== /var/lib/asterisk/agi-bin/revspace-state.sh =====
<pre>#!/bin/bash
<pre>#!/bin/bash


Line 240: Line 264:
# something went wrong when getting the spacestate, assume it is open (fail-safe)
# something went wrong when getting the spacestate, assume it is open (fail-safe)
echo 'SET VARIABLE open "1"'</pre>
echo 'SET VARIABLE open "1"'</pre>
===== test =====

Revision as of 20:31, 27 January 2024

Project Telefoon2.0
Telefoon.jpg
+31 70 569 0105 / EPVPN REV0 (7380)
Status In progress
Contact flimpie / eloy
Last Update 2024-01-27

Om voor in de toekomst(tm) gepruts met analoge telefoons mogelijk te maken is er een Asterisk bak ingericht, met daar aan een 070-nummer, een EPVPN-nummer en en een SIP2SIM (die zit in slot 2 van de spacetelefoon op de bar)

Gebruik

Om van buiten naar de space (via de asterisk-bak) te bellen: bel REV0 via EPVPN, of +31 70 569 0105.

Om vanaf de space naar EPVPN te bellen: bel 01999 + nummer via de spacetelefoon, en kies sim-kaart 2 (Vodafone NL)

Dialplan (op volgorde)

  • `01999.`: naar EPVPN
  • `+491999.`: naar EPVPN
  • `+31[1-8].`: naar CheapConnect (om 0900 uit te filteren)
  • `0[1-8].`: naar CheapConnect (om 0900 uit te filteren)
  • terugvallen naar een 'dit mag je niet bellen' recording

Bijbehorende infra

revphone.flimpie.net

Debian 12 bak, draait Asterisk. eloy en flimpie hebben toegang. ssh'en naar poort 20422


Configuratie

shell-bullseye

ssh-tunnel

De Asterisk-bak kan niet in het Revspace-net draaien omdat CheapConnect geen IPv6 doet, dus is er voor een hetzner bak gekozen dus moet er een tunnel draaien.

/home/flimpie/.local/share/systemd/user/tunnel.service
[Unit]
Description=Tunnel revspace MQTT to revphone.flimpie.net
After=network.target

[Service]
ExecStart=/usr/bin/ssh -vvvv -p 20422 -i /home/flimpie/.ssh/id_rsa -NT -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes -R 127.0.0.1:41883:mosquitto.space.revspace.nl:1883 portforward@revphone.flimpie.net

# Restart every >2 seconds to avoid StartLimitInterval failure
RestartSec=5
Restart=always

[Install]
WantedBy=default.target

revphone.flimpie.net

asterisk

extensions.conf
[inbound]
; the generic inbound call context. if specific treatment (like CID translation) is needed per trunk, create a separate context and let it call 'inbound' using Gosub
exten => s,1,NoOp()
exten => s,n,Log(NOTICE, Incoming call from ${CALLERID(all)}, cid num ${CALLERID(num)}, cdr ${CDR}, all cid ${CALLERID(all)}, dnid ${CALLERID(dnid)}, exten ${EXTEN}, to ${PJSIP_HEADER(read,To)})
exten => s,n,Answer()
exten => s,n,AGI(revspace-state.sh)
exten => s,n,Verbose(result is: ${open})
exten => s,n,GotoIf($["${open}" = "0"]?closed) ; jump to "sorry, nobody is available to take your call" if the space is closed
exten => s,n,Ringing()
exten => s,n,Dial(PJSIP/sip2sim,30)
exten => s,n,Hangup()
exten => s,n(closed),Playback(sorry)
exten => s,n,Playback(nbdy-avail-to-take-call)
exten => s,n,Hangup()

[inbound_epvpn]
; rewrite the CID, prefix it with 00491999 if it is from inside EPVPN, if it's from the EPVPN DID rewrite it to a proper public phone number
rewrite CID before handling as normal inbound call
exten => 7380,1,Set(OLDCID=${CALLERID(all)})
; if the caller number starts with 0000, it's from the DID, rerite the number
; if it doesnt start with 0000, it's internal to EPVPN so only rewrite the number and keep the name (may be set by caller and is used by some phones)
same = n,ExecIf($["${CALLERID(NUM):0:4}" != "0000"]?set(CALLERID(num)=00491999${CALLERID(num:1)}))
same = n,ExecIf($["${CALLERID(NUM):0:4}"  = "0000"]?set(CALLERID(all)=<00${CALLERID(num):4}>))
same = n,Log(NOTICE, Rewrote CID for EPVPN call from ${OLDCID} to <${CALLERID(all)}>)
same = n,Gosub(inbound,s,1)
same = n,Hangup()

[inbound_pstn]
; rewrite CID before handling as normal inbound call
exten => s,1,Set(OLDCID=${CALLERID(all)})
exten => s,2,Set(OLDNUM=${CALLERID(num)})

; extremely bodgey, but the gist of this is that it will rewrite local numbers to +31 numbers, rewrite anonymous CIDs to +31979999999999 (a bogus number, I don't know how A&A expects anonymous numbers)
exten => s,3,ExecIf($["${CALLERID(NUM):0:2}" != "00"]?ExecIf($["${CALLERID(NUM)}"  != ""]?ExecIf($["${CALLERID(NUM)}"  != "anonymous"]?set(CALLERID(num)=0031${CALLERID(num):1}))))
exten => s,4,ExecIf($["${CALLERID(NUM)}" = "anonymous"]?set(CALLERID(all)=+3197999999999))
; another pain: numbers starting with + aren't handled properly
exten => s,5,ExecIf($["${OLDNUM:0:1}" = "+"]?set(CALLERID(num)=00${OLDNUM:1})))
exten => s,6,Log(NOTICE, ${OLDNUM:0:1})

exten => s,7,Log(NOTICE, Rewrote CID for PSTN (CheapConnect) call from ${OLDCID} to <${CALLERID(all)}>)
exten => s,8,Gosub(inbound,s,1)
exten => s,9,Hangup()


[phones]
;toestellen
exten => 0198123456,1,Answer(500)
same = n,Playback(hello-world)
same = n,Hangup()

exten => _01999.,1,Log(NOTICE, Dialing out from ${CALLERID(all)} to ${EXTEN:5} through EPVPN)
same = n,Set(CALLERID(all)=RevSpace<7380>)
same = n,Dial(PJSIP/${EXTEN:5}@epvpn_endpoint, 45)
;same = n,Goto(s-${DIALSTATUS},1)
same = n,Log(NOTICE,${DIALSTATUS})
same = n,Hangup()

exten => _+491999.,1,Log(NOTICE, Dialing out from ${CALLERID(all)} to ${EXTEN:7} through EPVPN)
same = n,Set(CALLERID(all)=RevSpace<7380>)
same = n,Dial(PJSIP/${EXTEN:7}@epvpn_endpoint, 45)
;same = n,Goto(s-${DIALSTATUS},1)
same = n,Log(NOTICE,${DIALSTATUS})
same = n,Hangup()

exten => _+31[1-8].,1,Log(NOTICE, Dialing out to ${EXTEN} via public phone network)
same = n,Dial(PJSIP/${EXTEN}@cheapconnect_endpoint, 45)
same = n,HangUp()

exten => _0[1-8].,1,Log(NOTICE, Dialing out to ${EXTEN} via public phone network)
same = n,Dial(PJSIP/${EXTEN}@cheapconnect_endpoint, 45)
same = n,HangUp()

exten => _.,1,Log(NOTICE, Call to ${EXTEN} forbidden!)
same = n,Answer()
same = n,Playback(invalid)
same = n,Hangup()
pjsip.conf
[transport-udp-internet-v4]
type=transport
bind=49.13.171.67:45060
protocol=udp

[transport-udp-internet-v6]
type=transport
bind=[2a01:4f8:1c1b:56aa::1]:45060
protocol=udp

[sip2sim]
type=endpoint
transport=transport-udp-internet-v6
context=phones
disallow=all
allow=alaw
aors=sip2sim
auth=sip2sim
direct_media=no

[sip2sim]
type=auth
auth_type=userpass
username=geheim
password=geheim

[sip2sim]
type=identify
endpoint=sip2sim
match=81.187.30.111 
match=81.187.30.113
match=2001:8b0:0:30:5060::1
match=2001:8b0:0:30:5060::3
match=81.187.30.112  
match=81.187.30.114 
match=2001:8b0:0:30:5060::2
match=2001:8b0:0:30:5060::4

[sip2sim]
type=aor
max_contacts=1

[epvpn]
type = registration
contact_user = 7380
transport = transport-udp-internet-v4
outbound_auth = epvpn_auth
server_uri = sip:hg.eventphone.de:5060
client_uri = sip:7380@hg.eventphone.de:5060

[epvpn_auth]
type = auth
auth_type = userpass
password = geheim
username = 7380

[epvpn_endpoint]
type = endpoint
transport = transport-udp-internet-v4
aors = epvpn_aor
context = inbound_epvpn
disallow = all
allow = alaw
outbound_auth = epvpn_auth
direct_media = no
from_domain = hg.eventphone.de

[epvpn_identify]
type = identify
endpoint = epvpn_endpoint
match=hg.eventphone.de

[epvpn_aor]
type = aor
contact = sip:hg.eventphone.de:5060
qualify_frequency = 30

[cheapconnect]
type = registration
transport = transport-udp-internet-v4
outbound_auth = cheapconnect_auth
server_uri = sip:voip.cheapconnect.net:5060
client_uri = sip:31705690105@voip.cheapconnect.net:5060

[cheapconnect_auth]
type = auth
auth_type = userpass
password = geheim
username = 31705690105

[cheapconnect_endpoint]
type = endpoint
transport = transport-udp-internet-v4
aors = cheapconnect_aor
context = inbound_pstn
disallow = all
allow = alaw
outbound_auth = cheapconnect_auth
direct_media = no
from_domain = voip.cheapconnect.net

[cheapconnect_identify]
type = identify
endpoint = cheapconnect_endpoint
match = voip.cheapconnect.net

[cheapconnect_aor]
type = aor
contact = sip:voip.cheapconnect.net:5060
qualify_frequency = 30
/var/lib/asterisk/agi-bin/revspace-state.sh
#!/bin/bash

STATE=`curl --silent https://revspace.nl/status/status.php | jq .open`

if [ $? -eq 0 ]; then
  if [ "$STATE" = "true" ]; then
    echo 'SET VARIABLE open "1"'
    exit
  fi
  echo 'SET VARIABLE open "0"'
  exit
fi

# something went wrong when getting the spacestate, assume it is open (fail-safe)
echo 'SET VARIABLE open "1"'