=====================================================================================
Version: 3.2.02
Patch: 00
Date: 2021-01-10
-----------------------------------
Changes:
-----------------------------------
New version, man page, bug fixes, changes, adjustments and cleanups!!!

Special thanks to mr. mazda for his ongoing suggestions, ideas, and observations.

Bugs:
1. In certain corner cases, it appears that lsusb has blank lines, which tripped 
errors in inxi output when the usb parser was trying to access split keys that did 
not exist. Added in check to make sure split actually resulted in expected data.

2. A red face bug, I'd left the output debugger switched on with json output, so
it was printing out the json data structure with Dumper, that's now switched off.
Hope this doesn't mess anyone up, but it would have mattered only if the person
was using: 
--output json --output-type print
It did not effect xml output.

Fixes:
1. Got rid of extra level of -L data structure and output handler. Not visible
to users, but still irksome, so nice to get that fixed. Recursive structures are
confusing, lol, but this extra level was pointless, but to fix it required redoing
the logic a bit for both data generator and output feature.

2. Added in support for --display :0.0, previously it did not support the 
.0 addition, but why not, if it works for people, good, if not, makes no difference.

3. There were some missing cases for LVM missing data messages, so the following
fixes were added:
 * In cases where lsblk is installed and user is non root, or lvs is not installed, 
 but no lvm data is present, inxi now shows the expected 'Message: No LVM data found.' 
 instead of the permissions or missing program error that showed before. 
 If lsblk is not installed, and lvm is installed (or missing), with lvs not root 
 readable, the permissiosn message (or missing program) will show since at that 
 point, inxi has no way to know if there is lvm data or not.
 
 * Not an inxi, but rather an Arch Linux packaging bug, the maintainer of lvm
 has made lvs and vgs fail to return error number on non root start, which is
 a bug (pvs does return expected error return). Rather than wait for this bug
 to be fixed, inxi will just test if lvs and lsblk lvm data, it will show 
 permissions message, otherwse the no lvm data message as expected.
 
I think these cover the last unhandled LVM cases I came across, so ideally, the
lvm data messages will be reasonably correct.

4. Some man page lintian fixes.

5. Changed usb data parser to use 'unless' instead of 'if' in tests since 
it's easier to read unless positive tests are true than if negative or 
negative etc.

Enhancements: 
1. Since I see too often things like -F --no-host -z which is redundant, the
help and man now make it more clear that -z implies --no-host.

2. Even though it's not that pointful, I added in derived Arch Linux system
base like Ubuntu/Debian have. It's not that meaningful because unlike 
Ubuntu/Debian, where you want to know what version the derived distro is
based on, Arch is rolling thus no versions, but I figured, why not, it's
easy to do, so might as well make the system base feature a bit more complete.

Note that the way I did this requires that the distro is ID'ed as its derived
distro nanme, not Arch Linux, that will vary depending on how they did their 
os-release etc, or distro files, but that's not really an inxi issue, that's 
up to them. From what I've been seeing, it looks like more of the derived 
distros are being ID'ed in inxi as the derived name, so those should all work
fine. Note that seeing 'base:' requires -Sx.

3. More disk vendors!! More disk vendor IDs!!! I really dug into the stuff,
and refactored slightly the backend tools I use, so it's now a bit easier
to handle the data. Thanks linux-lite hardware database, as always, for 
having users that really seemt to use every disk variant known to humanity.

Changes:
1. In -G, made FAILED: lower case, and also moved it to be after unloaded:
It was too easy to think that the loaded driver had failed. Also to make it
more explicit, made output like this, in other words, driver: is a container
for the possible children: loaded: unloaded: failed: alternate: which should be
easier to parse and read without mixing up what belongs to what.

driver: loaded: modesetting unloaded: nouvean,vesa alternate: nv
driver: loaded: amdgpu unloaded: vesa failed: ati 

Note that if there is no unloaded: driver, failed: would still appear to come after 
loaded:, but hopefully it's more clear now.

Basically what we found was that the presence of the uppercase FAILED: drew
the eye so much that it was sometimes not noted that it was a key: following
the driver: item, which itself because it did not list explicitly loaded:
was not as clear as it could have been. By making failed: the same as the 
other key names visually, hopefully it will be less easy to think that the
loaded: driver failed:

In a sense, this is a legacy issue, because the original use of FAILED: was for
non free video drivers, to see when xorg had failed to load them, but over 
more recent years, the most frequent thing I have been seeing is odd things 
like failed: ati, when xorg tries to load the legacy ati driver when amdgpu 
is being used.

2. Likewise, for RAID mdraid and zfs changed FAILED: to Failed:, again, to make it
more consistent with the other types.

3. In help menu and man page, removed legacy 'card(s)' in -A, -G, -N, and replaced
that with 'device(s)', which is the more accurate term, since the days when these 
things were only addon cards are long behind us. I had not noticed that, but it
caught me eye and I realized it was a very deprecated and obsolete syntax, which
did not match the way inxi describes devices today.

4. It was pointed out how incoherent the naming of the item for setting wrap width,
--indent-min and config item INDENT_MIN were super confusing, since it was neither
indent or minimum, it was in fact wrap maximum, so the new options and config items
are --wrap-max and WRAP_MAX. Note that the legacy values will keep working, but
it was almost impossible in words to explain this option because the option text
was almost the exact opposite of what the option actually does. Redid the man 
and help explanations to make the function of this option/config item more clear.

5. Made -J/--usb Hub-xx: to fit with other repeating device types in inxi output,
before Hub: was not numbered, but it struck me, it should be, like all the other
auto-incremented counter line starters, like ID-xx:, Device-x:, and so on.

6. Reorganized the main help menu to hopefully be more logical, now it shows the
primary output triggers, then after, the extra data items, -a, -x, -xx, -xxx, 
separated by white space per type to make it easier to read. This also moved
the stuff that had been under the -x items back to where they should be, together
with the main output control options. For readability and usability, I think this
will help, the help menu is really long, so the more visual cues it has to make it
clear what each section is, the better I think. Previously -a was the first items,
then way further down was -x, -xx, and -xxx, then under those was -z, -Z, -y.

-----------------------------------
-- Harald Hope - Sun, 10 Jan 2021 18:25:48 -0800

=====================================================================================
Version: 3.2.01
Patch: 00
Date: 2020-12-17
-----------------------------------
Changes:
-----------------------------------

Bug Fixes!!! Continuing internal refactor!!

This bug report came in right after 3.2.00 went out live, but I would never have
found it myself in testing so better found than not found!

Bugs: 

1. A bug was introduced to dmidecode data handlers in 3.2.00 resulted in the
dmidecode data array basically eating itself up until errors appear. Quite difficult
to trigger, but babydr from Slackware forums figured it out, using -F --dmidecode 
to force dmidecode use for all features that support it triggered thee bug always.
This was a result of the refactor, previously inxi had worked on copies of referenced
arrays, but in this case, it was working on the original array of arrays, subtle,
but obvious. This method was only used on dmidecode arrays.

2. A second bug was exposed almost by accident, for -M --dmidecode data, there was 
a missing field and also a missing is set test on that field that led to an error
of using undefined value in string comparison. This was strictly speaking 2 bugs,
both very old, from 2.9 first rewrite, one failing to set/get the value, and the 
other failing to test if the value was set before using it. 

Fixes:

1. There were a few glitches in help menu and man page related to -L option, those
are corrected.


INTERNAL CODE CHANGES:
1. removed bug inducing splice use in some cases, and added parens to splice to make
it fit the new way of with perl builtins, when taking 2 or more arguments, use parens.

2. Found many more instances to add -> dereferencing operator. I have to say, not 
doing that consistently made the code much harder to read, and created situations
where it's somewhat ambiguous what item belongs to what, with everything consistently
-> operator run, the code is more clear and obvious, and some of the hacks I'd added 
because of the lack of clarity were also removed.

3. Removed explicit setting of hash references with null value, that was done out
of failure to use -> operators which clearly indicate to Perl and coder what is 
happening, so those crutches were removed. Also got rid of unnecessary array 
priming like: my @array = (); Some of these habits came from other languages, 
but in Perl, declaring my @array means it's an array that is null, and you don't
need to do a further (). @array = () is obviously fine for resetting arrays in 
loops or whatever, but not in the initial declaration.


-----------------------------------
-- Harald Hope - Thu, 17 Dec 2020 14:27:13 -0800

=====================================================================================
Version: 3.2.00
Patch: 00
Date: 2020-12-15
-----------------------------------
Changes:
-----------------------------------

Huge upgrade, major rewrite/refactor, new features, everything is polished!!!

Note that due to large number of internal changes to code, a separate 
INTERNAL CODE CHANGES section is at the bottom. Those are changes which in 
general do not impact what users see that much, but which definitely impact 
working on and with inxi! They also make errors less likely, and removed many 
possible bad data error situations.

BUGS:

1. Obscure, but very old Tyan Mobo used a form of dmidecode data for RAM that I'd
never gotten a dataset for before, this tripped a series of errors in inxi, which
were actually caused by small errors and failures to check certain things, as
well as simply never assigning data in corner cases. This system used only dmi
handles 5 and 6, which is a very rare setup, from the very early days of dmi 
data being settled, but it was valid data, and actually inxi was supposed to support 
it, because I'd never gotten a dataset containing such legacy hardware data, the 
support didn't work. There were actually several bugs discovered while tracking
this down, all were corrected.

2. Going along with the cpu fixes below, there was a bug that if stepping was 0,
stepping would not show. I had not realized stepping could be 0, so did a true/false
test instead of a defined test, which makes 0 in perl always test as false. This is
corrected.

3. While going through code, discovered that missing second argument to main::grabber
would have made glabel tool (BSD I think mostly) always fail, without exception.
That explains why bsd systems were never getting glabel data, heh.

4. Many null get_size tests would not have worked because they were testing 
for null array but ('','') was actually being returned, which is not a null array.
The testing and results for get_size were quite random, now they are all the same
and consistent, and confirmed correct.

5. In unmounted devices, the match sent to @lsblk to get extended device data
would never work with dm-xx type names, failed to translate them to their
mapped name, which is what is used in lsblk matches, this is corrected.
This could lead to failures to match fs of members of luks, raid, etc, 
particularly noticeable with complex logical device structures. This means
the fallback filters against internal logic volume names, various file system
type matches, would always fail.

6. A small host of further bugs found and fixed during the major refactor, but
not all of them were noted, they were just fixed, sorry, those will be lost
to history unless you compare with diffs the two versions, but that's thousands
of lines, but there were more bugs fixed than listed above, just can't remember 
them all.

FIXES:

1. There was some ambiguity about when inxi falls back to showing hardware graphics
driver instead of xorg gfx driver when it can't find an xorg driver. That can happen
for instance because of wayland, or because of obscure xorg drivers not yet supported.
Now the message is very clear, it says the gfx software driver is n/a, and that it's 
showing the hardware gfx driver.

2. Big redo of cpu microarch, finally handled cases where same stepping/model ID
has two micorarches listed, now that is shown clearly to users, like AMD Zen family
17, model 18, which can be either Zen or Zen+, so now it shows that ambiguity, and
a comment: note: check, like it shows for ram report when it's not sure. Shows
for instance:
arch: Zen/Zen+ note: check
in such cases, in other words, it tells users that the naming convention 
basically changed during the same hardware/die cycle.

3. There were some raid component errors in the unmounted tests which is supposed
to test the raid components and remove them from the mounted list. Note that inxi
now also tests better if something is a raid component, or an lvm component, or 
various other things, so unmounted will be right more often now, though it's still
not perfect since there are still more unhandled logical storage components that
will show as unmounted when tney are parts of logical volumes. Bit by bit!!

4. Part of a significant android fine tuning and fix series, for -P, android uses
different default names for partitions, so none showed, now a subset of standard
android partitions, like /System, /firmware, etc, shows. Android will never work
well though because google keeps locking down key file read/search permissions in
/sys and /proc.

5. More ARM device detections, that got tuned quite a bit and cleaned up, for 
instance, it was doing case sensitive checks, but found cases where the value
is all upper case, so it was missing it. Now it does case insensitive device type
searches.

6. One of the oldest glitches in inxi was the failure to take the size of the raid
arrays versus the size totals of the raid array components led to Local Storage
results that were uselessly wrong, being based on what is now called 'raw' disk 
totals, that's the raw physical total of all system disks. Now if raid is detected
the old total: used:... is expanded to: total: raw:... usable:....used:, the usable
being the actual disk space that can be used to store data. Also in the case of
LVM systems, a further item is added, lvm-free: to report the unused but available
volume group space, that is, space not currently taken by logical volumes. This
can provide a useful overview of your system storage, and is much improved over
the previous version, which was technically unable to solve that issue because
the internal structures did not support it, now they do. LVM data requires sudo/
root unfortunately, so you will see different disk raw totals depending on
if it's root or not if there is LVM RAID running.

Sample: inxi -D
Drives:    Local Storage: total: raw: 340.19 GiB usable: 276.38 GiB 
           lvm-free: 84.61 GiB used: 8.49 GiB (3.1%)
           
lvm-free is non assigned volume group size, that is, size not assigned
to a logical volume in the volume group, but available in the volume group.
raw: is the total of all detected block devices, usable is how much of that
can be used in file systems, that is, raid is > 1 devices, but those devices
are not available for storage, only the total of the raid volume is.
Note that if you are not using LVM, you will never see lvm-free:.

7.  An anonymous user sent a dataset that contained a reasonable alternate
syntax for sensors output, that made inxi fail to get the sensors data. That was
prepending 'T' to temp items, and 'F' to fan items, which made enough sense though
I'd never seen it before, so inxi now supports that alternate sensors temp/fan 
syntax, so that should expand the systems it supports by default out of the box.

8. Finally was able to resolve a long standing issue of loading File::Find, which
is only used in --debug 20-22 debugger, from top of inxi to require load in the
debugger. I'd tried to fix this before, but failed, the problem is that redhat
/fedora have broken apart Perl core modules, and made some of them into external
modules, which made inxi fail to start due to missing use of required module that
was not really required. Thanks to mrmazda for pointing this out to me, I'd tried
to get this working before but failed, but this time I figured out how to recode 
some of the uses of File::Find so it would work when loaded without the package
debugger, hard to figure it, turned out a specific sub routine call in that
specific case required the parentheses that had been left off, very subtle.

9. Subtle issue, unlike most of the other device data processors, the USB
data parser did not use the remove duplicates tool, which led in some cases
to duplicated company names in the output for USB, which looks silly.

10. Somehow devtmpfs was not being detected in all cases to remove that from
partitions report, that was added to the file systen filters to make sure it
gets caught.

11. Removed LVM image/meta/data data slices from unmounted report, those are LVM
items, but they are internal LVM volumes, not available or usable. I believe 
there are other data/meta type variants for different LVM features but I have
added as many types as I could find.. Also explictly now remove any _member type
item, which is always part of some other logical structure, like RAID or 
LVM, those were not explicitly handled before.

12. Corrected the various terms ZFS can use for spare drives, and due to how
those describe slightly different situations than simply spare, changed the spare
section header to Available, which is more accureate for ZFS.

ENHANCEMENTS:

1. Going along with FIX 2 is updating and adding to intel, elbrus microarch family/
model/stepping IDs (E8C2), so that is fairly up to date now.

2. Added in a very crude and highly unreliable default fallback for intel:
/sys/devices/cpu/caps/pmu_name which will show the basic internal name used
which can be quite different from what the actual microarch name is, but the hope
is that for new intel cpus that come out after these last inxi updates, something
may show, instead of nothing. Note these names are often much more generic, like
using skylake for many different microarches.

3. More android enhancements, for androids that allow reading of /system/build.prop,
which is a very useful informative system info file, more android data will show, 
like the device name and variant, and a few other specialized items. You can see if
your android device lets inxi read build.prop if you see under -S Distro: 
Android 7.1 (2016-07-23) or just Android. If it shows just android, that means
it can't read that file. Showing Android however is also new, since while inxi
can't always read build.prop, if that file is there, it's android, so inxi
finally can recognize it's in android, even though it can't give much info if
it's locked down. Inxi in fact did not previously know it was running in android,
which is quite different from ARM systems in some ways, but now it does.

If the data is available, it will be used in Distro: and in Machine: data to add
more information about the android version and device.

4. A big one, for -p/-P/-o/-j now shows with -x the mapped device name, not just
the /dev/dm-xx ID, which makes connecting the various new bits easier, for RAID,
Logical reports. Note that /dev/mapper/ is removed from the mapped name since
that's redundant and verbose and makes the output harder to read. For mapped 
devices, the new --logical / -L report lets you drill into the devices to find
out what dm-xx is actually based on.

5. More big ones, for -a -p/-P/-o/-j/-R/-L shows kernel device major:minor 
number, which again lets you trace each device around the system and report.

6. Added mdadm if root for mdraid report, that let me add a few other 
details for mdraid not previously available. This added item 'state;'
to the mdraid report with right -x options.

7. Added vpu component type to ARM gfx device type detection, don't know
how video processing vpu had escaped my notice.

8. Added fio[a-z] block device, I'd never heard of that before, but saw
use of it in dataset, so learned it's real, but was never handled as a 
valid block device type before, like sda, hda, vda, nvme, mmcblk, 
etc. fio works the same, it's fio + [a-z] + [0-9]+ partition number.

9. Expanded to alternate syntax Elbrus cpu L1, L2, L3 reporting. Note
that in their nomenclature, L0 and L1 are actually both L1, so add those
together when detected.

10. RAM, thanks to a Mint user, antikythera, learned, and handled something
new, module 'speed:' vs module 'configured clock speed:'. 
To quote from supermicro:

<<<
Question: Under dmidecode, my 'Configured Clock Speed' is lower than my 
'Speed'. What does each term mean and why are they not the same?
Answer: Under dmidecode, Speed is the expected speed of the memory 
(what is advertised on the memory spec sheet) and Configured Clock Speed 
is what the actual speed is now. The cause could be many things but the 
main possibilities are mismatching memory and using a CPU that doesn't 
support your expected memory clock speed.
Please use only one type of memory and make sure that your CPU supports 
your memory.
>>>

11. Since RAM was gettng a look, also changed cases where ddr ram speed is reported
in MHz, now it will show the speeds as: [speed * 2] MT/S ([speed] MHz). This
will let users make apples to apples speed comparisons between different systems.
Since MT/S is largely standard now, there's no need to translate that to MHz.

12. And, even more!! When RAM speeds are logically absurd, adds in note: check
This is from a real user's data by the way, as you can see, it triggers all
the new RAM per Device report features.

Sample:
Memory:
  RAM: total: 31.38 GiB used: 20.65 GiB (65.8%) 
  Array-1: capacity: N/A slots: 4 note: check EC: N/A 
  Device-1: DIMM_A1 size: 8 GiB speed: 1600 MT/s (800 MHz) 
  Device-2: DIMM_A2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) 
  actual: 61910 MT/s (30955 MHz) note: check 
  Device-3: DIMM_B1 size: 8 GiB speed: 1600 MT/s (800 MHz) 
  Device-4: DIMM_B2 size: 8 GiB speed: spec: 1600 MT/s (800 MHz) 
  actual: 2 MT/s (1 MHz) note: check

13. More disks vendor!!! More disk vendor IDs!!! Yes, that's right, eternity
exists, here, now, and manifests every day!! Thanks to linux-lite hardware
database for this eternally generating list. Never underestimate the 
creativity of mankind to make more disk drive companies, and to release
new model IDs for existing companies. Yes, I feel that this is a metaphore
for something much larger, but what that is, I'm not entirely clear about.

CHANGES:

1. Recent kernel changes have added a lot more sensor data in /sys, although
this varies system to system, but now, if your system supports it, you can
get at least partial hdd temp reports without needing hddtemp or root. Early
results suggest that nvme may have better support than spinning disks, but it 
really varies. inxi will now look for the /sys based temp first, then fall 
back to the much slower and root / sudo only hddtemp. You can force hddtemp
always with --hddtemp option, which has a corresponding configuration item.

2. The long requested and awaited yet arcane and obscure feature -L/--logical,
which tries to give a reasonably good report on LVM, LUKS, VeraCrypt, as well
as handling LVM raid, both regular and thin, is now working. This took a lot 
of testing, and is a very solid and good start in my view, going from nothing 
to something is always a big improvement!! LVM reports require root/sudo. This 
will, finally, close issue #135.

3. Going along with -L, and serving as a model for the logic of -L, was the
complete refactor of -R, RAID, which was a real mess internally,  definitely
one of the messiest and hardest to work with features of inxi before the 
refactor. It's now completely cleaned up and modularized, and is easy to add
raid types, which was not possible before, now it cleanly supports zfs, mdraid,
and lvm raid, with in depth reports and added items like mdraid size, raid
component device sizes and maj:min numbers if the -a option is used. Note
that LVM RAID requires root/sudo.

4. Added some more sensors dimm, volts items, slight expansion. Note that the
possible expansion of sensors made possible by the recently upgraded sensors 
output logic, as well as the new inxi internal sensors data structure, 
which is far more granular than the previous version, and allows for much 
more fine grained control and output, though only gpu data currently takes 
advantage of this new power under the covers, although as noted, the /sys based 
hdd temps use the same source, only straight from /sys, since it was actually 
easier using the data directly from sys than trying to map the drive locations to
specific drives in sensors output. Well, to be accurate, since now only
board type sensors are used for the temp/fan speed, voltage, etc, reports,
the removal of entire sensor groups means less chance of wrong results.

5. To bring the ancient RAID logic to fit the rest of inxi style, made
zfs, mdraid, and lvm raid components use incrementing numbers, like cpu
cores does. This got rid of the kind of ugly hacks used previously
which were not the same for zfs or mdraid, but now they are all the same,
except that the numbers for mdraid are the actual device numbers that
mdraid supplies, and the LVM and ZFS numbers are just autoincremented,
starting at 1.

6. Changed message <root/superuser required> to <superuser required> because
it's shorter and communicates the same thing.

INTERNAL CODE CHANGES:

1. Small, transparent test, tested on Perl 5.032 for Perl 7 compatibility. All
tests passed, no legacy code issues in inxi as of now.

2. Although most users won't notice, a big chunk of inxi was refactored
internally, which is why the new -L, the revamped -R, and the fixed
disk totals finally all can work now. This may hopefully result in more
consistent output and fewer oddities and randomnesses, since more of the
methods all use the same tools now under the covers. Ths refactor also 
significantly improved inxi's execution speed, by about 4-5%, but most
of those gains are not visible due to the added new features, but the
end result is new inxi runs roughly the same speed as pre 3.2.00 inxi, but
does more, and does it better, internally at least. If you have a very
good eye you may also note a few places where this manifests externally
as well. Last I checked about 10-12% of the lines of inxi had been changed,
but I think that number is higher now. Everything that could be optimized
was, everything could be made more efficient was.

3. Several core tools in inxi were expanded to work much more cleanly, 
like reader(), which now supports returning just the index value you want,
that always happened on the caller end before, which led to extra code.
get_size likewise was expanded to do a string return, which let me
remove a lot of internal redundant code in creating the size unit output,
like 32 MiB. uniq() was also redone to work exclusively by reference.

4. Many bad reference and dereference practices that had slipped into inxi
from the start are mostly corrected now, array assignments use push now, 
rather than assign to array, then add array to another array, and assign 
those to the master array. Several unnecessary and cpu/ram intensive copying 
steps, that is, were removed in many locations internally in inxi. Also 
now inxi uses more direct anonymous array and hash refernce assignments, 
which again removes redundant array/hash creation, copy, and assignment.

5. Also added explicit -> dereferencing arrows to make the code more clear 
and readable, and to make it easier for perl to know  what is happening. 
The lack of consistency actually created confusion, I was not aware of
what certain code was doing, and didn't realize it was doing the same
thing as other code because of using different methods and syntaxes for
referencing array/hash components. I probably missed some, but I got many 
of them, most probably.

6. Instituted a new perl builtin sub routine rule which is: if the sub
takes 2 or more arguments, always put in parentheses, it makes the
code much easier to follow because you see the closing ), like:
push(@rows,@row); Most perl builtins that take only one arg do not
use parentheses, except length, which just looks weird when used in
math tests, that is: length($var) > 13 looks better than length $var > 13.
This resolved inconsistent uses that had grown over time, so now all the 
main builtins follow these rules consistently internally.

Due to certain style elements, and the time required to carefully go through
all these rules, grep and map do not yet consistently use these rules, that's
because the tendency has been to use the grep {..test..} @array and 
map {...actions...} @array

7. Mainly to deal with android failures to read standard system files due to
google locking it down, moved most file queries to use -r, is readable, rather
than -e, exists, or -f, is file, unless it only needs to know if it exists, 
of course. This fixed many null data errors in android even on locked androids.

8. Added in %mapper and %dmmapper hashes to allow for easy mapping and
unmapping of mapped block devices. Got rid of other ways of doing that,
and made it consistent throughout inxi. These are globals that load once.

9. Learned that perl builtin split() has a very strange and in my view originally
terrible decision that involves treating as regex rules string characters in split
string, like split('^^',$string), which should logically be a string value, not
a ^ start search followed by a ^, but that's how it is, so that was carefully checked
and made consistent as well. Also expanded split to take advantage of the number of
splits to do, which I had only used occasionally before, but only updated field/value
splits where I have a good idea of what the data is. This is very useful when the
data is in the form of field: value, but value can contain : as well. You have to
be very careful however, since some data we do want in fact the 2nd split, but not
the subsequent ones, so I only updated the ones I was very sure about.

10. Going along with the cpu microarch fixes, updated and cleaned up all the lists
of model/stepping matches, now they are all in order and much easier to scan and 
find, that had gotten sloppy over the years.

11. More ARM, moved dummy and codec device values into their own storage arrays,
that let me remove the filters against those in the other detections. Makes logic
easier to read and maintain as well.


-----------------------------------
-- Harald Hope - Tue, 15 Dec 2020 15:08:05 -0800

=====================================================================================
Version: 3.1.09
Patch: 00
Date: 2020-11-11
-----------------------------------
Changes:
-----------------------------------

Bug fixes, new features!! Update now!! Or don't, it's up to you.

Bugs:
1. Let's call some of the android fixes and debugger failures bugs, why not?
Those are fixed. Note that many of these fixes will impact any system that is
ARM based, not just android.

Fixes:
1. Related to issue #226 which was a fine issue, fine tuned the debugger debuggers
to allow for smoother handling of /sys parse failures. Also added debugger filters
for common items that would make the /sys parser hang, oddly, most seem to be in
/sys/power for android devices.

2. Added some fine-tunings for possible mmcblk storage paths, in some cases, an 
extra /block is added, which made inxi think mounted drives were unmounted. I've
never seen this extra /block except on mmcblk devices on android, but you never
know, it could be more widespread.

3. Also mainly related to android, but maybe other ARM devices, in some cases,
an errant 'timer' device was appearing as a cpu variant, which is wrong. That was
a corner case for sure, and part of the variant logic in fact uses timer values 
to assign the actual cpu variants, but it was wrong in this case because it was
....-timer-mem, not ...-timer, which led to non-existent CPU variants showing.

4. Issue #236 by ChrisCheney pointed out that inxi had never updated its default 
/proc/meminfo value to use the newer MemAvailable as default if present, which led 
to incorrect memory used values showing up. That's because back in the old days,
we had to construct a synthetic Memory used from MemFree, buffers, cache, etc, but that
wasn't always right, since sometimes the cache actually isn't available, often is,
but not always.
https://github.com/torvalds/linux/commit/34e431b0ae398fc54ea69ff85ec700722c9da773
This commit on the kernel explains it pretty clearly. 
Thanks Chris for bringing this to our attention.

5. Kind of more future-proofing, got rid of a bunch of hard-coded strings internally
and switched those to use the row_defaults values, which is where string messages 
are supposed to go. That was mostly in the initial program check messages on start-up,
but also a few other stray ones. Also consolidated them a bit to get rid of redundant
messages, and added more variable based messages, like for missing/permissions on 
programs etc. The idea in general is that all the strings are contained in subs so 
that in theory they could be swapped for other strings, eg, languages, but honestly,
I no longer see this as very likely to ever happen. But it's still nice to be 
consistent internally and not get sloppy with english strings.

This also got rid of some largely redundant items in row_defaults, and expanded the 
list of handled events, and of variable based events, so it shouldn't be as necessary 
to add new row_defaults items for similar events.

Enhancements:
1. Debugger item to maybe try to find distro OEM, this was connected with issue #231 
but the issue poster vanished, and didn't do the work required, so this one won't 
happen until someone who cares [not me, that is] does the required work. 
It's always funny to see how quickly people vanish when they have to do the actual 
boring research that they want me to do for them, lol. Or maybe, sigh is more 
appropriate than lol. But it is pretty much par for the course, sad to say.
Or maybe this was an OEM hoping to have someone do their corporate work for them
for free, who knows. Anyway, there's a certain category of items that I'm reasonably 
happy to implement, but NOT if I have to do all the boring research work, so such 
features being added will depend on the poster actually doing the boring work.

I've gotten burned on this a few times, cpu arch: for example, some guy said he'd
track that and provide updates, he never even made it to the first release, so I got
stuck doing that one forever after. But that one at least has some general value, so
that's ok more or less, but I definitely won't take on stuff that I really don't 
personally care at all about unless the person requesting the feature does all the work
beforehand. The boring part, that is....

2. Related to issue #226, much improved android ID and many small android fixes for 
machine data etc. Now uses /system/build.prop for some data, which is a nice source,
sadly, most modern android devices seem to be locked down, with both build.prop and 
/sys locked down, which makes inxi unable to actually get any of that data, but if
your device either does not have these root only readable, or if you have an android 
rooted phone, the android support will be more informative. 

Hint: if you run inxi in termux on your non rooted android device, and it shows 
you what android version you are using in System:... Distro: line, then your android 
is not locked down. I have one such phone, android 7.1, but I cannot say how usual
or non usual this is. The poster of issue #226 for instance had to root his android 
7 phone to get this data to display. So it seems to vary quite a bit.

Note that due to these file system lockdowns, in general, trying to do android arm 
support remains largely a waste of time, but on some devices sometimes, you can now 
get quite nice system info. As I noted in the issue, if I can't get the features to
work on a non rooted phone in my possession, I'm probably not going to try to do the 
work because it's too hard to try to work on android issues without having the device 
in front of you for testing and debugging. In this case, one of my phones did work, so 
I did the work just to see where android is at now.

Android showed some slightly odd syntaxes for some devices, but those are now handled 
where I got a dataset for them that revealed the changes required.

3. Also related to issue #226 for termux in android, will show -r info.
That's an apt based package manager, but termux puts the apt files somewhere else so 
needed to change paths if those alternate paths existed for apt.

4. Added PARTFLAGS to debugger to see what knd of data that will yield, that's
a lsblk key/value pair. 

5. Just because it's easy to do, added new -Ixxx item, wakeups: which is a 
subset of Uptime, this will show how many times the system has been woken from 
suspend since the last boot. If the system has never been suspended, shows 0.

6. Many more disk vendors and disk IDs. The list just never ends, possibly a 
metaphor for something, the endless spinning of maya, who knows?

7. Added newest known ubuntu release, hirsute, to buntu ID logic. Might as well 
catch them early, that will be 21.04.

-----------------------------------
-- Harald Hope - Wed, 11 Nov 2020 14:57:38 -0800

=====================================================================================
Version: 3.1.08
Patch: 00
Date: 2020-10-16
-----------------------------------
Changes:
-----------------------------------

Bug fixes, updates!!! Yes!! Why wait!!! Can't stay frozen forever!

Bugs:
1. Not an inxi bug, but a weird change in defaults for ubuntu GNOME ENV 
variable values when running at least the gnome desktop, result to end
users appears to be a bug. This resolves issue #228
Note that so much weird non desktop data was put into those environmental
variables that inxi simply could make no sense of it. The fix was to make
the detections more robust, using regex instead of string compare, as well as
to at least try to strip out such corrupted data values, though that can never
be fully predictable. 
As far as I know, this issue only hits ubuntu gnome desktops, I've never seen these
value corruptions on any other distro, or on any other ubuntu desktop, though 
they may be there, but I'm not going to test all the ubuntu spins to find out.

I'm hoping the combination of logic fixes and junk data cleaning will handle
most future instances of these types of corruptions automatically. 

Again, this only happens on relatively laste ubuntu gnomes as far as I know.

Fixes:
1. An oversight, added sshd to list of whitelisted start clients. This permits 
expected output for: ssh <name@server> inxi -bay
that is, running inxi as an ssh command string. Should have done that a while ago,
but better late than never.
This corrects issue #227, or at least, has a better default, it worked fine before,
but required using --tty to reset to default terminal behavior. The problem is 
that if inxi can't determine what it's running in, it defaults to thinking it's
in an IRC client, and switches to IRC color codes, among other changes.
But it was nice to get sshd covered automatically so users don't have to know
the --tty option.

Changes:
1. More disk vendors and vendor IDs!!! Yes, that's right, the list never ends!!

-----------------------------------
-- Harald Hope - Fri, 16 Oct 2020 13:43:40 -0700

=====================================================================================
Version: 3.1.07
Patch: 00
Date: 2020-09-29
-----------------------------------
Changes:
-----------------------------------

Bug fixes, feature updates, changes!!

Bugs:
1. There was a glitch in the pattern that made -D samsung / seagate not ID right, 
fixed.

2. I  do not like calling this a bug, because it's not an inxi bug, it's an upstream
regression in the syntax used in /proc/version, they changed a fully predictable 
gcc version .... to a random series of embedded/nested parentheses and other random
junk. inxi tries to deal with this regression, which will be perceived as a bug in 
systems running kernel 5.8 or newer and inxi 3.1.06 or older, since it will fail to
show the kernel build compiler version since it can't find it in the string.

I really dislike these types of regressions caused by bad ideas done badly and 
without any thought to the transmitted knowledge base, but that's how it goes, 
no discipline, I miss the graybeards, who cared about things like this.

Fixes:
1. more -D nvme id changes, intel in this case.

2. FreeBSD lsusb changed syntax, which triggered a series of errors when run. 
[hint bsd users, do NOT file issues that you want fixed and then not provide 
all the data required in a prompt and timely manner, otherwise, really,
why did you file the issue?].

Note: the fix basically just rejects any row from lsusb that does not have the 
expected syntax/value in the expected place, which was I think the right 
solution given that the change was random, broke expected syntax for lsusb, and 
wasn't really integrateable into existing inxi usb logic, so why fight it? 
Given that at least 99.99% of all lsusb output in the world, including by the 
way OpenBSD's [not sure about most recent version], shows the expected values in 
the expected place, I could see no value in creating a convoluted work-around 
for a non core bsd tool in the first place, so that's what I didn't do.

See the README.txt for what to do to get issues really handed in BSDs.

Changes:
1. -C 'boost' option changed from -xxx feature to -x feature. 
Consider it a promotion!

2. Added --dbg 19 switch to enable smart data debugging for -Da.

3. Some new tools to handle impossible data values for some -D situations for SMART
where the smart report contains gibberish values, that was issue #225 -- tools were
convert_hex and is_Hex. The utility for these is limited, but might be of use in 
some cases, like handling the above gibberish data value.

-----------------------------------
-- Harald Hope - Tue, 29 Sep 2020 16:08:05 -0700

=====================================================================================
Version: 3.1.06
Patch: 00
Date: 2020-08-16
-----------------------------------
Changes:
-----------------------------------

New features, new changes, new bug fixes!!! Excitement!!! Thrills!!!

Bugs: 
1. Forgot to set get Shell logic in inxi short form, oops, so Shell remained blank, 
only inxi short, which I rarely use so I didn't notice.

2. Failed to test pacman-g2 for packages, had wrong query argument, so it failed. 
Also failed to test for null data, so showed errors for packages as well. Both  
fixed.

3. A big bug, subtle, and also at the same time, an enhancement, it turns out NVME
drives do NOT follow the age old /proc/partitions logic where if the minor number is
divisible by 16 or has remainder 8 when divided by 16, it's a primary drive, not 
a partition. nvme drives use a random numbering when > 1 nvme drives are present, and
the old tests would fail for all nvme drivers more than the first one, which led 
to wrong disk size totals. Thanks gardotd426 who took the time to help figure this
out in issue #223 - fix is to not do that test for nvme drives, or rather, to add 
a last fail test for nvme primary nvme[0-9]n[0-9] drive detections, not the minor 
number.

Fixes:
1. Corrected indentation for block sizes, children were not indented.

2. Updated some older inxi-perl/docs pages, why not, once in a while?

3. Kernel 5.8 introduces a changed syntax to gcc string location, this has been 
corrected, and the kernel gcc version now shows correctly for the previous 
syntax and the new one. Hopefully they do not change it again, sigh...

4. Removed string 'hwmon' sensors from gpu, those are not gpu sensors, and
are also usually not board/cpu sensors, but things like ath10, iwl, etc, 
network, or disk sensors, etc. In some cases hwmon sensor data would appear

Enhancements:
1. Big sensors refactor, now inxi supports two new sensors options:
--sensors-exclude - which allows you to exclude any primary sensor type[s]. Note that
in the refactored logic, and in the old logic, gpu sensors were already excluded.
Now other hardware specific sensors like network are excluded as well.

--sensors-use - use ONLY list of supplied sensor IDs, which have to match the
syntax you see in lm-sensors sensors output.

Both accept comma separated list of sensors, 1 or more, no spaces.

The refactor however is more far reaching, now inxi stores and structures data
not as a long line of sensors and data without differentiation, but by sensor array/chip
ID, which is how  the exclude and use features can work, and how granular default 
hardware sensor exclusions and uses can happen. This is now working in the gpu
sensors, and will in the future be extended to the newer 5.7/5.8 kernel disk 
temperature sensors values, which will lead in some cases to being able to get 
sensors data for disks without root or hddtemp. This is a complicated bit of logic,
and I don't have time to do it right now, but the data is now there and stored
and possible to use in the future.

To see sensors structures, use: inxi -s --dbg 18 and that will show the sensors data 
and its structures, which makes debugger a lot easier for new features.

This issue was originally generated by what was in my view an invalid complaint 
about some inxi sensors defaults, which led me to look more closely at sensors
logic, which is severely lacking. More work on sensors will happen in the future,
time, health, and energy permitting. 

2. Added Watts, mem temp, for amdgpu sensors, as -sxxx option. More gpu sensor
data will be added as new data samples show what will be available for the 
free modules like amdgpu, nouvean, and the intel graphics modules.

3. More disk vendors and IDs, as noted, the list never ends, and it hasn't ended,
so statement remains true. Thanks linux-lite hardware database.

Changes:

1. This has always bugged me since it was introduced, the primary cpu line starter 
Topology: which was only technically accurate for its direct value, not its children,
and also, in -b, cpu short form was using the value as the key, which is a no-no, 
I'd been meaning to fix that too, but finally realized if I just make the primary 
CPU line key be 'Info:', which is short, yet non-ambiguous, it would solve both
problems. 
To keep the -b cpu line as short as before, I removed the 'type:' and integraged 
that value into the primary Info: string:
CPU:
  Info: 6-Core AMD Ryzen 5 2600 [MT MCP] speed: 2750 MHz min/max: 1550/3400 MHz 
  
-b 3.1.05 and earlier:
CPU:
  6-Core: AMD Ryzen 5 2600 type: MT MCP speed: 1515 MHz min/max: 1550/3400 MHz
  
These resolve something that has irked me for quite a while, 'Topology:' didn't
fit, it was too geeky, and worst, it only applied to the value directly following
it, NOT to the rest of the CPU information. It also could not be shortened or
abbreviated since then it would have made no actual sense, like topo:, and the
same issue with value being used for key in -b, and wrong word for line starter
in -C would have existed. Besides, someone might think I was trying to make a 
subtle reference to the great Jodorowsky film 'El Topo', which would be silly,
because that's art, and this is just some system specs that are reasonably 
readable...

2. Was using opendns for WAN dig IP address, but apparently cysco bought that 
company, and now I've noticed the old opendns dig queries were failing more and
more, so replaced that with akamai dig requests.
Also made the WAN IP fallback to HTTP IP method if dig failed. New option:
--no-http-wan and config item NO_HTTP_WAN with override --http-wan added to
let you switch off http wan IP requests if you want. Note that if dig fails,
you will get no wan ip address. 
Updated/improved error messages to handle this more complex set of wan ip 
options, so hopefully the error alert message will in most cases be right.

3. To future proof inxi, switched debugger upload location to ftp.smxi.org/incoming 
from the old techpatterns.com/incoming. Updated man/help to remove those urls too.


-----------------------------------
-- Harald Hope - Sun, 16 Aug 2020 14:28:58 -0700

=====================================================================================
Version: 3.1.05
Patch: 00
Date: 2020-07-26
-----------------------------------
Changes:
-----------------------------------

Bug fixes!!! New Features!! Why wait!!!

Bugs:
1. Issue #220 on github: inxi misidentified XFCE as Gnome. This was a kind of core
issue, and pointed to some logic that needed updating, and some inadequate 
assumptions made, and some too loose cascade of tests. Hopefully now xfce will
almost never get misidentified, and the other primary desktops ID'ed either from
$ENV or from xrop -root will be slightly more accurately identified as well.

Note that this fix creates a possibility for obscure misconfigured desktops to
be ID'ed wrong, but in this case, that will be technically a bug for them, but
with the new fixes, that situation will be cleaner to handle internally in the
desktop ID logic.

Also tightened the final Gnome fallback detection to not trigger a possible
false positive, it was testing for ^_GNOME but that is not adequate, because
some gnome programs will trigger these values in xprop -root even if GNOME 
is not running. Should be safer now, hopefully no new bugs will be triggered
by these changes.

Fixes:
1. Missed an indentation level for -y1, gcc alt should have been indented in
one more level, now it is.

2. In disk vendors/family, didn't clean items starting with '/', this is
now corrected. Yes, some do, don't ask me why. Might be cases like:
Crucial/Micron maybe, where the first ID is grabbed, not sure.


Enhancements:
1. New Disk vendors, vendor IDs!!! The list never ends!!! We've finally found
infinity, and it is the unceasing wave of tiny and not so tiny disks and their
Ids.

2. New feature: for -Aa, -Na/-na/-ia, -Ga, now will add the modules the kernel
could support if they were available on the Device-x lines of those items.
This was made an -a option because it really makes no sense, if it's a regular
option, users might think that for example an nvidia card had a nouveua driver
when it didn't, when in fact, all the kernel is saying is that it knows those
listed modules 'couid' be used or present. This corresponds to the Display:
item in -Ga, that lists 'alternate:' drivers that Xorg knows about that could
likewise be used, if they were on the system.

In other words these are --admin options because otherwise users might get confused,
so this is one where you want to know the man explanation before you ask for it.

It is useful however if you're not sure what your choices are for kernel modules.

When the alternate driver is the same as the active driver, or if none is found,
it does not show the alternate: item to avoid spamming.


-----------------------------------
-- Harald Hope - Sun, 26 Jul 2020 19:10:21 -0700

=====================================================================================
Version: 3.1.04
Patch: 00
Date: 2020-06-28
-----------------------------------
Changes:
-----------------------------------

New version, new man, huge update, bug fixes, cleanups, updates!! 

What started as a relatively minor issue report ended up with a refactor of big 
chunks of some of the oldest code and logic in inxi.

So many bugs and fixes, updates, and enhancements, that I will probably miss some 
when I try to list them.
