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. map specific sections from sip.conf into it.
Returns the new pjsip.conf object once completed Returns the new pjsip.conf object once completed
""" """
pjsip = astconfigparser.MultiOrderedConfigParser() pjsip = sip.__class__()
non_mappings[filename] = astdicts.MultiOrderedDict() non_mappings[filename] = astdicts.MultiOrderedDict()
nmapped = non_mapped(non_mappings[filename]) nmapped = non_mapped(non_mappings[filename])
if not include: 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()