Advertisement
Guest User

kelevra

a guest
Nov 27th, 2009
440
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.04 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2. #
  3. # $Id: om2browse.pl,v 1.2 2009/11/27 10:05:04 raven Exp $
  4. #
  5. use strict;
  6. use NetAddr::IP;
  7. use Data::Dumper;
  8. use IO::Socket;
  9. use Class::Date;
  10. use Text::Iconv;
  11. use IPC::Open2;
  12.  
  13. my $network = '192.168.10.0/24';
  14. my $dhcp_server = '192.168.10.2';
  15. my $dhcp_server_timeout = '1';
  16. my $dhcp_key = 'keyname keyself';
  17. my $browser_file = '/var/db/samba/browse.dat';
  18. my $browser_domain = 'DOMAIN';
  19. my $browser_head = qq~"$browser_domain" c0001000 "PDC" "$browser_domain"
  20. "PDC" 408d9b2b "Самый Главный Компьютер" "$browser_domain"
  21. ~;
  22.  
  23. our $dhcp_states = {
  24.  '00:00:00:01'   => 'free',
  25.  '00:00:00:02'   => 'active',
  26.  '00:00:00:03'   => 'expired',
  27.  '00:00:00:04'   => 'released',
  28.  '00:00:00:05'   => 'abandoned',
  29.  '00:00:00:06'   => 'reset',
  30.  '00:00:00:07'   => 'backup',
  31.  '00:00:00:08'   => 'backup-reserved',
  32. };
  33.  
  34. sub trim_all_chars($$) {
  35.  my($string, $chars) = (shift(), shift());
  36.  return('') unless($string);
  37.  $string =~ s/^[\Q$chars\E]+//;
  38.  $string =~ s/[\Q$chars\E]+$//;
  39.  return($string);
  40. }
  41.  
  42. sub get_dhcp_lease {
  43.  my $host = shift();
  44.  my $timeout = shift();
  45.  my $port = 7911;
  46.  $host = 'localhost' unless(defined($host));
  47.  ($host, $port) = split(/\:/, $host) if($host =~ /\:/);
  48.  my $user_key = shift();
  49.  my $sr_crit = shift();
  50.  my $launcher = qq~server $host
  51. port $port
  52. key $user_key
  53. connect
  54. new lease
  55. $sr_crit
  56. open
  57. ~;
  58.  my $result = { };
  59.  eval {
  60.   local $SIG{ALRM} = sub {
  61.    die('omshell repsonse time out');
  62.   };
  63.   alarm($timeout);
  64.   my $pid;
  65.   $pid = IPC::Open2::open2(\*ROM, \*WOM, '/usr/local/bin/omshell 2>&1') or die('cannot launch omshell!');
  66.   print(WOM $launcher);
  67.   close(WOM);
  68.   while(my $line = <ROM>) {
  69.    next() if($line =~ /^\>/);
  70.    chomp($line);
  71.    my($key, $value) = (undef, undef);
  72.    if($line =~ /(state) = (.+)/i) {
  73.     if(defined($dhcp_states->{"$2"})) {
  74.      ($key, $value) = ($1, $dhcp_states->{"$2"});
  75.     } else {
  76.      ($key, $value) = ($1, $2);
  77.     };
  78.    } elsif($line =~ /(ip-address) = (.+)/i) {
  79.     my @numbers = split(/\:/, $2);
  80.     foreach(@numbers) {
  81.      $_ = unpack('C', pack('H2', $_));
  82.     };
  83.     my $j = join('.', @numbers);
  84.     ($key, $value) = ($1, $j);
  85.    } elsif(
  86.     ($line =~ /(ends) = (.+)/i) or
  87.     ($line =~ /(starts) = (.+)/i) or
  88.     ($line =~ /(tstp) = (.+)/i) or
  89.     ($line =~ /(tsfp) = (.+)/i) or
  90.     ($line =~ /(cltt) = (.+)/i)
  91.    ) {
  92.     my($s1, $s2) = ($1, $2);
  93. # &#1074;&#1086;&#1079;&#1084;&#1086;&#1078;&#1085;&#1086;, &#1087;&#1086;&#1085;&#1072;&#1076;&#1086;&#1073;&#1080;&#1090;&#1089;&#1103; &#1085;&#1072; 32&#1093; &#1073;&#1080;&#1090;&#1085;&#1099;&#1093; &#1089;&#1080;&#1089;&#1090;&#1077;&#1084;&#1072;&#1093;:
  94. #    $s2 = join(':', reverse(split(/\:/, $s2)));
  95.     $s2 =~ s/\://g;
  96.     $s2 = hex($s2);
  97.     $s2 = Class::Date::date($s2);
  98.     ($key, $value) = ($s1, $s2);
  99.    } elsif($line =~ /(.+?) = (.+)/) {
  100.     $key = $1;
  101.     $value = $2;
  102.    };
  103.    $key = trim_all_chars($key, q~'"~);
  104.   $value = trim_all_chars($value, q~'"~);
  105.   $result->{$key} = $value;
  106.  };
  107.  close(ROM);
  108.  waitpid($pid, 0);
  109.  alarm(0);
  110. };
  111. $@ && die($@);
  112. return($result);
  113. };
  114.  
  115. my $subnet = NetAddr::IP->new($network);
  116. my $counter = $subnet->num();
  117. my $leases = {};
  118. while(--$counter >= 0) {
  119. my $addr = $subnet->nth($counter)->addr();
  120. my $sock = IO::Socket::INET->new(
  121.   'PeerAddr'    => $addr,
  122.   'PeerPort'    => 139,
  123.   'Proto'   => 'tcp',
  124.   'Timeout' => 0.01
  125. ) && do {
  126.  my $lease = get_dhcp_lease(
  127.   $dhcp_server,
  128.   $dhcp_server_timeout,
  129.   $dhcp_key,
  130.   'set ip-address = ' . $addr
  131.  );
  132.  my $lease_hostname = $lease->{'client-hostname'};
  133.  my $lease_ip_address = $lease->{'ip-address'};
  134.  if(defined($lease_hostname) and defined($lease_ip_address)) {
  135.   if($lease_hostname =~ /\w\w\:\w\w\:\w\w\:/) {
  136.    my $decoded_lease_hostname = '';
  137.    foreach my $letter(split(/\:/, $lease_hostname)) {
  138.     $decoded_lease_hostname .= pack('C', hex($letter));
  139.    };
  140.    my $conv = Text::Iconv->new('cp866', 'utf-8');
  141.    $lease_hostname = $conv->convert($decoded_lease_hostname);
  142.   };
  143.   my $lease_time = 0;
  144.   $lease_time = $lease->{'starts'}->epoch();
  145.   $lease_time = $lease->{'ends'}->epoch();
  146.   my $stored_lease_time = 0;
  147.   if(defined($leases->{"$lease_ip_address"}->{'time'})) {
  148.    my $stored_lease_time = $leases->{"$lease_ip_address"}->{'time'}->epoch();
  149.   }
  150.   if(
  151.    (not defined($stored_lease_time)) or
  152.    (defined($stored_lease_time) and ($lease_time > $stored_lease_time))
  153.   ) {
  154.    $leases->{"$lease_ip_address"} = {
  155.      'hostname' => $lease_hostname,
  156.      'time' => $lease_time,
  157.    };
  158.   };
  159.  };
  160. };
  161. }
  162.  
  163. my $temp_browser_file = "${browser_file}.temp";
  164. open(R, ">$temp_browser_file") or die("cannot open [$temp_browser_file]\n");
  165. print(R $browser_head);
  166. foreach my $ip(keys(%$leases)) {
  167. my $hostname = $leases->{"$ip"}->{'hostname'};
  168. print(R qq~"$hostname" 00011003 "" "$browser_domain"\n~);
  169. };
  170. close(R);
  171. rename($temp_browser_file, $browser_file) or die("cannot rename [$temp_browser_file] to [$browser_file]\n");
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement