[1348] | 1 | #!/usr/bin/perl -w
|
---|
| 2 | #
|
---|
| 3 | # Common functions for virtual environment
|
---|
| 4 | #
|
---|
| 5 | # $Id$
|
---|
| 6 | #
|
---|
| 7 |
|
---|
| 8 | package ProjectBuilder::VE;
|
---|
| 9 |
|
---|
| 10 | use strict;
|
---|
| 11 | use Data::Dumper;
|
---|
| 12 | use English;
|
---|
| 13 | use ProjectBuilder::Version;
|
---|
| 14 | use ProjectBuilder::Base;
|
---|
| 15 | use ProjectBuilder::Conf;
|
---|
[1350] | 16 | use ProjectBuilder::Distribution;
|
---|
[1348] | 17 |
|
---|
| 18 | # Global vars
|
---|
| 19 | # Inherit from the "Exporter" module which handles exporting functions.
|
---|
| 20 |
|
---|
| 21 | use vars qw($VERSION $REVISION @ISA @EXPORT);
|
---|
| 22 | use Exporter;
|
---|
| 23 |
|
---|
| 24 | # Export, by default, all the functions into the namespace of
|
---|
| 25 | # any code which uses this module.
|
---|
| 26 |
|
---|
| 27 | our @ISA = qw(Exporter);
|
---|
| 28 | our @EXPORT = qw(pb_ve_launch);
|
---|
| 29 |
|
---|
| 30 | ($VERSION,$REVISION) = pb_version_init();
|
---|
| 31 |
|
---|
| 32 | =pod
|
---|
| 33 |
|
---|
| 34 | =head1 NAME
|
---|
| 35 |
|
---|
| 36 | ProjectBuilder::VE, part of the project-builder.org - module dealing with Virtual Environment
|
---|
| 37 |
|
---|
| 38 | =head1 DESCRIPTION
|
---|
| 39 |
|
---|
| 40 | This modules provides functions to deal with Virtual Environements (VE), aka chroot.
|
---|
| 41 |
|
---|
| 42 | =head1 SYNOPSIS
|
---|
| 43 |
|
---|
| 44 | use ProjectBuilder::VE;
|
---|
| 45 |
|
---|
| 46 | #
|
---|
| 47 | # Return information on the running distro
|
---|
| 48 | #
|
---|
| 49 | my $pbos = pb_ve_launch();
|
---|
| 50 |
|
---|
| 51 | =head1 USAGE
|
---|
| 52 |
|
---|
| 53 | =over 4
|
---|
| 54 |
|
---|
| 55 | =item B<pb_ve_launch>
|
---|
| 56 |
|
---|
| 57 | This function launch a VE, creating it if necessary using multiple external potential tools.
|
---|
| 58 |
|
---|
| 59 | =cut
|
---|
| 60 |
|
---|
| 61 | sub pb_ve_launch {
|
---|
| 62 |
|
---|
| 63 | my $v = shift || undef;
|
---|
| 64 | my $pbforce = shift || 0; # By default do not rebuild VE
|
---|
| 65 | my $pbsnap = shift || 0; # By default do not snap VE
|
---|
| 66 |
|
---|
| 67 | # Get distro context
|
---|
| 68 | my $pbos = pb_distro_get_context($v);
|
---|
| 69 |
|
---|
| 70 | # Get VE context
|
---|
| 71 | my ($ptr,$vepath) = pb_conf_get("vetype","vepath");
|
---|
| 72 | my $vetype = $ptr->{$ENV{'PBPROJ'}};
|
---|
| 73 |
|
---|
[1352] | 74 | if (($vetype eq "chroot") || ($vetype eq "schroot")) {
|
---|
[1348] | 75 |
|
---|
[1352] | 76 | # We need to avoid umask propagation to the VE
|
---|
| 77 | umask 0022;
|
---|
[1348] | 78 |
|
---|
[1352] | 79 | # We can probably only get those params now we have the distro context
|
---|
| 80 | my ($rbsb4pi,$rbspi,$vesnap,$oscodename,$osmindep,$verebuild,$rbsmirrorsrv) = pb_conf_get_if("rbsb4pi","rbspi","vesnap","oscodename","osmindep","verebuild","rbsmirrorsrv");
|
---|
[1348] | 81 |
|
---|
| 82 | # Architecture consistency
|
---|
[1352] | 83 | my $arch = pb_get_arch();
|
---|
[1348] | 84 | if ($arch ne $pbos->{'arch'}) {
|
---|
| 85 | die "Unable to launch a VE of architecture $pbos->{'arch'} on a $arch platform" if (($pbos->{'arch'} eq "x86_64") && ($arch =~ /i?86/));
|
---|
| 86 | }
|
---|
| 87 |
|
---|
[1352] | 88 | # If we are already root (from pbmkbm e.g.) don't use sudo, just call the command
|
---|
| 89 | my $sudocmd="";
|
---|
| 90 | $sudocmd ="sudo " if ($EFFECTIVE_USER_ID != 0);
|
---|
[1348] | 91 |
|
---|
[1352] | 92 | if (((defined $verebuild) && ($verebuild->{$ENV{'PBPROJ'}} =~ /true/i)) || ($pbforce == 1)) {
|
---|
| 93 | my ($verpmtype,$vedebtype) = pb_conf_get("verpmtype","vedebtype");
|
---|
| 94 | my ($rbsopt1) = pb_conf_get_if("rbsopt");
|
---|
| 95 |
|
---|
[1348] | 96 | # We have to rebuild the chroot
|
---|
| 97 | if ($pbos->{'type'} eq "rpm") {
|
---|
| 98 |
|
---|
| 99 | # Which tool is used
|
---|
| 100 | my $verpmstyle = $verpmtype->{$ENV{'PBPROJ'}};
|
---|
| 101 |
|
---|
| 102 | # Get potential rbs option
|
---|
| 103 | my $rbsopt = "";
|
---|
| 104 | if (defined $rbsopt1) {
|
---|
| 105 | if (defined $rbsopt1->{$verpmstyle}) {
|
---|
| 106 | $rbsopt = $rbsopt1->{$verpmstyle};
|
---|
| 107 | } elsif (defined $rbsopt1->{$ENV{'PBPROJ'}}) {
|
---|
| 108 | $rbsopt = $rbsopt1->{$ENV{'PBPROJ'}};
|
---|
| 109 | } else {
|
---|
| 110 | $rbsopt = "";
|
---|
| 111 | }
|
---|
| 112 | }
|
---|
| 113 |
|
---|
| 114 | my $postinstall = pb_ve_get_postinstall($pbos,$rbspi,$verpmstyle);
|
---|
| 115 | if ($verpmstyle eq "rinse") {
|
---|
| 116 | # Need to reshape the mirrors generated with local before-post-install script
|
---|
| 117 | my $b4post = "--before-post-install ";
|
---|
| 118 | my $postparam = pb_distro_get_param($pbos,$rbsb4pi);
|
---|
| 119 | if ($postparam eq "") {
|
---|
| 120 | $b4post = "";
|
---|
| 121 | } else {
|
---|
| 122 | $b4post .= $postparam;
|
---|
| 123 | }
|
---|
| 124 |
|
---|
| 125 | # Need to reshape the package list for pb
|
---|
| 126 | my $addpkgs;
|
---|
| 127 | $postparam = "";
|
---|
| 128 | $postparam .= pb_distro_get_param($pbos,$osmindep);
|
---|
| 129 | if ($postparam eq "") {
|
---|
| 130 | $addpkgs = "";
|
---|
| 131 | } else {
|
---|
| 132 | my $pkgfile = "$ENV{'PBTMP'}/addpkgs.lis";
|
---|
| 133 | open(PKG,"> $pkgfile") || die "Unable to create $pkgfile";
|
---|
| 134 | foreach my $p (split(/,/,$postparam)) {
|
---|
| 135 | print PKG "$p\n";
|
---|
| 136 | }
|
---|
| 137 | close(PKG);
|
---|
| 138 | $addpkgs = "--add-pkg-list $pkgfile";
|
---|
| 139 | }
|
---|
| 140 |
|
---|
| 141 | my $rinseverb = "";
|
---|
| 142 | $rinseverb = "--verbose" if ($pbdebug gt 0);
|
---|
| 143 | my ($rbsconf) = pb_conf_get("rbsconf");
|
---|
| 144 |
|
---|
| 145 | my $command = pb_check_req("rinse",0);
|
---|
| 146 | pb_system("$sudocmd $command --directory \"$vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}\" --arch \"$pbos->{'arch'}\" --distribution \"$pbos->{'name'}-$pbos->{'version'}\" --config \"$rbsconf->{$ENV{'PBPROJ'}}\" $b4post $postinstall $rbsopt $addpkgs $rinseverb","Creating the rinse VE for $pbos->{'name'}-$pbos->{'version'} ($pbos->{'arch'})", "verbose");
|
---|
| 147 | } elsif ($verpmstyle eq "rpmbootstrap") {
|
---|
| 148 | my $rbsverb = "";
|
---|
| 149 | foreach my $i (1..$pbdebug) {
|
---|
| 150 | $rbsverb .= " -v";
|
---|
| 151 | }
|
---|
| 152 | my $addpkgs = "";
|
---|
| 153 | my $postparam = "";
|
---|
| 154 | $postparam .= pb_distro_get_param($pbos,$osmindep);
|
---|
| 155 | if ($postparam eq "") {
|
---|
| 156 | $addpkgs = "";
|
---|
| 157 | } else {
|
---|
| 158 | $addpkgs = "-a $postparam";
|
---|
| 159 | }
|
---|
| 160 | my $command = pb_check_req("rpmbootstrap",0);
|
---|
| 161 | pb_system("$sudocmd $command $rbsopt $postinstall $addpkgs $pbos->{'name'}-$pbos->{'version'}-$pbos->{'arch'} $rbsverb","Creating the rpmbootstrap VE for $pbos->{'name'}-$pbos->{'version'} ($pbos->{'arch'})", "verbose");
|
---|
| 162 | } elsif ($verpmstyle eq "mock") {
|
---|
| 163 | my ($rbsconf) = pb_conf_get("rbsconf");
|
---|
| 164 | my $command = pb_check_req("mock",0);
|
---|
| 165 | pb_system("$sudocmd $command --init --resultdir=\"/tmp\" --configdir=\"$rbsconf->{$ENV{'PBPROJ'}}\" -r $v $rbsopt","Creating the mock VE for $pbos->{'name'}-$pbos->{'version'} ($pbos->{'arch'})");
|
---|
| 166 | # Once setup we need to install some packages, the pb account, ...
|
---|
| 167 | pb_system("$sudocmd $command --install --configdir=\"$rbsconf->{$ENV{'PBPROJ'}}\" -r $v su","Configuring the mock VE");
|
---|
| 168 | } else {
|
---|
| 169 | die "Unknown verpmtype type $verpmstyle. Report to dev team";
|
---|
| 170 | }
|
---|
| 171 | } elsif ($pbos->{'type'} eq "deb") {
|
---|
| 172 | my $vedebstyle = $vedebtype->{$ENV{'PBPROJ'}};
|
---|
| 173 |
|
---|
| 174 | my $codename = pb_distro_get_param($pbos,$oscodename);
|
---|
| 175 | my $postparam = "";
|
---|
| 176 | my $addpkgs;
|
---|
| 177 | $postparam .= pb_distro_get_param($pbos,$osmindep);
|
---|
| 178 | if ($postparam eq "") {
|
---|
| 179 | $addpkgs = "";
|
---|
| 180 | } else {
|
---|
| 181 | $addpkgs = "--include $postparam";
|
---|
| 182 | }
|
---|
| 183 | my $debmir = "";
|
---|
| 184 | $debmir .= pb_distro_get_param($pbos,$rbsmirrorsrv);
|
---|
| 185 |
|
---|
| 186 | # Get potential rbs option
|
---|
| 187 | my $rbsopt = "";
|
---|
| 188 | if (defined $rbsopt1) {
|
---|
| 189 | if (defined $rbsopt1->{$vedebstyle}) {
|
---|
| 190 | $rbsopt = $rbsopt1->{$vedebstyle};
|
---|
| 191 | } elsif (defined $rbsopt1->{$ENV{'PBPROJ'}}) {
|
---|
| 192 | $rbsopt = $rbsopt1->{$ENV{'PBPROJ'}};
|
---|
| 193 | } else {
|
---|
| 194 | $rbsopt = "";
|
---|
| 195 | }
|
---|
| 196 | }
|
---|
| 197 |
|
---|
| 198 | # debootstrap works with amd64 not x86_64
|
---|
| 199 | my $debarch = $pbos->{'arch'};
|
---|
| 200 | $debarch = "amd64" if ($pbos->{'arch'} eq "x86_64");
|
---|
| 201 | if ($vedebstyle eq "debootstrap") {
|
---|
| 202 | my $dbsverb = "";
|
---|
| 203 | $dbsverb = "--verbose" if ($pbdebug gt 0);
|
---|
| 204 |
|
---|
| 205 | # Some perl modules are in Universe on Ubuntu
|
---|
| 206 | $rbsopt .= " --components=main,universe" if ($pbos->{'name'} eq "ubuntu");
|
---|
| 207 |
|
---|
| 208 | pb_system("$sudocmd /usr/sbin/debootstrap $dbsverb $rbsopt --arch=$debarch $addpkgs $codename \"$vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}\" $debmir","Creating the debootstrap VE for $pbos->{'name'}-$pbos->{'version'} ($pbos->{'arch'})", "verbose");
|
---|
| 209 | # debootstrap doesn't create an /etc/hosts file
|
---|
| 210 | if (! -f "$vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}/etc/hosts" ) {
|
---|
| 211 | pb_system("$sudocmd cp /etc/hosts $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}/etc/hosts");
|
---|
| 212 | }
|
---|
| 213 | } else {
|
---|
| 214 | die "Unknown vedebtype type $vedebstyle. Report to dev team";
|
---|
| 215 | }
|
---|
| 216 | } elsif ($pbos->{'type'} eq "ebuild") {
|
---|
| 217 | die "Please teach the dev team how to build gentoo chroot";
|
---|
| 218 | } else {
|
---|
| 219 | die "Unknown distribution type $pbos->{'type'}. Report to dev team";
|
---|
| 220 | }
|
---|
| 221 | }
|
---|
| 222 |
|
---|
| 223 | # Fix modes to allow access to the VE for pb user
|
---|
| 224 | pb_system("$sudocmd chmod 755 $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'} $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'} $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}","Fixing permissions");
|
---|
| 225 |
|
---|
| 226 | # Test if an existing snapshot exists and use it if appropriate
|
---|
| 227 | # And also use it of no local extracted VE is present
|
---|
| 228 | if ((-f "$vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}-$pbos->{'version'}-$pbos->{'arch'}.tar.gz") &&
|
---|
| 229 | (((defined $vesnap->{$v}) && ($vesnap->{$v} =~ /true/i)) ||
|
---|
| 230 | ((defined $vesnap->{$ENV{'PBPROJ'}}) && ($vesnap->{$ENV{'PBPROJ'}} =~ /true/i)) ||
|
---|
| 231 | ($pbsnap eq 1) ||
|
---|
| 232 | (! -d "$vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}"))) {
|
---|
| 233 | pb_system("$sudocmd rm -rf $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'} ; $sudocmd mkdir -p $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'} ; $sudocmd tar xz -C $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'} -f $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}-$pbos->{'version'}-$pbos->{'arch'}.tar.gz","Extracting snapshot of $pbos->{'name'}-$pbos->{'version'}-$pbos->{'arch'}.tar.gz under $vepath->{$ENV{'PBPROJ'}}/$pbos->{'name'}/$pbos->{'version'}/$pbos->{'arch'}");
|
---|
| 234 | }
|
---|
| 235 | # Nothing more to do for VE. No real launch
|
---|
| 236 | } else {
|
---|
| 237 | die "VE of type $vetype not supported. Report to the dev team";
|
---|
| 238 | }
|
---|
| 239 | }
|
---|
| 240 |
|
---|
| 241 | #
|
---|
| 242 | # Return the postinstall line if needed
|
---|
| 243 | #
|
---|
| 244 |
|
---|
| 245 | sub pb_ve_get_postinstall {
|
---|
| 246 |
|
---|
| 247 | my $pbos = shift;
|
---|
| 248 | my $rbspi = shift;
|
---|
| 249 | my $vestyle = shift;
|
---|
| 250 | my $post = "";
|
---|
| 251 |
|
---|
| 252 | # Do we have a local post-install script
|
---|
| 253 | if ($vestyle eq "rinse") {
|
---|
| 254 | $post = "--post-install ";
|
---|
| 255 | } elsif ($vestyle eq "rpmbootstrap") {
|
---|
| 256 | $post = "-s ";
|
---|
| 257 | }
|
---|
| 258 |
|
---|
| 259 | my $postparam = pb_distro_get_param($pbos,$rbspi);
|
---|
| 260 | if ($postparam eq "") {
|
---|
| 261 | $post = "";
|
---|
| 262 | } else {
|
---|
| 263 | $post .= $postparam;
|
---|
| 264 | }
|
---|
| 265 | return($post);
|
---|
| 266 | }
|
---|
| 267 |
|
---|
| 268 |
|
---|
| 269 | =head1 WEB SITES
|
---|
| 270 |
|
---|
| 271 | The main Web site of the project is available at L<http://www.project-builder.org/>. Bug reports should be filled using the trac instance of the project at L<http://trac.project-builder.org/>.
|
---|
| 272 |
|
---|
| 273 | =head1 USER MAILING LIST
|
---|
| 274 |
|
---|
| 275 | None exists for the moment.
|
---|
| 276 |
|
---|
| 277 | =head1 AUTHORS
|
---|
| 278 |
|
---|
| 279 | The Project-Builder.org team L<http://trac.project-builder.org/> lead by Bruno Cornec L<mailto:bruno@project-builder.org>.
|
---|
| 280 |
|
---|
| 281 | =head1 COPYRIGHT
|
---|
| 282 |
|
---|
| 283 | Project-Builder.org is distributed under the GPL v2.0 license
|
---|
| 284 | described in the file C<COPYING> included with the distribution.
|
---|
| 285 |
|
---|
| 286 | =cut
|
---|
| 287 |
|
---|
| 288 |
|
---|
| 289 | 1;
|
---|