mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	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:
		
				
					committed by
					
						 Matthew Fredrickson
						Matthew Fredrickson
					
				
			
			
				
	
			
			
			
						parent
						
							4568894d2a
						
					
				
				
					commit
					976afd26ab
				
			| @@ -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: | ||||
|   | ||||
							
								
								
									
										81
									
								
								contrib/scripts/sip_to_pjsip/sip_to_pjsql.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										81
									
								
								contrib/scripts/sip_to_pjsip/sip_to_pjsql.py
									
									
									
									
									
										Executable 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) | ||||
|  | ||||
							
								
								
									
										69
									
								
								contrib/scripts/sip_to_pjsip/sqlconfigparser.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								contrib/scripts/sip_to_pjsip/sqlconfigparser.py
									
									
									
									
									
										Normal 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() | ||||
|  | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user