aboutsummaryrefslogtreecommitdiffstats
path: root/inxi
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2023-09-25 23:46:20 -0400
committerLibravatarUnit 193 <unit193@unit193.net>2023-09-25 23:46:20 -0400
commite51b1efaa0789f90e5854b29decb71808e88cda8 (patch)
tree39571c1e138cb5988f9e9d1cafb0b8e7f584d24a /inxi
parent5cec0e6770d919c953f26b362b313a6a41635c26 (diff)
parent5f41941aaf7d6be9efd82ad41b833a04cae48e7d (diff)
Update upstream source from tag 'upstream/3.3.30-1'
Update to upstream version '3.3.30-1' with Debian dir e7710b0e94019020746fb38b0258f0b5cb3be774
Diffstat (limited to 'inxi')
-rwxr-xr-xinxi1736
1 files changed, 1360 insertions, 376 deletions
diff --git a/inxi b/inxi
index c10364e..edc3633 100755
--- a/inxi
+++ b/inxi
@@ -49,8 +49,8 @@ use POSIX qw(ceil uname strftime ttyname);
## INXI INFO ##
my $self_name='inxi';
-my $self_version='3.3.29';
-my $self_date='2023-08-15';
+my $self_version='3.3.30';
+my $self_date='2023-09-25';
my $self_patch='00';
## END INXI INFO ##
@@ -1953,6 +1953,12 @@ sub display_data {
# kde 5/plasma desktop 5, this is maybe an extra package and won't be used
['about-distro',''],
['aticonfig','--adapter=all --od-gettemperature'],
+ ['clinfo',''],
+ ['clinfo','--list'],
+ ['clinfo','--raw'], # machine friendly
+ ['eglinfo',''],
+ ['eglinfo','-B'],
+ ['es2_info',''],
['glxinfo',''],
['glxinfo','-B'],
['kded','--version'],
@@ -1987,6 +1993,8 @@ sub display_data {
['vainfo',''],
['vdpauinfo',''],
['vulkaninfo',''],
+ ['vulkaninfo','--summary'],
+ # ['vulkaninfo','--json'], # outputs to file, not sure how to output to stdout
['wayland-info',''], # not packaged as far as I know yet
['weston-info',''],
['wmctrl','-m'],
@@ -2667,7 +2675,7 @@ sub download_file {
## NOTE: 1 is success, 0 false for Perl
if ($dl{'dl'} eq 'tiny'){
$cmd = "Using tiny: type: $type \nurl: $url \nfile: $file";
- $result = get_file($type, $url, $file);
+ $result = get_file_tiny_http($type, $url, $file);
$debug_data = ($type ne 'stdout') ? $result : 'Success: stdout data not null.';
}
# But: 0 is success, and 1 is false for these
@@ -2699,7 +2707,7 @@ sub download_file {
return $result;
}
-sub get_file {
+sub get_file_tiny_http {
my ($type, $url, $file) = @_;
my $tiny = HTTP::Tiny->new;
# note: default is no verify, so default here actually is to verify unless overridden
@@ -2755,7 +2763,11 @@ sub set_downloader {
# It is NOT part of core modules. IO::Socket::SSL is also required
# For some https connections so only use tiny as option if both present
if ($dl{'tiny'}){
- if (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){
+ # this only for -U 4, grab file with ftp to avoid unsupported SSL issues
+ if ($use{'ftp-download'}){
+ $dl{'tiny'} = 0;
+ }
+ elsif (check_perl_module('HTTP::Tiny') && check_perl_module('IO::Socket::SSL')){
HTTP::Tiny->import;
IO::Socket::SSL->import;
$dl{'tiny'} = 1;
@@ -3034,11 +3046,13 @@ sub check_items {
}
elsif ($type eq 'recommended display information programs'){
if ($bsd_type){
- @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr);
+ @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo
+ xrandr);
$info_os = 'info-bsd';
}
else {
- @data = qw(glxinfo wmctrl xdpyinfo xprop xdriinfo xrandr);
+ @data = qw(eglinfo glxinfo vulkaninfo wmctrl xdpyinfo xprop xdriinfo
+ xrandr);
}
$b_program = 1;
$item = 'Program';
@@ -3555,17 +3569,33 @@ sub set_item_data {
'rpm' => 'wget',
},
## Programs-Display ##
+ 'eglinfo' => {
+ 'info' => '-G X11/Wayland EGL info',
+ 'info-bsd' => '-G X11/Wayland EGL info',
+ 'apt' => 'mesa-utils (or: mesa-utils-extra)',
+ 'pacman' => 'mesa-demos',
+ 'pkgtool' => 'mesa',
+ 'rpm' => 'egl-utils (SUSE: Mesa-demo-egl)',
+ },
'glxinfo' => {
- 'info' => '-G (X) glx info',
- 'info-bsd' => '-G (X) glx info',
+ 'info' => '-G X11 GLX info',
+ 'info-bsd' => '-G X11 GLX info',
'apt' => 'mesa-utils',
'pacman' => 'mesa-demos',
'pkgtool' => 'mesa',
- 'rpm' => 'glx-utils (SUSE: Mesa-demo-x)',
+ 'rpm' => 'glx-utils (Fedora: glx-utils; SUSE: Mesa-demo-x)',
+ },
+ 'vulkaninfo' => {
+ 'info' => '-G Vulkan API info',
+ 'info-bsd' => '-G Vulkan API info',
+ 'apt' => 'vulkan-tools',
+ 'pacman' => 'vulkan-tools',
+ 'pkgtool' => 'vulkan-tools',
+ 'rpm' => 'vulkan-demos (Fedora: vulkan-tools; SUSE: vulkan-demos)',
},
'wmctrl' => {
'info' => '-S active window manager (fallback)',
- 'info-bsd' => '-S active window managerr (fallback)',
+ 'info-bsd' => '-S active window manager (fallback)',
'apt' => 'wmctrl',
'pacman' => 'wmctrl',
'pkgtool' => 'wmctrl',
@@ -3577,7 +3607,7 @@ sub set_item_data {
'apt' => 'X11-utils',
'pacman' => 'xorg-xdpyinfo',
'pkgtool' => 'xdpyinfo',
- 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdpyinfo)',
+ 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdpyinfo)',
},
'xdriinfo' => {
'info' => '-G (X) DRI driver (if missing, fallback to Xorg log)',
@@ -3585,7 +3615,7 @@ sub set_item_data {
'apt' => 'X11-utils',
'pacman' => 'xorg-xdriinfo',
'pkgtool' => 'xdriinfo',
- 'rpm' => 'xorg-x11-utils (SUSE/Fedora?: xdriinfo)',
+ 'rpm' => 'xorg-x11-utils (SUSE/Fedora: xdriinfo)',
},
'xprop' => {
'info' => '-S (X) desktop data',
@@ -3593,7 +3623,7 @@ sub set_item_data {
'apt' => 'X11-utils',
'pacman' => 'xorg-xprop',
'pkgtool' => 'xprop',
- 'rpm' => 'x11-utils',
+ 'rpm' => 'x11-utils (Fedora/SUSE: xprop)',
},
'xrandr' => {
'info' => '-G (X) monitors(s) resolution; -Ga monitor data',
@@ -3601,7 +3631,7 @@ sub set_item_data {
'apt' => 'x11-xserver-utils',
'pacman' => 'xrandr',
'pkgtool' => 'xrandr',
- 'rpm' => 'x11-server-utils (Fedora: xrandr)',
+ 'rpm' => 'x11-server-utils (SUSE/Fedora: xrandr)',
},
## Perl Modules ##
'Cpanel::JSON::XS' => {
@@ -4541,17 +4571,14 @@ sub get_defaults {
my ($type) = @_;
my %defaults = (
'ftp-upload' => 'ftp.smxi.org/incoming',
- 'inxi-branch-1' => 'https://github.com/smxi/inxi/raw/one/',
- 'inxi-branch-2' => 'https://github.com/smxi/inxi/raw/two/',
- 'inxi-dev' => 'https://smxi.org/in/',
- 'inxi-main' => 'https://github.com/smxi/inxi/raw/master/',
- 'inxi-pinxi' => 'https://github.com/smxi/inxi/raw/inxi-perl/',
- 'inxi-man' => "https://smxi.org/in/$self_name.1",
- 'inxi-man-gh' => "https://github.com/smxi/inxi/raw/master/$self_name.1",
- 'pinxi-man' => "https://smxi.org/in/$self_name.1",
- 'pinxi-man-gh' => "https://github.com/smxi/inxi/raw/inxi-perl/$self_name.1",
+ 'inxi-branch-1' => 'https://codeberg.org/smxi/inxi/raw/one/',
+ 'inxi-branch-2' => 'https://codeberg.org/smxi/inxi/raw/two/',
+ "$self_name-dev" => 'https://smxi.org/in/',
+ "$self_name-dev-ftp" => 'ftp://ftp.smxi.org/outgoing/',
+ "inxi-main" => 'https://codeberg.org/smxi/inxi/raw/master/',
+ 'pinxi-main' => 'https://codeberg.org/smxi/pinxi/raw/master/',
);
- if (exists $defaults{$type}){
+ if ($defaults{$type}){
return $defaults{$type};
}
else {
@@ -4571,7 +4598,6 @@ sub update_me {
$self_path =~ s/\/$//; # dirname sometimes ends with /, sometimes not
$self_download =~ s/\/$//; # dirname sometimes ends with /, sometimes not
my $full_self_path = "$self_path/$self_name";
-
if ($b_irc){
error_handler('not-in-irc', "-U/--update")
}
@@ -4588,7 +4614,6 @@ sub update_me {
$output = '';
$self_download = "$self_download/$self_name";
$file_contents = download_file('stdout', $self_download);
-
# then do the actual download
if ($file_contents){
# make sure the whole file got downloaded and is in the variable
@@ -4607,7 +4632,7 @@ sub update_me {
print $output;
$output = '';
if ($use{'man'}){
- update_man($download_id);
+ update_man($self_download,$download_id);
}
else {
print "Skipping man download because branch version is being used.\n";
@@ -4627,7 +4652,7 @@ sub update_me {
sub update_man {
eval $start if $b_log;
- my ($download_id) = @_;
+ my ($self_download,$download_id) = @_;
my $man_file_location = set_man_location();
my $man_file_path = "$man_file_location/$self_name.1" ;
my ($file_contents,$man_file_url,$output,$program) = ('','','','');
@@ -4653,13 +4678,8 @@ sub update_man {
print "Required program gzip not found. Unable to install man page.\n";
return 0;
}
- # first choice is inxi.1/pinxi.1 from gh, second from smxi.org
- if ($download_id ne 'dev server'){
- $man_file_url = get_defaults($self_name . '-man-gh');
- }
- else {
- $man_file_url = get_defaults($self_name . '-man');
- }
+ # first choice is inxi.1/pinxi.1 from gh, second from smxi.org
+ $man_file_url = $self_download . '.1';
print "Updating $self_name.1 in $man_file_location\n";
print "using $download_id branch as download source\n";
print "Downloading man page file...\n";
@@ -5343,11 +5363,11 @@ sub get {
'fake:s' => sub {
my ($opt,$arg) = @_;
if ($arg){
- my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|elbrus|iomem|ip-if|ipmi|';
- $wl .= 'logical|lspci|partitions|pciconf|pcictl|pcidump|';
+ my $wl = 'bluetooth|compiler|cpu|dboot|dmidecode|egl|elbrus|glx|';
+ $wl .= 'iomem|ip-if|ipmi|logical|lspci|partitions|pciconf|pcictl|pcidump|';
$wl .= 'raid-btrfs|raid-hw|raid-lvm|raid-md|raid-soft|raid-zfs|';
$wl .= 'sensors|sensors-sys|swaymsg|sys-mem|sysctl|uptime|usbconfig|';
- $wl .= 'usbdevs|vmstat|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr';
+ $wl .= 'usbdevs|vmstat|vulkan|wl-info|wlr-randr|xdpyinfo|xorg-log|xrandr';
for (split(',',$arg)){
if ($_ =~ /\b($wl)\b/){
$fake{lc($1)} = 1;
@@ -5513,7 +5533,7 @@ sub get {
$debugger{'sys-force'} = 1;},
'tty' => sub { # workaround for ansible/scripts running this
$b_irc = 0;},
- 'U|update:s' => sub { # 1,2,3 OR http://myserver/path/inxi
+ 'U|update:s' => sub { # 1,2,3,4 OR http://myserver/path/inxi
my ($opt,$arg) = @_;
process_updater($opt,$arg);},
'usb-sys' => sub {
@@ -5556,7 +5576,7 @@ sub post_process {
main::set_downloader();
}
$use{'man'} = 0 if (!$use{'yes-man'} || $use{'no-man'});
- main::update_me($self_download, $download_id) if $use{'update-trigger'};
+ main::update_me($self_download,$download_id) if $use{'update-trigger'};
main::set_xorg_log() if $show{'graphic'};
if ($b_pledge){
my $b_update;
@@ -5587,7 +5607,10 @@ sub post_process {
main::error_handler('bad-arg', '-l/-u', 'missing required option(s) -j, -o, -p, -P');
}
$extra = 3 if $b_admin;
- $show{'graphic-basic'} = 0 if $show{'graphic-full'} && $extra > 1;
+ # this turns off basic for F/v graphic output levels.
+ if ($show{'graphic-basic'} && $show{'graphic-full'} && $extra > 1){
+ $show{'graphic-basic'} = 0;
+ }
if ($force{'rpm'}){
$force{'pkg'} = 1;
delete $force{'rpm'};
@@ -5685,32 +5708,39 @@ sub process_updater {
$use{'downloader'} = 1;
if ($use{'update'}){
$use{'update-trigger'} = 1;
- if (!$arg && $self_name eq 'pinxi'){
+ if (!$arg){
$use{'man'} = 1;
- $download_id = 'inxi-perl branch';
- $self_download = main::get_defaults('inxi-pinxi');
+ $download_id = "$self_name main branch";
+ $self_download = main::get_defaults("$self_name-main");
}
elsif ($arg && $arg eq '3'){
$use{'man'} = 1;
$download_id = 'dev server';
- $self_download = main::get_defaults('inxi-dev');
+ $self_download = main::get_defaults("$self_name-dev");
}
- else {
- if (!$arg){
- $download_id = 'main branch';
- $self_download = main::get_defaults('inxi-main');
- $use{'man'} = 1;
- $use{'yes-man'} = 1;
- }
- elsif ($arg =~ /^[12]$/){
+ elsif ($arg && $arg eq '4'){
+ $use{'man'} = 1;
+ $use{'ftp-download'} = 1;
+ $download_id = 'dev server ftp';
+ $self_download = main::get_defaults("$self_name-dev-ftp");
+ }
+ elsif ($arg =~ /^[12]$/){
+ if ($self_name eq 'inxi'){
$download_id = "branch $arg";
$self_download = main::get_defaults("inxi-branch-$arg");
}
- elsif ($arg =~ /^http/){
- $download_id = 'alt server';
- $self_download = $arg;
+ else {
+ main::error_handler('bad-arg', $opt, $arg);
}
}
+ elsif ($arg =~ /^(ftp|https?):/){
+ $download_id = 'alt server';
+ $self_download = $arg;
+ }
+ if ($self_download && $self_name eq 'inxi'){
+ $use{'man'} = 1;
+ $use{'yes-man'} = 1;
+ }
if (!$self_download){
main::error_handler('bad-arg', $opt, $arg);
}
@@ -5778,7 +5808,7 @@ sub show_options {
['1', '', '--gpu', "Deprecated. Triggers -Ga."],
['1', '-G', '--graphics', "Graphics info (devices(s), drivers, display
protocol (if available), display server/Wayland compositor, resolution, X.org:
- renderer, OpenGL version; Xvesa: VBE info."],
+ renderer, basic EGL, OpenGL, Vulkan API data; Xvesa API: VBE info."],
['1', '-i', '--ip', "WAN IP address and local interfaces (requires ifconfig
or ip network tool). Triggers -n. Not shown with -F for user security reasons.
You shouldn't paste your local/WAN IP."],
@@ -5956,9 +5986,9 @@ sub show_options {
['2', '-E', '', "PCI/USB Bus ID of device, driver version,
LMP version."],
['2', '-G', '', "GPU arch (AMD/Intel/Nvidia only); Specific vendor/product
- information (if relevant); PCI/USB ID of device; Direct rendering status
- (in X); Screen number GPU is running on (Nvidia only); device temp (Linux,
- if found)."],
+ information (if relevant); PCI/USB ID of device; Screen number GPU is running
+ on (Nvidia only); device temp (Linux, if found); APIs: EGL: active/inactive
+ platforms; OpenGL: direct rendering status (in X); Vulkan device counts."],
['2', '-i', '', "For IPv6, show additional scope addresses: Global, Site,
Temporary, Unknown. See --limit for large counts of IP addresses."],
['2', '-I', '', "Default system GCC. With -xx, also shows other installed
@@ -6005,11 +6035,12 @@ sub show_options {
(if found); USB rev, speed, lanes (if found)."],
['2', '-G', '', "Chip vendor:product ID for each video device; Output ports,
used and empty; PCIe speed, lanes (if found); USB rev, speed, lanes (if
- found); Xorg: OpenGL compatibility version, if free drivers and available;
- Xorg compositor; alternate Xorg drivers (if available. Alternate means driver
- is on automatic driver check list of Xorg for the device vendor, but is not
- installed on system); Xorg Screen data: ID, s-res, dpi; Monitors: ID,
- position (if > 1), resolution, dpi, model, diagonal."],
+ found); Xorg: Xorg compositor; alternate Xorg drivers (if available. Alternate
+ means driver is on automatic driver check list of Xorg for the device vendor,
+ but is not installed on system); Xorg Screen data: ID, s-res, dpi; Monitors:
+ ID, position (if > 1), resolution, dpi, model, diagonal; APIs: EGL: per
+ platform report; OpenGL: ES version, device-ID, display-ID (if not found in
+ Display line); Vulkan: per device report."],
['2', '-I', '', "Other detected installed gcc versions (if present). System
default target/runlevel. Adds parent program (or pty/tty) for shell info if
not in IRC. Adds Init version number, RC (if found). Adds per package manager
@@ -6053,7 +6084,8 @@ sub show_options {
['2', '-E', '', "Serial number, class ID, bluetooth device class ID, HCI
version and revision."],
['2', '-G', '', "Device serial number, class ID; Xorg Screen size, diag;
- Monitors: hz, size, modes, serial, scale, modes (max/min)."],
+ Monitors: hz, size, modes, serial, scale, modes (max/min); APIs: EGL: hardware
+ driver info; Vulkan: layer count, device hardware vendor."],
['2', '-I', '', "For 'Shell:' adds ([doas|su|sudo|login]) to shell name if
present; adds default shell+version if different; for 'running in:' adds (SSH)
if SSH session; adds wakeups: (from suspend) to Uptime."],
@@ -6099,7 +6131,8 @@ sub show_options {
non-free driver info (Nvidia only); PCIe lanes-max: gen, speed, lanes (if
relevant); USB mode (if found); list of alternate kernel modules/drivers for
device(s) (if available); Monitor built year, gamma, screen ratio (if
- available)."],
+ available); APIs: OpenGL: device memory, unified memory status; Vulkan: adds
+ full device report, device name, driver version, surfaces."],
['2', '-I', '', "Adds to Packages total number of lib files found for each
package manager and pm tools (if not -r); adds init service tool."],
['2', '-j,-p,-P', '', "For swap (if available): swappiness and vfs cache
@@ -6140,11 +6173,12 @@ sub show_options {
otherwise user is fine. Man page installs require root. No arguments
downloads from main $self_name git repo."],
['1', '', '', "Use alternate sources for updating $self_name"],
- ['2', '1', '', "Get the git branch one version."],
- ['2', '2', '', "Get the git branch two version."],
['3', '3', '', "Get the dev server (smxi.org) version."],
- ['2', '<http>', '', "Get a version of $self_name from your own server.
- Use the full download path, e.g.^$self_name^-U^https://myserver.com/inxi"],
+ ['3', '4', '', "Get the dev server (smxi.org) FTP version. Use if SSL issues
+ and --no-ssl doesn't work."],
+ ['2', '<http|https|ftp>', '', "Get a version of $self_name from your own
+ server. Use the full download path, e.g.
+ ^$self_name^-U ^https://myserver.com/inxi"],
);
}
push(@$rows,
@@ -6305,7 +6339,7 @@ sub show_version {
}
push(@$rows,
[ 0, '', '', '' ],
- [ 0, '', '', "Website:^https://github.com/smxi/inxi^or^https://smxi.org/" ],
+ [ 0, '', '', "Website:^https://codeberg.org/smxi/inxi^or^https://smxi.org/" ],
[ 0, '', '', "IRC:^irc.oftc.net channel:^#smxi" ],
[ 0, '', '', "Forums:^https://techpatterns.com/forums/forum-33.html" ],
[ 0, '', '', '' ],
@@ -6951,19 +6985,21 @@ sub message {
'edid-revision' => "invalid EDID revision: $id",
'edid-sync' => "bad sync value: $id",
'edid-version' => "invalid EDID version: $id",
- 'egl-wayland' => 'No known Wayland EGL/GBM data sources.',
- 'egl-wayland-console' => 'No known Wayland EGL/GBM data sources.',
+ 'egl-null' => 'No EGL data available.',
+ 'egl-missing' => 'EGL data requires eglinfo. Check --recommends.',
'file-unreadable' => 'File not readable (permissions?)',
- 'gfx-api' => 'No display API data. No known data sources.',
- 'gfx-api-console' => 'No display API data available in console. Headless machine?',
- 'gfx-api-xvesa' => 'No Xvesa VBE/GOP data found.',
- 'gl-console-glxinfo-missing' => 'GL data unavailable in console and glxinfo missing.',
- 'gl-console-root' => 'GL data unavailable in console for root.',
- 'gl-console-try' => 'GL data unavailable in console. Try -G --display',
- 'gl-display-root' => 'GL data unavailable for root.',
- 'gl-null' => 'No GL data found on this system.',
- 'gl-value-empty' => 'Unset. Missing GL driver?',
- 'glxinfo-missing' => 'Unable to show GL data. Required tool glxinfo missing.',
+ 'gfx-api' => 'No display API data available.',
+ 'gfx-api-console' => 'No API data available in console. Headless machine?',
+ 'glx-console-glxinfo-missing' => 'GL data unavailable in console, glxinfo missing.',
+ 'glx-console-root' => 'GL data unavailable in console for root.',
+ 'glx-console-try' => 'GL data unavailable in console. Try -G --display',
+ 'glx-display-root' => 'GL data unavailable for root.',
+ 'glx-egl' => 'incomplete (EGL sourced)',
+ 'glx-egl-console' => 'console (EGL sourced)',
+ 'glx-egl-missing' => 'glxinfo missing (EGL sourced)',
+ 'glx-null' => 'No GL data available.',
+ 'glx-value-empty' => 'Unset. Missing GL driver?',
+ 'glxinfo-missing' => 'Unable to show GL data. glxinfo is missing.',
'IP' => "No $id found. Connected to web? SSL issues?",
'IP-dig' => "No $id found. Connected to web? SSL issues? Try --no-dig",
'IP-no-dig' => "No $id found. Connected to web? SSL issues? Try enabling dig",
@@ -7050,8 +7086,10 @@ sub message {
'unknown-dev' => 'ERR-102',
'unknown-device-id' => 'unknown device ID',
'unknown-shell' => 'ERR-100',
+ 'vulkan-null' => 'No Vulkan data available.',
'weather-error' => "Error: $id",
'weather-null' => "No $id found. Internet connection working?",
+ 'xvesa-null' => 'No Xvesa VBE/GOP data found.',
);
return $message{$type};
}
@@ -11467,6 +11505,8 @@ sub cp_cpu_arch {
my $check = main::message('note-check');
# See: docs/inxi-cpu.txt
# print "type:$type fam:$family model:$model step:$stepping\n";
+ # Note: AMD family is not Ext fam . fam but rather Ext-fam + fam.
+ # But model is Ext model . model...
if ($type eq 'amd'){
if ($family eq '3'){
$arch = 'Am386';
@@ -11702,6 +11742,7 @@ sub cp_cpu_arch {
elsif ($family eq '19'){ # AF
# zen 4 raphael, phoenix 1 use n5 I believe
# Epyc Bergamo zen4c 4nm, only few full model IDs, update when appear
+ # zen4c is for cloud hyperscale
if ($model =~ /^(78)$/){
$arch = 'Zen 4c';
$gen = '5';
@@ -11731,9 +11772,26 @@ sub cp_cpu_arch {
$note = $check;
$process = 'TSMC n5 (5nm)';
$year = '2021-22';}
- # Zen 5: TSMC n3
}
- ## Roadmap: check to verify, AMD is usually closer to target than Intel
+ # Zen 5: TSMC n3/n4, epyc turin / granite ridge? / turin dense zen 5c 3nm
+ elsif ($family eq '20'){ # BF
+ if ($model =~ /^(0)$/){
+ $arch = 'Zen 5';
+ $gen = '5';
+ $process = 'TSMC n3 (3nm)'; # turin could be 4nm, need more data
+ $year = '2023+';}
+ elsif ($model =~ /^(20|40)$/){
+ $arch = 'Zen 5';
+ $gen = '5';
+ $process = 'TSMC n3 (3nm)'; # desktop, granite ridge, confirm 2024
+ $year = '2024+';}
+ else {
+ $arch = 'Zen 5';
+ $note = $check;
+ $process = 'TSMC n3/n4 (3,4nm)';
+ $year = '2024+';}
+ }
+ # Roadmap: check to verify, AMD is usually closer to target than Intel
# Epyc 4 genoa: zen 4, nm, 2022+ (dec 2022), cxl-1.1,pcie-5, ddr-5
}
# we have no advanced data for ARM cpus, this is an area that could be improved?
@@ -12217,13 +12275,13 @@ sub cp_cpu_arch {
$arch = 'Raptor Lake'; # 13 gen, socket LG 1700,1800
$process = 'Intel 7 (10nm)';
$year = '2022+';}
- elsif ($model =~ /^(BD)$/){
- $arch = 'Lunar Lake'; # 16 gn
+ elsif ($model =~ /^(BC|BD)$/){
+ $arch = 'Lunar Lake'; # 15 gn
$process = 'Intel 18a (1.8nm)';
$year = '2024+';} # check when actually in production
# Meteor Lake-S maybe cancelled, replaced by arrow
- elsif ($model =~ /^(C6)$/){
- $arch = 'Arrow Lake'; # 15 gn
+ elsif ($model =~ /^(C5|C6)$/){
+ $arch = 'Arrow Lake'; # 14 gn
# gfx tile is TSMC 3nm
$process = 'Intel 20a (2nm)';# TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9)
$year = '2024+';} # check when actually in production
@@ -12238,11 +12296,11 @@ sub cp_cpu_arch {
# Diamond Rapids: Intel 3 (7nm+), 2025
# Raptor Lake: 13 gen, Intel 7 (10nm), 2022
# Meteor Lake: 14 gen, Intel 4 (7nm+)
- # Arrow Lake - 15 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024
- # Panther Lake - 15 gen, ?
- # Beast Lake - 15 gen, ?
- # Lunar Lake - 16 gen, Intel 18A (1.8nm), 2024-5
- # Nova Lake - 17 gen, Intel 18A (1.8nm), 2026
+ # Arrow Lake - 14 gen, TSMC 3nm (corei3-5)/Intel 20A 2nm (core i5-9), 2024
+ # Lunar Lake - 15 gen, Intel 18A (1.8nm), 2024-5
+ # Panther Lake - 15 gen, ?, late 2025, cougar cove Xe3 Celestial GPU architecture
+ # Beast Lake - 16 gen, ?, 2026?
+ # Nova Lake - 16 gen, Intel 18A (1.8nm), 2026
}
# itanium 1 family 7 all recalled
elsif ($family eq 'B'){
@@ -14127,18 +14185,19 @@ sub set_disk_vendors {
['(^MKN|Mushkin)','Mushkin','Mushkin',''], # MKNS
# MU = Multiple_Flash_Reader too risky: |M[UZ][^L] HD103SI HD start risky
# HM320II HM320II HM
- ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CUT|[DG]3 Station|DUO\b|DUT|CKT|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM
+ ['(SAMSUNG|^(AWMB|[BC]DS20|[BC]WB|BJ[NT]|[BC]GND|CJ[NT]|CKT|CUT|[DG]3 Station|DUO\b|DUT|EB\dMW|GE4S5|[GS]2 Portable|GN|HD\d{3}[A-Z]{2}$|(HM|SP)\d{2}|HS\d|M[AB]G\d[FG]|MCC|MCBOE|MCG\d+GC|[CD]JN|MZ|^G[CD][1-9][QS]|P[BM]\d|(SSD\s?)?SM\s?841)|^SSD\s?[89]\d{2}\s(DCT|PRO|QVD|\d+[GT]B)|\bEVO\b|SV\d|[BE][A-Z][1-9]QT|YP\b|[CH]N-M|MMC[QR]E)','SAMSUNG','Samsung',''], # maybe ^SM, ^HM
# Android UMS Composite?U1
- ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''],
+ ['(SanDisk|0781|^(A[BCD]LC[DE]|AFGCE|D[AB]4|DX[1-9]|Extreme|Firebird|S[CD]\d{2}G|SD(S[S]?[ADQ]|SL\d+G|SU\d|\sUltra)|SDW[1-9]|SE\d{2}|SEM[1-9]|\d[STU]|U(3\b|1\d0))|Clip Sport|Cruzer|iXpand|SN(\d+G|128|256)|SSD (Plus|U1[01]0) [1-9]|ULTRA\s(FIT|trek|II)|X[1-6]\d{2})','(SanDisk|0781)','SanDisk',''],
# these are HP/Sandisk cobranded. DX110064A5xnNMRI ids as HP and Sandisc
['(^DX[1-9])','^(HP\b|SANDDISK)','Sandisk/HP',''], # ssd drive, must come before seagate ST test
# real, SSEAGATE Backup+; XP1600HE30002 | 024 HN (spinpoint) ; possible usb: 24AS
# ST[numbers] excludes other ST starting devices
['([S]?SEAGATE|^((Barra|Fire)Cuda|BUP|EM\d{3}|Expansion|(ATA\s|HDD\s)?ST\d{2}|5AS|X[AFP])|Backup(\+|\s?Plus)\s?(Hub)?|DS2\d|Expansion Desk|FreeAgent|GoFlex|INIC|IronWolf|OneTouch|Slim\s?BK)','[S]?SEAGATE','Seagate',''],
- ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''],
+ ['^(WD|WL[0]9]|Western Digital|My (Book|Passport)|\d*LPCX|Elements|easystore|EA[A-Z]S|EARX|EFRX|EZRX|\d*EAVS|G[\s-]Drive|i HTS|0JD|JP[CV]|MD0|M000|\d+(BEV|(00)?AAK|AAV|AZL|EA[CD]S)|PC\sSN|SN530|SPZX|3200[AB]|2500[BJ]|20G2|5000[AB]|6400[AB]|7500[AB]|00[ABL][A-Z]{2}|SSC\b)','(^WDC|Western\s?Digital)','Western Digital',''],
# rare cases WDC is in middle of string
['(\bWDC\b|1002FAEX)','','Western Digital',''],
- ## THEN BETTER KNOWN ONESs ##
+
+ ## THEN BETTER KNOWN ONES ##
['^Acer','^Acer','Acer',''],
# A-Data can be in middle of string
['^(.*\bA-?DATA|ASP\d|AX[MN]|CH11|FX63|HV[1-9]|IM2|HD[1-9]|HDD\s?CH|IUM|SX\d|Swordfish)','A-?DATA','A-Data',''],
@@ -14147,7 +14206,7 @@ sub set_disk_vendors {
['^ATP','^ATP\b','ATP',''],
# Force MP500
['^(Corsair|Force\s|(Flash\s*)?(Survivor|Voyager)|Neutron|Padlock)','^Corsair','Corsair',''],
- ['^(FUJITSU|MJA|MH[TVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''],
+ ['^(FUJITSU|MJA|MH[RTVWYZ]\d|MP|MAP\d|F\d00s?-)','^FUJITSU','Fujitsu',''],
# MAB3045SP shows as HP or Fujitsu, probably HP branded fujitsu
['^(MAB\d)','^(HP\b|FUJITSU)','Fujitsu/HP',''],
# note: 2012: wdc bought hgst
@@ -14170,6 +14229,7 @@ sub set_disk_vendors {
# note: get rid of: M[DGK] becasue mushkin starts with MK
# note: seen: KXG50ZNV512G NVMe TOSHIBA 512GB | THNSN51T02DUK NVMe TOSHIBA 1024GB
['(TOSHIBA|TransMemory|KBG4|^((A\s)?DT01A|M[GKQ]\d|HDW|SA\d{2}G$|(008|016|032|064|128)G[379E][0-9A]$|[S]?TOS|THN)|0930|KSG\d)','S?(TOSHIBA|0930)','Toshiba',''], # scsi-STOSHIBA_STOR.E_EDITION_
+
## LAST: THEY ARE SHORT AND COULD LEAD TO FALSE ID, OR ARE UNLIKELY ##
# unknown: AL25744_12345678; ADP may be usb 2.5" adapter; udisk unknown: Z1E6FTKJ 00AAKS
# SSD2SC240G726A10 MRS020A128GTS25C EHSAJM0016GB
@@ -14188,12 +14248,15 @@ sub set_disk_vendors {
['^(Advantech|SQF)','^Advantech','Advantech',''],
['^AEGO','^AEGO','AEGO',''],
['^AFOX','^AFOX','AFOX',''],
+ ['^AFTERSHOCK','^AFTERSHOCK','AFTERSHOCK',''],
['^(Agile|AGI)','^(AGI|Agile\s?Gear\s?Int[a-z]*)','AGI',''],
['^Aigo','^Aigo','Aigo',''],
+ ['^AirDisk','^AirDisk','AirDisk',''],
['^Aireye','^Aireye','Aireye',''],
['^Alcatel','^Alcatel','Alcatel',''],
['^(Alcor(\s?Micro)?|058F)','^(Alcor(\s?Micro)?|058F)','Alcor Micro',''],
['^Alfawise','^Alfawise','Alfawise',''],
+ ['(^ALKETRON|FireWizard)','^ALKETRON','ALKETRON',''],
['^Android','^Android','Android',''],
['^ANACOMDA','^ANACOMDA','ANACOMDA',''],
['^Ant[\s_-]?Esports','^Ant[\s_-]?Esports','Ant Esports',''],
@@ -14240,12 +14303,14 @@ sub set_disk_vendors {
['^Clover','^Clover','Clover',''],
['^CODi','^CODi','CODi',''],
['^Colorful\b','^Colorful','Colorful',''],
+ ['^CONSISTENT','^CONSISTENT','Consistent',''],
# note: www.cornbuy.com is both a brand and also sells other brands, like newegg
# addlink; colorful; goldenfir; kodkak; maxson; netac; teclast; vaseky
['^Corn','^Corn','Corn',''],
['^CnMemory|Spaceloop','^CnMemory','CnMemory',''],
['^(Creative|(Nomad\s?)?MuVo)','^Creative','Creative',''],
['^CSD','^CSD','CSD',''],
+ ['^CYX\b','^CYX','CYX',''],
['^(Dane-?Elec|Z Mate)','^Dane-?Elec','DaneElec',''],
['^DATABAR','^DATABAR','DataBar',''],
# Daplink vfs is an ARM software thing
@@ -14257,6 +14322,7 @@ sub set_disk_vendors {
['^DeLOCK','^Delock(\s?products)?','Delock',''],
['^Derler','^Derler','Derler',''],
['^detech','^detech','DETech',''],
+ ['^DEXP','^DEXP','DEXP',''],
['^DGM','^DGM\b','DGM',''],
['^(DICOM|MAESTRO)','^DICOM','DICOM',''],
['^Digifast','^Digifast','Digifast',''],
@@ -14290,8 +14356,11 @@ sub set_disk_vendors {
['^(Shenzhen\s)?Etopso(\sTechnology)?','^(Shenzhen\s)?Etopso(\sTechnology)?','Etopso',''],
['^EURS','^EURS','EURS',''],
['^eVAULT','^eVAULT','eVAULT',''],
+ ['^EVM','^EVM','EVM',''],
+ ['^eVtran','^eVtran','eVtran',''],
# NOTE: ESA3... may be IBM PCIe SAD card/drives
['^(EXCELSTOR|r technology)','^EXCELSTOR( TECHNO(LOGY)?)?','ExcelStor',''],
+ ['^EXRAM','^EXRAM','EXRAM',''],
['^EYOTA','^EYOTA','EYOTA',''],
['^EZCOOL','^EZCOOL','EZCOOL',''],
['^EZLINK','^EZLINK','EZLINK',''],
@@ -14324,6 +14393,7 @@ sub set_disk_vendors {
['^(Gigabyte|GP-G)','^Gigabyte','Gigabyte',''], # SSD
['^Gigastone','^Gigastone','Gigastone',''],
['^Gigaware','^Gigaware','Gigaware',''],
+ ['^GJN','^GJN\b','GJN',''],
['^(Gloway|FER\d)','^Gloway','Gloway',''],
['^GLOWY','^GLOWY','Glowy',''],
['^Goldendisk','^Goldendisk','Goldendisk',''],
@@ -14350,6 +14420,7 @@ sub set_disk_vendors {
['^HEMA','^HEMA','HEMA',''],
['(HEORIADY|^HX-0)','^HEORIADY','HEORIADY',''],
['^(Hikvision|HKVSN|HS-SSD)','^Hikvision','Hikvision',''],
+ ['^Hi[\s-]?Level ','^Hi[\s-]?Level ','Hi-Level',''], # ^HI\b with no Level?
['^(Hisense|H8G)','^Hisense','Hisense',''],
['^Hoodisk','^Hoodisk','Hoodisk',''],
['^HUAWEI','^HUAWEI','Huawei',''],
@@ -14400,6 +14471,7 @@ sub set_disk_vendors {
['^KimMIDI','^KimMIDI','KimMIDI',''],
['^Kimtigo','^Kimtigo','Kimtigo',''],
['^Kingbank','^Kingbank','Kingbank',''],
+ ['^(KingCell|KC\b)','^KingCell','KingCell',''],
['^Kingchux[\s-]?ing','^Kingchux[\s-]?ing','Kingchuxing',''],
['^KINGCOMP','^KINGCOMP','KingComp',''],
['(KingDian|^NGF|S(280|400))','KingDian','KingDian',''],
@@ -14408,7 +14480,7 @@ sub set_disk_vendors {
['^Kingrich','^Kingrich','Kingrich',''],
['^Kingsand','^Kingsand','Kingsand',''],
['KING\s?SHA\s?RE','KING\s?SHA\s?RE','KingShare',''],
- ['^(KingSpec|ACSC|C3000|KS[DQ]|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''],
+ ['^(KingSpec|ACSC|C3000|KS[DQ]|MSH|N[ET]-\d|P3$|P4\b|PA[_-]?(18|25)|Q-180|T-(3260|64|128)|Z(\d\s|F\d))','^KingSpec','KingSpec',''],
['^KingSSD','^KingSSD','KingSSD',''],
# kingwin docking, not actual drive
['^(EZD|EZ-Dock)','','Kingwin Docking Station',''],
@@ -14429,7 +14501,7 @@ sub set_disk_vendors {
['^(Lazos|L-?ISS)','^Lazos','Lazos',''],
['^LDLC','^LDLC','LDLC',''],
# LENSE30512GMSP34MEAT3TA / UMIS RPITJ256PED2MWX
- ['^(LEN|UMIS)','^Lenovo','Lenovo',''],
+ ['^(LEN|UMIS|Think)','^Lenovo','Lenovo',''],
['^RPFT','','Lenovo O.E.M.',''],
# JAJS300M120C JAJM600M256C JAJS600M1024C JAJS600M256C JAJMS600M128G
['^(Leven|JAJ[MS])','^Leven','Leven',''],
@@ -14444,13 +14516,13 @@ sub set_disk_vendors {
['^(LSI|MegaRAID)','^LSI\b','LSI',''],
['^(M-Systems|DiskOnKey)','^M-Systems','M-Systems',''],
['^(Mach\s*Xtreme|MXSSD|MXU|MX[\s-])','^Mach\s*Xtreme','Mach Xtreme',''],
- ['^(MacroVIP|MV\d)','^MacroVIP','MacroVIP',''],
+ ['^(MacroVIP|MV(\d|GLD))','^MacroVIP','MacroVIP',''], # maybe MV alone
['^Mainic','^Mainic','Mainic',''],
+ ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''],
['^Maxell','^Maxell','Maxell',''],
['^Maximus','^Maximus','Maximus',''],
+ ['^MAXIO','^MAXIO','Maxio',''],
['^Maxone','^Maxone','Maxone',''],
- ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''],
- ['^(MARSHAL\b|MAL\d)','^MARSHAL','Marshal',''],
['^MARVELL','^MARVELL','Marvell',''],
['^Maxsun','^Maxsun','Maxsun',''],
['^MDT\b','^MDT','MDT (rebuilt WD/Seagate)',''], # mdt rebuilds wd/seagate hdd
@@ -14458,7 +14530,9 @@ sub set_disk_vendors {
['^MD[1-9]','^Max\s*Digital','MaxDigital',''],
['^Medion','^Medion','Medion',''],
['^(MEDIAMAX|WL\d{2})','^MEDIAMAX','MediaMax',''],
+ ['^(Memorex|TravelDrive|TD\s?Classic)','^Memorex','Memorex',''],
['^Mengmi','^Mengmi','Mengmi',''],
+ ['^MicroFrom','^MicroFrom','MicroFrom',''],
['^MGTEC','^MGTEC','MGTEC',''],
# must come before micron
['^(Mtron|MSP)','^Mtron','Mtron',''],
@@ -14477,8 +14551,9 @@ sub set_disk_vendors {
['^Morebeck','^Morebeck','Morebeck',''],
['^(Moser\s?Bear|MBIL)','^Moser\s?Bear','Moser Bear',''],
['^(Motile|SSM\d)','^Motile','Motile',''],
- ['^(Motorola|XT\d{4})','^Motorola','Motorola',''],
+ ['^(Motorola|XT\d{4}|Moto[\s-]?[EG])','^Motorola','Motorola',''],
['^Moweek','^Moweek','Moweek',''],
+ ['^Move[\s-]?Speed','^Move[\s-]?Speed','Move Speed',''],
#MRMAD4B128GC9M2C
['^(MRMA|Memoright)','^Memoright','Memoright',''],
['^MSI\b','^MSI\b','MSI',''],
@@ -14488,11 +14563,13 @@ sub set_disk_vendors {
['^(Myson)','^Myson([\s-]?Century)?([\s-]?Inc\.?)?','Myson Century',''],
['^(Natusun|i-flashdisk)','^Natusun','Natusun',''],
['^(Neo\s*Forza|NFS\d)','^Neo\s*Forza','Neo Forza',''],
- ['^(Netac|OnlyDisk|S535N)','^Netac','Netac',''],
+ ['^(Netac|NS\d{3}|OnlyDisk|S535N)','^Netac','Netac',''],
+ ['^Newsmy','^Newsmy','Newsmy',''],
['^NFHK','^NFHK','NFHK',''],
# NGFF is a type, like msata, sata
['^Nik','^Nikimi','Nikimi',''],
['^NOREL','^NOREL(SYS)?','NorelSys',''],
+ ['^(N[\s-]?Tech|NT\d)','^N[\s-]?Tec','N Tech',''], # coudl be ^NT alone
['^ODYS','^ODYS','ODYS',''],
['^Olympus','^Olympus','Olympus',''],
['^Orico','^Orico','Orico',''],
@@ -14516,15 +14593,17 @@ sub set_disk_vendors {
['^(Premiertek|QSSD|Quaroni)','^Premiertek','Premiertek',''],
['^(-?Pretec|UltimateGuard)','-?Pretec','Pretec',''],
['^(Prolific)','^Prolific( Technolgy Inc\.)?','Prolific',''],
- # PS3109S9 is the result of an error condition with ssd drive
+ # PS3109S9 is the result of an error condition with ssd controller: Phison PS3109
['^PUSKILL','^PUSKILL','Puskill',''],
['QEMU','^\d*QEMU( QEMU)?','QEMU',''], # 0QUEMU QEMU HARDDISK
['(^Quantum|Fireball)','^Quantum','Quantum',''],
['(^QOOTEC|QMT)','^QOOTEC','QOOTEC',''],
- ['^QUMO','^QUMO','Qumo',''],
+ ['^(QUMO|Q\dDT)','^QUMO','Qumo',''],
+ ['^QOPP','^QOPP','Qopp',''],
['^Qunion','^Qunion','Qunion',''],
['^(R[3-9]|AMD\s?(RADEON)?|Radeon)','AMD\s?(RADEON)?','AMD Radeon',''], # ssd
['^(Ramaxel|RT|RM|RPF|RDM)','^Ramaxel','Ramaxel',''],
+ ['^RAMOS','^RAMOS','RAmos',''],
['^(Ramsta|R[1-9])','^Ramsta','Ramsta',''],
['^RCESSD','^RCESSD','RCESSD',''],
['^(Realtek|RTL)','^Realtek','Realtek',''],
@@ -14537,6 +14616,7 @@ sub set_disk_vendors {
#RTDMA008RAV2BWL comes with lenovo but don't know brand
['^Runcore','^Runcore','Runcore',''],
['^Rundisk','^Rundisk','RunDisk',''],
+ ['^RZX','^RZX\b','RZX',''],
['^(S3Plus|S3\s?SSD)','^S3Plus','S3Plus',''],
['^(Sabrent|Rocket)','^Sabrent','Sabrent',''],
['^Sage','^Sage(\s?Micro)?','Sage Micro',''],
@@ -14553,6 +14633,7 @@ sub set_disk_vendors {
['(Silicon[\s-]?Power|^SP[CP]C|^Silicon|^Diamond|^HasTopSunlightpeed)','Silicon[\s-]?Power','Silicon Power',''],
# simple drive could also maybe be hgst
['^(Simple\s?Tech|Simple[\s-]?Drive)','^Simple\s?Tech','SimpleTech',''],
+ ['^(Simmtronics?|S[79]\d{2}|ZipX)','^Simmtronics?','Simmtronics',''],
['^SINTECHI?','^SINTECHI?','SinTech (adapter)',''],
['^SiS\b','^SiS','SiS',''],
['Smartbuy','\s?Smartbuy','Smartbuy',''], # SSD Smartbuy 60GB; mSata Smartbuy 3
@@ -14563,9 +14644,11 @@ sub set_disk_vendors {
['^Skill','^Skill','Skill',''],
['^(SMART( Storage Systems)?|TX)','^(SMART( Storage Systems)?)','Smart Storage Systems',''],
['^Sobetter','^Sobetter','Sobetter',''],
+ ['^Solidata','^Solidata','Solidata',''],
['^(SOLIDIGM|SSDPFK)','^SOLIDIGM\b','solidgm',''],
['^(Sony|IM9|Microvalut|S[FR]-)','^Sony','Sony',''],
['^(SSSTC|CL1-)','^SSSTC','SSSTC',''],
+ ['^(SST|SG[AN])','^SST\b','SST',''],
['^STE[CK]','^STE[CK]','sTec',''], # wd bought this one
['^STORFLY','^STORFLY','StorFly',''],
['\dSUN\d','^SUN(\sMicrosystems)?','Sun Microsystems',''],
@@ -14587,7 +14670,7 @@ sub set_disk_vendors {
['^(TC[\s-]*SUNBOW|X3\s\d+[GT])','^TC[\s-]*SUNBOW','TCSunBow',''],
['^(TDK|TF[1-9]\d|LoR)','^TDK','TDK',''],
['^TEAC','^TEAC','TEAC',''],
- ['^(TEAM|T[\s-]?Create|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''],
+ ['^(TEAM|T[\s-]?Create|CX[12]\b|L\d\s?Lite|T\d{3,}[A-Z]|TM\d|(Dark\s?)?L3\b|T[\s-]?Force)','^TEAM(\s*Group)?','TeamGroup',''],
['^(Teclast|CoolFlash)','^Teclast','Teclast',''],
['^(tecmiyo)','^tecmiyo','TECMIYO',''],
['^Teelkoou','^Teelkoou','Teelkoou',''],
@@ -14635,7 +14718,7 @@ sub set_disk_vendors {
['^Walton','^Walton','Walton',''],
['^(Wearable|Air-?Stash)','^Wearable','Wearable',''],
['^Wellcomm','^Wellcomm','Wellcomm',''],
- ['^(wicgtyp|N900)','^wicgtyp','wicgtyp',''],
+ ['^(wicgtyp|N[V]?900)','^wicgtyp','wicgtyp',''],
['^Wilk','^Wilk','Wilk',''],
['^(WinMemory|SWG\d)','^WinMemory','WinMemory',''],
['^(Winton|WT\d{2})','^Winton','Winton',''],
@@ -14662,6 +14745,7 @@ sub set_disk_vendors {
['^Zenfast','^Zenfast','Zenfast',''],
['^Zenith','^Zenith','Zenith',''],
['^ZEUSLAP','^ZEUSLAP','ZEUSLAP',''],
+ ['^ZEUSS','^ZEUSS','Zeuss',''],
['^(Zheino|CHN|CNM)','^Zheino','Zheino',''],
['^(Zotac|ZTSSD)','^Zotac','Zotac',''],
['^ZSPEED','^ZSPEED','ZSpeed',''],
@@ -14918,7 +15002,8 @@ sub drive_speed {
## GraphicItem
{
package GraphicItem;
-my ($b_primary,$b_wayland_data,%graphics,$monitor_ids,$monitor_map);
+my ($b_primary,$b_wayland_data,%graphics,%mesa_drivers,
+$monitor_ids,$monitor_map);
my ($gpu_amd,$gpu_intel,$gpu_nv);
sub get {
@@ -14955,7 +15040,7 @@ sub get {
# note: not perfect, but we need usb gfx to show for all types, soc, pci, etc
usb_output($rows);
display_output($rows);
- display_api_output($rows);
+ display_api($rows);
(%graphics,$monitor_ids,$monitor_map) = ();
eval $end if $b_log;
return $rows;
@@ -15605,205 +15690,375 @@ sub monitors_output_full {
eval $end if $b_log;
}
-## DISPLAY API OUTPUT ##
-# as soon as EGL data source for Wayland appears add it!
-sub display_api_output {
+## DISPLAY API ##
+
+# API Output #
+
+# GLX/OpenGL EGL Vulkan XVesa
+sub display_api {
eval $start if $b_log;
my $rows = $_[0];
- my $num = 0;
- my ($api,$program,$type);
# print ("$b_display : $b_root\n");
# xvesa is absolute, if it's there, it works in or out of display
if ($graphics{'xvesa'}){
- xvesa_output($rows,\$num);
+ xvesa_output($rows);
+ return;
}
- else {
+ my ($b_egl,$b_egl_print,$b_glx,$b_glx_print,$b_vulkan,$api,$program,$type);
+ my $gl = {};
+ if ($fake{'egl'} || ($program = main::check_program('eglinfo'))){
+ gl_data('egl',$program,$rows,$gl);
+ $b_egl = 1;
+ }
+ if ($fake{'glx'} || ($program = main::check_program('glxinfo'))){
+ gl_data('glx',$program,$rows,$gl) if $b_display;
+ $b_glx = 1;
+ }
+ # Note: we let gl/egl output handle null or root null data issues
+ if ($gl->{'glx'}){
+ process_glx_data($gl->{'glx'},$b_glx);
+ }
+ # egl/vulkan give data out of display, and for root
+ # if ($b_egl}){
+ if ($b_egl && ($show{'graphic-full'} || !$gl->{'glx'})){
+ egl_output($rows,$gl);
+ $b_egl_print = 1;
+ }
+ # fill in whatever was missing from eglinfo, or if legacy system/no eglinfo
+ # if ($b_glx || $gl->{'glx'}){
+ if (($show{'graphic-full'} && ($b_glx || $gl->{'glx'})) ||
+ (!$show{'graphic-full'} && !$b_egl_print && ($b_glx || $gl->{'glx'}))){
+ opengl_output($rows,$gl);
+ $b_glx = 1;
+ $b_glx_print = 1;
+ }
+ # if ($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))){
+ if (($fake{'vulkan'} || ($program = main::check_program('vulkaninfo'))) &&
+ ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print))){
+ vulkan_output($program,$rows);
+ $b_vulkan = 1;
+ }
+ if ($show{'graphic-full'} || (!$b_egl_print && !$b_glx_print)){
+ # remember, sudo/root usually has empty $DISPLAY as well
if ($b_display){
- if (!$force{'wayland'} && ($program = main::check_program('glxinfo'))){
- opengl_output($program,$rows,\$num);
+ # first do positive tests, won't be set for sudo/root
+ if (!$b_glx && $graphics{'protocol'} eq 'x11'){
+ $api = 'OpenGL';
+ $type = 'glxinfo-missing';
}
- # handles no data until we find one for wayland egl data
- elsif ($graphics{'protocol'} eq 'wayland'){
- egl_output($rows,\$num);
+ elsif (!$b_egl && $graphics{'protocol'} eq 'wayland'){
+ $api = 'EGL'; # /GBM
+ $type = 'egl-missing';
}
- else {
- if (main::check_program('X') || main::check_program('Xorg')){
- $api = 'OpenGL';
- $type = 'glxinfo-missing';
- }
- # has to come after X tests, since X can have Xwayland installed.
- elsif (main::check_program('Xwayland')){
- $api = 'EGL/GBM';
- $type = 'egl-wayland';
- }
- else {
- $api = 'N/A';
- $type = 'gfx-api';
- }
- push(@$rows,{
- main::key($num++,1,1,'API') => $api,
- main::key($num++,0,2,'Message') => main::message($type)
- });
+ elsif (!$b_glx &&
+ (main::check_program('X') || main::check_program('Xorg'))){
+ $api = 'OpenGL';
+ $type = 'glxinfo-missing';
}
- }
- else {
- if ($graphics{'protocol'} eq 'wayland'){
- $api = 'EGL/GBM';
- $type = 'egl-wayland-console';
+ elsif (!$b_egl && main::check_program('Xwayland')){
+ $api = 'EGL';
+ $type = 'egl-missing';
}
- elsif (main::check_program('glxinfo')){
- $api = 'OpenGL';
- $type = ($b_root) ? 'gl-console-root' : 'gl-console-try';
+ elsif (!$b_egl && !$b_glx && !$b_vulkan) {
+ $api = 'N/A';
+ $type = 'gfx-api';
}
- elsif (main::check_program('X') || main::check_program('Xorg')){
+ }
+ else {
+ if (!$b_glx &&
+ (main::check_program('X') || main::check_program('Xorg'))){
$api = 'OpenGL';
- $type = 'gl-console-glxinfo-missing';
+ $type = 'glx-console-glxinfo-missing';
}
- # has to come after X tests, since X can have Xwayland installed.
- elsif (main::check_program('Xwayland')){
- $api = 'EGL/GBM';
- $type = 'egl-wayland-console';
+ elsif (!$b_egl && main::check_program('Xwayland')){
+ $api = 'EGL';
+ $type = 'egl-console-missing';
}
# we don't know what it is, headless system, non xwayland wayland
- else {
+ elsif (!$b_egl && !$b_glx && !$b_vulkan) {
$api = 'N/A';
$type = 'gfx-api-console';
}
- push(@$rows,{
- main::key($num++,1,1,'API') => $api,
- main::key($num++,0,2,'Message') => main::message($type)
- });
}
+ no_data_output($api,$type,$rows) if $type;
}
eval $end if $b_log;
}
-sub egl_output {
+sub no_data_output {
eval $start if $b_log;
- my ($rows,$num) = @_;
- push(@$rows,{
- main::key($num++,1,1,'API') => 'EGL/GBM',
- main::key($num++,0,2,'Message') => main::message('egl-wayland')
+ my ($api,$type,$rows) = @_;
+ my $num = 0;
+ push(@$rows, {
+ main::key($num++,1,1,'API') => $api,
+ main::key($num++,0,2,'Message') => main::message($type)
});
eval $end if $b_log;
}
-sub opengl_output {
+sub egl_output {
eval $start if $b_log;
- my ($program,$rows,$num) = @_;
- # NOTE: glxinfo -B is not always available, unfortunately
- my $glxinfo = main::grabber("$program $display_opt 2>/dev/null",'','','ref');
- # my $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt";
- # my @glxinfo = main::reader($file);
- if (!@$glxinfo){
- my $type;
- if ($b_root){
- $type = 'gl-display-root';
+ my ($rows,$gl) = @_;
+ if (!$gl->{'egl'}){
+ my $api = 'EGL';
+ my $type = 'egl-null';
+ no_data_output($api,$type,$rows);
+ return 0;
+ }
+ my ($i,$j,$num) = (0,scalar @$rows,0);
+ my ($value);
+ my $ref;
+ my $data = $gl->{'egl'}{'data'};
+ my $plat = $gl->{'egl'}{'platforms'};
+ push(@$rows, {
+ main::key($num++,1,1,'API') => 'EGL',
+ });
+ if ($extra < 2){
+ $value = ($data->{'versions'}) ? join(',',sort keys %{$data->{'versions'}}): 'N/A';
+ }
+ else {
+ $value = ($data->{'version'}) ? $data->{'version'}: 'N/A';
+ }
+ $rows->[$j]{main::key($num++,0,2,'v')} = $value;
+ if ($extra < 2){
+ $value = ($data->{'drivers'}) ? join(',',sort keys %{$data->{'drivers'}}): 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'drivers')} = $value;
+ $value = ($data->{'platforms'}{'active'}) ? join(',',@{$data->{'platforms'}{'active'}}) : 'N/A';
+ if ($extra < 1){
+ $rows->[$j]{main::key($num++,0,2,'platforms')} = $value;
}
else {
- $type = 'gl-null';
+ $rows->[$j]{main::key($num++,1,2,'platforms')} = '';
+ $rows->[$j]{main::key($num++,0,3,'active')} = $value;
+ $value = ($data->{'platforms'}{'inactive'}) ? join(',',@{$data->{'platforms'}{'inactive'}}) : 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'inactive')} = $value;
}
- push(@$rows, {
- main::key($$num++,1,1,'API') => 'OpenGL',
- main::key($$num++,0,2,'Message') => main::message($type)
- });
- return;
}
- # print join("\n", @$glxinfo),"\n";
- my $compat_version = '';
- my ($b_compat,$b_nogl,@core_profile_version,@direct_render,@renderer,
- @opengl_version,@working);
- foreach (@$glxinfo){
- next if /^\s/;
- if (/^opengl renderer/i){
- @working = split(/:\s*/, $_, 2);
- if ($working[1]){
- $working[1] = main::clean($working[1]);
+ else {
+ if ($extra > 2 && $data->{'hw'}){
+ $i = 0;
+ $rows->[$j]{main::key($num++,1,2,'hw')} = '';
+ foreach my $key (sort keys %{$data->{'hw'}}){
+ $value = ($key ne $data->{'hw'}{$key}) ? $data->{'hw'}{$key} . ' ' . $key: $key;
+ $rows->[$j]{main::key($num++,0,3,'drv')} = $value;
+ }
+ }
+ $rows->[$j]{main::key($num++,1,2,'platforms')} = '';
+ $data->{'version'} ||= 0;
+ $i = 0;
+ foreach my $key (sort keys %$plat){
+ next if !$plat->{$key}{'status'} || $plat->{$key}{'status'} eq 'inactive';
+ if ($key eq 'device'){
+ foreach my $id (sort keys %{$plat->{$key}}){
+ next if ref $plat->{$key}{$id} ne 'HASH';
+ $rows->[$j]{main::key($num++,1,3,$key)} = $id;
+ $ref = $plat->{$key}{$id}{'egl'};
+ egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'});
+ }
}
- # note: seen cases where gl drivers are missing, with empty field value.
else {
- $b_nogl = 1;
- $working[1] = main::message('gl-value-empty');
+ $rows->[$j]{main::key($num++,1,3,$key)} = '';
+ $ref = $plat->{$key}{'egl'};
+ egl_advanced_output($rows,$ref,\$num,$j,4,$data->{'version'});
}
- push(@renderer, $working[1]);
}
- # dropping all conditions from this test to just show full mesa information
- # there is a user case where not f and mesa apply, atom mobo
- # /opengl version/ && ( f || $2 !~ /mesa/){
- elsif (/^opengl version/i){
- @working = split(/:\s*/, $_, 2);
- if ($working[1]){
- # fglrx started appearing with this extra string, does not appear
- # to communicate anything of value
- $working[1] =~ s/(Compatibility Profile Context|\(Compatibility Profile\))//;
- $working[1] =~ s/\s\s/ /g;
- $working[1] =~ s/^\s+|\s+$//;
- push(@opengl_version, $working[1]);
- # note: this is going to be off if ever multi opengl versions appear,
- # never seen one
- @working = split(/\s+/, $working[1]);
- $compat_version = $working[0];
- }
- elsif (!$b_nogl){
- push(@opengl_version, main::message('gl-value-empty'));
- }
- }
- elsif (/^opengl core profile version/i){
- @working = split(/:\s*/, $_, 2);
- # note: no need to apply empty message here since we don't have the data
- # anyway
- if ($working[1]){
- # fglrx started appearing with this extra string, does not appear
- # to communicate anything of value
- $working[1] =~ s/(Compatibility Profile Context|\((Compatibility|Core) Profile\))//;
- $working[1] =~ s/\s\s/ /g;
- $working[1] =~ s/^\s+|\s+$//;
- push(@core_profile_version, $working[1]);
- }
+ if (!$data->{'platforms'}{'active'}){
+ $rows->[$j]{main::key($num++,0,3,'active')} = 'N/A';
}
- elsif (/direct rendering/){
- @working = split(/:\s*/, $_, 2);
- push(@direct_render, $working[1]);
+ if ($data->{'platforms'}{'inactive'}){
+ $rows->[$j]{main::key($num++,0,3,'inactive')} = join(',',@{$data->{'platforms'}{'inactive'}});
}
- # if -B was always available, we could skip this, but it is not
- elsif (/GLX Visuals/){
- last;
+ }
+ eval $end if $b_log;
+}
+
+# args: 0: $rows; 1: data ref; 2: \$num; 3: $j; 4: indent; 5: $b_plat_v
+sub egl_advanced_output {
+ my ($rows,$ref,$num,$j,$ind,$version) = @_;
+ my $value;
+ # version is set to 0 for math
+ if ($version && (!$ref->{'version'} || $version != $ref->{'version'})){
+ $value = ($ref->{'version'}) ? $ref->{'version'} : 'N/A';
+ $rows->[$j]{main::key($$num++,0,$ind,'egl')} = $value;
+ undef $value;
+ }
+ if ($ref->{'driver'}){
+ $value = $ref->{'driver'};
+ }
+ else {
+ if ($ref->{'vendor'} && $ref->{'vendor'} ne 'mesa'){
+ $value = $ref->{'vendor'};
}
+ $value ||= 'N/A';
}
- my ($direct_render,$renderer,$version) = ('N/A','N/A','N/A');
- $direct_render = join(', ', @direct_render) if @direct_render;
- # non free drivers once filtered and cleaned show the same for core and compat
- # but this stopped for some reason at 4.5/4.6 nvidia
- if (@core_profile_version && @opengl_version &&
- join('', @core_profile_version) ne join('', @opengl_version) &&
- !(grep {/nvidia/i} @opengl_version)){
- @opengl_version = @core_profile_version;
- $b_compat = 1;
+ $rows->[$j]{main::key($$num++,0,$ind,'drv')} = $value;
+}
+
+sub opengl_output {
+ eval $start if $b_log;
+ my ($rows,$gl) = @_;
+ # egl will have set $glx if present
+ if (!$gl->{'glx'}){
+ my $api = 'OpenGL';
+ my $type;
+ if ($b_display){
+ $type = ($b_root) ? 'glx-display-root': 'glx-null';
+ }
+ else {
+ $type = ($b_root) ? 'glx-console-root' : 'glx-console-try';
+ }
+ no_data_output($api,$type,$rows);
+ return 0;
}
- $version = join(', ', @opengl_version) if @opengl_version;
- $renderer = join(', ', @renderer) if @renderer;
- my $j = scalar @$rows;
+ my ($j,$num) = (scalar @$rows,0);
+ my $value;
+ # print join("\n", %$gl),"\n";
+ my $glx = $gl->{'glx'};
+ $glx->{'opengl'}{'version'} ||= 'N/A';
push(@$rows, {
- main::key($$num++,1,1,'API') => 'OpenGL',
- main::key($$num++,0,2,'v') => ($version) ? $version : 'N/A',
- main::key($$num++,1,2,'renderer') => ($renderer) ? $renderer : 'N/A',
+ main::key($num++,1,1,'API') => 'OpenGL',
+ main::key($num++,0,2,'v') => $glx->{'opengl'}{'version'},
});
- if ($b_compat && $extra > 1 && $compat_version){
- $rows->[$j]{main::key($$num++,0,2,'compat-v')} = $compat_version;
+ if ($glx->{'opengl'}{'compatibility'}{'version'}){
+ $rows->[$j]{main::key($num++,0,2,'compat-v')} = $glx->{'opengl'}{'compatibility'}{'version'};
+ }
+ if ($glx->{'opengl'}{'vendor'}){
+ $rows->[$j]{main::key($num++,1,2,'vendor')} = $glx->{'opengl'}{'vendor'};
+ $glx->{'opengl'}{'driver'}{'version'} ||= 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'v')} = $glx->{'opengl'}{'driver'}{'version'};
+ }
+ if ($extra > 0 && $glx->{'glx-version'}){
+ $rows->[$j]{main::key($num++,0,2,'glx-v')} = $glx->{'glx-version'};
+ }
+ if ($extra > 1 && $glx->{'es'}{'version'}){
+ $rows->[$j]{main::key($num++,0,2,'es-v')} = $glx->{'es'}{'version'};;
+ }
+ if ($glx->{'note'}){
+ $rows->[$j]{main::key($num++,0,2,'note')} = $glx->{'note'};
+ }
+ if ($extra > 0 && (!$glx->{'note'} || $glx->{'direct-render'})){
+ $glx->{'direct-render'} ||= 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'direct-render')} = $glx->{'direct-render'};
+ }
+ if (!$glx->{'note'} || $glx->{'opengl'}{'renderer'}){
+ $glx->{'opengl'}{'renderer'} ||= 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'renderer')} = $glx->{'opengl'}{'renderer'};
+ }
+ if ($extra > 1 && $glx->{'info'}){
+ if ($glx->{'info'}{'vendor-id'} && $glx->{'info'}{'device-id'}){
+ $value = $glx->{'info'}{'vendor-id'} . ':' . $glx->{'info'}{'device-id'};
+ $rows->[$j]{main::key($num++,0,2,'device-ID')} = $value;
+ }
+ if ($b_admin && $glx->{'info'}{'device-memory'}){
+ $rows->[$j]{main::key($num++,1,2,'memory')} = $glx->{'info'}{'device-memory'};
+ if ($glx->{'info'}{'unified-memory'}){
+ $rows->[$j]{main::key($num++,0,3,'unified')} = $glx->{'info'}{'unified-memory'};
+ }
+ }
+ # display id depends on xdpyinfo in Display line, which may not be present,
+ if (!$graphics{'display-id'} && $glx->{'display-id'} && $extra > 1){
+ $rows->[$j]{main::key($num++,0,2,'display-ID')} = $glx->{'display-id'};
+ }
+ }
+ eval $end if $b_log;
+}
+
+sub vulkan_output {
+ eval $start if $b_log;
+ my ($program,$rows) = @_;
+ my $vulkan = {};
+ vulkan_data($program,$vulkan);
+ if (!%$vulkan){
+ my $api = 'Vulkan';
+ my $type = 'vulkan-null';
+ no_data_output($api,$type,$rows);
+ return 0;
+ }
+ my $num = 0;
+ my $j = scalar @$rows;
+ my ($value);
+ my $data = $vulkan->{'data'};
+ my $devices = $vulkan->{'devices'};
+ $data->{'version'} ||= 'N/A';
+ push(@$rows,{
+ main::key($num++,1,1,'API') => 'Vulkan',
+ main::key($num++,0,2,'v') => $data->{'version'},
+ });
+ # this will be expanded with -a to a full device report
+ if ($extra < 2){
+ $value = ($data->{'drivers'}) ? join(',',@{$data->{'drivers'}}): 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'drivers')} = $value;
+ }
+ if ($extra > 2){
+ $data->{'layers'} ||= 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'layers')} = $data->{'layers'};
+ }
+ if (!$b_admin){
+ $value = ($data->{'surfaces'}) ? join(',',@{$data->{'surfaces'}}) : 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'surfaces')} = $value;
}
if ($extra > 0){
- $rows->[$j]{main::key($$num++,0,2,'direct-render')} = $direct_render;
+ if (!$devices){
+ $rows->[$j]{main::key($num++,0,2,'devices')} = 'N/A';
+ }
+ else {
+ if ($extra < 2){
+ $value = scalar keys %{$devices};
+ $rows->[$j]{main::key($num++,0,2,'devices')} = $value;
+ }
+ else {
+ foreach my $id (sort keys %$devices){
+ $rows->[$j]{main::key($num++,1,2,'device')} = $id;
+ $devices->{$id}{'device-type'} ||= 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'type')} = $devices->{$id}{'device-type'};
+ if ((($extra == 3 && !$b_admin) ||
+ ($extra > 2 && !$devices->{$id}{'device-name'})) &&
+ $devices->{$id}{'hw'} && $devices->{$id}{'hw'} ne 'nvidia'){
+ $rows->[$j]{main::key($num++,0,3,'hw')} = $devices->{$id}{'hw'};
+ }
+ if ($b_admin){
+ $value = ($devices->{$id}{'device-name'}) ?
+ $devices->{$id}{'device-name'}: 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'name')} = $value;
+ }
+ if ($extra > 1){
+ if ($devices->{$id}{'driver-name'}){
+ $value = $devices->{$id}{'driver-name'};
+ if ($devices->{$id}{'mesa'} && $value ne 'mesa'){
+ $value = 'mesa ' . $value;
+ }
+ $rows->[$j]{main::key($num++,1,3,'driver')} = $value;
+ if ($b_admin && $devices->{$id}{'driver-info'}){
+ $rows->[$j]{main::key($num++,0,4,'v')} = $devices->{$id}{'driver-info'};
+ }
+ }
+ else {
+ $rows->[$j]{main::key($num++,0,3,'driver')} = 'N/A';
+ }
+ $value = ($devices->{$id}{'device-id'} && $devices->{$id}{'vendor-id'}) ?
+ $devices->{$id}{'vendor-id'} . ':' . $devices->{$id}{'device-id'} : 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'device-ID')} = $value;
+ if ($b_admin){
+ $value = ($devices->{$id}{'surfaces'}) ?
+ join(',',@{$devices->{$id}{'surfaces'}}): 'N/A';
+ $rows->[$j]{main::key($num++,0,3,'surfaces')} = $value;
+ }
+ }
+ }
+ }
+ }
}
eval $end if $b_log;
}
sub xvesa_output {
eval $start if $b_log;
- my ($rows,$num) = @_;
+ my ($rows) = @_;
my ($controller,$dac,$interface,$ram,$source,$version);
# note: goes to stderr, not stdout
my @data = main::grabber($graphics{'xvesa'} . ' -listmodes 2>&1');
my $j = scalar @$rows;
+ my $num = 0;
# gop replaced uga, both for uefi
# WARNING! Never seen a GOP type UEFI, needs more data
if ($data[0] && $data[0] =~ /^(VBE|GOP|UGA)\s+version\s+(\S+)\s\(([^)]+)\)/i){
@@ -15820,24 +16075,706 @@ sub xvesa_output {
$ram = main::get_size($ram,'string');
}
if (!$interface){
- $rows->[$j]{main::key($$num++,1,1,'API')} = 'VBE/GOP';
- $rows->[$j]{main::key($$num++,0,2,'Message')} = main::message('gfx-api-xvesa');
+ $rows->[$j]{main::key($num++,1,1,'API')} = 'VBE/GOP';
+ $rows->[$j]{main::key($num++,0,2,'Message')} = main::message('xvesa-null');
}
else {
- $rows->[$j]{main::key($$num++,1,1,'API')} = $interface;
- $rows->[$j]{main::key($$num++,0,2,'v')} = ($version) ? $version : 'N/A';
- $rows->[$j]{main::key($$num++,0,2,'source')} = ($source) ? $source : 'N/A';
+ $rows->[$j]{main::key($num++,1,1,'API')} = $interface;
+ $rows->[$j]{main::key($num++,0,2,'v')} = ($version) ? $version : 'N/A';
+ $rows->[$j]{main::key($num++,0,2,'source')} = ($source) ? $source : 'N/A';
if ($dac){
- $rows->[$j]{main::key($$num++,0,2,'dac')} = $dac;
- $rows->[$j]{main::key($$num++,0,2,'controller')} = $controller;
+ $rows->[$j]{main::key($num++,0,2,'dac')} = $dac;
+ $rows->[$j]{main::key($num++,0,2,'controller')} = $controller;
}
if ($ram){
- $rows->[$j]{main::key($$num++,0,2,'ram')} = $ram;
+ $rows->[$j]{main::key($num++,0,2,'ram')} = $ram;
+ }
+ }
+ eval $end if $b_log;
+}
+
+# API Data #
+sub gl_data {
+ eval $start if $b_log;
+ my ($source,$program,$rows,$gl) = @_;
+ my ($b_opengl,$msg);
+ my ($gl_data,$results) = ([],[]);
+ # only check these if no eglinfo or eglinfo had no opengl data
+ $b_opengl = 1 if ($source eq 'egl' || !$gl->{'glx'});
+ # NOTE: glxinfo -B is not always available, unfortunately
+ if ($dbg[56] || $b_log){
+ $msg = "${line1}GL Source: $source\n${line3}";
+ print $msg if $dbg[56];
+ push(@$results,$msg) if $b_log;
+ }
+ if ($source eq 'glx'){
+ if (!$fake{'glx'}){
+ $gl_data = main::grabber("$program $display_opt 2>/dev/null",'','','ref');
+ }
+ else {
+ my $file;
+ # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-2012-nvidia-glx1.4.txt";
+ # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-ssh-centos.txt";
+ # $file = "$fake_data_dir/graphics/glxinfo/glxiinfo-t420-intel-1.txt";
+ # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-mali-allwinner-lima-1.txt";
+ # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-partial-intel-5500-1.txt";
+ # $file = "$fake_data_dir/graphics/glxinfo/glxinfo-vbox-debian-etch-1.txt";
+ $file = "$fake_data_dir/graphics/glxinfo/glxinfo-x11-neomagic-lenny-1.txt";
+ $file = "$fake_data_dir/graphics/glxinfo/glxinfo-nvidia-gl4.6-chr.txt";
+ $file = "$fake_data_dir/graphics/glxinfo/glxinfo-intel-atom-dell_studio-bm.txt";
+ $file = "$fake_data_dir/graphics/glxinfo/glxinfo-asus_1025c-atom-bm.txt";
+ $gl_data= main::reader($file,'','ref');
+ }
+ }
+ else {
+ if (!$fake{'egl'}){
+ $gl_data = main::grabber("$program 2>/dev/null",'','','ref');
+ }
+ else {
+ my $file;
+ $file = "$fake_data_dir/graphics/egl-es/eglinfo-x11-3.txt";
+ # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-c30.txt";
+ # $file = "$fake_data_dir/grapOhics/egl-es/eglinfo-2022-x11-nvidia-egl1.5.txt";
+ # $file = "$fake_data_dir/graphics/egl-es/eglinfo-wayland-intel-nvidia-radu.txt";
+ $file = "$fake_data_dir/graphics/egl-es/eglinfo-intel-atom-dell_studio-bm.txt";
+ $file = "$fake_data_dir/graphics/egl-es/eglinfo-asus_1025c-atom-bm.txt";
+ $gl_data = main::reader($file,'','ref');
+ }
+ }
+ # print join("\n", @$gl_data),"\n";
+ if (!$gl_data || !@$gl_data){
+ if ($dbg[56] || $b_log){
+ $msg = "No data found for GL Source: $source" if $dbg[56];
+ print "$msg\n" if $dbg[56];
+ push(@$results,$msg) if $b_log;
}
+ return 0;
+ }
+ # some error cases have only a few top value but not empty
+ elsif ($source eq 'glx' && scalar @$gl_data > 5){
+ $gl->{'glx'}{'source'} = $source;
+ }
+ set_mesa_drivers() if $source eq 'egl' && !%mesa_drivers;
+ my ($b_device,$b_platform,$b_mem_info,$b_rend_info,$device,$platform,
+ $value,$value2,@working);
+ foreach my $line (@$gl_data){
+ next if (!$b_rend_info && !$b_mem_info) && $line =~ /^(\s|0x)/;
+ if (($b_rend_info || $b_mem_info) && $line =~ /^\S/){
+ ($b_mem_info,$b_rend_info) = ();
+ }
+ @working = split(/\s*:\s*/,$line,2);
+ next if !@working;
+ if ($dbg[56] || $b_log){
+ $msg = $line;
+ print "$msg\n" if $dbg[56];
+ push(@$results,$msg) if $b_log;
+ }
+ if ($source eq 'egl'){
+ # eglinfo: eglInitialize failed
+ # This is first line after platform fail for devices, but for Device
+ # it would be the second or later line. The Device platform can fail, or
+ # specific device can fail
+ if ($b_platform){
+ $value = ($line =~ /Initialize failed/) ? 'inactive': 'active';
+ push(@{$gl->{'egl'}{'data'}{'platforms'}{$value}},$platform);
+ $gl->{'egl'}{'platforms'}{$platform}{'status'} = $value;
+ $b_platform = 0;
+ }
+ # note: can be sub item: Platform Device platform:; Platform Device:
+ elsif ($working[0] =~ /^(\S+) platform/i){
+ $platform = lc($1);
+ undef $device;
+ $b_platform = 1;
+ }
+ if ($platform && defined $device && $working[0] eq 'eglinfo'){
+ push(@{$gl->{'egl'}{'data'}{'platforms'}{'inactive'}},"$platform-$device");
+ undef $device;
+ }
+ if ($platform && $platform eq 'device' && $working[0] =~ /^Device #(\d+)/){
+ $device = $1;
+ }
+ if ($working[0] eq 'EGL API version'){
+ if (!defined $platform){
+ $gl->{'egl'}{'data'}{'api-version'} = $working[1];
+ }
+ elsif (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'api-version'} = $working[1];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'api-version'} = $working[1];
+ }
+ }
+ elsif ($working[0] eq 'EGL version string'){
+ if (!defined $platform){
+ $gl->{'egl'}{'data'}{'version'} = $working[1];
+ }
+ elsif (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'version'} = $working[1];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'version'} = $working[1];
+ }
+ $value = (defined $device) ? "$platform-$device": $platform;
+ push(@{$gl->{'egl'}{'data'}{'versions'}{$working[1]}},$value);
+ if (!$gl->{'egl'}{'data'}{'version'} ||
+ $working[1] > $gl->{'egl'}{'data'}{'version'}){
+ $gl->{'egl'}{'data'}{'version'} = $working[1];
+ }
+ }
+ elsif ($working[0] eq 'EGL vendor string'){
+ $working[1] = lc($working[1]);
+ $working[1] =~ s/^(\S+)(\s.+|$)/$1/;
+ if (!defined $platform){
+ $gl->{'egl'}{'data'}{'vendor'} = $working[1];
+ }
+ elsif (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'vendor'} = $working[1];
+ if ($working[1] eq 'nvidia'){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1];
+ }
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'vendor'} = $working[1];
+ if ($working[1] eq 'nvidia'){
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1];
+ }
+ }
+ push(@{$gl->{'egl'}{'data'}{'vendors'}},$working[1]);
+ if ($working[1] eq 'nvidia'){
+ $value = (defined $device) ? "$platform-$device": $platform;
+ push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value);
+ $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $working[1];
+ }
+ }
+ elsif ($working[0] eq 'EGL driver name'){
+ if (!defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'driver'} = $working[1];
+ if ($mesa_drivers{$working[1]}){
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'hw'} = $mesa_drivers{$working[1]};
+ }
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'driver'} = $working[1];
+ if ($mesa_drivers{$working[1]}){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'hw'} = $mesa_drivers{$working[1]};
+ }
+ }
+ $value = (defined $device) ? "$platform-$device": $platform;
+ push(@{$gl->{'egl'}{'data'}{'drivers'}{$working[1]}},$value);
+ if ($mesa_drivers{$working[1]}){
+ $gl->{'egl'}{'data'}{'hw'}{$working[1]} = $mesa_drivers{$working[1]};
+ }
+ }
+ if ($working[0] eq 'EGL client APIs'){
+ if (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'egl'}{'client-apis'} = [split(/\s+/,$working[1])];
+ }
+ }
+ }
+ # glx specific values, only found in glxinfo
+ else {
+ if (lc($working[0]) eq 'direct rendering'){
+ $working[1] = lc($working[1]);
+ if (!$gl->{'glx'}{'direct-renderers'} ||
+ !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'direct-renders'}})){
+ push(@{$gl->{'glx'}{'direct-renders'}}, $working[1]);
+ }
+ }
+ # name of display: does not always list the screen number
+ elsif (lc($working[0]) eq 'display'){
+ if ($working[1] =~ /^(:\d+)\s+screen:\s+(\d+)/){
+ $gl->{'glx'}{'display-id'} = $1 . '.' . $2;
+ }
+ }
+ elsif (lc($working[0]) eq 'glx version'){
+ if (!$gl->{'glx'}{'glx-version'}){
+ $gl->{'glx'}{'glx-version'} = $working[1];
+ }
+ }
+ elsif (!$b_rend_info && $working[0] =~ /^Extended renderer info/i){
+ $b_rend_info = 1;
+ }
+ # only check Memory info if no prior device memory found
+ elsif (!$b_mem_info && $working[0] =~ /^Memory info/i){
+ $b_mem_info = (!$gl->{'glx'}{'info'} || !$gl->{'glx'}{'info'}{'device-memory'}) ? 1 : 0;
+ }
+ elsif ($b_rend_info){
+ if ($line =~ /^\s+Vendor:\s+.*?\(0x([\da-f]+)\)$/){
+ $gl->{'glx'}{'info'}{'vendor-id'} = sprintf("%04s",$1);
+ }
+ elsif ($line =~ /^\s+Device:\s+.*?\(0x([\da-f]+)\)$/){
+ $gl->{'glx'}{'info'}{'device-id'} = sprintf("%04s",$1);
+ }
+ elsif ($line =~ /^\s+Video memory:\s+(\d+\s?[MG]B)$/){
+ my $size = main::translate_size($1);
+ $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string');
+ }
+ elsif ($line =~ /^\s+Unified memory:\s+(\S+)$/){
+ $gl->{'glx'}{'info'}{'unified-memory'} = lc($1);
+ }
+ }
+ elsif ($b_mem_info){
+ # fallback, nvidia does not seem to have Extended renderer info
+ if ($line =~ /^\s+Dedicated video memory:\s+(\d+\s?[MG]B)$/){
+ my $size = main::translate_size($1);
+ $gl->{'glx'}{'info'}{'device-memory'} = main::get_size($size,'string');
+ $b_mem_info = 0;
+ }
+ # we're in the wrong memory block!
+ elsif ($line =~ /^\s+(VBO|Texture)/){
+ $b_mem_info = 0;
+ }
+ }
+ elsif (lc($working[0]) eq 'opengl vendor string'){
+ if ($working[1] =~ /^([^\s]+)(\s+\S+)?/){
+ my $vendor = lc($1);
+ $vendor =~ s/(^mesa\/|[\.,]$)//; # Seen Mesa/X.org
+ if (!$gl->{'glx'}{'opengl'}{'vendor'}){
+ $gl->{'glx'}{'opengl'}{'vendor'} = $vendor;
+ }
+ }
+ }
+ elsif (lc($working[0]) eq 'opengl renderer string'){
+ if ($working[1]){
+ $working[1] = main::clean($working[1]);
+ }
+ # note: seen cases where gl drivers are missing, with empty field value.
+ else {
+ $gl->{'glx'}{'no-gl'} = 1;
+ $working[1] = main::message('glx-value-empty');
+ }
+ if (!$gl->{'glx'}{'opengl'}{'renderers'} ||
+ !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{'renderers'}})){
+ push(@{$gl->{'glx'}{'opengl'}{'renderers'}}, $working[1]) ;
+ }
+ }
+ # Dropping all conditions from this test to just show full mesa information
+ # there is a user case where not f and mesa apply, atom mobo
+ # This can be the compatibility version, or just the version the hardware
+ # supports. Core version will override always if present.
+ elsif (lc($working[0]) eq 'opengl version string'){
+ if ($working[1]){
+ # first grab the actual gl version
+ # non free drivers like nvidia may only show their driver version info
+ if ($working[1] =~ /^(\S+)(\s|$)/){
+ push(@{$gl->{'glx'}{'opengl'}{'versions'}}, $1);
+ }
+ # handle legacy format: 1.2 (1.5 Mesa 6.5.1) as well as more current:
+ # 4.5 (Compatibility Profile) Mesa 22.3.6
+ # Note: legacy: fglrx starting adding compat strings but they don't
+ # change this result:
+ # 4.5 Compatibility Profile Context Mesa 15.3.6
+ if ($working[1] =~ /(Mesa|NVIDIA)\s(\S+?)\)?$/i){
+ if ($1 && $2 && !$gl->{'glx'}{'opengl'}{'driver'}){
+ $gl->{'glx'}{'opengl'}{'driver'}{'vendor'} = lc($1);
+ $gl->{'glx'}{'opengl'}{'driver'}{'version'} = $2;
+ }
+ }
+ }
+ elsif (!$gl->{'glx'}{'no-gl'}){
+ $gl->{'glx'}{'no-gl'} = 1;
+ push(@{$gl->{'glx'}{'opengl'}{'versions'}},main::message('glx-value-empty'));
+ }
+ }
+ # if -B was always available, we could skip this, but it is not
+ elsif ($line =~ /GLX Visuals/){
+ last;
+ }
+ }
+ # eglinfo/glxinfo share these
+ if ($b_opengl){
+ if ($working[0] =~ /^OpenGL (compatibility|core) profile version( string)?$/){
+ $value = lc($1);
+ # note: no need to apply empty message here since we don't have the data
+ # anyway
+ if ($working[1]){
+ # non free drivers like nvidia only show their driver version info
+ if ($working[1] =~ /^(\S+)(\s|$)/){
+ push(@{$gl->{'glx'}{'opengl'}{$value}{'versions'}}, $1);
+ }
+ # fglrx started appearing with this extra string, does not appear
+ # to communicate anything of value
+ if ($working[1] =~ /\s+(Mesa|NVIDIA)\s+(\S+)$/){
+ if ($1 && $2 && !$gl->{'glx'}{'opengl'}{$value}{'vendor'}){
+ $gl->{'glx'}{'opengl'}{$value}{'driver'}{'vendor'} = lc($1);
+ $gl->{'glx'}{'opengl'}{$value}{'driver'}{'version'} = $2;
+ }
+ if ($source eq 'egl' && $platform){
+ if (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = lc($1);
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'version'} = $2;
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = lc($1);
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'version'} = $2;
+ }
+ }
+ }
+ }
+ }
+ elsif ($working[0] =~ /^OpenGL (compatibility|core) profile renderer?$/){
+ $value = lc($1);
+ if ($working[1]){
+ $working[1] = main::clean($working[1]);
+ }
+ # note: seen cases where gl drivers are missing, with empty field value.
+ else {
+ $gl->{'glx'}{'no-gl'} = 1;
+ $working[1] = main::message('glx-value-empty');
+ }
+ if (!$gl->{'glx'}{'opengl'}{$value}{'renderers'} ||
+ !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'renderers'}})){
+ push(@{$gl->{'glx'}{'opengl'}{$value}{'renderers'}}, $working[1]) ;
+ }
+ if ($source eq 'egl' && $platform){
+ if ($value eq 'core'){
+ $value2 = (defined $device) ? "$platform-$device": $platform;
+ push(@{$gl->{'egl'}{'data'}{'renderers'}{$working[1]}},$value2);
+ }
+ if (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'renderer'} = $working[1];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'renderer'} = $working[1];
+ }
+ }
+ }
+ elsif ($working[0] =~ /^OpenGL (compatibility|core) profile vendor$/){
+ $value = lc($1);
+ if (!$gl->{'glx'}{'opengl'}{$value}{'vendors'} ||
+ !(grep {$_ eq $working[1]} @{$gl->{'glx'}{'opengl'}{$value}{'vendors'}})){
+ push(@{$gl->{'glx'}{'opengl'}{$value}{'vendors'}}, $working[1]) ;
+ }
+ if ($source eq 'egl' && $platform){
+ if (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{$value}{'vendor'} = $working[1];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{$value}{'vendor'} = $working[1];
+ }
+
+ }
+ }
+ elsif (lc($working[0]) eq 'opengl es profile version string'){
+ if ($working[1] && !$gl->{'glx'}{'es-version'}){
+ # OpenGL ES 3.2 Mesa 23.0.3
+ if ($working[1] =~ /^OpenGL ES (\S+) Mesa (\S+)/){
+ $gl->{'glx'}{'es'}{'version'} = $1;
+ if ($2 && !$gl->{'glx'}{'es'}{'mesa-version'}){
+ $gl->{'glx'}{'es'}{'mesa-version'} = $2;
+ }
+ if ($source eq 'egl' && $platform){
+ if (defined $device){
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'vendor'} = 'mesa';
+ $gl->{'egl'}{'platforms'}{$platform}{$device}{'opengl'}{'es'}{'version'} = $working[1];
+ }
+ else {
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'vendor'} = 'mesa';
+ $gl->{'egl'}{'platforms'}{$platform}{'opengl'}{'es'}{'version'} = $working[1];
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ main::log_data('dump',"$source \$results",$results) if $b_log;
+ if ($source eq 'egl'){
+ print "GL Data: $source: ", Data::Dumper::Dumper $gl if $dbg[57];
+ main::log_data('dump',"GL data: $source:",$gl) if $b_log;
+ }
+ else {
+ print "GL Data: $source: ", Data::Dumper::Dumper $gl->{'glx'} if $dbg[57];
+ main::log_data('dump',"GLX data: $source:",$gl->{'glx'}) if $b_log;
}
eval $end if $b_log;
}
+sub process_glx_data {
+ eval $start if $b_log;
+ my ($glx,$b_glx) = @_;
+ my $value;
+ # Remember: if you test for a hash ref hash ref, you create the first hash ref!
+ if ($glx->{'direct-renders'}){
+ $glx->{'direct-render'} = join(', ', @{$glx->{'direct-renders'}});
+ }
+ if (!$glx->{'opengl'}{'renderers'} && $glx->{'opengl'}{'compatibility'} &&
+ $glx->{'opengl'}{'compatibility'}{'renderers'}){
+ $glx->{'opengl'}{'renderers'} = $glx->{'opengl'}{'compatibility'}{'renderers'};
+ }
+ # This is tricky, GLX OpenGL version string can be compatibility version,
+ # but usually they are the same. Just in case, try this. Note these are
+ # x.y.z type numbering formats generally so use string compare
+ if ($glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'versions'}){
+ $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'core'}{'versions'}})[-1];
+ }
+ elsif ($glx->{'opengl'}{'versions'}){
+ $glx->{'opengl'}{'version'} = (sort @{$glx->{'opengl'}{'versions'}})[-1];
+ }
+ if ($glx->{'opengl'}{'version'} &&
+ ($glx->{'opengl'}{'compatibility'} || $glx->{'opengl'}{'versions'})){
+ # print "v: $glx->{'opengl'}{'version'}\n";
+ # print Data::Dumper::Dumper $glx->{'opengl'}{'versions'};
+ # print 'v1: ', (sort @{$glx->{'opengl'}{'versions'}})[0], "\n";
+ # here we look for different versions, and determine most likely compat one
+ if ($glx->{'opengl'}{'compatibility'} &&
+ $glx->{'opengl'}{'compatibility'}{'versions'} &&
+ (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){
+ $value = (sort @{$glx->{'opengl'}{'compatibility'}{'versions'}})[0];
+ $glx->{'opengl'}{'compatibility'}{'version'} = $value;
+ }
+ elsif ($glx->{'opengl'}{'versions'} &&
+ (sort @{$glx->{'opengl'}{'versions'}})[0] ne $glx->{'opengl'}{'version'}){
+ $value = (sort @{$glx->{'opengl'}{'versions'}})[0];
+ $glx->{'opengl'}{'compatibility'}{'version'} = $value;
+ }
+ }
+ if ($glx->{'opengl'}{'renderers'}){
+ $glx->{'opengl'}{'renderer'} = join(', ', @{$glx->{'opengl'}{'renderers'}});
+ }
+ # likely eglinfo or advanced glxinfo
+ if ($glx->{'opengl'}{'vendor'} &&
+ $glx->{'opengl'}{'core'} &&
+ $glx->{'opengl'}{'core'}{'driver'} &&
+ $glx->{'opengl'}{'core'}{'driver'}{'vendor'} &&
+ $glx->{'opengl'}{'core'}{'driver'}{'vendor'} eq 'mesa' &&
+ $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){
+ $value = $glx->{'opengl'}{'vendor'} . ' ';
+ $value .= $glx->{'opengl'}{'core'}{'driver'}{'vendor'};
+ $glx->{'opengl'}{'vendor'} = $value;
+ }
+ # this can be glxinfo only case, no eglinfo
+ elsif ($glx->{'opengl'}{'vendor'} &&
+ $glx->{'opengl'}{'driver'} &&
+ $glx->{'opengl'}{'driver'}{'vendor'} &&
+ $glx->{'opengl'}{'driver'}{'vendor'} eq 'mesa' &&
+ $glx->{'opengl'}{'vendor'} ne $glx->{'opengl'}{'driver'}{'vendor'}){
+ $value = $glx->{'opengl'}{'vendor'} . ' ';
+ $value .= $glx->{'opengl'}{'driver'}{'vendor'};
+ $glx->{'opengl'}{'vendor'} = $value;
+ }
+ elsif (!$glx->{'opengl'}{'vendor'} &&
+ $glx->{'opengl'}{'core'} && $glx->{'opengl'}{'core'}{'driver'} &&
+ $glx->{'opengl'}{'core'}{'driver'}{'vendor'}){
+ $glx->{'opengl'}{'vendor'} = $glx->{'opengl'}{'core'}{'driver'}{'vendor'};
+ }
+ if ((!$glx->{'opengl'}{'driver'} ||
+ !$glx->{'opengl'}{'driver'}{'version'}) &&
+ $glx->{'opengl'}{'core'} &&
+ $glx->{'opengl'}{'core'}{'driver'} &&
+ $glx->{'opengl'}{'core'}{'driver'}{'version'}){
+ $value = $glx->{'opengl'}{'core'}{'driver'}{'version'};
+ $glx->{'opengl'}{'driver'}{'version'} = $value;
+ }
+ # only tripped when glx filled by eglinfo
+ if (!$glx->{'source'}){
+ my $type;
+ if (!$b_glx){
+ $type = 'glx-egl-missing';
+ }
+ elsif ($b_display){
+ $type = 'glx-egl';
+ }
+ else {
+ $type = 'glx-egl-console';
+ }
+ $glx->{'note'} = main::message($type);
+ }
+ print "GLX Data: ", Data::Dumper::Dumper $glx if $dbg[57];
+ main::log_data('dump',"GLX data:",$glx) if $b_log;
+ eval $end if $b_log;
+}
+
+sub vulkan_data {
+ eval $start if $b_log;
+ my ($program,$vulkan) = @_;
+ my ($data,$msg,@working);
+ my ($results) = ([]);
+ if ($dbg[56] || $b_log){
+ $msg = "${line1}Vulkan Data\n${line3}";
+ print $msg if $dbg[56];
+ push(@$results,$msg) if $b_log;
+ }
+ if (!$fake{'vulkan'}){
+ $data = main::grabber("$program 2>/dev/null",'','','ref');
+ }
+ else {
+ my $file;
+ $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-llvm-1.txt";
+ $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-nvidia-1.txt";
+ $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-intel-1.txt";
+ $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-amd-dz.txt";
+ $file = "$fake_data_dir/graphics/vulkan/vulkaninfo-mali-3.txt";
+ $data = main::reader($file,'','ref');
+ }
+ if (!$data){
+ if ($dbg[56] || $b_log){
+ $msg = "No Vulkan data found" if $dbg[56];
+ print "$msg\n" if $dbg[56];
+ push(@$results,$msg) if $b_log;
+ }
+ return 0;
+ }
+ set_mesa_drivers() if !%mesa_drivers;
+ my ($id,%active);
+ foreach my $line (@$data){
+ next if $line =~ /^(\s*|-+|=+)$/;
+ @working = split(/\s*:\s*/,$line,2);
+ next if !@working;
+ if ($line =~ /^\S/){
+ if ($active{'start'}){undef $active{'start'}}
+ if ($active{'layers'}){undef $active{'layers'}}
+ if ($active{'groups'}){undef $active{'groups'}}
+ if ($active{'limits'}){undef $active{'limits'}}
+ if ($active{'features'}){undef $active{'features'}}
+ if ($active{'extensions'}){undef $active{'extensions'}}
+ if ($active{'format'}){undef $active{'format'}}
+ if ($active{'driver'}){($active{'driver'},$id) = ()}
+ }
+ next if $active{'start'};
+ next if $active{'groups'};
+ next if $active{'limits'};
+ next if $active{'features'};
+ next if $active{'extensions'};
+ next if $active{'format'};
+ if ($dbg[56] || $b_log){
+ $msg = $line;
+ print "$msg\n" if $dbg[56];
+ push(@$results,$msg) if $b_log;
+ }
+ if ($working[0] eq 'Vulkan Instance Version'){
+ $vulkan->{'data'}{'version'} = $working[1];
+ $active{'start'} = 1;
+ }
+ elsif ($working[0] eq 'Layers'){
+ if ($working[1] =~ /count\s*=\s*(\d+)/){
+ $vulkan->{'data'}{'layers'} = $1;
+ }
+ $active{'layers'} = 1;
+ }
+ # note: can't close this because Intel didn't use proper indentation
+ elsif ($working[0] eq 'Presentable Surfaces'){
+ $active{'surfaces'} = 1;
+ }
+ elsif ($working[0] eq 'Device Groups'){
+ $active{'groups'} = 1;
+ $active{'surfaces'} = 0;
+ }
+ elsif ($working[0] eq 'Device Properties and Extensions'){
+ $active{'devices'} = 1;
+ $active{'surfaces'} = 0;
+ undef $id;
+ }
+ elsif ($working[0] eq 'VkPhysicalDeviceProperties'){
+ $active{'props'} = 1;
+ }
+ elsif ($working[0] eq 'VkPhysicalDeviceDriverProperties'){
+ $active{'driver'} = 1;
+ }
+ elsif ($working[0] =~ /^\S+Features/i){
+ $active{'features'} = 1;
+ }
+ # seen as line starter string or inner VkPhysicalDeviceProperties
+ elsif ($working[0] =~ /^\s*\S+Limits/i){
+ $active{'limits'} = 1;
+ }
+ elsif ($working[0] =~ /^FORMAT_/){
+ $active{'format'} = 1;
+ }
+ elsif ($working[0] =~ /^(Device|Instance) Extensions/){
+ $active{'extensions'} = 1;
+ }
+ if ($active{'surfaces'}){
+ if ($working[0] eq 'GPU id'){
+ if ($working[1] =~ /^(\d+)\s+\((.*?)\):?$/){
+ $id = $1;
+ $vulkan->{'devices'}{$id}{'model'} = main::clean($2);
+ }
+ }
+ if (defined $id){
+ # seen leading space, no leading space
+ if ($line =~ /^\s*Surface type/){
+ $active{'surface-type'} = 1;
+ }
+ if ($active{'surface-type'} && $line =~ /\S+_(\S+)_surface$/){
+ if (!$vulkan->{'devices'}{$id}{'surfaces'} ||
+ !(grep {$_ eq $1} @{$vulkan->{'devices'}{$id}{'surfaces'}})){
+ push(@{$vulkan->{'devices'}{$id}{'surfaces'}},$1);
+ }
+ if (!$vulkan->{'data'}{'surfaces'} ||
+ !(grep {$_ eq $1} @{$vulkan->{'data'}{'surfaces'}})){
+ push(@{$vulkan->{'data'}{'surfaces'}},$1);
+ }
+ }
+ if ($working[0] =~ /^\s*Formats/){
+ undef $active{'surface-type'};
+ }
+ }
+ }
+ if ($active{'devices'}){
+ if ($working[0] =~ /^GPU(\d+)/){
+ $id = $1;
+ }
+ elsif (defined $id){
+ # apiVersion=4194528 (1.0.224); 1.3.246 (4206838); 79695971 (0x4c01063)
+ if ($line =~ /^\s+apiVersion\s*=\s*(\S+)(\s+\(([^)]+)\))?/i){
+ my ($a,$b) = ($1,$3);
+ my $api = (!$b || $b =~ /^(0x)?\d+$/) ? $a : $b;
+ $vulkan->{'devices'}{$id}{'device-api-version'} = $api;
+ }
+ elsif ($line =~ /^\s+driverVersion\s*=\s*(\S+)/i){
+ $vulkan->{'devices'}{$id}{'device-driver-version'} = $1;
+ }
+ elsif ($line =~ /^\s+vendorID\s*=\s*0x(\S+)/i){
+ $vulkan->{'devices'}{$id}{'vendor-id'} = $1;
+ }
+ elsif ($line =~ /^\s+deviceID\s*=\s*0x(\S+)/i){
+ $vulkan->{'devices'}{$id}{'device-id'} = $1;
+ }
+ # deviceType=DISCRETE_GPU; PHYSICAL_DEVICE_TYPE_DISCRETE_GPU
+ elsif ($line =~ /^\s+deviceType\s*=\s*(\S+?_TYPE_)?(\S+)$/i){
+ $vulkan->{'devices'}{$id}{'device-type'} = lc($2);
+ $vulkan->{'devices'}{$id}{'device-type'} =~ s/_/-/g;
+ }
+ # deviceName=AMD Radeon RX 6700 XT (RADV NAVI22); AMD RADV HAWAII
+ # lvmpipe (LLVM 15.0.6, 256 bits); NVIDIA GeForce GTX 1650 Ti
+ elsif ($line =~ /^\s+deviceName\s*=\s*(\S+)(\s.*|$)/i){
+ $vulkan->{'devices'}{$id}{'device-vendor'} = main::clean(lc($1));
+ $vulkan->{'devices'}{$id}{'device-name'} = main::clean($1 . $2);
+ }
+ }
+ }
+ if ($active{'driver'}){
+ if (defined $id){
+ # driverName=llvmpipe; radv;
+ if ($line =~ /^\s+driverName\s*=\s*(\S+)(\s|$)/i){
+ my $driver = lc($1);
+ if ($mesa_drivers{$driver}){
+ $vulkan->{'devices'}{$id}{'hw'} = $mesa_drivers{$driver};
+ }
+ $vulkan->{'devices'}{$id}{'driver-name'} = $driver;
+ if (!$vulkan->{'data'}{'drivers'} ||
+ !(grep {$_ eq $driver} @{$vulkan->{'data'}{'drivers'}})){
+ push(@{$vulkan->{'data'}{'drivers'}},$driver);
+ }
+ }
+ # driverInfo=Mesa 23.1.3 (LLVM 15.0.7); 525.89.02; Mesa 23.1.3
+ elsif ($line =~ /^\s+driverInfo\s*=\s*((Mesa)\s)?(.*)/i){
+ $vulkan->{'devices'}{$id}{'mesa'} = lc($2) if $2;
+ $vulkan->{'devices'}{$id}{'driver-info'} = $3;
+ }
+ }
+ }
+ }
+ main::log_data('dump','$results',$results) if $b_log;
+ print 'Vulkan Data: ', Data::Dumper::Dumper $vulkan if $dbg[57];
+ main::log_data('dump','$vulkan',$vulkan) if $b_log;
+ eval $end if $b_log;
+}
+
## DISPLAY DATA WAYLAND ##
sub display_data_wayland {
eval $start if $b_log;
@@ -15968,7 +16905,7 @@ sub wlinfo_data {
$data = main::grabber("$program 2>/dev/null",'','strip','ref');
}
else {
- $file = "$fake_data_dir/wayland/weston-info-2-mon-1.txt";
+ $file = "$fake_data_dir/graphics/wayland/weston-info-2-mon-1.txt";
$data = main::reader($file,'strip','ref');
}
print 'wayland/weston-info raw: ', Data::Dumper::Dumper $data if $dbg[46];
@@ -16103,7 +17040,7 @@ sub swaymsg_data {
}
else {
undef $monitor_ids;
- $file = "$fake_data_dir/wayland/swaymsg-2-monitor-1.txt";
+ $file = "$fake_data_dir/graphics/wayland/swaymsg-2-monitor-1.txt";
@data = main::reader($file,'strip');
}
print 'swaymsg: ', Data::Dumper::Dumper \@data if $dbg[46];
@@ -16217,7 +17154,7 @@ sub wlrrandr_data {
}
else {
undef $monitor_ids;
- $file = "$fake_data_dir/wayland/wlr-randr-2-monitor-1.txt";
+ $file = "$fake_data_dir/graphics/wayland/wlr-randr-2-monitor-1.txt";
$data = main::reader($file,'strip','ref');
}
foreach (@$data){
@@ -16904,6 +17841,29 @@ sub display_drivers_x {
# print 'source: ', Data::Dumper::Dumper $driver_data;
return $driver_data;
}
+sub set_mesa_drivers {
+ %mesa_drivers = (
+ 'anv' => 'intel',
+ 'crocus' => 'intel',
+ 'etnaviv' => 'vivante',
+ 'freedreno' => 'qualcomm',
+ 'i915' => 'intel',
+ 'i965' => 'intel',
+ 'iris' => 'intel',
+ 'lima' => 'mali',
+ 'nouveau' => 'nvidia',
+ 'panfrost' => 'mali/bifrost',
+ 'r200' => 'amd',
+ 'r300' => 'amd',
+ 'r600' => 'amd',
+ 'radeonsi' => 'amd',
+ 'radv' => 'amd',
+ 'svga3d' => 'vmware',
+ 'v3d' => 'broadcom',
+ 'v3dv' => 'broadcom',
+ 'vc4' => 'broadcom',
+ );
+}
## GPU DATA ##
sub set_amd_data {
@@ -17570,7 +18530,7 @@ sub set_nv_data {
'1f07|1f08|1f0a|1f0b|1f10|1f11|1f12|1f14|1f15|1f36|1f42|1f47|1f50|1f51|1f54|' .
'1f55|1f76|1f82|1f83|1f91|1f95|1f96|1f97|1f98|1f99|1f9c|1f9d|1f9f|1fa0|1fb0|' .
'1fb1|1fb2|1fb6|1fb7|1fb8|1fb9|1fba|1fbb|1fbc|1fdd|1ff0|1ff2|1ff9|2182|2184|' .
- '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8',
+ '2187|2188|2189|2191|2192|21c4|21d1|25a6|25a7|25a9|25aa|25ad|25ed|28b8|28f8',
'code' => 'TUxxx',
'kernel' => '',
'legacy' => 0,
@@ -17582,12 +18542,12 @@ sub set_nv_data {
'years' => '2018-22',
},
{'arch' => 'Ampere',
- 'ids' => '20b0|20b2|20b3|20b5|20b7|20f1|20f3|20f5|2203|2204|2206|2207|2208|' .
- '220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|2438|2460|' .
- '2482|2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|24b7|24b8|' .
- '24b9|24ba|24bb|24c7|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|2520|2521|' .
- '2523|2531|2544|2560|2563|2571|2582|25a0|25a2|25a5|25ab|25ac|25b6|25b8|25b9|' .
- '25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838',
+ 'ids' => '20b0|20b2|20b3|20b5|20b7|20bd|20f1|20f3|20f5|20f6|2203|2204|2206|' .
+ '2207|2208|220a|220d|2216|2230|2231|2232|2233|2235|2236|2237|2238|2414|2420|' .
+ '2438|2460|2482|2484|2486|2487|2488|2489|248a|249c|249d|24a0|24b0|24b1|24b6|' .
+ '24b7|24b8|24b9|24ba|24bb|24c7|24c9|24dc|24dd|24e0|24fa|2503|2504|2507|2508|' .
+ '2520|2521|2523|2531|2544|2560|2563|2571|2582|25a0|25a2|25a5|25ab|25ac|25b6|' .
+ '25b8|25b9|25ba|25bb|25bc|25bd|25e0|25e2|25e5|25ec|25f9|25fa|25fb|2838',
'code' => 'GAxxx',
'kernel' => '',
'legacy' => 0,
@@ -17596,10 +18556,10 @@ sub set_nv_data {
'series' => '535.xx+',
'status' => $status_current,
'xorg' => '',
- 'years' => '2020-22',
+ 'years' => '2020-23',
},
{'arch' => 'Hopper',
- 'ids' => '2330|2331|2339',
+ 'ids' => '2321|2330|2331|2339',
'code' => 'GH1xx',
'kernel' => '',
'legacy' => 0,
@@ -17611,8 +18571,8 @@ sub set_nv_data {
'years' => '2022+',
},
{'arch' => 'Lovelace',
- 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2820|' .
- '2860|28a0|28a1|28e0|28e1',
+ 'ids' => '2684|26b1|26b5|2704|2717|2757|2782|2786|27a0|27b8|27e0|2803|2805|' .
+ '2820|2860|2882|28a0|28a1|28e0|28e1',
'code' => 'AD1xx',
'kernel' => '',
'legacy' => 0,
@@ -18406,7 +19366,7 @@ sub lvm_data {
PartitionData::set() if !$loaded{'partition-data'};
main::set_mapper() if !$loaded{'mapper'};
if ($fake{'logical'}){
- # my $file = "$fake_data_dir/lvm/lvs-test-1.txt";
+ # my $file = "$fake_data_dir/raid-logical/lvm/lvs-test-1.txt";
# @data = main::reader($file,'strip');
}
else {
@@ -18783,8 +19743,8 @@ sub machine_data_fruid {
}
else {
# my $file;
- # $file = "$fake_data_dir/fruid/fruid-e904-1_full.txt";
- # $file = "$fake_data_dir/fruid/fruid-e804-1_full.txt";
+ # $file = "$fake_data_dir/machine/fruid/fruid-e904-1_full.txt";
+ # $file = "$fake_data_dir/machine/fruid/fruid-e804-1_full.txt";
# @fruid = main::reader($file,'strip');
}
# print Data::Dumper::Dumper \@fruid;
@@ -20400,9 +21360,9 @@ sub set_partitions {
}
else {
my $file;
- # $file = "$fake_data_dir/df/df-kTP-cygwin-1.txt";
- $file = "$fake_data_dir/df/df-kT-wrapped-1.txt";
- @partitions_working = main::reader($file);
+ # $file = "$fake_data_dir/block-devices/df/df-kTP-cygwin-1.txt";
+ # $file = "$fake_data_dir/block-devices/df/df-kT-wrapped-1.txt";
+ # @partitions_working = main::reader($file);
}
# print Data::Dumper::Dumper \@partitions_working;
# Determine positions
@@ -20569,7 +21529,7 @@ sub set_partitions {
$fs = ($b_fs) ? $row[1]: get_mounts_fs($row[0],\@mount);
}
# assuming that all null/nullfs are parts of a logical fs
- $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|wekafs|zfs)/;
+ $b_logical = 1 if $fs && $fs =~ /^(btrfs|hammer|null|zfs)/;
$id = join(' ', @row[$cols .. $#row]);
$size = $row[$cols - $back_size];
if ($b_admin && -e "/sys/block/"){
@@ -20939,7 +21899,7 @@ sub set_filters {
# hdfs, httpdirfs, hubicfuse, ipfs, juice, k(osmos)?fs, .*lafs, lizardfs,
# lustre, magma, mapr, moosefs, nfs[34], objective, ocfs\d{0,2}, onefs,
# orangefs, panfs, pnfs, pvfs\d{0,2}, rclone, restic, rozofs, s3fs, scality,
- # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, xtreemfs
+ # sfs, sheepdogfs, spfs, sshfs, smbfs, v9fs, vdfs, vmfs, wekafs, xtreemfs
# Stackable/Union: aufs, e?cryptfs, encfs, erofs, gocryptfs, ifs, lofs,
# mergerfs, mhddfs, overla(id|y)(fs)?, squashfs, unionfs;
# ISO/Archive: archive(mount)?, atlas, avfs. borg, erofs, fuse-archive,
@@ -20960,7 +21920,8 @@ sub set_filters {
g gdrive gfarm git gluster gmail gocrypt google-drive-ocaml gp gphoto gv gzip
hd httpd hubic ip juice k(osmos)? .*la lizard lustre magma mapr moose .*mtp
null p?n objective oc one orange pan .*ptp pv rclone restic rozo
- s s3 scality sheepdog sp ssh smb v9 vd vm vram wim(mount)? xb xml xtreem%);
+ s s3 scality sheepdog sp ssh smb v9 vd vm vram weka wim(mount)? xb xml
+ xtreem%);
# Various RAM based system FS
my @partition = (@all,qw%cgroup.* cgm config debug dev devtmp efivar fdesc
hugetlb kern linproc linsys lxc none proc pty run security shm swap sys
@@ -21979,14 +22940,14 @@ sub md_data {
my ($mdstat) = @_;
my $j = 0;
if ($fake{'raid-md'}){
- #$mdstat = "$fake_data_dir/raid/md-4-device-1.txt";
- #$mdstat = "$fake_data_dir/raid/md-rebuild-1.txt";
- #$mdstat = "$fake_data_dir/raid/md-2-mirror-fserver2-1.txt";
- #$mdstat = "$fake_data_dir/raid/md-2-raid10-abucodonosor.txt";
- #$mdstat = "$fake_data_dir/raid/md-2-raid10-ant.txt";
- #$mdstat = "$fake_data_dir/raid/md-inactive-weird-syntax.txt";
- #$mdstat = "$fake_data_dir/raid/md-inactive-active-syntax.txt";
- #$mdstat = "$fake_data_dir/raid/md-inactive-active-spare-syntax.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-4-device-1.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-rebuild-1.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-2-mirror-fserver2-1.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-abucodonosor.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-2-raid10-ant.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-weird-syntax.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-syntax.txt";
+ #$mdstat = "$fake_data_dir/raid-logical/md/md-inactive-active-spare-syntax.txt";
}
my @working = main::reader($mdstat,'strip');
# print Data::Dumper::Dumper \@working;
@@ -22271,11 +23232,11 @@ sub zfs_data {
my ($i,$j,$k) = (0,0,0);
if ($fake{'raid-zfs'}){
# my $file;
- # $file = "$fake_data_dir/raid/zpool-list-1-mirror-main-solestar.txt";
- # $file = "$fake_data_dir/raid/zpool-list-2-mirror-main-solestar.txt";
- # $file = "$fake_data_dir/raid/zpool-list-v-tank-1.txt";
- # $file = "$fake_data_dir/raid/zpool-list-v-gojev-1.txt";
- # $file = "$fake_data_dir/raid/zpool-list-v-w-spares-1.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-1-mirror-main-solestar.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-2-mirror-main-solestar.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-tank-1.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-gojev-1.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-list-v-w-spares-1.txt";
#@working = main::reader($file);$zpool = '';
}
else {
@@ -22484,9 +23445,9 @@ sub zfs_status {
$k = 0;
if ($fake{'raid-zfs'}){
my $file;
- # $file = "$fake_data_dir/raid/zpool-status-1-mirror-main-solestar.txt";
- # $file = "$fake_data_dir/raid/zpool-status-2-mirror-main-solestar.txt";
- # $file = "$fake_data_dir/raid/zpool-status-tank-1.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-1-mirror-main-solestar.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-2-mirror-main-solestar.txt";
+ # $file = "$fake_data_dir/raid-logical/zfs/zpool-status-tank-1.txt";
#@pool_status = main::reader($file,'strip');
}
else {
@@ -23485,6 +24446,7 @@ sub speed_mapper {
return ($speeds{$type}) ? $speeds{$type} . ' MT/s' : $type;
}
+
## START RAM VENDOR ##
sub set_ram_vendors {
$vendors = [
@@ -23505,6 +24467,7 @@ sub set_ram_vendors {
['^(G[A-Z]|Geil)','Geil','Geil',''],
# Note: FA- but make loose FA
['^(F4|G[\s\.-]?Skill)','G[\s\.-]?Skill','G.Skill',''],
+ ['^(GJN)','GJN','GJN',''],
['^(HP)','','HP',''], # no IDs found
['^(HX|HyperX)','HyperX','HyperX',''],
# Qimonda spun out of Infineon, same ids
@@ -23521,9 +24484,11 @@ sub set_ram_vendors {
# Before patriot just in case
['^(MN\d|PNY)','PNY\s','PNY',''],
['^(P[A-Z]|Patriot)','Patriot','Patriot',''],
+ ['^RAMOS','^RAMOS','RAmos',''],
['^(K[1-6][ABLT]|K\d|M[\d]{3}[A-Z]|Samsung)','Samsung','Samsung',''],
['^(SP|Silicon[\s-]?Power)','Silicon[\s-]?Power','Silicon Power',''],
['^(STK|Simtek)','Simtek','Simtek',''],
+ ['^(Simmtronics|Gamex)','^Simmtronics','Simmtronics',''],
['^(HM[ACT]|SK[\s-]?Hynix)','SK[\s-]?Hynix','SK-Hynix',''],
# TED TTZD TLRD TDZAD TF4D4 TPD4 TXKD4 seen: HMT but could by skh
#['^(T(ED|D[PZ]|F\d|LZ|P[DR]T[CZ]|XK)|Team[\s-]?Group)','Team[\s-]?Group','TeamGroup',''],
@@ -24922,19 +25887,19 @@ sub ipmi_data {
my $sensors = {};
if ($fake{'ipmi'}){
## ipmitool ##
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool';
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool';
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool';
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensors-freebsd-offsite-backup.txt";
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool';
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool';
- # $file = "$fake_data_dir/ipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensors/ipmitool/ipmitool-sensors-archerseven-1.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-epyc-1.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-RK016013.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensors-freebsd-offsite-backup.txt";
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-1.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-shom-2.txt";$program='ipmitool';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmitool-sensor-tyan-1.txt";$program='ipmitool';
# ($b_ipmitool,$i_key,$i_value,$i_unit) = (1,0,1,2); # ipmitool sensors
## ipmi-sensors ##
- # $file = "$fake_data_dir/ipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors';
- # $file = "$fake_data_dir/ipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors';
- # $file = "$fake_data_dir/ipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors';
- # $file = "$fake_data_dir/ipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-epyc-1.txt";$program='ipmi-sensors';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-lathander.txt";$program='ipmi-sensors';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-zwerg.txt";$program='ipmi-sensors';
+ # $file = "$fake_data_dir/sensorsipmitool/ipmi-sensors-arm-server-1.txt";$program='ipmi-sensors';
# ($b_ipmitool,$i_key,$i_value,$i_unit) = (0,1,3,4); # ipmi-sensors
# @data = main::reader($file);
}
@@ -25318,20 +26283,20 @@ sub load_lm_sensors {
my ($adapter,$holder,$type) = ('','','');
if ($fake{'sensors'}){
# my $file;
- # $file = "$fake_data_dir/sensors/amdgpu-w-fan-speed-stretch-k10.txt";
- # $file = "$fake_data_dir/sensors/peci-tin-geggo.txt";
- # $file = "$fake_data_dir/sensors/sensors-w-other-biker.txt";
- # $file = "$fake_data_dir/sensors/sensors-asus-chassis-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-devnull-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-jammin1.txt";
- # $file = "$fake_data_dir/sensors/sensors-mx-incorrect-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-maximus-arch-1.txt";
- # $file = "$fake_data_dir/sensors/kernel-58-sensors-ant-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-zenpower-nvme-2.txt";
- # $file = "$fake_data_dir/sensors/sensors-pch-intel-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-ppc-sr71.txt";
- # $file = "$fake_data_dir/sensors/sensors-coretemp-acpitz-1.txt";
- # $file = "$fake_data_dir/sensors/sensors-applesmc-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/amdgpu-w-fan-speed-stretch-k10.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/peci-tin-geggo.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-w-other-biker.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-asus-chassis-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-devnull-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-jammin1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-mx-incorrect-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-maximus-arch-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/kernel-58-sensors-ant-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-zenpower-nvme-2.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-pch-intel-1.txt";
+ # $file = "$fake_data_dir/sensors/slm-sensors/ensors-ppc-sr71.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-coretemp-acpitz-1.txt";
+ # $file = "$fake_data_dir/sensors/lm-sensors/sensors-applesmc-1.txt";
# @sensors_data = main::reader($file);
}
else {
@@ -27761,14 +28726,14 @@ sub set_dboot_data {
$file = $system_files{'dmesg-boot'};
}
else {
- # $file = "$fake_data_dir/dmesg-boot/bsd-disks-diabolus.txt";
- # $file = "$fake_data_dir/dmesg-boot/freebsd-disks-solestar.txt";
- # $file = "$fake_data_dir/dmesg-boot/freebsd-enceladus-1.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/bsd-disks-diabolus.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-disks-solestar.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/freebsd-enceladus-1.txt";
## matches: toshiba: openbsd-5.6-sysctl-2.txt
- # $file = "$fake_data_dir/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-5.6-dmesg.boot-1.txt";
## matches: compaq: openbsd-5.6-sysctl-1.txt"
- # $file = "$fake_data_dir/dmesg-boot/openbsd-dmesg.boot-1.txt";
- $file = "$fake_data_dir/dmesg-boot/openbsd-6.8-battery-sensors-1.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-dmesg.boot-1.txt";
+ # $file = "$fake_data_dir/bsd/dmesg-boot/openbsd-6.8-battery-sensors-1.txt";
}
if ($file){
return if ! -r $file;
@@ -28793,8 +29758,8 @@ sub lspci_n_data {
$b_lspci_n = 1;
my (@data);
if ($fake{'lspci'}){
- # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-n.txt";
- # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-n.txt";
+ # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-n.txt";
+ # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-n.txt";
# @data = main::reader($file,'strip');
}
else {
@@ -29019,15 +29984,15 @@ sub pci_grabber {
$pattern = q/^[0-9a-f:]+:/; # i only added perl 5.14, don't use
}
if ($fake{'lspci'} || $fake{'pciconf'} || $fake{'pcictl'} || $fake{'pcidump'}){
- # my $file = "$fake_data_dir/pciconf/pci-freebsd-8.2-2";
- # my $file = "$fake_data_dir/pcidump/pci-openbsd-6.1-vm.txt";
- # my $file = "$fake_data_dir/pcictl/pci-netbsd-9.1-vm.txt";
- # my $file = "$fake_data_dir/lspci/racermach-1-knnv.txt";
- # my $file = "$fake_data_dir/lspci/rk016013-knnv.txt";
- # my $file = "$fake_data_dir/lspci/kot--book-lspci-nnv.txt";
- # my $file = "$fake_data_dir/lspci/steve-mint-topaz-lspci-nnkv.txt";
- # my $file = "$fake_data_dir/lspci/ben81-hwraid-lspci-nnv.txt";
- # my $file = "$fake_data_dir/lspci/gx78b-lspci-nnv.txt";
+ # my $file = "$fake_data_dir/pci/pciconf/pci-freebsd-8.2-2";
+ # my $file = "$fake_data_dir/pci/pcidump/pci-openbsd-6.1-vm.txt";
+ # my $file = "$fake_data_dir/pci/pcictl/pci-netbsd-9.1-vm.txt";
+ # my $file = "$fake_data_dir/pci/lspci/racermach-1-knnv.txt";
+ # my $file = "$fake_data_dir/pci/lspci/rk016013-knnv.txt";
+ # my $file = "$fake_data_dir/pci/lspci/kot--book-lspci-nnv.txt";
+ # my $file = "$fake_data_dir/pci/lspci/steve-mint-topaz-lspci-nnkv.txt";
+ # my $file = "$fake_data_dir/pci/lspci/ben81-hwraid-lspci-nnv.txt";
+ # my $file = "$fake_data_dir/pci/lspci/gx78b-lspci-nnv.txt";
# $data = main::reader($file,'strip','ref');
}
else {
@@ -29871,6 +30836,8 @@ sub get_bsd_os {
}
sub get_linux_distro {
+ # NOTE: increasingly no distro release files are present, so this logic is
+ # deprecated, but still works often.
# order matters!
my @derived = qw(antix-version aptosid-version bodhibuilder.conf kanotix-version
knoppix-version pclinuxos-release mandrake-release manjaro-release mx-version
@@ -29893,11 +30860,8 @@ sub get_linux_distro {
$osr_good .= 'raspberry pi os|slint|zorin';
# Force use of pretty name because that's only location of derived distro name
my $osr_pretty = 'zinc';
-
my ($b_issue,$b_lsb,$b_osr_pretty,$b_skip_issue,$b_skip_osr);
my ($issue,$lsb_release) = ('/etc/issue','/etc/lsb-release');
- $b_issue = 1 if -f $issue;
- $b_lsb = 1 if -f $lsb_release;
# Note: OpenSuse Tumbleweed 2018-05 has made /etc/issue created by sym link to /run/issue
# and then made that resulting file 700 permissions, which is obviously a mistake
$etc_issue = main::reader($issue,'strip',0) if -r $issue;
@@ -29909,9 +30873,17 @@ sub get_linux_distro {
# Wait to handle since crunchbang file is one of the few in the world that
# uses this method
@distro_files = main::globber('/etc/*[-_]{[rR]elease,[vV]ersion,issue}*');
- push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf';
+ push(@distro_files, '/etc/bodhibuilder.conf') if -r '/etc/bodhibuilder.conf'; # legacy
@osr = main::reader($os_release) if -r $os_release;
- if ($etc_issue){
+ if (-f '/etc/bodhi/info'){
+ $lsb_release = '/etc/bodhi/info';
+ $distro_file = $lsb_release;
+ $b_skip_issue = 1;
+ push(@distro_files, $lsb_release);
+ }
+ $b_issue = 1 if -f $issue;
+ $b_lsb = 1 if -f $lsb_release;
+ if (!$b_skip_issue && $etc_issue){
$lc_issue = lc($etc_issue);
if ($lc_issue =~ /(antergos|grml|linux lite|openmediavault)/){
$distro_id = $1;
@@ -29993,7 +30965,8 @@ sub get_linux_distro {
# be preferred, but this is a good backup.
elsif ($distro_file && $b_lsb &&
($distro_file =~ /\/etc\/($lsb_good_s)$/ || $distro_file eq $lsb_release)){
- $distro = get_lsb_release();
+ print "df: $distro_file lf: $lsb_release\n";
+ $distro = get_lsb_release($lsb_release);
}
elsif ($distro_file && $distro_file eq $os_release){
$distro = get_os_release($b_osr_pretty);
@@ -30171,10 +31144,10 @@ sub system_base {
$base_distro_arch .= '|talkingarch|theshell|ubos|velt|xero';
my $base_file_debian_version = 'sidux';
# detect debian steamos before arch steamos
- my $base_osr_debian_version = '\belive|lmde|neptune|parrot|pureos|rescatux|';
- $base_osr_debian_version .= 'septor|sparky|steamos|tails';
+ my $base_osr_debian_version = '\belive|lmde|neptune|nitrux|parrot|pureos|';
+ $base_osr_debian_version .= 'rescatux|septor|sparky|steamos|tails';
# osr has base ids
- my $base_default = 'antix-version|mx-version';
+ my $base_default = 'antix-version|bodhi|mx-version';
# base only found in issue
my $base_issue = 'bunsen';
# synthesize, no direct data available
@@ -30270,11 +31243,21 @@ sub system_base {
eval $end if $b_log;
}
+# Note: corner case when parsing the bodhi distro file
+# args: 0: file name
sub get_lsb_release {
eval $start if $b_log;
my ($lsb_file) = @_;
$lsb_file ||= '/etc/lsb-release';
my ($distro_lsb,$id,$release,$codename,$description) = ('','','','','');
+ my ($dist_id,$dist_release,$dist_code,$dist_desc) = ('DISTRIB_ID',
+ 'DISTRIB_RELEASE','DISTRIB_CODENAME','DISTRIB_DESCRIPTION');
+ if ($lsb_file eq '/etc/bodhi/info'){
+ $id = 'Bodhi Linux';
+ # note: No ID field, hard code
+ ($dist_id,$dist_release,$dist_code,$dist_desc) = ('ID','RELEASE',
+ 'CODENAME','DESCRIPTION');
+ }
my @content = main::reader($lsb_file);
main::log_data('dump','@content',\@content) if $b_log;
@content = map {s/,|\*|\\||\"|[:\47]|^\s+|\s+$|n\/a//ig; $_} @content if @content;
@@ -30282,7 +31265,7 @@ sub get_lsb_release {
next if /^\s*$/;
my @working = split(/\s*=\s*/, $_);
next if !$working[0];
- if ($working[0] eq 'DISTRIB_ID' && $working[1]){
+ if ($working[0] eq $dist_id && $working[1]){
if ($working[1] =~ /^Manjaro/i){
$id = 'Manjaro Linux';
}
@@ -30294,15 +31277,15 @@ sub get_lsb_release {
$id = $working[1];
}
}
- elsif ($working[0] eq 'DISTRIB_RELEASE' && $working[1]){
+ elsif ($working[0] eq $dist_release && $working[1]){
$release = $working[1];
}
- elsif ($working[0] eq 'DISTRIB_CODENAME' && $working[1]){
+ elsif ($working[0] eq $dist_code && $working[1]){
$codename = $working[1];
}
# sometimes some distros cannot do their lsb-release files correctly,
# so here is one last chance to get it right.
- elsif ($working[0] eq 'DISTRIB_DESCRIPTION' && $working[1]){
+ elsif ($working[0] eq $dist_desc && $working[1]){
$description = $working[1];
}
}
@@ -30627,7 +31610,9 @@ sub generate_data {
}
}
-# return all device modules not including driver
+# args: 0: driver; 1: modules, comma separated, return only modules
+# which do not equal the driver string itself. Sometimes the module
+# name is different from the driver name, even though it's the same thing.
sub get_driver_modules {
eval $start if $b_log;
my ($driver,$modules) = @_;
@@ -30643,9 +31628,7 @@ sub get_driver_modules {
return $modules;
}
-# args: 0: driver; 1: modules, comma separated, return only modules
-# which do not equal the driver string itself. Sometimes the module
-# name is different from the driver name, even though it's the same thing.
+# Return all detected gcc versions
sub get_gcc_data {
eval $start if $b_log;
my ($gcc,@data,@temp);
@@ -30985,9 +31968,9 @@ sub set_ip_addr {
if ($fake{'ip-if'}){
# my $file = "$fake_data_dir/if/scope-ipaddr-1.txt";
# my $file = "$fake_data_dir/network/ip-addr-blue-advance.txt";
- # my $file = "$fake_data_dir/network/ppoe-ip-address-1.txt";
- # my $file = "$fake_data_dir/network/ppoe-ip-addr-2.txt";
- # my $file = "$fake_data_dir/network/ppoe-ip-addr-3.txt";
+ # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-address-1.txt";
+ # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-2.txt";
+ # my $file = "$fake_data_dir/network/ppoe/ppoe-ip-addr-3.txt";
# @data = main::reader($file,'strip') or die $!;
}
my ($b_skip,$broadcast,$if,$if_id,$ip,@ips,$scope,$type,@temp,@temp2);
@@ -31038,7 +32021,7 @@ sub set_ifconfig {
# whitespace matters!! Don't use strip
my @data = main::grabber($alerts{'ifconfig'}->{'path'} . " 2>/dev/null",'\n','');
if ($fake{'ip-if'}){
- # my $file = "$fake_data_dir/network/ppoe-ifconfig-all-1.txt";
+ # my $file = "$fake_data_dir/network/ppoe/ppoe-ifconfig-all-1.txt";
# my $file = "$fake_data_dir/network/vps-ifconfig-1.txt";
# @data = main::reader($file) or die $!;
}
@@ -31952,6 +32935,7 @@ sub gpu_ram_arm {
}
}
+# args: 0: module to get version of
sub get_module_version {
eval $start if $b_log;
my ($module) = @_;
@@ -32974,7 +33958,7 @@ sub proc_data {
eval $start if $b_log;
my $file = $_[0];
if ($fake{'partitions'}){
- # $file = "$fake_data_dir/proc-partitions-1.txt";
+ # $file = "$fake_data_dir/block-devices/proc-partitions/proc-partitions-1.txt";
}
my @parts = main::reader($file,'strip');
# print Data::Dumper::Dumper \@parts;
@@ -33772,14 +34756,14 @@ sub set_sysctl_data {
}
else {
my $file;
- # $file = "$fake_data_dir/sysctl/obsd_6.1_sysctl_soekris6501_root.txt";
- # $file = "$fake_data_dir/sysctl/obsd_6.1sysctl_lenovot500_user.txt";
+ # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1_sysctl_soekris6501_root.txt";
+ # $file = "$fake_data_dir/bsd/sysctl/obsd_6.1sysctl_lenovot500_user.txt";
## matches: compaq: openbsd-dmesg.boot-1.txt
- # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-1.txt";
+ # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-1.txt";
## matches: toshiba: openbsd-5.6-dmesg.boot-1.txt
- # $file = "$fake_data_dir/sysctl/openbsd-5.6-sysctl-2.txt";
- $file = "$fake_data_dir/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt";
- @temp = reader($file);
+ # $file = "$fake_data_dir/bsd/sysctl/openbsd-5.6-sysctl-2.txt";
+ # $file = "$fake_data_dir/bsd/sysctl/obsd-6.8-sysctl-a-battery-sensor-1.txt";
+ # @temp = reader($file);
}
foreach (@temp){
$_ =~ s/\s*=\s*|:\s+/:/;
@@ -34356,13 +35340,13 @@ sub usb_grabber {
else {
my $file;
if ($fake{'usbdevs'}){
- $file = "$fake_data_dir/lsusb/bsd-usbdevs-v-1.txt";
+ $file = "$fake_data_dir/usb/usbdevs/bsd-usbdevs-v-1.txt";
}
elsif ($fake{'usbconfig'}){
- $file = "$fake_data_dir/lsusb/bsd-usbconfig-list-v-1.txt";
+ $file = "$fake_data_dir/usb/usbconfig/bsd-usbconfig-list-v-1.txt";
}
else {
- $file = "$fake_data_dir/lsusb/mdmarmer-lsusb.txt";
+ $file = "$fake_data_dir/usb/lsusb/mdmarmer-lsusb.txt";
}
@data = main::reader($file,'strip');
}