Review Board 1.7.16


Group Variables

Review Request #464 - Created Jan. 14, 2010 and updated

kobaz
trunk
16614
Reviewers
asterisk-dev
Asterisk
This patch allows for setting variables on a group of channels.
First a channel is assigned a group via dialplan GROUP() or GroupSet via the ami (new command)
Then, variables can be set on that group with the GROUP_VAR() dialplan function, or GroupVarSet in the manager

This patch also adds manager events for channel group changes, and variable updates

When a group is no longer used (all channels referencing the group are hung up, or all channels referencing the group have their group changed/unset), variables are destroyed

new manager commands:
GroupSet - adds functionality to the manager to be able to set a GROUP() on a channel.
GroupsShowChannels - show each channel and it's associated groups (a channel will be repeated for each group@category it's a member of)
GroupsShowVariables - show variables in each group@category, one event per group, all variables are contained in each group@category event
GroupVarSet - set a group variable (the group has to exist)
GroupVarGet - get a group variable

new manager events:
GroupCreate
GroupChannelAdd
GroupChannelRemove
GroupDestroy
GroupVarSet

Example AMI:
Action: GroupVarSet
Group: 1000
Category: ConferenceBridge
Variable: LastUpdateCheck
Value: 1263502512

Example CLI:
demo1*CLI> group show variables
Group    Variables    Category
1000            ConferenceBridge
    LastUpdateCheck=1263502512
1000            ConferenceModerator
2 active groups


Adds support for:
  Group variables
     dialplan access: GROUP_VAR()
     cli access: group show variables
     manager access: GroupVarSet GroupVarGet
  Group information: 
     manager access: GroupSet GroupsShow GroupsShowChannels GroupsShowVariables
  
dialplan:
    Set(GROUP()=foo);
    Set(GROUP()=foobar@foocat);

    Set(GROUP_VAR(foo,myvar)=123);
    Set(GROUP_VAR(foo,myvar2)=456);
    NoOp(${GROUP_VAR(foo,myvar)});
    NoOp(${GROUP_VAR(foo,myvar2)});

    Set(GROUP_VAR(foobar@foocat,myvar)=123);
    NoOp(${GROUP_VAR(foobar@foocat,myvar)});

    Set(GROUP_VAR(something,myvar)=123);
    NoOp(${GROUP_VAR(something,myvar)});

    Wait(10000);
    Hangup();


CLI:
-------------------
> group show channels
-------------------
channel                    Group                 Category
IAX2/branch-15569          foo                   (default)
IAX2/branch-15569          foobar                foocat
2 active channels

-------------------
> group show variables
-------------------
Group    Variables    Category
foo                   (Default)
     myvar2=456
     myvar=123
foobar                foocat
     myvar=123
2 active groups


AMI:
-------------------
Action: GroupsShow
-------------------
Response: Success
Eventlist: start
Message: Groups will follow

Event: GroupsShow
Group: foo
Category:

Event: GroupsShow
Group: foobar
Category: foocat

Event: GroupsShowComplete
EventList: Complete
ListItems: 2


-------------------
Action: GroupsShowChannels
-------------------
Response: Success
Eventlist: start
Message: Group channels will follow

Event: GroupsShowChannels
Group: foo
Category:
Channel: IAX2/branch-14981

Event: GroupsShowChannels
Group: foobar
Category: foocat
Channel: IAX2/branch-14981

Event: GroupsShowChannelsComplete
EventList: Complete
ListItems: 2




-------------------
Action: GroupsShowVariables
-------------------
Response: Success
Eventlist: start
Message: Group variables will follow

Event: GroupsShowVariables
Group: foo
Category:
VariablesStart: Variables will follow
myvar2: 456
myvar: 123


Event: GroupsShowVariables
Group: foobar
Category: foocat
VariablesStart: Variables will follow
myvar: 123

Event: GroupsShowVariablesComplete
EventList: Complete
ListItems: 2


-------------------
Action: GroupVarGet
Group: foo
Variable: myvar
-------------------
Response: Success
Message: Result will follow

Event: GroupVarGetResponse
Group: foo
Category:
Variable: myvar
Value: 123


-------------------
Action: GroupVarSet
Group: foobar
Category: foocat
Variable: something
Value: 1238091283123
-------------------

Response: Success
Message: Variable Set


-------------------
Action: GroupVarSet
Group: doesntexist
Category: foocat
Variable: something
Value: 1238091283123
-------------------

Response: Error
Message: Variable set failed (group doesn't exist)
Total:
25
Open:
1
Resolved:
24
Dropped:
0
Status:
From:
Description From Last Updated Status
This is probably going to be the most painful point when trying to update this patch further. Manager events in ... Mark Michelson Aug. 23, 2013, 2:41 p.m. Open
Review request changed
Updated (Aug. 30, 2013, 3:10 p.m.)
Posted (Aug. 30, 2013, 3:23 p.m.)
Since reviewboard lost my 300 word text after uploading a new diff here it is again...

Updated CHANGES to reflect new functionality added

Through testing and development I've noticed a bit of a problem with the implementation of GROUP_COUNT and GROUP_MATCH_COUNT

Say you have the following dialplan:
Set(GROUP()=foo);
Set(GROUP()=foo@bar);
Set(GROUP()=foo@baz);
DumpGroups();
NoOp(---GROUP_COUNT---);
NoOp(foo: ${GROUP_COUNT(foo)});
NoOp(foo@: ${GROUP_COUNT(foo@)});
NoOp(@bar: ${GROUP_COUNT(.*@bar)});
NoOp(@baz: ${GROUP_COUNT(.*@baz)});
NoOp(foo@bar: ${GROUP_COUNT(foo)});
NoOp(foo@baz: ${GROUP_COUNT(foo)});

When executed you get:
    -- Executing [44@cos_internal+local+ld:1] Set("SIP/6255-00000000", "__DialedNumber=44") in new stack
    -- Executing [44@cos_internal+local+ld:2] Goto("SIP/6255-00000000", "_cos_internal+local+ld,44,1") in new stack
    -- Goto (_cos_internal+local+ld,44,1)
    -- Executing [44@_cos_internal+local+ld:1] Set("SIP/6255-00000000", "GROUP()=foo") in new stack
    -- Executing [44@_cos_internal+local+ld:2] Set("SIP/6255-00000000", "GROUP()=foo@bar") in new stack
    -- Executing [44@_cos_internal+local+ld:3] Set("SIP/6255-00000000", "GROUP()=foo@baz") in new stack
    -- Executing [44@_cos_internal+local+ld:4] DumpGroups("SIP/6255-00000000", "") in new stack
================================================================================
Channel                         Group                 Category

SIP/6255-00000000               foo                   (default)
SIP/6255-00000000               foo                   bar
SIP/6255-00000000               foo                   baz
3 active channels in groups
-----------------------------------
Group     Variables    Category
foo                      (default)
foo                      bar
foo                      baz
================================================================================
    -- Executing [44@_cos_internal+local+ld:6] NoOp("SIP/6255-00000000", "---GROUP_COUNT---") in new stack
    -- Executing [44@_cos_internal+local+ld:5] NoOp("SIP/6255-00000000", "foo: 3") in new stack
    -- Executing [44@_cos_internal+local+ld:7] NoOp("SIP/6255-00000000", "foo@: 3") in new stack
    -- Executing [44@_cos_internal+local+ld:8] NoOp("SIP/6255-00000000", "@bar: 0") in new stack
    -- Executing [44@_cos_internal+local+ld:9] NoOp("SIP/6255-00000000", "@baz: 0") in new stack
    -- Executing [44@_cos_internal+local+ld:10] NoOp("SIP/6255-00000000", "foo@bar: 3") in new stack
    -- Executing [44@_cos_internal+local+ld:11] NoOp("SIP/6255-00000000", "foo@baz: 3") in new stack

The count returned is 3 !!!

To me this is clearly a bug, especially with the counts of foo@bar and foo@baz, which should be 1

There's a new function I added: GROUP_CHANNELS_MATCH_COUNT() which correctly counts channels in groups, versus occurrences of groups.

    -- Executing [44@_cos_internal+local+ld:27] NoOp("SIP/6255-00000000", "---GROUP_CHANNELS_MATCH_COUNT---") in new stack
    -- Executing [44@_cos_internal+local+ld:28] NoOp("SIP/6255-00000000", "foo: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:29] NoOp("SIP/6255-00000000", "foo@: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:30] NoOp("SIP/6255-00000000", "@bar: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:31] NoOp("SIP/6255-00000000", "@baz: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:32] NoOp("SIP/6255-00000000", "foo@bar: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:33] NoOp("SIP/6255-00000000", "foo@baz: 1") in new stack
    -- Executing [44@_cos_internal+local+ld:34] NoOp("SIP/6255-00000000", "something: 0") in new stack
    -- Executing [44@_cos_internal+local+ld:35] NoOp("SIP/6255-00000000", "something@: 0") in new stack
    -- Executing [44@_cos_internal+local+ld:36] NoOp("SIP/6255-00000000", "something@nothing: 0") in new stack
    -- Executing [44@_cos_internal+local+ld:37] NoOp("SIP/6255-00000000", "@nothing: 0") in new stack

I think the code behind GROUP_CHANNELS_MATCH_COUNT should replace GROUP_COUNT, especially because of the instructions from sip.conf which read:
For call-limit:
; There is no combined call counter for a "friend"
; so there's currently no way in sip.conf to limit
; to one inbound or outbound call per phone. Use
; the group counters in the dial plan for that.

Case in point: If an asterisk user who does not understand the quirky internals of GROUP_COUNT wishes to use it to nail down strict capacity limits, they are in for some confusion if they are using group categories and the current GROUP_COUNT().

https://reviewboard.asterisk.org/ runs on a server provided by Digium, Inc. and uses bandwidth donated to the open source Asterisk community by API Digital Communications in Huntsville, AL USA.
Please report problems with this site to asteriskteam@digium.com.