]> git.mjollnir.org Git - vserverctl.git/commitdiff
Added options support to profiles
authorMartyn Smith <martyn@catalyst.net.nz>
Tue, 3 Apr 2007 10:44:55 +0000 (22:44 +1200)
committerMartyn Smith <martyn@sear.home>
Tue, 3 Apr 2007 10:44:55 +0000 (22:44 +1200)
vserverctl

index 8d0a4f5e1541d72dbbeb6a16f939fba4e9ae7436..e7371b333647cbfb9eafdfc449de13ebf9e40e47 100755 (executable)
@@ -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 { # {{{