use PVE::INotify;
use File::Basename;
use IO::Socket::IP;
+use Socket qw(NI_NUMERICHOST NI_NUMERICSERV);
use POSIX qw(ECONNREFUSED);
use Net::IP;
my ($bridge) = @_;
if (! -d "/sys/class/net/$bridge") {
- system("/sbin/brctl addbr $bridge") == 0 ||
- die "can't add bridge '$bridge'\n";
+ system("/sbin/brctl addbr $bridge") == 0 ||
+ die "can't add bridge '$bridge'\n";
+ disable_ipv6($bridge);
}
};
eval {
disable_ipv6($iface);
- PVE::Tools::run_command("/sbin/ifconfig $iface 0.0.0.0 promisc up mtu $bridgemtu");
+ PVE::Tools::run_command(['/sbin/ip', 'link', 'set', $iface, 'up', 'promisc', 'on', 'mtu', $bridgemtu]);
};
die "interface activation failed\n" if $@;
}
if (-d "/sys/class/net/$veth") {
run_command("/sbin/ip link delete dev $veth", outfunc => sub {}, errfunc => sub {});
}
-
+ eval { tap_unplug($veth) };
}
my $create_firewall_bridge_linux = sub {
my ($fwbr, $vethfw, $vethfwpeer) = &$compute_fwbr_names($vmid, $devid);
&$cond_create_bridge($fwbr);
- disable_ipv6($fwbr);
&$activate_interface($fwbr);
copy_bridge_config($bridge, $fwbr);
my $bridgemtu = &$read_bridge_mtu($bridge);
&$cond_create_bridge($fwbr);
- disable_ipv6($fwbr);
&$activate_interface($fwbr);
&$bridge_add_interface($fwbr, $iface);
&$activate_interface($ovsintport);
# set the same mtu for ovs int port
- PVE::Tools::run_command("/sbin/ifconfig $ovsintport mtu $bridgemtu");
+ PVE::Tools::run_command(['/sbin/ip', 'link', 'set', $ovsintport, 'mtu', $bridgemtu]);
&$bridge_add_interface($fwbr, $ovsintport);
};
if (! -d "/sys/class/net/$ifacevlan") {
system("/sbin/ip link add link $iface name $ifacevlan type vlan id $tag") == 0 ||
die "can't add vlan tag $tag to interface $iface\n";
- }
- # remove ipv6 link-local address before activation
- disable_ipv6($ifacevlan);
+ # remove ipv6 link-local address before activation
+ disable_ipv6($ifacevlan);
+ }
# be sure to have the $ifacevlan up
&$activate_interface($ifacevlan);
return $cidr_obj->overlaps($ip_obj) == $Net::IP::IP_B_IN_A_OVERLAP;
}
+
+sub get_local_ip_from_cidr {
+ my ($cidr) = @_;
+
+ my $cmd = ['/sbin/ip', 'address', 'show', 'to', $cidr, 'up'];
+
+ my $IPs = [];
+
+ my $code = sub {
+ my $line = shift;
+
+ if ($line =~ m!^\s*inet(?:6)?\s+($PVE::Tools::IPRE)/\d+!) {
+ push @$IPs, $1;
+ }
+ };
+
+ PVE::Tools::run_command($cmd, outfunc => $code);
+
+ return $IPs;
+}
+
+sub addr_to_ip {
+ my ($addr) = @_;
+ my ($err, $host, $port) = Socket::getnameinfo($addr, NI_NUMERICHOST | NI_NUMERICSERV);
+ die "failed to get numerical host address: $err\n" if $err;
+ return ($host, $port) if wantarray;
+ return $host;
+}
+
+sub get_ip_from_hostname {
+ my ($hostname, $noerr) = @_;
+
+ my ($family, $ip);
+
+ eval {
+ my @res = PVE::Tools::getaddrinfo_all($hostname);
+ $family = $res[0]->{family};
+ $ip = addr_to_ip($res[0]->{addr})
+ };
+ if ($@) {
+ die "hostname lookup failed:\n$@" if !$noerr;
+ return undef;
+ }
+
+ if ($ip =~ m/^127\.|^::1$/) {
+ die "hostname lookup failed - got local IP address ($hostname = $ip)\n" if !$noerr;
+ return undef;
+ }
+
+ return wantarray ? ($ip, $family) : $ip;
+}
+
sub lock_network {
my ($code, @param) = @_;
my $res = lock_file('/var/lock/pve-network.lck', 10, $code, @param);