]> git.proxmox.com Git - pve-manager.git/commitdiff
pve7to8: sync over from stable-7 branch
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 3 Jul 2023 11:19:13 +0000 (13:19 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 3 Jul 2023 11:19:13 +0000 (13:19 +0200)
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
PVE/CLI/pve7to8.pm

index 2cb486029ff96df81bb7ce23ba4b0fadeb3f65a2..c7d3f19c132c4f7cdcc147ed18463931ae1c76ab 100644 (file)
@@ -44,6 +44,14 @@ sub setup_environment {
     PVE::RPCEnvironment->setup_default_cli_env();
 }
 
+my $new_suite = 'bookworm';
+my $old_suite = 'bullseye';
+my $older_suites = {
+    buster => 1,
+    stretch => 1,
+    jessie => 1,
+};
+
 my ($min_pve_major, $min_pve_minor, $min_pve_pkgrel) = (7, 4, 1);
 
 my $ceph_release2code = {
@@ -64,41 +72,38 @@ my $forced_legacy_cgroup = 0;
 my $counters = {
     pass => 0,
     skip => 0,
+    notice => 0,
     warn => 0,
     fail => 0,
 };
 
+my $level2color = {
+    pass => 'green',
+    notice => 'bold',
+    warn => 'yellow',
+    fail => 'bold red',
+};
+
 my $log_line = sub {
     my ($level, $line) = @_;
 
     $counters->{$level}++ if defined($level) && defined($counters->{$level});
 
+    my $color = $level2color->{$level} // '';
+    print color($color) if $color && $color ne '';
+
     print uc($level), ': ' if defined($level);
     print "$line\n";
-};
 
-sub log_pass {
-    print color('green');
-    $log_line->('pass', @_);
     print color('reset');
-}
+};
 
-sub log_info {
-    $log_line->('info', @_);
-}
-sub log_skip {
-    $log_line->('skip', @_);
-}
-sub log_warn {
-    print color('yellow');
-    $log_line->('warn', @_);
-    print color('reset');
-}
-sub log_fail {
-    print color('bold red');
-    $log_line->('fail', @_);
-    print color('reset');
-}
+sub log_pass { $log_line->('pass', @_); }
+sub log_info { $log_line->('info', @_); }
+sub log_skip { $log_line->('skip', @_); }
+sub log_notice { $log_line->('notice', @_); }
+sub log_warn { $log_line->('warn', @_);  }
+sub log_fail { $log_line->('fail', @_); }
 
 my $print_header_first = 1;
 sub print_header {
@@ -543,8 +548,7 @@ sub check_ceph {
            log_warn("unable to determine overall Ceph daemon versions!");
        } elsif (keys %$overall_versions == 1) {
            log_pass("single running overall version detected for all Ceph daemon types.");
-           # TODO: needs to be set to 1 in the stable branch each time! - find better solution?
-           $noout_wanted = 0; # off post-upgrade, on pre-upgrade
+           $noout_wanted = 1; # off post-upgrade, on pre-upgrade
        } elsif (keys $ceph_versions_simple->{overall}->%* != 1) {
            log_warn("overall version mismatch detected, check 'ceph versions' output for details!");
        }
@@ -1168,6 +1172,9 @@ sub check_apt_repos {
 
     # TODO: check that (original) debian and Proxmox VE mirrors are present.
 
+    my ($found_suite, $found_suite_where);
+    my ($mismatches, $strange_suites);
+
     my $check_file = sub {
        my ($file) = @_;
 
@@ -1188,23 +1195,32 @@ sub check_apt_repos {
            next if $line !~ m/^deb[[:space:]]/; # is case sensitive
 
            my $suite;
-
-           # catch any of
-           # https://deb.debian.org/debian-security
-           # http://security.debian.org/debian-security
-           # http://security.debian.org/
-           if ($line =~ m|https?://deb\.debian\.org/debian-security/?\s+(\S*)|i) {
-               $suite = $1;
-           } elsif ($line =~ m|https?://security\.debian\.org(?:.*?)\s+(\S*)|i) {
+           if ($line =~ m|deb\s+\w+://\S+\s+(\S*)|i) {
                $suite = $1;
            } else {
                next;
            }
+           my $where = "in ${file}:${number}";
 
-           $found = 1;
+           $suite =~ s/-(?:(?:proposed-)?updates|backports|debug|security)(?:-debug)?$//;
+           if ($suite ne $old_suite && $suite ne $new_suite && !$older_suites->{$suite}) {
+               push $strange_suites->@*, { suite => $suite, where => $where };
+               next;
+           }
 
-           my $where = "in ${file}:${number}";
-           # TODO: is this useful (for some other checks)?
+           if (!defined($found_suite)) {
+               $found_suite = $suite;
+               $found_suite_where = $where;
+           } elsif ($suite ne $found_suite) {
+               if (!defined($mismatches)) {
+                   $mismatches = [];
+                   push $mismatches->@*,
+                       { suite => $found_suite, where => $found_suite_where},
+                       { suite => $suite, where => $where};
+               } else {
+                   push $mismatches->@*, { suite => $suite, where => $where};
+               }
+           }
        }
     };
 
@@ -1214,10 +1230,28 @@ sub check_apt_repos {
 
     PVE::Tools::dir_glob_foreach($dir, '^.*\.list$', $check_file);
 
-    if (!$found) {
-       # only warn, it might be defined in a .sources file or in a way not caaught above
-       log_warn("No Debian security repository detected in /etc/apt/sources.list and " .
-           "/etc/apt/sources.list.d/*.list");
+    if ($strange_suites) {
+       my @strange_list = map { "found suite $_->{suite} at $_->{where}" } $strange_suites->@*;
+       log_notice(
+           "found unusual suites that are neither old '$old_suite' nor new '$new_suite':"
+           ."\n    " . join("\n    ", @strange_list)
+           ."\n  Please ensure these repositories are shipping compatible packages for the upgrade!"
+       );
+    }
+    if (defined($mismatches)) {
+       my @mismatch_list = map { "found suite $_->{suite} at $_->{where}" } $mismatches->@*;
+
+       log_fail(
+           "Found mixed old and new package repository suites, fix before upgrading! Mismatches:"
+           ."\n    " . join("\n    ", @mismatch_list)
+           ."\n  Configure the same base-suite for all Proxmox and Debian provided repos and ask"
+           ." original vendor for any third-party repos."
+           ."\n  E.g., for the upgrade to Proxmox VE ".($min_pve_major + 1)." use the '$new_suite' suite."
+       );
+    } elsif (defined($strange_suites)) {
+       log_notice("found no suite mismatches, but found at least one strange suite");
+    } else {
+       log_pass("found no suite mismatch");
     }
 }