diff --git a/xCAT-server-2.0/share/xcat/tools/csm2xcatdefs b/xCAT-server-2.0/share/xcat/tools/csm2xcatdefs new file mode 100644 index 000000000..e156bb867 --- /dev/null +++ b/xCAT-server-2.0/share/xcat/tools/csm2xcatdefs @@ -0,0 +1,246 @@ +#!/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 "# \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 \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 = ; + 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; +}