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

SNMP编程

开发平台:

C/C++

  1.                        Using Mailstats with MRTG
  2. # 17/04/97:  These files are based on a post 
  3. # made to the MRTG discussion list.
  4. # I was then asked if I would contribute them to the distribution.
  5. # Now I've cleaned up one or two minor things, but the message below
  6. # is essentially the same as the distribution I have contributed.
  7. # I also posted this to comp.mail.sendmail some time back.
  8. # rachel polanskis   <r.polanskis@nepean.uws.edu.au>
  9. This is some experimenting I have done using sendmail and mrtg.
  10. Currently I am using Solaris 2.5.1 as the mailhost, and then plotting
  11. the goodies using mrtg-2.0 on Linux 1.2.13 and displaying the graphs 
  12. on the linux box.
  13. There are some caveats on my method for plotting these charts:
  14. 1:  I use a previously undefined port and run the Solaris
  15.     /bin/mailstats program out of inetd.  
  16.     For this reason, I can only assume the mailstat on Solaris 
  17.     works - I have tried no other platforms.
  18. *   Q:  Is there a security risk involved in running Solaris Mailstat
  19.         out of inetd? 
  20. 2:  You must have Perl-5.002 or better installed on the plotting host.
  21. 3:  You must have MRTG-2.0 installed - you must know how to use it!
  22. 4:  I am only interested in SMTP connections, and my scripts only 
  23.     plot In and Out, since mrtg can only plot 2 lines per graph.
  24.     If you want any more than that - experiment!  And then tell me 
  25.     since I am only learning.
  26. Here goes:
  27. 1:  Ensure you have "/bin/mailstat" on your system.
  28. 2:  Enable "/etc/mail/sendmail.st"
  29.     To do this you can just make sure the entry for "sendmail.st" in
  30.     "sendmail.cf" is uncommented, and then do the command:
  31.    
  32. # touch /etc/mail/sendmail.st
  33.     And restart sendmail:
  34. # /etc/init.d/sendmail stop
  35. # /etc/init.d/sendmail start
  36. 3:  Create the following shell-script:
  37. #!/bin/sh
  38. # smtp-stats:  exec Solaris mailstats
  39. #
  40. if [ -x "/bin/mailstats" ]
  41. then
  42. exec /bin/mailstats -f/etc/mail/sendmail.st 
  43. fi
  44. I run this out of /opt/local/bin, and call it "smtp-stats"
  45. 4:  Now add the following to /etc/services:
  46. # /etc/services
  47. #
  48. smtp-stats      7256/tcp                        # smtp-stats
  49. I used port 7256 as it was undefined.  You might like to select something 
  50. else.
  51. 5:  Add the following to /etc/inetd.conf:
  52. # /etc/inetd.conf
  53. #
  54. smtp-stats      stream  tcp     nowait root 
  55. /opt/local/bin/smtp-stats smtp-stats
  56. ***Ensure that the above is all on *one* line.  The sample above
  57. is broken on 2 lines for legibility!!
  58. 6:  Restart inetd
  59. 7:  Test the port.  you should see the following:
  60. # telnet localhost 7256
  61. Trying 127.0.0.1...
  62. Connected to localhost.
  63. Escape character is '^]'.
  64. Statistics from Thu Feb 27 01:12:47 1997
  65.  M msgsfr bytes_from  msgsto   bytes_to  Mailer
  66.  0      0          0K     96        393K  prog
  67.  3     34         94K      0          0K  local
  68.  5     93        474K     31         47K  esmtp
  69. ========================================
  70.  T    127        568K    127        440K
  71. Connection closed by foreign host.
  72. OK!!
  73. The line we are interested in is line 5:  The "esmtp"  line.
  74. This is the line we will use to get our stats.
  75. You might want to adjust this depending on how many mailer progs
  76. you use...
  77. I find the Totals to be useless, since it includes a lot of filtering 
  78. from procmail.  I am only interested in SMTP connections...
  79. ####################################
  80. Stage 2:  MRTG
  81. Here is a perl script I wrote to glom the values of the "esmtp" line (5)
  82. and massage them into something mrtg understands.
  83. A file called "mailstats.old" is written to /tmp
  84. to allow for doing my sums.  
  85. I am a Perl Newbie - please don't be offended at my code.
  86. I would like it if someone can help me with better methods one day!
  87. #!/usr/bin/perl 
  88. #
  89. # rachel polanskis - 240297
  90. # this script relies on the sendmail.st file being activated.
  91. # the data is called via "mailstats" which comes with SunOS/Solaris.
  92. # mailstats is run out of inetd, on port 7256.
  93. require 5.002;
  94. use strict;
  95. use Socket;
  96. my ($remote, $port, $iaddr, $paddr, $proto, $line, $count, $oldfrm, $oldto, $curfrm, $curto, $msgsfrm, $msgsto, $a, $b, $c, $d);
  97. ##
  98. # open the old stats file for reading - we use this to get the differences
  99. #
  100. open (OLD,"</tmp/mailstat.old") or die "can't open file!n";
  101. # read the old data 
  102. #
  103. while (<OLD>) {
  104.    if ($. == "1") {
  105.       $count = $_;
  106.     }
  107.    ($oldfrm, $oldto) = split (' ',$count);
  108. }
  109. close (OLD);
  110. ##
  111. # Straight out of the blue Camel - pp. 349
  112. #
  113. # Change these next 2 lines to suit yourself.
  114. #
  115. $remote = "juno";
  116. $port = "7256";
  117. #
  118. if ($port =~ /D/) {$port = getservbyname ($port, 'tcp')}
  119. die "No port" unless $port;
  120. $iaddr = inet_aton($remote) or die "no host: $remote";
  121. $paddr = sockaddr_in($port, $iaddr);
  122. $proto = getprotobyname ('tcp');
  123. socket (SOCK, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
  124. connect (SOCK, $paddr) or die "connect: $!";
  125. ##
  126. # munge the output data
  127. #
  128. while (<SOCK>) {
  129.    if ($. == "5" ) {
  130.    $line = $_;
  131.    ($a, $curfrm, $b, $curto, $c, $d) = split(' ',$line);
  132. # do some sums
  133. $msgsfrm = $curfrm - $oldfrm;
  134. $msgsto = $curto - $oldto;
  135. chomp $msgsfrm;
  136. chomp $msgsto;
  137. # open the old file for overwrite
  138. open (OLD,">/tmp/mailstat.old") or die "can't open file!n";
  139. # print the data for mrtg
  140.   print "$msgsfrmn$msgston1njunon";
  141. # print the data to the old file
  142.   print OLD "$curfrm $curton";
  143.     } #endif
  144. }
  145. close (SOCK) or die "close: $!";
  146. exit;
  147. ##########################
  148. Now,  Here is my mrtg.cfg file for mail.
  149. I call it "mail.cfg"
  150. I run mrtg from cron on my Linux box every 10 minutes to plot the stats.
  151. It is up to the individual what they do with their own setup.
  152. #
  153. # Mail:  MRTG.cfg file for sendmail stats on mailhost.
  154. #
  155. WorkDir: /usr/local/etc/httpd/htdocs/stats/mrtg
  156. Interval: 10 
  157. #---------------------------------------------------------------
  158. Target[mail]: `/usr/local/bin/mrtg/mailstats`
  159. MaxBytes[mail]: 150
  160. Options[mail]: gauge
  161. Title[mail]: Juno Sendmail Statistics
  162. PageTop[mail]: Juno Sendmail Statistics</H1>
  163. XSize[mail]: 500
  164. Supress[mail]: my
  165. YSize[mail]: 200
  166. WithPeak[mail]: dwmy
  167. YLegend[mail]: No. of messages
  168. ShortLegend[mail]: messages
  169. LegendI[mail]: &nbsp;Incoming:
  170. LegendO[mail]: &nbsp;Outgoing:
  171. That's it!!
  172. You should have no problems running this stuff if you follow my
  173. instructions.
  174. Any comments, advice or interesting suggestions 
  175. would be much appreciated.
  176. Do with my little hack as you like, as long as the developers
  177. of sendmail, perl, and mrtg get some credit, as well as lil ol me 
  178. for dreaming this up!!!
  179. have fun...
  180. rachel polanskis <r.polanskis@nepean.uws.edu.au>  17/04/97