From b77d0dd6c5574d9841cd5d040dfcc351a58ccb82 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 27 Aug 2008 06:58:33 -0400
Subject: [PATCH] - 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

---
 CHANGELOG                        |    5 +
 installer/rcube_install.php      |   16 ++-
 installer/config.php             |  116 +++++++++++++++++++++-------
 program/include/main.inc         |   22 +++-
 installer/check.php              |    3 
 program/include/rcmail.php       |    8 +
 installer/test.php               |    7 +
 program/include/bugs.inc         |    7 +
 config/main.inc.php.dist         |   23 ++++-
 program/steps/mail/sendmail.inc  |   10 --
 program/include/rcube_config.php |    7 +
 11 files changed, 160 insertions(+), 64 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 934b0ee..0b1c4ba 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 5f61b9f..f79232a 100644
--- a/config/main.inc.php.dist
+++ b/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;
diff --git a/installer/check.php b/installer/check.php
index 4ede85c..a314ff7 100644
--- a/installer/check.php
+++ b/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]);
     }
diff --git a/installer/config.php b/installer/config.php
index f691640..194c826 100644
--- a/installer/config.php
+++ b/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>
diff --git a/installer/rcube_install.php b/installer/rcube_install.php
index 0240467..e338253 100644
--- a/installer/rcube_install.php
+++ b/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',
diff --git a/installer/test.php b/installer/test.php
index 0f38da0..0edfcc9 100644
--- a/installer/test.php
+++ b/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);
diff --git a/program/include/bugs.inc b/program/include/bugs.inc
index 78808c3..3cd8534 100644
--- a/program/include/bugs.inc
+++ b/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);
     }
diff --git a/program/include/main.inc b/program/include/main.inc
index d79bd01..2b47978 100644
--- a/program/include/main.inc
+++ b/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);
     }
   }
+}
 
 
 /**
diff --git a/program/include/rcmail.php b/program/include/rcmail.php
index 8a061be..00dca6e 100644
--- a/program/include/rcmail.php
+++ b/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']));
diff --git a/program/include/rcube_config.php b/program/include/rcube_config.php
index db53fe7..43f735b 100644
--- a/program/include/rcube_config.php
+++ b/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);
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index 9888c5a..25d95f9 100644
--- a/program/steps/mail/sendmail.inc
+++ b/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();

--
Gitblit v1.9.1