SF.net SVN: logwatch:[63]

[email protected]
Newsgroups gmane.comp.log.logwatch.devel
Message-ID <[email protected]>
Revision: 63
          http://logwatch.svn.sourceforge.net/logwatch/?rev=63&view=rev
Author:   stefjakobs
Date:     2011-06-30 14:26:13 +0000 (Thu, 30 Jun 2011)

Log Message:
-----------
added: service script for Citadel Groupware.
       (A rough version, will need some more work)

Added Paths:
-----------
    conf/logfiles/citadel.conf
    conf/services/citadel.conf
    scripts/services/citadel

Added: conf/logfiles/citadel.conf
===================================================================
--- conf/logfiles/citadel.conf	                        (rev 0)
+++ conf/logfiles/citadel.conf	2011-06-30 14:26:13 UTC (rev 63)
@@ -0,0 +1,25 @@
+##########################################################################
+# $Id$
+##########################################################################
+
+########################################################
+# This was written and is maintained by:
+#    Stefan Jakobs <[email protected]>
+#
+# Please send all comments, suggestions, bug reports,
+#    etc, to <[email protected]>.
+########################################################
+
+# What actual file?  Defaults to LogPath if not absolute path....
+LogFile = citadel.log
+
+# If the archives are searched, here is one or more line
+# (optionally containing wildcards) that tell where they are...
+Archive = citadel.log.*
+
+# Keep only the lines in the proper date range...
+*ApplyStdDate 
+
+
+# vi: shiftwidth=3 tabstop=3 et
+

Added: conf/services/citadel.conf
===================================================================
--- conf/services/citadel.conf	                        (rev 0)
+++ conf/services/citadel.conf	2011-06-30 14:26:13 UTC (rev 63)
@@ -0,0 +1,32 @@
+###########################################################################
+# $Id:$
+###########################################################################
+
+# You can put comments anywhere you want to.  They are effective for the
+# rest of the line.
+
+# this is in the format of <name> = <value>.  Whitespace at the beginning
+# and end of the lines is removed.  Whitespace before and after the = sign
+# is removed.  Everything is case *insensitive*.
+
+# Yes = True  = On  = 1
+# No  = False = Off = 0
+
+Title = "Citadel"
+
+# Which logfile group...
+LogFile = citadel
+
+# Only give lines pertaining to the citadel service...
+*OnlyService = "citadel"
+*RemoveHeaders
+
+########################################################
+# This was written and is maintained by:
+#   Stefan Jakobs <logwatch at localside.net> 
+#
+# Please send all comments, suggestions, bug reports,
+#    etc, to logwatch at localside.net.
+########################################################
+
+# vi: shiftwidth=3 tabstop=3 et

Added: scripts/services/citadel
===================================================================
--- scripts/services/citadel	                        (rev 0)
+++ scripts/services/citadel	2011-06-30 14:26:13 UTC (rev 63)
@@ -0,0 +1,1180 @@
+###########################################################################
+# $Id: citadel,v 1.3 2011/06/30 13:05:28 general Exp $
+###########################################################################
+
+###########################################################################
+# This was written and is maintained by:
+#    Stefan Jakobs <logwatch at localside.net>
+#
+# Please send all comments, suggestions, bug reports,
+#    etc, to logwatch at localside.net.
+###########################################################################
+# Copyright (c) 2011 Stefan Jakobs
+# Covered under the included MIT/X-Consortium License:
+#    http://www.opensource.org/licenses/mit-license.php
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+###########################################################################
+
+#use warnings;
+use strict;
+
+my $Detail 	= $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
+my $Version	= "0.1-20110109";
+
+# initialize logwatch variables 
+my $ThisLine	= "";
+my %OtherList 	= ();
+
+# initialize variables which save the stats
+my ($Starts,%Stops,$Reloads);
+my (%Warnings);
+my (%RSSfeeds);
+my (%SMTPclientRelay, %SMTPclientStats, %SMTPclientCMDS);
+my (%SMTPclientDelivery, %SMTPclientBounce, %SMTPclientConnect);
+my ($SMTPclient_queuerun, $SMTPclient_messages, $SMTPclientBounces) = (0, 0, 0);
+my (%SMTPserverStats, %SMTPserverRelay, %SMTPserverCMDS);
+my (%SMTPserverHELO, %SMTPserverRCPT, %SMTPserverFROM);
+my (%SMTPServerEval, %SMTPserverAuth, %SMTPSSLError);
+my ($SMTPserverNumRCPTs) = (0);
+my ($serv_extnotify_queuerun) = (0);
+my (%Threads);
+my (%IMAPCmds, %IMAPexpunge, %IMAPUserLogin);
+my ($IMAPCompletedCmds, $IMAPCmdDuration) = (0, 0);
+my (%Ctdlcmds, %CtdlCleanup, %Ctdlqp_encode, %CtdlValRcpt, %CtdlMsgCorrupted);
+my (%CtdlReplChecks, %CtdlAddContact, %CtdlFileOp);
+my ($CtdlMsgDeleted) = (0);
+my (@CtdlLogDeleted);
+my ($NetProcessingTime, $NetProcessingCount) = (0, 0);
+my (%NetStarts, %NetNodes, %NetProc, %NetNoConnect);
+my (%WebClientEngine, %WebClientHost, %WebLoginFailure, %WebUserLogin);
+my ($SieveMsgID, $SieveName, $SieveStarts);
+my (%SieveMsg, %SieveExecute, %SieveProcFor);
+my (%POPCmds, %POPClientConnects, %POPErrors);
+my ($POPCompletedCmds, $POPClientStarted, $POPClientEnded) = (0, 0, 0);
+my (%POPDauth);
+my (%SessionStarted);
+
+### Parse the lines ###
+
+while (defined($ThisLine = <STDIN>)) {
+   chomp($ThisLine);
+
+   # ignore general messages
+   if ( ($ThisLine =~ /^-- db checkpoint --$/) ||
+        ($ThisLine =~ /^$/) ||
+        ($ThisLine =~ /^This program is distributed under the terms/) ||
+        ($ThisLine =~ /^Copyright \(C\) [-\d]+ by the Citadel/) ||
+        ($ThisLine =~ /^<.*> \d+ new of \d+ total messages$/) ||
+        ($ThisLine =~ /^(?:TDAP_)?AdjRefCount\(\) msg \d+/) 
+   ) {
+      # ignore these lines
+   }
+
+   ### Start, Stop, Reload ###
+   elsif ($ThisLine =~ /^\*\*\* Citadel server engine/) {
+      $Starts++;
+   }
+   
+   #TD: citserver: Exiting with status 15
+   elsif ($ThisLine =~ /^citserver: Exiting with status (\d+)$/) {
+     $Stops{$1}++;
+   }
+
+
+   ### Thread processing ###
+   elsif ($ThisLine =~ /^(?:Thread|Created a new thread|Garbage Collection for thread)/) {
+ 
+      #TD: Created a new thread "SMTP Send" (0x40504950).
+      if ($ThisLine =~ /Created a new thread "(.+)" \(([x0-9a-fA-F]+)\)/) {
+         $Threads{"created"}{$1}{$2}++;
+      }
+
+      #TD: Thread "SMTP Send" (0x40504950) exited.
+      #TD: Thread "RSS Client" (0x40605950) exited.
+      elsif ($ThisLine =~ /^Thread "(.+)" \(([x0-9a-fA-F]+)\) exited/) {
+         $Threads{"exited"}{$1}{$2}++;
+      }
+
+      #TD: Garbage Collection for thread "RSS Client" (0x40605950).
+      elsif ($ThisLine =~ /^Garbage Collection for thread "(.+)" \(([x0-9a-fA-F]+)\)/) {
+         $Threads{"garbage collection"}{$1}{$2}++;
+      }
+
+      else {
+         # Report any unmatched entries...
+         chomp($ThisLine);
+         $OtherList{$ThisLine}++;
+      }
+   }
+
+   ### Sessions ###
+   elsif ( ($ThisLine =~ /^\[[ \d]+\] Session ended/) ||
+           ($ThisLine =~ /^Client disconnected: ending session\.$/) ||
+           ($ThisLine =~ /^New client socket \d+$/) ||
+           ($ThisLine =~ /^Terminated \d+ idle sessions$/) 
+   ) {
+      # ignore these lines
+   }
+   #TD: Session (IMAPS) started from myhost (192.168.36.150)
+   #TD: Session (citadel-TCP) started from localhost.localdomain (127.0.0.1).
+   #TD: Session (LMTP) started via local socket UID:101.
+   elsif ($ThisLine =~ /^Session \(([\w-]+)\) started (?:from (\S+) \(([\da-fA-F.:]+)\)|via (local socket) (UID:-?\d+))/) { 
+      $SessionStarted{$1}{"$2$4 [$3$5]"}++;
+   }
+
+
+   ### RSS feed processing ###
+   elsif ( ($ThisLine =~ /^\S+ has already been seen/) ||
+           ($ThisLine =~ /^RSS: XML Status \[\(null\)\]/) ||
+           ($ThisLine =~ /^RSS: This is an (?:RSS|RDF) feed/) ||
+           ($ThisLine =~ /^RSS: saving item/) ||
+           ($ThisLine =~ /^rssclient (?:started|ended)/)
+   ) {
+      # ignore these lines
+   }
+
+   #TD: Fetching RSS feed <http://www.heise.de/open/news/news.rdf>
+   elsif ($ThisLine =~ /Fetching RSS feed <(\S+)>/) {
+      $RSSfeeds{$1}++;
+   }
+
+   ### serv_something processing ###
+   elsif ($ThisLine =~ /^serv_extnotify: queue run completed/)
+   {
+      # ignore these lines
+   }
+
+   elsif ($ThisLine =~ /^serv_extnotify: processing notify queue/) {
+      $serv_extnotify_queuerun++;
+   }
+
+
+   ### SMTP Client ###
+   elsif ( ($ThisLine =~ /^SMTP client: processing outbound queue/) ||
+           ($ThisLine =~ /^SMTP client: smtp_do_procmsg\(\d+\)$/) ||
+           ($ThisLine =~ /^SMTP client: Trying <.*>$/) ||
+           ($ThisLine =~ /^SMTP client: Attempting delivery to /) ||
+           ($ThisLine =~ /^SMTP client: connected!/) ||
+           ($ThisLine =~ /Number of MX hosts for /) ||
+           ($ThisLine =~ /^<?\d{3} \w/) ||
+           ($ThisLine =~ /^smtp_do_bounce\(\) called$/) ||
+           ($ThisLine =~ /^key=<(?:msgid|submitted)?> addr=<.*> status=\d+ dsn=<.*>$/) ||
+           ($ThisLine =~ /^Done processing bounces$/)
+   ) {
+      # ignore these lines
+   }
+
+   #TD: SMTP client: connecting to localhost : 25 ...
+   elsif ($ThisLine =~ /^SMTP client: connecting to (\S+) : (\d+)/) {
+      $SMTPclientConnect{"$1:$2"}++;
+   }
+
+   #TD: >EHLO valaskjalf.localside.net
+   #TD: >MAIL FROM:<[email protected]>
+   #TD: >QUIT
+   elsif ($ThisLine =~ /^>([A-Z ]+)(?::<(.+)>)?/) {
+      $SMTPclientCMDS{$1}{$2}++;
+   }
+ 
+   #TD: SMTP client: delivery to <useraddr> @ <gmail.com> (user) succeeded
+   elsif ($ThisLine =~ /SMTP client: delivery to <(.*)> @ <(.*)> \(.*\) (\w+)$/) {
+      $SMTPclientDelivery{$3}{$2}{$1}++;
+   }
+
+   #TD: 108319: to=<[email protected]>, relay=localhost, stat=2.0.0 Ok, id=10168-06, from MTA([127.0.0.1]:10025): 250 2.0.0 Ok: queued as 2901498D0082
+   elsif ($ThisLine =~ /^\d+: to=<(.*)>, relay=(\S*), stat=([\d\.]{3,5}.*?),/) {
+      if ($2 != "") { $SMTPclientRelay{$2}{$1}++; }
+      $SMTPclientStats{$3}++;
+   }
+
+   #TD: key=<bounceto> addr=<Stefan@valaskjalf> status=0 dsn=<>
+   elsif ($ThisLine =~ /^key=<bounceto> addr=<(.*)> status=(\d+) dsn=<(.*)>$/) {
+      $SMTPclientBounce{$1}{"$2: $3"}++;
+   }
+
+   #TD: num_bounces = 0
+   elsif ($ThisLine =~ /^num_bounces = (\d+)$/) {
+      $SMTPclientBounces += $1;
+   }
+
+   elsif ($ThisLine =~ /^SMTP client: queue run completed; \d+ messages processed/) {
+      $SMTPclient_queuerun++;
+      $SMTPclient_messages++;
+   }
+
+   ### SMTP Server ###
+   elsif ( ($ThisLine =~ /^Directory key is <.*>$/) ||
+           ($ThisLine =~ /is being forwarded to/) ||
+           ($ThisLine =~ /^[:\[] get \S*\]?$/) ||
+           ($ThisLine =~ /^<\d{3}[ -]\w+/) ||
+           ($ThisLine =~ /^SSL\/TLS using /) ||
+           ($ThisLine =~ /Ending SSL\/TLS$/) ||
+           ($ThisLine =~ /^(?:Performing|Finished) SMTP cleanup hook$/) ||
+           ($ThisLine =~ /^sending \d+ [A-Z]+ for the room/) 	# this belongs to validate_recipients()
+   ) {
+      # ignore these lines
+   }
+
+   elsif ($ThisLine =~ /^SMTP server:/) {
+
+      #TD: SMTP server: LHLO vs243073.vserver.de
+      if ($ThisLine =~ /^SMTP server: (?:LHLO|HELO|EHLO) (\S+)/) {
+         $SMTPserverHELO{$1}++;
+      }
+ 
+      #TD: SMTP server: RCPT TO:<[email protected]>
+      elsif ($ThisLine =~ /^SMTP server: RCPT TO:<(.+)>$/) {
+         $SMTPserverRCPT{$1}++;
+      }
+
+      #TD: SMTP server: MAIL FROM:<[email protected]> SIZE=2982 BODY=7BIT
+      elsif ($ThisLine =~ /^SMTP server: MAIL FROM:<(.+)> SIZE=(\d+)(?: BODY=(.*))?$/) {
+         my $body = "no BODY";
+         if ($3 != "") { $body = $3; }
+         $SMTPserverFROM{$1}{$body}{$2}++;
+      }
+
+      #TD: SMTP server: DATA
+      elsif ($ThisLine =~ /^SMTP server: (DATA|QUIT|STARTTLS|AUTH PLAIN)/) {
+         $SMTPserverCMDS{$1}++;
+      }
+
+      else {
+         # Report any unmatched entries...
+         chomp($ThisLine);
+         $OtherList{$ThisLine}++;
+      }
+   }
+
+   #TD: SMTP authenticated Stefan
+   elsif ($ThisLine =~ /^SMTP authenticated (.*)$/) {
+      $SMTPserverAuth{$1}++;
+   }
+
+   #TD: 108347: from=<postfix-7kn/[email protected]>, nrcpts=1, relay= [], stat=250 Message accepted
+   elsif ($ThisLine =~ /^\d+: from=<(.*)>, nrcpts=(\d+), relay=(.*) \[(\S*)\], stat=(\d{3}.*)\.$/) {
+      $SMTPserverNumRCPTs += $2;
+      if ($4 != "") { $SMTPserverRelay{"$4 ($3)"}{$1}++; }
+      $SMTPserverStats{$5}++;
+   }
+
+   #TD: Evaluating recipient #0: [email protected]
+   elsif ($ThisLine =~ /^Evaluating recipient #\d+: (\S+)$/) {
+      $SMTPServerEval{$1}++;
+   }
+
+   #TD: SSL_read got error 5
+   elsif ($ThisLine =~ /^SSL_(\S+) got error (\d+)$/) {
+      $SMTPSSLError{$1}{$2}++;
+   }
+
+   ### IMAP processing ###
+   elsif ( ($ThisLine =~ /^\(That translates to/) ||
+           ($ThisLine =~ /^imap_do_expunge\(\) called/) ||
+           ($ThisLine =~ /^Section is: \[\(empty\)\]/) ||
+           ($ThisLine =~ /^[\w ]+ already exists\.$/) ||
+           ($ThisLine =~ /^(?:before| after) update:/) ||
+           ($ThisLine =~ /^(?:Performing|Finished) IMAP cleanup hook$/) ||
+           ($ThisLine =~ /^Converting CRLF to LF$/) 
+   ) {
+      # ignore these lines
+   }
+ 
+   elsif ($ThisLine =~ /^IMAP/) {
+   
+      if ( ($ThisLine =~ /^IMAP: <plain_auth>$/) 
+      ) {
+         # ignore these lines
+      }
+   # improve: IMAPCmdDuration per Command.
+      #TD: IMAP command completed in 0.1437 seconds
+      elsif ($ThisLine =~ /^IMAP command completed in (\d+\.\d+) seconds/)
+      {
+         $IMAPCompletedCmds++;
+         $IMAPCmdDuration += $1;
+      }
+
+      #TD: IMAP: 10117 NOOP
+      #TD: IMAP: 10120 LIST "" "Server Level/%"
+      #TD: IMAP: a003 LOGOUT
+      elsif ($ThisLine =~ /^IMAP: a?\d+ ([A-Z ]+)/) {
+         $IMAPCmds{$1}++;
+      }
+  
+      #TD: IMAP: LOGIN...
+      elsif ($ThisLine =~ /^IMAP: (LOGIN)/) {
+         $IMAPCmds{$1}++;
+      }
+
+      else {
+         # Report any unmatched entries...
+         chomp($ThisLine);
+         $OtherList{$ThisLine}++;
+      }
+   }
+
+   #TD: <Stefan> logged in
+   elsif ($ThisLine =~ /<(.+)> logged in$/) {
+      $IMAPUserLogin{$1}++;
+   }
+
+   #TD: Expunged 0 messages from <SpamAssassin-user>
+   elsif ($ThisLine =~ /^Expunged (\d+) messages from <(.+)>/) {
+      if ($1 > 0) { $IMAPexpunge{$2} += $1; } 
+   }
+
+   ### Citadel internal processing ###
+   elsif ( ($ThisLine =~ /^Selected room/) ||
+           ($ThisLine =~ /^Performing before-save hooks$/) ||
+           ($ThisLine =~ /^Saving to disk$/) ||
+           ($ThisLine =~ /^Creating MetaData record$/) ||
+           ($ThisLine =~ /^Storing pointers$/) ||
+           ($ThisLine =~ /^Updating user$/) ||
+           ($ThisLine =~ /^\d+ unique messages to be merged$/) ||
+           ($ThisLine =~ /^Performing room hooks for <.+>$/) ||
+           ($ThisLine =~ /^Performing after-save hooks$/) ||
+           ($ThisLine =~ /^Wordbreaking message \d+/) ||
+           ($ThisLine =~ /^Purge use table: /) ||
+           ($ThisLine =~ /^Purge (?:euid|EUID) index: /) ||
+           ($ThisLine =~ /^Changed to <.*>$/) ||
+           ($ThisLine =~ /^do_fulltext_indexing\(\)/) ||
+           ($ThisLine =~ /^Indexed \d+ of \d+ messages/) ||
+           ($ThisLine =~ /^ft_index_message\(\) (?:adding|removing) msg/) ||
+           ($ThisLine =~ /^fixed_output(?:_pre|_post)?\(\) (?:part|type)/) ||
+           ($ThisLine =~ /^Skipping part \d+/) ||
+           ($ThisLine =~ /^Indexing message \d+ \[\d+ tokens\]/) || 
+           ($ThisLine =~ /^Indexing message #\d+ <.*>/) ||
+           ($ThisLine =~ /^Flush(?:ing|ed) index cache to disk/) ||
+           ($ThisLine =~ /^Delivering to room <.*>$/) ||
+           ($ThisLine =~ /^Returning to original room/) ||
+           ($ThisLine =~ /^User \d+ maps to/) ||
+           ($ThisLine =~ /^Auto-purger: (?:starting|finished)/) ||
+           ($ThisLine =~ /^Delivering private local mail to <.*>$/) ||
+           ($ThisLine =~ /^Final selection: /) ||
+           ($ThisLine =~ /^Processed \d+ message reference count adjustments/) ||
+           ($ThisLine =~ /^Generating delivery instructions$/) 
+   ) {
+      # ignore these lines
+   }
+
+   #TD: validate_recipients()
+   #TD:  local: 1 <Stefan>
+   #TD:   room: 0 <>
+   #TD:   inet: 0 <>
+   #TD:  ignet: 0 <>
+   #TD:  error: -1 <No recipient specified>
+   elsif ($ThisLine =~ /^(validate_recipients)\(\)$/) {
+      $Ctdlcmds{$1}++;
+   }
+
+   elsif ($ThisLine =~ /^\s{1,2}(local|room|inet|ignet|error): -?(\d+) <(.*)>$/) {
+      if ($2 > 0) { $CtdlValRcpt{$1}{$3} += $2; }
+   }
+
+   #TD: Deleting message <103425>
+   elsif ($ThisLine =~ /Deleting message <(\d+)>$/) {
+      $CtdlMsgDeleted++; 
+   }
+   #TD: 7 message(s) deleted.
+   elsif ($ThisLine =~ /(\d+) message\(s\) deleted\.$/) {  # This belongs to CtdlDeleteMessages
+      if ($1 > 0) { $CtdlMsgDeleted += $1; }
+   }
+
+   #TD: Expired 147 messages.
+   #TD: Expired 0 rooms.
+   #TD: Purged 0 visits.
+   elsif ($ThisLine =~ /^(Expired|Purged) (\d+) (messages|rooms|visits|users|entries from the EUID index|stale OpenID associations|entries from the use table)/) {
+      $CtdlCleanup{$1}{$3} += $2;
+   }
+
+   #TD: Deleting log: /var/lib/citadel/data/log.0000004270
+   elsif ($ThisLine =~ /Deleting log: (.*)$/) {
+      push(@CtdlLogDeleted, $1);
+   }
+
+   #TD: PurgeMessages() called
+   elsif ($ThisLine =~ /(Purge(?:Messages|Rooms|Users))\(\) called$/) {
+      $Ctdlcmds{$1}++;
+   }
+
+   #TD: qp_encode_email_addrs: [postfix-users-7kn/[email protected]]
+   elsif ($ThisLine =~ /qp_encode_email_addrs: \[(.+)\]$/) {
+      $Ctdlqp_encode{$1}++;
+   }
+
+   #TD: Message 0 appears to be corrupted
+   elsif ($ThisLine =~ /Message (\d+) appears to be corrupted/) {
+      $CtdlMsgCorrupted{$1}++;
+   }
+
+   #TD: Performing replication checks in <0000000007.Contacts>
+   elsif ($ThisLine =~ /Performing replication checks in <(\d+)\.(.+)>$/) {
+      $CtdlReplChecks{$1}{$2}++;
+   }
+
+   #TD: Adding contact: "Full Name" <[email protected]>
+   elsif ($ThisLine =~ /Adding contact: (.*)$/) {
+      $CtdlAddContact{$1}++;  
+   } 
+
+   elsif ($ThisLine =~ /^Ctdl/) {
+
+      if ($ThisLine =~ /^$/) 
+      {
+         # ignore these lines
+      }
+
+      # ToDo: This can be done better
+      #TD: CtdlFetchMessage(108265, 1)
+      #TD: CtdlOutputPreLoadedMsg(TheMessage=not null, 1, 0, 0, 1
+      #TD: CtdlDeleteMessages(SpamAssassin-user, 1 msgs, )
+      elsif ($ThisLine =~ /^Ctdl(\w+)\(/) {
+         $Ctdlcmds{$1}++;
+      }
+
+   }
+
+   #TD: chmod(/srv/citadel/data//cdb.03, 0600) returned 0
+   #TD: chown(/var/lib/citadel/data//cdb.08, CTDLUID, -1) returned 0
+   elsif ($ThisLine =~ /^(chown|chmod)\((.*), [A-Z0-9]+(?:, -?\d+)?\) returned (\d+)/) {
+      $CtdlFileOp{$1}{$2}++;
+   }
+
+   ### IGnet Networking ###
+   elsif ( ($ThisLine =~ /^network: (?:running|loading) outbound queue$/) ||
+           ($ThisLine =~ /^network: nothing in inbound queue/) ||
+           ($ThisLine =~ /^network: queue run completed/) ||
+           ($ThisLine =~ /^>[0-9]{3} \w+ (?:Citadel|as network)/) ||
+           ($ThisLine =~ /^nttlist=</) 
+   ) {
+      # ignore these lines
+   }
+
+   #TD: Networking started for <0000000007.Mail>
+   elsif ($ThisLine =~ /^Networking started for <(.+)>$/) {
+      $NetStarts{$1}++;
+   }
+
+   #TD: Network full processing in 1021 seconds.
+   elsif ($ThisLine =~ /^Network full processing in (\d+) seconds/) {
+      $NetProcessingCount++;
+      $NetProcessingTime += $1;
+   }
+
+   #TD: Network node <valaskjalf> logged in from example.com [10.0.0.1]
+   elsif ($ThisLine =~ /^Network node <(.+)> logged in from (.*)/) {
+      $NetNodes{"Logins from"}{$1}{$2}++;
+   }
+
+   #TD: Connecting to <valaskjalf> at example.com:504
+   elsif ($ThisLine =~ /^Connecting to <(.+)> at (.*)/) {
+      $NetNodes{"Connects to"}{$1}{$2}++;
+   }
+
+   #TD: Sent 0 octets to <valaskjalf> 
+   elsif ($ThisLine =~ /^Sent (\d+) octets to <(.+)>/) {
+      $NetNodes{"Sent"}{"Octets from"}{$2} += $1;
+   }
+
+   #TD: Can't connect to example.com:504: Connection timed out
+   elsif ($ThisLine =~ /^Can't connect to (.+): (.+)$/) {
+      $NetNoConnect{"Can't connect to"}{$1}{$2}++;
+   }
+
+   #TD: Can't get example.com host entry: Connection timed out
+   elsif ($ThisLine =~ /^Can't get (.+) host entry: (.+)$/) {
+      $NetNoConnect{"Can't get host entry"}{$1}{$2}++;
+   }
+
+   #TD: network: processing 0 bytes from /var/spool/citadel/network/spoolin//genux.0e73.012a
+   elsif ($ThisLine =~ /^network: processing (\d+) bytes from \/\S+\/spool\/citadel\/network\/(\S+)\/(\w+)\.[\.0-9a-f]{9}$/) {
+      $NetProc{$2}{$3} += $1
+   }
+
+   ### web access ###
+   elsif ( ($ThisLine =~ /^New client socket \d+/) ||
+           ($ThisLine =~ /^Closing socket -?\d+/) ||
+           ($ThisLine =~ /^Checking whether [0-9a-fA-F:.]+ is a local or public client/) ||
+           ($ThisLine =~ /^\.\.\. yes it is/) ||
+           ($ThisLine =~ /^Looking up hostname '/) ||
+           ($ThisLine =~ /^Client \d\/\d\/[\d.]+ \(.*\)/) ||
+           ($ThisLine =~ /^<password command hidden from log>$/) ||
+           ($ThisLine =~ /^cmd_user\(\S+\)$/) ||
+           ($ThisLine =~ /^username: /) ||
+           ($ThisLine =~ /^Setting chosen part: <[\.\d]+>$/) ||
+           # ToDo: these are commands from webcit, count them ??
+           ($ThisLine =~ /^(?:ICAL|INFO|MSGP|QUIT|GOTO|MSGS|MSG\d|EUID|MESG|CHEK|READ|OPEN|SEEN|NOOP|DLAT|RDIR|MOVE|OIMG|NDOP|NETP|GTSN|LKR[AN]|LFLR|RWHO|CLOS|UCLS|SLRP|TIME|NUOP|RINF)/) ||
+           ($ThisLine =~ /^Done with RemoveContext\(\)/) ||
+           ($ThisLine =~ /^RemoveContext\(\) session/) ||
+           ($ThisLine =~ /^Purging session \d+/) ||
+           ($ThisLine =~ /^Searching for EUID/) || 
+           ($ThisLine =~ /^returning msgnum = -?\d+/) 
+   ) {
+      # ignore these lines
+   }
+
+   elsif ($ThisLine =~ /^IDEN \d\|\d\|\d+\|(.*)\|(.*)/) {
+      $WebClientEngine{$1}++;
+      $WebClientHost{$2}++;
+   }
+
+   #TD: Bad password specified for <Stefan>
+   elsif ($ThisLine =~ /^Bad password specified for <(.*)>$/) {
+      $WebLoginFailure{$1}++;
+   }
+
+   #TD: USER stefan
+   elsif ($ThisLine =~ /^USER (\S+)$/) {
+      $WebUserLogin{$1}++;
+   }
+
+   ### XMPP ###
+   elsif ( ($ThisLine =~ /^xmpp_queue_event/)
+   ) {
+      # ignore these lines
+   }
+
+   ### Sieve processing ###
+   elsif ( ($ThisLine =~ /^Calling sieve2_execute/) ||
+           ($ThisLine =~ /^ctdl_getscript\(\) is using script/) ||
+           ($ThisLine =~ /^ctdl_getheaders\(\) was called$/) ||
+           ($ThisLine =~ /^<.*> queued for Sieve processing$/) 
+   ) {
+      # ignore these lines
+   }
+
+   #TD: Begin Sieve processing
+   elsif ($ThisLine =~ /^Begin Sieve processing$/) {
+      $SieveStarts++;
+   }
+
+   #TD: Rules found.  Performing Sieve processing for <0000000007.Mail>
+   elsif ($ThisLine =~ /^Rules found.  Performing Sieve processing for <(\d+)\.(\S+)>$/ ) {
+      $SieveProcFor{$1}{$2}++
+   }
+
+   #TD: sieve2_execute() returned 11: Sieve Error: header could not be parsed
+   elsif ($ThisLine =~ /^sieve2_execute\(\) returned \d+: (.+)$/) {
+      $SieveExecute{$1}++;
+   }
+
+   #TD: Performing sieve processing on msg <108269>
+   elsif ($ThisLine =~ /^Performing sieve processing on msg <(\d+)>$/) {
+      $SieveMsgID = $1;
+   }
+
+   #TD: Completed sieve processing on msg <108269>
+   elsif ($ThisLine =~ /^Completed sieve processing on msg <\d+>$/) {
+      undef $SieveMsgID;
+   }
+
+   elsif ($ThisLine =~ /^Sieve: /) {
+
+      if ( ($ThisLine =~ /^Sieve: Prepending a new headerlist and header struct$/) ||
+           ($ThisLine =~ /^Sieve: (?:Begin|body:|header:) (?:NAME|TEXT|WRAP)/) ||
+           ($ThisLine =~ /^Sieve: (?:body: body )?WRAP: /) ||
+           ($ThisLine =~ /^Sieve: Entering name and body into header struct/) ||
+           ($ThisLine =~ /^Sieve: Prepending a new headerlist and header struct/) ||
+           ($ThisLine =~ /^Sieve: starting into libsieve_eval$/) ||
+           ($ThisLine =~ /^Sieve: the commandlist type is \[\d+\]$/) ||
+           ($ThisLine =~ /^Sieve: top of the eval loop$/) ||
+           ($ThisLine =~ /^Sieve: Doing a header comparison$/) ||
+           ($ThisLine =~ /^Sieve: Header parse error, returning null$/) ||
+           ($ThisLine =~ /^Sieve: Relation is \[\d+\]$/) || 
+           ($ThisLine =~ /^Sieve: the commandlist is null$/) ||
+           ($ThisLine =~ /^Sieve: Eat some whitespace and return COLON, forget TEXT$/) ||
+           ($ThisLine =~ /^Sieve: Doing a fileinto$/) ||
+           ($ThisLine =~ /^Sieve: Testing \[Yes\] \[\d+\] \[NO\]/)
+      ) {
+         # ignore these lines
+      }
+
+      #TD: Sieve: NAME: Content-type
+      elsif ($ThisLine =~ /^Sieve: NAME: (\S+)/) {
+         $SieveName = $1;
+      }
+      #TD: Sieve: TEXT: WebCit 7.85
+      elsif ($ThisLine =~ /^Sieve: TEXT: (.*)$/) {
+         $SieveMsg{$SieveMsgID}{"Items"}{$SieveName} = $1;
+      }
+      #TD: Sieve: Asking for header [X-Spam-Flag]
+      elsif ($ThisLine =~ /^Sieve: Asking for header \[(\S+)\]$/) {
+         $SieveMsg{$SieveMsgID}{"Checks"}{$1}++;
+      }
+      #TD: Sieve: test HEADER comparing [room_Citadel-1dPMbAkUAR0dudOTNhaMI/[email protected]] with [[email protected]]
+      elsif ($ThisLine =~ /^Sieve: test HEADER comparing (\[.+\]) with (\[.+\])$/) {
+         $SieveMsg{$SieveMsgID}{"Header tests"}{$1} = $2;
+      }
+      #TD: Sieve: Header parse error on line 56: syntax error, unexpected NAME, expecting COLON
+      elsif ($ThisLine =~ /^Sieve: Header parse error on (.+)$/) {
+         $SieveMsg{$SieveMsgID}{"Header parse error"}{$1}++;
+      }
+
+      else {
+         # Report any unmatched entries...
+         chomp($ThisLine);
+         $OtherList{$ThisLine}++;
+      }
+   }
+   
+   #TD: Action is FILEINTO, destination is <Citadel Support>
+   elsif ($ThisLine =~ /^Action is ([A-Z]+), destination is <(.+)>$/) {
+      $SieveMsg{$SieveMsgID}{"Action"}{$1} = $2;
+   }
+
+   #TD: keep is 0 -- deleting message from inbox
+   elsif ($ThisLine =~ /^keep is 0 -- deleting message from (.*)/) {
+      $SieveMsg{$SieveMsgID}{"deleting from"}{$1}++;
+   }
+
+   ### POP3 server ###
+   elsif ( ($ThisLine =~ /^$/)
+   ) {
+      # ignore these lines
+   }
+
+   #TD: POP3 authenticated stefan
+   elsif ($ThisLine =~ /^POP3 authenticated (.+)$/) {
+      $POPDauth{$1}++;
+   }
+
+   ### POP3 client ###
+   elsif ( ($ThisLine =~ /^>\d+ \d+$/) ||
+           ($ThisLine =~ /^>\+OK(?: \d+| POP server ready| mailbox)?/) ||
+           ($ThisLine =~ /^>\.$/) ||
+           ($ThisLine =~ /^Converting message/) ||
+           ($ThisLine =~ /^Converted to <\S*>/) ||
+           ($ThisLine =~ /^POP3: .* <password>$/) ||
+           ($ThisLine =~ /^Could not connect:/) ||
+           ($ThisLine =~ /^Connected!$/)
+   ) {
+      # ignore these lines
+   }
+
+   #TD: pop3client started
+   elsif ($ThisLine =~ /^pop3client started$/) {
+      $POPClientStarted++;
+   }
+
+   #TD: pop3client started
+   elsif ($ThisLine =~ /^pop3client ended$/) {
+      $POPClientEnded++;
+   }
+
+   #TD: Connecting to <pop3.web.de>
+   elsif ($ThisLine =~ /^Connecting to <(\S+)>$/) {
+      $POPClientConnects{$1}++;
+   }
+ 
+   elsif ($ThisLine =~ /^<([A-Z]+)/) {
+      $POPCompletedCmds++;
+      $POPCmds{$1}++;
+   }
+
+   elsif ($ThisLine =~ /^>-ERR (.*)$/) {
+      $POPErrors{$1}++;
+   }
+
+
+   else {
+      # Report any unmatched entries...
+      chomp($ThisLine);
+      $OtherList{$ThisLine}++;
+   }
+
+}
+
+### generate the output ###
+
+# \t = 8 chars
+# %-56s: %5i Time(s)
+
+if ($Starts) {
+    printf "\n%-47s: %5i Time(s)", "Citadel started", $Starts;
+}
+
+if (keys %Stops) {
+    print "\nCitadel exited with:";
+    foreach my $status (sort {$a > $b} keys %Stops) {
+       printf "\n  Status %2i\t\t\t\t\t: %5i Time(s)", $status, $Stops{$status};
+    }
+}
+
+if ($Reloads) {
+    printf "\nCitadel reloaded:\t\t%5i Time(s)", $Reloads;
+}
+if ($Starts or keys %Stops or $Reloads) { print "\n"; }
+
+if (keys %Threads) {
+   print "\nTHREADS:";
+   print "\n--------";
+   foreach my $action (sort {$a cmp $b} keys %Threads) {
+      printf "\n  %s", $action;
+      foreach my $thread (sort {$a cmp $b} keys %{$Threads{$action}}) {
+         printf "\n     %-50s", $thread;
+         my $sum = 0;
+         foreach my $nr (sort {$a cmp $b} keys %{$Threads{$action}{$thread}}) {
+            if ($Detail >= 10) { 
+               printf "\n\t%-40s: %5i Time(s)", $nr, $Threads{$action}{$thread}{$nr};
+            } else { $sum += $Threads{$action}{$thread}{$nr} };
+         }
+         if ($Detail < 10 ) {
+            printf ": %5i Time(s)", $sum;
+         }
+      }
+   }
+   print "\n\n";
+}
+
+if (keys %RSSfeeds) {
+   print "  RSS feeds fetched:\n";
+   foreach my $feed (sort {$a cmp $b} keys %RSSfeeds) {
+      printf "\t%-48s: %5i Time(s)\n", $feed, $RSSfeeds{$feed};
+   }
+   print "\n";
+}
+
+if (keys %SessionStarted) {
+   print "SESSIONS:\n";
+   print "---------\n";
+   foreach my $session (sort {$a cmp $b} keys %SessionStarted) {
+      printf "  %-11s started from:\n", $session;
+      foreach my $addr (sort {$a cmp $b} keys %{$SessionStarted{$session}}) {
+         printf "     %-50s: %5i Time(s)\n", $addr, $SessionStarted{$session}{$addr};
+#         foreach my $nr (sort {$a cmp $b} keys %{$Threads{$action}{$thread}}) {
+#            printf "\t\t%-40s: %5i Time(s)\n", $nr, $Threads{$action}{$thread}{$nr};
+#         }
+      }
+   }
+   print "\n";
+}
+
+if (keys %SMTPserverHELO or keys %SMTPServerEval) {
+   print "SMPT server:\n";
+   print "------------\n";
+   print "  Connects from:\n";
+   foreach my $helo (sort {$a cmp $b} keys %SMTPserverHELO) {
+      printf "\t%-48s: %5i Time(s)\n", $helo, $SMTPserverHELO{$helo};
+   }
+   print "  Messages from: \n";
+   foreach my $from (sort {$a cmp $b} keys %SMTPserverFROM) {
+      my $sum = 0;
+      if ($Detail > 0) { printf "\t%s\n", $from; }
+      foreach my $code (sort {$a cmp $b} keys %{$SMTPserverFROM{$from}}) {
+         if ($Detail > 0) { printf "\t   %s\n", $code; }
+         foreach my $size (sort {$a cmp $b} keys %{$SMTPserverFROM{$from}{$code}}) {
+            if ($Detail > 0) {
+               printf "\t\t%-40i: %5i Time(s)\n", $size, $SMTPserverFROM{$from}{$code}{$size};
+            } else {
+               $sum += $SMTPserverFROM{$from}{$code}{$size};
+            }
+         }
+      }
+      if ($Detail == 0) { printf "\t%-48s: %5i Time(s)\n", $from, $sum; }
+   }
+   print "  Recipients to: \n";
+   foreach my $rcpt (sort {$a cmp $b} keys %SMTPserverRCPT) {
+      printf "\t%-48s: %5i Time(s)\n", $rcpt, $SMTPserverRCPT{$rcpt};
+   }
+   print "  Other Commands:\n";
+   foreach my $cmd (sort {$a cmp $b} keys %SMTPserverCMDS) {
+      printf "\t%-48s: %5i Time(s)\n", $cmd, $SMTPserverCMDS{$cmd};
+   }
+   print "\n";
+   printf "  %-53s: %5i\n", "Number of recipients in total", $SMTPserverNumRCPTs;
+   print "\n";
+   if (keys %SMTPserverRelay) {
+      print "  Messages relayed:\n";
+      foreach my $relay (sort {$a cmp $b} keys %SMTPserverRelay) {
+         printf "     %-50s\n", $relay;
+         foreach my $rcpt (sort {$a cmp $b} keys %{$SMTPserverRelay{$relay}}) {
+            printf "\t%-48s: %5i\n", $rcpt, $SMTPserverRelay{$relay}{$rcpt};
+         }
+      }
+   }
+   if (keys %SMTPserverStats) {
+      print "  Message status:\n";
+      foreach my $stat (sort {$a cmp $b} keys %SMTPserverStats) {
+         printf "\t%-48s: %5i Time(s)\n", $stat, $SMTPserverStats{$stat};
+      }
+   }
+   if (keys %SMTPServerEval) {
+      print "  Recipient verification:\n";
+      foreach my $rcpt (sort {$a cmp $b} keys %SMTPServerEval) {
+         printf "\t%-48s: %5i Time(s)\n", $rcpt, $SMTPServerEval{$rcpt};
+      }
+   }
+   if (keys %SMTPserverAuth) {
+      print "  User authenticated:\n";
+      foreach my $user (sort {$a cmp $b} keys %SMTPserverAuth) {
+         printf "\t%-48s: %5i Time(s)\n", $user, $SMTPserverAuth{$user};
+      }
+   }
+   if (keys %SMTPSSLError) {
+      print "  SSL Errors:\n";
+      foreach my $state (sort {$a cmp $b} keys %SMTPSSLError) {
+         printf "\t%-48s\n", $state;
+         foreach my $nr (sort {$a cmp $b} keys %{$SMTPSSLError{$state}}) {
+            printf "\t   %-45s: %5i Time(s)\n", $nr, $SMTPSSLError{$state}{$nr};
+         }
+      }
+   }
+   print "\n";
+} 
+
+if ($SMTPclient_queuerun or $SMTPclient_messages or 
+    keys %SMTPclientCMDS or keys %SMTPclientDelivery) {
+   print "SMTP client:\n";
+   print "------------\n";
+   printf "  %-53s: %5i\n", "queue runs", $SMTPclient_queuerun;
+   printf "  %-53s: %5i\n", "messages processed", $SMTPclient_messages;
+   print "\n";
+   print "  Client connected to:\n";
+   foreach my $host (sort {$a cmp $b} keys %SMTPclientConnect) {
+      printf "     %-50s: %5i Time(s)\n", $host, $SMTPclientConnect{$host};
+   }
+   if (keys %SMTPclientDelivery) {
+      print "  Message delivery:\n";
+      foreach my $status (sort {$a cmp $b} keys %SMTPclientDelivery) {
+         printf "     %-50s: %5i Time(s)\n", $status, scalar keys %{$SMTPclientDelivery{$status}};
+         foreach my $domain (sort {$a cmp $b} keys %{$SMTPclientDelivery{$status}}) {
+            printf "\t%-48s: %5i Time(s)\n", $domain, scalar keys %{$SMTPclientDelivery{$status}{$domain}};
+            foreach my $user (sort {$a cmp $b} keys %{$SMTPclientDelivery{$status}{$domain}}) {
+               printf "\t  %-46s: %5i Time(s)\n", $user, $SMTPclientDelivery{$status}{$domain}{$user};
+            }
+         }
+      }
+   }
+   print "  Commands send:\n";
+   foreach my $cmd (sort {$a cmp $b} keys %SMTPclientCMDS) {
+      printf "     %-50s: %5i\n", $cmd, scalar keys %{$SMTPclientCMDS{$cmd}};
+      foreach my $addr (sort {$a cmp $b} keys %{$SMTPclientCMDS{$cmd}}) {
+         if ($addr != "") { printf "\t%-48s: %5i\n"; $addr, $SMTPclientCMDS{$cmd}{$addr}; }
+      } 
+   }
+   if (keys %SMTPclientRelay) {
+      print "  Messages relayed:\n";
+      foreach my $relay (sort {$a cmp $b} keys %SMTPclientRelay) {
+         printf "     %-50s\n", $relay;
+         foreach my $rcpt (sort {$a cmp $b} keys %{$SMTPclientRelay{$relay}}) {
+            printf "\t%-48s: %5i\n", $rcpt, $SMTPclientRelay{$relay}{$rcpt};
+         }
+      }
+   }
+   if (keys %SMTPclientStats) {
+      print "  Message status:\n";
+      foreach my $stat (sort {$a cmp $b} keys %SMTPclientStats) {
+         printf "\t%-48s: %5i Time(s)\n", $stat, $SMTPclientStats{$stat};
+      }
+   }
+   if ($SMTPclientBounces) {
+      printf "  %-53s: %5i\n", "Messaged bounced", $SMTPclientBounces;
+      foreach my $bounce (sort {$a cmp $b} keys %SMTPclientBounce) {
+         printf "     %-50s: %5i Time(s)\n", $bounce, scalar keys %{$SMTPclientBounce{$bounce}};
+         foreach my $status (sort {$a cmp $b} keys %{$SMTPclientBounce{$bounce}}) {
+            printf "\t%-48s: %5i Time(s)\n", $status, $SMTPclientBounce{$bounce}{$status};
+         }
+      }
+   }
+   print "\n";
+}
+
+if (keys %IMAPCmds or keys %IMAPexpunge or keys %IMAPUserLogin) {
+   print "IMAP processing:\n";
+   print "----------------\n";
+   if (keys %IMAPUserLogin) {
+      print "Users logged in:\n";
+      foreach my $user (sort {$a cmp $b} keys %IMAPUserLogin) {
+         printf "\t%-48s: %5i Time(s)\n", $user, $IMAPUserLogin{$user};
+      }
+   }
+   if ($IMAPCompletedCmds > 0) {
+      printf "  %-53s: %5i\n", "IMAP commands processed", $IMAPCompletedCmds;
+      foreach my $cmd (sort {$a cmp $b} keys %IMAPCmds) {
+         printf "\t%-48s: %5i Time(s)\n", $cmd, $IMAPCmds{$cmd};
+      }
+      printf "  %-53s: %5.3f sec\n", "avg time per IMAP command", $IMAPCmdDuration/$IMAPCompletedCmds;
+   }
+   if (keys %IMAPexpunge) {
+      printf "\n  Messages expunged from:\n"; 
+      foreach my $msg (sort {$a cmp $b} keys %IMAPexpunge) {
+         printf "\t%-48s: %5i Time(s)\n", $msg, $IMAPexpunge{$msg};
+      }
+   }
+   print "\n";
+}
+
+if (keys %POPDauth) {
+   print "POP3 Server:\n";
+   print "------------\n";
+   print "  Users authenticated:\n";
+   foreach my $user (sort {$a cmp $b} keys %POPDauth) {
+      printf "\t%-48s: %5i Time(s)\n", $user, $POPDauth{$user};
+   }
+   print "\n";
+}
+
+if (keys %POPCmds or keys %POPErrors) {
+   print "POP3 client:\n";
+   print "------------\n";
+   printf "  %-53s: %5i Time(s)\n", "POP3 client started", $POPClientStarted;
+   printf "  %-53s: %5i Time(s)\n", "POP3 client ended", $POPClientEnded;
+   print  "  POP3 client connected to\n";
+   foreach my $addr (sort {$a cmp $b} keys %POPClientConnects) {
+      printf "\t%-48s: %5i Time(s)\n", $addr, $POPClientConnects{$addr};
+   }
+   printf "  %-53s: %5i\n", "POP commands processed", $POPCompletedCmds;
+   foreach my $cmd (sort {$a cmp $b} keys %POPCmds) {
+      printf "\t%-48s: %5i Time(s)\n", $cmd, $POPCmds{$cmd};
+   }
+   if (keys %POPErrors) {
+      print  "  Errors:\n";
+      foreach my $err (sort {$a cmp $b} keys %POPErrors) {
+         printf "\t%-48s: %5i Time(s)\n", $err, $POPErrors{$err};
+      }
+   }
+   print "\n";
+}
+
+if (keys %Ctdlcmds or keys %CtdlMsgCorrupted or keys %CtdlReplChecks or
+    keys %CtdlAddContact or %CtdlFileOp) {
+   print "Citadel internal messages:\n";
+   print "--------------------------\n";
+   foreach my $cleanup (sort {$a cmp $b} keys %CtdlCleanup) {
+      print "\n  $cleanup:";
+      foreach my $item (sort {$a cmp $b} keys %{$CtdlCleanup{$cleanup}}) {
+         printf "\n\t%-48s: %5i", $item, $CtdlCleanup{$cleanup}{$item};   
+      }
+   }
+   if ($CtdlMsgDeleted) {
+      printf "\n  %-53s: %5i", "Messages deleted", $CtdlMsgDeleted;
+   }
+   if (@CtdlLogDeleted) {
+      printf "\n  %-53s: %5i", "Logs deleted", scalar @CtdlLogDeleted;
+      foreach my $log (sort {$a cmp $b} @CtdlLogDeleted) {
+         print "\n\t$log"; 
+      }
+   }
+   if (keys %CtdlCleanup or $CtdlMsgDeleted or @CtdlLogDeleted) { print "\n"; }
+   if (keys %Ctdlcmds) {
+      print "\n  Commands processed:\n";
+      foreach my $cmd (sort {$a cmp $b} keys %Ctdlcmds) {
+         printf "     %-50s: %5i Time(s)\n", $cmd, $Ctdlcmds{$cmd};
+      }
+   }
+   if (keys %CtdlFileOp) {
+      print "\n  File operations:";
+      foreach my $op (sort {$a cmp $b} keys %CtdlFileOp) {
+         if ($Detail > 5) {
+            print  "\n     $op on:";
+         } else {
+            printf "\n     %s on %5i %-35s", $op, scalar keys %{$CtdlFileOp{$op}}, "files";
+         }
+         my $sum = 0;
+         foreach my $file (sort {$a cmp $b} keys %{$CtdlFileOp{$op}}) {
+            if ($Detail > 5) {
+               printf "\n\t%-48s: %5i", $file, $CtdlFileOp{$op}{$file};
+            } else { $sum += $CtdlFileOp{$op}{$file} };
+         }
+         if ($Detail <= 5) {
+            printf ": %5i Time(s)", $sum;
+         }
+      }
+      print "\n";
+   }
+   if (keys %CtdlMsgCorrupted) {
+      print "  Corrupted messages:\n";
+      foreach my $msg (sort {$a cmp $b} keys %CtdlMsgCorrupted) {
+         printf "\t%-48s: %5i\n", $msg, $CtdlMsgCorrupted{$msg};
+      }
+   }
+   if (keys %Ctdlqp_encode) {
+      printf "\n  %-54s", "qp_encode addresses";
+      my $sum = 0;
+      foreach my $addr (sort {$a cmp $b} keys %Ctdlqp_encode) {
+         if ($Detail >= 10) {
+            printf "\n     %-50s: %5i Time(s)\n", $addr, $Ctdlqp_encode{$addr};
+         } else { $sum += $Ctdlqp_encode{$addr}; }
+      }
+      if ($Detail < 10) { printf ": %5i Time(s)\n", $sum; }
+   }
+   if (keys %CtdlValRcpt) {
+      print "\n  Recipients validated:\n";
+      foreach my $dest (sort {$a cmp $b} keys %CtdlValRcpt) {
+         printf "     %-50s: %5i Time(s)\n", $dest, scalar keys %{$CtdlValRcpt{$dest}};
+         foreach my $rcpt (sort {$a cmp $b} keys %{$CtdlValRcpt{$dest}}) {
+            printf "\t%-48s: %5i Time(s)\n", $rcpt, $CtdlValRcpt{$dest}{$rcpt};
+         }
+      }
+   }
+   if (keys %CtdlReplChecks) {
+      print "\n  Replication checks:\n";
+      foreach my $user (sort {$a cmp $b} keys %CtdlReplChecks) {
+         printf "     %s\n", $user;
+         foreach my $mbox (sort {$a cmp $b} keys %{$CtdlReplChecks{$user}}) {
+            printf "\t%-48s: %5i Time(s)\n", $mbox, $CtdlReplChecks{$user}{$mbox}; 
+         }
+      }
+   }
+   if (keys %CtdlAddContact) {
+      print "\n  Contacts added:\n";
+      foreach my $contact (sort {$a cmp $b} keys %CtdlAddContact) {
+         printf "     %-50s: %5i Time(s)\n", $contact , $CtdlAddContact{$contact};
+      }
+   }
+   if ($serv_extnotify_queuerun) {
+      printf "\n  %-53s: %5i\n", "serv extnotify queue run", $serv_extnotify_queuerun;
+   }
+   print "\n";
+}
+
+if ($NetProcessingTime or $NetProcessingCount or keys %NetNodes or
+    keys %NetProc or keys %NetNoConnect) {
+   print "Network processing\n";
+   print "------------------\n";
+   if ($NetProcessingTime or $NetProcessingCount) {
+      printf "  %-53s: %5i\n", "Full processings completed", $NetProcessingCount;
+      printf "  Full processing took %5.3f sec\n\n", $NetProcessingTime;
+   }
+   if (keys %NetStarts) {
+      print  "  Networking started for:\n";
+      foreach my $net (sort {$a cmp $b} keys %NetStarts) {
+         printf "\t%-48s: %5i Time(s)\n", $net, $NetStarts{$net};
+      }
+   }
+   if (keys %NetNodes) {
+      print "\n";  
+      foreach my $cat (sort {$a cmp $b} keys %NetNodes) {
+         print "  $cat:\n";
+         foreach my $node (sort {$a cmp $b} keys %{$NetNodes{$cat}}) {
+            printf "     %-50s:\n", $node;
+            foreach my $host (sort {$a cmp $b} keys %{$NetNodes{$cat}{$node}}) {
+               printf "\t%-48s: %5i Time(s)\n", $host, $NetNodes{$cat}{$node}{$host};
+            }
+         }
+      }
+   }
+   if (keys %NetProc) {
+      print "  Processing:\n";
+      foreach my $dir (sort {$a cmp $b} keys %NetProc) {
+         print "     $dir:\n";
+         foreach my $file (sort {$a cmp $b} keys %{$NetProc{$dir}}) {
+            printf "\t%-48s: %-5i Byte(s)\n", $file, $NetProc{$dir}{$file};
+         }
+      }
+   }
+   if (keys %NetNoConnect) {
+      foreach my $what (sort {$a cmp $b} keys %NetNoConnect) {
+         print "  $what:\n";
+         foreach my $host (sort {$a cmp $b} keys %{$NetNoConnect{$what}}) {
+            print "     $host:\n";
+            foreach my $reason (sort {$a cmp $b} keys %{$NetNoConnect{$what}{$host}}) {
+               printf "\t%-48s: %-5i Time(s)\n", $reason, $NetNoConnect{$what}{$host}{$reason};
+            }
+         }
+      }
+   }
+   print "\n";
+}
+
+if (keys %WebClientHost or keys %WebClientEngine or keys %WebUserLogin) {
+   print "Webcit:\n";
+   print "-------\n";
+   if (keys %WebUserLogin) {
+      print "  User logged in:\n";
+      foreach my $user (sort {$a cmp $b} keys %WebUserLogin) {
+         printf "\t%-48s: %5i Time(s)\n", $user, $WebUserLogin{$user};
+      }
+   }
+   if (keys %WebLoginFailure) {
+      print "  Login failures:\n";
+      foreach my $user (sort {$a cmp $b} keys %WebLoginFailure) {
+         printf "\t%-48s: %5i Time(s)\n", $user, $WebLoginFailure{$user};
+      }
+   }
+   if (keys %WebClientHost) {
+      print "  Connects from hosts:\n";
+      foreach my $host (sort {$a cmp $b} keys %WebClientHost) {
+         printf "\t%-48s: %5i Time(s)\n", $host, $WebClientHost{$host};
+      }
+   }
+   if (keys %WebClientEngine) {
+      printf "  Connects with engines:\n";
+      foreach my $engine (sort {$a cmp $b} keys %WebClientEngine) {
+         printf "\t%-48s: %5i Time(s)\n", $engine, $WebClientEngine{$engine};
+      }
+   }
+   print "\n";
+}
+
+
+if (keys %SieveMsg or keys %SieveExecute or %SieveProcFor) {
+   print "Sieve processing:\n";
+   print "-----------------\n";
+   printf "  %-53s: %5i Time(s)\n", "Sieve processing started", $SieveStarts;
+   printf "  %-53s: %5i\n\n", "Messages processed", scalar keys %SieveMsg;
+   if (keys %SieveExecute) {
+      print "  Sieve execute returned:\n";
+      foreach my $error (sort {$a cmp $b} keys %SieveExecute) {
+         printf "\t%-48s: %5i Time(s)\n", $error, $SieveExecute{$error};
+      }
+   }
+   if ($Detail > 5) {
+   if (keys %SieveProcFor) {
+      print  "  Sieve processed for user:\n";
+      foreach my $user (sort {$a cmp $b} keys %SieveProcFor) {
+         print "     $user:";
+         my $val = 0;
+         foreach my $mbox (sort {$a cmp $b} keys %{$SieveProcFor{$user}}) {
+            if ($Detail >= 10) {
+               printf "\n\t%-48s: %5i Time(s)\n", $mbox, $SieveProcFor{$user}{$mbox};
+            } else {
+               $val = $SieveProcFor{$user}{$mbox} + $val;
+            }
+         }
+         if ($Detail < 10) { printf " with %5i room(s) \t\t\t: %5i Time(s)\n", scalar keys %{$SieveProcFor{$user}}, $val; }
+      }
+   }
+   foreach my $id (sort {$a cmp $b} keys %SieveMsg) {
+      printf "  Message %8i:\n", $id;
+      foreach my $stage (sort {$a cmp $b} keys %{$SieveMsg{$id}}) {
+         if ($Detail >= 10 || ($stage ne "Header tests" && $stage ne "Items") ) {
+            printf "     %s:\n", $stage;
+            foreach my $item (sort {$a cmp $b} keys %{$SieveMsg{$id}{$stage}}) {
+               printf "\t%-48s: %s\n", $item, $SieveMsg{$id}{$stage}{$item};
+            }
+         }
+      }
+   }
+   }
+   print "\n";
+}
+
+if (keys %OtherList) {
+   print "\n**** Unmatched entries ****\n";
+   foreach my $Error (keys %OtherList) {
+      print "    $Error : $OtherList{$Error} Time(s)\n";
+   }
+}
+
+### return without a failure ###
+exit(0);
+
+# vi: shiftwidth=3 tabstop=3 syntax=perl et
+


Property changes on: scripts/services/citadel
___________________________________________________________________
Added: svn:executable
   + *


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.