From 7c7ae12f431ed0926be1e9ca3a75039d93a688b9 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Tue, 29 Jan 2019 16:28:38 +0100 Subject: [PATCH] add new content type 'snippets' will be used to contain files which can be executed as hookscripts or contain custom cloud-init configs Signed-off-by: Dominik Csapak --- PVE/Storage.pm | 48 +++++++++++++++++++++++++++++++++++++++++-- PVE/Storage/Plugin.pm | 3 +++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 89a6c71..fc7a2ea 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -772,6 +772,48 @@ sub vdisk_free { $rpcenv->fork_worker('imgdel', undef, $authuser, $cleanup_worker); } +# lists all files in the snippets directory +sub snippets_list { + my ($cfg, $storeid) = @_; + + my $ids = $cfg->{ids}; + + storage_check_enabled($cfg, $storeid) if ($storeid); + + my $res = {}; + + foreach my $sid (keys %$ids) { + next if $storeid && $storeid ne $sid; + next if !storage_check_enabled($cfg, $sid, undef, 1); + + my $scfg = $ids->{$sid}; + next if !$scfg->{content}->{snippets}; + + activate_storage($cfg, $sid); + + if ($scfg->{path}) { + my $plugin = PVE::Storage::Plugin->lookup($scfg->{type}); + my $path = $plugin->get_subdir($scfg, 'snippets'); + + foreach my $fn (<$path/*>) { + next if -d $fn; + + push @{$res->{$sid}}, { + volid => "$sid:snippets/". basename($fn), + format => 'snippet', + size => -s $fn, + }; + } + } + + if ($res->{$sid}) { + @{$res->{$sid}} = sort {$a->{volid} cmp $b->{volid} } @{$res->{$sid}}; + } + } + + return $res; +} + #list iso or openvz template ($tt = ) sub template_list { my ($cfg, $storeid, $tt) = @_; @@ -887,7 +929,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 snippets); my $cts = $content ? [ $content ] : [ @ctypes ]; @@ -909,6 +951,8 @@ sub volume_list { @{$data->{$storeid}} = grep { $_->{volid} =~ m/\S+-$vmid-\S+/ } @{$data->{$storeid}}; } } + } elsif ($ct eq 'snippets') { + $data = snippets_list($cfg, $storeid); } next if !$data || !$data->{$storeid}; @@ -1518,7 +1562,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 snippets)]; } sub complete_volume { diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 7dbb41d..c641981 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -428,6 +428,8 @@ sub parse_volname { return ('backup', $fn, $2); } return ('backup', $fn); + } elsif ($volname =~ m!^snippets/([^/]+)$!) { + return ('snippets', $1); } die "unable to parse directory volume name '$volname'\n"; @@ -439,6 +441,7 @@ my $vtype_subdirs = { iso => 'template/iso', vztmpl => 'template/cache', backup => 'dump', + snippets => 'snippets', }; sub get_subdir { -- 2.39.5