]> git.proxmox.com Git - dab.git/blobdiff - DAB.pm
constructor: factor out getting the target name
[dab.git] / DAB.pm
diff --git a/DAB.pm b/DAB.pm
index 4f54e4f01260fdbc79cefb840c622543576aedb9..b85d0a60a87ec7373a8c008c35573142f621cdb4 100644 (file)
--- a/DAB.pm
+++ b/DAB.pm
@@ -216,6 +216,14 @@ my $supported_suites = {
        ostype => "ubuntu-21.10",
        origin => 'ubuntu',
     },
+    'jammy' => {
+       ostype => "ubuntu-22.04",
+       origin => 'ubuntu',
+    },
+    'kinetic' => {
+       ostype => "ubuntu-22.10",
+       origin => 'ubuntu',
+    },
 };
 
 sub get_suite_info {
@@ -239,15 +247,12 @@ sub get_suite_info {
 
 sub download {
     my ($self, $url, $path) = @_;
+    my $tmpfn = "$path.tmp$$";
 
     $self->logmsg ("download: $url\n");
-    my $tmpfn = "$path.tmp$$";
-    eval {
-       $self->run_command ("wget -q '$url'  -O '$tmpfn'"); 
-    };
 
-    my $err = $@;
-    if ($err) {
+    eval { $self->run_command ("wget -q '$url'  -O '$tmpfn'") };
+    if (my $err = $@) {
        unlink $tmpfn;
        die $err;
     }
@@ -366,7 +371,7 @@ sub run_command {
     print $writer $input if defined $input;
     close $writer;
 
-    my $select = new IO::Select;
+    my $select = IO::Select->new();
     $select->add ($reader);
     $select->add ($error);
 
@@ -516,28 +521,34 @@ sub setup_usr_merge {
     }
 }
 
+sub get_target_name {
+    my ($config) = @_;
+
+    my $name = $config->{name} || die "no 'name' specified\n";
+    $name =~ m/^[a-z][0-9a-z\-\*\.]+$/ || die "illegal characters in name '$name'\n";
+
+    my ($version, $arch, $ostype) = $config->@{'version', 'architecture', 'ostype'};
+    $name = "${ostype}-${name}" if $name !~ m/^$ostype/;
+
+    return "${name}_${version}_${arch}"
+}
+
 sub new {
     my ($class, $config) = @_;
 
     $class = ref ($class) || $class;
-
-    my $self = {};
-
     $config = read_config ('dab.conf') if !$config;
 
-    $self->{config} = $config;
-
+    my $self = {
+       config => $config,
+    };
     bless $self, $class;
 
     $self->{logfile} = "logfile";
-    $self->{logfd} = IO::File->new (">>$self->{logfile}") ||
-       die "unable to open log file";
-
-    my $arch = $config->{architecture};
-    die "no 'architecture' specified\n" if !$arch;
+    $self->{logfd} = IO::File->new (">>$self->{logfile}") || die "unable to open log file";
 
-    die "unsupported architecture '$arch'\n" 
-       if $arch !~ m/^(i386|amd64)$/;
+    my $arch = $config->{architecture} || die "no 'architecture' specified\n";
+    die "unsupported architecture '$arch'\n" if $arch !~ m/^(i386|amd64)$/;
 
     my $suite = $config->{suite} || die "no 'suite' specified\n";
 
@@ -545,24 +556,13 @@ sub new {
     $suite = $suiteinfo->{suite};
     $config->{ostype} = $suiteinfo->{ostype};
 
-    my $name = $config->{name} || die "no 'name' specified\n";
-
-    $name =~ m/^[a-z][0-9a-z\-\*\.]+$/ || 
-       die "illegal characters in name '$name'\n";
-
-    my $version = $config->{version};
-    die "no 'version' specified\n" if !$version;
-    die "no 'section' specified\n" if !$config->{section};
-    die "no 'description' specified\n" if !$config->{headline};
-    die "no 'maintainer' specified\n" if !$config->{maintainer};
-
-    if ($name =~ m/^$config->{ostype}/) {
-       $self->{targetname} = "${name}_${version}_$config->{architecture}";
-    } else {
-       $self->{targetname} = "$config->{ostype}-${name}_" .
-           "${version}_$config->{architecture}";
+    # assert required dab.conf keys exist
+    for my $key (qw(version section headline maintainer)) {
+       die "no '$key' specified\n" if !$config->{$key};
     }
 
+    $self->{targetname} = get_target_name($config);
+
     if (!$config->{source}) {
        if (lc($suiteinfo->{origin}) eq 'debian') {
            if ($suite eq 'etch' || $suite eq 'lenny') {
@@ -570,10 +570,10 @@ sub new {
                    'http://ftp.debian.org/debian SUITE main contrib',
                    'http://security.debian.org SUITE/updates main contrib',
                );
-           } elsif ($suite eq 'bullseye' || $suite eq 'bookworm') {
+           } elsif ($suite =~ /^(?:bullseye|bookworm|trixie|forky)$/) {
                push @{$config->{source}}, (
-                   "http://ftp.debian.org/debian SUITE main contrib",
-                   "http://ftp.debian.org/debian SUITE-updates main contrib",
+                   "http://deb.debian.org/debian SUITE main contrib",
+                   "http://deb.debian.org/debian SUITE-updates main contrib",
                    "http://security.debian.org SUITE-security main contrib",
                );
            } else {
@@ -635,37 +635,33 @@ sub new {
            die "syntax error in mirror spezification '$m'\n";
        }
     }
-
     $self->{sources} = $sources;
-
     $self->{infodir} = "info";
 
-    $self->__allocate_ve ();
+    $self->__allocate_ve();
 
     $self->{cachedir} = ($config->{cachedir} || 'cache')  . "/$suite";;
 
     my $incl = [qw (less ssh openssh-server logrotate)];
+    my $excl = [qw (modutils reiserfsprogs ppp pppconfig pppoe pppoeconf nfs-common mtools ntp)];
 
-    my $excl = [qw (modutils reiserfsprogs ppp pppconfig pppoe
-                   pppoeconf nfs-common mtools ntp)];
-
-    # ubuntu has too many dependencies on udev, so
-    # we cannot exclude it (instead we disable udevd)
-
+    # ubuntu has too many dependencies on udev, so we cannot exclude it (instead we disable udevd)
     if (lc($suiteinfo->{origin}) eq 'ubuntu' && $suiteinfo->{flags}->{systemd}) {
        push @$incl, 'isc-dhcp-client';
-       push @$excl, qw(libmodule-build-perl);
+       push @$excl, qw(libmodule-build-perl libdrm-common libdrm2 libplymouth5 plymouth plymouth-theme-ubuntu-text powermgmt-base);
+       if ($suite eq 'jammy') {
+           push @$excl, qw(fuse); # avoid fuse2 <-> fuse3 conflict
+       }
     } elsif ($suite eq 'trusty') {
        push @$excl, qw(systemd systemd-services libpam-systemd libsystemd-daemon0 memtest86+);
    } elsif ($suite eq 'precise') {
        push @$excl, qw(systemd systemd-services libpam-systemd libsystemd-daemon0 memtest86+ ubuntu-standard);
     } elsif ($suite eq 'hardy') {
        push @$excl, qw(kbd);
-       push @$excl, qw(apparmor apparmor-utils ntfs-3g
-                       friendly-recovery);
+       push @$excl, qw(apparmor apparmor-utils ntfs-3g friendly-recovery);
     } elsif ($suite eq 'intrepid' || $suite eq 'jaunty') {
-       push @$excl, qw(apparmor apparmor-utils libapparmor1 libapparmor-perl 
-                       libntfs-3g28 ntfs-3g friendly-recovery);
+       push @$excl, qw(apparmor apparmor-utils libapparmor1 libapparmor-perl libntfs-3g28);
+       push @$excl, qw(ntfs-3g friendly-recovery);
     } elsif ($suite eq 'jessie') {
        push @$incl, 'sysvinit-core'; # avoid systemd and udev
        push @$incl, 'libperl4-corelibs-perl'; # to make lsof happy
@@ -847,14 +843,9 @@ sub finalize {
     $self->run_command ("lxc-stop -n $veid --rcfile $conffile --kill");
 
     unlink "$rootdir/sbin/defenv";
-
     unlink <$rootdir/root/dead.letter*>;
-
     unlink "$rootdir/var/log/init.log";
-
-    unlink "$rootdir/aquota.group";
-
-    unlink "$rootdir/aquota.user";
+    unlink "$rootdir/aquota.group", "$rootdir/aquota.user";
 
     write_file ("", "$rootdir/var/log/syslog");
 
@@ -882,9 +873,9 @@ sub finalize {
     my $compressor2cmd_map = {
        gz => 'gzip',
        gzip => 'gzip',
-       zst => 'zstd -9',
-       zstd => 'zstd -9',
-       'zstd-max' => 'zstd -19 -T0', # maximal level where the decompressor can still run efficiently
+       zst => 'zstd --rm -9',
+       zstd => 'zstd --rm -9',
+       'zstd-max' => 'zstd --rm -19 -T0', # maximal level where the decompressor can still run efficiently
     };
     my $compressor2ending = {
        gzip => 'gz',
@@ -918,11 +909,11 @@ sub read_installed {
 
     my $pkgfilelist = "$rootdir/var/lib/dpkg/status";
     local $/ = '';
-    open (PKGLST, "<$pkgfilelist") or die "unable to open '$pkgfilelist' - $!";
+    open(my $PKGLST, '<', $pkgfilelist) or die "unable to open '$pkgfilelist' - $!";
 
     my $pkglist = {};
 
-    while (my $rec = <PKGLST>) {
+    while (my $rec = <$PKGLST>) {
        chomp $rec;
        $rec =~ s/\n\s+/ /g;
        $rec .= "\n";
@@ -942,7 +933,7 @@ sub read_installed {
        }
     }
 
-    close (PKGLST);    
+    close ($PKGLST);
 
     return $pkglist;
 }
@@ -1119,17 +1110,16 @@ sub __parse_packages {
     my ($pkginfo, $filename, $src) = @_;
 
     local $/ = '';
-    open (PKGLST, "<$filename") ||
-       die "unable to open '$filename'";
+    open(my $PKGLST, '<', $filename) or die "unable to open '$filename' - $!";
 
-    while (my $rec = <PKGLST>) {
+    while (my $rec = <$PKGLST>) {
        $rec =~ s/\n\s+/ /g;
        chomp $rec;
        $rec .= "\n";
 
        my $res = {};
 
-       while ($rec =~ s/^([^:]+):\s+(.*)\s*\n//) {
+       while ($rec =~ s/^([^:]+):\s+(.*?)\s*\n//) {
            $res->{lc $1} = $2;
        }
 
@@ -1151,7 +1141,7 @@ sub __parse_packages {
        }
     }
 
-    close (PKGLST);    
+    close ($PKGLST);
 }
 
 sub pkginfo {
@@ -1893,15 +1883,35 @@ sub task_php {
 
     my $memlimit = $opts->{memlimit};
     my $rootdir = $self->{rootfs};
+    my $suite = $self->{config}->{suite};
 
-    my $required = $self->compute_required([qw(php php-cli libapache2-mod-php php-gd)]);
+    my $base_set = [qw(php-cli libapache2-mod-php php-gd)];
+    if ($suite =~ /(?:squeeze|wheezy|jessie)$/) {
+       $self->logmsg("WARN: using EOL php release on EOL suite");
+       $base_set = [qw(php5 php5-cli libapache2-mod-php5 php5-gd)];
+    }
+    my $required = $self->compute_required($base_set);
 
     $self->cache_packages ($required);
 
     $self->ve_dpkg ('install', @$required);
 
     if ($memlimit) {
-       $self->run_command ("sed -e 's/^\\s*memory_limit\\s*=.*;/memory_limit = ${memlimit}M;/' -i $rootdir/etc/php5/apache2/php.ini");
+       my $sed_cmd = ['sed', '-e', "s/^\\s*memory_limit\\s*=.*;/memory_limit = ${memlimit}M;/", '-i'];
+       if ($suite =~ /(?:squeeze|wheezy|jessie)$/) {
+           push @$sed_cmd, "$rootdir/etc/php5/apache2/php.ini";
+       } else {
+           my $found = 0;
+           for my $fn (glob("'${rootdir}/etc/php/*/apache2/php.ini'")) {
+               push @$sed_cmd, "$rootdir/$fn";
+               $found = 1;
+           }
+           if (!$found) {
+               warn "WARN: did not found any php.ini to set the memlimit!\n";
+               return;
+           }
+       }
+       $self->run_command($sed_cmd);
     }
 }
 
@@ -1909,7 +1919,7 @@ sub install {
     my ($self, $pkglist, $unpack) = @_;
 
     my $required = $self->compute_required ($pkglist);
-    
+
     $self->cache_packages ($required);
 
     $self->ve_dpkg ($unpack ? 'unpack' : 'install', @$required);