aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@ubuntu.com>2018-09-30 20:31:36 -0400
committerLibravatarUnit 193 <unit193@ubuntu.com>2018-09-30 20:31:36 -0400
commit14253be7ca4c7784efc6df31878cd52999d363b0 (patch)
tree6ec98081ec2b1def60528dd6bb348e74f58baa70
parenta327786f1ce5969fb100d289d74e9e4bfda31fd3 (diff)
parentfa4cb5e396bb6512f486324b456ef2e9a64fb72a (diff)
downloadinxi-14253be7ca4c7784efc6df31878cd52999d363b0.tar.bz2
inxi-14253be7ca4c7784efc6df31878cd52999d363b0.tar.xz
inxi-14253be7ca4c7784efc6df31878cd52999d363b0.tar.zst
Update upstream source from tag 'upstream/3.0.26-1'
Update to upstream version '3.0.26-1' with Debian dir dfc88dc1c1115376229c17b029b623931a46bc2f
-rw-r--r--README.txt16
-rwxr-xr-xinxi2092
-rw-r--r--inxi.191
-rw-r--r--inxi.changelog164
4 files changed, 1575 insertions, 788 deletions
diff --git a/README.txt b/README.txt
index dd9fab0..f7360b5 100644
--- a/README.txt
+++ b/README.txt
@@ -60,11 +60,11 @@ current commit/version in master. All past versions are not supported.
git clone https://github.com/smxi/inxi --branch master --single-branch
OR direct fast and easy install:
-wget -Nc https://github.com/smxi/inxi/raw/master/inxi
+wget -O inxi https://github.com/smxi/inxi/raw/master/inxi
OR easy to remember shortcut (which redirects to github):
-wget -Nc https://smxi.org/inxi
-wget -Nc smxi.org/inxi
+wget -O inxi https://smxi.org/inxi
+wget -O inxi smxi.org/inxi
NOTE: Just because github calls tagged commits 'Releases' does not mean they
are releases! I can't change the words on the tag page. They are tagged
@@ -77,11 +77,11 @@ All active development is now done on the inxi-perl branch (pinxi):
git clone https://github.com/smxi/inxi --branch inxi-perl --single-branch
OR direct fast and easy install:
-wget -Nc https://github.com/smxi/inxi/raw/inxi-perl/pinxi
+wget -O pinxi https://github.com/smxi/inxi/raw/inxi-perl/pinxi
OR easy to remember shortcut (which redirects to github):
-wget -Nc https://smxi.org/pinxi
-wget -Nc smxi.org/pinxi
+wget -O pinxi https://smxi.org/pinxi
+wget -O pinxi smxi.org/pinxi
Once new features have been debugged, tested, and are reasonably stable, pinxi
is copied to inxi in the master branch.
@@ -97,10 +97,10 @@ find it here, at the inxi-legacy branch (binxi):
git clone https://github.com/smxi/inxi --branch inxi-legacy --single-branch
OR direct fast and easy install:
-wget -Nc https://github.com/smxi/inxi/raw/inxi-legacy/binxi
+wget -O binxi https://github.com/smxi/inxi/raw/inxi-legacy/binxi
OR easy to remember shortcut (which redirects to github):
-wget -Nc https://smxi.org/binxi
+wget -O binxi https://smxi.org/binxi
This version will not be maintained, and it's unlikely that any time will be
spent on it in the future, but it is there in case it's of use or interest to
diff --git a/inxi b/inxi
index 76e99c0..7f0f600 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.24';
-my $self_date='2018-09-10';
+my $self_version='3.0.26';
+my $self_date='2018-09-28';
my $self_patch='00';
## END INXI INFO ##
@@ -52,35 +52,36 @@ 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
-my (@app,@dmesg_boot,@dmi,@gpudata,@ifs,@ifs_bsd,@paths,@pci,@ps_aux,
-@ps_cmd,@ps_gui,@sysctl,@sysctl_battery,@sysctl_sensors,@sysctl_machine,
-@uname,@usb);
+my (@app,@dmesg_boot,@devices_audio,@devices_graphics,@devices_network,
+@devices_hwraid,@devices_timer,@dmi,@gpudata,@ifs,@ifs_bsd,
+@paths,@proc_partitions,@ps_aux,@ps_cmd,@ps_gui,
+@sysctl,@sysctl_battery,@sysctl_sensors,@sysctl_machine,@uname,@usb);
## Disk arrays
my (@dm_boot_disk,@dm_boot_optical,@glabel,@gpart,@hardware_raid,@labels,
@lsblk,@partitions,@raid,@sysctl_disks,@uuids);
my @test = (0,0,0,0,0);
## Booleans
-my ($b_admin,$b_arm,$b_bb_ps,$b_console_irc,$b_debug_gz,$b_debug_timers,
-$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_ps_gui,$b_root,$b_running_in_display,$b_slot_tool,
-$b_soc_audio,$b_soc_gfx,$b_soc_net,$b_sparc,$b_sudo,$b_sys_debug,$b_sysctl,
-$b_usb,$b_usb_check,$b_usb_sys,$b_usb_tool,$b_wmctrl);
+my ($b_admin,$b_arm,$b_bb_ps,$b_block_tool,$b_console_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_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_sysctl_disk,$b_update,$b_weather) = (1,1,1);
## System
-my ($bsd_type,$language,$os) = ('','','');
+my ($bsd_type,$language,$os,$pci_tool,$device_vm) = ('','','','','');
my ($bits_sys,$cpu_arch);
my ($cpu_sleep,$dl_timeout,$limit,$ps_cols,$ps_count) = (0.35,4,10,0,5);
my $sensors_cpu_nu = 0;
@@ -125,7 +126,8 @@ my %size = (
'term-lines' => 100,
);
-## debug temp tools
+## debug / temp tools
+$debugger{'sys'} = 1;
$client{'test-konvi'} = 0;
########################################################################
@@ -235,7 +237,7 @@ sub check_tools {
}
else {
if ($b_pci ){
- %hash = ('pciconf' => '-l',);
+ %hash = ('pciconf' => '-l','pcictl' => 'list', 'pcidump' => '');
%commands = (%commands,%hash);
}
if ($b_sysctl ){
@@ -250,6 +252,7 @@ sub check_tools {
# > 0 means error in shell
#my $cmd = "$program $commands{$_} >/dev/null";
#print "$cmd\n";
+ $pci_tool = $_ if $_ =~ /pci/;
$action = 'permissions' if system("$program $commands{$_} >/dev/null 2>&1");
}
else {
@@ -283,6 +286,14 @@ sub check_tools {
);
%commands = (%commands,%hash);
}
+ # can't check permissions since we need to know the partition
+ if ($b_block_tool){
+ %hash = (
+ 'blockdev' => 'linux',
+ 'lsblk' => 'linux',
+ );
+ %commands = (%commands,%hash);
+ }
foreach ( keys %commands ){
$action = 'use';
$message = 'Present and working';
@@ -328,7 +339,8 @@ sub set_basics {
$ENV{'LANG'}='C';
$ENV{'LC_ALL'}='C';
# remember, perl uses the opposite t/f return as shell!!!
- $b_irc = ( system('tty >/dev/null') ) ? 1 : 0;
+ # some versions of busybox do not have tty, like openwrt
+ $b_irc = ( check_program('tty') && system('tty >/dev/null') ) ? 1 : 0;
# print "birc: $b_irc\n";
$b_display = ( $ENV{'DISPLAY'} ) ? 1 : 0;
$b_root = ( $ENV{'HOME'} eq '/root' ) ? 1 : 0;
@@ -346,6 +358,7 @@ sub set_basics {
$client{'su-start'} = ''; # shows sudo/su
$client{'version'} = '';
$colors{'default'} = 2;
+ $show{'partition-sort'} = 'id'; # sort order for partitions
}
# args: $1 - default OR override default cols max integer count. $_[0]
@@ -425,7 +438,7 @@ sub set_os {
elsif ($cpu_arch =~ /(alpha|64)/){
$bits_sys = 64;
}
- if ( $os =~ /(bsd|dragonfly|darwin|indiana|sunos|solaris)/ ){
+ if ( $os =~ /(aix|bsd|cosix|dragonfly|darwin|hp-?ux|indiana|irix|sunos|solaris|ultrix|unix)/ ){
if ( $os =~ /openbsd/ ){
$os = 'openbsd';
}
@@ -1066,6 +1079,7 @@ sub get_config_item {
elsif ($key eq 'LANGUAGE') {$language = $val if $val =~ /^(en)$/}
elsif ($key eq 'LIMIT') {$limit = $val if is_int($val)}
elsif ($key eq 'OUTPUT_TYPE') {$output_type = $val if $val =~ /^(json|screen|xml)$/}
+ elsif ($key eq 'PARTITION_SORT') {$show{'partition-sort'} = $val if ($val =~ /^(dev-base|fs|id|label|percent-used|size|uuid|used)$/) }
elsif ($key eq 'PS_COUNT') {$ps_count = $val if is_int($val) }
elsif ($key eq 'SENSORS_CPU_NO') {$sensors_cpu_nu = $val if is_int($val)}
elsif ($key eq 'SHOW_HOST' || $key eq 'B_SHOW_HOST') { $show{'host'} = $val if is_int($val)}
@@ -1118,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
@@ -1172,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";
@@ -1181,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 ){
@@ -1223,7 +1237,7 @@ sub log_data {
else {
$data = "$two\n";
}
- if ($b_debug_timers){
+ if ($debugger{'timers'}){
print $timer if $timer;
}
#print "d: $data";
@@ -1233,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;
@@ -1255,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 {
@@ -1317,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_root || !$b_ppc || $b_sys_debug) ;
+ 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";
@@ -1325,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();
}
@@ -1443,6 +1458,7 @@ sub disk_data {
}
copy_files(\@files, 'disk');
my @cmds = (
+ ['blockdev', '--report'],
['btrfs', 'filesystem show'],
['btrfs', 'filesystem show --mounted'],
# ['btrfs', 'filesystem show --all-devices'],
@@ -1451,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'],
@@ -1462,10 +1482,10 @@ sub disk_data {
['lsblk', '-pr'],
['lsblk', '-pP'],
['lsblk', '-r'],
- ['lsblk', '-r --output NAME,PKNAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,MOUNTPOINT'],
- ['lsblk', '-rb --output NAME,PKNAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,MOUNTPOINT'],
+ ['lsblk', '-r --output NAME,PKNAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,MOUNTPOINT,PHY-SEC,LOG-SEC'],
+ ['lsblk', '-rb --output NAME,PKNAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,MOUNTPOINT,PHY-SEC,LOG-SEC'],
['lsblk', '-Pb --output NAME,PKNAME,TYPE,RM,FSTYPE,SIZE'],
- ['lsblk', '-Pb --output NAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,SERIAL,MOUNTPOINT'],
+ ['lsblk', '-Pb --output NAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,SERIAL,MOUNTPOINT,PHY-SEC,LOG-SEC'],
['gpart', 'list'],
['gpart', 'show'],
['gpart', 'status'],
@@ -1568,6 +1588,7 @@ sub display_data {
['kf5-config','--version'],
['kf6-config','--version'],
['kwin_x11','--version'],
+ # ['locate','/Xorg'], # for Xorg.wrap problem
['loginctl','--no-pager list-sessions'],
['nvidia-settings','-q screens'],
['nvidia-settings','-c :0.0 -q all'],
@@ -1785,7 +1806,10 @@ 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 $cmd = "$self_path/$self_name -FRfrploudmaxxx$i --usb --slots --debug 10 -y 120 > $data_dir/$self_name-FRfrploudmaxxxy-usb-slots-y120.txt 2>&1";
+ 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";
system($cmd);
copy($log_file, "$data_dir") or main::error_handler('copy-failed', "$log_file", "$!");
system("$self_path/$self_name --recommends -y 120 > $data_dir/$self_name-recommends-120.txt 2>&1");
@@ -1809,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);
}
@@ -2001,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){
@@ -2022,6 +2048,7 @@ sub sys_traverse_processsor {
close $fh;
# print $fh "$result";
}
+
sub wanted {
return if -d; # not directory
return unless -e; # Must exist
@@ -2033,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
@@ -2089,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";
@@ -2101,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
@@ -2452,8 +2495,8 @@ sub check_items {
$info_os = 'info-bsd';
}
else {
- @data = qw(dig dmidecode fdisk file hddtemp ifconfig ip ipmitool ipmi-sensors
- lsblk lsusb modinfo runlevel sensors strings sudo tree upower uptime);
+ @data = qw(blockdev dig dmidecode fdisk file hddtemp ifconfig ip ipmitool
+ ipmi-sensors lsblk lsusb modinfo runlevel sensors strings sudo tree upower uptime);
}
$b_program = 1;
$item = 'Program';
@@ -2644,6 +2687,13 @@ sub item_data {
}),
# system tools
# apt-dpkg,apt-get; pm-arch,pacman; rpm-redhat,suse
+ 'blockdev' => ({
+ 'info' => '--admin -p/-P (filesystem blocksize)',
+ 'info-bsd' => '',
+ 'apt' => 'util-linux',
+ 'pacman' => 'util-linux',
+ 'rpm' => 'util-linux',
+ }),
'curl' => ({
'info' => '-i (if no dig); -w,-W; -U',
'info-bsd' => '-i (if no dig); -w,-W; -U',
@@ -3284,15 +3334,17 @@ sub program_values {
'scrotwm' => ['^scrotwm.*welcome.*',5,'-v','Scrotwm',0,1,1],
'sommelier' => ['^sommelier',0,'0','sommelier',0,1,0],
'spectrwm' => ['^spectrwm.*welcome.*wm',5,'-v','Spectrwm',0,1,1],
- 'sway' => ['^sway',0,'0','sway',0,1,0],
+ 'sway' => ['^sway',3,'-v','sway',0,1,0],
'swc' => ['^swc',0,'0','swc',0,1,0],
'tvtwm' => ['^tvtwm',0,'0','tvtwm',0,1,0],
'twin' => ['^Twin:',2,'--version','Twin',0,0,0],
'twm' => ['^twm',0,'0','twm',0,1,0],
'unagi' => ['^unagi',0,'0','unagi',0,1,0],
'unity' => ['^unity',2,'--version','Unity',0,1,0],
+ 'unity-system-compositor' => ['^unity-system-compositor',2,'--version','unity-system-compositor (mir)',0,0,0],
'wavy' => ['^wavy',0,'0','wavy',0,1,0],
- 'way-cooler' => ['^way',0,'0','way-cooler',0,1,0],
+ 'waycooler' => ['^way',3,'--version','way-cooler',0,1,0],
+ 'way-cooler' => ['^way',3,'--version','way-cooler',0,1,0],
'wayhouse' => ['^wayhouse',0,'0','wayhouse',0,1,0],
'westford' => ['^westford',0,'0','westford',0,1,0],
'weston' => ['^weston',0,'0','weston',0,1,0],
@@ -3326,6 +3378,7 @@ sub program_values {
'xdm' => ['^xdm',0,'0','XDM',0,1,0],
'xenodm' => ['^xenodm',0,'0','xenodm',0,1,0],
## Shells
+ 'ash' => ['^ash',0,'0','ash',1,0,0],
'bash' => ['^GNU[[:space:]]bash,[[:space:]]version',4,'--version','Bash',1,0,0],
'csh' => ['^tcsh',2,'--version','csh',1,0,0],
'dash' => ['dash',3,'--version','Dash',1,0,0], # no version, uses dpkg query, sigh
@@ -3841,6 +3894,14 @@ sub get_options{
'P|partitions|partition' => sub {
$show{'short'} = 0;
$show{'partition'} = 1; },
+ 'partition-sort:s' => sub {
+ my ($opt,$arg) = @_;
+ if ($arg =~ /^(dev-base|fs|id|label|percent-used|size|uuid|used)$/){
+ $show{'partition-sort'} = $arg;
+ }
+ else {
+ error_handler('bad-arg',$opt,$arg);
+ } },
'r|repos|repo' => sub {
$show{'short'} = 0;
$show{'repo'} = 1; },
@@ -4085,6 +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 {
+ $debugger{'z'} = 1 },
'display:s' => sub {
my ($opt,$arg) = @_;
if ($arg =~ /^:?([0-9]+)?$/){
@@ -4139,7 +4212,7 @@ sub get_options{
'indent-min:i' => sub {
my ($opt,$arg) = @_;
if ($arg =~ /^\d+$/){
- $size{'indent-min'} = 1;
+ $size{'indent-min'} = $arg;
}
else {
error_handler('bad-arg', $opt, $arg);
@@ -4184,14 +4257,13 @@ sub get_options{
}},
'ppc' => sub {
$b_ppc = 1 },
- 'proc' => sub {
- $b_proc_debug = 1; },
+
'recommends' => sub {
$b_recommends = 1; },
'sparc' => sub {
$b_sparc = 1; },
- 'sys' => sub {
- $b_sys_debug = 1; },
+ 'sys-debug' => sub {
+ $debugger{'sys-force'} = 1; },
'U|update:s' => sub { # 1,2,3 OR http://myserver/path/inxi
my ($opt,$arg) = @_;
$b_downloader = 1;
@@ -4255,6 +4327,7 @@ sub get_options{
error_handler('bad-arg', '--output', '--output-file not provided');
}
}
+ $b_block_tool = 1 if ( $b_admin && ($show{'partition'} || $show{'partition-full'} ));
$b_sudo = 1 if ( $show{'unmounted'} || ($extra > 0 && $show{'disk'}) );
# override for things like -b or -v2 to -v3
$show{'cpu-basic'} = 0 if $show{'cpu'};
@@ -4323,6 +4396,10 @@ sub show_options {
verbose or line output, not short form):" ],
['2', '-C', '', "If available: CPU vulnerabilities (bugs); family, model-id, stepping - format:
hex (decimal) if greater than 9, otherwise hex; microcode - format: hex." ],
+ ['2', '-d', '', "If available: logical and physical block sizes." ],
+ ['2', '-p,-P', '', "If available: raw size of partition, percent available for user,
+ block size of file system (root required); for swap, shows swapiness and vfs cache
+ pressure, and if values are default or not." ],
['1', '-A', '--audio', "Audio/sound card(s), driver, sound server." ],
['1', '-b', '--basic', "Basic output, short form. Same as $self_name^-v^2." ],
['1', '-B', '--battery', "System battery info, including charge and condition, plus
@@ -4381,7 +4458,7 @@ sub show_options {
mounted ${partition_string}s." ],
['1', '-r', '--repos', "Distro repository data. Supported repo types: APK,
APT, EOPKG, PACMAN, PACMAN-G2, PISI, PORTAGE, PORTS (BSDs), SLACKPKG, TCE,
- URPMQ, YUM/ZYPP." ],
+ URPMQ, XBPS, YUM/ZYPP." ],
['1', '-R', '--raid', "RAID data. Shows RAID devices, states, levels,
and components. md-raid: If device is resyncing, also shows resync progress line." ],
['1', '-s', '--sensors', "Sensors output (if sensors installed/configured):
@@ -4416,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
@@ -4518,14 +4595,14 @@ sub show_options {
['2', '-m', '', "Width of memory bus, data and total (if present and greater
than data); Detail for Type, if present; module voltage, if available; serial
number." ],
- ['2', '-N', '', "Serial number." ],
+ ['2', '-N', '', "Specific vendor/product information (if relevant); serial number." ],
['2', '-R', '', "zfs-raid: portion allocated (used) by RAID devices/arrays.
md-raid: system md-raid support types (kernel support, read ahead, RAID events).
Hardware RAID rev, ports, specific vendor/product information." ],
['2', '-S', '', "Panel/tray/bar/dock info in desktop output, if in X (like lxpanel,
xfce4-panel, mate-panel); (if available) dm version number, window manager
version number." ],
- ['2', '--usb', '', "For Device: serial number (if present), interface count." ],
+ ['2', '--usb', '', "For Device: serial number (if present), interface count; USB speed." ],
);
push @data, @rows;
if ( $b_weather ){
@@ -4606,7 +4683,8 @@ sub show_options {
['1', '', '--output', "[json|screen|xml] Change data output type. Requires --output-file
if not screen." ],
['1', '', '--output-file', "[Full filepath|print] Output file to be used for --output." ],
- ['1', '', '--proc', "Force debugger parsing of /proc as sudo/root." ],
+ ['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', '', '--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" ],
@@ -4629,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" ],
@@ -5186,38 +5269,6 @@ sub increment_starters {
return $result;
}
-sub memory_data_full {
- eval $start if $b_log;
- my ($source) = @_;
- my $num = 0;
- my ($memory,@rows);
- my ($gpu_ram,$percent,$total,$used) = (0,'','','');
- if (!$show{'info'}){
- $memory = get_memory_data('splits');
- if ($memory){
- my @temp = split /:/, $memory;
- my @temp2 = get_size($temp[0]);
- $gpu_ram = $temp[3] if $temp[3];
- $total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
- @temp2 = get_size($temp[1]);
- $used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
- $used .= " ($temp[2]%)" if $temp[2];
- if ($gpu_ram){
- @temp2 = get_size($gpu_ram);
- $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
- }
- }
- my $key = ($source eq 'process') ? 'System RAM': 'RAM';
- $rows[0]{main::key($num++,$key)} = '';
- $rows[0]{main::key($num++,'total')} = $total;
- $rows[0]{main::key($num++,'used')} = $used;
- $rows[0]{main::key($num++,'gpu')} = $gpu_ram if $gpu_ram;
- }
- $b_mem = 1;
- eval $end if $b_log;
- return @rows;
-}
-
sub pci_cleaner {
my ($string,$type) = @_;
#print "st1 $type:$string\n";
@@ -5297,15 +5348,19 @@ 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 PCI card data found.",
+ 'pci-card-data' => "No Device data found.",
+ 'pci-card-data-root' => "Device data requires root.",
'pci-slot-data' => "No PCI slot data found.",
+ 'ps-data-null' => "No Process data available.",
'raid-data' => "No RAID data was found.",
'ram-data' => "No RAM data was found.",
'root-required' => "<root required>",
'sensors-data-ipmi' => "No ipmi sensors data was found.",
'sensors-data-linux' => "No sensors data was found. Is sensors configured?",
'sensors-ipmi-root' => "Unable to run ipmi sensors. Are you root?",
+ 'tool-missing' => "<missing $id>",
'unmounted-data' => "No unmounted partitions found.",
'unmounted-data-bsd' => "No unmounted partition data found for this BSD system.",
'unmounted-file' => "No /proc/partitions file found.",
@@ -5766,17 +5821,6 @@ sub print_line {
#### -------------------------------------------------------------------
#### PRIMARY DATA GENERATORS
#### -------------------------------------------------------------------
-# 0 type
-# 1 type_id
-# 2 bus_id
-# 3 sub_id
-# 4 device
-# 5 vendor_id
-# 6 chip_id
-# 7 rev
-# 8 port
-# 9 driver
-# 10 modules
## AudioData
{
@@ -5787,9 +5831,10 @@ sub get {
my (@data,@rows);
my $num = 0;
if (($b_arm || $b_mips) && !$b_soc_audio && !$b_pci_tool){
- my $key = ($b_arm) ? 'ARM' : 'MIPS';
+ my $type = ($b_arm) ? 'arm' : 'mips';
+ my $key = 'Message';
@data = ({
- main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
+ main::key($num++,$key) => main::row_defaults($type . '-pci',''),
},);
@rows = (@rows,@data);
}
@@ -5806,8 +5851,12 @@ sub get {
@rows = (@rows,@data);
if (!@rows){
my $key = 'Message';
+ my $type = 'pci-card-data';
+ if ($pci_tool && ${$alerts{$pci_tool}}{'action'} eq 'permissions'){
+ $type = 'pci-card-data-root';
+ }
@data = ({
- main::key($num++,$key) => main::row_defaults('pci-card-data',''),
+ main::key($num++,$key) => main::row_defaults($type,''),
},);
@rows = (@rows,@data);
}
@@ -5821,47 +5870,45 @@ sub card_data {
eval $start if $b_log;
my (@rows,@data);
my ($j,$num) = (0,1);
- foreach (@pci){
+ foreach (@devices_audio){
$num = 1;
my @row = @$_;
- if ($row[0] =~ /^(audio|daudio|hdmi|hdmi-audio|multimedia)$/){
- $j = scalar @rows;
- my $driver = $row[9];
- $driver ||= 'N/A';
- my $card = $row[4];
- $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
- # have seen absurdly verbose card descriptions, with non related data etc
- if (length($card) > 85 || $size{'max'} < 110){
- $card = main::pci_long_filter($card);
- }
- @data = ({
- main::key($num++,'Device') => $card,
- },);
- @rows = (@rows,@data);
- if ($extra > 2 && $b_pci_tool && $row[11]){
- my $item = main::get_pci_vendor($row[4],$row[11]);
- $rows[$j]{main::key($num++,'vendor')} = $item if $item;
- }
- $rows[$j]{main::key($num++,'driver')} = $driver;
- if ($extra > 0 && !$bsd_type){
- if ($row[9] ){
- my $version = main::get_module_version($row[9]);
- $rows[$j]{main::key($num++,'v')} = $version if $version;
- }
+ $j = scalar @rows;
+ my $driver = $row[9];
+ $driver ||= 'N/A';
+ my $card = $row[4];
+ $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
+ # have seen absurdly verbose card descriptions, with non related data etc
+ if (length($card) > 85 || $size{'max'} < 110){
+ $card = main::pci_long_filter($card);
+ }
+ @data = ({
+ main::key($num++,'Device') => $card,
+ },);
+ @rows = (@rows,@data);
+ if ($extra > 2 && $b_pci_tool && $row[12]){
+ my $item = main::get_pci_vendor($row[4],$row[12]);
+ $rows[$j]{main::key($num++,'vendor')} = $item if $item;
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
+ if ($extra > 0 && !$bsd_type){
+ if ($row[9] ){
+ my $version = main::get_module_version($row[9]);
+ $rows[$j]{main::key($num++,'v')} = $version if $version;
}
- if ($extra > 0){
- $rows[$j]{main::key($num++,'bus ID')} = (!$row[2] && !$row[3]) ? 'N/A' : "$row[2].$row[3]";
+ }
+ if ($extra > 0){
+ $rows[$j]{main::key($num++,'bus ID')} = (!$row[2] && !$row[3]) ? 'N/A' : "$row[2].$row[3]";
+ }
+ if ($extra > 1){
+ my $chip_id = 'N/A';
+ if ($row[5] && $row[6]){
+ $chip_id = "$row[5]:$row[6]";
}
- if ($extra > 1){
- my $chip_id = 'N/A';
- if ($row[5] && $row[6]){
- $chip_id = "$row[5]:$row[6]";
- }
- elsif ($row[6]){
- $chip_id = $row[6];
- }
- $rows[$j]{main::key($num++,'chip ID')} = $chip_id;
+ elsif ($row[6]){
+ $chip_id = $row[6];
}
+ $rows[$j]{main::key($num++,'chip ID')} = $chip_id;
}
#print "$row[0]\n";
}
@@ -5924,7 +5971,7 @@ sub usb_data {
# lsusb is a very expensive operation
if (@ids){
if (!$bsd_type && !$b_usb_check){
- main::set_usb_data();
+ main::USBData::set();
}
}
main::log_data('dump','@ids',\@ids) if $b_log;
@@ -7619,8 +7666,8 @@ sub system_cpu_name {
}
# synthesize it, [4] will be like: cortex-a15-timer; sunxi-timer
# so far all with this directory show soc name, not cpu name for timer
- elsif (! -d '/sys/firmware/devicetree/base' && @pci){
- foreach my $ref (@pci){
+ elsif (! -d '/sys/firmware/devicetree/base' && @devices_timer){
+ foreach my $ref (@devices_timer){
@working = @$ref;
next if $working[0] ne 'timer' || !$working[4];
$working[4] =~ s/(-system)?-timer$//;
@@ -7993,6 +8040,11 @@ sub create_output {
}
$rows[$j]{main::key($num++,'model')} = $model;
$rows[$j]{main::key($num++,'size')} = $size;
+ if ($b_admin && $row{'block-physical'}){
+ $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';
+ }
if ($extra > 1 && $row{'speed'}){
$rows[$j]{main::key($num++,'speed')} = $row{'speed'};
$rows[$j]{main::key($num++,'lanes')} = $row{'lanes'} if $row{'lanes'};
@@ -8043,10 +8095,10 @@ sub disk_data {
push @devs, $row{'dev-base'};
}
}
- if (!$bsd_type && (my $file = main::system_files('partitions'))){
- @data = proc_data($used,$file);
+ if (!$bsd_type){
+ @data = proc_data($used);
}
- elsif ($bsd_type) {
+ else {
@data = dmesg_boot_data($used);
}
#print Data::Dumper::Dumper \@data;
@@ -8056,11 +8108,10 @@ sub disk_data {
}
sub proc_data {
eval $start if $b_log;
- my ($used,$file) = @_;
+ my ($used) = @_;
my (@data,@drives);
my ($b_hdx,$size,$drive_size) = (0,0,0);
- my @proc_partitions = main::reader($file,'strip');
- shift @proc_partitions;
+ set_proc_partitions() if !$b_proc_partitions;
foreach (@proc_partitions){
next if (/^\s*$/);
my @row = split /\s+/, $_;
@@ -8112,14 +8163,23 @@ sub proc_data {
eval $end if $b_log;
return @data;
}
+sub set_proc_partitions {
+ eval $start if $b_log;
+ $b_proc_partitions = 1;
+ if (my $file = main::system_files('partitions')){
+ @proc_partitions = main::reader($file,'strip');
+ shift @proc_partitions;
+ }
+ eval $end if $b_log;
+}
sub proc_data_advanced {
eval $start if $b_log;
my ($b_hdx,@drives) = @_;
my ($i) = (0);
my (@data,@disk_data,@rows,@scsi,@temp,@working);
my ($pt_cmd) = ('unset');
- my ($block_type,$file,$firmware,$model,$path,$partition_scheme,
- $serial,$vendor,$working_path);
+ my ($block_type,$file,$firmware,$model,$path,
+ $partition_scheme,$serial,$vendor,$working_path);
@by_id = main::globber('/dev/disk/by-id/*');
# these do not contain any useful data, no serial or model name
# wwn-0x50014ee25fb50fc1 and nvme-eui.0025385b71b07e2e
@@ -8176,6 +8236,11 @@ sub proc_data_advanced {
$working_path =~ s/nvme[^\/]*$//;
}
main::log_data('data',"working path: $working_path") if $b_log;
+ if ($b_admin && -e "/sys/block/"){
+ 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
# discovered disk name AND ends with the correct identifier, sdx
@@ -8536,12 +8601,12 @@ sub device_vendor {
# must come before samsung MU. NOTE: toshiba can have: TOSHIBA_MK6475GSX: mush: MKNSSDCR120GB_
['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS
# MU = Multiple_Flash_Reader too risky: |M[UZ][^L]
- ['(SAMSUNG|^MCG[0-9]+GC|^G2 Portable)','SAMSUNG','Samsung',''], # maybe ^SM
+ ['(SAMSUNG|^MCG[0-9]+GC|^G2 Portable|^DUO\b|^SP[0-9][0-9])','SAMSUNG','Samsung',''], # maybe ^SM
['(SanDisk|^SDS[S]?[DQ]|^SL([0-9]+)G|^AFGCE|ULTRA\sFIT|Clip Sport|Cruzer)','SanDisk','SanDisk',''],
['^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',''],
@@ -8592,20 +8657,25 @@ sub device_vendor {
['^Imation','^Imation(\sImation)?','Imation',''], # Imation_ImationFlashDrive; TF20 is imation/tdk
['^(InnoDisk|Innolite)','^InnoDisk( Corp.)?','InnoDisk',''],
['^Innostor','^Innostor','Innostor',''],
- ['^(Intenso|(Rainbow|Speed) Line)','^Intenso','Intenso',''],
+ ['^(Intenso|(Alu|Mobile|Rainbow|Speed) Line)','^Intenso','Intenso',''],
+ ['^(Iomega|ZIP\b)','^Iomega','Iomega',''],
+ ['^JMicron','^JMicron','JMicron',''], #JMicron H/W raid
['^KingDian','^KingDian','KingDian',''],
['^Kingfast','^Kingfast','Kingfast',''],
['^KingMAX','^KingMAX','KingMAX',''],
['^KINGSHARE','^KINGSHARE','KingShare',''],
['^KingSpec','^KingSpec','KingSpec',''],
+ ['^LDLC','^LDLC','LDLC',''],
['^(LITE[\-]?ON[\s\-]?IT)','^LITE[\-]?ON[\s\-]?IT','LITE-ON IT',''], # LITEONIT_LSS-24L6G
['^(LITE[\-]?ON|PH6)','^LITE[\-]?ON','LITE-ON',''], # PH6-CE240-L
['^M-Systems','^M-Systems','M-Systems',''],
['^(MAXTOR)','^MAXTOR','Maxtor',''], # note M3 is usually maxtor, but can be samsung
['^(MT|M5|Micron)','^Micron','Micron',''],
['^MARVELL','^MARVELL','Marvell',''],
+ ['^MDT\b','^MDT','MDT (rebuilt WD/Seagate)',''], # mdt rebuilds wd/seagate hdd
['^Medion','^Medion','Medion',''],
['^Motorola','^Motorola','Motorola',''],
+ ['^OOS[1-9]','','Utania',''],
['^PALIT','PALIT','Palit',''], # ssd
['^(PS[8F]|Patriot)','^Patriot','Patriot',''],
['^PIX[\s]?JR','^PIX[\s]?JR','Disney',''],
@@ -8617,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
@@ -8632,11 +8703,14 @@ 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
+ ['^TopSunlight','^TopSunlight','TopSunlight',''],
['^(TS|Transcend|JetFlash)','^Transcend','Transcend',''],
# Twister Line but if we slice out Twister it would just say Line
- ['^TrekStor','^TrekStor','TrekStor',''],
+ ['^(TrekStor|DS maxi)','^TrekStor','TrekStor',''],
['^UDinfo','^UDinfo','UDinfo',''],
['^(UG|Unigen)','^Unigen','Unigen',''],
['^VBOX','','VirtualBox',''],
@@ -8701,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) = @_;
@@ -8807,9 +8905,10 @@ sub get {
my (@data,@rows);
my $num = 0;
if (($b_arm || $b_mips) && !$b_soc_gfx && !$b_pci_tool){
- my $key = ($b_arm) ? 'ARM' : 'MIPS';
+ my $type = ($b_arm) ? 'arm' : 'mips';
+ my $key = 'Message';
@data = ({
- main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
+ main::key($num++,$key) => main::row_defaults($type . '-pci',''),
},);
@rows = (@rows,@data);
}
@@ -8818,8 +8917,12 @@ sub get {
@rows = (@rows,@data);
if (!@rows){
my $key = 'Message';
+ my $type = 'pci-card-data';
+ if ($pci_tool && ${$alerts{$pci_tool}}{'action'} eq 'permissions'){
+ $type = 'pci-card-data-root';
+ }
@data = ({
- main::key($num++,$key) => main::row_defaults('pci-card-data',''),
+ main::key($num++,$key) => main::row_defaults($type,''),
},);
@rows = (@rows,@data);
}
@@ -8831,63 +8934,50 @@ sub get {
eval $end if $b_log;
return @rows;
}
-# @pci:
-# 0 type
-# 1 type_id
-# 2 bus_id
-# 3 sub_id
-# 4 device
-# 5 vendor_id
-# 6 chip_id
-# 7 rev
-# 8 port
-# 9 driver
-# 10 modules
-# not using 3D controller yet, needs research: |3D controller |display controller
-# note: this is strange, but all of these can be either a separate or the same
-# card. However, by comparing bus id, say: 00:02.0 we can determine that the
-# cards are either the same or different. We want only the .0 version as a valid
-# card. .1 would be for example: Display Adapter with bus id x:xx.1, not the right one
+
sub card_data {
eval $start if $b_log;
my (@rows,@data);
my ($j,$num) = (0,1);
- foreach (@pci){
+ foreach (@devices_graphics){
$num = 1;
my @row = @$_;
#print "$row[0] $row[3]\n";
- if ($row[3] == 0 && ( $row[0] =~ /^(vga|disp|display|display-port-controller|3d|fb|gpu|hdmi|mali)$/ ) ){
- #print "$row[0] $row[3]\n";
- $j = scalar @rows;
- $driver = $row[9];
- $driver ||= 'N/A';
- my $card = main::trimmer($row[4]);
- $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
- #$card ||= 'N/A';
- # have seen absurdly verbose card descriptions, with non related data etc
- if (length($card) > 85 || $size{'max'} < 110){
- $card = main::pci_long_filter($card);
- }
- @data = ({
- main::key($num++,'Device') => $card,
- },);
- @rows = (@rows,@data);
- if ($extra > 2 && $b_pci_tool && $row[11]){
- my $item = main::get_pci_vendor($row[4],$row[11]);
- $rows[$j]{main::key($num++,'vendor')} = $item if $item;
- }
- $rows[$j]{main::key($num++,'driver')} = $driver;
- if ($row[9] && !$bsd_type){
- my $version = main::get_module_version($row[9]);
- $version ||= 'N/A';
- $rows[$j]{main::key($num++,'v')} = $version;
- }
- if ($extra > 0){
- $rows[$j]{main::key($num++,'bus ID')} = (!$row[2] && !$row[3]) ? 'N/A' : "$row[2].$row[3]";
- }
- if ($extra > 1){
- $rows[$j]{main::key($num++,'chip ID')} = ($row[5]) ? "$row[5]:$row[6]" : $row[6];
- }
+ # not using 3D controller yet, needs research: |3D controller |display controller
+ # note: this is strange, but all of these can be either a separate or the same
+ # card. However, by comparing bus id, say: 00:02.0 we can determine that the
+ # cards are either the same or different. We want only the .0 version as a valid
+ # card. .1 would be for example: Display Adapter with bus id x:xx.1, not the right one
+ next if $row[3] != 0;
+ #print "$row[0] $row[3]\n";
+ $j = scalar @rows;
+ $driver = $row[9];
+ $driver ||= 'N/A';
+ my $card = main::trimmer($row[4]);
+ $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
+ # have seen absurdly verbose card descriptions, with non related data etc
+ if (length($card) > 85 || $size{'max'} < 110){
+ $card = main::pci_long_filter($card);
+ }
+ @data = ({
+ main::key($num++,'Device') => $card,
+ },);
+ @rows = (@rows,@data);
+ if ($extra > 2 && $b_pci_tool && $row[12]){
+ my $item = main::get_pci_vendor($row[4],$row[12]);
+ $rows[$j]{main::key($num++,'vendor')} = $item if $item;
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
+ if ($row[9] && !$bsd_type){
+ my $version = main::get_module_version($row[9]);
+ $version ||= 'N/A';
+ $rows[$j]{main::key($num++,'v')} = $version;
+ }
+ if ($extra > 0){
+ $rows[$j]{main::key($num++,'bus ID')} = (!$row[2] && !$row[3]) ? 'N/A' : "$row[2].$row[3]";
+ }
+ if ($extra > 1){
+ $rows[$j]{main::key($num++,'chip ID')} = ($row[5]) ? "$row[5]:$row[6]" : $row[6];
}
#print "$row[0]\n";
}
@@ -9332,7 +9422,7 @@ sub x_version {
# load the extra X paths, it's important that these are first, because
# later Xorg versions show error if run in console or ssh if the true path
# is not used.
- @paths = ( qw(/usr/lib/xorg /usr/lib/xorg-server /usr/X11R6/bin), @paths );
+ @paths = ( qw(/usr/lib /usr/lib/xorg /usr/lib/xorg-server /usr/libexec /usr/X11R6/bin), @paths );
# IMPORTANT: both commands send version data to stderr!
if ($program = main::check_program('Xorg')){
@data = main::grabber("$program -version 2>&1");
@@ -9363,7 +9453,7 @@ sub x_version {
}
}
# remove extra X paths
- @paths = grep { !/xorg|X11R6/ } @paths;
+ @paths = grep { !/^\/usr\/lib|xorg|X11R6|libexec/ } @paths;
eval $end if $b_log;
return $version;
}
@@ -9411,6 +9501,7 @@ sub display_compositor {
['sway','sway','','sway'],
['swc','swc','','swc'],
['unagi','unagi','','unagi'],
+ ['unity-system-compositor','unity-system-compositor','','unity-system-compositor'],
['way-cooler','way-cooler','','way-cooler'],
['wavy','wavy','','wavy'],
['wayhouse','wayhouse','','wayhouse'],
@@ -10018,7 +10109,8 @@ sub get_device_vm {
}
# this will catch many Linux systems and some BSDs
if (!$vm || lc($vm) eq 'bochs' ) {
- my @vm_data = (@pci,@sysctl,@dmesg_boot);
+ # $device_vm is '' if nothing detected
+ my @vm_data = (@sysctl,@dmesg_boot,$device_vm);
if (-e '/dev/disk/by-id'){
my @dev = glob('/dev/disk/by-id/*');
@vm_data = (@vm_data,@dev);
@@ -10083,9 +10175,10 @@ sub get {
@rows = (@rows,@data) if @data;
# note: rasberry pi uses usb networking only
if (!@rows && ($b_arm || $b_mips)){
- my $key = ($b_arm) ? 'ARM' : 'MIPS';
+ my $type = ($b_arm) ? 'arm' : 'mips';
+ my $key = 'Message';
@data = ({
- main::key($num++,$key) => main::row_defaults(lc($key) . '-pci',''),
+ main::key($num++,$key) => main::row_defaults($type . '-pci',''),
},);
@rows = (@rows,@data);
}
@@ -10109,95 +10202,86 @@ sub get {
eval $end if $b_log;
return @rows;
}
-# 1 type_id
-# 2 bus_id
-# 3 sub_id
-# 4 device
-# 5 vendor_id
-# 6 chip_id
-# 7 rev
-# 8 port
-# 9 driver
-# 10 modules
-# 11 driver nu (bsds)
+
sub card_data {
eval $start if $b_log;
my ($b_wifi,@rows,@data,%holder);
my ($j,$num) = (0,1);
- foreach (@pci){
+ foreach (@devices_network){
$num = 1;
my @row = @$_;
#print "$row[0] $row[3]\n";
- # NOTE: class 06 subclass 80
- # https://www-s.acm.illinois.edu/sigops/2007/roll_your_own/7.c.1.html
- if (($row[0] && $row[0] =~ /^(eth|ethernet|ethernet-phy|lan|l-lan|network|wifi|wlan)$/ )|| ($row[1] && $row[1] eq '0680' ) ){
- #print "$row[0] $row[3]\n";
- $j = scalar @rows;
- my $driver = $row[9];
- my $chip_id = "$row[5]:$row[6]";
- # working around a virtuo bug same chip id is used on two nics
- if (!defined $holder{$chip_id}){
- $holder{$chip_id} = 0;
- }
- else {
- $holder{$chip_id}++;
- }
- # first check if it's a known wifi id'ed card, if so, no print of duplex/speed
- $b_wifi = check_wifi($row[4]);
- my $card = $row[4];
- $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
- #$card ||= 'N/A';
- $driver ||= 'N/A';
- @data = ({
- main::key($num++,'Device') => $card,
- },);
- @rows = (@rows,@data);
- #if ($extra > 2 && $b_pci_tool && $row[11]){
- # my $item = main::get_pci_vendor($row[4],$row[11]);
- # $rows[$j]{main::key($num++,'model')} = $item if $item;
- #}
- if ($row[1] eq '0680'){
- $rows[$j]{main::key($num++,'type')} = 'network bridge';
- }
- $rows[$j]{main::key($num++,'driver')} = $driver;
- my $bus_id = 'N/A';
- # note: for arm/mips we want to see the single item bus id, why not?
- # note: we can have bus id: 0002 / 0 which is valid, but 0 / 0 is invalid
- if (defined $row[2] && $row[2] ne '0' && defined $row[3]){$bus_id = "$row[2].$row[3]"}
- elsif (defined $row[2] && $row[2] ne '0'){$bus_id = $row[2]}
- elsif (defined $row[3] && $row[3] ne '0'){$bus_id = $row[3]}
- if ($extra > 0){
- if ($row[9] && !$bsd_type){
- my $version = main::get_module_version($row[9]);
- $version ||= 'N/A';
- $rows[$j]{main::key($num++,'v')} = $version;
- }
- $row[8] ||= 'N/A';
- # as far as I know, wifi has no port, but in case it does in future, use it
- $rows[$j]{main::key($num++,'port')} = $row[8] if (!$b_wifi || ( $b_wifi && $row[8] ne 'N/A') );
- $rows[$j]{main::key($num++,'bus ID')} = $bus_id;
+ #print "$row[0] $row[3]\n";
+ $j = scalar @rows;
+ my $driver = $row[9];
+ my $chip_id = "$row[5]:$row[6]";
+ # working around a virtuo bug same chip id is used on two nics
+ if (!defined $holder{$chip_id}){
+ $holder{$chip_id} = 0;
+ }
+ else {
+ $holder{$chip_id}++;
+ }
+ # first check if it's a known wifi id'ed card, if so, no print of duplex/speed
+ $b_wifi = check_wifi($row[4]);
+ my $card = $row[4];
+ $card = ($card) ? main::pci_cleaner($card,'output') : 'N/A';
+ #$card ||= 'N/A';
+ $driver ||= 'N/A';
+ @data = ({
+ main::key($num++,'Device') => $card,
+ },);
+ @rows = (@rows,@data);
+ if ($extra > 2 && $b_pci_tool && $row[12]){
+ my $item = main::get_pci_vendor($row[4],$row[12]);
+ $rows[$j]{main::key($num++,'vendor')} = $item if $item;
+ }
+ if ($row[1] eq '0680'){
+ $rows[$j]{main::key($num++,'type')} = 'network bridge';
+ }
+ $rows[$j]{main::key($num++,'driver')} = $driver;
+ my $bus_id = 'N/A';
+ # note: for arm/mips we want to see the single item bus id, why not?
+ # note: we can have bus id: 0002 / 0 which is valid, but 0 / 0 is invalid
+ if (defined $row[2] && $row[2] ne '0' && defined $row[3]){$bus_id = "$row[2].$row[3]"}
+ elsif (defined $row[2] && $row[2] ne '0'){$bus_id = $row[2]}
+ elsif (defined $row[3] && $row[3] ne '0'){$bus_id = $row[3]}
+ if ($extra > 0){
+ if ($row[9] && !$bsd_type){
+ my $version = main::get_module_version($row[9]);
+ $version ||= 'N/A';
+ $rows[$j]{main::key($num++,'v')} = $version;
}
- if ($extra > 1){
- $rows[$j]{main::key($num++,'chip ID')} = $chip_id;
+ $row[8] ||= 'N/A';
+ # as far as I know, wifi has no port, but in case it does in future, use it
+ $rows[$j]{main::key($num++,'port')} = $row[8] if (!$b_wifi || ( $b_wifi && $row[8] ne 'N/A') );
+ $rows[$j]{main::key($num++,'bus ID')} = $bus_id;
+ }
+ if ($extra > 1){
+ $rows[$j]{main::key($num++,'chip ID')} = $chip_id;
+ }
+ if ($show{'network-advanced'}){
+ @data = ();
+ if (!$bsd_type){
+ @data = advanced_data_sys($row[5],$row[6],$holder{$chip_id},$b_wifi,'',$bus_id);
}
- if ($show{'network-advanced'}){
- if (!$bsd_type){
- @data = advanced_data_sys($row[5],$row[6],$holder{$chip_id},$b_wifi,'',$bus_id);
- }
- else {
- @data = advanced_data_bsd("$row[9]$row[11]",$b_wifi);
- }
- @rows = (@rows,@data);
+ else {
+ @data = advanced_data_bsd("$row[9]$row[11]",$b_wifi) if defined $row[9] && defined $row[11];
}
+ @rows = (@rows,@data) if @data;
}
#print "$row[0]\n";
}
# @rows = ();
# we want to handle ARM errors in main get
- if (!@rows && !$b_arm){
+ if (!@rows && !$b_arm && !$b_mips){
my $key = 'Message';
+ my $type = 'pci-card-data';
+ if ($pci_tool && ${$alerts{$pci_tool}}{'action'} eq 'permissions'){
+ $type = 'pci-card-data-root';
+ }
@data = ({
- main::key($num++,$key) => main::row_defaults('pci-card-data',''),
+ main::key($num++,$key) => main::row_defaults($type,''),
},);
@rows = (@rows,@data);
@@ -10224,6 +10308,7 @@ sub usb_data {
$driver = $row[15] if $row[15];
$path = $row[3] if $row[3];
$path_id = $row[2] if $row[2];
+ $type = $row[14] if $row[14];
$test = "$driver $product $type";
if ($product && network_device($test)){
$driver ||= 'usb-network';
@@ -10244,6 +10329,7 @@ sub usb_data {
$rows[$j]{main::key($num++,'serial')} = main::apply_filter($row[16]);
}
if ($show{'network-advanced'}){
+ @data = ();
if (!$bsd_type){
my (@temp,$vendor,$chip);
@temp = split (/:/, $row[7]) if $row[7];
@@ -10317,7 +10403,7 @@ sub advanced_data_sys {
# print "d1:$data1 v:$vendor d2:$data2 c:$chip bus_id: $bus_id\n";
# print Cwd::abs_path($_), "\n" if $bus_id;
if ( $b_usb || $b_check || ( $data1 && $data2 && $data1 eq $vendor && $data2 eq $chip &&
- ( ($b_arm || $b_mips || $b_ppc || $b_sparc) || $bus_id && Cwd::abs_path($_) =~ /$bus_id\// ) )) {
+ ( ($b_arm || $b_mips || $b_ppc || $b_sparc) || check_bus_id($_,$bus_id) ) ) ) {
$if = $_;
$if =~ s/^\/.+\///;
# print "top: if: $if ifs: @ifs_found\n";
@@ -10370,6 +10456,7 @@ sub advanced_data_sys {
eval $end if $b_log;
return @rows;
}
+
sub advanced_data_bsd {
eval $start if $b_log;
return if ! @ifs_bsd;
@@ -10600,6 +10687,22 @@ sub network_device {
eval $end if $b_log;
return $b_network;
}
+sub check_bus_id {
+ eval $start if $b_log;
+ my ($path,$bus_id) = @_;
+ my ($b_valid);
+ if ($bus_id){
+ # legacy, not link, but uevent has path:
+ # PHYSDEVPATH=/devices/pci0000:00/0000:00:0a.1/0000:05:00.0
+ if (Cwd::abs_path($path) =~ /$bus_id\// ||
+ ( -r "$path/uevent" && -s "$path/uevent" &&
+ (grep {/$bus_id/} main::reader("$path/uevent") ) ) ){
+ $b_valid = 1;
+ }
+ }
+ eval $end if $b_log;
+ return $b_valid;
+}
sub check_wifi {
my ($item) = @_;
my $b_wifi = ($item =~ /wireless|wifi|wi-fi|wlan|802\.11|centrino/i) ? 1 : 0;
@@ -10969,17 +11072,29 @@ sub create_output {
eval $start if $b_log;
my $num = 0;
my $j = 0;
- my (@data,@data2,%part,@rows,$dev,$dev_type,$fs);
- @partitions = sort { $a->{'id'} cmp $b->{'id'} } @partitions;
+ my (@data,@data2,%part,@rows,$dev,$dev_type,$fs,$percent,$raw_size,$size,$used);
+ # alpha sort for non numerics
+ if ($show{'partition-sort'} !~ /^(percent-used|size|used)$/){
+ @partitions = sort { $a->{$show{'partition-sort'}} cmp $b->{$show{'partition-sort'}} } @partitions;
+ }
+ else {
+ @partitions = sort { $a->{$show{'partition-sort'}} <=> $b->{$show{'partition-sort'}} } @partitions;
+ }
foreach my $ref (@partitions){
my %row = %$ref;
$num = 1;
next if $row{'type'} eq 'secondary' && $show{'partition'};
- @data2 = main::get_size($row{'size'}) if (defined $row{'size'});
- my $size = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A';
- @data2 = main::get_size($row{'used'}) if (defined $row{'used'});
- my $used = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A';
- my $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-/){
@@ -11010,12 +11125,37 @@ sub create_output {
$j = scalar @rows;
@data = ({
main::key($num++,'ID') => $row{'id'},
- main::key($num++,'size') => $size,
- main::key($num++,'used') => $used . $percent,
- main::key($num++,'fs') => $fs,
- main::key($num++,$dev_type) => $dev,
});
@rows = (@rows,@data);
+ 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'};
+ }
+ else {
+ @data2 = main::get_size($row{'raw-size'});
+ $raw_size = (@data2) ? $data2[0] . ' ' . $data2[1]: 'N/A';
+ }
+ $rows[$j]{main::key($num++,'raw size')} = $raw_size;
+ }
+ if ($b_admin && $row{'raw-available'} && $size ne 'N/A'){
+ $size .= ' (' . $row{'raw-available'} . '%)';
+ }
+ $rows[$j]{main::key($num++,'size')} = $size;
+ $rows[$j]{main::key($num++,'used')} = $used . $percent;
+ $rows[$j]{main::key($num++,'fs')} = $fs;
+ if ($b_admin && $fs eq 'swap' && $row{'swappiness'}){
+ $rows[$j]{main::key($num++,'swappiness')} = $row{'swappiness'};
+ }
+ if ($b_admin && $fs eq 'swap' && $row{'cache-pressure'}){
+ $rows[$j]{main::key($num++,'cache pressure')} = $row{'cache-pressure'};
+ }
+ if ($b_admin && $row{'block-size'}){
+ $rows[$j]{main::key($num++,'block size')} = $row{'block-size'} . ' B';;
+ #$rows[$j]{main::key($num++,'physical')} = $row{'block-size'} . ' B';
+ #$rows[$j]{main::key($num++,'logical')} = $row{'block-logical'} . ' B';
+ }
+ $rows[$j]{main::key($num++,$dev_type)} = $dev;
if ($show{'label'}){
$rows[$j]{main::key($num++,'label')} = ($row{'label'}) ? $row{'label'}: 'N/A';
}
@@ -11030,11 +11170,18 @@ sub create_output {
sub partition_data {
eval $start if $b_log;
#return if $bsd_type && $bsd_type eq 'darwin'; # darwin has muated output, of course
- my (@data,@rows,@mapper,@mount,@partitions_working,%part);
+ 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 ($dev_base,$fs,$id,$label,$percent_used,$size,$type,$uuid,$used);
+ 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){
+ # for partition block size
+ $blockdev = main::check_program('blockdev');
+ # for raw partition sizes
+ DiskData::set_proc_partitions() if !$bsd_type && !$b_proc_partitions;
+ }
set_lsblk() if !$bsd_type && !$b_lsblk;
# set labels, uuid, gpart
set_label_uuid() if !$b_label_uuid;
@@ -11091,17 +11238,10 @@ sub partition_data {
($b_fs && ($row[2] == 0 || $row[1] eq 'tmpfs' || $row[1] eq 'autofs' ))){
next;
}
- $dev_base = '';
- $fs = '';
- $id = '';
- $label = '';
- $size = 0;
- $used = 0;
+ ($dev_base,$fs,$id,$label,$type,$uuid) = ('','','','','');
+ ($b_load,$block_size,$percent_used,$raw_size,$size_available,
+ $size,$used) = (0,0,0,0,0,0,0,0);
%part = ();
- $percent_used = 0;
- $type = '';
- $uuid = '';
- $b_load = 0;
# NOTE: using -P for linux fixes line wraps, and for bsds, assuming they don't use such long file names
if ($row[0] =~ /^\/dev\/|:\/|\/\//){
# this could point to by-label or by-uuid so get that first. In theory, abs_path should
@@ -11175,13 +11315,22 @@ sub partition_data {
$id = join ' ', @row[$cols .. $#row];
$id =~ s/\/home\/[^\/]+\/(.*)/\/home\/$filter_string\/$1/ if $show{'filter'};
$size = $row[$cols - $back_size];
+ if ($b_admin && -e "/sys/block/"){
+ @working = admin_data($blockdev,$dev_base,$size);
+ $raw_size = $working[0];
+ $size_available = $working[1];
+ $block_size = $working[2];
+ }
$used = $row[$cols - $back_used];
$percent_used = sprintf( "%.1f", ( $used/$size )*100 ) if ($size);
@data = ({
+ 'block-size' => $block_size,
'id' => $id,
'dev-base' => $dev_base,
'fs' => $fs,
'label' => $label,
+ 'raw-size' => $raw_size,
+ 'raw-available' => $size_available,
'size' => $size,
'type' => $type,
'used' => $used,
@@ -11193,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;
@@ -11200,7 +11353,7 @@ sub partition_data {
sub swap_data {
eval $start if $b_log;
- my (@swap,@working,$path,$label,$uuid);
+ my (@swap,@working,$cache_pressure,$path,$label,$swappiness,$uuid);
my ($s,$j,$size_id,$used_id) = (1,0,2,3);
if (!$bsd_type){
# faster, avoid subshell, same as swapon -s
@@ -11212,6 +11365,11 @@ sub swap_data {
# on older systems
@working = main::grabber("$path -s 2>/dev/null");
}
+ if ($b_admin){
+ my @data = swap_advanced_data();
+ $swappiness = $data[0];
+ $cache_pressure = $data[1];
+ }
}
else {
if ( $path = main::check_program('swapctl') ){
@@ -11245,11 +11403,13 @@ sub swap_data {
}
}
@data = ({
- 'id' => "swap-$s",
+ 'cache-pressure' => $cache_pressure,
'dev-base' => $dev_base,
'fs' => 'swap',
+ 'id' => "swap-$s",
'label' => $label,
'size' => $size,
+ 'swappiness' => $swappiness,
'type' => 'main',
'used' => $used,
'uuid' => $uuid,
@@ -11261,6 +11421,24 @@ sub swap_data {
eval $end if $b_log;
return @swap;
}
+sub swap_advanced_data {
+ eval $start if $b_log;
+ my ($swappiness,$cache_pressure) = ('','');
+ if (-r "/proc/sys/vm/swappiness"){
+ $swappiness = (main::reader("/proc/sys/vm/swappiness"))[0];
+ if (defined $swappiness){
+ $swappiness .= ($swappiness == 60) ? ' (default)' : ' (default 60)' ;
+ }
+ }
+ if (-r "/proc/sys/vm/vfs_cache_pressure"){
+ $cache_pressure = (main::reader("/proc/sys/vm/vfs_cache_pressure"))[0];
+ if (defined $cache_pressure){
+ $cache_pressure .= ($cache_pressure == 100) ? ' (default)' : ' (default 100)' ;
+ }
+ }
+ eval $end if $b_log;
+ return ($swappiness,$cache_pressure);
+}
sub get_mounts_fs {
eval $start if $b_log;
my ($item,@mount) = @_;
@@ -11340,12 +11518,12 @@ sub set_lsblk {
$b_lsblk = 1;
my (@temp,@working);
if (my $program = main::check_program('lsblk')){
- @working = main::grabber("$program -bP --output NAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,SERIAL,MOUNTPOINT 2>/dev/null");
+ @working = main::grabber("$program -bP --output NAME,TYPE,RM,FSTYPE,SIZE,LABEL,UUID,SERIAL,MOUNTPOINT,PHY-SEC,LOG-SEC 2>/dev/null");
foreach (@working){
- if (/NAME="([^"]*)"\s+TYPE="([^"]*)"\s+RM="([^"]*)"\s+FSTYPE="([^"]*)"\s+SIZE="([^"]*)"\s+LABEL="([^"]*)"\s+UUID="([^"]*)"\s+SERIAL="([^"]*)"\s+MOUNTPOINT="([^"]*)"/){
+ 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,
@@ -11355,19 +11533,21 @@ sub set_lsblk {
'uuid' => $7,
'serial' => $8,
'mount' => $9,
+ 'block-physical' => $10,
+ 'block-logical' => $11,
});
@lsblk = (@lsblk,@temp);
}
}
}
- # print Data::Dumper::Dumper \@lsblk;
+ #print Data::Dumper::Dumper \@lsblk;
main::log_data('dump','@lsblk',\@lsblk) if $b_log;
eval $end if $b_log;
}
sub check_lsblk {
eval $start if $b_log;
my ($name,$b_size) = @_;
- my (%part,@row);
+ my (%part);
foreach my $ref (@lsblk){
my %row = %$ref;
next if ! $row{'name'};
@@ -11381,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) = @_;
@@ -11466,12 +11718,21 @@ package ProcessData;
sub get {
eval $start if $b_log;
my (@processes,@rows);
- if ($show{'ps-cpu'}){
- @rows = cpu_processes();
- @processes = (@processes,@rows);
+ if (@ps_aux){
+ if ($show{'ps-cpu'}){
+ @rows = cpu_processes();
+ @processes = (@processes,@rows);
+ }
+ if ($show{'ps-mem'}){
+ @rows = mem_processes();
+ @processes = (@processes,@rows);
+ }
}
- if ($show{'ps-mem'}){
- @rows = mem_processes();
+ else {
+ my $key = 'Message';
+ @rows = ({
+ main::key(1,$key) => main::row_defaults('ps-data-null',''),
+ },);
@processes = (@processes,@rows);
}
return @processes;
@@ -11552,7 +11813,7 @@ sub mem_processes {
}
@rows = splice @rows,0,$count;
#print Data::Dumper::Dumper \@rows;
- @processes = main::memory_data_full('process') if !$b_mem;
+ @processes = main::get_memory_data_full('process') if !$b_mem;
$j = scalar @rows;
my $throttled = throttled($ps_count,$count,$j);
#$cpu_mem = ' - CPU: % used' if $extra > 0;
@@ -11915,9 +12176,8 @@ sub raid_data {
sub hardware_raid {
eval $start if $b_log;
my ($driver,$vendor,@data,@working);
- foreach my $ref (@pci){
+ foreach my $ref (@devices_hwraid){
@working = @$ref;
- next if $working[1] ne '0104';
$driver = ($working[9]) ? lc($working[9]): '';
$driver =~ s/-/_/g if $driver;
my $driver_version = ($driver) ? main::get_module_version($driver): '';
@@ -12238,7 +12498,7 @@ sub get {
my (@data,@rows,$key1,@ram,$val1);
my $num = 0;
my $ref = $alerts{'dmidecode'};
- @rows = main::memory_data_full('ram') if !$b_mem;
+ @rows = main::get_memory_data_full('ram') if !$b_mem;
if ( !$b_fake_dmidecode && $$ref{'action'} ne 'use'){
$key1 = $$ref{'action'};
$val1 = $$ref{$key1};
@@ -12837,6 +13097,8 @@ sub get_repos_linux {
my $tce_file = '/opt/tcemirror';
my $yum_conf = '/etc/yum.conf';
my $yum_repo_dir = '/etc/yum.repos.d/';
+ my $xbps_dir_1 = '/etc/xbps.d/';
+ my $xbps_dir_2 = '/usr/share/xbps.d/';
my $zypp_repo_dir = '/etc/zypp/repos.d/';
my $b_test = 0;
# apt - debian, buntus, also sometimes some yum/rpm repos may create
@@ -12849,7 +13111,7 @@ sub get_repos_linux {
push @files, $apt;
main::log_data('data',"apt repo files:\n" . main::joiner(\@files, "\n", 'unset') ) if $b_log;
foreach ( sort @files){
- # altlinux uses rpms in apt files!
+ # altlinux/pclinuxos use rpms in apt files
@data = repo_builder($_,'apt','^\s*(deb|rpm)') if -r $_;
@rows = (@rows,@data);
}
@@ -12857,88 +13119,68 @@ sub get_repos_linux {
@files = main::globber('/etc/apt/sources.list.d/*.sources');
main::log_data('data',"apt deb822 repo files:\n" . main::joiner(\@files, "\n", 'unset') ) if $b_log;
foreach $file (@files){
- @data2 = main::reader($file,'strip');
- my $count = scalar @data2;
+ # critical: whitespace is the separator, no logical ordering of
+ # field names exists within each entry.
+ @data2 = main::reader($file);
+ #print Data::Dumper::Dumper \@data2;
+ if (@data2){
+ @data2 = map {s/^\s*$/~/;$_} @data2;
+ push @data2, '~';
+ }
push @dbg_files, $file if $debugger_dir;
#print "$file\n";
@apt_urls = ();
@apt_working = ();
- $counter = 0;
$b_apt_enabled = 1;
foreach my $row (@data2){
- $counter++;
- next if $row =~ /^\s*$|^\s*#/;
- #print "row:$row\n";
- if ($row =~ /^Types:\s*(.*)/){
- my $type_holder= $1;
- #print "ath:$type_holder\n";
- if ($apt_types && @apt_working){
- if ($b_apt_enabled){
- #print "1: url builder\n";
- foreach $repo (@apt_working){
- $string = $apt_types;
- $string .= ' [arch=' . $apt_arch . ']' if $apt_arch;
- $string .= ' ' . $repo;
- $string .= ' ' . $apt_suites if $apt_suites ;
- $string .= ' ' . $apt_comp if $apt_comp;
-
- #print "s1:$string\n";
- push @data3, $string;
- }
+ next if $row =~ /^\s+/; # deb822 supports line folding which starts with space
+ #print "$row\n";
+ if ($row eq '~'){
+ if (@apt_working && $b_apt_enabled){
+ #print "1: url builder\n";
+ foreach $repo (@apt_working){
+ $string = $apt_types;
+ $string .= ' [arch=' . $apt_arch . ']' if $apt_arch;
+ $string .= ' ' . $repo;
+ $string .= ' ' . $apt_suites if $apt_suites ;
+ $string .= ' ' . $apt_comp if $apt_comp;
+ #print "s1:$string\n";
+ push @data3, $string;
}
#print join "\n",@data3,"\n";
@apt_urls = (@apt_urls,@data3);
- @data3 = ();
- @apt_working = ();
- $apt_arch = '';
- $apt_comp = '';
- $apt_suites = '';
- $apt_types = '';
}
- $apt_types = $type_holder;
+ @data3 = ();
+ @apt_working = ();
+ $apt_arch = '';
+ $apt_comp = '';
+ $apt_suites = '';
+ $apt_types = '';
$b_apt_enabled = 1;
}
- if ($row =~ /^Enabled:\s*(.*)/){
+ #print "row:$row\n";
+ elsif ($row =~ /^Types:\s*(.*)/){
+ #print "ath:$type_holder\n";
+ $apt_types = $1;
+ }
+ elsif ($row =~ /^Enabled:\s*(.*)/){
my $status = $1;
- $b_apt_enabled = ($status =~ /no/i) ? 0: 1;
+ $b_apt_enabled = ($status =~ /\b(disable|false|off|no|without)\b/i) ? 0: 1;
}
- if ($row =~ /:\//){
+ elsif ($row =~ /^[^#]+:\//){
my $url = $row;
$url =~ s/^URIs:\s*//;
push @apt_working, $url if $url;
}
- if ($row =~ /^Suites:\s*(.*)/){
+ elsif ($row =~ /^Suites:\s*(.*)/){
$apt_suites = $1;
}
- if ($row =~ /^Components:\s*(.*)/){
+ elsif ($row =~ /^Components:\s*(.*)/){
$apt_comp = $1;
}
- if ($row =~ /^Architectures:\s*(.*)/){
+ elsif ($row =~ /^Architectures:\s*(.*)/){
$apt_arch = $1;
}
- # we've hit the last line!!
- if ($counter == $count && @apt_working){
- #print "2: url builder\n";
- if ($b_apt_enabled){
- foreach $repo (@apt_working){
- my $string = $apt_types;
- $string .= ' [arch=' . $apt_arch . ']' if $apt_arch;
- $string .= ' ' . $repo;
- $string .= ' ' . $apt_suites if $apt_suites ;
- $string .= ' ' . $apt_comp if $apt_comp;
- #print "s2:$string\n";
- push @data3, $string;
- }
- }
- #print join "\n",@data3,"\n";
- @apt_urls = (@apt_urls,@data3);
- @data3 = ();
- @apt_working = ();
- $apt_arch = '';
- $apt_comp = '';
- $apt_suites = '';
- $apt_types = '';
- }
}
if (@apt_urls){
$key = repo_builder('active','apt');
@@ -13198,6 +13440,16 @@ sub get_repos_linux {
@data = repo_builder($tce_file,'tce','^\s*[^#]+');
@rows = (@rows,@data);
}
+ # void $xbps_dir_1
+ if (-d $xbps_dir_1 || -d $xbps_dir_2){
+ @files = main::globber("$xbps_dir_1*.conf");
+ @files = (@files,main::globber("$xbps_dir_2*.conf")) if -d $xbps_dir_2;
+ main::log_data('data',"xbps repo files:\n" . main::joiner(\@files, "\n", 'unset') ) if $b_log;
+ foreach ( sort @files){
+ @data = repo_builder($_,'xbps','^\s*repository\s*=','\s*=\s*',1) if -r $_;
+ @rows = (@rows,@data);
+ }
+ }
# Mandriva/Mageia using: urpmq
if ( $path = main::check_program('urpmq') ){
@data2 = main::grabber("$path --list-media active --list-url","\n",'strip');
@@ -13432,6 +13684,7 @@ sub repo_builder {
'slackpkg+' => 'No active slackpkg+ repos in',
'slaptget' => 'No active slapt-get repos in',
'tce' => 'No active tce mirrors in',
+ 'xbps' => 'No active xbps repos in',
'yum' => 'No active yum repos in',
'zypp' => 'No active zypp repos in',
);
@@ -13455,6 +13708,7 @@ sub repo_builder {
'slackpkg+' => 'slackpkg+ repos in',
'slaptget' => 'slapt-get repos in',
'tce' => 'Active tce mirrors in',
+ 'xbps' => 'Active xbps repos in',
'yum' => 'Active yum repos in',
'zypp' => 'Active zypp repos in',
);
@@ -14816,7 +15070,7 @@ sub usb_data {
main::key($num++,'Hub') => $bus_id,
main::key($num++,'info') => $product,
main::key($num++,'ports') => $ports,
- main::key($num++,'usb') => $speed,
+ main::key($num++,'rev') => $speed,
},);
@rows = (@rows,@data);
$b_hub = 1;
@@ -14837,7 +15091,13 @@ sub usb_data {
if ($extra > 2 && $id[9]){
$rows[$j]{main::key($num++,'interfaces')} = $id[9];
}
- $rows[$j]{main::key($num++,'usb')} = $speed;
+ $rows[$j]{main::key($num++,'rev')} = $speed;
+ }
+ if ($extra > 2 && main::is_numeric($id[17])){
+ my $speed = $id[17];
+ if ($speed >= 1000) {$speed = ($id[17] / 1000 ) . " Gb/s"}
+ else {$speed = $id[17] . " Mb/s"}
+ $rows[$j]{main::key($num++,'speed')} = $speed;
}
if ($extra > 1){
$rows[$j]{main::key($num++,'chip ID')} = $chip_id;
@@ -15228,7 +15488,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;
}
@@ -15761,11 +16021,14 @@ sub get_ps_de_data {
['qtile','qtile','qtile','qtile'],
['ratpoison','ratpoison','ratpoison','ratpoison'],
['sawfish','sawfish','sawfish','sawfish'],
+ ['sway','sway','sway','sway'],
['matchbox-window-manager','matchbox-window-manager',
'matchbox-window-manager','matchbox-window-manager'],
['afterstep','afterstep','afterstep','afterstep'],
['bspwm','bspwm','bspwm','bspwm'],
['tvtwm','tvtwm','tvtwm','tvtwm'],
+ ['waycooler','waycooler','way-cooler','way-cooler'],
+ ['way-cooler','way-cooler','way-cooler','way-cooler'],
['WindowMaker','WindowMaker','wmaker','wmaker'],
['windowlab','windowlab','windowlab','windowlab'],
['wmx','wmx','wmx','wmx'],
@@ -15858,7 +16121,7 @@ sub get_wm_main {
$wms .= 'twin|kwin_wayland|kwin_x11|kwin|lwm|matchbox-window-manager|marco|';
$wms .= 'muffin|deepin-mutter|mutter|deepin-metacity|metacity|mwm|';
$wms .= 'nawm|notion|openbox|orbital|perceptia|qtile|ratpoison|sawfish|scrotwm|spectrwm|';
- $wms .= 'tvtwm|twm|windowlab|WindowMaker|wm2|wmii2|wmii|wmx|xfwm4|xfwm5|xmonad';
+ $wms .= 'sway|tvtwm|twm|way-?cooler|windowlab|WindowMaker|wm2|wmii2|wmii|wmx|xfwm4|xfwm5|xmonad';
foreach (@ps_gui){
if (/^($wms)$/){
$working = $1;
@@ -15925,7 +16188,7 @@ sub set_info_data {
$pattern .= 'latte|latte-dock|lemonbar|ltpanel|lxpanel|lxqt-panel|';
$pattern .= 'matchbox-panel|mate-panel|ourico|';
$pattern .= 'perlpanel|plank|plasma-desktop|plasma-netbook|polybar|pypanel|';
- $pattern .= 'razor-panel|razorqt-panel|stalonetray|taskbar|tint2|trayer|';
+ $pattern .= 'razor-panel|razorqt-panel|stalonetray|swaybar|taskbar|tint2|trayer|';
$pattern .= 'vala-panel|wbar|wharf|wingpanel|witray|';
$pattern .= 'xfce4-panel|xfce5-panel|xmobar|yabar';
if (@data = grep {/^($pattern)$/} @ps_gui ) {
@@ -16632,15 +16895,19 @@ sub get_init_data {
# missing data: note, runit can install as a dependency without being the
# init system: http://smarden.org/runit/sv.8.html
# NOTE: the proc test won't work on bsds, so if runit is used on bsds we
- # will need more data
+ # will need more datas
elsif ($comm =~ /runit/){
$init = 'runit';
}
+ elsif ($comm =~ /^s6/){
+ $init = 's6';
+ }
}
if (!$init){
# output: /sbin/init --version: init (upstart 1.1)
# init (upstart 0.6.3)
- if ($init_version = program_version('init', 'upstart', '3','--version')){
+ # openwrt /sbin/init hangs on --version command, I think
+ if ((!$b_mips && !$b_sparc && !$b_arm) && ($init_version = program_version('init', 'upstart', '3','--version') )){
$init = 'Upstart';
}
elsif (check_program('launchctl')){
@@ -16722,6 +16989,38 @@ sub get_kernel_bits {
return $bits;
}
+sub get_memory_data_full {
+ eval $start if $b_log;
+ my ($source) = @_;
+ my $num = 0;
+ my ($memory,@rows);
+ my ($gpu_ram,$percent,$total,$used) = (0,'','','');
+ if ($show{'ram'} || (!$show{'info'} && $show{'process'} )){
+ $memory = get_memory_data('splits');
+ if ($memory){
+ my @temp = split /:/, $memory;
+ my @temp2 = get_size($temp[0]);
+ $gpu_ram = $temp[3] if $temp[3];
+ $total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
+ @temp2 = get_size($temp[1]);
+ $used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
+ $used .= " ($temp[2]%)" if $temp[2];
+ if ($gpu_ram){
+ @temp2 = get_size($gpu_ram);
+ $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
+ }
+ }
+ my $key = ($source eq 'process') ? 'System RAM': 'RAM';
+ $rows[0]{main::key($num++,$key)} = '';
+ $rows[0]{main::key($num++,'total')} = $total;
+ $rows[0]{main::key($num++,'used')} = $used;
+ $rows[0]{main::key($num++,'gpu')} = $gpu_ram if $gpu_ram;
+ $b_mem = 1;
+ }
+ eval $end if $b_log;
+ return @rows;
+}
+
sub get_memory_data {
eval $start if $b_log;
my ($type) = @_;
@@ -17041,7 +17340,7 @@ sub get_shell_source {
# so: perl (2) started pinxi with sudo (3) in sh (4) in terminal
for my $i (2..4){
if ( $shell_parent &&
- $shell_parent =~ /^(bash|csh|dash|ksh|lksh|loksh|mksh|pdksh|perl|sh|su|sudo|tcsh|zsh)$/ ){
+ $shell_parent =~ /^(ash|bash|csh|dash|ksh|lksh|loksh|mksh|pdksh|perl|sh|su|sudo|tcsh|zsh)$/ ){
# no idea why have to do script_parent action twice in su case, but you do.
$self_parent = get_start_parent($self_parent);
$shell_parent = get_shell_parent($self_parent);
@@ -17154,6 +17453,7 @@ sub get_tty_number {
# 10:23PM up 5 days, 16:17, 1 user, load averages: 0.85, 0.90, 1.00
# 05:36:47 up 1 day, 3:28, 4 users, load average: 1,88, 0,98, 0,62
# 05:36:47 up 1 day, 3 min, 4 users, load average: 1,88, 0,98, 0,62
+# 04:41:23 up 2:16, load average: 7.13, 6.06, 3.41 # root openwrt
sub get_uptime {
eval $start if $b_log;
my ($days,$hours,$minutes,$uptime) = ('','','','');
@@ -17162,7 +17462,7 @@ sub get_uptime {
$uptime = trimmer($uptime);
#$uptime = '05:36:47 up 3 min, 4 users, load average: 1,88, 0,98, 0,62';
if ($uptime &&
- $uptime =~ /[\S]+\s+up\s+(([0-9]+)\s+day[s]?,\s+)?(([0-9]{1,2}):([0-9]{1,2})|([0-9]+)\smin[s]?),\s+[0-9]+\s+user/){
+ $uptime =~ /[\S]+\s+up\s+(([0-9]+)\s+day[s]?,\s+)?(([0-9]{1,2}):([0-9]{1,2})|([0-9]+)\smin[s]?),\s+([0-9]+\s+user|load average)/){
$days = $2 . 'd' if $2;
$days .= ' ' if ($days && ($4 || $6));
if ($4 && $5){
@@ -17185,6 +17485,524 @@ sub get_uptime {
#### SET DATA VALUES
#### -------------------------------------------------------------------
+## creates arrays: @devices_audio; @devices_graphics; @devices_hwraid;
+## @devices_network; @devices_timer plus @devices for logging/debugging
+# 0 type
+# 1 type_id
+# 2 bus_id
+# 3 sub_id
+# 4 device
+# 5 vendor_id
+# 6 chip_id
+# 7 rev
+# 8 port
+# 9 driver
+# 10 modules
+# 11 driver_nu [bsd, like: em0 - driver em; nu 0. Used to match IF in -n
+# 12 subsystem/vendor
+# 13 subsystem vendor_id:chip id
+# 14 soc handle
+## DeviceData / PCI / SOC
+{
+package DeviceData;
+my (@data,@devices,@files,@full_names,@pcis,@temp,@temp2,@temp3);
+
+my ($busid,$busid_nu,$chip_id,$content,$device,$driver,$driver_nu,$file,
+$handle,$modules,$port,$rev,$temp,$type,$type_id,$vendor,$vendor_id);
+
+sub set {
+ eval $start if $b_log;
+ $_[0] = 1; # check boolean passed by reference
+ if ( $b_pci ){
+ if (!$bsd_type){
+ if ($alerts{'lspci'}{'action'} eq 'use' ){
+ lspci_data();
+ }
+ # ! -d '/proc/bus/pci'
+ # this is sketchy, a sbc won't have pci, but a non sbc arm may have it, so
+ # build up both and see what happens
+ if ($b_arm || $b_mips || $b_ppc || $b_sparc){
+ soc_data();
+ }
+ }
+ else {
+ #if (1 == 1){
+ if ($alerts{'pciconf'}{'action'} eq 'use'){
+ pciconf_data();
+ }
+ elsif ($alerts{'pcidump'}{'action'} eq 'use'){
+ pcidump_data();
+ }
+ }
+ if ($test[9]){
+ print Data::Dumper::Dumper \@devices_audio;
+ print Data::Dumper::Dumper \@devices_graphics;
+ print Data::Dumper::Dumper \@devices_network;
+ print Data::Dumper::Dumper \@devices_hwraid;
+ print Data::Dumper::Dumper \@devices_timer;
+ print "vm: $device_vm\n";
+ }
+ if ( $b_log){
+ main::log_data('dump','@devices_audio',\@devices_audio);
+ main::log_data('dump','@devices_graphics',\@devices_graphics);
+ main::log_data('dump','@devices_hwraid',\@devices_hwraid);
+ main::log_data('dump','@devices_network',\@devices_network);
+ main::log_data('dump','@devices_timer',\@devices_timer);
+ }
+ }
+ @devices = undef;
+ eval $end if $b_log;
+}
+
+sub lspci_data {
+ eval $start if $b_log;
+ my ($subsystem,$subsystem_id);
+ @data = pci_grabber('lspci');
+ #print Data::Dumper::Dumper \@data;
+ foreach (@data){
+ #print "$_\n";
+ if ($device){
+ if ($_ =~ /^~$/) {
+ @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
+ $rev,$port,$driver,$modules,$driver_nu,$subsystem,$subsystem_id);
+ assign_data('pci',@temp);
+ $device = '';
+ #print "$busid $device_id r:$rev p: $port\n$type\n$device\n";
+ }
+ elsif ($_ =~ /^Subsystem.*\[([a-f0-9]{4}:[a-f0-9]{4})\]/){
+ $subsystem_id = $1;
+ $subsystem = (split /^Subsystem:\s*/,$_)[1];
+ $subsystem =~ s/(\s?\[[^\]]+\])+$//g;
+ $subsystem = main::cleaner($subsystem);
+ $subsystem = main::pci_cleaner($subsystem,'pci');
+ $subsystem = main::pci_cleaner_subsystem($subsystem);
+ #print "ss:$subsystem\n";
+ }
+ elsif ($_ =~ /^I\/O\sports/){
+ $port = (split /\s+/,$_)[3];
+ #print "p:$port\n";
+ }
+ elsif ($_ =~ /^Kernel\sdriver\sin\suse/){
+ $driver = (split /:\s*/,$_)[1];
+ }
+ elsif ($_ =~ /^Kernel\smodules/i){
+ $modules = (split /:\s*/,$_)[1];
+ }
+ }
+ # note: arm servers can have more complicated patterns
+ # 0002:01:02.0 Ethernet controller [0200]: Cavium, Inc. THUNDERX Network Interface Controller virtual function [177d:a034] (rev 08)
+ elsif ($_ =~ /^(([0-9a-f]{2,4}:)?[0-9a-f]{2}:[0-9a-f]{2})[.:]([0-9a-f]+)\s(.*)\s\[([0-9a-f]{4}):([0-9a-f]{4})\](\s\(rev\s([^\)]+)\))?/){
+ $busid = $1;
+ $busid_nu = hex($3);
+ @temp = split /:\s+/, $4;
+ $device = $temp[1];
+ $type = $temp[0];
+ $vendor_id = $5;
+ $chip_id = $6;
+ $rev = ($8)? $8 : '';
+ $device = main::cleaner($device);
+ $temp[0] =~ /\[([^\]]+)\]$/;
+ $type_id = $1;
+ $b_hardware_raid = 1 if $type_id eq '0104';
+ $type = lc($type);
+ $type = main::pci_cleaner($type,'pci');
+ $type =~ s/\s+$//;
+ #print "$type\n";
+ ($driver,$driver_nu,$modules,$subsystem,$subsystem_id) = ('','','','','');
+ }
+ }
+ print Data::Dumper::Dumper \@devices if $test[4];
+ main::log_data('dump','lspci @devices',\@devices) if $b_log;
+ eval $end if $b_log;
+}
+
+# em0@pci0:6:0:0: class=0x020000 card=0x10d315d9 chip=0x10d38086 rev=0x00 hdr=0x00
+# vendor = 'Intel Corporation'
+# device = 'Intel 82574L Gigabit Ethernet Controller (82574L)'
+# class = network
+# subclass = ethernet
+sub pciconf_data {
+ eval $start if $b_log;
+ @data = pci_grabber('pciconf');
+ foreach (@data){
+ if ($driver){
+ if ($_ =~ /^~$/) {
+ $vendor = main::cleaner($vendor);
+ $device = main::cleaner($device);
+ if ($vendor && $device){
+ if ($vendor !~ /$device/i){
+ $device = "$vendor $device";
+ }
+ }
+ elsif (!$device){
+ $device = $vendor;
+ }
+ @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
+ $rev,$port,$driver,$modules,$driver_nu);
+ assign_data('pci',@temp);
+ $driver = '';
+ #print "$busid $device_id r:$rev p: $port\n$type\n$device\n";
+ }
+ elsif ($_ =~ /^vendor/){
+ $vendor = (split /\s+=\s+/,$_)[1];
+ #print "p:$port\n";
+ }
+ elsif ($_ =~ /^device/){
+ $device = (split /\s+=\s+/,$_)[1];
+ }
+ elsif ($_ =~ /^class/i){
+ $type = (split /\s+=\s+/,$_)[1];
+ }
+ }
+ elsif (/^([^@]+)\@pci([0-9]{1,3}:[0-9]{1,3}:[0-9]{1,3}):([0-9]{1,3}).*class=([^\s]+)\scard=([^\s]+)\schip=([^\s]+)\srev=([^\s]+)/){
+ $driver = $1;
+ $busid = $2;
+ $busid_nu = $3;
+ $type_id = $4;
+ #$vendor_id = $5;
+ $vendor_id = substr($6,6,4);
+ $chip_id = substr($6,2,4);
+ $rev = $7;
+ $driver =~ /(^[a-z]+)([0-9]+$)/;
+ $driver = $1;
+ $driver_nu = $2;
+ # convert to 4 character, strip off 0x, and last trailing sub sub class.
+ $type_id =~ s/^(0x)?([0-9a-f]{4}).*/$2/ if $type_id;
+ ($device,$type,$vendor) = ('','','');
+ }
+ }
+ print Data::Dumper::Dumper \@devices if $test[4];
+ main::log_data('dump','pciconf @devices',\@devices) if $b_log;
+ eval $end if $b_log;
+}
+
+sub pcidump_data {
+ eval $start if $b_log;
+ @data = pci_grabber('pcidump');
+ foreach (@data){
+ if ($_ =~ /^~$/ && $busid && $device) {
+ @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
+ $rev,$port,$driver,$modules,$driver_nu);
+ assign_data('pci',@temp);
+ ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
+ $rev,$port,$driver,$modules,$driver_nu) = undef;
+ next;
+ }
+ if ($_ =~ /^([0-9a-f:]+):([0-9]+):\s([^:]+)$/i){
+ $busid = $1;
+ $busid_nu = $2;
+ $device = main::cleaner($3);
+ }
+ elsif ($_ =~ /^0x[\S]{4}: Vendor ID: ([0-9a-f]{4}) Product ID: ([0-9a-f]{4})/ ){
+ $vendor_id = $1;
+ $chip_id = $2;
+ }
+ elsif ($_ =~ /^0x[\S]{4}: Class: ([0-9a-f]{2}) Subclass: ([0-9a-f]{2}) Interface: ([0-9a-f]+) Revision: ([0-9a-f]+)/){
+ $type = pci_class($1);
+ $type_id = "$1$2";
+ }
+ }
+ print Data::Dumper::Dumper \@devices if $test[4];
+ main::log_data('dump','pcidump @devices',\@devices) if $b_log;
+ eval $end if $b_log;
+}
+sub pci_grabber {
+ eval $start if $b_log;
+ my ($program) = @_;
+ my ($args,$pattern,@working);
+ if ($program eq 'lspci'){
+ $args = ' -knnv';
+ $pattern = '^[0-9a-f]+:';
+ }
+ elsif ($program eq 'pciconf'){
+ $args = ' -lv';
+ $pattern = '^([^@]+)\@pci';
+ }
+ elsif ($program eq 'pcidump'){
+ $args = ' -v';
+ $pattern = '^[0-9a-f]+:';
+ }
+ my $path = main::check_program($program);
+ @data = main::grabber("$path $args 2>/dev/null",'','strip');
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/pciconf/pci-freebsd-8.2-2";
+ #my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/pcidump/pci-openbsd-6.1-vm.txt";
+ #my $file = "$ENV{HOME}/bin/scripts/inxi/data/lspci/racermach-1-knnv.txt";
+ #my $file = "$ENV{HOME}/bin/scripts/inxi/data/lspci/rk016013-knnv.txt";
+ #@data = main::reader($file,'strip');
+ if (@data){
+ $b_pci_tool = 1 if scalar @data > 10;
+ foreach (@data){
+ if ($_ =~ /$pattern/i){
+ push @working, '~';
+ }
+ push @working, $_;
+ }
+ push @working, '~';
+ }
+ #print Data::Dumper::Dumper \@working;
+ eval $end if $b_log;
+ return @working;
+}
+
+sub soc_data {
+ eval $start if $b_log;
+ soc_devices_files();
+ soc_devices();
+ soc_devicetree();
+ print Data::Dumper::Dumper \@devices if $test[4];
+ main::log_data('dump','soc @devices',\@devices) if $b_log;
+ eval $end if $b_log;
+}
+# 1: /sys/devices/platform/soc/1c30000.ethernet/uevent:["DRIVER=dwmac-sun8i", "OF_NAME=ethernet",
+# "OF_FULLNAME=/soc/ethernet@1c30000", "OF_COMPATIBLE_0=allwinner,sun8i-h3-emac",
+# "OF_COMPATIBLE_N=1", "OF_ALIAS_0=ethernet0", # "MODALIAS=of:NethernetT<NULL>Callwinner,sun8i-h3-emac"]
+# 2: /sys/devices/platform/soc:audio/uevent:["DRIVER=bcm2835_audio", "OF_NAME=audio", "OF_FULLNAME=/soc/audio",
+# "OF_COMPATIBLE_0=brcm,bcm2835-audio", "OF_COMPATIBLE_N=1", "MODALIAS=of:NaudioT<NULL>Cbrcm,bcm2835-audio"]
+# 3: /sys/devices/platform/soc:fb/uevent:["DRIVER=bcm2708_fb", "OF_NAME=fb", "OF_FULLNAME=/soc/fb",
+# "OF_COMPATIBLE_0=brcm,bcm2708-fb", "OF_COMPATIBLE_N=1", "MODALIAS=of:NfbT<NULL>Cbrcm,bcm2708-fb"]
+# 4: /sys/devices/platform/soc/1c40000.gpu/uevent:["OF_NAME=gpu", "OF_FULLNAME=/soc/gpu@1c40000",
+# "OF_COMPATIBLE_0=allwinner,sun8i-h3-mali", "OF_COMPATIBLE_1=allwinner,sun7i-a20-mali",
+# "OF_COMPATIBLE_2=arm,mali-400", "OF_COMPATIBLE_N=3",
+# "MODALIAS=of:NgpuT<NULL>Callwinner,sun8i-h3-maliCallwinner,sun7i-a20-maliCarm,mali-400"]
+# 5: /sys/devices/platform/soc/soc:internal-regs/d0018180.gpio/uevent
+# 6: /sys/devices/soc.0/1180000001800.mdio/8001180000001800:05/uevent
+# ["DRIVER=AR8035", "OF_NAME=ethernet-phy"
+# 7: /sys/devices/soc.0/1c30000.eth/uevent
+# 8: /sys/devices/wlan.26/uevent [from pine64]
+# 9: /sys/devices/platform/audio/uevent:["DRIVER=bcm2835_AUD0", "OF_NAME=audio"
+# 10: /sys/devices/vio/71000002/uevent:["DRIVER=ibmveth", "OF_NAME=l-lan"
+# 11: /sys/devices/platform/soc:/soc:i2c-hdmi:/i2c-2/2-0050/uevent:['OF_NAME=hdmiddc'
+# 12: /sys/devices/platform/soc:/soc:i2c-hdmi:/uevent:['DRIVER=i2c-gpio', 'OF_NAME=i2c-hdmi'
+sub soc_devices_files {
+ eval $start if $b_log;
+ if (-d '/sys/devices/platform/'){
+ @files = main::globber('/sys/devices/platform/soc*/*/uevent');
+ @temp2 = main::globber('/sys/devices/platform/soc*/*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = main::globber('/sys/devices/platform/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ }
+ if (main::globber('/sys/devices/soc*')){
+ @temp2 = main::globber('/sys/devices/soc*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = main::globber('/sys/devices/soc*/*/*/uevent');
+ @files = (@files,@temp2) if @temp2;
+ }
+ @temp2 = main::globber('/sys/devices/*/uevent'); # see case 8
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = main::globber('/sys/devices/*/*/uevent'); # see case 10
+ @files = (@files,@temp2) if @temp2;
+ @temp2 = undef;
+ # not sure why, but even as root/sudo, /subsystem|driver/uevent are unreadable with -r test true
+ @files = grep {!/\/(subsystem|driver)\//} @files if @files;
+ @files = main::uniq(@files);
+ eval $end if $b_log;
+}
+sub soc_devices {
+ eval $start if $b_log;
+ my (@working);
+ foreach $file (@files){
+ next if -z $file;
+ $chip_id = $file;
+ # variants: /soc/20100000.ethernet/ /soc/soc:audio/ /soc:/ /soc@0/ /soc:/12cb0000.i2c:/
+ # mips: /sys/devices/soc.0/1180000001800.mdio/8001180000001800:07/
+ # ppc: /sys/devices/vio/71000002/
+ $chip_id =~ /\/sys\/devices\/(platform\/)?(soc[^\/]*\/)?([^\/]+\/)?([^\/]+\/)?([^\/\.:]+)([\.:])?([^\/:]+)?:?\/uevent$/;
+ $chip_id = $5;
+ $temp = $7;
+ @working = main::reader($file, 'strip') if -r $file;
+ foreach my $data (@working){
+ @temp2 = split /=/, $data;
+ if ($temp2[0] eq 'DRIVER'){
+ $driver = $temp2[1];
+ $driver =~ s/-/_/g if $driver; # kernel uses _, not - in module names
+ }
+ elsif ($temp2[0] eq 'OF_NAME'){
+ $type = $temp2[1];
+ }
+ # we'll use these paths to test in device tree pci completer
+ elsif ($temp2[0] eq 'OF_FULLNAME' && $temp2[1]){
+ # we don't want the short names like /soc, /led and so on
+ push @full_names, $temp2[1] if (() = $temp2[1] =~ /\//g) > 1;
+ $handle = (split /@/, $temp2[1])[-1] if $temp2[1] =~ /@/;
+ }
+ elsif ($temp2[0] eq 'OF_COMPATIBLE_0'){
+ @temp3 = split /,/, $temp2[1];
+ $device = $temp3[-1];
+ $vendor_id = $temp3[0];
+ }
+ }
+ # it's worthless, we can't use it
+ next if ! defined $type;
+ $type_id = $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);
+ assign_data('soc',@temp3);
+ }
+ eval $end if $b_log;
+}
+sub soc_devicetree {
+ eval $start if $b_log;
+ # now we want to fill in stuff that was not in /sys/devices/
+ if (-d '/sys/firmware/devicetree/base/soc'){
+ @files = main::globber('/sys/firmware/devicetree/base/soc/*/compatible');
+ my $test = (@full_names) ? join('|', sort @full_names) : 'xxxxxx';
+ foreach $file (@files){
+ if ( $file !~ m%$test%){
+ ($handle,$content,$device,$type,$type_id,$vendor_id) = ('','','','','','');
+ $content = (main::reader($file, 'strip'))[0] if -r $file;
+ $file =~ m%soc/([^@]+)@([^/]+)/compatible$%;
+ $type = $1;
+ next if !$type || !$content;
+ $handle = $2 if $2;
+ $type_id = $type;
+ if ($content){
+ @temp3 = split /,/, $content;
+ $vendor_id = $temp3[0];
+ $device = $temp3[-1];
+ # 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;
+ }
+ }
+ }
+ eval $end if $b_log;
+}
+sub assign_data {
+ my ($tool,@data) = @_;
+ if (check_graphics($data[0],$data[1])){
+ @devices_graphics = (@devices_graphics,[@data]);
+ $b_soc_gfx = 1 if $tool eq 'soc';
+ }
+ # for hdmi, we need gfx/audio both
+ if (check_audio($data[0],$data[1])){
+ @devices_audio = (@devices_audio,[@data]);
+ $b_soc_audio = 1 if $tool eq 'soc';
+ }
+ elsif (check_hwraid($data[0],$data[1])){
+ @devices_hwraid = (@devices_hwraid,[@data]);
+ $b_soc_net = 1 if $tool eq 'soc';
+ }
+ elsif (check_network($data[0],$data[1])){
+ @devices_network = (@devices_network,[@data]);
+ $b_soc_net = 1 if $tool eq 'soc';
+ }
+ elsif (check_timer($data[0],$data[1])){
+ @devices_timer = (@devices_timer,[@data]);
+ $b_soc_timer = 1;
+ }
+ # not used at this point, -M comes before ANG
+ # $device_vm = check_vm($data[4]) if ( (!$b_ppc && !$b_mips) && !$device_vm );
+ @devices = (@devices,[@data]);
+}
+# note: for soc, these have been converted in set_soc_type()
+sub check_audio {
+ if ( ( $_[1] && length($_[1]) == 4 && $_[1] =~/^04/ ) ||
+ ( $_[0] && $_[0] =~ /^(audio|hdmi|multimedia|sound)$/ )){
+ return 1;
+ }
+ else {return 0}
+}
+sub check_graphics {
+ if ( ( $_[1] && length($_[1]) == 4 && $_[1] =~/^03/ ) ||
+ ( $_[0] && $_[0] =~ /^(vga|display|hdmi|3d)$/)){
+ return 1;
+ }
+ else {return 0}
+}
+sub check_hwraid {
+ return 1 if ( $_[1] && $_[1] eq '0104' );
+}
+# NOTE: class 06 subclass 80
+# https://www-s.acm.illinois.edu/sigops/2007/roll_your_own/7.c.1.html
+sub check_network {
+ if ( ( $_[1] && length($_[1]) == 4 && ($_[1] =~/^02/ || $_[1] eq '0680' ) ) ||
+ ( $_[0] && $_[0] =~ /^(ethernet|network|wifi|wlan)$/ ) ){
+ return 1;
+ }
+ else {return 0}
+}
+sub check_timer {
+ return 1 if ( $_[0] && $_[0] eq 'timer' );
+}
+sub check_vm {
+ if ( $_[0] && $_[0] =~ /(innotek|vbox|virtualbox|vmware|qemu)/i ) {
+ return $1
+ }
+ else {return ''}
+}
+
+sub soc_type {
+ 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)$/){
+ $type = 'display';
+ }
+ # includes ethernet-phy, meson-eth
+ elsif ($type =~ /^(([^\s]+-)?eth|ethernet(-[^\s]+)?|lan|l-lan)$/){
+ $type = 'ethernet';
+ }
+ elsif ($type =~ /^(.*wlan.*|.*wifi.*)$/){
+ $type = 'wifi';
+ }
+ # needs to catch variants like hdmi-tx but not hdmi-connector
+ elsif ($type =~ /^(.*hdmi(-?tx)?)$/){
+ $type = 'hdmi';
+ }
+ elsif ($type =~ /^timer$/){
+ $type = 'timer';
+ }
+ return $type;
+}
+sub pci_class {
+ eval $start if $b_log;
+ my ($id) = @_;
+ $id = lc($id);
+ my %classes = (
+ '00' => 'unclassified',
+ '01' => 'mass-storage',
+ '02' => 'network',
+ '03' => 'display',
+ '04' => 'audio',
+ '05' => 'memory',
+ '06' => 'bridge',
+ '07' => 'communication',
+ '08' => 'peripheral',
+ '09' => 'input',
+ '0a' => 'docking',
+ '0b' => 'processor',
+ '0c' => 'serialbus',
+ '0d' => 'wireless',
+ '0e' => 'intelligent',
+ '0f' => 'satellite',
+ '10' => 'encryption',
+ '11' => 'signal-processing',
+ '12' => 'processing-accelerators',
+ '13' => 'non-essential-instrumentation',
+ '40' => 'coprocessor',
+ 'ff' => 'unassigned',
+ );
+ my $type = (defined $classes{$id}) ? $classes{$id}: 'unhandled';
+ eval $end if $b_log;
+ return $type;
+}
+}
+
sub set_dmesg_boot_data {
eval $start if $b_log;
my ($file,@temp);
@@ -17228,16 +18046,16 @@ sub set_dmesg_boot_data {
if ($b_dm_boot_disk && @dmesg_boot){
@dm_boot_disk = grep {/^(ad|ada|da|mmcblk|mmcsd|nvme[0-9]+n|sd|wd)[0-9]+(:|\sat\s)/} @dmesg_boot;
log_data('dump','@dm_boot_disk',\@dm_boot_disk) if $b_log;
- print Dumper \@dm_boot_disk if $test[9];
+ print Dumper \@dm_boot_disk if $test[11];
}
if ($b_dm_boot_optical && @dmesg_boot){
@dm_boot_optical = grep {/^(cd)[0-9]+(\([^)]+\))?(:|\sat\s)/} @dmesg_boot;
log_data('dump','@dm_boot_optical',\@dm_boot_optical) if $b_log;
- print Dumper \@dm_boot_optical if $test[9];
+ print Dumper \@dm_boot_optical if $test[11];
}
}
log_data('dump','@dmesg_boot',\@dmesg_boot) if $b_log;
- #print Dumper \@dmesg_boot if $test[9];
+ #print Dumper \@dmesg_boot if $test[11];
eval $end if $b_log;
}
@@ -17487,321 +18305,22 @@ sub set_ifconfig {
eval $end if $b_log;
}
-sub set_pci_data {
- eval $start if $b_log;
- $_[0] = 1; # check boolean passed by reference
- if ( $b_pci ){
- if (!$bsd_type){
- if ($alerts{'lspci'}{'action'} eq 'use' ){
- set_lspci_data();
- }
- # ! -d '/proc/bus/pci'
- # this is sketchy, a sbc won't have pci, but a non sbc arm may have it, so
- # build up both and see what happens
- if ($b_arm || $b_mips || $b_ppc || $b_sparc){
- set_soc_data();
- }
- }
- else {
- #if (1 == 1){
- if ($alerts{'pciconf'}{'action'} eq 'use'){
- set_pciconf_data();
- }
- }
- }
- eval $end if $b_log;
-}
-
-# 0 type
-# 1 type_id
-# 2 bus_id
-# 3 sub_id
-# 4 device
-# 5 vendor_id
-# 6 chip_id
-# 7 rev
-# 8 port
-# 9 driver
-# 10 modules
-# 11 driver_nu [bsd, like: em0 - driver em; nu 0. Used to match IF in -n
-# 12 subsystem/vendor
-# 13 subsystem vendor:chip id
-sub set_lspci_data {
- eval $start if $b_log;
- my ($busid,$busid_nu,$content,$port,$driver,$modules,$device,$vendor_id,$chip_id,$rev,
- $subsystem,$subsystem_id,$type,$type_id,@pcis,@temp,@working);
- # my @pcis = grabber('lspci -nnv','\n','strip');
- my $path = check_program('lspci');
- $content = qx($path -nnv 2>/dev/null) if $path;
- @pcis = split /\n/, $content if $content;
- #my $file = "$ENV{HOME}/bin/scripts/inxi/data/lspci/racermach-1-knnv.txt";
- #my $file = "$ENV{HOME}/bin/scripts/inxi/data/lspci/rk016013-knnv.txt";
- #@pcis = reader($file);
- #print scalar @pcis;
- @pcis = map {$_ =~ s/^\s+//; $_} @pcis if @pcis;
- $b_pci_tool = 1 if @pcis && scalar @pcis > 10;
- foreach (@pcis){
- #print "$_\n";
- if ($device){
- if ($_ =~ /^\s*$/) {
- @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
- $rev,$port,$driver,$modules,$subsystem,$subsystem_id);
- @pci = (@pci,[@temp]);
- $device = '';
- #print "$busid $device_id r:$rev p: $port\n$type\n$device\n";
- }
- elsif ($_ =~ /^Subsystem.*\[([a-f0-9]{4}:[a-f0-9]{4})\]/){
- $subsystem_id = $1;
- $subsystem = (split /^Subsystem:\s*/,$_)[1];
- $subsystem =~ s/(\s?\[[^\]]+\])+$//g;
- $subsystem = cleaner($subsystem);
- $subsystem = pci_cleaner($subsystem,'pci');
- $subsystem = pci_cleaner_subsystem($subsystem);
- #print "ss:$subsystem\n";
- }
- elsif ($_ =~ /^I\/O\sports/){
- $port = (split /\s+/,$_)[3];
- #print "p:$port\n";
- }
- elsif ($_ =~ /^Kernel\sdriver\sin\suse/){
- $driver = (split /:\s*/,$_)[1];
- }
- elsif ($_ =~ /^Kernel\smodules/i){
- $modules = (split /:\s*/,$_)[1];
- }
- }
- # note: arm servers can have more complicated patterns
- # 0002:01:02.0 Ethernet controller [0200]: Cavium, Inc. THUNDERX Network Interface Controller virtual function [177d:a034] (rev 08)
- elsif ($_ =~ /^(([0-9a-f]{2,4}:)?[0-9a-f]{2}:[0-9a-f]{2})[.:]([0-9a-f]+)\s(.*)\s\[([0-9a-f]{4}):([0-9a-f]{4})\](\s\(rev\s([^\)]+)\))?/){
- $busid = $1;
- $busid_nu = hex($3);
- @working = split /:\s+/, $4;
- $device = $working[1];
- $type = $working[0];
- $vendor_id = $5;
- $chip_id = $6;
- $rev = ($8)? $8 : '';
- $device = cleaner($device);
- $working[0] =~ /\[([^\]]+)\]$/;
- $type_id = $1;
- $b_hardware_raid = 1 if $type_id eq '0104';
- $type = lc($type);
- $type = pci_cleaner($type,'pci');
- $type =~ s/\s+$//;
- $port = '';
- $driver = '';
- $modules = '';
- $subsystem = '';
- $subsystem_id = '';
- }
- }
- if ($device && $busid){
- @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
- $rev,$port,$driver,$modules,$subsystem,$subsystem_id);
- @pci = (@pci,[@temp]);
- $device = '';
- }
- print Dumper \@pci if $test[4];
- main::log_data('dump','@pci',\@pci) if $b_log;
- eval $end if $b_log;
-}
-
-# em0@pci0:6:0:0: class=0x020000 card=0x10d315d9 chip=0x10d38086 rev=0x00 hdr=0x00
-# vendor = 'Intel Corporation'
-# device = 'Intel 82574L Gigabit Ethernet Controller (82574L)'
-# class = network
-# subclass = ethernet
-sub set_pciconf_data {
- eval $start if $b_log;
- my ($busid,$busid_nu,$content,$port,$driver,$driver_nu,$modules,$device,$vendor,
- $vendor_id,$chip_id,$rev,$type,$type_id,@data,@temp,@working);
-# my $file = "$ENV{'HOME'}/bin/scripts/inxi/data/pciconf/pci-freebsd-8.2-2";
-# open my $fh, '<', $file or die "can't open $file: $!";
-# chomp(@data = <$fh>);
- my $path = check_program('pciconf');
- $content = qx($path -lv 2>/dev/null) if $path;
- @data = split /\n/, $content if $content;
- $b_pci_tool = 1 if @data && scalar @data > 10;
- foreach (@data){
- if ($_ =~ /^[^@]+\@pci/){
- push @working, '';
- }
- $_ =~ s/^\s+//;
- push @working, $_;
- }
- foreach (@working){
- if ($driver){
- if ($_ =~ /^\s*$/) {
- $vendor = cleaner($vendor);
- $device = cleaner($device);
- if ($vendor && $device){
- if ($vendor !~ /$device/i){
- $device = "$vendor $device";
- }
- }
- elsif (!$device){
- $device = $vendor;
- }
- @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,
- $rev,$port,$driver,$modules,$driver_nu);
- @pci = (@pci,[@temp]);
- $driver = '';
- #print "$busid $device_id r:$rev p: $port\n$type\n$device\n";
- }
- elsif ($_ =~ /^vendor/){
- $vendor = (split /\s+=\s+/,$_)[1];
- #print "p:$port\n";
- }
- elsif ($_ =~ /^device/){
- $device = (split /\s+=\s+/,$_)[1];
- }
- elsif ($_ =~ /^class/i){
- $type = (split /\s+=\s+/,$_)[1];
- }
- }
- elsif (/^([^@]+)\@pci([0-9]{1,3}:[0-9]{1,3}:[0-9]{1,3}):([0-9]{1,3}).*class=([^\s]+)\scard=([^\s]+)\schip=([^\s]+)\srev=([^\s]+)/){
- $driver = $1;
- $busid = $2;
- $busid_nu = $3;
- $type_id = $4;
- #$vendor_id = $5;
- $vendor_id = substr($6,6,4);
- $chip_id = substr($6,2,4);
- $rev = $7;
- $vendor = '';
- $device = '';
- $type = '';
- $driver =~ /(^[a-z]+)([0-9]+$)/;
- $driver = $1;
- $driver_nu = $2;
- }
- }
- if ($driver && $busid){
- $vendor = cleaner($vendor);
- $device = cleaner($device);
- $device = ( $vendor && $device !~ /$vendor/) ? "$vendor $device" : $device;
- @temp = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,$rev,$port,$driver,$modules,$driver_nu);
- @pci = (@pci,[@temp]);
- $device = '';
- }
- print Dumper \@pci if $test[4];
- main::log_data('dump','@pci',\@pci) if $b_log;
- eval $end if $b_log;
-}
-
-## 1
-# /soc/1c30000.ethernet/uevent:["DRIVER=dwmac-sun8i", "OF_NAME=ethernet",
-# "OF_FULLNAME=/soc/ethernet@1c30000", "OF_COMPATIBLE_0=allwinner,sun8i-h3-emac",
-# "OF_COMPATIBLE_N=1", "OF_ALIAS_0=ethernet0", # "MODALIAS=of:NethernetT<NULL>Callwinner,sun8i-h3-emac"]
-## 2
-# /soc:audio/uevent:["DRIVER=bcm2835_audio", "OF_NAME=audio", "OF_FULLNAME=/soc/audio",
-# "OF_COMPATIBLE_0=brcm,bcm2835-audio", "OF_COMPATIBLE_N=1", "MODALIAS=of:NaudioT<NULL>Cbrcm,bcm2835-audio"]
-## 3
-# /soc:fb/uevent:["DRIVER=bcm2708_fb", "OF_NAME=fb", "OF_FULLNAME=/soc/fb",
-# "OF_COMPATIBLE_0=brcm,bcm2708-fb", "OF_COMPATIBLE_N=1", "MODALIAS=of:NfbT<NULL>Cbrcm,bcm2708-fb"]
-## 4
-# /soc/1c40000.gpu/uevent:["OF_NAME=gpu", "OF_FULLNAME=/soc/gpu@1c40000",
-# "OF_COMPATIBLE_0=allwinner,sun8i-h3-mali", "OF_COMPATIBLE_1=allwinner,sun7i-a20-mali",
-# "OF_COMPATIBLE_2=arm,mali-400", "OF_COMPATIBLE_N=3",
-# "MODALIAS=of:NgpuT<NULL>Callwinner,sun8i-h3-maliCallwinner,sun7i-a20-maliCarm,mali-400"]
-## 5
-# /sys/devices/platform/soc/soc:internal-regs/d0018180.gpio/uevent
-## 6
-# /sys/devices/soc.0/1180000001800.mdio/8001180000001800:05/uevent
-# ["DRIVER=AR8035", "OF_NAME=ethernet-phy"
-## 7
-# /sys/devices/soc.0/1c30000.eth/uevent
-## 8
-# /sys/devices/wlan.26/uevent [from pine64]
-## 9
-# sys/devices/platform/audio/uevent:["DRIVER=bcm2835_AUD0", "OF_NAME=audio"
-## 10
-# /sys/devices/vio/71000002/uevent:["DRIVER=ibmveth", "OF_NAME=l-lan"
-sub set_soc_data {
- eval $start if $b_log;
- my ($content,@files,@temp2,@temp3,@working);
- if (-d '/sys/devices/platform/'){
- @files = globber('/sys/devices/platform/soc*/*/uevent');
- @temp2 = globber('/sys/devices/platform/soc*/*/*/uevent');
- @files = (@files,@temp2) if @temp2;
- @temp2 = globber('/sys/devices/platform/*/uevent');
- @files = (@files,@temp2) if @temp2;
- }
- if (globber('/sys/devices/soc*')){
- @temp2 = globber('/sys/devices/soc*/*/uevent');
- @files = (@files,@temp2) if @temp2;
- @temp2 = globber('/sys/devices/soc*/*/*/uevent');
- @files = (@files,@temp2) if @temp2;
- }
- @temp2 = globber('/sys/devices/*/uevent'); # see case 8
- @files = (@files,@temp2) if @temp2;
- @temp2 = globber('/sys/devices/*/*/uevent'); # see case 10
- @files = (@files,@temp2) if @temp2;
- @temp2 = undef;
- # not sure why, but even as root/sudo, /subsystem|driver/uevent are unreadable with -r test true
- @files = grep {!/\/(subsystem|driver)\//} @files if @files;
- @files = uniq(@files);
- foreach my $file (@files){
- next if -z $file;
- my ($busid,$busid_nu,$chip_id,$device,$driver,$modules,$port,$rev,
- $temp,$type,$type_id,$vendor_id,@working);
- $chip_id = $file;
- # variants: /soc/20100000.ethernet /soc/soc:audio /soc:/ /soc@0/
- # mips: /sys/devices/soc.0/1180000001800.mdio/8001180000001800:07/
- # ppc: /sys/devices/vio/71000002/
- $chip_id =~ /\/sys\/devices\/(platform\/)?(soc[^\/]*\/)?([^\/]+\/)?([^\/]+\/)?([^\/\.:]+)([\.:])?([^\/]+)?\/uevent$/;
- $chip_id = $5;
- $temp = $7;
- @working = reader($file, 'strip') if -r $file;
- foreach my $data (@working){
- @temp2 = split /=/, $data;
- if ($temp2[0] eq 'DRIVER'){
- $driver = $temp2[1];
- $driver =~ s/-/_/g if $driver; # kernel uses _, not - in module names
- }
- elsif ($temp2[0] eq 'OF_NAME'){
- $type = $temp2[1];
- }
- elsif ($temp2[0] eq 'OF_COMPATIBLE_0'){
- @temp3 = split /,/, $temp2[1];
- $device = $temp3[-1];
- $vendor_id = $temp3[0];
- }
- }
- # it's worthless, we can't use it
- next if ! defined $type;
- $chip_id = '' if ! defined $chip_id;
- $vendor_id = '' if ! defined $vendor_id;
- $driver = '' if ! defined $driver;
- $busid = (defined $temp && is_int($temp)) ? $temp: 0;
- $busid_nu = 0;
- $type_id = '';
- $port = '';
- $rev = '';
- $modules = '';
- # note: use these for main Card match for -AGN
- $b_soc_audio = 1 if $type =~ /^(audio|daudio|hdmi|hdmi-audio|multimedia)$/;
- $b_soc_gfx = 1 if $type =~ /^(vga|disp|display|display-port-controller|3d|fb|gpu|hdmi|mali)$/;
- $b_soc_net = 1 if $type =~ /^(eth|ethernet|ethernet-phy|lan|l-lan|network|wifi|wlan)$/;
- @temp3 = ($type,$type_id,$busid,$busid_nu,$device,$vendor_id,$chip_id,$rev,$port,$driver,$modules);
- @pci = (@pci,[@temp3]);
- }
- print Dumper \@pci if $test[4];
- main::log_data('dump','@pci',\@pci) if $b_log;
- eval $end if $b_log;
-}
sub set_ps_aux {
eval $start if $b_log;
- @ps_aux = grabber("ps aux",'','strip');
- my $header = shift @ps_aux; # get rid of header row
- # handle busy box, which has 3 columns, regular ps aux has 11
- # avoid deprecated implicit split error in older Perls
- my @temp = split(/\s+/, $header);
+ my ($header,@temp);
+ @ps_aux = grabber("ps aux 2>/dev/null",'','strip');
+ if (@ps_aux){
+ $header = shift @ps_aux; # get rid of header row
+ # handle busy box, which has 3 columns, regular ps aux has 11
+ # avoid deprecated implicit split error in older Perls
+ @temp = split(/\s+/, $header);
+ }
$ps_cols = $#temp;
if ($ps_cols < 10){
my $version = qx(ps --version 2>&1);
$b_bb_ps = 1 if $version =~/busybox/i;
}
+ return if !@ps_aux; # note: mips/openwrt ps has no 'a'
$_=lc for @ps_aux; # this is a super fast way to set to lower
# note: regular perl /.../inxi but sudo /.../inxi is added for sudo start
# for pinxi, we want to see the useage data for cpu/ram
@@ -17833,8 +18352,8 @@ sub set_ps_gui {
@temp=qw(3dwm 9wm afterstep amiwm awesome blackbox bspwm
dwm fluxbox flwm flwm_topside fvwm.*-crystal fvwm2 fvwm i3 ion jwm lwm
matchbox-window-manager mwm nawm openbox notion orbital pekwm perceptia
- qtile ratpoison sawfish scrotwm spectrwm tvtwm twm
- windowlab WindowMaker wm2 wmii2 wmii wmx xmonad);
+ qtile ratpoison sawfish scrotwm spectrwm sway tvtwm twm
+ waycooler way-cooler windowlab WindowMaker wm2 wmii2 wmii wmx xmonad);
@match = (@match,@temp);
}
# wm:
@@ -17853,8 +18372,9 @@ sub set_ps_gui {
kdocker kicker latte latte-dock lemonbar ltpanel lxpanel lxqt-panel
matchbox-panel mate-panel ourico
perlpanel plank plasma-desktop plasma-netbook polybar pypanel
- razor-panel razorqt-panel stalonetray taskbar tint2 trayer vala-panel
- wbar wharf wingpanel witray xfce4-panel xfce5-panel xmobar yabar);
+ razor-panel razorqt-panel stalonetray swaybar taskbar tint2 trayer
+ vala-panel wbar wharf wingpanel witray xfce4-panel xfce5-panel xmobar
+ yabar);
@match = (@match,@temp);
}
# compositors (for wayland these are also the server, note
@@ -17862,8 +18382,9 @@ sub set_ps_gui {
@temp=qw(3dwm asc budgie-wm compiz compton deepin-wm dwc dcompmgr
enlightenment fireplace gnome-shell grefson kmscon kwin_wayland kwin_x11
liri marco metisse mir moblin motorcar muffin mutter
- orbital papyros perceptia rustland sommelier sway swc unagi
- wavy way-cooler wayhouse westford weston xcompmgr);
+ orbital papyros perceptia rustland sommelier sway swc
+ unagi unity-system-compositor
+ wavy waycooler way-cooler wayhouse westford weston xcompmgr);
@match = (@match,@temp);
}
@match = uniq(@match);
@@ -17940,36 +18461,36 @@ sub set_sysctl_data {
# 14 - type string
# 15 - driver
# 16 - serial
-# 17 - configuration
-sub set_usb_data {
+# 17 - speed
+# 18 - configuration - not used
+## USBData
+{
+package USBData;
+my (@working);
+my ($b_hub,$addr_id,$bus_id,$bus_id_alpha,$chip_id,$class_id,
+$device_id,$driver,$ids,$interfaces,$name,$path,$path_id,$product,
+$protocol_id,$serial,$speed,$subclass_id,$type,$version,$vendor,$vendor_id,);
+my $b_live = 1; # debugger file data
+sub set {
eval $start if $b_log;
$b_usb_check = 1;
# if user config sets USB_SYS you can override with --usb-tool
if ((!$b_usb_sys || $b_usb_tool) && $alerts{'lsusb'}{'action'} eq 'use' ){
- set_lsusb_data();
+ lsusb_data();
}
elsif (-d '/sys/bus/usb/devices'){
- UsbSysData::set('main');
+ sys_data('main');
}
elsif ( $alerts{'usbdevs'}{'action'} eq 'use'){
- set_usbdevs_data();
+ usbdevs_data();
}
eval $end if $b_log;
}
-sub set_lsusb_data {
+sub lsusb_data {
eval $start if $b_log;
- my (@data,@temp,@working);
- my ($addr_id,$bus_id,$chip_id,$name,$path_id);
- my $b_live = 1;
- if ($b_live){
- my $path = check_program('lsusb');
- @data = grabber("$path 2>/dev/null") if $path;
- }
- else {
- open my $fh, '<', "$ENV{'HOME'}/bin/scripts/inxi/data/lsusb/mdmarmer-lsusb.txt" or die $!;
- chomp(@data = <$fh>);
- }
+ my (@temp);
+ my @data = data_grabber('lsusb');
foreach (@data){
next if /^\s*$|^Couldn't/; # expensive second call: || /UNAVAIL/
@working = split /\s+/, $_;
@@ -17999,13 +18520,14 @@ sub set_lsusb_data {
$working[14] = '';
$working[15] = '';
$working[16] = '';
- @
- usb = (@usb,[@working]);
+ $working[17] = '';
+ $working[18] = '';
+ @usb = (@usb,[@working]);
#print join ("\n",@working),"\n\n=====\n";
}
- print Dumper \@usb if $test[6];
- UsbSysData::set('lsusb') if @usb;
- print Dumper \@usb if $test[6];
+ print Data::Dumper::Dumper \@usb if $test[6];
+ sys_data('lsusb') if @usb;
+ print Data::Dumper::Dumper \@usb if $test[6];
main::log_data('dump','@usb: plain',\@usb) if $b_log;
eval $end if $b_log;
}
@@ -18014,19 +18536,11 @@ sub set_lsusb_data {
# addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x8086), rev 1.00
# port 1 addr 2: full speed, power 98 mA, config 1, USB Receiver(0xc52b), Logitech(0x046d), rev 12.01
# port 2 powered
-sub set_usbdevs_data {
+sub usbdevs_data {
eval $start if $b_log;
- my (@data,@working,$addr_id,$class,$bus_id,$chip_id,$hub_id,
- $path_id,$port,$port_value,$name,$speed);
+ my ($class,$hub_id,$port,$port_value);
my ($ports,$j,$k) = (0,0,0);
- if (!$b_fake_usbdevs){
- my $program = check_program('usbdevs');
- @data = grabber("$program -v 2>/dev/null");
- }
- else {
- open my $fh, '<', "$ENV{'HOME'}/bin/scripts/inxi/data/lsusb/bsd-usbdevs-v-1.txt" or die $!;
- chomp(@data = <$fh>);
- }
+ my @data = data_grabber('usbdevs');
foreach (@data){
if (/^Controller\s\/dev\/usb([0-9]+)/){
# $j = scalar @usb;
@@ -18061,6 +18575,8 @@ sub set_usbdevs_data {
$working[14] = 'Hub';
$working[15] = '';
$working[16] = '';
+ $working[17] = '';
+ $working[18] = '';
$usb[$j] = ([@working],);
@working = ();
}
@@ -18091,6 +18607,8 @@ sub set_usbdevs_data {
$working[14] = '';
$working[15] = '';
$working[16] = '';
+ $working[17] = '';
+ $working[18] = '';
$usb[$j] = ([@working],);
${$usb[$k]}[10] = $ports;
@working = ();
@@ -18107,22 +18625,39 @@ sub set_usbdevs_data {
);
}
main::log_data('dump','@usb: usbdevs',\@usb) if $b_log;
- print Dumper \@usb if $test[6];
+ print Data::Dumper::Dumper \@usb if $test[6];
eval $end if $b_log;
}
-## UsbSysData
-{
-package UsbSysData;
-
-my ($b_hub,$class_id,$protocol_id,$source,$subclass_id,$type);
+sub data_grabber {
+ eval $start if $b_log;
+ my ($program) = @_;
+ my %args = ('lsusb' => '', 'usbdevs' => '-v');
+ my (@data);
+ if ($b_live && !$b_fake_usbdevs){
+ my $path = main::check_program($program);
+ @data = main::grabber("$path $args{$program} 2>/dev/null") if $path;
+ }
+ else {
+ my $file;
+ if ($b_fake_usbdevs){
+ $file = "$ENV{'HOME'}/bin/scripts/inxi/data/lsusb/bsd-usbdevs-v-1.txt";
+ }
+ else {
+ $file = "$ENV{'HOME'}/bin/scripts/inxi/data/lsusb/mdmarmer-lsusb.txt";
+ }
+ @data = main::reader($file);
+ }
+ #print Data::Dumper::Dumper \@data;
+ eval $end if $b_log;
+ return @data;
+}
-sub set {
+sub sys_data {
eval $start if $b_log;
- ($source) = @_;
- my (@drivers,@uevent,@usb_sys,@working);
- my ($bus_id,$bus_id_alpha,$chip_id,$configuration,$device_id,$driver,$ids,$interfaces,
- $name,$path,$path_id,$ports,$product,$serial,$usb_version,$vendor,$vendor_id,);
+ my ($source) = @_;
+ my ($configuration,$ports,$usb_version);
+ my (@drivers,@uevent);
my $i = 0;
my @files = main::globber('/sys/bus/usb/devices/*');
# we want to get rid of the hubs with x-0: syntax, those are hubs found in /usbx
@@ -18134,8 +18669,8 @@ sub set {
if ( $ids){
@drivers = ();
($b_hub,$class_id,$protocol_id,$subclass_id) = (0,0,0,0);
- ($driver,$interfaces,$name,$ports,$product,$serial,$type,
- $usb_version,$vendor) = ('','','','','','','','','');
+ ($configuration,$driver,$interfaces,$name,$ports,$product,$serial,$speed,
+ $type,$usb_version,$vendor) = ('','','','','','','','','','','');
#print Cwd::abs_path($_),"\n";
#print "f1: $_\n";
$path_id = $_;
@@ -18157,6 +18692,8 @@ sub set {
$interfaces = sys_item("$_/bNumInterfaces");
$serial = sys_item("$_/serial");
$usb_version = sys_item("$_/version");
+ $speed = sys_item("$_/speed");
+ $configuration = sys_item("$_/configuration");
if ($source eq 'lsusb'){
for ($i = 0; $i < scalar @usb; $i++){
if (${$usb[$i]}[0] eq $bus_id && ${$usb[$i]}[1] == $device_id){
@@ -18176,6 +18713,8 @@ sub set {
${$usb[$i]}[14] = $type if ($type && !$b_hub);
${$usb[$i]}[15] = $driver if $driver;
${$usb[$i]}[16] = $serial if $serial;
+ ${$usb[$i]}[17] = $speed if $speed;
+ ${$usb[$i]}[18] = $configuration;
#print join("\n",@{$usb[$i]}),"\n\n";# if !$b_hub;
last;
}
@@ -18186,7 +18725,6 @@ sub set {
$vendor_id = sys_item("$_/idVendor");
# we don't want the device, it's probably a bad path in /sys/bus/usb/devices
next if !$vendor_id && !$chip_id;
- $configuration = sys_item("$_/configuration");
$product = sys_item("$_/product");
$product = main::cleaner($product) if $product;
$vendor = sys_item("$_/manufacturer");
@@ -18227,7 +18765,8 @@ sub set {
${$usb[$i]}[14] = $type;
${$usb[$i]}[15] = $driver;
${$usb[$i]}[16] = $serial;
- ${$usb[$i]}[17] = $configuration;
+ ${$usb[$i]}[17] = $speed;
+ ${$usb[$i]}[18] = $configuration;
$i++;
}
#print "$path_id ids: $bus_id:$device_id driver: $driver ports: $ports\n==========\n"; # if $test[6];;
@@ -18241,7 +18780,7 @@ sub set {
# get driver, interface [type:] data
sub uevent_data {
my ($path) = @_;
- my ($driver,$interface,$temp,@interfaces,@drivers,@working);
+ my ($interface,$interfaces,$temp,@interfaces,@drivers);
my @files = main::globber($path);
@files = grep {!/\/(subsystem|driver|ep_[^\/]+)\/uevent$/} @files if @files;
foreach (@files){
@@ -18289,7 +18828,7 @@ sub uevent_data {
}
sub sys_item {
my ($path) = @_;
- my ($item,@working);
+ my ($item);
$item = (main::reader($path))[0] if -r $path;
$item = '' if ! defined $item;
$item = main::trimmer($item) if $item;
@@ -18424,7 +18963,7 @@ sub generate_lines {
assign_data(%row);
}
if ( $show{'cpu'} || $show{'cpu-basic'} ){
- set_pci_data($b_pci_check) if $b_arm && !$b_pci_check;
+ DeviceData::set($b_pci_check) if $b_arm && !$b_pci_check;
set_dmi_data($b_dmi_check) if $b_dmi && !$b_dmi_check;
set_dmesg_boot_data() if ($bsd_type && !$b_dmesg_boot_check);
my $arg = ($show{'cpu-basic'}) ? 'basic' : 'full' ;
@@ -18432,19 +18971,18 @@ sub generate_lines {
assign_data(%row);
}
if ( $show{'graphic'} ){
- set_pci_data($b_pci_check) if !$b_pci_check;
+ DeviceData::set($b_pci_check) if !$b_pci_check;
%row = line_handler('Graphics','graphic');
assign_data(%row);
}
if ( $show{'audio'} ){
- set_pci_data($b_pci_check) if !$b_pci_check;
- $b_pci_check = 1;
+ DeviceData::set($b_pci_check) if !$b_pci_check;
%row = line_handler('Audio','audio');
assign_data(%row);
}
if ( $show{'network'} ){
- set_usb_data() if !$b_usb_check;
- set_pci_data($b_pci_check) if !$b_pci_check;
+ USBData::set() if !$b_usb_check;
+ DeviceData::set($b_pci_check) if !$b_pci_check;
set_ip_data() if ($show{'ip'} || ($bsd_type && $show{'network-advanced'}));
%row = line_handler('Network','network');
assign_data(%row);
@@ -18455,7 +18993,7 @@ sub generate_lines {
assign_data(%row);
}
if ( $show{'raid'} ){
- set_pci_data() if !$b_pci_check;
+ DeviceData::set() if !$b_pci_check;
%row = line_handler('RAID','raid');
assign_data(%row);
}
@@ -18468,7 +19006,7 @@ sub generate_lines {
assign_data(%row);
}
if ( $show{'usb'} ){
- set_usb_data() if !$b_usb_check;
+ USBData::set() if !$b_usb_check;
%row = line_handler('USB','usb');
assign_data(%row);
}
@@ -18636,7 +19174,7 @@ sub generate_info_data {
my $gcc_alt = '';
my $running_in = '';
my $data_name = main::key($prefix++,'Info');
- my ($b_gcc,%row,$gcc,$index,$ref);
+ my ($b_gcc,$gcc,$index,$ref,%row);
my ($gpu_ram,$parent,$percent,$total,$used) = (0,'','','','');
my $client_shell = ($b_irc) ? 'Client' : 'Shell';
my $client = $client{'name-print'};
@@ -18668,30 +19206,32 @@ sub generate_info_data {
$running_in .= ' (SSH)';
}
}
- my $memory = get_memory_data('splits');
- if ($memory){
- my @temp = split /:/, $memory;
- my @temp2 = get_size($temp[0]);
- $gpu_ram = $temp[3] if $temp[3];
- $total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
- @temp2 = get_size($temp[1]);
- $used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
- $used .= " ($temp[2]%)" if $temp[2];
- if ($gpu_ram){
- @temp2 = get_size($gpu_ram);
- $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
- }
- }
- $memory ||= 'N/A';
my %data = (
$data_name => [{
main::key($num++,'Processes') => scalar @ps_aux,
main::key($num++,'Uptime') => &get_uptime(),
- main::key($num++,'Memory') => $total,
+
},],
);
$index = scalar(@{ $data{$data_name} } ) - 1;
- $data{$data_name}[$index]{main::key($num++,'used')} = $used;
+ if (!$b_mem){
+ my $memory = get_memory_data('splits');
+ if ($memory){
+ my @temp = split /:/, $memory;
+ my @temp2 = get_size($temp[0]);
+ $gpu_ram = $temp[3] if $temp[3];
+ $total = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
+ @temp2 = get_size($temp[1]);
+ $used = ($temp2[1]) ? $temp2[0] . ' ' . $temp2[1] : $temp2[0];
+ $used .= " ($temp[2]%)" if $temp[2];
+ if ($gpu_ram){
+ @temp2 = get_size($gpu_ram);
+ $gpu_ram = $temp2[0] . ' ' . $temp2[1] if $temp2[1];
+ }
+ }
+ $data{$data_name}[$index]{main::key($num++,'Memory')} = $total;
+ $data{$data_name}[$index]{main::key($num++,'used')} = $used;
+ }
if ($gpu_ram){
$data{$data_name}[$index]{main::key($num++,'gpu')} = $gpu_ram;
}
diff --git a/inxi.1 b/inxi.1
index 5638295..b65f482 100644
--- a/inxi.1
+++ b/inxi.1
@@ -1,4 +1,4 @@
-.TH INXI 1 "2018\-09\-10" 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
@@ -306,6 +306,8 @@ APT distros like PCLinuxOS or Alt-Linux)
\fBURPMQ\fR (Mandriva, Mageia + derived versions)
+\fBXBPS\fR (Void)
+
\fBYUM/ZYPP\fR (Fedora, Red Hat, Suse + derived versions)
More will be added as distro data is collected. If yours is missing please
@@ -380,7 +382,10 @@ or sequence connection, but can be used to match this output to lsusb
values, which generally shows BusID / DeviceID (except for tree view, which
shows ports).
-Examples: \fRDevice-3: 4-3.2.1:2\fR or \fRHub: 4-0:1\fR
+Examples: \fBDevice-3: 4-3.2.1:2\fR or \fBHub: 4-0:1\fR
+
+The \fBrev: 2.0\fR item refers to the USB revision number, like \fB1.0\fR or
+\fB3.1\fR.
.TP
.B \-u\fR,\fB \-\-uuid\fR
@@ -786,6 +791,9 @@ data available.
\- Adds device serial number.
.TP
.B \-xxx \-N\fR
+\- Adds (if available and/or relevant) \fBvendor:\fR item, which shows
+specific vendor [product] information.
+
\- Adds, if present, serial number.
.TP
.B \-xxx \-R\fR
@@ -809,6 +817,8 @@ lxpanel, xfce4\-panel, lxqt\-panel, tint2, cairo-dock, trayer, and many others.
\- Adds, if present, serial number for non hub devices.
\- Adds \fBinterfaces:\fR for non hub devices.
+
+\- Adds, if available, USB speed in \fBMbits/s\fR or \fBGbits/s\fR.
.TP
.B \-xxx \-w\fR,\fB \-W\fR
\- Adds location (city state country), altitude, weather observation time.
@@ -829,6 +839,31 @@ Format is \fBhexadecimal (decimal)\fR if greater than 9, otherwise \fBhexadecima
\fBType: ... (status|mitigation): ....\fR for systems that support this feature
(Linux kernel 4.14 or newer, or patched older kernels).
+.TP
+.B \-a \-d\fR
+\- Adds logical and physical block size in bytes.
+
+.TP
+.B \-a \-p\fR,\fB\-a \-P\fR
+\- Adds raw partition size, including file system overhead, partition table, e.g.
+
+\fBraw size: 60.00 GiB\fR.
+
+\- Adds percent of raw size available to \fBsize:\fR item, e.g.
+
+\fBsize: 58.81 GiB (98.01%)\fR.
+
+Note that \fBused: 16.44 GiB (34.3%)\fR percent refers to the available size,
+not the raw size.
+
+\- Adds partition filesystem block size if found (requires root and blockdev).
+
+\- For swap, adds swappiness and vfs cache pressure, and a message to indicate
+if it is the default value or not (Linux only, and only if available). If not,
+shows default value as well, e.g.
+
+\fBswappiness: 60 (default) cache pressure: 90 (default 100)\fR.
+
.SH ADVANCED OPTIONS
.TP
@@ -938,6 +973,30 @@ The \fBprint\fR options prints to stdout.
Required for non\-screen \fB\-\-output\fR formats (json|xml).
.TP
+.B \-\-partition\-sort [dev\-base|fs|id|label|percent\-used|size|uuid|used]\fR
+Change default sort order of partition output. Corresponds to \fBPARTITION_SORT\fR
+configuration item. These are the available sort options:
+
+\fBdev\-base\fR - \fB/dev\fR partition identifier, like \fB/dev/sda1\fR.
+Note that it's an alphabetic sort, so \fBsda12\fR is before \fBsda2\fR.
+
+\fBfs\fR - Partition filesystem. Note that sorts will be somewhat random if all
+filesystems are the same.
+
+\fBid\fR - Mount point of partition (default).
+
+\fBlabel\fR - Label of partition. If partitions have no labels,
+sort will be random.
+
+\fBpercent\-used\fR - Percentage of partition size used.
+
+\fBsize\fR - KiB size of partition.
+
+\fBuuid\fR - UUID of the partition.
+
+\fBused\fR - KiB used of partition.
+
+.TP
.B \-\-sleep [0\-x.x]\fR
Usually in decimals. Change CPU sleep time for \fB\-C\fR (current: \fB\0.35\fR).
Sleep is used to let the system catch up and show a more accurate CPU use. Example:
@@ -1009,10 +1068,31 @@ For alternate ftp upload locations: Example:
\fBinxi \-\-ftp \fIftp.yourserver.com/incoming\fB \-\-debug 21\fR
+.SH DEBUGGING OPTIONS TO DEBUG DEBUGGER FAILURES
+
+Only used the following in conjunction with \fB\-\-debug 2[012]\fR, and only
+use if you experienced a failure or hang, or were instructed to do so.
+
.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.
+disabled due to unpredictable data in /proc tree.
+
+.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,
@@ -1113,6 +1193,9 @@ Overrides default. See \fB\-\-indent\-min\fR. If \fB80\fR or less, wrap will nev
\fBLIMIT\fR Overrides default of \fB10\fR IP addresses per IF. This is only of interest
to sys admins running servers with many IP addresses.
+\fBPARTITION_SORT\fR Overrides default partition output sort. See
+\fB\-\-partition\-sort\fR for options.
+
\fBPS_COUNT\fR The default number of items showing per \fB\-t\fR type, \fBm\fR or
\fBc\fR. Default is 5.
diff --git a/inxi.changelog b/inxi.changelog
index 194f0a6..7b818e6 100644
--- a/inxi.changelog
+++ b/inxi.changelog
@@ -1,4 +1,168 @@
=====================================================================================
+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.
+4. Refactored deb822 apt handling due to utter randomness of syntax allowed.
+
+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
+Script Date: 2018-09-24
+-----------------------------------
+Changes:
+-----------------------------------
+New version, new man. Huge set of changes. Excitement!! Thrills! Spills?
+
+Bugs:
+1. There was a missing main::is_int test that in some instances triggered
+error. This is corrected.
+2. More of a fix, but legacy devices were not matching NIC to IF because
+the /sys path was not a link as it is now. I made a separate function to
+handle that match test so it could be more readily worked with.
+
+Fixes:
+1. Arch/Manjaro presented yet another Xorg.wrapper path, this time /usr/lib. Why?
+who knows. That to me is a bug, but since if it's not handled in inxi, it makes
+it look like inxi has a server: -G bug, I worked around it. Again. This creates
+the bug when you do not use the actual true path of Xorg where Xorg.wrapper
+complains and will not show -version data. Why move this? why use that wrapper
+thing? I don't know, makes no sense to me.
+2. More MIPS data, thanks manjaro ARM people. This made MIPS much better, though
+it will certainly need more work.
+3. Better ARM support, added in devicetree strings, which helps pad out the
+Devices IDs, albeit with very little data, but at least the devices are detected.
+Thanks Manjaro ARM people there again.
+4. Removed Upstart init test for arm/mips/sparc devices. This test made MIPS
+device totally puke and die, killed networking, so since very few upstart running
+systems will be arm/mips devices, I decided there better safe than sorry.
+5. Found another uptime syntax case, MIPS as root does not have the users item.
+6. Many tweaks to SOC data generators, will catch more categories, but the lists
+will never be done since each device can be, and often is, random re the syntax.
+SOC types are now filtered through a function to create consistent device type
+strings for the per device tool to use to assign each to its proper
+@device_<type> array.
+7. USB networking failed to test usb type for 'network', which led to failed
+ids on some device strings.
+8. For pciconf/FreeBSD, cleaned up device class strings to get rid of 0x and
+trailing subsubclass values, this converts it into the same hex 4 item string
+that is used by GNU/Linux/lspci so I can apply consistent rules to all pci
+types, no matter what the generator source is, lspci, pcidump, pciconf, and
+eventually pcictl if I can get netbsd running.
+9. Fixed internal --dbg counts for various features, and updated docs for that.
+10. Fixed ARM / MIPS missing data messages, they were redundant.
+11. Ongoing, moving excessive source comments to inxi-values.txt and inxi-data.txt.
+12. Added unity-system-compositor as mir detection, who knew? I guess that was
+its production application name all along? Oh well.
+
+Enhancements:
+1. Added basic support for OpenIndiana/Solaris/SunOS as a bsd type. Just enough
+to make errors not happen.
+2. Future proofed unix/bsd detections just to avoid the unset $bsd_type of non
+BSD unix.
+3. Added S6 init system to init tool.
+4. Added OpenBSD pcidump to new DeviceData feature. Includes now <root required>
+message on Device-x: lines if not root. All working.
+5. Fully refactored the old pci stuff to DeviceData package/class, due to adding
+so many types to that, it made sense to make it a single class.
+6. Did the same to USBData, because of lsusb, usbdevs, and /sys usb, made sense
+to integrate the data grabber into one package/class
+7. Added speed: item to USB:, it shows in Mb/s or Gb/s
+8. Added Odroid C1/C2 handling, which is one big reason I opted to refactor the
+devices data logic into DeviceData.
+9. Added ash shell, not sure if that detection will work, but if it does,
+it will show.
+10. As part of the overall DeviceData refactor, I moved all per type data into
+dedicated arrays, like @device_graphics, @device_audio, @device_network, etc,
+which lets me totally dump all the per device item tests, and just check the
+arrays, which have already been tested for on the construction of the primary
+DeviceData set. Moved all per type detections into DeviceData so that is now
+one complete logic block, and the per type data generators don't need to know
+about any of that logic at all anymore.
+11. Added sway, swaybar, way-cooler as window managers, info items. Not 100%
+positive about the --version, their docs weren't very consistent, but I think
+the guess should be right if their docs weren't incorrect.
+12. Added vendor: item to network, not sure why I kept that off when I added
+vendor: to audio and graphics. It made sense at the time, but not now, so now
+-GNA all have vendor: if detected.
+13. More device vendors!! The list never ends. Thanks linuxlite/linux hardware
+database, somehow you have users that manage to use every obscure usb/ssd/hdd
+known to humanity.
+14. Big update to --admin, now has the following:
+ A: partitions: shows 'raw size: ' of partition, this lets users see the amount
+ of file system overhead, along with the available size as usual.
+ B: partitions: show percent of raw in size:
+ C: partitions: show if root, block size of partition file system. Uses
+ blockdev --getbsz <part>
+ D: partition: swap: show swappiness and vfs cache pressure, with (default)
+ or (default [default value]) added. This apparently can help debugging some
+ kernel issues etc. Whatever, I'll take someone's word for that.
+ E: Disks: show block size: logical: physical:
+15. New option and configuration item: --partition-sort / PARTITION_SORT
+This lets users change default mount point sort order to any available ordering
+in the partition item. Man page and help menu show options.
+16. Going along with the MIPS fixes, added basic support for OpenWRT, which uses
+an immensely stripped down busybox (no ps aux, for example), maybe because it
+only runs as root user/ not sure, anyway, took many fixes.
+17. Added Void Linux xbps repos to Repos section.
+
+Changes:
+1. Changed usb: 1.1 to rev: 1.1 because for linux, we have the USB revision number,
+like 3.1. Note that this is going to be wrong for BSDs, but that's fine.
+2. Changed slightly the output of Memory item, now it follows the following rules:
+ A: if -m/--memory is triggered (> -v4, or -m) Memory line always shows in Memory:
+ item, which makes sense. Note that -m overrides all other options of where Memory
+ minireport could be located.
+ B: if -tm is triggered, and -I is not triggered, Memory shows in in -tm
+ C: if -I is triggered, and -m is not triggered, Memory: shows in -I line.
+ D: no change in short form inxi no arg output, Memory is there.
+
+-----------------------------------
+-- Harald Hope - Mon, 24 Sep 2018 15:58:00 -0700
+
+=====================================================================================
Version: 3.0.24
Patch Version: 00
Script Date: 2018-09-10