summaryrefslogtreecommitdiff
path: root/contrib/scripts/sip_to_res_sip/sip_to_res_sip.py
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/scripts/sip_to_res_sip/sip_to_res_sip.py')
-rwxr-xr-xcontrib/scripts/sip_to_res_sip/sip_to_res_sip.py392
1 files changed, 0 insertions, 392 deletions
diff --git a/contrib/scripts/sip_to_res_sip/sip_to_res_sip.py b/contrib/scripts/sip_to_res_sip/sip_to_res_sip.py
deleted file mode 100755
index ca253bdd0..000000000
--- a/contrib/scripts/sip_to_res_sip/sip_to_res_sip.py
+++ /dev/null
@@ -1,392 +0,0 @@
-#!/usr/bin/python
-
-###############################################################################
-# TODO:
-# (1) There is more work to do here, at least for the sip.conf items that
-# aren't currently parsed. An issue will be created for that.
-# (2) All of the scripts should probably be passed through pylint and have
-# as many PEP8 issues fixed as possible
-# (3) A public review is probably warranted at that point of the entire script
-###############################################################################
-
-import optparse
-import astdicts
-import astconfigparser
-
-PREFIX = 'res_sip_'
-
-###############################################################################
-### some utility functions
-###############################################################################
-def section_by_type(section, res_sip, type):
- """Finds a section based upon the given type, adding it if not found."""
- try:
- return astconfigparser.find_dict(
- res_sip.section(section), 'type', type)
- except LookupError:
- # section for type doesn't exist, so add
- sect = res_sip.add_section(section)
- sect['type'] = type
- return sect
-
-def set_value(key=None, val=None, section=None, res_sip=None,
- nmapped=None, type='endpoint'):
- """Sets the key to the value within the section in res_sip.conf"""
- def _set_value(k, v, s, r, n):
- set_value(key if key else k, v, s, r, n, type)
-
- # if no value or section return the set_value
- # function with the enclosed key and type
- if not val and not section:
- return _set_value
-
- # otherwise try to set the value
- section_by_type(section, res_sip, type)[key] = \
- val[0] if isinstance(val, list) else val
-
-def merge_value(key=None, val=None, section=None, res_sip=None,
- nmapped=None, type='endpoint', section_to=None):
- """Merge values from the given section with those from the default."""
- def _merge_value(k, v, s, r, n):
- merge_value(key if key else k, v, s, r, n, type, section_to)
-
- # if no value or section return the merge_value
- # function with the enclosed key and type
- if not val and not section:
- return _merge_value
-
- # should return a single value section list
- sect = sip.section(section)[0]
- # for each merged value add it to res_sip.conf
- for i in sect.get_merged(key):
- set_value(key, i, section_to if section_to else section,
- res_sip, nmapped, type)
-
-def is_in(s, sub):
- """Returns true if 'sub' is in 's'"""
- return s.find(sub) != -1
-
-def non_mapped(nmapped):
- def _non_mapped(section, key, val):
- """Writes a non-mapped value from sip.conf to the non-mapped object."""
- if section not in nmapped:
- nmapped[section] = astconfigparser.Section()
- if isinstance(val, list):
- for v in val:
- # since coming from sip.conf we can assume
- # single section lists
- nmapped[section][0][key] = v
- else:
- nmapped[section][0][key] = val
- return _non_mapped
-
-###############################################################################
-### mapping functions -
-### define f(key, val, section) where key/val are the key/value pair to
-### write to given section in res_sip.conf
-###############################################################################
-
-def set_dtmfmode(key, val, section, res_sip, nmapped):
- """Sets the dtmfmode value. If value matches allowable option in res_sip
- then map it, otherwise set it to none.
- """
- # available res_sip.conf values: frc4733, inband, info, none
- if val != 'inband' or val != 'info':
- nmapped(section, key, val + " ; did not fully map - set to none")
- val = 'none'
- set_value(key, val, section, res_sip, nmapped)
-
-def from_nat(key, val, section, res_sip, nmapped):
- """Sets values from nat into the appropriate res_sip.conf options."""
- # nat from sip.conf can be comma separated list of values:
- # yes/no, [auto_]force_rport, [auto_]comedia
- if is_in(val, 'yes'):
- set_value('rtp_symmetric', 'yes', section, res_sip, nmapped)
- set_value('rewrite_contact', 'yes', section, res_sip, nmapped)
- if is_in(val, 'comedia'):
- set_value('rtp_symmetric', 'yes', section, res_sip, nmapped)
- if is_in(val, 'force_rport'):
- set_value('force_rport', 'yes', section, res_sip, nmapped)
- set_value('rewrite_contact', 'yes', section, res_sip, nmapped)
-
-def set_timers(key, val, section, res_sip, nmapped):
- """Sets the timers in res_sip.conf from the session-timers option
- found in sip.conf.
- """
- # res_sip.conf values can be yes/no, required, always
- if val == 'originate':
- set_value('timers', 'always', section, res_sip, nmapped)
- elif val == 'accept':
- set_value('timers', 'required', section, res_sip, nmapped)
- elif val == 'never':
- set_value('timers', 'no', section, res_sip, nmapped)
- else:
- set_value('timers', 'yes', section, res_sip, nmapped)
-
-def set_direct_media(key, val, section, res_sip, nmapped):
- """Maps values from the sip.conf comma separated direct_media option
- into res_sip.conf direct_media options.
- """
- if is_in(val, 'yes'):
- set_value('direct_media', 'yes', section, res_sip, nmapped)
- if is_in(val, 'update'):
- set_value('direct_media_method', 'update', section, res_sip, nmapped)
- if is_in(val, 'outgoing'):
- set_value('directed_media_glare_mitigation', 'outgoing', section, res_sip, nmapped)
- if is_in(val, 'nonat'):
- set_value('disable_directed_media_on_nat','yes', section, res_sip, nmapped)
- if (val == 'no'):
- set_value('direct_media', 'no', section, res_sip, nmapped)
-
-def from_sendrpid(key, val, section, res_sip, nmapped):
- """Sets the send_rpid/pai values in res_sip.conf."""
- if val == 'yes' or val == 'rpid':
- set_value('send_rpid', 'yes', section, res_sip, nmapped)
- elif val == 'pai':
- set_value('send_pai', 'yes', section, res_sip, nmapped)
-
-def set_media_encryption(key, val, section, res_sip, nmapped):
- """Sets the media_encryption value in res_sip.conf"""
- if val == 'yes':
- set_value('media_encryption', 'sdes', section, res_sip, nmapped)
-
-def from_recordfeature(key, val, section, res_sip, nmapped):
- """If record on/off feature is set to automixmon then set
- one_touch_recording, otherwise it can't be mapped.
- """
- if val == 'automixmon':
- set_value('one_touch_recording', 'yes', section, res_sip, nmapped)
- else:
- nmapped(section, key, val + " ; could not be fully mapped")
-
-def from_progressinband(key, val, section, res_sip, nmapped):
- """Sets the inband_progress value in res_sip.conf"""
- # progressinband can = yes/no/never
- if val == 'never':
- val = 'no'
- set_value('inband_progress', val, section, res_sip, nmapped)
-
-def from_host(key, val, section, res_sip, nmapped):
- """Sets contact info in an AOR section in in res_sip.conf using 'host'
- data from sip.conf
- """
- # all aors have the same name as the endpoint so makes
- # it easy to endpoint's 'aors' value
- set_value('aors', section, section, res_sip, nmapped)
- if val != 'dynamic':
- set_value('contact', val, section, res_sip, nmapped, 'aor')
- else:
- set_value('max_contacts', 1, section, res_sip, nmapped, 'aor')
-
-def from_subscribemwi(key, val, section, res_sip, nmapped):
- """Checks the subscribemwi value in sip.conf. If yes places the
- mailbox value in mailboxes within the endpoint, otherwise puts
- it in the aor.
- """
- mailboxes = sip.get('mailbox', section, res_sip)
- type = 'endpoint' if val == 'yes' else 'aor'
- set_value('mailboxes', mailboxes, section, res_sip, nmapped, type)
-
-###############################################################################
-
-# options in res_sip.conf on an endpoint that have no sip.conf equivalent:
-# type, rtp_ipv6, 100rel, trust_id_outbound, aggregate_mwi,
-# connected_line_method
-
-# known sip.conf peer keys that can be mapped to a res_sip.conf section/key
-peer_map = [
- # sip.conf option mapping function res_sip.conf option(s)
- ###########################################################################
- ['context', set_value],
- ['dtmfmode', set_dtmfmode],
- ['disallow', merge_value],
- ['allow', merge_value],
- ['nat', from_nat], # rtp_symmetric, force_rport,
- # rewrite_contact
- ['icesupport', set_value('ice_support')],
- ['autoframing', set_value('use_ptime')],
- ['outboundproxy', set_value('outbound_proxy')],
- ['mohsuggest', set_value],
- ['session-timers', set_timers], # timers
- ['session-minse', set_value('timers_min_se')],
- ['session-expires', set_value('timers_sess_expires')],
- ['externip', set_value('external_media_address')],
- ['externhost', set_value('external_media_address')],
- # identify_by ?
- ['directmedia', set_direct_media], # direct_media
- # direct_media_method
- # directed_media_glare_mitigation
- # disable_directed_media_on_nat
- ['callerid', set_value], # callerid
- ['callingpres', set_value('callerid_privacy')],
- ['cid_tag', set_value('callerid_tag')],
- ['trustpid', set_value('trust_id_inbound')],
- ['sendrpid', from_sendrpid], # send_pai, send_rpid
- ['send_diversion', set_value],
- ['encrpytion', set_media_encryption],
- ['use_avpf', set_value],
- ['recordonfeature', from_recordfeature], # automixon
- ['recordofffeature', from_recordfeature], # automixon
- ['progressinband', from_progressinband], # in_band_progress
- ['callgroup', set_value],
- ['pickupgroup', set_value],
- ['namedcallgroup', set_value],
- ['namedpickupgroup', set_value],
- ['busylevel', set_value('devicestate_busy_at')],
-
-############################ maps to an aor ###################################
-
- ['host', from_host], # contact, max_contacts
- ['subscribemwi', from_subscribemwi], # mailboxes
- ['qualifyfreq', set_value('qualify_frequency', type='aor')],
-
-############################# maps to auth#####################################
-# type = auth
-# username
-# password
-# md5_cred
-# realm
-# nonce_lifetime
-# auth_type
-######################### maps to acl/security ################################
-
- ['permit', merge_value(type='security', section_to='acl')],
- ['deny', merge_value(type='security', section_to='acl')],
- ['acl', merge_value(type='security', section_to='acl')],
- ['contactpermit', merge_value(type='security', section_to='acl')],
- ['contactdeny', merge_value(type='security', section_to='acl')],
- ['contactacl', merge_value(type='security', section_to='acl')],
-
-########################### maps to transport #################################
-# type = transport
-# protocol
-# bind
-# async_operations
-# ca_list_file
-# cert_file
-# privkey_file
-# password
-# external_signaling_address - externip & externhost
-# external_signaling_port
-# external_media_address
-# domain
-# verify_server
-# verify_client
-# require_client_cert
-# method
-# cipher
-# localnet
-######################### maps to domain_alias ################################
-# type = domain_alias
-# domain
-######################### maps to registration ################################
-# type = registration
-# server_uri
-# client_uri
-# contact_user
-# transport
-# outbound_proxy
-# expiration
-# retry_interval
-# max_retries
-# auth_rejection_permanent
-# outbound_auth
-########################### maps to identify ##################################
-# type = identify
-# endpoint
-# match
-]
-
-def map_peer(sip, section, res_sip, nmapped):
- for i in peer_map:
- try:
- # coming from sip.conf the values should mostly be a list with a
- # single value. In the few cases that they are not a specialized
- # function (see merge_value) is used to retrieve the values.
- i[1](i[0], sip.get(section, i[0])[0], section, res_sip, nmapped)
- except LookupError:
- pass # key not found in sip.conf
-
-def find_non_mapped(sections, nmapped):
- for section, sect in sections.iteritems():
- try:
- # since we are pulling from sip.conf this should always
- # be a single value list
- sect = sect[0]
- # loop through the section and store any values that were not mapped
- for key in sect.keys(True):
- for i in peer_map:
- if i[0] == key:
- break;
- else:
- nmapped(section, key, sect[key])
- except LookupError:
- pass
-
-def convert(sip, filename, non_mappings):
- res_sip = astconfigparser.MultiOrderedConfigParser()
- non_mappings[filename] = astdicts.MultiOrderedDict()
- nmapped = non_mapped(non_mappings[filename])
- for section in sip.sections():
- if section == 'authentication':
- pass
- else:
- map_peer(sip, section, res_sip, nmapped)
-
- find_non_mapped(sip.defaults(), nmapped)
- find_non_mapped(sip.sections(), nmapped)
-
- for key, val in sip.includes().iteritems():
- res_sip.add_include(PREFIX + key, convert(val, PREFIX + key, non_mappings)[0])
- return res_sip, non_mappings
-
-def write_res_sip(filename, res_sip, non_mappings):
- try:
- with open(filename, 'wt') as fp:
- fp.write(';--\n')
- fp.write(';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n')
- fp.write('Non mapped elements start\n')
- fp.write(';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n')
- astconfigparser.write_dicts(fp, non_mappings[filename])
- fp.write(';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n')
- fp.write('Non mapped elements end\n')
- fp.write(';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n')
- fp.write('--;\n\n')
- # write out include file(s)
- for key, val in res_sip.includes().iteritems():
- write_res_sip(key, val, non_mappings)
- fp.write('#include "%s"\n' % key)
- fp.write('\n')
- # write out mapped data elements
- astconfigparser.write_dicts(fp, res_sip.defaults())
- astconfigparser.write_dicts(fp, res_sip.sections())
-
- except IOError:
- print "Could not open file ", filename, " for writing"
-
-###############################################################################
-
-def cli_options():
- global PREFIX
- usage = "usage: %prog [options] [input-file [output-file]]\n\n" \
- "input-file defaults to 'sip.conf'\n" \
- "output-file defaults to 'res_sip.conf'"
- parser = optparse.OptionParser(usage=usage)
- parser.add_option('-p', '--prefix', dest='prefix', default=PREFIX,
- help='output prefix for include files')
-
- options, args = parser.parse_args()
- PREFIX = options.prefix
-
- sip_filename = args[0] if len(args) else 'sip.conf'
- res_sip_filename = args[1] if len(args) == 2 else 'res_sip.conf'
-
- return sip_filename, res_sip_filename
-
-if __name__ == "__main__":
- sip_filename, res_sip_filename = cli_options()
- # configuration parser for sip.conf
- sip = astconfigparser.MultiOrderedConfigParser()
- sip.read(sip_filename)
- res_sip, non_mappings = convert(sip, res_sip_filename, dict())
- write_res_sip(res_sip_filename, res_sip, non_mappings)