* Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2007 Rodolphe Quiedeville * Copyright (C) 2013 Juanjo Menent * Copyright (C) 2024 Frédéric France * Copyright (C) 2024 MDW * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * \file htdocs/admin/syslog.php * \ingroup syslog * \brief Setup page for logs module */ // Load Dolibarr environment require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; global $conf; if (!$user->admin) { accessforbidden(); } // Load translation files required by the page $langs->loadLangs(array("admin", "other")); $error = 0; $action = GETPOST('action', 'aZ09'); $syslogModules = array(); $activeModules = array(); if (getDolGlobalString('SYSLOG_HANDLERS')) { $activeModules = json_decode($conf->global->SYSLOG_HANDLERS); } $dirsyslogs = array_merge(array('/core/modules/syslog/'), $conf->modules_parts['syslog']); foreach ($dirsyslogs as $reldir) { $dir = dol_buildpath($reldir, 0); $newdir = dol_osencode($dir); if (is_dir($newdir)) { $handle = opendir($newdir); if (is_resource($handle)) { while (($file = readdir($handle)) !== false) { if (substr($file, 0, 11) == 'mod_syslog_' && substr($file, dol_strlen($file) - 3, 3) == 'php') { $file = substr($file, 0, dol_strlen($file) - 4); require_once $newdir.$file.'.php'; $module = new $file(); '@phan-var-force LogHandler $module'; // Show modules according to features level if ($module->getVersion() == 'development' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 2) { continue; } if ($module->getVersion() == 'experimental' && getDolGlobalInt('MAIN_FEATURES_LEVEL') < 1) { continue; } $syslogModules[] = $file; } } closedir($handle); } } } /* * Actions */ // Set modes if ($action == 'set') { $db->begin(); $newActiveModules = array(); $selectedModules = (GETPOSTISSET('SYSLOG_HANDLERS') ? GETPOST('SYSLOG_HANDLERS') : array()); // Save options of handler foreach ($syslogModules as $syslogHandler) { if (in_array($syslogHandler, $syslogModules)) { $module = new $syslogHandler(); '@phan-var-force LogHandler $module'; if (in_array($syslogHandler, $selectedModules)) { $newActiveModules[] = $syslogHandler; } foreach ($module->configure() as $option) { if (GETPOSTISSET($option['constant'])) { dolibarr_del_const($db, $option['constant'], -1); dolibarr_set_const($db, $option['constant'], trim(GETPOST($option['constant'])), 'chaine', 0, '', 0); } } } } $activeModules = $newActiveModules; dolibarr_del_const($db, 'SYSLOG_HANDLERS', -1); // To be sure there is not a setup into another entity dolibarr_set_const($db, 'SYSLOG_HANDLERS', json_encode($activeModules), 'chaine', 0, '', 0); $error = 0; $errors = []; // Check configuration foreach ($activeModules as $modulename) { $module = new $modulename(); '@phan-var-force LogHandler $module'; $res = $module->checkConfiguration(); if (!$res) { $error++; $errors = array_merge($errors, $module->errors); } } if (!$error) { $db->commit(); setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); setEventMessages('', $errors, 'errors'); } } // Set level if ($action == 'setlevel') { $level = GETPOST("level"); $res = dolibarr_set_const($db, "SYSLOG_LEVEL", $level, 'chaine', 0, '', 0); dol_syslog("admin/syslog: level ".$level); if (!($res > 0)) { $error++; } if (!$error) { $file_saves = GETPOST("file_saves"); $res = dolibarr_set_const($db, "SYSLOG_FILE_SAVES", $file_saves, 'chaine', 0, '', 0); dol_syslog("admin/syslog: file saves ".$file_saves); if (!($res > 0)) { $error++; } } if (!$error) { setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { setEventMessages($langs->trans("Error"), null, 'errors'); } } /* * View */ llxHeader('', $langs->trans("SyslogSetup"), '', '', 0, 0, '', '', '', 'mod-admin page-syslog'); $form = new Form($db); $linkback = ''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("SyslogSetup"), $linkback, 'title_setup'); print '
'; $syslogfacility = $defaultsyslogfacility = dolibarr_get_const($db, "SYSLOG_FACILITY", 0); $syslogfile = $defaultsyslogfile = dolibarr_get_const($db, "SYSLOG_FILE", 0); if (!$defaultsyslogfacility) { $defaultsyslogfacility = 'LOG_USER'; } if (!$defaultsyslogfile) { $defaultsyslogfile = 'dolibarr.log'; } $optionmc = ''; if (isModEnabled('multicompany') && $user->entity) { print '
'.$langs->trans("ContactSuperAdminForChange").'
'; $optionmc = 'disabled'; } // Output mode print '
'; print load_fiche_titre($langs->trans("SyslogOutput"), '', ''); print ''; print ''; print '
'; // You can use div-table-responsive-no-min if you don't need reserved height for your table print ''; print ''; print ''; print ''; print ''; print "\n"; foreach ($syslogModules as $moduleName) { $module = new $moduleName(); '@phan-var-force LogHandler $module'; $moduleactive = (int) $module->isActive(); //print $moduleName." = ".$moduleactive." - ".$module->getName()." ".($moduleactive == -1)."
\n"; if (($moduleactive == -1) && getDolGlobalInt('MAIN_FEATURES_LEVEL') == 0) { continue; // Some modules are hidden if not activable and not into debug mode (end user must not see them) } print ''; print ''; print ''; print ''; print "\n"; } print "
'.$langs->trans("Type").''.$langs->trans("Value").'
'; print ' '; print ''; if ($moduleName == 'mod_syslog_syslog') { if (!$module->isActive()) { $langs->load("errors"); print $form->textwithpicto('', $langs->trans("ErrorPHPNeedModule", 'SysLog')); } } print ''; $setuparray = $module->configure(); if ($setuparray) { foreach ($setuparray as $option) { $tmpoption = $option['constant']; $value = ''; if (!empty($tmpoption)) { if (GETPOSTISSET($tmpoption)) { $value = GETPOST($tmpoption); } else { $value = getDolGlobalString($tmpoption); } } else { $value = (isset($option['default']) ? $option['default'] : ''); } print ''.$option['name'].': '; if (!empty($option['example'])) { print '
'.$langs->trans("Example").': '.dol_escape_htmltag($option['example']); } if ($option['constant'] == 'SYSLOG_FILE' && preg_match('/^DOL_DATA_ROOT\/[^\/]*$/', $value)) { $filelogparam = '     '; $filelogparam .= $langs->trans('Download'); $filelogparam .= img_picto($langs->trans('Download').' '.basename($value), 'download', 'class="paddingleft"'); $filelogparam .= ''; print $filelogparam; } } } print '
'; if ($module->getInfo()) { print $form->textwithpicto('', $module->getInfo(), 1, 'help'); } if ($module->getWarning()) { print $form->textwithpicto('', $module->getWarning(), 1, 'warning'); } print '
\n"; print "
\n"; print "
\n"; print '
'."\n\n"; // Level print '
'; print load_fiche_titre($langs->trans("SyslogLevel"), '', ''); print ''; print ''; print '
'; // You can use div-table-responsive-no-min if you don't need reserved height for your table print ''; print ''; print ''; print ''; print "\n"; print ''; print ''; if (!empty($conf->loghandlers['mod_syslog_file']) && isModEnabled('cron')) { print ''; print ''; } print '
'.$langs->trans("Parameter").''.$langs->trans("Value").'
'.$langs->trans("SyslogLevel").''; print ajax_combobox("level"); print '
'.$langs->trans("SyslogFileNumberOfSaves").''; print '   ('.$langs->trans('ConfigureCleaningCronjobToSetFrequencyOfSaves').')
'; print "
\n"; print "
\n"; // End of page llxFooter(); $db->close();