mirror of
https://github.com/fusionpbx/fusionpbx.git
synced 2025-12-30 00:53:50 +00:00
E911 plugin (#6822)
* E911 Service plugin Emergency Services availability is crucial part of FusionPBX. This plugin Introduce match need it visibility into E911 services.
This commit is contained in:
@@ -613,6 +613,7 @@
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = 'set';
|
||||
if ($dialplan_expression == '(^911$|^933$)') {
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = 'effective_caller_id_number=${emergency_caller_id_number}';
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = 'call_date=${strftime(%d-%b-%Y %r)}';
|
||||
}
|
||||
else {
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = 'effective_caller_id_number=${outbound_caller_id_number}';
|
||||
@@ -628,7 +629,7 @@
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_uuid'] = $dialplan_uuid;
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_tag'] = 'action';
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_type'] = 'lua';
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = "email.lua \${email_to} \${email_from} '' 'Emergency Call' '\${sip_from_user}@\${domain_name} has called 911 emergency'";
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_data'] = "app.lua emergency 1";
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_order'] = $y * 10;
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_group'] = '0';
|
||||
$array['dialplans'][$x]['dialplan_details'][$y]['dialplan_detail_enabled'] = 'false';
|
||||
|
||||
@@ -504,6 +504,46 @@
|
||||
$array['email_templates'][$x]['template_type'] = 'html';
|
||||
$array['email_templates'][$x]['template_enabled'] = 'true';
|
||||
$array['email_templates'][$x]['template_description'] = '';
|
||||
$x++;
|
||||
|
||||
$array['email_templates'][$x]['email_template_uuid'] = '814c08da-78ff-11ee-b73f-005056a27559';
|
||||
$array['email_templates'][$x]['template_language'] = 'en-gb';
|
||||
$array['email_templates'][$x]['template_category'] = 'plugin';
|
||||
$array['email_templates'][$x]['template_subcategory'] = 'emergency';
|
||||
$array['email_templates'][$x]['template_subject'] = '911 Emergency Call';
|
||||
$array['email_templates'][$x]['template_body'] = "<html>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "<body>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "From \${caller_id_name} <a href=\"tel:\${caller_id_number}\">\${caller_id_number}</a><br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Emergency Name \${emergency_caller_id_name}"<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Emergency Name \${emergency_caller_id_number}"<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Received \${message_date}<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Event \${event}<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "</body>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "</html>\n";
|
||||
$array['email_templates'][$x]['template_type'] = 'html';
|
||||
$array['email_templates'][$x]['template_enabled'] = 'true';
|
||||
$array['email_templates'][$x]['template_description'] = '';
|
||||
$x++;
|
||||
|
||||
$array['email_templates'][$x]['email_template_uuid'] = '8928e8d4-78ff-11ee-ac06-005056a27559';
|
||||
$array['email_templates'][$x]['template_language'] = 'en-us';
|
||||
$array['email_templates'][$x]['template_category'] = 'plugin';
|
||||
$array['email_templates'][$x]['template_subcategory'] = 'emergency';
|
||||
$array['email_templates'][$x]['template_subject'] = '911 Emergency Call';
|
||||
$array['email_templates'][$x]['template_body'] = "<html>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "<body>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "From \${caller_id_name} <a href=\"tel:\${caller_id_number}\">\${caller_id_number}</a><br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Emergency Name \${emergency_caller_id_name}"<br />\n";
|
||||
array['email_templates'][$x]['template_body'] .= "Emergency Name \${emergency_caller_id_number}"<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Received \${message_date}<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "Event \${event}<br />\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "</body>\n";
|
||||
$array['email_templates'][$x]['template_body'] .= "</html>\n";
|
||||
$array['email_templates'][$x]['template_type'] = 'html';
|
||||
$array['email_templates'][$x]['template_enabled'] = 'true';
|
||||
$array['email_templates'][$x]['template_description'] = '';
|
||||
|
||||
|
||||
//build array of email template uuids
|
||||
|
||||
96
app/emergency/app_config.php
Normal file
96
app/emergency/app_config.php
Normal file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
//application details
|
||||
$apps[$x]['name'] = 'Emergency Logs';
|
||||
$apps[$x]['uuid'] = 'de63b1ae-7750-11ee-b3a5-005056a27559';
|
||||
$apps[$x]['category'] = 'Emergency Logs';
|
||||
$apps[$x]['subcategory'] = '';
|
||||
$apps[$x]['version'] = '1.0.1';
|
||||
$apps[$x]['license'] = 'Mozilla Public License 1.1';
|
||||
$apps[$x]['contact_url'] = 'http://austen-it.com';
|
||||
$apps[$x]['description']['en-us'] = '';
|
||||
$apps[$x]['description']['es-mx'] = '';
|
||||
$apps[$x]['description']['de'] = '';
|
||||
$apps[$x]['description']['de-ch'] = '';
|
||||
$apps[$x]['description']['de-at'] = '';
|
||||
$apps[$x]['description']['fr'] = '';
|
||||
$apps[$x]['description']['fr-ca'] = '';
|
||||
$apps[$x]['description']['fr-ch'] = '';
|
||||
$apps[$x]['description']['pt-pt'] = '';
|
||||
$apps[$x]['description']['pt-br'] = '';
|
||||
|
||||
//permission details
|
||||
$y=0;
|
||||
$apps[$x]['permissions'][$y]['name'] = "emergency_logs_view";
|
||||
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
|
||||
$apps[$x]['permissions'][$y]['menu']['uuid'] = "23a6fc8a-77f1-11ee-88b0-005056a27559";
|
||||
$y++;
|
||||
$apps[$x]['permissions'][$y]['name'] = "emergency_logs_view_all";
|
||||
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
|
||||
$y++;
|
||||
|
||||
//schema details
|
||||
$z=0;
|
||||
$apps[$x]['db'][$y]['table']['name'] = "v_emergency_logs";
|
||||
$apps[$x]['db'][$y]['table']['parent'] = "";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'log_uuid';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'uuid';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['key']['type'] = 'primary';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'domain_uuid';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'uuid';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'text';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'char(36)';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['key']['type'] = 'foreign';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['table'] = 'v_domains';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['key']['reference']['field'] = 'domain_uuid';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'date';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'text';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'time';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'text';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'extension';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'numeric';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = 'event';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description'] = '';
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = "insert_date";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'timestamptz';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'date';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'date';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = "insert_user";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "uuid";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = "update_date";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'timestamptz';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'date';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = 'date';
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
|
||||
$z++;
|
||||
$apps[$x]['db'][$y]['fields'][$z]['name'] = "update_user";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = "uuid";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = "text";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['type']['mysql'] = "char(36)";
|
||||
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
|
||||
?>
|
||||
35
app/emergency/app_menu.php
Normal file
35
app/emergency/app_menu.php
Normal file
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
$y=0;
|
||||
$apps[$x]['menu'][$y]['title']['en-us'] = "Emergency logs";
|
||||
$apps[$x]['menu'][$y]['title']['en-gb'] = "Emergency logs";
|
||||
$apps[$x]['menu'][$y]['title']['ar-eg'] = "سجلات الطوارئ";
|
||||
$apps[$x]['menu'][$y]['title']['de-at'] = "Notfall-Protokolle";
|
||||
$apps[$x]['menu'][$y]['title']['de-ch'] = "Notfall-Protokolle";
|
||||
$apps[$x]['menu'][$y]['title']['de-de'] = "Notfall-Protokolle";
|
||||
$apps[$x]['menu'][$y]['title']['es-cl'] = "Registros de emergencia";
|
||||
$apps[$x]['menu'][$y]['title']['es-mx'] = "Registros de emergencia";
|
||||
$apps[$x]['menu'][$y]['title']['fr-ca'] = "Journaux d'urgence";
|
||||
$apps[$x]['menu'][$y]['title']['fr-fr'] = "Journaux d'urgence";
|
||||
$apps[$x]['menu'][$y]['title']['he-il'] = "יומן חירום";
|
||||
$apps[$x]['menu'][$y]['title']['it-it'] = "Registri di emergenza";
|
||||
$apps[$x]['menu'][$y]['title']['nl-nl'] = "Logboeken voor noodgevallen";
|
||||
$apps[$x]['menu'][$y]['title']['pl-pl'] = "Dzienniki alarmowe";
|
||||
$apps[$x]['menu'][$y]['title']['pt-br'] = "Registros de emergência";
|
||||
$apps[$x]['menu'][$y]['title']['pt-pt'] = "Registos de emergência";
|
||||
$apps[$x]['menu'][$y]['title']['ro-ro'] = "Jurnale de urgență";
|
||||
$apps[$x]['menu'][$y]['title']['ru-ru'] = "Журналы аварийных ситуаций";
|
||||
$apps[$x]['menu'][$y]['title']['sv-se'] = "Dnevniki za nujne primere";
|
||||
$apps[$x]['menu'][$y]['title']['uk-ua'] = "Журнали аварійних ситуацій";
|
||||
$apps[$x]['menu'][$y]['title']['zh-cn'] = "紧急日志";
|
||||
$apps[$x]['menu'][$y]['title']['ja-jp'] = "緊急ログ";
|
||||
$apps[$x]['menu'][$y]['title']['ko-kr'] = "긴급 상황 로그";
|
||||
$apps[$x]['menu'][$y]['uuid'] = "4404d592-775b-11ee-bb5c-005056a27559";
|
||||
$apps[$x]['menu'][$y]['parent_uuid'] = "0438b504-8613-7887-c420-c837ffb20cb1";
|
||||
$apps[$x]['menu'][$y]['category'] = "internal";
|
||||
$apps[$x]['menu'][$y]['icon'] = "";
|
||||
$apps[$x]['menu'][$y]['path'] = "/app/emergency/emergency.php";
|
||||
$apps[$x]['menu'][$y]['order'] = "";
|
||||
$apps[$x]['menu'][$y]['groups'][] = "superadmin";
|
||||
$y++;
|
||||
?>
|
||||
213
app/emergency/emergency.php
Normal file
213
app/emergency/emergency.php
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
//includes files
|
||||
require_once dirname(__DIR__, 2) . "/resources/require.php";
|
||||
require_once "resources/check_auth.php";
|
||||
require_once "resources/paging.php";
|
||||
|
||||
//check permissions
|
||||
if (permission_exists('emergency_logs_view')) {
|
||||
//access granted
|
||||
}
|
||||
else {
|
||||
echo "access denied";
|
||||
exit;
|
||||
}
|
||||
|
||||
//add multi-lingual support
|
||||
$language = new text;
|
||||
$text = $language->get();
|
||||
|
||||
//get the http post data
|
||||
if (!empty($_POST['emergency_logs']) && is_array($_POST['emergency_logs'])) {
|
||||
$action = $_POST['action'];
|
||||
$search = $_POST['search'];
|
||||
$emergency_logs = $_POST['emergency_logs'];
|
||||
}
|
||||
|
||||
//process the http post data by action
|
||||
if (!empty($action) && !empty($emergency_logs) && is_array($emergency_logs) && @sizeof($emergency_logs) != 0) {
|
||||
|
||||
//validate the token
|
||||
$token = new token;
|
||||
if (!$token->validate($_SERVER['PHP_SELF'])) {
|
||||
message::add($text['message-invalid_token'],'negative');
|
||||
header('Location: emergency.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
//prepare the array
|
||||
if (!empty($emergency_logs)) {
|
||||
foreach ($emergency_logs as $row) {
|
||||
$array['emergency_logs'][$x]['checked'] = $row['checked'];
|
||||
$array['emergency_logs'][$x]['emergency_log_uuid'] = $row['emergency_log_uuid'];
|
||||
$x++;
|
||||
}
|
||||
}
|
||||
|
||||
//prepare the database object
|
||||
$database = new database;
|
||||
$database->app_name = 'emergency_logs';
|
||||
$database->app_uuid = 'de63b1ae-7750-11ee-b3a5-005056a27559';
|
||||
|
||||
//send the array to the database class
|
||||
if (!empty($action) && $action == 'delete') {
|
||||
$database->delete($array);
|
||||
}
|
||||
|
||||
//redirect the user
|
||||
header('Location: emergency.php'.($search != '' ? '?search='.urlencode($search) : null));
|
||||
exit;
|
||||
}
|
||||
|
||||
//get order and order by
|
||||
$order_by = $_GET["order_by"] ?? null;
|
||||
$order = $_GET["order"] ?? null;
|
||||
|
||||
//define the variables
|
||||
$search = '';
|
||||
$show = '';
|
||||
|
||||
//add the search variable
|
||||
if (!empty($_GET["search"])) {
|
||||
$search = strtolower($_GET["search"]);
|
||||
}
|
||||
|
||||
//add the show variable
|
||||
if (!empty($_GET["show"])) {
|
||||
$show = $_GET["show"];
|
||||
}
|
||||
|
||||
|
||||
//get the count
|
||||
$sql = "select count(log_uuid) ";
|
||||
$sql .= "from v_emergency_logs ";
|
||||
if ($show == 'all') {
|
||||
$sql .= "where true ";
|
||||
}
|
||||
else {
|
||||
$sql .= "where domain_uuid = :domain_uuid ";
|
||||
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
||||
}
|
||||
if (!empty($search)) {
|
||||
$sql .= "and ( ";
|
||||
$sql .= " lower(event) like :search ";
|
||||
$sql .= ") ";
|
||||
$parameters['search'] = '%'.$search.'%';
|
||||
}
|
||||
$database = new database;
|
||||
$num_rows = $database->select($sql, $parameters ?? null, 'column');
|
||||
unset($sql, $parameters);
|
||||
|
||||
//prepare to page the results
|
||||
$rows_per_page = ($_SESSION['domain']['paging']['numeric'] != '') ? $_SESSION['domain']['paging']['numeric'] : 50;
|
||||
$param = !empty($search) ? "&search=".$search : null;
|
||||
$param .= (!empty($_GET['page']) && $show == 'all' && permission_exists('user_log_all')) ? "&show=all" : null;
|
||||
$page = !empty($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 0;
|
||||
list($paging_controls, $rows_per_page) = paging($num_rows, $param, $rows_per_page);
|
||||
list($paging_controls_mini, $rows_per_page) = paging($num_rows, $param, $rows_per_page, true);
|
||||
$offset = $rows_per_page * $page;
|
||||
|
||||
//set the time zone
|
||||
if (isset($_SESSION['domain']['time_zone']['name'])) {
|
||||
$time_zone = $_SESSION['domain']['time_zone']['name'];
|
||||
}
|
||||
else {
|
||||
$time_zone = date_default_timezone_get();
|
||||
}
|
||||
|
||||
//get the list
|
||||
$sql = "select * ";
|
||||
$sql .= "from v_emergency_logs ";
|
||||
if ($show == 'all') {
|
||||
$sql .= "where true ";
|
||||
}
|
||||
else {
|
||||
$sql .= "where domain_uuid = :domain_uuid ";
|
||||
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
|
||||
}
|
||||
if (!empty($search)) {
|
||||
$sql .= "and ( ";
|
||||
$sql .= " lower(event) like :search ";
|
||||
$sql .= ") ";
|
||||
$parameters['search'] = '%'.$search.'%';
|
||||
}
|
||||
$sql .= limit_offset($rows_per_page, $offset);
|
||||
|
||||
$database = new database;
|
||||
$emergency_logs = $database->select($sql, $parameters ?? null, 'all');
|
||||
unset($sql, $parameters);
|
||||
|
||||
//create token
|
||||
$object = new token;
|
||||
$token = $object->create($_SERVER['PHP_SELF']);
|
||||
|
||||
//additional includes
|
||||
$document['title'] = 'Emergency Logs';
|
||||
require_once "resources/header.php";
|
||||
|
||||
//show the content
|
||||
echo "<div class='action_bar' id='action_bar'>\n";
|
||||
echo " <div class='heading'><b>Emergency Logs (".$num_rows.")</b></div>\n";
|
||||
echo " <div class='actions'>\n";
|
||||
if ($emergency_logs) {
|
||||
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'id'=>'btn_delete','name'=>'btn_delete','style'=>'display:none;','onclick'=>"modal_open('modal-delete','btn_delete');"]);
|
||||
}
|
||||
echo "<form id='form_search' class='inline' method='get'>\n";
|
||||
if (permission_exists('emergency_logs_view_all')) {
|
||||
if ($show == 'all') {
|
||||
echo "<input type='hidden' name='show' value='all'>\n";
|
||||
}
|
||||
else {
|
||||
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'?show=all&search='.$search]);
|
||||
}
|
||||
}
|
||||
echo "<input type='text' class='txt list-search' name='search' id='search' value=\"".escape($search)."\" placeholder=\"".$text['label-search']."\" onkeydown=''>";
|
||||
echo button::create(['label'=>$text['button-search'],'icon'=>$_SESSION['theme']['button_icon_search'],'type'=>'submit','id'=>'btn_search']);
|
||||
if ($paging_controls_mini != '') {
|
||||
echo "<span style='margin-left: 15px;'>".$paging_controls_mini."</span>\n";
|
||||
}
|
||||
echo " </form>\n";
|
||||
echo " </div>\n";
|
||||
echo " <div style='clear: both;'></div>\n";
|
||||
echo "</div>\n";
|
||||
|
||||
if ($emergency_logs) {
|
||||
echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete'); list_form_submit('form_list');"])]);
|
||||
}
|
||||
|
||||
echo $text['title_description-emergency_logs']."\n";
|
||||
echo "<br /><br />\n";
|
||||
|
||||
echo "<table class='list'>\n";
|
||||
echo "<tr class='list-header'>\n";
|
||||
echo "<th class='left'>Time</th>\n";
|
||||
echo "<th class='left'>Date</th>\n";
|
||||
echo "<th class='left'>Extension</th>\n";
|
||||
echo "<th class='left'>Event</th>\n";
|
||||
echo "</tr>\n";
|
||||
|
||||
if (!empty($emergency_logs) && is_array($emergency_logs) && @sizeof($emergency_logs) != 0) {
|
||||
$x = 0;
|
||||
foreach ($emergency_logs as $row) {
|
||||
echo "<tr class='list-row'>\n";
|
||||
echo " <td>".escape($row['time'])."</td>\n";
|
||||
echo " <td>".escape($row['date'])."</td>\n";
|
||||
echo " <td>".escape($row['extension'])."</td>\n";
|
||||
echo " <td>".escape($row['event'])."</td>\n";
|
||||
echo "</tr>\n";
|
||||
$x++;
|
||||
}
|
||||
unset($emergency_logs);
|
||||
}
|
||||
|
||||
echo "</table>\n";
|
||||
echo "<br />\n";
|
||||
echo "<div align='center'>".$paging_controls."</div>\n";
|
||||
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
|
||||
echo "</form>\n";
|
||||
|
||||
//include the footer
|
||||
require_once "resources/footer.php";
|
||||
|
||||
?>
|
||||
278
app/switch/resources/scripts/app/emergency/index.lua
Normal file
278
app/switch/resources/scripts/app/emergency/index.lua
Normal file
@@ -0,0 +1,278 @@
|
||||
-- emergency.lua
|
||||
-- Part of FusionPBX
|
||||
-- Copyright (C) 2010 - 2022 Mark J Crane <markjcrane@fusionpbx.com>
|
||||
-- All rights reserved.
|
||||
--
|
||||
-- Redistribution and use in source and binary forms, with or without
|
||||
-- modification, are permitted provided that the following conditions are met:
|
||||
--
|
||||
-- 1. Redistributions of source code must retain the above copyright notice,
|
||||
-- this list of conditions and the following disclaimer.
|
||||
--
|
||||
-- 2. Redistributions in binary form must reproduce the above copyright
|
||||
-- notice, this list of conditions and the following disclaimer in the
|
||||
-- documentation and/or other materials provided with the distribution.
|
||||
--
|
||||
-- THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
-- INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
-- AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
-- AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||
-- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
-- POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
--Description:
|
||||
--purpose: send an email queue or email for 911 calls
|
||||
--freeswitch.email(to, from, headers, body, file, convert_cmd, convert_ext)
|
||||
--to (mandatory) a valid email address
|
||||
--from (mandatory) a valid email address
|
||||
--headers (mandatory) for example "subject: you've got mail!\n"
|
||||
--body (optional) your regular mail body
|
||||
--file (optional) a file to attach to your mail
|
||||
--convert_cmd (optional) convert file to a different format before sending
|
||||
--convert_ext (optional) to replace the file's extension
|
||||
|
||||
--Example
|
||||
--luarun emergency.lua to@domain.com from@domain.com 'headers' 'subject' 'body'
|
||||
|
||||
--load libraries
|
||||
local send_mail = require 'resources.functions.send_mail'
|
||||
local Database = require "resources.functions.database"
|
||||
local Settings = require "resources.functions.lazy_settings"
|
||||
local Utils = require "resources.functions.channel_utils";
|
||||
|
||||
--define a function to send email
|
||||
local db = dbh or Database.new('system')
|
||||
local settings = Settings.new(db, domain_name, domain_uuid)
|
||||
local email_queue_enabled = settings:get('email_queue', 'enabled', 'boolean') or "false";
|
||||
|
||||
--get the argv values
|
||||
script_name = argv[0];
|
||||
delete = argv[1];
|
||||
|
||||
--prepare the api object
|
||||
api = freeswitch.API();
|
||||
|
||||
--get sessions info
|
||||
if (session and session:ready()) then
|
||||
domain_uuid = session:getVariable("domain_uuid");
|
||||
domain_name = session:getVariable("domain_name");
|
||||
call_uuid = session:getVariable("uuid");
|
||||
headers = {
|
||||
["X-FusionPBX-Domain-UUID"] = domain_uuid;
|
||||
["X-FusionPBX-Domain-Name"] = domain_name;
|
||||
["X-FusionPBX-Email-Type"] = 'app';
|
||||
["X-FusionPBX-Call-UUID"] = call_uuid;
|
||||
}
|
||||
else
|
||||
headers = {}
|
||||
end
|
||||
|
||||
function escapeCSV(s)
|
||||
if string.find(s, '[,"]') then
|
||||
s = '"' .. string.gsub(s, '"', '""') .. '"'
|
||||
end
|
||||
return s
|
||||
end
|
||||
|
||||
function toCSV(tt)
|
||||
local s = ""
|
||||
for _,p in ipairs(tt) do
|
||||
s = s .. "," .. escapeCSV(p)
|
||||
end
|
||||
return string.sub(s, 2)
|
||||
end
|
||||
|
||||
--connect to the database
|
||||
local dbh = Database.new('system');
|
||||
|
||||
--get the templates
|
||||
local sql = "SELECT * FROM v_email_templates ";
|
||||
sql = sql .. "WHERE template_category = :category ";
|
||||
sql = sql .. "AND template_subcategory = :subcategory ";
|
||||
sql = sql .. "AND template_enabled = :status ";
|
||||
local params = {category = 'plugins', subcategory = 'emergency', status = 'true'}
|
||||
dbh:query(sql, params, function(row)
|
||||
subject = row.template_subject;
|
||||
body = row.template_body;
|
||||
language = row.template_language;
|
||||
end);
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("info", "[emergency] SQL: " .. sql .. "\n");
|
||||
end
|
||||
--freeswitch.consoleLog("info", "[template] SQL: " .. sql .. "body: " .. body .. "\n");
|
||||
|
||||
--get email from
|
||||
local sql = "SELECT * FROM v_default_settings ";
|
||||
sql = sql .. "WHERE default_setting_category = 'email' ";
|
||||
sql = sql .. "AND (default_setting_subcategory = 'smtp_from' ";
|
||||
sql = sql .. "OR default_setting_subcategory = 'smtp_from_name') ";
|
||||
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[emergency] SQL: " .. sql .. "\n");
|
||||
end
|
||||
|
||||
dbh:query(sql, function(row)
|
||||
if (row.default_setting_subcategory == "smtp_from") then
|
||||
from = row.default_setting_value;
|
||||
end
|
||||
if (row.default_setting_subcategory == "smtp_from_name") then
|
||||
from_name = row.default_setting_value;
|
||||
end
|
||||
end);
|
||||
|
||||
|
||||
|
||||
-- get vars
|
||||
domain_uuid = session:getVariable("domain_uuid");
|
||||
call_date = session:getVariable("call_date");
|
||||
caller_id_name = session:getVariable("caller_id_name");
|
||||
caller_id_number = session:getVariable("caller_id_number");
|
||||
sip_from_user = session:getVariable("sip_from_user");
|
||||
emergency_caller_id_name = session:getVariable("emergency_caller_id_name");
|
||||
emergency_caller_id_number = session:getVariable("emergency_caller_id_number");
|
||||
call_duration = session:getVariable("call_duration");
|
||||
|
||||
--domain level check
|
||||
result = {}
|
||||
local sql = "SELECT count(domain_setting_value) ";
|
||||
sql = sql .. "AS total ";
|
||||
sql = sql .. "FROM v_domain_settings ";
|
||||
sql = sql .. "WHERE domain_uuid = :domain_uuid ";
|
||||
sql = sql .. "AND domain_setting_subcategory = :emergency_email_address ";
|
||||
sql = sql .. "AND domain_setting_enabled = :status ";
|
||||
|
||||
local params = {domain_uuid = domain_uuid, emergency_email_address = 'emergency_email_address', status = 't'}
|
||||
|
||||
dbh:query(sql, params, function(result)
|
||||
total = result.total;
|
||||
--no emergency emails found under domain, using default
|
||||
if (total == 0 or total == nil) then
|
||||
to = {}
|
||||
local sql = "SELECT default_setting_value ";
|
||||
sql = sql .. "FROM v_default_settings ";
|
||||
sql = sql .. "WHERE default_setting_category = :category ";
|
||||
sql = sql .. "AND default_setting_subcategory = :emergency_email_address ";
|
||||
sql = sql .. "AND default_setting_enabled = :status ";
|
||||
sql = sql .. "LIMIT 5 ";
|
||||
local params = {category = 'dialplan', emergency_email_address = 'emergency_email_address', status = 't'}
|
||||
dbh:query(sql, params, function(result)
|
||||
for key,row in pairs(result) do
|
||||
table.insert(to, row);
|
||||
freeswitch.consoleLog("info", "[emergency] Inserted into table from default settings " .. row .. "\n");
|
||||
end
|
||||
--add some details
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("notice", "[emergency] SQL: " .. sql .. " result " .. result .. "\n");
|
||||
end
|
||||
end);
|
||||
--domain level emails max 5
|
||||
else if (tonumber(total) <= 5) then
|
||||
to = {}
|
||||
local sql = "SELECT domain_setting_value ";
|
||||
sql = sql .. "FROM v_domain_settings ";
|
||||
sql = sql .. "WHERE domain_uuid = :domain_uuid ";
|
||||
sql = sql .. "AND domain_setting_subcategory = :emergency_email_address ";
|
||||
sql = sql .. "AND domain_setting_enabled = :status ";
|
||||
local params = {domain_uuid = domain_uuid, emergency_email_address = 'emergency_email_address', status = 't'}
|
||||
dbh:query(sql, params, function(result)
|
||||
for key,row in pairs(result) do
|
||||
table.insert(to, row);
|
||||
freeswitch.consoleLog("info", "[template] Inserted into table " .. row .. "\n");
|
||||
end
|
||||
end);
|
||||
end
|
||||
end
|
||||
|
||||
end);
|
||||
|
||||
dbh:release()
|
||||
|
||||
if (#to > 0) then
|
||||
--set event
|
||||
destination_number = session:getVariable("destination_number");
|
||||
if (tonumber(destination_number) == 933) then
|
||||
event = '933 Emergency Address Validation Service';
|
||||
else if (tonumber(destination_number) == 911) then
|
||||
event = '911 Emergency Call';
|
||||
end
|
||||
end
|
||||
|
||||
--prepare the body
|
||||
if (body ~= nil) then
|
||||
body = body:gsub("${caller_id_name}", caller_id_name);
|
||||
body = body:gsub("${caller_id_number}", caller_id_number);
|
||||
body = body:gsub("${emergency_caller_id_name}", emergency_caller_id_name);
|
||||
body = body:gsub("${emergency_caller_id_number}", emergency_caller_id_number);
|
||||
body = body:gsub("${sip_from_user}", sip_from_user);
|
||||
body = body:gsub("${caller_id_number}", caller_id_number);
|
||||
body = body:gsub("${message_date}", call_date);
|
||||
body = body:gsub("${event}", event);
|
||||
body = trim(body);
|
||||
end
|
||||
|
||||
for key,row in ipairs(to) do
|
||||
freeswitch.consoleLog("info", "[emergency] Sending to row " .. row .. " key " .. key .. "\n");
|
||||
--send the email
|
||||
send_mail(headers,
|
||||
from,
|
||||
row,
|
||||
{subject, body}
|
||||
);
|
||||
end
|
||||
end
|
||||
|
||||
-- Insert into Emergency Logs
|
||||
emergency_logs_uuid = api:executeString("create_uuid");
|
||||
domain_uuid = session:getVariable("domain_uuid");
|
||||
|
||||
-- Set time and date
|
||||
local delimiter = " ";
|
||||
local y = 0;
|
||||
local tab = {}
|
||||
|
||||
while true do
|
||||
local endindex = call_date:find(delimiter,y);
|
||||
if not endindex then
|
||||
break
|
||||
end
|
||||
table.insert(tab,call_date:sub(y,endindex-1))
|
||||
y = endindex + 1;
|
||||
end
|
||||
|
||||
table.insert(tab,call_date:sub(y));
|
||||
local time = tab[2] .. " " .. tab[3];
|
||||
|
||||
freeswitch.consoleLog("info", "[emergency] Getting Date " .. tab[1] .. " Time " .. tab[2] .. " Format " .. tab[3] .. "\n");
|
||||
|
||||
--connect to the database
|
||||
local dbh = Database.new('system');
|
||||
|
||||
local sql = "INSERT INTO v_emergency_logs ( ";
|
||||
sql = sql .. " log_uuid, ";
|
||||
sql = sql .. " domain_uuid, ";
|
||||
sql = sql .. " date, ";
|
||||
sql = sql .. " time, ";
|
||||
sql = sql .. " extension, ";
|
||||
sql = sql .. " event ";
|
||||
sql = sql .. ") ";
|
||||
sql = sql .. "VALUES ( ";
|
||||
sql = sql .. " :emergency_logs_uuid, ";
|
||||
sql = sql .. " :domain_uuid, ";
|
||||
sql = sql .. " :date, ";
|
||||
sql = sql .. " :time, ";
|
||||
sql = sql .. " :extension, ";
|
||||
sql = sql .. " :event ";
|
||||
sql = sql .. ") ";
|
||||
|
||||
local params = {emergency_logs_uuid = emergency_logs_uuid,domain_uuid = domain_uuid, date = tab[1], time = time, extension = caller_id_number, event = event}
|
||||
|
||||
if (debug["sql"]) then
|
||||
freeswitch.consoleLog("info", "[emergency] SQL: " .. sql .. "\n");
|
||||
end
|
||||
|
||||
dbh:query(sql, params);
|
||||
dbh:release();
|
||||
Reference in New Issue
Block a user