summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--it.class76
1 files changed, 45 insertions, 31 deletions
diff --git a/it.class b/it.class
index 77b4b89..37741c2 100644
--- a/it.class
+++ b/it.class
@@ -116,14 +116,15 @@ function timerlog($label = '')
/**
- * Send error report either to browser (on devel/twin machines) or by email to .diffnotice guys
- * @parma $title (optional) error title, one line
- * @param $body (optional) error body, multiline
- * @param $to (optional) comma separated recipient list
- * @param named parameter id identifier of error. if given, only subsequent errors of same id will trigger message
- * @param named parameter graceperiod number of seconds within which additional errors are ignored if id is set
- * @param named parameter timewindow number of seconds after graceperiod within which the second error must occur if id is set
- * @param named parameter backtraceskip number of stack levels to drop
+ * Send verbose error report to browser or (if display_errors is off) by email to .diffnotice guys. All params optional.
+ * @parma $p['title'] error title, one line
+ * @param $p['body'] error body, multiline
+ * @param $p['to'] comma separated recipient list
+ * @param $p['id'] identifier of error. if given, only subsequent errors of same id will trigger message
+ * @param $p['graceperiod'] number of seconds within which additional errors are ignored if id is set
+ * @param $p['timewindow'] number of seconds after graceperiod within which the second error must occur if id is set
+ * @param $p['backtraceskip'] number of stack levels to drop
+ * @param $p['blockmail'] number of seconds to block mails after having sent a mail [3600]
*/
function error($p = array(), $body = "", $to = "")
{
@@ -131,60 +132,73 @@ function error($p = array(), $body = "", $to = "")
$p = array('title' => $p, 'body' => $body, 'to' => $to);
if ($_SERVER['REMOTE_ADDR'])
- $url = ($_SERVER['HTTPS'] ? "https://" : "http://") . $_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI'];
+ $url = ($_SERVER['HTTPS'] ? "https://" : "http://") . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+ else
+ $url = $_SERVER['SCRIPT_NAME'];
+ $gods = strtr(trim(@file_get_contents($GLOBALS['ULTRAHOME'] . "/.diffnotice")), array("\n"=>', '));
$p += array(
- 'timewindow' => 25*3600,
+ 'title' => "it::error",
+ 'to' => $gods ? $gods : ($_SERVER['SERVER_ADMIN'] ? $_SERVER['SERVER_ADMIN'] : get_current_user()),
'graceperiod' => 60,
+ 'timewindow' => 25*3600,
'backtraceskip' => 0,
- 'to' => strtr(trim(@file_get_contents($GLOBALS['ULTRAHOME'] . "/.diffnotice")), array("\n"=>', ')),
- 'title' => "Error in $url",
+ 'blockmail' => 3600,
);
- $toscreen = !ereg('live', $GLOBALS['ULTRASERVERTYPE']);
+ $toscreen = ini_get('display_errors') || EDC('astwin') || EDC('asdevel');
if (!$toscreen) # this error can only be sent by mail: find out if we want to suppress it
{
@mkdir("/tmp/alertdata");
@chmod("/tmp/alertdata", 0777);
- if ($p['id'])
- {
- $stampfn = "/tmp/alertdata/errstamp_" . urlencode($p['id']);
- $stampage = time() - @filemtime($stampfn);
- $sendmail = $stampage >= $p['graceperiod'] && $stampage <= $p['graceperiod'] + $p['timewindow'];
- }
+ if (!$p['id'])
+ $sendmail = true;
else
{
- $stampfn = "/tmp/alertdata/lastsent_" . getmyuid() . "." . md5($p['to']);
- $sendmail = time() - @filemtime($stampfn) > 3600;
+ $errstampfn = "/tmp/alertdata/errstamp_" . urlencode($p['id']);
+ $errstampage = time() - @filemtime($errstampfn);
+ $sendmail = $errstampage >= $p['graceperiod'] && $errstampage <= $p['graceperiod'] + $p['timewindow'];
+ if ($errstampage > $p['graceperiod'])
+ {
+ @unlink($errstampfn);
+ @touch($errstampfn);
+ }
}
- if ($sendmail || $stampage > $p['graceperiod']) # mark time of sending mail or of encountering initial $p['id'] error
+ if ($sendmail)
{
- @unlink($stampfn);
- touch($stampfn);
+ $lastsentfn = "/tmp/alertdata/lastsent_" . getmyuid() . "." . md5($p['to']);
+ if (($sendmail = time() - @filemtime($lastsentfn) > $p['blockmail']))
+ {
+ @unlink($lastsentfn);
+ @touch($lastsentfn);
+ }
}
}
if ($toscreen || $sendmail)
{
- $trace = it_debug::backtrace($p['backtraceskip']); # in here for performance
+ $trace = it_debug::backtrace($p['backtraceskip']); # moved in here for performance in mass error case
$body = ($body ? trim($body)."\n\n" : "") . ($url && !$toscreen? "Url: $url\n\n" : "") . ($trace ? ($sendmail?"" :" ")."Trace: $trace\n\n" : "");
if ($sendmail) # we're mailing: send maximum info
{
- $body .= "Locals: " . print_r($p['locals'], true) . "\n\n\$_REQUEST: ".print_r($_REQUEST, true) . "\n\$_SERVER: " . print_r($_SERVER, true) . "\n\n";
- if ($trace) # this is only set if no excessive memory usage
- $body .= "Stack: " . print_r(debug_backtrace(), true) . "\n\n";
-
- mail($p['to'], $p['title'], $body);
+ $body .= $p['locals'] ? "Locals: " . print_r($p['locals'], true) . "\n\n" : "";
+ $body .= $_GET ? "\$_GET: " . print_r($_GET, true) . "\n\n" : "";
+ $body .= $_POST ? "\$_POST: " . print_r($_POST, true) . "\n\n" : "";
+ $body .= $_COOKIE ? "\$_COOKIE: " . print_r($_COOKIE, true) . "\n\n" : "";
+ $body .= $_SERVER ? "\$_SERVER: " . print_r($_SERVER, true) . "\n\n" : "";
+ $body .= $trace ? "Stack: " . print_r(debug_backtrace(), true) . "\n\n" : "";
+
+ mail($p['to'], $p['title'], $body, "From: " . get_current_user());
}
else if ($_SERVER['REMOTE_ADDR']) # in shell mode we rely on error_log below
echo "<pre>{$p['title']}\n$body</pre>";
}
- error_log("it::error: " . $p['title'] . " in " . ($trace ? $trace : $p['line']) . (EDC('verbose') ? D($p['locals']) : ""));
+ error_log("it::error: " . $p['title'] . " in " . ($trace ? $trace : $p['line']) . " Url: $url " . (EDC('verbose') ? D($p['locals']) : ""));
}