<html>
<body>
<div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
<table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 solid;">
<tr>
<td>
This is an automatically generated e-mail. To reply, visit:
<a href="https://reviewboard.asterisk.org/r/4165/">https://reviewboard.asterisk.org/r/4165/</a>
</td>
</tr>
</table>
<br />
<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" style="background-image: url('https://reviewboard.asterisk.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); background-position: left top; background-repeat: repeat-x; border: 1px black solid;">
<tr>
<td>
<div>Review request for Asterisk Developers, Joshua Colp, Marquis, and Mark Michelson.</div>
<div>By George Joseph.</div>
<p style="color: grey;"><i>Updated Nov. 12, 2014, 3:08 p.m.</i></p>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Changes</h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Add some logging.
Fixed a leak and a double free.
Fixed a a variable initialization.
Cleaned up some names and formatting.
</pre>
</td>
</tr>
</table>
<div style="margin-top: 1.5em;">
<b style="color: #575012; font-size: 10pt;">Repository: </b>
Asterisk
</div>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">The PJSIP Configuration Wizard allows for creation of simple pjsip scenarios like phone or trunk without having to directly specify individual endpoints, aors, auths, identifies or registrations. The easiest way to demonstrate this is with an example or two from pjsip.conf.sample...
;============EXAMPLE WIZARD CONFIGURATION FOR A PHONE=======================
; This config would create an endpoint, aor with dynamic contact, inbound
; auth and a phoneprov object.
[myphone]
type = wizard
accepts_auth = yes
accepts_registrations = yes
transport = ipv4
aor/max_contacts = 1
inbound_auth/username = testname
inbound_auth/password = test password
endpoint/allow = ulaw
endpoint/context = default
phoneprov/MAC = 001122aa4455
phoneprov/PROFILE = profile1
;============EXAMPLE WIZARD CONFIGURATION FOR AN ITSP TRUNK=================
; This ITSP has 2 servers available and requires registration.
; This config would create an endpoint, an aor with 2 static contacts, an outbound
; auth, an identify with 2 matches, and 2 registrations.
[mytrunk]
type = wizard
sends_auth = yes
sends_registrations = yes
transport = ipv4
; The number of remote_hosts drives the number of contacts, matches and registrations.
remote_hosts = sip1.myitsp.com:5060,sip2.myitsp.com:5060
outbound_auth/username = testname
outbound_auth/password = test password
endpoint/allow = ulaw
endpoint/context = default
pjsip.conf.sample has more details.
The history of the wizard approach can be found in the following 2 threads...
http://lists.digium.com/pipermail/asterisk-dev/2014-September/070426.html
http://lists.digium.com/pipermail/asterisk-dev/2014-October/070616.html
THEORY OF OPERATION:
N.B.: There are two kinds of wizards referenced here: The existing sorcery wizards which provide the storage back ends like res_sorcery_config and res_sorcery_realtime, and this new pjsip config wizard. The new module implements both a new sorcery wizard and the pjsip wizard.
The wizard is implemented in a single module but did require a few tweaks to other res_pjsip modules and sorcery itself. There are 2 parts to this module, the config wizard and the sorcery wizard. When the module loads, the config wizard part loads pjsip.conf and pulls in all of the 'wizard' object types. Assuming they're all semantically valid, the module then registers itself as a sorcery wizard. The sorcery wizard part provides a sorcery back end almost exactly like res_sorcery_memory. A change was made to each of the pjsip modules so that as they load, they apply wizard mappings from not only sorcery.conf and pjsip.conf, but also from the new 'pjsip_wizard' sorcery wizard. The result is that then they call ast_sorcery_load_object, sorcery also pulls objects from the pjsip_wizard after it's pulled them from pjsip.conf. That in turn causes pjsip_wizard to create auths, aors, endpoints, identifies, registrations and phoneprovs from the data it collected earlier. pjsip is none the wiser about where the objects came from and all AMI, ARI, CLI etc. operate as normal.
SUMMARY OF CHANGES MADE:
* The new res_pjsip_config_wizard module was created.
* An existing internal sorcery api was exposed as ast_sorcery_apply_wizard_mapping to allow the addition of a new wizard to an object type. The underlying plumbing was already there.
* config_auth, location, pjsip_configuration, res_pjsip_endpoint_identifier_ip, res_pjsip_outbound_registration and res_pjsip_phoneprov_provider were all modified to call ast_sorcery_apply_wizard_mapping after calling ast_sorcery_apply_default.
* res_pjsip_phoneprov_provider needed a little more work to be compatible.
RELOADABILITY:
I've done my best to make the new module properly unload and reload but there are issues with the rest of the pjsip modules that make this tricky. Further work will be needed for consistent module operations across all of pjsip.
BACKWARDS COMPATIBILITY:
This module does not change any existing functionality. Discrete objects and wizards may both exist in a single pjsip.conf file. If the res_pjsip_config_wizard module isn't loaded, the wizard types will just be ignored. If the module is loaded but there are no wizard types in pjsip.conf, it stays loaded but empty. Once created by the wizard, pjsip objects are indistinguishable from ones created discretely.
OTHER:
Even though the new module provides a sorcery wizard, it can get its own wizard objects from other wizards like realtime or astdb using sorcery.conf.</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Test suite tests are in development that will use the wizard to create objects and AMI to read the results. For instance, endpoint objects created by the wizard should be indistinguishable from endpoint objects created directly. They will be posted shortly.
I've converted my own PBX to use the wizard approach and phones and trunks operate normally.
The CLI and AMI return results indistinguishable from discretely defined objects.
</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> (updated)</h1>
<ul style="margin-left: 3em; padding-left: 0;">
<li>branches/12/res/res_pjsip_phoneprov_provider.c <span style="color: grey">(427761)</span></li>
<li>branches/12/res/res_pjsip_outbound_registration.c <span style="color: grey">(427761)</span></li>
<li>branches/12/res/res_pjsip_endpoint_identifier_ip.c <span style="color: grey">(427761)</span></li>
<li>branches/12/res/res_pjsip_config_wizard.c <span style="color: grey">(PRE-CREATION)</span></li>
<li>branches/12/res/res_pjsip/pjsip_configuration.c <span style="color: grey">(427761)</span></li>
<li>branches/12/res/res_pjsip/location.c <span style="color: grey">(427761)</span></li>
<li>branches/12/res/res_pjsip/config_auth.c <span style="color: grey">(427761)</span></li>
<li>branches/12/main/sorcery.c <span style="color: grey">(427761)</span></li>
<li>branches/12/include/asterisk/sorcery.h <span style="color: grey">(427761)</span></li>
<li>branches/12/configs/pjsip.conf.sample <span style="color: grey">(427761)</span></li>
</ul>
<p><a href="https://reviewboard.asterisk.org/r/4165/diff/" style="margin-left: 3em;">View Diff</a></p>
</td>
</tr>
</table>
</div>
</body>
</html>