[pve-devel] [PATCH manager v4 1/2] add /node/{NODE}/hosts API Call

Dominik Csapak d.csapak at proxmox.com
Thu Sep 13 14:55:55 CEST 2018


to get and set the content of /etc/hosts

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
changes from v3:
* add digest code on read
 PVE/API2/Nodes.pm | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 836dccaf..c5b155bc 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -186,6 +186,7 @@ __PACKAGE__->register_method ({
 	    { name => 'firewall' },
 	    { name => 'certificates' },
 	    { name => 'config' },
+	    { name => 'hosts' },
 	    ];
 
 	return $result;
@@ -1815,6 +1816,83 @@ __PACKAGE__->register_method ({
 
     }});
 
+__PACKAGE__->register_method ({
+    name => 'get_etc_hosts',
+    path => 'hosts',
+    method => 'GET',
+    proxyto => 'node',
+    protected => 1,
+    permissions => {
+	check => ['perm', '/', [ 'Sys.Audit' ]],
+    },
+    description => "Get the content of /etc/hosts.",
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	},
+    },
+    returns => {
+	type => 'object',
+	properties => {
+	    digest => get_standard_option('pve-config-digest'),
+	    data => {
+		type => 'string',
+		description => 'The content of /etc/hosts.'
+	    },
+	},
+    },
+    code => sub {
+	my ($param) = @_;
+
+	my $etchosts = PVE::INotify::read_file('etchosts');
+
+	return {
+	    digest => Digest::SHA::sha1_hex($etchosts->{raw}),
+	    data => $etchosts->{decoded},
+	};
+    }});
+
+__PACKAGE__->register_method ({
+    name => 'write_etc_hosts',
+    path => 'hosts',
+    method => 'POST',
+    proxyto => 'node',
+    protected => 1,
+    permissions => {
+	check => ['perm', '/nodes/{node}', [ 'Sys.Modify' ]],
+    },
+    description => "Write /etc/hosts.",
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	    digest => get_standard_option('pve-config-digest'),
+	    data => {
+		type => 'string',
+		description =>  'The target content of /etc/hosts.'
+	    },
+	},
+    },
+    returns => {
+	type => 'null',
+    },
+    code => sub {
+	my ($param) = @_;
+
+	PVE::Tools::lock_file('/var/lock/pve-etchosts.lck', undef, sub{
+	    if ($param->{digest}) {
+		my $hosts = PVE::Tools::file_get_contents('/etc/hosts');
+		my $digest = Digest::SHA::sha1_hex($hosts);
+		PVE::Tools::assert_if_modified($digest, $param->{digest});
+	    }
+	    PVE::INotify::write_file('etchosts', $param->{data});
+	});
+	die $@ if $@;
+
+	return undef;
+    }});
+
 # bash completion helper
 
 sub complete_templet_repo {
-- 
2.11.0





More information about the pve-devel mailing list