X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=DAB.pm;h=dafae9fd11823d50cd90ab1a8832dccf1108ad6e;hb=b5583827a5dac915c61fcc539c15b20a380b0b29;hp=9cd9bf7ecf7b2b0b61b02a4a818f684cbe714d93;hpb=dcc99599567f69b5d7205cf9ec0860f752f1e423;p=dab.git diff --git a/DAB.pm b/DAB.pm index 9cd9bf7..dafae9f 100644 --- a/DAB.pm +++ b/DAB.pm @@ -9,6 +9,8 @@ use IO::Select; use IPC::Open2; use IPC::Open3; use POSIX qw (LONG_MAX); +use UUID; +use Cwd; # fixme: lock container ? @@ -228,73 +230,22 @@ sub writelog { } sub __sample_config { - my ($self, $mem) = @_; - - my $max = LONG_MAX; - my $nolimit = "\"$max:$max\""; - - my $defaults = { - 128 => {}, - 256 => {}, - 512 => {}, - 1024 => {}, - 2048 => {}, - }; - - die "unknown memory size" if !defined ($defaults->{$mem}); + my ($self) = @_; my $data = ''; + my $arch = $self->{config}->{architecture}; - $data .= "# DAB default config for ${mem}MB RAM\n\n"; - - $data .= "ONBOOT=\"no\"\n"; - - $data .= "\n# Primary parameters\n"; - $data .= "NUMPROC=\"1024:1024\"\n"; - $data .= "NUMTCPSOCK=$nolimit\n"; - $data .= "NUMOTHERSOCK=$nolimit\n"; - - my $vmguarpages = int ($mem*1024/4); - $data .= "VMGUARPAGES=\"$vmguarpages:$max\"\n"; - - $data .= "\n# Secondary parameters\n"; - - $data .= "KMEMSIZE=$nolimit\n"; - - my $privmax = int ($vmguarpages*1.1); - $privmax = $vmguarpages + 12500 if ($privmax-$vmguarpages) > 12500; - $data .= "OOMGUARPAGES=\"$vmguarpages:$max\"\n"; - $data .= "PRIVVMPAGES=\"$vmguarpages:$privmax\"\n"; - - $data .= "TCPSNDBUF=$nolimit\n"; - $data .= "TCPRCVBUF=$nolimit\n"; - $data .= "OTHERSOCKBUF=$nolimit\n"; - $data .= "DGRAMRCVBUF=$nolimit\n"; - - $data .= "\n# Auxiliary parameters\n"; - $data .= "NUMFILE=$nolimit\n"; - $data .= "NUMFLOCK=$nolimit\n"; - $data .= "NUMPTY=\"255:255\"\n"; - $data .= "NUMSIGINFO=\"1024:1024\"\n"; - $data .= "DCACHESIZE=$nolimit\n"; - $data .= "LOCKEDPAGES=$nolimit\n"; - $data .= "SHMPAGES=$nolimit\n"; - $data .= "NUMIPTENT=$nolimit\n"; - $data .= "PHYSPAGES=\"0:$max\"\n"; - - $data .= "\n# Disk quota parameters\n"; - $data .= "DISK_QUOTA=\"no\"\n"; - $data .= "DISKSPACE=$nolimit\n"; - $data .= "DISKINODES=$nolimit\n"; - $data .= "QUOTATIME=\"0\"\n"; - $data .= "QUOTAUGIDLIMIT=\"0\"\n"; - - $data .= "\n# CPU fair sheduler parameter\n"; - $data .= "CPUUNITS=\"1000\"\n\n"; + my $ostype = $self->{config}->{ostype}; - $data .= "\n# Template parameter\n"; - $data .= "OSTEMPLATE=\"$self->{targetname}\"\n"; - $data .= "HOSTNAME=\"localhost\"\n"; + if ($ostype =~ m/^de(bi|vu)an-/) { + $data .= "lxc.include = /usr/share/lxc/config/debian.common.conf\n"; + } elsif ($ostype =~ m/^ubuntu-/) { + $data .= "lxc.include = /usr/share/lxc/config/ubuntu.common.conf\n"; + } else { + die "unknown os type '$ostype'\n"; + } + $data .= "lxc.utsname = localhost\n"; + $data .= "lxc.rootfs = $self->{rootfs}\n"; return $data; } @@ -309,48 +260,39 @@ sub __allocate_ve { close ($fd); } - my $cfgdir = "/etc/pve/openvz"; + + $self->{working_dir} = getcwd; + $self->{veconffile} = "$self->{working_dir}/config"; + $self->{rootfs} = "$self->{working_dir}/rootfs"; if ($cid) { $self->{veid} = $cid; - $self->{veconffile} = "$cfgdir/$cid.conf"; return $cid; } - my $cdata = $self->__sample_config (1024); - - my $veid; - my $startid = 90000; - for (my $id = $startid; $id < ($startid + 100); $id++) { - - my $tmpfn = "$cfgdir/$id.conf.tmp$$"; - my $target = "$cfgdir/$id.conf"; - - next if -f $target; - - my $fh = IO::File->new ($target, O_WRONLY | O_CREAT | O_EXCL, 0644); - - next if !$fh; - - print $fh $cdata; - close ($fh); - $veid = $id; - last; - } - - die "unable to allocate VE\n" if !$veid; + my $uuid; + my $uuid_str; + UUID::generate($uuid); + UUID::unparse($uuid, $uuid_str); + $self->{veid} = $uuid_str; my $fd = IO::File->new (">.veid") || die "unable to write '.veid'\n"; - print $fd "$veid\n"; + print $fd "$self->{veid}\n"; close ($fd); - $self->logmsg ("allocated VE $veid\n"); + my $cdata = $self->__sample_config(); + + my $fh = IO::File->new ($self->{veconffile}, O_WRONLY|O_CREAT|O_EXCL) || + die "unable to write lxc config file '$self->{veconffile}' - $!"; + print $fh $cdata; + close ($fh); + + mkdir $self->{rootfs} || die "unable to create rootfs - $!"; - $self->{veid} = $veid; - $self->{veconffile} = "$cfgdir/$veid.conf"; + $self->logmsg ("allocated VE $self->{veid}\n"); - return $veid; + return $self->{veid}; } sub new { @@ -377,7 +319,9 @@ sub new { if $arch !~ m/^(i386|amd64)$/; my $suite = $config->{suite} || die "no 'suite' specified\n"; - if ($suite eq 'jessie') { + if ($suite eq 'stretch') { + $config->{ostype} = "debian-9.0"; + } elsif ($suite eq 'jessie') { $config->{ostype} = "debian-8.0"; } elsif ($suite eq 'wheezy') { $config->{ostype} = "debian-7.0"; @@ -387,12 +331,34 @@ sub new { $config->{ostype} = "debian-5.0"; } elsif ($suite eq 'etch') { $config->{ostype} = "debian-4.0"; + } elsif ($suite eq 'devuan-jessie') { + $suite = 'jessie'; + $config->{ostype} = "devuan-1.0"; + } elsif ($suite eq 'devuan-ascii' || 'ascii') { + $suite = 'ascii'; + $config->{ostype} = "devuan-2.0"; } elsif ($suite eq 'hardy') { $config->{ostype} = "ubuntu-8.04"; } elsif ($suite eq 'intrepid') { $config->{ostype} = "ubuntu-8.10"; } elsif ($suite eq 'jaunty') { $config->{ostype} = "ubuntu-9.04"; + } elsif ($suite eq 'precise') { + $config->{ostype} = "ubuntu-12.04"; + } elsif ($suite eq 'trusty') { + $config->{ostype} = "ubuntu-14.04"; + } elsif ($suite eq 'vivid') { + $config->{ostype} = "ubuntu-15.04"; + } elsif ($suite eq 'wily') { + $config->{ostype} = "ubuntu-15.10"; + } elsif ($suite eq 'xenial') { + $config->{ostype} = "ubuntu-16.04"; + } elsif ($suite eq 'yakkety') { + $config->{ostype} = "ubuntu-16.10"; + } elsif ($suite eq 'zesty') { + $config->{ostype} = "ubuntu-17.04"; + } elsif ($suite eq 'artful') { + $config->{ostype} = "ubuntu-17.10"; } else { die "unsupported debian suite '$suite'\n"; } @@ -416,17 +382,24 @@ sub new { } if (!$config->{source}) { - if ($suite eq 'etch' || $suite eq 'lenny' || $suite eq 'squeeze' || - $suite eq 'wheezy' || $suite eq 'jessie' ) { + if ($suite eq 'etch' || $suite eq 'lenny') { push @{$config->{source}}, "http://ftp.debian.org/debian SUITE main contrib"; - push @{$config->{source}}, "http://ftp.debian.org/debian SUITE-updates main contrib" - if ($suite eq 'squeeze' || $suite eq 'wheezy' || $suite eq 'jessie'); push @{$config->{source}}, "http://security.debian.org SUITE/updates main contrib"; - } elsif ($suite eq 'hardy' || $suite eq 'intrepid' || $suite eq 'jaunty') { + } elsif ($suite eq 'squeeze' || $suite eq 'wheezy' || + $suite eq 'jessie' || $suite eq 'stretch' ) { + push @{$config->{source}}, "http://ftp.debian.org/debian SUITE main contrib"; + push @{$config->{source}}, "http://ftp.debian.org/debian SUITE-updates main contrib"; + push @{$config->{source}}, "http://security.debian.org SUITE/updates main contrib"; + } elsif ($suite eq 'hardy' || $suite eq 'intrepid' || $suite eq 'jaunty' || + $suite eq 'xenial' || $suite eq 'wily' || $suite eq 'vivid' || + $suite eq 'trusty' || $suite eq 'precise' || $suite eq 'yakkety' || + $suite eq 'zesty' || $suite eq 'artful' ) { my $comp = "main restricted universe multiverse"; push @{$config->{source}}, "http://archive.ubuntu.com/ubuntu SUITE $comp"; push @{$config->{source}}, "http://archive.ubuntu.com/ubuntu SUITE-updates $comp"; push @{$config->{source}}, "http://archive.ubuntu.com/ubuntu SUITE-security $comp"; + } else { + die "implement me"; } } @@ -486,7 +459,16 @@ sub new { # ubuntu has too many dependencies on udev, so # we cannot exclude it (instead we disable udevd) - if ($suite eq 'hardy') { + + if ($suite eq 'vivid' || $suite eq 'wily' || $suite eq 'xenial' || + $suite eq 'yakkety' || $suite eq 'zesty' || $suite eq 'artful') { + push @$incl, 'isc-dhcp-client'; + push @$excl, qw(libmodule-build-perl); + } 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); @@ -498,6 +480,9 @@ sub new { push @$incl, 'libperl4-corelibs-perl'; # to make lsof happy push @$excl, qw(systemd systemd-sysv udev module-init-tools pciutils hdparm memtest86+ parted); + } elsif ($suite eq 'stretch') { + push @$excl, qw(module-init-tools pciutils hdparm + memtest86+ parted); } else { push @$excl, qw(udev module-init-tools pciutils hdparm memtest86+ parted); @@ -555,7 +540,7 @@ sub write_config { $data .= "Name: $config->{name}\n"; $data .= "Version: $config->{version}\n"; - $data .= "Type: openvz\n"; + $data .= "Type: lxc\n"; $data .= "OS: $config->{ostype}\n"; $data .= "Section: $config->{section}\n"; $data .= "Maintainer: $config->{maintainer}\n"; @@ -584,7 +569,8 @@ sub finalize { my $instpkgs = $self->read_installed (); my $pkginfo = $self->pkginfo(); my $veid = $self->{veid}; - my $rootdir = $self->vz_root_dir(); + my $conffile = $self->{veconffile}; + my $rootdir = $self->{rootfs}; my $vestat = $self->ve_status(); die "ve not running - unable to finalize\n" if !$vestat->{running}; @@ -649,8 +635,7 @@ sub finalize { $self->ve_divert_remove ("/sbin/init"); # finally stop the VE - $self->run_command ("vzctl stop $veid --fast"); - $rootdir = $self->vz_priv_dir(); + $self->run_command ("lxc-stop -n $veid --rcfile $conffile --kill"); unlink "$rootdir/sbin/defenv"; @@ -691,7 +676,7 @@ sub finalize { sub read_installed { my ($self) = @_; - my $rootdir = $self->vz_priv_dir(); + my $rootdir = $self->{rootfs}; my $pkgfilelist = "$rootdir/var/lib/dpkg/status"; local $/ = ''; @@ -725,51 +710,45 @@ sub read_installed { return $pkglist; } -sub vz_root_dir { +sub ve_status { my ($self) = @_; my $veid = $self->{veid}; - return "/var/lib/vz/root/$veid"; -} - -sub vz_priv_dir { - my ($self) = @_; + my $res = { running => 0 }; - my $veid = $self->{veid}; + $res->{exist} = 1 if -d "$self->{rootfs}/usr"; - return "/var/lib/vz/private/$veid"; -} + my $filename = "/proc/net/unix"; -sub ve_status { - my ($self) = @_; + # similar test is used by lcxcontainers.c: list_active_containers + my $fh = IO::File->new ($filename, "r"); + return $res if !$fh; - my $veid = $self->{veid}; - - my $res = $self->run_command ("vzctl status $veid", undef, 1); - chomp $res; - - if ($res =~ m/^CTID\s+$veid\s+(exist|deleted)\s+(mounted|unmounted)\s+(running|down)$/) { - return { - exist => $1 eq 'exist', - mounted => $2 eq 'mounted', - running => $3 eq 'running', - }; - } else { - die "unable to parse ve status"; + while (defined(my $line = <$fh>)) { + if ($line =~ m/^[a-f0-9]+:\s\S+\s\S+\s\S+\s\S+\s\S+\s\d+\s(\S+)$/) { + my $path = $1; + if ($path =~ m!^@/\S+/$veid/command$!) { + $res->{running} = 1; + } + } } + close($fh); + + return $res; } sub ve_command { my ($self, $cmd, $input) = @_; my $veid = $self->{veid}; + my $conffile = $self->{veconffile}; if (ref ($cmd) eq 'ARRAY') { - unshift @$cmd, 'vzctl', 'exec2', $veid, 'defenv'; + unshift @$cmd, 'lxc-attach', '-n', $veid, '--rcfile', $conffile, '--clear-env', '--', 'defenv'; $self->run_command ($cmd, $input); } else { - $self->run_command ("vzctl exec2 $veid defenv $cmd", $input); + $self->run_command ("lxc-attach -n $veid --rcfile $conffile --clear-env -- defenv $cmd", $input); } } @@ -778,9 +757,10 @@ sub ve_exec { my ($self, @cmd) = @_; my $veid = $self->{veid}; + my $conffile = $self->{veconffile}; my $reader; - my $pid = open2($reader, "<&STDIN", 'vzctl', 'exec2', $veid, + my $pid = open2($reader, "<&STDIN", 'lxc-attach', '-n', $veid, '--rcfile', $conffile, '--', 'defenv', @cmd) || die "unable to exec command"; while (defined (my $line = <$reader>)) { @@ -802,7 +782,7 @@ sub ve_divert_add { sub ve_divert_remove { my ($self, $filename) = @_; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; unlink "$rootdir/$filename"; $self->ve_command ("dpkg-divert --remove --rename '$filename'"); @@ -811,7 +791,7 @@ sub ve_divert_remove { sub ve_debconfig_set { my ($self, $dcdata) = @_; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $cfgfile = "/tmp/debconf.txt"; write_file ($dcdata, "$rootdir/$cfgfile"); $self->ve_command ("debconf-set-selections $cfgfile"); @@ -831,7 +811,7 @@ sub ve_dpkg { my $pkginfo = $self->pkginfo(); - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $cachedir = $self->{cachedir}; my @files; @@ -860,48 +840,32 @@ sub ve_destroy { my ($self) = @_; my $veid = $self->{veid}; # fixme + my $conffile = $self->{veconffile}; my $vestat = $self->ve_status(); if ($vestat->{running}) { - $self->run_command ("vzctl stop $veid --fast"); - } elsif ($vestat->{mounted}) { - $self->run_command ("vzctl umount $veid"); - } - if ($vestat->{exist}) { - $self->run_command ("vzctl destroy $veid"); - } else { - unlink $self->{veconffile}; + $self->run_command ("lxc-stop -n $veid --rcfile $conffile --kill"); } + + rmtree $self->{rootfs}; + unlink $self->{veconffile}; } sub ve_init { my ($self) = @_; - my $root = $self->vz_root_dir(); - my $priv = $self->vz_priv_dir(); - - my $veid = $self->{veid}; # fixme + my $veid = $self->{veid}; + my $conffile = $self->{veconffile}; $self->logmsg ("initialize VE $veid\n"); - while (1) { - my $vestat = $self->ve_status(); - if ($vestat->{running}) { - $self->run_command ("vzctl stop $veid --fast"); - } elsif ($vestat->{mounted}) { - $self->run_command ("vzctl umount $veid"); - } else { - last; - } - sleep (1); - } - - rmtree $root; - rmtree $priv; - mkpath $root; - mkpath $priv; + my $vestat = $self->ve_status(); + if ($vestat->{running}) { + $self->run_command ("lxc-stop -n $veid --rcfile $conffile --kill"); + } - $self->run_command ("vzctl mount $veid"); + rmtree $self->{rootfs}; + mkpath $self->{rootfs}; } sub __deb_version_cmp { @@ -1062,18 +1026,19 @@ sub closure { # first, record provided packages __record_provides ($pkginfo, $closure, $list, 1); - my $pkgs = {}; + my $pkghash = {}; + my $pkglist = []; # then resolve dependencies foreach my $pname (@$list) { - __closure_single ($pkginfo, $closure, $pkgs, $pname, $self->{excl}); + __closure_single ($pkginfo, $closure, $pkghash, $pkglist, $pname, $self->{excl}); } - return [ keys %$pkgs ]; + return $pkglist; } sub __closure_single { - my ($pkginfo, $closure, $pkgs, $pname, $excl) = @_; + my ($pkginfo, $closure, $pkghash, $pkglist, $pname, $excl) = @_; $pname =~ s/^\s+//; $pname =~ s/\s+$//; @@ -1090,8 +1055,11 @@ sub __closure_single { my $url = $info->{url}; $url || die "$pname: no url for package '$pname'"; - - $pkgs->{$pname} = 1; + + if (!$pkghash->{$pname}) { + unshift @$pkglist, $pname; + $pkghash->{$pname} = 1; + } __record_provides ($pkginfo, $closure, [$pname]) if $info->{provides}; @@ -1127,7 +1095,7 @@ sub __closure_single { #printf (STDERR "$pname: $p --> $found\n"); - __closure_single ($pkginfo, $closure, $pkgs, $found, $excl); + __closure_single ($pkginfo, $closure, $pkghash, $pkglist, $found, $excl); } } @@ -1168,7 +1136,7 @@ sub install_init_script { my ($self, $script, $runlevel, $prio) = @_; my $suite = $self->{config}->{suite}; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $base = basename ($script); my $target = "$rootdir/etc/init.d/$base"; @@ -1176,6 +1144,11 @@ sub install_init_script { $self->run_command ("install -m 0755 '$script' '$target'"); if ($suite eq 'etch' || $suite eq 'lenny') { $self->ve_command ("update-rc.d $base start $prio $runlevel ."); + } elsif ($suite eq 'xenial' || $suite eq 'wily' || $suite eq 'vivid' || + $suite eq 'yakkety' || $suite eq 'zesty' || $suite eq 'artful') { + die "unable to install init script (system uses systemd)\n"; + } elsif ($suite eq 'trusty' || $suite eq 'precise') { + die "unable to install init script (system uses upstart)\n"; } else { $self->ve_command ("insserv $base"); } @@ -1200,7 +1173,7 @@ sub bootstrap { push @$important, "postfix"; } - foreach my $p (keys %$pkginfo) { + foreach my $p (sort keys %$pkginfo) { next if grep { $p eq $_ } @{$self->{excl}}; my $pri = $pkginfo->{$p}->{priority}; next if !$pri; @@ -1251,7 +1224,7 @@ sub bootstrap { $self->cache_packages ($important); $self->cache_packages ($standard); - my $rootdir = $self->vz_priv_dir(); + my $rootdir = $self->{rootfs}; # extract required packages first $self->logmsg ("create basic environment\n"); @@ -1291,8 +1264,14 @@ sub bootstrap { # avoid warnings about non-existent resolv.conf write_file ("", "$rootdir/etc/resolv.conf", 0644); - $data = "auto lo\niface lo inet loopback\n"; - write_file ($data, "$rootdir/etc/network/interfaces", 0644); + if ($suite eq 'artful' || $suite eq 'zesty' || $suite eq 'yakkety' || + $suite eq 'xenial' || $suite eq 'wily') { + # no need to configure loopback device + } else { + $data = "auto lo\niface lo inet loopback\n"; + mkdir "$rootdir/etc/network"; + write_file ($data, "$rootdir/etc/network/interfaces", 0644); + } # setup devices $self->run_command ("tar xzf '$devicetar' -C '$rootdir'"); @@ -1306,8 +1285,7 @@ sub bootstrap { $self->run_command ("cp '$default_env' '$rootdir/sbin/defenv'"); - $self->run_command ("vzctl start $veid"); - $rootdir = $self->vz_root_dir(); + $self->run_command ("lxc-start -n $veid -f $self->{veconffile}"); $self->logmsg ("initialize ld cache\n"); $self->ve_command ("/sbin/ldconfig"); @@ -1330,7 +1308,7 @@ sub bootstrap { $self->ve_dpkg ('install', 'mawk'); $self->ve_dpkg ('install', 'debconf'); - + # unpack required packages foreach my $p (@$required) { $self->ve_dpkg ('unpack', $p); @@ -1388,7 +1366,11 @@ EOD } # start loopback - $self->ve_command ("ifconfig lo up"); + if (-x "$rootdir/sbin/ifconfig") { + $self->ve_command ("ifconfig lo up"); + } else { + $self->ve_command ("ip link set lo up"); + } $self->logmsg ("configure important packages\n"); $self->ve_command ("dpkg --force-confold --skip-same-version --configure -a"); @@ -1408,9 +1390,6 @@ EOD # reset password $self->ve_command ("usermod -L root"); - # regenerate sshd host keys - $self->install_init_script ($script_ssh_init, 2, 14); - if ($mta eq 'postfix') { $data = "postfix postfix/main_mailer_type select No configuration\n"; $self->ve_debconfig_set ($data); @@ -1487,6 +1466,7 @@ sub enter { my ($self) = @_; my $veid = $self->{veid}; + my $conffile = $self->{veconffile}; my $vestat = $self->ve_status(); @@ -1496,10 +1476,10 @@ sub enter { } if (!$vestat->{running}) { - $self->run_command ("vzctl start $veid"); + $self->run_command ("lxc-start -n $veid -f $conffile"); } - system ("vzctl enter $veid"); + system ("lxc-attach -n $veid --rcfile $conffile --clear-env"); } sub ve_mysql_command { @@ -1519,7 +1499,7 @@ sub ve_mysql_bootstrap { my $suite = $self->{config}->{suite}; if ($suite eq 'jessie') { - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; $self->run_command ("sed -e 's/^key_buffer\\s*=/key_buffer_size =/' -i $rootdir/etc/mysql/my.cnf"); } @@ -1566,6 +1546,9 @@ sub task_postgres { } elsif ($suite eq 'jessie') { @supp = ('9.4'); $pgversion = '9.4'; + } elsif ($suite eq 'stretch') { + @supp = ('9.6'); + $pgversion = '9.6'; } $pgversion = $opts->{version} if $opts->{version}; @@ -1573,7 +1556,7 @@ sub task_postgres { die "unsupported postgres version '$pgversion'\n" if !grep { $pgversion eq $_; } @supp; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $required = $self->compute_required (["postgresql-$pgversion"]); @@ -1582,8 +1565,9 @@ sub task_postgres { $self->ve_dpkg ('install', @$required); my $iscript = "postgresql-$pgversion"; - if ($suite eq 'squeeze' || $suite eq 'wheezy' || $suite eq 'jessie') { - $iscript = 'postgresql'; + if ($suite eq 'squeeze' || $suite eq 'wheezy' || $suite eq 'jessie' || + $suite eq 'stretch') { + $iscript = 'postgresql'; } $self->ve_command ("/etc/init.d/$iscript start") if $opts->{start}; @@ -1593,7 +1577,7 @@ sub task_mysql { my ($self, $opts) = @_; my $password = $opts->{password}; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $suite = $self->{config}->{suite}; @@ -1602,6 +1586,8 @@ sub task_mysql { $ver = '5.1'; } elsif ($suite eq 'wheezy' || $suite eq 'jessie') { $ver = '5.5'; + } else { + die "task_mysql: unsupported suite '$suite'"; } my $required = $self->compute_required (['mysql-common', "mysql-server-$ver"]); @@ -1638,7 +1624,7 @@ sub task_php { my ($self, $opts) = @_; my $memlimit = $opts->{memlimit}; - my $rootdir = $self->vz_root_dir(); + my $rootdir = $self->{rootfs}; my $required = $self->compute_required ([qw (php5 php5-cli libapache2-mod-php5 php5-gd)]);