From 87030e3737f8bca03bc2fa097f4c203e5af4d9e7 Mon Sep 17 00:00:00 2001 From: bp-sawyers Date: Sat, 8 Mar 2008 14:14:00 +0000 Subject: [PATCH] Cleaned up node cmds and man pages and fixed Tracker bug 1908147 git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@733 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-client-2.0/pods/man1/nodeadd.1.pod | 82 +++-- xCAT-client-2.0/pods/man1/nodech.1.pod | 94 ++++-- xCAT-client-2.0/pods/man1/nodels.1.pod | 22 +- xCAT-client-2.0/share/man/man1/xdsh.1 | 2 +- xCAT-server-2.0/lib/xcat/plugins/tabutils.pm | 302 ++++++++----------- 5 files changed, 267 insertions(+), 235 deletions(-) diff --git a/xCAT-client-2.0/pods/man1/nodeadd.1.pod b/xCAT-client-2.0/pods/man1/nodeadd.1.pod index db7cf31c1..55644f70b 100644 --- a/xCAT-client-2.0/pods/man1/nodeadd.1.pod +++ b/xCAT-client-2.0/pods/man1/nodeadd.1.pod @@ -1,65 +1,83 @@ =head1 NAME - -B -Adds nodes to the cluster. - + +B - Adds nodes to the xCAT cluster database. + + =head1 SYNOPSIS - -I -I +B I B=I [I] [I<...>] -I +B {B<-v> | B<--version>} + +B [B<-?> | B<-h> | B<--help>] =head1 DESCRIPTION - The nodeadd command adds the node from the input node range. At least one groupname must be supplied +The nodeadd command adds the nodes specified in noderange to the xCAT database. It also stores +the any additional attributes specified for these nodes. At least one groupname must be supplied. +You should also consider specifying attributes in at least the following tables: B, B, +B. See the man page for each of these for details. Also see the B man page for an +overview of each table. - nodeadd also supports some short cut tags: - groups is equivalent to table.column = nodelist.groups - for example:nodeadd blade1-blade8 groups=all,compuTe - - mgt is equivalent to table.column = nodehm.mgt - for example:nodeadd blade7 mgt=blade - switch is equivalent to table.colum= switch.switch - for example:nodeadd blade8 switch=switch1 +The nodeadd command also supports some short cut names as aliases to common attributes. See the +B man page for details. =head1 OPTIONS +=over 10 -B<-h> Display usage message. +=item B<-v|--version> -B<-v> Command Version. +Command Version. -B<-V> Verbose output. +=item B<-?|-h|--help> + +Display usage message. + +=back =head1 RETURN VALUE -0 The command completed successfully. +=over 3 + +=item 0 + +The command completed successfully. + +=item 1 + +An error has occurred. + +=back -1 An error has occurred. =head1 EXAMPLES -1. To add nodes in noderange node1-node4 with group all: +=over 2 -I - -2. To add nodes in noderange node1-node4 to the nodetype table with os=rhel5: +=item * -I +To add nodes in noderange node1-node4 with group all: + +B I + +=item * + +To add nodes in noderange node1-node4 to the nodetype table with os=rhel5: + +B I + +=back =head1 FILES - + /opt/xcat/bin/nodeadd -=head1 NOTES +=head1 SEE ALSO -This command is part of the xCAT software product. -See nodels,nodech,noderange - - +nodels(1), nodech(1), noderange(5) \ No newline at end of file diff --git a/xCAT-client-2.0/pods/man1/nodech.1.pod b/xCAT-client-2.0/pods/man1/nodech.1.pod index c81149282..3faac00cb 100644 --- a/xCAT-client-2.0/pods/man1/nodech.1.pod +++ b/xCAT-client-2.0/pods/man1/nodech.1.pod @@ -1,54 +1,104 @@ =head1 NAME - -B -Changes node attributes in the database. - + +B - Changes nodes' attributes in the xCAT cluster database. + + =head1 SYNOPSIS - -I +B I I [I<...>] -I +B {B<-d> | B<--delete>} I I [I<...>] + +B {B<-v> | B<--version>} + +B [B<-?> | B<-h> | B<--help>] =head1 DESCRIPTION - The nodech command changes the attribute value in the input table.column for the input node range. +The nodech command changes the specified attributes for the given nodes. Normally, the given +value will completely replace the current attribute value. But if ",=" is used instead of "=", +the specified value will be added to the attribute's comma separated list, if it is not already +there. If "^=" is used, the specified value will be removed from the attribute's comma separated list, +if it is there. You can also use "^=" and ",=" in the same command to essentially replace one item +in the list with another. (See the Examples section.) + +See the B man page for an overview of each table. + +The nodech command also supports some short cut names as aliases to common attributes. See the +B man page for details. =head1 OPTIONS +=over 10 -B<-h> Display usage message. +=item B<-d|--delete> -B<-v> Command Version. +Delete the nodes' row in the specified tables. +=item B<-v|--version> + +Command Version. + +=item B<-?|-h|--help> + +Display usage message. + +=back =head1 RETURN VALUE -0 The command completed successfully. +=over 3 + +=item 0 + +The command completed successfully. + +=item 1 + +An error has occurred. + +=back -1 An error has occurred. =head1 EXAMPLES -1. To change the group name nodes in noderange node1-node4: +=over 2 -I - -2. To change nodes in noderange node1-node4 to os=rhel5 in nodetype table: +=item * -I +To add nodes in noderange node1-node4 with group all: + +B< nodech> I + +=item * + +To add nodes in noderange node1-node4 to the nodetype table with os=rhel5: + +B< nodech> I + +=item * + +To add node1-node4 to group1: + +B< nodech> I + +=item * + +To put node1-node4 in group2, instead of group1: + +B< nodech> I + +=back =head1 FILES - + /opt/xcat/bin/nodech -=head1 NOTES +=head1 SEE ALSO -This command is part of the xCAT software product. -See nodels,nodeadd,noderange - - +nodels(1), nodeadd(1), noderange(5) \ No newline at end of file diff --git a/xCAT-client-2.0/pods/man1/nodels.1.pod b/xCAT-client-2.0/pods/man1/nodels.1.pod index b01d29c7e..b0cc44a65 100644 --- a/xCAT-client-2.0/pods/man1/nodels.1.pod +++ b/xCAT-client-2.0/pods/man1/nodels.1.pod @@ -2,21 +2,22 @@ B - lists the nodes in the noderange. + =head1 SYNOPSIS -B [I] [I | I] I<...> +B [I] [I | I] [I<...>] + +B {B<-v> | B<--version>} B [B<-?> | B<-h> | B<--help>] -B [B<-v> | B<--version>] - =head1 DESCRIPTION The nodels command lists the nodes specified in the node range. If no noderange is provided, then all nodes are listed. Additional attributes of the nodes will also be displayed if the table names and attribute names -are specified after the noderange in the form: I . A few shortcut names can +are specified after the noderange in the form: I . A few shortcut names can also be used as aliases to common attributes: =over 10 @@ -44,20 +45,22 @@ for grep'ing through the tab files, like was done in xCAT 1.x. This is because any regular expression rows in the tables into their meaning for the specified node. The tab* commands will not do this, instead they will just display the single regular expression row. + =head1 OPTIONS =over 10 +=item B<-v|--version> + +Command Version. + =item B<-?|-h|--help> Display usage message. -=item B<-v> - -Command Version. - =back + =head1 RETURN VALUE =over 3 @@ -72,6 +75,7 @@ An error has occurred. =back + =head1 EXAMPLES =over 2 @@ -131,10 +135,12 @@ Output is similar to: =back + =head1 FILES /opt/xcat/bin/nodels + =head1 SEE ALSO noderange(5) diff --git a/xCAT-client-2.0/share/man/man1/xdsh.1 b/xCAT-client-2.0/share/man/man1/xdsh.1 index 3527d5907..eb564217c 100644 --- a/xCAT-client-2.0/share/man/man1/xdsh.1 +++ b/xCAT-client-2.0/share/man/man1/xdsh.1 @@ -336,7 +336,7 @@ Displays usage information. \fR .RE .RS +9 -Set up the SSH keys for the specified node list. Currently, this must be run on the management node in bypass mode (export XCATBYPASS=1). +Set up the SSH keys for the specified node list. Currently, this must be run on the management node in bypass mode. Run: XCATBYPASS=1 xdsh -K .RE .RS +3 \fB-l | --user \fIuser_ID\fR diff --git a/xCAT-server-2.0/lib/xcat/plugins/tabutils.pm b/xCAT-server-2.0/lib/xcat/plugins/tabutils.pm index ad75f7837..88fae3198 100644 --- a/xCAT-server-2.0/lib/xcat/plugins/tabutils.pm +++ b/xCAT-server-2.0/lib/xcat/plugins/tabutils.pm @@ -12,7 +12,7 @@ use Data::Dumper; use xCAT::NodeRange; use xCAT::Schema; -#use Getopt::Long qw(GetOptionsFromArray); +use Getopt::Long; 1; @@ -48,40 +48,40 @@ sub handled_commands }; } -my %usage = ( - nodech => - "Usage: nodech [table.column=value] [table.column=value] ...", - nodeadd => - "Usage: nodeadd [table.column=value] [table.column=value] ...", - noderm => "Usage: noderm ", +# Each cmd now returns its own usage inside its function +#my %usage = ( + #nodech => "Usage: nodech [table.column=value] [table.column=value] ...", + #nodeadd => "Usage: nodeadd [table.column=value] [table.column=value] ...", + #noderm => "Usage: noderm ", # the usage for tabdump is in the tabdump function #tabdump => "Usage: tabdump \n where is one of the following:\n " . join("\n ", keys %xCAT::Schema::tabspec), # the usage for tabrestore is in the tabrestore client cmd #tabrestore => "Usage: tabrestore .csv", - ); + #); ##################################################### # Process the command ##################################################### sub process_request { - use Getopt::Long; + #use Getopt::Long; Getopt::Long::Configure("bundling"); - Getopt::Long::Configure("pass_through"); + #Getopt::Long::Configure("pass_through"); + Getopt::Long::Configure("no_pass_through"); my $request = shift; my $callback = shift; my $nodes = $request->{node}; my $command = $request->{command}->[0]; my $args = $request->{arg}; - unless ($args or $nodes or $request->{data}) - { - if ($usage{$command}) - { - $callback->({data => [$usage{$command}]}); - return; - } - } + #unless ($args or $nodes or $request->{data}) + #{ + #if ($usage{$command}) + #{ + #$callback->({data => [$usage{$command}]}); + #return; + #} + #} if ($command eq "nodels") { @@ -185,38 +185,32 @@ sub noderm my $VERSION; my $HELP; - sub noderm_usage - { + sub noderm_usage { + my $exitcode = shift @_; my %rsp; - $rsp->{data}->[0] = "Usage:"; - $rsp->{data}->[1] = " noderm [noderange] "; - $cb->($rsp); + push @{$rsp{data}}, "Usage:"; + push @{$rsp{data}}, " noderm noderange"; + push @{$rsp{data}}, " noderm {-v|--version}"; + push @{$rsp{data}}, " noderm [-?|-h|--help]"; + if ($exitcode) { $rsp{errorcode} = $exitcode; } + $cb->(\%rsp); } @ARGV = @{$args}; - if ( - !GetOptions('h|?|help' => \$HELP, - 'v|version' => \$VERSION,) - ) - { - &noderm_usage; - } + if (!GetOptions('h|?|help' => \$HELP, 'v|version' => \$VERSION) ) { noderm_usage(1); return; } - # Help - if ($HELP) - { - &noderm_usage; - return; - } + if ($HELP) { noderm_usage(0); return; } - # Version - if ($VERSION) - { + if ($VERSION) { my %rsp; $rsp->{data}->[0] = "2.0"; $cb->($rsp); return; } + + if (!$nodes) { noderm_usage(1); return; } + + # Build the argument list for using the -d option of nodech to do our work for us my @tablist = ("-d"); foreach (keys %{xCAT::Schema::tabspec}) { @@ -485,55 +479,60 @@ sub nodech my $addmode = shift; my $VERSION; my $HELP; + my $deletemode; sub nodech_usage { + my $exitcode = shift @_; + my $addmode = shift @_; + my $cmdname = $addmode ? 'nodeadd' : 'nodech'; my %rsp; - $rsp->{data}->[0] = "Usage:"; - $rsp->{data}->[1] = " nodech [table.column=value] [table.column=value] ...\n "; - $callback->($rsp); + if ($addmode) { + push @{$rsp{data}}, "Usage: $cmdname groups= [table.column=value] [...]"; + } else { + push @{$rsp{data}}, "Usage: $cmdname table.column=value [...]"; + push @{$rsp{data}}, " $cmdname {-d | --delete}
[...]"; + } + push @{$rsp{data}}, " $cmdname {-v | --version}"; + push @{$rsp{data}}, " $cmdname [-? | -h | --help]"; + if ($exitcode) { $rsp{errorcode} = $exitcode; } + $callback->(\%rsp); } @ARGV = @{$args}; - if ( - !GetOptions('h|?|help' => \$HELP, - 'v|version' => \$VERSION,) - ) - { - &nodech_usage; + my %options = ('h|?|help' => \$HELP, 'v|version' => \$VERSION); + if (!$addmode) { $options{'d|delete'} = \$deletemode; } + if (!GetOptions(%options)) { + nodech_usage(1, $addmode); + return; } # Help - if ($HELP) - { - &nodech_usage; + if ($HELP) { + nodech_usage(0, $addmode); return; } # Version - if ($VERSION) - { + if ($VERSION) { my %rsp; $rsp->{data}->[0] = "2.0"; $callback->($rsp); return; } + + # Note: the noderange comes through in $arg (and therefore @ARGV) for nodeadd, + # because it is linked to xcatclientnnr, since the nodes specified in the noderange + # do not exist yet. The nodech cmd is linked to xcatclient, so its noderange is + # put in $nodes instead of $args. + if (scalar(@ARGV) < (1+$addmode)) { nodech_usage(1, $addmode); return; } + if ($addmode) { - my $idx = 0; - foreach my $arg (@$args) - { - unless ($arg =~ /^-/) - { - $nodes = [noderange($arg, 0)]; - splice(@$args, $idx, 1); - last; - } - $idx++; - } - unless ($nodes) - { - $callback->({error => "No range to add detected\n"}); + my $nr = shift @ARGV; + $nodes = [noderange($nr, 0)]; + unless ($nodes) { + $callback->({error => "No noderange to add.\n",errorcode=>1}); return; } } @@ -542,51 +541,15 @@ sub nodech my $temp; my %tables; my $tab; - my $deletemode; - #No GetOptionsFromArray... - #GetOptionsFromArray($args,"d|delete" => \$deletemode); #print Dumper($deletemode); - foreach (@$args) + foreach (@ARGV) { - if (m/^-/) - { #A quick and dirty option parser in lieu of lacking Getoptinos - if (m/^--/) - { - if (m/--delete/) - { - $deletemode = 1; - next; - } - else - { - $callback->( - {data => ["ERROR: Malformed argument $_ ignored"]}); - next; - } - } - else - { - if (m/^-d$/) - { - $deletemode = 1; - next; - } - else - { - $callback->( - {data => ["ERROR: Malformed argument $_ ignored"]}); - next; - } - } - } - if ($deletemode) { - if (m/[=\.]/) + if (m/[=\.]/) # in delete mode they can only specify tables names { - $callback->( - {data => ["ERROR: . and = not valid in delete mode"]}); + $callback->({error => [". and = not valid in delete mode."],errorcode=>1}); next; } $tables{$_} = 1; @@ -594,7 +557,7 @@ sub nodech } unless (m/=/) { - $callback->({data => ["ERROR: Malformed argument $_ ignored"]}); + $callback->({error => ["Malformed argument $_ ignored."],errorcode=>1}); next; } ($temp, $value) = split('=', $_, 2); @@ -622,7 +585,10 @@ sub nodech $callback->({error=>"$table.$column not a valid table.column description",errorcode=>[1]}); return; } - $tables{$table}->{$column} = [$value, $op]; + + # Keep a list of the value/op pairs, in case there is more than 1 per table.column + #$tables{$table}->{$column} = [$value, $op]; + push @{$tables{$table}->{$column}}, ($value, $op); } foreach $tab (keys %tables) { @@ -641,60 +607,60 @@ sub nodech #$tabhdl->setNodeAttribs($_,$tables{$tab}); my %uhsh; my $node = $_; - foreach (keys %{$tables{$tab}}) + foreach (keys %{$tables{$tab}}) # for each column specified for this table { - my $op = $tables{$tab}->{$_}->[1]; - my $val = $tables{$tab}->{$_}->[0]; - my $key = $_; - if ($op eq '=') - { - $uhsh{$key} = $val; - } - elsif ($op eq ',=') - { #splice assignment - my $cent = $tabhdl->getNodeAttribs($node, [$key]); - my $curval; - if ($cent) { $curval = $cent->{$key}; } - if ($curval) - { - my @vals = split(/,/, $curval); - unless (grep /^$val$/, @vals) - { - @vals = (@vals, $val); - my $newval = join(',', @vals); - $uhsh{$key} = $newval; - } - } - else - { - $uhsh{$key} = $val; - } - } - elsif ($op eq '^=') - { - my $cent = $tabhdl->getNodeAttribs($node, [$key]); - my $curval; - if ($cent) { $curval = $cent->{$key}; } - if ($curval) - { - my @vals = split(/,/, $curval); - if (grep /^$val$/, @vals) - { #only bother if there - @vals = grep(!/^$val$/, @vals); - my $newval = join(',', @vals); - $uhsh{$key} = $newval; - } - } #else, what they asked for is the case alredy + #my $op = $tables{$tab}->{$_}->[1]; + #my $val = $tables{$tab}->{$_}->[0]; + my $valoppairs = $tables{$tab}->{$_}; + while (scalar(@$valoppairs)) { # alternating list of value and op for this table.column + my $val = shift @$valoppairs; + my $op = shift @$valoppairs; + my $key = $_; + if ($op eq '=') { + $uhsh{$key} = $val; + } + elsif ($op eq ',=') { #splice assignment + my $curval = $uhsh{$key}; # in case it was already set + if (!defined($curval)) { + my $cent = $tabhdl->getNodeAttribs($node, [$key]); + if ($cent) { $curval = $cent->{$key}; } + } + if ($curval) { + my @vals = split(/,/, $curval); + unless (grep /^$val$/, @vals) { + @vals = (@vals, $val); + my $newval = join(',', @vals); + $uhsh{$key} = $newval; + } + } else { + $uhsh{$key} = $val; + } + } + elsif ($op eq '^=') { + my $curval = $uhsh{$key}; # in case it was already set + if (!defined($curval)) { + my $cent = $tabhdl->getNodeAttribs($node, [$key]); + if ($cent) { $curval = $cent->{$key}; } + } + if ($curval) { + my @vals = split(/,/, $curval); + if (grep /^$val$/, @vals) { #only bother if there + @vals = grep(!/^$val$/, @vals); + my $newval = join(',', @vals); + $uhsh{$key} = $newval; + } + } #else, what they asked for is the case alredy + } + } # end of while $valoppairs + } # end of foreach column specified for this table - } - } if (keys %uhsh) { my @rc = $tabhdl->setNodeAttribs($node, \%uhsh); if (not defined($rc[0])) { - $callback->({error => "DB error " . $rc[1]}); + $callback->({error => "DB error " . $rc[1],errorcode=>1}); } } } @@ -704,7 +670,7 @@ sub nodech else { $callback->( - {data => ["ERROR: Unable to open table $tab in configuration"]} + {error => ["ERROR: Unable to open table $tab in configuration"],errorcode=>1} ); } } @@ -751,11 +717,12 @@ sub nodels sub nodels_usage { + my $exitcode = shift @_; my %rsp; - $rsp->{data}->[0] = "Usage:"; - $rsp->{data}->[1] = " nodels [-?|-h|--help] "; - $rsp->{data}->[2] = " nodels [-v|--version] "; - $rsp->{data}->[3] = " nodels [noderange] [table.attribute | shortname] ..."; + push @{$rsp{data}}, "Usage:"; + push @{$rsp{data}}, " nodels [noderange] [table.attribute | shortname] [...]"; + push @{$rsp{data}}, " nodels {-v|--version}"; + push @{$rsp{data}}, " nodels [-?|-h|--help]"; ##### xcat 1.2 nodels usage: # $rsp->{data}->[1]= " nodels [noderange] [group|pos|type|rg|install|hm|all]"; # $rsp->{data}->[2]= " "; @@ -767,24 +734,15 @@ sub nodels # $rsp->{data}->[8]= " nodels [noderange] rg.{tftp|nfs_install|install_dir|serial}"; # $rsp->{data}->[9]= " rg.{usenis|install_roll|acct|gm|pbs}"; # $rsp->{data}->[10]=" rg.{access|gpfs|netdevice|prinic|all}"; - $callback->($rsp); + if ($exitcode) { $rsp{errorcode} = $exitcode; } + $callback->(\%rsp); } @ARGV = @{$args}; - if ( - !GetOptions('h|?|help' => \$HELP, - 'v|version' => \$VERSION,) - ) - { - &nodels_usage; - } + if (!GetOptions('h|?|help' => \$HELP, 'v|version' => \$VERSION,) ) { nodels_usage(1); return; } # Help - if ($HELP) - { - &nodels_usage; - return; - } + if ($HELP) { nodels_usage(0); return; } # Version if ($VERSION)