Merge pull request #5566 from winsock/multiple-registration-fix

Fix Device Provisioning and Feature Sync across SIP Profiles
This commit is contained in:
FusionPBX 2021-03-19 09:25:51 -06:00 committed by GitHub
commit eef13cbb96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 142 additions and 120 deletions

View File

@ -43,38 +43,40 @@ include "root.php";
//feature_event method
public function send_notify() {
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
//get the sip profile name
$command = "sofia_contact */".$this->extension."@".$this->domain_name;
$contact_string = event_socket_request($fp, "api ".$command);
if (substr($contact_string, 0, 5) == "sofia") {
$contact_array = explode("/", $contact_string);
$sip_profile_name = $contact_array[1];
}
else {
$sip_profile_name = 'internal';
}
//send the event
$event = "sendevent SWITCH_EVENT_PHONE_FEATURE\n";
$event .= "profile: ".$sip_profile_name."\n";
$event .= "user: ".$this->extension."\n";
$event .= "host: ".$this->domain_name."\n";
$event .= "device: \n";
$event .= "Feature-Event: init\n";
$event .= "forward_immediate_enabled: ".$this->forward_all_enabled."\n";
$event .= "forward_immediate: ".$this->forward_all_destination."\n";
$event .= "forward_busy_enabled: ".$this->forward_busy_enabled."\n";
$event .= "forward_busy: ".$this->forward_busy_destination."\n";
$event .= "forward_no_answer_enabled: ".$this->forward_no_answer_enabled."\n";
$event .= "forward_no_answer: ".$this->forward_no_answer_destination."\n";
$event .= "doNotDisturbOn: ".$this->do_not_disturb."\n";
$event .= "ringCount: ".$this->ring_count."\n";
event_socket_request($fp, $event);
fclose($fp);
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
// Get the SIP profiles for the extension
$command = "sofia_contact */{$this->extension}@{$this->domain_name}";
$contact_string = event_socket_request($fp, "api ".$command);
// The first value in the array will be full matching text, the second one will be the array of profile matches
preg_match_all('/sofia\/([^,]+)\/(?:[^,]+)/', $contact_string, $matches);
if (sizeof($matches) != 2 || sizeof($matches[1]) < 1) {
$profiles = array("internal");
} else {
// We have at least one profile, get all of the unique profiles
$profiles = array_unique($matches[1]);
}
foreach ($profiles as $profile) {
//send the event
$event = "sendevent SWITCH_EVENT_PHONE_FEATURE\n";
$event .= "profile: " . $profile . "\n";
$event .= "user: " . $this->extension . "\n";
$event .= "host: " . $this->domain_name . "\n";
$event .= "device: \n";
$event .= "Feature-Event: init\n";
$event .= "forward_immediate_enabled: " . $this->forward_all_enabled . "\n";
$event .= "forward_immediate: " . $this->forward_all_destination . "\n";
$event .= "forward_busy_enabled: " . $this->forward_busy_enabled . "\n";
$event .= "forward_busy: " . $this->forward_busy_destination . "\n";
$event .= "forward_no_answer_enabled: " . $this->forward_no_answer_enabled . "\n";
$event .= "forward_no_answer: " . $this->forward_no_answer_destination . "\n";
$event .= "doNotDisturbOn: " . $this->do_not_disturb . "\n";
$event .= "ringCount: " . $this->ring_count . "\n";
event_socket_request($fp, $event);
}
fclose($fp);
}
} //function
} //class

View File

@ -41,7 +41,6 @@ else {
//set the variables
$cmd = check_str($_GET['cmd']);
$rdr = check_str($_GET['rdr']);
$profile = check_str($_GET['profile']);
$domain = check_str($_GET['domain']);
$show = check_str($_GET['show']);
$user = check_str($_GET['user']);
@ -51,26 +50,39 @@ else {
//create the event socket connection
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
// Get the SIP profiles for the user
$command = "sofia_contact */{$user}";
$contact_string = event_socket_request($fp, "api ".$command);
// The first value in the array will be full matching text, the second one will be the array of profile matches
preg_match_all('/sofia\/([^,]+)\/(?:[^,]+)/', $contact_string, $matches);
if (sizeof($matches) != 2 || sizeof($matches[1]) < 1) {
$profiles = array("internal");
} else {
// We have at least one profile, get all of the unique profiles
$profiles = array_unique($matches[1]);
}
//prepare the command
foreach ($profiles as $profile) {
//prepare the command
if ($cmd == "unregister") {
$command = "sofia profile ".$profile." flush_inbound_reg ".$user." reboot";
$command = "sofia profile {$profile} flush_inbound_reg {$user} reboot";
}
else {
$command = "lua app.lua event_notify ".$profile." ".$cmd." ".$user." ".$vendor;
$command = "lua app.lua event_notify {$profile} {$cmd} {$user} {$vendor}";
//if ($cmd == "check_sync") {
// $command = "sofia profile ".$profile." check_sync ".$user;
//}
}
//send the command
$response = event_socket_request($fp, "api ".$command);
$response = event_socket_request($fp, "api log notice ".$command);
//send the command
$response = event_socket_request($fp, "api {$command}");
event_socket_request($fp, "api log notice {$command}");
//show the response
//show the response
message::add($text['label-event']." ".ucwords($cmd)."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$text['label-response'].htmlentities($response));
}
//close the connection
fclose($fp);
fclose($fp);
}
//redirect the user

View File

@ -625,20 +625,6 @@
}
}
//get the sip profile name
$fp = event_socket_create($_SESSION['event_socket_ip_address'], $_SESSION['event_socket_port'], $_SESSION['event_socket_password']);
if ($fp) {
$command = "sofia_contact */".$user_id."@".$server_address;
$contact_string = event_socket_request($fp, "api ".$command);
if (substr($contact_string, 0, 5) == "sofia") {
$contact_array = explode("/", $contact_string);
$sip_profile_name = $contact_array[1];
}
else {
$sip_profile_name = 'internal';
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
@ -816,7 +802,7 @@
echo button::create(['type'=>'button','label'=>$text['button-qr_code'],'icon'=>'qrcode','style'=>$button_margin,'onclick'=>"$('#qr_code_container').fadeIn(400);"]);
unset($button_margin);
}
echo button::create(['type'=>'button','label'=>$text['button-provision'],'icon'=>'fax','style'=>$button_margin,'link'=>PROJECT_PATH."/app/devices/cmd.php?cmd=check_sync&profile=".urlencode($sip_profile_name)."&user=".urlencode($user_id)."@".urlencode($server_address)."&domain=".urlencode($server_address)."&agent=".urlencode($device_vendor)]);
echo button::create(['type'=>'button','label'=>$text['button-provision'],'icon'=>'fax','style'=>$button_margin,'link'=>PROJECT_PATH."/app/devices/cmd.php?cmd=check_sync"."&user=".urlencode($user_id)."@".urlencode($server_address)."&domain=".urlencode($server_address)."&agent=".urlencode($device_vendor)]);
unset($button_margin);
if (permission_exists("device_files")) {
//get the template directory

View File

@ -72,7 +72,7 @@
end
--get the events
--if (user == nil) then
--if (user == nil) then
--serialize the data for the console
--freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n");
--freeswitch.consoleLog("notice","[evnts] " .. event:serialize("json") .. "\n");
@ -115,13 +115,13 @@
--get sip profile
if (user ~= nil and host ~= nil) then
sip_profile = notify.get_profile(user, host);
sip_profiles = notify.get_profiles(user, host);
end
--DND
if (sip_profiles ~= nil) then
--DND enabled
if (feature_action == "SetDoNotDisturb" and feature_enabled == "true" and sip_profile ~= nil) then
if (feature_action == "SetDoNotDisturb" and feature_enabled == "true") then
--set a variable
dial_string = "error/user_busy";
do_not_disturb = "true";
@ -155,11 +155,11 @@
end
--send notify to the phone
notify.dnd(user, host, sip_profile, do_not_disturb);
notify.dnd(user, host, sip_profiles, do_not_disturb);
end
--DND disabled
if (feature_action == "SetDoNotDisturb" and feature_enabled == "false" and sip_profile ~= nil ) then
if (feature_action == "SetDoNotDisturb" and feature_enabled == "false") then
--set a variable
do_not_disturb = "false";
@ -177,14 +177,14 @@
dbh:query(sql, params);
--send notify to the phone
notify.dnd(user, host, sip_profile, do_not_disturb);
notify.dnd(user, host, sip_profiles, do_not_disturb);
end
--Call Forward
--Call Formward All enabled
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_immediate" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_immediate") then
--set a variable
forward_all_destination = action_value;
forward_all_enabled = "true";
@ -247,11 +247,11 @@
end
--send notify to the phone
notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination);
notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination);
end
--Call Formward All disable
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_immediate" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_immediate") then
--set a variable
forward_all_destination = action_value;
forward_all_enabled = "false";
@ -277,14 +277,14 @@
dbh:query(sql, params);
--send notify to the phone
if (forward_immediate_destination == nil) then
if (forward_immediate_destination == nil) then
forward_immediate_destination = " ";
end
notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination);
notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination);
end
--Call Formward BUSY enable
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_busy" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_busy") then
--set a variable
forward_busy_destination = action_value;
forward_busy_enabled = "true";
@ -303,11 +303,11 @@
dbh:query(sql, params);
--send notify to the phone
notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination);
notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination);
end
--Call Formward BUSY disable
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_busy" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_busy") then
--set a variable
forward_busy_destination = action_value;
forward_busy_enabled = "false";
@ -330,11 +330,11 @@
dbh:query(sql, params);
--send notify to the phone
notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination);
notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination);
end
--Call Formward NO ANSWER enable
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_no_answer" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "true" and action_name == "forward_no_answer") then
--set a variable
forward_no_answer_destination = action_value;
forward_no_answer_enabled = "true";
@ -355,11 +355,11 @@
dbh:query(sql, params);
--send notify to the phone
notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
end
--Call Formward NO ANSWER disable
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_no_answer" and sip_profile ~= nil) then
if (feature_action == "SetCallForward" and feature_enabled == "false" and action_name == "forward_no_answer") then
--set a variable
forward_no_answer_destination = action_value;
forward_no_answer_enabled = "false";
@ -382,28 +382,28 @@
dbh:query(sql, params);
--send notify to the phone
notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
end
--No feature event (phone boots): Send all values
if (feature_enabled == nil) then
--Do Not Disturb
--notify.dnd(user, host, sip_profile, do_not_disturb);
--notify.dnd(user, host, sip_profiles, do_not_disturb);
--Forward all
forward_immediate_enabled = forward_all_enabled;
forward_immediate_destination = forward_all_destination;
--notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination);
--notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination);
--Forward busy
--notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination);
--notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination);
--Forward No Answer
ring_count = math.ceil (call_timeout / 6);
--notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
--notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
notify.init(user,
host,
sip_profile,
sip_profiles,
forward_immediate_enabled,
forward_immediate_destination,
forward_busy_enabled,
@ -414,8 +414,8 @@
do_not_disturb);
end
-- feature_event_notify.init(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb)
-- feature_event_notify.init(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb)
end
--clear the cache
if (feature_enabled ~= nil) then
cache.del("directory:"..user.."@"..host)

View File

@ -56,35 +56,50 @@ function feature_event_notify.get_db_values(user, domain_name)
return do_not_disturb, forward_all_enabled, forward_all_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, call_timeout
end
function feature_event_notify.get_profile(user, host)
---@return table, nil
function feature_event_notify.get_profiles(user, domain)
--includes
require "resources.functions.explode"
require "resources.functions.trim"
local account = user.."@"..host
local account = user.."@"..domain
--create the api object
api = freeswitch.API();
local sofia_contact = trim(api:executeString("sofia_contact */"..account));
local array = explode("/", sofia_contact);
local sip_profile = array[2];
return sip_profile
--get all profiles for the user account
local profile_iterator = string.gmatch(sofia_contact, "sofia/([^,]+)/[^,]+");
--remove any duplicates and check if we have any profiles
local unique_profiles = {}
local has_profile = false
for profile in profile_iterator do
has_profile = true
unique_profiles[profile] = 1
end
-- return nil if we have no profiles
if not has_profile then return nil end
return unique_profiles
end
function feature_event_notify.dnd(user, host, sip_profile, do_not_disturb)
--set the event and send it
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
event:addHeader("host", host)
event:addHeader("device", "")
event:addHeader("Feature-Event", "DoNotDisturbEvent")
event:addHeader("doNotDisturbOn", do_not_disturb)
--freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n");
event:fire()
function feature_event_notify.dnd(user, host, sip_profiles, do_not_disturb)
--set the event and send it to each profile
for sip_profile, _ in pairs(sip_profiles) do
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
event:addHeader("host", host)
event:addHeader("device", "")
event:addHeader("Feature-Event", "DoNotDisturbEvent")
event:addHeader("doNotDisturbOn", do_not_disturb)
--freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n");
event:fire()
end
end
function feature_event_notify.forward_immediate(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination)
--set the event and send it
function feature_event_notify.forward_immediate(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination)
--set the event and send it to each profile
for sip_profile, _ in pairs(sip_profiles) do
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
@ -95,10 +110,12 @@ function feature_event_notify.forward_immediate(user, host, sip_profile, forward
event:addHeader("forward_immediate", forward_immediate_destination);
freeswitch.consoleLog("notice","[events] " .. event:serialize("xml") .. "\n");
event:fire()
end
end
function feature_event_notify.forward_busy(user, host, sip_profile, forward_busy_enabled, forward_busy_destination)
--set the event and send it
function feature_event_notify.forward_busy(user, host, sip_profiles, forward_busy_enabled, forward_busy_destination)
--set the event and send it to each profile
for sip_profile, _ in pairs(sip_profiles) do
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
@ -108,10 +125,12 @@ function feature_event_notify.forward_busy(user, host, sip_profile, forward_busy
event:addHeader("forward_busy", forward_busy_destination)
event:addHeader("forward_busy_enabled", forward_busy_enabled)
event:fire()
end
end
function feature_event_notify.forward_no_answer(user, host, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count)
--set the event and send it
function feature_event_notify.forward_no_answer(user, host, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count)
--set the event and send it to each profile
for sip_profile, _ in pairs(sip_profiles) do
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
@ -122,10 +141,12 @@ function feature_event_notify.forward_no_answer(user, host, sip_profile, forward
event:addHeader("forward_no_answer_enabled", forward_no_answer_enabled)
event:addHeader("ringCount", ring_count)
event:fire()
end
end
function feature_event_notify.init(user, host, sip_profile, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb)
--set the event and send it
function feature_event_notify.init(user, host, sip_profiles, forward_immediate_enabled, forward_immediate_destination, forward_busy_enabled, forward_busy_destination, forward_no_answer_enabled, forward_no_answer_destination, ring_count, do_not_disturb)
--set the event and send it to each profile
for sip_profile, _ in pairs(sip_profiles) do
local event = freeswitch.Event("SWITCH_EVENT_PHONE_FEATURE")
event:addHeader("profile", sip_profile)
event:addHeader("user", user)
@ -143,6 +164,7 @@ function feature_event_notify.init(user, host, sip_profile, forward_immediate_en
event:addHeader("Feature-Event", "DoNotDisturbEvent")
event:addHeader("doNotDisturbOn", do_not_disturb)
event:fire()
end
end
return feature_event_notify

View File

@ -262,14 +262,14 @@
-- Get the sip_profile
if (extension ~= nil and domain_name ~= nil) then
sip_profile = notify.get_profile(extension, domain_name);
sip_profiles = notify.get_profiles(extension, domain_name);
end
if (sip_profile ~= nil) then
if (sip_profiles ~= nil) then
freeswitch.consoleLog("NOTICE", "[feature_event] SIP NOTIFY: CFWD set to "..forward_all_enabled.."\n");
--Do Not Disturb
notify.dnd(extension, domain_name, sip_profile, do_not_disturb);
notify.dnd(extension, domain_name, sip_profiles, do_not_disturb);
--Forward all
forward_immediate_enabled = forward_all_enabled;
@ -281,7 +281,7 @@
end
freeswitch.consoleLog("NOTICE", "[feature_event] forward_immediate_destination "..forward_immediate_destination.."\n");
notify.forward_immediate(extension, domain_name, sip_profile, forward_immediate_enabled, forward_immediate_destination);
notify.forward_immediate(extension, domain_name, sip_profiles, forward_immediate_enabled, forward_immediate_destination);
--Forward busy
--workaround for freeswitch not sending NOTIFY when destination values are nil. Send 0.
@ -290,7 +290,7 @@
end
freeswitch.consoleLog("NOTICE", "[feature_event] forward_busy_destination "..forward_busy_destination.."\n");
notify.forward_busy(extension, domain_name, sip_profile, forward_busy_enabled, forward_busy_destination);
notify.forward_busy(extension, domain_name, sip_profiles, forward_busy_enabled, forward_busy_destination);
--Forward No Answer
ring_count = math.ceil (call_timeout / 6);
@ -300,7 +300,7 @@
end
freeswitch.consoleLog("NOTICE", "[feature_event] forward_no_answer_destination "..forward_no_answer_destination.."\n");
notify.forward_no_answer(extension, domain_name, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
notify.forward_no_answer(extension, domain_name, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
end
end

View File

@ -227,15 +227,15 @@
-- Get the sip_profile
if (extension ~= nil and domain_name ~= nil) then
sip_profile = notify.get_profile(extension, domain_name);
sip_profiles = notify.get_profiles(extension, domain_name);
end
-- check if not nil
if (sip_profile ~= nil) then
if (sip_profiles ~= nil) then
freeswitch.consoleLog("NOTICE", "[feature_event] SIP NOTIFY: CFWD set to "..forward_all_enabled.."\n");
--Do Not Disturb
notify.dnd(extension, domain_name, sip_profile, do_not_disturb);
notify.dnd(extension, domain_name, sip_profiles, do_not_disturb);
--Forward all
forward_immediate_enabled = forward_all_enabled;
@ -246,7 +246,7 @@
forward_immediate_destination = '0';
end
notify.forward_immediate(extension, domain_name, sip_profile, forward_immediate_enabled, forward_immediate_destination);
notify.forward_immediate(extension, domain_name, sip_profiles, forward_immediate_enabled, forward_immediate_destination);
--Forward busy
--workaround for freeswitch not sending NOTIFY when destination values are nil. Send 0.
@ -254,7 +254,7 @@
forward_busy_destination = '0';
end
notify.forward_busy(extension, domain_name, sip_profile, forward_busy_enabled, forward_busy_destination);
notify.forward_busy(extension, domain_name, sip_profiles, forward_busy_enabled, forward_busy_destination);
--Forward No Answer
ring_count = math.ceil (call_timeout / 6);
@ -263,7 +263,7 @@
forward_no_answer_destination = '0';
end
notify.forward_no_answer(extension, domain_name, sip_profile, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
notify.forward_no_answer(extension, domain_name, sip_profiles, forward_no_answer_enabled, forward_no_answer_destination, ring_count);
end
end