branch one: current inxi added to avoid errors.

This commit is contained in:
Harald Hope 2017-10-29 09:59:43 -07:00
parent 90962608fb
commit 7715d9bc30

418
inxi
View file

@ -2,9 +2,9 @@
######################################################################## ########################################################################
SELF_NAME='inxi' SELF_NAME='inxi'
# don't quote the following, parsers grab these too # don't quote the following, parsers grab these too
SELF_VERSION=2.3.35 SELF_VERSION=2.3.41
SELF_DATE=2017-08-11 SELF_DATE=2017-10-29
SELF_PATCH=03 SELF_PATCH=00-b1
######################################################################## ########################################################################
#### SPECIAL THANKS #### SPECIAL THANKS
######################################################################## ########################################################################
@ -28,7 +28,7 @@ SELF_PATCH=03
#### Jarett.Stevens - dmidecde -M patch for older systems with the /sys #### Jarett.Stevens - dmidecde -M patch for older systems with the /sys
#### ####
#### Current script home page/wiki/git: https://github.com/smxi/inxi #### Current script home page/wiki/git: https://github.com/smxi/inxi
#### Documentation/wiki pages will move to http://smxi.org soon. #### Documentation/wiki pages will move to https://smxi.org soon.
#### Script forums: http://techpatterns.com/forums/forum-33.html #### Script forums: http://techpatterns.com/forums/forum-33.html
#### IRC support: irc.oftc.net channel #smxi #### IRC support: irc.oftc.net channel #smxi
#### Version control: #### Version control:
@ -52,7 +52,6 @@ SELF_PATCH=03
#### If you don't understand what Free Software is, please read (or reread) #### If you don't understand what Free Software is, please read (or reread)
#### this page: http://www.gnu.org/philosophy/free-sw.html #### this page: http://www.gnu.org/philosophy/free-sw.html
######################################################################## ########################################################################
#### ####
#### PACKAGE NAME NOTES #### PACKAGE NAME NOTES
#### * Package names in (...) are the Debian Squeeze package name. Check your #### * Package names in (...) are the Debian Squeeze package name. Check your
@ -312,6 +311,7 @@ B_LABEL_SET='false'
B_LSPCI='false' B_LSPCI='false'
B_LOG_COLORS='false' B_LOG_COLORS='false'
B_LOG_FULL_DATA='false' B_LOG_FULL_DATA='false'
B_MAN='true'
B_MAPPER_SET='false' B_MAPPER_SET='false'
B_OUTPUT_FILTER='false' B_OUTPUT_FILTER='false'
B_OVERRIDE_FILTER='false' B_OVERRIDE_FILTER='false'
@ -489,14 +489,11 @@ SELF_DOWNLOAD='https://github.com/smxi/inxi/raw/master/'
SELF_DOWNLOAD_BRANCH_1='https://github.com/smxi/inxi/raw/one/' SELF_DOWNLOAD_BRANCH_1='https://github.com/smxi/inxi/raw/one/'
SELF_DOWNLOAD_BRANCH_2='https://github.com/smxi/inxi/raw/two/' SELF_DOWNLOAD_BRANCH_2='https://github.com/smxi/inxi/raw/two/'
SELF_DOWNLOAD_BRANCH_3='https://github.com/smxi/inxi/raw/three/' SELF_DOWNLOAD_BRANCH_3='https://github.com/smxi/inxi/raw/three/'
SELF_DOWNLOAD_BRANCH_4='https://github.com/smxi/inxi/raw/four/' SELF_DOWNLOAD_DEV='https://smxi.org/test/'
SELF_DOWNLOAD_BRANCH_BSD='https://github.com/smxi/inxi/raw/bsd/'
SELF_DOWNLOAD_BRANCH_GNUBSD='https://github.com/smxi/inxi/raw/gnubsd/'
SELF_DOWNLOAD_DEV='http://smxi.org/test/'
# note, you can use any ip url here as long as it's the only line on the output page. # note, you can use any ip url here as long as it's the only line on the output page.
# Also the ip address must be the last thing on that line. If you abuse this ip tool # Also the ip address must be the last thing on that line. If you abuse this ip tool
# you will be banned from further access. Most > 24x daily automated queries to it are abuse. # you will be banned from further access. Most > 24x daily automated queries to it are abuse.
WAN_IP_URL='http://smxi.org/opt/ip.php' WAN_IP_URL='https://smxi.org/opt/ip.php'
KONVI_CFG="konversation/scripts/$SELF_NAME.conf" # relative path to $(kde-config --path data) KONVI_CFG="konversation/scripts/$SELF_NAME.conf" # relative path to $(kde-config --path data)
### INITIALIZE VARIABLES NULL ### ### INITIALIZE VARIABLES NULL ###
@ -1323,7 +1320,7 @@ select_default_color_scheme()
;; ;;
esac esac
set_color_scheme $i set_color_scheme $i
print_screen_output "$irc_clear $i)$spacer${C1}Card:${C2} nVidia G86 [GeForce 8400 GS] ${C1}X.Org${C2} 1.7.7" print_screen_output "$irc_clear $i)$spacer${C1}Card:${C2} nVidia G86 [GeForce 8400 GS] ${C1}Display Server${C2} x11 (X.Org 1.7.7)"
done done
set_color_scheme 0 set_color_scheme 0
@ -1659,7 +1656,9 @@ script_self_updater()
print_screen_output "To run the new version, just start $SELF_NAME again." print_screen_output "To run the new version, just start $SELF_NAME again."
print_screen_output "----------------------------------------" print_screen_output "----------------------------------------"
print_screen_output "Starting download of man page file now." print_screen_output "Starting download of man page file now."
if [[ ! -d $man_file_location ]];then if [[ $B_MAN == 'false' ]];then
print_screen_output "Skipping man download because branch version is being used."
elif [[ ! -d $man_file_location ]];then
print_screen_output "The required man directory was not detected on your system, unable to continue: $man_file_location" print_screen_output "The required man directory was not detected on your system, unable to continue: $man_file_location"
else else
if [[ $B_ROOT == 'true' ]];then if [[ $B_ROOT == 'true' ]];then
@ -1764,12 +1763,12 @@ set_man_location()
# args: $1 - debug data type: sys|xorg|disk # args: $1 - debug data type: sys|xorg|disk
debug_data_collector() debug_data_collector()
{ {
local xiin_app='' xiin_data_file='' error='' b_run_xiin='false' b_xiin_downloaded='false' local xiin_app='' sys_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 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 completed_gz_file='' Xiin_File='xiin.py' ftp_upload='ftp.techpatterns.com/incoming'
local Line='-------------------------' local Line='-------------------------'
local start_directory=$( pwd ) local start_directory=$( pwd )
local host='' debug_i='' root_string='' local host='' debug_i='' root_string='' b_perl_worked='false' b_uploaded='false'
if (( "$BASH" >= 4 ));then if (( "$BASH" >= 4 ));then
host="${HOSTNAME,,}" host="${HOSTNAME,,}"
@ -1802,7 +1801,7 @@ debug_data_collector()
echo "Starting debugging data collection type: $1" echo "Starting debugging data collection type: $1"
cd $SELF_DATA_DIR 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...' echo "Deleting previous $SELF_NAME debugger data directory..."
rm -rf $SELF_DATA_DIR/$Debug_Data_Dir rm -rf $SELF_DATA_DIR/$Debug_Data_Dir
fi fi
mkdir $SELF_DATA_DIR/$Debug_Data_Dir mkdir $SELF_DATA_DIR/$Debug_Data_Dir
@ -1891,6 +1890,7 @@ debug_data_collector()
ps aux &> $Debug_Data_Dir/ps-aux.txt ps aux &> $Debug_Data_Dir/ps-aux.txt
ps -e &> $Debug_Data_Dir/ps-e.txt ps -e &> $Debug_Data_Dir/ps-e.txt
ps -p 1 &> $Debug_Data_Dir/ps-p-1.txt ps -p 1 &> $Debug_Data_Dir/ps-p-1.txt
echo "Collecting init data..."
cat /proc/1/comm &> $Debug_Data_Dir/proc-1-comm.txt cat /proc/1/comm &> $Debug_Data_Dir/proc-1-comm.txt
runlevel &> $Debug_Data_Dir/runlevel.txt runlevel &> $Debug_Data_Dir/runlevel.txt
if type -p rc-status &>/dev/null;then if type -p rc-status &>/dev/null;then
@ -1961,7 +1961,11 @@ debug_data_collector()
else else
touch $Debug_Data_Dir/systemd-detect-virt-absent touch $Debug_Data_Dir/systemd-detect-virt-absent
fi fi
if type -p perl &>/dev/null;then
perl -MFile::Find=find -MFile::Spec::Functions -Tlwe 'find { wanted => sub { print canonpath $_ if /\.pm\z/ }, no_chdir => 1 }, @INC' &> $Debug_Data_Dir/perl-modules.txt
else
touch $Debug_Data_Dir/perl-missing.txt
fi
cat /etc/src.conf &> $Debug_Data_Dir/bsd-etc-src-conf.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/make.conf &> $Debug_Data_Dir/bsd-etc-make-conf.txt
cat /etc/issue &> $Debug_Data_Dir/etc-issue.txt cat /etc/issue &> $Debug_Data_Dir/etc-issue.txt
@ -2157,29 +2161,41 @@ debug_data_collector()
cat /proc/ide/*/* &> $Debug_Data_Dir/proc-ide-hdx-cat.txt cat /proc/ide/*/* &> $Debug_Data_Dir/proc-ide-hdx-cat.txt
cat /etc/fstab &> $Debug_Data_Dir/etc-fstab.txt cat /etc/fstab &> $Debug_Data_Dir/etc-fstab.txt
cat /etc/mtab &> $Debug_Data_Dir/etc-mtab.txt cat /etc/mtab &> $Debug_Data_Dir/etc-mtab.txt
if type -p nvme &>/dev/null; then
touch $Debug_Data_Dir/nvme-present
else
touch $Debug_Data_Dir/nvme-absent
fi
fi fi
if [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then if [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then
echo 'Collecting networking data...' echo 'Collecting networking data...'
ifconfig &> $Debug_Data_Dir/ifconfig.txt ifconfig &> $Debug_Data_Dir/ifconfig.txt
ip addr &> $Debug_Data_Dir/ip-addr.txt ip addr &> $Debug_Data_Dir/ip-addr.txt
fi fi
# first download and verify xiin # create the error file in case it's needed
if [[ $B_UPLOAD_DEBUG_DATA == 'true' || $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then if [[ $B_UPLOAD_DEBUG_DATA == 'true' || $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then
touch $SELF_DATA_DIR/$Debug_Data_Dir/xiin-error.txt touch $SELF_DATA_DIR/$Debug_Data_Dir/xiin-error.txt
fi fi
# note, only bash 4> supports ;;& for case, so using if/then here # note, only bash 4> supports ;;& for case, so using if/then here
if [[ -z $BSD_TYPE ]] && [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then if [[ -z $BSD_TYPE ]] && [[ $1 == 'disk' || $1 == 'sys' || $1 == 'all' ]];then
echo $Line echo $Line
xiin_data_file=$SELF_DATA_DIR/$Debug_Data_Dir/xiin-sys.txt sys_data_file=$SELF_DATA_DIR/$Debug_Data_Dir/xiin-sys.txt
touch $xiin_data_file echo "Getting file paths in /sys..."
ls_sys 1
ls_sys 2
ls_sys 3
ls_sys 4
# note, this generates more lines than the full sys parsing, so only use if required
# ls_sys 5
touch $sys_data_file
if type -p perl &>/dev/null;then if type -p perl &>/dev/null;then
echo "Collecting data from /sys..." echo "Parsing /sys files..."
echo -n "Using Perl: " && perl --version | grep -oE 'v[0-9.]+' echo -n "Using Perl: " && perl --version | grep -oE 'v[0-9.]+'
xiin_data="$( perl -e ' sys_traverse_data="$( perl -e '
use File::Find; use File::Find;
use strict; use strict;
# use warnings; # use warnings;
# use 5.010; use 5.010;
my @content = (); my @content = ();
find( \&wanted, "/sys"); find( \&wanted, "/sys");
process_data( @content ); process_data( @content );
@ -2192,7 +2208,8 @@ debug_data_collector()
# a few variables. Since inxi does not need to see that file, we will # 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 # not use it. Also do not need . files or __ starting files
return if $File::Find::name =~ /\/(\.[a-z]|__|parameters\/|debug\/)/; return if $File::Find::name =~ /\/(\.[a-z]|__|parameters\/|debug\/)/;
# comment this one out if you experience hangs # comment this one out if you experience hangs or if
# we discover syntax of foreign language characters
return unless -T; # Must be ascii like return unless -T; # Must be ascii like
# print $File::Find::name . "\n"; # print $File::Find::name . "\n";
push @content, $File::Find::name; push @content, $File::Find::name;
@ -2221,17 +2238,18 @@ debug_data_collector()
# print scalar @content . "\n"; # print scalar @content . "\n";
print "$result"; print "$result";
} ' )" } ' )"
if [[ -z "$xiin_data" ]];then if [[ -z "$sys_traverse_data" ]];then
echo -e "ERROR: failed to generate /sys data - removing data file.\nContinuing with incomplete data collection." echo -e "ERROR: failed to generate /sys data - removing data file.\nContinuing with incomplete data collection."
echo "Continuing with incomplete data collection." echo "Continuing with incomplete data collection."
rm -f $xiin_data_file rm -f $sys_data_file
echo "/sys data generation failed. No data collected." >> $Debug_Data_Dir/xiin-error.txt echo "/sys data generation failed. No data collected." >> $Debug_Data_Dir/xiin-error.txt
else else
b_perl_worked='true'
echo 'Completed /sys data collection.' echo 'Completed /sys data collection.'
echo -n "$xiin_data" > $xiin_data_file echo -n "$sys_traverse_data" > $sys_data_file
fi fi
fi fi
if [[ -z "$xiin_data" ]];then if [[ -z "$sys_traverse_data" ]];then
download_xiin 'sys' download_xiin 'sys'
if [[ $? -eq 0 ]];then if [[ $? -eq 0 ]];then
b_run_xiin='true' b_run_xiin='true'
@ -2239,11 +2257,11 @@ debug_data_collector()
echo "Running $Xiin_File tool now on /sys..." echo "Running $Xiin_File tool now on /sys..."
echo -n "Using " && python --version echo -n "Using " && python --version
python --version &> $Debug_Data_Dir/python-version.txt python --version &> $Debug_Data_Dir/python-version.txt
python ./$Xiin_File -d /sys -f $xiin_data_file python ./$Xiin_File -d /sys -f $sys_data_file
if [[ $? -ne 0 ]];then if [[ $? -ne 0 ]];then
error=$? error=$?
echo -e "ERROR: $Xiin_File exited with error $error - removing data file.\nContinuing with incomplete data collection." echo -e "ERROR: $Xiin_File exited with error $error - removing data file.\nContinuing with incomplete data collection."
rm -f $xiin_data_file rm -f $sys_data_file
echo "$Xiin_File data generation failed with python error $error" >> $Debug_Data_Dir/xiin-error.txt echo "$Xiin_File data generation failed with python error $error" >> $Debug_Data_Dir/xiin-error.txt
fi fi
fi fi
@ -2252,7 +2270,7 @@ debug_data_collector()
fi fi
# has to be before gz cleanup # has to be before gz cleanup
if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then
if [[ $b_xiin_downloaded == 'false' ]];then if [[ $b_xiin_downloaded == 'false' && $b_perl_worked == 'false' ]];then
echo $Line echo $Line
download_xiin 'upload' download_xiin 'upload'
if [[ $? -eq 0 ]];then if [[ $? -eq 0 ]];then
@ -2289,18 +2307,30 @@ debug_data_collector()
echo $completed_gz_file echo $completed_gz_file
if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then if [[ $B_UPLOAD_DEBUG_DATA == 'true' ]];then
echo $Line echo $Line
if [[ $b_run_xiin == 'true' ]];then if [[ $b_perl_worked == 'true' ]];then
echo "Running automatic upload of data to remote server $ftp_upload now..." upload_debugger_data "$completed_gz_file"
python ./$Xiin_File --version
python ./$Xiin_File -u $completed_gz_file $ftp_upload
if [[ $? -gt 0 ]];then if [[ $? -gt 0 ]];then
echo $Line echo "Error: looks like the Perl ftp upload failed. Error number: $?"
echo "Error: looks like the ftp upload failed. Error number: $?" else
# echo "The ftp upload failed. Error number: $?" >> $Debug_Data_Dir/xiin-error.txt b_uploaded='true'
echo "Hurray! Looks like the Perl ftp upload worked!"
fi
fi
if [[ $b_uploaded == 'false' ]];then
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
if [[ $? -gt 0 ]];then
echo $Line
echo "Error: looks like the Python ftp upload failed. Error number: $?"
# echo "The ftp upload failed. Error number: $?" >> $Debug_Data_Dir/xiin-error.txt
fi
else
echo 'Unable to run the automatic ftp upload because no uploaders appear to be working or available.'
# that has been removed at this point, so no more logging
# echo "Unable to run the automoatic ftp upload because of an error with the xiin download" >> $Debug_Data_Dir/xiin-error.txt
fi fi
else
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 fi
else else
echo 'You can upload this here using most file managers: ftp.techpatterns.com/incoming' echo 'You can upload this here using most file managers: ftp.techpatterns.com/incoming'
@ -2312,8 +2342,85 @@ debug_data_collector()
fi fi
exit 0 exit 0
} }
## args: $1 - level
ls_sys()
{
local files=''
case $1 in
1)files='/sys/';;
2)files='/sys/*/';;
3)files='/sys/*/*/';;
4)files='/sys/*/*/*/';; # this should be enough for most use cases
5)files='/sys/*/*/*/*/';; # very large file, shows best shortcuts though
6)files='/sys/*/*/*/*/*/';; # slows down too much, too big, can cause ls error
7)files='/sys/*/*/*/*/*/*/';; # impossibly big, will fail
esac
ls -l $files 2>/dev/null | awk '{
if (NF > 7) {
if ($1 ~/^d/){
f="d - "
}
else if ($1 ~/^l/){
f="l - "
}
else {
f="f - "
}
# includes -> target for symbolic link if present
print "\t" f $9 " " $10 " " $11
}
else if (!/^total / ) {
print $0
}
}' &> $Debug_Data_Dir/sys-level-$1.txt
}
## args: $1 - debugger file name
upload_debugger_data()
{
local result='' debugger_file=$1
if ! type -p perl &>/dev/null;then
echo "Perl is not installed!"
return 2
elif ! perl -MNet::FTP -e 1 &>/dev/null;then
echo "Required Perl module Net::FTP not installed."
return 3
fi
export debugger_file
echo "Starting Perl Uploader..."
result="$( perl -e '
use strict;
use warnings;
use Net::FTP;
my ($ftp, $host, $user, $pass, $dir, $fpath, $error);
$host = "ftp.techpatterns.com";
$user = "anonymous";
$pass = "anonymous\@techpatterns.com";
$dir = "incoming";
$fpath = $ENV{debugger_file};
# NOTE: important: must explicitly set to passive true/1
$ftp = Net::FTP->new($host, Debug => 0, Passive => 1);
$ftp->login($user, $pass) || die $ftp->message;
$ftp->binary();
$ftp->cwd($dir);
print "Connected to FTP server.\n";
$ftp->put($fpath) || die $ftp->message;
$ftp->quit;
print "Uploaded file.\n";
print $ftp->message;
' )"
echo "$result"
if [[ "$result" == *Goodbye* ]];then
return 0
else
return 1
fi
}
# $1 - download type [sys|upload] # $1 - download type [sys|upload]
function download_xiin() download_xiin()
{ {
local xiin_download='' xiin_url="https://github.com/smxi/inxi/raw/xiin/$Xiin_File" local xiin_download='' xiin_url="https://github.com/smxi/inxi/raw/xiin/$Xiin_File"
local downloader_error=0 download_type='uploader' local downloader_error=0 download_type='uploader'
@ -2390,17 +2497,18 @@ check_recommends_user_output()
ftp:ftp-OpenBSD-only~ftp-OpenBSD-only~ftp-OpenBSD-only~:-i_wan_ip;-w/-W;-U/-!_[11-15]_(OpenBSD_only)' ftp:ftp-OpenBSD-only~ftp-OpenBSD-only~ftp-OpenBSD-only~:-i_wan_ip;-w/-W;-U/-!_[11-15]_(OpenBSD_only)'
fi fi
initialize_paths 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 $Line
echo "Bash version: $( bash --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU bash/ {print $4}' )" echo "Bash version: $( bash --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU bash/ {print $4}' )"
if type -p gawk &>/dev/null;then if type -p gawk &>/dev/null;then
gawk_version=$( gawk --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU Awk/ {print $3}' ) gawk_version=$( gawk --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU Awk/ {print $3}' )
fi fi
if type -p sed &>/dev/null;then if type -p sed &>/dev/null;then
sed_version=$( sed --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^GNU sed version/ {print $4}' ) # sed (GNU sed) 4.4 OR GNU sed version 4.4
sed_version=$( sed --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^(GNU sed version|sed)/ {print $4;exit}' )
if [[ -z $sed_version ]];then if [[ -z $sed_version ]];then
# note: bsd sed shows error with --version flag # note: bsd sed shows error with --version flag
sed_version=$( sed --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^sed: illegal option/ {print "BSD sed"}' ) sed_version=$( sed --version 2>&1 | awk 'BEGIN {IGNORECASE=1} /^sed: illegal option/ {print "BSD sed";exit}' )
fi fi
fi fi
if type -p sudo &>/dev/null;then if type -p sudo &>/dev/null;then
@ -2416,8 +2524,8 @@ check_recommends_user_output()
echo "Gawk version: $gawk_version" echo "Gawk version: $gawk_version"
echo "Sed version: $sed_version" echo "Sed version: $sed_version"
echo "Sudo version: $sudo_version" echo "Sudo version: $sudo_version"
echo "Python version: $python_version" echo "Python version: $python_version (deprecated)"
echo "Perl version: $perl_versio" echo "Perl version: $perl_version"
echo $Line echo $Line
echo "Test One: Required System Directories (Linux Only)." echo "Test One: Required System Directories (Linux Only)."
@ -2888,7 +2996,6 @@ get_parameters()
use_short='false' use_short='false'
;; ;;
M) B_SHOW_MACHINE='true' M) B_SHOW_MACHINE='true'
B_SHOW_BATTERY='true'
use_short='false' use_short='false'
;; ;;
n) B_SHOW_ADVANCED_NETWORK='true' n) B_SHOW_ADVANCED_NETWORK='true'
@ -3096,32 +3203,28 @@ get_parameters()
3) B_TESTING_1='true' 3) B_TESTING_1='true'
B_TESTING_2='true' B_TESTING_2='true'
;; ;;
1[0-6]|http*) 1[0-3]|http*)
if [[ $B_ALLOW_UPDATE == 'true' ]];then if [[ $B_ALLOW_UPDATE == 'true' ]];then
case $OPTARG in case $OPTARG in
10) 10)
script_self_updater "$SELF_DOWNLOAD_DEV" 'dev server' "$opt $OPTARG" script_self_updater "$SELF_DOWNLOAD_DEV" 'dev server' "$opt $OPTARG"
B_MAN='false'
;; ;;
11) 11)
script_self_updater "$SELF_DOWNLOAD_BRANCH_1" 'branch one server' "$opt $OPTARG" script_self_updater "$SELF_DOWNLOAD_BRANCH_1" 'branch one server' "$opt $OPTARG"
B_MAN='false'
;; ;;
12) 12)
script_self_updater "$SELF_DOWNLOAD_BRANCH_2" 'branch two server' "$opt $OPTARG" script_self_updater "$SELF_DOWNLOAD_BRANCH_2" 'branch two server' "$opt $OPTARG"
B_MAN='false'
;; ;;
13) 13)
script_self_updater "$SELF_DOWNLOAD_BRANCH_3" 'branch three server' "$opt $OPTARG" script_self_updater "$SELF_DOWNLOAD_BRANCH_3" 'branch three server' "$opt $OPTARG"
;; B_MAN='false'
14)
script_self_updater "$SELF_DOWNLOAD_BRANCH_4" 'branch four server' "$opt $OPTARG"
;;
15)
script_self_updater "$SELF_DOWNLOAD_BRANCH_BSD" 'branch bsd server' "$opt $OPTARG"
;;
16)
script_self_updater "$SELF_DOWNLOAD_BRANCH_GNUBSD" 'branch gnubsd server' "$opt $OPTARG"
;; ;;
http*) http*)
script_self_updater "$OPTARG" 'alt server' "$opt <http...>" script_self_updater "$OPTARG" 'alt server' "$opt <http...>"
B_MAN='false'
;; ;;
esac esac
else else
@ -3291,7 +3394,7 @@ show_options()
print_lines_basic "2" "-A" "Chip vendor:product ID for each audio device." print_lines_basic "2" "-A" "Chip vendor:product ID for each audio device."
print_lines_basic "2" "-B" "serial number, voltage (if available)." print_lines_basic "2" "-B" "serial number, voltage (if available)."
print_lines_basic "2" "-C" "Minimum CPU speed, if available." print_lines_basic "2" "-C" "Minimum CPU speed, if available."
print_lines_basic "2" "-D" "Disk serial number." print_lines_basic "2" "-D" "Disk serial number; Firmware rev. if available."
print_lines_basic "2" "-G" "Chip vendor:product ID for each video card; (mir/wayland only) compositor (alpha test); OpenGL compatibility version, if free drivers and available." print_lines_basic "2" "-G" "Chip vendor:product ID for each video card; (mir/wayland only) compositor (alpha test); OpenGL compatibility version, if free drivers and available."
print_lines_basic "2" "-I" "Other detected installed gcc versions (if present). System default runlevel. Adds parent program (or tty) for shell info if not in IRC (like Konsole or Gterm). Adds Init/RC (if found) version number." print_lines_basic "2" "-I" "Other detected installed gcc versions (if present). System default runlevel. Adds parent program (or tty) for shell info if not in IRC (like Konsole or Gterm). Adds Init/RC (if found) version number."
print_lines_basic "2" "-m" "Manufacturer, Serial Number, single/double bank (if found)." print_lines_basic "2" "-m" "Manufacturer, Serial Number, single/double bank (if found)."
@ -3332,9 +3435,9 @@ show_options()
print_lines_basic "2" "10" "Color logging." print_lines_basic "2" "10" "Color logging."
print_lines_basic "1" "" "The following create a tar.gz file of system data, plus collecting the inxi output to file. To automatically upload debugger data tar.gz file to ftp.techpatterns.com: inxi^-xx@^<11-14>" print_lines_basic "1" "" "The following create a tar.gz file of system data, plus collecting the inxi output to file. To automatically upload debugger data tar.gz file to ftp.techpatterns.com: inxi^-xx@^<11-14>"
print_lines_basic "1" "" "For alternate ftp upload locations: Example:^inxi^-!^ftp.yourserver.com/incoming^-xx@^14" print_lines_basic "1" "" "For alternate ftp upload locations: Example:^inxi^-!^ftp.yourserver.com/incoming^-xx@^14"
print_lines_basic "2" "11" "With data file of xiin read of /sys." print_lines_basic "2" "11" "With data file of tree traverse read of /sys."
print_lines_basic "2" "12" "With xorg conf and log data, xrandr, xprop, xdpyinfo, glxinfo etc." print_lines_basic "2" "12" "With xorg conf and log data, xrandr, xprop, xdpyinfo, glxinfo etc."
print_lines_basic "2" "13" "With data from dev, disks, ${partition_string}s, etc., plus xiin data file." print_lines_basic "2" "13" "With data from dev, disks, ${partition_string}s, etc., plus /sys tree traverse data file."
print_lines_basic "2" "14" "Everything, full data collection." print_lines_basic "2" "14" "Everything, full data collection."
print_screen_output " " print_screen_output " "
print_screen_output "Advanced Options:" print_screen_output "Advanced Options:"
@ -3355,9 +3458,6 @@ show_options()
print_lines_basic "1" "-! 11" "Triggers an update from source branch one - if present, of course." print_lines_basic "1" "-! 11" "Triggers an update from source branch one - if present, of course."
print_lines_basic "1" "-! 12" "Triggers an update from source branch two - if present, of course." print_lines_basic "1" "-! 12" "Triggers an update from source branch two - if present, of course."
print_lines_basic "1" "-! 13" "Triggers an update from source branch three - if present, of course." print_lines_basic "1" "-! 13" "Triggers an update from source branch three - if present, of course."
print_lines_basic "1" "-! 14" "Triggers an update from source branch four - if present, of course."
print_lines_basic "1" "-! 15" "Triggers an update from source branch BSD - if present, of course."
print_lines_basic "1" "-! 16" "Triggers an update from source branch GNUBSD - if present, of course."
print_lines_basic "1" "-! " "<http://......> Triggers an update from whatever server you list." print_lines_basic "1" "-! " "<http://......> Triggers an update from whatever server you list."
print_lines_basic "1" "" "Example: inxi^-!^http://yourserver.com/testing/inxi" print_lines_basic "1" "" "Example: inxi^-!^http://yourserver.com/testing/inxi"
fi fi
@ -3518,7 +3618,7 @@ print_version_info()
print_lines_basic "0" "" "$SELF_NAME - the universal, portable, system information tool for console and irc." print_lines_basic "0" "" "$SELF_NAME - the universal, portable, system information tool for console and irc."
print_screen_output " " print_screen_output " "
print_lines_basic "0" "" "This program started life as a fork of Infobash 3.02: Copyright^(C)^2005-2007^Michiel^de^Boer^a.k.a.^locsmif." print_lines_basic "0" "" "This program started life as a fork of Infobash 3.02: Copyright^(C)^2005-2007^Michiel^de^Boer^a.k.a.^locsmif."
print_lines_basic "0" "" "Subsequent changes and modifications (after Infobash 3.02): Copyright^(C)^2008-${year_modified%%-*}^Harald^Hope,^Scott^Rogers,^aka^h2^&trash80." print_lines_basic "0" "" "Subsequent changes and modifications (after Infobash 3.02): Copyright^(C)^2008-${SELF_DATE%%-*}^Harald^Hope^aka^h2. CPU/Konversation^fixes:^Scott^Rogers^aka^trash80. USB^audio^fixes:^Steven^Barrett^aka^damentz."
print_screen_output " " print_screen_output " "
print_lines_basic "0" "" "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. (http://www.gnu.org/licenses/gpl.html)" print_lines_basic "0" "" "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. (http://www.gnu.org/licenses/gpl.html)"
fi fi
@ -4516,6 +4616,7 @@ get_cpu_architecture()
{ {
eval $LOGFS eval $LOGFS
case $1 in case $1 in
# https://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures
amd) amd)
case $2 in case $2 in
4) 4)
@ -4557,16 +4658,16 @@ get_cpu_architecture()
;; ;;
11) 11)
case $3 in case $3 in
3)ARCH='K8 rev.E+';; 3)ARCH='Turion X2 Ultra';;
esac esac
;; ;;
12) 12) # might also need cache handling like 14/16
case $3 in case $3 in
1)ARCH='K10';; 1)ARCH='Fusion';;
*)ARCH='K10';; *)ARCH='Fusion';;
esac esac
;; ;;
14) 14) # SOC, apu
case $3 in case $3 in
1|2)ARCH='Bobcat';; 1|2)ARCH='Bobcat';;
*)ARCH='Bobcat';; *)ARCH='Bobcat';;
@ -4574,17 +4675,17 @@ get_cpu_architecture()
;; ;;
15) 15)
case $3 in case $3 in
0|1)ARCH='Bulldozer';; 0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F)ARCH='Bulldozer';;
2|10|13)ARCH='Piledriver';; 10|11|12|13|14|15|16|17|18|19|1A|1B|1C|1D|1E|1F)ARCH='Piledriver';;
30|38)ARCH='Steamroller';; 30|31|32|33|34|35|36|37|38|39|3A|3B|3C|3D|3E|3F)ARCH='Steamroller';;
60|65|70)ARCH='Excavator';; 60|61|62|63|64|65|66|67|68|69|6A|6B|6C|6D|6E|6F|70|71|72|73|74|75|76|77|78|79|7A|7B|7C|7D|7E|7F)ARCH='Excavator';;
*)ARCH='Bulldozer';; *)ARCH='Bulldozer';;
esac esac
;; ;;
16) 16) # SOC, apu
case $3 in case $3 in
0)ARCH='Jaguar';; 0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F)ARCH='Jaguar';;
30)ARCH='Puma';; 30|31|32|33|34|35|36|37|38|39|3A|3B|3C|3D|3E|3F)ARCH='Puma';;
*)ARCH='Jaguar';; *)ARCH='Jaguar';;
esac esac
;; ;;
@ -4659,10 +4760,13 @@ get_cpu_architecture()
3C|3F|45|46)ARCH='Haswell';; 3C|3F|45|46)ARCH='Haswell';;
3D|47|4F|56)ARCH='Broadwell';; 3D|47|4F|56)ARCH='Broadwell';;
4E|55|9E)ARCH='Skylake';; 4E|55|9E)ARCH='Skylake';;
5E)ARCH='Skylake-S';;
4C|5D)ARCH='Airmont';; 4C|5D)ARCH='Airmont';;
8E|9E)ARCH='Kaby Lake';; 8E|9E)ARCH='Kaby Lake';;
57)ARCH='Knights Landing';; 57)ARCH='Knights Landing';;
85)ARCH='Knights Mill';; 85)ARCH='Knights Mill';;
# product codes: https://en.wikipedia.org/wiki/List_of_Intel_microprocessors
# coming: coffee lake; cannonlake; icelake; tigerlake
esac esac
;; ;;
B) B)
@ -7228,17 +7332,17 @@ get_hdd_data_basic()
fi fi
if swapctl -l -k &>/dev/null;then if swapctl -l -k &>/dev/null;then
swap_size=$( swapctl -l -k 2>/dev/null | gawk ' swap_size=$( swapctl -l -k 2>/dev/null | gawk '
BEGIN { BEGIN {
swapSize=0 swapSize=0
total=0 total=0
} }
( $1 ~ /^\/dev/ ) && ( $2 ~ /^[0-9]+$/ ) { ( $1 ~ /^\/dev/ ) && ( $2 ~ /^[0-9]+$/ ) {
total += $2 total += $2
} }
END { END {
# result in blocks already # result in blocks already
print total print total
}' ) }' )
fi fi
fi fi
# echo ss: $swap_size # echo ss: $swap_size
@ -7333,12 +7437,13 @@ get_hdd_data_basic()
printf( $NF",%.1fGB,,\n", driveSize ) printf( $NF",%.1fGB,,\n", driveSize )
} }
# See http://lanana.org/docs/device-list/devices-2.6+.txt for major numbers used below # See http://lanana.org/docs/device-list/devices-2.6+.txt for major numbers used below
# See https://www.mjmwired.net/kernel/Documentation/devices.txt for kernel 4.x device numbers
# $1 ~ /^(3|22|33|8)$/ && $2 % 16 == 0 { # $1 ~ /^(3|22|33|8)$/ && $2 % 16 == 0 {
# size += $3 # size += $3
# } # }
# special case from this data: 8 0 156290904 sda # special case from this data: 8 0 156290904 sda
# note: vm has 252/253/254 known starter, grsec has 202 # note: known starters: vm: 252/253/254; grsec: 202; nvme: 259
$1 ~ /^(3|8|22|33|202|252|253|254)$/ && $NF ~ /[hsv]d[a-z]+$/ && ( $2 % 16 == 0 || $2 % 16 == 8 ) { $1 ~ /^(3|8|22|33|202|252|253|254|259)$/ && $NF ~ /(nvme[0-9]+n[0-9]+|[hsv]d[a-z]+)$/ && ( $2 % 16 == 0 || $2 % 16 == 8 ) {
size += $3 size += $3
} }
END { END {
@ -7385,21 +7490,22 @@ get_hard_drive_data_advanced()
local a_temp_working='' a_temp_scsi='' temp_holder='' temp_name='' i='' j='' local a_temp_working='' a_temp_scsi='' temp_holder='' temp_name='' i='' j=''
local sd_ls_by_id='' ls_disk_by_id='' ls_disk_by_path='' usb_exists='' a_temp='' local sd_ls_by_id='' ls_disk_by_id='' ls_disk_by_path='' usb_exists='' a_temp=''
local firewire_exists='' thunderbolt_exists='' thunderbolt_exists='' hdd_temp hdd_serial='' local firewire_exists='' thunderbolt_exists='' thunderbolt_exists='' hdd_temp hdd_serial=''
local firmware_rev='' working_path='' block_type=''
## check for all ide type drives, non libata, only do it if hdx is in array ## check for all ide type drives, non libata, only do it if hdx is in array
## this is now being updated for new /sys type paths, this may handle that ok too ## this is now being updated for new /sys type paths, this may handle that ok too
if [[ -n $( grep -E 'hd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then if [[ -n $( grep -Es 'hd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then
# remember, we're using the last array item to store the total size of disks # remember, we're using the last array item to store the total size of disks
for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ )) for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ ))
do do
IFS="," IFS=","
a_temp_working=( ${A_HDD_DATA[i]} ) a_temp_working=( ${A_HDD_DATA[i]} )
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
if [[ -n $( grep -E '^hd[a-z]' <<< ${a_temp_working[0]} ) ]];then if [[ -z ${a_temp_working[0]/*hd[a-z]*/} ]];then
if [[ -e /proc/ide/${a_temp_working[0]}/model ]];then if [[ -e /proc/ide/${a_temp_working[0]}/model ]];then
a_temp_working[2]="$( remove_erroneous_chars /proc/ide/${a_temp_working[0]}/model )" a_temp_working[2]="$( remove_erroneous_chars /proc/ide/${a_temp_working[0]}/model )"
else else
a_temp_working[2]="Name n/a" a_temp_working[2]=''
fi fi
# these loops are to easily extend the cpu array created in the gawk script above with more fields per cpu. # these loops are to easily extend the cpu array created in the gawk script above with more fields per cpu.
for (( j=0; j < ${#a_temp_working[@]}; j++ )) for (( j=0; j < ${#a_temp_working[@]}; j++ ))
@ -7448,23 +7554,42 @@ get_hard_drive_data_advanced()
log_function_data 'cat' "$FILE_SCSI" log_function_data 'cat' "$FILE_SCSI"
fi fi
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
## then we'll loop through that array looking for matches. ## then we'll loop through that array looking for matches.
if [[ -n $( grep -E 'sd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then if [[ -n $( grep -Es 'sd[a-z]|nvme' <<< ${A_HDD_DATA[@]} ) ]];then
# first pack the main ls variable so we don't have to keep using ls /dev... # first pack the main ls variable so we don't have to keep using ls /dev...
# not all systems have /dev/disk/by-id # not all systems have /dev/disk/by-id
ls_disk_by_id="$( ls -l /dev/disk/by-id 2>/dev/null )" ls_disk_by_id="$( ls -l /dev/disk/by-id 2>/dev/null )"
ls_disk_by_path="$( ls -l /dev/disk/by-path 2>/dev/null )" ls_disk_by_path="$( ls -l /dev/disk/by-path 2>/dev/null )"
for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ )) for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ ))
do do
if [[ -n $( grep -E '^sd[a-z]' <<< ${A_HDD_DATA[$i]} ) ]];then firmware_rev=''
hdd_temp=''
hdd_serial=''
temp_name=''
working_path=''
block_type=''
if [[ -z ${A_HDD_DATA[$i]/*nvme*/} ]];then
block_type='nvme'
elif [[ -z ${A_HDD_DATA[$i]/*sd[a-z]*/} ]];then
block_type='sdx'
fi
if [[ -n $block_type ]];then
IFS="," IFS=","
a_temp_working=( ${A_HDD_DATA[$i]} ) a_temp_working=( ${A_HDD_DATA[$i]} )
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
if [[ $block_type == 'sdx' ]];then
working_path=/sys/block/${a_temp_working[0]}/device/
elif [[ $block_type == 'nvme' ]];then
# this results in:
# /sys/devices/pci0000:00/0000:00:03.2/0000:06:00.0/nvme/nvme0/nvme0n1
# but we want to go one level down so slice off trailing nvme0n1
working_path=$(readlink -f /sys/block/${a_temp_working[0]} 2>/dev/null )
working_path=${working_path%nvme*}
fi
# /sys/block/[sda,hda]/device/model # /sys/block/[sda,hda]/device/model
# this is handles the new /sys data types first # this is handles the new /sys data types first
if [[ -e /sys/block/${a_temp_working[0]}/device/model ]];then if [[ -e ${working_path}model ]];then
temp_name="$( remove_erroneous_chars /sys/block/${a_temp_working[0]}/device/model )" temp_name="$( remove_erroneous_chars ${working_path}model )"
temp_name=$( cut -d '-' -f 1 <<< ${temp_name// /_} ) temp_name=$( cut -d '-' -f 1 <<< ${temp_name// /_} )
elif [[ ${#a_temp_scsi[@]} -gt 0 ]];then elif [[ ${#a_temp_scsi[@]} -gt 0 ]];then
for (( j=0; j < ${#a_temp_scsi[@]}; j++ )) for (( j=0; j < ${#a_temp_scsi[@]}; j++ ))
@ -7485,15 +7610,14 @@ get_hard_drive_data_advanced()
fi fi
done done
fi fi
# I don't know identifier for thunderbolt in /dev/disk/by-id / /dev/disk/by-path
if [[ -z $temp_name ]];then if [[ -n $temp_name && -n "$ls_disk_by_id" ]];then
temp_name="Name n/a"
# maybe remove this from the conditional, detection of usb may not depend on the name
else #
usb_exists=$( grep -Em1 "usb-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" ) usb_exists=$( grep -Em1 "usb-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" )
firewire_exists=$( grep -Em1 "ieee1394-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" ) firewire_exists=$( grep -Em1 "ieee1394-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" )
# thunderbolt_exists=$( grep -Em1 "ieee1394-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" ) # thunderbolt_exists=$( grep -Em1 "ieee1394-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" )
# note: sometimes with wwn- numbering usb does not appear in by-id but it does in by-path # note: sometimes with wwn- numbering usb does not appear in by-id but it does in by-path
fi
if [[ -n "$ls_disk_by_path" ]];then
if [[ -z $usb_exists ]];then if [[ -z $usb_exists ]];then
usb_exists=$( grep -Em1 "usb-.*${a_temp_working[0]}$" <<< "$ls_disk_by_path" ) usb_exists=$( grep -Em1 "usb-.*${a_temp_working[0]}$" <<< "$ls_disk_by_path" )
fi fi
@ -7508,7 +7632,6 @@ get_hard_drive_data_advanced()
fi fi
fi fi
a_temp_working[2]=$temp_name a_temp_working[2]=$temp_name
# these loops are to easily extend the cpu array created in the gawk script above with more fields per cpu.
for (( j=0; j < ${#a_temp_working[@]}; j++ )) for (( j=0; j < ${#a_temp_working[@]}; j++ ))
do do
if [[ $j -gt 0 ]];then if [[ $j -gt 0 ]];then
@ -7523,15 +7646,21 @@ get_hard_drive_data_advanced()
a_temp_working=( ${A_HDD_DATA[i]} ) a_temp_working=( ${A_HDD_DATA[i]} )
# echo "a:" ${a_temp_working[@]} # echo "a:" ${a_temp_working[@]}
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
hdd_temp=''
hdd_serial=''
if [[ -n ${a_temp_working[1]} ]];then if [[ -n ${a_temp_working[1]} ]];then
hdd_temp=$( get_hdd_temp_data "/dev/${a_temp_working[0]}" ) hdd_temp=$( get_hdd_temp_data "/dev/${a_temp_working[0]}" )
fi fi
if [[ $B_EXTRA_EXTRA_DATA == 'true' ]];then if [[ $B_EXTRA_EXTRA_DATA == 'true' ]];then
hdd_serial=$( get_hdd_serial_number "${a_temp_working[0]}" ) if [[ -e ${working_path}serial ]];then
hdd_serial="$( remove_erroneous_chars ${working_path}serial )"
else
hdd_serial=$( get_hdd_serial_number "${a_temp_working[0]}" )
fi
if [[ -e ${working_path}firmware_rev ]];then
firmware_rev="$( remove_erroneous_chars ${working_path}firmware_rev )"
fi
fi fi
A_HDD_DATA[i]="${a_temp_working[0]},${a_temp_working[1]},${a_temp_working[2]},${a_temp_working[3]},$hdd_serial,$hdd_temp" A_HDD_DATA[i]="${a_temp_working[0]},${a_temp_working[1]},${a_temp_working[2]},${a_temp_working[3]},$hdd_serial,$hdd_temp,$firmware_rev"
# echo b: ${A_HDD_DATA[i]} # echo b: ${A_HDD_DATA[i]}
fi fi
done done
@ -7608,7 +7737,7 @@ get_hard_drive_data_bsd()
if ( aDisks[aIds[key], "model"] !~ /raid/ ) { if ( aDisks[aIds[key], "model"] !~ /raid/ ) {
workingSize = aDisks[aIds[key], "size"]/1000 workingSize = aDisks[aIds[key], "size"]/1000
workingSize = sprintf( "%.1fGB", workingSize ) workingSize = sprintf( "%.1fGB", workingSize )
print aDisks[aIds[key], "id"] "," workingSize "," aDisks[aIds[key], "model"] "," "," aDisks[aIds[key], "serial"] "," print aDisks[aIds[key], "id"] "," workingSize "," aDisks[aIds[key], "model"] "," "," aDisks[aIds[key], "serial"] ",,"
} }
} }
size = size/1000 # calculate size in GB size size = size/1000 # calculate size in GB size
@ -7655,10 +7784,11 @@ get_hdd_serial_number()
get_partition_dev_data 'id' get_partition_dev_data 'id'
# lrwxrwxrwx 1 root root 9 Apr 26 09:32 scsi-SATA_ST3160827AS_5MT2HMH6 -> ../../sdc # lrwxrwxrwx 1 root root 9 Apr 26 09:32 scsi-SATA_ST3160827AS_5MT2HMH6 -> ../../sdc
# exception: ata-InnoDisk_Corp._-_mSATA_3ME3_BCA34401050060191 -> ../../sda
# exit on the first instance # exit on the first instance
hdd_serial=$( gawk ' hdd_serial=$( gawk '
/'$1'$/ { /'$1'$/ {
serial=gensub( /^(.+)_([^_]+)$/, "\\2", 1, $9 ) serial=gensub( /(.+)_([^_]+)$/, "\\2", 1, $9 )
print serial print serial
exit exit
}' <<< "$DEV_DISK_ID" ) }' <<< "$DEV_DISK_ID" )
@ -7673,29 +7803,45 @@ get_hdd_serial_number()
get_hdd_temp_data() get_hdd_temp_data()
{ {
eval $LOGFS eval $LOGFS
local hdd_temp='' sudo_command='' local hdd_temp='' sudo_command='' device=$1
if [[ $B_HDDTEMP_TESTED != 'true' ]];then
B_HDDTEMP_TESTED='true'
HDDTEMP_PATH=$( type -p hddtemp )
fi
if [[ $B_SUDO_TESTED != 'true' ]];then if [[ $B_SUDO_TESTED != 'true' ]];then
B_SUDO_TESTED='true' B_SUDO_TESTED='true'
SUDO_PATH=$( type -p sudo ) SUDO_PATH=$( type -p sudo )
fi fi
# only use sudo if not root, -n option requires sudo -V 1.7 or greater. sudo will just error out
if [[ -n $HDDTEMP_PATH && -n $1 ]];then # which is the safest course here for now, otherwise that interactive sudo password thing is too annoying
# only use sudo if not root, -n option requires sudo -V 1.7 or greater. sudo will just error out # important: -n makes it non interactive, no prompt for password
# which is the safest course here for now, otherwise that interactive sudo password thing is too annoying if [[ $B_ROOT != 'true' && -n $SUDO_PATH ]];then
# important: -n makes it non interactive, no prompt for password sudo_command='sudo -n '
if [[ $B_ROOT != 'true' && -n $SUDO_PATH ]];then fi
sudo_command='sudo -n ' # try this to see if hddtemp gives result for the base name
if [[ -z ${device/*nvme*/} ]];then
if type -p nvme &>/dev/null;then
device=${device%n[0-9]}
# this will fail if regular user and no sudo present, but that's fine, it will just return null
hdd_temp=$( eval $sudo_command nvme smart-log $device 2>/dev/null | gawk -F ':' '
BEGIN {
IGNORECASE=1
}
# other rows may have: Temperature sensor 1 :
/^temperature\s*:/ {
gsub(/^[[:space:]]+|[[:space:]]*C$/,"",$2)
print $2
}' )
fi fi
# this will fail if regular user and no sudo present, but that's fine, it will just return null else
hdd_temp=$( eval $sudo_command $HDDTEMP_PATH -nq -u C $1 ) if [[ $B_HDDTEMP_TESTED != 'true' ]];then
if [[ -n $hdd_temp && -n $( grep -E '^([0-9\.]+)$' <<< $hdd_temp ) ]];then B_HDDTEMP_TESTED='true'
echo $hdd_temp HDDTEMP_PATH=$( type -p hddtemp )
fi fi
if [[ -n $HDDTEMP_PATH && -n $device ]];then
# this will fail if regular user and no sudo present, but that's fine, it will just return null
hdd_temp=$( eval $sudo_command $HDDTEMP_PATH -nq -u C $device )
fi
fi
if [[ -n $hdd_temp && -z ${hdd_temp//[0-9]/} ]];then
echo $hdd_temp
fi fi
eval $LOGFE eval $LOGFE
} }
@ -7858,7 +8004,6 @@ get_kernel_compiler_version()
echo $compiler_version echo $compiler_version
} }
get_kernel_version() get_kernel_version()
{ {
eval $LOGFS eval $LOGFS
@ -8594,12 +8739,11 @@ get_networking_wan_ip_data()
# get ip using wget redirect to stdout. This is a clean, text only IP output url, # get ip using wget redirect to stdout. This is a clean, text only IP output url,
# single line only, ending in the ip address. May have to modify this in the future # single line only, ending in the ip address. May have to modify this in the future
# to handle ipv4 and ipv6 addresses but should not be necessary. # to handle ipv4 and ipv6 addresses but should not be necessary.
# awk has bad regex handling so checking it with grep -E instead
# ip=$( echo 2001:0db8:85a3:0000:0000:8a2e:0370:7334 | gawk --re-interval ' # ip=$( echo 2001:0db8:85a3:0000:0000:8a2e:0370:7334 | gawk --re-interval '
# ip=$( wget -q -O - $WAN_IP_URL | gawk --re-interval ' # ip=$( wget -q -O - $WAN_IP_URL | gawk --re-interval '
# this generates a direct dns based ipv4 ip address, but if opendns.com goes down, the fall # this generates a direct dns based ipv4 ip address, but if opendns.com goes down,
# the fall backs will still work.
# note: consistently slower than domain based: dig +short +time=1 +tries=1 myip.opendns.com. A @208.67.222.222 # note: consistently slower than domain based: dig +short +time=1 +tries=1 myip.opendns.com. A @208.67.222.222
# backs will still work.
if [[ -n $DNSTOOL ]];then if [[ -n $DNSTOOL ]];then
ip=$( dig +short +time=1 +tries=1 myip.opendns.com @resolver1.opendns.com 2>/dev/null) ip=$( dig +short +time=1 +tries=1 myip.opendns.com @resolver1.opendns.com 2>/dev/null)
fi fi
@ -12563,7 +12707,6 @@ print_short_data()
fi fi
fi fi
#set_color_scheme 12 #set_color_scheme 12
if [[ $B_IRC == 'true' ]];then if [[ $B_IRC == 'true' ]];then
for i in $C1 $C2 $CN for i in $C1 $C2 $CN
@ -13050,7 +13193,10 @@ print_cpu_data()
# note that we need to multiply by number of actual cpus here to get true cache size # note that we need to multiply by number of actual cpus here to get true cache size
if [[ -n ${a_cpu_working[2]} ]];then if [[ -n ${a_cpu_working[2]} ]];then
if [[ -z $BSD_TYPE ]];then if [[ -z $BSD_TYPE ]];then
if [[ $cpu_vendor != 'intel' ]];then # AMD SOS chips appear to report full L2 cache per core
if [[ "${a_cpu_info[3]}" == 'amd' ]] && [[ "${a_cpu_info[4]}" == '14' || "${a_cpu_info[4]}" == '16' ]];then
cpu_cache=$( calculate_multicore_data "${a_cpu_working[2]}" "$cpu_physical_count" )
elif [[ $cpu_vendor != 'intel' ]];then
cpu_cache=$( calculate_multicore_data "${a_cpu_working[2]}" "$(( $cpu_core_count * $cpu_physical_count ))" ) cpu_cache=$( calculate_multicore_data "${a_cpu_working[2]}" "$(( $cpu_core_count * $cpu_physical_count ))" )
else else
cpu_cache=$( calculate_multicore_data "${a_cpu_working[2]}" "$cpu_physical_count" ) cpu_cache=$( calculate_multicore_data "${a_cpu_working[2]}" "$cpu_physical_count" )
@ -13603,7 +13749,7 @@ print_hard_disk_data()
{ {
eval $LOGFS eval $LOGFS
local hdd_data='' hdd_data_2='' a_hdd_working='' hdd_temp_data='' hdd_string='' local hdd_data='' hdd_data_2='' a_hdd_working='' hdd_temp_data='' hdd_string=''
local hdd_serial='' dev_string='/dev/' local hdd_serial='' dev_string='/dev/' firmware_rev=''
local dev_data='' size_data='' hdd_model='' usb_data='' hdd_name='' local dev_data='' size_data='' hdd_model='' usb_data='' hdd_name=''
local Line_Starter='Drives:' # inherited by print_optical_drives local Line_Starter='Drives:' # inherited by print_optical_drives
# load A_HDD_DATA - this will also populate the full bsd disk data array values # load A_HDD_DATA - this will also populate the full bsd disk data array values
@ -13668,6 +13814,12 @@ print_hard_disk_data()
hdd_serial='N/A' hdd_serial='N/A'
fi fi
hdd_serial="${C1}serial$SEP3${C2} $hdd_serial " hdd_serial="${C1}serial$SEP3${C2} $hdd_serial "
if [[ -n ${a_hdd_working[6]} ]];then
firmware_rev=${a_hdd_working[6]}
firmware_rev="${C1}firmware$SEP3${C2} $firmware_rev "
else
firmware_rev=''
fi
fi fi
dev_data="$dev_string${a_hdd_working[0]} " dev_data="$dev_string${a_hdd_working[0]} "
fi fi
@ -13680,7 +13832,7 @@ print_hard_disk_data()
hdd_name="${C1}model$SEP3${C2} $hdd_name_temp" hdd_name="${C1}model$SEP3${C2} $hdd_name_temp"
hdd_string="${C1}ID-$((i+1))$SEP3${C2} $usb_data$dev_data$hdd_name$size_data" hdd_string="${C1}ID-$((i+1))$SEP3${C2} $usb_data$dev_data$hdd_name$size_data"
part_1_data="$hdd_model$hdd_string " part_1_data="$hdd_model$hdd_string "
part_2_data="$hdd_serial$hdd_temp_data" part_2_data="$hdd_serial$hdd_temp_data$firmware_rev"
## Forcing the capacity to print on its own row, and the first drive on its own ## Forcing the capacity to print on its own row, and the first drive on its own
## then each disk prints on its own line, or two lines, depending on console/output width ## then each disk prints on its own line, or two lines, depending on console/output width
if [[ $i -eq 0 ]];then if [[ $i -eq 0 ]];then