diff --git a/CHANGELOG b/CHANGELOG index 934b0ee9a..0b1c4ba54 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,11 @@ CHANGELOG RoundCube Webmail --------------------------- +2008/08/27 (alec) +---------- +- Added options to use syslog instead of log file (#1484850) +- Added Logging & Debugging section in Installer + 2008/08/26 (alec) ---------- - Removed support for PEAR::DB driver diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index 5f61b9fe7..f79232a3e 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -18,6 +18,23 @@ $rcmail_config = array(); // system error reporting: 1 = log; 2 = report (not implemented yet), 4 = show, 8 = trace $rcmail_config['debug_level'] = 1; +// log driver: 'syslog' or 'file'. +$rcmail_config['log_driver'] = 'file'; + +// Syslog ident string to use, if using the 'syslog' log driver. +$rcmail_config['syslog_id'] = 'roundcube'; + +// Syslog facility to use, if using the 'syslog' log driver. +// For possible values see installer or http://php.net/manual/en/function.openlog.php +$rcmail_config['syslog_facility'] = LOG_USER; + +// use this folder to store log files (must be writebale for apache user) +// This is used by the 'file' log driver. +$rcmail_config['log_dir'] = 'logs/'; + +// use this folder to store temp files (must be writeable for apache user) +$rcmail_config['temp_dir'] = 'temp/'; + // enable caching of messages and mailbox data in the local database. // this is recommended if the IMAP server does not run on the same machine $rcmail_config['enable_caching'] = TRUE; @@ -97,12 +114,6 @@ $rcmail_config['list_cols'] = array('subject', 'from', 'date', 'size', 'flag'); // includes should be interpreted as PHP files $rcmail_config['skin_include_php'] = FALSE; -// use this folder to store temp files (must be writeable for apache user) -$rcmail_config['temp_dir'] = 'temp/'; - -// use this folder to store log files (must be writeable for apache user) -$rcmail_config['log_dir'] = 'logs/'; - // session lifetime in minutes $rcmail_config['session_lifetime'] = 10; diff --git a/installer/check.php b/installer/check.php index 4ede85c95..a314ff72d 100644 --- a/installer/check.php +++ b/installer/check.php @@ -116,9 +116,6 @@ foreach ($required_libs as $classname => $file) { if (class_exists($classname)) { $RCI->pass($classname); } - else if ($classname == 'DB' || ($classname == 'MDB2' && class_exists('DB'))) { - $RCI->na($classname, 'Use ' . ($classname == 'DB' ? 'MDB2' : 'DB') . ' instead'); - } else { $RCI->fail($classname, "Failed to load $file", $source_urls[$classname]); } diff --git a/installer/config.php b/installer/config.php index f6916406e..194c82600 100644 --- a/installer/config.php +++ b/installer/config.php @@ -15,6 +15,7 @@ $RCI->config_props = array( 'prefer_html' => 1, 'preview_pane' => 1, 'htmleditor' => 1, + 'debug_level' => 1, ); // allow the current user to get to the next step @@ -47,25 +48,6 @@ if (!empty($_POST['submit'])) {
General configuration
-
product_name
@@ -89,16 +71,6 @@ echo $input_tempdir->show($RCI->getprop('temp_dir'));
Use this folder to store temp files (must be writebale for webserver)
-
log_dir
-
- '_log_dir', 'size' => 30, 'id' => "cfglogdir")); -echo $input_logdir->show($RCI->getprop('log_dir')); - -?> -
Use this folder to store log files (must be writebale for webserver)
-
ip_check
@@ -153,6 +125,90 @@ echo $check_caching->show(intval($RCI->getprop('enable_spellcheck')), array('val
+
+Logging & Debugging +
+ +
debug_level
+
+getprop('debug_level'); +$check_debug = new html_checkbox(array('name' => '_debug_level[]')); +echo $check_debug->show(($value & 1) ? 1 : 0 , array('value' => 1, 'id' => 'cfgdebug1')); +echo '
'; + +echo $check_debug->show(($value & 4) ? 4 : 0, array('value' => 4, 'id' => 'cfgdebug4')); +echo '
'; + +echo $check_debug->show(($value & 8) ? 8 : 0, array('value' => 8, 'id' => 'cfgdebug8')); +echo '
'; + +?> +
+ +
log_driver
+
+ '_log_driver', 'id' => "cfglogdriver")); +$select_log_driver->add(array('file', 'syslog'), array('file', 'syslog')); +echo $select_log_driver->show($RCI->getprop('log_driver', 'file')); + +?> +
How to do logging? 'file' - write to files in the log directory, 'syslog' - use the syslog facility.
+
+ +
log_dir
+
+ '_log_dir', 'size' => 30, 'id' => "cfglogdir")); +echo $input_logdir->show($RCI->getprop('log_dir')); + +?> +
Use this folder to store log files (must be writebale for webserver). Note that this only applies if you are using the 'file' log_driver.
+
+ +
syslog_id
+
+ '_syslog_id', 'size' => 30, 'id' => "cfgsyslogid")); +echo $input_syslogid->show($RCI->getprop('syslog_id', 'roundcube')); + +?> +
What ID to use when logging with syslog. Note that this only applies if you are using the 'syslog' log_driver.
+
+ +
syslog_facility
+
+ '_syslog_facility', 'id' => "cfgsyslogfacility")); +$input_syslogfacility->add('user-level messages', LOG_USER); +$input_syslogfacility->add('mail subsystem', LOG_MAIL); +$input_syslogfacility->add('local level 0', LOG_LOCAL0); +$input_syslogfacility->add('local level 1', LOG_LOCAL1); +$input_syslogfacility->add('local level 2', LOG_LOCAL2); +$input_syslogfacility->add('local level 3', LOG_LOCAL3); +$input_syslogfacility->add('local level 4', LOG_LOCAL4); +$input_syslogfacility->add('local level 5', LOG_LOCAL5); +$input_syslogfacility->add('local level 6', LOG_LOCAL6); +$input_syslogfacility->add('local level 7', LOG_LOCAL7); +echo $input_syslogfacility->show($RCI->getprop('syslog_facility'), LOG_USER); + +?> +
What ID to use when logging with syslog. Note that this only applies if you are using the 'syslog' log_driver.
+
+ + + + +
+
+ +
Database setup
@@ -378,7 +434,7 @@ $check_smtplog = new html_checkbox(array('name' => '_smtp_log', 'id' => "cfgsmtp echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1)); ?> -
+
diff --git a/installer/rcube_install.php b/installer/rcube_install.php index 024046755..e3382537e 100644 --- a/installer/rcube_install.php +++ b/installer/rcube_install.php @@ -100,7 +100,7 @@ class rcube_install */ function getprop($name, $default = '') { - $value = $this->is_post && (isset($_POST["_$name"]) || $this->config_props[$name]) ? $_POST["_$name"] : $this->config[$name]; + $value = $this->config[$name]; if ($name == 'des_key' && !$this->configured && !isset($_REQUEST["_$name"])) $value = rcube_install::random_key(24); @@ -127,11 +127,12 @@ class rcube_install $value = (isset($_POST["_$prop"]) || $this->config_props[$prop]) ? $_POST["_$prop"] : $default; // convert some form data - if ($prop == 'debug_level' && is_array($value)) { + if ($prop == 'debug_level') { $val = 0; - foreach ($value as $i => $dbgval) - $val += intval($dbgval); - $value = $val; + if (isset($value)) + foreach ($value as $dbgval) + $val += intval($dbgval); + $value = $val; } else if ($prop == 'db_dsnw' && !empty($_POST['_dbtype'])) { if ($_POST['_dbtype'] == 'sqlite') @@ -168,7 +169,10 @@ class rcube_install // skip this property if ($value == $default) continue; - + + // save change + $this->config[$prop] = $value; + // replace the matching line in config file $out = preg_replace( '/(\$rcmail_config\[\''.preg_quote($prop).'\'\])\s+=\s+(.+);/Uie', diff --git a/installer/test.php b/installer/test.php index 0f38da059..0edfcc904 100644 --- a/installer/test.php +++ b/installer/test.php @@ -35,7 +35,12 @@ else if (!$read_db) { if ($RCI->configured) { $pass = false; - foreach (array($RCI->config['temp_dir'],$RCI->config['log_dir']) as $dir) { + + $dirs[] = $RCI->config['temp_dir']; + if($RCI->config['log_driver'] != 'syslog') + $dirs[] = $RCI->config['log_dir']; + + foreach ($dirs as $dir) { $dirpath = $dir{0} == '/' ? $dir : INSTALL_PATH . $dir; if (is_writable(realpath($dirpath))) { $RCI->pass($dir); diff --git a/program/include/bugs.inc b/program/include/bugs.inc index 78808c321..3cd853478 100644 --- a/program/include/bugs.inc +++ b/program/include/bugs.inc @@ -84,8 +84,13 @@ function log_bug($arg_arr) $CONFIG['log_dir'] = INSTALL_PATH.'logs'; // try to open specific log file for writing - if ($fp = @fopen($CONFIG['log_dir'].'/errors', 'a')) + if ($CONFIG['log_driver'] == 'syslog') { + syslog(LOG_ERR, $log_entry); + } + else if ($fp = @fopen($CONFIG['log_dir'].'/errors', 'a')) + { + // log_driver == 'file' is the default, assumed here. fwrite($fp, $log_entry); fclose($fp); } diff --git a/program/include/main.inc b/program/include/main.inc index d79bd01d2..2b4797873 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -828,16 +828,24 @@ function write_log($name, $line) date("d-M-Y H:i:s O", mktime()), $line); - if (empty($CONFIG['log_dir'])) - $CONFIG['log_dir'] = INSTALL_PATH.'logs'; + if ($CONFIG['log_driver'] == 'syslog') { + if ($name == 'errors') + $prio = LOG_ERR; + else + $prio = LOG_INFO; + syslog($prio, $log_entry); + } else { + // log_driver == 'file' is assumed here + if (empty($CONFIG['log_dir'])) + $CONFIG['log_dir'] = INSTALL_PATH.'logs'; - // try to open specific log file for writing - if ($fp = @fopen($CONFIG['log_dir'].'/'.$name, 'a')) - { - fwrite($fp, $log_entry); - fclose($fp); + // try to open specific log file for writing + if ($fp = @fopen($CONFIG['log_dir'].'/'.$name, 'a')) { + fwrite($fp, $log_entry); + fclose($fp); } } +} /** diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 8a061beb9..00dca6ea6 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -82,6 +82,13 @@ class rcmail { $config_all = $this->config->all(); + // initialize syslog + if ($this->config->get('log_driver') == 'syslog') { + $syslog_id = $this->config->get('syslog_id', 'roundcube'); + $syslog_facility = $this->config->get('syslog_facility', LOG_USER); + openlog($syslog_id, LOG_ODELAY, $syslog_facility); + } + // set task and action properties $this->set_task(strip_quotes(get_input_value('_task', RCUBE_INPUT_GPC))); $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC)); @@ -111,7 +118,6 @@ class rcmail $_SESSION['temp'] = true; } - // create user object $this->set_user(new rcube_user($_SESSION['user_id'])); diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php index db53fe7e1..43f735ba9 100644 --- a/program/include/rcube_config.php +++ b/program/include/rcube_config.php @@ -82,7 +82,12 @@ class rcube_config // set PHP error logging according to config if ($this->prop['debug_level'] & 1) { ini_set('log_errors', 1); - ini_set('error_log', $this->prop['log_dir'] . '/errors'); + + if ($this->prop['log_driver'] == 'syslog') { + ini_set('error_log', 'syslog'); + } else { + ini_set('error_log', $this->prop['log_dir'].'/errors'); + } } if ($this->prop['debug_level'] & 4) { ini_set('display_errors', 1); diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 9888c5a97..25d95f949 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -420,19 +420,13 @@ else { if ($CONFIG['smtp_log']) { - $log_entry = sprintf( + write_log('sendmail', sprintf( "[%s] User: %d on %s; Message for %s; %s\n", date("d-M-Y H:i:s O", mktime()), $_SESSION['user_id'], $_SERVER['REMOTE_ADDR'], $mailto, - !empty($smtp_response) ? join('; ', $smtp_response) : ''); - - if ($fp = @fopen($CONFIG['log_dir'].'/sendmail', 'a')) - { - fwrite($fp, $log_entry); - fclose($fp); - } + !empty($smtp_response) ? join('; ', $smtp_response) : '')); } rcmail_compose_cleanup();