ircstats2.pl
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:6k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ircstats2.pl v1.3 06 Apr 2001 Lucas Nussbaum <lucas@schickler.net>
  3. # More info can be found on http://www.schickler.net/lucas/ircstats2.php
  4. # based on ircstats from Matt Ramsey (MR227) mjr@geeks.org, mjr@nin.com
  5. # Used to generate stats on the Kewl.Org IRC Network
  6. # If you see something that should be changed, please notify me !
  7. use Socket;
  8. # pseudo-client parameters
  9. $nick = "StatsMaker234";
  10. $ident = "Stats";
  11. $realname = "http://www.schickler.net/lucas/";
  12. # server and port to connect to
  13. $ircserver = "127.0.0.1";
  14. $ircport = "6667";
  15. # Where to store the output data (directory MUST exist)
  16. # The number of users on each server will be in a file named like the server.
  17. # An additionnal file named 'global' will be created, containing the sum of
  18. # all servers' users.
  19. # An example configuration file is included.
  20. $datapath = "/home/lucas/ircstats2/temp";
  21. # Where to put the PID file
  22. $pidfile = "/home/lucas/ircstats2/ircstats2.pid";
  23. # NOTE: Set those variables to 0 to enable, put a # in front of the 
  24. # lines to disable.
  25. # Count the global number of users in "globalusersmrtg" file (MRTG format)
  26. $globalusersmrtg=0;
  27. # Count the channels in "channelsmrtg" file (MRTG format)
  28. $channelsmrtg=0;
  29. # Count the global number of ircops in "ircopsmrtg" file (MRTG format)
  30. $ircopsmrtg=0;
  31. # Count the number of servers in "serversmrtg" file (MRTG format)
  32. $serversmrtg=0;
  33. # Count the global number of users in "globalusersplain" file
  34. # (Plain text, to be used with others scripts)
  35. $globalusersplain=0;
  36. # Count the channels in "channelsplain" file (Plain text, 
  37. # to be used with others scripts)
  38. $channelsplain=0;
  39. # Count the global number of ircops in "ircopsplain" file
  40. # (Plain text, to be used with others scripts)
  41. $ircopsplain=0;
  42. # Count the number of servers in "serversmrtg file (MRTG format)
  43. $serversplain=0;
  44. # ircops number offset (not to count services, for example)
  45. $ircopsoffset=0;
  46. # servers number offset (not to count services, for example)
  47. $serversoffset=0;
  48. # Servers to poll
  49. $server{"cybernet.langochat.net"}=0;
  50. $server{"sicfa.langochat.net"}=0;
  51. $server{"free.langochat.net"}=0;
  52. $server{"jeuxgroup.langochat.net"}=0;
  53. $server{"diligo.langochat.net"}=0;
  54. ##############################################
  55. ### DO NOT MODIFY ANYTHING BELOW THIS LINE ###
  56. ##############################################
  57. print "Now daemonizing ...n";
  58. &daemonize;
  59. if (!(($globalusersmrtg eq "")&&($globalusersplain eq "")&&($channelsmrtg eq "")&&($channelsplain eq "")&&($ircopsmrtg eq "")&&($ircopsplain eq "")&&($serversplain eq "")&&($serversmrtg eq ""))) {
  60. $needlusers=1;
  61. }
  62. ($g, $g, $proto) = getprotobyname("tcp");
  63. while (true) {
  64. ($g, $g, $g, $g, $rawserver) = gethostbyname($ircserver);
  65. if ($rawserver) {
  66. $serveraddr = pack("Sna4x8", 2, $ircport, $rawserver);
  67. socket(SOCKET, AF_INET, SOCK_STREAM, $proto) || die "No socket: $!";
  68. if (connect(SOCKET, $serveraddr)){
  69. select(SOCKET); $| = 1;
  70. select(STDOUT); $| = 1; 
  71. print SOCKET "USER $ident a b :$realnamen";
  72. print SOCKET "NICK $nickn";
  73. while (<SOCKET>){
  74. @i = split(" ",$_);
  75. if ($i[1] eq "433") {print SOCKET "NICK ".$nick.time()."n";}
  76. elsif ($i[1] eq "437") {print SOCKET "NICK ".$nick.time()."n";}
  77. elsif ($i[1] eq "376") {&getinfo;}
  78. elsif ($i[1] eq "402") {$server{lc($i[3])}=0;}
  79. elsif ($i[1] eq "265") {
  80. $i[0]=~s/://;
  81. $server{lc($i[0])}=$i[6];
  82. }
  83. elsif ($i[1] eq "266") {
  84. if ($globalusersmrtg ne "") {
  85. $globalusersmrtg=$i[6];
  86. }
  87. if ($globalusersplain ne "") {
  88. $globalusersplain=$i[6];
  89. }
  90. }
  91. elsif ($i[1] eq "254") {
  92. if ($channelsmrtg ne "") {
  93. $channelsmrtg=$i[3];
  94. }
  95. if ($channelsplain ne "") {
  96. $channelsplain=$i[3];
  97. }
  98. }
  99. elsif ($i[1] eq "251") {
  100. if ($serversmrtg ne "") {
  101. $serversmrtg=$i[11]-$serversoffset;
  102. }
  103. if ($serversplain ne "") {
  104. $serversplain=$i[11]-$serversoffset;
  105. }
  106. }
  107. elsif ($i[1] eq "252") {
  108. if ($ircopsmrtg ne "") {
  109. $ircopsmrtg=$i[3]-$ircopsoffset;
  110. }
  111. if ($ircopsplain ne "") {
  112. $ircopsplain=$i[3]-$ircopsoffset;
  113. }
  114. }
  115. elsif ($i[0] eq "PING") {
  116. &saveinfo;
  117. print SOCKET "PONG $i[1]n";
  118. &getinfo;
  119. }
  120. }
  121. }
  122. close(SOCKET);
  123. }
  124. sleep(120);
  125. }
  126. sub saveinfo {
  127. foreach $s (keys %server){
  128. open(OUTPUT,">$datapath/$s");
  129. print OUTPUT "$server{$s}n$server{$s}n$timen";
  130. close(OUTPUT); 
  131. }
  132. if ($globalusersmrtg ne "") {
  133. open(OUTPUT, ">$datapath/globalusersmrtg");
  134. print OUTPUT "$globalusersmrtgn$globalusersmrtgn$timen";
  135. close(OUTPUT);
  136. }
  137. if ($channelsmrtg ne "") {
  138. open(OUTPUT, ">$datapath/channelsmrtg");
  139. print OUTPUT "$channelsmrtgn$channelsmrtgn$timen";
  140. close(OUTPUT);
  141. }
  142. if ($serversmrtg ne "") {
  143. open(OUTPUT, ">$datapath/serversmrtg");
  144. print OUTPUT "$serversmrtgn$serversmrtgn$timen";
  145. close(OUTPUT);
  146. }
  147. if ($ircopsmrtg ne "") {
  148. open(OUTPUT, ">$datapath/ircopsmrtg");
  149. print OUTPUT "$ircopsmrtgn$ircopsmrtgn$timen";
  150. close(OUTPUT);
  151. $ircopsmrtg=0; # raw 252 pas disp si pas opers
  152. }
  153. if ($globalusersplain ne "") {
  154. open(OUTPUT,">$datapath/globalusersplain");
  155. print OUTPUT "$globalusersplain";
  156. close(OUTPUT);
  157. }
  158. if ($channelsplain ne "") {
  159. open(OUTPUT, ">$datapath/channelsplain");
  160. print OUTPUT "$channelsplain";
  161. close(OUTPUT);
  162. }
  163. if ($serversplain ne "") {
  164. open(OUTPUT, ">$datapath/serversplain");
  165. print OUTPUT "$serversplain";
  166. close(OUTPUT);
  167. }
  168. if ($ircopsplain ne "") {
  169. open(OUTPUT, ">$datapath/ircopsplain");
  170. print OUTPUT "$ircopsplain";
  171. close(OUTPUT);
  172. $ircopsplain=0; # raw 252 pas disp si pas opers
  173. }
  174. }
  175. sub getinfo {
  176. foreach $s (keys %server) {
  177. print SOCKET "lusers * $sn";
  178. }
  179. $time=time();
  180. if ($needlusers==1) {
  181. print SOCKET "lusersn";
  182. }
  183. }
  184. sub daemonize () {
  185. chdir "/" or die "Can't chdir to /: $!";
  186. open STDIN, "/dev/null" or die "Can't read /dev/null: $!";
  187. open STDOUT, ">/dev/null" or die "Can't write to /dev/null: $!";
  188. defined (my $pid = fork) or die "Can't fork: $!";
  189. if ($pid) {
  190. if ($pidfile) {
  191. open(PIDFILE,">$pidfile");         
  192. print PIDFILE "$pidn";                           
  193. close(PIDFILE);
  194. }
  195. exit;
  196. }
  197. setsid or die "Can't start a new session: $!";
  198. open STDERR, ">&STDOUT" or die "Can't dup stdout: $!";
  199. }