maintenance.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <?php
  2. /*
  3. * FusionPBX
  4. * Version: MPL 1.1
  5. *
  6. * The contents of this file are subject to the Mozilla Public License Version
  7. * 1.1 (the "License"); you may not use this file except in compliance with
  8. * the License. You may obtain a copy of the License at
  9. * http://www.mozilla.org/MPL/
  10. *
  11. * Software distributed under the License is distributed on an "AS IS" basis,
  12. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  13. * for the specific language governing rights and limitations under the
  14. * License.
  15. *
  16. * The Original Code is FusionPBX
  17. *
  18. * The Initial Developer of the Original Code is
  19. * Mark J Crane <[email protected]>
  20. * Portions created by the Initial Developer are Copyright (C) 2008-2024
  21. * the Initial Developer. All Rights Reserved.
  22. *
  23. * Contributor(s):
  24. * Mark J Crane <[email protected]>
  25. * Tim Fry <[email protected]>
  26. */
  27. //includes files
  28. require_once dirname(__DIR__, 4) . "/resources/require.php";
  29. //connect to the database
  30. if (!isset($database)) {
  31. $database = database::new();
  32. }
  33. //create a token
  34. $token = (new token())->create($_SERVER['PHP_SELF']);
  35. //check permisions
  36. require_once dirname(__DIR__, 4) . "/resources/check_auth.php";
  37. if (permission_exists('xml_cdr_view')) {
  38. //access granted
  39. }
  40. else {
  41. echo "access denied";
  42. exit;
  43. }
  44. //define constants to use for a three position checkbox
  45. const CHECKBOX_HIDDEN = -1;
  46. const CHECKBOX_UNCHECKED = 0;
  47. const CHECKBOX_CHECKED = 1;
  48. //process database post
  49. if (!empty($_POST['database_retention_days'])) {
  50. $records = [];
  51. $update_permissions = new permissions($database);
  52. $index = 0;
  53. foreach($_POST['database_retention_days'] as $row) {
  54. if (empty($row['status']) || empty($row['days'])) {
  55. $row['status'] = 'false';
  56. }
  57. //check enabled/disabled status
  58. $uuid = (empty($row['uuid']) ? uuid() : $row['uuid']);
  59. $table = (empty($row['type']) ? 'default' : $row['type']);
  60. //check table
  61. if ($table !== 'domain' && $table !== 'default') {
  62. header('HTTP/1.1 403 Forbidden', true, 403);
  63. die();
  64. }
  65. $category = $row['category'] ?? '';
  66. $subcategory = $row['subcategory'] ?? '';
  67. if (!empty($category) && !empty($subcategory)) {
  68. $days = $row['days'];
  69. $status = $row['status'];
  70. $records["{$table}_settings"][$index]["{$table}_setting_uuid"] = $uuid;
  71. $records["{$table}_settings"][$index]["{$table}_setting_category"] = $row['category'];
  72. $records["{$table}_settings"][$index]["{$table}_setting_subcategory"] = $row['subcategory'];
  73. $records["{$table}_settings"][$index]["{$table}_setting_value"] = $days;
  74. $records["{$table}_settings"][$index]["{$table}_setting_name"] = 'numeric';
  75. $records["{$table}_settings"][$index]["{$table}_setting_enabled"] = $row['status'];
  76. if (!$update_permissions->exists("v_{$table}_setting_add")) {
  77. $update_permissions->add("v_{$table}_setting_add", 'temp');
  78. }
  79. //compare the current value with the default setting
  80. $index++;
  81. }
  82. }
  83. if (count($records) > 0) {
  84. $database->save($records);
  85. if ($database->message['code'] === "200") {
  86. message::add($text['message-update']);
  87. }
  88. }
  89. unset($update_permissions);
  90. }
  91. //process filesystem post
  92. if (!empty($_POST['filesystem_retention_days'])) {
  93. $records = [];
  94. $index = 0;
  95. $update_permissions = new permissions($database);
  96. foreach($_POST['filesystem_retention_days'] as $row) {
  97. if (empty($row['status']) || empty($row['days'])) {
  98. $row['status'] = 'false';
  99. }
  100. $uuid = (empty($row['uuid']) ? uuid() : $row['uuid']);
  101. $table = (empty($row['type']) ? 'default' : $row['type']);
  102. //check table
  103. if ($table !== 'domain' && $table !== 'default') {
  104. header('HTTP/1.1 403 Forbidden', true, 403);
  105. die();
  106. }
  107. $filesystem_category = $row['category'] ?? '';
  108. $filesystem_subcategory = $row['subcategory'] ?? '';
  109. if (!empty($filesystem_category) && !empty($filesystem_subcategory) && !empty($days)) {
  110. $days = $row['days'] ?? '';
  111. $records["{$table}_settings"][$index]["{$table}_setting_uuid"] = $uuid;
  112. $records["{$table}_settings"][$index]["{$table}_setting_category"] = $filesystem_category;
  113. $records["{$table}_settings"][$index]["{$table}_setting_subcategory"] = $filesystem_subcategory;
  114. $records["{$table}_settings"][$index]["{$table}_setting_value"] = $days;
  115. $records["{$table}_settings"][$index]["{$table}_setting_name"] = 'numeric';
  116. $records["{$table}_settings"][$index]["{$table}_setting_enabled"] = $row['status'];
  117. $index++;
  118. if (!$update_permissions->exists("v_{$table}_setting_add")) {
  119. $update_permissions->add("v_{$table}_setting_add", 'temp');
  120. }
  121. }
  122. }
  123. if (count($records) > 0) {
  124. $database->save($records);
  125. if ($database->message['code'] === "200") {
  126. message::add($text['message-update']);
  127. }
  128. unset($update_permissions);
  129. }
  130. }
  131. //set defaults
  132. $filesystem_count = 0;
  133. $total_running_maintenance_apps = 0;
  134. $total_maintenance_apps = 0;
  135. $maintenance_apps = [];
  136. $validated_path = PROJECT_PATH."/core/dashboard/index.php";
  137. $domain_uuid = $_SESSION['domain_uuid'] ?? '';
  138. $user_uuid = $_SESSION['user_uuid'] ?? '';
  139. //create the settings object for this user and domain
  140. $setting = new settings(['database' => $database, 'domain_uuid' => $domain_uuid, 'user_uuid' => $user_uuid]);
  141. //check the running maintenance apps
  142. $maintainers = $setting->get('maintenance', 'application', []);
  143. //sort the applications
  144. array_multisort($maintainers);
  145. //count the number of apps enabled
  146. foreach ($maintainers as $maintenance_app) {
  147. if (class_exists($maintenance_app)) {
  148. //check for database status
  149. if (method_exists($maintenance_app, 'database_maintenance')) {
  150. $total_maintenance_apps++;
  151. $category = maintenance::get_database_category($maintenance_app);
  152. $subcategory = maintenance::get_database_subcategory($maintenance_app);
  153. if (!empty($setting->get($category, $subcategory, ''))) {
  154. $total_running_maintenance_apps++;
  155. }
  156. }
  157. //check for filesystem status
  158. if (method_exists($maintenance_app, 'filesystem_maintenance')) {
  159. $total_maintenance_apps++;
  160. $category = maintenance::get_filesystem_category($maintenance_app);
  161. $subcategory = maintenance::get_filesystem_subcategory($maintenance_app);
  162. if(!empty($setting->get($category, $subcategory, ''))) {
  163. $total_running_maintenance_apps++;
  164. }
  165. }
  166. }
  167. }
  168. //add multi-lingual support
  169. $language = new text;
  170. $text = $language->get($_SESSION['domain']['language']['code'], 'core/user_settings');
  171. //set the rows to alternate shading background
  172. $c = 0;
  173. $row_style = [];
  174. $row_style[$c] = "row_style0";
  175. $row_style[!$c] = "row_style1";
  176. //show the box content
  177. if (permission_exists('maintenance_view')) {
  178. //show the box
  179. echo "<div class='hud_box'>";
  180. echo " <div class='hud_content' onclick=\"$('#hud_maintenance_details').slideToggle('fast'); toggle_grid_row_end('Maintenance')\">";
  181. echo " <span class='hud_title'><a onclick=\"document.location.href='/app/maintenance/maintenance.php'\">".$text['label-maintenance']."</a></span>";
  182. echo " <script src='/app/maintenance/resources/javascript/maintenance_functions.js'></script>";
  183. if ($dashboard_chart_type === 'doughnut') {
  184. //add an event listener for showing and hiding the days input box
  185. echo " <div class='hud_chart' style='width: 250px;'><canvas id='maintenance_chart'></canvas></div>";
  186. echo " <script>\n";
  187. echo " const maintenance_chart = new Chart(\n";
  188. echo " document.getElementById('maintenance_chart').getContext('2d'),\n";
  189. echo " {\n";
  190. echo " type: 'doughnut',\n";
  191. echo " data: {\n";
  192. echo " labels: ['".$text['label-running'].": ".$total_running_maintenance_apps."', '".$text['label-total'].": ".$total_maintenance_apps."'],\n";
  193. echo " datasets: [{\n";
  194. echo " data: [".$total_running_maintenance_apps.", ".($total_maintenance_apps - $total_running_maintenance_apps)."],\n";
  195. echo " backgroundColor: [\n";
  196. echo " '".($setting->get('theme', 'dashboard_maintenance_chart_main_color') ?? "#2a9df4")."',\n";
  197. echo " '".($setting->get('theme', 'dashboard_maintenance_chart_sub_color') ?? "#d4d4d4")."'\n";
  198. echo " ],\n";
  199. echo " borderColor: '".$setting->get('theme', 'dashboard_chart_border_color')."',\n";
  200. echo " borderWidth: '".$setting->get('theme', 'dashboard_chart_border_width')."',\n";
  201. echo " }]\n";
  202. echo " },\n";
  203. echo " options: {\n";
  204. echo " plugins: {\n";
  205. echo " chart_number: {\n";
  206. echo " text: ".$total_running_maintenance_apps."\n";
  207. echo " },\n";
  208. echo " legend: {\n";
  209. echo " display: true,\n";
  210. echo " position: 'right',\n";
  211. echo " reverse: true,\n";
  212. echo " labels: {\n";
  213. echo " usePointStyle: true,\n";
  214. echo " pointStyle: 'rect',\n";
  215. echo " color: '".$dashboard_label_text_color."'\n";
  216. echo " }\n";
  217. echo " },\n";
  218. echo " }\n";
  219. echo " },\n";
  220. echo " plugins: [{\n";
  221. echo " id: 'chart_number',\n";
  222. echo " beforeDraw(chart, args, options){\n";
  223. echo " const {ctx, chartArea: {top, right, bottom, left, width, height} } = chart;\n";
  224. echo " ctx.font = chart_text_size + ' ' + chart_text_font;\n";
  225. echo " ctx.textBaseline = 'middle';\n";
  226. echo " ctx.textAlign = 'center';\n";
  227. echo " ctx.fillStyle = '".$dashboard_number_text_color."';\n";
  228. echo " ctx.fillText(options.text, width / 2, top + (height / 2));\n";
  229. echo " ctx.save();\n";
  230. echo " }\n";
  231. echo " }]\n";
  232. echo " }\n";
  233. echo " );\n";
  234. echo " </script>\n";
  235. }
  236. if ($dashboard_chart_type === 'number') {
  237. echo " <span class='hud_stat'>$total_running_maintenance_apps / $total_maintenance_apps</span>";
  238. }
  239. echo " </div>";
  240. //form for maintenance changes
  241. echo " <form id='form_list_maintainers' name='form_list_maintainers' method='POST'>";
  242. echo " <div class='hud_details hud_box' id='hud_maintenance_details' style='text-align: right'>";
  243. //save button for changes
  244. if (permission_exists('maintenance_edit')) {
  245. echo " <button type='button' alt='Save' title='Save' onclick=\"list_form_submit('form_list_maintainers');\" class='btn btn-default ' style='position: absolute; margin-top: -35px; margin-left: -72px;'><span class='fas fa-bolt fa-fw'></span><span class='button-label pad'>Save</span></button>";
  246. }
  247. echo " <table class='tr_hover' width='100%' cellpadding='0' cellspacing='0' border='0'>";
  248. echo " <tr style='position: -webkit-sticky; position: sticky; z-index: 5; top: 0; left: 2px;'>";
  249. echo " <th class='hud_heading' style='width: 40%;'>".($text['label-app'] ?? 'Application')."</th>";
  250. echo " <th class='hud_heading' style='width: 15%;'>".'Database'."</th>";
  251. echo " <th class='hud_heading' style='width: 15%;'>".'Days'."</th>";
  252. echo " <th class='hud_heading' style='width: 15%;'>".'Filesystem'."</th>";
  253. echo " <th class='hud_heading' style='width: 15%;'>".'Days'."</th>";
  254. echo " </tr>";
  255. //iterate maintainers
  256. foreach($maintainers as $x => $maintenance_app) {
  257. $database_days = "";
  258. $filesystem_days = "";
  259. $database_category = '';
  260. $database_subcategory = '';
  261. $filesystem_category = '';
  262. $filesystem_subcategory = '';
  263. $filesystem_checkbox_state = CHECKBOX_HIDDEN;
  264. $database_checkbox_state = CHECKBOX_HIDDEN;
  265. $database_default_value = "";
  266. $filesystem_default_value = "";
  267. $param = [];
  268. if (class_exists($maintenance_app)) {
  269. $display_name = $maintenance_app;
  270. //check for database status
  271. if (method_exists($maintenance_app, 'database_maintenance')) {
  272. $database_category = maintenance::get_database_category($maintenance_app);
  273. $database_subcategory = maintenance::get_database_subcategory($maintenance_app);
  274. $database_default_value = maintenance::get_app_config_value($database_category, $database_subcategory); //app_config.php default value
  275. $database_days = $setting->get($database_category, $database_subcategory, '');
  276. $display_name = $database_category;
  277. //uuid of setting
  278. $database_setting_uuids = maintenance::find_uuid($database, $database_category, $database_subcategory);
  279. $database_setting_uuid = $database_setting_uuids['uuid'];
  280. $database_setting_table = $database_setting_uuids['table'];
  281. if (empty($database_days)) {
  282. $database_checkbox_state = CHECKBOX_UNCHECKED;
  283. } else {
  284. $database_checkbox_state = CHECKBOX_CHECKED;
  285. }
  286. } else {
  287. $database_setting_uuid = '';
  288. $database_setting_table = '';
  289. }
  290. //check for filesystem status
  291. if (method_exists($maintenance_app, 'filesystem_maintenance')) {
  292. $filesystem_category = maintenance::get_filesystem_category($maintenance_app);
  293. $filesystem_subcategory = maintenance::get_filesystem_subcategory($maintenance_app);
  294. $filesystem_default_value = maintenance::get_app_config_value($filesystem_category, $filesystem_subcategory);
  295. $filesystem_days = $setting->get($filesystem_category, $filesystem_subcategory, '');
  296. if (empty($database_category)) {
  297. $display_name = $filesystem_category;
  298. }
  299. //uuid of setting
  300. $filesystem_setting_uuids = maintenance::find_uuid($database, $filesystem_category, $filesystem_subcategory);
  301. $filesystem_setting_uuid = $filesystem_setting_uuids['uuid'];
  302. $filesystem_setting_table = $filesystem_setting_uuids['table'];
  303. if (empty($filesystem_days)) {
  304. $filesystem_checkbox_state = CHECKBOX_UNCHECKED;
  305. } else {
  306. $filesystem_checkbox_state = CHECKBOX_CHECKED;
  307. }
  308. } else {
  309. $filesystem_setting_uuid = '';
  310. $filesystem_setting_table = '';
  311. }
  312. }
  313. //set status and color for database maintenance apps
  314. if ($database_checkbox_state === CHECKBOX_CHECKED) {
  315. $database_checked = "checked='checked'";
  316. }
  317. else {
  318. $database_checked = '';
  319. }
  320. //display the maintanence application
  321. echo "<tr>";
  322. $display_name = ucwords(str_replace('_', ' ', $display_name));
  323. echo " <td valign='top' class='".$row_style[$c]." hud_text'>$display_name</td>";
  324. //
  325. // Database apps
  326. //
  327. //hide or show database maintenance ability
  328. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void' style='width: 1%; text-align: center;'>";
  329. if (permission_exists('maintenance_edit')) {
  330. if ($database_checkbox_state !== CHECKBOX_HIDDEN) {
  331. //enable or disable checkbox
  332. if (substr($setting->get('theme','input_toggle_style', ''), 0, 6) == 'switch') {
  333. echo "<label class='switch'>";
  334. echo " <input type='checkbox' name='database_retention_days[$x][status]' value='true' $database_checked onclick=\"this.checked ? show_input_box('database_days_$x') : hide_input_box('database_days_$x');\">";
  335. echo " <span class='slider'></span>";
  336. echo "</label>";
  337. } else {
  338. echo "<select class='formfld' name='database_retention_days[$x][status]'>";
  339. echo " <option value='true' ".($database_checkbox_state === CHECKBOX_CHECKED ? "selected='selected'" : null)." onclick=\"this.selected ? show_input_box('database_days_$x') : null;\">".$text['label-enabled']."</option>";
  340. echo " <option value='false' ".($database_checkbox_state === CHECKBOX_UNCHECKED ? "selected='selected'" : null)." onclick=\"this.selected ? hide_input_box('database_days_$x') : null;\">".$text['label-disabled']."</option>";
  341. echo "</select>";
  342. }
  343. } else {
  344. //not a database maintenance application
  345. echo "&nbsp;";
  346. }
  347. } else {
  348. if ($database_checkbox_state !== CHECKBOX_HIDDEN) {
  349. echo $database_checkbox_state === CHECKBOX_CHECKED ? $text['label-enabled'] : $text['label-disabled'];
  350. } else {
  351. //not a database maintenance application
  352. echo "&nbsp;";
  353. }
  354. }
  355. echo " </td>";
  356. //database days input box
  357. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void'>";
  358. //hide the input box if we are hiding the checkbox
  359. if ($database_checkbox_state !== CHECKBOX_CHECKED) {
  360. $database_input_days_style = " display: none;";
  361. } else {
  362. $database_input_days_style = "";
  363. }
  364. //check for permission
  365. if (permission_exists('maintenance_edit')) {
  366. echo "<input class='formfld' style='width: 20%; min-width: 40px;$database_input_days_style' type='text' name='database_retention_days[$x][days]' id='database_days_$x' placeholder='days' maxlength='255' value='" . ($database_checkbox_state === CHECKBOX_CHECKED ? $database_days : $database_default_value) . "'>";
  367. echo "<input type='hidden' id='database_uuid_$x' name='database_retention_days[$x][uuid]' value='$database_setting_uuid'>";
  368. echo "<input type='hidden' id='database_category_$x' name='database_retention_days[$x][category]' value='$database_category'>";
  369. echo "<input type='hidden' id='database_subcategory_$x' name='database_retention_days[$x][subcategory]' value='$database_subcategory'>";
  370. echo "<input type='hidden' id='database_type_$x' name='database_retention_days[$x][type]' value='$database_setting_table'>";
  371. } else {
  372. echo "$database_days";
  373. }
  374. echo " </td>";
  375. //set the checkboxes to checked
  376. if ($filesystem_checkbox_state === CHECKBOX_CHECKED) {
  377. $filesystem_checked = "checked='checked'";
  378. }
  379. else {
  380. $filesystem_checked = '';
  381. }
  382. //
  383. //filesystem apps
  384. //
  385. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void' style='width: 1%; text-align: center;'>";
  386. if (permission_exists('maintenance_edit')) {
  387. if ($filesystem_checkbox_state !== CHECKBOX_HIDDEN) {
  388. if (substr($setting->get('theme','input_toggle_style', ''), 0, 6) == 'switch') {
  389. echo "<label class='switch'>";
  390. echo " <input type='checkbox' locked id='filesystem_enabled_$x' name='filesystem_retention_days[$x][status]' value='true' $filesystem_checked onclick=\"this.checked ? show_input_box('filesystem_days_$x') : hide_input_box('filesystem_days_$x');\">";
  391. echo " <span class='slider'></span>";
  392. echo "</label>";
  393. } else {
  394. echo "<select class='formfld' id='filesystem_enabled_$x' name='filesystem_retention_days[$x][status]'>";
  395. echo " <option value='true' ".($filesystem_checkbox_state === CHECKBOX_CHECKED ? "selected='selected'" : null)." onclick=\"this.selected ? show_input_box('filesystem_days_$x') : null;\">".$text['label-enabled']."</option>";
  396. echo " <option value='false' ".($filesystem_checkbox_state === CHECKBOX_UNCHECKED ? "selected='selected'" : null)." onclick=\"this.selected ? hide_input_box('filesystem_days_$x') : null;\">".$text['label-disabled']."</option>";
  397. echo "</select>";
  398. }
  399. } else {
  400. echo "&nbsp;";
  401. }
  402. } else {
  403. if ($filesystem_checkbox_state !== CHECKBOX_HIDDEN) {
  404. echo $filesystem_checkbox_state === CHECKBOX_CHECKED ? $text['label-enabled'] : $text['label-disabled'];
  405. } else {
  406. //not a database maintenance application
  407. echo "&nbsp;";
  408. }
  409. }
  410. echo " </td>";
  411. //filesystem days input box
  412. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void'>";
  413. //hide the input box if we are hiding the checkbox
  414. if ($filesystem_checkbox_state !== CHECKBOX_CHECKED) {
  415. $filesystem_input_days_style = " display: none;";
  416. } else {
  417. $filesystem_input_days_style = "";
  418. }
  419. if (permission_exists('maintenance_edit')) {
  420. echo "<input class='formfld' style='width: 20%; min-width: 40px;$filesystem_input_days_style' type='text' name='filesystem_retention_days[$x][days]' id='filesystem_days_$x' placeholder='days' maxlength='255' value='" . ($filesystem_checkbox_state === CHECKBOX_CHECKED ? $filesystem_days : $filesystem_default_value) . "'>";
  421. echo "<input type='hidden' id='filesystem_uuid_$x' name='filesystem_retention_days[$x][uuid]' value='$filesystem_setting_uuid'>";
  422. echo "<input type='hidden' id='filesystem_category_$x' name='filesystem_retention_days[$x][category]' value='$filesystem_category'>";
  423. echo "<input type='hidden' id='filesystem_subcategory_$x' name='filesystem_retention_days[$x][subcategory]' value='$filesystem_subcategory'>";
  424. echo "<input type='hidden' id='filesystem_type_$x' name='filesystem_retention_days[$x][type]' value='$filesystem_setting_table'>";
  425. } else {
  426. echo "$filesystem_days";
  427. }
  428. echo " </td>";
  429. echo "</tr>";
  430. $c = !$c;
  431. }
  432. echo " </table>";
  433. echo " </div>";
  434. //form save submit
  435. if (permission_exists('maintenance_edit')) {
  436. echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>";
  437. }
  438. echo " </form>";
  439. echo " <span class='hud_expander' onclick=\"$('#hud_maintenance_details').slideToggle('fast'); toggle_grid_row_end('Maintenance')\"><span class='fas fa-ellipsis-h'></span></span>";
  440. echo "</div>";
  441. }