ipf-mod.pl
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:7k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. #!/usr/bin/perl -s
  2. ##
  3. ## IP Filter UCD-SNMP pass module
  4. ##
  5. ## Allows read IP Filter's tables (In, Out, AccIn, AccOut),
  6. ## fetching rules, hits and bytes (for accounting tables only).
  7. ##
  8. ## Author: Yaroslav Terletsky <ts@polynet.lviv.ua>
  9. ## Date: $ Tue Dec  1 10:24:08 EET 1998 $
  10. ## Version: 1.1a
  11. # Put this file in /usr/local/bin/ipf-mod.pl and then add the following 
  12. # line to your snmpd.conf file (without the # at the front):
  13. #
  14. #   pass .1.3.6.1.4.1.2021.13.2 /usr/local/bin/ipf-mod.pl
  15. # enterprises.ucdavis.ucdExperimental.ipFilter = .1.3.6.1.4.1.2021.13.2
  16. # ipfInTable.ipfInEntry.ipfInIndex integer = 1.1.1
  17. # ipfInTable.ipfInEntry.ipfInRule string = 1.1.2
  18. # ipfInTable.ipfInEntry.ipfInHits counter = 1.1.3
  19. # ipfOutTable.ipfOutEntry.ipfOutIndex integer = 1.2.1
  20. # ipfOutTable.ipfOutEntry.ipfOutRule string = 1.2.2
  21. # ipfOutTable.ipfOutEntry.ipfOutHits counter = 1.2.3
  22. # ipfAccInTable.ipfAccInEntry.ipfAccInIndex integer = 1.3.1
  23. # ipfAccInTable.ipfAccInEntry.ipfAccInRule string = 1.3.2
  24. # ipfAccInTable.ipfAccInEntry.ipfAccInHits counter = 1.3.3
  25. # ipfAccInTable.ipfAccInEntry.ipfAccInBytes counter = 1.3.4
  26. # ipfAccOutTable.ipfAccOutEntry.ipfAccOutIndex integer = 1.4.1
  27. # ipfAccOutTable.ipfAccOutEntry.ipfAccOutRule string = 1.4.2
  28. # ipfAccOutTable.ipfAccOutEntry.ipfAccOutHits counter = 1.4.3
  29. # ipfAccOutTable.ipfAccOutEntry.ipfAccOutBytes counter = 1.4.4
  30. # variables types
  31. %type = ('1.1.1', 'integer', '1.1.2', 'string', '1.1.3', 'counter',
  32.  '2.1.1', 'integer', '2.1.2', 'string', '2.1.3', 'counter',
  33.  '3.1.1', 'integer', '3.1.2', 'string', '3.1.3', 'counter',
  34.  '3.1.4', 'counter',
  35.  '4.1.1', 'integer', '4.1.2', 'string', '4.1.3', 'counter',
  36.  '4.1.4', 'counter');
  37. # getnext sequence
  38. %next = ('1.1.1', '1.1.2', '1.1.2', '1.1.3', '1.1.3', '2.1.1',
  39.  '2.1.1', '2.1.2', '2.1.2', '2.1.3', '2.1.3', '3.1.1',
  40.  '3.1.1', '3.1.2', '3.1.2', '3.1.3', '3.1.3', '3.1.4',
  41.  '3.1.4', '4.1.1',
  42.  '4.1.1', '4.1.2', '4.1.2', '4.1.3', '4.1.3', '4.1.4');
  43. # ipfilter's commands to fetch needed information
  44. $ipfstat_comm="/sbin/ipfstat";
  45. $ipf_in="$ipfstat_comm -ih 2>/dev/null";
  46. $ipf_out="$ipfstat_comm -oh 2>/dev/null";
  47. $ipf_acc_in="$ipfstat_comm -aih 2>/dev/null";
  48. $ipf_acc_out="$ipfstat_comm -aoh 2>/dev/null";
  49. $OID=$ARGV[0];
  50. $IPF_OID='.1.3.6.1.4.1.2021.13.2';
  51. $IPF_OID_NO_DOTS='.1.3.6.1.4.1.2021.13.2';
  52. # exit if OID is not one of IPF-MIB's
  53. exit if $OID !~ /^$IPF_OID_NO_DOTS(D|$)/;
  54. # get table, entry, column and row numbers
  55. $tecr = $OID;
  56. $tecr =~ s/^$IPF_OID_NO_DOTS(D|$)//;
  57. ($table, $entry, $col, $row, $rest) = split(/./, $tecr);
  58. # parse 'get' request
  59. if($g) {
  60. # exit if OID is wrong specified
  61. if(!defined $table or !defined $entry or !defined $col or !defined $row or defined $rest) {
  62. print "[1] NO-SUCH NAMEn" if $d;
  63. exit;
  64. }
  65. # get the OID's value
  66. $value = &get_value($table, $entry, $col, $row);
  67. print "value=$valuen" if $d;
  68. # exit if OID does not exist
  69. print "[2] NO-SUCH NAMEn" if $d and !defined $value;
  70. exit if !defined $value;
  71. # set ObjectID and reply with response
  72. $tec = "$table.$entry.$col";
  73. $ObjectID = "${IPF_OID}.${tec}.${row}";
  74. &response;
  75. }
  76. # parse 'get-next' request
  77. if($n) {
  78. # set values if 0 or unspecified
  79. $table = 1, $a = 1 if !$table or !defined $table;
  80. $entry = 1, $a = 1 if !$entry or !defined $entry;
  81. $col = 1, $a = 1 if !$col or !defined $col;
  82. $row = 1, $a = 1 if !$row or !defined $row;
  83. if($a) {
  84. # get the OID's value
  85. $value = &get_value($table, $entry, $col, $row);
  86. print "value=$valuen" if $d;
  87. # set ObjectID and reply with response
  88. $tec = "$table.$entry.$col";
  89. $ObjectID = "${IPF_OID}.${tec}.${row}";
  90. &response;
  91. }
  92. # get next OID's value
  93. $row++;
  94. $value = &get_value($table, $entry, $col, $row);
  95. # choose new table/column if rows exceeded
  96. if(!defined $value) {
  97. $tec = "$table.$entry.$col";
  98. $tec = $next{$tec} if !$a;
  99. $table = $tec;
  100. $entry = $tec;
  101. $col = $tec;
  102. $table =~ s/.d.d$//;
  103. $entry =~ s/^d.(d).d$/$1/;
  104. $col =~ s/^d.d.//;
  105. $row = 1;
  106. # get the OID's value
  107. $value = &get_value($table, $entry, $col, $row);
  108. print "value=$valuen" if $d;
  109. }
  110. # set ObjectID and reply with response
  111. $tec = "$table.$entry.$col";
  112. $ObjectID = "${IPF_OID}.${tec}.${row}";
  113. &response;
  114. }
  115. ##############################################################################
  116. # fetch values from 'ipfInTable' and 'ipfOutTable' tables
  117. sub fetch_hits_n_rules {
  118. local($row, $col, $ipf_output) = @_;
  119. local($asdf, $i, @ipf_lines, $length);
  120. # create an entry if no rule exists
  121. $ipf_output = "0 empty list for ipfilter" if !$ipf_output;
  122. @ipf_lines = split("n", $ipf_output);
  123. $length = $#ipf_lines + 1;
  124. for($i = 1; $i < $length + 1; $i++) {
  125. $hits{$i} = $ipf_lines[$i-1];
  126. $hits{$i} =~ s/^(d+).*$/$1/;
  127. $rule{$i} = $ipf_lines[$i-1];
  128. $rule{$i} =~ s/^d+ //;
  129. if($i == $row) {
  130. return $i if $col == 1;
  131. return $rule{$i} if $col == 2;
  132. return $hits{$i} if $col == 3;
  133. }
  134. }
  135. # return undefined value
  136. undef $asdf;
  137. return $asdf;
  138. }
  139. # fetch values from 'ipfAccInTable' and 'ipfAccOutTable' tables
  140. sub fetch_hits_bytes_n_rules {
  141. local($row, $col, $ipf_output) = @_;
  142. local($asdf, $i, @ipf_lines, $length);
  143. # create an entry if no rule exists
  144. $ipf_output = "0 0 empty list for ipacct" if !$ipf_output;
  145. @ipf_lines = split("n", $ipf_output);
  146. $length = $#ipf_lines + 1;
  147. for($i = 1; $i < $length + 1; $i++) {
  148. $hits{$i} = $ipf_lines[$i-1];
  149. $hits{$i} =~ s/^(d+) .*$/$1/;
  150. $bytes{$i} = $ipf_lines[$i-1];
  151. $bytes{$i} =~ s/^d+ (d+) .*/$1/;
  152. $rule{$i} = $ipf_lines[$i-1];
  153. $rule{$i} =~ s/^d+ d+ //;
  154. if($i == $row) {
  155. return $i if $col == 1;
  156. return $rule{$i} if $col == 2;
  157. return $hits{$i} if $col == 3;
  158. return $bytes{$i} if $col == 4;
  159. }
  160. }
  161. # return undefined value
  162. undef $asdf;
  163. return $asdf;
  164. }
  165. # get the values from ipfilter's tables
  166. sub get_value {
  167. local($table, $entry, $col, $row) = @_;
  168. if($table == 1) {
  169. # fetch ipfInTable data
  170. $ipf_output = `$ipf_in`;
  171. $value = &fetch_hits_n_rules($row, $col, $ipf_output);
  172. } elsif($table == 2) {
  173. # fetch ipfOutTable data
  174. $ipf_output = `$ipf_out`;
  175. $value = &fetch_hits_n_rules($row, $col, $ipf_output);
  176. } elsif($table == 3) {
  177. # fetch ipfAccInTable data
  178. $ipf_output = `$ipf_acc_in`;
  179. $value = &fetch_hits_bytes_n_rules($row, $col, $ipf_output);
  180. } elsif($table == 4) {
  181. # fetch ipfAccOutTable data
  182. $ipf_output = `$ipf_acc_out`;
  183. $value = &fetch_hits_bytes_n_rules($row, $col, $ipf_output);
  184. }
  185. return $value;
  186. }
  187. # generate response to 'get' or 'get-next' request
  188. sub response {
  189. # print ObjectID, its type and the value
  190. if(defined $ObjectID and defined $type{$tec} and defined $value) {
  191. print "$ObjectIDn";
  192. print "$type{$tec}n";
  193. print "$valuen";
  194. }
  195. exit;
  196. }