diff --git a/inxi b/inxi index b7d9fc9..f453508 100644 --- a/inxi +++ b/inxi @@ -1,31 +1,26 @@ #!/bin/bash -######################################################################## -#### Script Name: inxi -#### version: 1.0.17 -#### Date: 16 June 2009 -######################################################################## +################################################################################### +SCRIPT_NAME="inxi" +SCRIPT_VERSION_NUMBER="1.0.18" +#### Date: 7 July 2009 +################################################################################### #### SPECIAL THANKS -######################################################################## -#### Special thanks to all those in #lsc and #smxi for their tireless -#### dedication helping test inxi modules. -######################################################################## +################################################################################### +#### +#### http://code.google.com/p/inxi/wiki/SpecialThanks +#### +################################################################################### #### ABOUT INXI -######################################################################## -#### inxi is a fork of infobash 3.02, the original bash sys info script by locsmif -#### As time permits functionality improvements and recoding will occur. +################################################################################### #### -#### inxi, the universal, portable, system info script for irc. -#### Tested with Irssi, Xchat, Konversation, BitchX, KSirc, ircII, -#### Gaim/Pidgin, Weechat, KVIrc and Kopete. -#### Original infobash author and copyright holder: -#### Copyright (C) 2005-2007 Michiel de Boer a.k.a. locsmif -#### inxi version: Copyright (C) 2008-9 Scott Rogers & Harald Hope -#### Further fixes (listed as known): Horst Tritremmel -#### Steven Barrett (aka: damentz) - usb audio patch; swap percent used patch -#### -#### Current script home page: http://techpatterns.com/forums/about1131.html +#### 'About' wiki : http://code.google.com/p/inxi/wiki/About +#### Current script home page: http://www.inxi.org #### Script svn: http://code.google.com/p/inxi #### +################################################################################### +#### LICENSE +################################################################################### +#### #### This program is free software; you can redistribute it and/or modify #### it under the terms of the GNU General Public License as published by #### the Free Software Foundation; either version 3 of the License, or @@ -41,91 +36,32 @@ #### #### If you don't understand what Free Software is, please read (or reread) #### this page: http://www.gnu.org/philosophy/free-sw.html -######################################################################## +#### +################################################################################### #### DEPENDENCIES -#### bash >=3.0(bash), df;readlink;stty;tr;uname;wc(coreutils), -#### gawk(gawk), grep(grep), hostname(hostname), lspci(pciutils), -#### ps;uptime(procps), glxinfo;xdpyinfo;xrandr(xbase-clients) -#### Also the proc filesystem should be present and mounted +################################################################################### #### -#### Apparently unpatched bash 3.0 has arrays broken; bug reports: -#### http://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-008 -#### http://lists.gnu.org/archive/html/bug-bash/2004-08/msg00144.html +#### http://code.google.com/p/inxi/wiki/Dependencies #### -#### Arrays work in bash 2.05b, but "egrep -m" does not -#### -#### RECOMMENDS (Needed to run certain features) -#### For local interfaces/IP test: ifconfig (in net-tools for Debian systems) -#### runlevel(sysvinit): to view current runlevel while not in X window system -#### Bash 3.1 for proper array use -######################################################################## +################################################################################### #### CONVENTIONS: -#### Indentation: TABS -#### Do not use `....` (back quotes), those are totally non-reabable, use $(....). -#### Do not use one liner flow controls. -#### The ONLY time you should use ';' (semi-colon) is in this single case: if [[ condition ]];then. -#### Never use compound 'if': ie, if [[ condition ]] && statement. -#### Note: [[ -n $something ]] - double brackets does not require quotes for variables: ie, "$something". -#### Always use quotes, double or single, for all string values. +################################################################################### #### -#### All new code/methods must be in a function. -#### For all boolean tests, use 'true' / 'false'. -#### !! Do NOT use 0 or 1 unless it's a function return. -#### Avoid complicated tests in the if condition itself. -#### To 'return' a value in a function, use 'echo '. -#### -#### For gawk: use always if ( num_of_cores > 1 ) { hanging { starter for all blocks -#### This lets us use one method for all gawk structures, including BEGIN/END, if, for, etc -#### -#### VARIABLE/FUNCTION NAMING: -#### All functions should follow standard naming--verb adjective noun. -#### ie, get_cpu_data -#### All variables MUST be initialized / declared explicitly. -#### All variables should clearly explain what they are, except counters like i, j. -#### Each word of variable must be separated by '_' (underscore) (camel form). -#### Global variables are 'UPPER CASE', at top of script. -#### ie, SOME_VARIABLE='' -#### Local variables are 'lower case' and declared at the top of the function. -#### ie, some_variable='' -#### Locals that will be inherited by child functions have first char capitalized (so you know they are inherited). -#### ie, Some_Variable -#### -#### Booleans should start with b_ (local) or B_ (global) and state clearly what is being tested. -#### Arrays should start with a_ (local) or A_ (global). -#### -#### SPECIAL NOTES: -#### 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 -#### activated or altered. -#### -#### For native script konversation support (check distro for correct konvi scripts path): -#### ln -s /usr/share/apps/konversation/scripts/inxi -#### DCOP doesn't like \n, so avoid using it for most output unless required, as in error messages. -#### -#### As with all 'rules' there are acceptions, these are noted where used. +#### http://code.google.com/p/inxi/wiki/inxi_Programming_Conventions #### ################################################################################### #### KDE Konversation information. Moving from dcop(qt3/KDE3) to dbus(qt4/KDE4) ################################################################################### -#### dcop and dbus -- these talk back to Konversation from this script +#### +#### http://code.google.com/p/inxi/wiki/dbusNdcop #### -#### Scripting info -- http://konversation.berlios.de/docs/scripting.html -#### -- http://www.kde.org.uk/apps/konversation/ -#### -#### dbus info -- http://dbus.freedesktop.org/doc/dbus-tutorial.html -#### view dbus info -- https://fedorahosted.org/d-feet/ -#### -- or run qdbus -#### Konvi dbus/usage-- qdbus org.kde.konversation /irc say -#### -#### Python usage -- http://wiki.python.org/moin/DbusExamples (just in case) -#### -#### Because webpages come and go, the above information needs to be moved to inxi's wiki -#### -######################################################################## +################################################################################### #### Valuable Resources -#### gawk arrays: http://www.math.utah.edu/docs/info/gawk_12.html -######################################################################## +#### http://code.google.com/p/inxi/wiki/Special_Notes +#### +################################################################################### #### TESTING FLAGS +################################################################################### #### inxi supports advanced testing triggers to do various things, using -! #### -! 1 - triggers default B_TESTING_1='true' to trigger some test or other #### -! 2 - triggers default B_TESTING_2='true' to trigger some test or other @@ -140,36 +76,141 @@ #### -@ 8 - Basic data logging of generated data / array values #### -@ 9 - Full logging of all data used, including cat of files and system data #### -@ 10 - Basic data logging plus color code logging -######################################################################## +#### +################################################################################### +#### NOTES: for comments/information not appropriate elsewhere in script +################################################################################### +#### +#### hwinfo could be used, if it's available in all systems, or most, +#### to get a lot more data and verbosity levels going. +#### +##### Distros with known problems +#### DSL (Bash 2.05b: grep -m doesn't work; arrays won't work) --> unusable output +#### Puppy Linux 4.1.2 (Bash 3.0: arrays won't work) --> works partially +#### +################################################################################### +## +# Clear nullglob, because it creates unpredictable situations with +# IFS=$'\n' ARR=($VAR) IFS="$ORIGINAL_IFS"type constructs. +# Stuff like [rev a1] is now seen as a glob expansion pattern, and fails, +# and therefore results in nothing. +shopt -u nullglob +## +################################################################################### #### VARIABLES -######################################################################## +################################################################################### +## Constants +############### These have potential to be put into an rc file (ie ~/.inxirc) +# Array-Constants +A_DEPENDS="df free gawk grep hostname lspci ps readlink tr uname uptime wc" +A_X_APPS="xrandr xdpyinfo glxinfo" # xorg-utils (arch) || x11-utils (debian) +A_EXTRA_PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" +# Extra path variable to make execute failures less likely, merged below -## NOTE: we can use hwinfo if it's available in all systems, or most, to get -## a lot more data and verbosity levels going +### Output Colors Constants +# A more elegant way to have a scheme that doesn't print color codes (neither ANSI nor mIRC) at all. See below. +unset EMPTY +# DGREY BLACK RED DRED GREEN DGREEN YELLOW DYELLOW +ANSI_COLORS="       " +IRC_COLORS=" \x0314 \x0301 \x0304 \x0305 \x0309 \x0303 \x0308 \x0307" +# BLUE DBLUE MAGENTA DMAGENTA CYAN DCYAN WHITE GREY NORMAL +ANSI_COLORS="$ANSI_COLORS         " +IRC_COLORS=" $IRC_COLORS \x0312 \x0302 \x0313 \x0306 \x0311 \x0310 \x0300 \x0315 \x03" +# +#ANSI_COLORS=($ANSI_COLORS); IRC_COLORS=($IRC_COLORS) +A_COLORS_AVAILABLE=( DGREY BLACK RED DRED GREEN DGREEN YELLOW DYELLOW BLUE DBLUE MAGENTA DMAGENTA CYAN DCYAN WHITE GREY NORMAL ) +# See above for notes on EMPTY +A_COLOR_SCHEMES=( EMPTY,EMPTY,EMPTY NORMAL,NORMAL,NORMAL BLUE,NORMAL,NORMAL GREEN,YELLOW,NORMAL DYELLOW,NORMAL,NORMAL CYAN,BLUE,NORMAL RED,NORMAL,NORMAL GREEN,NORMAL,NORMAL YELLOW,NORMAL,NORMAL GREEN,DGREEN,NORMAL BLUE,RED,NORMAL BLUE,NORMAL,RED YELLOW,WHITE,GREEN BLUE,NORMAL,GREEN DCYAN,NORMAL,DMAGENTA ) -### Variable initializations: null values -CMDL_MAX='' -COLOR_SCHEME='' -COLOR_SCHEME_SET='' -IRC_CLIENT='' -IRC_CLIENT_VERSION='' +# Directory-Constants +DIR_CPUINFO='/proc/cpuinfo' +DIR_MEMINFO='/proc/meminfo' +DIR_ASOUND_DEVICE='/proc/asound/cards' +DIR_ASOUND_VERSION='/proc/asound/version' +DIR_LSB_RELEASE='/etc/lsb-release' +DIR_SCSI='/proc/scsi/scsi' +DIR_MODULES='/proc/modules' # +DIR_MOUNTS='/proc/mounts' +DIR_PARTITIONS='/proc/partitions' # +DIR_IFCONFIG='/sbin/ifconfig' -### primary data array holders ## usage: 'A_' -A_AUDIO_DATA='' -A_CMDL='' -A_CPU_CORE_DATA='' -A_CPU_DATA='' -A_CPU_TYPE_PCNT_CCNT='' -A_DEBUG_BUFFER='' -A_GFX_CARD_DATA='' -A_GLX_DATA='' -A_HDD_DATA='' -A_INTERFACES_DATA='' -A_NETWORK_DATA='' -A_PARTITION_DATA='' -A_X_DATA='' +# Script names/paths - must be non root writable +# Various-Constants +SCRIPT_DATA_DIR="$HOME/.inxi" +LOG_FILE="$SCRIPT_DATA_DIR/inxi.log" +LOG_FILE_1="$SCRIPT_DATA_DIR/inxi.1.log" +LOG_FILE_2="$SCRIPT_DATA_DIR/inxi.2.log" +SCRIPT_NAME="inxi" +SCRIPT_DOWNLOAD='http://inxi.googlecode.com/svn/trunk/' +SCRIPT_DOWNLOAD_BRANCH_1='http://inxi.googlecode.com/svn/branches/one/' +SCRIPT_DOWNLOAD_BRANCH_2='http://inxi.googlecode.com/svn/branches/two/' +SCRIPT_DOWNLOAD_BRANCH_3='http://inxi.googlecode.com/svn/branches/three/' +SCRIPT_DOWNLOAD_BRANCH_4='http://inxi.googlecode.com/svn/branches/four/' +SCRIPT_DOWNLOAD_DEV='http://smxi.org/test/' +KONVI_CFG="konversation/scripts/$SCRIPT_NAME.conf" # relative path to $(kde-config --path data) -### Boolean true/false globals ## usage: 'B_' +### Script Localization Constant +# Make sure every program speaks English. +LC_ALL="C" +export LC_ALL + +# logging eval variables, start and end function: Insert to LOGFS LOGFE when debug level >= 8 +LOGFS_STRING='log_function_data fs $FUNCNAME "$( echo $@ )"' +LOGFE_STRING='log_function_data fe $FUNCNAME' + +### Distro Data +# In cases of derived distros where the version file of the base distro can also be found under /etc, +# the derived distro's version file should go first. (Such as with Sabayon / Gentoo) +DISTROS_DERIVED=( antix-version kanotix-version knoppix-version mandrake-release pardus-release sabayon-release sidux-version turbolinux-release zenwalk-version ) +# debian_version excluded from DISTROS_PRIMARY so Debian can fall through to /etc/issue detection. Same goes for Ubuntu. +DISTROS_EXCLUDE_LIST=( debian_version ubuntu_version ) +DISTROS_PRIMARY=( gentoo-release redhat-release slackware-version SuSE-release ) +DISTROS_LSB_GOOD=( mandrake-release mandriva-release mandrakelinux-release ) + +### Bans Data +# Precede a banword with $'\2' to prevent it from being subject to automated escaping by the make_ban_lists routine +# $'\1' gets weird results : +# $'\2' is octal ascii for 'start of text', $'\1' is start of heading. +# http://www.asciitable.com/ +# user@host $ ARR=($'\x01'"one two" three four); echo ${ARR[0]} | hd -v +# 00000000 01 01 6f 6e 65 20 74 77 6f 0a |..one two.| +A_NORMAL_BANS=( corporation communications gmbh technologies technology group $'\2'"\" ltd. $'\2'"\" inc. $'\2'\ co. "(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]" ) + +### Variable initializations: constants +DCOPOBJ="default" +DEBUG=0 # Set debug levels from 1-10 (8-10 trigger logging levels) +# Debug Buffer Index, index into a debug buffer storing debug messages until inxi is 'all up' +DEBUG_BUFFER_INDEX=0 +## note: the debugger rerouting to /dev/null has been moved to the end of the get_parameters function +## so -@[number] debug levels can be set if there is a failure, otherwise you can't even see the errors + +# Defaults to 2, make this 1 for normal, 0 for no colorcodes at all. Set to any other valid scheme you like. +# Same as runtime parameter. +DEFAULT_SCHEME=2 +# Default indentation level +INDENT=10 + +# default to false, no konversation found, 1 is native konvi (qt3/KDE3) script mode, 2 is /cmd inxi start, +## 3 is Konversation > 1.2 (qt4/KDE4) +KONVI=0 +# NO_CPU_COUNT=0 # Wether or not the string "dual" or similar is found in cpuinfo output. If so, avoid dups. +# This is a variable that controls how many parameters inxi will parse in a /proc//cmdline file before stopping. +PARAMETER_LIMIT=30 +SCHEME=0 # set default scheme +# SHOW_IRC=1 to avoid showing the irc client version number, or SHOW_IRC=0 to disable client information completely. +SHOW_IRC=2 +# Verbosity level defaults to 0, this can also be set with -v0, -v2, -v3, etc as a parameter. +VERBOSITY_LEVEL=0 +# Supported number of verbosity levels, including 0 +VERBOSITY_LEVELS=5 + +## info on bash built in: $IFS - http://tldp.org/LDP/abs/html/internalvariables.html +# Backup the current Internal Field Separator +ORIGINAL_IFS="$IFS" + +###################################################################################### +### Preset Booleans || true/false globals ## usage: 'B_' # flag to allow distro maintainers to turn off update features. If false, turns off # -U and -! testing/advanced update options, as well as removing the -U help menu item B_ALLOW_UPDATE='true' @@ -232,232 +273,124 @@ B_MODULES_DIR='false' # B_MOUNTS_DIR='false' B_PARTITIONS_DIR='false' # -### Directory's used when present -DIR_CPUINFO='/proc/cpuinfo' -DIR_MEMINFO='/proc/meminfo' -DIR_ASOUND_DEVICE='/proc/asound/cards' -DIR_ASOUND_VERSION='/proc/asound/version' -DIR_LSB_RELEASE='/etc/lsb-release' -DIR_SCSI='/proc/scsi/scsi' -DIR_MODULES='/proc/modules' # -DIR_MOUNTS='/proc/mounts' -DIR_PARTITIONS='/proc/partitions' # -DIR_IFCONFIG='/sbin/ifconfig' +####################################################################################### +# List Regular Variables +######################## +### Variable initializations: null values +CMDL_MAX='' +COLOR_SCHEME='' +COLOR_SCHEME_SET='' +IRC_CLIENT='' +IRC_CLIENT_VERSION='' +SCRIPT_PATH="" #filled-in in Main -### Variable initializations: constants -DCOPOBJ="default" -DEBUG=0 # Set debug levels from 1-10 (8-10 trigger logging levels) -# Debug Buffer Index, index into a debug buffer storing debug messages until inxi is 'all up' -DEBUG_BUFFER_INDEX=0 -## note: the debugger rerouting to /dev/null has been moved to the end of the get_parameters function -## so -@[number] debug levels can be set if there is a failure, otherwise you can't even see the errors +### primary data array holders ## usage: 'A_' +A_AUDIO_DATA='' +A_CMDL='' +A_CPU_CORE_DATA='' +A_CPU_DATA='' +A_CPU_TYPE_PCNT_CCNT='' +A_DEBUG_BUFFER='' +A_GFX_CARD_DATA='' +A_GLX_DATA='' +A_HDD_DATA='' +A_INTERFACES_DATA='' +A_NETWORK_DATA='' +A_PARTITION_DATA='' +A_X_DATA='' -# Defaults to 2, make this 1 for normal, 0 for no colorcodes at all. Set to any other valid scheme you like. -# Same as runtime parameter. -DEFAULT_SCHEME=0 -# Default indentation level -INDENT=10 +# These two determine separators in single line output, to force irc clients not to break off sections +SEP1='-' +SEP2='~' + +## Actual color variables +C1='' +C2='' +CN='' + +# after processing, the ban arrays will be put into these: +BAN_LIST_NORMAL='' +BAN_LIST_CPU='' # logging eval variables, start and end function: Insert to LOGFS LOGFE when debug level >= 8 -LOGFS_STRING='log_function_data fs $FUNCNAME "$( echo $@ )"' -LOGFE_STRING='log_function_data fe $FUNCNAME' LOGFS='' LOGFE='' # uncomment for debugging from script start # LOGFS=$LOGFS_STRING # LOGFE=$LOGFE_STRING -# default to false, no konversation found, 1 is native konvi (qt3/KDE3) script mode, 2 is /cmd inxi start, -## 3 is Konversation > 1.2 (qt4/KDE4) -KONVI=0 -# NO_CPU_COUNT=0 # Wether or not the string "dual" or similar is found in cpuinfo output. If so, avoid dups. -# This is a variable that controls how many parameters inxi will parse in a /proc//cmdline file before stopping. -PARAMETER_LIMIT=30 -SCHEME=0 # set default scheme -# SHOW_IRC=1 to avoid showing the irc client version number, or SHOW_IRC=0 to disable client information completely. -SHOW_IRC=2 -# Verbosity level defaults to 0, this can also be set with -v0, -v2, -v3, etc as a parameter. -VERBOSITY_LEVEL=0 -# Supported number of verbosity levels, including 0 -VERBOSITY_LEVELS=5 - -# Clear nullglob, because it creates unpredictable situations with IFS=$'\n' ARR=($VAR) IFS="$ORIGINAL_IFS" -# type constructs. Stuff like [rev a1] is now seen as a glob expansion pattern, and fails, and -# therefore results in nothing. -shopt -u nullglob -## info on bash built in: $IFS - http://tldp.org/LDP/abs/html/internalvariables.html -# Backup the current Internal Field Separator -ORIGINAL_IFS="$IFS" - -# These two determine separators in single line output, to force irc clients not to break off sections -SEP1='-' -SEP2='~' - -### Script names/paths - must be non root writable -SCRIPT_DATA_DIR="$HOME/.inxi" -LOG_FILE="$SCRIPT_DATA_DIR/inxi.log" -LOG_FILE_1="$SCRIPT_DATA_DIR/inxi.1.log" -LOG_FILE_2="$SCRIPT_DATA_DIR/inxi.2.log" -SCRIPT_NAME="inxi" -SCRIPT_PATH="" #filled-in in Main -SCRIPT_VERSION_NUMBER="" #filled-in in Main -SCRIPT_DOWNLOAD='http://inxi.googlecode.com/svn/trunk/' -SCRIPT_DOWNLOAD_BRANCH_1='http://inxi.googlecode.com/svn/branches/one/' -SCRIPT_DOWNLOAD_BRANCH_2='http://inxi.googlecode.com/svn/branches/two/' -SCRIPT_DOWNLOAD_BRANCH_3='http://inxi.googlecode.com/svn/branches/three/' -SCRIPT_DOWNLOAD_BRANCH_4='http://inxi.googlecode.com/svn/branches/four/' -SCRIPT_DOWNLOAD_DEV='http://smxi.org/test/' -KONVI_CFG="konversation/scripts/$SCRIPT_NAME.conf" # relative path to $(kde-config --path data) - -### Script Localization -# Make sure every program speaks English. -LC_ALL="C" -export LC_ALL - -### Output Colors -# A more elegant way to have a scheme that doesn't print color codes (neither ANSI nor mIRC) at all. See below. -unset EMPTY -# DGREY BLACK RED DRED GREEN DGREEN YELLOW DYELLOW -ANSI_COLORS="       " -IRC_COLORS=" \x0314 \x0301 \x0304 \x0305 \x0309 \x0303 \x0308 \x0307" -# BLUE DBLUE MAGENTA DMAGENTA CYAN DCYAN WHITE GREY NORMAL -ANSI_COLORS="$ANSI_COLORS         " -IRC_COLORS=" $IRC_COLORS \x0312 \x0302 \x0313 \x0306 \x0311 \x0310 \x0300 \x0315 \x03" - -#ANSI_COLORS=($ANSI_COLORS); IRC_COLORS=($IRC_COLORS) -A_COLORS_AVAILABLE=( DGREY BLACK RED DRED GREEN DGREEN YELLOW DYELLOW BLUE DBLUE MAGENTA DMAGENTA CYAN DCYAN WHITE GREY NORMAL ) -# See above for notes on EMPTY -A_COLOR_SCHEMES=( EMPTY,EMPTY,EMPTY NORMAL,NORMAL,NORMAL BLUE,NORMAL,NORMAL GREEN,YELLOW,NORMAL DYELLOW,NORMAL,NORMAL CYAN,BLUE,NORMAL RED,NORMAL,NORMAL GREEN,NORMAL,NORMAL YELLOW,NORMAL,NORMAL GREEN,DGREEN,NORMAL BLUE,RED,NORMAL BLUE,NORMAL,RED YELLOW,WHITE,GREEN BLUE,NORMAL,GREEN DCYAN,NORMAL,DMAGENTA ) -## Actual color variables -C1='' -C2='' -CN='' - -### Distro Data -# In cases of derived distros where the version file of the base distro can also be found under /etc, -# the derived distro's version file should go first. (Such as with Sabayon / Gentoo) -DISTROS_DERIVED="antix-version kanotix-version knoppix-version mandrake-release pardus-release sabayon-release sidux-version turbolinux-release zenwalk-version" -# debian_version excluded from DISTROS_PRIMARY so Debian can fall through to /etc/issue detection. Same goes for Ubuntu. -DISTROS_EXCLUDE_LIST="debian_version ubuntu_version" -DISTROS_PRIMARY="gentoo-release redhat-release slackware-version SuSE-release" -DISTROS_LSB_GOOD="mandrake-release mandriva-release mandrakelinux-release" -## Distros with known problems -# DSL (Bash 2.05b: grep -m doesn't work; arrays won't work) --> unusable output -# Puppy Linux 4.1.2 (Bash 3.0: arrays won't work) --> works partially - -### Bans Data -# Precede a banword with $'\2' to prevent it from being subject to automated escaping by the make_ban_lists routine -# $'\1' gets weird results : -# user@host $ ARR=($'\x01'"one two" three four); echo ${ARR[0]} | hd -v -# 00000000 01 01 6f 6e 65 20 74 77 6f 0a |..one two.| -A_NORMAL_BANS=( corporation communications gmbh technologies technology group $'\2'"\" ltd. $'\2'"\" inc. $'\2'\ co. "(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='' - +######################################################################## # WARNING: In the main part below (search for 'KONVI') # there's a check for Konversation-specific config files. # Any one of these can override the above if inxi is run # from Konversation! - ######################################################################## #### MAIN: Where it all begins ######################################################################## main() { eval $LOGFS - - # This function just initializes variables - initialize_script_data - # Check for dependencies BEFORE running ANYTHING else except above functions - # Not all distro's have these depends installed by default - check_script_depends + ## only functions called here, no logic should be in Main + + ## 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. + + ## Init variables + ## + initialize_script_data + create_inxi_path + + ## Check for dependencies BEFORE running ANYTHING else except above functions + ## Not all distro's have these depends installed by default + ## + check_script_depends "$A_DEPENDS" 'depends' + check_script_depends "$A_X_APPS" 'x_apps' check_script_suggested_apps - # 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 + ## + func_set_self_data - ### Only continue if depends ok - SCRIPT_PATH=$( dirname $0 ) - SCRIPT_VERSION_NUMBER=$( grep -im 1 'version:' $SCRIPT_PATH/$SCRIPT_NAME | gawk '{print $3}' ) - - ### Source global config overrides - if [[ -s /etc/$SCRIPT_NAME.conf ]];then - source /etc/$SCRIPT_NAME.conf - fi - # Source user config overrides, ~/.inxi/inxi.conf - if [[ -s $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf ]];then - source $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf - fi + ## Source global config overrides + ## && Source user config overrides, ~/.inxi/inxi.conf + ## + func_source_global_conf_overrides ## this needs to run before the KONVI stuff is set below ## Konversation 1.2 apparently does not like the $PPID test in get_start_client - ## So far there is no known way to detect if qt4_konvi is the parent process - ## this method will infer qt4_konvi as parent - + ## get_start_client - # note: this only works if it's run from inside konversation as a script builtin or something - # only do this if inxi has been started as a konversation script, otherwise bypass this -# KONVI=3 ## for testing puroses + ## NOTE: this only works if it's run from inside konversation as a script builtin or something. + ## Only do this if inxi has been started as a konversation script, otherwise bypass this. ## - if [[ $KONVI -eq 1 || $KONVI -eq 3 ]];then - - if [[ $KONVI -eq 1 ]]; then ## dcop Konversation (ie 1.x < 1.2(qt3)) - DCPORT="$1" - DCSERVER="$2" - DCTARGET="$3" - shift 3 - elif [[ $KONVI -eq 3 ]]; then ## dbus Konversation (> 1.2 (qt4)) - DCSERVER="$1" ##dbus testing - DCTARGET="$2" ##dbus testing - shift 2 - fi + func_set_konvi_level - # The section below is on request of Argonel from the Konversation developer team: - # it sources config files like $HOME/.kde/share/apps/konversation/scripts/inxi.conf - IFS=":" - for kde_config in $( kde-config --path data ) - do - if [[ -r ${kde_config}${KONVI_CFG} ]];then - source "${kde_config}${KONVI_CFG}" - break - fi - done - IFS="$ORIGINAL_IFS" - fi - - ## leave this for debugging dcop stuff if we get that working - # print_screen_output "DCPORT: $DCPORT" - # print_screen_output "DCSERVER: $DCSERVER" - # print_screen_output "DCTARGET: $DCTARGET" - - # "$@" passes every parameter separately quoted, "$*" passes all parameters as one quoted parameter. - # must be here to allow debugger and other flags to be set. + ## "$@" passes every parameter separately quoted, "$*" passes all parameters as one quoted parameter. + ## must be here to allow debugger and other flags to be set. + ## get_parameters "$@" - # If no colorscheme was set in the parameter handling routine, then set the default scheme - if [[ $COLOR_SCHEME_SET != 'true' ]];then - set_color_scheme "$DEFAULT_SCHEME" - fi + ## If no colorscheme was set in the parameter handling routine, then set the default scheme + ## + func_set_color_data - # all the pre-start stuff is in place now - B_SCRIPT_UP='true' - script_debugger "Debugger: $SCRIPT_NAME is up and running..." + ## all the pre-start stuff is in place now + ## + func_script_ready - # then create the output + ## then create the output + ## print_it_out ## last steps - if [[ $B_RUNNING_IN_SHELL == 'true' && $SCHEME -gt 0 ]];then - echo -n "" - fi + ## + func_finalize_main + eval $LOGFE - # weechat's executor plugin forced me to do this, and rightfully so, because else the exit code - # from the last command is taken.. + exit 0 } @@ -465,22 +398,42 @@ main() #### basic tests: set script data, booleans, PATH #### ------------------------------------------------------------------- -# Set PATH data so we can access all programs as user. Set BAN lists. -# initialize some boleans, these directories are used throughout the script -# some apps are used for extended functions any directory used, should be -# checked here first. -# No args taken. -initialize_script_data() +func_set_self_data() +{ + SCRIPT_PATH=$( dirname $0 ) +# SCRIPT_VERSION_NUMBER=$( grep -im 1 'version:' $SCRIPT_PATH/$SCRIPT_NAME | gawk '{print $3}' ) # why are we using the script to go find itself and read the script? +} + +func_set_color_data() +{ + if [[ $COLOR_SCHEME_SET != 'true' ]];then + set_color_scheme "$DEFAULT_SCHEME" + fi +} + +func_script_ready() +{ + B_SCRIPT_UP='true' + script_debugger "Debugger: $SCRIPT_NAME is up and running..." + +} + +func_finalize_main() +{ + if [[ $B_RUNNING_IN_SHELL == 'true' && $SCHEME -gt 0 ]];then + echo -n "" + fi +} + +create_inxi_path() { eval $LOGFS local path='' sys_path='' added_path='' b_path_found='' - # Extra path variable to make execute failures less likely, merged below - local extra_paths="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" - - # Fallback paths put into $extra_paths; This might, among others, help on gentoo. - # Now, create a difference of $PATH and $extra_paths and add that to $PATH: + + # Fallback paths put into $A_EXTRA_PATH; This might, among others, help on gentoo. + # Now, create a difference of $PATH and $A_EXTRA_PATH and add that to $PATH: IFS=":" - for path in $extra_paths + for path in $A_EXTRA_PATH do b_path_found='false' for sys_path in $PATH @@ -496,11 +449,21 @@ initialize_script_data() IFS="$ORIGINAL_IFS" PATH="${PATH}${added_path}" - ##echo "PATH='$PATH'" - ##/bin/sh -c 'echo "PATH in subshell=\"$PATH\""' + eval $LOGFE +} + +# Set PATH data so we can access all programs as user. Set BAN lists. +# initialize some boleans, these directories are used throughout the script +# some apps are used for extended functions; any directory used, should be +# checked here first. +# No args taken. +initialize_script_data() +{ + eval $LOGFS # Do this after sourcing of config overrides so user can customize banwords - BAN_LIST_NORMAL=$( make_ban_lists "${A_NORMAL_BANS[@]}" ) # Contrary to my previous belief, "${ARR[@]}" passes a quoted list, not one string + BAN_LIST_NORMAL=$( make_ban_lists "${A_NORMAL_BANS[@]}" ) + # "${ARR[@]}" passes a quoted list, not one string BAN_LIST_CPU=$( make_ban_lists "${A_CPU_BANS[@]}" ) ##echo "BAN_LIST_NORMAL='$BAN_LIST_NORMAL'" @@ -567,6 +530,7 @@ initialize_script_data() eval $LOGFE } +## Check bash array ability # No args taken. check_script_suggested_apps() { @@ -588,36 +552,31 @@ check_script_suggested_apps() } # Determine if any of the absolutely necessary tools are absent -# No args taken. +# takes an array of depends ($1) and error type ($2). check_script_depends() -{yeah +{ eval $LOGFS local app_name='' app_data='' # bc removed from deps for now - local depends="df free gawk grep hostname lspci ps readlink tr uname uptime wc" - local x_apps="xrandr xdpyinfo glxinfo" + local depends=$1 + local error_type=$2 if [[ $B_X_RUNNING == 'true' ]];then - for app_name in $x_apps + for app_name in $depends do app_data=$( type -p $app_name ) if [[ -z $app_data ]];then - script_debugger "Resuming in non X mode: $app_name not found in path" - B_X_RUNNING='false' - break + if [[ $error_type == 'depends' ]]; then + script_debugger "Resuming in non X mode: $app_name not found in path" + B_X_RUNNING='false' + break + elif [[ $error_type == 'x_apps' ]]; then + error_handler 5 "$app_name" + fi fi done fi - app_name='' - - for app_name in $depends - do - app_data=$( type -p $app_name ) - if [[ -z $app_data ]];then - error_handler 5 "$app_name" - fi - done eval $LOGFE } @@ -651,14 +610,22 @@ make_ban_lists() { eval $LOGFS local ban_list='' + local ban_string=$@ # 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 + # ban_string is $@, by declaring it, it wipes $@. for ban_string do # echo "term=\"$ban_string\"" # >&2 - if [[ ${ban_string:0:1} = $'\2' ]];then + # per bash cheat sheet: when using ${name:start:lenght} and name is $@, as ban_string is, + # start and lenght indicate the array index and count of elements. + # so, here, start is 0 index of $@, lenght is the 1st element and this looks for $'/2' in that position + # $'\2' is octal ascii for 'start of text', $'\1' is start of heading + if [[ ${ban_string:0:1} = $'\2' ]];then ban_list="${ban_list}${ban_list+|}${ban_string:1:${#ban_string}-1}" + # ${var+|} returns only | no matter what + # ${var}${var+|} returns var| else # Automatically escapes [ ] ( ) . and + ban_list="${ban_list}${ban_list+|}$( echo "$ban_string" | gawk '{ @@ -680,20 +647,24 @@ set_color_scheme() eval $LOGFS local i='' script_colors='' color_codes='' - if [[ $1 -ge ${#A_COLOR_SCHEMES[@]} ]];then + if [[ $1 -ge ${#A_COLOR_SCHEMES[@]} ]];then # what is $1 (needs a local variable with name) ? set -- 1 fi # Set a global variable to allow checking for chosen scheme later + # assumes we are running irc or shell, + # there should be another choice (even if it is to throw an error message) SCHEME="$1" if [[ $B_RUNNING_IN_SHELL == 'true' ]];then color_codes=( $ANSI_COLORS ) - else + else color_codes=( $IRC_COLORS ) fi + for (( i=0; i < ${#A_COLORS_AVAILABLE[@]}; i++ )) do eval "${A_COLORS_AVAILABLE[i]}=\"${color_codes[i]}\"" done + IFS="," script_colors=( ${A_COLOR_SCHEMES[$1]} ) IFS="$ORIGINAL_IFS" @@ -713,6 +684,19 @@ set_color_scheme() #### error handler, debugger, script updater #### ------------------------------------------------------------------- +### Source global config overrides + ## +func_source_global_conf_overrides() +{ + if [[ -s /etc/$SCRIPT_NAME.conf ]];then + source /etc/$SCRIPT_NAME.conf + fi + # Source user config overrides, ~/.inxi/inxi.conf + if [[ -s $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf ]];then + source $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf + fi +} + # Error handling # args: $1 - error number; $2 - optional, extra information error_handler() @@ -1543,7 +1527,7 @@ get_start_client() ## try to infer the use of Konversation >= 1.2, which shows $PPID improperly ## no known method of finding Kovni >= 1.2 as parent process, so we look to see if it is running, -## and all other irc clients are not running. +## and all other irc clients are not running. is_this_qt4_konvi() { local konvi_qt4_client='' konvi_dbus_exist='' konvi_pid='' konvi_home_dir='' @@ -1578,6 +1562,37 @@ is_this_qt4_konvi() #qdbus org.kde.konversation /irc say $1 $2 "getpid_dir: $konvi_qt4 qt4_konvi: $konvi_qt4_ver verNum: $konvi_qt4_ver_num pid: $konvi_pid ppid: $PPID konvi_home_dir: ${konvi[2]}" } +func_set_konvi_level() +{ + kde_config='' + + if [[ $KONVI -eq 1 || $KONVI -eq 3 ]];then + + if [[ $KONVI -eq 1 ]]; then ## dcop Konversation (ie 1.x < 1.2(qt3)) + DCPORT="$1" + DCSERVER="$2" + DCTARGET="$3" + shift 3 + elif [[ $KONVI -eq 3 ]]; then ## dbus Konversation (> 1.2 (qt4)) + DCSERVER="$1" ##dbus testing + DCTARGET="$2" ##dbus testing + shift 2 + fi + + # The section below is on request of Argonel from the Konversation developer team: + # it sources config files like $HOME/.kde/share/apps/konversation/scripts/inxi.conf + IFS=":" + for kde_config in $( kde-config --path data ) + do + if [[ -r ${kde_config}${KONVI_CFG} ]];then + source "${kde_config}${KONVI_CFG}" + break + fi + done + IFS="$ORIGINAL_IFS" + fi +} + # This needs some cleanup and comments, not quite understanding what is happening, although generally output is known # Parse the null separated commandline under /proc//cmdline # args: $1 - $PPID @@ -3018,7 +3033,7 @@ get_uptime() calculate_multicore_data() { eval $LOGFS - local string_number=$1 string_data='' + local string_number=$1 string_data='' cpu_count=$2 if [[ -n $( egrep -i '( mb| kb)' <<< $1 ) ]];then string_data=" $( gawk '{print $2}' <<< $1 )" # add a space for output @@ -3026,7 +3041,7 @@ calculate_multicore_data() fi # handle weird error cases where it's not a number if [[ -n $( egrep '^[0-9\.,]+$' <<< $string_number ) ]];then - string_number=$( echo $string_number $2 | gawk '{ + string_number=$( echo $string_number $cpu_count | gawk '{ total = $1*$2 print total }' ) @@ -3071,7 +3086,7 @@ process_cpu_flags() s = $0 } } - /^(sse2?|pni)$/ { + /^(sse?|pni)$/ { if (ssel[$0] > sse) { sse = ssel[$0] } @@ -3846,14 +3861,10 @@ print_system_data() eval $LOGFS local system_data='' bits='' local host_name=$( hostname ) - local current_kernel=$( uname -rm ) # | gawk '{print $1,$3,$(NF-1)}' ) + local current_kernel=$( uname -rm ) local distro="$( get_distro_data )" - # check for 64 bit first - if [[ -n $( uname -m | grep -o 'x86_64' ) ]];then - bits="(64 bit)" - else - bits="(32 bit)" - fi + # check for 32/64 bit first + bits="($(getconf LONG_BIT) bit)" if [[ $B_SHOW_HOST == 'true' ]];then system_data=$( create_print_line "System:" "${C1}Host${C2} $host_name ${C1}Kernel${C2}" )