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

Dominik Csapak d.csapak at proxmox.com
Wed Sep 12 14:01:12 CEST 2018


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 <d.csapak at proxmox.com>
>> ---
>> 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) = @_;
>>   
>>
> 





More information about the pve-devel mailing list