-
-
Save lgaetz/8545099 to your computer and use it in GitHub Desktop.
| <?php | |
| /**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** | |
| * remotehintpoll.php | |
| * | |
| * Created by Lorne Gaetz lgaetz@sangoma.com | |
| * | |
| * Latest version: https://gist.github.com/lgaetz/8545099 | |
| * | |
| * Licensed under GNU GPL version 2 or any later verison. | |
| * | |
| * Usage: | |
| * This script is intended to be used on a local FreePBX system running version 2.9 or higher. When | |
| * executed, the script polls a remote Asterisk server using remote Asterisk Manager Interface | |
| * (AMI) credentials, checks the status of a specific extension number on the remote server, and | |
| * then updates a local hint to the same value. | |
| * | |
| * Asterisk configuration: | |
| * Define a dynamic hint on the local system of the same format as what is dialled to reach an | |
| * extension on the remote system. If remote extensions are of the format 10XX and you use a dial | |
| * prefix of 55 to dial remote extensions, the local dynamic hint is defined in extensions_custom.conf as: | |
| * | |
| * [from-internal-custom] | |
| * exten => _5510XX,hint,Custom:Remote${EXTEN:2} // program BLF with e.g. 551001 | |
| * | |
| * If you don't dial a prefix to reach the remote extensions from the local pbx, the hint looks like: | |
| * | |
| * [from-internal-custom] | |
| * exten => _10XX,hint,Custom:Remote${EXTEN} // program BLF with e.g. 1001 | |
| * | |
| * Version history: | |
| * 2014-01-21 Initial commit for single extension | |
| * 2017-06-22 Add support to poll a range of extensions and update a local dynamic hint | |
| * | |
| **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****/ | |
| // set to true to echo debug | |
| $debug=true; | |
| // Set the local device prefix for the local hint, must match what is defined in extensions_custom.conf for the hint | |
| // the $device_prefix will be used to prefix the remote extension number for the hint | |
| $device_prefix = "Custom:Remote"; | |
| // Remote server host/IP, AMI credentials and | |
| $remote_server = "hostname_placeholder"; | |
| $remote_name = "name"; | |
| $remote_secret = "password"; | |
| $remote_context = "from-internal"; | |
| // define range or remote extension numbers to poll, the fewer the better | |
| // the range needs to match the dynamic hint noted above | |
| $remote_extension_start='1000'; | |
| $remote_extension_end='1010'; | |
| // Connect to local machine with FreePBX bootstrap, requires FreePBX 2.9 or higher | |
| if (!@include_once(getenv('FREEPBX_CONF') ? getenv('FREEPBX_CONF') : '/etc/freepbx.conf')) { | |
| include_once('/etc/asterisk/freepbx.conf'); | |
| } | |
| // connect to remote Asterisk machine using AMI credentials and get status of Extension 103 | |
| $remote = new AGI_AsteriskManager(); | |
| if ($remote->connect($remote_server, $remote_name, $remote_secret)) { | |
| for ($remote_extension=$remote_extension_start; $remote_extension<=$remote_extension_end; $remote_extension++) { | |
| $foo[$remote_extension] = $remote->ExtensionState($remote_extension, $remote_context); | |
| } | |
| $remote->disconnect(); | |
| } | |
| else { | |
| output("Can not connect to remote AGI"); | |
| } | |
| // print_r($foo); //for debug | |
| // Based on value of remote extension status, change local custom device state to match | |
| // edit $device to reflect name of local custom device as defined in extensions_custom.conf | |
| // in the [from-internal-custom] section add a line similar to: | |
| // exten => 103,hint,Custom:Remote103 | |
| // Make sure that the number does not conflict with something else | |
| if($astman->connected()) { | |
| for ($remote_extension=$remote_extension_start; $remote_extension<=$remote_extension_end; $remote_extension++) { | |
| switch ($foo[$remote_extension]['Status']) { | |
| case -1: | |
| output("$remote_extension Extension not found"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' UNKNOWN'); | |
| break; | |
| case 0: | |
| output("$remote_extension Idle"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' NOT_INUSE'); | |
| break; | |
| case 1: | |
| output("$remote_extension In Use"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' INUSE'); | |
| break; | |
| case 2: | |
| output("$remote_extension Busy"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' BUSY'); | |
| break; | |
| case 4: | |
| output("$remote_extension Unavailable"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' UNAVAILABLE'); | |
| break; | |
| case 8: | |
| output("$remote_extension Ringing"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' RINGING'); | |
| break; | |
| case 9: | |
| output("$remote_extension Ringing"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' RINGING'); | |
| break; | |
| case 16: | |
| output("$remote_extension On Hold"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' ONHOLD'); | |
| break; | |
| default: | |
| output("$remote_extension Extension not found"); | |
| $cmd = $astman->Command('devstate change '.$device_prefix.$remote_extension.' UNKNOWN'); | |
| } | |
| } | |
| } else { | |
| output("Can not connect to local AGI"); | |
| } | |
| function output($string){ | |
| global $debug; | |
| if ($debug) { | |
| echo $string."\n"; | |
| } | |
| } |
Have you thought of adding the ability for multiple ranges?
1100-1150
2100-2150
@juesor check this script out https://gist.github.com/Ferbla/523b15b9e13275c3b7510be45643c225
OMG Ferbla that is awesome. All i had to do was create a data.csv with two column's.
Layout was as follows.
1100,1120
1122
1124,1150
2100,2150
Now i am watching 1100-1150 omitting 1121 and 1123 and 2100-2150
Thanks @Ferbla for thinking of this setup.
I've 2 Asterisk 13 Servers, i want so sync with your script.
But if i run it there are many errors...:
PHP Warning: include_once(/etc/asterisk/freepbx.conf): failed to open stream: No such file or directory in /root/hintpoll/new/remotehintpoll.php on line 55 PHP Warning: include_once(): Failed opening '/etc/asterisk/freepbx.conf' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /root/hintpoll/new/remotehintpoll.php on line 55 PHP Fatal error: Class 'AGI_AsteriskManager' not found in /root/hintpoll/new/remotehintpoll.php on line 59
Can you help me ?
EDIT:
Okay, I've included the Class phpagi now.
Now my errors are:
PHP Warning: include_once(/etc/asterisk/freepbx.conf): failed to open stream: No such file or directory in /root/hintpoll/remotehintpoll.php on line 69 PHP Warning: include_once(): Failed opening '/etc/asterisk/freepbx.conf' for inclusion (include_path='.:/usr/share/php:/usr/share/pear') in /root/hintpoll/remotehintpoll.php on line 69 Wed, 16 Aug 2017 18:40:14 +0200 - Got event.. fullybooted Wed, 16 Aug 2017 18:40:14 +0200 - No event handler for event 'fullybooted' PHP Notice: Undefined variable: astman in /root/hintpoll/remotehintpoll.php on line 92 PHP Fatal error: Call to a member function connected() on null in /root/hintpoll/remotehintpoll.php on line 92
Did you create the user manage the remote systems?
Settings > Asterisk Manager Settings.
Add manager and set permit to the IP of the other server on both sides.
Add that servers IP to the $remote_server
Add that manager to the $remote_name.
Add that managers password as $remote_secret
$remote_server = "hostname_placeholder";
$remote_name = "name";
$remote_secret = "password";
From there you need to create customer extensions context
vim /etc/asterisk/extensions_custom.conf and make sure all of your remote extensions are created and look like the following.
exten => _4000,hint,Custom:Remote${EXTEN}
exten => _4001,hint,Custom:Remote${EXTEN}
...
exten => _4009,hint,Custom:Remote${EXTEN}
exten => _4010,hint,Custom:Remote${EXTEN}
I also needed to toggle hints.
In FreePBX Web GUI Go to Settings > Advanced Settings
Dynamically Generate Hints
Toggle Yes/No and toggle it back. Apply in between.
Then all my phones now toggle ringing and talking. Hope this helps.
Future feature:
The $remote_extension variable should accept a comma separated list of remote extensions which would be exploded (and trimmed!) into an array. Then using for_each, $foo becomes an array of values of remote extensions' statuses.