From 29fd891c6316e81933e90d51f23324cb8395b23d Mon Sep 17 00:00:00 2001 From: Harald Hope Date: Wed, 16 Aug 2017 00:41:41 -0700 Subject: [PATCH] New version, new tarball. This fixes issue #119 The issue was not so much with xiin.py as with some new values in /sys that would hang tree traverse, however, in order to remove the python dependency (except for uploading -xx@ debugger data, until I can figure out how to do it with Perl), I rewrote the tree traverse tool into Perl, which also makes it a lot faster and easier to work with. This issue appeared on kernel 4.11 as far as I can tell, some new values in /sys make the traverse hang if it tries to read the values, **/parameters/** and **/debug/** seem to be the main culprits, but inxi doesn't need that data anyway for debugging purposes so it's just excluded. --- inxi | 680 ++++++++++++++++++++++++++++--------------------- inxi.changelog | 23 ++ 2 files changed, 413 insertions(+), 290 deletions(-) diff --git a/inxi b/inxi index e44929f..d09d2c6 100755 --- a/inxi +++ b/inxi @@ -2,8 +2,8 @@ ######################################################################## SELF_NAME='inxi' # don't quote the following, parsers grab these too -SELF_VERSION=2.3.35 -SELF_DATE=2017-08-11 +SELF_VERSION=2.3.36 +SELF_DATE=2017-08-16 SELF_PATCH=00 ######################################################################## #### SPECIAL THANKS @@ -1764,14 +1764,12 @@ set_man_location() # args: $1 - debug data type: sys|xorg|disk debug_data_collector() { - local xiin_app='' xiin_data_file='' xiin_download='' error='' b_run_xiin='false' - local debug_data_dir='' bsd_string='' xorg_d_files='' xorg_file='' a_distro_ids='' - local completed_gz_file='' xiin_file='xiin.py' ftp_upload='ftp.techpatterns.com/incoming' - local xiin_url="https://github.com/smxi/inxi/raw/xiin/$xiin_file" - local Line='-------------------------' root_string='' + local xiin_app='' xiin_data_file='' error='' b_run_xiin='false' b_xiin_downloaded='false' + local Debug_Data_Dir='' bsd_string='' xorg_d_files='' xorg_file='' a_distro_ids='' + local completed_gz_file='' Xiin_File='xiin.py' ftp_upload='ftp.techpatterns.com/incoming' + local Line='-------------------------' local start_directory=$( pwd ) - local host='' - local downloader_error=0 debug_i='' + local host='' debug_i='' root_string='' if (( "$BASH" >= 4 ));then host="${HOSTNAME,,}" @@ -1795,7 +1793,7 @@ debug_data_collector() root_string='-root' fi - debug_data_dir="inxi$bsd_string-$host-$(date +%Y%m%d-%H%M%S)-$1$root_string" + Debug_Data_Dir="inxi$bsd_string-$host-$(date +%Y%m%d-%H%M%S)-$1$root_string" if [[ $B_IRC == 'false' ]];then if [[ -n $ALTERNATE_FTP ]];then @@ -1803,470 +1801,507 @@ debug_data_collector() fi echo "Starting debugging data collection type: $1" cd $SELF_DATA_DIR - if [[ -d $SELF_DATA_DIR/$debug_data_dir ]];then + if [[ -d $SELF_DATA_DIR/$Debug_Data_Dir ]];then echo 'Deleting previous xiin data directory...' - rm -rf $SELF_DATA_DIR/$debug_data_dir + rm -rf $SELF_DATA_DIR/$Debug_Data_Dir fi - mkdir $SELF_DATA_DIR/$debug_data_dir - if [[ -f $SELF_DATA_DIR/$debug_data_dir.tar.gz ]];then + mkdir $SELF_DATA_DIR/$Debug_Data_Dir + if [[ -f $SELF_DATA_DIR/$Debug_Data_Dir.tar.gz ]];then echo 'Deleting previous tar.gz file...' - rm -f $SELF_DATA_DIR/$debug_data_dir.tar.gz + rm -f $SELF_DATA_DIR/$Debug_Data_Dir.tar.gz fi echo 'Collecting system info: sensors, lsusb, lspci, lspci -v data, plus /proc data' echo 'also checking for dmidecode data: note, you must be root to have dmidecode work.' - echo "Data going into: $SELF_DATA_DIR/$debug_data_dir" + echo "Data going into: $SELF_DATA_DIR/$Debug_Data_Dir" # bsd tools http://cb.vu/unixtoolbox.xhtml # freebsd if type -p pciconf &>/dev/null;then - pciconf -l -cv &> $debug_data_dir/bsd-pciconf-cvl.txt - pciconf -vl &> $debug_data_dir/bsd-pciconf-vl.txt - pciconf -l &> $debug_data_dir/bsd-pciconf-l.txt + pciconf -l -cv &> $Debug_Data_Dir/bsd-pciconf-cvl.txt + pciconf -vl &> $Debug_Data_Dir/bsd-pciconf-vl.txt + pciconf -l &> $Debug_Data_Dir/bsd-pciconf-l.txt else - touch $debug_data_dir/bsd-pciconf-absent + touch $Debug_Data_Dir/bsd-pciconf-absent fi # openbsd if type -p pcidump &>/dev/null;then - pcidump &> $debug_data_dir/bsd-pcidump-openbsd.txt - pcidump -v &> $debug_data_dir/bsd-pcidump-v-openbsd.txt + pcidump &> $Debug_Data_Dir/bsd-pcidump-openbsd.txt + pcidump -v &> $Debug_Data_Dir/bsd-pcidump-v-openbsd.txt else - touch $debug_data_dir/bsd-pcidump-openbsd-absent + touch $Debug_Data_Dir/bsd-pcidump-openbsd-absent fi # netbsd if type -p pcictl &>/dev/null;then - pcictl list &> $debug_data_dir/bsd-pcictl-list-netbsd.txt - pcictl list -n &> $debug_data_dir/bsd-pcictl-list-n-netbsd.txt + pcictl list &> $Debug_Data_Dir/bsd-pcictl-list-netbsd.txt + pcictl list -n &> $Debug_Data_Dir/bsd-pcictl-list-n-netbsd.txt else - touch $debug_data_dir/bsd-pcictl-netbsd-absent + touch $Debug_Data_Dir/bsd-pcictl-netbsd-absent fi if type -p sysctl &>/dev/null;then - sysctl -a &> $debug_data_dir/bsd-sysctl-a.txt + sysctl -a &> $Debug_Data_Dir/bsd-sysctl-a.txt else - touch $debug_data_dir/bsd-sysctl-absent + touch $Debug_Data_Dir/bsd-sysctl-absent fi if type -p usbdevs &>/dev/null;then - usbdevs -v &> $debug_data_dir/bsd-usbdevs-v.txt + usbdevs -v &> $Debug_Data_Dir/bsd-usbdevs-v.txt else - touch $debug_data_dir/bsd-usbdevs-absent + touch $Debug_Data_Dir/bsd-usbdevs-absent fi if type -p kldstat &>/dev/null;then - kldstat &> $debug_data_dir/bsd-kldstat.txt + kldstat &> $Debug_Data_Dir/bsd-kldstat.txt else - touch $debug_data_dir/bsd-kldstat-absent + touch $Debug_Data_Dir/bsd-kldstat-absent fi # diskinfo -v # fdisk - dmidecode &> $debug_data_dir/dmidecode.txt + dmidecode &> $Debug_Data_Dir/dmidecode.txt - get_repo_data "$SELF_DATA_DIR/$debug_data_dir" + get_repo_data "$SELF_DATA_DIR/$Debug_Data_Dir" if type -p shopt &>/dev/null;then shopt -s nullglob a_distro_ids=(/etc/*[-_]{release,version}) shopt -u nullglob - echo ${a_distro_ids[@]} &> $debug_data_dir/etc-distro-files.txt + echo ${a_distro_ids[@]} &> $Debug_Data_Dir/etc-distro-files.txt for distro_file in ${a_distro_ids[@]} /etc/issue do if [[ -f $distro_file ]];then - cat $distro_file &> $debug_data_dir/distro-file${distro_file//\//-} + cat $distro_file &> $Debug_Data_Dir/distro-file${distro_file//\//-} fi done fi - dmesg &> $debug_data_dir/dmesg.txt - lscpu &> $debug_data_dir/lscpu.txt - lspci &> $debug_data_dir/lspci.txt - lspci -k &> $debug_data_dir/lspci-k.txt - lspci -knn &> $debug_data_dir/lspci-knn.txt - lspci -n &> $debug_data_dir/lspci-n.txt - lspci -nn &> $debug_data_dir/lspci-nn.txt - lspci -mm &> $debug_data_dir/lspci-mm.txt - lspci -mmnn &> $debug_data_dir/lspci-mmnn.txt - lspci -mmnnv &> $debug_data_dir/lspci-mmnnv.txt - lspci -v &> $debug_data_dir/lspci-v.txt - lsusb &> $debug_data_dir/lsusb.txt + dmesg &> $Debug_Data_Dir/dmesg.txt + lscpu &> $Debug_Data_Dir/lscpu.txt + lspci &> $Debug_Data_Dir/lspci.txt + lspci -k &> $Debug_Data_Dir/lspci-k.txt + lspci -knn &> $Debug_Data_Dir/lspci-knn.txt + lspci -n &> $Debug_Data_Dir/lspci-n.txt + lspci -nn &> $Debug_Data_Dir/lspci-nn.txt + lspci -mm &> $Debug_Data_Dir/lspci-mm.txt + lspci -mmnn &> $Debug_Data_Dir/lspci-mmnn.txt + lspci -mmnnv &> $Debug_Data_Dir/lspci-mmnnv.txt + lspci -v &> $Debug_Data_Dir/lspci-v.txt + lsusb &> $Debug_Data_Dir/lsusb.txt if type -p hciconfig &>/dev/null;then - hciconfig -a &> $debug_data_dir/hciconfig-a.txt + hciconfig -a &> $Debug_Data_Dir/hciconfig-a.txt else - touch $debug_data_dir/hciconfig-absent + touch $Debug_Data_Dir/hciconfig-absent fi - ls /sys &> $debug_data_dir/ls-sys.txt - ps aux &> $debug_data_dir/ps-aux.txt - ps -e &> $debug_data_dir/ps-e.txt - ps -p 1 &> $debug_data_dir/ps-p-1.txt - cat /proc/1/comm &> $debug_data_dir/proc-1-comm.txt - runlevel &> $debug_data_dir/runlevel.txt + ls /sys &> $Debug_Data_Dir/ls-sys.txt + ps aux &> $Debug_Data_Dir/ps-aux.txt + ps -e &> $Debug_Data_Dir/ps-e.txt + ps -p 1 &> $Debug_Data_Dir/ps-p-1.txt + cat /proc/1/comm &> $Debug_Data_Dir/proc-1-comm.txt + runlevel &> $Debug_Data_Dir/runlevel.txt if type -p rc-status &>/dev/null;then - rc-status -a &> $debug_data_dir/rc-status-a.txt - rc-status -l &> $debug_data_dir/rc-status-l.txt - rc-status -r &> $debug_data_dir/rc-status-r.txt + rc-status -a &> $Debug_Data_Dir/rc-status-a.txt + rc-status -l &> $Debug_Data_Dir/rc-status-l.txt + rc-status -r &> $Debug_Data_Dir/rc-status-r.txt else - touch $debug_data_dir/rc-status-absent + touch $Debug_Data_Dir/rc-status-absent fi if type -p systemctl &>/dev/null;then - systemctl list-units &> $debug_data_dir/systemctl-list-units.txt - systemctl list-units --type=target &> $debug_data_dir/systemctl-list-units-target.txt + systemctl list-units &> $Debug_Data_Dir/systemctl-list-units.txt + systemctl list-units --type=target &> $Debug_Data_Dir/systemctl-list-units-target.txt else - touch $debug_data_dir/systemctl-absent + touch $Debug_Data_Dir/systemctl-absent fi if type -p initctl &>/dev/null;then - initctl list &> $debug_data_dir/initctl-list.txt + initctl list &> $Debug_Data_Dir/initctl-list.txt else - touch $debug_data_dir/initctl-absent + touch $Debug_Data_Dir/initctl-absent fi - sensors &> $debug_data_dir/sensors.txt + sensors &> $Debug_Data_Dir/sensors.txt if type -p strings &>/dev/null;then - touch $debug_data_dir/strings-present + touch $Debug_Data_Dir/strings-present else - touch $debug_data_dir/strings-absent + touch $Debug_Data_Dir/strings-absent fi local id_dir='/sys/class/power_supply/' local ids=$( ls $id_dir 2>/dev/null ) if [[ -n $ids ]];then for batid in $ids do - cat $id_dir$batid'/uevent' &> $debug_data_dir/sys-power-supply-$batid.txt + cat $id_dir$batid'/uevent' &> $Debug_Data_Dir/sys-power-supply-$batid.txt done else - touch $debug_data_dir/sys-power-supply-none + touch $Debug_Data_Dir/sys-power-supply-none fi # leaving this commented out to remind that some systems do not # support strings --version, but will just simply hang at that command # which you can duplicate by simply typing: strings then hitting enter, you will get hang. - # strings --version &> $debug_data_dir/strings.txt + # strings --version &> $Debug_Data_Dir/strings.txt if type -p nvidia-smi &>/dev/null;then - nvidia-smi -q &> $debug_data_dir/nvidia-smi-q.txt - nvidia-smi -q -x &> $debug_data_dir/nvidia-smi-xq.txt + nvidia-smi -q &> $Debug_Data_Dir/nvidia-smi-q.txt + nvidia-smi -q -x &> $Debug_Data_Dir/nvidia-smi-xq.txt else - touch $debug_data_dir/nvidia-smi-absent + touch $Debug_Data_Dir/nvidia-smi-absent fi - head -n 1 /proc/asound/card*/codec* &> $debug_data_dir/proc-asound-card-codec.txt + head -n 1 /proc/asound/card*/codec* &> $Debug_Data_Dir/proc-asound-card-codec.txt if [[ -f /proc/version ]];then - cat /proc/version &> $debug_data_dir/proc-version.txt + cat /proc/version &> $Debug_Data_Dir/proc-version.txt else - touch $debug_data_dir/proc-version-absent + touch $Debug_Data_Dir/proc-version-absent fi - echo $CC &> $debug_data_dir/cc-content.txt - ls /usr/bin/gcc* &> $debug_data_dir/gcc-sys-versions.txt + echo $CC &> $Debug_Data_Dir/cc-content.txt + ls /usr/bin/gcc* &> $Debug_Data_Dir/gcc-sys-versions.txt if type -p gcc &>/dev/null;then - gcc --version &> $debug_data_dir/gcc-version.txt + gcc --version &> $Debug_Data_Dir/gcc-version.txt else - touch $debug_data_dir/gcc-absent + touch $Debug_Data_Dir/gcc-absent fi if type -p clang &>/dev/null;then - clang --version &> $debug_data_dir/clang-version.txt + clang --version &> $Debug_Data_Dir/clang-version.txt else - touch $debug_data_dir/clang-absent + touch $Debug_Data_Dir/clang-absent fi if type -p systemd-detect-virt &>/dev/null;then - systemd-detect-virt &> $debug_data_dir/systemd-detect-virt-info.txt + systemd-detect-virt &> $Debug_Data_Dir/systemd-detect-virt-info.txt else - touch $debug_data_dir/systemd-detect-virt-absent + touch $Debug_Data_Dir/systemd-detect-virt-absent fi - cat /etc/src.conf &> $debug_data_dir/bsd-etc-src-conf.txt - cat /etc/make.conf &> $debug_data_dir/bsd-etc-make-conf.txt - cat /etc/issue &> $debug_data_dir/etc-issue.txt - cat $FILE_LSB_RELEASE &> $debug_data_dir/lsb-release.txt - cat $FILE_OS_RELEASE &> $debug_data_dir/os-release.txt - cat $FILE_ASOUND_DEVICE &> $debug_data_dir/proc-asound-device.txt - cat $FILE_ASOUND_VERSION &> $debug_data_dir/proc-asound-version.txt - cat $FILE_CPUINFO &> $debug_data_dir/proc-cpu-info.txt - cat $FILE_MEMINFO &> $debug_data_dir/proc-meminfo.txt - cat $FILE_MODULES &> $debug_data_dir/proc-modules.txt - cat /proc/net/arp &> $debug_data_dir/proc-net-arp.txt + cat /etc/src.conf &> $Debug_Data_Dir/bsd-etc-src-conf.txt + cat /etc/make.conf &> $Debug_Data_Dir/bsd-etc-make-conf.txt + cat /etc/issue &> $Debug_Data_Dir/etc-issue.txt + cat $FILE_LSB_RELEASE &> $Debug_Data_Dir/lsb-release.txt + cat $FILE_OS_RELEASE &> $Debug_Data_Dir/os-release.txt + cat $FILE_ASOUND_DEVICE &> $Debug_Data_Dir/proc-asound-device.txt + cat $FILE_ASOUND_VERSION &> $Debug_Data_Dir/proc-asound-version.txt + cat $FILE_CPUINFO &> $Debug_Data_Dir/proc-cpu-info.txt + cat $FILE_MEMINFO &> $Debug_Data_Dir/proc-meminfo.txt + cat $FILE_MODULES &> $Debug_Data_Dir/proc-modules.txt + cat /proc/net/arp &> $Debug_Data_Dir/proc-net-arp.txt # bsd data - cat /var/run/dmesg.boot &> $debug_data_dir/bsd-var-run-dmesg.boot.txt - echo $COLS_INNER &> $debug_data_dir/cols-inner.txt - echo $XDG_CONFIG_HOME &> $debug_data_dir/xdg_config_home.txt - echo $XDG_CONFIG_DIRS &> $debug_data_dir/xdg_config_dirs.txt - echo $XDG_DATA_HOME &> $debug_data_dir/xdg_data_home.txt - echo $XDG_DATA_DIRS &> $debug_data_dir/xdg_data_dirs.txt + cat /var/run/dmesg.boot &> $Debug_Data_Dir/bsd-var-run-dmesg.boot.txt + echo $COLS_INNER &> $Debug_Data_Dir/cols-inner.txt + echo $XDG_CONFIG_HOME &> $Debug_Data_Dir/xdg_config_home.txt + echo $XDG_CONFIG_DIRS &> $Debug_Data_Dir/xdg_config_dirs.txt + echo $XDG_DATA_HOME &> $Debug_Data_Dir/xdg_data_home.txt + echo $XDG_DATA_DIRS &> $Debug_Data_Dir/xdg_data_dirs.txt - check_recommends_user_output &> $debug_data_dir/check-recommends-user-output.txt - # first download and verify xiin - if [[ $B_UPLOAD_DEBUG_DATA == 'true' || $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then - touch $SELF_DATA_DIR/$debug_data_dir/xiin-error.txt - echo "Downloading required tree traverse tool $xiin_file..." - if [[ -f xiin && ! -f $xiin_file ]];then - mv -f xiin $xiin_file - fi - # -Nc is creating really weird download anomalies, so using -O instead - case $DOWNLOADER in - curl) - xiin_download="$( curl $NO_SSL_OPT -s $xiin_url )" || downloader_error=$? - ;; - fetch) - xiin_download="$( fetch $NO_SSL_OPT -q -o - $xiin_url )" || downloader_error=$? - ;; - ftp) - xiin_download="$( ftp $NO_SSL_OPT -o - $xiin_url 2>/dev/null )" || downloader_error=$? - ;; - wget) - xiin_download="$( wget $NO_SSL_OPT -q -O - $xiin_url )" || downloader_error=$? - ;; - no-downloader) - downloader_error=1 - ;; - esac - # if nothing got downloaded kick out error, otherwise we'll use an older version - if [[ $downloader_error -gt 0 && ! -f $xiin_file ]];then - echo -e "ERROR: Failed to download required file: $xiin_file\nMaybe the remote site is down or your networking is broken?" - echo "Continuing with incomplete data collection." - echo "$xiin_file download failed and no existing $xiin_file" >> $debug_data_dir/xiin-error.txt - elif [[ -n $( grep -s '# EOF' <<< "$xiin_download" ) || -f $xiin_file ]];then - if [[ -n $( grep -s '# EOF' <<< "$xiin_download" ) ]];then - echo "Updating $xiin_file from remote location" - echo "$xiin_download" > $xiin_file - else - echo "Using local $xiin_file due to download failure" - fi - b_run_xiin='true' - else - echo -e "ERROR: $xiin_file downloaded but the program file data is corrupted.\nContinuing with incomplete data collection." - echo "$xiin_file downloaded but the program file data is corrupted." >> $debug_data_dir/xiin-error.txt - fi - fi - # note, only bash 4> supports ;;& for case, so using if/then here - if [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then - xiin_data_file=$SELF_DATA_DIR/$debug_data_dir/xiin-sys.txt - echo 'Collecting networking data...' - ifconfig &> $debug_data_dir/ifconfig.txt - ip addr &> $debug_data_dir/ip-addr.txt - # f="$( find /sys -mindepth 1 -type f -exec gawk 'END { print FILENAME ":[" $0 "]"}' 2>/dev/null {} \; )" 2>/dev/null;echo "$f" - # https://stackoverflow.com/questions/5119946/find-exec-with-multiple-commands - if [[ $b_run_xiin == 'true' && -z $BSD_TYPE ]];then - echo $Line - echo "Running $xiin_file tool now on /sys..." - echo "Using Python version:" && python --version - python --version &> $debug_data_dir/python-version.txt - python ./$xiin_file -d /sys -f $xiin_data_file - if [[ $? -ne 0 ]];then - error=$? - echo -e "ERROR: $xiin_file exited with error $error - removing data file.\nContinuing with incomplete data collection." - echo "Continuing with incomplete data collection." - rm -f $xiin_data_file - echo "$xiin_file data generation failed with python error $error" >> $debug_data_dir/xiin-error.txt - fi - echo $Line - fi - fi + check_recommends_user_output &> $Debug_Data_Dir/check-recommends-user-output.txt if [[ $1 == 'xorg' || $1 == 'all' ]];then if [[ $B_RUNNING_IN_DISPLAY != 'true' ]];then echo 'Warning: only some of the data collection can occur if you are not in X' - touch $debug_data_dir/warning-user-not-in-x + touch $Debug_Data_Dir/warning-user-not-in-x fi if [[ $B_ROOT == 'true' ]];then echo 'Warning: only some of the data collection can occur if you are running as Root user' - touch $debug_data_dir/warning-root-user + touch $Debug_Data_Dir/warning-root-user fi echo 'Collecting Xorg log and xorg.conf files' if [[ -e $FILE_XORG_LOG ]];then - cat $FILE_XORG_LOG &> $debug_data_dir/xorg-log-file.txt + cat $FILE_XORG_LOG &> $Debug_Data_Dir/xorg-log-file.txt else - touch $debug_data_dir/xorg-log-file-absent + touch $Debug_Data_Dir/xorg-log-file-absent fi if [[ -e /etc/X11/xorg.conf ]];then - cat /etc/X11/xorg.conf &> $debug_data_dir/xorg-conf.txt + cat /etc/X11/xorg.conf &> $Debug_Data_Dir/xorg-conf.txt else - touch $debug_data_dir/xorg-conf-file-absent + touch $Debug_Data_Dir/xorg-conf-file-absent fi if [[ -n $( ls /etc/X11/xorg.conf.d/ 2>/dev/null ) ]];then - ls /etc/X11/xorg.conf.d &> $debug_data_dir/ls-etc-x11-xorg-conf-d.txt + ls /etc/X11/xorg.conf.d &> $Debug_Data_Dir/ls-etc-x11-xorg-conf-d.txt xorg_d_files=$(ls /etc/X11/xorg.conf.d) for xorg_file in $xorg_d_files do - cat /etc/X11/xorg.conf.d/$xorg_file &> $debug_data_dir/xorg-conf-d-$xorg_file.txt + cat /etc/X11/xorg.conf.d/$xorg_file &> $Debug_Data_Dir/xorg-conf-d-$xorg_file.txt done else - touch $debug_data_dir/xorg-conf-d-files-absent + touch $Debug_Data_Dir/xorg-conf-d-files-absent fi echo 'Collecting X, xprop, glxinfo, xrandr, xdpyinfo data, wayland, weston...' if type -p weston-info &>/dev/null; then - weston-info &> $debug_data_dir/weston-info.txt + weston-info &> $Debug_Data_Dir/weston-info.txt else - touch $debug_data_dir/weston-info-absent + touch $Debug_Data_Dir/weston-info-absent fi if type -p weston &>/dev/null; then - weston --version &> $debug_data_dir/weston-version.txt + weston --version &> $Debug_Data_Dir/weston-version.txt else - touch $debug_data_dir/weston-absent + touch $Debug_Data_Dir/weston-absent fi if type -p xprop &>/dev/null; then - xprop -root &> $debug_data_dir/xprop_root.txt + xprop -root &> $Debug_Data_Dir/xprop_root.txt else - touch $debug_data_dir/xprop-absent + touch $Debug_Data_Dir/xprop-absent fi if type -p glxinfo &>/dev/null; then - glxinfo &> $debug_data_dir/glxinfo-full.txt - glxinfo -B &> $debug_data_dir/glxinfo-B.txt + glxinfo &> $Debug_Data_Dir/glxinfo-full.txt + glxinfo -B &> $Debug_Data_Dir/glxinfo-B.txt else - touch $debug_data_dir/glxinfo-absent + touch $Debug_Data_Dir/glxinfo-absent fi if type -p xdpyinfo &>/dev/null; then - xdpyinfo &> $debug_data_dir/xdpyinfo.txt + xdpyinfo &> $Debug_Data_Dir/xdpyinfo.txt else - touch $debug_data_dir/xdpyinfo-absent + touch $Debug_Data_Dir/xdpyinfo-absent fi if type -p xrandr &>/dev/null; then - xrandr &> $debug_data_dir/xrandr.txt + xrandr &> $Debug_Data_Dir/xrandr.txt else - touch $debug_data_dir/xrandr-absent + touch $Debug_Data_Dir/xrandr-absent fi if type -p X &>/dev/null; then - X -version &> $debug_data_dir/x-version.txt + X -version &> $Debug_Data_Dir/x-version.txt else - touch $debug_data_dir/x-absent + touch $Debug_Data_Dir/x-absent fi if type -p Xorg &>/dev/null; then - Xorg -version &> $debug_data_dir/xorg-version.txt + Xorg -version &> $Debug_Data_Dir/xorg-version.txt else - touch $debug_data_dir/xorg-absent + touch $Debug_Data_Dir/xorg-absent fi - echo $GNOME_DESKTOP_SESSION_ID &> $debug_data_dir/gnome-desktop-session-id.txt + echo $GNOME_DESKTOP_SESSION_ID &> $Debug_Data_Dir/gnome-desktop-session-id.txt # kde 3 id - echo $KDE_FULL_SESSION &> $debug_data_dir/kde3-full-session.txt - echo $KDE_SESSION_VERSION &> $debug_data_dir/kde-gte-4-session-version.txt + echo $KDE_FULL_SESSION &> $Debug_Data_Dir/kde3-full-session.txt + echo $KDE_SESSION_VERSION &> $Debug_Data_Dir/kde-gte-4-session-version.txt if type -p kf5-config &>/dev/null; then - kf5-config --version &> $debug_data_dir/kde-kf5-config-version-data.txt + kf5-config --version &> $Debug_Data_Dir/kde-kf5-config-version-data.txt elif type -p kf6-config &>/dev/null; then - kf6-config --version &> $debug_data_dir/kde-kf6-config-version-data.txt + kf6-config --version &> $Debug_Data_Dir/kde-kf6-config-version-data.txt elif type -p kf$KDE_SESSION_VERSION-config &>/dev/null; then - kf$KDE_SESSION_VERSION-config --version &> $debug_data_dir/kde-kf$KDE_SESSION_VERSION-KSV-config-version-data.txt + kf$KDE_SESSION_VERSION-config --version &> $Debug_Data_Dir/kde-kf$KDE_SESSION_VERSION-KSV-config-version-data.txt else - touch $debug_data_dir/kde-kf-config-absent + touch $Debug_Data_Dir/kde-kf-config-absent fi if type -p plasmashell &>/dev/null; then - plasmashell --version &> $debug_data_dir/kde-plasmashell-version-data.txt + plasmashell --version &> $Debug_Data_Dir/kde-plasmashell-version-data.txt else - touch $debug_data_dir/kde-plasmashell-absent + touch $Debug_Data_Dir/kde-plasmashell-absent fi if type -p kwin_x11 &>/dev/null; then - kwin_x11 --version &> $debug_data_dir/kde-kwin_x11-version-data.txt + kwin_x11 --version &> $Debug_Data_Dir/kde-kwin_x11-version-data.txt else - touch $debug_data_dir/kde-kwin_x11-absent + touch $Debug_Data_Dir/kde-kwin_x11-absent fi if type -p kded4 &>/dev/null; then - kded4 --version &> $debug_data_dir/kded4-version-data.txt + kded4 --version &> $Debug_Data_Dir/kded4-version-data.txt elif type -p kded5 &>/dev/null; then - kded5 --version &> $debug_data_dir/kded5-version-data.txt + kded5 --version &> $Debug_Data_Dir/kded5-version-data.txt elif type -p kded &>/dev/null; then - kded --version &> $debug_data_dir/kded-version-data.txt + kded --version &> $Debug_Data_Dir/kded-version-data.txt else - touch $debug_data_dir/kded-$KDE_SESSION_VERSION-absent + touch $Debug_Data_Dir/kded-$KDE_SESSION_VERSION-absent fi # kde 5/plasma desktop 5, this is maybe an extra package and won't be used if type -p about-distro &>/dev/null; then - about-distro &> $debug_data_dir/kde-about-distro.txt + about-distro &> $Debug_Data_Dir/kde-about-distro.txt else - touch $debug_data_dir/kde-about-distro-absent + touch $Debug_Data_Dir/kde-about-distro-absent fi - echo $XDG_CURRENT_DESKTOP &> $debug_data_dir/xdg-current-desktop.txt - echo $XDG_SESSION_DESKTOP &> $debug_data_dir/xdg-session-desktop.txt - echo $DESKTOP_SESSION &> $debug_data_dir/desktop-session.txt - echo $GDMSESSION &> $debug_data_dir/gdmsession.txt + echo $XDG_CURRENT_DESKTOP &> $Debug_Data_Dir/xdg-current-desktop.txt + echo $XDG_SESSION_DESKTOP &> $Debug_Data_Dir/xdg-session-desktop.txt + echo $DESKTOP_SESSION &> $Debug_Data_Dir/desktop-session.txt + echo $GDMSESSION &> $Debug_Data_Dir/gdmsession.txt # wayland data collectors: - echo $XDG_SESSION_TYPE &> $debug_data_dir/xdg-session-type.txt - echo $WAYLAND_DISPLAY &> $debug_data_dir/wayland-display.txt - echo $GDK_BACKEND &> $debug_data_dir/gdk-backend.txt - echo $QT_QPA_PLATFORM &> $debug_data_dir/qt-qpa-platform.txt - echo $CLUTTER_BACKEND &> $debug_data_dir/clutter-backend.txt - echo $SDL_VIDEODRIVER &> $debug_data_dir/sdl-videodriver.txt + echo $XDG_SESSION_TYPE &> $Debug_Data_Dir/xdg-session-type.txt + echo $WAYLAND_DISPLAY &> $Debug_Data_Dir/wayland-display.txt + echo $GDK_BACKEND &> $Debug_Data_Dir/gdk-backend.txt + echo $QT_QPA_PLATFORM &> $Debug_Data_Dir/qt-qpa-platform.txt + echo $CLUTTER_BACKEND &> $Debug_Data_Dir/clutter-backend.txt + echo $SDL_VIDEODRIVER &> $Debug_Data_Dir/sdl-videodriver.txt if type -p loginctl &>/dev/null;then - loginctl --no-pager list-sessions &> $debug_data_dir/loginctl-list-sessions.txt + loginctl --no-pager list-sessions &> $Debug_Data_Dir/loginctl-list-sessions.txt else - touch $debug_data_dir/loginctl-absent + touch $Debug_Data_Dir/loginctl-absent fi fi if [[ $1 == 'disk' || $1 == 'all' ]];then echo 'Collecting dev, label, disk, uuid data, df...' - ls -l /dev &> $debug_data_dir/dev-data.txt - ls -l /dev/disk &> $debug_data_dir/dev-disk-data.txt - ls -l /dev/disk/by-id &> $debug_data_dir/dev-disk-id-data.txt - ls -l /dev/disk/by-label &> $debug_data_dir/dev-disk-label-data.txt - ls -l /dev/disk/by-uuid &> $debug_data_dir/dev-disk-uuid-data.txt + ls -l /dev &> $Debug_Data_Dir/dev-data.txt + ls -l /dev/disk &> $Debug_Data_Dir/dev-disk-data.txt + ls -l /dev/disk/by-id &> $Debug_Data_Dir/dev-disk-id-data.txt + ls -l /dev/disk/by-label &> $Debug_Data_Dir/dev-disk-label-data.txt + ls -l /dev/disk/by-uuid &> $Debug_Data_Dir/dev-disk-uuid-data.txt # http://comments.gmane.org/gmane.linux.file-systems.zfs.user/2032 - ls -l /dev/disk/by-wwn &> $debug_data_dir/dev-disk-wwn-data.txt - ls -l /dev/disk/by-path &> $debug_data_dir/dev-disk-path-data.txt - ls -l /dev/mapper &> $debug_data_dir/dev-disk-mapper-data.txt - readlink /dev/root &> $debug_data_dir/dev-root.txt - df -h -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs &> $debug_data_dir/df-h-T-P-excludes.txt - df -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs &> $debug_data_dir/df-T-P-excludes.txt - df -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs --total &> $debug_data_dir/df-T-P-excludes-total.txt - df -h -T &> $debug_data_dir/bsd-df-h-T-no-excludes.txt - df -h &> $debug_data_dir/bsd-df-h-no-excludes.txt - df -k -T &> $debug_data_dir/bsd-df-k-T-no-excludes.txt - df -k &> $debug_data_dir/bsd-df-k-no-excludes.txt - atacontrol list &> $debug_data_dir/bsd-atacontrol-list.txt - camcontrol devlist &> $debug_data_dir/bsd-camcontrol-devlist.txt + ls -l /dev/disk/by-wwn &> $Debug_Data_Dir/dev-disk-wwn-data.txt + ls -l /dev/disk/by-path &> $Debug_Data_Dir/dev-disk-path-data.txt + ls -l /dev/mapper &> $Debug_Data_Dir/dev-disk-mapper-data.txt + readlink /dev/root &> $Debug_Data_Dir/dev-root.txt + df -h -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs &> $Debug_Data_Dir/df-h-T-P-excludes.txt + df -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs &> $Debug_Data_Dir/df-T-P-excludes.txt + df -T -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 --exclude-type=devfs --exclude-type=linprocfs --exclude-type=sysfs --exclude-type=fdescfs --total &> $Debug_Data_Dir/df-T-P-excludes-total.txt + df -h -T &> $Debug_Data_Dir/bsd-df-h-T-no-excludes.txt + df -h &> $Debug_Data_Dir/bsd-df-h-no-excludes.txt + df -k -T &> $Debug_Data_Dir/bsd-df-k-T-no-excludes.txt + df -k &> $Debug_Data_Dir/bsd-df-k-no-excludes.txt + atacontrol list &> $Debug_Data_Dir/bsd-atacontrol-list.txt + camcontrol devlist &> $Debug_Data_Dir/bsd-camcontrol-devlist.txt # bsd tool - mount &> $debug_data_dir/mount.txt - btrfs filesystem show &> $debug_data_dir/btrfs-filesystem-show.txt - btrfs filesystem show --mounted &> $debug_data_dir/btrfs-filesystem-show-mounted.txt - # btrfs filesystem show --all-devices &> $debug_data_dir/btrfs-filesystem-show-all-devices.txt - gpart list &> $debug_data_dir/bsd-gpart-list.txt - gpart show &> $debug_data_dir/bsd-gpart-show.txt - gpart status &> $debug_data_dir/bsd-gpart-status.txt - swapctl -l -k &> $debug_data_dir/bsd-swapctl-l-k.txt - swapon -s &> $debug_data_dir/swapon-s.txt - sysctl -b kern.geom.conftxt &> $debug_data_dir/bsd-sysctl-b-kern.geom.conftxt.txt - sysctl -b kern.geom.confxml &> $debug_data_dir/bsd-sysctl-b-kern.geom.confxml.txt - zfs list &> $debug_data_dir/bsd-zfs-list.txt - zpool list &> $debug_data_dir/bsd-zpool-list.txt - zpool list -v &> $debug_data_dir/bsd-zpool-list-v.txt - df -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 &> $debug_data_dir/df-P-excludes.txt - df -P &> $debug_data_dir/bsd-df-P-no-excludes.txt - cat /proc/mdstat &> $debug_data_dir/proc-mdstat.txt - cat $FILE_PARTITIONS &> $debug_data_dir/proc-partitions.txt - cat $FILE_SCSI &> $debug_data_dir/proc-scsi.txt - cat $FILE_MOUNTS &> $debug_data_dir/proc-mounts.txt - cat /proc/sys/dev/cdrom/info &> $debug_data_dir/proc-cdrom-info.txt - ls /proc/ide/ &> $debug_data_dir/proc-ide.txt - cat /proc/ide/*/* &> $debug_data_dir/proc-ide-hdx-cat.txt - cat /etc/fstab &> $debug_data_dir/etc-fstab.txt - cat /etc/mtab &> $debug_data_dir/etc-mtab.txt + mount &> $Debug_Data_Dir/mount.txt + btrfs filesystem show &> $Debug_Data_Dir/btrfs-filesystem-show.txt + btrfs filesystem show --mounted &> $Debug_Data_Dir/btrfs-filesystem-show-mounted.txt + # btrfs filesystem show --all-devices &> $Debug_Data_Dir/btrfs-filesystem-show-all-devices.txt + gpart list &> $Debug_Data_Dir/bsd-gpart-list.txt + gpart show &> $Debug_Data_Dir/bsd-gpart-show.txt + gpart status &> $Debug_Data_Dir/bsd-gpart-status.txt + swapctl -l -k &> $Debug_Data_Dir/bsd-swapctl-l-k.txt + swapon -s &> $Debug_Data_Dir/swapon-s.txt + sysctl -b kern.geom.conftxt &> $Debug_Data_Dir/bsd-sysctl-b-kern.geom.conftxt.txt + sysctl -b kern.geom.confxml &> $Debug_Data_Dir/bsd-sysctl-b-kern.geom.confxml.txt + zfs list &> $Debug_Data_Dir/bsd-zfs-list.txt + zpool list &> $Debug_Data_Dir/bsd-zpool-list.txt + zpool list -v &> $Debug_Data_Dir/bsd-zpool-list-v.txt + df -P --exclude-type=aufs --exclude-type=squashfs --exclude-type=unionfs --exclude-type=devtmpfs --exclude-type=tmpfs --exclude-type=iso9660 &> $Debug_Data_Dir/df-P-excludes.txt + df -P &> $Debug_Data_Dir/bsd-df-P-no-excludes.txt + cat /proc/mdstat &> $Debug_Data_Dir/proc-mdstat.txt + cat $FILE_PARTITIONS &> $Debug_Data_Dir/proc-partitions.txt + cat $FILE_SCSI &> $Debug_Data_Dir/proc-scsi.txt + cat $FILE_MOUNTS &> $Debug_Data_Dir/proc-mounts.txt + cat /proc/sys/dev/cdrom/info &> $Debug_Data_Dir/proc-cdrom-info.txt + ls /proc/ide/ &> $Debug_Data_Dir/proc-ide.txt + cat /proc/ide/*/* &> $Debug_Data_Dir/proc-ide-hdx-cat.txt + cat /etc/fstab &> $Debug_Data_Dir/etc-fstab.txt + cat /etc/mtab &> $Debug_Data_Dir/etc-mtab.txt fi - echo 'Creating inxi output file now. This can take a few seconds...' + if [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then + echo 'Collecting networking data...' + ifconfig &> $Debug_Data_Dir/ifconfig.txt + ip addr &> $Debug_Data_Dir/ip-addr.txt + fi + # first download and verify xiin + if [[ $B_UPLOAD_DEBUG_DATA == 'true' || $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then + touch $SELF_DATA_DIR/$Debug_Data_Dir/xiin-error.txt + fi + # note, only bash 4> supports ;;& for case, so using if/then here + if [[ -z $BSD_TYPE ]] && [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then + echo $Line + xiin_data_file=$SELF_DATA_DIR/$Debug_Data_Dir/xiin-sys.txt + touch $xiin_data_file + if type -p perl &>/dev/null;then + echo "Collecting data from /sys..." + echo -n "Using Perl: " && perl --version | grep -oE 'v[0-9.]+' + xiin_data="$( perl -e ' + use File::Find; + use strict; + # use warnings; + use 5.010; + my @content = (); + find( \&wanted, "/sys"); + process_data( @content ); + sub wanted { + return if -d; # not directory + return unless -e; # Must exist + return unless -r; # Must be readable + return unless -f; # Must be file + # note: a new file in 4.11 /sys can hang this, it is /parameter/ then + # a few variables. Since inxi does not need to see that file, we will + # not use it. Also do not need . files or __ starting files + return if $File::Find::name =~ /\/(\.[a-z]|__|parameters\/|debug\/)/; + # comment this one out if you experience hangs or if + # we discover syntax of foreign language characters + return unless -T; # Must be ascii like + # print $File::Find::name . "\n"; + push @content, $File::Find::name; + return; + } + sub process_data { + my $result = ""; + my $row = ""; + my $fh; + my $data=""; + my $sep=""; + # no sorts, we want the order it comes in + # @content = sort @content; + foreach (@content){ + $data=""; + $sep=""; + open($fh, "<$_"); + while ($row = <$fh>) { + chomp $row; + $data .= $sep . "\"" . $row . "\""; + $sep=", "; + } + $result .= "$_:[$data]\n"; + # print "$_:[$data]\n" + } + # print scalar @content . "\n"; + print "$result"; + } ' )" + if [[ -z "$xiin_data" ]];then + echo -e "ERROR: failed to generate /sys data - removing data file.\nContinuing with incomplete data collection." + echo "Continuing with incomplete data collection." + rm -f $xiin_data_file + echo "/sys data generation failed. No data collected." >> $Debug_Data_Dir/xiin-error.txt + else + echo 'Completed /sys data collection.' + echo -n "$xiin_data" > $xiin_data_file + fi + fi + if [[ -z "$xiin_data" ]];then + download_xiin 'sys' + if [[ $? -eq 0 ]];then + b_run_xiin='true' + b_xiin_downloaded='true' + echo "Running $Xiin_File tool now on /sys..." + echo -n "Using " && python --version + python --version &> $Debug_Data_Dir/python-version.txt + python ./$Xiin_File -d /sys -f $xiin_data_file + if [[ $? -ne 0 ]];then + error=$? + echo -e "ERROR: $Xiin_File exited with error $error - removing data file.\nContinuing with incomplete data collection." + rm -f $xiin_data_file + echo "$Xiin_File data generation failed with python error $error" >> $Debug_Data_Dir/xiin-error.txt + fi + fi + fi + + fi + # has to be before gz cleanup + if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then + if [[ $b_xiin_downloaded == 'false' ]];then + echo $Line + download_xiin 'upload' + if [[ $? -eq 0 ]];then + b_run_xiin='true' + fi + fi + fi + echo $Line + echo "Creating $SELF_NAME output file now. This can take a few seconds..." echo "Starting $SELF_NAME from: $start_directory" cd $start_directory - $SELF_PATH/$SELF_NAME -F${debug_i}Rfrploudmxxx -c 0 -@ 8 -y 120 > $SELF_DATA_DIR/$debug_data_dir/inxi-F${debug_i}Rfrploudmxxxy120.txt - cp $LOG_FILE $SELF_DATA_DIR/$debug_data_dir - if [[ -f $SELF_DATA_DIR/$debug_data_dir.tar.gz ]];then - echo "Found and removing previous tar.gz data file: $debug_data_dir.tar.gz" - rm -f $SELF_DATA_DIR/$debug_data_dir.tar.gz + $SELF_PATH/$SELF_NAME -F${debug_i}Rfrploudmxxx -c 0 -@ 8 -y 120 > $SELF_DATA_DIR/$Debug_Data_Dir/inxi-F${debug_i}Rfrploudmxxxy120.txt + cp $LOG_FILE $SELF_DATA_DIR/$Debug_Data_Dir + if [[ -f $SELF_DATA_DIR/$Debug_Data_Dir.tar.gz ]];then + echo "Found and removing previous tar.gz data file: $Debug_Data_Dir.tar.gz" + rm -f $SELF_DATA_DIR/$Debug_Data_Dir.tar.gz fi cd $SELF_DATA_DIR echo 'Creating tar.gz compressed file of this material now. Contents:' echo $Line - tar -cvzf $debug_data_dir.tar.gz $debug_data_dir + tar -cvzf $Debug_Data_Dir.tar.gz $Debug_Data_Dir echo $Line echo 'Cleaning up leftovers...' - rm -rf $debug_data_dir + rm -rf $Debug_Data_Dir echo 'Testing gzip file integrity...' - gzip -t $debug_data_dir.tar.gz + gzip -t $Debug_Data_Dir.tar.gz if [[ $? -gt 0 ]];then echo 'Data in gz is corrupted, removing gzip file, try running data collector again.' - rm -f $debug_data_dir.tar.gz - echo "Data in gz is corrupted, removed gzip file" >> $debug_data_dir/gzip-error.txt + rm -f $Debug_Data_Dir.tar.gz + echo "Data in gz is corrupted, removed gzip file" >> $Debug_Data_Dir/gzip-error.txt else echo 'All done, you can find your data gzipped directory here:' - completed_gz_file=$SELF_DATA_DIR/$debug_data_dir.tar.gz + completed_gz_file=$SELF_DATA_DIR/$Debug_Data_Dir.tar.gz echo $completed_gz_file if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then echo $Line if [[ $b_run_xiin == 'true' ]];then echo "Running automatic upload of data to remote server $ftp_upload now..." - python ./$xiin_file --version - python ./$xiin_file -u $completed_gz_file $ftp_upload + python ./$Xiin_File --version + python ./$Xiin_File -u $completed_gz_file $ftp_upload if [[ $? -gt 0 ]];then echo $Line echo "Error: looks like the ftp upload failed. Error number: $?" - echo "The ftp upload failed. Error number: $?" >> $debug_data_dir/xiin-error.txt + # echo "The ftp upload failed. Error number: $?" >> $Debug_Data_Dir/xiin-error.txt fi else - echo 'Unable to run the automoatic ftp upload because of an error with the xiin download.' - echo "Unable to run the automoatic ftp upload because of an error with the xiin download" >> $debug_data_dir/xiin-error.txt + echo 'Unable to run the automatic ftp upload because of an error with the xiin download.' + # echo "Unable to run the automoatic ftp upload because of an error with the xiin download" >> $Debug_Data_Dir/xiin-error.txt fi else echo 'You can upload this here using most file managers: ftp.techpatterns.com/incoming' @@ -2278,12 +2313,73 @@ debug_data_collector() fi exit 0 } +# $1 - download type [sys|upload] +download_xiin() +{ + local xiin_download='' xiin_url="https://github.com/smxi/inxi/raw/xiin/$Xiin_File" + local downloader_error=0 download_type='uploader' + + if [[ $1 == 'sys' ]];then + download_type='tree traverse' + fi + touch $Debug_Data_Dir/download_xiin.txt + echo "download_xiin: \$1 - $1" >> $Debug_Data_Dir/download_xiin.txt + echo "Downloading required $download_type tool $Xiin_File..." + if [[ -f xiin && ! -f $Xiin_File ]];then + mv -f xiin $Xiin_File + fi + # -Nc is creating really weird download anomalies, so using -O instead + case $DOWNLOADER in + curl) + xiin_download="$( curl $NO_SSL_OPT -s $xiin_url )" || downloader_error=$? + ;; + fetch) + xiin_download="$( fetch $NO_SSL_OPT -q -o - $xiin_url )" || downloader_error=$? + ;; + ftp) + xiin_download="$( ftp $NO_SSL_OPT -o - $xiin_url 2>/dev/null )" || downloader_error=$? + ;; + wget) + xiin_download="$( wget $NO_SSL_OPT -q -O - $xiin_url )" || downloader_error=$? + ;; + no-downloader) + downloader_error=100 + ;; + esac + # if nothing got downloaded kick out error, otherwise we'll use an older version + if [[ $downloader_error -gt 0 && ! -f $Xiin_File ]];then + echo -e "ERROR: Failed to download required file: $Xiin_File\nMaybe the remote site is down or your networking is broken?" + if [[ $1 == 'sys' ]];then + echo "Continuing with incomplete data collection." + else + echo "$SELF_NAME will be unable to automatically upload the debugger data." + fi + echo "$Xiin_File download failed and no existing $Xiin_File: error: $downloader_error" >> $Debug_Data_Dir/xiin-error.txt + return 1 + elif [[ -n $( grep -s '# EOF' <<< "$xiin_download" ) || -f $Xiin_File ]];then + if [[ -n $( grep -s '# EOF' <<< "$xiin_download" ) ]];then + echo "Updating $Xiin_File from remote location" + echo "$xiin_download" > $Xiin_File + else + echo "Using local $Xiin_File due to download failure" + fi + return 0 + else + if [[ $1 == 'sys' ]];then + echo -e "ERROR: $Xiin_File downloaded but the program file data is corrupted.\nContinuing with incomplete data collection." + else + echo -e "ERROR: $Xiin_File downloaded but the program file data is corrupted.\nWill not be able to automatically upload debugger data file." + fi + echo "$Xiin_File downloaded but the program file data is corrupted." >> $Debug_Data_Dir/xiin-error.txt + return 2 + fi +} check_recommends_user_output() { local Line=$LINE1 local gawk_version='N/A' sed_version='N/A' sudo_version='N/A' python_version='N/A' - local downloaders_bsd='' + local downloaders_bsd='' perl_version='N/A' if [[ $B_IRC == 'true' ]];then print_screen_output "Sorry, you can't run this option in an IRC client." @@ -2295,7 +2391,7 @@ check_recommends_user_output() ftp:ftp-OpenBSD-only~ftp-OpenBSD-only~ftp-OpenBSD-only~:-i_wan_ip;-w/-W;-U/-!_[11-15]_(OpenBSD_only)' fi initialize_paths - print_lines_basic "0" "" "$SELF_NAME will now begin checking for the programs it needs to operate. First a check of the main languages and tools $SELF_NAME uses. Python is only for debugging data collection." + print_lines_basic "0" "" "$SELF_NAME will now begin checking for the programs it needs to operate. First a check of the main languages and tools $SELF_NAME uses. Python is only for debugging data uploads unless Perl is missing." echo $Line echo "Bash version: $( bash --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU bash/ {print $4}' )" if type -p gawk &>/dev/null;then @@ -2314,10 +2410,15 @@ check_recommends_user_output() if type -p python &>/dev/null;then python_version=$( python --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^Python/ {print $2}' ) fi + # NOTE: does not actually handle 5/6 version, but ok for now + if type -p perl &>/dev/null;then + perl_version=$(perl --version | grep -m 1 -oE 'v[0-9.]+') + fi echo "Gawk version: $gawk_version" echo "Sed version: $sed_version" echo "Sudo version: $sudo_version" echo "Python version: $python_version" + echo "Perl version: $perl_versio" echo $Line echo "Test One: Required System Directories (Linux Only)." @@ -6380,7 +6481,7 @@ get_dmidecode_data() # To Be Filled By O.E.M. # strip out starting white space so that the following stuff will clear properly sub(/^[[:space:]]+/, "", twoData) - sub(/^Base Board .*|^Chassis .*|empty|.*O\.E\.M\..*|.*OEM.*|^Not .*|^System .*|.*unknow.*|.*N\/A.*|none|^To be filled.*|^0x[0]+$|\[Empty\]||^\.\.$/, "", twoData) + sub(/^Base Board .*|^Chassis .*|empty|.*O\.E\.M\..*|.*OEM.*|^Not .*|^System .*|.*unknow.*|.*N\/A.*|none|^To be filled.*|^0x[0]+$|\[Empty\]||Default string|^\.\.$/, "", twoData) sub(/.*(AssetTagNum|Manufacturer| Or Motherboard|PartNum.*|SerNum).*/, "", twoData) gsub(/\ybios\y|\yacpi\y/, "", twoData) # note: biostar sub(/http:\/\/www.abit.com.tw\//, "Abit", twoData) @@ -7758,7 +7859,6 @@ get_kernel_compiler_version() echo $compiler_version } - get_kernel_version() { eval $LOGFS @@ -7860,7 +7960,7 @@ get_machine_data() # Chassis Manufacturer|Chassis Version|Chassis Serial Number # System manufacturer|System Product Name|System Version # To Be Filled By O.E.M. - sub(/^Base Board .*|^Chassis .*|.*O\.E\.M\..*|.*OEM.*|^Not .*|^System .*|.*unknow.*|.*N\/A.*|none|^To be filled.*/, "", $0) + sub(/^Base Board .*|^Chassis .*|.*O\.E\.M\..*|.*OEM.*|^Not .*|^System .*|.*unknow.*|.*N\/A.*|Default string|none|^To be filled.*/, "", $0) gsub(/\ybios\y|\yacpi\y/, "", $0) # note: biostar sub(/http:\/\/www.abit.com.tw\//, "Abit", $0) gsub(/^ +| +$/, "", $0) diff --git a/inxi.changelog b/inxi.changelog index a8d45bc..b6f4456 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,3 +1,26 @@ +===================================================================================== +Version: 2.3.36 +Patch Version: 00 +Script Date: 2017-08-16 +----------------------------------- +Changes: +----------------------------------- +New version, new tarball. This fixes issue #119 + +The issue was not so much with xiin.py as with some new values in /sys that would +hang tree traverse, however, in order to remove the python dependency (except for +uploading -xx@ debugger data, until I can figure out how to do it with Perl), I +rewrote the tree traverse tool into Perl, which also makes it a lot faster and +easier to work with. + +This issue appeared on kernel 4.11 as far as I can tell, some new values in /sys make +the traverse hang if it tries to read the values, **/parameters/** and **/debug/** seem +to be the main culprits, but inxi doesn't need that data anyway for debugging purposes +so it's just excluded. + +----------------------------------- +-- Harald Hope - Wed, 16 Aug 2017 00:34:43 -0700 + ===================================================================================== Version: 2.3.35 Patch Version: 00