package tapnet; use strict; use base 'Exporter'; use Exporter; use testapi; our @EXPORT = qw/clone_host_file setup_tap_static get_host_dns/; sub clone_host_file { # copy a given file from the host into the guest. Mainly used # for networking config on tap tests. this is pretty crazy, but # SUSE do almost the same thing... my $file = shift; my $text = ''; open(my $fh, '<', $file); while (<$fh>) { $text .= $_; } # escape any " characters in the text... $text =~ s/"/\\"/g; assert_script_run "printf \"$text\" > $file"; # for debugging... assert_script_run "cat $file"; } sub setup_tap_static { # this is a common thing for tap tests, where we set up networking # for the system with a static IP address and possibly a specific # hostname my $ip = shift; my $hostname = shift || ""; if ($hostname) { # assigning output of split to a single-item array gives us just # the first split my ($short) = split(/\./, $hostname); # set hostname assert_script_run "hostnamectl set-hostname $hostname"; # add entry to /etc/hosts assert_script_run "echo '$ip $hostname $short' >> /etc/hosts"; } # use host's name servers (this is usually going to be correct, # tests which don't want this can overwrite resolv.conf) my @dns = get_host_dns(); my $dnstext = ''; for (my $i=0; $i < @dns; $i++) { my $num = $i + 1; $dnstext .= "\nDNS" . ${num} . "=" . $dns[$i]; } # bring up network. DEFROUTE is *vital* here my $conftext = "DEVICE=eth0\nBOOTPROTO=none\nIPADDR=$ip\nGATEWAY=10.0.2.2\nPREFIX=24\nDEFROUTE=yes\nONBOOT=yes" . $dnstext; assert_script_run "printf '${conftext}\n' > /etc/sysconfig/network-scripts/ifcfg-eth0"; assert_script_run "systemctl restart NetworkManager.service"; # FIXME workaround for # https://bugzilla.redhat.com/show_bug.cgi?id=1739148 # remove when that's resolved script_run 'nmcli con down "Wired connection 1"'; script_run 'nmcli con down "System eth0"'; script_run 'nmcli con up "System eth0"'; # the above doesn't seem to reliably set up resolv.conf, so... clone_host_file "/etc/resolv.conf"; } sub get_host_dns { # get DNS server addresses from the host my @forwards; open(FH, '<', "/etc/resolv.conf"); while (<FH>) { if ($_ =~ m/^nameserver +(.+)/) { push @forwards, $1; } } return @forwards; } 1; # vim: set sw=4 et: