[pve-devel] [PATCH storage 1/3] add new content type 'scripts'

Dominik Csapak d.csapak at proxmox.com
Mon Jan 21 09:44:31 CET 2019


will be used to contain executable files which can be executed as
hookscripts

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/Storage.pm        | 60 +++++++++++++++++++++++++++++++++++++++++++++++++--
 PVE/Storage/Plugin.pm |  3 +++
 2 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/PVE/Storage.pm b/PVE/Storage.pm
index 89a6c71..12e5c79 100755
--- a/PVE/Storage.pm
+++ b/PVE/Storage.pm
@@ -772,6 +772,60 @@ sub vdisk_free {
     $rpcenv->fork_worker('imgdel', undef, $authuser, $cleanup_worker);
 }
 
+# lists all files in the scripts directory which are exectuable
+sub script_list {
+    my ($cfg, $storeid) = @_;
+
+    my $ids = $cfg->{ids};
+
+    storage_check_enabled($cfg, $storeid) if ($storeid);
+
+    my $res = {};
+
+    # query the storage
+
+    foreach my $sid (keys %$ids) {
+	next if $storeid && $storeid ne $sid;
+
+	my $scfg = $ids->{$sid};
+	my $type = $scfg->{type};
+
+	next if !storage_check_enabled($cfg, $sid, undef, 1);
+
+	next if !$scfg->{content}->{scripts};
+
+	activate_storage($cfg, $sid);
+
+	if ($scfg->{path}) {
+	    my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+	    my $path = $plugin->get_subdir($scfg, 'scripts');
+
+	    foreach my $fn (<$path/*>) {
+
+		my $info;
+
+		next if ! -x $fn || -d $fn;
+
+		my $base = basename($fn);
+
+		$info = {
+		    volid => "$sid:scripts/$base",
+		    format => 'script',
+		    size => -s $fn,
+		};
+
+		push @{$res->{$sid}}, $info;
+	    }
+
+	}
+
+	@{$res->{$sid}} = sort {lc($a->{volid}) cmp lc ($b->{volid}) } @{$res->{$sid}} if $res->{$sid};
+    }
+
+    return $res;
+}
+
 #list iso or openvz template ($tt = <iso|vztmpl|backup>)
 sub template_list {
     my ($cfg, $storeid, $tt) = @_;
@@ -887,7 +941,7 @@ sub vdisk_list {
 sub volume_list {
     my ($cfg, $storeid, $vmid, $content) = @_;
 
-    my @ctypes = qw(images vztmpl iso backup);
+    my @ctypes = qw(images vztmpl iso backup scripts);
 
     my $cts = $content ? [ $content ] : [ @ctypes ];
 
@@ -909,6 +963,8 @@ sub volume_list {
 		    @{$data->{$storeid}} = grep { $_->{volid} =~ m/\S+-$vmid-\S+/ } @{$data->{$storeid}};
 		}
 	    }
+	} elsif ($ct eq 'scripts') {
+	    $data = script_list($cfg, $storeid);
 	}
 
 	next if !$data || !$data->{$storeid};
@@ -1518,7 +1574,7 @@ sub complete_storage_enabled {
 sub complete_content_type {
     my ($cmdname, $pname, $cvalue) = @_;
 
-    return [qw(rootdir images vztmpl iso backup)];
+    return [qw(rootdir images vztmpl iso backup scripts)];
 }
 
 sub complete_volume {
diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm
index e0c2a4e..4990255 100644
--- a/PVE/Storage/Plugin.pm
+++ b/PVE/Storage/Plugin.pm
@@ -427,6 +427,8 @@ sub parse_volname {
 	    return ('backup', $fn, $2);
 	}
 	return ('backup', $fn);
+    } elsif ($volname =~ m!^scripts/([^/]+)$!) {
+	return ('scripts', $1);
     }
 
     die "unable to parse directory volume name '$volname'\n";
@@ -438,6 +440,7 @@ my $vtype_subdirs = {
     iso => 'template/iso',
     vztmpl => 'template/cache',
     backup => 'dump',
+    scripts => 'scripts',
 };
 
 sub get_subdir {
-- 
2.11.0





More information about the pve-devel mailing list