Signed-off-by: Filip Schauer <f.scha...@proxmox.com> --- src/Makefile | 1 + src/PVE/Mapping/HWRNG.pm | 147 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 src/PVE/Mapping/HWRNG.pm
diff --git a/src/Makefile b/src/Makefile index cbc40c1..ae62b7d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -15,6 +15,7 @@ install: PVE install -m 0644 PVE/StorageTunnel.pm ${PERL5DIR}/PVE/ install -m 0644 PVE/Tunnel.pm ${PERL5DIR}/PVE/ install -d ${PERL5DIR}/PVE/Mapping + install -m 0644 PVE/Mapping/HWRNG.pm ${PERL5DIR}/PVE/Mapping/ install -m 0644 PVE/Mapping/PCI.pm ${PERL5DIR}/PVE/Mapping/ install -m 0644 PVE/Mapping/USB.pm ${PERL5DIR}/PVE/Mapping/ install -d ${PERL5DIR}/PVE/VZDump diff --git a/src/PVE/Mapping/HWRNG.pm b/src/PVE/Mapping/HWRNG.pm new file mode 100644 index 0000000..3e6bc9b --- /dev/null +++ b/src/PVE/Mapping/HWRNG.pm @@ -0,0 +1,147 @@ +package PVE::Mapping::HWRNG; + +use strict; +use warnings; + +use PVE::Cluster qw( + cfs_lock_file + cfs_read_file + cfs_register_file + cfs_write_file +); +use PVE::INotify (); +use PVE::JSONSchema qw(get_standard_option parse_property_string); + +use base qw(PVE::SectionConfig); + +my $FILENAME = 'mapping/hwrng.cfg'; + +cfs_register_file($FILENAME, + sub { __PACKAGE__->parse_config(@_); }, + sub { __PACKAGE__->write_config(@_); }); + + +# so we don't have to repeat the type every time +sub parse_section_header { + my ($class, $line) = @_; + + if ($line =~ m/^(\S+)\s*$/) { + my $id = $1; + my $errmsg = undef; # set if you want to skip whole section + eval { PVE::JSONSchema::pve_verify_configid($id) }; + $errmsg = $@ if $@; + my $config = {}; # to return additional attributes + return ('hwrng', $id, $errmsg, $config); + } + return undef; +} + +sub format_section_header { + my ($class, $type, $sectionId, $scfg, $done_hash) = @_; + + return "$sectionId\n"; +} + +sub type { + return 'hwrng'; +} + +my $map_fmt = { + node => get_standard_option('pve-node'), + path => { + description => "The path to the device node of the entropy source.", + type => 'string', + enum => ['/dev/urandom', '/dev/random', '/dev/hwrng'], + }, + description => { + description => "Description of the node specific device.", + type => 'string', + optional => 1, + maxLength => 4096, + }, +}; + +my $defaultData = { + propertyList => { + id => { + type => 'string', + description => "The ID of the logical HWRNG mapping.", + format => 'pve-configid', + }, + description => { + description => "Description of the logical HWRNG device.", + type => 'string', + optional => 1, + maxLength => 4096, + }, + map => { + type => 'array', + description => 'A list of maps for the cluster nodes.', + items => { + type => 'string', + format => $map_fmt, + }, + }, + }, +}; + +sub private { + return $defaultData; +} + +sub options { + return { + description => { optional => 1 }, + map => {}, + }; +} + +sub config { + return cfs_read_file($FILENAME); +} + +sub lock_hwrng_config { + my ($code, $errmsg) = @_; + + cfs_lock_file($FILENAME, undef, $code); + if (my $err = $@) { + $errmsg ? die "$errmsg: $err" : die $err; + } +} + +sub write_hwrng_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 = []; + for my $map ($cfg->{ids}->{$id}->{map}->@*) { + my $entry = eval { parse_property_string($map_fmt, $map) }; + warn $@ if $@; + if ($entry && $entry->{node} eq $nodename) { + push $res->@*, $entry; + } + } + + return $res; +} + +PVE::Mapping::HWRNG->register(); +PVE::Mapping::HWRNG->init(); + +1; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel