diff --git a/xCAT-server/lib/xcat/plugins/genimage.pm b/xCAT-server/lib/xcat/plugins/genimage.pm index 5b480443d..d18cb466e 100644 --- a/xCAT-server/lib/xcat/plugins/genimage.pm +++ b/xCAT-server/lib/xcat/plugins/genimage.pm @@ -36,6 +36,7 @@ my $mode; my $permission; #the permission works only for statelite mode currently my $krpmver; my $kerneldir; +my $mode; @@ -68,6 +69,7 @@ sub process_request { 't=s' => \$tmplimit, 'k=s' => \$kernelver, 'g=s' => \$krpmver, + 'm=s' => \$mode, 'kerneldir=s' => \$kerneldir, 'permission=s' => \$permission ); @@ -97,13 +99,13 @@ sub process_request { $osimagetab = xCAT::Table->new('osimage', -create=>1); unless ($osimagetab) { $callback->({error=>["The osimage table cannot be open."],errorcode=>[1]}); - exit 1; + return 1; } $linuximagetab = xCAT::Table->new('linuximage', -create=>1); unless($linuximagetab) { $callback->({error=>["The linuximage table cannot be open."],errorcode=>[1]}); - exit 1; + return 1; } @@ -112,19 +114,19 @@ sub process_request { $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]}); - exit 1; + return 1; } (my $ref_osimage_tab) = $osimagetab->getAttribs({imagename => $imagename}, 'osvers', 'osarch', 'profile', 'provmethod'); unless ($ref_osimage_tab) { $callback->({error=>["Cannot find image \'$imagename\' from the osimage table."],errorcode=>[1]}); - exit 1; + return 1; } (my $ref_linuximage_tab) = $linuximagetab->getAttribs({imagename => $imagename}, 'pkglist', 'pkgdir', 'otherpkglist', 'otherpkgdir', 'postinstall', 'rootimgdir', 'kerneldir', 'krpmver', 'nodebootif', 'otherifce', 'kernelver', 'netdrivers', 'permission'); unless ($ref_linuximage_tab) { $callback->({error=>["Cannot find $imagename from the linuximage table."],errorcode=>[1]}); - exit 1; + return 1; } $osver=$ref_osimage_tab->{'osvers'}; @@ -134,17 +136,17 @@ sub process_request { 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]}); - exit 1; + return 1; } unless ($provmethod eq 'netboot' || $provmethod eq 'statelite') { $callback->({error=>["\'$imagename\' cannot be used to build diskless image. Make sure osimage.provmethod is 'netboot'."],errorcode=>[1]}); - exit 1; + return 1; } unless ( $ref_linuximage_tab->{'pkglist'}) { $callback->({error=>["A .pkglist file must be specified for image \'$imagename\' in the linuximage table."],errorcode=>[1]}); - exit 1; + return 1; } $pkglist = $ref_linuximage_tab->{'pkglist'}; @@ -234,13 +236,31 @@ sub process_request { } $osfamily =~ s/ //g; + + #-m flag is used only for ubuntu, debian and ferdora12, for others genimage will create + #initrd.gz for both netboot and statelite, no -m is needed. + if ($mode) { + if (($osfamily ne "ubuntu") && ($osfamily ne "debian") && ($osver !~ /fedora12/)) { + $mode=""; + $callback->({error=>["-m flag is valid for Ubuntu, Debian and Fedora12 only."],errorcode=>[1]}); + return 1; + } + } + $profDir = "$::XCATROOT/share/xcat/netboot/$osfamily"; unless(-d $profDir){ $callback->({error=>["Unable to find genimage script in $profDir."],errorcode=>[1]}); - exit 1; + return 1; } - + if ($krpmver) { + if ($osfamily ne "sles") { + $krpmver=""; + $callback->({error=>["-g flag is valid for Sles only."],errorcode=>[1]}); + return 1; + } + } + my $cmd="cd $profDir; ./genimage"; if ($arch) { $cmd .= " -a $arch";} if ($osver) { $cmd .= " -o $osver";} @@ -253,6 +273,7 @@ sub process_request { if ($tmplimit) { $cmd .= " -t $tmplimit";} if ($kernelver) { $cmd .= " -k $kernelver";} if ($krpmver) { $cmd .= " -g $krpmver";} + if ($mode) { $cmd .= " -m $mode";} if ($permission) { $cmd .= " --permission $permission"; } if ($kerneldir) { $cmd .= " --kerneldir $kerneldir"; } diff --git a/xCAT-server/share/xcat/netboot/debian/genimage b/xCAT-server/share/xcat/netboot/debian/genimage index dd5ac551b..7bf7ce222 100755 --- a/xCAT-server/share/xcat/netboot/debian/genimage +++ b/xCAT-server/share/xcat/netboot/debian/genimage @@ -49,6 +49,8 @@ my $rootimg_dir; my $rwfiles; # these files are used by statelite for tmpfs rw my $mode; my $permission; # the permission works only for statelite mode currently +my $internal; +my $kerneldir; sub xdie { @@ -68,75 +70,29 @@ GetOptions( 't=s' => \$tmplimit, 'k=s' => \$kernelver, 'm=s' => \$mode, - 'permission=s' => \$permission + 'permission=s' => \$permission, + 'kerneldir=s' => \$kerneldir, + 'internal' =>\$internal, #internal flag + 'pkglist=s' => \$pkglist, #internal flag + 'srcdir=s' => \$srcdir, #internal flag + 'otherpkgdir=s' => \$srcdir_otherpkgs, #internal flag + 'otherpkglist=s' => \$otherpkglist, #internal flag + 'postinstall=s' => \$postinstall_filename, #internal flag + 'rootimgdir=s' => \$destdir, #internal flag ); + 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'}; } +my %updates_os = (); # the hash for updating osimage table +my %updates = (); # the hash for updating linuximage table + if ($mode eq "statelite") { if (!$permission) { $permission = "755"; } + $updates{'permission'} = $permission if ( $internal ); } if (!$arch) { @@ -150,31 +106,33 @@ if (!$arch) { if (!$srcdir) { $srcdir="$installroot/$osver/$arch"; } +$updates{'pkgdir'} = $srcdir if ($internal); if (!$srcdir_otherpkgs) { $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; } +$updates{'otherpkgdir'} = $srcdir_otherpkgs if ($internal); if (!$destdir) { $destdir="$installroot/netboot/$osver/$arch/$profile"; } +$updates{'rootimgdir'} = $destdir if ($internal); + $rootimg_dir="$destdir/rootimg"; unless ($osver and $profile and $netdriver and $prinic) { - print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; - print ' genimage -i -n [-r ] -k '."\n"; - print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; - print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; - print " genimage -i eth0 -n tg3 myimage\n"; + usage(); exit 1; } +if ($netdriver) { + if ( ($updates{'netdrivers'} ne $netdriver) and ($internal) ) { + $updates{'netdrivers'} = $netdriver; + } +} + my @ndrivers; foreach (split /,/,$netdriver) { unless (/\.ko$/) { @@ -249,9 +207,11 @@ unless ($onlyinitrd) { } } - if (!$pkglist) { - print "Unable to find package list for $profile!\n"; - exit 1; + if ($pkglist) { + $updates{'pkglist'} = $pkglist if ($internal); + } else { + print "Unable to find package list for $profile!"; + exit 1; } my %pkg_hash=get_package_names($pkglist); @@ -280,6 +240,7 @@ unless ($onlyinitrd) { } my %extra_hash=(); if ($otherpkglist) { + $updates{'otherpkglist'} = $otherpkglist if ($internal); %extra_hash=get_package_names($otherpkglist); } my %extrapkgnames; @@ -382,6 +343,8 @@ unless ($kernelver) { $kernelver=$basekernelver; } chomp($kernelver); +#$updates{'kernelver'} = $kernelver if ($internal); + open($moddeps,"<","$rootimg_dir/lib/modules/$kernelver/modules.dep"); my @moddeps = <$moddeps>; my @checkdeps = @ndrivers; @@ -416,6 +379,9 @@ if (!$imagename) { } if (($postinstall_filename) && (-x $postinstall_filename)) { + + $updates{'postinstall'} = $postinstall_filename if ($internal); + my $rc = system($postinstall_filename, $rootimg_dir,$osver,$arch,$profile); if($rc) { print "postinstall script failed\n"; @@ -448,6 +414,49 @@ if($mode eq "statelite"){ } } +# all the attributes have been gathered +# now, update the linuximage and osimage tables +# TODO: do statelite and stateless share the same attributes? +#BEGIN: PLEASE DO NOT CHANGE THE FOLLOWING CODE, genimage PLUGIN NEEDS TO PARSE THR OUTPUT +if ($internal) { + if ($imagename) { + if (keys(%updates) > 0) { + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$imagename\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } + } else { + $updates_os{'profile'} = $profile; + $updates_os{'imagetype'} = 'linux'; + if($mode eq "statelite") { + $updates_os{'provmethod'} = 'statelite'; + } else { + $updates_os{'provmethod'} = 'netboot'; + } + $updates_os{'osname'} = 'Linux'; + $updates_os{'osvers'} = $osver; + $updates_os{'osdistro'} = 'sles'; # not used currently + $updates_os{'osarch'} = $arch; + # update the imagename for stateless + print "The output for table updates starts here\n"; + print "table::osimage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates_os; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } +} +#END mkinitrd(); @@ -1263,4 +1272,13 @@ sub get_profile_def_filename { } - +sub usage { + print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; + print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; + print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; + return 0; +} diff --git a/xCAT-server/share/xcat/netboot/fedora12/genimage b/xCAT-server/share/xcat/netboot/fedora12/genimage index 0b9d6f93d..3c0960230 100755 --- a/xCAT-server/share/xcat/netboot/fedora12/genimage +++ b/xCAT-server/share/xcat/netboot/fedora12/genimage @@ -53,6 +53,8 @@ my $postinstall_filename; my $rootimg_dir; my $mode; my $permission; # the permission works only for statelite mode currently +my $internal; +my $kerneldir; sub xdie { @@ -72,75 +74,29 @@ GetOptions( 't=s' => \$tmplimit, 'k=s' => \$kernelver, 'm=s' => \$mode, - 'permission=s' => \$permission + 'permission=s' => \$permission, + 'kerneldir=s' => \$kerneldir, + 'internal' =>\$internal, #internal flag + 'pkglist=s' => \$pkglist, #internal flag + 'srcdir=s' => \$srcdir, #internal flag + 'otherpkgdir=s' => \$srcdir_otherpkgs, #internal flag + 'otherpkglist=s' => \$otherpkglist, #internal flag + 'postinstall=s' => \$postinstall_filename, #internal flag + 'rootimgdir=s' => \$destdir, #internal flag ); + 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'}; } +my %updates_os = (); # the hash for updating osimage table +my %updates = (); # the hash for updating linuximage table + if ($mode eq "statelite") { if (!$permission) { $permission = "755"; } + $updates{'permission'} = $permission if ( $internal ); } if (!$arch) { @@ -154,29 +110,31 @@ if (!$arch) { if (!$srcdir) { $srcdir="$installroot/$osver/$arch"; } +$updates{'pkgdir'} = $srcdir if ($internal); if (!$srcdir_otherpkgs) { $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; } +$updates{'otherpkgdir'} = $srcdir_otherpkgs if ($internal); if (!$destdir) { $destdir="$installroot/netboot/$osver/$arch/$profile"; } +$updates{'rootimgdir'} = $destdir if ($internal); + $rootimg_dir="$destdir/rootimg"; unless ($osver and $profile and $netdriver and $prinic) { - print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; - print ' genimage -i -n [-r ] -k '."\n"; - print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; - print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; - print " genimage -i eth0 -n tg3 myimage\n"; - exit 1; + usage(); + exit 1; +} + +if ($netdriver) { + if ( ($updates{'netdrivers'} ne $netdriver) and ($internal) ) { + $updates{'netdrivers'} = $netdriver; + } } my @ndrivers; @@ -239,9 +197,11 @@ unless ($onlyinitrd) { } } - if (!$pkglist) { - print "Unable to find package list for $profile!"; - exit 1; + if ($pkglist) { + $updates{'pkglist'} = $pkglist if ($internal); + } else { + print "Unable to find package list for $profile!"; + exit 1; } my %pkg_hash=imgutils::get_package_names($pkglist); @@ -270,6 +230,7 @@ unless ($onlyinitrd) { } my %extra_hash=(); if ($otherpkglist) { + $updates{'otherpkglist'} = $otherpkglist if ($internal); %extra_hash=imgutils::get_package_names($otherpkglist); } my %extrapkgnames; @@ -372,6 +333,9 @@ unless ($kernelver) { $kernelver=$basekernelver; } chomp($kernelver); +#$updates{'kernelver'} = $kernelver if ($internal); + + open($moddeps,"<","$rootimg_dir/lib/modules/$kernelver/modules.dep"); my @moddeps = <$moddeps>; my @checkdeps = @ndrivers; @@ -406,6 +370,9 @@ if (!$imagename) { } if (($postinstall_filename) && (-x $postinstall_filename)) { + + $updates{'postinstall'} = $postinstall_filename if ($internal); + my $rc = system($postinstall_filename, $rootimg_dir,$osver,$arch,$profile); if($rc) { print "postinstall script failed\n"; @@ -438,6 +405,49 @@ if($mode eq "statelite"){ } } +# all the attributes have been gathered +# now, update the linuximage and osimage tables +# TODO: do statelite and stateless share the same attributes? +#BEGIN: PLEASE DO NOT CHANGE THE FOLLOWING CODE, genimage PLUGIN NEEDS TO PARSE THR OUTPUT +if ($internal) { + if ($imagename) { + if (keys(%updates) > 0) { + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$imagename\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } + } else { + $updates_os{'profile'} = $profile; + $updates_os{'imagetype'} = 'linux'; + if($mode eq "statelite") { + $updates_os{'provmethod'} = 'statelite'; + } else { + $updates_os{'provmethod'} = 'netboot'; + } + $updates_os{'osname'} = 'Linux'; + $updates_os{'osvers'} = $osver; + $updates_os{'osdistro'} = 'sles'; # not used currently + $updates_os{'osarch'} = $arch; + # update the imagename for stateless + print "The output for table updates starts here\n"; + print "table::osimage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates_os; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } +} +#END mkinitrd(); @@ -1107,3 +1117,14 @@ sub generic_post { #This function is meant to leave the image in a state approxi copy(<$rootimg_dir/boot/vmlinuz*>,"$destdir/kernel"); } + +sub usage { + print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; + print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; + print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; + return 0; +} diff --git a/xCAT-server/share/xcat/netboot/ubuntu/genimage b/xCAT-server/share/xcat/netboot/ubuntu/genimage index 9973b3cdd..db82f026a 100755 --- a/xCAT-server/share/xcat/netboot/ubuntu/genimage +++ b/xCAT-server/share/xcat/netboot/ubuntu/genimage @@ -49,6 +49,8 @@ my $rootimg_dir; my $rwfiles; # these files are used by statelite for tmpfs rw my $mode; my $permission; # the permission works only for statelite mode currently +my $internal; +my $kerneldir; sub xdie { @@ -68,75 +70,31 @@ GetOptions( 't=s' => \$tmplimit, 'k=s' => \$kernelver, 'm=s' => \$mode, - 'permission=s' => \$permission + 'permission=s' => \$permission, + 'kerneldir=s' => \$kerneldir, + 'internal' =>\$internal, #internal flag + 'pkglist=s' => \$pkglist, #internal flag + 'srcdir=s' => \$srcdir, #internal flag + 'otherpkgdir=s' => \$srcdir_otherpkgs, #internal flag + 'otherpkglist=s' => \$otherpkglist, #internal flag + 'postinstall=s' => \$postinstall_filename, #internal flag + 'rootimgdir=s' => \$destdir, #internal flag ); + + 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'}; } +my %updates_os = (); # the hash for updating osimage table +my %updates = (); # the hash for updating linuximage table + + if ($mode eq "statelite") { if (!$permission) { $permission = "755"; } + $updates{'permission'} = $permission if ( $internal ); } if (!$arch) { @@ -148,33 +106,35 @@ if (!$arch) { } if (!$srcdir) { - $srcdir="$installroot/$osver/$arch"; + $srcdir="$installroot/$osver/$arch"; } +$updates{'pkgdir'} = $srcdir if ($internal); if (!$srcdir_otherpkgs) { $srcdir_otherpkgs = "$installroot/post/otherpkgs/$osver/$arch"; } +$updates{'otherpkgdir'} = $srcdir_otherpkgs if ($internal); if (!$destdir) { $destdir="$installroot/netboot/$osver/$arch/$profile"; } +$updates{'rootimgdir'} = $destdir if ($internal); + $rootimg_dir="$destdir/rootimg"; unless ($osver and $profile and $netdriver and $prinic) { - print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; - print ' genimage -i -n [-r ] -k '."\n"; - print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; - print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; - print " genimage -i eth0 -n tg3 myimage\n"; + usage(); exit 1; } +if ($netdriver) { + if ( ($updates{'netdrivers'} ne $netdriver) and ($internal) ) { + $updates{'netdrivers'} = $netdriver; + } +} + my @ndrivers; foreach (split /,/,$netdriver) { unless (/\.ko$/) { @@ -249,9 +209,11 @@ unless ($onlyinitrd) { } } - if (!$pkglist) { - print "Unable to find package list for $profile!\n"; - exit 1; + if ($pkglist) { + $updates{'pkglist'} = $pkglist if ($internal); + } else { + print "Unable to find package list for $profile!"; + exit 1; } my %pkg_hash=get_package_names($pkglist); @@ -280,7 +242,8 @@ unless ($onlyinitrd) { } my %extra_hash=(); if ($otherpkglist) { - %extra_hash=get_package_names($otherpkglist); + $updates{'otherpkglist'} = $otherpkglist if ($internal); + %extra_hash=get_package_names($otherpkglist); } my %extrapkgnames; @@ -382,6 +345,8 @@ unless ($kernelver) { $kernelver=$basekernelver; } chomp($kernelver); +#$updates{'kernelver'} = $kernelver if ($internal); + open($moddeps,"<","$rootimg_dir/lib/modules/$kernelver/modules.dep"); my @moddeps = <$moddeps>; my @checkdeps = @ndrivers; @@ -416,6 +381,9 @@ if (!$imagename) { } if (($postinstall_filename) && (-x $postinstall_filename)) { + + $updates{'postinstall'} = $postinstall_filename if ($internal); + my $rc = system($postinstall_filename, $rootimg_dir,$osver,$arch,$profile); if($rc) { print "postinstall script failed\n"; @@ -427,9 +395,9 @@ if (($postinstall_filename) && (-x $postinstall_filename)) { # statelite .statelite directory added here. # this is where tmpfs will be created. if($mode eq "statelite"){ - mkpath "$rootimg_dir/.statelite"; # create place for NFS mounts. - # this script will get the directories. - unless(-f "../add-on/statelite/rc.statelite"){ + mkpath "$rootimg_dir/.statelite"; # create place for NFS mounts. + # this script will get the directories. + unless(-f "../add-on/statelite/rc.statelite"){ print "Can't find ../add-on/statelite/rc.statelite!\n"; exit; } @@ -443,11 +411,54 @@ if($mode eq "statelite"){ } unless(-l "$rootimg_dir/var/lib/dhcp" ){ - mkpath "$rootimg_dir/var/lib/dhcp/"; - system("touch $rootimg_dir/var/lib/dhcp/dhclient-$prinic.leases"); - } + mkpath "$rootimg_dir/var/lib/dhcp/"; + system("touch $rootimg_dir/var/lib/dhcp/dhclient-$prinic.leases"); + } } +# all the attributes have been gathered +# now, update the linuximage and osimage tables +# TODO: do statelite and stateless share the same attributes? +#BEGIN: PLEASE DO NOT CHANGE THE FOLLOWING CODE, genimage PLUGIN NEEDS TO PARSE THR OUTPUT +if ($internal) { + if ($imagename) { + if (keys(%updates) > 0) { + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$imagename\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } + } else { + $updates_os{'profile'} = $profile; + $updates_os{'imagetype'} = 'linux'; + if($mode eq "statelite") { + $updates_os{'provmethod'} = 'statelite'; + } else { + $updates_os{'provmethod'} = 'netboot'; + } + $updates_os{'osname'} = 'Linux'; + $updates_os{'osvers'} = $osver; + $updates_os{'osdistro'} = 'sles'; # not used currently + $updates_os{'osarch'} = $arch; + # update the imagename for stateless + print "The output for table updates starts here\n"; + print "table::osimage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates_os; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + + print "The output for table updates starts here\n"; + print "table::linuximage\n"; + print "imagename::$osver-$arch-netboot-$profile\n"; + my @a=%updates; + print join('::',@a) . "\n"; + print "The output for table updates ends here\n"; + } +} +#END mkinitrd(); @@ -1263,4 +1274,13 @@ sub get_profile_def_filename { } - +sub usage { + print 'Usage: genimage -i -n [-r ] -o -p -k [-m [--permission ]]'."\n"; + print " --permission only works when '-m statelite' is set\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 igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite\n"; + print " genimage -i eth0 -n igb,e1000e,e1000,bnx2,tg3 -o centos5.4 -p nfsroot -m statelite --permission 777\n"; + return 0; +}