contrib/script/sip_to_pjsip: add support for realtime
authorTorrey Searle <torrey@voxbone.com>
Mon, 16 Oct 2017 12:36:50 +0000 (14:36 +0200)
committerMatthew Fredrickson <creslin@digium.com>
Fri, 16 Feb 2018 15:27:32 +0000 (09:27 -0600)
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

contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
contrib/scripts/sip_to_pjsip/sip_to_pjsql.py [new file with mode: 0755]
contrib/scripts/sip_to_pjsip/sqlconfigparser.py [new file with mode: 0644]

index 533e4ba..9f7d991 100755 (executable)
@@ -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:
diff --git a/contrib/scripts/sip_to_pjsip/sip_to_pjsql.py b/contrib/scripts/sip_to_pjsip/sip_to_pjsql.py
new file mode 100755 (executable)
index 0000000..d93bca5
--- /dev/null
@@ -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)
+
diff --git a/contrib/scripts/sip_to_pjsip/sqlconfigparser.py b/contrib/scripts/sip_to_pjsip/sqlconfigparser.py
new file mode 100644 (file)
index 0000000..e87224f
--- /dev/null
@@ -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()
+
+
+