mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@104 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
		
			
				
	
	
		
			207 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
#TODO: delete entries not being refreshed if no noderange
 | 
						|
package xCAT_plugin::conserver;
 | 
						|
use xCAT::Table;
 | 
						|
use strict;
 | 
						|
use Data::Dumper;
 | 
						|
my @cservers = qw(mrv cyclades);
 | 
						|
my %termservers; #list of noted termservers
 | 
						|
 | 
						|
sub handled_commands {
 | 
						|
  return {
 | 
						|
    makeconservercf => "conserver"
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
sub process_request {
 | 
						|
  my $req = shift;
 | 
						|
  my $cb = shift;
 | 
						|
  if ($req->{command}->[0] eq "makeconservercf") {
 | 
						|
    makeconservercf($req,$cb);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
sub docfheaders {
 | 
						|
# Put in standard headers common to all conserver.cf files
 | 
						|
  my $content = shift;
 | 
						|
  my $numlines = @$content;
 | 
						|
  my @meat = grep(!/^#/,@$content);
 | 
						|
  unless (grep(/^default full/,@meat)) {
 | 
						|
    push @$content,"default full { rw *; }\n";
 | 
						|
  }
 | 
						|
  unless (grep(/^default cyclades/,@meat)) {
 | 
						|
    push @$content,"default cyclades { type host; portbase 7000; portinc 1; }\n"
 | 
						|
  }
 | 
						|
  unless (grep(/^default mrv/,@meat)) {
 | 
						|
    push @$content,"default mrv { type host; portbase 2000; portinc 100; }\n"
 | 
						|
  }
 | 
						|
  unless (grep(/^access \*/,@meat)) {
 | 
						|
#TODO: something intelligent, allowing other hosts in
 | 
						|
    #push @$content,"#xCAT BEGIN ACCESS\n";
 | 
						|
    push @$content,"access * {\n";
 | 
						|
    push @$content,"  trusted 127.0.0.1;\n";
 | 
						|
    push @$content,"}\n";
 | 
						|
    #push @$content,"#xCAT END ACCESS\n";
 | 
						|
  }
 | 
						|
  unless (grep(/^default \*/,@meat)) {
 | 
						|
    push @$content,"default * {\n";
 | 
						|
    push @$content,"  logfile /var/log/consoles/&;\n";
 | 
						|
    push @$content,"  timestamp 1hab;\n";
 | 
						|
    push @$content,"  include full;\n";
 | 
						|
    push @$content,"  master localhost;\n";
 | 
						|
    push @$content,"}\n";
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
}
 | 
						|
sub makeconservercf {
 | 
						|
  my $req = shift;
 | 
						|
  %termservers = (); #clear hash of existing entries
 | 
						|
  my $cb = shift;
 | 
						|
  my $nodes = $req->{node};
 | 
						|
  my $cfile;
 | 
						|
  my @filecontent;
 | 
						|
  open $cfile,'/etc/conserver.cf';
 | 
						|
  while (<$cfile>) {
 | 
						|
    push @filecontent,$_;
 | 
						|
  }
 | 
						|
  close $cfile;
 | 
						|
  docfheaders(\@filecontent);
 | 
						|
  my $hmtab = xCAT::Table->new('nodehm');
 | 
						|
  my @cfgents = $hmtab->getAllNodeAttribs(['mgt','cons']);
 | 
						|
#cfgents should now have all the nodes, so we can fill in our hashes one at a time.
 | 
						|
  foreach (@cfgents) {
 | 
						|
    unless ($_->{cons}) {$_->{cons} = $_->{mgt};} #populate with fallback
 | 
						|
    my $cmeth=$_->{cons};
 | 
						|
    if (grep(/^$cmeth$/,@cservers)) { #terminal server, more attribs needed
 | 
						|
      my $node = $_->{node};
 | 
						|
      my $tent = $hmtab->getNodeAttribs($node,["termserver","termport"]);
 | 
						|
      $_->{termserver} = $tent->{termserver};
 | 
						|
      $termservers{$tent->{termserver}} = 1;
 | 
						|
      $_->{termport}= $tent->{termport};
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if (($nodes and @$nodes > 0) or $req->{noderange}->[0]) {
 | 
						|
    foreach (@$nodes) {
 | 
						|
      my $node = $_;
 | 
						|
      foreach (@cfgents) {
 | 
						|
        if ($_->{node} eq $node) {
 | 
						|
          if ($_->{termserver} and $termservers{$_->{termserver}}) {
 | 
						|
            dotsent($_,\@filecontent);
 | 
						|
            delete $termservers{$_->{termserver}}; #prevent needless cycles being burned
 | 
						|
          }
 | 
						|
          donodeent($_,\@filecontent);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } else { #no nodes specified, do em all up
 | 
						|
    zapcfg(\@filecontent); # strip all xCAT configured stuff from config
 | 
						|
    foreach (@cfgents) {
 | 
						|
      if ($_->{termserver} and $termservers{$_->{termserver}}) {
 | 
						|
        dotsent($_,\@filecontent);
 | 
						|
        delete $termservers{$_->{termserver}}; #prevent needless cycles being burned
 | 
						|
      }
 | 
						|
      donodeent($_,\@filecontent);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  open $cfile,'>','/etc/conserver.cf';
 | 
						|
  foreach (@filecontent) {
 | 
						|
    print $cfile $_;
 | 
						|
  }
 | 
						|
  close $cfile;
 | 
						|
}
 | 
						|
 | 
						|
sub dotsent {
 | 
						|
  my $cfgent = shift;
 | 
						|
  my $tserv = $cfgent->{termserver};
 | 
						|
  my $content = shift;
 | 
						|
  my $idx = 0;
 | 
						|
  my $toidx = -1;
 | 
						|
  my $skip = 0;
 | 
						|
  my $skipnext = 0;
 | 
						|
  while ($idx < $#$content) { # Go through and delete that which would match my entry
 | 
						|
    if ($content->[$idx] =~ /^#xCAT BEGIN $tserv TS/) {
 | 
						|
      $toidx=$idx; #TODO put it back right where I found it
 | 
						|
      $skip = 1;
 | 
						|
      $skipnext=1;
 | 
						|
    } elsif ($content->[$idx] =~ /^#xCAT END $tserv TS/) {
 | 
						|
      $skipnext = 0;
 | 
						|
    }
 | 
						|
    if ($skip) {
 | 
						|
      splice (@$content,$idx,1);
 | 
						|
    } else {
 | 
						|
      $idx++;
 | 
						|
    }
 | 
						|
    $skip = $skipnext;
 | 
						|
  }
 | 
						|
  push @$content,"#xCAT BEGIN $tserv TS\n";
 | 
						|
  push @$content,"default $tserv {\n";
 | 
						|
  push @$content,"  include ".$cfgent->{cons}.";\n";
 | 
						|
  push @$content,"  host $tserv;\n";
 | 
						|
  push @$content,"}\n";
 | 
						|
  push @$content,"#xCAT END $tserv TS\n";
 | 
						|
}
 | 
						|
sub donodeent {
 | 
						|
  my $cfgent = shift;
 | 
						|
  my $node = $cfgent->{node};
 | 
						|
  my $content = shift;
 | 
						|
  my $idx=0;
 | 
						|
  my $toidx=-1;
 | 
						|
  my $skip = 0;
 | 
						|
  my $skipnext = 0;
 | 
						|
  while ($idx < $#$content) { # Go through and delete that which would match my entry
 | 
						|
    if ($content->[$idx] =~ /^#xCAT BEGIN $node CONS/) {
 | 
						|
      $toidx=$idx; #TODO put it back right where I found it
 | 
						|
      $skip = 1;
 | 
						|
      $skipnext=1;
 | 
						|
    } elsif ($content->[$idx] =~ /^#xCAT END $node CONS/) {
 | 
						|
      $skipnext = 0;
 | 
						|
    }
 | 
						|
    if ($skip) {
 | 
						|
      splice (@$content,$idx,1);
 | 
						|
    } else {
 | 
						|
      $idx++;
 | 
						|
    }
 | 
						|
    $skip = $skipnext;
 | 
						|
  }
 | 
						|
  push @$content,"#xCAT BEGIN $node CONS\n";
 | 
						|
  push @$content,"console $node {\n";
 | 
						|
  #if ($cfgent->{cons} 
 | 
						|
  my $cmeth=$cfgent->{cons};
 | 
						|
  print $cmeth."\n";
 | 
						|
  if (grep(/^$cmeth$/,@cservers)) { 
 | 
						|
    push @$content," include ".$cfgent->{termserver}.";\n";
 | 
						|
    push @$content," port ".$cfgent->{termport}.";\n";
 | 
						|
  } else { #a script method...
 | 
						|
    push @$content,"  type exec;\n";
 | 
						|
    push @$content,"  exec ".$::XCATPREFIX."/share/xcat/cons/".$cmeth." ".$node.";\n"
 | 
						|
  }
 | 
						|
  push @$content,"}\n";
 | 
						|
  push @$content,"#xCAT END $node CONS\n";
 | 
						|
}
 | 
						|
 | 
						|
sub zapcfg {
 | 
						|
  my $content = shift;
 | 
						|
  my $idx=0;
 | 
						|
  my $toidx=-1;
 | 
						|
  my $skip = 0;
 | 
						|
  my $skipnext = 0;
 | 
						|
  while ($idx <= $#$content) { # Go through and delete that which would match my entry
 | 
						|
    if ($content->[$idx] =~ /^#xCAT BEGIN/) {
 | 
						|
      $toidx=$idx; #TODO put it back right where I found it
 | 
						|
      $skip = 1;
 | 
						|
      $skipnext=1;
 | 
						|
    } elsif ($content->[$idx] =~ /^#xCAT END/) {
 | 
						|
      $skipnext = 0;
 | 
						|
    }
 | 
						|
    if ($skip) {
 | 
						|
      splice (@$content,$idx,1);
 | 
						|
    } else {
 | 
						|
      $idx++;
 | 
						|
    }
 | 
						|
    $skip = $skipnext;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
1;
 |