version upgrade

got rid of that horrible banlist array/function thing, now it's hard coded.

On a dual core system, this saves literally 0.1 seconds on execution, about 10-20% of execution time.

this also fixes a bug that has always existed, which is if you use spaces to replace instead of ''.

Another advantage of this new method it fixes the fact that each and every string character would be considered a match, null replaced with null.

This was due to the fact that each banlist string started with |, ie, it contained a null character in the search pattern... sigh.

This is why we don't use stupid bash tricks, ok people? They  hide bugs, and make the code write only.
This commit is contained in:
inxi-svn 2011-06-20 21:58:17 +00:00
parent 6024b3b387
commit 06cc997157

110
inxi
View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
######################################################################## ########################################################################
#### Script Name: inxi #### Script Name: inxi
#### version: 1.7.4 #### version: 1.7.5
#### Date: June 20 2011 #### Date: June 20 2011
#### Patch Number: 00 #### Patch Number: 00
######################################################################## ########################################################################
@ -57,7 +57,7 @@
#### http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00144.html #### http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00144.html
#### Bash 3.1 for proper array use #### Bash 3.1 for proper array use
#### ####
#### Arrays work in bash 2.05b, but "egrep -m" does not #### Arrays work in bash 2.05b, but "grep -Em" does not
#### ####
#### RECOMMENDS (Needed to run certain features, listed by option) #### RECOMMENDS (Needed to run certain features, listed by option)
#### -A - for output of usb audio information: lsusb (usbutils) #### -A - for output of usb audio information: lsusb (usbutils)
@ -112,19 +112,20 @@
#### Arrays should start with a_ (local) or A_ (global). #### Arrays should start with a_ (local) or A_ (global).
#### ####
#### SPECIAL NOTES: #### SPECIAL NOTES:
#### The color variable ${C2} must always be followed by a space unless you know what #### * The color variable ${C2} must always be followed by a space unless you know what
#### character is going to be next for certain. Otherwise irc color codes can be accidentally #### character is going to be next for certain. Otherwise irc color codes can be accidentally
#### activated or altered. #### activated or altered.
#### #### * For native script konversation support (check distro for correct konvi scripts path):
#### For native script konversation support (check distro for correct konvi scripts path): #### ln -s <path to inxi> /usr/share/apps/konversation/scripts/inxi
#### ln -s <path to inxi> /usr/share/apps/konversation/scripts/inxi #### DCOP doesn't like \n, so avoid using it for most output unless required, as in error messages.
#### DCOP doesn't like \n, so avoid using it for most output unless required, as in error messages. #### * print_screen_output " " # requires space, not null, to avoid error in for example in irssi
#### * For logging of array data, array must be placed into the temp_array, otherwise only the first key logs
#### * In gawk search patterns, . is a wildcard EXCEPT in [0-9.] type containers, then it's a literal
#### So outside of bracketed items, it must be escaped, \. but inside, no need. Outside of gawk it should
#### be escaped in search patterns if you are using it as a literal.
#### ####
#### As with all 'rules' there are acceptions, these are noted where used. #### As with all 'rules' there are acceptions, these are noted where used.
#### ####
#### print_screen_output " " # requires space, not null, to avoid error in for example in irssi
#### For logging of array data, array must be placed into the temp_array, otherwise only the first key logs
####
################################################################################### ###################################################################################
#### KDE Konversation information. Moving from dcop(qt3/KDE3) to dbus(qt4/KDE4) #### KDE Konversation information. Moving from dcop(qt3/KDE3) to dbus(qt4/KDE4)
################################################################################### ###################################################################################
@ -481,15 +482,10 @@ DISTROS_LSB_GOOD="mandrake-release mandriva-release mandrakelinux-release"
# Puppy Linux 4.1.2 (Bash 3.0: arrays won't work) --> works partially # Puppy Linux 4.1.2 (Bash 3.0: arrays won't work) --> works partially
### Bans Data ### Bans Data
# Precede a banword with $'\2' to prevent it from being subject to automated escaping by the make_ban_lists routine # Note that \<ltd\> bans only words, not parts of strings; in \<corp\> you can't use punctuation characters like . or ,
# $'\1' gets weird results : # we're saving about 10% of the exec time by hand building the ban lists here, using hard quotes.
# user@host $ ARR=($'\x01'"one two" three four); echo ${ARR[0]} | hd -v BAN_LIST_NORMAL='computing|computer|corporation|communications|electronics|electrical|electric|gmbh|group|industrial|international|revision|software|technologies|technology|\<ltd\>|ltd\.|\<inc\>|inc\.|intl\.|\<co\>|co\.|corp\.|\(tm\)|\(r\)|®|\(rev ..\)'
# 00000000 01 01 6f 6e 65 20 74 77 6f 0a |..one two.| BAN_LIST_CPU='@|cpu deca|dual core|dual-core|tri core|tri-core|quad core|quad-core|ennea|genuine|hepta|hexa|multi|octa|penta|processor|single|triple|[0-9\.]+ *[MmGg][Hh][Zz]'
A_NORMAL_BANS=( computing computer corporation communications electronics electrical electric gmbh group industrial international revision software technologies technology $'\2'"\<ltd\>" ltd. ltd $'\2'"\<inc\>" intl. inc. $'\2'\<co\> co. corp. "(tm)" "(r)" "®" $'\2'"\(rev ..\)" )
A_CPU_BANS=( @ cpu deca 'dual core' dual-core 'tri core' tri-core 'quad core' quad-core ennea genuine hepta hexa multi octa penta 'processor' processor single triple $'\2'"[0-9.]+ *[MmGg][Hh][Zz]" )
# after processing, the ban arrays will be put into these:
BAN_LIST_NORMAL=''
BAN_LIST_CPU=''
### USB networking search string data, because some brands can have other products than ### USB networking search string data, because some brands can have other products than
### wifi/nic cards, they need further identifiers, with wildcards. ### wifi/nic cards, they need further identifiers, with wildcards.
@ -521,19 +517,7 @@ main()
# Not all distro's have these depends installed by default # Not all distro's have these depends installed by default
check_script_depends check_script_depends
check_script_suggested_apps check_script_suggested_apps
# note: this needs to go AFTER depends check because these use gawk
# Do this after sourcing of config overrides so user can customize banwords
# Contrary to my previous belief, "${ARR[@]}" passes a quoted list, not one string
BAN_LIST_NORMAL=$( make_ban_lists "${A_NORMAL_BANS[@]}" )
BAN_LIST_CPU=$( make_ban_lists "${A_CPU_BANS[@]}" )
# echo "BAN_LIST_NORMAL='$BAN_LIST_NORMAL'"
# echo "BAN_LIST_CPU='$BAN_LIST_CPU'"
# first init function must be set first for colors etc. Remember, no debugger
# stuff works on this function unless you set the debugging flag manually.
# Debugging flag -@ [number] will not work until get_parameters runs.
### Only continue if depends ok ### Only continue if depends ok
SCRIPT_PATH=$( dirname $0 ) SCRIPT_PATH=$( dirname $0 )
SCRIPT_VERSION_NUMBER=$( grep -im 1 'version:' $SCRIPT_PATH/$SCRIPT_NAME | gawk '{print $3}' ) SCRIPT_VERSION_NUMBER=$( grep -im 1 'version:' $SCRIPT_PATH/$SCRIPT_NAME | gawk '{print $3}' )
@ -587,7 +571,11 @@ main()
# print_screen_output "DCPORT: $DCPORT" # print_screen_output "DCPORT: $DCPORT"
# print_screen_output "DCSERVER: $DCSERVER" # print_screen_output "DCSERVER: $DCSERVER"
# print_screen_output "DCTARGET: $DCTARGET" # print_screen_output "DCTARGET: $DCTARGET"
# first init function must be set first for colors etc. Remember, no debugger
# stuff works on this function unless you set the debugging flag manually.
# Debugging flag -@ [number] will not work until get_parameters runs.
# "$@" passes every parameter separately quoted, "$*" passes all parameters as one quoted parameter. # "$@" passes every parameter separately quoted, "$*" passes all parameters as one quoted parameter.
# must be here to allow debugger and other flags to be set. # must be here to allow debugger and other flags to be set.
get_parameters "$@" get_parameters "$@"
@ -843,34 +831,6 @@ sanitize_characters()
eval $LOGFE eval $LOGFE
} }
# Filter boilerplate & buzzwords.
# args: $1 - quoted: "$@" array of ban terms
make_ban_lists()
{
eval $LOGFS
local ban_list=''
# Iterate over $@
## note: this is a weird, non-intuitive method, needs some documentation or rewriting
## if you declare ban_string it stops working, have to read up on this
for ban_string
do
# echo "term=\"$ban_string\"" # >&2
if [[ ${ban_string:0:1} = $'\2' ]];then
ban_list="${ban_list}${ban_list+|}${ban_string:1:${#ban_string}-1}"
else
# Automatically escapes [ ] ( ) . and +
ban_list="${ban_list}${ban_list+|}$( echo "$ban_string" | gawk '{
gsub(/([\[\]+().])/,"\\\\&")
print
}' )"
fi
done
echo "$ban_list"
eval $LOGFS
}
# make_ban_lists "${A_CPU_BANS[@]}";exit
# Set the colorscheme # Set the colorscheme
# args: $1 = <scheme number>|<"none"> # args: $1 = <scheme number>|<"none">
set_color_scheme() set_color_scheme()
@ -2590,7 +2550,7 @@ get_audio_data()
IFS=$'\n' IFS=$'\n'
# this first step handles the drivers for cases where the second step fails to find one # this first step handles the drivers for cases where the second step fails to find one
device_count=$( echo "$Lspci_Data" | egrep -ic '(multimedia audio controller|audio device)' ) device_count=$( echo "$Lspci_Data" | grep -iEc '(multimedia audio controller|audio device)' )
if [[ $device_count -eq 1 ]] && [[ $B_ASOUND_DEVICE_FILE == 'true' ]];then if [[ $device_count -eq 1 ]] && [[ $B_ASOUND_DEVICE_FILE == 'true' ]];then
alsa_driver=$( gawk -F ']: ' ' alsa_driver=$( gawk -F ']: ' '
BEGIN { BEGIN {
@ -2618,7 +2578,7 @@ get_audio_data()
IGNORECASE=1 IGNORECASE=1
} }
/multimedia audio controller|audio device/ { /multimedia audio controller|audio device/ {
audioCard=gensub(/^[0-9a-f:.]+ [^:]+: (.+)$/,"\\1","g",$0) audioCard=gensub(/^[0-9a-f:\.]+ [^:]+: (.+)$/,"\\1","g",$0)
# The doublequotes are necessary because of the pipes in the variable. # The doublequotes are necessary because of the pipes in the variable.
gsub(/'"$BAN_LIST_NORMAL"'/, "", audioCard) gsub(/'"$BAN_LIST_NORMAL"'/, "", audioCard)
gsub(/,/, " ", audioCard) gsub(/,/, " ", audioCard)
@ -2786,7 +2746,7 @@ get_audio_alsa_data()
# some alsa strings have the build date in (...) # some alsa strings have the build date in (...)
# remove trailing . and remove possible second line if compiled by user # remove trailing . and remove possible second line if compiled by user
$0 !~ /compile/ { $0 !~ /compile/ {
gsub( "Driver | [(].*[)]|\.$","",$0 ) gsub( /Driver | [(].*[)]|\.$/,"",$0 )
gsub(/,/, " ", $0) gsub(/,/, " ", $0)
gsub(/^ +| +$/, "", $0) gsub(/^ +| +$/, "", $0)
gsub(/ [ \t]+/, " ", $0) gsub(/ [ \t]+/, " ", $0)
@ -3301,7 +3261,7 @@ get_distro_data()
log_function_data "distro_file: $distro_file" log_function_data "distro_file: $distro_file"
# first test for the legacy antiX distro id file # first test for the legacy antiX distro id file
if [[ -e /etc/antiX ]];then if [[ -e /etc/antiX ]];then
distro="$( egrep -oi 'antix.*\.iso' <<< $( remove_erroneous_chars '/etc/antiX' ) | sed 's/\.iso//' )" distro="$( grep -Eoi 'antix.*\.iso' <<< $( remove_erroneous_chars '/etc/antiX' ) | sed 's/\.iso//' )"
# this handles case where only one release/version file was found, and it's lsb-release. This would # this handles case where only one release/version file was found, and it's lsb-release. This would
# never apply for ubuntu or debian, which will filter down to the following conditions. In general # never apply for ubuntu or debian, which will filter down to the following conditions. In general
# if there's a specific distro release file available, that's to be preferred, but this is a good backup. # if there's a specific distro release file available, that's to be preferred, but this is a good backup.
@ -3929,14 +3889,14 @@ get_hard_drive_data_advanced()
## check for all ide type drives, non libata, only do it if hdx is in array ## check for all ide type drives, non libata, only do it if hdx is in array
## this is now being updated for new /sys type paths, this may handle that ok too ## this is now being updated for new /sys type paths, this may handle that ok too
if [[ -n $( egrep 'hd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then if [[ -n $( grep -E 'hd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then
# remember, we're using the last array item to store the total size of disks # remember, we're using the last array item to store the total size of disks
for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ )) for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ ))
do do
IFS="," IFS=","
a_temp_working=( ${A_HDD_DATA[i]} ) a_temp_working=( ${A_HDD_DATA[i]} )
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
if [[ -n $( egrep '^hd[a-z]' <<< ${a_temp_working[0]} ) ]];then if [[ -n $( grep -E '^hd[a-z]' <<< ${a_temp_working[0]} ) ]];then
if [[ -e /proc/ide/${a_temp_working[0]}/model ]];then if [[ -e /proc/ide/${a_temp_working[0]}/model ]];then
a_temp_working[2]="$( remove_erroneous_chars /proc/ide/${a_temp_working[0]}/model )" a_temp_working[2]="$( remove_erroneous_chars /proc/ide/${a_temp_working[0]}/model )"
else else
@ -3991,12 +3951,12 @@ get_hard_drive_data_advanced()
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
## then we'll loop through that array looking for matches. ## then we'll loop through that array looking for matches.
if [[ -n $( egrep 'sd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then if [[ -n $( grep -E 'sd[a-z]' <<< ${A_HDD_DATA[@]} ) ]];then
# first pack the main ls variable so we don't have to keep using ls /dev... # first pack the main ls variable so we don't have to keep using ls /dev...
ls_disk_by_id="$( ls -l /dev/disk/by-id )" ls_disk_by_id="$( ls -l /dev/disk/by-id )"
for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ )) for (( i=0; i < ${#A_HDD_DATA[@]} - 1; i++ ))
do do
if [[ -n $( egrep '^sd[a-z]' <<< ${A_HDD_DATA[$i]} ) ]];then if [[ -n $( grep -E '^sd[a-z]' <<< ${A_HDD_DATA[$i]} ) ]];then
IFS="," IFS=","
a_temp_working=( ${A_HDD_DATA[$i]} ) a_temp_working=( ${A_HDD_DATA[$i]} )
IFS="$ORIGINAL_IFS" IFS="$ORIGINAL_IFS"
@ -4012,7 +3972,7 @@ get_hard_drive_data_advanced()
# discovered disk name AND ends with the correct identifier, sdx # discovered disk name AND ends with the correct identifier, sdx
# get rid of whitespace for some drive names and ids, and extra data after - in name # get rid of whitespace for some drive names and ids, and extra data after - in name
temp_name=$( tr ' ' '_' <<< ${a_temp_scsi[$j]} | cut -d '-' -f 1 ) temp_name=$( tr ' ' '_' <<< ${a_temp_scsi[$j]} | cut -d '-' -f 1 )
sd_ls_by_id=$( egrep -m1 ".*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" ) sd_ls_by_id=$( grep -Em1 ".*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" )
if [[ -n $sd_ls_by_id ]];then if [[ -n $sd_ls_by_id ]];then
temp_name=${a_temp_scsi[$j]} temp_name=${a_temp_scsi[$j]}
@ -4029,7 +3989,7 @@ get_hard_drive_data_advanced()
if [[ -z $temp_name ]];then if [[ -z $temp_name ]];then
temp_name="Name n/a" temp_name="Name n/a"
else else
usb_exists=$( egrep -m1 "usb-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" ) usb_exists=$( grep -Em1 "usb-.*$temp_name.*${a_temp_working[0]}$" <<< "$ls_disk_by_id" )
if [[ -n $usb_exists ]];then if [[ -n $usb_exists ]];then
a_temp_working[3]='USB' a_temp_working[3]='USB'
fi fi
@ -4215,7 +4175,7 @@ get_networking_data()
IGNORECASE=1 IGNORECASE=1
counter=0 # required to handle cases of > 1 instance of the same chipset counter=0 # required to handle cases of > 1 instance of the same chipset
} }
/^[0-9a-f:.]+ (ethernet|network) (controller|bridge)/ || /^[0-9a-f:.]+ [^:]+: .*(ethernet|network).*$/ { /^[0-9a-f:\.]+ (ethernet|network) (controller|bridge)/ || /^[0-9a-f:\.]+ [^:]+: .*(ethernet|network).*$/ {
nic=gensub(/^[0-9a-f:\.]+ [^:]+: (.+)$/,"\\1","g",$0) nic=gensub(/^[0-9a-f:\.]+ [^:]+: (.+)$/,"\\1","g",$0)
gsub(/realtek semiconductor/, "Realtek", nic) gsub(/realtek semiconductor/, "Realtek", nic)
gsub(/davicom semiconductor/, "Davicom", nic) gsub(/davicom semiconductor/, "Davicom", nic)
@ -5723,12 +5683,12 @@ calculate_multicore_data()
eval $LOGFS eval $LOGFS
local string_number=$1 string_data='' local string_number=$1 string_data=''
if [[ -n $( egrep -i '( mb| kb)' <<< $1 ) ]];then if [[ -n $( grep -Ei '( mb| kb)' <<< $1 ) ]];then
string_data=" $( gawk '{print $2}' <<< $1 )" # add a space for output string_data=" $( gawk '{print $2}' <<< $1 )" # add a space for output
string_number=$( gawk '{print $1}' <<< $1 ) string_number=$( gawk '{print $1}' <<< $1 )
fi fi
# handle weird error cases where it's not a number # handle weird error cases where it's not a number
if [[ -n $( egrep '^[0-9\.,]+$' <<< $string_number ) ]];then if [[ -n $( grep -E '^[0-9\.,]+$' <<< $string_number ) ]];then
string_number=$( echo $string_number $2 | gawk '{ string_number=$( echo $string_number $2 | gawk '{
total = $1*$2 total = $1*$2
print total print total