From b26f654ff75c697650ddd07ef8c00a033d603249 Mon Sep 17 00:00:00 2001 From: Ryan Wagoner Date: Sat, 10 Feb 2007 02:20:28 +0000 Subject: added ajax log viewer to imspector --- packages/imspector/imspector.inc | 101 ++++----- packages/imspector/imspector.xml | 57 ++++-- packages/imspector/services_imspector_logs.php | 270 +++++++++++++++++++++++++ 3 files changed, 361 insertions(+), 67 deletions(-) create mode 100644 packages/imspector/services_imspector_logs.php (limited to 'packages/imspector') diff --git a/packages/imspector/imspector.inc b/packages/imspector/imspector.inc index 70fea3d5..62ec3b5a 100644 --- a/packages/imspector/imspector.inc +++ b/packages/imspector/imspector.inc @@ -4,15 +4,28 @@ /* IMSpector */ + define('IMSPECTOR_RCFILE', '/usr/local/etc/rc.d/imspector.sh'); + define('IMSPECTOR_CONFIG','/usr/local/etc/imspector/imspector.conf'); + function imspector_notice ($msg) { syslog(LOG_NOTICE, "imspector: $msg"); return; } function imspector_warn ($msg) { syslog(LOG_WARNING, "imspector: $msg"); return; } + + function imspector_action ($action) { + if (file_exists(IMSPECTOR_RCFILE)) + mwexec(IMSPECTOR_RCFILE.' '.$action); + } + + function imspector_running () { + if((int)exec("pgrep imspector | wc -l") > 0) + return true; + return false; + } function imspector_config ($name) { global $config; if($config['installedpackages']['imspector']['config'][0]["{$name}"]) return $config['installedpackages']['imspector']['config'][0]["{$name}"]; - else - return NULL; + return NULL; } function write_imspector_config($conf_file, $conf_text) { @@ -38,7 +51,7 @@ switch ($proto) { case "msn": return 1863; - case "icqaim": + case "icq": return 5190; case "yahoo": return 5050; @@ -48,7 +61,7 @@ return NULL; } } - + function before_form_imspector($pkg) { global $config; @@ -64,23 +77,15 @@ function sync_package_imspector() { global $config; global $input_errors; - $configfile = "/usr/local/etc/imspector/imspector.conf"; - $proto=""; - $pf_rules=""; + + config_lock(); /* remove existing rules */ exec("/sbin/pfctl -a imspector -Fr"); - exec("/sbin/pfctl -a imspector -Fn"); + exec("/sbin/pfctl -a imspector -Fn"); - config_lock(); - - if(imspector_config("proto_msn")) $proto .= "msn,"; - if(imspector_config("proto_icqaim")) $proto .= "icqaim,"; - if(imspector_config("proto_yahoo")) $proto .= "yahoo,"; - if(imspector_config("proto_irc")) $proto .= "irc,"; - - if($proto != "") - $proto_array = explode(",",$proto); + if(imspector_config("enable") && imspector_config("proto_array")) + $proto_array = explode(",",imspector_config("proto_array")); if(imspector_config("enable") && imspector_config("iface_array")) $iface_array = explode(",",imspector_config("iface_array")); @@ -103,7 +108,7 @@ if(!$ifaces_active) $ifaces_active = "{$iface}"; else - $ifaces_active .= ", {$iface}"; + $ifaces_active .= ", {$iface}"; } else { imspector_warn("Interface {$iface} has no ip address, ignoring"); } @@ -112,37 +117,36 @@ } } - if($pf_rules != "") { + if($pf_rules) { exec("echo \"{$pf_rules}\" | /sbin/pfctl -a imspector -f -"); - conf_mount_rw(); - $configtext = "plugin_dir=/usr/local/lib/imspector\n"; - - if(imspector_config("proto_msn")) $configtext .= "msn_protocol=on\n"; - if(imspector_config("proto_icqaim")) $configtext .= "icq_protocol=on\n"; - if(imspector_config("proto_yahoo")) $configtext .= "yahoo_protocol=on\n"; - if(imspector_config("proto_irc")) $configtext .= "irc_protocol=on\n"; + + foreach($proto_array as $proto) + $configtext .= "{$proto}_protocol=on\n"; if(imspector_config("filter_badwords")) - $configtext .= "badwords_filename=/usr/local/etc/imspector/badwords.txt\n"; + $configtext .= "badwords_filename=/usr/local/etc/imspector/badwords.txt\n"; - if(imspector_config("log_file")) - { + if(imspector_config("log_file")) { exec("mkdir -p /var/log/imspector"); $configtext .= "file_logging_dir=/var/log/imspector\n"; } - if(imspector_config("log_mysql")) - { + if(imspector_config("log_mysql")) { $configtext .= "mysql_server=".imspector_config("mysql_server")."\n"; $configtext .= "mysql_database=".imspector_config("mysql_database")."\n"; $configtext .= "mysql_username=".imspector_config("mysql_username")."\n"; $configtext .= "mysql_password=".imspector_config("mysql_password")."\n"; } - write_imspector_config($configfile,$configtext); - + /* XXX: for now just enable tracing of errors */ + if(1) { + exec("mkdir -p /tmp/trace"); + $configtext .= "icq_trace_error=on\n"; + } + + /* generate rc file start and stop */ $stop = << "imspector.sh", "start" => $start, "stop" => $stop ) ); - conf_mount_ro(); /* if imspector not running start it */ - if(!is_service_running("imspector")) { + if(!imspector_running()) { imspector_notice("Starting service on interface: {$ifaces_active}"); - start_service("imspector"); + imspector_action("start"); } /* or restart imspector if settings were changed */ elseif($_POST['iface_array']) { imspector_notice("Restarting service on interface: {$ifaces_active}"); - restart_service("imspector"); + imspector_action("restart"); } } } - if(!$iface_array || !$proto_array || $pf_rules = "") { + if(!$iface_array || !$proto_array || !$pf_rules) { /* no parameters user does not want imspector running */ /* lets stop the service and remove the rc file */ if(file_exists("/usr/local/etc/rc.d/imspector.sh")) { if(!imspector_config("enable")) - imspector_notice("Stopping service, imspector disabled"); + imspector_notice("Stopping service: imspector disabled"); else - imspector_notice("Stopping service, no interfaces and/or protocols selected"); + imspector_notice("Stopping service: no interfaces and/or protocols selected"); - stop_service("imspector"); + imspector_action("stop"); conf_mount_rw(); - unlink("/usr/local/etc/rc.d/imspector.sh"); - unlink($configfile); + unlink(IMSPECTOR_RCFILE); + unlink(IMSPECTOR_CONFIG); conf_mount_ro(); } } diff --git a/packages/imspector/imspector.xml b/packages/imspector/imspector.xml index dd5b4301..5a04edad 100644 --- a/packages/imspector/imspector.xml +++ b/packages/imspector/imspector.xml @@ -22,6 +22,17 @@ imspector.sh imspector + + + IMSpector Log Viewer + services_imspector_logs.php + + + IMSpector Settings + /pkg_edit.php?xml=imspector.xml&id=0 + + + Enable IMSpector @@ -36,31 +47,40 @@ 3 interfaces_selection You can use the CTRL or COMMAND key to select multiple interfaces. + - Listen on MSN protocol - proto_msn - checkbox - - - Listen on ICQ/AIM protocol - proto_icqaim - checkbox - - - Listen on Yahoo protocol - proto_yahoo - checkbox - - - Listen on IRC protocol - proto_irc - checkbox + Listen on protocols + proto_array + true + select + 4 + You can use the CTRL or COMMAND key to select multiple protocols. + + + + + + + Enable filtering of bad words filter_badwords checkbox + Replaces words specified in /usr/local/etc/imspector/badwords.txt with * Enable file logging @@ -72,6 +92,7 @@ Enable MySQL logging log_mysql checkbox + Make sure to specify your MySQL credentials below MySQL Server diff --git a/packages/imspector/services_imspector_logs.php b/packages/imspector/services_imspector_logs.php new file mode 100644 index 00000000..816c43dc --- /dev/null +++ b/packages/imspector/services_imspector_logs.php @@ -0,0 +1,270 @@ +. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + +require("guiconfig.inc"); + +/* variables */ +$log_dir = '/var/log/imspector'; + +$protocol_color = '#06264d'; +$local_color = '#1d398b'; +$remote_color = '#2149c1'; +$conversation_color = '#335ebe'; + +$local_user_color = 'blue'; +$local_user_bgcolor = '#e5e5f3'; +$remote_user_color = 'green'; +$remote_user_bgcolor = '#efeffa'; + +/* functions */ +function convert_dir_list ($topdir) { + if (!is_dir($topdir)) return; + if ($dh = opendir($topdir)) { + while (($file = readdir($dh)) !== false) { + if(!preg_match('/^\./', $file) == 0) continue; + if (is_dir("$topdir/$file")) { + $list .= convert_dir_list("$topdir/$file"); + } else { + $list .= "$topdir/$file\n"; + } + } + closedir($dh); + } + return $list; +} + +/* ajax response */ +if ($_POST['mode'] == "render") { + + /* user list */ + print(str_replace(array($log_dir,'/'),array('','|'),convert_dir_list($log_dir))); + print("--END--\n"); + + /* log files */ + if ($_POST['section'] != "none") { + $section = explode('|',$_POST['section']); + $protocol = $section[0]; + $localuser = $section[1]; + $remoteuser = $section[2]; + $conversation = $section[3]; + + /* conversation title */ + print(implode(', ', $section)."\n"); + print("--END--\n"); + + /* conversation content */ + $filename = $log_dir.'/'.implode('/', $section); + if($fd = fopen($filename, 'r')) { + print("\n"); + while (!feof($fd)) { + $line = fgets($fd); + if(feof($fd)) continue; + + preg_match('/([^,]*),([^,]*),([^,]*),(.*)/', $line, $matches); + $address = $matches[1]; + $timestamp = $matches[2]; + $type = $matches[3]; + $data = $matches[4]; + + if($type == '1') $user = "<$remoteuser>"; + if($type == '2') $user = "<$localuser>"; + + if($type == '1') $bgcolor = $remote_user_bgcolor; + if($type == '2') $bgcolor = $local_user_bgcolor; + + $time = strftime("%H:%M:%S", $timestamp); + + print("\n + \n + \n"); + } + print("
[$time]$user$data
\n"); + fclose($fd); + } + } + exit; +} +/* defaults to this page but if no settings are present, redirect to setup page */ +if(!$config['installedpackages']['imspector']['config'][0]['iface_array'] || + !$config['installedpackages']['imspector']['config'][0]['enable']) + Header("Location: /pkg_edit.php?xml=imspector.xml&id=0"); + +$pgtitle = "Services: IMSpector Log Viewer"; +include("head.inc"); +/* put your custom HTML head content here */ +/* using some of the $pfSenseHead function calls */ +//$pfSenseHead->addMeta(""); +//echo $pfSenseHead->getHTML(); +?> + + +

+ +
+ + +
+ + +var section = 'none'; +var moveit = 1; +var the_timeout; + +function xmlhttpPost() +{ + var xmlHttpReq = false; + var self = this; + + if (window.XMLHttpRequest) + self.xmlHttpReq = new XMLHttpRequest(); + else if (window.ActiveXObject) + self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); + + self.xmlHttpReq.open('POST', 'services_imspector_logs.php', true); + self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + + self.xmlHttpReq.onreadystatechange = function() { + if (self.xmlHttpReq && self.xmlHttpReq.readyState == 4) + updatepage(self.xmlHttpReq.responseText); + } + + document.getElementById('im_status').style.display = "inline"; + self.xmlHttpReq.send("mode=render§ion=" + section); +} + +function updatepage(str) +{ + /* update the list of conversations ( if we need to ) */ + var parts = str.split("--END--\\n"); + var lines = parts[0].split("\\n"); + + for (var line = 0 ; line < lines.length ; line ++) { + var a = lines[line].split("|"); + + if (!a[1] || !a[2] || !a[3]) continue; + + /* create titling information if needed */ + if (!document.getElementById(a[1])) { + document.getElementById('im_convos').innerHTML += + "
" + a[1] + "
" + + "
"; + } + if (!document.getElementById(a[1] + "_" + a[2])) { + var imageref = ""; + if (a[0]) imageref = "" + a[1] + ""; + document.getElementById(a[1]).innerHTML += + "
" + imageref + a[2] + "
" + + "
"; + } + if (!document.getElementById(a[1] + "_" + a[2] + "_" + a[3])) { + document.getElementById(a[1] + "_" + a[2]).innerHTML += + "
" + a[3] + "
" + + "
"; + } + if (!document.getElementById(a[1] + "_" + a[2] + "_" + a[3] + "_" + a[4])) { + document.getElementById(a[1] + "_" + a[2] + "_" + a[3]).innerHTML += + "
»" + a[4] + "
"; + } + } + + /* determine the title of this conversation */ + var details = parts[1].split(","); + var title = details[0] + " conversation between " + details[ 1 ] + + " and " + details[2] + ""; + if (!details[1]) title = " "; + if (!parts[2]) parts[2] = " "; + + document.getElementById('im_status').style.display = "none"; + var bottom = parseInt(document.getElementById('im_content').scrollTop); + var bottom2 = parseInt(document.getElementById('im_content').style.height); + var absheight = parseInt( bottom + bottom2 ); + if (absheight == document.getElementById('im_content').scrollHeight) { + moveit = 1; + } else { + moveit = 0; + } + document.getElementById('im_content').innerHTML = parts[2]; + if (moveit == 1) { + document.getElementById('im_content').scrollTop = 0; + document.getElementById('im_content').scrollTop = document.getElementById('im_content').scrollHeight; + } + document.getElementById('im_content_title').innerHTML = title; + the_timeout = setTimeout( "xmlhttpPost();", 5000 ); +} + +function setsection(value) +{ + section = value; + clearTimeout(the_timeout); + xmlhttpPost(); + document.getElementById('im_content').scrollTop = 0; + document.getElementById('im_content').scrollTop = document.getElementById('im_content').scrollHeight; +} + +EOD; +print($zz); +?> + + + + + +
+
 
+ + + + + +
+
+
+
+
+
+
+ + + +
+ + + -- cgit v1.2.3