- add two new logging modes

git-svn-id: http://phpseclib.svn.sourceforge.net/svnroot/phpseclib/trunk@217 21d32557-59b3-4da0-833f-c5933fad653e
This commit is contained in:
Jim Wigginton 2012-04-30 16:25:37 +00:00
parent 9a7d6cdb54
commit 7ef3108d00

View File

@ -143,6 +143,10 @@ define('NET_SSH2_LOG_SIMPLE', 1);
* Returns the message content * Returns the message content
*/ */
define('NET_SSH2_LOG_COMPLEX', 2); define('NET_SSH2_LOG_COMPLEX', 2);
/**
* Outputs the content real-time
*/
define('NET_SSH2_LOG_REALTIME', 3);
/**#@-*/ /**#@-*/
/**#@+ /**#@+
@ -635,6 +639,30 @@ class Net_SSH2 {
*/ */
var $curTimeout; var $curTimeout;
/**
* Real-time log file pointer
*
* @see Net_SSH2::_append_log()
* @access private
*/
var $realtime_log_file;
/**
* Real-time log file size
*
* @see Net_SSH2::_append_log()
* @access private
*/
var $realtime_log_size;
/**
* Real-time log file wrap boolean
*
* @see Net_SSH2::_append_log()
* @access private
*/
var $realtime_log_wrap;
/** /**
* Default Constructor. * Default Constructor.
* *
@ -1874,6 +1902,9 @@ class Net_SSH2 {
function disconnect() function disconnect()
{ {
$this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION); $this->_disconnect(NET_SSH2_DISCONNECT_BY_APPLICATION);
if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) {
fclose($this->realtime_log_file);
}
} }
/** /**
@ -1953,12 +1984,10 @@ class Net_SSH2 {
$this->get_seq_no++; $this->get_seq_no++;
if (defined('NET_SSH2_LOGGING')) { if (defined('NET_SSH2_LOGGING')) {
$temp = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; $message_number = isset($this->message_numbers[ord($payload[0])]) ? $this->message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')';
$this->message_number_log[] = '<- ' . $temp . $message_number = '<- ' . $message_number .
' (' . round($stop - $start, 4) . 's)'; ' (' . round($stop - $start, 4) . 's)';
if (NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { $this->_append_log($message_number, $payload);
$this->_append_log($payload);
}
} }
return $this->_filter($payload); return $this->_filter($payload);
@ -2255,12 +2284,10 @@ class Net_SSH2 {
$stop = strtok(microtime(), ' ') + strtok(''); $stop = strtok(microtime(), ' ') + strtok('');
if (defined('NET_SSH2_LOGGING')) { if (defined('NET_SSH2_LOGGING')) {
$temp = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')'; $message_number = isset($this->message_numbers[ord($data[0])]) ? $this->message_numbers[ord($data[0])] : 'UNKNOWN (' . ord($data[0]) . ')';
$this->message_number_log[] = '-> ' . $temp . $message_number = '-> ' . $message_number .
' (' . round($stop - $start, 4) . 's)'; ' (' . round($stop - $start, 4) . 's)';
if (NET_SSH2_LOGGING == NET_SSH2_LOG_COMPLEX) { $this->_append_log($message_number, $data);
$this->_append_log($data);
}
} }
return $result; return $result;
@ -2274,15 +2301,60 @@ class Net_SSH2 {
* @param String $data * @param String $data
* @access private * @access private
*/ */
function _append_log($data) function _append_log($message_number, $message)
{ {
$this->_string_shift($data); switch (NET_SSH2_LOGGING) {
$this->log_size+= strlen($data); // useful for benchmarks
$this->message_log[] = $data; case NET_SSH2_LOG_SIMPLE:
while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) { $this->message_number_log[] = $message_number;
$this->log_size-= strlen(array_shift($this->message_log)); break;
array_shift($this->message_number_log); // the most useful log for SSH2
} case NET_SSH2_LOG_COMPLEX:
$this->message_number_log[] = $message_number;
$this->_string_shift($message);
$this->log_size+= strlen($message);
$this->message_log[] = $message;
while ($this->log_size > NET_SSH2_LOG_MAX_SIZE) {
$this->log_size-= strlen(array_shift($this->message_log));
array_shift($this->message_number_log);
}
break;
// dump the output out realtime; packets may be interspersed with non packets,
// passwords won't be filtered out and select other packets may not be correctly
// identified
case NET_SSH2_LOG_REALTIME:
echo "<pre>\r\n" . $this->_format_log(array($message), array($message_number)) . "\r\n</pre>\r\n";
flush();
ob_flush();
break;
// basically the same thing as NET_SSH2_LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILE
// needs to be defined and that the resultant log file will be capped out at NET_SSH2_LOG_MAX_SIZE.
// the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily
// at the beginning of the file
case NET_SSH2_LOG_REALTIME_FILE:
if (!isset($this->realtime_log_file)) {
// PHP doesn't seem to like using constants in fopen()
$filename = NET_SSH2_LOG_REALTIME_FILE;
$fp = fopen($filename, 'w');
$this->realtime_log_file = $fp;
}
if (!is_resource($this->realtime_log_file)) {
break;
}
$entry = $this->_format_log(array($message), array($message_number));
if ($this->realtime_log_wrap) {
$temp = "<<< START >>>\r\n";
$entry.= $temp;
fseek($this->realtime_log_file, ftell($this->realtime_log_file) - strlen($temp));
}
$this->realtime_log_size+= strlen($entry);
if ($this->realtime_log_size > NET_SSH2_LOG_MAX_SIZE) {
fseek($this->realtime_log_file, 0);
$this->realtime_log_size = strlen($entry);
$this->realtime_log_wrap = true;
}
fputs($this->realtime_log_file, $entry);
}
} }
/** /**