2007-10-26 22:44:33 +00:00
|
|
|
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
|
|
|
package xCAT_plugin::copycds;
|
2008-07-18 22:39:01 +00:00
|
|
|
use strict;
|
|
|
|
use warnings;
|
2007-10-26 22:44:33 +00:00
|
|
|
use Storable qw(dclone);
|
|
|
|
use xCAT::Table;
|
2008-07-28 18:32:22 +00:00
|
|
|
use Thread qw(yield);
|
2007-10-26 22:44:33 +00:00
|
|
|
use Data::Dumper;
|
|
|
|
use Getopt::Long;
|
2008-06-03 15:49:45 +00:00
|
|
|
use File::Basename;
|
2008-07-11 20:19:20 +00:00
|
|
|
use Cwd;
|
2007-10-26 22:44:33 +00:00
|
|
|
Getopt::Long::Configure("bundling");
|
|
|
|
Getopt::Long::Configure("pass_through");
|
|
|
|
|
|
|
|
my $processed = 0;
|
|
|
|
my $callback;
|
|
|
|
|
|
|
|
sub handled_commands {
|
|
|
|
return {
|
|
|
|
copycds => "copycds",
|
|
|
|
}
|
|
|
|
}
|
2008-04-29 17:39:28 +00:00
|
|
|
|
|
|
|
my $identified;
|
2007-10-26 22:44:33 +00:00
|
|
|
|
|
|
|
sub take_answer {
|
|
|
|
#TODO: Intelligently filter and decide things
|
|
|
|
my $resp = shift;
|
|
|
|
$callback->($resp);
|
2008-04-29 17:39:28 +00:00
|
|
|
$identified=1;
|
2007-10-26 22:44:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub process_request {
|
|
|
|
my $request = shift;
|
|
|
|
$callback = shift;
|
|
|
|
my $doreq = shift;
|
|
|
|
my $distname = undef;
|
|
|
|
my $arch = undef;
|
2008-11-04 19:24:38 +00:00
|
|
|
my $help = undef;
|
2008-04-29 17:39:28 +00:00
|
|
|
$identified=0;
|
2008-05-15 15:48:34 +00:00
|
|
|
$::CDMOUNTPATH="/mnt/xcat";
|
2008-07-11 20:19:20 +00:00
|
|
|
my $existdir = getcwd;
|
2007-10-26 22:44:33 +00:00
|
|
|
|
2008-07-31 21:07:18 +00:00
|
|
|
if ($request->{arg}) {
|
|
|
|
@ARGV = @{$request->{arg}};
|
|
|
|
}
|
2007-10-26 22:44:33 +00:00
|
|
|
GetOptions(
|
|
|
|
'n|name|osver=s' => \$distname,
|
2008-11-04 19:24:38 +00:00
|
|
|
'a|arch=s' => \$arch,
|
|
|
|
'h|help' => \$help
|
2007-10-26 22:44:33 +00:00
|
|
|
);
|
2008-11-04 19:24:38 +00:00
|
|
|
if ($help) {
|
|
|
|
$callback->({info=>"copycds [{-n|--name|--osver}=distroname] [{-a|--arch}=architecture] 1st.iso [2nd.iso ...]."});
|
|
|
|
return;
|
|
|
|
}
|
2007-10-26 22:44:33 +00:00
|
|
|
if ($arch and $arch =~ /i.86/) {
|
2008-07-18 22:39:01 +00:00
|
|
|
$arch = 'x86';
|
2007-10-26 22:44:33 +00:00
|
|
|
}
|
|
|
|
my @args = @ARGV; #copy ARGV
|
|
|
|
unless ($#args >= 0) {
|
|
|
|
$callback->({error=>"copycds needs at least one full path to ISO currently."});
|
|
|
|
return;
|
|
|
|
}
|
2008-07-18 22:39:01 +00:00
|
|
|
my $file;
|
2007-10-26 22:44:33 +00:00
|
|
|
foreach (@args) {
|
2008-01-10 13:41:31 +00:00
|
|
|
unless (/^\//) { #If not an absolute path, concatenate with client specified cwd
|
2008-06-03 15:49:45 +00:00
|
|
|
s/^/$request->{cwd}->[0]\//;
|
2008-01-10 13:41:31 +00:00
|
|
|
}
|
2008-06-03 15:49:45 +00:00
|
|
|
|
2008-06-27 15:25:42 +00:00
|
|
|
# /dev/cdrom is a symlink on some systems. We need to be able to determine
|
|
|
|
# if the arg points to a block device.
|
2008-06-03 15:49:45 +00:00
|
|
|
if (-l $_) {
|
|
|
|
my $link = readlink($_);
|
2008-06-27 15:25:42 +00:00
|
|
|
|
|
|
|
# Symlinks can be relative, i.e., "../../foo"
|
2008-06-03 15:49:45 +00:00
|
|
|
if ($link =~ m{^/})
|
|
|
|
{ $file = $link; }
|
|
|
|
else
|
2008-06-27 15:25:42 +00:00
|
|
|
{ $file = dirname($_) . "/" . $link; } # Unix can handle "/foo/../bar"
|
2008-06-03 15:49:45 +00:00
|
|
|
}
|
|
|
|
else { $file = $_; }
|
|
|
|
|
2008-09-07 03:27:58 +00:00
|
|
|
my $mntopts = "-t udf,iso9660"; #Prefer udf formate to iso when media supports both, like MS media
|
2008-06-03 15:49:45 +00:00
|
|
|
if (-r $file and -b $file) # Block device?
|
2008-09-07 03:27:58 +00:00
|
|
|
{ $mntopts .= " -o ro"; }
|
2008-06-27 15:25:42 +00:00
|
|
|
elsif (-r $file and -f $file) # Assume ISO file
|
2008-09-07 03:27:58 +00:00
|
|
|
{ $mntopts .= " -o ro,loop"; }
|
2008-06-03 15:49:45 +00:00
|
|
|
else {
|
|
|
|
$callback->({error=>"The management server was unable to find/read $file. Ensure that file exists on the server at the specified location."});
|
2007-10-26 22:44:33 +00:00
|
|
|
return;
|
|
|
|
}
|
2008-06-03 15:49:45 +00:00
|
|
|
|
2007-10-26 22:44:33 +00:00
|
|
|
mkdir "/mnt/xcat";
|
2008-06-03 15:49:45 +00:00
|
|
|
|
|
|
|
if (system("mount $mntopts $file /mnt/xcat")) {
|
|
|
|
$callback->({error=>"copycds was unable to mount $file to /mnt/xcat."});
|
2007-10-26 22:44:33 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
my $newreq = dclone($request);
|
|
|
|
$newreq->{command}= [ 'copycd' ]; #Note the singular, it's different
|
|
|
|
$newreq->{arg} = ["-p","/mnt/xcat"];
|
|
|
|
if ($distname) {
|
|
|
|
push @{$newreq->{arg}},("-n",$distname);
|
|
|
|
}
|
|
|
|
if ($arch) {
|
|
|
|
push @{$newreq->{arg}},("-a",$arch);
|
|
|
|
}
|
2012-08-31 08:22:16 +00:00
|
|
|
if (! -l $file) {
|
|
|
|
push @{$newreq->{arg}},("-f",$file);
|
|
|
|
}
|
|
|
|
|
2007-10-26 22:44:33 +00:00
|
|
|
$doreq->($newreq,\&take_answer);
|
2008-05-15 15:48:34 +00:00
|
|
|
$::CDMOUNTPATH="";
|
2007-10-26 22:44:33 +00:00
|
|
|
|
2008-07-11 20:19:20 +00:00
|
|
|
chdir($existdir);
|
2008-07-18 22:39:01 +00:00
|
|
|
while (wait() > 0) { yield(); } #Make sure all children exit before trying umount
|
2007-10-26 22:44:33 +00:00
|
|
|
system("umount /mnt/xcat");
|
2008-04-29 17:39:28 +00:00
|
|
|
unless ($identified) {
|
|
|
|
$callback->({error=>["copycds could not identify the ISO supplied, you may wish to try -n <osver>"],errorcode=>[1]});
|
|
|
|
}
|
2007-10-26 22:44:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
1;
|
2008-06-03 15:49:45 +00:00
|
|
|
|
|
|
|
# vim: set ts=2 sts=2 sw=2 et ai:
|