remove -s flag and add processing to update the compute node without having to update the servicenode in a separate command

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@3641 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2009-06-25 18:17:19 +00:00
parent b074727be4
commit a6936bbe72

View File

@ -658,145 +658,6 @@ sub _execute_dsh
#----------------------------------------------------------------------------
=head3
execute_dshservice
This is the main driver routine for an instance of the dshservice command.
Given the options configured in the $options hash table, the routine
executes the actions specified by the routine
Arguments:
$options - options hash table describing dshservice configuration options
Returns:
None
Globals:
None
Error:
None
Example:
Comments:
=cut
sub execute_dshservice
{
my ($class, $options) = @_;
if ($$options{'all-valid-contexts'})
{
scalar(@dsh_valid_contexts) || xCAT::DSHCLI->get_valid_contexts;
foreach my $context (sort(@dsh_valid_contexts))
{
print STDOUT "$context\n";
}
}
my $rsp = {};
my $result;
if ($$options{'query'})
{
xCAT::DSHCLI->config_default_context($options);
if (!(-e "$::CONTEXT_DIR$$options{'context'}.pm"))
{
$rsp->{data}->[0] = " Context: $$options{'context'} not valid.";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return ++$result;
}
if ($$options{'nodes'})
{
my %resolved_targets = ();
my %unresolved_targets = ();
my %context_targets = ();
my @nodenames;
xCAT::DSHCLI->resolve_targets($options, \%resolved_targets,
\%unresolved_targets, \%context_targets);
foreach my $user_node (sort keys(%resolved_targets))
{
my $properties = $resolved_targets{$user_node};
my $context = $$properties{context};
my $node = $$properties{hostname};
$context->query_node($node);
}
foreach my $user_node (sort keys(%unresolved_targets))
{
my $properties = $unresolved_targets{$user_node};
my $context = $$properties{context};
my $node = $$properties{hostname};
$context->query_node($node);
}
}
if ($$options{'defaults'})
{
scalar(@dsh_valid_contexts) || xCAT::DSHCLI->get_valid_contexts;
print STDOUT "DefaultContext=$$options{'context'}\n";
my $dsh_defaults = xCAT::DSHCLI->get_dsh_defaults;
foreach my $context (sort keys(%$dsh_defaults))
{
my $context_defaults = $$dsh_defaults{$context};
foreach my $key (sort keys(%$context_defaults))
{
my $key_label = $key;
($key eq 'RemoteShell')
&& ($key_label = 'NodeRemoteShell');
print STDOUT
"$context:$key_label=$$context_defaults{$key}\n";
}
}
}
}
if ($$options{'resolve'})
{
my %resolved_targets = ();
my %unresolved_targets = ();
my %context_targets = ();
xCAT::DSHCLI->config_default_context($options);
if (!(-e "$::CONTEXT_DIR$$options{'context'}.pm"))
{
$rsp->{data}->[0] = " Context: $$options{'context'} not valid.";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK);
return ++$result;
}
xCAT::DSHCLI->resolve_targets($options, \%resolved_targets,
\%unresolved_targets, \%context_targets);
my @targets = (sort keys(%resolved_targets));
push @targets, (sort keys(%unresolved_targets));
foreach my $target (@targets)
{
print STDOUT "$target\n";
}
}
if ($$options{'show-config'})
{
xCAT::DSHCLI->show_dsh_config($options);
}
}
#----------------------------------------------------------------------------
=head3
fork_fanout_dcp
@ -4179,20 +4040,44 @@ sub parse_and_run_dcp
return;
}
if ($options{'rsyncSN'})
{
$syncSN = 1;
}
# if rsyncing the nodes
# if rsyncing the nodes or service nodes
if ($options{'File'})
{
my $rc =
&parse_rsync_input_file(\@nodelist, \%options,
$options{'File'}, $syncSN);
# if syncing a service node
if ($options{'rsyncSN'})
{
$syncSN = 1;
}
# set default sync dir on service node
my $synfiledir = "/var/xcat/syncfiles";
# get the directory on the servicenode to put the rsync files in
my @syndir = xCAT::Utils->get_site_attribute("SNsyncfiledir");
if ($syndir[0])
{
$synfiledir = $syndir[0];
}
my $rc;
my $syncfile = $options{'File'};
if (xCAT::Utils->isServiceNode())
{ # running on service node
$rc =
&parse_rsync_input_file_on_SN(\@nodelist, \%options, $syncfile,
$synfiledir);
}
else
{ # running on MN
$rc =
&parse_rsync_input_file_on_MN(\@nodelist, \%options, $syncfile,
$syncSN, $synfiledir);
}
if ($rc == 1)
{
$rsp->{data}->[0] = "Error parsing the rsync file";
$rsp->{data}->[0] = "Error parsing the rsync file:$syncfile.";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1);
return;
}
@ -4377,9 +4262,10 @@ sub rsync_to_image
#-------------------------------------------------------------------------------
=head3
parse_rsync_input_file
parse_rsync_input_file_on_MN
This parses the -F rsync input file.
This parses the -F rsync input file on the Management node.
File format:
/.../file1 -> /.../dir1/filex
@ -4387,7 +4273,11 @@ sub rsync_to_image
/.../file1 /..../filex -> /...../dir1
Arguments:
Input nodelist,options, pointer to the sync file
Input nodelist,options, pointer to the sync file,flag is
syncing the service node and
the directory to syn the files to on the service node
based on defaults or the site.SNsyncfiledir attribute,
if syncing a service node for hierarchical support.
Returns:
Errors if invalid options or the executed dcp command
@ -4406,10 +4296,10 @@ sub rsync_to_image
#-------------------------------------------------------------------------------
sub parse_rsync_input_file
sub parse_rsync_input_file_on_MN
{
use File::Basename;
my ($nodes, $options, $input_file, $rsyncSN) = @_;
my ($nodes, $options, $input_file, $rsyncSN, $syncdir) = @_;
my @dest_host = @$nodes;
my $process_line = 0;
open(INPUTFILE, "< $input_file") || die "File $input_file does not exist\n";
@ -4444,10 +4334,12 @@ sub parse_rsync_input_file
{
# if syncing the Service Node, file goes to the same place
# from which it came
# where it was on the MN but in the syncdir on the service
# node
if ($rsyncSN == 1)
{ # syncing the SN
$dest_dir = dirname($srcfile);
$dest_dir = $syncdir; # the SN sync dir
$dest_dir .= dirname($srcfile);
$dest_dir =~ s/\s*//g; #remove blanks
}
$$options{'destDir_srcFile'}{$target_node}{$dest_dir} ||=
@ -4510,6 +4402,133 @@ sub parse_rsync_input_file
#-------------------------------------------------------------------------------
=head3
parse_rsync_input_file_on_SN
This parses the -F rsync input file on the Service node.
File format:
/.../file1 -> /.../dir1/filex
/.../file1 -> /.../dir1
/.../file1 /..../filex -> /...../dir1
Arguments:
Input nodelist,options, pointer to the sync file and
the directory to syn the files from
based on defaults or the site.SNsyncfiledir attribute,
Returns:
Errors if invalid options or the executed dcp command
Globals:
Error:
None
Example:
Comments:
=cut
#-------------------------------------------------------------------------------
sub parse_rsync_input_file_on_SN
{
use File::Basename;
my ($nodes, $options, $input_file, $syncdir) = @_;
my @dest_host = @$nodes;
my $process_line = 0;
open(INPUTFILE, "< $input_file") || die "File $input_file does not exist\n";
while (my $line = <INPUTFILE>)
{
chomp $line;
if ($line =~ /(.+) -> (.+)/)
{
$process_line = 1;
my $src_file = $1;
my $dest_file = $2;
$dest_file =~ s/[\s;]//g;
my $dest_dir;
if (-d $dest_file)
{ # if a directory , just use
$dest_dir = $dest_file;
}
else
{ # strip off the file
$dest_dir = dirname($dest_file);
}
$dest_dir =~ s/\s*//g; #remove blanks
my @srcfiles = (split ' ', $src_file);
foreach my $target_node (@dest_host)
{
$$options{'destDir_srcFile'}{$target_node} ||= {};
# for each file on the line
foreach my $srcfile (@srcfiles)
{
my $tmpsrcfile = $syncdir; # add syndir on front
$tmpsrcfile .= $srcfile;
$srcfile = $tmpsrcfile;
$$options{'destDir_srcFile'}{$target_node}{$dest_dir} ||=
{};
# can be full file name for destination or just the
# directory name. For source must be full path
my $src_basename = basename($srcfile); # get file name
my $dest_basename; # destination file name
if (-d $dest_file)
{ # if a directory, get filename from src
$dest_basename = $src_basename;
}
else
{ # get the file name from the destination
$dest_basename = basename($dest_file);
}
$$options{'destDir_srcFile'}{$target_node}{$dest_dir} ||=
$dest_basename =~ s/[\s;]//g;
# if the filename will be the same at the destination
if ($src_basename eq $dest_basename)
{
$$options{'destDir_srcFile'}{$target_node}{$dest_dir}
{'same_dest_name'} ||= [];
push @{$$options{'destDir_srcFile'}{$target_node}
{$dest_dir}{'same_dest_name'}}, $srcfile;
}
else # changing file names
{
$$options{'destDir_srcFile'}{$target_node}{$dest_dir}
{'diff_dest_name'} ||= {};
$$options{'destDir_srcFile'}{$target_node}{$dest_dir}
{'diff_dest_name'}{$srcfile} = $dest_basename;
}
}
}
}
}
close INPUTFILE;
if ($process_line == 0)
{ # no valid lines in the file
my $rsp = {};
$rsp->{data}->[0] = "Found no lines to process in $input_file.";
xCAT::MsgUtils->message("E", $rsp, $::CALLBACK, 1);
return 1;
}
else
{
$$options{'nodes'} = join ',', keys %{$$options{'destDir_srcFile'}};
}
return 0;
}
#-------------------------------------------------------------------------------
=head3
runlocal_on_rootimg
@ -4837,7 +4856,8 @@ sub show_dsh_config
#-------------------------------------------------------------------------------
=head3 get_config
=head3
get_config
Substitute specific keywords in hash
e.g. config file: