package anacondatest; use strict; use base 'basetest'; # base class for all Anaconda (installation) tests # should be used in tests where Anaconda is running - when it makes sense # to upload Anaconda logs when something fails. Many tests using this as a # base likely will also want to `use anaconda` for commonly-used functions. use testapi; use utils; sub post_fail_hook { my $self = shift; # if error dialog is shown, click "report" - it then creates directory structure for ABRT my $has_traceback = 0; if (check_screen "anaconda_error_report", 10) { assert_and_click "anaconda_error_report"; $has_traceback = 1; } elsif (check_screen "anaconda_text_error", 10) { # also for text install type_string "1\n"; $has_traceback = 1; } save_screenshot; $self->root_console(); # if we're in dracut, do things different my $dracut = 0; if (check_screen "root_console_dracut", 0) { $dracut = 1; script_run "dhclient"; } # if we don't have tar or a network connection, we'll try and at # least send out *some* kinda info via the serial line my $hostip = testapi::host_ip(); if (script_run "ping -c 2 ${hostip}") { if ($dracut) { script_run 'printf "\n** RDSOSREPORT **\n" > /dev/' . $serialdev; script_run "cat /run/initramfs/rdsosreport.txt > /dev/${serialdev}"; return; } script_run 'printf "\n** IP ADDR **\n" > /dev/' . $serialdev; script_run "ip addr > /dev/${serialdev} 2>&1"; script_run 'printf "\n** IP ROUTE **\n" > /dev/' . $serialdev; script_run "ip route > /dev/${serialdev} 2>&1"; script_run 'printf "\n** NETWORKMANAGER.SERVICE STATUS **\n" > /dev/' . $serialdev; script_run "systemctl --no-pager -l status NetworkManager.service > /dev/${serialdev} 2>&1"; script_run 'printf "\n** X.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/X.log > /dev/${serialdev}"; script_run 'printf "\n** ANACONDA.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/anaconda.log > /dev/${serialdev}"; script_run 'printf "\n** PACKAGING.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/packaging.log > /dev/${serialdev}"; script_run 'printf "\n** STORAGE.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/storage.log > /dev/${serialdev}"; script_run 'printf "\n** SYSLOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/syslog > /dev/${serialdev}"; script_run 'printf "\n** PROGRAM.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/program.log > /dev/${serialdev}"; script_run 'printf "\n** DNF.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/dnf.log > /dev/${serialdev}"; script_run 'printf "\n** DNF.LIBREPO.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/dnf.librepo.log > /dev/${serialdev}"; script_run 'printf "\n** DNF.RPM.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/dnf.rpm.log > /dev/${serialdev}"; script_run 'printf "\n** DBUS.LOG **\n" > /dev/' . $serialdev; script_run "cat /tmp/dbus.log > /dev/${serialdev}"; return; } if ($dracut) { upload_logs "/run/initramfs/rdsosreport.txt", failok => 1; # that's all that's really useful, so... return; } upload_logs "/tmp/X.log", failok => 1; upload_logs "/tmp/anaconda.log", failok => 1; upload_logs "/tmp/packaging.log", failok => 1; upload_logs "/tmp/storage.log", failok => 1; upload_logs "/tmp/syslog", failok => 1; upload_logs "/tmp/program.log", failok => 1; upload_logs "/tmp/dnf.log", failok => 1; upload_logs "/tmp/dnf.librepo.log", failok => 1; upload_logs "/tmp/dnf.rpm.log", failok => 1; upload_logs "/tmp/dbus.log", failok => 1; if ($has_traceback) { # Upload Anaconda traceback logs script_run "tar czf /tmp/anaconda_tb.tar.gz /tmp/anaconda-tb-*"; upload_logs "/tmp/anaconda_tb.tar.gz"; } # Upload all ABRT logs (if there are any) unless (script_run 'test -n "$(ls -A /var/tmp)" && tar czf /var/tmp/var_tmp.tar.gz /var/tmp') { upload_logs "/var/tmp/var_tmp.tar.gz"; } # Upload /var/log unless (script_run "tar czf /tmp/var_log.tar.gz /var/log") { upload_logs "/tmp/var_log.tar.gz"; } # Upload anaconda core dump, if there is one unless (script_run "ls /tmp/anaconda.core.* && tar czf /tmp/anaconda.core.tar.gz /tmp/anaconda.core.*") { upload_logs "/tmp/anaconda.core.tar.gz"; } } sub root_console { # Switch to an appropriate TTY and log in as root. my $self = shift; my %args = ( # 0 means use console_login's default, non-zero values # passed to console_login timeout => 0, @_); if (get_var("SERIAL_CONSOLE")) { # select first virtio terminal, we rely on anaconda having run # a root shell on it for us select_console("virtio-console"); # as we don't have any live image serial install tests, we # know we don't need to login return; } else { # tty3 has a shell on all f31+ installer and live images send_key "ctrl-alt-f3"; } console_login(user => "root", timeout => $args{timeout}); } 1; # vim: set sw=4 et: