[pve-devel] [PATCH container] api: network: get interfaces from containers

Leo Nunner l.nunner at proxmox.com
Tue Apr 18 11:31:43 CEST 2023


Adds an 'interfaces' endpoint in the API
(/nodes/{node}/lxc/{vmid}/interfaces'), which returns a list of
interface names, together with a MAC, IPv4 and IPv6 address. This list
may be expanded in the future. Note that this is only returned for
*running* containers, stopped containers simply return an empty list.

Signed-off-by: Leo Nunner <l.nunner at proxmox.com>
---
 src/PVE/API2/LXC.pm | 50 +++++++++++++++++++++++++++++++++++++++++++++
 src/PVE/LXC.pm      | 26 +++++++++++++++++++++++
 2 files changed, 76 insertions(+)

diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
index 50c9eaf..078d506 100644
--- a/src/PVE/API2/LXC.pm
+++ b/src/PVE/API2/LXC.pm
@@ -2495,6 +2495,56 @@ __PACKAGE__->register_method({
 	return PVE::GuestHelpers::config_with_pending_array($conf, $pending_delete_hash);
     }});
 
+__PACKAGE__->register_method({
+    name => 'ip',
+    path => '{vmid}/interfaces',
+    method => 'GET',
+    protected => 1,
+    permissions => {
+	check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
+    },
+    description => 'Get IP addresses of the specified container interface.',
+    parameters => {
+	additionalProperties => 0,
+	properties => {
+	    node => get_standard_option('pve-node'),
+	    vmid => get_standard_option('pve-vmid', { completion => \&PVE::LXC::complete_ctid }),
+	},
+    },
+    returns => {
+	type => "array",
+	items => {
+	    type => 'object',
+	    properties => {
+		name => {
+		    type => 'string',
+		    description => 'The name of the interface',
+		    optional => 0,
+		},
+		hwaddr => {
+		    type => 'string',
+		    description => 'The MAC address of the interface',
+		    optional => 0,
+		},
+		inet => {
+		    type => 'string',
+		    description => 'The IPv4 address of the interface',
+		    optional => 1,
+		},
+		inet6 => {
+		    type => 'string',
+		    description => 'The IPv6 address of the interface',
+		    optional => 1,
+		},
+	    }
+	},
+    },
+    code => sub {
+	my ($param) = @_;
+
+	return PVE::LXC::get_interfaces($param->{vmid});
+    }});
+
 __PACKAGE__->register_method({
     name => 'mtunnel',
     path => '{vmid}/mtunnel',
diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index c4d53e8..bf57ede 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -1034,6 +1034,32 @@ sub hotplug_net {
     PVE::LXC::Config->write_config($vmid, $conf);
 }
 
+sub get_interfaces {
+    my ($vmid) = @_;
+
+    my $pid = eval { find_lxc_pid($vmid); };
+    return if $@;
+
+    my $output;
+    # enters the network namespace of the container and executes 'ip a'
+    run_command(['nsenter', '-t', $pid, '--net', '--', 'ip', '--json', 'a'],
+	outfunc => sub { $output .= shift; });
+
+    my $config = JSON::decode_json($output);
+
+    my $res;
+    foreach my $interface ($config->@*) {
+	my $obj = { name => $interface->{ifname} };
+	foreach my $ip ($interface->{addr_info}->@*) {
+	    $obj->{$ip->{family}} = $ip->{local} . "/" . $ip->{prefixlen};
+	}
+	$obj->{hwaddr} = $interface->{address};
+	push @$res, $obj
+    }
+
+    return $res;
+}
+
 sub update_ipconfig {
     my ($vmid, $conf, $opt, $eth, $newnet, $rootdir) = @_;
 
-- 
2.30.2






More information about the pve-devel mailing list