contrib/script/sip_to_pjsip: add support for realtime

Add a new script that can read from legacy realtime peers & generate
an sql file for populating pjsip endpoints, identify, and aor records.

ASTERISK-27348 #close

Change-Id: Idd3d7968a3c9c3ee7936d21acbdaf001b429bf65
This commit is contained in:
Torrey Searle
2017-10-16 14:36:50 +02:00
committed by Matthew Fredrickson
parent 4568894d2a
commit 976afd26ab
3 changed files with 151 additions and 1 deletions

View File

@@ -1203,7 +1203,7 @@ def convert(sip, filename, non_mappings, include):
map specific sections from sip.conf into it.
Returns the new pjsip.conf object once completed
"""
pjsip = astconfigparser.MultiOrderedConfigParser()
pjsip = sip.__class__()
non_mappings[filename] = astdicts.MultiOrderedDict()
nmapped = non_mapped(non_mappings[filename])
if not include:

View File

@@ -0,0 +1,81 @@
#!/usr/bin/python
from sip_to_pjsip import cli_options
from sip_to_pjsip import convert
import sip_to_pjsip
import optparse
import sqlconfigparser
def write_pjsip(filename, pjsip, non_mappings):
"""
Write pjsip.sql file to disk
"""
try:
with open(filename, 'wt') as fp:
pjsip.write(fp)
except IOError:
print "Could not open file ", filename, " for writing"
def cli_options():
"""
Parse command line options and apply them. If invalid input is given,
print usage information
"""
global user
global password
global host
global port
global database
global table
usage = "usage: %prog [options] [input-file [output-file]]\n\n" \
"Converts the chan_sip configuration input-file to mysql output-file.\n" \
"The input-file defaults to 'sip.conf'.\n" \
"The output-file defaults to 'pjsip.sql'."
parser = optparse.OptionParser(usage=usage)
parser.add_option('-u', '--user', dest='user', default="root",
help='mysql username')
parser.add_option('-p', '--password', dest='password', default="root",
help='mysql password')
parser.add_option('-H', '--host', dest='host', default="127.0.0.1",
help='mysql host ip')
parser.add_option('-P', '--port', dest='port', default="3306",
help='mysql port number')
parser.add_option('-D', '--database', dest='database', default="asterisk",
help='mysql port number')
parser.add_option('-t', '--table', dest='table', default="sippeers",
help='name of sip realtime peers table')
options, args = parser.parse_args()
user = options.user
password = options.password
host = options.host
port = options.port
database = options.database
table = options.table
sip_filename = args[0] if len(args) else 'sip.conf'
pjsip_filename = args[1] if len(args) == 2 else 'pjsip.sql'
return sip_filename, pjsip_filename
if __name__ == "__main__":
sip_filename, pjsip_filename = cli_options()
sip = sqlconfigparser.SqlConfigParser(table)
sip_to_pjsip.sip = sip
sip.connect(user,password,host,port,database)
print 'Please, report any issue at:'
print ' https://issues.asterisk.org/'
print 'Reading', sip_filename
sip.read(sip_filename)
print 'Converting to PJSIP realtime sql...'
pjsip, non_mappings = convert(sip, pjsip_filename, dict(), False)
print 'Writing', pjsip_filename
write_pjsip(pjsip_filename, pjsip, non_mappings)

View File

@@ -0,0 +1,69 @@
from astconfigparser import MultiOrderedConfigParser
import MySQLdb
import traceback
class SqlConfigParser(MultiOrderedConfigParser):
_tablename = "sippeers"
def __init__(self,tablename="sippeers"):
self._tablename=tablename
MultiOrderedConfigParser.__init__(self)
def connect(self, user, password, host, port, database):
self.cnx = MySQLdb.connect(user=user,passwd=password,host=host,port=int(port),db=database)
def read(self, filename, sect=None):
MultiOrderedConfigParser.read(self, filename, sect)
# cursor = self.cnx.cursor(dictionary=True)
cursor = self.cnx.cursor(cursorclass=MySQLdb.cursors.DictCursor)
cursor.execute("SELECT * from `" + MySQLdb.escape_string(self._tablename) + "`")
rows = cursor.fetchall()
for row in rows:
sect = self.add_section(row['name'])
for key in row:
if (row[key] != None):
for elem in str(row[key]).split(";"):
sect[key] = elem
#sect[key] = str(row[key]).split(";")
def write_dicts(self, config_file, mdicts):
"""Write the contents of the mdicts to the specified config file"""
for section, sect_list in mdicts.iteritems():
# every section contains a list of dictionaries
for sect in sect_list:
sql = "INSERT INTO "
if (sect.get('type')[0] == "endpoint"):
sql += "ps_endpoints "
elif (sect.get('type')[0] == "aor" and section != "sbc"):
sql += "ps_aors "
elif (sect.get('type')[0] == "identify"):
sql += "ps_endpoint_id_ips"
else:
continue
sql += " SET `id` = " + "\"" + MySQLdb.escape_string(section) + "\""
for key, val_list in sect.iteritems():
if key == "type":
continue
# every value is also a list
key_val = " `" + key + "`"
key_val += " = " + "\"" + MySQLdb.escape_string(";".join(val_list)) + "\""
sql += ","
sql += key_val
config_file.write("%s;\n" % (sql))
def write(self, config_file):
"""Write configuration information out to a file"""
try:
self.write_dicts(config_file, self._sections)
except Exception,e:
print "Could not open file ", config_file, " for writing"
traceback.print_exc()