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

Dominik Csapak d.csapak at proxmox.com
Wed Sep 5 10:54:47 CEST 2018


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);
+
+    # 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};
+
+    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





More information about the pve-devel mailing list