Re: [pve-devel] [PATCH common v3 3/3] INotify.pm: add methods for reading/writing /etc/hosts

2018-09-12 Thread Dominik Csapak

On 09/12/2018 11:14 AM, Thomas Lamprecht wrote:

On 9/12/18 10:24 AM, Dominik Csapak wrote:

Signed-off-by: Dominik Csapak 
---
changes from v2:
* also encode during write
* remove digest check code (done in api call)
* better regex for comments (leading whitespace)
  src/PVE/INotify.pm | 49 +
  1 file changed, 49 insertions(+)

diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm
index 8b5544e..f837596 100644
--- a/src/PVE/INotify.pm
+++ b/src/PVE/INotify.pm
@@ -20,6 +20,7 @@ use Clone qw(clone);
  use Linux::Inotify2;
  use base 'Exporter';
  use JSON;
+use Digest::SHA;
  use Encode qw(encode decode);
  
  our @EXPORT_OK = qw(read_file write_file register_file);

@@ -537,6 +538,54 @@ register_file('hostname', "/etc/hostname",
  \&read_etc_hostname,
  \&write_etc_hostname);
  
+sub read_etc_hosts {

+my ($filename, $fh) = @_;
+
+my $raw = '';
+my $data = '';
+
+while (my $line = <$fh>) {
+   $raw .= $line;
+   if ($line =~ m/^\s*#/) {
+   $line = decode('UTF-8', $line);
+   }
+   $data .= $line;
+}
+
+return {
+   digest => Digest::SHA::sha1_hex($raw),
+   data => $data,
+}


why not just returning the raw data here like all other read methods
in this module do and handle digest fully (generation and checking) in
the API (or where it's actually needed)?


yes you are right, that would of course be better .. v4 incoming




+}
+
+sub write_etc_hosts {
+my ($filename, $fh, $hosts, @args) = @_;
+
+# check validity of ips/names
+for my $line (split("\n", $hosts)) {
+   next if $line =~ m/^\s*#/; # comments
+   next if $line =~ m/^\s*$/; # whitespace/empty lines
+
+   my ($ip, @names) = split(/\s+/, $line);
+
+   raise_param_exc({ 'data' => "Invalid IP '$ip'" })
+   if $ip !~ m/^$PVE::Tools::IPRE$/;
+
+   for my $name (@names) {
+   raise_param_exc({ 'data' => "Invalid Hostname '$name'" })
+   if $name !~ m/^[.\-a-zA-Z0-9]+$/;
+   }
+}
+
+die "write failed: $!" if !print $fh encode('UTF-8', $hosts);
+
+return $hosts;
+}
+
+register_file('etchosts', "/etc/hosts",
+ \&read_etc_hosts,
+ \&write_etc_hosts);
+
  sub read_etc_resolv_conf {
  my ($filename, $fh) = @_;
  






___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


Re: [pve-devel] [PATCH common v3 3/3] INotify.pm: add methods for reading/writing /etc/hosts

2018-09-12 Thread Thomas Lamprecht
On 9/12/18 10:24 AM, Dominik Csapak wrote:
> Signed-off-by: Dominik Csapak 
> ---
> changes from v2:
> * also encode during write
> * remove digest check code (done in api call)
> * better regex for comments (leading whitespace)
>  src/PVE/INotify.pm | 49 +
>  1 file changed, 49 insertions(+)
> 
> diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm
> index 8b5544e..f837596 100644
> --- a/src/PVE/INotify.pm
> +++ b/src/PVE/INotify.pm
> @@ -20,6 +20,7 @@ use Clone qw(clone);
>  use Linux::Inotify2;
>  use base 'Exporter';
>  use JSON;
> +use Digest::SHA;
>  use Encode qw(encode decode);
>  
>  our @EXPORT_OK = qw(read_file write_file register_file);
> @@ -537,6 +538,54 @@ register_file('hostname', "/etc/hostname",
> \&read_etc_hostname, 
> \&write_etc_hostname);
>  
> +sub read_etc_hosts {
> +my ($filename, $fh) = @_;
> +
> +my $raw = '';
> +my $data = '';
> +
> +while (my $line = <$fh>) {
> + $raw .= $line;
> + if ($line =~ m/^\s*#/) {
> + $line = decode('UTF-8', $line);
> + }
> + $data .= $line;
> +}
> +
> +return {
> + digest => Digest::SHA::sha1_hex($raw),
> + data => $data,
> +}

why not just returning the raw data here like all other read methods
in this module do and handle digest fully (generation and checking) in
the API (or where it's actually needed)?

> +}
> +
> +sub write_etc_hosts {
> +my ($filename, $fh, $hosts, @args) = @_;
> +
> +# check validity of ips/names
> +for my $line (split("\n", $hosts)) {
> + next if $line =~ m/^\s*#/; # comments
> + next if $line =~ m/^\s*$/; # whitespace/empty lines
> +
> + my ($ip, @names) = split(/\s+/, $line);
> +
> + raise_param_exc({ 'data' => "Invalid IP '$ip'" })
> + if $ip !~ m/^$PVE::Tools::IPRE$/;
> +
> + for my $name (@names) {
> + raise_param_exc({ 'data' => "Invalid Hostname '$name'" })
> + if $name !~ m/^[.\-a-zA-Z0-9]+$/;
> + }
> +}
> +
> +die "write failed: $!" if !print $fh encode('UTF-8', $hosts);
> +
> +return $hosts;
> +}
> +
> +register_file('etchosts', "/etc/hosts",
> +   \&read_etc_hosts,
> +   \&write_etc_hosts);
> +
>  sub read_etc_resolv_conf {
>  my ($filename, $fh) = @_;
>  
> 


___
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel