diff --git a/inxi b/inxi index ede976f..91ba5ba 100755 --- a/inxi +++ b/inxi @@ -31,8 +31,8 @@ use POSIX qw(uname strftime ttyname); ## INXI INFO ## my $self_name='inxi'; -my $self_version='3.0.25'; -my $self_date='2018-09-24'; +my $self_version='3.0.26'; +my $self_date='2018-09-28'; my $self_patch='00'; ## END INXI INFO ## @@ -52,7 +52,7 @@ if (eval {require Time::HiRes}){ } @t0 = eval 'Time::HiRes::gettimeofday()' if $b_hires; # let's start it right away ## Hashes -my ( %alerts,%client,%colors,%dl,%files,%rows,%system_files,%use ); +my ( %alerts,%client,%colors,%debugger,%dl,%files,%rows,%system_files,%use ); ## Arrays # ps_aux is full output, ps_cmd is only the last 10 columns to last @@ -67,19 +67,18 @@ my @test = (0,0,0,0,0); ## Booleans my ($b_admin,$b_arm,$b_bb_ps,$b_block_tool,$b_console_irc, -$b_debug_gz,$b_debug_timers,$b_debug_z,$b_display,$b_dmesg_boot_check, -$b_dmi,$b_dmidecode_force,$b_fake_bsd,$b_fake_dboot,$b_fake_dmidecode, -$b_fake_pciconf,$b_fake_sysctl,$b_fake_usbdevs, -$b_force_display,$b_force_sys_debug,$b_gpudata,$b_irc, +$b_display,$b_dmesg_boot_check,$b_dmi,$b_dmidecode_force, +$b_fake_bsd,$b_fake_dboot,$b_fake_dmidecode,$b_fake_pciconf,$b_fake_sysctl, +$b_fake_usbdevs,$b_force_display,$b_gpudata,$b_irc, $b_log,$b_log_colors,$b_log_full,$b_man,$b_mem,$b_mips, -$b_pci,$b_pci_tool,$b_ppc,$b_proc_debug,$b_proc_partitions,$b_ps_gui, +$b_pci,$b_pci_tool,$b_ppc,$b_proc_partitions,$b_ps_gui, $b_root,$b_running_in_display, $b_slot_tool,$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_soc_timer,$b_sparc, $b_sudo,$b_sysctl,$b_usb,$b_usb_check,$b_usb_sys,$b_usb_tool,$b_wmctrl); ## Disk checks my ($b_dm_boot_disk,$b_dm_boot_optical,$b_glabel,$b_hardware_raid, $b_label_uuid,$b_lsblk,$b_partitions,$b_raid); -my ($b_sys_debug,$b_sysctl_disk,$b_update,$b_weather) = (1,1,1,1); +my ($b_sysctl_disk,$b_update,$b_weather) = (1,1,1); ## System my ($bsd_type,$language,$os,$pci_tool,$device_vm) = ('','','','',''); @@ -127,7 +126,8 @@ my %size = ( 'term-lines' => 100, ); -## debug temp tools +## debug / temp tools +$debugger{'sys'} = 1; $client{'test-konvi'} = 0; ######################################################################## @@ -1132,7 +1132,7 @@ sub begin_logging { $t3 = eval 'Time::HiRes::tv_interval (\@t0, [Time::HiRes::gettimeofday()]);' if $b_hires; #print Dumper $@; my $now = strftime "%Y-%m-%d %H:%M:%S", localtime; - return if $b_debug_timers; + return if $debugger{'timers'}; # do the rotation if logfile exists if ( -f $log_file ){ # copy if present second to third @@ -1186,7 +1186,7 @@ sub log_data { #print Dumper $@; $data = "Start: Function: $two$args\n${spacer}Elapsed: $t3\n"; $spacer=''; - $timer = $data if $b_debug_timers; + $timer = $data if $debugger{'timers'}; } elsif ( $one eq 'fe') { # print 'timer:', Time::HiRes::tv_interval(\@t0, [Time::HiRes::gettimeofday()]),"\n"; @@ -1195,7 +1195,7 @@ sub log_data { #print Dumper $t3; $data = "${spacer}Elapsed: $t3\nEnd: Function: $two\n"; $spacer=''; - $timer = $data if $b_debug_timers; + $timer = $data if $debugger{'timers'}; } elsif ( $one eq 'cat') { if ( $b_log_full ){ @@ -1237,7 +1237,7 @@ sub log_data { else { $data = "$two\n"; } - if ($b_debug_timers){ + if ($debugger{'timers'}){ print $timer if $timer; } #print "d: $data"; @@ -1247,10 +1247,11 @@ sub log_data { } sub set_debugger { + user_debug_test_1() if $debugger{'test-1'}; if ( $debug >= 20){ error_handler('not-in-irc', 'debug data generator') if $b_irc; my $option = ( $debug > 22 ) ? 'main-full' : 'main'; - $b_debug_gz = 1 if ($debug == 22 || $debug == 24); + $debugger{'gz'} = 1 if ($debug == 22 || $debug == 24); my $ob_sys = SystemDebugger->new($option); $ob_sys->run_debugger(); $ob_sys->upload_file($ftp_alt) if $debug > 20; @@ -1269,7 +1270,7 @@ sub set_debugger { elsif ($debug <= 3){ if ($debug == 3){ $b_log = 1; - $b_debug_timers = 1; + $debugger{'timers'} = 1; begin_logging(); } else { @@ -1331,7 +1332,7 @@ sub run_debugger { if ( -d '/sys' && main::count_dir_files('/sys') ){ build_tree('sys'); # kernel crash, not sure what creates it, for ppc, as root - sys_traverse_data() if ($b_sys_debug && ($b_force_sys_debug || !$b_root || !$b_ppc )) ; + sys_traverse_data() if ($debugger{'sys'} && ($debugger{'sys-force'} || !$b_root || !$b_ppc )) ; } else { print "Skipping /sys data collection. /sys not present, or empty.\n"; @@ -1339,7 +1340,7 @@ sub run_debugger { print $line3; # note: proc has some files that are apparently kernel processes, I've tried # filtering them out but more keep appearing, so only run proc debugger if not root - if ( (!$b_root || $b_proc_debug ) && -d '/proc' && main::count_dir_files('/proc') ){ + if ( (!$b_root || $debugger{'proc'} ) && -d '/proc' && main::count_dir_files('/proc') ){ build_tree('proc'); proc_traverse_data(); } @@ -1466,7 +1467,11 @@ sub disk_data { ['df', '-k'], ['df', '-k -T'], ['df', '-k -T -P'], + ['df', '-k -T -P -a'], ['df', '-P'], + ['findmnt', ''], + ['findmnt', '--df --no-truncate'], + ['findmnt', '--list --no-truncate'], ['lsblk', '-fs'], ['lsblk', '-fsr'], ['lsblk', '-fsP'], @@ -1801,7 +1806,7 @@ sub run_self { print "Creating $self_name output file now. This can take a few seconds...\n"; print "Starting $self_name from: $self_path\n"; my $i = ($option eq 'main-full')? ' -i' : ''; - my $z = ($b_debug_z) ? ' -z' : ''; + my $z = ($debugger{'z'}) ? ' -z' : ''; my $iz = "$i$z"; $iz =~ s/[\s\-]//g; my $cmd = "$self_path/$self_name -FRfrploudmaxxx$i$z --usb --slots --debug 10 -y 120 > $data_dir/$self_name-FRfrploudmaxxx$iz-usb-slots-y120.txt 2>&1"; @@ -1828,6 +1833,7 @@ sub copy_files { $unreadable = $name . '-unreadable'; # proc have already been tested for readable/exists if ($type eq 'proc' || -e $_ ) { + print "F:$_\n" if $type eq 'proc' && $debugger{'proc-print'}; if ($type eq 'proc' || -r $_){ copy($_,"$good") or main::toucher($error); } @@ -2020,6 +2026,7 @@ sub sys_traverse_processsor { $data=''; $sep=''; my $b_fh = 1; + print "F:$_\n" if $debugger{'sys-print'}; open($fh, '<', $_) or $b_fh = 0; # needed for removing -T test and root if ($b_fh){ @@ -2053,6 +2060,8 @@ sub wanted { # not use it. Also do not need . files or __ starting files # print $File::Find::name . "\n"; # block maybe: cfgroup\/ + # picdec\/|, wait_for_fb_sleep/wake is an odroid thing caused hang + return if $File::Find::name =~ /(^\/sys\/power\/wait_for_fb)/; return if $File::Find::name =~ /\/(\.[a-z]|kernel\/|trace\/|parameters\/|debug\/)/; # comment this one out if you experience hangs or if # we discover syntax of foreign language characters @@ -2109,7 +2118,7 @@ sub upload_file { $ftp->quit; print "Uploaded file successfully!\n"; print $ftp->message; - if ($b_debug_gz){ + if ($debugger{'gz'}){ print "Removing debugger gz file:\n$file_path\n"; unlink $file_path or main::error_handler('remove',"$file_path", "$!"); print "File removed.\n"; @@ -2121,6 +2130,20 @@ sub upload_file { } } } +# random tests for various issues +sub user_debug_test_1 { +# open(my $duped, '>&', STDOUT); +# local *STDOUT = $duped; +# my $item = POSIX::strftime("%c", localtime); +# print "Testing character encoding handling. Perl IO data:\n"; +# print(join(', ', PerlIO::get_layers(STDOUT)), "\n"); +# print "Without binmode: ", $item,"\n"; +# binmode STDOUT,":utf8"; +# print "With binmode: ", $item,"\n"; +# print "Perl IO data:\n"; +# print(join(', ', PerlIO::get_layers(STDOUT)), "\n"); +# close($duped); +} #### ------------------------------------------------------------------- #### DOWNLOADER @@ -4123,8 +4146,18 @@ sub get_options{ else { error_handler('bad-arg', $opt, $arg); } }, + 'debug-no-sys' => sub { + $debugger{'sys'} = 0; }, + 'debug-proc' => sub { + $debugger{'proc'} = 1; }, + 'debug-proc-print' => sub { + $debugger{'proc-print'} = 1;}, + 'debug-sys-print' => sub { + $debugger{'sys-print'} = 1; }, + 'debug-test-1' => sub { + $debugger{'test-1'} = 1; }, 'debug-z' => sub { - $b_debug_z = 1 }, + $debugger{'z'} = 1 }, 'display:s' => sub { my ($opt,$arg) = @_; if ($arg =~ /^:?([0-9]+)?$/){ @@ -4209,8 +4242,6 @@ sub get_options{ $b_no_man_force = 0; }, 'no-ssl' => sub { $dl{'no-ssl-opt'}=1 }, - 'no-sys-debug' => sub { - $b_sys_debug = 0; }, 'output-file:s' => sub { my ($opt,$arg) = @_; if ($arg){ @@ -4226,14 +4257,13 @@ sub get_options{ }}, 'ppc' => sub { $b_ppc = 1 }, - 'proc-debug' => sub { - $b_proc_debug = 1; }, + 'recommends' => sub { $b_recommends = 1; }, 'sparc' => sub { $b_sparc = 1; }, 'sys-debug' => sub { - $b_force_sys_debug = 1; }, + $debugger{'sys-force'} = 1; }, 'U|update:s' => sub { # 1,2,3 OR http://myserver/path/inxi my ($opt,$arg) = @_; $b_downloader = 1; @@ -4463,7 +4493,7 @@ sub show_options { optical drive (-d), USB (--usb), full RAID; triggers -xx." ], ['2', '7', '', "Network IP data (-i); triggers -xxx."], ['2', '8', '', "Everything available, including repos (-r), processes - (-tcm), PCI slots (--slots), extra admin data (--admin)."], + (-tcm), PCI slots (--slots)."], ); push @data, @rows; # if distro maintainers don't want the weather feature disable it @@ -4655,7 +4685,6 @@ sub show_options { ['1', '', '--output-file', "[Full filepath|print] Output file to be used for --output." ], ['1', '', '--partition-sort', "[dev-base|fs|id|label|percent-used|size|uuid|used] Change sort order of partition output. See man page for specifics." ], - ['1', '', '--proc', "Force debugger parsing of /proc as sudo/root." ], ['1', '', '--sleep', "[0-x.x] Change CPU sleep time, in seconds, for -C (default:^$cpu_sleep). Allows system to catch up and show a more accurate CPU use. Example:^$self_name^-Cxxx^--sleep^0.15" ], @@ -4678,6 +4707,11 @@ sub show_options { automatically, removes debugger data directory, leaves tar.gz debugger file." ], ['2', '22', '', "Upload debugger dataset to $self_name debugger server automatically, removes debugger data directory and debugger tar.gz file." ], + ['1', '', '--debug-proc', "Force debugger parsing of /proc as sudo/root." ], + ['1', '', '--debug-proc-print', "To locate file that /proc debugger hangs on." ], + ['1', '', '--debug-no-sys', "Skip /sys debugging in case of a hang." ], + ['1', '', '--debug-sys', "Force PowerPC debugger parsing of /sys as sudo/root." ], + ['1', '', '--debug-sys-print', "To locate file that /sys debugger hangs on." ], ['1', '', '--ftp', "Use with --debugger 21 to trigger an alternate FTP server for upload. Format:^[ftp.xx.xx/yy]. Must include a remote directory to upload to. Example:^$self_name^--debug^21^--ftp^ftp.myserver.com/incoming" ], @@ -5314,6 +5348,7 @@ sub row_defaults { 'optical-data-bsd' => "No floppy or optical data found for this BSD system.", 'output-limit' => "Output throttled. IPs: $id; Limit: $limit; Override: --limit [1-x;-1 all]", 'partition-data' => "No Partition data was found.", + 'partition-hidden' => "N/A (hidden?)", 'pci-advanced-data' => 'bus/chip ids unavailable', 'pci-card-data' => "No Device data found.", 'pci-card-data-root' => "Device data requires root.", @@ -8006,11 +8041,9 @@ sub create_output { $rows[$j]{main::key($num++,'model')} = $model; $rows[$j]{main::key($num++,'size')} = $size; if ($b_admin && $row{'block-physical'}){ - # this is the same size, no point in showing it - # $rows[$j]{main::key($num++,'raw size')} = join ' ', main::get_size($row{'raw-size'}); $rows[$j]{main::key($num++,'block size')} = ''; $rows[$j]{main::key($num++,'physical')} = $row{'block-physical'} . ' B'; - $rows[$j]{main::key($num++,'logical')} = ($row{'block-logical'})?$row{'block-logical'} . ' B':'N/A'; + $rows[$j]{main::key($num++,'logical')} = ($row{'block-logical'}) ? $row{'block-logical'} . ' B' : 'N/A'; } if ($extra > 1 && $row{'speed'}){ $rows[$j]{main::key($num++,'speed')} = $row{'speed'}; @@ -8204,10 +8237,9 @@ sub proc_data_advanced { } main::log_data('data',"working path: $working_path") if $b_log; if ($b_admin && -e "/sys/block/"){ - my @working = main::get_raw_disk_data('disk','',$drives[$i]{'id'},0); - $drives[$i]{'raw-size'} = $working[0]; - $drives[$i]{'block-logical'} = $working[2]; - $drives[$i]{'block-physical'} = $working[3]; + my @working = admin_data($drives[$i]{'id'}); + $drives[$i]{'block-logical'} = $working[0]; + $drives[$i]{'block-physical'} = $working[1]; } if ($block_type && @scsi && @by_id && ! -e "${working_path}model" && ! -e "${working_path}name"){ ## ok, ok, it's incomprehensible, search /dev/disk/by-id for a line that contains the @@ -8574,7 +8606,7 @@ sub device_vendor { ['^STEC\b','^STEC\b','STEC',''], # ssd drive, must come before seagate ST test # real, SSEAGATE Backup+; XP1600HE30002 ['(^ST[^T]|[S]?SEAGATE|^X[AFP]|^BUP|Expansion Desk|GoFlex|Backup(\+|\s?Plus)\s?Hub)','[S]?SEAGATE','Seagate',''], - ['^(WD|Western Digital|My (Book|Passport)|\d*LPCX|Elements|M000|EARX|EFRX|\d*EAVS)','(^WDC|Western Digital)','Western Digital',''], + ['^(WD|Western Digital|My (Book|Passport)|\d*LPCX|Elements|M000|EARX|EFRX|\d*EAVS|0JD)','(^WDC|Western Digital)','Western Digital',''], ## Then better known ones ## ['^(A-DATA|ADATA|AXN)','^(A-DATA|ADATA)','A-Data',''], ['^ADTRON','^(ADTRON)','Adtron',''], @@ -8655,6 +8687,7 @@ sub device_vendor { ['^RENICE','^RENICE','Renice',''], ['^RIM[\s]','^RIM','RIM',''], ['^SigmaTel','^SigmaTel','SigmaTel',''], + ['Smartbuy','\s?Smartbuy','Smartbuy',''], # SSD Smartbuy 60GB ['^SPPC','','Silicon Power',''], ['^(SK\s?HYNIX|HFS)','^SK\s?HYNIX','SK Hynix',''], # HFS128G39TND-N210A ['hynix','hynix','Hynix',''],# nvme middle of string, must be after sk hynix @@ -8670,6 +8703,7 @@ sub device_vendor { # ['^(SUPERSPEED)','^SUPERSPEED','SuperSpeed',''], # superspeed is a generic term ['^TANDBERG','^TANDBERG','Tanberg',''], ['^TCSUNBOW','^TCSUNBOW','TCSunBow',''], + ['^(TDK|TF[1-9][0-9])','^TDK','TDK',''], ['^TEAC','^TEAC','TEAC',''], ['^TEAM','^TEAM( Group)?','Team',''], ['^TopSunligt','^TopSunligt','TopSunligt',''], # is this a typo? hard to know @@ -8741,6 +8775,30 @@ sub hdd_temp { eval $end if $b_log; return $hdd_temp; } +# args: 1: block id +sub admin_data { + eval $start if $b_log; + my ($id) = @_; + # 0: logical block size 1: disk physical block size/partition block size; + my @blocks = (0,0); + my ($block_log,$block_size) = (0,0); + #my $path_size = "/sys/block/$id/size"; + my $path_log_block = "/sys/block/$id/queue/logical_block_size"; + my $path_phy_block = "/sys/block/$id/queue/physical_block_size"; + # legacy system path + if (! -e $path_phy_block && -r "/sys/block/$id/queue/hw_sector_size" ){ + $path_phy_block = "/sys/block/$id/queue/hw_sector_size"; + } + if ( -r $path_log_block || -r $path_phy_block ){ + $block_log = (main::reader($path_log_block))[0] if -r $path_log_block; + $block_size = (main::reader($path_phy_block))[0] if -r $path_phy_block; + } + # print "l-b: $block_log p-b: $block_size raw: $size_raw\n"; + @blocks = ($block_log,$block_size); + main::log_data('dump','@blocks',\@blocks) if $b_log; + eval $end if $b_log; + return @blocks; +} sub device_speed { eval $start if $b_log; my ($device) = @_; @@ -11026,11 +11084,17 @@ sub create_output { my %row = %$ref; $num = 1; next if $row{'type'} eq 'secondary' && $show{'partition'}; - @data2 = main::get_size($row{'size'}) if (defined $row{'size'}); - $size = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A'; - @data2 = main::get_size($row{'used'}) if (defined $row{'used'}); - $used = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A'; - $percent = (defined $row{'percent-used'}) ? ' (' . $row{'percent-used'} . '%)' : ''; + if (!$row{'hidden'}){ + @data2 = main::get_size($row{'size'}) if (defined $row{'size'}); + $size = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A'; + @data2 = main::get_size($row{'used'}) if (defined $row{'used'}); + $used = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A'; + $percent = (defined $row{'percent-used'}) ? ' (' . $row{'percent-used'} . '%)' : ''; + } + else { + $percent = ''; + $used = $size = (!$b_root) ? main::row_defaults('root-required') : main::row_defaults('partition-hidden'); + } %part = (); if (defined $row{'dev-base'}){ if ($row{'dev-base'} =~ /^non-dev-/){ @@ -11063,7 +11127,7 @@ sub create_output { main::key($num++,'ID') => $row{'id'}, }); @rows = (@rows,@data); - if ($b_admin && $row{'raw-size'} ){ + if (($b_admin || $row{'hidden'}) && $row{'raw-size'} ){ # It's an error! permissions or missing tool if (!main::is_numeric($row{'raw-size'})){ $raw_size = $row{'raw-size'}; @@ -11109,7 +11173,7 @@ sub partition_data { my (@data,@rows,@mapper,@mount,@partitions_working,%part,@working); my ($b_fake_map,$b_fs,$b_load,$cols,$roots) = (0,1,0,6,0); my ($back_size,$back_used) = (4,3); - my ($block_log,$block_size,$blockdev,$dev_base,$fs,$id,$label,$percent_used,$raw_size, + my ($block_size,$blockdev,$dev_base,$fs,$id,$label,$percent_used,$raw_size, $size_available,$size,$type,$uuid,$used); $b_partitions = 1; if ($b_admin){ @@ -11175,8 +11239,8 @@ sub partition_data { next; } ($dev_base,$fs,$id,$label,$type,$uuid) = ('','','','',''); - ($b_load,$block_log,$block_size,$percent_used,$raw_size, - $size_available,$size,$used) = (0,0,0,0,0,0,0,0); + ($b_load,$block_size,$percent_used,$raw_size,$size_available, + $size,$used) = (0,0,0,0,0,0,0,0); %part = (); # NOTE: using -P for linux fixes line wraps, and for bsds, assuming they don't use such long file names if ($row[0] =~ /^\/dev\/|:\/|\/\//){ @@ -11252,16 +11316,14 @@ sub partition_data { $id =~ s/\/home\/[^\/]+\/(.*)/\/home\/$filter_string\/$1/ if $show{'filter'}; $size = $row[$cols - $back_size]; if ($b_admin && -e "/sys/block/"){ - @working = main::get_raw_disk_data('part',$blockdev,$dev_base,$size); + @working = admin_data($blockdev,$dev_base,$size); $raw_size = $working[0]; $size_available = $working[1]; - $block_log = $working[2]; - $block_size = $working[3]; + $block_size = $working[2]; } $used = $row[$cols - $back_used]; $percent_used = sprintf( "%.1f", ( $used/$size )*100 ) if ($size); @data = ({ - 'block-logical' => $block_log, 'block-size' => $block_size, 'id' => $id, 'dev-base' => $dev_base, @@ -11280,6 +11342,10 @@ sub partition_data { } @data = swap_data(); @partitions = (@partitions,@data); + if (!$bsd_type && @lsblk){ + @data = check_partition_data(); + @partitions = (@partitions,@data) if @data; + } main::log_data('dump','@partitions',\@partitions) if $b_log; # print Data::Dumper::Dumper \@partitions; eval $end if $b_log; @@ -11457,7 +11523,7 @@ sub set_lsblk { if (/NAME="([^"]*)"\s+TYPE="([^"]*)"\s+RM="([^"]*)"\s+FSTYPE="([^"]*)"\s+SIZE="([^"]*)"\s+LABEL="([^"]*)"\s+UUID="([^"]*)"\s+SERIAL="([^"]*)"\s+MOUNTPOINT="([^"]*)"\s+PHY-SEC="([^"]*)"\s+LOG-SEC="([^"]*)"/){ my $size = ($5) ? $5/1024: 0; # some versions of lsblk do not return serial, fs, uuid, or label - my @temp = ({ + @temp = ({ 'name' => $1, 'type' => $2, 'rm' => $3, @@ -11495,6 +11561,78 @@ sub check_lsblk { eval $end if $b_log; return %part; } +# handle cases of hidden file systems +sub check_partition_data { + eval $start if $b_log; + my ($b_found,@data,@temp); + foreach my $ref (@lsblk){ + my %row = %$ref; + $b_found = 0; + if (!$row{'name'} || !$row{'mount'} || + (!$row{'type'} || $row{'type'} eq 'disk' || $row{'type'} eq 'rom' ) || + ($row{'fs'} && $row{'fs'} eq 'swap') ){ + next; + } + #print "$row{'name'} $row{'mount'}\n"; + foreach my $ref2 (@partitions){ + my %row2 = %$ref2; + #print "m:$row{'mount'} id:$row2{'id'}\n"; + next if !$row2{'id'}; + if ($row{'mount'} eq $row2{'id'}){ + $b_found = 1; + last; + } + } + if (!$b_found){ + #print "found: $row{'name'} $row{'mount'}\n"; + @temp = ({ + 'dev-base' => $row{'name'}, + 'fs' => $row{'fs'}, + 'id' => $row{'mount'}, + 'hidden' => 1, + 'label' => $row{'label'}, + 'raw-size' => $row{'size'}, + 'size' => 0, + 'type' => 'secondary', + 'used' => 0, + 'uuid' => $row{'uuid'}, + 'percent-used' => 0, + }); + @partitions = (@partitions,@temp); + main::log_data('dump','lsblk check: @temp',\@temp) if $b_log; + } + } + eval $end if $b_log; + return @data; +} +# args: 1: blockdev full path (part only); 2: block id; 3: size (part only) +sub admin_data { + eval $start if $b_log; + my ($blockdev,$id,$size) = @_; + # 0: calc block 1: available percent 2: disk physical block size/partition block size; + my @sizes = (0,0,0); + my ($block_size,$percent,$size_raw) = (0,0,0); + foreach (@proc_partitions){ + my @row = split /\s+/, $_; + if ($row[-1] eq $id){ + $size_raw = $row[2]; + last; + } + } + # get the fs block size + $block_size = (main::grabber("$blockdev --getbsz /dev/$id 2>/dev/null"))[0] if $blockdev; + if (!$size_raw){ + $size_raw = 'N/A'; + } + else { + $percent = sprintf("%.2f", ($size/$size_raw ) * 100) if $size && $size_raw; + } + # print "$id size: $size %: $percent p-b: $block_size raw: $size_raw\n"; + @sizes = ($size_raw,$percent,$block_size); + main::log_data('dump','@sizes',\@sizes) if $b_log; + eval $end if $b_log; + return @sizes; +} sub get_label { eval $start if $b_log; my ($item) = @_; @@ -15370,7 +15508,7 @@ sub get_weather { $tz = $2; # very clever trick, just make the system think it's in the # remote timezone for this local block only - local $ENV{'TZ'} = $tz; + local $ENV{'TZ'} = $tz; $date_time = POSIX::strftime "%c", localtime; $weather{'date-time'} = $date_time; } @@ -17088,59 +17226,6 @@ sub get_pci_vendor { eval $end if $b_log; return $vendor; } -# args: 1: type disk/part; 2: blockdev full path (part only); -# 3: block id; 4: size (part only) -sub get_raw_disk_data { - eval $start if $b_log; - my ($type,$blockdev,$id,$size) = @_; - # 0: calc block 1: available percent 2: logical block size - # 3: disk physical block size/partition block size; - my @sizes = (0,0,0,0); - my ($block_log,$block_size,$percent,$size_raw) = (0,0,0,0); - if ($type eq 'part'){ - foreach (@proc_partitions){ - my @row = split /\s+/, $_; - if ($row[-1] eq $id){ - $size_raw = $row[2]; - last; - } - } - # fallback, old systems don't have lsblk - if ($blockdev){ - # this is the actual logical block size - $block_size = (main::grabber("$blockdev --getbsz /dev/$id 2>/dev/null"))[0]; - } - if (!$size_raw){ - $size_raw = 'N/A'; - } - else { - $percent = sprintf("%.2f", ($size/$size_raw ) * 100) if $size && $size_raw; - } - } - else { - #my $path_size = "/sys/block/$id/size"; - my $path_log_block = "/sys/block/$id/queue/logical_block_size"; - my $path_phy_block = "/sys/block/$id/queue/physical_block_size"; - # legacy system path - if (! -e $path_phy_block && -r "/sys/block/$id/queue/hw_sector_size" ){ - $path_phy_block = "/sys/block/$id/queue/hw_sector_size"; - } - if ( -r $path_log_block || -r $path_phy_block ){ - # not used - # $size_raw = (main::reader($path_size))[0] if -r $path_size; - $block_log = (main::reader($path_log_block))[0] if -r $path_log_block; - $block_size = (main::reader($path_phy_block))[0] if -r $path_phy_block; - #if ($size_raw && $block_log){ - # $size_raw = sprintf("%.1f", $block_log * ($size_raw/1024 ) ); - #} - } - } - # print "$id size: $size %: $percent l-b: $block_log p-b: $block_size raw: $size_raw\n"; - @sizes = ($size_raw,$percent,$block_log,$block_size); - main::log_data('dump','@sizes',\@sizes) if $b_log; - eval $end if $b_log; - return @sizes; -} # # check? /var/run/nologin for bsds? sub get_runlevel_data { @@ -17770,12 +17855,12 @@ sub soc_devices { # it's worthless, we can't use it next if ! defined $type; $type_id = $type; - $type = soc_type($type); $chip_id = '' if ! defined $chip_id; $vendor_id = '' if ! defined $vendor_id; $driver = '' if ! defined $driver; $handle = '' if ! defined $handle; $busid = (defined $temp && main::is_int($temp)) ? $temp: 0; + $type = soc_type($type,$vendor_id,$driver); ($busid_nu,$modules,$port,$rev) = (0,'','',''); @temp3 = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,$rev, $port,$driver,$modules,'','','',$handle); @@ -17798,7 +17883,6 @@ sub soc_devicetree { next if !$type || !$content; $handle = $2 if $2; $type_id = $type; - $type = soc_type($type); if ($content){ @temp3 = split /,/, $content; $vendor_id = $temp3[0]; @@ -17806,6 +17890,7 @@ sub soc_devicetree { # strip off those weird device tree special characters $device =~ s/\x01|\x02|\x03|\x00//g; } + $type = soc_type($type,$vendor_id,''); @temp3 = ($type,$type_id,0,0,$device,$vendor_id,'soc','','','','','','','',$handle); assign_data('soc',@temp3); main::log_data('dump','@devices @temp3',\@temp3) if $b_log; @@ -17879,11 +17964,13 @@ sub check_vm { } sub soc_type { - my ($type) = @_; - if ($type =~ /^(daudio|.*hifi.*|.*sound[\-_]card)$/){ + my ($type,$info,$driver) = @_; + # I2S or i2s. I2C is i2 controller |[iI]2[Ss]. note: odroid hdmi item is sound only + if ($type =~ /^(daudio|.*hifi.*|.*sound[\-_]card|.*dac[0-9]?)$/ || + ($info && $info =~ /(sound|audio)/) || ($driver && $driver =~ /(audio|snd|sound)/) ){ $type = 'audio'; } - elsif ($type =~ /^((meson)?fb|disp|display(-[^\s]+)?|gpu|mali)$/){ + elsif ($type =~ /^((meson-?)?fb|disp|display(-[^\s]+)?|gpu|mali)$/){ $type = 'display'; } # includes ethernet-phy, meson-eth diff --git a/inxi.1 b/inxi.1 index 3ef9250..6affb69 100644 --- a/inxi.1 +++ b/inxi.1 @@ -1,4 +1,4 @@ -.TH INXI 1 "2018\-09\-24" inxi "inxi manual" +.TH INXI 1 "2018\-09\-28" inxi "inxi manual" .SH NAME inxi \- Command line system information script for console and IRC .SH SYNOPSIS @@ -1068,11 +1068,29 @@ For alternate ftp upload locations: Example: \fBinxi \-\-ftp \fIftp.yourserver.com/incoming\fB \-\-debug 21\fR +.SH DEBUGGING OPTIONS TO DEBUG DEBUGGER FAILURES + .TP -.B \-\-proc\fR +.B \-\-debug\-proc\fR Force debugger to parse \fB/proc\fR directory data when run as root. Normally this is disabled due to unpredictable data in /proc tree. Only used with \fB\-\-debug 2x\fR. +.TP +.B \-\-debug\-proc\-print\fR +Use this to locate file that /proc debugger hangs on. + +.TP +.B \-\-debug\-no\-sys\fR +Skip /sys debugging in case of a hang. + +.TP +.B \-\-debug\-sys\fR +Force PowerPC debugger parsing of /sys as sudo/root. + +.TP +.B \-\-debug\-sys\-print\fR +Use this to locate file that /sys debugger hangs on. + .SH SUPPORTED IRC CLIENTS BitchX, Gaim/Pidgin, ircII, Irssi, Konversation, Kopete, KSirc, KVIrc, Weechat, and Xchat. Plus any others that are capable of displaying either built\-in or external diff --git a/inxi.changelog b/inxi.changelog index 4313b6f..5fe413c 100644 --- a/inxi.changelog +++ b/inxi.changelog @@ -1,3 +1,51 @@ +===================================================================================== +Version: 3.0.26 +Patch Version: 00 +Script Date: 2018-09-28 +----------------------------------- +Changes: +----------------------------------- +New version, new man. + +Bugs: +1. If you consider failure to identify a mounted yet hidden partition a bug, then +that bug is fixed, but I consider that as more of a fix than a bug. + +Fixes: +1. Added more device pattern ID for odroid C1 and C2, these are now pretty well +supported. +2. inxi failed to handle a certain type of hidden partition, so far only seen +with udiskctl mounted TimeShift partitions, but this may be a more general udisk +issue, but so far not enough information. The fix is to use the lsblk data to +build up missing partitions, so this fix is for non legacy Linux systems only. +The fix works pretty well, but it's hard to know until we get a lot more real +world data, but given so far I've received only one issue report on it, I +suspect this is not a common situation, but you never know, it would never +have shown up in datasets unless I had looked specifically for it, so it may +be more common than I think. +3. Cleaned up and simplified new --admin -p and -d logic. + +Enhancements: +1. For debugging, renamed all user debugger switches to have prefix --debug. +These options are to help debug debugger failures, and so far have been tested +and solved the failures, so I'm adding them all to the main man and help menu, +thus raising them to the level of supported tools. These were enormously helpful +in solving proc or sys debugger hangs. + * --debug-proc + * --debug-proc-print + * --debug-no-sys + * --debug-sys + * --debug-sys-print +2. Added findmnt output to debugger, that may be useful in the future. Also added +df -kTPa to also catch hidden partitions in debugger. +3. Added in another user level debugger, triggered with --debug-test-1 flag. This +will do whatever operation is needed at the time for that user. Some issues can +only be resolved by the user on their machine. +4. More disk vendors and matches!!! Thanks linuxlite/linux hardware database! + +----------------------------------- +-- Harald Hope - Fri, 28 Sep 2018 13:47:03 -0700 + ===================================================================================== Version: 3.0.25 Patch Version: 00