# 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;


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 $sitetab = xCAT::Table->new('site');
   (my $ent) = $sitetab->getAttribs({key=>'xcatservers'},'value');
   $sitetab->close;
   if ($ent and $ent->{value}) {
      foreach (split /,/,$ent->{value}) {
         if (thishostisnot($_)) {
            my $reqcopy = {%$req};
            $reqcopy->{'_xcatdest'} = $_;
            push @requests,$reqcopy;
         }
      }
   }
   return \@requests;
}

sub thishostisnot {
  my $comparison = shift;
  my @ips = split /\n/,`/sbin/ip addr`;
  my $comp=inet_aton($comparison);
  foreach (@ips) { 
    if (/^\s*inet/) {
	my @ents = split(/\s+/);
	my $ip=$ents[2];
	$ip =~ s/\/.*//;
	if (inet_aton($ip) eq $comp) { 
	  return 0;
	}
	#print Dumper(inet_aton($ip));
    }
  }
  return 1;
}
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+/,$_;
    if ($ent[0] eq "169.254.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;