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

SNMP编程

开发平台:

C/C++

  1. #!/usr/local/bin/perl
  2. ##################################################################
  3. # Multi Dynamic IP Traffic Grapher contibution to mrtg
  4. ##################################################################
  5. #
  6. # Created by John Heenan <john@heenan.ironbark.id.au>
  7. #
  8. # Available from http://www.heenan.ironbark.id.au/mrtg-dynip
  9. #
  10. ##################################################################
  11. #
  12. # Distributed under the GPL copyleft of GNU
  13. #
  14. # mrtg-dynip, v 0.41b 1997/10/25
  15. # Copyright John Heenan, with exception of datestr subroutine
  16. # (copied from mrtg executable) and much of internal_walk
  17. # subroutine (manner of using snmp modules copied from an example
  18. # by Simon Lenine)
  19. #
  20. ###################################################################
  21. #Mrtg-dynip is a contribution to MRTG, enabling MRTG to generate multi
  22. #interface traffic graphs for IP interfaces on hosts that do not provide
  23. #consistent SNMP target numbers for their interfaces.  Such IP interfaces
  24. #include IP active serial interfaces attached to modems in a PPP dial in
  25. #environment. The hosts must run snmp agents.  For completeness, information
  26. #about interface devices with unvarying SNMP target numbers, such as
  27. #ethernet cards, can be configured to be included.
  28. #Mrtg-dynip's configuration is simplest where static (or fixed) IP is not
  29. #used for dial into a rotary modem pool.
  30. #Mrtg-dynip can be considred to have sophisticated modem bank monitoring
  31. #capacity, when the modems carry PPP or SLIP traffic.
  32. #Regenerates a named 'mrtg.cfg' file to ensure snmp data remains with a
  33. #consistent IP number, or overridable IP number of a real physical device
  34. #in a dial in IP environment, rather than with an interface name which
  35. #can get assinged to different real physical devices, and runs mrtg on
  36. #the generated file.
  37. #Generates a web index file of stats web pages. 
  38. #Please see the section 6 of the FAQ for this version for information on
  39. #for differences in interpreting graphs between some devices
  40. #Briefly, to someone dialling in, dynamic IP means when they dial a rotary 
  41. #number they do not get a consistent IP address. To the service provider it 
  42. #means a unique IP number is assinged to each telephone line/modem/port.
  43. #To someone dialling in, static or fixed IP means that their user name is
  44. #approved to use a unique IP address, whether they dial into a rotary for
  45. #a modem bank or into a non rotary number.  To the service provider, it means
  46. #if someone is dialling into a rotary for a modem pool, they allow the modem
  47. #port use a unique approved IP number for that user, that overrides the IP
  48. #address used when a dial in user does not request a fixed or static IP.
  49. #The public community should be used, however the public community on a
  50. #particular host does not need to be named 'public'.  This is catered for.
  51. #There is a large 'TODO' list for this contribution, including 
  52. #testing use of the 'ifLastChange' snmp object.
  53. #SET UP
  54. #Runs independently of an existing configured mrtg installation.  Following
  55. #the commented example will make the set up clearer.  Examples for a live
  56. #ISP, using stats page http://www.stats.syd.net.au, are included in file
  57. #mrtg-dynip-sydnet.  You must make appropriate changes
  58.  
  59. #  0   Ensure the path to the perl binary is set correctly on first line
  60. #  1   $HTTP_Work_Dir         ** Must set
  61. #  2   $HTTP_index_file       Default index.html may be OK if unique
  62. #  3   $mrtg_Dir              ** Must set
  63. #  4   $mrtgcfg_Dir           Setting to $mrtgDir is probably OK
  64. #  5   $mrtgcfg_file          Default mrtg-dynip.cfg should be OK
  65. #  6   $update       Default will work (five minutes)
  66. #  7   $community_default     Default for this default may be OK (public)
  67. #  8   $email       Set to "" to show nothing
  68. #  9   $home_page       Set to "" to show nothing
  69. # 10   $home_page_descr       Set to "" to show nothing
  70. # 11   $suicidal              Non zero: bomb out if there are problems
  71. # 12   $firewall_masq_tran_if Best to leave as 0 (zero) if sufficient
  72. # 13   $use_non_dyn_IP_for_tty Safe to set to 0 (the non set value)
  73. # 14   $Dir_PID       Must set if 13 is non zero
  74. # 15   External settings if 13 is set to non zero
  75. # 16   $interfaces             ** Must set
  76. #Ensure mrtg-dynip has executable permission.  See below as to where
  77. #mrtg-dynip may need to be installed.
  78. #Place a crontab entry, consistent with update time, similar to
  79. #0,5,10,15,20,25,30,35,40,45,50,55 * * * *  <next line continued here> 
  80. #cd /usr/src/mrtg/mrtg-2.5/; date >>/var/log/mrtg-dynip.log;
  81. #<continues previous line> ./mrtg-dynip >>/var/log/mrtg-dynip.log 2>&1
  82. #
  83. #Redirecting standard output and error to a log file with an indication
  84. #of time from 'date' is valuable for sorting out errors and preventing
  85. #messages from being emailed to the root account.
  86. #
  87. #If Perl5 snmp modules are not installed in standard libraries and 
  88. #the internal 'walk' is being used, then it is necessary to ensure
  89. #mrtg-dynip in installed in, and run from, a directory where the modules
  90. #are, typically the same directory the mrtg executable is in. 
  91. #The most difficult part in a dynamic IP environment may be choosing the IP
  92. #addresses to use for the scaler constant $interfaces, as you must ensure
  93. #the IP address used will always correspond to the physical interface
  94. #device, unless exception facility configured in.
  95. #For Internet Service Providers running ppp dial in lines, the choice will
  96. #be clear.  The IP addressess to use will be the 'remote' IP part of the
  97. #command line options for the real physical device (:remote_ip in
  98. #/etc/ppp/options.ttyXY file), unless static or fixed IP is allowed to
  99. #override this.  For dial out lines that can get a variable 'remote' IP, you
  100. #should be able to control what remote IP you get, no matter who you dial
  101. #into and what remote IP they may offer you, by configuring a remote IP as
  102. #for a dial in line above.
  103. #If the final negotiated ppp address pair as seen by your machine,
  104. #local_ip:remote_ip, is equal to a_ip:b_ip, then the local_ip:remote_ip as
  105. #seen by the other machine is b_ip:a_ip. Since the remote IP seen by your
  106. #side of the line is the local IP as seen and negotiated by the machine on
  107. #the other side of the line, you can choose whatever remote IP address suits
  108. #your side of the connection.  Specifying a 'remote' IP other than 0.0.0.0
  109. #will, by default with pppd, result in an IP the other machine will have to
  110. #accept as their local to succesfully negotiate a connection.  However it is
  111. #two way: the other machine can do the same to you for its corresponding
  112. #'remote' IP.  Hence mrtg-dynip can work on both machines.
  113. #Please note: If you have interface devices which register ppp10 or 
  114. #above, your snmp daemon may not supply information.  This is not due 
  115. #to a bug in mrtg, the snmp modules or this mrtg-dynip.
  116. #Latest version of this software should be available from
  117. #http://www.heenan.ironbark.id.au/source/mrtg-dynip
  118. ######## Start of configuration section, numbered 0 to 16.
  119. ######## Set this, 0
  120. #Check the perl path is correct on the very first line!
  121. ######## Set this, 1
  122. #Define $WorkDir to be the directory for web pages and data to be housed
  123. #Ensure each directory path ends with a seperator. If intending to run on 
  124. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  125. $HTTP_Work_Dir='/var/lib/httpd/htdocs/mrtg/';
  126. ########  Set this, 2
  127. #Define name of index html file, only condition is that it not the same name
  128. #as a html that will be regenerated.  All names of generated files contain
  129. #an IP address.
  130. $HTTP_index_file='index.html';
  131. ####### Set this, 3
  132. #Set to full directory path the mrtg executable is in.  Place this file
  133. #it if that is where the Perl 5 snmp modules are and $use_internal_walk
  134. #will not be set to 1 (see below).
  135. #Ensure each directory path ends with a seperator. If intending to run on
  136. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  137. $mrtg_Dir="/usr/src/mrtg/mrtg-2.5/";
  138. ####### Set this, 4
  139. #Set to full directory path the 'mrtg.cfg' file below is to be placed in.
  140. #The default choice is to choose same directory as for $mrtg_Dir above
  141. #Ensure each directory path ends with a seperator. If intending to run on
  142. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  143. ###$mrtgcfg_Dir="/usr/src/mrtg/mrtg-2.5/";
  144. $mrtgcfg_Dir=$mrtg_Dir;
  145. ####### Set this, 5
  146. #Set the name you would like the 'mrtg.cfg' file to be.  By locating or
  147. #naming differently from existing 'mrtg.cfg' files, you can run this
  148. #software independently of your existing mrtg installation.
  149. $mrtgcfg_file="mrtg-dynip.cfg";
  150. ####### Set this, 6
  151. #Set this to update interval in amount of minutes.  Ensure when this file
  152. #is run from crond and that the cron run inteval matches this update 
  153. #interval
  154. $update=5;
  155. ######## Set this, 7
  156. #Default community "public" may be sufficient. The community defined here
  157. #is the default community to use if no community is defined in the
  158. #for a particular interface in configuration of $interface in section 12.
  159. $community_default="public";
  160. ######## Set this, 8
  161. #Email address of network manager(s).  Ensure a '' appears before
  162. #'@' in email address, as in example.
  163. #$email="";         #No attempt to display if null
  164. $email="admin@our.net";
  165. ######## Set this, 9
  166. #Web address of home page for your system, do not include http:// at start
  167. #$home_page="";   #No attempt to display if null   
  168. $home_page="www.our.net";
  169. ######## Set this, 10         
  170. #Text for clickable link to home page of your system
  171. #$home_page_descr="";   #No attempt to display if null    
  172. $home_page_descr="Our Network";
  173. ######## Set this, 11
  174. #Set to a non zero if you want the program to die if there are problems
  175. #with responses from agents or hosts. Useful in testing phase.
  176. #$suicidal = 0; #Program is to soldier on if there are no responses from a host
  177. $suicidal = 1; #Program is to bomb out if there are problems with reponses
  178. ######## Set this, 12
  179. #Set this to a non zero if you have interfaces with the same IP number on
  180. #different masquerading firewall, or address translation, routers/hosts,
  181. #otherwise leave as 0.  This adds the name of the host to all web page file
  182. #names as well as the IP addresses.  Avoid using this option as its use make
  183. #it more difficult to keep track of interface data. 
  184. #$firewall_masq_tran_if = 1;
  185. $firewall_masq_tran_if = 0;
  186. ######## Set this, 13
  187. #If you have hosts upon which you do not make it a requirement that an
  188. #interface device uses a partciular IP number (that is you might provide
  189. #fixed IP address use into a rotary modem pool) then you can set this option
  190. #on and set item 17 appropriately.  Set to zero not to use, non zero to use
  191. #$use_non_dyn_IP_for_tty=1;
  192. $use_non_dyn_IP_for_tty=0;
  193. ######## Set this, 14
  194. #If you set option 13 above, then set to full directory path external
  195. #process will place a single line with the IP address into a file
  196. #with name that includes name of SNMP hsot and physical interface device
  197. #name.
  198. #
  199. #Ensure each directory path ends with a seperator. If intending to run on an
  200. #NT machine, then ensure the directory seperator is '\' instead of '/'
  201. $Dir_PID="/var/run/";
  202. ######## Set this, 15
  203. #If you haVe set option 13 above then you need to ensure
  204. #an external program provides required information from whatever
  205. #hosts you indicate in 16 are ports that can have their preferred
  206. #IP overridden.  
  207. #
  208. #For UNIX style localhosts the following lines can be inserted in
  209. #/etc/ppp/ip-up and /etc/ppp/ipdown.  Following a reboot stale
  210. #files should be removed automatically by startup, lest the machine
  211. #crashed.  For hosts other than the host upon which this script is 
  212. #running, ip-up and ip-down will need to be modified to ensure the 
  213. #information goes to /var/run of appropriate host.  This can be done 
  214. #using remote shell or other mechanisms, such as remote copy, nfs, 
  215. #auto processed email and special client/server networking.
  216. #
  217. #It is vital the 'host_name' for writing to /var/run/, as indicated in
  218. #/var/run/mrtg-dynip.host_name~~ttyXY, matches exactly the equivalent
  219. #host name in mrtg-dynip. This 'host_name' may be a single name, 
  220. #a dotted name or a dotted numeric IP address.
  221. #
  222. #/etc/ppp/ip-up for a localhost running a bash shell can include
  223. #
  224. #tty_name="$2"
  225. #IP_remote="$5"
  226. #/bin/echo $IP_remote > /var/run/mrtg-dynip.localhost~~${tty_name##/*/}
  227. #
  228. #The name of the file must exactly matched that sought for.  
  229. #
  230. #/etc/ppp/ip-down for a localhost running a bash shell can include
  231. #
  232. #tty_name=$2
  233. #/bin/rm -f /var/run/mrtg-dynip.localhost~~${tty_name##/*/}
  234. ######## Set this, 16
  235. #A pair of lines between blank lines represents an interface on a 
  236. #particular host.  
  237. #
  238. #You can comment out a single pair of lines with a '#' or any non digit
  239. #(except whitespace) as the first character of a pair of lines.
  240. #
  241. #The first line has the following format
  242. #'n' 'IP-addr' 'if-speed' 'snmp host' 'snmp community'
  243. #
  244. #The second line has the following format
  245. # 'Any free text description of interface'
  246. #The items must not be enclosed by '"' or '''.  Plese see example
  247. #below before reading any further. Any whitespace or combination
  248. #of whitespace (tabs or spaces) can seperate the items. However it
  249. #is important the two lines with 'END_OF_INTERFACES' end without
  250. #whitespace. 
  251. #
  252. #'n' is place this entry is to appear in the index of interfaces web file.
  253. #The number of digits should be the same for each interface, for example
  254. #use sequence 000 010 020 for successive numbers. You can temporarily
  255. #take an interface out of consideration by placing any non digit 
  256. #(except whitespace) before these digits, for example replace 010 
  257. #by N010 or #010
  258. #
  259. #'IP-addr' is a consistent IP address of a physical interface. Exceptions
  260. #can be catered for.  If you allow fixed (or static) IP into the physical
  261. #interface to override, then you can ensure the line is still marked active
  262. #in addition to the static IP entry being marked active.  To ensure this
  263. #occurs, append '~~ttyXY' to the IP address where ttyXY is the value
  264. #returned by ${tty_name##/*/} for the phyical device (or port) as indicated
  265. #in section 15.  To keep a value in place, even if the port is not part of
  266. #an IP overridable rotary pool, append a '~' to the end, such that complete
  267. #appendage to the IP address is now '~~ttyXY~'.  You can keep the appendages
  268. #even if you turn off, or do nor use, $use_non_dyn_IP_for_tty.
  269. #
  270. #'if-speed' is the interface speed in integer bits/sec. K and M multipliers
  271. #for Kb/s and Mb/s can be used (see example). If you want to use decimal
  272. #values then rewrite with a lower multiplier, for example write 
  273. #33.3K as  34099 (integer portion of 33.3 multiplied by 1024).
  274. #
  275. #'snmp host' is a common and consistent DNS name, or IP address, for
  276. #interfaces that belong to a particular machine.  For efficiency of snmp
  277. #agent use it is better all interfaces that belong to a particular machine
  278. #use a consistent name.
  279. #
  280. #'snmp community' is the community name of the 'public' community
  281. #for an interface (the public community does not have to be named 
  282. #'public').  This value does not have to be set: if this value is 
  283. #not set then the value of $community_default is used instead.
  284. #
  285. #'Any free text description of the interface ' on the second line
  286. #is as indicated.  It need not begin with whitepace (tabs or spaces).
  287. #
  288. #For dynamic IP interfaces, you must use unvarying 'remote' IPs as indicated
  289. #above.  Virtual interface devices should not be used, they provide the same
  290. #statistics as the real interface they are a virtual interface of.
  291. {
  292. $interfaces = <<END_OF_INTERFACES
  293. 010     123.123.555.123    64K     123.123.444.21
  294. Router interface
  295. 020     123.123.444.20    10M     localhost
  296.         Ethernet interface on machine for permanent links and dial up lines
  297. 101     123.123.444.1~~ttyC1 33K     localhost
  298. Rotary dial up line 1
  299. 102     123.123.444.2 33K     localhost
  300. Fixed dial up line 1
  301. 103     123.123.444.3    33K     localhost
  302. Fixed dial up line 2
  303. 104     123.123.444.4~~ttyC4    33K     localhost
  304. Rotary dial up line 2
  305. END_OF_INTERFACES
  306. }
  307. ###### You have reached the end of the configuration section, there is no
  308. #need to make any adjustments below for normal operation.
  309. @lines = split(/n/,$interfaces);
  310. $line=0;
  311. while ($line <= $#lines)
  312.   @elements = split (" ",$lines[$line]);
  313.   if (defined ($elements[3]))
  314.   {
  315.     $order=$elements[0];
  316.     ($ip,$tty) = split (/~~/,$elements[1]);
  317.     $speed = $elements[2];
  318.     $snmp_host = $elements[3];
  319.     $community = defined ($elements[4]) ? $elements[4] : $community_default;
  320.     $descr=$lines[$line+1];
  321.     $descr =~ s/^s*//;
  322.     $ip_descr{$ip."@".$snmp_host} = [$order,$speed,$community,$descr];
  323.     $snmp_comm_host{$community."@".$snmp_host}{$ip}=1;
  324.     $dyn_port{$snmp_host."~~".$tty} = $ip if ($use_non_dyn_IP_for_tty && $tty && $tty !~ /~$/);
  325.     $line=$line+2;
  326.   }
  327.   else
  328.   {
  329.     $line++;
  330.   }
  331. }
  332. #Use Simon Leinen's Perl 5 snmp modules included with mrtg
  333. #consistent with manner Simon uses in examples
  334. {
  335. &snmp_get_response;
  336. }
  337. if ($use_non_dyn_IP_for_tty != 0)
  338. {
  339.   foreach $tty (keys(%dyn_port))
  340.   {
  341.      if ( -e $Dir_PID."mrtg-dynip.".$tty )
  342.      {
  343.       ($snmp_host) = split (/~~/,$tty);
  344.       if ( (defined($target{$dyn_port{$tty}."@".$snmp_host})) == 0)
  345.       {
  346.         $ip_active = `cat $Dir_PID"mrtg-dynip."$tty`;
  347. $ip_active =~ s/s+$//;
  348. if (defined ( $target{$ip_active."@".$snmp_host}))
  349. {
  350. $target{$dyn_port{$tty}."@".$snmp_host} = $target{$ip_active."@".$snmp_host};
  351. }
  352.       }
  353.     }
  354.   }  
  355. }
  356. open MRTGCFG, ">$mrtg_Dir"."$mrtgcfg_file"
  357.          || die "$mrtg_Dir"."$mrtgcfg_file file could not be openedn";
  358. $ip_descr_ptr = %ip_descr;
  359. foreach $ip_i (keys(%target))
  360. {
  361. if ($$ip_descr_ptr{$ip_i}->[0] =~ /^d/) 
  362. {
  363. ($speed_fig,$speed_mult) = $$ip_descr_ptr{$ip_i}->[1] =~ /^(d+)(D*)/;
  364. if ($speed_mult =~ /M|m/)
  365. {
  366.   $scale = int ( $speed_fig * 1024 * 1024 / 8 );
  367. }
  368. elsif ($speed_mult =~ /K|k/)
  369. {
  370.   $scale = int ( $speed_fig * 1024 / 8 );
  371. }
  372. elsif ( $speed_mult eq "" )
  373. {
  374.   $scale = int ( $speed_fig / 8 );
  375. }
  376. else
  377. {
  378.   die("Incorrect speed format in scaler constant $interfacesn");
  379. }
  380. ($ip_if,$host) = split (/@/,$ip_i);
  381. if ($firewall_masq_tran_if != 0)
  382. {
  383. $snmp_target=$ip_i;
  384. }
  385. else
  386. {
  387. $snmp_target=$ip_if;
  388. }
  389. print MRTGCFG <<END
  390. Target[$snmp_target]: $target{$ip_i}:$$ip_descr_ptr{$ip_i}->[2]@$host
  391. MaxBytes[$snmp_target]: $scale
  392. Title[$snmp_target]: Traffic Analysis through interface device with IP address $ip_if of host $host
  393. PageTop[$snmp_target]: <H1>Stats for interface device with description $$ip_descr_ptr{$ip_i}->[3]</H1>
  394. END
  395. }
  396. }
  397. {
  398. print MRTGCFG <<END
  399. WorkDir: $HTTP_Work_Dir
  400. END
  401. }
  402. close MRTGCFG;
  403. $interval = $update * 60;
  404. $expires = gmtime (time + $interval + 60);
  405. $now=&datestr(time);
  406. open MRTGCFGWEB, ">$HTTP_Work_Dir"."$HTTP_index_file"
  407.  || die "Mrtg web index file could not be createdn";
  408. {
  409. print MRTGCFGWEB <<END
  410. <HTML><HEAD> 
  411. <META HTTP-EQUIV="Refresh" CONTENT="$interval">
  412. <META HTTP-EQUIV="Expires" CONTENT="$expires GMT"> 
  413. <TITLE>Index of stats pages for interface devices on interfaces described below</TITLE>
  414. </HEAD>
  415. <BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"> 
  416. <FONT FACE="Arial,Helvetica">
  417. <H1>Active and inactive interace device stats on interfaces described below</H1>
  418. This page last updated on $now<p>
  419. END
  420. }
  421. if ($home_page && $home_page_descr)
  422. {
  423. print MRTGCFGWEB <<END
  424. <p>
  425. A network management service courtesy of <a href="http://$home_page">
  426. $home_page_descr</a>
  427. <p>
  428. END
  429. }
  430. if ($email)
  431. {
  432. print MRTGCFGWEB <<END
  433. <p>
  434. Information and contact address: network management at email 
  435. <a href="mailto:$email">$email</a>
  436. <p>
  437. END
  438. }
  439. {
  440. print MRTGCFGWEB <<END
  441. <p>
  442. Static IP address and rotary line both marked active if line 
  443. in use by a static IP address 
  444. <p>
  445. END
  446. }
  447. {
  448. print MRTGCFGWEB <<END
  449. </FONT>
  450. <table>
  451. END
  452. }
  453. foreach $ip_i (keys %ip_descr)
  454. {
  455. $ip_order{$$ip_descr_ptr{$ip_i}->[0]} = $ip_i if ($$ip_descr_ptr{$ip_i}->[0] =~ /^d/);
  456. }
  457. foreach $i (sort (keys %ip_order))
  458. {
  459. $ip_i = $ip_order{$i};
  460. if ($firewall_masq_tran_if != 0)
  461. {
  462. $file_name=$ip_i;
  463. }
  464. else
  465. {
  466. ($file_name) = split (/@/,$ip_i);
  467. }
  468. if ( defined ($target{$ip_i}) )
  469. {
  470. print MRTGCFGWEB <<END
  471. <tr><td><FONT FACE="Arial,Helvetica">ACTIVE</FONT></td> <td><FONT FACE="Arial,Helvetica"><A HREF="$file_name.html">$$ip_descr_ptr{$ip_i}->[3]</a></FONT></td></tr>
  472. END
  473. }
  474. else
  475. {
  476. print MRTGCFGWEB <<END
  477. <tr><td><FONT FACE="Arial,Helvetica">INACTIVE</FONT></td> <td><FONT FACE="Arial,Helvetica"><A HREF="$file_name.html">$$ip_descr_ptr{$ip_i}->[3]</a></td></FONT></tr>
  478. END
  479. }
  480. }
  481. {
  482. print MRTGCFGWEB <<END
  483. </table>
  484. <FONT FACE="Arial,Helvetica">
  485. <p> This web page (but not the web pages above)
  486. generated by mrtg-dynip, version 0.41b, 1997/10/25
  487. created by <br>John Heenan, <a
  488. href="mailto:john@heenan.ironbark.id.au">john@heenan.ironbark.id.au</a>
  489. <P>Mrtg-dynip is a contribution to MRTG, enabling MRTG to generate multi
  490. interface traffic graphs for IP interfaces on hosts that do not provide
  491. consistent SNMP target numbers for their interfaces.  Such IP interfaces
  492. include IP active serial interfaces attached to modems in a PPP dial in
  493. environment. The hosts must run snmp agents.  For completeness, information
  494. about interface devices with unvarying SNMP target numbers, such as
  495. ethernet cards, can be configured to be included.<P>
  496. Mrtg-dynip can be considred to have sophisticated modem bank monitoring
  497. capacity, when the modems carry PPP or SLIP traffic.<P>
  498. This web page and web pages above, auto update details, and refresh, every
  499. $update minutes.<p>
  500. Source code for the latest non beta version of the mrtg-dynip software
  501. contribution is available from <a
  502. href="http://www.heenan.ironbark.id.au/source/mrtg-dynip">
  503. http://www.heenan.ironbark.id.au/source/mrtg-dynip</a><p> 
  504. END
  505. }
  506. print MRTGCFGWEB "</FONT></BODY></HTML>","n";
  507. close MRTGCFGWEB; 
  508. exec ("$mrtg_Dir"."mrtg $mrtgcfg_Dir"."$mrtgcfg_file");
  509. sub datestr {
  510. ($time) = shift(@_) || return 0;
  511. ($wday) = ('Sunday','Monday','Tuesday','Wednesday',
  512.                 'Thursday','Friday','Saturday')[(localtime($time))[6]];
  513. ($month) = ('January','February' ,'March' ,'April' ,
  514.                  'May' , 'June' , 'July' , 'August' , 'September' ,
  515.                  'October' ,
  516.                  'November' , 'December' )[(localtime($time))[4]];
  517. ($mday,$year,$hour,$min) = (localtime($time))[3,5,2,1];
  518. if ($min<10) {$min = "0$min";}
  519. return "$wday, $mday $month ".($year+1900)." at $hour:$min";
  520. }
  521. sub snmp_get_response
  522. {
  523. use BER;
  524. use SNMP_Session;
  525. SOLDIER_ON: foreach $comm_host (keys (%snmp_comm_host))
  526. {
  527. ($community,$host) = split (/@/,$comm_host);
  528. if ($session = SNMP_Session->open ($host, $community, 161))
  529. {
  530. @ipRouteIfIndex = split ('.', '1.3.6.1.2.1.4.21.1.2');
  531. @ipAdEntIfIndex = split ('.', '1.3.6.1.2.1.4.20.1.2');
  532. $if_route_index_index = encode_oid (@ipRouteIfIndex);
  533. $if_index_index = encode_oid (@ipAdEntIfIndex);
  534.   @oids = ($if_route_index_index);
  535.   for (;;) {
  536.     if ($session->getnext_request_response (@oids)) {
  537.         $response = $session->pdu_buffer;
  538.         ($bindings) = $session->decode_get_response ($response);
  539.         @next_oids = ();
  540.         ($binding,$bindings) = decode_sequence ($bindings);
  541.         ($oid,$value) = decode_by_template ($binding, "%O%@");
  542.         last unless BER::encoded_oid_prefix_p ($if_route_index_index, $oid);
  543.         push @next_oids, $oid;
  544.         ($ip_if) = pretty_print ($oid) =~ /.*.(d+.d+.d+.d+)$/;
  545.         $target_i = pretty_print ($value);
  546.         $target{$ip_if."@".$host} = $target_i if ( defined ($snmp_comm_host{$community."@".$host}{$ip_if}) );
  547.     } else 
  548.         {
  549.           die ("Suicide: no response from community $community on host $host","n") if ($suicidal != 0);
  550.           print ("Soldiering on: no response from community $community on host $host","n");
  551.           $session->close ();
  552.           last SOLDIER_ON;
  553.         }
  554.     @oids = @next_oids;
  555.   }
  556.   @oids = ($if_index_index);
  557.   for (;;) {
  558.     if ($session->getnext_request_response (@oids)) {
  559.         $response = $session->pdu_buffer;
  560.         ($bindings) = $session->decode_get_response ($response);
  561.         @next_oids = ();
  562.         ($binding,$bindings) = decode_sequence ($bindings);
  563.         ($oid,$value) = decode_by_template ($binding, "%O%@");
  564.         last unless BER::encoded_oid_prefix_p ($if_index_index, $oid);
  565.         push @next_oids, $oid;
  566.         ($ip_if) = pretty_print ($oid) =~ /.*.(d+.d+.d+.d+)$/;
  567.         $target_i = pretty_print ($value);
  568.         $target{$ip_if."@".$host} = $target_i if ( defined ($snmp_comm_host{$community."@".$host}{$ip_if}) );
  569.     } else 
  570.         {
  571.           die ("Suicide: no response from community $community on host $host","n") if ($suicidal != 0);
  572.           print ("Soldiering on: no response from community $community on host $host","n");
  573.   $session->close ();
  574.           last SOLDIER_ON;
  575.         }
  576.     @oids = @next_oids;
  577.   }
  578. $session->close ();
  579. }
  580. else
  581.   {
  582.      die ("Suicide: unable to open SNMP session to community $community on host $host","n") if ($suicidal != 0);
  583.      print ("Soldiering on: unable to open SNMP session to community $community on host $host","n");
  584.   }
  585. }
  586. }