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

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.  The examples are for a
  56. #live ISP using web page http://www.stats.syd.net.au, you must change values
  57. #for your own use
  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. #The configuration herein is provivded as an example only. 
  119. #This file is used to generate http://www.stats.syd.net.au. 
  120. ######## Start of configuration section, numbered 0 to 16.
  121. ######## Set this, 0
  122. #Check the perl path is correct on the very first line!
  123. ######## Set this, 1
  124. #Define $WorkDir to be the directory for web pages and data to be housed
  125. #Ensure each directory path ends with a seperator. If intending to run on 
  126. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  127. $HTTP_Work_Dir='/var/lib/httpd/htdocs/mrtg/';
  128. ########  Set this, 2
  129. #Define name of index html file, only condition is that it not the same name
  130. #as a html that will be regenerated.  All names of generated files contain
  131. #an IP address.
  132. $HTTP_index_file='index.html';
  133. ####### Set this, 3
  134. #Set to full directory path the mrtg executable is in.  Place this file
  135. #it if that is where the Perl 5 snmp modules are and $use_internal_walk
  136. #will not be set to 1 (see below).
  137. #Ensure each directory path ends with a seperator. If intending to run on
  138. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  139. $mrtg_Dir="/usr/src/mrtg/mrtg-2.5/";
  140. ####### Set this, 4
  141. #Set to full directory path the 'mrtg.cfg' file below is to be placed in.
  142. #The default choice is to choose same directory as for $mrtg_Dir above
  143. #Ensure each directory path ends with a seperator. If intending to run on
  144. #an NT machine, then ensure the directory seperator is '\' instead of '/'
  145. ###$mrtgcfg_Dir="/usr/src/mrtg/mrtg-2.5/";
  146. $mrtgcfg_Dir=$mrtg_Dir;
  147. ####### Set this, 5
  148. #Set the name you would like the 'mrtg.cfg' file to be.  By locating or
  149. #naming differently from existing 'mrtg.cfg' files, you can run this
  150. #software independently of your existing mrtg installation.
  151. $mrtgcfg_file="mrtg-dynip.cfg";
  152. ####### Set this, 6
  153. #Set this to update interval in amount of minutes.  Ensure when this file
  154. #is run from crond and that the cron run inteval matches this update 
  155. #interval
  156. $update=5;
  157. ######## Set this, 7
  158. #Default community "public" may be sufficient. The community defined here
  159. #is the default community to use if no community is defined in the
  160. #for a particular interface in configuration of $interface in section 12.
  161. $community_default="public";
  162. ######## Set this, 8
  163. #Email address of network manager(s).  Ensure a '' appears before
  164. #'@' in email address, as in example.
  165. #$email="";         #No attempt to display if null
  166. $email="admin@syd.net.au";
  167. ######## Set this, 9
  168. #Web address of home page for your system, do not include http:// at start
  169. #$home_page="";   #No attempt to display if null   
  170. $home_page="www.syd.net.au";
  171. ######## Set this, 10         
  172. #Text for clickable link to home page of your system
  173. #$home_page_descr="";   #No attempt to display if null    
  174. $home_page_descr="SydNet Internet and Network Services";
  175. ######## Set this, 11
  176. #Set to a non zero if you want the program to die if there are problems
  177. #with responses from agents or hosts. Useful in testing phase.
  178. #$suicidal = 0; #Program is to soldier on if there are no responses from a host
  179. $suicidal = 1; #Program is to bomb out if there are problems with reponses
  180. ######## Set this, 12
  181. #Set this to a non zero if you have interfaces with the same IP number on
  182. #different masquerading firewall, or address translation, routers/hosts,
  183. #otherwise leave as 0.  This adds the name of the host to all web page file
  184. #names as well as the IP addresses.  Avoid using this option as its use make
  185. #it more difficult to keep track of interface data. 
  186. #$firewall_masq_tran_if = 1;
  187. $firewall_masq_tran_if = 0;
  188. ######## Set this, 13
  189. #If you have hosts upon which you do not make it a requirement that an
  190. #interface device uses a partciular IP number (that is you might provide
  191. #fixed IP address use into a rotary modem pool) then you can set this option
  192. #on and set item 17 appropriately.  Set to zero not to use, non zero to use
  193. $use_non_dyn_IP_for_tty=1;
  194. #$use_non_dyn_IP_for_tty=0;
  195. ######## Set this, 14
  196. #If you set option 13 above, then set to full directory path external
  197. #process will place a single line with the IP address into a file
  198. #with name that includes name of SNMP hsot and physical interface device
  199. #name.
  200. #
  201. #Ensure each directory path ends with a seperator. If intending to run on an
  202. #NT machine, then ensure the directory seperator is '\' instead of '/'
  203. $Dir_PID="/var/run/";
  204. ######## Set this, 15
  205. #If you haVe set option 13 above then you need to ensure
  206. #an external program provides required information from whatever
  207. #hosts you indicate in 16 are ports that can have their preferred
  208. #IP overridden.  
  209. #
  210. #For UNIX style localhosts the following lines can be inserted in
  211. #/etc/ppp/ip-up and /etc/ppp/ipdown.  Following a reboot stale
  212. #files should be removed automatically by startup, lest the machine
  213. #crashed.  For hosts other than the host upon which this script is 
  214. #running, ip-up and ip-down will need to be modified to ensure the 
  215. #information goes to /var/run of appropriate host.  This can be done 
  216. #using remote shell or other mechanisms, such as remote copy, nfs, 
  217. #auto processed email and special client/server networking.
  218. #
  219. #It is vital the 'host_name' for writing to /var/run/, as indicated in
  220. #/var/run/mrtg-dynip.host_name~~ttyXY, matches exactly the equivalent
  221. #host name in mrtg-dynip. This 'host_name' may be a single name,
  222. #a dotted name or a dotted numeric IP address.
  223. #
  224. #/etc/ppp/ip-up for a localhost running a bash shell can include
  225. #
  226. #tty_name="$2"
  227. #IP_remote="$5"
  228. #/bin/echo $IP_remote > /var/run/mrtg-dynip.localhost~~${tty_name##/*/}
  229. #
  230. #The name of the file must exactly matched that sought for.  
  231. #
  232. #/etc/ppp/ip-down for a localhost running a bash shell can include
  233. #
  234. #tty_name=$2
  235. #/bin/rm -f /var/run/mrtg-dynip.localhost~~${tty_name##/*/}
  236. ######## Set this, 16
  237. #A pair of lines between blank lines represents an interface on a 
  238. #particular host.  
  239. #
  240. #You can comment out a single pair of lines with a '#' or any non digit
  241. #(except whitespace) as the first character of a pair of lines.
  242. #
  243. #The first line has the following format
  244. #'n' 'IP-addr' 'if-speed' 'snmp host' 'snmp community'
  245. #
  246. #The second line has the following format
  247. # 'Any free text description of interface'
  248. #The items must not be enclosed by '"' or '''.  Plese see example
  249. #below before reading any further. Any whitespace or combination
  250. #of whitespace (tabs or spaces) can seperate the items. However it
  251. #is important the two lines with 'END_OF_INTERFACES' end without
  252. #whitespace. 
  253. #
  254. #'n' is place this entry is to appear in the index of interfaces web file.
  255. #The number of digits should be the same for each interface, for example
  256. #use sequence 000 010 020 for successive numbers. You can temporarily
  257. #take an interface out of consideration by placing any non digit 
  258. #(except whitespace) before these digits, for example replace 010 
  259. #by N010 or #010
  260. #
  261. #'IP-addr' is a consistent IP address of a physical interface. Exceptions
  262. #can be catered for.  If you allow fixed (or static) IP into the physical
  263. #interface to override, then you can ensure the line is still marked active
  264. #in addition to the static IP entry being marked active.  To ensure this
  265. #occurs, append '~~ttyXY' to the IP address where ttyXY is the value
  266. #returned by ${tty_name##/*/} for the phyical device (or port) as indicated
  267. #in section 15.  To keep a value in place, even if the port is not part of
  268. #an IP overridable rotary pool, append a '~' to the end, such that complete
  269. #appendage to the IP address is now '~~ttyXY~'.  You can keep the appendages
  270. #even if you turn off, or do nor use, $use_non_dyn_IP_for_tty.
  271. #
  272. #'if-speed' is the interface speed in integer bits/sec. K and M multipliers
  273. #for Kb/s and Mb/s can be used (see example). If you want to use decimal
  274. #values then rewrite with a lower multiplier, for example write 
  275. #33.3K as  34099 (integer portion of 33.3 multiplied by 1024).
  276. #
  277. #'snmp host' is a common and consistent DNS name, or IP address, for
  278. #interfaces that belong to a particular machine.  For efficiency of snmp
  279. #agent use it is better all interfaces that belong to a particular machine
  280. #use a consistent name.
  281. #
  282. #'snmp community' is the community name of the 'public' community
  283. #for an interface (the public community does not have to be named 
  284. #'public').  This vale does not have to be set: if this value is 
  285. #not set then the value of $community_default is used instead.
  286. #
  287. #'Any free text description of the interface ' on the second line
  288. #is as indicated.  It need not begin with whitepace (tabs or spaces).
  289. #
  290. #For dynamic IP interfaces, you must use unvarying 'remote' IPs as indicated
  291. #above.  Virtual interface devices should not be used, they provide the same
  292. #statistics as the real interface they are a virtual interface of.
  293. #The configuration herein is provivded as an example only.
  294. #This file is used to generate http://www.stats.syd.net.au.
  295. {
  296. $interfaces = <<END_OF_INTERFACES
  297. 010     139.130.36.136    64K     203.35.74.100
  298.         SydNet - Telstra Internet link: 64K ISDN router interface connected 14 October 1997
  299. 020     203.35.74.101    10M     localhost
  300.         Ethernet interface on machine for permanent links and dial up lines
  301. 040     203.35.74.9~~ttyC9~ 33K     localhost
  302.         Permanent link for user pmw
  303. 050     203.35.74.120~~ttyC10~ 33K     localhost
  304.         Permanent link for machine chaosorb.syd.net.au
  305. 060     203.35.74.11~~ttyC11~  33K     localhost
  306.         Permanent link for domain arty.com.au
  307. 073     203.35.74.108      33K localhost
  308. Static IP address for SydNet technical and sys admin staff member
  309. 076     203.35.74.107      33K localhost
  310. Static IP address for SydNet security staff member
  311. 079     203.35.74.105      33 localhost
  312.         Static IP address for non permanent rotary dial in user foo
  313. 081     203.35.74.109      33K     localhost
  314.         Static IP address for non permanent rotary dial in user kebo
  315. 101     203.35.74.1~~ttyC1 33K     localhost
  316. Rotary dial up line 1
  317. 102     203.35.74.2~~ttyC2 33K     localhost
  318. Rotary dial up line 2
  319. 103     203.35.74.3~~ttyC3      33K     localhost
  320. Rotary dial up line 3
  321. 104     203.35.74.4~~ttyC4      33K     localhost
  322. Rotary dial up line 4
  323. 105     203.35.74.5~~ttyC5      33K     localhost
  324. Rotary dial up line 5
  325. 106     203.35.74.6~~ttyC6      33K     localhost
  326. Rotary dial up line 6
  327. 107     203.35.74.7~~ttyC7      33K     localhost
  328. Rotary dial up line 7
  329. 108     203.35.74.8~~ttyC8      33K     localhost
  330. Rotary dial up line 8
  331. 109     203.35.74.10~~ttyC0     33K     localhost
  332. Rotary dial up line 9
  333. END_OF_INTERFACES
  334. }
  335. #Convenient record of tty to dynamic IP mappings on localhost
  336. #ttyC0        203.35.74.10
  337. #ttyC1        203.35.74.1
  338. #ttyC2        203.35.74.2
  339. #ttyC3        203.35.74.3
  340. #ttyC4        203.35.74.4
  341. #ttyC5        203.35.74.5
  342. #ttyC6        203.35.74.6
  343. #ttyC7        203.35.74.7
  344. #ttyC8        203.35.74.8
  345. #ttyC9~       203.35.74.9
  346. #ttyC10~      203.35.74.120
  347. #ttyC11~      203.35.74.11
  348. #ttyC12       203.35.74.12
  349. #ttyC13       203.35.74.13
  350. #ttyC14       203.35.74.14
  351. #ttyC15       203.35.74.15
  352. ###### You have reached the end of the configuration section, there is no
  353. #need to make any adjustments below for normal operation.
  354. @lines = split(/n/,$interfaces);
  355. $line=0;
  356. while ($line <= $#lines)
  357.   @elements = split (" ",$lines[$line]);
  358.   if (defined ($elements[3]))
  359.   {
  360.     $order=$elements[0];
  361.     ($ip,$tty) = split (/~~/,$elements[1]);
  362.     $speed = $elements[2];
  363.     $snmp_host = $elements[3];
  364.     $community = defined ($elements[4]) ? $elements[4] : $community_default;
  365.     $descr=$lines[$line+1];
  366.     $descr =~ s/^s*//;
  367.     $ip_descr{$ip."@".$snmp_host} = [$order,$speed,$community,$descr];
  368.     $snmp_comm_host{$community."@".$snmp_host}{$ip}=1;
  369.     $dyn_port{$snmp_host."~~".$tty} = $ip if ($use_non_dyn_IP_for_tty && $tty && $tty !~ /~$/);
  370.     $line=$line+2;
  371.   }
  372.   else
  373.   {
  374.     $line++;
  375.   }
  376. }
  377. #Use Simon Leinen's Perl 5 snmp modules included with mrtg
  378. #consistent with manner Simon uses in examples
  379. {
  380. &snmp_get_response;
  381. }
  382. if ($use_non_dyn_IP_for_tty != 0)
  383. {
  384.   foreach $tty (keys(%dyn_port))
  385.   {
  386.      if ( -e $Dir_PID."mrtg-dynip.".$tty )
  387.      {
  388.       ($snmp_host) = split (/~~/,$tty);
  389.       if ( (defined($target{$dyn_port{$tty}."@".$snmp_host})) == 0)
  390.       {
  391.         $ip_active = `cat $Dir_PID"mrtg-dynip."$tty`;
  392. $ip_active =~ s/s+$//;
  393. if (defined ( $target{$ip_active."@".$snmp_host}))
  394. {
  395. $target{$dyn_port{$tty}."@".$snmp_host} = $target{$ip_active."@".$snmp_host};
  396. }
  397.       }
  398.     }
  399.   }  
  400. }
  401. open MRTGCFG, ">$mrtg_Dir"."$mrtgcfg_file"
  402.          || die "$mrtg_Dir"."$mrtgcfg_file file could not be openedn";
  403. $ip_descr_ptr = %ip_descr;
  404. foreach $ip_i (keys(%target))
  405. {
  406. if ($$ip_descr_ptr{$ip_i}->[0] =~ /^d/) 
  407. {
  408. ($speed_fig,$speed_mult) = $$ip_descr_ptr{$ip_i}->[1] =~ /^(d+)(D*)/;
  409. if ($speed_mult =~ /M|m/)
  410. {
  411.   $scale = int ( $speed_fig * 1024 * 1024 / 8 );
  412. }
  413. elsif ($speed_mult =~ /K|k/)
  414. {
  415.   $scale = int ( $speed_fig * 1024 / 8 );
  416. }
  417. elsif ( $speed_mult eq "" )
  418. {
  419.   $scale = int ( $speed_fig / 8 );
  420. }
  421. else
  422. {
  423.   die("Incorrect speed format in scaler constant $interfacesn");
  424. }
  425. ($ip_if,$host) = split (/@/,$ip_i);
  426. if ($firewall_masq_tran_if != 0)
  427. {
  428. $snmp_target=$ip_i;
  429. }
  430. else
  431. {
  432. $snmp_target=$ip_if;
  433. }
  434. print MRTGCFG <<END
  435. Target[$snmp_target]: $target{$ip_i}:$$ip_descr_ptr{$ip_i}->[2]@$host
  436. MaxBytes[$snmp_target]: $scale
  437. Title[$snmp_target]: Traffic Analysis through interface device with IP address $ip_if of host $host
  438. PageTop[$snmp_target]: <H1>Stats for interface device with description $$ip_descr_ptr{$ip_i}->[3]</H1>
  439. END
  440. }
  441. }
  442. {
  443. print MRTGCFG <<END
  444. WorkDir: $HTTP_Work_Dir
  445. END
  446. }
  447. close MRTGCFG;
  448. $interval = $update * 60;
  449. $expires = gmtime (time + $interval + 60);
  450. $now=&datestr(time);
  451. open MRTGCFGWEB, ">$HTTP_Work_Dir"."$HTTP_index_file"
  452.  || die "Mrtg web index file could not be createdn";
  453. {
  454. print MRTGCFGWEB <<END
  455. <HTML><HEAD> 
  456. <META HTTP-EQUIV="Refresh" CONTENT="$interval">
  457. <META HTTP-EQUIV="Expires" CONTENT="$expires GMT"> 
  458. <TITLE>Index of stats pages for interface devices on interfaces described below</TITLE>
  459. </HEAD>
  460. <BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"> 
  461. <FONT FACE="Arial,Helvetica">
  462. <H1>Active and inactive interace device stats on interfaces described below</H1>
  463. This page last updated on $now<p>
  464. END
  465. }
  466. if ($home_page && $home_page_descr)
  467. {
  468. print MRTGCFGWEB <<END
  469. <p>
  470. A network management service courtesy of <a href="http://$home_page">
  471. $home_page_descr</a>
  472. <p>
  473. END
  474. }
  475. if ($email)
  476. {
  477. print MRTGCFGWEB <<END
  478. <p>
  479. Information and contact address: network management at email 
  480. <a href="mailto:$email">$email</a>
  481. <p>
  482. END
  483. }
  484. {
  485. print MRTGCFGWEB <<END
  486. <p>
  487. Static IP address and rotary line both marked active if line 
  488. in use by a static IP address 
  489. <p>
  490. END
  491. }
  492. {
  493. print MRTGCFGWEB <<END
  494. </FONT>
  495. <table>
  496. END
  497. }
  498. foreach $ip_i (keys %ip_descr)
  499. {
  500. $ip_order{$$ip_descr_ptr{$ip_i}->[0]} = $ip_i if ($$ip_descr_ptr{$ip_i}->[0] =~ /^d/);
  501. }
  502. foreach $i (sort (keys %ip_order))
  503. {
  504. $ip_i = $ip_order{$i};
  505. if ($firewall_masq_tran_if != 0)
  506. {
  507. $file_name=$ip_i;
  508. }
  509. else
  510. {
  511. ($file_name) = split (/@/,$ip_i);
  512. }
  513. if ( defined ($target{$ip_i}) )
  514. {
  515. print MRTGCFGWEB <<END
  516. <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>
  517. END
  518. }
  519. else
  520. {
  521. print MRTGCFGWEB <<END
  522. <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>
  523. END
  524. }
  525. }
  526. {
  527. print MRTGCFGWEB <<END
  528. </table>
  529. <FONT FACE="Arial,Helvetica">
  530. <p> This web page (but not the web pages above)
  531. generated by mrtg-dynip, version 0.41b, 1997/10/25
  532. created by <br>John Heenan, <a
  533. href="mailto:john@heenan.ironbark.id.au">john@heenan.ironbark.id.au</a>
  534. <P>Mrtg-dynip is a contribution to MRTG, enabling MRTG to generate multi
  535. interface traffic graphs for IP interfaces on hosts that do not provide
  536. consistent SNMP target numbers for their interfaces.  Such IP interfaces
  537. include IP active serial interfaces attached to modems in a PPP dial in
  538. environment. The hosts must run snmp agents.  For completeness, information
  539. about interface devices with unvarying SNMP target numbers, such as
  540. ethernet cards, can be configured to be included.<P>
  541. Mrtg-dynip can be considred to have sophisticated modem bank monitoring
  542. capacity, when the modems carry PPP or SLIP traffic.<P>
  543. This web page and web pages above, auto update details, and refresh, every
  544. $update minutes.<p>
  545. Source code for the latest non beta version of the mrtg-dynip software
  546. contribution is available from <a
  547. href="http://www.heenan.ironbark.id.au/source/mrtg-dynip">
  548. http://www.heenan.ironbark.id.au/source/mrtg-dynip</a><p> 
  549. END
  550. }
  551. print MRTGCFGWEB "</FONT></BODY></HTML>","n";
  552. close MRTGCFGWEB; 
  553. exec ("$mrtg_Dir"."mrtg $mrtgcfg_Dir"."$mrtgcfg_file");
  554. sub datestr {
  555. ($time) = shift(@_) || return 0;
  556. ($wday) = ('Sunday','Monday','Tuesday','Wednesday',
  557.                 'Thursday','Friday','Saturday')[(localtime($time))[6]];
  558. ($month) = ('January','February' ,'March' ,'April' ,
  559.                  'May' , 'June' , 'July' , 'August' , 'September' ,
  560.                  'October' ,
  561.                  'November' , 'December' )[(localtime($time))[4]];
  562. ($mday,$year,$hour,$min) = (localtime($time))[3,5,2,1];
  563. if ($min<10) {$min = "0$min";}
  564. return "$wday, $mday $month ".($year+1900)." at $hour:$min";
  565. }
  566. sub snmp_get_response
  567. {
  568. use BER;
  569. use SNMP_Session;
  570. SOLDIER_ON: foreach $comm_host (keys (%snmp_comm_host))
  571. {
  572. ($community,$host) = split (/@/,$comm_host);
  573. if ($session = SNMP_Session->open ($host, $community, 161))
  574. {
  575. @ipRouteIfIndex = split ('.', '1.3.6.1.2.1.4.21.1.2');
  576. @ipAdEntIfIndex = split ('.', '1.3.6.1.2.1.4.20.1.2');
  577. $if_route_index_index = encode_oid (@ipRouteIfIndex);
  578. $if_index_index = encode_oid (@ipAdEntIfIndex);
  579.   @oids = ($if_route_index_index);
  580.   for (;;) {
  581.     if ($session->getnext_request_response (@oids)) {
  582.         $response = $session->pdu_buffer;
  583.         ($bindings) = $session->decode_get_response ($response);
  584.         @next_oids = ();
  585.         ($binding,$bindings) = decode_sequence ($bindings);
  586.         ($oid,$value) = decode_by_template ($binding, "%O%@");
  587.         last unless BER::encoded_oid_prefix_p ($if_route_index_index, $oid);
  588.         push @next_oids, $oid;
  589.         ($ip_if) = pretty_print ($oid) =~ /.*.(d+.d+.d+.d+)$/;
  590.         $target_i = pretty_print ($value);
  591.         $target{$ip_if."@".$host} = $target_i if ( defined ($snmp_comm_host{$community."@".$host}{$ip_if}) );
  592.     } else 
  593.         {
  594.           die ("Suicide: no response from community $community on host $host","n") if ($suicidal != 0);
  595.           print ("Soldiering on: no response from community $community on host $host","n");
  596.           $session->close ();
  597.           last SOLDIER_ON;
  598.         }
  599.     @oids = @next_oids;
  600.   }
  601.   @oids = ($if_index_index);
  602.   for (;;) {
  603.     if ($session->getnext_request_response (@oids)) {
  604.         $response = $session->pdu_buffer;
  605.         ($bindings) = $session->decode_get_response ($response);
  606.         @next_oids = ();
  607.         ($binding,$bindings) = decode_sequence ($bindings);
  608.         ($oid,$value) = decode_by_template ($binding, "%O%@");
  609.         last unless BER::encoded_oid_prefix_p ($if_index_index, $oid);
  610.         push @next_oids, $oid;
  611.         ($ip_if) = pretty_print ($oid) =~ /.*.(d+.d+.d+.d+)$/;
  612.         $target_i = pretty_print ($value);
  613.         $target{$ip_if."@".$host} = $target_i if ( defined ($snmp_comm_host{$community."@".$host}{$ip_if}) );
  614.     } else 
  615.         {
  616.           die ("Suicide: no response from community $community on host $host","n") if ($suicidal != 0);
  617.           print ("Soldiering on: no response from community $community on host $host","n");
  618.   $session->close ();
  619.           last SOLDIER_ON;
  620.         }
  621.     @oids = @next_oids;
  622.   }
  623. $session->close ();
  624. }
  625. else
  626.   {
  627.      die ("Suicide: unable to open SNMP session to community $community on host $host","n") if ($suicidal != 0);
  628.      print ("Soldiering on: unable to open SNMP session to community $community on host $host","n");
  629.   }
  630. }
  631. }