<p>Torrey Searle has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/6813">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">contrib/script/sip_to_pjsip: add support for realtime<br><br>Add a new script that can read from legacy realtime peers & generate<br>an sql file for populating pjsip endpoints, identify, and aor records.<br><br>ASTERISK-27348 #close<br><br>Change-Id: Idd3d7968a3c9c3ee7936d21acbdaf001b429bf65<br>---<br>A contrib/scripts/sip_to_pjsip/sip_to_pjsql.py<br>A contrib/scripts/sip_to_pjsip/sqlconfigparser.py<br>2 files changed, 142 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/13/6813/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/contrib/scripts/sip_to_pjsip/sip_to_pjsql.py b/contrib/scripts/sip_to_pjsip/sip_to_pjsql.py<br>new file mode 100755<br>index 0000000..c60b8a8<br>--- /dev/null<br>+++ b/contrib/scripts/sip_to_pjsip/sip_to_pjsql.py<br>@@ -0,0 +1,78 @@<br>+#!/usr/bin/python<br>+<br>+from sip_to_pjsip import cli_options<br>+from sip_to_pjsip import convert<br>+import sip_to_pjsip<br>+import optparse<br>+<br>+<br>+import sqlconfigparser<br>+<br>+<br>+def write_pjsip(filename, pjsip, non_mappings):<br>+    """<br>+    Write pjsip.sql file to disk<br>+    """<br>+    try:<br>+        with open(filename, 'wt') as fp:<br>+            pjsip.write(fp)<br>+<br>+    except IOError:<br>+        print "Could not open file ", filename, " for writing"<br>+<br>+def cli_options():<br>+    """<br>+    Parse command line options and apply them. If invalid input is given,<br>+    print usage information<br>+<br>+    """<br>+    global user<br>+    global password<br>+    global host<br>+    global port<br>+    global database<br>+<br>+    usage = "usage: %prog [options] [input-file [output-file]]\n\n" \<br>+        "Converts the chan_sip configuration input-file to mysql output-file.\n" \<br>+        "The input-file defaults to 'sip.conf'.\n" \<br>+        "The output-file defaults to 'pjsip.sql'."<br>+    parser = optparse.OptionParser(usage=usage)<br>+    parser.add_option('-u', '--user', dest='user', default="root",<br>+                      help='mysql username')<br>+    parser.add_option('-p', '--password', dest='password', default="root",<br>+                      help='mysql password')<br>+    parser.add_option('-H', '--host', dest='host', default="127.0.0.1",<br>+                      help='mysql host ip')<br>+    parser.add_option('-P', '--port', dest='port', default="3306",<br>+                      help='mysql port number')<br>+    parser.add_option('-D', '--database', dest='database', default="asterisk",<br>+                      help='mysql port number')<br>+<br>+    options, args = parser.parse_args()<br>+<br>+    user = options.user<br>+    password = options.password<br>+    host = options.host<br>+    port = options.port<br>+    database = options.database<br>+<br>+    sip_filename = args[0] if len(args) else 'sip.conf'<br>+    pjsip_filename = args[1] if len(args) == 2 else 'pjsip.sql'<br>+<br>+    return sip_filename, pjsip_filename<br>+<br>+if __name__ == "__main__":<br>+    sip_filename, pjsip_filename = cli_options()<br>+    sip = sqlconfigparser.SqlConfigParser()<br>+    sip_to_pjsip.sip = sip<br>+    sip.connect(user,password,host,port,database)<br>+    print 'Please, report any issue at:'<br>+    print '    https://issues.asterisk.org/'<br>+    print 'Reading', sip_filename<br>+    sip.read(sip_filename)<br>+    print 'Converting to PJSIP realtime sql...'<br>+    pjsip, non_mappings = convert(sip, pjsip_filename, dict(), False)<br>+    pjsip.connect(user,password,host,port,database)<br>+    print 'Writing', pjsip_filename<br>+    write_pjsip(pjsip_filename, pjsip, non_mappings)<br>+<br>diff --git a/contrib/scripts/sip_to_pjsip/sqlconfigparser.py b/contrib/scripts/sip_to_pjsip/sqlconfigparser.py<br>new file mode 100644<br>index 0000000..dc8d02d<br>--- /dev/null<br>+++ b/contrib/scripts/sip_to_pjsip/sqlconfigparser.py<br>@@ -0,0 +1,64 @@<br>+from astconfigparser import MultiOrderedConfigParser<br>+<br>+import MySQLdb<br>+import traceback<br>+<br>+class SqlConfigParser(MultiOrderedConfigParser):<br>+<br>+    def connect(self, user, password, host, port, database):<br>+        self.cnx = MySQLdb.connect(user=user,passwd=password,host=host,port=int(port),db=database)<br>+<br>+<br>+    def read(self, filename, sect=None):<br>+        MultiOrderedConfigParser.read(self, filename, sect)<br>+        # cursor = self.cnx.cursor(dictionary=True)<br>+    cursor = self.cnx.cursor(cursorclass=MySQLdb.cursors.DictCursor)<br>+        cursor.execute("SELECT * from peers")<br>+        rows = cursor.fetchall()<br>+<br>+        for row in rows:<br>+            sect = self.add_section(row['name'])<br>+            for key in row:<br>+                if (row[key] != None):<br>+                    for elem in str(row[key]).split(";"):<br>+                        sect[key] = elem<br>+                    #sect[key] = str(row[key]).split(";")<br>+<br>+    def write_dicts(self, config_file, mdicts):<br>+        """Write the contents of the mdicts to the specified config file"""<br>+        for section, sect_list in mdicts.iteritems():<br>+            # every section contains a list of dictionaries<br>+            for sect in sect_list:<br>+                sql = "INSERT INTO "<br>+                if (sect.get('type')[0] == "endpoint"):<br>+                    sql += "ps_endpoints "<br>+                elif (sect.get('type')[0] == "aor" and section != "sbc"):<br>+                    sql += "ps_aors "<br>+                elif (sect.get('type')[0] == "identify"):<br>+                    sql += "ps_endpoint_id_ips"<br>+                else:<br>+                    continue<br>+<br>+                sql += " SET `id` = " + "\"" + MySQLdb.escape_string(section) + "\""<br>+                for key, val_list in sect.iteritems():<br>+                    if key == "type":<br>+                        continue<br>+                    # every value is also a list<br>+<br>+                    key_val = " `" + key + "`"<br>+                    key_val += " = " + "\"" + MySQLdb.escape_string(";".join(val_list)) + "\""<br>+                    sql += ","<br>+                    sql += key_val<br>+<br>+                config_file.write("%s;\n" % (sql))<br>+<br>+    def write(self, config_file):<br>+        """Write configuration information out to a file"""<br>+        try:<br>+            self.write_dicts(config_file, self._sections)<br>+        except Exception,e:<br>+                print "Could not open file ", config_file, " for writing"<br>+                traceback.print_exc()<br>+<br>+<br>+<br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/6813">change 6813</a>. To unsubscribe, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/6813"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Idd3d7968a3c9c3ee7936d21acbdaf001b429bf65 </div>
<div style="display:none"> Gerrit-Change-Number: 6813 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Torrey Searle <tsearle@gmail.com> </div>