From e5d272b19e2e4c87d6323cb6a1f834de1acc90d4 Mon Sep 17 00:00:00 2001 From: Martyn Smith Date: Tue, 3 Apr 2007 22:44:55 +1200 Subject: [PATCH] Added options support to profiles --- vserverctl | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/vserverctl b/vserverctl index 8d0a4f5..e7371b3 100755 --- a/vserverctl +++ b/vserverctl @@ -6,7 +6,6 @@ use warnings; use Config::Auto; use File::Slurp qw(slurp write_file); use Carp; -use File::Basename; my $baseDir = '/vserver/'; my $profileBaseDir = $baseDir . '.profile/'; @@ -15,6 +14,11 @@ my $startTime = time; my $action = shift; my $vsname = shift; my $profile = shift; +my $profileOptions = {}; +while ( my $profileOpt = shift ) { + next unless ( $profileOpt =~ m{ \A (.*?) = (.*) \z }xms ); + $profileOptions->{$1} = $2; +} my $ipaddr; my $scriptFH; @@ -47,6 +51,17 @@ $ENV{VSROOT} = $vsroot; $ENV{VSIPADDR} = $ipaddr; $ENV{VSRELEASE} = $config->{release}; +if ( $action eq 'add' ) { + foreach my $option ( split /\s+/, $config->{files}{options} ) { + next unless $option =~ /\S/; + unless ( defined $profileOptions->{$option} ) { + print "Need to specify profile option '$option'\n"; + exit 1; + } + $ENV{'PROFILEOPTION_' . $option} = $profileOptions->{$option}; + } +} + if ( $action eq 'remove' ) { print "Removing $vsname, $ipaddr, $profile\n"; @@ -81,15 +96,19 @@ if ( $action eq 'add' ) { '-d' => $config->{release}, '-m' => $config->{mirror}, ); + + open $scriptFH, '|-', '/bin/bash'; + print {$scriptFH} $config->{files}{'pre-host'}; + close $scriptFH; + + write_file('/etc/vservers/' . $vsname . "/profile", $profile . "\n"); + system('vserver', $vsname, 'start'); - write_file('/etc/vservers/' . $vsname . '/profile', $profile . "\n"); + write_file($vsroot . 'etc/apt/sources.list', $config->{files}{aptsources}); # TODO: get the apt-key stuff working system('vserver', $vsname, 'apt-get', 'update'); - open $scriptFH, '|-', '/bin/bash'; - print {$scriptFH} $config->{files}{'pre-host'}; - close $scriptFH; open $scriptFH, '|-', 'vserver', $vsname, 'exec', '/bin/bash'; print {$scriptFH} $config->{files}{'pre-vserver'}; close $scriptFH; @@ -103,14 +122,16 @@ if ( $action eq 'add' ) { } my %templates = split(/\s+/ms, $config->{files}{templates}); foreach my $key ( keys %templates ) { - my $file = basename($key); print "TEMPLATE: '$key' => '${vsroot}$templates{$key}'\n"; my $data = slurp($key); $data =~ s/__VSNAME__/$vsname/g; $data =~ s/__VSIPADDR__/$ipaddr/g; - $data =~ s/__HOST__/$ENV{HOSTNAME}/g; + foreach my $key ( keys %{$profileOptions} ) { + my $value = $profileOptions->{$key}; + $data =~ s/__PROFILEOPTION_${key}__/$value/g; + } write_file($vsroot . '.template', $data); - system('mv', $vsroot . '.template', $vsroot . $templates{$key} . $file); + system('mv', $vsroot . '.template', $vsroot . $templates{$key}); } open $scriptFH, '|-', 'vserver', $vsname, 'exec', '/bin/bash'; @@ -166,9 +187,10 @@ sub readConfig { # {{{ foreach my $key ( qw(release mirror) ) { $generatedConfig->{$key} = $cfg->{$key} if defined $cfg->{$key}; } - foreach my $key ( qw(aptsources packages templates files pre-host pre-vserver post-host post-vserver remove-host) ) { + foreach my $key ( qw(aptsources packages templates files pre-host pre-vserver post-host post-vserver remove-host options) ) { my $inheritKey = 'inherit-' . $key; $generatedConfig->{$inheritKey} = $cfg->{$inheritKey} if defined $cfg->{$inheritKey}; + $generatedConfig->{'inherit-options'} = 1; if ( $generatedConfig->{$inheritKey} ) { $generatedConfig->{files}{$key} ||= ''; @@ -190,6 +212,12 @@ sub readConfig { # {{{ } foreach my $key ( keys %{$generatedConfig->{files}} ) { $generatedConfig->{files}{$key} =~ s{ \A \s* (.*?) \s* \z }{$1}xms; + $generatedConfig->{files}{$key} =~ s/__VSNAME__/$vsname/g; + $generatedConfig->{files}{$key} =~ s/__VSIPADDR__/$ipaddr/g; + foreach my $pkey ( keys %{$profileOptions} ) { + my $value = $profileOptions->{$pkey}; + $generatedConfig->{files}{$key} =~ s/__PROFILEOPTION_${pkey}__/$value/g; + } } return $generatedConfig; @@ -217,7 +245,7 @@ sub readConfigFile { # {{{ } # }}} sub printUsage { # {{{ print "Usage\n\n"; - print "vserverctl add|remove vserver_name [profile]\n\n"; + print "vserverctl add|remove vserver_name [profile] [profilevar1=value] [...]\n\n"; exit 1; } # }}} sub getFreeIPAddress { # {{{ -- 2.39.5