mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-03 11:25:35 +00:00
sip_to_pjsip: Migrate IPv4/IPv6 (Dual Stack) configurations.
When using the migration script sip_to_pjsip.py, and your sip.conf is configured with bindaddr=::, two transports are written to pjsip.conf, one for 0.0.0.0 (IPv4) and one for [::] (IPv6). That way, PJProject listens on the IPv4 and IPv6 wildcards; a IPv4/IPv6 Dual Stack configuration on a single interface like in chan_sip. Furthermore, the script internal functions "build_host" and "split_hostport" did not parse Literal IPv6 addresses as expected (like [::1]:5060). This change makes sure, even such addresses are parsed correctly. ASTERISK-26309 Change-Id: Ia4799a0f80fc30c0550fc373efc207c3330aeb48
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import optparse
|
||||
import socket
|
||||
import urlparse # Python 2.7 required for Literal IPv6 Addresses
|
||||
|
||||
import astdicts
|
||||
import astconfigparser
|
||||
import socket
|
||||
import re
|
||||
|
||||
PREFIX = 'pjsip_'
|
||||
|
||||
@@ -213,37 +214,42 @@ def from_progressinband(key, val, section, pjsip, nmapped):
|
||||
set_value('inband_progress', val, section, pjsip, nmapped)
|
||||
|
||||
|
||||
def build_host(config, host, section, port_key):
|
||||
def build_host(config, host, section='general', port_key=None):
|
||||
"""
|
||||
Returns a string composed of a host:port. This assumes that the host
|
||||
may have a port as part of the initial value. The port_key is only used
|
||||
if the host does not already have a port set on it.
|
||||
Throws a LookupError if the key does not exist
|
||||
may have a port as part of the initial value. The port_key overrides
|
||||
a port in host, see parameter 'bindport' in chan_sip.
|
||||
"""
|
||||
port = None
|
||||
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, host)
|
||||
if not host.startswith('['):
|
||||
# SIP URI will need brackets.
|
||||
host = '[' + host + ']'
|
||||
else:
|
||||
# If brackets are present, there may be a port as well
|
||||
port = re.match('\[.*\]:(\d+)', host)
|
||||
except socket.error:
|
||||
# No biggie. It's just not an IPv6 address
|
||||
port = re.match('.*:(\d+)', host)
|
||||
pass
|
||||
|
||||
result = host
|
||||
# Literal IPv6 (like [::]), IPv4, or hostname
|
||||
# does not work for IPv6 without brackets; case catched above
|
||||
url = urlparse.urlparse('sip://' + host)
|
||||
|
||||
if not port:
|
||||
if port_key:
|
||||
try:
|
||||
port = config.get(section, port_key)[0]
|
||||
result += ':' + port
|
||||
host = url.hostname # no port, but perhaps no brackets
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, host)
|
||||
if not host.startswith('['):
|
||||
# SIP URI will need brackets.
|
||||
host = '[' + host + ']'
|
||||
except socket.error:
|
||||
pass
|
||||
return host + ':' + port
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
return result
|
||||
# Returns host:port, in brackets if required
|
||||
# TODO Does not compress IPv6, for example 0:0:0:0:0:0:0:0 should get [::]
|
||||
return url.netloc
|
||||
|
||||
|
||||
def from_host(key, val, section, pjsip, nmapped):
|
||||
@@ -506,17 +512,59 @@ peer_map = [
|
||||
]
|
||||
|
||||
|
||||
def set_transport_common(section, pjsip, nmapped):
|
||||
def split_hostport(addr):
|
||||
"""
|
||||
Given an address in the form 'host:port' separate the host and port
|
||||
components.
|
||||
Returns a two-tuple of strings, (host, port). If no port is present in the
|
||||
string, then the port section of the tuple is None.
|
||||
"""
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, addr)
|
||||
if not addr.startswith('['):
|
||||
return (addr, None)
|
||||
except socket.error:
|
||||
pass
|
||||
|
||||
# Literal IPv6 (like [::]), IPv4, or hostname
|
||||
# does not work for IPv6 without brackets; case catched above
|
||||
url = urlparse.urlparse('sip://' + addr)
|
||||
# TODO Does not compress IPv6, for example 0:0:0:0:0:0:0:0 should get [::]
|
||||
return (url.hostname, url.port)
|
||||
|
||||
|
||||
def set_transport_common(section, sip, pjsip, protocol, nmapped):
|
||||
"""
|
||||
sip.conf has several global settings that in pjsip.conf apply to individual
|
||||
transports. This function adds these global settings to each individual
|
||||
transport.
|
||||
|
||||
The settings included are:
|
||||
externaddr (or externip)
|
||||
externhost
|
||||
externtcpport for TCP
|
||||
externtlsport for TLS
|
||||
localnet
|
||||
tos_sip
|
||||
cos_sip
|
||||
"""
|
||||
try:
|
||||
extern_addr = sip.multi_get('general', ['externaddr', 'externip',
|
||||
'externhost'])[0]
|
||||
host, port = split_hostport(extern_addr)
|
||||
try:
|
||||
port = sip.get('general', 'extern' + protocol + 'port')[0]
|
||||
except LookupError:
|
||||
pass
|
||||
set_value('external_media_address', host, section, pjsip,
|
||||
nmapped, 'transport')
|
||||
set_value('external_signaling_address', host, section, pjsip,
|
||||
nmapped, 'transport')
|
||||
if port:
|
||||
set_value('external_signaling_port', port, section, pjsip,
|
||||
nmapped, 'transport')
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
try:
|
||||
merge_value('localnet', sip.get('general', 'localnet')[0], 'general',
|
||||
@@ -538,34 +586,69 @@ def set_transport_common(section, pjsip, nmapped):
|
||||
pass
|
||||
|
||||
|
||||
def split_hostport(addr):
|
||||
def get_bind(sip, pjsip, protocol):
|
||||
"""
|
||||
Given an address in the form 'addr:port' separate the addr and port
|
||||
components.
|
||||
Returns a two-tuple of strings, (addr, port). If no port is present in the
|
||||
string, then the port section of the tuple is None.
|
||||
Given the protocol (udp, tcp, or tls), return
|
||||
- the bind address, like [::] or 0.0.0.0
|
||||
- name of the section to be created
|
||||
"""
|
||||
section = 'transport-' + protocol
|
||||
|
||||
# UDP cannot be disabled in chan_sip
|
||||
if protocol != 'udp':
|
||||
try:
|
||||
enabled = sip.get('general', protocol + 'enable')[0]
|
||||
except LookupError:
|
||||
# No value means disabled by default. Don't create this transport
|
||||
return (None, section)
|
||||
if enabled != 'yes':
|
||||
return (None, section)
|
||||
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, addr)
|
||||
if not addr.startswith('['):
|
||||
return (addr, None)
|
||||
else:
|
||||
# If brackets are present, there may be a port as well
|
||||
match = re.match('\[(.*\)]:(\d+)', addr)
|
||||
if match:
|
||||
return (match.group(1), match.group(2))
|
||||
else:
|
||||
return (addr, None)
|
||||
except socket.error:
|
||||
bind = pjsip.get(section, 'bind')[0]
|
||||
# The first run created an transport already but this
|
||||
# server was not configured for IPv4/IPv6 Dual Stack
|
||||
return (None, section)
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
# IPv4 address or hostname
|
||||
host, sep, port = addr.rpartition(':')
|
||||
try:
|
||||
bind = pjsip.get(section + '6', 'bind')[0]
|
||||
# The first run created an IPv6 transport, because
|
||||
# the server was configured with :: as bindaddr.
|
||||
# Now, re-use its port and create the IPv4 transport
|
||||
host, port = split_hostport(bind)
|
||||
bind = '0.0.0.0'
|
||||
if port:
|
||||
bind += ':' + str(port)
|
||||
except LookupError:
|
||||
# This is the first run, no transport in pjsip exists.
|
||||
try:
|
||||
bind = sip.get('general', protocol + 'bindaddr')[0]
|
||||
except LookupError:
|
||||
if protocol == 'udp':
|
||||
try:
|
||||
bind = sip.get('general', 'bindaddr')[0]
|
||||
except LookupError:
|
||||
bind = '0.0.0.0'
|
||||
else:
|
||||
try:
|
||||
bind = pjsip.get('transport-udp6', 'bind')[0]
|
||||
except LookupError:
|
||||
bind = pjsip.get('transport-udp', 'bind')[0]
|
||||
# Only TCP reuses host:port of UDP, others reuse just host
|
||||
if protocol == 'tls':
|
||||
bind, port = split_hostport(bind)
|
||||
host, port = split_hostport(bind)
|
||||
if host == '::':
|
||||
section += '6'
|
||||
|
||||
if not sep and not port:
|
||||
return (host, None)
|
||||
if protocol == 'udp':
|
||||
host = build_host(sip, bind, 'general', 'bindport')
|
||||
else:
|
||||
return (host, port)
|
||||
host = build_host(sip, bind)
|
||||
|
||||
return (host, section)
|
||||
|
||||
|
||||
def create_udp(sip, pjsip, nmapped):
|
||||
@@ -575,34 +658,13 @@ def create_udp(sip, pjsip, nmapped):
|
||||
|
||||
bindaddr (or udpbindaddr)
|
||||
bindport
|
||||
externaddr (or externip)
|
||||
externhost
|
||||
"""
|
||||
protocol = 'udp'
|
||||
bind, section = get_bind(sip, pjsip, protocol)
|
||||
|
||||
try:
|
||||
bind = sip.multi_get('general', ['udpbindaddr', 'bindaddr'])[0]
|
||||
except LookupError:
|
||||
bind = ''
|
||||
|
||||
bind = build_host(sip, bind, 'general', 'bindport')
|
||||
|
||||
try:
|
||||
extern_addr = sip.multi_get('general', ['externaddr', 'externip',
|
||||
'externhost'])[0]
|
||||
host, port = split_hostport(extern_addr)
|
||||
set_value('external_media_address', host, 'transport-udp', pjsip,
|
||||
nmapped, 'transport')
|
||||
set_value('external_signaling_address', host, 'transport-udp', pjsip,
|
||||
nmapped, 'transport')
|
||||
if port:
|
||||
set_value('external_signaling_port', port, 'transport-udp', pjsip,
|
||||
nmapped, 'transport')
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
set_value('protocol', 'udp', 'transport-udp', pjsip, nmapped, 'transport')
|
||||
set_value('bind', bind, 'transport-udp', pjsip, nmapped, 'transport')
|
||||
set_transport_common('transport-udp', pjsip, nmapped)
|
||||
set_value('protocol', protocol, section, pjsip, nmapped, 'transport')
|
||||
set_value('bind', bind, section, pjsip, nmapped, 'transport')
|
||||
set_transport_common(section, sip, pjsip, protocol, nmapped)
|
||||
|
||||
|
||||
def create_tcp(sip, pjsip, nmapped):
|
||||
@@ -611,131 +673,61 @@ def create_tcp(sip, pjsip, nmapped):
|
||||
on the following settings from sip.conf:
|
||||
|
||||
tcpenable
|
||||
tcpbindaddr
|
||||
externtcpport
|
||||
tcpbindaddr (or bindaddr)
|
||||
"""
|
||||
|
||||
try:
|
||||
enabled = sip.get('general', 'tcpenable')[0]
|
||||
except:
|
||||
# No value means disabled by default. No need for a tranport
|
||||
protocol = 'tcp'
|
||||
bind, section = get_bind(sip, pjsip, protocol)
|
||||
if not bind:
|
||||
return
|
||||
|
||||
if enabled == 'no':
|
||||
return
|
||||
|
||||
try:
|
||||
bind = sip.get('general', 'tcpbindaddr')[0]
|
||||
bind = build_host(sip, bind, 'general', 'bindport')
|
||||
except LookupError:
|
||||
# No tcpbindaddr means to default to the udpbindaddr
|
||||
bind = pjsip.get('transport-udp', 'bind')[0]
|
||||
|
||||
try:
|
||||
extern_addr = sip.multi_get('general', ['externaddr', 'externip',
|
||||
'externhost'])[0]
|
||||
host, port = split_hostport(extern_addr)
|
||||
try:
|
||||
tcpport = sip.get('general', 'externtcpport')[0]
|
||||
except:
|
||||
tcpport = port
|
||||
set_value('external_media_address', host, 'transport-tcp', pjsip,
|
||||
nmapped, 'transport')
|
||||
set_value('external_signaling_address', host, 'transport-tcp', pjsip,
|
||||
nmapped, 'transport')
|
||||
if tcpport:
|
||||
set_value('external_signaling_port', tcpport, 'transport-tcp',
|
||||
pjsip, nmapped, 'transport')
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
set_value('protocol', 'tcp', 'transport-tcp', pjsip, nmapped, 'transport')
|
||||
set_value('bind', bind, 'transport-tcp', pjsip, nmapped, 'transport')
|
||||
set_transport_common('transport-tcp', pjsip, nmapped)
|
||||
set_value('protocol', protocol, section, pjsip, nmapped, 'transport')
|
||||
set_value('bind', bind, section, pjsip, nmapped, 'transport')
|
||||
set_transport_common(section, sip, pjsip, protocol, nmapped)
|
||||
|
||||
|
||||
def set_tls_bindaddr(val, pjsip, nmapped):
|
||||
"""
|
||||
Creates the TCP bind address. This has two possible methods of
|
||||
working:
|
||||
Use the 'tlsbindaddr' option from sip.conf directly if it has both
|
||||
an address and port. If no port is present, use 5061
|
||||
If there is no 'tlsbindaddr' option present in sip.conf, use the
|
||||
previously-established UDP bind address and port 5061
|
||||
"""
|
||||
try:
|
||||
bind = sip.get('general', 'tlsbindaddr')[0]
|
||||
explicit = True
|
||||
except LookupError:
|
||||
# No tlsbindaddr means to default to the bindaddr but with standard TLS
|
||||
# port
|
||||
bind = pjsip.get('transport-udp', 'bind')[0]
|
||||
explicit = False
|
||||
|
||||
matchv4 = re.match('\d+\.\d+\.\d+\.\d+:\d+', bind)
|
||||
matchv6 = re.match('\[.*\]:d+', bind)
|
||||
if matchv4 or matchv6:
|
||||
if explicit:
|
||||
# They provided a port. We'll just use it.
|
||||
set_value('bind', bind, 'transport-tls', pjsip, nmapped,
|
||||
'transport')
|
||||
return
|
||||
else:
|
||||
# Need to strip the port from the UDP address
|
||||
index = bind.rfind(':')
|
||||
bind = bind[:index]
|
||||
|
||||
# Reaching this point means either there was no port provided or we
|
||||
# stripped the port off. We need to add on the default 5061 port
|
||||
|
||||
bind += ':5061'
|
||||
|
||||
set_value('bind', bind, 'transport-tls', pjsip, nmapped, 'transport')
|
||||
|
||||
|
||||
def set_tls_cert_file(val, pjsip, nmapped):
|
||||
def set_tls_cert_file(val, pjsip, section, nmapped):
|
||||
"""Sets cert_file based on sip.conf tlscertfile"""
|
||||
set_value('cert_file', val, 'transport-tls', pjsip, nmapped,
|
||||
set_value('cert_file', val, section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
def set_tls_private_key(val, pjsip, nmapped):
|
||||
def set_tls_private_key(val, pjsip, section, nmapped):
|
||||
"""Sets privkey_file based on sip.conf tlsprivatekey or sslprivatekey"""
|
||||
set_value('priv_key_file', val, 'transport-tls', pjsip, nmapped,
|
||||
set_value('priv_key_file', val, section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
def set_tls_cipher(val, pjsip, nmapped):
|
||||
def set_tls_cipher(val, pjsip, section, nmapped):
|
||||
"""Sets cipher based on sip.conf tlscipher or sslcipher"""
|
||||
set_value('cipher', val, 'transport-tls', pjsip, nmapped, 'transport')
|
||||
set_value('cipher', val, section, pjsip, nmapped, 'transport')
|
||||
|
||||
|
||||
def set_tls_cafile(val, pjsip, nmapped):
|
||||
def set_tls_cafile(val, pjsip, section, nmapped):
|
||||
"""Sets ca_list_file based on sip.conf tlscafile"""
|
||||
set_value('ca_list_file', val, 'transport-tls', pjsip, nmapped,
|
||||
set_value('ca_list_file', val, section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
def set_tls_capath(val, pjsip, nmapped):
|
||||
def set_tls_capath(val, pjsip, section, nmapped):
|
||||
"""Sets ca_list_path based on sip.conf tlscapath"""
|
||||
set_value('ca_list_path', val, 'transport-tls', pjsip, nmapped,
|
||||
set_value('ca_list_path', val, section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
def set_tls_verifyclient(val, pjsip, nmapped):
|
||||
def set_tls_verifyclient(val, pjsip, section, nmapped):
|
||||
"""Sets verify_client based on sip.conf tlsverifyclient"""
|
||||
set_value('verify_client', val, 'transport-tls', pjsip, nmapped,
|
||||
set_value('verify_client', val, section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
def set_tls_verifyserver(val, pjsip, nmapped):
|
||||
def set_tls_verifyserver(val, pjsip, section, nmapped):
|
||||
"""Sets verify_server based on sip.conf tlsdontverifyserver"""
|
||||
|
||||
if val == 'no':
|
||||
set_value('verify_server', 'yes', 'transport-tls', pjsip, nmapped,
|
||||
set_value('verify_server', 'yes', section, pjsip, nmapped,
|
||||
'transport')
|
||||
else:
|
||||
set_value('verify_server', 'no', 'transport-tls', pjsip, nmapped,
|
||||
set_value('verify_server', 'no', section, pjsip, nmapped,
|
||||
'transport')
|
||||
|
||||
|
||||
@@ -745,7 +737,7 @@ def create_tls(sip, pjsip, nmapped):
|
||||
settings from sip.conf:
|
||||
|
||||
tlsenable (or sslenable)
|
||||
tlsbindaddr (or sslbindaddr)
|
||||
tlsbindaddr (or sslbindaddr or bindaddr)
|
||||
tlsprivatekey (or sslprivatekey)
|
||||
tlscipher (or sslcipher)
|
||||
tlscafile
|
||||
@@ -755,9 +747,16 @@ def create_tls(sip, pjsip, nmapped):
|
||||
tlsdontverifyserver
|
||||
tlsclientmethod (or sslclientmethod)
|
||||
"""
|
||||
protocol = 'tls'
|
||||
bind, section = get_bind(sip, pjsip, protocol)
|
||||
if not bind:
|
||||
return
|
||||
|
||||
set_value('protocol', protocol, section, pjsip, nmapped, 'transport')
|
||||
set_value('bind', bind, section, pjsip, nmapped, 'transport')
|
||||
set_transport_common(section, sip, pjsip, protocol, nmapped)
|
||||
|
||||
tls_map = [
|
||||
(['tlsbindaddr', 'sslbindaddr'], set_tls_bindaddr),
|
||||
(['tlscertfile', 'sslcert', 'tlscert'], set_tls_cert_file),
|
||||
(['tlsprivatekey', 'sslprivatekey'], set_tls_private_key),
|
||||
(['tlscipher', 'sslcipher'], set_tls_cipher),
|
||||
@@ -767,26 +766,21 @@ def create_tls(sip, pjsip, nmapped):
|
||||
(['tlsdontverifyserver'], set_tls_verifyserver)
|
||||
]
|
||||
|
||||
try:
|
||||
enabled = sip.multi_get('general', ['tlsenable', 'sslenable'])[0]
|
||||
except LookupError:
|
||||
# Not enabled. Don't create a transport
|
||||
return
|
||||
|
||||
if enabled == 'no':
|
||||
return
|
||||
|
||||
set_value('protocol', 'tls', 'transport-tls', pjsip, nmapped, 'transport')
|
||||
|
||||
for i in tls_map:
|
||||
try:
|
||||
i[1](sip.multi_get('general', i[0])[0], pjsip, nmapped)
|
||||
i[1](sip.multi_get('general', i[0])[0], pjsip, section, nmapped)
|
||||
except LookupError:
|
||||
pass
|
||||
|
||||
try:
|
||||
method = sip.multi_get('general', ['tlsclientmethod', 'sslclientmethod'])[0]
|
||||
print 'In chan_sip, you specified the TLS version. With chan_sip, this was just for outbound client connections. In chan_pjsip, this value is for client and server. Instead, consider not to specify \'tlsclientmethod\' for chan_sip and \'method = sslv23\' for chan_pjsip.'
|
||||
method = sip.multi_get('general', ['tlsclientmethod',
|
||||
'sslclientmethod'])[0]
|
||||
if section != 'transport-' + protocol + '6': # print only once
|
||||
print 'In chan_sip, you specified the TLS version. With chan_sip,' \
|
||||
' this was just for outbound client connections. In' \
|
||||
' chan_pjsip, this value is for client and server. Instead,' \
|
||||
' consider not to specify \'tlsclientmethod\' for chan_sip' \
|
||||
' and \'method = sslv23\' for chan_pjsip.'
|
||||
except LookupError:
|
||||
"""
|
||||
OpenSSL emerged during the 90s. SSLv2 and SSLv3 were the only
|
||||
@@ -799,26 +793,7 @@ def create_tls(sip, pjsip, nmapped):
|
||||
'sslv23' as default when unspecified, which gives TLSv1.0 and v1.2.
|
||||
"""
|
||||
method = 'sslv23'
|
||||
set_value('method', method, 'transport-tls', pjsip, nmapped, 'transport')
|
||||
|
||||
set_transport_common('transport-tls', pjsip, nmapped)
|
||||
try:
|
||||
extern_addr = sip.multi_get('general', ['externaddr', 'externip',
|
||||
'externhost'])[0]
|
||||
host, port = split_hostport(extern_addr)
|
||||
try:
|
||||
tlsport = sip.get('general', 'externtlsport')[0]
|
||||
except:
|
||||
tlsport = port
|
||||
set_value('external_media_address', host, 'transport-tls', pjsip,
|
||||
nmapped, 'transport')
|
||||
set_value('external_signaling_address', host, 'transport-tls', pjsip,
|
||||
nmapped, 'transport')
|
||||
if tlsport:
|
||||
set_value('external_signaling_port', tlsport, 'transport-tls',
|
||||
pjsip, nmapped, 'transport')
|
||||
except LookupError:
|
||||
pass
|
||||
set_value('method', method, section, pjsip, nmapped, 'transport')
|
||||
|
||||
|
||||
def map_transports(sip, pjsip, nmapped):
|
||||
@@ -828,23 +803,29 @@ def map_transports(sip, pjsip, nmapped):
|
||||
configuration sections in pjsip.conf.
|
||||
|
||||
sip.conf only allows a single UDP transport, TCP transport,
|
||||
and TLS transport. As such, the mapping into PJSIP can be made
|
||||
consistent by defining three sections:
|
||||
and TLS transport for each IP version. As such, the mapping
|
||||
into PJSIP can be made consistent by defining six sections:
|
||||
|
||||
transport-udp6
|
||||
transport-udp
|
||||
transport-tcp6
|
||||
transport-tcp
|
||||
transport-tls6
|
||||
transport-tls
|
||||
|
||||
To accommodate the default behaviors in sip.conf, we'll need to
|
||||
create the UDP transport first, followed by the TCP and TLS transports.
|
||||
create the UDP transports first, followed by the TCP and TLS transports.
|
||||
"""
|
||||
|
||||
# First create a UDP transport. Even if no bind parameters were provided
|
||||
# in sip.conf, chan_sip would always bind to UDP 0.0.0.0:5060
|
||||
create_udp(sip, pjsip, nmapped)
|
||||
create_udp(sip, pjsip, nmapped)
|
||||
|
||||
# TCP settings may be dependent on UDP settings, so do it second.
|
||||
create_tcp(sip, pjsip, nmapped)
|
||||
create_tcp(sip, pjsip, nmapped)
|
||||
create_tls(sip, pjsip, nmapped)
|
||||
create_tls(sip, pjsip, nmapped)
|
||||
|
||||
|
||||
@@ -1219,6 +1200,8 @@ if __name__ == "__main__":
|
||||
sip_filename, pjsip_filename = cli_options()
|
||||
# configuration parser for sip.conf
|
||||
sip = astconfigparser.MultiOrderedConfigParser()
|
||||
print 'Please, report any issue at:'
|
||||
print ' https://issues.asterisk.org/'
|
||||
print 'Reading', sip_filename
|
||||
sip.read(sip_filename)
|
||||
print 'Converting to PJSIP...'
|
||||
|
Reference in New Issue
Block a user