From aecf66bac7289ef65cc4668a49f1f9f95a8b5366 Mon Sep 17 00:00:00 2001 From: inxi-svn Date: Fri, 7 Nov 2008 17:38:30 +0000 Subject: [PATCH] Fixed a bug reported for partition information output, case where df splits its output lines because the first field is too long. Now the get partition info function reads back from the last item per record, not from the first one. Since the detection is based on the last item in the line, this should maybe fix that issue. Seen with LVM naming for example. We'll see if this works or not. --- inxi | 506 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 255 insertions(+), 251 deletions(-) diff --git a/inxi b/inxi index 1f3f008..df9b824 100755 --- a/inxi +++ b/inxi @@ -1,12 +1,12 @@ #!/bin/bash ######################################################################## #### Script Name: inxi -#### version: 0.3.28 -#### Date: November 6 2008 +#### version: 0.3.29 +#### Date: November 7 2008 ######################################################################## #### inxi is a fork of infobash, 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. @@ -16,22 +16,22 @@ #### #### Current script home page: http://techpatterns.com/forums/about1131.html #### Script svn: http://code.google.com/p/inxi -#### +#### #### 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 #### (at your option) any later version. -#### +#### #### This program is distributed in the hope that it will be useful, #### but WITHOUT ANY WARRANTY; without even the implied warranty of #### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #### GNU General Public License for more details. -#### +#### #### You should have received a copy of the GNU General Public License #### along with this program. If not, see . #### DEPENDENCIES -#### bash >=2.05b(bash), df;readlink;stty;tr;uname;wc(coreutils), +#### bash >=2.05b(bash), df;readlink;stty;tr;uname;wc(coreutils), #### gawk(gawk), grep(grep), hostname(hostname), lspci(pciutils), #### ps;uptime(procps), runlevel(sysvinit), glxinfo;xdpyinfo;xrandr(xbase-clients) #### Also the proc filesystem should be present and mounted @@ -74,7 +74,7 @@ B_EXTRA_DATA='false' # override certain errors due to currupted data B_HANDLE_CORRUPT_DATA='false' # Running in a shell? Defaults to false, and is determined later. -B_RUNNING_IN_SHELL='false' +B_RUNNING_IN_SHELL='false' # Set this to 'false' to avoid printing the hostname B_SHOW_HOST='true' # triggers various debugging and new option testing @@ -82,7 +82,7 @@ B_TESTING_FLAG='false' # Test for X running B_X_RUNNING='false' if [[ -n $DISPLAY ]];then - B_X_RUNNING='true' + B_X_RUNNING='true' fi ### Variable initializations: constants @@ -94,26 +94,26 @@ DEBUG_BUFFER_INDEX=0 if [[ $DEBUG -eq 0 ]] then exec 2>/dev/null -fi +fi #((DEBUG)) && exec 2>&1 # This is for debugging konversation -# Defaults to 2, make this 1 for normal, 0 for no colorcodes at all. Set to any other valid scheme you like. +# 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 +INDENT=10 # default to false, no konversation found, 1 is /cmd inxi start, 2 is native konvi script mode -KONVI=0 +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 +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 +SHOW_IRC=2 # Verbosity level defaults to 0, this can also be set with -v0, -v2, -v3, etc as a parameter. -VERBOSITY_LEVEL=0 +VERBOSITY_LEVEL=0 # Supported number of verbosity levels, including 0 -VERBOSITY_LEVELS=6 +VERBOSITY_LEVELS=6 # 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 @@ -121,9 +121,9 @@ VERBOSITY_LEVELS=6 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" +ORIGINAL_IFS="$IFS" # These two determine separators in single line output, to force irc clients not to break off sections -FL1='-' +FL1='-' FL2='' ### Script names/paths @@ -134,12 +134,12 @@ KONVI_CFG="konversation/scripts/$SCRIPT_NAME.conf" # relative path to $(kde-conf ### Script Localization # Make sure every program speaks English. -LC_ALL="C" -export LC_ALL +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 +unset EMPTY # DGREY BLACK RED DRED GREEN DGREEN YELLOW DYELLOW ANSI_COLORS="       " IRC_COLORS=" \x0314 \x0301 \x0304 \x0305 \x0309 \x0303 \x0308 \x0307" @@ -156,7 +156,7 @@ C2='' CN='' ### Distro Data -# In cases of derived distros where the version file of the base distro can also be found under /etc, +# 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 redhat-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. @@ -176,16 +176,16 @@ BAN_LIST_CPU='' ### Source global config overrides if [[ -s /etc/$SCRIPT_NAME.conf ]];then - source /etc/$SCRIPT_NAME.conf + source /etc/$SCRIPT_NAME.conf fi # Source user config overrides if [[ -s $HOME/.$SCRIPT_NAME ]];then source $HOME/.$SCRIPT_NAME fi -# WARNING: In the main part below (search for 'KONVI') +# 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 +# Any one of these can override the above if inxi is run # from Konversation! ######################################################################## @@ -198,28 +198,28 @@ fi # Error handling # args: $1 - error number; $2 - optional, extra information -error_handler() +error_handler() { local error_message='' - + # assemble the error message case $1 in 2) error_message="large flood danger, debug buffer full!" ;; - 3) error_message="unsupported color scheme number: $2" + 3) error_message="unsupported color scheme number: $2" ;; - 4) error_message="unsupported verbosity level: $2" + 4) error_message="unsupported verbosity level: $2" ;; - 5) error_message="dependency not met: $2 not found in path" + 5) error_message="dependency not met: $2 not found in path" ;; - 6) error_message="/proc not found! Quitting..." + 6) error_message="/proc not found! Quitting..." ;; - 7) error_message="unknown parameter: $2" + 7) error_message="unknown parameter: $2" ;; 8) error_message="the self-updater failed, wget exited with error: $2.\nYou probably need to be root.\nHint, to make for easy updates without being root, do: chown $SCRIPT_NAME" ;; - *) error_message="error unknown: $@" - set -- 99 + *) error_message="error unknown: $@" + set -- 99 ;; esac # then print it and exit @@ -227,10 +227,10 @@ error_handler() exit $1 } -script_debugger() +script_debugger() { local a_debug_buffer='' - + if [[ $B_ALL_UP == 'true' ]];then if [[ $DEBUG -eq 0 ]];then return @@ -259,7 +259,7 @@ script_debugger() # note, this is a huge bug trap, for now we're not using this at all except to # output basic stuff. At some point in the future we'll debug the dcop stuff, # but that only works if inxi is being run as a konversation script to begin with -print_screen_output() +print_screen_output() { if [[ $DEBUG -gt 5 ]];then if [[ $KONVI -eq 1 ]];then @@ -288,21 +288,21 @@ create_print_line() printf "${C1}%-${INDENT}s${C2} %s" "$1" "$2" } -# this removes newline and pipes. +# this removes newline and pipes. # args: $1 - string to clean remove_erroneous_chars() { ## RS is input record separator ## gsub is substitute; gawk ' - BEGIN { RS="" } { + BEGIN { RS="" } { gsub(/\n$/,"") ## (newline; end of string) with (nothing) gsub(/\n/," "); ## (newline) with (space) gsub(/^ *| *$/, "") ## (pipe char) with (nothing) gsub(/ +/, " ") ## ( +) with (space) gsub(/ [ ]+/, " ") ## ([ ]+) with (space) gsub(/^ +| +$/, "") ## (pipe char) with (nothing) - printf $0 + printf $0 }' "$1" ## prints (returns) cleaned input } @@ -311,9 +311,9 @@ remove_erroneous_chars() ## in bash. For now I'll leave this here because there's still some interesting stuff to get re methods # Enforce boilerplate and buzzword filters # args: $1 - BAN_LIST_NORMAL/BAN_LIST_CPU; $2 - string to sanitize -sanitize_characters() +sanitize_characters() { - # Cannot use strong quotes to unquote a string with pipes in it! + # Cannot use strong quotes to unquote a string with pipes in it! # bash will interpret the |'s as usual and try to run a subshell! # Using weak quotes instead, or use '"..."' echo "$2" | gawk " @@ -329,11 +329,11 @@ sanitize_characters() #### basic tests #### ------------------------------------------------------------------- -# Determine if any of the absolutely necessary tools are absent -check_script_depends() +# Determine if any of the absolutely necessary tools are absent +check_script_depends() { local app_name='' app_data='' - + if [[ ! -d /proc/ ]];then error_handler 6 fi @@ -349,7 +349,7 @@ check_script_depends() fi done fi - + app_name='' # bc removed from deps for now for app_name in df free gawk grep hostname lspci ps readlink runlevel tr uname uptime wc @@ -363,10 +363,10 @@ check_script_depends() # Filter boilerplate & buzzwords. # args: $1 - quoted: "$@" array of ban terms -make_ban_lists() +make_ban_lists() { local ban_list='' - # Iterate over $@ + # 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 @@ -375,26 +375,26 @@ make_ban_lists() 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 '{ + # Automatically escapes [ ] ( ) . and + + ban_list="${ban_list}${ban_list+|}$( echo "$ban_string" | gawk '{ gsub(/([\[\]+().])/,"\\\\&") - print + print }' )" fi done - + echo "$ban_list" } # make_ban_lists "${A_CPU_BANS[@]}";exit -# Set the colorscheme +# Set the colorscheme # args: $1 = |<"none"> -set_color_scheme() +set_color_scheme() { local i='' script_colors='' color_codes='' - + if [[ $1 -ge ${#A_COLOR_SCHEMES[@]} ]];then - set -- 1 + set -- 1 fi SCHEME="$1" # Set a global variable to allow checking for chosen scheme later if [[ $B_RUNNING_IN_SHELL == 'true' ]];then @@ -417,10 +417,10 @@ set_color_scheme() # Parse the null separated commandline under /proc//cmdline # args: $1 - $PPID -get_cmdline() +get_cmdline() { local i=0 ppid=$1 - + if [[ ! -e /proc/$ppid/cmdline ]];then echo 0 return @@ -430,7 +430,7 @@ get_cmdline() unset A_CMDL ## note: need to figure this one out, and ideally clean it up and make it readable while read -d $'\0' L && [ "$i" -lt 32 ] - do + do A_CMDL[i++]="$L" ## note: make sure this is valid - What does L mean? ## done /dev/null;then IRC_CLIENT="Shell" unset IRC_CLIENT_VERSION @@ -593,7 +593,7 @@ get_start_client() non_native_konvi='true' fi irc_client_path_lower=$( tr '[:upper:]' '[:lower:]' <<< $irc_client_path ) - + case $irc_client_path_lower in *irssi-text*|*irssi*) IRC_CLIENT_VERSION=" $( $irc_client_path -v | gawk 'NR == 1 { print $2 }' )" @@ -607,21 +607,21 @@ get_start_client() KONVI=1 fi IRC_CLIENT_VERSION=" $( $irc_client_path -v | gawk ' - /Konversation:/ { + /Konversation:/ { for ( i=2; i<=NF; i++ ) { if (i == NF) { - print $i - } - else { - printf $i" " - } - } - exit + print $i + } + else { + printf $i" " + } + } + exit }' )" T=($IRC_CLIENT_VERSION) if [[ ${T[0]} == *+* ]];then - # < Sho_> locsmif: The version numbers of SVN versions look like this: - # "+ # locsmif: The version numbers of SVN versions look like this: + # "+ #&1 | gawk '{ for ( i=2; i<=NF; i++) { if (i==NF) { print $i } - else { + else { printf $i" " } - }exit + }exit }' )" IRC_CLIENT="KVIrc" ;; @@ -702,7 +702,7 @@ get_start_client() IRC_CLIENT_VERSION=" $( kopete -v | gawk ' /Kopete:/ { print $2 - exit + exit }' )" IRC_CLIENT="Kopete" ;; @@ -712,7 +712,7 @@ get_start_client() for (( i=0; i <= $CMDL_MAX; i++ )) do case ${A_CMDL[i]} in - *dsirc*) + *dsirc*) IRC_CLIENT="KSirc" # Dynamic runpath detection is too complex with KSirc, because KSirc is started from # kdeinit. /proc//exe is a link to /usr/bin/kdeinit @@ -723,14 +723,14 @@ get_start_client() # KSirc was run by browsing up the process tree in /proc. That alone is straightjacket material. # (KSirc sucks anyway ;) IRC_CLIENT_VERSION=" $( ksirc -v | gawk ' - /KSirc:/ { + /KSirc:/ { print $2 - exit + exit }' )" break ;; esac - done + done if [[ -z $IRC_CLIENT_VERSION ]];then IRC_CLIENT="Unknown Perl client" fi @@ -759,16 +759,16 @@ set_calculated_variables() { 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" - + 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: IFS=":" for path in $extra_paths - do + do b_path_found='false' for sys_path in $PATH - do + do if [[ $path == $sys_path ]];then b_path_found='true' fi @@ -779,9 +779,9 @@ set_calculated_variables() done IFS="$ORIGINAL_IFS" PATH="${PATH}${added_path}" - ##echo "PATH='$PATH'" - ##/bin/sh -c 'echo "PATH in subshell=\"$PATH\""' - + ##echo "PATH='$PATH'" + ##/bin/sh -c 'echo "PATH in subshell=\"$PATH\""' + # 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_CPU=$( make_ban_lists "${A_CPU_BANS[@]}" ) @@ -798,13 +798,13 @@ get_audio_data() IFS=$'\n' A_AUDIO_DATA=( $( echo "$lspci_data" | gawk -F': ' ' - { IGNORECASE=1 } - /multimedia audio controller|audio device/ { + { IGNORECASE=1 } + /multimedia audio controller|audio device/ { gsub(/'"$BAN_LIST_NORMAL"'/, "", $NF ) gsub(/,/," ",$NF) gsub(/^ +| +$/,"",$NF) gsub(/ [ \t]+/," ",$NF) - print $NF + print $NF }' ) ) IFS="$ORIGINAL_IFS" @@ -820,19 +820,19 @@ get_cpu_core_count() { ## Because of the upcoming release of cpus with core counts over 6, a count of cores is given after Deca (10) # count the number of processors given - local cpu_core_count=$(grep -ic "cpu cores" /proc/cpuinfo| cut -d':' -f2) - + local cpu_core_count=$(grep -ic "cpu cores" /proc/cpuinfo| cut -d':' -f2) + if [[ $cpu_core_count -eq 0 ]];then - cpu_core_count=$(grep -ic "^processor" /proc/cpuinfo| cut -d':' -f2) + cpu_core_count=$(grep -ic "^processor" /proc/cpuinfo| cut -d':' -f2) fi local cpu_alpha_count='' if [[ $cpu_core_count -lt 2 ]]; then cpu_core_count=1 fi - + # match the numberic value to an alpha value - case $cpu_core_count in + case $cpu_core_count in 1) cpu_alpha_count='Single';; 2) cpu_alpha_count='Dual';; 3) cpu_alpha_count='Triple';; @@ -856,12 +856,12 @@ get_cpu_data() IFS=$'\n' A_CPU_DATA=($(gawk -F': ' ' - { IGNORECASE=1 } + { IGNORECASE=1 } # TAKE NOTE: \t+ will work for /proc/cpuinfo, but SOME ARBITRARY FILE used for TESTING might contain SPACES! # Therefore PATCH to use [ \t]+ when TESTING! /^processor\t+:/ { nr = $NF } - - /^model name|^cpu\t+:/ { + + /^model name|^cpu\t+:/ { gsub(/'"$BAN_LIST_NORMAL"'/, "", $NF ) gsub(/'"$BAN_LIST_CPU"'/, "", $NF ) gsub(/,/, " ", $NF) @@ -869,53 +869,53 @@ get_cpu_data() gsub(/ [ \t]+/, " ", $NF) cpu[nr, "model"] = $NF } - + /^cpu MHz|^clock\t+:/ { - if (!min) { + if (!min) { min = $NF - } - else { - if ($NF < min) { - min = $NF - } } - - if ($NF > max) { - max = $NF + else { + if ($NF < min) { + min = $NF + } + } + + if ($NF > max) { + max = $NF } gsub(/MHZ/,"",$NF) ## clears out for cell cpu gsub(/.00[0]+$/,".00",$NF) ## clears out excessive zeros cpu[nr, "speed"] = $NF } - + /^cache size/ { cpu[nr, "cache"] = $NF } - + /^flags/ { cpu[nr, "flags"] = $NF } - + /^bogomips/ { cpu[nr, "bogomips"] = $NF } - + /vendor_id/ { gsub(/genuine|authentic/,"",$NF) cpu[nr, "vendor"] = $NF } - + END { #if (!nr) { print ",,,"; exit } # <- should this be necessary or should bash handle that for ( i = 0; i <= nr; i++ ) { print cpu[i, "model"] "," cpu[i, "speed"] "," cpu[i, "cache"] "," cpu[i, "flags"] "," cpu[i, "bogomips"] "," cpu[nr, "vendor"] } - if (!min) { + if (!min) { print "not found" - exit + exit } - if (min != max) { - printf("Min:%s%s Max:%s%s\n", min, "Mhz", max, "Mhz") + if (min != max) { + printf("Min:%s%s Max:%s%s\n", min, "Mhz", max, "Mhz") } - else { - printf("%s %s\n", max, "Mhz") + else { + printf("%s %s\n", max, "Mhz") } }' /proc/cpuinfo)) - + IFS="$ORIGINAL_IFS" } @@ -923,7 +923,7 @@ get_cpu_data() get_distro_data() { local i='' distro='' distro_file='' a_distro_glob='' - + shopt -s nullglob cd /etc a_distro_glob=(*[-_]{release,version}) @@ -956,12 +956,12 @@ get_distro_data() # Debian pure should fall through here distro_file="issue" distro=$( gawk ' - BEGIN { RS="" } { + BEGIN { RS="" } { gsub(/\\[a-z]/, "") gsub(/,/, " ") gsub(/^ +| +$/, "") gsub(/ [ \t]+/, " ") - print + print }' "/etc/${distro_file}" ) fi if [[ ${#distro} -gt 80 && $B_HANDLE_CORRUPT_DATA != 'true' ]];then @@ -972,7 +972,7 @@ get_distro_data() if [[ -z $distro ]];then distro='Unknown distro o_O' fi - + # this handles an arch bug where /etc/arch-release is empty and /etc/issue is corrupted if [[ -n $( grep -i 'arch linux' <<< $distro ) ]];then distro='Arch Linux' @@ -984,7 +984,7 @@ get_distro_data() get_graphics_card_data() { local i='' - + IFS=$'\n' A_GFX_CARD_DATA=( $( echo "$lspci_data" | gawk -F': ' ' { IGNORECASE=1 } @@ -993,7 +993,7 @@ get_graphics_card_data() gsub(/,/, " ", $NF) gsub(/^ +| +$/, "", $NF) gsub(/ [ \t]+/, " ", $NF) - print $NF + print $NF }' ) ) IFS="$ORIGINAL_IFS" # for (( i=0; i < ${#A_GFX_CARD_DATA[@]}; i++ )) @@ -1004,7 +1004,7 @@ get_graphics_card_data() if [[ ${#A_GFX_CARD_DATA[@]} -eq 0 ]];then A_GFX_CARD_DATA[0]='Failed to Detect Video Card!' fi - + # GFXMEM is UNUSED at the moment, because it shows AGP aperture size, which is not necessarily equal to GFX memory.. # GFXMEM="size=[$(echo "$lspci_data" | gawk '/VGA/{while (!/^$/) {getline;if (/size=[0-9][0-9]*M/) {size2=gensub(/.*\[size=([0-9]+)M\].*/,"\\1","g",$0);if (size 0 { print(gensub(/(.*)_agp.*/,"\\1","g",$1)) }' /proc/modules ) } @@ -1090,12 +1090,12 @@ get_graphics_agp_data() get_graphics_x_data() { local x_vendor='' x_version='' - + if [[ $B_X_RUNNING == 'true' ]];then # X vendor and version detection. x_vendor=$( xdpyinfo | gawk -F': +' ' - BEGIN { IGNORECASE=1 } - /vendor string/ { + BEGIN { IGNORECASE=1 } + /vendor string/ { gsub(/the|inc|foundation|project|corporation/, "", $2) gsub(/,/, " ", $2) gsub(/^ +| +$/, "", $2) @@ -1103,14 +1103,14 @@ get_graphics_x_data() print $2 }' ) - # new method added since radeon and X.org and the disappearance of version : ...etc + # new method added since radeon and X.org and the disappearance of version : ...etc # Later on, the normal textual version string returned, e.g. like: X.Org version: 6.8.2 # A failover mechanism is in place. (if $x_version is empty, the release number is parsed instead) x_version=$( xdpyinfo | awk '/version:/ { print $NF }' ) if [[ -z $x_version ]];then x_version=$(xdpyinfo | gawk -F': +' ' - BEGIN { IGNORECASE=1 } - /vendor release number/ { + BEGIN { IGNORECASE=1 } + /vendor release number/ { gsub(/0+$/, "", $2) gsub(/0+/, ".", $2) print $2 @@ -1118,7 +1118,7 @@ get_graphics_x_data() fi A_X_DATA[0]="$x_vendor" A_X_DATA[1]="$x_version" - + #X -version 2>&1 | gawk '/^X Window System Version/ { print $5 }' #This method could be used in the future to detect X when X is not running, #however currently inxi ignores X checks when X is not found. @@ -1130,10 +1130,10 @@ get_hard_drive_data() { local disk='' i='' hdd_cap2='' hdd_cap1='' disk_capacity='' a_total_hdd='' local hdd_model='' hdd_capacity='' hdd_used='' - + i=1 for disk in /proc/ide/ide*/hd* - do + do if [[ -e $disk/media && $( remove_erroneous_chars $disk/media ) = disk ]];then # BUGFIX: Ran into a debian sarge kernel that did not have the "capacity" file in the hd* directories # also, for PCI ata controller card, no capacity is listed @@ -1147,7 +1147,7 @@ get_hard_drive_data() ((i++)) fi done - + if [[ -e /proc/scsi/scsi ]];then # Silly sata detection, will also pick up usb sticks. This will be redone. IFS=$'\n' @@ -1174,7 +1174,7 @@ get_hard_drive_data() } }' /proc/scsi/scsi)) IFS="$ORIGINAL_IFS" - + ## note: the output part of this should be in the print hdd data function, not here for (( i=0; i < ${#a_total_hdd[@]}; i++ )) do @@ -1185,14 +1185,14 @@ get_hard_drive_data() hdd_model=' Non Detected' fi fi - + ##print_screen_output "$hdd_model" ; exit if ((disk_capacity));then hdd_cap1="$((disk_capacity/2))" fi # See http://lanana.org/docs/device-list/devices-2.6+.txt for major numbers used below hdd_cap2=$( gawk '$1 ~ /^(3|22|33|8)$/ && $2 % 16 == 0 {size+=$3} END {printf("%d\n",size)}' /proc/partitions ) - + ##print_screen_output "hdd_cap1=\"$hdd_cap1\" hdd_cap2=\"$hdd_cap2"" ; exit hdd_capacity=0 for i in ${!hdd_cap*} @@ -1200,28 +1200,28 @@ get_hard_drive_data() if [[ ${!i} -gt $hdd_capacity ]];then hdd_capacity="${!i}" fi - done + done if [[ $hdd_capacity -gt 0 ]];then hdd_used=$( df | gawk ' - p { - if (/^\/dev\/(mapper\/|[hs]d[a-z][0-9]+)/) { - if (NF == 1) { - getline - if (NF == 5) { - c += $2 - } - else { - next + p { + if (/^\/dev\/(mapper\/|[hs]d[a-z][0-9]+)/) { + if (NF == 1) { + getline + if (NF == 5) { + c += $2 } - } - else if (NF == 6) { - c += $3 - } - } - } - /^Filesystem/ { p++ } - END { - print c + else { + next + } + } + else if (NF == 6) { + c += $3 + } + } + } + /^Filesystem/ { p++ } + END { + print c }' ) hdd_used="$((hdd_used*100/hdd_capacity))% used" hdd_capacity="$(($hdd_capacity*1024/1000**3))GB" @@ -1236,9 +1236,9 @@ get_hard_drive_data() get_lspci_data() { - echo "$( lspci -v | awk '{ + echo "$( lspci -v | awk '{ gsub(/\(prog-if[^)]*\)/,"") - print + print }' )" } @@ -1246,7 +1246,7 @@ get_lspci_data() get_memory_data() { local memory='' - + memory=$( gawk ' /^MemTotal:/ { tot = $2 } /^(MemFree|Buffers|Cached):/ { notused+=$2 } @@ -1254,7 +1254,7 @@ get_memory_data() used = tot-notused printf("%.1f/%.1fMB\n", used/1024, tot/1024) }' /proc/meminfo ) - + echo "$memory" } @@ -1273,7 +1273,7 @@ get_networking_data() gsub(/,/, " ", nic) gsub(/^ +| +$/, "", nic) gsub(/ [ \t]+/, " ", nic) - + eth[nic]++ while (getline && !/^$/) { if (/I\/O/) { @@ -1281,7 +1281,7 @@ get_networking_data() } } } - + END { j=0 for (i in eth) { @@ -1311,19 +1311,23 @@ get_partition_data() { IFS=$'\n' # sample line: /dev/sda2 ext3 15G 8.9G 4.9G 65% /home - # $7 = partition name; $3 = partition size; $4 = used, in gB; $6 = percent used - A_PARTITION_DATA=( $( df -h -T | egrep '(/|/boot|/var|/home)$' | awk '{print $7 "," $3 "," $4 "," $6 }' ) ) + # $NF = partition name; $(NF - 4) = partition size; $(NF - 3) = used, in gB; $(NF - 1) = percent used + ## note: by subtracting from the last field number NF, we avoid a subtle issue with df output, where if + ## the first field is too long, it will occupy its own line, this way we are getting only the needed data + A_PARTITION_DATA=( $( df -h -T | awk ' + /\/$|\/boot$|\/var$|\/home$/ { + print $NF "," $(NF - 4) "," $(NF - 3) "," $(NF - 1) + }' ) ) IFS="$ORIGINAL_IFS" } - ## return uptime string get_uptime() { ## note: removing gsub(/ /,"",a); to get get space back in there, goes right before print a - echo $( uptime | gawk '{ + echo $( uptime | gawk '{ a = gensub(/^.*up *([^,]*).*$/,"\\1","g",$0) - print a + print a }' ) } @@ -1336,7 +1340,7 @@ get_uptime() calculate_multicore_data() { local string_number=$1 string_data='' - + if [[ -n $( egrep -i '( mb| kb)' <<< $1 ) ]];then string_data=" $( awk '{print $2}' <<< $1 )" # add a space for output string_number=$( awk '{print $1}' <<< $1 ) @@ -1357,7 +1361,7 @@ calculate_multicore_data() process_cpu_flags() { local cpu_flags="$1" - + # nx = AMD stack protection extensions # lm = Intel 64bit extensions # sse, sse2, pni = sse1,2,3 gfx extensions @@ -1374,18 +1378,18 @@ process_cpu_flags() sses[3] = "sse3" } /^(nx|lm|svm|vmx)$/ { - if (s) { - s = s " " $0 + if (s) { + s = s " " $0 } - else { - s = $0 + else { + s = $0 } } /^(sse2?|pni)$/ { if (ssel[$0] > sse) { sse = ssel[$0] } - } + } END { if (sse) { if (s) { @@ -1397,7 +1401,7 @@ process_cpu_flags() } print s }' ) - + #grep -oE '\<(nx|lm|sse[0-9]?|pni|svm|vmx)\>' | tr '\n' ' ')) if [[ -z $cpu_flags ]];then cpu_flags="-" @@ -1418,13 +1422,13 @@ print_audio_data() IFS="," a_audio_working=(${A_AUDIO_DATA[0]}) - IFS="$ORIGINAL_IFS" - + IFS="$ORIGINAL_IFS" + if [[ -n ${A_AUDIO_DATA[@]} ]];then if [[ ${#A_AUDIO_DATA[@]} -le 1 ]];then card_one='Card ' fi - + if [[ -n ${a_audio_working[1]} ]];then port_data=" ${C1}at port${C2} ${a_audio_working[1]}" fi @@ -1436,7 +1440,7 @@ print_audio_data() do IFS="," a_audio_working=( ${A_AUDIO_DATA[i]} ) - IFS="$ORIGINAL_IFS" + IFS="$ORIGINAL_IFS" port_data='' if [[ -n ${a_audio_working[1]} ]];then port_data=" ${C1}at port${C2} ${a_audio_working[1]}" @@ -1454,17 +1458,17 @@ print_cpu_data() local bmip_data='' cpu_cache='' cpu_vendor='' cpu_flags='' ##print_screen_output "A_CPU_DATA[0]=\"${A_CPU_DATA[0]}\"" - # Array A_CPU_DATA always has one element: max clockfreq found. + # Array A_CPU_DATA always has one element: max clockfreq found. # that's why its count is one more than you'd think from cores/cpus alone # weird hack, probably should be changed cpu_vendor=$( tr '[A-Z]' '[a-z]' <<< ${a_cpu_working[5]} ) # Strange (and also some expected) behavior encountered. - # If print_screen_output() uses $1 as the parameter to output to the screen, + # If print_screen_output() uses $1 as the parameter to output to the screen, # then passing " ${ARR[@]} " - # will output only and the first element of ARR. That "@" splits in elements and "*" _doesn't_, + # will output only and the first element of ARR. That "@" splits in elements and "*" _doesn't_, # is to be expected. - # However, that text2 is consecutively truncated is somewhat strange, so take note. + # However, that text2 is consecutively truncated is somewhat strange, so take note. # This has been confirmed by #bash on freenode. # The above mentioned only emerges when using the debugging markers below ## print_screen_output "a_cpu_working=\"***${a_cpu_working[@]} $hostName+++++++\"----------" @@ -1477,7 +1481,7 @@ print_cpu_data() if [[ $VERBOSITY_LEVEL -ge 3 ]];then # update for multicore, bogomips x core count. if [[ $B_EXTRA_DATA == 'true' ]];then - + # if [[ $cpu_vendor != 'intel' ]];then bmip_data=$( calculate_multicore_data "${a_cpu_working[4]}" "$cpu_core_count" ) # else @@ -1491,7 +1495,7 @@ print_cpu_data() else cpu_cache="${a_cpu_working[2]}" fi - # only print shortened list + # only print shortened list if [[ $B_CPU_FLAGS_FULL != 'true' ]];then cpu_flags=$( process_cpu_flags "${a_cpu_working[3]}" ) cpu_flags=" ${C1}flags${C2} ($cpu_flags)" @@ -1504,7 +1508,7 @@ print_cpu_data() else cpu_data="$cpu_data ${C1}clocked at${C2} ${a_cpu_working[1]} MHz${CN}" fi - + cpu_data="$cpu_data $cpu_clock_speed" print_screen_output "$cpu_data" @@ -1534,7 +1538,7 @@ print_cpu_flags_full() { local cpu_flags_full="$1" cpu_flags_1='' cpu_flags_2='' cpu_flags_3='' flag_data='' local i=0 flag='' - + for flag in $cpu_flags_full do if [[ $i -ge 36 ]];then @@ -1562,10 +1566,10 @@ print_cpu_flags_full() print_gfx_data() { - local gfx_data='' i='' card_one='Card ' + local gfx_data='' i='' card_one='Card ' local screen_resolution="$( get_graphics_res_data )" local b_is_mesa='false' - + # set A_GFX_CARD_DATA get_graphics_card_data # set A_X_DATA @@ -1577,7 +1581,7 @@ print_gfx_data() local glx_renderer="${A_GLX_DATA[0]}" local glx_version="${A_GLX_DATA[1]}" local glx_direct_render="${A_GLX_DATA[2]}" - + if [[ ${#A_GFX_CARD_DATA[@]} -gt 1 ]];then i=1 while [[ -n ${A_GFX_CARD_DATA[i]} && $i -le 3 ]] @@ -1595,11 +1599,11 @@ print_gfx_data() gfx_data="${gfx_data} ${C1} tty resolution ${CN}(${C2} ${screen_resolution} ${CN})" fi print_screen_output "$gfx_data" - + if [[ -z $glx_renderer || -z $glx_version ]];then b_is_mesa='true' fi - + ## note: if glx render or version have no content, then mesa is true if [[ $B_X_RUNNING == 'true' && $b_is_mesa != 'true' ]];then gfx_data=$( create_print_line " " "${C1}GLX Renderer${C2} ${glx_renderer} ${CN}| ${C1}GLX Version${C2} ${glx_version}${CN}" ) @@ -1620,16 +1624,16 @@ print_hard_disk_data() hdd_data=$( create_print_line "Disks:" "${C1}HDD Size${C2} ${hdd_capacity} (${hdd_used})${CN}" ) fi print_screen_output "$hdd_data" - + if [[ $VERBOSITY_LEVEL -ge 4 ]];then # set A_PARTITION_DATA get_partition_data - + for (( i=0; i < ${#A_PARTITION_DATA[@]}; i++ )) do IFS="," a_partition_working=(${A_PARTITION_DATA[i]}) - IFS="$ORIGINAL_IFS" + IFS="$ORIGINAL_IFS" partition_data="$partition_data ${C1}ID:${C2} ${a_partition_working[0]} ${C1}size:${C2} ${a_partition_working[1]} ${C1}used:${C2} ${a_partition_working[2]} (${a_partition_working[3]})" done # hdd_data=$( create_print_line " " "${C1}Partition:${C2} ${root_home_data}" ) @@ -1641,9 +1645,9 @@ print_hard_disk_data() print_intro_data() { local intro_data='' host_name=$( hostname ) - + local distro="$( get_distro_data )" - + if [[ $B_SHOW_HOST == 'true' ]];then intro_data=$( create_print_line "System:" "${C1}Host${C2} $host_name ${C1}running${C2} ${CN}" ) else @@ -1661,13 +1665,13 @@ print_networking_data() IFS="," a_network_working=(${A_NETWORK_DATA[0]}) - IFS="$ORIGINAL_IFS" - + IFS="$ORIGINAL_IFS" + if [[ -n ${A_NETWORK_DATA[@]} ]];then if [[ ${#A_NETWORK_DATA[@]} -le 1 ]];then card_one='Card ' fi - + if [[ -n ${a_network_working[1]} ]];then port_data=" ${C1}at port${C2} ${a_network_working[1]}" fi @@ -1679,7 +1683,7 @@ print_networking_data() do IFS="," a_network_working=( ${A_NETWORK_DATA[i]} ) - IFS="$ORIGINAL_IFS" + IFS="$ORIGINAL_IFS" port_data='' if [[ -n ${a_network_working[1]} ]];then port_data=" ${C1}at port${C2} ${a_network_working[1]}" @@ -1699,13 +1703,13 @@ print_short_data() # this gets that weird min/max final array item local min_max_clock_nu=$(( ${#A_CPU_DATA[@]} - 1 )) local min_max_clock=${A_CPU_DATA[$min_max_clock_nu]} - + #set_color_scheme 12 if [[ $B_RUNNING_IN_SHELL == 'false' ]];then for i in $C1 $C2 $CN do - case "$i" in - "$GREEN"|"$WHITE"|"$YELLOW"|"$CYAN") + case "$i" in + "$GREEN"|"$WHITE"|"$YELLOW"|"$CYAN") b_background_black='true' ;; esac @@ -1740,21 +1744,21 @@ print_system_data() local system_data='' local runlvl="$( runlevel | gawk '{ print $2 }' )" local memory="$( get_memory_data )" - + # Some code could look superfluous but BitchX doesn't like lines not ending in a newline. F*&k that bitch! # long_last=$( echo -ne "${C1}Processes${C2} ${processes}${CN} | ${C1}Uptime${C2} ${up_time}${CN} | ${C1}Memory${C2} ${MEM}${CN}" ) system_data=$( create_print_line "Info:" "${C1}Processes${C2} ${processes} ${CN}| ${C1}Uptime${C2} ${up_time} ${CN}| ${C1}Memory${C2} ${memory}${CN}" ) - + # this only triggers if no X data is present if [[ $B_X_RUNNING != 'true' ]];then system_data="${system_data} ${CN}| ${C1}Runlevel${C2} ${runlvl}${CN}" fi - + if [[ $SHOW_IRC -gt 0 ]];then system_data="${system_data} ${CN}| ${C1}Client${C2} ${IRC_CLIENT}${IRC_CLIENT_VERSION}${CN}" fi system_data="${system_data} ${CN}| ${C1}$SCRIPT_NAME ${C2}v:$SCRIPT_VERSION_NUMBER${CN}" - + if [[ $SCHEME -gt 0 ]];then system_data="${system_data} ${NORMAL}" fi @@ -1778,14 +1782,14 @@ print_it_out() ## assemble data for output # load A_HDD_DATA get_hard_drive_data - ## note: if hdd_model is declared prior to use, whatever string you want inserted will + ## note: if hdd_model is declared prior to use, whatever string you want inserted will ## be inserted first. In this case, it's desirable to print out (x) before each disk found. local hdd_model=${A_HDD_DATA[0]} local hdd_capacity=${A_HDD_DATA[1]} local hdd_used=${A_HDD_DATA[2]} # load A_CPU_DATA get_cpu_data - + IFS="," local a_cpu_working=(${A_CPU_DATA[0]}) IFS="$ORIGINAL_IFS" @@ -1804,7 +1808,7 @@ print_it_out() if [[ $VERBOSITY_LEVEL -ge 2 ]];then print_networking_data fi - + print_hard_disk_data print_system_data ;; @@ -1865,4 +1869,4 @@ fi # 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 +exit 0