[asterisk-dev] AMI and Sorcery

Joshua Colp jcolp at digium.com
Thu Feb 13 06:38:57 CST 2014


On 14-02-12 03:26 AM, George Joseph wrote:
> In the process of creating the dialplan function AST_SORCERY (a
> companion to AST_CONFIG) I've run into an issue with how AMI interacts
> with sorcery particularly related to objects that can have multiple
> occurrences of the same field like contact in aor and match in identify.

<snip>

> 
> Notice the inconsistency?   In the config, both contact and match are
> singular but in the output, Contacts is plural, Match is singular.   The
> difference comes from how the 2 objects construct the AMI event.
>  Contact has custom code that spits out the literal "Contacts:" then the
> list, whereas Identify uses the generic sorcery code which spits out the
> name of the field (hence the singular) and the list.
> 
> If the fact that one is plural and the other is singular is a bug, tell
> me which is correct (hopefully the singular, see below) and you don't
> have to read further unless you've got some time to kill.  If it's a
> feature, read on...

The returned name should be the name of the field, thus contact.

> Background:
> 
> On Monday I started work on the AST_SORCERY dialplan function which
> allows you to retrieve arbitrary fields from a sorcery based config like
> pjsip.conf.  The function itself is quite simple.  Basically, it calls
> ast_sorcery_objectset_create and iterates over the resulting
> ast_variable list to find the field of interest.  Works great for single
> occurrence fields but as I found out, not at all for multiple occurrence
> fields like aor's contacts and identify's matches.  As it turns out, the
> structure that defines a sorcery field does have a virtual function
> member for returning multiple occurrence fields as an ast_variable list
> but none of the objects implement it and besides, none of the
> ast_sorcery_object_field_register functions allow you to set it.  In the
> end, without coding object-specific logic in AST_SORCERY, there was no
> way to retrieve the multiple occurrence fields because
> ast_sorcery_objectset_create wasn't returning them.

The multiple_fields functionality is actually exposed, just only through
the regex support.

> Well, I fixed all of that and now ast_sorcery_objectset_create can
> return an ast_variable list with as many entries for contact and match
> (and any others) as there are entries in the conf file.   Works
> great...except for the AMI.   I'm told that that an AMI event can't have
> multiple fields with the same name so multiple Contact or Match fields
> wouldn't work.  Ok, you've always been able to register a handler that
> spits out a single string for multiple occurrences and you can now tell
> ast_sorcery_objectset_create which behavior you want.  Except (to bring
> this back to the beginning), that would change the hard coded "Contacts"
> in the event to the generically generated "Contact". :)

Do you have unit tests for that? :D

> So, can I remove the "s"?  Can I, Please??  Or I guess I can still use
> the generic code and do a search and replace in the AMI output buffer
> and add the "s" back in.

I suppose the question really is... do we make this incompatible with
the past.

> Either way, this'll be good background info for why a patch to add 1
> simple dialplan function is as complex as it is.
> 
> Bonus Question:  Why are aors and auths specified as a single
> comma-separated string where contacts and matches are specified on
> multiple lines?

Hilarity, that's why. Okay, not really. No immediate answer springs to mind.

-- 
Joshua Colp
Digium, Inc. | Senior Software Developer
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
Check us out at:  www.digium.com  & www.asterisk.org



More information about the asterisk-dev mailing list