alecpl
2008-08-27 b77d0dd6c5574d9841cd5d040dfcc351a58ccb82
- added options to use syslog instead of log file (#1484850)
- added Logging & Debugging section in Installer
- fixed config from $_POST for next installer steps saving
- fixed and re-enabled debug_level setting in installer


11 files modified
224 ■■■■ changed files
CHANGELOG 5 ●●●●● patch | view | raw | blame | history
config/main.inc.php.dist 23 ●●●● patch | view | raw | blame | history
installer/check.php 3 ●●●●● patch | view | raw | blame | history
installer/config.php 116 ●●●● patch | view | raw | blame | history
installer/rcube_install.php 16 ●●●●● patch | view | raw | blame | history
installer/test.php 7 ●●●● patch | view | raw | blame | history
program/include/bugs.inc 7 ●●●● patch | view | raw | blame | history
program/include/main.inc 22 ●●●●● patch | view | raw | blame | history
program/include/rcmail.php 8 ●●●● patch | view | raw | blame | history
program/include/rcube_config.php 7 ●●●● patch | view | raw | blame | history
program/steps/mail/sendmail.inc 10 ●●●● patch | view | raw | blame | history
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
config/main.inc.php.dist
@@ -18,6 +18,23 @@
// 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;
@@ -96,12 +113,6 @@
// 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;
installer/check.php
@@ -116,9 +116,6 @@
    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]);
    }
installer/config.php
@@ -15,6 +15,7 @@
  '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 @@
<fieldset>
<legend>General configuration</legend>
<dl class="configblock">
<!--
<dt id="cgfblockgeneral" class="propname">debug_level</dt>
<dd>
<?php
/*
$value = $RCI->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 '<label for="cfgdebug1">Log errors</label><br />';
echo $check_debug->show(($value & 4) ? 4 : 0, array('value' => 4, 'id' => 'cfgdebug4'));
echo '<label for="cfgdebug4">Display errors</label><br />';
echo $check_debug->show(($value & 8) ? 8 : 0, array('value' => 8, 'id' => 'cfgdebug8'));
echo '<label for="cfgdebug8">Verbose display</label><br />';
*/
?>
</dd>
-->
<dt class="propname">product_name</dt>
<dd>
@@ -89,16 +71,6 @@
<div>Use this folder to store temp files (must be writebale for webserver)</div>
</dd>
<dt class="propname">log_dir</dt>
<dd>
<?php
$input_logdir = new html_inputfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
echo $input_logdir->show($RCI->getprop('log_dir'));
?>
<div>Use this folder to store log files (must be writebale for webserver)</div>
</dd>
<dt class="propname">ip_check</dt>
<dd>
@@ -152,6 +124,90 @@
</dl>
</fieldset>
<fieldset>
<legend>Logging & Debugging</legend>
<dl class="loggingblock">
<dt class="propname">debug_level</dt>
<dd>
<?php
$value = $RCI->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 '<label for="cfgdebug1">Log errors</label><br />';
echo $check_debug->show(($value & 4) ? 4 : 0, array('value' => 4, 'id' => 'cfgdebug4'));
echo '<label for="cfgdebug4">Print errors (to the browser)</label><br />';
echo $check_debug->show(($value & 8) ? 8 : 0, array('value' => 8, 'id' => 'cfgdebug8'));
echo '<label for="cfgdebug8">Verbose display (enables debug console)</label><br />';
?>
</dd>
<dt class="propname">log_driver</dt>
<dd>
<?php
$select_log_driver = new html_select(array('name' => '_log_driver', 'id' => "cfglogdriver"));
$select_log_driver->add(array('file', 'syslog'), array('file', 'syslog'));
echo $select_log_driver->show($RCI->getprop('log_driver', 'file'));
?>
<div>How to do logging? 'file' - write to files in the log directory, 'syslog' - use the syslog facility.</div>
</dd>
<dt class="propname">log_dir</dt>
<dd>
<?php
$input_logdir = new html_inputfield(array('name' => '_log_dir', 'size' => 30, 'id' => "cfglogdir"));
echo $input_logdir->show($RCI->getprop('log_dir'));
?>
<div>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.</div>
</dd>
<dt class="propname">syslog_id</dt>
<dd>
<?php
$input_syslogid = new html_inputfield(array('name' => '_syslog_id', 'size' => 30, 'id' => "cfgsyslogid"));
echo $input_syslogid->show($RCI->getprop('syslog_id', 'roundcube'));
?>
<div>What ID to use when logging with syslog. Note that this only applies if you are using the 'syslog' log_driver.</div>
</dd>
<dt class="propname">syslog_facility</dt>
<dd>
<?php
$input_syslogfacility = new html_select(array('name' => '_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);
?>
<div>What ID to use when logging with syslog.  Note that this only applies if you are using the 'syslog' log_driver.</div>
</dd>
</dl>
</fieldset>
<fieldset>
<legend>Database setup</legend>
@@ -378,7 +434,7 @@
echo $check_smtplog->show(intval($RCI->getprop('smtp_log')), array('value' => 1));
?>
<label for="cfgsmtplog">Log sent messages in <tt>logs/sendmail</tt></label><br />
<label for="cfgsmtplog">Log sent messages in <tt>{log_dir}/sendmail</tt> or to syslog.</label><br />
</dd>
</dl>
installer/rcube_install.php
@@ -100,7 +100,7 @@
   */
  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 @@
      $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 @@
      // 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',
installer/test.php
@@ -35,7 +35,12 @@
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);
program/include/bugs.inc
@@ -84,8 +84,13 @@
      $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);
    }
program/include/main.inc
@@ -828,16 +828,24 @@
                 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);
    }
  }
}
/**
program/include/rcmail.php
@@ -82,6 +82,13 @@
  {
    $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));
@@ -110,7 +117,6 @@
      $_SESSION['auth_time'] = time();
      $_SESSION['temp'] = true;
    }
    // create user object
    $this->set_user(new rcube_user($_SESSION['user_id']));
program/include/rcube_config.php
@@ -82,7 +82,12 @@
    // 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);
program/steps/mail/sendmail.inc
@@ -420,19 +420,13 @@
  {
  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();