diff options
Diffstat (limited to 'bin/build_exten.php')
-rwxr-xr-x | bin/build_exten.php | 790 |
1 files changed, 0 insertions, 790 deletions
diff --git a/bin/build_exten.php b/bin/build_exten.php deleted file mode 100755 index e55df4b3f..000000000 --- a/bin/build_exten.php +++ /dev/null @@ -1,790 +0,0 @@ -#!/usr/bin/php -q -<?php /* $Id: build_exten.php,v 1.1 2010-03-26 02:19:16 ivan Exp $ */ -//Copyright (C) 2008 Astrogen LLC -// -//This program is free software; you can redistribute it and/or -//modify it under the terms of the GNU General Public License -//as published by the Free Software Foundation; either version 2 -//of the License, or (at your option) any later version. -// -//This program is distributed in the hope that it will be useful, -//but WITHOUT ANY WARRANTY; without even the implied warranty of -//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -//GNU General Public License for more details. - -function out($text) { - echo $text."\n"; -} - -function outn($text) { - echo $text; -} - -function error($text) { - echo "[ERROR] ".$text."\n"; -} - -function warning($text) { - echo "[WARNING] ".$text."\n"; -} - -function fatal($text) { - echo "[FATAL] ".$text."\n"; - exit(1); -} - -function debug($text) { - global $param_debug; - - if ($param_debug) echo "[DEBUG] ".$text."\n"; -} - -if (! @ include("Console/Getopt.php")) { - fatal("PEAR must be installed (requires Console/Getopt.php). Include path: ".ini_get("include_path")); - exit(12); -} - -ini_set('error_reporting', E_ALL & ~E_NOTICE); - -function showHelp() { - global $argv; - out("USAGE:"); - out(" ".$argv[0]." --create|delete --exten <extension> [optional parameters]"); - out(""); - - out("OPERATIONS (exactly one must be specified):"); - out(" --create, -c"); - out(" Create a new extension"); - out(" --modify, -m"); - out(" Modify an existing extension, the extension must exist and all values execept"); - out(" those specified will remain the same"); - out(" --delete, -d"); - out(" Delete an extension"); - - out("PARAMETERS:"); - out(" --exten extension_number"); - out(" Extension number to create or delete. Must be specified."); - - out("OPTIONAL PARAMETERS:"); - out(" --name name"); - out(" Display Name, defaults to specified extension number."); - out(" --outboundcid cid_number"); - out(" Outbound CID Number, defaults to specified extension number."); - out(" --directdid did_number"); - out(" Direct DID Number, defaults to extension number."); - out(" --vm-password password"); - out(" Voicemail Password, defaults to specified extension number."); - out(" --sip-secret secret"); - out(" SIP Secret, defaults to md5 hash of specified extension number."); - out(" --debug"); - out(" Display debug messages."); - out(" --no-warnings"); - out(" Do Not display warning messages."); - - out(" --help, -h, -? Show this help"); -} - -// **** Parse out command-line options -$shortopts = "cmdh?"; -$longopts = array( - "help", - "debug", - "no-warnings", - "create", - "modify", - "delete", - "exten=", - "outboundcid=", - "directdid=", - "name=", - "sip-secret=", - "vm-password=", -); - -$args = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), $shortopts, $longopts); -if (is_object($args)) { - // assume it's PEAR_ERROR - fatal($args->message); - exit(255); -} - -$no_params = true; - -$param_debug = false; -$param_warnings = true; -$param_create = false; -$param_modify = false; -$param_delete = false; -$param_exten = false; -$param_name = false; -$param_outboundcid = false; -$param_directdid = false; -$param_sip_secret = false; -$param_vm_password = false; - -foreach ($args[0] as $arg) { - $no_params = false; - switch ($arg[0]) { - - case "--help": - case "h": - case "?": - showHelp(); - exit(10); - break; - - case "--debug": - $param_debug = true; - debug("debug mode is enabled"); - break; - - case "--no-warnings": - $param_warnings = false; - break; - - case "--create": - case "c": - $param_create = true; - break; - - case "--modify": - case "m": - $param_modify = true; - break; - - case "--delete": - case "d": - $param_delete = true; - break; - - case "--exten": - $param_exten = true; - $new_exten = $arg[1]; - break; - - case "--outboundcid": - $param_outboundcid = true; - $new_outboundcid = $arg[1]; - break; - - case "--directdid": - $param_directdid = true; - $new_directdid = $arg[1]; - break; - - case "--name": - $param_name = true; - $new_name = $arg[1]; - break; - - case "--sip-secret": - $param_sip_secret = true; - $new_sip_secret = $arg[1]; - break; - - case "--vm-password": - $param_vm_password = true; - $new_vm_password = $arg[1]; - break; - - default: - error("unhandled argument supplied: ".$arg[0].", aborting"); - exit (1); - } -} - -if ($no_params) { - showHelp(); - exit(10); -} -if ($param_create && $param_modify) { - error("Incompatible combination of options, create and modify"); - exit (1); -} -if (!(($param_create || $param_modify) XOR $param_delete)) { - error("Invalid Parameter combination, you must include create or delete and can not do both in one call"); - exit (1); -} -if (!$param_exten) { - error("You must provide an extension number to create or delete an extension"); - exit (1); -} - -if ($param_warnings && $param_create) { - if (!$param_outboundcid) { - $new_outboundcid = $new_exten; - warning("WARNING: No outboundcid specified for extenion, using $new_outboundcid as outboundcid"); - } - if (!$param_directdid) { - $new_directdid = $new_exten; - warning("WARNING: No outboundcid specified for extenion, using $new_outboundcid as outboundcid"); - } - if (!$param_name) { - $new_name = $new_exten; - warning("WARNING: No name specified for extenion, using $new_name as name"); - } - if (!$param_sip_secret) { - $new_sip_secret = md5($new_exten); - warning("WARNING: No sip-secret specified for extenion, using $new_sip_secret as secret"); - } - if (!$param_vm_password) { - $new_vm_password = $new_exten; - warning("WARNING: No vm-password specified for extenion, using $new_vm_password as password"); - } -} - -// Now setup actions and exten how leveraged code expected it -// -$exten = $new_exten; -if ($param_create) { - $actions = "addext/addvm"; -} else if ($param_modify) { - $actions = "modext"; -} else if ($param_delete) { - $actions = "remext"; -} - -/* I don't think I need these but ??? -*/ -$type = 'setup'; -$display = ''; -$extdisplay = null; - -// determine module type to show, default to 'setup' -$type_names = array( - 'tool'=>'Tools', - 'setup'=>'Setup', - 'cdrcost'=>'Call Cost', -); - -define("AMP_CONF", "/etc/amportal.conf"); -$amportalconf = AMP_CONF; - -// bootstrap retrieve_conf by getting the AMPWEBROOT since that is currently where the necessary -// functions.inc.php resides, and then use that parser to properly parse the file and get all -// the defaults as needed. -// -function parse_amportal_conf_bootstrap($filename) { - $file = file($filename); - foreach ($file as $line) { - if (preg_match("/^\s*([\w]+)\s*=\s*\"?([\w\/\:\.\*\%-]*)\"?\s*([;#].*)?/",$line,$matches)) { - $conf[ $matches[1] ] = $matches[2]; - } - } - if ( !isset($conf["AMPWEBROOT"]) || ($conf["AMPWEBROOT"] == "")) { - $conf["AMPWEBROOT"] = "/var/www/html"; - } else { - $conf["AMPWEBROOT"] = rtrim($conf["AMPWEBROOT"],'/'); - } - - return $conf; -} - -$amp_conf = parse_amportal_conf_bootstrap($amportalconf); -if (count($amp_conf) == 0) { - exit (1); -} - - -// Emulate gettext extension functions if gettext is not available -if (!function_exists('_')) { - function _($str) { - return $str; - } -} -if (!function_exists('gettext')) { - function gettext($message) { - return $message; - } -} -if (!function_exists('dgettext')) { - function dgettext($domain, $message) { - return $message; - } -} - -// setup locale -function set_language() { - if (extension_loaded('gettext')) { - if (isset($_COOKIE['lang'])) { - setlocale(LC_ALL, $_COOKIE['lang']); - putenv("LANGUAGE=".$_COOKIE['lang']); - } else { - setlocale(LC_ALL, 'en_US'); - } - bindtextdomain('amp','./i18n'); - bind_textdomain_codeset('amp', 'utf8'); - textdomain('amp'); - } -} -set_language(); - -// systems running on sqlite3 (or pgsql) this function is not available -// instead of changing the whole code, lets hack our own version of this function. -// according to the documentation found here: http://il2.php.net/mysql_real_escape_string -// this shold be enough. -// Fixes ticket: http://freepbx.org/trac/ticket/1963 -if (!function_exists('mysql_real_escape_string')) { - function mysql_real_escape_string($str) { - $str = str_replace( "\x00", "\\" . "\x00", $str ); - $str = str_replace( "\x1a", "\\" . "\x1a", $str ); - $str = str_replace( "\n" , "\\". "\n" , $str ); - $str = str_replace( "\r" , "\\". "\r" , $str ); - $str = str_replace( "\\" , "\\". "\\" , $str ); - $str = str_replace( "'" , "''" , $str ); - $str = str_replace( '"' , '""' , $str ); - return $str; - } -} - -// include base functions - -require_once($amp_conf['AMPWEBROOT']."/admin/functions.inc.php"); -require_once($amp_conf['AMPWEBROOT']."/admin/common/php-asmanager.php"); -$amp_conf = parse_amportal_conf($amportalconf); -if (count($amp_conf) == 0) { - exit (1); -} -$asterisk_conf_file = $amp_conf["ASTETCDIR"]."/asterisk.conf"; -$asterisk_conf = parse_asterisk_conf($asterisk_conf_file); - -ini_set('include_path',ini_get('include_path').':'.$amp_conf['AMPWEBROOT'].'/admin/:'); - -$astman = new AGI_AsteriskManager(); - -// attempt to connect to asterisk manager proxy -if (!isset($amp_conf["ASTMANAGERPROXYPORT"]) || !$res = $astman->connect("127.0.0.1:".$amp_conf["ASTMANAGERPROXYPORT"], $amp_conf["AMPMGRUSER"] , $amp_conf["AMPMGRPASS"])) { - // attempt to connect directly to asterisk, if no proxy or if proxy failed - if (!$res = $astman->connect("127.0.0.1:".$amp_conf["ASTMANAGERPORT"], $amp_conf["AMPMGRUSER"] , $amp_conf["AMPMGRPASS"])) { - // couldn't connect at all - unset( $astman ); - } -} -// connect to database -require_once($amp_conf['AMPWEBROOT']."/admin/common/db_connect.php"); - -$nt = notifications::create($db); - -$framework_asterisk_running = checkAstMan(); - -// get all enabled modules -// active_modules array used below and in drawselects function and genConf function -$active_modules = module_getinfo(false, MODULE_STATUS_ENABLED); - -$fpbx_menu = array(); - -// pointer to current item in $fpbx_menu, if applicable -$cur_menuitem = null; - -// add module sections to $fpbx_menu -$types = array(); -if(is_array($active_modules)){ - foreach($active_modules as $key => $module) { - //include module functions - if (is_file($amp_conf['AMPWEBROOT']."/admin/modules/{$key}/functions.inc.php")) { - require_once($amp_conf['AMPWEBROOT']."/admin/modules/{$key}/functions.inc.php"); - } - - // create an array of module sections to display - // stored as [items][$type][$category][$name] = $displayvalue - if (isset($module['items']) && is_array($module['items'])) { - // loop through the types - foreach($module['items'] as $itemKey => $item) { - - if (!$framework_asterisk_running && - ((isset($item['needsenginedb']) && strtolower($item['needsenginedb'] == 'yes')) || - (isset($item['needsenginerunning']) && strtolower($item['needsenginerunning'] == 'yes'))) - ) - { - $item['disabled'] = true; - } else { - $item['disabled'] = false; - } - - if (!in_array($item['type'], $types)) { - $types[] = $item['type']; - } - - if (!isset($item['display'])) { - $item['display'] = $itemKey; - } - - // reference to the actual module - $item['module'] =& $active_modules[$key]; - - // item is an assoc array, with at least array(module=> name=>, category=>, type=>, display=>) - $fpbx_menu[$itemKey] = $item; - - // allow a module to replace our main index page - if (($item['display'] == 'index') && ($display == '')) { - $display = 'index'; - } - - // check current item - if ($display == $item['display']) { - // found current menuitem, make a reference to it - $cur_menuitem =& $fpbx_menu[$itemKey]; - } - } - } - } -} -sort($types); - -// new gui hooks -if(is_array($active_modules)){ - foreach($active_modules as $key => $module) { - if (isset($module['items']) && is_array($module['items'])) { - foreach($module['items'] as $itemKey => $itemName) { - //list of potential _configpageinit functions - $initfuncname = $key . '_' . $itemKey . '_configpageinit'; - if ( function_exists($initfuncname) ) { - $configpageinits[] = $initfuncname; - } - } - } - //check for module level (rather than item as above) _configpageinit function - $initfuncname = $key . '_configpageinit'; - if ( function_exists($initfuncname) ) { - $configpageinits[] = $initfuncname; - } - } -} - -// extensions vs device/users ... this is a bad design, but hey, it works -if (isset($amp_conf["AMPEXTENSIONS"]) && ($amp_conf["AMPEXTENSIONS"] == "deviceanduser")) { - unset($fpbx_menu["extensions"]); -} else { - unset($fpbx_menu["devices"]); - unset($fpbx_menu["users"]); -} - - -// Here we process the action and create the exten, mailbox or delete it. -// - -$EXTEN_REQUEST = array ( - 'actions' => $actions, - 'ext' => $exten, - 'displayname' => $new_name, - 'emergencycid' => '', - 'outboundcid' => $new_outboundcid, - 'accountcode' => '', - 'dtmfmode' => 'auto', - 'devicesecret' => $new_sip_secret, - 'directdid' => $new_directdid, - ); - -$actions = explode('/',$EXTEN_REQUEST['actions']); - - $actions_taken = false; - - $ext = ''; - $pass = ''; - $displayname = ''; - $emergencycid = ''; - $outboundcid = ''; - $directdid = ''; - $mailbox = ''; - $tech = 'sip'; - $dcontext = 'from-internal'; - $dtmfmode = 'auto'; - - foreach ($EXTEN_REQUEST as $key => $value) { - switch ($key) { - case 'ext': - case 'displayname': - case 'emergencycid': - case 'outboundcid': - case 'accountcode': - case 'dtmfmode': - case 'devicesecret': - case 'directdid': - case 'mailbox': - case 'dcontext': - $$key = $value; - break; - - default: - break; - } - } - - /* - echo "\nDumping core_users_get:"; - $user_list = core_users_get($ext); - var_dump($user_list); - - echo "\nDumping core_devices_get:"; - $device_list = core_devices_get($ext); - var_dump($device_list); - - echo "\nDumping voicemail_mailbox_get:"; - $vm_list = voicemail_mailbox_get($ext); - var_dump($vm_list); - - exit; - */ - - if ($ext == '') { - fatal("No Extension provided (this should have been caught above, may be a bug"); - exit (10); - } - - /* DEFAULTS: - displayname: ext - devicesecret: ext - */ - - if (in_array('addext', $actions) || in_array('addvm',$actions)) { - if ($displayname == '') { - $displayname = $ext; - } - if (isset($accountcode)) { - $_REQUEST['devinfo_accountcode'] = $accountcode; - } - if (!isset($devicesecret)) { - $devicesecret = $ext; - } - if ($mailbox == '') { - $mailbox = $ext.'@default'; - } - $user_add_arr = array( - 'extension' => $ext, - 'device' => $ext, - 'name' => $displayname, - 'directdid' => $directdid, - 'outboundcid' => $outboundcid, - 'sipname' => '', - 'record_out' => 'Never', - 'record_in' => 'Never', - 'callwaiting' => 'enabled', - - 'vm' => 'enabled', - 'vmcontext' => 'default', - 'options' => '', - 'vmpwd' => $new_vm_password, - 'email' => '', - 'pager' => '', - 'attach' => 'attach=no', - 'saycid' => 'saycid=no', - 'envelope' => 'envelope=no', - 'delete' => 'delete=no', - ); - - // archaic code expects these in the REQUEST array ... - // - $_REQUEST['devinfo_secret'] = $devicesecret; - $_REQUEST['devinfo_dtmfmode'] = $dtmfmode; - $_REQUEST['devinfo_canreinvite'] = 'no'; - $_REQUEST['devinfo_context'] = $dcontext; - $_REQUEST['devinfo_host'] = 'dynamic'; - $_REQUEST['devinfo_type'] = 'friend'; - $_REQUEST['devinfo_nat'] = 'yes'; - $_REQUEST['devinfo_port'] = '5060'; - $_REQUEST['devinfo_dial'] = 'SIP/'.$ext; - $_REQUEST['devinfo_mailbox'] = $mailbox; - - } else if (in_array('modext', $actions)) { - $user_list = core_users_get($ext); - //var_dump($user_list); - if (!isset($user_list['extension'])) { - error("No such extension found: $ext"); - exit (10); - } - $device_list = core_devices_get($ext); - //var_dump($device_list); - if (count($device_list) == 0) { - error("No such device found: $ext"); - exit (10); - } - $vm_list = voicemail_mailbox_get($ext); - //var_dump($vm_list); - if (count($vm_list) == 0) { - error("No voicemail found for: $ext"); - exit (10); - } - - if ($param_name) { - $user_list['name'] = $new_name; - $device_list['description'] = $new_name; - $vm_list['name'] = $new_name; - } - if ($param_sip_secret) { - $device_list['secret'] = $new_sip_secret; - } - if ($param_vm_password) { - $vm_list['pwd'] = $new_vm_password; - } - if ($param_directdid) { - $user_list['directdid'] = $new_directdid; - } - if ($param_outboundcid) { - $user_list['outboundcid'] = $new_outboundcid; - } - $user_mod_arr = array( - 'extension' => $ext, - 'device' => $ext, - 'name' => $user_list['name'], - 'directdid' => $user_list['directdid'], - 'outboundcid' => $user_list['outboundcid'], - 'sipname' => $user_list['sipname'], - 'record_out' => $user_list['record_out'], - 'record_in' => $user_list['record_in'], - 'callwaiting' => $user_list['callwaiting'], - - 'vm' => 'enabled', - 'vmcontext' => $vm_list['vmcontext'], - 'vmpwd' => $vm_list['pwd'], - 'email' => $vm_list['email'], - 'pager' => $vm_list['pager'], - 'options' => '', - 'attach' => $vm_list['options']['attach'], - 'saycid' => $vm_list['options']['saycid'], - 'envelope' => $vm_list['options']['envelope'], - 'delete' => $vm_list['options']['delete'], - ); - - // archaic code expects these in the REQUEST array ... - // - $_REQUEST['devinfo_secret'] = $device_list['secret']; - $_REQUEST['devinfo_dtmfmode'] = $device_list['dtmfmode']; - $_REQUEST['devinfo_canreinvite'] = $device_list['canreinvite']; - $_REQUEST['devinfo_context'] = $device_list['context']; - $_REQUEST['devinfo_host'] = $device_list['host']; - $_REQUEST['devinfo_type'] = $device_list['type']; - $_REQUEST['devinfo_nat'] = $device_list['nat']; - $_REQUEST['devinfo_port'] = $device_list['port']; - $_REQUEST['devinfo_dial'] = $device_list['dial']; - $_REQUEST['devinfo_mailbox'] = $device_list['mailbox']; - $_REQUEST['devinfo_accountcode'] = $device_list['accountcode']; - $_REQUEST['devinfo_username'] = $ext; - //$_REQUEST['devinfo_callerid'] = $device_list['callerid']; - //$_REQUEST['devinfo_record_in'] = $device_list['record_in']; - //$_REQUEST['devinfo_record_out'] = $device_list['record_out']; - - if (isset($device_list['qualify'])) { - $_REQUEST['devinfo_qualify'] = $device_list['qualify']; - } - if (isset($device_list['callgroup'])) { - $_REQUEST['devinfo_callgroup'] = $device_list['callgroup']; - } - if (isset($device_list['pickupgroup'])) { - $_REQUEST['devinfo_pickupgroup'] = $device_list['pickupgroup']; - } - if (isset($device_list['allow'])) { - $_REQUEST['devinfo_allow'] = $device_list['allow']; - } - if (isset($device_list['disallow'])) { - $_REQUEST['devinfo_disallow'] = $device_list['disallow']; - } - - $actions_taken = true; - debug("core_users_edit($ext, $user_add_arr)"); - core_users_edit($ext, $user_mod_arr); - // doesn't return a return code, so hope it worked:-) - - debug("core_devices_del($ext, true)"); - debug("core_devices_add($ext,'sip',".$device_list['dial'].",'fixed',$ext,".$device_list['description'].",".$device_list['emergency_cid'].",true)"); - core_devices_del($ext,true); - core_devices_add($ext,'sip',$device_list['dial'],'fixed',$ext,$device_list['description'],$device_list['emergency_cid'],true); - // doesn't return a return code, so hope it worked:-) - - debug("voicemail_mailbox_del($ext)"); - debug("voicemail_mailbox_add($ext, $user_mod_arr)"); - voicemail_mailbox_del($ext); - voicemail_mailbox_add($ext, $user_mod_arr); - } - - if (in_array('addvm', $actions)) { - $actions_taken = true; - if (($existing_vmbox = voicemail_mailbox_get($ext)) == null ) { - debug("voicemail_mailbox_add($ext, $user_add_arr)"); - voicemail_mailbox_add($ext, $user_add_arr); - } else { - debug(print_r($existing_vmbox,true)); - fatal("voicemail_mailbox_get($ext) indicates the box already exists, aborting"); - exit (1); - } - - // check if we need to create symlink if if addext is not being called - if (!in_array('addext', $actions)) { - - $thisUser = core_users_get($ext); - - // This is a bit kludgey, the other way is to reformat the core_users_get() info and do a core_users_add() in edit mode - // - if (!empty($thisUser)) { - $this_vmcontext = $user_add_arr['vmcontext']; - sql("UPDATE `users` SET `voicemail` = '$this_vmcontext' WHERE `extension` = '$ext'"); - - if ($astman) { - $astman->database_put("AMPUSER",$ext."/voicemail","\"".isset($this_vmcontext)?$this_vmcontext:''."\""); - } - } - - if(isset($this_vmcontext) && $this_vmcontext != "novm") { - if(empty($this_vmcontext)) { - $vmcontext = "default"; - } else { - $vmcontext = $this_vmcontext; - } - //voicemail symlink - // - exec("rm -f /var/spool/asterisk/voicemail/device/".$ext,$output,$return_val); - exec("/bin/ln -s /var/spool/asterisk/voicemail/".$vmcontext."/".$ext."/ /var/spool/asterisk/voicemail/device/".$ext,$output,$return_val); - if ($return_val != 0) { - error("Error code $return_val when sym-linking vmail context $vmcontext to device directory for $ext. Trying to carry on but you should investigate."); - } - } - } - } - - if (in_array('addext', $actions)) { - $actions_taken = true; - $any_users = core_users_get($ext); - debug("core_users_add($user_add_arr)"); - if (isset($any_users['extension']) || !core_users_add($user_add_arr)) { - var_dump($any_users); - fatal("Attempt to add user failed, aborting"); - exit (1); - } - } - - if (in_array('addext', $actions)) { - $actions_taken = true; - debug("core_devices_add($ext, $tech, '', 'fixed', $ext, $displayname, $emergencycid)"); - $any_devices = core_devices_get($ext); - if (count($any_devices) > 0 || !core_devices_add($ext, $tech, '', 'fixed', $ext, $displayname, $emergencycid)) { - var_dump($any_devices); - fatal("Attempt to add device failed, aborting"); - exit (1); - } - } - - if (in_array('remext', $actions)) { - $actions_taken = true; - if (core_users_get($ext) != null) { - debug("removing user $ext"); - core_users_del($ext); - core_devices_del($ext); - } else { - debug("not removing user $ext"); - } - if (voicemail_mailbox_get($ext) != null) { - debug("removing vm $ext"); - voicemail_mailbox_del($ext); - } else { - debug("not removing vm $ext"); - } - } - - if ($actions_taken) { - debug("Request completed successfully"); - exit (0); - } else { - warning("No actions were performed"); - exit (10); - } - exit; -?> |