mirror of
https://git.proxmox.com/git/pve-container
synced 2025-10-04 13:02:36 +00:00
api: network: get interfaces from containers
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@proxmox.com>
This commit is contained in:
parent
432793c1a1
commit
3d56c9c0ff
@ -2510,6 +2510,56 @@ __PACKAGE__->register_method({
|
|||||||
return PVE::GuestHelpers::config_with_pending_array($conf, $pending_delete_hash);
|
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({
|
__PACKAGE__->register_method({
|
||||||
name => 'mtunnel',
|
name => 'mtunnel',
|
||||||
path => '{vmid}/mtunnel',
|
path => '{vmid}/mtunnel',
|
||||||
|
@ -1036,6 +1036,32 @@ sub hotplug_net {
|
|||||||
PVE::LXC::Config->write_config($vmid, $conf);
|
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;
|
||||||
|
for my $interface ($config->@*) {
|
||||||
|
my $obj = { name => $interface->{ifname} };
|
||||||
|
for my $ip ($interface->{addr_info}->@*) {
|
||||||
|
$obj->{$ip->{family}} = $ip->{local} . "/" . $ip->{prefixlen};
|
||||||
|
}
|
||||||
|
$obj->{hwaddr} = $interface->{address};
|
||||||
|
push @$res, $obj
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
sub update_ipconfig {
|
sub update_ipconfig {
|
||||||
my ($vmid, $conf, $opt, $eth, $newnet, $rootdir) = @_;
|
my ($vmid, $conf, $opt, $eth, $newnet, $rootdir) = @_;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user