[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 10:24:11 CEST 2018
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,
+ }
+}
+
+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) = @_;
--
2.11.0
More information about the pve-devel
mailing list