use Config::Auto;
use File::Slurp qw(slurp write_file);
use Carp;
-use File::Basename;
my $baseDir = '/vserver/';
my $profileBaseDir = $baseDir . '.profile/';
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;
$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";
'-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;
}
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';
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} ||= '';
}
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;
} # }}}
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 { # {{{