snmpd_ifAliasBird 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #! /usr/bin/perl
  2. use strict;
  3. my $baseoid = ".1.3.6.1.2.1.31.1.1.1.18";
  4. my $cache_secs = 60;
  5. # ----------------------------------
  6. my $mib;
  7. my $mibtime;
  8. $| = 1;
  9. while (my $cmd = <STDIN>) {
  10. chomp $cmd;
  11. if ($cmd eq "PING") {
  12. print "PONG\n";
  13. } elsif ($cmd eq "get") {
  14. my $oid_in = <STDIN>;
  15. chomp($oid_in);
  16. my $oid = get_oid($oid_in);
  17. my $mib = create_alias_mib();
  18. if ($oid != 0 && defined{$mib->{$oid}}) {
  19. print "$baseoid.$oid\n";
  20. print $mib->{$oid}[0]."\n";
  21. print $mib->{$oid}[1]."\n";
  22. } else {
  23. print "NONE\n";
  24. }
  25. } elsif ($cmd eq "getnext") {
  26. my $oid_in = <STDIN>;
  27. my $oid = get_oid($oid_in);
  28. my $found = 0;
  29. my $mib = create_alias_mib();
  30. my @s = sort { oidcmp($a, $b) } keys %{ $mib };
  31. for (my $i = 0; $i < @s; $i++) {
  32. if (oidcmp($oid, $s[$i]) == -1) {
  33. print "$baseoid.".$s[$i]."\n";
  34. print $mib->{$s[$i]}[0]."\n";
  35. print $mib->{$s[$i]}[1]."\n";
  36. $found = 1;
  37. last;
  38. }
  39. }
  40. if (!$found) {
  41. print "NONE\n";
  42. }
  43. } else {
  44. # Unknown command
  45. }
  46. }
  47. exit 0;
  48. sub get_oid
  49. {
  50. my ($oid) = @_;
  51. chomp $oid;
  52. my $base = $baseoid;
  53. $base =~ s/\./\\./g;
  54. if ($oid !~ /^$base(\.|$)/) {
  55. # Requested oid doesn't match base oid
  56. return 0;
  57. }
  58. $oid =~ s/^$base\.?//;
  59. return $oid;
  60. }
  61. sub oidcmp {
  62. my ($x, $y) = @_;
  63. my @a = split /\./, $x;
  64. my @b = split /\./, $y;
  65. my $i = 0;
  66. while (1) {
  67. if ($i > $#a) {
  68. if ($i > $#b) {
  69. return 0;
  70. } else {
  71. return -1;
  72. }
  73. } elsif ($i > $#b) {
  74. return 1;
  75. }
  76. if ($a[$i] < $b[$i]) {
  77. return -1;
  78. } elsif ($a[$i] > $b[$i]) {
  79. return 1;
  80. }
  81. $i++;
  82. }
  83. }
  84. sub create_alias_mib
  85. {
  86. # We cache the results for $cache_secs seconds
  87. if (time - $mibtime < $cache_secs) {
  88. return $mib;
  89. }
  90. my %name;
  91. my %alias;
  92. # retrieve the interface alias & number
  93. open Q, "/usr/local/sbin/birdc sh interfaces |";
  94. while(my $l = <Q>) {
  95. chomp($l);
  96. if ($l =~ /^([^[:space:]]+)[[:space:]]([^[:space:]]+)[[:space:]]\(index=(\d+)\).*/) {
  97. $name{$1} = [ $3 ];
  98. }
  99. }
  100. close Q;
  101. open Q, "( if [ -e /etc/network/interfaces ]; then cat /etc/network/interfaces; elif [ -e /etc/rc.conf ]; then cat /etc/rc.conf; fi) |";
  102. while(my $l = <Q>) {
  103. chomp($l);
  104. if ($l =~ /^# ([^:]*): (.*)$/) {
  105. $alias{$name{$1}[0]} = [ "string", $2 ];
  106. }
  107. }
  108. close Q;
  109. $mib = \%alias;
  110. $mibtime = time;
  111. return $mib;
  112. }