From 0cc7ee9f5fe729c30a29938f3702d77f044ff474 Mon Sep 17 00:00:00 2001 From: linggao Date: Thu, 24 Sep 2009 18:51:53 +0000 Subject: [PATCH] osimage phase2: genimage and packimage honor osimage table settings git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@4217 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/perl/xCAT/SvrUtils.pm | 6 +- xCAT-server/lib/xcat/plugins/packimage.pm | 174 ++++++++--- xCAT-server/lib/xcat/plugins/sles.pm | 2 +- xCAT-server/share/xcat/netboot/rh/genimage | 245 ++++++++++----- xCAT-server/share/xcat/netboot/sles/genimage | 296 +++++++++++++------ 5 files changed, 509 insertions(+), 214 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/SvrUtils.pm b/xCAT-server/lib/perl/xCAT/SvrUtils.pm index dbd2c2f1c..108c102c9 100644 --- a/xCAT-server/lib/perl/xCAT/SvrUtils.pm +++ b/xCAT-server/lib/perl/xCAT/SvrUtils.pm @@ -560,7 +560,7 @@ sub update_tables_with_templates my $tmp1=$osimagetab->getAllEntries(); if (defined($tmp1) && (@$tmp1 > 0)) { foreach my $rowdata(@$tmp1) { - if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{imagetype} eq "install") && ($profile eq $rowdata->{profile})){ + if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{provmethod} eq "install") && ($profile eq $rowdata->{profile})){ $found=1; last; } @@ -700,13 +700,13 @@ sub update_tables_with_diskless_image my $tmp1=$osimagetab->getAllEntries(); if (defined($tmp1) && (@$tmp1 > 0)) { foreach my $rowdata(@$tmp1) { - if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{imagetype} eq "netboot") && ($profile eq $rowdata->{profile})){ + if (($osver eq $rowdata->{osvers}) && ($arch eq $rowdata->{osarch}) && ($rowdata->{provmethod} eq "netboot") && ($profile eq $rowdata->{profile})){ $found=1; last; } } } - if ($found) { print "$profile already in\n"; return (0, ""); } + if ($found) { print "The image is already in the db.\n"; return (0, ""); } my $imagename=$osver . "-" . $arch . "-netboot-" . $profile; #TODO: check if there happen to be a row that has the same imagename but with different contents diff --git a/xCAT-server/lib/xcat/plugins/packimage.pm b/xCAT-server/lib/xcat/plugins/packimage.pm index d7192d090..ef4aa4323 100644 --- a/xCAT-server/lib/xcat/plugins/packimage.pm +++ b/xCAT-server/lib/xcat/plugins/packimage.pm @@ -1,4 +1,9 @@ package xCAT_plugin::packimage; +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; use xCAT::Table; use Getopt::Long; use File::Path; @@ -33,10 +38,16 @@ sub process_request { $callback->({info=>["packimage -h \npackimage -v \npackimage [-p profile] [-a architecture] [-o OS] [-m method]\n"]}); return; } - my $osver; - my $arch; - my $profile; - my $method='cpio'; + my $osver; + my $arch; + my $profile; + my $method='cpio'; + my $exlistloc; + my $syncfile; + my $rootimg_dir; + my $destdir; + my $imagename; + GetOptions( "profile|p=s" => \$profile, "arch|a=s" => \$arch, @@ -54,6 +65,68 @@ sub process_request { $callback->({info=>["packimage -h \npackimage -v \npackimage [-p profile] [-a architecture] [-o OS] [-m method]\n"]}); return; } + + if (@ARGV > 0) { + $imagename=$ARGV[0]; + if ($arch or $osver or $profile) { + $callback->({error=>["-o, -p and -a options are not allowed when a image name is specified."],errorcode=>[1]}); + return; + } + #load the module in memory + eval {require("$::XCATROOT/lib/perl/xCAT/Table.pm")}; + if ($@) { + $callback->({error=>[$@],errorcode=>[1]}); + return; + } + + #get the info from the osimage and linux + my $osimagetab=xCAT::Table->new('osimage', -create=>1); + if (!$osimagetab) { + $callback->({error=>["The osimage table cannot be opened."],errorcode=>[1]}); + return; + } + my $linuximagetab=xCAT::Table->new('linuximage', -create=>1); + if (!$linuximagetab) { + $callback->({error=>["The linuximage table cannot be opened."],errorcode=>[1]}); + return; + } + (my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod', 'synclists'); + if (!$ref) { + $callback->({error=>["Cannot find image \'$imagename\' from the osimage table."],errorcode=>[1]}); + return; + } + (my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'exlist', 'rootimgdir'); + if (!$ref1) { + $callback->({error=>["Cannot find $imagename from the linuximage table."],errorcode=>[1]}); + return; + } + + $osver=$ref->{'osvers'}; + $arch=$ref->{'osarch'}; + $profile=$ref->{'profile'}; + $syncfile=$ref->{'synclists'}; + my $provmethod=$ref->{'provmethod'}; + + unless ($osver and $arch and $profile and $provmethod) { + $callback->({error=>["osimage.osvers, osimage.osarch, osimage.profile and osimage.provmethod must be specified for the image $imagename in the database."],errorcode=>[1]}); + return; + } + + if ($provmethod ne 'netboot') { + $callback->({error=>["\'$imagename\' cannot be used to build diskless image. Make sure osimage.provmethod is 'netboot'."],errorcode=>[1]}); + return; + } + + $exlistloc =$ref1->{'exlist'}; + $destdir=$ref1->{'rootimgdir'}; + } + + if (!$destdir) + { + $destdir="$installroot/netboot/$osver/$arch/$profile"; + } + $rootimg_dir="$destdir/rootimg"; + my $distname = $osver; until (-r "$::XCATROOT/share/xcat/netboot/$distname/" or not $distname) { chop($distname); @@ -67,13 +140,15 @@ sub process_request { return; } my $oldpath=cwd(); - my $exlistloc=xCAT::SvrUtils->get_exlist_file_name("$installroot/custom/netboot/$distname", $profile, $osver, $arch); - if (!$exlistloc) { $exlistloc=xCAT::SvrUtils->get_exlist_file_name("$::XCATROOT/share/xcat/netboot/$distname", $profile, $osver, $arch); } + if (!$imagename) { + $exlistloc=xCAT::SvrUtils->get_exlist_file_name("$installroot/custom/netboot/$distname", $profile, $osver, $arch); + if (!$exlistloc) { $exlistloc=xCAT::SvrUtils->get_exlist_file_name("$::XCATROOT/share/xcat/netboot/$distname", $profile, $osver, $arch); } + } - if (!$exlistloc) - { - $callback->({data=>["WARNING: Unable to find file exclusion list under $installroot/custom/netboot/$distname or $::XCATROOT/share/xcat/netboot/$distname/ for $profile/$arch/$osver\n"]}); - } + #if (!$exlistloc) + #{ + # $callback->({data=>["WARNING: Unable to find file exclusion list under $installroot/custom/netboot/$distname or $::XCATROOT/share/xcat/netboot/$distname/ for $profile/$arch/$osver\n"]}); + #} my $excludestr = "find . "; my $includestr; @@ -103,25 +178,25 @@ sub process_request { print "\nexcludestr=$excludestr\n\n includestr=$includestr\n\n"; # add the xCAT post scripts to the image - if (! -d "$installroot/netboot/$osver/$arch/$profile/rootimg") { - $callback->({error=>["$installroot/netboot/$osver/$arch/$profile/rootimg does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]}); + if (! -d "$rootimg_dir") { + $callback->({error=>["$rootimg_dir does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]}); return; } #some rpms like atftp mount the rootimg/proc to /proc, we need to make sure rootimg/proc is free of junk #before packaging the image - `umount $installroot/netboot/$osver/$arch/$profile/rootimg/proc`; - copybootscript($installroot, $osver, $arch, $profile, $callback); + `umount $rootimg_dir/proc`; + copybootscript($installroot, $rootimg_dir, $osver, $arch, $profile, $callback); my $passtab = xCAT::Table->new('passwd'); if ($passtab) { (my $pent) = $passtab->getAttribs({key=>'system',username=>'root'},'password'); if ($pent and defined ($pent->{password})) { my $pass = $pent->{password}; my $shadow; - open($shadow,"<","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/shadow"); + open($shadow,"<","$rootimg_dir/etc/shadow"); my @shadents = <$shadow>; close($shadow); - open($shadow,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/shadow"); + open($shadow,">","$rootimg_dir/etc/shadow"); unless ($pass =~ /^\$1\$/) { $pass = crypt($pass,'$1$'.genpassword(8)); } @@ -136,35 +211,37 @@ sub process_request { } # sync fils configured in the synclist to the rootimage - my $syncfile = xCAT::SvrUtils->getsynclistfile(undef, $osver, $arch, $profile, "netboot"); - if (defined ($syncfile) && -f $syncfile - && -d "$installroot/netboot/$osver/$arch/$profile/rootimg") { - print "sync files from $syncfile to the $installroot/netboot/$osver/$arch/$profile/rootimg\n"; - `$::XCATROOT/bin/xdcp -i "$installroot/netboot/$osver/$arch/$profile/rootimg" -F $syncfile`; - } + if (!$imagename) { + $syncfile = xCAT::SvrUtils->getsynclistfile(undef, $osver, $arch, $profile, "netboot"); + if (defined ($syncfile) && -f $syncfile + && -d $rootimg_dir) { + print "sync files from $syncfile to the $rootimg_dir\n"; + `$::XCATROOT/bin/xdcp -i $rootimg_dir -F $syncfile`; + } + } my $verb = "Packing"; if ($method =~ /nfs/) { $verb = "Prepping"; } if ($method =~ /nfs/) { - $callback->({data=>["\nNOTE: Contents of $installroot/netboot/$osver/$arch/$profile/rootimg\nMUST be available on all service and management nodes and NFS exported."]}); + $callback->({data=>["\nNOTE: Contents of $rootimg_dir\nMUST be available on all service and management nodes and NFS exported."]}); } my $temppath; my $oldumask; - if (! -d "$installroot/netboot/$osver/$arch/$profile/rootimg") { - $callback->({error=>["$installroot/netboot/$osver/$arch/$profile/rootimg does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]}); + if (! -d $rootimg_dir) { + $callback->({error=>["$rootimg_dir does not exist, run genimage -o $osver -p $profile on a server with matching architecture"]}); return; } - $callback->({data=>["$verb contents of $installroot/netboot/$osver/$arch/$profile/rootimg"]}); - unlink("$installroot/netboot/$osver/$arch/$profile/rootimg.gz"); - unlink("$installroot/netboot/$osver/$arch/$profile/rootimg.sfs"); - unlink("$installroot/netboot/$osver/$arch/$profile/rootimg.nfs"); + $callback->({data=>["$verb contents of $rootimg_dir"]}); + unlink("$destdir/rootimg.gz"); + unlink("$destdir/rootimg.sfs"); + unlink("$destdir/rootimg.nfs"); if ($method =~ /cpio/) { if (!$exlistloc) { $excludestr = "find . |cpio -H newc -o | gzip -c - > ../rootimg.gz"; }else { - chdir("$installroot/netboot/$osver/$arch/$profile/rootimg"); + chdir("$rootimg_dir"); system("$excludestr >> /tmp/xcat_packimg.txt"); if ($includestr) { system("$includestr >> /tmp/xcat_packimg.txt"); @@ -176,7 +253,7 @@ sub process_request { } elsif ($method =~ /squashfs/) { $temppath = mkdtemp("/tmp/packimage.$$.XXXXXXXX"); chmod 0755,$temppath; - chdir("$installroot/netboot/$osver/$arch/$profile/rootimg"); + chdir("$rootimg_dir"); system("$excludestr >> /tmp/xcat_packimg.txt"); if ($includestr) { system("$includestr >> /tmp/xcat_packimg.txt"); @@ -187,10 +264,10 @@ sub process_request { } else { $callback->({error=>["Invalid method '$method' requested"],errorcode=>[1]}); } - chdir("$installroot/netboot/$osver/$arch/$profile/rootimg"); + chdir("$rootimg_dir"); system($excludestr); if ($method =~ /cpio/) { - chmod 0644,"$installroot/netboot/$osver/$arch/$profile/rootimg.gz"; + chmod 0644,"$destdir/rootimg.gz"; umask $oldmask; } elsif ($method =~ /squashfs/) { my $flags; @@ -216,9 +293,11 @@ sub process_request { chmod(0644,"../rootimg.sfs"); } chdir($oldpath); - my @ret=xCAT::SvrUtils->update_tables_with_diskless_image($osver, $arch, $profile); - if ($ret[0] != 0) { - $callback->({error=>["Error when updating the osimage tables: " . $ret[1]]}); + if (!$imagename) { + my @ret=xCAT::SvrUtils->update_tables_with_diskless_image($osver, $arch, $profile); + if ($ret[0] != 0) { + $callback->({error=>["Error when updating the osimage tables: " . $ret[1]]}); + } } } @@ -230,6 +309,7 @@ sub process_request { sub copybootscript { my $installroot = shift; + my $rootimg_dir = shift; my $osver = shift; my $arch = shift; my $profile = shift; @@ -239,11 +319,11 @@ sub copybootscript { if ( -f "$installroot/postscripts/xcatdsklspost") { # copy the xCAT diskless post script to the image - mkpath("$installroot/netboot/$osver/$arch/$profile/rootimg/opt/xcat"); + mkpath("$rootimg_dir/opt/xcat"); - copy ("$installroot/postscripts/xcatdsklspost", "$installroot/netboot/$osver/$arch/$profile/rootimg/opt/xcat/xcatdsklspost"); + copy ("$installroot/postscripts/xcatdsklspost", "$rootimg_dir/opt/xcat/xcatdsklspost"); - chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/opt/xcat/xcatdsklspost"); + chmod(0755,"$rootimg_dir/opt/xcat/xcatdsklspost"); } else { @@ -253,23 +333,23 @@ sub copybootscript { return 1; } if ( -f "$installroot/postscripts/xcatdsklspost.aix") { - copy ("$installroot/postscripts/xcatdsklspost.aix", "$installroot/netboot/$osver/$arch/$profile/rootimg/opt/xcat/xcatdsklspost.aix"); - chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/opt/xcat/xcatdsklspost.aix"); + copy ("$installroot/postscripts/xcatdsklspost.aix", "$rootimg_dir/opt/xcat/xcatdsklspost.aix"); + chmod(0755,"$rootimg_dir/opt/xcat/xcatdsklspost.aix"); } if ( -f "$installroot/postscripts/xcatpostinit") { # copy the linux diskless init script to the image # - & set the permissions - copy ("$installroot/postscripts/xcatpostinit","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/xcatpostinit"); + copy ("$installroot/postscripts/xcatpostinit","$rootimg_dir/etc/init.d/xcatpostinit"); - chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/xcatpostinit"); + chmod(0755,"$rootimg_dir/etc/init.d/xcatpostinit"); # run chkconfig - #my $chkcmd = "chroot $installroot/netboot/$osver/$arch/$profile/rootimg chkconfig --add xcatpostinit"; - symlink "/etc/init.d/xcatpostinit","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc3.d/S84xcatpostinit"; - symlink "/etc/init.d/xcatpostinit","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc4.d/S84xcatpostinit"; - symlink "/etc/init.d/xcatpostinit","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc5.d/S84xcatpostinit"; + #my $chkcmd = "chroot $rootimg_dir chkconfig --add xcatpostinit"; + symlink "/etc/init.d/xcatpostinit","$rootimg_dir/etc/rc3.d/S84xcatpostinit"; + symlink "/etc/init.d/xcatpostinit","$rootimg_dir/etc/rc4.d/S84xcatpostinit"; + symlink "/etc/init.d/xcatpostinit","$rootimg_dir/etc/rc5.d/S84xcatpostinit"; #my $rc = system($chkcmd); #if ($rc) { #my $rsp; diff --git a/xCAT-server/lib/xcat/plugins/sles.pm b/xCAT-server/lib/xcat/plugins/sles.pm index 3f9fbd66a..1d5cb5013 100644 --- a/xCAT-server/lib/xcat/plugins/sles.pm +++ b/xCAT-server/lib/xcat/plugins/sles.pm @@ -18,7 +18,7 @@ Getopt::Long::Configure("bundling"); Getopt::Long::Configure("pass_through"); use File::Path; use File::Copy; -use strict; +#use strict; my @cpiopid; sub handled_commands diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 6371c0c8a..746f6ae55 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -1,4 +1,10 @@ #!/usr/bin/env perl +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; + use File::Basename; use File::Path; use File::Copy; @@ -13,11 +19,7 @@ my $prinic; #TODO be flexible on node primary nic my $othernics; #TODO be flexible on node primary nic my $netdriver; my @yumdirs; -my $arch = `uname -m`; -chomp($arch); -if ($arch =~ /i.86$/) { - $arch = x86; -} +my $arch; my %libhash; my @filestoadd; my $profile; @@ -36,6 +38,14 @@ my $kernelver = ""; #`uname -r`; my $basekernelver; # = $kernelver; my $customdir=$fullpath; $customdir =~ s/.*share\/xcat/$installroot\/custom/; +my $imagename; +my $pkglist; +my $srcdir; +my $destdir; +my $srcdir_otherpkgs; +my $otherpkglist; +my $postinstall_filename; +my $rootimg_dir; sub xdie { system("rm -rf /tmp/xcatinitrd.$$"); @@ -54,11 +64,98 @@ GetOptions( 't=s' => \$tmplimit, 'k=s' => \$kernelver ); +if (@ARGV > 0) { + $imagename=$ARGV[0]; + if ($arch or $osver or $profile) { + print "-o, -p and -a options are not allowed when a image name is specified.\n"; + exit 1; + } + #load the module in memory + eval {require("$::XCATROOT/lib/perl/xCAT/Table.pm")}; + if ($@) { + print $@; + exit 1; + } + + #get the info from the osimage and linux + my $osimagetab=xCAT::Table->new('osimage', -create=>1); + if (!$osimagetab) { + print "The osimage table cannot be opened.\n"; + exit 1; + } + my $linuximagetab=xCAT::Table->new('linuximage', -create=>1); + if (!$linuximagetab) { + print "The linuximage table cannot be opened.\n"; + exit 1; + } + (my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod'); + if (!$ref) { + print "Cannot find image \'$imagename\' from the osimage table.\n"; + exit 1; + } + (my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir', 'postinstall', 'rootimgdir'); + if (!$ref1) { + print "Cannot find $imagename from the linuximage table\n"; + exit 1; + } + + $osver=$ref->{'osvers'}; + $arch=$ref->{'osarch'}; + $profile=$ref->{'profile'}; + my $provmethod=$ref->{'provmethod'}; + + unless ($osver and $arch and $profile and $provmethod) { + print"osimage.osvers, osimage.osarch, osimage.profile and osimage.provmethod must be specified for the image $imagename in the database.\n"; + exit 1; + } + + if ($provmethod ne 'netboot') { + print "\'$imagename\' cannot be used to build diskless image. Make sure osimage.provmethod is 'netboot'."; + exit 1; + } + + if (! $ref1->{'pkglist'}) { + print"A .pkglist file must be specified for image \'$imagename\' in the linuximage table.\n"; + exit 0; + } + $pkglist =$ref1->{'pkglist'}; + + $srcdir=$ref1->{'pkgdir'}; + $srcdir_otherpkgs=$ref1->{'otherpkgdir'}; + $otherpkglist=$ref1->{'otherpkglist'}; + $postinstall_filename=$ref1->{'postinstall'}; + $destdir=$ref1->{'rootimgdir'}; +} + +if (!$arch) { + $arch = `uname -m`; + chomp($arch); + if ($arch =~ /i.86$/) { + $arch = "x86"; + } +} + +if (!$srcdir) { + $srcdir="$installroot/$osver/$arch"; +} + +if (!$srcdir_otherpkgs) { + $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; +} + +if (!$destdir) +{ + $destdir="$installroot/netboot/$osver/$arch/$profile"; +} +$rootimg_dir="$destdir/rootimg"; + unless ($osver and $profile and $netdriver and $prinic) { print 'Usage: genimage -i -n [-r ] -o -p -k '."\n"; + print ' genimage -i -n [-r ] -k '."\n"; print "Examples:\n"; print " genimage -i eth0 -n tg3 -o centos5.1 -p compute\n"; print " genimage -i eth0 -r eth1,eth2 -n tg3,bnx2 -o centos5.1 -p compute\n"; + print " genimage -i eth0 -n tg3 myimage\n"; exit 1; } my @ndrivers; @@ -73,7 +170,6 @@ foreach (split /,/,$netdriver) { } unless ($onlyinitrd) { - my $srcdir = "$installroot/$osver/$arch"; @yumdirs=(); find(\&isyumdir, <$installroot/$osver/$arch/>); unless (scalar(@yumdirs)) { @@ -91,23 +187,25 @@ unless ($onlyinitrd) { } $repnum-=1; close($yumconfig); - mkpath "$installroot/netboot/$osver/$arch/$profile/rootimg/etc"; + mkpath "$rootimg_dir/etc"; my $fd; - open($fd,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab"); + open($fd,">>","$rootimg_dir/etc/fstab"); print $fd "#Dummy fstab for rpm postscripts to see\n"; close($fd); - my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$installroot/netboot/$osver/$arch/$profile/rootimg/ --disablerepo=* "; + my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir/ --disablerepo=* "; foreach (0..$repnum) { $yumcmd .= "--enablerepo=$osver-$arch-$_ "; } $yumcmd .= "install "; - mkpath("$installroot/netboot/$osver/$arch/$profile/rootimg/var/lib/yum"); + mkpath("$rootimg_dir/var/lib/yum"); - my $pkglist= get_pkglist_file_name($customdir); - if (!$pkglist) { - $pkglist= get_pkglist_file_name($pathtofiles); - } + if (!$imagename) { + $pkglist= get_pkglist_file_name($customdir); + if (!$pkglist) { + $pkglist= get_pkglist_file_name($pathtofiles); + } + } print "pkglist=$pkglist\n"; if (!$pkglist) { @@ -135,7 +233,6 @@ unless ($onlyinitrd) { } #Now let's handle extra packages - my $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; my %extra_hash=get_extra_package_names(); my $extrapkgnames; @@ -151,7 +248,7 @@ unless ($onlyinitrd) { close($yumconfig); $index--; #enable extra package repo - $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$installroot/netboot/$osver/$arch/$profile/rootimg/ --disablerepo=* "; + $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir/ --disablerepo=* "; foreach (0..$repnum) { $yumcmd .= "--enablerepo=$osver-$arch-$_ "; } @@ -184,7 +281,7 @@ unless ($onlyinitrd) { #If specified, that takes precedence. #if image has one, that is used #if all else fails, resort to uname -r like this script did before -my @KVERS= <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*>; +my @KVERS= <$rootimg_dir/lib/modules/*>; if (scalar(@KVERS)) { $basekernelver = basename($KVERS[0]); } @@ -198,26 +295,26 @@ chomp($kernelver); unlink "/tmp/genimage.$$.yum.conf"; #-- run postinstall script -if (-x "$pathtofiles/$profile.$osver.$arch.postinstall") { - my $rc = system("$pathtofiles/$profile.$osver.$arch.postinstall", "$installroot/netboot/$osver/$arch/$profile/rootimg",$osver,$arch,$profile); +if (!$imagename) { + $postinstall_filename= get_postinstall_file_name($customdir); + if (!$postinstall_filename) { + $postinstall_filename= get_postinstall_file_name($pathtofiles); + } +} + +if (($postinstall_filename) && (-x $postinstall_filename)) { + my $rc = system($postinstall_filename, $rootimg_dir,$osver,$arch,$profile); if($rc) { print "postinstall script failed\n"; exit 1; } } -elsif (-x "$pathtofiles/$profile.postinstall") { - my $rc = system("$pathtofiles/$profile.postinstall","$installroot/netboot/$osver/$arch/$profile/rootimg",$osver,$arch,$profile); - if ($rc) { - print "postinstall script failed\n"; - exit 1; - } -} mkinitrd(); sub getlibs { my $file = shift; - my $liblist = `chroot $installroot/netboot/$osver/$arch/$profile/rootimg ldd $file`; + my $liblist = `chroot $rootimg_dir ldd $file`; my @libs = split/\n/,$liblist; my @return; foreach (@libs) { @@ -240,13 +337,13 @@ sub getlibs { sub mkinitrd { mkpath("/tmp/xcatinitrd.$$/bin"); if($basekernelver eq $kernelver) { - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); + rename(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); } else { - if(-r "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver") { - rename("$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); + if(-r "$rootimg_dir/boot/vmlinuz-$kernelver") { + rename("$rootimg_dir/boot/vmlinuz-$kernelver","$destdir/kernel"); } elsif(-r "/boot/vmlinuz-$kernelver") { - copy("/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); + copy("/boot/vmlinuz-$kernelver","$destdir/kernel"); } else { xdie("Cannot read /boot/vmlinuz-$kernelver"); @@ -445,22 +542,22 @@ EOMS } push @filestoadd,keys %libhash; if($basekernelver ne $kernelver) { - system("rm -rf $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$basekernelver"); - unless (-d "$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver") { + system("rm -rf $rootimg_dir/lib/modules/$basekernelver"); + unless (-d "$rootimg_dir/lib/modules/$kernelver") { if(-d "/lib/modules/$kernelver") { - system("cd /lib/modules;cp -r $kernelver $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/"); + system("cd /lib/modules;cp -r $kernelver $rootimg_dir/lib/modules/"); } else { xdie("Cannot read /lib/modules/$kernelver"); } } } - find(\&isnetdriver, <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver/*>); + find(\&isnetdriver, <$rootimg_dir/lib/modules/$kernelver/*>); foreach (@filestoadd) { if (ref($_)) { #print "$_->[0], $_->[1]\n"; - my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/".$_->[0]; + my $srcpath = "$rootimg_dir/".$_->[0]; if (-f "$customdir/".$_->[0]) { $srcpath="$customdir/".$_->[0]; } elsif (-f "$pathtofiles/".$_->[0]) { @@ -471,7 +568,7 @@ EOMS chmod 0755,"/tmp/xcatinitrd.$$/".$_->[1]; } else { #print "$_\n"; - my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/$_"; + my $srcpath = "$rootimg_dir/$_"; if (-f "$customdir/$_") { $srcpath = "$customdir/$_"; } elsif (-f "$pathtofiles/$_") { @@ -483,8 +580,8 @@ EOMS } } - #copy("$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*d","/tmp/xcatinitrd.$$/$_"); - system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $installroot/netboot/$osver/$arch/$profile/initrd.gz"); + #copy("$rootimg_dir/lib/modules/*d","/tmp/xcatinitrd.$$/$_"); + system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $destdir/initrd.gz"); system("rm -rf /tmp/xcatinitrd.$$"); } @@ -501,7 +598,7 @@ sub isnetdriver { foreach (@ndrivers) { if ($File::Find::name =~ /\/$_/) { my $filetoadd = $File::Find::name; - $filetoadd =~ s!$installroot/netboot/$osver/$arch/$profile/rootimg/!!; + $filetoadd =~ s!$rootimg_dir/!!; push @filestoadd,[$filetoadd,"lib/$_"]; } } @@ -517,26 +614,26 @@ sub postscripts { # TODO: customized postscripts generic_post(); if (-d "$installroot/postscripts/hostkeys") { for my $key (<$installroot/postscripts/hostkeys/*key>) { - copy ($key,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/ssh/"); + copy ($key,"$rootimg_dir/etc/ssh/"); } - chmod 0600,; + chmod 0600,; } if (-d "/$installroot/postscripts/.ssh") { - mkpath("/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh"); - chmod(0700,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/"); + mkpath("/$rootimg_dir/root/.ssh"); + chmod(0700,"/$rootimg_dir/root/.ssh/"); for my $file () { - copy ($file,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/"); + copy ($file,"/$rootimg_dir/root/.ssh/"); } - chmod(0600,); + chmod(0600,); } } sub generic_post { #This function is meant to leave the image in a state approximating a normal install my $cfgfile; - unlink("$installroot/netboot/$osver/$arch/$profile/rootimg/dev/null"); - system("mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/null c 1 3"); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab"); + unlink("$rootimg_dir/dev/null"); + system("mknod $rootimg_dir/dev/null c 1 3"); + open($cfgfile,">","$rootimg_dir/etc/fstab"); print $cfgfile "devpts /dev/pts devpts gid=5,mode=620 0 0\n"; print $cfgfile "tmpfs /dev/shm tmpfs defaults 0 0\n"; print $cfgfile "proc /proc proc defaults 0 0\n"; @@ -546,30 +643,30 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile "tmpfs /var/tmp tmpfs defaults 0 0\n"; } close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network"); print $cfgfile "NETWORKING=yes\n"; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/resolv.conf"); + open($cfgfile,">","$rootimg_dir/etc/resolv.conf"); print $cfgfile "#Dummy resolv.conf to make boot cleaner"; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$prinic"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$prinic"); print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$prinic\n"; close($cfgfile); foreach (split /,/,$othernics) { if (/^$/) { next; } - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$_"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$_"); print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$_\n"; close($cfgfile); } - open($cfgfile,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/securetty"); + open($cfgfile,">>","$rootimg_dir/etc/securetty"); print $cfgfile "ttyS0\n"; print $cfgfile "ttyS1\n"; close($cfgfile); my @passwd; - open($cfgfile,"<","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd"); + open($cfgfile,"<","$rootimg_dir/etc/passwd"); @passwd = <$cfgfile>; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd"); + open($cfgfile,">","$rootimg_dir/etc/passwd"); foreach (@passwd) { if (/^root:/) { s/^root:\*/root:x/ @@ -577,16 +674,16 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile $_; } close($cfgfile); - foreach (<$installroot/netboot/$osver/$arch/$profile/rootimg/etc/skel/.*>) { + foreach (<$rootimg_dir/etc/skel/.*>) { if (basename($_) eq '.' or basename($_) eq '..') { next; } - copy $_,"$installroot/netboot/$osver/$arch/$profile/rootimg/root/"; + copy $_,"$rootimg_dir/root/"; } - unless ( -r <$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc3.d/S??network>) { - symlink "/etc/init.d/network","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc3.d/S10network"; + unless ( -r <$rootimg_dir/etc/rc3.d/S??network>) { + symlink "/etc/init.d/network","$rootimg_dir/etc/rc3.d/S10network"; } - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc3.d/S60gettyset"); + open($cfgfile,">","$rootimg_dir/etc/rc3.d/S60gettyset"); print $cfgfile "#!/bin/bash\n"; print $cfgfile "for i in `cat /proc/cmdline`; do\n"; print $cfgfile ' KEY=`echo $i|cut -d= -f 1`'."\n"; @@ -606,16 +703,18 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile " fi\n"; print $cfgfile "done\n"; close($cfgfile); - chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/rc3.d/S60gettyset"); - #link("$installroot/netboot/$osver/$arch/$profile/rootimg/sbin/init","$installroot/netboot/$osver/$arch/$profile/rootimg/init"); + chmod(0755,"$rootimg_dir/etc/rc3.d/S60gettyset"); + #link("$rootimg_dir/sbin/init","$rootimg_dir/init"); - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); + rename(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); } #get th extra package name sub get_extra_package_names { - my $otherpkglist=get_extra_pkglist_file_name($customdir); - if (!$otherpkglist) { $otherpkglist=get_extra_pkglist_file_name($pathtofiles); } + if (!$imagename) { + $otherpkglist=get_extra_pkglist_file_name($customdir); + if (!$otherpkglist) { $otherpkglist=get_extra_pkglist_file_name($pathtofiles); } + } my %pkgnames=(); my @tmp_array=(); @@ -718,4 +817,18 @@ sub get_pkglist_file_name { return ""; } +sub get_postinstall_file_name { + my $base=shift; + if (-x "$base/$profile.$osver.$arch.postinstall") { + return "$base/$profile.$osver.$arch.postinstall"; + } elsif (-x "$base/$profile.$arch.postinstall") { + return "$base/$profile.$arch.postinstall"; + } elsif (-x "$base/$profile.$osver.postinstall") { + return "$base/$profile.$osver.postinstall"; + } elsif (-x "$base/$profile.postinstall") { + return "$base/$profile.postinstall"; + } + + return ""; +} diff --git a/xCAT-server/share/xcat/netboot/sles/genimage b/xCAT-server/share/xcat/netboot/sles/genimage index 082bfad33..5e9141b0a 100755 --- a/xCAT-server/share/xcat/netboot/sles/genimage +++ b/xCAT-server/share/xcat/netboot/sles/genimage @@ -1,4 +1,10 @@ #!/usr/bin/env perl +BEGIN +{ + $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; +} +use lib "$::XCATROOT/lib/perl"; + use File::Basename; use File::Path; use File::Copy; @@ -13,11 +19,7 @@ my $prinic; #TODO be flexible on node primary nic my $othernics; #TODO be flexible on node primary nic my $netdriver; my @yumdirs; -my $arch = `uname -m`; -chomp($arch); -if ($arch =~ /i.86$/) { - $arch = x86; -} +my $arch; my %libhash; my @filestoadd; my $profile; @@ -36,6 +38,14 @@ my $kernelver = ""; #`uname -r`; my $basekernelver; # = $kernelver; my $customdir=$fullpath; $customdir =~ s/.*share\/xcat/$installroot\/custom/; +my $imagename; +my $pkglist; +my $srcdir; +my $destdir; +my $srcdir_otherpkgs; +my $otherpkglist; +my $postinstall_filename; +my $rootimg_dir; sub xdie { system("rm -rf /tmp/xcatinitrd.$$"); @@ -69,12 +79,99 @@ GetOptions( 't=s' => \$tmplimit, 'k=s' => \$kernelver ); +if (@ARGV > 0) { + $imagename=$ARGV[0]; + if ($arch or $osver or $profile) { + print "-o, -p and -a options are not allowed when a image name is specified.\n"; + exit 1; + } + #load the module in memory + eval {require("$::XCATROOT/lib/perl/xCAT/Table.pm")}; + if ($@) { + print $@; + exit 1; + } + + #get the info from the osimage and linux + my $osimagetab=xCAT::Table->new('osimage', -create=>1); + if (!$osimagetab) { + print "The osimage table cannot be opened.\n"; + exit 1; + } + my $linuximagetab=xCAT::Table->new('linuximage', -create=>1); + if (!$linuximagetab) { + print "The linuximage table cannot be opened.\n"; + exit 1; + } + (my $ref) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod'); + if (!$ref) { + print "Cannot find image \'$imagename\' from the osimage table.\n"; + exit 1; + } + (my $ref1) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir', 'postinstall', 'rootimgdir'); + if (!$ref1) { + print "Cannot find $imagename from the linuximage table\n"; + exit 1; + } + + $osver=$ref->{'osvers'}; + $arch=$ref->{'osarch'}; + $profile=$ref->{'profile'}; + my $provmethod=$ref->{'provmethod'}; + + unless ($osver and $arch and $profile and $provmethod) { + print"osimage.osvers, osimage.osarch, osimage.profile and osimage.provmethod must be specified for the image $imagename in the database.\n"; + exit 1; + } + + if ($provmethod ne 'netboot') { + print "\'$imagename\' cannot be used to build diskless image. Make sure osimage.provmethod is 'netboot'."; + exit 1; + } + + if (! $ref1->{'pkglist'}) { + print"A .pkglist file must be specified for image \'$imagename\' in the linuximage table.\n"; + exit 0; + } + $pkglist =$ref1->{'pkglist'}; + + $srcdir=$ref1->{'pkgdir'}; + if ($srcdir) { $srcdir="$srcdir/1"; } + $srcdir_otherpkgs=$ref1->{'otherpkgdir'}; + $otherpkglist=$ref1->{'otherpkglist'}; + $postinstall_filename=$ref1->{'postinstall'}; + $destdir=$ref1->{'rootimgdir'}; +} + +if (!$arch) { + my $arch = `uname -m`; + chomp($arch); + if ($arch =~ /i.86$/) { + $arch = "x86"; + } +} + +if (!$srcdir) { + $srcdir="$installroot/$osver/$arch/1"; +} + +if (!$srcdir_otherpkgs) { + $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; +} + +if (!$destdir) +{ + $destdir="$installroot/netboot/$osver/$arch/$profile"; +} +$rootimg_dir="$destdir/rootimg"; + + #Default to the first kernel found in the install image if nothing specified explicitly. #A more accurate guess than whatever the image build server happens to be running #If specified, that takes precedence. #if image has one, that is used #if all else fails, resort to uname -r like this script did before -my @KVERS= <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*>; +my @KVERS= <$rootimg_dir/lib/modules/*>; if (scalar(@KVERS)) { $basekernelver = basename($KVERS[0]); } @@ -86,10 +183,12 @@ unless ($kernelver) { } chomp($kernelver); unless ($osver and $profile and $netdriver and $prinic) { - print 'Usage: genimage -i -n [-r ] -o -p -k '."\n"; + print 'Usage: genimage -i -n [-r ] -k -o -p -a '."\n"; + print ' genimage -i -n [-r ] -k '."\n"; print "Examples:\n"; print " genimage -i eth0 -n tg3 -o centos5.1 -p compute\n"; print " genimage -i eth0 -r eth1,eth2 -n tg3,bnx2 -o centos5.1 -p compute\n"; + print " genimage -i eth0 -ntg3 myimagename\n"; exit 1; } my @ndrivers; @@ -113,60 +212,55 @@ if(`grep VERSION /etc/SuSE-release` =~ /VERSION = (\d+)/) { $osver_host=11; } + unless ($onlyinitrd) { - my $srcdir = "$installroot/$osver/$arch/1"; + my %extra_hash=get_extra_package_names(); - #this is for extra packages - my $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; - my %extra_hash=get_extra_package_names(); - - - mkpath "$installroot/netboot/$osver/$arch/$profile/rootimg/etc"; - mkpath "$installroot/netboot/$osver/$arch/$profile/rootimg/dev"; - #system "mount -o bind /dev $installroot/netboot/$osver/$arch/$profile/rootimg/dev"; - system "mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/zero c 1 5"; - system "mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/null c 1 3"; #that's neccessary for SLES11 - open($fd,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab"); + mkpath "$rootimg_dir/etc"; + mkpath "$rootimg_dir/dev"; + #system "mount -o bind /dev $rootimg_dir/dev"; + system "mknod $rootimg_dir/dev/zero c 1 5"; + system "mknod $rootimg_dir/dev/null c 1 3"; #that's neccessary for SLES11 + open($fd,">>","$rootimg_dir/etc/fstab"); print $fd "#Dummy fstab for rpm postscripts to see\n"; close($fd); if($osver_host == 11) {#zypper in SLES11 is different - my $rootimg_dir="$installroot/netboot/$osver/$arch/$profile/rootimg"; if(-e "$rootimg_dir/etc/zypp/repos.d/$osver.repo") { system("rm -rf $rootimg_dir/etc/zypp/repos.d/$osver.repo"); } system("zypper -R $rootimg_dir ar file:$srcdir $osver"); }else { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ sa file:$srcdir"); + system("zypper -R $rootimg_dir sa file:$srcdir"); } #remove the old repository for extra packages my $result=`zypper -R /install/netboot/sles11/ppc64/test/rootimg/ sl |grep otherpkg|cut -f2 -d '|'|tr "\n" " "`; if ($result =~ /\S/) { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ sd $result"); + system("zypper -R $rootimg_dir sd $result"); } #add the new repository for extra packages my $extrapkgnames; if($osver_host == 11) { #SLES11 - if(-e "$installroot/netboot/$osver/$arch/$profile/rootimg/etc/zypp/repos.d/otherpkg.repo") { - system("rm -rf $installroot/netboot/$osver/$arch/$profile/rootimg/etc/zypp/repos.d/otherpkg.repo"); + if(-e "$rootimg_dir/etc/zypp/repos.d/otherpkg.repo") { + system("rm -rf $rootimg_dir/etc/zypp/repos.d/otherpkg.repo"); } } my $index=1; foreach (keys(%extra_hash)) { - $whole_path="$srcdir_otherpkgs/$_"; + my $whole_path="$srcdir_otherpkgs/$_"; if (-r "$srcdir_otherpkgs/$_/repodata/repomd.xml") { if($osver_host == 11) { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ ar file:$srcdir_otherpkgs/$_ otherpkg$index"); + system("zypper -R $rootimg_dir ar file:$srcdir_otherpkgs/$_ otherpkg$index"); }else { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ sa file:$srcdir_otherpkgs/$_"); + system("zypper -R $rootimg_dir sa file:$srcdir_otherpkgs/$_"); } } else { if($osver_host == 11) { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ ar -t Plaindir file:$srcdir_otherpkgs/$_ otherpkg$index"); + system("zypper -R $rootimg_dir ar -t Plaindir file:$srcdir_otherpkgs/$_ otherpkg$index"); }else { - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ sa -t Plaindir file:$srcdir_otherpkgs/$_"); + system("zypper -R $rootimg_dir sa -t Plaindir file:$srcdir_otherpkgs/$_"); } } $index++; @@ -175,7 +269,9 @@ unless ($onlyinitrd) { $extrapkgnames .= " " . join(' ', @$pa); } - #-- add custom repositories to the image + #-- add custom repositories to the image + #TODO: should we add the support to otherpkgs for this? we have too many list files and it seems only SLES supports this + my $repolist; if ( -r "$pathtofiles/$profile.$osver.$arch.repolist") { $repolist = "$pathtofiles/$profile.$osver.$arch.repolist"; }elsif ( -r "$pathtofiles/$profile.$osver.repolist") { @@ -190,24 +286,26 @@ unless ($onlyinitrd) { while (<$repoconfig>) { chomp; next if /^\s*#/; - ($repotype,$repourl,$repoalias) = split m/\|/; - system("zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ ar $repourl $repoalias"); + my ($repotype,$repourl,$repoalias) = split m/\|/; + system("zypper -R $rootimg_dir ar $repourl $repoalias"); } } - #my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$installroot/netboot/$osver/$arch/$profile/rootimg/ --disablerepo=* "; + #my $yumcmd = "yum -y -c /tmp/genimage.$$.yum.conf --installroot=$rootimg_dir --disablerepo=* "; #$yumcmd .= "install "; - #mkpath("$installroot/netboot/$osver/$arch/$profile/rootimg/var/lib/yum"); + #mkpath("$rootimg_dir/var/lib/yum"); my $yumcmd; if($osver =~ /sles11/ && $osver_host == 11) { - $yumcmd = "zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ install -l "; #add -l for SLES11 + $yumcmd = "zypper -R $rootimg_dir install -l "; #add -l for SLES11 }else { - $yumcmd = "zypper -R $installroot/netboot/$osver/$arch/$profile/rootimg/ install "; + $yumcmd = "zypper -R $rootimg_dir install "; + } + if (!$imagename) { + $pkglist= get_pkglist_file_name($customdir); + if (!$pkglist) { + $pkglist= get_pkglist_file_name($pathtofiles); + } } - my $pkglist= get_pkglist_file_name($customdir); - if (!$pkglist) { - $pkglist= get_pkglist_file_name($pathtofiles); - } #print "pkglist=$pkglist\n"; if (!$pkglist) { @@ -249,13 +347,15 @@ unless ($onlyinitrd) { unlink "/tmp/genimage.$$.yum.conf"; #-- run postinstall script -my $postinstall_filename= get_postinstall_file_name($customdir); -if (!$postinstall_filename) { - $postinstall_filename= get_postinstall_file_name($pathtofiles); +if (!$imagename) { + $postinstall_filename= get_postinstall_file_name($customdir); + if (!$postinstall_filename) { + $postinstall_filename= get_postinstall_file_name($pathtofiles); + } } if (($postinstall_filename) && (-x $postinstall_filename)) { - my $rc = system($postinstall_filename, "$installroot/netboot/$osver/$arch/$profile/rootimg",$osver,$arch,$profile); + my $rc = system($postinstall_filename, $rootimg_dir,$osver,$arch,$profile); if($rc) { print "postinstall script failed\n"; exit 1; @@ -271,9 +371,9 @@ open MTABFD, "/etc/mtab"; my @lines = ; close MTABFD; -my $ret = grep m{$installroot/netboot/$osver/$arch/$profile/rootimg/proc}, @lines; +my $ret = grep m{$rootimg_dir/proc}, @lines; if($ret > 0) { - system("umount $installroot/netboot/$osver/$arch/$profile/rootimg/proc"); + system("umount $rootimg_dir/proc"); } mkinitrd(); @@ -281,7 +381,7 @@ mkinitrd(); sub getlibs { my $file = shift; - my $liblist = `chroot $installroot/netboot/$osver/$arch/$profile/rootimg ldd $file`; + my $liblist = `chroot $rootimg_dir ldd $file`; my @libs = split/\n/,$liblist; my @return; foreach (@libs) { @@ -304,21 +404,21 @@ sub getlibs { sub mkinitrd { mkpath("/tmp/xcatinitrd.$$/bin"); if($basekernelver eq $kernelver) { - if (-f "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver") { - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); - } elsif (-f "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinux-$kernelver"){ - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinux*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); + if (-f "$rootimg_dir/boot/vmlinuz-$kernelver") { + rename(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); + } elsif (-f "$rootimg_dir/boot/vmlinux-$kernelver"){ + rename(<$rootimg_dir/boot/vmlinux*>,"$destdir/kernel"); } } else { - if(-r "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver") { - rename("$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); - } elsif(-r "$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinux-$kernelver") { - rename("$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinux-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); + if(-r "$rootimg_dir/boot/vmlinuz-$kernelver") { + rename("$rootimg_dir/boot/vmlinuz-$kernelver","$destdir/kernel"); + } elsif(-r "$rootimg_dir/boot/vmlinux-$kernelver") { + rename("$rootimg_dir/boot/vmlinux-$kernelver","$destdir/kernel"); } elsif(-r "/boot/vmlinuz-$kernelver") { - copy("/boot/vmlinuz-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); + copy("/boot/vmlinuz-$kernelver","$destdir/kernel"); } elsif(-r "/boot/vmlinux-$kernelver") {#for SLES10,11 - copy("/boot/vmlinux-$kernelver","$installroot/netboot/$osver/$arch/$profile/kernel"); + copy("/boot/vmlinux-$kernelver","$destdir/kernel"); } else { xdie("Cannot read /boot/vmlinuz-$kernelver"); @@ -531,21 +631,21 @@ END } push @filestoadd,keys %libhash; if($basekernelver ne $kernelver) { - system("rm -rf $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$basekernelver"); - unless (-d "$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver") { + system("rm -rf $rootimg_dir/lib/modules/$basekernelver"); + unless (-d "$rootimg_dir/lib/modules/$kernelver") { if(-d "/lib/modules/$kernelver") { - system("cd /lib/modules;cp -r $kernelver $installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/"); + system("cd /lib/modules;cp -r $kernelver $rootimg_dir/lib/modules/"); } else { xdie("Cannot read /lib/modules/$kernelver"); } } } - find(\&isnetdriver, <$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/$kernelver/*>); + find(\&isnetdriver, <$rootimg_dir/lib/modules/$kernelver/*>); foreach (@filestoadd) { if (ref($_)) { #print "$_->[0], $_->[1]\n"; - my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/".$_->[0]; + my $srcpath = "$rootimg_dir".$_->[0]; if (-f "$customdir/".$_->[0]) { $srcpath="$customdir/".$_->[0]; } elsif (-f "$pathtofiles/".$_->[0]) { @@ -555,7 +655,7 @@ END chmod 0755,"/tmp/xcatinitrd.$$/".$_->[1]; } else { #print "$_\n"; - my $srcpath = "$installroot/netboot/$osver/$arch/$profile/rootimg/$_"; + my $srcpath = "$rootimg_dir/$_"; if (-f "$customdir/$_") { $srcpath = "$customdir/$_"; } elsif (-f "$pathtofiles/$_") { @@ -566,9 +666,9 @@ END } } - #copy("$installroot/netboot/$osver/$arch/$profile/rootimg/lib/modules/*d","/tmp/xcatinitrd.$$/$_"); + #copy("$rootimg_dir/lib/modules/*d","/tmp/xcatinitrd.$$/$_"); system("cd /tmp/xcatinitrd.$$/bin/; ln -sf bash sh"); #neccessary for SLES11 - system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $installroot/netboot/$osver/$arch/$profile/initrd.gz"); + system("cd /tmp/xcatinitrd.$$;find .|cpio -H newc -o|gzip -9 -c - > $destdir/initrd.gz"); system("rm -rf /tmp/xcatinitrd.$$"); } @@ -585,7 +685,7 @@ sub isnetdriver { foreach (@ndrivers) { if ($File::Find::name =~ /\/$_/) { my $filetoadd = $File::Find::name; - $filetoadd =~ s!$installroot/netboot/$osver/$arch/$profile/rootimg/!!; + $filetoadd =~ s!$rootimg_dir!!; push @filestoadd,[$filetoadd,"lib/$_"]; } } @@ -601,26 +701,26 @@ sub postscripts { # TODO: customized postscripts generic_post(); if (-d "$installroot/postscripts/hostkeys") { for my $key (<$installroot/postscripts/hostkeys/*key>) { - copy ($key,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/ssh/"); + copy ($key,"$rootimg_dir/etc/ssh/"); } - chmod 0600,; + chmod 0600,<$rootimg_dir/etc/ssh/*key>; } if (-d "/$installroot/postscripts/.ssh") { - mkpath("/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh"); - chmod(0700,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/"); + mkpath("$rootimg_dir/root/.ssh"); + chmod(0700,"$rootimg_dir/root/.ssh/"); for my $file () { - copy ($file,"/$installroot/netboot/$osver/$arch/$profile/rootimg/root/.ssh/"); + copy ($file,"$rootimg_dir/root/.ssh/"); } - chmod(0600,); + chmod(0600,<$rootimg_dir/root/.ssh/*>); } } sub generic_post { #This function is meant to leave the image in a state approximating a normal install my $cfgfile; - unlink("$installroot/netboot/$osver/$arch/$profile/rootimg/dev/null"); - system("mknod $installroot/netboot/$osver/$arch/$profile/rootimg/dev/null c 1 3"); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/fstab"); + unlink("$rootimg_dir/dev/null"); + system("mknod $rootimg_dir/dev/null c 1 3"); + open($cfgfile,">","$rootimg_dir/etc/fstab"); print $cfgfile "devpts /dev/pts devpts gid=5,mode=620 0 0\n"; print $cfgfile "tmpfs /dev/shm tmpfs defaults 0 0\n"; print $cfgfile "proc /proc proc defaults 0 0\n"; @@ -630,31 +730,31 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile "tmpfs /var/tmp tmpfs defaults 0 0\n"; } close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network"); print $cfgfile "NETWORKING=yes\n"; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/resolv.conf"); + open($cfgfile,">","$rootimg_dir/etc/resolv.conf"); print $cfgfile "#Dummy resolv.conf to make boot cleaner"; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$prinic"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$prinic"); print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$prinic\n"; close($cfgfile); foreach (split /,/,$othernics) { if (/^$/) { next; } - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/sysconfig/network-scripts/ifcfg-$_"); + open($cfgfile,">","$rootimg_dir/etc/sysconfig/network-scripts/ifcfg-$_"); print $cfgfile "ONBOOT=yes\nBOOTPROTO=dhcp\nDEVICE=$_\n"; close($cfgfile); } - open($cfgfile,">>","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/securetty"); + open($cfgfile,">>","$rootimg_dir/etc/securetty"); print $cfgfile "ttyS0\n"; print $cfgfile "ttyS1\n"; print $cfgfile "console\n"; close($cfgfile); my @passwd; - open($cfgfile,"<","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd"); + open($cfgfile,"<","$rootimg_dir/etc/passwd"); @passwd = <$cfgfile>; close($cfgfile); - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/passwd"); + open($cfgfile,">","$rootimg_dir/etc/passwd"); foreach (@passwd) { if (/^root:/) { s/^root:\*/root:x/ @@ -662,13 +762,13 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile $_; } close($cfgfile); - foreach (<$installroot/netboot/$osver/$arch/$profile/rootimg/etc/skel/.*>) { + foreach (<$rootimg_dir/etc/skel/.*>) { if (basename($_) eq '.' or basename($_) eq '..') { next; } - copy $_,"$installroot/netboot/$osver/$arch/$profile/rootimg/root/"; + copy $_,"$rootimg_dir/root/"; } - open($cfgfile,">","$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/gettyset"); + open($cfgfile,">","$rootimg_dir/etc/init.d/gettyset"); print $cfgfile "#!/bin/bash\n"; print $cfgfile "for i in `cat /proc/cmdline`; do\n"; print $cfgfile ' KEY=`echo $i|cut -d= -f 1`'."\n"; @@ -686,29 +786,31 @@ sub generic_post { #This function is meant to leave the image in a state approxi print $cfgfile "/etc/init.d/boot.localnet start\n"; print $cfgfile "/opt/xcat/xcatdsklspost\n"; close($cfgfile); - chmod(0755,"$installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/gettyset"); - #link("$installroot/netboot/$osver/$arch/$profile/rootimg/sbin/init","$installroot/netboot/$osver/$arch/$profile/rootimg/init"); - my $rc = system("grep sshd $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start"); + chmod(0755,"$rootimg_dir/etc/init.d/gettyset"); + #link("$rootimg_dir/sbin/init","$rootimg_dir/init"); + my $rc = system("grep sshd $rootimg_dir/etc/init.d/.depend.start"); if ($rc) { - system("sed -i '".'s/^\(TARGETS = .*\)$/\1 sshd/'."' $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start"); - system("ln -s ../sshd $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/rc3.d/S20sshd"); + system("sed -i '".'s/^\(TARGETS = .*\)$/\1 sshd/'."' $rootimg_dir/etc/init.d/.depend.start"); + system("ln -s ../sshd $rootimg_dir/etc/init.d/rc3.d/S20sshd"); } - my $rc = system("grep gettyset $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start"); + my $rc = system("grep gettyset $rootimg_dir/etc/init.d/.depend.start"); if ($rc) { - system("sed -i '".'s/^\(TARGETS = .*\)$/\1 gettyset/'."' $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/.depend.start"); - system("ln -s ../gettyset $installroot/netboot/$osver/$arch/$profile/rootimg/etc/init.d/rc3.d/S60gettyset"); + system("sed -i '".'s/^\(TARGETS = .*\)$/\1 gettyset/'."' $rootimg_dir/etc/init.d/.depend.start"); + system("ln -s ../gettyset $rootimg_dir/etc/init.d/rc3.d/S60gettyset"); } if(($osver =~ /sles11/) || ($osver =~ /sles10/)) {#for sles11,sles10 - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinux*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); + rename(<$rootimg_dir/boot/vmlinux*>,"$destdir/kernel"); }else { - rename(<$installroot/netboot/$osver/$arch/$profile/rootimg/boot/vmlinuz*>,"$installroot/netboot/$osver/$arch/$profile/kernel"); + rename(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); } } #get th extra package name sub get_extra_package_names { - my $otherpkglist=get_extra_pkglist_file_name($customdir); - if (!$otherpkglist) { $otherpkglist=get_extra_pkglist_file_name($pathtofiles); } + if (!$imagename) { + $otherpkglist=get_extra_pkglist_file_name($customdir); + if (!$otherpkglist) { $otherpkglist=get_extra_pkglist_file_name($pathtofiles); } + } my %pkgnames=(); my @tmp_array=();