fx- has asked for the wisdom of the Perl Monks concerning the following question:
#!/usr/bin/perl use Socket; # pseudo-client parameters $nick = "mrtg"; $ident = "mrtg"; $realname = "MRTG bot"; # server and port to connect to $ircserver = "irc.krey.net"; $ircport = "6667"; # Where to store the output data (directory MUST exist) # The number of users on each server will be in a file named like the +server. # An additionnal file named 'global' will be created, containing the s +um of # all servers' users. # An example configuration file is included. $datapath = "/var/www/mrtg/"; # Where to put the PID file $pidfile = "/usr/share/doc/mrtg/examples/ircstats2/ircstats2.pid"; # NOTE: Set those variables to 0 to enable, put a # in front of the # lines to disable. # Count the global number of users in "globalusersmrtg" file (MRTG for +mat) $globalusersmrtg=0; # Count the channels in "channelsmrtg" file (MRTG format) $channelsmrtg=0; # Count the global number of ircops in "ircopsmrtg" file (MRTG format) $ircopsmrtg=0; # Count the number of servers in "serversmrtg" file (MRTG format) $serversmrtg=0; # Count the global number of users in "globalusersplain" file # (Plain text, to be used with others scripts) #$globalusersplain=0; # Count the channels in "channelsplain" file (Plain text, # to be used with others scripts) #$channelsplain=0; # Count the global number of ircops in "ircopsplain" file # (Plain text, to be used with others scripts) #$ircopsplain=0; # Count the number of servers in "serversmrtg file (MRTG format) $serversplain=0; # ircops number offset (not to count services, for example) #$ircopsoffset=0; # servers number offset (not to count services, for example) #$serversoffset=0; # Servers to poll $server{"old-services.krey.net"}=0; $server{"be.hub.krey.net"}=0; $server{"ipv6.be.krey.net"}=0; $server{"nl.hub.krey.net"}=0; $server{"chat2.be.krey.net"}=0; $server{"services-migration.krey.net"}=0; $server{"skynet.be.krey.net"}=0; $server{"k.krey.net"}=0; $server{"hagehosting.nl.krey.net"}=0; $server{"vrt.be.krey.net"}=0; $server{"zeelandnet.nl.krey.net"}=0; ############################################## ### DO NOT MODIFY ANYTHING BELOW THIS LINE ### ############################################## print "Now daemonizing ...\n"; &daemonize; if (!(($globalusersmrtg eq "")&&($globalusersplain eq "")&&($channelsm +rtg eq "")&&($channelsplain eq "")&&($ircopsmrtg eq "")&&($ircopsplai +n eq "")&&($serversplain eq "")&&($serversmrtg eq ""))) { $needlusers=1; } ($g, $g, $proto) = getprotobyname("tcp"); while (true) { ($g, $g, $g, $g, $rawserver) = gethostbyname($ircserver); if ($rawserver) { $serveraddr = pack("Sna4x8", 2, $ircport, $rawserver); socket(SOCKET, AF_INET, SOCK_STREAM, $proto) || die "No socket +: $!"; if (connect(SOCKET, $serveraddr)){ select(SOCKET); $| = 1; select(STDOUT); $| = 1; print SOCKET "USER $ident a b :$realname\n"; print SOCKET "NICK $nick\n"; while (<SOCKET>){ @i = split(" ",$_); if ($i[1] eq "433") {print SOCKET "NICK ".$nick.time() +."\n";} elsif ($i[1] eq "437") {print SOCKET "NICK ".$nick.tim +e()."\n";} elsif ($i[1] eq "376") {&getinfo;} elsif ($i[1] eq "402") {$server{lc($i[3])}=0;} elsif ($i[1] eq "265") { $i[0]=~s/\://; $server{lc($i[0])}=$i[6]; } elsif ($i[1] eq "266") { if ($globalusersmrtg ne "") { $globalusersmrtg=$i[6]; } if ($globalusersplain ne "") { $globalusersplain=$i[6]; } } elsif ($i[1] eq "254") { if ($channelsmrtg ne "") { $channelsmrtg=$i[3]; } if ($channelsplain ne "") { $channelsplain=$i[3]; } } elsif ($i[1] eq "251") { if ($serversmrtg ne "") { $serversmrtg=$i[11]-$serversoffset; } if ($serversplain ne "") { $serversplain=$i[11]-$serversoffset; } } elsif ($i[1] eq "252") { if ($ircopsmrtg ne "") { $ircopsmrtg=$i[3]-$ircopsoffset; } if ($ircopsplain ne "") { $ircopsplain=$i[3]-$ircopsoffset; } } elsif ($i[1] eq "212") { return if ($i[2] ne "PRIVMSG"); if ($channelsmrtg ne "") { $statsmmrtg=$i[3]; } if ($channelsplain ne "") { $statsmplain=$i[3]; } } elsif ($i[0] eq "PING") { &saveinfo; print SOCKET "PONG $i[1]\n"; &getinfo; } } } close(SOCKET); } sleep(120); } sub saveinfo { foreach $s (keys %server){ open(OUTPUT,">$datapath/$s"); print OUTPUT "$server{$s}\n$server{$s}\n$time\n"; close(OUTPUT); } if ($globalusersmrtg ne "") { open(OUTPUT, ">$datapath/globalusersmrtg"); print OUTPUT "$globalusersmrtg\n$globalusersmrtg\n$time\n"; close(OUTPUT); } if ($channelsmrtg ne "") { open(OUTPUT, ">$datapath/channelsmrtg"); print OUTPUT "$channelsmrtg\n$channelsmrtg\n$time\n"; close(OUTPUT); } if ($serversmrtg ne "") { open(OUTPUT, ">$datapath/serversmrtg"); print OUTPUT "$serversmrtg\n$serversmrtg\n$time\n"; close(OUTPUT); } if ($ircopsmrtg ne "") { open(OUTPUT, ">$datapath/ircopsmrtg"); print OUTPUT "$ircopsmrtg\n$ircopsmrtg\n$time\n"; close(OUTPUT); $ircopsmrtg=0; # raw 252 pas disp si pas opers } if ($globalusersplain ne "") { open(OUTPUT,">$datapath/globalusersplain"); print OUTPUT "$globalusersplain"; close(OUTPUT); } if ($channelsplain ne "") { open(OUTPUT, ">$datapath/channelsplain"); print OUTPUT "$channelsplain"; close(OUTPUT); } if ($serversplain ne "") { open(OUTPUT, ">$datapath/serversplain"); print OUTPUT "$serversplain"; close(OUTPUT); } if ($ircopsplain ne "") { open(OUTPUT, ">$datapath/ircopsplain"); print OUTPUT "$ircopsplain"; close(OUTPUT); $ircopsplain=0; # raw 252 pas disp si pas opers } if ($statsm ne "") { open(OUTPUT, ">$datapath/statsmplain"); print OUTPUT "$statsm"; close(OUTPUT); } } sub getinfo { foreach $s (keys %server) { print SOCKET "lusers * $s\n"; print SOCKET "stats m $s\n"; } $time=time(); if ($needlusers==1) { print SOCKET "lusers\n"; print SOCKET "stats m\n"; } } sub daemonize () { chdir "/" or die "Can't chdir to /: $!"; open STDIN, "/dev/null" or die "Can't read /dev/null: $!"; open STDOUT, ">/dev/null" or die "Can't write to /dev/null: $!"; defined (my $pid = fork) or die "Can't fork: $!"; if ($pid) { if ($pidfile) { open(PIDFILE,">$pidfile"); print PIDFILE "$pid\n"; close(PIDFILE); } exit; } setsid or die "Can't start a new session: $!"; open STDERR, ">&STDOUT" or die "Can't dup stdout: $!"; }
20050404 Edit by ysth: readmore tags
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: IRC Stats
by graff (Chancellor) on Apr 04, 2005 at 05:09 UTC | |
by fx- (Initiate) on Apr 05, 2005 at 05:22 UTC | |
by graff (Chancellor) on Apr 05, 2005 at 07:03 UTC | |
|
Re: IRC Stats
by Zaxo (Archbishop) on Apr 04, 2005 at 11:48 UTC | |
|
Re: IRC Stats
by Anonymous Monk on Apr 04, 2005 at 06:58 UTC |