[pve-devel] [PATCH pve-container 1/3] archlinux template support
Wolfgang Bumiller
w.bumiller at proxmox.com
Fri Aug 14 12:36:27 CEST 2015
---
src/PVE/LXC.pm | 2 +-
src/PVE/LXCSetup.pm | 10 +++++---
src/PVE/LXCSetup/ArchLinux.pm | 54 +++++++++++++++++++++++++++++++++++++++++++
src/PVE/LXCSetup/Base.pm | 53 ++++++++++++++++++++++++++++++++++++++++++
src/PVE/LXCSetup/Makefile | 2 +-
5 files changed, 116 insertions(+), 5 deletions(-)
create mode 100644 src/PVE/LXCSetup/ArchLinux.pm
diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index 629a41e..5ec5766 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -933,7 +933,7 @@ sub update_lxc_config {
$raw .= "lxc.arch = $conf->{arch}\n";
my $ostype = $conf->{ostype} || die "missing 'ostype' - internal error";
- if ($ostype eq 'debian' || $ostype eq 'ubuntu' || $ostype eq 'centos') {
+ if ($ostype =~ /^(?:debian | ubuntu | centos | archlinux)$/x) {
$raw .= "lxc.include = /usr/share/lxc/config/$ostype.common.conf\n";
} else {
die "implement me";
diff --git a/src/PVE/LXCSetup.pm b/src/PVE/LXCSetup.pm
index e57ed1a..822ff3d 100644
--- a/src/PVE/LXCSetup.pm
+++ b/src/PVE/LXCSetup.pm
@@ -7,11 +7,13 @@ use PVE::Tools;
use PVE::LXCSetup::Debian;
use PVE::LXCSetup::Ubuntu;
use PVE::LXCSetup::Redhat;
+use PVE::LXCSetup::ArchLinux;
my $plugins = {
- debian => 'PVE::LXCSetup::Debian',
- ubuntu => 'PVE::LXCSetup::Ubuntu',
- redhat => 'PVE::LXCSetup::Redhat',
+ debian => 'PVE::LXCSetup::Debian',
+ ubuntu => 'PVE::LXCSetup::Ubuntu',
+ redhat => 'PVE::LXCSetup::Redhat',
+ archlinux => 'PVE::LXCSetup::ArchLinux',
};
my $autodetect_type = sub {
@@ -27,6 +29,8 @@ my $autodetect_type = sub {
return "debian";
} elsif (-f "$rootdir/etc/redhat-release") {
return "redhat";
+ } elsif (-f "$rootdir/etc/arch-release") {
+ return "archlinux";
}
die "unable to detect OS disribution\n";
};
diff --git a/src/PVE/LXCSetup/ArchLinux.pm b/src/PVE/LXCSetup/ArchLinux.pm
new file mode 100644
index 0000000..90a3bf7
--- /dev/null
+++ b/src/PVE/LXCSetup/ArchLinux.pm
@@ -0,0 +1,54 @@
+package PVE::LXCSetup::ArchLinux;
+
+use strict;
+use warnings;
+
+use File::Path 'make_path';
+
+use PVE::LXCSetup::Base;
+
+use base qw(PVE::LXCSetup::Base);
+
+sub new {
+ my ($class, $conf, $rootdir) = @_;
+
+ # /etc/arch-release exists, but it's empty
+ #my $release = PVE::Tools::file_read_firstline("$rootdir/etc/arch-release");
+ #die "unable to read version info\n" if !defined($release);
+
+ my $self = { conf => $conf, rootdir => $rootdir, version => 0 };
+
+ $conf->{ostype} = "archlinux";
+
+ return bless $self, $class;
+}
+
+sub template_fixup {
+ my ($self, $conf) = @_;
+ # ArchLinux doesn't come with any particular predefined and enabled
+ # networking, so it probably makes sense to do the equivalent of
+ # 'systemctl enable systemd-networkd', since that's what we're configuring
+ # in setup_network
+
+ my $rootdir = $self->{rootdir};
+
+ # systemctl enable systemd-networkd
+ make_path("$rootdir/etc/systemd/system/multi-user.target.wants");
+ make_path("$rootdir/etc/systemd/system/socket.target.wants");
+ symlink "/usr/lib/systemd/system/systemd-networkd.service",
+ "$rootdir/etc/systemd/system/multi-user.target.wants/systemd-networkd.service";
+ symlink "/usr/lib/systemd/system/systemd-networkd.socket",
+ "$rootdir/etc/systemd/system/socket.target.wants/systemd-networkd.socket";
+}
+
+sub setup_init {
+ # Nothing to do
+}
+
+sub setup_network {
+ my ($self, $conf) = @_;
+
+ $self->setup_systemd_networkd($conf);
+}
+
+1;
diff --git a/src/PVE/LXCSetup/Base.pm b/src/PVE/LXCSetup/Base.pm
index 49e60e0..6574f07 100644
--- a/src/PVE/LXCSetup/Base.pm
+++ b/src/PVE/LXCSetup/Base.pm
@@ -235,6 +235,59 @@ sub setup_systemd_console {
}
}
+sub setup_systemd_networkd {
+ my ($self, $conf) = @_;
+
+ my $rootdir = $self->{rootdir};
+
+ foreach my $k (keys %$conf) {
+ next if $k !~ m/^net(\d+)$/;
+ my $d = PVE::LXC::parse_lxc_network($conf->{$k});
+ next if !$d->{name};
+
+ my $filename = "$rootdir/etc/systemd/network/$d->{name}.network";
+
+ my $data = <<"DATA";
+[Match]
+Name = $d->{name}
+
+[Network]
+Description = Interface $d->{name} autoconfigured by PVE
+DATA
+ # DHCP bitflags:
+ my @DHCPMODES = ('none', 'v4', 'v6', 'both');
+ my ($NONE, $DHCP4, $DHCP6, $BOTH) = (0, 1, 2, 3);
+ my $dhcp = $NONE;
+
+ if (defined(my $ip = $d->{ip})) {
+ if ($ip eq 'dhcp') {
+ $dhcp |= $DHCP4;
+ } elsif ($ip ne 'manual') {
+ $data .= "Address = $ip\n";
+ }
+ }
+ if (defined(my $gw = $d->{gw})) {
+ $data .= "Gateway = $gw\n";
+ }
+
+ if (defined(my $ip = $d->{ip6})) {
+ if ($ip eq 'dhcp') {
+ $dhcp |= $DHCP6;
+ } elsif ($ip ne 'manual') {
+ $data .= "Address = $ip\n";
+ }
+ }
+ if (defined(my $gw = $d->{gw6})) {
+ $data .= "Gateway = $gw\n";
+ }
+
+ $data .= "DHCP = $DHCPMODES[$dhcp]\n";
+
+ PVE::Tools::file_set_contents($filename, $data);
+ }
+
+}
+
my $replacepw = sub {
my ($file, $user, $epw, $shadow) = @_;
diff --git a/src/PVE/LXCSetup/Makefile b/src/PVE/LXCSetup/Makefile
index 828d89f..ce39b53 100644
--- a/src/PVE/LXCSetup/Makefile
+++ b/src/PVE/LXCSetup/Makefile
@@ -1,4 +1,4 @@
-SOURCES=Base.pm Debian.pm Ubuntu.pm Redhat.pm
+SOURCES=Base.pm Debian.pm Ubuntu.pm Redhat.pm ArchLinux.pm
.PHONY: install
install:
--
2.1.4
More information about the pve-devel
mailing list