Am 08.11.23 um 09:52 schrieb Markus Frank: > Adds a config file for directories by using a 'map' > array propertystring for each node mapping. > > Next to node & path, there is the optional > submounts parameter in the map array. > Additionally there are the default settings for xattr & acl. > > example config: > ``` > some-dir-id > map node=node1,path=/mnt/share/,submounts=1 > map node=node2,path=/mnt/share/, > xattr 1 > acl 1 > ``` > > Signed-off-by: Markus Frank <m.fr...@proxmox.com> > --- > src/Makefile | 1 + > src/PVE/Mapping/Dir.pm | 177 +++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 178 insertions(+) > create mode 100644 src/PVE/Mapping/Dir.pm >
> diff --git a/src/PVE/Mapping/Dir.pm b/src/PVE/Mapping/Dir.pm > new file mode 100644 > index 0000000..6c87073 > --- /dev/null > +++ b/src/PVE/Mapping/Dir.pm > @@ -0,0 +1,177 @@ > +package PVE::Mapping::Dir; > + > +use strict; > +use warnings; > + > +use PVE::Cluster qw(cfs_register_file cfs_read_file cfs_lock_file > cfs_write_file); > +use PVE::JSONSchema qw(get_standard_option parse_property_string); > +use PVE::SectionConfig; > +use PVE::INotify; Nit: not sorted alphabetically ---snip--- > +my $map_fmt = { > + node => get_standard_option('pve-node'), > + path => { > + description => "Directory-path that should be shared with the guest.", Nit: space instead of - is nicer IMHO and since it's an absolute path "Absolute directory path" > + type => 'string', > + format => 'pve-storage-path', This is registered in PVE/Storage/Plugin.pm To be clean, we should either add an include here (guest-common already depends on libpve-storage) or move registering the format to PVE::JSONSchema > + }, > + submounts => { > + type => 'boolean', > + description => "Option to tell the guest which directories are mount > points.", I haven't looked at the code where this is used yet, so I'm as confused as a user now ;) Does this affect mount points within the directory (which the "sub" prefix suggests)? But it's a boolean, so how can I tell "which directories"? The description should answer: When does it need to be set/what effect does it have? > + optional => 1, > + }, > + description => { > + description => "Description of the node specific directory.", > + type => 'string', > + optional => 1, > + maxLength => 4096, > + }, > +}; > + > +my $defaultData = { > + propertyList => { > + id => { > + type => 'string', > + description => "The ID of the directory", > + format => 'pve-configid', > + }, > + description => { > + description => "Description of the directory", > + type => 'string', > + optional => 1, > + maxLength => 4096, > + }, > + map => { > + type => 'array', > + description => 'A list of maps for the cluster nodes.', > + optional => 1, > + items => { > + type => 'string', > + format => $map_fmt, > + }, > + }, Style nit: Indentation is mostly wrong since the beginning of $defaultData until here. > + xattr => { > + type => 'boolean', > + description => "Enable support for extended attributes.", > + optional => 1, > + }, > + acl => { > + type => 'boolean', > + description => "Enable support for posix ACLs (implies --xattr).", s/posix/POSIX/ > + optional => 1, What could also be mentioned for xattr and acl: do the underlying file systems need to support these? What happens if they don't? > + }, > + }, > +}; > + > +sub private { > + return $defaultData; > +} > + > +sub options { > + return { > + description => { optional => 1 }, > + map => {}, > + xattr => { optional => 1 }, > + acl => { optional => 1 }, Style nit: wrong indentation > + }; > +} > + > +sub assert_valid { > + my ($dir_cfg) = @_; > + > + my $path = $dir_cfg->{path}; > + > + if (! -e $path) { > + die "Path $path does not exist\n"; Style nit: wrong indentation > + } > + if ((-e $path) && (! -d $path)) { Style nit: could be made into an elsif to avoid an extra -e check > + die "Path $path exists but is not a directory\n" Style nit: wrong indentation > + } > + > + return 1; > +}; > + > +sub config { > + return cfs_read_file($FILENAME); > +} > + > +sub lock_dir_config { > + my ($code, $errmsg) = @_; > + > + cfs_lock_file($FILENAME, undef, $code); > + my $err = $@; > + if ($err) { Style nit: could be if (my $err = $@) { > + $errmsg ? die "$errmsg: $err" : die $err; Style nit: wrong indentation > + } > +} > + > +sub write_dir_config { > + my ($cfg) = @_; > + > + cfs_write_file($FILENAME, $cfg); > +} > + > +sub find_on_current_node { > + my ($id) = @_; > + > + my $cfg = config(); > + my $node = PVE::INotify::nodename(); > + > + return get_node_mapping($cfg, $id, $node); > +} > + > +sub get_node_mapping { > + my ($cfg, $id, $nodename) = @_; > + > + return undef if !defined($cfg->{ids}->{$id}); > + > + my $res = []; > + my $mapping_list = $cfg->{ids}->{$id}->{map}; > + foreach my $map (@{$mapping_list}) { Style nit: new code should use "for" > + my $entry = eval { parse_property_string($map_fmt, $map) }; > + warn $@ if $@; > + if ($entry && $entry->{node} eq $nodename) { > + push $res->@*, $entry; > + } > + } > + return $res; > +} > + > +PVE::Mapping::Dir->register(); > +PVE::Mapping::Dir->init(); > + > +1; _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel