mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 03:12:30 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1838 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| package xCAT_plugin::networks;
 | |
| use xCAT::Table;
 | |
| use Data::Dumper;
 | |
| use Sys::Syslog;
 | |
| use Socket;
 | |
| use xCAT::Utils;
 | |
| 
 | |
| sub handled_commands
 | |
| {
 | |
|     return {makenetworks => "networks",};
 | |
| }
 | |
| 
 | |
| sub preprocess_request
 | |
| {
 | |
|     my $req = shift;
 | |
|     my $cb  = shift;
 | |
|     if ($req->{_xcatdest}) { return [$req]; }    #exit if preprocessed
 | |
|     my @requests = ({%$req}); #first element is local instance
 | |
|     my @sn = xCAT::Utils->getSNList();
 | |
|     foreach my $s (@sn)
 | |
|     {
 | |
|         my $reqcopy = {%$req};
 | |
|         $reqcopy->{'_xcatdest'} = $s;
 | |
|         push @requests, $reqcopy;
 | |
|     }
 | |
|     return \@requests;
 | |
| }
 | |
| 
 | |
| sub process_request
 | |
| {
 | |
|     my $nettab = xCAT::Table->new('networks', -create => 1, -autocommit => 0);
 | |
|     my @rtable = split /\n/, `/bin/netstat -rn`;
 | |
|     open($rconf, "/etc/resolv.conf");
 | |
|     my @nameservers;
 | |
|     if ($rconf)
 | |
|     {
 | |
|         my @rcont;
 | |
|         while (<$rconf>)
 | |
|         {
 | |
|             push @rcont, $_;
 | |
|         }
 | |
|         close($rconf);
 | |
|         foreach (grep /nameserver/, @rcont)
 | |
|         {
 | |
|             my $line = $_;
 | |
|             my @pair;
 | |
|             $line =~ s/#.*//;
 | |
|             @pair = split(/\s+/, $line);
 | |
|             push @nameservers, $pair[1];
 | |
|         }
 | |
|     }
 | |
|     splice @rtable, 0, 2;
 | |
|     foreach (@rtable)
 | |
|     { #should be the lines to think about, do something with U, and something else with UG
 | |
|         my $net;
 | |
|         my $mask;
 | |
|         my $mgtifname;
 | |
|         my $gw;
 | |
|         my @ent = split /\s+/, $_;
 | |
|         my $firstoctet = $ent[0];
 | |
|         $firstoctet =~ s/^(\d+)\..*/$1/;
 | |
|         if ($ent[0] eq "169.254.0.0" or ($firstoctet >= 224 and $firstoctet <= 239) or $ent[0] eq "127.0.0.0")
 | |
|         {
 | |
|             next;
 | |
|         }
 | |
|         if ($ent[3] eq 'U')
 | |
|         {
 | |
|             $net       = $ent[0];
 | |
|             $mask      = $ent[2];
 | |
|             $mgtifname = $ent[7];
 | |
|             $nettab->setAttribs({'net' => $net},
 | |
|                                 {'mask' => $mask, 'mgtifname' => $mgtifname});
 | |
|             my $tent = $nettab->getAttribs({'net' => $net}, 'nameservers');
 | |
|             unless ($tent and $tent->{nameservers})
 | |
|             {
 | |
|                 my $text = join ',', @nameservers;
 | |
|                 $nettab->setAttribs({'net' => $net}, {nameservers => $text});
 | |
|             }
 | |
|             unless ($tent and $tent->{tftpserver})
 | |
|             {
 | |
|                 my $netdev = $ent[7];
 | |
|                 my @netlines = split /\n/, `/sbin/ip addr show dev $netdev`;
 | |
|                 foreach (grep /\s*inet\b/, @netlines)
 | |
|                 {
 | |
|                     my @row = split(/\s+/, $_);
 | |
|                     my $ipaddr = $row[2];
 | |
|                     $ipaddr =~ s/\/.*//;
 | |
|                     my @maska = split(/\./, $mask);
 | |
|                     my @ipa   = split(/\./, $ipaddr);
 | |
|                     my @neta  = split(/\./, $net);
 | |
|                     my $isme  = 1;
 | |
|                     foreach (0 .. 3)
 | |
|                     {
 | |
|                         my $oct = (0 + $maska[$_]) & ($ipa[$_] + 0);
 | |
|                         unless ($oct == $neta[$_])
 | |
|                         {
 | |
|                             $isme = 0;
 | |
|                             last;
 | |
|                         }
 | |
|                     }
 | |
|                     if ($isme)
 | |
|                     {
 | |
|                         $nettab->setAttribs({'net' => $net},
 | |
|                                             {tftpserver => $ipaddr});
 | |
|                         last;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             $nettab->commit;
 | |
| 
 | |
|             #Nothing much sane to do for the other fields at the moment?
 | |
|         }
 | |
|         elsif ($ent[3] eq 'UG')
 | |
|         {
 | |
| 
 | |
|             #TODO: networks through gateway. and how we might care..
 | |
|         }
 | |
|         else
 | |
|         {
 | |
| 
 | |
|             #TODO: anything to do with such entries?
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 1;
 |