aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Iurt/Chroot.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Iurt/Chroot.pm')
-rw-r--r--lib/Iurt/Chroot.pm87
1 files changed, 38 insertions, 49 deletions
diff --git a/lib/Iurt/Chroot.pm b/lib/Iurt/Chroot.pm
index 1427aa3..8a2e04b 100644
--- a/lib/Iurt/Chroot.pm
+++ b/lib/Iurt/Chroot.pm
@@ -96,8 +96,12 @@ sub clean_and_build_chroot {
}
if ($run->{additional_media} && $run->{additional_media}{repository}) {
- _setup_additional_media($run, $config, $chroot) or return;
+ if (!_setup_additional_media($run, $config, $chroot)) {
+ _clean_mounts($run, $config, $chroot);
+ return;
+ }
}
+
1;
}
@@ -232,7 +236,7 @@ sub clean_all_chroot_tmp {
}
foreach (readdir($dir)) {
/$prefix/ or next;
- clean_chroot($run, $config, "$chroot_dir/$_");
+ clean_chroot("$chroot_dir/$_", $run, $config);
}
closedir $dir;
}
@@ -268,12 +272,13 @@ sub check_mounted {
}
sub check_chroot_need_update {
- my ($tmp_chroot, $run) = @_;
+ my ($tmp_chroot, $run, $config) = @_;
- my $tmp_urpmi = mktemp("$tmp_chroot/tmp.XXXXXX");
+ sudo($config, '--mkdir', "-m", 01777, "$tmp_chroot/tmp");
+ my $tmp_urpmi = mktemp("$tmp_chroot/tmp/tmp.XXXXXX");
mkdir_p("$tmp_urpmi/tmp");
my @installed_pkgs = grep { !/^gpg-pubkey/ } chomp_(cat_("$tmp_chroot/var/log/qa"));
- my @available_pkgs = chomp_(`urpmq --urpmi-root $tmp_urpmi --use-distrib $run->{urpmi}{distrib_url} --list -f 2>/dev/null`);
+ my @available_pkgs = chomp_(`urpmq --urpmi-root $tmp_urpmi --use-distrib $run->{urpmi}{distrib_url} --list -f`);
my @removed_pkgs = difference2(\@installed_pkgs, \@available_pkgs);
rm_rf($tmp_urpmi);
@@ -303,16 +308,6 @@ sub create_build_chroot {
$ret = create_build_chroot_tar($chroot, $chroot_ref, $run, $config);
}
- if ($ret) {
- my $urpmi = $run->{urpmi};
- if ($urpmi->{use__urpmi_root} && !$run->{chrooted_urpmi}) {
- if (!$urpmi->add_media__urpmi_root($chroot, $config->{base_media})) {
- plog('ERROR', "urpmi.addmedia --urpmi-root failed");
- return;
- }
- }
- }
-
if ($ret && $use_netns) {
sudo($config, '--netns_create', $chroot);
}
@@ -322,47 +317,44 @@ sub create_build_chroot {
sub create_build_chroot_tar {
my ($chroot, $chroot_tar, $run, $config) = @_;
- my $tmp_chroot = mktemp("$chroot.tmp.XXXXXX");
my $rebuild;
- my $clean = sub {
- plog("Remove temporary chroot");
- sudo($config, '--rm', '-r', $tmp_chroot);
- };
plog('NOTIFY', "creating chroot");
- mkdir_p($tmp_chroot);
if (!-f $chroot_tar) {
plog("rebuild chroot tarball");
$rebuild = 1;
} elsif (!$run->{fixed_media}) {
- plog('DEBUG', "decompressing /var/log/qa from $chroot_tar in $tmp_chroot");
- sudo($config, '--untar', $chroot_tar, $tmp_chroot, "./var/log/qa");
- $rebuild = check_chroot_need_update($tmp_chroot, $run);
+ my $tmp_chroot = mktemp("$chroot.tmp.XXXXXX");
+ sudo($config, "--mkdir", "-p", "$tmp_chroot");
+ plog('DEBUG', "decompressing /var/log/qa from $chroot_tar in $tmp_chroot");
+ sudo($config, '--untar', $chroot_tar, $tmp_chroot, "./var/log/qa");
+ $rebuild = check_chroot_need_update($tmp_chroot, $run, $config);
+ sudo($config, '--rm', '-r', $tmp_chroot);
}
+ sudo($config, '--rm', '-r', $chroot);
+ # Create this directory as root as it will be / of the chroot
+ sudo($config, "--mkdir", "-p", "$chroot");
if ($rebuild) {
- sudo($config, '--rm', '-r', $chroot);
- if (!build_chroot($run, $config, $tmp_chroot)) {
+ if (!build_chroot($run, $config, $chroot)) {
plog('NOTIFY', "creating chroot failed.");
- $clean->();
+ sudo($config, '--rm', '-r', $chroot);
return;
}
- sudo($config, "--tar", $chroot_tar, $tmp_chroot);
- # This rename may fail if for example tmp chroots are in another FS
- # This does not matter as it will then be rm + untar
- rename $tmp_chroot, $chroot;
- }
-
- if (!-d $chroot) {
- plog('DEBUG', "recreate chroot $chroot");
- plog('NOTIFY', "recreate chroot");
- mkdir_p $chroot;
+ plog('NOTIFY', "chroot recreated in $chroot");
+ my $tmp_tar = mktemp("$chroot_tar.tmp.XXXXXX");
+ sudo($config, "--tar", $chroot_tar, $chroot);
+ if (rename($tmp_tar, $chroot_tar)) {
+ plog('NOTIFY', "archive creation failed.");
+ unlink($tmp_tar);
+ return;
+ }
+ plog('NOTIFY', "chroot archived in $chroot_tar");
+ } else {
sudo($config, '--untar', $chroot_tar, $chroot);
- plog('NOTIFY', "chroot recreated in $chroot_tar (live in $chroot)");
+ plog('NOTIFY', "chroot recreated in $chroot (from $chroot_tar)");
}
-
- $clean->();
1;
}
@@ -373,7 +365,7 @@ sub create_build_chroot_btrfs {
plog('NOTIFY', "creating btrfs chroot");
# TODO: Handle $run{fixed_media}
- if (check_chroot_need_update($chroot_ref, $run)) {
+ if (check_chroot_need_update($chroot_ref, $run, $config)) {
sudo($config, '--btrfs_delete', $chroot_ref);
if (!sudo($config, '--btrfs_create', $chroot_ref)) {
plog('ERROR', "creating btrfs subvolume failed.");
@@ -408,16 +400,13 @@ sub build_chroot {
# install chroot
my $urpmi = $run->{urpmi}; # perl_checker: $urpmi = Iurt::Urpmi->new
- if ($urpmi->{use__urpmi_root}) {
- if (!$urpmi->add_media__urpmi_root($tmp_chroot, $config->{base_media})) {
- plog('ERROR', "urpmi.addmedia --urpmi-root failed");
- return 0;
- }
- $urpmi->set_command__urpmi_root($tmp_chroot);
- } else {
- $urpmi->set_command__use_distrib($tmp_chroot);
+ if (!$urpmi->add_media__urpmi_root($tmp_chroot, $config->{base_media})) {
+ plog('ERROR', "urpmi.addmedia --urpmi-root failed");
+ return 0;
}
+ $urpmi->set_command($tmp_chroot);
+
# (blino) install meta-task first for prefer.vendor.list to be used
foreach my $packages ([ 'meta-task' ], $config->{basesystem_packages}) {
if (!$urpmi->install_packages(