From c62967e143d7be9dd9e11bd648733c2178938183 Mon Sep 17 00:00:00 2001 From: koldoa Date: Tue, 1 Sep 2015 18:33:26 +0200 Subject: [PATCH 01/10] Random strategy for ring groups --- app/ring_groups/app_languages.php | 11 ++++++++ app/ring_groups/ring_group_edit.php | 1 + .../install/scripts/app/ring_groups/index.lua | 27 ++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/ring_groups/app_languages.php b/app/ring_groups/app_languages.php index 41e87e22f2..4ce8421826 100644 --- a/app/ring_groups/app_languages.php +++ b/app/ring_groups/app_languages.php @@ -88,6 +88,17 @@ $text['option-rollover']['uk'] = ""; $text['option-rollover']['de-at'] = "Überrollen"; $text['option-rollover']['he'] = ""; +$text['option-random']['en-us'] = "Random"; +$text['option-random']['es-cl'] = "Aleatorio"; +$text['option-random']['pt-pt'] = ""; +$text['option-random']['fr-fr'] = ""; +$text['option-random']['pt-br'] = ""; +$text['option-random']['pl'] = ""; +$text['option-random']['sv-se'] = ""; +$text['option-random']['uk'] = ""; +$text['option-random']['de-at'] = ""; +$text['option-random']['he'] = ""; + $text['option-ptring']['en-us'] = "pt-ring"; $text['option-ptring']['es-cl'] = "pt-ring"; $text['option-ptring']['fr-fr'] = "Portugal"; diff --git a/app/ring_groups/ring_group_edit.php b/app/ring_groups/ring_group_edit.php index 9d7083e70e..929f7086d6 100644 --- a/app/ring_groups/ring_group_edit.php +++ b/app/ring_groups/ring_group_edit.php @@ -499,6 +499,7 @@ else { echo " \n"; echo " \n"; echo " \n"; + echo " \n"; echo " \n"; echo "
\n"; echo $text['description-strategy']."\n"; diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 336f5ace28..b122bc371a 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -160,6 +160,28 @@ --forward the ring group session:execute("transfer", ring_group_forward_destination.." XML "..context); else + --get the strategy of the ring group, if random, we use random() to order the destinations + sql = [[ + SELECT + r.ring_group_strategy + FROM + v_ring_groups as r, v_ring_group_destinations as d + WHERE + d.ring_group_uuid = r.ring_group_uuid + AND d.ring_group_uuid = ']]..ring_group_uuid..[[' + AND r.domain_uuid = ']]..domain_uuid..[[' + AND r.ring_group_enabled = 'true' + ]]; + + --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); + assert(dbh:query(sql, function(row) + if (row.ring_group_strategy == "random") then + sql_order = 'random()' + else + sql_order='d.destination_delay, d.destination_number asc' + end + end)); + --get the ring group destinations sql = [[ SELECT @@ -174,7 +196,7 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ORDER BY - d.destination_delay, d.destination_number asc + ]]..sql_order..[[ ]]; --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); destinations = {}; @@ -293,6 +315,9 @@ if (ring_group_strategy == "sequence") then delimiter = "|"; end + if (ring_group_strategy == "random") then + delimiter = "|"; + end if (ring_group_strategy == "simultaneous") then delimiter = ","; end From 6c1a9d08582b8de9883f1cb4d79f5730495f3e00 Mon Sep 17 00:00:00 2001 From: koldoa Date: Wed, 2 Sep 2015 14:24:47 +0200 Subject: [PATCH 02/10] Translation typo --- app/devices/app_languages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/devices/app_languages.php b/app/devices/app_languages.php index 75ecf92aa3..577792fd96 100644 --- a/app/devices/app_languages.php +++ b/app/devices/app_languages.php @@ -1690,7 +1690,7 @@ $text['label-blf']['ar-eg'] = ""; $text['label-blf']['he'] = ""; $text['label-callers']['en-us'] = "Callers"; -$text['label-callers']['es-cl'] = "Llaamadas"; +$text['label-callers']['es-cl'] = "Llamadas"; $text['label-callers']['pt-pt'] = ""; $text['label-callers']['fr-fr'] = ""; $text['label-callers']['pt-br'] = ""; From 3c0cb053e0db4fbddbf94b4c57b6e39348dd72b3 Mon Sep 17 00:00:00 2001 From: koldoa Date: Thu, 3 Sep 2015 11:53:28 +0200 Subject: [PATCH 03/10] Detection of SQL backend for random functions --- .../install/scripts/app/ring_groups/index.lua | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index b122bc371a..dee8542206 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -160,6 +160,16 @@ --forward the ring group session:execute("transfer", ring_group_forward_destination.." XML "..context); else + --first we check what version of SQL are we using + sql = "SELECT version() as version"; + assert(dbh:query(sql, function(row) + if (string.find(row.version, "PostgreSQL")) then + sql_verion = 'postgresql' + else + sql_verion = 'mysql' + end + end)); + --get the strategy of the ring group, if random, we use random() to order the destinations sql = [[ SELECT @@ -172,16 +182,21 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ]]; - - --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); + + assert(dbh:query(sql, function(row) if (row.ring_group_strategy == "random") then - sql_order = 'random()' + if (sql_verion == "postgresql") then + sql_order = 'random()' + end + if (sql_verion == "mysql") then + sql_order = 'rand()' + end else sql_order='d.destination_delay, d.destination_number asc' end end)); - + --get the ring group destinations sql = [[ SELECT @@ -196,7 +211,7 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ORDER BY - ]]..sql_order..[[ + ]]..sql_order..[[ ]]; --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); destinations = {}; From 7a65bf2148a19851e50ea25541f81fe3c1887ac0 Mon Sep 17 00:00:00 2001 From: koldoa Date: Tue, 1 Sep 2015 18:33:26 +0200 Subject: [PATCH 04/10] Random strategy for ring groups --- app/ring_groups/app_languages.php | 11 ++++++++ app/ring_groups/ring_group_edit.php | 1 + .../install/scripts/app/ring_groups/index.lua | 27 ++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/app/ring_groups/app_languages.php b/app/ring_groups/app_languages.php index 41e87e22f2..4ce8421826 100644 --- a/app/ring_groups/app_languages.php +++ b/app/ring_groups/app_languages.php @@ -88,6 +88,17 @@ $text['option-rollover']['uk'] = ""; $text['option-rollover']['de-at'] = "Überrollen"; $text['option-rollover']['he'] = ""; +$text['option-random']['en-us'] = "Random"; +$text['option-random']['es-cl'] = "Aleatorio"; +$text['option-random']['pt-pt'] = ""; +$text['option-random']['fr-fr'] = ""; +$text['option-random']['pt-br'] = ""; +$text['option-random']['pl'] = ""; +$text['option-random']['sv-se'] = ""; +$text['option-random']['uk'] = ""; +$text['option-random']['de-at'] = ""; +$text['option-random']['he'] = ""; + $text['option-ptring']['en-us'] = "pt-ring"; $text['option-ptring']['es-cl'] = "pt-ring"; $text['option-ptring']['fr-fr'] = "Portugal"; diff --git a/app/ring_groups/ring_group_edit.php b/app/ring_groups/ring_group_edit.php index 9d7083e70e..929f7086d6 100644 --- a/app/ring_groups/ring_group_edit.php +++ b/app/ring_groups/ring_group_edit.php @@ -499,6 +499,7 @@ else { echo " \n"; echo " \n"; echo " \n"; + echo " \n"; echo " \n"; echo "
\n"; echo $text['description-strategy']."\n"; diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 0cbc8832f5..69076397ab 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -158,6 +158,28 @@ --forward the ring group session:execute("transfer", ring_group_forward_destination.." XML "..context); else + --get the strategy of the ring group, if random, we use random() to order the destinations + sql = [[ + SELECT + r.ring_group_strategy + FROM + v_ring_groups as r, v_ring_group_destinations as d + WHERE + d.ring_group_uuid = r.ring_group_uuid + AND d.ring_group_uuid = ']]..ring_group_uuid..[[' + AND r.domain_uuid = ']]..domain_uuid..[[' + AND r.ring_group_enabled = 'true' + ]]; + + --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); + assert(dbh:query(sql, function(row) + if (row.ring_group_strategy == "random") then + sql_order = 'random()' + else + sql_order='d.destination_delay, d.destination_number asc' + end + end)); + --get the ring group destinations sql = [[ SELECT @@ -172,7 +194,7 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ORDER BY - d.destination_delay, d.destination_number asc + ]]..sql_order..[[ ]]; --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); destinations = {}; @@ -291,6 +313,9 @@ if (ring_group_strategy == "sequence") then delimiter = "|"; end + if (ring_group_strategy == "random") then + delimiter = "|"; + end if (ring_group_strategy == "simultaneous") then delimiter = ","; end From 15f3cd55144ae4d5a027a0d5a315cdadc223297c Mon Sep 17 00:00:00 2001 From: koldoa Date: Wed, 2 Sep 2015 14:24:47 +0200 Subject: [PATCH 05/10] Translation typo --- app/devices/app_languages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/devices/app_languages.php b/app/devices/app_languages.php index 75ecf92aa3..577792fd96 100644 --- a/app/devices/app_languages.php +++ b/app/devices/app_languages.php @@ -1690,7 +1690,7 @@ $text['label-blf']['ar-eg'] = ""; $text['label-blf']['he'] = ""; $text['label-callers']['en-us'] = "Callers"; -$text['label-callers']['es-cl'] = "Llaamadas"; +$text['label-callers']['es-cl'] = "Llamadas"; $text['label-callers']['pt-pt'] = ""; $text['label-callers']['fr-fr'] = ""; $text['label-callers']['pt-br'] = ""; From 5eeb5081e988116c7d7e2e9df4469810c50e31d6 Mon Sep 17 00:00:00 2001 From: koldoa Date: Thu, 3 Sep 2015 11:53:28 +0200 Subject: [PATCH 06/10] Detection of SQL backend for random functions --- .../install/scripts/app/ring_groups/index.lua | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 69076397ab..9e6134f554 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -158,6 +158,16 @@ --forward the ring group session:execute("transfer", ring_group_forward_destination.." XML "..context); else + --first we check what version of SQL are we using + sql = "SELECT version() as version"; + assert(dbh:query(sql, function(row) + if (string.find(row.version, "PostgreSQL")) then + sql_verion = 'postgresql' + else + sql_verion = 'mysql' + end + end)); + --get the strategy of the ring group, if random, we use random() to order the destinations sql = [[ SELECT @@ -170,16 +180,21 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ]]; - - --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); + + assert(dbh:query(sql, function(row) if (row.ring_group_strategy == "random") then - sql_order = 'random()' + if (sql_verion == "postgresql") then + sql_order = 'random()' + end + if (sql_verion == "mysql") then + sql_order = 'rand()' + end else sql_order='d.destination_delay, d.destination_number asc' end end)); - + --get the ring group destinations sql = [[ SELECT @@ -194,7 +209,7 @@ AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ORDER BY - ]]..sql_order..[[ + ]]..sql_order..[[ ]]; --freeswitch.consoleLog("notice", "SQL:" .. sql .. "\n"); destinations = {}; From 05cdf54596625f39df9a0ffb22010ebde84503e5 Mon Sep 17 00:00:00 2001 From: koldoa Date: Mon, 7 Sep 2015 08:51:22 +0200 Subject: [PATCH 07/10] Script for enterling/leaving a ring group, based on the fifo code --- resources/install/scripts/ring_member.lua | 145 ++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 resources/install/scripts/ring_member.lua diff --git a/resources/install/scripts/ring_member.lua b/resources/install/scripts/ring_member.lua new file mode 100644 index 0000000000..6fc0cedc62 --- /dev/null +++ b/resources/install/scripts/ring_member.lua @@ -0,0 +1,145 @@ +-- +-- FusionPBX +-- Version: MPL 1.1 +-- +-- The contents of this file are subject to the Mozilla Public License Version +-- 1.1 (the "License"); you may not use this file except in compliance with +-- the License. You may obtain a copy of the License at +-- http://www.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" basis, +-- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +-- for the specific language governing rights and limitations under the +-- License. +-- +-- The Original Code is FusionPBX +-- +-- The Initial Developer of the Original Code is +-- Mark J Crane +-- Copyright (C) 2010 +-- All Rights Reserved. +-- +-- Contributor(s): +-- Koldo A. Marcos + + +--include config.lua + require "resources.functions.config"; + +--connect to the database + require "resources.functions.database_handle"; + dbh = database_handle('system'); + +sounds_dir = ""; +recordings_dir = ""; +pin_number = ""; +max_tries = "3"; +digit_timeout = "3000"; + + +local random = math.random +local function uuid() + local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' + return string.gsub(template, '[xy]', function (c) + local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) + return string.format('%x', v) + end) +end + +if ( session:ready() ) then + session:answer(); + --session:execute("info", ""); + destination_number = session:getVariable("user_name"); + pin_number = session:getVariable("pin_number"); + sounds_dir = session:getVariable("sounds_dir"); + ring_group_uuid = session:getVariable("ring_group_uuid"); + + --get info for the ring group + sql = "SELECT * FROM v_ring_groups "; + sql = sql .. "where ring_group_uuid = '"..ring_group_uuid.."' "; + status = dbh:query(sql, function(row) + domain_uuid = row["domain_uuid"]; + end); + + destination_timeout = 15; + destination_delay = 0; + + + + ring_group_destination_uuid = uuid(); + + --pin number is not required + + --press 1 to login and 2 to logout + menu_selection = session:playAndGetDigits(1, 1, max_tries, digit_timeout, "#", "ivr/ivr-enter_destination_telephone_number.wav", "", "\\d+"); + freeswitch.consoleLog("NOTICE", "menu_selection: "..menu_selection.."\n"); + if (menu_selection == "1") then + --first, check to see if is already in that ring group + sql = [[ + SELECT COUNT(*) AS in_group FROM + v_ring_group_destinations + WHERE + domain_uuid = ']]..domain_uuid..[[' + AND ring_group_uuid = ']]..ring_group_uuid..[[' + AND destination_number = ']]..destination_number..[[' + ]]; + + --freeswitch.consoleLog("NOTICE", "ring_group_member: SQL "..sql.."\n"); + + assert(dbh:query(sql, function(row) + if (row.in_group == "0") then + sql = [[ + INSERT INTO + v_ring_group_destinations + ( ring_group_destination_uuid, + domain_uuid, + ring_group_uuid, + destination_number, + destination_delay, + destination_timeout) + VALUES + ( ']]..ring_group_destination_uuid..[[', + ']]..domain_uuid..[[', + ']]..ring_group_uuid..[[', + ']]..destination_number..[[', + ]]..destination_delay..[[, + ]]..destination_timeout..[[) + + ]]; + + --freeswitch.consoleLog("NOTICE", "ring_group_member: SQL "..sql.."\n"); + dbh:query(sql); + + freeswitch.consoleLog("NOTICE", "ring_group_member: LOG IN\n"); + session:streamFile("ivr/ivr-you_are_now_logged_in.wav"); + + else + freeswitch.consoleLog("NOTICE", "ring_group_member: ALREADY LOGGED IN\n"); + session:streamFile("ivr/ivr-you_are_now_logged_in.wav"); + end + end)); + + + end + if (menu_selection == "2") then + sql = [[ + DELETE FROM + v_ring_group_destinations + WHERE + domain_uuid =']]..domain_uuid..[[' + AND ring_group_uuid=']]..ring_group_uuid..[[' + AND destination_number=']]..destination_number..[[' + ]]; + freeswitch.consoleLog("NOTICE", "ring_group_member: SQL "..sql.."\n"); + dbh:query(sql); + + freeswitch.consoleLog("NOTICE", "ring_group_member: LOG OUT\n"); + session:streamFile("ivr/ivr-you_are_now_logged_out.wav"); + end + + --wait for the file to be written before proceeding + --session:sleep(1000); + + --hangup + session:hangup(); +end From 99e66d5bfcaef381903a8680507246a55d07b468 Mon Sep 17 00:00:00 2001 From: koldoa Date: Mon, 7 Sep 2015 10:47:57 +0200 Subject: [PATCH 08/10] This should fix some of the group permissions issues from issue #1065 --- app/calls/call_edit.php | 2 +- app/voicemail_greetings/voicemail_greetings.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/calls/call_edit.php b/app/calls/call_edit.php index b9b149b954..33934c39dd 100644 --- a/app/calls/call_edit.php +++ b/app/calls/call_edit.php @@ -63,7 +63,7 @@ else { $sql = "select * from v_extensions "; $sql .= "where domain_uuid = '$domain_uuid' "; $sql .= "and extension_uuid = '$extension_uuid' "; - if (!(if_group("admin") || if_group("superadmin"))) { + if (!(permission_exists('follow_me') || permission_exists('call_forward') || permission_exists('do_not_disturb'))) { if (count($_SESSION['user']['extension']) > 0) { $sql .= "and ("; $x = 0; diff --git a/app/voicemail_greetings/voicemail_greetings.php b/app/voicemail_greetings/voicemail_greetings.php index 623a832287..865c66353a 100644 --- a/app/voicemail_greetings/voicemail_greetings.php +++ b/app/voicemail_greetings/voicemail_greetings.php @@ -46,7 +46,7 @@ require_once "resources/check_auth.php"; } //deny access if the user extension is not assigned - if (!(if_group("superadmin") || if_group("admin"))) { + if (!permission_exists('voicemail_greeting_view')) { if (!is_extension_assigned($voicemail_id)) { echo "access denied"; return; From a737d217b69482da0a1b0fd42ed5e9df001a72b4 Mon Sep 17 00:00:00 2001 From: koldoa Date: Mon, 7 Sep 2015 11:48:10 +0200 Subject: [PATCH 09/10] Better code for ring groups --- .../install/scripts/app/ring_groups/index.lua | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 9e6134f554..7a9b596058 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -158,36 +158,25 @@ --forward the ring group session:execute("transfer", ring_group_forward_destination.." XML "..context); else - --first we check what version of SQL are we using - sql = "SELECT version() as version"; - assert(dbh:query(sql, function(row) - if (string.find(row.version, "PostgreSQL")) then - sql_verion = 'postgresql' - else - sql_verion = 'mysql' - end - end)); - --get the strategy of the ring group, if random, we use random() to order the destinations sql = [[ SELECT r.ring_group_strategy FROM - v_ring_groups as r, v_ring_group_destinations as d + v_ring_groups as r WHERE - d.ring_group_uuid = r.ring_group_uuid - AND d.ring_group_uuid = ']]..ring_group_uuid..[[' + ring_group_uuid = ']]..ring_group_uuid..[[' AND r.domain_uuid = ']]..domain_uuid..[[' AND r.ring_group_enabled = 'true' ]]; - + assert(dbh:query(sql, function(row) if (row.ring_group_strategy == "random") then - if (sql_verion == "postgresql") then + if (database["type"] == "postgresql") then sql_order = 'random()' end - if (sql_verion == "mysql") then + if (database["type"] == "mysql") then sql_order = 'rand()' end else From c52fd6c01358e8277678e290e8f899d1cbf85dfa Mon Sep 17 00:00:00 2001 From: koldoa Date: Mon, 7 Sep 2015 12:51:12 +0200 Subject: [PATCH 10/10] This should add better compatibility for more database backends --- resources/install/scripts/app/ring_groups/index.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/install/scripts/app/ring_groups/index.lua b/resources/install/scripts/app/ring_groups/index.lua index 7a9b596058..a8c0b8e266 100644 --- a/resources/install/scripts/app/ring_groups/index.lua +++ b/resources/install/scripts/app/ring_groups/index.lua @@ -173,11 +173,10 @@ assert(dbh:query(sql, function(row) if (row.ring_group_strategy == "random") then - if (database["type"] == "postgresql") then - sql_order = 'random()' - end if (database["type"] == "mysql") then sql_order = 'rand()' + else + sql_order = 'random()' --both postgresql and sqlite uses random() instead of rand() end else sql_order='d.destination_delay, d.destination_number asc'