e68fe9d2db
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1561 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
247 lines
5.6 KiB
Perl
247 lines
5.6 KiB
Perl
#!/usr/bin/env perl
|
|
#
|
|
# This was a first pass at a script that could be used to convert CSM
|
|
# stanza files into xCAT stanza files.
|
|
#
|
|
# Just want to save it for future reference - Norm - 4/22/2008
|
|
#
|
|
#-----------------------------------------------------------------------
|
|
#
|
|
|
|
use lib "/opt/xcat/lib/perl";
|
|
use xCAT::DBobjUtils;
|
|
use xCAT::Table;
|
|
use xCAT::NodeRange;
|
|
use Getopt::Long;
|
|
|
|
use strict;
|
|
|
|
use Socket;
|
|
|
|
# options can be bundled up like -vV
|
|
Getopt::Long::Configure("bundling") ;
|
|
$Getopt::Long::ignorecase=0;
|
|
|
|
# parse the options
|
|
if(!GetOptions(
|
|
'h|help' => \$::HELP,
|
|
'z=s' => \$::opt_z,
|
|
'v|version' => \$::VERSION,))
|
|
{
|
|
&usage;
|
|
exit(1);
|
|
}
|
|
|
|
# display the usage if -h or --help is specified
|
|
if ($::HELP) { &usage; exit(0);}
|
|
|
|
# display the version statement if -v or --verison is specified
|
|
if ($::VERSION)
|
|
{
|
|
print "csm2xcatdefs version 2.0\n";
|
|
exit(0);
|
|
}
|
|
|
|
|
|
|
|
#
|
|
# define the CSM to xCAT attr name equivalents
|
|
#
|
|
my %csm2xcat;
|
|
$csm2xcat{'InstallOSName'} = 'os';
|
|
$csm2xcat{'ConsoleMethod'} = 'cons';
|
|
$csm2xcat{'ManagementServer'} = 'xcatmaster';
|
|
$csm2xcat{'InstallServerAKBNode'} = 'xcatmaster'; # ???
|
|
$csm2xcat{'PowerMethod'} = 'power';
|
|
$csm2xcat{'HWControlPoint'} = 'hcp';
|
|
$csm2xcat{'HWType'} = 'mtm';
|
|
$csm2xcat{'HWModel'} = 'mtm'; # ???
|
|
$csm2xcat{'HWSerialNum'} = 'serial';
|
|
$csm2xcat{'InstallAdapterMacaddr'} = 'mac';
|
|
$csm2xcat{'InstallAdapterName'} = 'installnic';
|
|
# installnic, or primarynic or interface ????
|
|
$csm2xcat{'InstallKernelVersion'} = 'kernel';
|
|
$csm2xcat{'InstallPkgArchitecture'} = 'arch';
|
|
$csm2xcat{'InstallServer'} = 'servicenode';
|
|
$csm2xcat{'InstallTemplate'} = 'profile';
|
|
$csm2xcat{'LParID'} = 'id';
|
|
$csm2xcat{'Name'} = 'node';
|
|
$csm2xcat{'UserComment'} = 'usercomment';
|
|
$csm2xcat{'Status'} = 'status';
|
|
|
|
#
|
|
# read the CSM definitions from the CSM stanza file
|
|
#
|
|
my %csmdefs = getCSMdefs($::opt_z);
|
|
|
|
#
|
|
# convert each CSM node def to the corresponding xCAT node def
|
|
#
|
|
#my %::xcatvals;
|
|
foreach my $node (keys %csmdefs)
|
|
{
|
|
|
|
#print "node= $node\n";
|
|
|
|
foreach my $attr (keys %csm2xcat)
|
|
{
|
|
# if the CSM attr is defined
|
|
# and if there is a corresponding xCAT attr
|
|
if ( ($csmdefs{$node}{$attr}) ) {
|
|
|
|
#print "\t$attr = $csmdefs{$node}{$attr}, xcat attr = $csm2xcat{$attr}\n";
|
|
|
|
# use short host name for xcat node name
|
|
my $shorthost;
|
|
($shorthost = $node) =~ s/\..*$//;
|
|
chomp $shorthost;
|
|
|
|
if ( ($attr eq 'HWType') || ($attr eq 'HWModel')) {
|
|
if ( ( defined($csmdefs{$node}{'HWType'}) ) && ( defined($csmdefs{$node}{'HWModel'}) ) ) {
|
|
|
|
$::xcatvals{$shorthost}{$csm2xcat{$attr}}="$csmdefs{$node}{'HWType'}-$csmdefs{$node}{'HWModel'}";
|
|
}
|
|
|
|
} else {
|
|
|
|
$::xcatvals{$shorthost}{$csm2xcat{$attr}}=$csmdefs{$node}{$attr};
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} # end - for each attr
|
|
|
|
} # END for each node
|
|
|
|
#
|
|
# display the xCAT info in stanza format
|
|
#
|
|
print "# <xCAT data object stanza file>\n";
|
|
foreach my $node (keys %::xcatvals)
|
|
{
|
|
print "$node:\n";
|
|
|
|
print "\tobjtype=node\n";
|
|
|
|
foreach my $a (keys %{$::xcatvals{$node}} )
|
|
{
|
|
if ($a eq 'node') {
|
|
next;
|
|
}
|
|
|
|
if ( defined($::xcatvals{$node}{$a}) ) {
|
|
print "\t$a=$::xcatvals{$node}{$a}\n";
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
exit 0;
|
|
|
|
sub usage {
|
|
print "Usage:\n";
|
|
print "To convert a CSM stanza file to an xCAT stanza file.\n\n";
|
|
print "\tcsm2xcatdefs -z <csm_stanza_file>\n\n";
|
|
print "Proceedure:\n";
|
|
print "\tCreate a CSM stanza file using the CSM lsnode command.\n";
|
|
print "\tRun the csm2xcatdefs command and redirect the output to \n";
|
|
print "\t an xCAT stanza file.\n";
|
|
print "\tUse the xCAT stanza file as input to the xCAT mkdef command.\n\n";
|
|
}
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
=head3 getCSMdefs
|
|
|
|
|
|
Read a CSM stanza file and populate the %::Nodes hash
|
|
and the @::node_list array.
|
|
|
|
%csmdefs = getCSMdefs($stanzafile);
|
|
|
|
=cut
|
|
|
|
#-------------------------------------------------------------------------------
|
|
|
|
sub getCSMdefs
|
|
{
|
|
my ($nodedef_file) = @_;
|
|
my $n = -1;
|
|
my @lines;
|
|
my $line;
|
|
my $linenum =0;
|
|
my ($junk1, $junk2);
|
|
my ($attr, $val);
|
|
my %nodedefs;
|
|
|
|
unless (open(NODEDEF, "<$nodedef_file")) {
|
|
print "Could not open $nodedef_file.\n";
|
|
}
|
|
|
|
my $look_for_colon = 1; # start with first line that has a colon
|
|
|
|
# parse the contents of the nodedef file
|
|
@lines = <NODEDEF>;
|
|
close(NODEDEF);
|
|
|
|
foreach $line (@lines)
|
|
{
|
|
$linenum++;
|
|
chomp $line;
|
|
|
|
(grep(/^\s*#/, $line)) && next; # Skip comment lines
|
|
|
|
next if ($line =~ /^\s*$/); # Next if empty blank line
|
|
|
|
if (grep(/:\s*$/, $line))
|
|
{ # see if it's a stanza name
|
|
$look_for_colon = 0;
|
|
($::hostname, $junk1, $junk2) = split(/:/, $line);
|
|
|
|
$::hostname =~ s/^\s*//; # Remove any leading whitespace
|
|
$::hostname =~ s/\s*$//; # Remove any trailing whitespace
|
|
if ($::hostname eq "default")
|
|
{
|
|
next;
|
|
}
|
|
|
|
$nodedefs{$::hostname}{'Name'} = $::hostname;
|
|
$n++;
|
|
|
|
}
|
|
elsif ($line =~ /^\s*(\w+)\s*=\s*(.*)\s*/)
|
|
{
|
|
$attr = $1;
|
|
$val = $2;
|
|
$attr =~ s/^\s*//; # Remove any leading whitespace
|
|
$attr =~ s/\s*$//; # Remove any trailing whitespace
|
|
$val =~ s/^\s*//;
|
|
$val =~ s/\s*$//;
|
|
|
|
# remove spaces and quotes so createnode won't get upset
|
|
$val =~ s/^\s*"\s*//;
|
|
$val =~ s/\s*"\s*$//;
|
|
|
|
if ($::hostname eq "")
|
|
{
|
|
$look_for_colon++;
|
|
next;
|
|
}
|
|
|
|
$nodedefs{$::hostname}{$attr} = $val;
|
|
}
|
|
else
|
|
{
|
|
|
|
# error - invalid line in node definition file
|
|
$look_for_colon++;
|
|
}
|
|
} # end parsing loop
|
|
|
|
|
|
return %nodedefs;
|
|
}
|