diff --git a/inxi b/inxi index c9ab802..08b7ee7 100755 --- a/inxi +++ b/inxi @@ -1,7 +1,7 @@ #!/bin/bash ######################################################################## #### Script Name: inxi -#### version: 1.0.12 +#### version: 1.0.13 #### Date: 28 May 2009 ######################################################################## #### SPECIAL THANKS @@ -158,9 +158,9 @@ B_CPU_FLAGS_FULL='false' B_DEBUG_FLOOD='false' # show extra output data B_EXTRA_DATA='false' -B_SHOW_DISK='false' # override certain errors due to currupted data B_HANDLE_CORRUPT_DATA='false' +B_LOG_COLORS='false' B_ROOT='false' # Running in a shell? Defaults to false, and is determined later. B_RUNNING_IN_SHELL='false' @@ -169,6 +169,7 @@ B_SCRIPT_UP='false' # Show sound card data B_SHOW_AUDIO='false' B_SHOW_CPU='false' +B_SHOW_DISK='false' # Show full hard disk output B_SHOW_FULL_HDD='false' B_SHOW_GRAPHICS='false' @@ -188,6 +189,8 @@ B_SHOW_UUIDS='false' # triggers various debugging and new option testing B_TESTING_1='false' B_TESTING_2='false' +# set to true here for debug logging from script start +B_USE_LOGGING='false' # Test for X running B_X_RUNNING='false' @@ -230,6 +233,16 @@ DEBUG_BUFFER_INDEX=0 DEFAULT_SCHEME=2 # Default indentation level INDENT=10 + +# logging eval variables, start and end function: Insert to LOGFS LOGFE when debug level == 10 +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 /cmd inxi start, 2 is native konvi script mode KONVI=0 # NO_CPU_COUNT=0 # Wether or not the string "dual" or similar is found in cpuinfo output. If so, avoid dups. @@ -255,7 +268,11 @@ ORIGINAL_IFS="$IFS" SEP1='-' SEP2='~' -### Script names/paths +### 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 @@ -323,6 +340,7 @@ BAN_LIST_CPU='' ######################################################################## main() { + eval $LOGFS # 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. @@ -342,9 +360,9 @@ main() if [[ -s /etc/$SCRIPT_NAME.conf ]];then source /etc/$SCRIPT_NAME.conf fi - # Source user config overrides - if [[ -s $HOME/.$SCRIPT_NAME ]];then - source $HOME/.$SCRIPT_NAME + # Source user config overrides, ~/.inxi/inxi.conf + if [[ -s $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf ]];then + source $HOME/.$SCRIPT_NAME/$SCRIPT_NAME.conf fi ## this needs to run before the KONVI stuff is set below @@ -394,7 +412,7 @@ main() if [[ $B_RUNNING_IN_SHELL == 'true' && $SCHEME -gt 0 ]];then echo -n "" fi - + 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 @@ -411,6 +429,7 @@ main() # No args taken. initialize_script_data() { + 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" @@ -502,11 +521,13 @@ initialize_script_data() if [[ $( whoami ) == 'root' ]];then B_ROOT='true' fi + eval $LOGFE } # No args taken. check_script_suggested_apps() { + eval $LOGFS local bash_array_test=( "one" "two" ) # check for array ability of bash, this is only good for the warning at this time @@ -520,12 +541,14 @@ check_script_suggested_apps() else script_debugger "Suggestion: update to Bash v3.1 for optimal inxi output" fi + eval $LOGFE } # Determine if any of the absolutely necessary tools are absent # No args taken. check_script_depends() { + 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" @@ -552,6 +575,7 @@ check_script_depends() error_handler 5 "$app_name" fi done + eval $LOGFE } ## note: this is now running inside each gawk sequence directly to avoid exiting gawk @@ -561,6 +585,7 @@ check_script_depends() # args: $1 - BAN_LIST_NORMAL/BAN_LIST_CPU; $2 - string to sanitize sanitize_characters() { + eval $LOGFS # 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 '"..."' @@ -574,12 +599,14 @@ sanitize_characters() gsub(/^ +| +$/,\"\") ## (pipe char) with (nothing) print ## prints (returns) cleaned input }" + 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 @@ -599,6 +626,7 @@ make_ban_lists() done echo "$ban_list" + eval $LOGFS } # make_ban_lists "${A_CPU_BANS[@]}";exit @@ -606,6 +634,7 @@ make_ban_lists() # args: $1 = |<"none"> set_color_scheme() { + eval $LOGFS local i='' script_colors='' color_codes='' if [[ $1 -ge ${#A_COLOR_SCHEMES[@]} ]];then @@ -630,6 +659,7 @@ set_color_scheme() C2="${!script_colors[1]}" CN="${!script_colors[2]}" # ((COLOR_SCHEME++)) ## note: why is this? ## + eval $LOGFE } ######################################################################## @@ -644,6 +674,7 @@ set_color_scheme() # args: $1 - error number; $2 - optional, extra information error_handler() { + eval $LOGFS local error_message='' # assemble the error message @@ -679,6 +710,7 @@ error_handler() esac # then print it and exit print_screen_output "Error $1: $error_message" + eval $LOGFE exit $1 } @@ -687,6 +719,7 @@ error_handler() # args: $1 - $@ debugging string text script_debugger() { + eval $LOGFS if [[ $B_SCRIPT_UP == 'true' ]];then # only return if debugger is off and no pre start up errors have occured if [[ $DEBUG -eq 0 && $DEBUG_BUFFER_INDEX -eq 0 ]];then @@ -714,12 +747,73 @@ script_debugger() (( DEBUG_BUFFER_INDEX++ )) fi fi + eval $LOGFE +} + +# NOTE: no logging available until get_parameters is run, since that's what sets logging +# in order to trigger earlier logging manually set B_USE_LOGGING to true in top variables. +# $1 alone: logs data; $2 with or without $3 logs func start/end. +# $1 type (fs/fe) or logged data; [$2 is $FUNCNAME; [$3 - function args]] +log_function_data() +{ + if [ "$B_USE_LOGGING" == 'true' ];then + local logged_data='' spacer=" " + case $1 in + fs) + logged_data="Function: $2 - Primary: Start" + if [ -n "$3" ];then + logged_data="$logged_data\n${spacer}Args: $3" + fi + spacer='' + ;; + fe) + logged_data="Function: $2 - Primary: End" + spacer='' + ;; + *) + logged_data="$1" + ;; + esac + # Create any required line breaks and strip out escape color code, either ansi (case 1)or irc (case 2). + # This pattern doesn't work for irc colors, if we need that someone can figure it out + if [[ $B_LOG_COLORS != 'true' ]];then + echo -e "${spacer}$logged_data" | sed 's/\x1b\[[0-9]\{1,2\}\(;[0-9]\{1,2\}\)\{0,2\}m//g' >> $LOG_FILE + else + echo -e "${spacer}$logged_data" >> $LOG_FILE + fi + fi +} + +# called in the initial -@ 10 script args setting so we can get logging as soon as possible +# will have max 3 files, inxi.log, inxi.1.log, inxi.2.log +create_rotate_logfiles() +{ + if [[ ! -d $SCRIPT_DATA_DIR ]];then + mkdir $SCRIPT_DATA_DIR + fi + # do the rotation if logfile exists + if [[ -f $LOG_FILE ]];then + # copy if present second to third + if [[ -f $LOG_FILE_1 ]];then + mv -f $LOG_FILE_1 $LOG_FILE_2 + fi + # then copy initial to second + mv -f $LOG_FILE $LOG_FILE_1 + fi + # now create the logfile + touch $LOG_FILE + # and echo the start data + echo "=========================================================" >> $LOG_FILE + echo "START $SCRIPT_NAME LOGGING:" >> $LOG_FILE + echo "Script started: $( date +%Y-%m-%d-%H:%M:%S )" >> $LOG_FILE + echo "=========================================================" >> $LOG_FILE } # args: $1 - download url, not including file name; $2 - string to print out # note that $1 must end in / to properly construct the url path script_self_updater() { + eval $LOGFS local wget_error=0 print_screen_output "Starting $SCRIPT_NAME self updater." print_screen_output "Currently running $SCRIPT_NAME version number: $SCRIPT_VERSION_NUMBER" @@ -746,6 +840,7 @@ script_self_updater() error_handler 12 "$1" fi fi + eval $LOGFS } #### ------------------------------------------------------------------- @@ -757,6 +852,7 @@ script_self_updater() # note: dcop does not seem able to handle \n so that's being stripped out and replaced with space. print_screen_output() { + eval $LOGFS # the double quotes are needed to avoid losing whitespace in data when certain output types are used local print_data="$( echo -e "$1" )" @@ -786,19 +882,23 @@ print_screen_output() # the -n is needed to avoid double spacing of output in terminal echo -ne "$print_data\n" fi + eval $LOGFE } ## this handles all verbose line construction with indentation/line starter ## args: $1 - null (, actually: " ") or line starter; $2 - line content create_print_line() { + eval $LOGFS printf "${C1}%-${INDENT}s${C2} %s" "$1" "$2" + eval $LOGFE } # this removes newline and pipes. # args: $1 - string to clean remove_erroneous_chars() { + eval $LOGFS ## RS is input record separator ## gsub is substitute; gawk ' @@ -814,6 +914,7 @@ remove_erroneous_chars() gsub(/^ +| +$/, "") ## (pipe char) with (nothing) printf $0 }' "$1" ## prints (returns) cleaned input + eval $LOGFE } #### ------------------------------------------------------------------- @@ -824,6 +925,7 @@ remove_erroneous_chars() # args: $1 - full script startup args: $@ get_parameters() { + eval $LOGFS local opt='' wget_test='' update_flags='U!:' local use_short='true' # this is needed to trigger short output, every v/d/F/line trigger sets this false @@ -931,6 +1033,17 @@ get_parameters() @) if [[ -n $( egrep "^([1-9]|10)$" <<< $OPTARG ) ]];then DEBUG=$OPTARG exec 2>&1 + # switch on logging only for -@ 10 + if [[ $OPTARG -ge 9 ]];then + if [[ $OPTARG -eq 10 ]];then + B_LOG_COLORS='true' + fi + B_USE_LOGGING='true' + # pack the logging data for evals function start/end + LOGFS=$LOGFS_STRING + LOGFE=$LOGFE_STRING + create_rotate_logfiles # create/rotate logfiles before we do anything else + fi else error_handler 9 "$OPTARG" fi @@ -982,6 +1095,7 @@ get_parameters() if [[ $use_short == 'true' ]];then B_SHOW_SHORT_OUTPUT='true' fi + eval $LOGFE } ## print out help menu, not including Testing or Debugger stuff because it's not needed @@ -1090,6 +1204,7 @@ print_version_info() # Determine where inxi was run from, set IRC_CLIENT and IRC_CLIENT_VERSION get_start_client() { + eval $LOGFS local irc_client_path='' irc_client_path_lower='' non_native_konvi='' i='' local b_non_native_app='false' pppid='' app_working_name='' @@ -1324,6 +1439,8 @@ get_start_client() IRC_CLIENT="PPID=\"$PPID\" - empty?" unset IRC_CLIENT_VERSION fi + log_function_data "IRC_CLIENT: $IRC_CLIENT :: IRC_CLIENT_VERSION: $IRC_CLIENT_VERSION :: PPID: $PPID" + eval $LOGFE } # This needs some cleanup and comments, not quite understanding what is happening, although generally output is known @@ -1331,6 +1448,7 @@ get_start_client() # args: $1 - $PPID get_cmdline() { + eval $LOGFS local i=0 ppid=$1 if [[ ! -e /proc/$ppid/cmdline ]];then @@ -1353,6 +1471,8 @@ get_cmdline() fi fi CMDL_MAX=$i + log_function_data "CMDL_MAX: $CMDL_MAX" + eval $LOGFE } #### ------------------------------------------------------------------- @@ -1361,6 +1481,7 @@ get_cmdline() ## create array of sound cards installed on system, and if found, use asound data as well get_audio_data() { + eval $LOGFS local i='' alsa_data='' alsa_driver='' device_count='' local usb_proc_file='' array_count='' usb_id='' usb_data='' @@ -1505,10 +1626,13 @@ get_audio_data() if [[ ${#A_AUDIO_DATA[@]} -eq 0 ]];then A_AUDIO_DATA[0]='Failed to Detect Sound Card!' fi + log_function_data "A_AUDIO_DATA: ${A_AUDIO_DATA[@]}" + eval $LOGFE } get_audio_alsa_data() { + eval $LOGFS local alsa_data='' # now we'll get the alsa data if the file exists @@ -1530,12 +1654,15 @@ get_audio_alsa_data() }' $DIR_ASOUND_VERSION ) fi echo "$alsa_data" + log_function_data "alsa_data: $alsa_data" + eval $LOGFE } ## create A_CPU_CORE_DATA, currently with two values: integer core count; core string text ## return value cpu core count string, this helps resolve the multi redundant lines of old style output get_cpu_core_count() { + eval $LOGFS if [[ $B_CPUINFO == 'true' ]]; then # load the A_CPU_TYPE_PCNT_CCNT core data array get_cpu_ht_multicore_smp_data @@ -1563,11 +1690,14 @@ get_cpu_core_count() # A_CPU_CORE_DATA=( "$cpu_core_count" "$cpu_alpha_count Core$cpu_type" ) A_CPU_CORE_DATA=( "$cpu_physical_count" "$cpu_alpha_count" "$cpu_type" "$cpu_core_count" ) fi + log_function_data "A_CPU_CORE_DATA: ${A_CPU_CORE_DATA[@]}" + eval $LOGFE } ## main cpu data collector get_cpu_data() { + eval $LOGFS local i='' j='' cpu_array_nu='' a_cpu_working='' multi_cpu='' bits='' if [[ $B_CPUINFO == 'true' ]];then @@ -1646,12 +1776,15 @@ get_cpu_data() fi IFS="$ORIGINAL_IFS" + log_function_data "A_CPU_DATA: ${A_CPU_DATA[@]}" + eval $LOGFE # echo getMainCpu: ${[@]} } ## this is for counting processors and finding HT types get_cpu_ht_multicore_smp_data() { + eval $LOGFS # in /proc/cpuinfo # algorithm # if > 1 processor && processor id (physical id) == core id then Hyperthreaded (HT) @@ -1733,12 +1866,15 @@ get_cpu_ht_multicore_smp_data() ' $DIR_CPUINFO ) ) fi + log_function_data "A_CPU_TYPE_PCNT_CCNT: ${A_CPU_TYPE_PCNT_CCNT[@]}" + eval $LOGFE } # for more on distro id, please reference this python thread: http://bugs.python.org/issue1322 ## return distro name/id if found get_distro_data() { + eval $LOGFS local i='' j='' distro='' distro_file='' a_distro_glob='' # get the wild carded array of release/version /etc files if present @@ -1829,11 +1965,14 @@ get_distro_data() fi echo "$distro" + log_function_data "distro: $distro" + eval $LOGFE } # args: $1 - optional, app, uses the app test, not being used now get_distro_lsb_data() { + eval $LOGFS local distro='' if [[ $B_LSB_DIR == 'true' ]] && [[ $1 != 'app' ]];then @@ -1890,11 +2029,14 @@ get_distro_lsb_data() # fi echo $distro + log_function_data "distro: $distro" + eval $LOGFE } ## create array of gfx cards installed on system get_graphics_card_data() { + eval $LOGFS local i='' IFS=$'\n' @@ -1921,11 +2063,14 @@ get_graphics_card_data() # 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 1, so loop it ) print_module_version() { + eval $LOGFS local module_versions='' module='' version='' for module in $1 @@ -3275,10 +3490,12 @@ print_module_version() if [[ -n $module_versions ]];then echo " ${C1}v:${C2}$module_versions" fi + eval $LOGFE } print_networking_data() { + eval $LOGFS local i='' card_one='Card-1' network_data='' a_network_working='' port_data='' driver_data='' local card_string='' port_plural='' module_version='' # set A_NETWORK_DATA @@ -3340,10 +3557,12 @@ print_networking_data() if [[ $B_SHOW_IP == 'true' ]];then print_networking_ip_data fi + eval $LOGFE } print_networking_ip_data() { + eval $LOGFS local ip=$( get_networking_wan_ip_data ) local ip_data='' a_interfaces_working='' interfaces='' interfaces_2='' i='' @@ -3378,10 +3597,12 @@ print_networking_ip_data() interfaces_2=$( create_print_line " " "$interfaces_2" ) print_screen_output "$interfaces_2" fi + eval $LOGFE } print_partition_data() { + eval $LOGFS local a_partition_working='' partition_used='' partition_data='' local counter=0 line_max=160 i=0 a_partition_data='' line_starter='' local partitionIdClean='' part_dev='' full_dev='' part_label='' full_label='' @@ -3468,10 +3689,12 @@ print_partition_data() partition_data=$( create_print_line "$line_starter" "${a_partition_data[$i]}" ) print_screen_output "$partition_data" done + eval $LOGFE } print_system_data() { + eval $LOGFS local system_data='' bits='' local host_name=$( hostname ) local current_kernel=$( uname -rm ) # | gawk '{print $1,$3,$(NF-1)}' ) @@ -3490,6 +3713,7 @@ print_system_data() fi system_data="$system_data $current_kernel $bits ${C1}Distro${C2} $distro" print_screen_output "$system_data" + eval $LOGFE } ########################################################################