diff --git a/admin/operators.php b/admin/operators.php index 8860ab08..c54aa46b 100644 --- a/admin/operators.php +++ b/admin/operators.php @@ -68,8 +68,8 @@ if (isset($_POST['operator']) && isset($_POST['adduser'])) $laste = $db->GetRow($sql); - $extensionn = "2000"; - $extension = "'IAX2/2000'"; + $extensionn = "1000"; + $extension = "'IAX2/1000'"; //increment if exists if (!empty($laste)) @@ -147,7 +147,7 @@ if (isset($_POST['operator']) && isset($_POST['adduser'])) $a = "

" . T_("Added operator :") . " " . $operator . "

"; if (FREEPBX_PATH !== false) - $a .= "
" . T_("FreePBX has been reloaded for the new VoIP extension to take effect"); + $a .= "
" . T_("FreePBX needs to be reloaded for the new VoIP extension to take effect") . ""; print "
"; @@ -245,7 +245,7 @@ function generate() {
-
+
" class="btn btn-default fa" />  diff --git a/functions/functions.freepbx.php b/functions/functions.freepbx.php index cdc63044..5937133b 100644 --- a/functions/functions.freepbx.php +++ b/functions/functions.freepbx.php @@ -34,6 +34,8 @@ */ include_once(dirname(__FILE__).'/../config.inc.php'); +include_once(dirname(__FILE__).'/../db.inc.php'); + /** * FreePBX functions to add an extension * This needs to be re-implemented here as there are too many code conflicts in including freepbx code @@ -47,457 +49,40 @@ include_once(dirname(__FILE__).'/../config.inc.php'); */ function freepbx_add_extension($extension,$name,$password) { - global $amp_conf_defaults; - if (FREEPBX_PATH == false) return false; //break out if not defined - //include freepbx functions - require_once(FREEPBX_PATH . "/functions.inc.php"); - require_once(FREEPBX_PATH . "/common/php-asmanager.php"); - - // get settings - $amp_conf = parse_amportal_conf("/etc/amportal.conf"); - $asterisk_conf = parse_asterisk_conf($amp_conf["ASTETCDIR"]."/asterisk.conf"); - $astman = new AGI_AsteriskManager(); - - // attempt to connect to asterisk manager proxy - if (!isset($amp_conf["ASTMANAGERPROXYPORT"]) || !$res = $astman->connect($amp_conf["ASTMANAGERHOST"] . ":" . $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($amp_conf["ASTMANAGERHOST"] . ":" . $amp_conf["ASTMANAGERPORT"], $amp_conf["AMPMGRUSER"] , $amp_conf["AMPMGRPASS"], 'off')) { - // couldn't connect at all - unset( $astman ); - } - } - - //Defines from bulkextensions module of FreePBX - $vars = array ( - "action" => "add", - "extension" => $extension, - "name" => $name, - "cid_masquerade" => $extension, - "ringtimer" => 0, - "callwaiting" => "disabled", - "call_screen" => 0, - "pinless" => "disabled", - "tech" => "iax2", - "devinfo_secret" => $password, - "devinfo_notransfer" => "yes", // for iax2 devices - "devinfo_context" => "from-internal", - "devinfo_host" => "dynamic", - "devinfo_type" => "friend", - "devinfo_port" => 4569, - "devinfo_qualify" => "yes", - "devinfo_dial" => "IAX2/$extension", - "devinfo_mailbox" => $extension . "@device", - "devinfo_deny" => "0.0.0.0/0.0.0.0", - "devinfo_permit" => "0.0.0.0/0.0.0.0", - "deviceid" => $extension, - "devicetype" => "fixed", - "deviceuser" => $extension, - "description" => $name, - "dictenabled" => "disabled", - "dictformat" => "ogg", - "record_in" => "Adhoc", - "record_out" => "Adhoc", - "vm" => "disabled", - "voicemail" => "disabled", - "attach" => "attach=no", - "saycid" => "saycid=no", - "envelope" => "envelope=no", - "delete" => "delete=no", - "requirecalltoken" => "no", - "vmx_play_instructions" => "checked", - "vmx_option_0_system_default" => "checked", - "emergency_cid" => "null" - ); - - - freepbx_core_users_add($amp_conf,$astman,$vars); - freepbx_core_devices_add($amp_conf,$astman,$vars["deviceid"],$vars["tech"],$vars["devinfo_dial"],$vars["devicetype"],$vars["deviceuser"],$vars["description"],$vars["emergency_cid"],false,$vars); - freepbx_do_reload($amp_conf,$astman,$asterisk_conf); -} - -function freepbx_do_reload(&$amp_conf,&$astman,&$asterisk_conf) -{ - global $db; - - array($return); - - if (isset($amp_conf["PRE_RELOAD"]) && !empty($amp_conf['PRE_RELOAD'])) { - exec( $amp_conf["PRE_RELOAD"], $output, $exit_val ); - - } - - $retrieve = $amp_conf['AMPBIN'].'/retrieve_conf 2>&1'; - //exec($retrieve.'&>'.$asterisk_conf['astlogdir'].'/freepbx-retrieve.log', $output, $exit_val); - exec($retrieve, $output, $exit_val); - - - if ($exit_val != 0) { - $return['status'] = false; - $return['message'] = sprintf(_('Reload failed because retrieve_conf encountered an error: %s'),$exit_val); - $return['num_errors']++; - $notify->add_critical('freepbx','RCONFFAIL', _("retrieve_conf failed, config not applied"), $return['message']); - return $return; - } - - if (!isset($astman) || !$astman) { - $return['status'] = false; - $return['message'] = _('Reload failed because FreePBX could not connect to the asterisk manager interface.'); - $return['num_errors']++; - return $return; - } - - //reload MOH to get around 'reload' not actually doing that. - $astman->send_request('Command', array('Command'=>'moh reload')); - - //reload asterisk (>= 1.4) - $astman->send_request('Command', array('Command'=>'module reload')); - - $return['status'] = true; - - if ($amp_conf['FOPRUN'] && !$amp_conf['FOPDISABLE']) { - //bounce op_server.pl - $wOpBounce = $amp_conf['AMPBIN'].'/bounce_op.sh'; - exec($wOpBounce.' &>'.$asterisk_conf['astlogdir'].'/freepbx-bounce_op.log', $output, $exit_val); - - if ($exit_val != 0) { - $desc = _('Could not reload the FOP operator panel server using the bounce_op.sh script. Configuration changes may not be reflected in the panel display.'); - $return['num_errors']++; - } - } - - if (isset($amp_conf["POST_RELOAD"]) && !empty($amp_conf['POST_RELOAD'])) { - exec( $amp_conf["POST_RELOAD"], $output, $exit_val ); - - if ($exit_val != 0) { - $desc = sprintf(_("Exit code was %s and output was: %s"), $exit_val, "\n\n".implode("\n",$output)); - $return['num_errors']++; - } - } - - $sql = "UPDATE ".FREEPBX_DATABASE.".admin SET value = 'false' WHERE variable = 'need_reload'"; - - $db->Execute($sql); - - return $return; -} - - - -function freepbx_need_reload() -{ global $db; - $sql = "UPDATE ".FREEPBX_DATABASE.".admin SET value = 'true' WHERE variable = 'need_reload'"; - - $db->Execute($sql); + $iaxelements = array( + array('id' => $extension, 'keyword' => 'deny', 'data' => '0.0.0.0', 'flags' => '14'), + array('id' => $extension, 'keyword' => 'mailbox', 'data' => $extension . "@device", 'flags' => '13'), + array('id' => $extension, 'keyword' => 'accountcode', 'data' => '', 'flags' => '12'), + array('id' => $extension, 'keyword' => 'dial', 'data' => "IAX2/" . $extension, 'flags' => '11'), + array('id' => $extension, 'keyword' => 'allow', 'data' => '', 'flags' => '10'), + array('id' => $extension, 'keyword' => 'disallow', 'data' => '', 'flags' => '9'), + array('id' => $extension, 'keyword' => 'qualify', 'data' => 'yes', 'flags' => '8'), + array('id' => $extension, 'keyword' => 'port', 'data' => '4569', 'flags' => '7'), + array('id' => $extension, 'keyword' => 'type', 'data' => 'friend', 'flags' => '6'), + array('id' => $extension, 'keyword' => 'host', 'data' => 'dynamic', 'flags' => '5'), + array('id' => $extension, 'keyword' => 'context', 'data' => 'from-internal', 'flags' => '4'), + array('id' => $extension, 'keyword' => 'transfer', 'data' => 'yes', 'flags' => '3'), + array('id' => $extension, 'keyword' => 'secret', 'data' => $password, 'flags' => '2'), + array('id' => $extension, 'keyword' => 'permit', 'data' => '0.0.0.0/0.0.0.0', 'flags' => '15'), + array('id' => $extension, 'keyword' => 'requirecalltoken', 'data' => 'no', 'flags' => '16'), + array('id' => $extension, 'keyword' => 'account', 'data' => $extension, 'flags' => '17'), + array('id' => $extension, 'keyword' => 'callerid', 'data' => "device <" . $extension . ">", 'flags' => '18'), + array('id' => $extension, 'keyword' => 'setvar', 'data' => "REALCALLERIDNUM=" . $extension, 'flags' => '19'), + ); + + $devices = array('id' => $extension, 'tech' => 'iax2', 'dial' => "IAX2/$extension", 'devicetype' => 'fixed', 'user' => $extension, 'description' => $name, 'emergency_cid' => ''); + + $users = array('extension' => $extension, 'password' => '', 'name' => $extension, 'voicemail' => 'novm', 'ringtimer' => '0', 'noanswer' => '', 'recording' => '', 'outboundcid' => '', 'sipname' => '', 'noanswer_cid' => '', 'busy_cid' => '', 'chanunavail_cid' => '', 'noanswer_dest' => '', 'busy_dest' => '', 'chanunavail_dest' => '', 'mohclass' => 'default'); + + foreach ($iaxelements as $iax) + $db->AutoExecute(FREEPBX_DATABASE . ".iax",$iax,'INSERT'); + + $db->AutoExecute(FREEPBX_DATABASE . ".devices",$devices,'INSERT'); + $db->AutoExecute(FREEPBX_DATABASE . ".users",$users,'INSERT'); } - -function freepbx_core_devices_add(&$amp_conf,&$astman,$id,$tech,$dial,$devicetype,$user,$description,$emergency_cid=null,$editmode=false,$vars){ - global $db; - - //ensure this id is not already in use - $sql = "SELECT * - FROM ".FREEPBX_DATABASE.".devices - WHERE id = '$id'"; - - $rs = $db->GetAll($sql); - - if (!empty($rs)) - return false; //device already exists - - //unless defined, $dial is TECH/id - if ( $dial == '' ) { - $dial = strtoupper($tech)."/".$id; - } - - //check to see if we are requesting a new user - if ($user == "new") { - $user = $id; - $jump = true; - } - - //insert into devices table - $sql="INSERT INTO ".FREEPBX_DATABASE.".devices (id,tech,dial,devicetype,user,description,emergency_cid) values (\"$id\",\"$tech\",\"$dial\",\"$devicetype\",\"$user\",\"$description\",\"$emergency_cid\")"; - $db->Execute($sql); - - //add details to astdb - if ($astman) { - // if adding or editting a fixed device, user property should always be set - if ($devicetype == 'fixed' || !$editmode) { - $astman->database_put("DEVICE",$id."/user",$user); - } - // If changing from a fixed to an adhoc, the user property should be intialized - // to the new default, not remain as the previous fixed user - if ($editmode) { - $previous_type = $astman->database_get("DEVICE",$id."/type"); - if ($previous_type == 'fixed' && $devicetype == 'adhoc') { - $astman->database_put("DEVICE",$id."/user",$user); - } - } - $astman->database_put("DEVICE",$id."/dial",$dial); - $astman->database_put("DEVICE",$id."/type",$devicetype); - $astman->database_put("DEVICE",$id."/default_user",$user); - if($emergency_cid != '') { - $astman->database_put("DEVICE",$id."/emergency_cid","\"".$emergency_cid."\""); - } - - if ($user != "none") { - $existingdevices = $astman->database_get("AMPUSER",$user."/device"); - if (empty($existingdevices)) { - $astman->database_put("AMPUSER",$user."/device",$id); - } else { - $existingdevices_array = explode('&',$existingdevices); - if (!in_array($id, $existingdevices_array)) { - $existingdevices_array[]=$id; - $existingdevices = implode('&',$existingdevices_array); - $astman->database_put("AMPUSER",$user."/device",$existingdevices); - } - } - } - - } else { - die("Cannot connect to Asterisk Manager with ".$amp_conf["AMPMGRUSER"]."/".$amp_conf["AMPMGRPASS"]); - } - - // create a voicemail symlink if needed - /* - $thisUser = core_users_get($user); - if(isset($thisUser['voicemail']) && ($thisUser['voicemail'] != "novm")) { - if(empty($thisUser['voicemail'])) { - $vmcontext = "default"; - } else { - $vmcontext = $thisUser['voicemail']; - } - - //voicemail symlink - exec("rm -f /var/spool/asterisk/voicemail/device/".$id); - exec("/bin/ln -s /var/spool/asterisk/voicemail/".$vmcontext."/".$user."/ /var/spool/asterisk/voicemail/device/".$id); - } - */ - - //take care of sip/iax/zap config - $funct = "freepbx_core_devices_add".strtolower($tech); - - if(function_exists($funct)){ - $funct($id,$vars); - } - - return true; -} - -function freepbx_core_devices_addiax2($account,$vars) { - global $db; - - $flag = 2; - foreach ($vars as $req=>$data) { - if ( substr($req, 0, 8) == 'devinfo_' ) { - $keyword = substr($req, 8); - if ( $keyword == 'dial' && $data == '' ) { - $iaxfields[] = array($account, $keyword, 'IAX2/'.$account, $flag++); - } elseif ($keyword == 'mailbox' && $data == '') { - $iaxfields[] = array($account,'mailbox',$account.'@device', $flag++); - } else { - $iaxfields[] = array($account, $keyword, $data, $flag++); - } - } - } - - if ( !is_array($iaxfields) ) { // left for compatibilty....lord knows why ! - $iaxfields = array( - array($account,'secret',$db->qstr(($vars['secret'])?$vars['secret']:''),$flag++), - array($account,'notransfer',$db->qstr(($vars['notransfer'])?$vars['notransfer']:'yes'),$flag++), - array($account,'context',$db->qstr(($vars['context'])?$vars['context']:'from-internal'),$flag++), - array($account,'host',$db->qstr(($vars['host'])?$vars['host']:'dynamic'),$flag++), - array($account,'type',$db->qstr(($vars['type'])?$vars['type']:'friend'),$flag++), - array($account,'mailbox',$db->qstr(($vars['mailbox'])?$vars['mailbox']:$account.'@device'),$flag++), - array($account,'username',$db->qstr(($vars['username'])?$vars['username']:$account),$flag++), - array($account,'port',$db->qstr(($vars['port'])?$vars['port']:'4569'),$flag++), - array($account,'qualify',$db->qstr(($vars['qualify'])?$vars['qualify']:'yes'),$flag++), - array($account,'deny',$db->qstr((isset($vars['deny']))?$vars['deny']:''),$flag++), - array($account,'permit',$db->qstr((isset($vars['permit']))?$vars['permit']:''),$flag++), - array($account,'disallow',$db->qstr(($vars['disallow'])?$vars['disallow']:''),$flag++), - array($account,'allow',$db->qstr(($vars['allow'])?$vars['allow']:''),$flag++), - array($account,'accountcode',$db->qstr(($vars['accountcode'])?$vars['accountcode']:''),$flag++), - array($account,'requirecalltoken',$db->qstr(($vars['requirecalltoken'])?$vars['requirecalltoken']:'no'),$flag++) - ); - } - - // Very bad - $iaxfields[] = array($account,'account',($account),$flag++); - $iaxfields[] = array($account,'callerid',((isset($vars['description']) && $vars['description'] != '')?$vars['description']." <".$account.'>':'device'." <".$account.'>'),$flag++); - // Asterisk treats no caller ID from an IAX device as 'hide callerid', and ignores the caller ID - // set in iax.conf. As we rely on this for pretty much everything, we need to specify the - // callerid as a variable which gets picked up in macro-callerid. - // Ref - http://bugs.digium.com/view.php?id=456 - $iaxfields[] = array($account,'setvar',"REALCALLERIDNUM=$account",$flag++); - - // Where is this in the interface ?????? - $iaxfields[] = array($account,'record_in',(($vars['record_in'])?$vars['record_in']:'On-Demand'),$flag++); - $iaxfields[] = array($account,'record_out',(($vars['record_out'])?$vars['record_out']:'On-Demand'),$flag++); - - $iaxfields[] = array($account,'requirecalltoken','no',$flag++); - - $compiled = $db->Prepare('INSERT INTO '.FREEPBX_DATABASE.'.iax (id, keyword, data, flags) values (?,?,?,?)'); - foreach($iaxfields as $i) - $db->Execute($compiled, $i); -} - - - -function freepbx_core_users_add(&$amp_conf, &$astman, $vars, $editmode=false) { - extract($vars); - - global $db; - - $thisexten = isset($thisexten) ? $thisexten : ''; - - if (trim($extension) == '' ) { - return false; - } - - //ensure this id is not already in use - $sql = "SELECT * - FROM ".FREEPBX_DATABASE.".users - WHERE extension = '$extension'"; - - $rs = $db->GetAll($sql); - - if (!empty($rs)) - return false; //device already exists - - $newdid_name = isset($newdid_name) ? $db->qstr($newdid_name) : ''; - $newdid = isset($newdid) ? $newdid : ''; - $newdid = preg_replace("/[^0-9._XxNnZz\[\]\-\+]/" ,"", trim($newdid)); - - $newdidcid = isset($newdidcid) ? trim($newdidcid) : ''; - if (!preg_match('/^priv|^block|^unknown|^restrict|^unavail|^anonym/',strtolower($newdidcid))) { - $newdidcid = preg_replace("/[^0-9._XxNnZz\[\]\-\+]/" ,"", $newdidcid); - } - - //build the recording variable - $recording = "out=".$record_out."|in=".$record_in; - - //escape quotes and any other bad chddddars: - if(!get_magic_quotes_gpc()) { - $outboundcid = ''; - $name = $db->qstr($name); - } - - // Clean replace any <> with () in display name - should have javascript stopping this but ... - // - $name = preg_replace(array('//'), array('(',')'), trim($name)); - - //insert into users table - $sql="INSERT INTO ".FREEPBX_DATABASE.".users (extension,password,name,voicemail,ringtimer,noanswer,recording,outboundcid,sipname) values (\""; - $sql.= "$extension\", \""; - $sql.= isset($password)?$password:''; - $sql.= "\", "; - $sql.= isset($name)?$name:''; - $sql.= ", \""; - $sql.= isset($voicemail)?$voicemail:'novm'; - $sql.= "\", \""; - $sql.= isset($ringtimer)?$ringtimer:''; - $sql.= "\", \""; - $sql.= isset($noanswer)?$noanswer:''; - $sql.= "\", \""; - $sql.= isset($recording)?$recording:''; - $sql.= "\", \""; - $sql.= isset($outboundcid)?$outboundcid:''; - $sql.= "\", \""; - $sql.= isset($sipname)?$sipname:''; - $sql.= "\")"; - - $db->Execute($sql); - - //write to astdb - if ($astman) { - $cid_masquerade = (isset($cid_masquerade) && trim($cid_masquerade) != "")?trim($cid_masquerade):$extension; - $astman->database_put("AMPUSER",$extension."/password",isset($password)?$password:''); - $astman->database_put("AMPUSER",$extension."/ringtimer",isset($ringtimer)?$ringtimer:''); - $astman->database_put("AMPUSER",$extension."/noanswer",isset($noanswer)?$noanswer:''); - $astman->database_put("AMPUSER",$extension."/recording",isset($recording)?$recording:''); - $astman->database_put("AMPUSER",$extension."/outboundcid",isset($outboundcid)?"\"".$outboundcid."\"":''); - $astman->database_put("AMPUSER",$extension."/cidname",isset($name)?"\"".$name."\"":''); - $astman->database_put("AMPUSER",$extension."/cidnum",$cid_masquerade); - $astman->database_put("AMPUSER",$extension."/voicemail","\"".isset($voicemail)?$voicemail:''."\""); - switch ($call_screen) { - case '0': - $astman->database_del("AMPUSER",$extension."/screen"); - break; - case 'nomemory': - $astman->database_put("AMPUSER",$extension."/screen","\"nomemory\""); - break; - case 'memory': - $astman->database_put("AMPUSER",$extension."/screen","\"memory\""); - break; - default: - } - - if (!$editmode) { - $astman->database_put("AMPUSER",$extension."/device","\"".((isset($device))?$device:'')."\""); - } - - if (trim($callwaiting) == 'enabled') { - $astman->database_put("CW",$extension,"\"ENABLED\""); - } else if (trim($callwaiting) == 'disabled') { - $astman->database_del("CW",$extension); - } else { - echo "ERROR: this state should not exist
"; - } - - if (trim($pinless) == 'enabled') { - $astman->database_put("AMPUSER",$extension."/pinless","\"NOPASSWD\""); - } else if (trim($pinless) == 'disabled') { - $astman->database_del("AMPUSER",$extension."/pinless"); - } else { - echo "ERROR: this state should not exist
"; - } - - // Moved VmX setup to voicemail module since it is part of voicemail - // - } else { - die("Cannot connect to Asterisk Manager with ".$amp_conf["AMPMGRUSER"]."/".$amp_conf["AMPMGRPASS"]); - } - - // OK - got this far, if they entered a new inbound DID/CID let's deal with it now - // remember - in the nice and ugly world of this old code, $vars has been extracted - // newdid and newdidcid - - // Now if $newdid is set we need to add the DID to the routes - // - if ($newdid != '' || $newdidcid != '') { - $did_dest = 'from-did-direct,'.$extension.',1'; - $did_vars['extension'] = $newdid; - $did_vars['cidnum'] = $newdidcid; - $did_vars['privacyman'] = ''; - $did_vars['alertinfo'] = ''; - $did_vars['ringing'] = ''; - $did_vars['mohclass'] = 'default'; - $did_vars['description'] = $newdid_name; - $did_vars['grppre'] = ''; - $did_vars['delay_answer']= '0'; - $did_vars['pricid']= ''; - freepbx_core_did_add($did_vars, $did_dest); - } - - return true; -} - - -function freepbx_core_did_add($incoming,$target=false){ - global $db; - foreach ($incoming as $key => $val) { ${$key} = $val; } // create variables from request - - $destination= ($target) ? $target : ${$goto0.'0'}; - $sql="INSERT INTO ".FREEPBX_DATABASE.".incoming (cidnum,extension,destination,privacyman,pmmaxretries,pmminlength,alertinfo, ringing, mohclass, description, grppre, delay_answer, pricid) values ('$cidnum','$extension','$destination','$privacyman','$pmmaxretries','$pmminlength','$alertinfo', '$ringing', '$mohclass', '$description', '$grppre', '$delay_answer', '$pricid')"; - - return($db->Execute($sql)); -} - - - - ?>