maintenance.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  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 " }\n";
  216. echo " },\n";
  217. echo " }\n";
  218. echo " },\n";
  219. echo " plugins: [{\n";
  220. echo " id: 'chart_number',\n";
  221. echo " beforeDraw(chart, args, options){\n";
  222. echo " const {ctx, chartArea: {top, right, bottom, left, width, height} } = chart;\n";
  223. echo " ctx.font = chart_text_size + ' ' + chart_text_font;\n";
  224. echo " ctx.textBaseline = 'middle';\n";
  225. echo " ctx.textAlign = 'center';\n";
  226. echo " ctx.fillStyle = '".$dashboard_number_text_color."';\n";
  227. echo " ctx.fillText(options.text, width / 2, top + (height / 2));\n";
  228. echo " ctx.save();\n";
  229. echo " }\n";
  230. echo " }]\n";
  231. echo " }\n";
  232. echo " );\n";
  233. echo " </script>\n";
  234. }
  235. if ($dashboard_chart_type === 'number') {
  236. echo " <span class='hud_stat'>$total_running_maintenance_apps / $total_maintenance_apps</span>";
  237. }
  238. echo " </div>";
  239. //form for maintenance changes
  240. echo " <form id='form_list_maintainers' name='form_list_maintainers' method='POST'>";
  241. echo " <div class='hud_details hud_box' id='hud_maintenance_details' style='text-align: right'>";
  242. //save button for changes
  243. if (permission_exists('maintenance_edit')) {
  244. 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>";
  245. }
  246. echo " <table class='tr_hover' width='100%' cellpadding='0' cellspacing='0' border='0'>";
  247. echo " <tr style='position: -webkit-sticky; position: sticky; z-index: 5; top: 0; left: 2px;'>";
  248. echo " <th class='hud_heading' style='width: 40%;'>".($text['label-app'] ?? 'Application')."</th>";
  249. echo " <th class='hud_heading' style='width: 15%;'>".'Database'."</th>";
  250. echo " <th class='hud_heading' style='width: 15%;'>".'Days'."</th>";
  251. echo " <th class='hud_heading' style='width: 15%;'>".'Filesystem'."</th>";
  252. echo " <th class='hud_heading' style='width: 15%;'>".'Days'."</th>";
  253. echo " </tr>";
  254. //iterate maintainers
  255. foreach($maintainers as $x => $maintenance_app) {
  256. $database_days = "";
  257. $filesystem_days = "";
  258. $database_category = '';
  259. $database_subcategory = '';
  260. $filesystem_category = '';
  261. $filesystem_subcategory = '';
  262. $filesystem_checkbox_state = CHECKBOX_HIDDEN;
  263. $database_checkbox_state = CHECKBOX_HIDDEN;
  264. $database_default_value = "";
  265. $filesystem_default_value = "";
  266. $param = [];
  267. if (class_exists($maintenance_app)) {
  268. $display_name = $maintenance_app;
  269. //check for database status
  270. if (method_exists($maintenance_app, 'database_maintenance')) {
  271. $database_category = maintenance::get_database_category($maintenance_app);
  272. $database_subcategory = maintenance::get_database_subcategory($maintenance_app);
  273. $database_default_value = maintenance::get_app_config_value($database_category, $database_subcategory); //app_config.php default value
  274. $database_days = $setting->get($database_category, $database_subcategory, '');
  275. $display_name = $database_category;
  276. //uuid of setting
  277. $database_setting_uuids = maintenance::find_uuid($database, $database_category, $database_subcategory);
  278. $database_setting_uuid = $database_setting_uuids['uuid'];
  279. $database_setting_table = $database_setting_uuids['table'];
  280. if (empty($database_days)) {
  281. $database_checkbox_state = CHECKBOX_UNCHECKED;
  282. } else {
  283. $database_checkbox_state = CHECKBOX_CHECKED;
  284. }
  285. }
  286. //check for filesystem status
  287. if (method_exists($maintenance_app, 'filesystem_maintenance')) {
  288. $filesystem_category = maintenance::get_filesystem_category($maintenance_app);
  289. $filesystem_subcategory = maintenance::get_filesystem_subcategory($maintenance_app);
  290. $filesystem_default_value = maintenance::get_app_config_value($filesystem_category, $filesystem_subcategory);
  291. $filesystem_days = $setting->get($filesystem_category, $filesystem_subcategory, '');
  292. if (empty($database_category)) {
  293. $display_name = $filesystem_category;
  294. }
  295. //uuid of setting
  296. $filesystem_setting_uuids = maintenance::find_uuid($database, $filesystem_category, $filesystem_subcategory);
  297. $filesystem_setting_uuid = $filesystem_setting_uuids['uuid'];
  298. $filesystem_setting_table = $filesystem_setting_uuids['table'];
  299. if (empty($filesystem_days)) {
  300. $filesystem_checkbox_state = CHECKBOX_UNCHECKED;
  301. } else {
  302. $filesystem_checkbox_state = CHECKBOX_CHECKED;
  303. }
  304. } else {
  305. $filesystem_setting_uuid = '';
  306. $filesystem_setting_table = '';
  307. }
  308. }
  309. //set status and color for database maintenance apps
  310. if ($database_checkbox_state === CHECKBOX_CHECKED) {
  311. $database_checked = "checked='checked'";
  312. }
  313. else {
  314. $database_checked = '';
  315. }
  316. //display the maintanence application
  317. echo "<tr>";
  318. $display_name = ucwords(str_replace('_', ' ', $display_name));
  319. echo " <td valign='top' class='".$row_style[$c]." hud_text'>$display_name</td>";
  320. //
  321. // Database apps
  322. //
  323. //hide or show database maintenance ability
  324. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void' style='width: 1%; text-align: center;'>";
  325. if (permission_exists('maintenance_edit')) {
  326. if ($database_checkbox_state !== CHECKBOX_HIDDEN) {
  327. //enable or disable checkbox
  328. if (substr($setting->get('theme','input_toggle_style', ''), 0, 6) == 'switch') {
  329. echo "<label class='switch'>";
  330. 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');\">";
  331. echo " <span class='slider'></span>";
  332. echo "</label>";
  333. } else {
  334. echo "<select class='formfld' name='database_retention_days[$x][status]'>";
  335. 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>";
  336. 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>";
  337. echo "</select>";
  338. }
  339. } else {
  340. //not a database maintenance application
  341. echo "&nbsp;";
  342. }
  343. } else {
  344. if ($database_checkbox_state !== CHECKBOX_HIDDEN) {
  345. echo $database_checkbox_state === CHECKBOX_CHECKED ? $text['label-enabled'] : $text['label-disabled'];
  346. } else {
  347. //not a database maintenance application
  348. echo "&nbsp;";
  349. }
  350. }
  351. echo " </td>";
  352. //database days input box
  353. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void'>";
  354. //hide the input box if we are hiding the checkbox
  355. if ($database_checkbox_state !== CHECKBOX_CHECKED) {
  356. $database_input_days_style = " display: none;";
  357. } else {
  358. $database_input_days_style = "";
  359. }
  360. //check for permission
  361. if (permission_exists('maintenance_edit')) {
  362. 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) . "'>";
  363. echo "<input type='hidden' id='database_uuid_$x' name='database_retention_days[$x][uuid]' value='$database_setting_uuid'>";
  364. echo "<input type='hidden' id='database_category_$x' name='database_retention_days[$x][category]' value='$database_category'>";
  365. echo "<input type='hidden' id='database_subcategory_$x' name='database_retention_days[$x][subcategory]' value='$database_subcategory'>";
  366. echo "<input type='hidden' id='database_type_$x' name='database_retention_days[$x][type]' value='$database_setting_table'>";
  367. } else {
  368. echo "$database_days";
  369. }
  370. echo " </td>";
  371. //set the checkboxes to checked
  372. if ($filesystem_checkbox_state === CHECKBOX_CHECKED) {
  373. $filesystem_checked = "checked='checked'";
  374. }
  375. else {
  376. $filesystem_checked = '';
  377. }
  378. //
  379. //filesystem apps
  380. //
  381. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void' style='width: 1%; text-align: center;'>";
  382. if (permission_exists('maintenance_edit')) {
  383. if ($filesystem_checkbox_state !== CHECKBOX_HIDDEN) {
  384. if (substr($setting->get('theme','input_toggle_style', ''), 0, 6) == 'switch') {
  385. echo "<label class='switch'>";
  386. 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');\">";
  387. echo " <span class='slider'></span>";
  388. echo "</label>";
  389. } else {
  390. echo "<select class='formfld' id='filesystem_enabled_$x' name='filesystem_retention_days[$x][status]'>";
  391. 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>";
  392. 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>";
  393. echo "</select>";
  394. }
  395. } else {
  396. echo "&nbsp;";
  397. }
  398. } else {
  399. if ($filesystem_checkbox_state !== CHECKBOX_HIDDEN) {
  400. echo $filesystem_checkbox_state === CHECKBOX_CHECKED ? $text['label-enabled'] : $text['label-disabled'];
  401. } else {
  402. //not a database maintenance application
  403. echo "&nbsp;";
  404. }
  405. }
  406. echo " </td>";
  407. //filesystem days input box
  408. echo " <td valign='top' class='".$row_style[$c]." hud_text input tr_link_void'>";
  409. //hide the input box if we are hiding the checkbox
  410. if ($filesystem_checkbox_state !== CHECKBOX_CHECKED) {
  411. $filesystem_input_days_style = " display: none;";
  412. } else {
  413. $filesystem_input_days_style = "";
  414. }
  415. if (permission_exists('maintenance_edit')) {
  416. 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) . "'>";
  417. echo "<input type='hidden' id='filesystem_uuid_$x' name='filesystem_retention_days[$x][uuid]' value='$filesystem_setting_uuid'>";
  418. echo "<input type='hidden' id='filesystem_category_$x' name='filesystem_retention_days[$x][category]' value='$filesystem_category'>";
  419. echo "<input type='hidden' id='filesystem_subcategory_$x' name='filesystem_retention_days[$x][subcategory]' value='$filesystem_subcategory'>";
  420. echo "<input type='hidden' id='filesystem_type_$x' name='filesystem_retention_days[$x][type]' value='$filesystem_setting_table'>";
  421. } else {
  422. echo "$filesystem_days";
  423. }
  424. echo " </td>";
  425. echo "</tr>";
  426. $c = !$c;
  427. }
  428. echo " </table>";
  429. echo " </div>";
  430. //form save submit
  431. if (permission_exists('maintenance_edit')) {
  432. echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>";
  433. }
  434. echo " </form>";
  435. echo " <span class='hud_expander' onclick=\"$('#hud_maintenance_details').slideToggle('fast'); toggle_grid_row_end('Maintenance')\"><span class='fas fa-ellipsis-h'></span></span>";
  436. echo "</div>";
  437. }
  438. ?>