Those helpers will be used by several other packages to implement the altname support. Those helpers will also be used by the new pveeth tool which can be used for pinning interface names.
Signed-off-by: Stefan Hanreich <s.hanre...@proxmox.com> --- src/PVE/Network.pm | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/PVE/Network.pm b/src/PVE/Network.pm index d084b36..ce87b93 100644 --- a/src/PVE/Network.pm +++ b/src/PVE/Network.pm @@ -973,4 +973,49 @@ sub is_ovs_bridge { die "failed to query OVS to determine type of '$bridge': $res\n"; } +sub ip_link_details { + my $link_json = ''; + + PVE::Tools::run_command( + ['ip', '-details', '-json', 'link', 'show'], + outfunc => sub { + $link_json .= shift; + } + ); + + my $links = JSON::decode_json($link_json); + my %ip_links = map { $_->{ifname} => $_ } $links->@*; + + return \%ip_links; +} + +sub ip_link_is_physical { + my ($ip_link) = @_; + + # ether alone isn't enough, as virtual interfaces can also have link_type + # ether + return $ip_link->{link_type} eq 'ether' + && (!defined($ip_link->{linkinfo}) || !defined($ip_link->{linkinfo}->{info_kind})); +} + +sub altname_mapping { + my ($ip_links) = @_; + + $ip_links = ip_link_details() if !defined($ip_links); + + my $altnames = {}; + + foreach my $iface_name (keys $ip_links->%*) { + my $iface = $ip_links->{$iface_name}; + + next if !$iface->{altnames}; + + foreach my $altname ($iface->{altnames}->@*) { + $altnames->{$altname} = $iface_name; + } + } + + return $altnames; +} + 1; -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel