]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/INotify.pm
INotify.pm: add methods for reading/writing /etc/hosts
[pve-common.git] / src / PVE / INotify.pm
index dee9a3e9b2b6a48b0780b5a76feda425b269e5c1..f83759673e9bdefa19d7cc1aeb7382c5c65ccb53 100644 (file)
@@ -19,7 +19,9 @@ use PVE::ProcFSTools;
 use Clone qw(clone);
 use Linux::Inotify2;
 use base 'Exporter';
-use JSON; 
+use JSON;
+use Digest::SHA;
+use Encode qw(encode decode);
 
 our @EXPORT_OK = qw(read_file write_file register_file);
 
@@ -56,13 +58,11 @@ sub ccache_compute_diff {
 
     my $diff = '';
 
-    open (TMP, "diff -b -N -u '$filename' '$shadow'|");
-       
-    while (my $line = <TMP>) {
-       $diff .= $line;
-    }
-
-    close (TMP);
+    my $cmd = ['/usr/bin/diff', '-b', '-N', '-u', $filename, $shadow];
+    PVE::Tools::run_command($cmd, noerr => 1, outfunc => sub {
+       my ($line) = @_;
+       $diff .= decode('UTF-8', $line) . "\n";
+    });
 
     $diff = undef if !$diff;
 
@@ -538,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,
+    }
+}
+
+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) = @_;