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

Dietmar Maurer dietmar at proxmox.com
Mon Sep 10 12:09:51 CEST 2018


comments inline

> On September 5, 2018 at 10:54 AM Dominik Csapak <d.csapak at proxmox.com> wrote:
> 
> 
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> changes from v1:
> * decode line by line and decode comments as utf8
>  src/PVE/INotify.pm | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 53 insertions(+)
> 
> diff --git a/src/PVE/INotify.pm b/src/PVE/INotify.pm
> index 184f00d..73f617c 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,58 @@ 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/^#/) {
> +	    $line = decode('UTF-8', $line);
> +	}
> +	$data .= $line;
> +    }
> +
> +    return {
> +	digest => Digest::SHA::sha1_hex($raw),
> +	data => $data,
> +    }
> +}
> +
> +sub write_etc_hosts {
> +    my ($filename, $fh, $hosts, @args) = @_;
> +
> +    my $digest = Digest::SHA::sha1_hex(PVE::Tools::file_get_contents($filename));
> +
> +    PVE::Tools::assert_if_modified($hosts->{digest}, $digest);

Please add digest check inside API instead.

> +
> +    # check validity of ips/names
> +    for my $line (split("\n", $hosts->{data})) {
> +	next if $line =~ m/^#/; # 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 $hosts->{data};

you need to call encode on writing

> +
> +    return $hosts->{data};
> +}
> +
> +register_file('etchosts', "/etc/hosts",
> +	      \&read_etc_hosts,
> +	      \&write_etc_hosts);
> +
>  sub read_etc_resolv_conf {
>      my ($filename, $fh) = @_;
>  
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel



More information about the pve-devel mailing list