diff options
Diffstat (limited to 'inxi')
-rwxr-xr-x | inxi | 526 |
1 files changed, 498 insertions, 28 deletions
@@ -1,8 +1,8 @@ #!/usr/bin/env bash ######################################################################## #### Script Name: inxi -#### Version: 2.2.35 -#### Date: 2016-02-29 +#### Version: 2.3.0 +#### Date: 2016-04-18 #### Patch Number: 00 ######################################################################## #### SPECIAL THANKS @@ -254,6 +254,7 @@ ORIGINAL_IFS="$IFS" ## Initialize A_ALSA_DATA='' A_AUDIO_DATA='' +A_BATTERY_DATA='' A_CMDL='' A_CPU_CORE_DATA='' A_CPU_DATA='' @@ -334,6 +335,8 @@ B_SHOW_BASIC_RAID='false' B_SHOW_BASIC_CPU='false' B_SHOW_BASIC_DISK='false' B_SHOW_BASIC_OPTICAL='false' +B_SHOW_BATTERY='false' +B_SHOW_BATTERY_FORCED='false' B_SHOW_CPU='false' B_SHOW_DISPLAY_DATA='false' B_SHOW_DISK_TOTAL='false' @@ -603,8 +606,21 @@ MAGENTA,YELLOW,NORMAL RED,CYAN,NORMAL RED,WHITE,NORMAL BLUE,WHITE,NORMAL + +RED,BLUE,NORMAL +RED,DBLUE,NORMAL +BLACK,BLUE,NORMAL +BLACK,DBLUE,NORMAL +NORMAL,BLUE,NORMAL +BLUE,MAGENTA,NORMAL +DBLUE,MAGENTA,NORMAL +BLACK,MAGENTA,NORMAL +MAGENTA,BLUE,NORMAL +MAGENTA,DBLUE,NORMAL ) +#echo ${#A_COLOR_SCHEMES[@]};exit + # 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 @@ -697,7 +713,7 @@ main() # 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 + # KONVI=3 ## for testing puroses if [[ $KONVI -eq 1 || $KONVI -eq 3 ]];then if [[ $KONVI -eq 1 ]]; then ## dcop Konversation (ie 1.x < 1.2(qt3)) DCPORT="$1" @@ -868,7 +884,7 @@ initialize_data() else # found a case of battery existing but having nothing in it on desktop mobo # not all laptops show the first. /proc/acpi/battery is deprecated. - if [[ -n $( ls /proc/acpi/battery 2>/dev/null ) || -e /sys/class/power_supply/BAT0/ ]];then + if [[ -n $( ls /proc/acpi/battery 2>/dev/null ) || -n $( ls /sys/class/power_supply/ 2>/dev/null ) ]];then B_PORTABLE='true' fi fi @@ -1221,7 +1237,7 @@ select_default_color_scheme() # print_screen_output "You will see this message only one time per user account, unless you set preferences in: /etc/$SCRIPT_NAME.conf" print_screen_output " " fi - print_lines_basic "0" "" "Because there is no way to know your $COLOR_SELECTION foreground/background colors, you can set your color preferences from color scheme option list below. 0 is no colors, 1 neutral. After these, there are 3 sets: 1-dark or light backgrounds; 2-light backgrounds; 3-dark backgrounds." + print_lines_basic "0" "" "Because there is no way to know your $COLOR_SELECTION foreground/background colors, you can set your color preferences from color scheme option list below. 0 is no colors, 1 neutral. After these, there are 4 sets: 1-dark or light backgrounds; 2-light backgrounds; 3-dark backgrounds; 4-miscellaneous." if [[ $B_IRC == 'false' ]];then print_lines_basic "0" "" "Please note that this will set the $COLOR_SELECTION preferences only for user: $(whoami)" fi @@ -1745,7 +1761,10 @@ debug_data_collector() get_repo_data "$SCRIPT_DATA_DIR/$debug_data_dir" if type -p shopt &>/dev/null;then - shopt -s nullglob;a_distro_ids=(/etc/*[-_]{release,version});shopt -u nullglob;echo ${a_distro_ids[@]} &> $debug_data_dir/etc-distro-files.txt + shopt -s nullglob + a_distro_ids=(/etc/*[-_]{release,version}) + shopt -u nullglob + echo ${a_distro_ids[@]} &> $debug_data_dir/etc-distro-files.txt for distro_file in ${a_distro_ids[@]} /etc/issue do if [[ -f $distro_file ]];then @@ -1800,6 +1819,17 @@ debug_data_collector() else touch $debug_data_dir/strings-absent fi + local id_dir='/sys/class/power_supply/' + local ids=$( ls $id_dir 2>/dev/null ) + if [[ -n $ids ]];then + for batid in $ids + do + cat $id_dir$batid'/uevent' &> $debug_data_dir/sys-power-supply-$batid.txt + done + else + touch $debug_data_dir/sys-power-supply-none + fi + # leaving this commented out to remind that some systems do not # support strings --version, but will just simply hang at that command # which you can duplicate by simply typing: strings then hitting enter, you will get hang. @@ -2519,7 +2549,7 @@ get_parameters() # no need to run through these if there are no args # reserved for future use: -g for extra Graphics; -m for extra Machine; -d for extra Disk elif [[ -n $1 ]];then - while getopts Abc:CdDfFGhHiIlmMnNopPrRsSt:uUv:V${weather_flag}xy:zZ%@:!: opt + while getopts AbBc:CdDfFGhHiIlmMnNopPrRsSt:uUv:V${weather_flag}xy:zZ%@:!: opt do case $opt in A) B_SHOW_AUDIO='true' @@ -2532,9 +2562,14 @@ get_parameters() B_SHOW_GRAPHICS='true' B_SHOW_INFO='true' B_SHOW_MACHINE='true' + B_SHOW_BATTERY='true' B_SHOW_NETWORK='true' B_SHOW_SYSTEM='true' ;; + B) B_SHOW_BATTERY_FORCED='true' + B_SHOW_BATTERY='true' + use_short='false' + ;; c) if [[ $OPTARG =~ ^[0-9][0-9]?$ ]];then case $OPTARG in 99) @@ -2598,6 +2633,7 @@ get_parameters() B_SHOW_GRAPHICS='true' B_SHOW_INFO='true' B_SHOW_MACHINE='true' + B_SHOW_BATTERY='true' B_SHOW_NETWORK='true' B_SHOW_PARTITIONS='true' B_SHOW_RAID='true' @@ -2624,6 +2660,7 @@ get_parameters() use_short='false' ;; M) B_SHOW_MACHINE='true' + B_SHOW_BATTERY='true' use_short='false' ;; n) B_SHOW_ADVANCED_NETWORK='true' @@ -2690,6 +2727,7 @@ get_parameters() if [[ $OPTARG -ge 2 ]];then B_SHOW_BASIC_DISK='true' B_SHOW_BASIC_RAID='true' + B_SHOW_BATTERY='true' B_SHOW_MACHINE='true' B_SHOW_NETWORK='true' fi @@ -2934,11 +2972,12 @@ show_options() # print_screen_output " " print_lines_basic "0" "" "$SCRIPT_NAME supports the following options. You can combine them, or list them one by one. Examples: $SCRIPT_NAME^-v4^-c6 OR $SCRIPT_NAME^-bDc^6. If you start $SCRIPT_NAME with no arguments, it will show the short form." print_screen_output " " - print_lines_basic "0" "" "The following options if used without -F, -b, or -v will show just option line(s): A, C, D, G, I, M, N, P, R, S, f, i, m, n, o, p, l, u, r, s, t - you can use these alone or together to show just the line(s) you want to see. If you use them with -v^[level], -b or -F, it will show the full output for that line along with the output for the chosen verbosity level." + print_lines_basic "0" "" "The following options if used without -F, -b, or -v will show just option line(s): A, B, C, D, G, I, M, N, P, R, S, f, i, m, n, o, p, l, u, r, s, t - you can use these alone or together to show just the line(s) you want to see. If you use them with -v^[level], -b or -F, it will show the full output for that line along with the output for the chosen verbosity level." print_screen_output "- - - - - - - - - - - - - - - - - - - - - - - - - - - - -" print_screen_output "Output Control Options:" print_lines_basic "1" "-A" "Audio/sound card information." - print_lines_basic "1" "-b" "Basic output, short form. Like $SCRIPT_NAME^-v^2, only minus hard disk names." + print_lines_basic "1" "-b" "Basic output, short form. Like $SCRIPT_NAME^-v^2, only minus hard disk names ." + print_lines_basic "1" "-B" "Battery info, shows charge, condition, plus extra information (if battery present)." print_lines_basic "1" "-c" "Color schemes. Scheme number is required. Color selectors run a color selector option prior to $SCRIPT_NAME starting which lets you set the config file value for the selection." print_lines_basic "1" "" "Supported color schemes: 0-$color_scheme_count Example:^$SCRIPT_NAME^-c^11" print_lines_basic "1" "" "Color selectors for each type display (NOTE: irc and global only show safe color set):" @@ -2978,8 +3017,8 @@ show_options() print_lines_basic "1" "" "Supported levels: 0-$VERBOSITY_LEVELS Example: $SCRIPT_NAME^-v^4" print_lines_basic "2" "0" "Short output, same as: $SCRIPT_NAME" print_lines_basic "2" "1" "Basic verbose, -S + basic CPU + -G + basic Disk + -I." - print_lines_basic "2" "2" "Networking card (-N), Machine (-M) data, shows basic hard disk data (names only), and, if present, basic raid (devices only, and if inactive, notes that). similar to: $SCRIPT_NAME^-b" - print_lines_basic "2" "3" "Advanced CPU (-C), network (-n) data, and switches on -x advanced data option." + print_lines_basic "2" "2" "Networking card (-N), Machine (-M) data, if present, Battery (-B), basic hard disk data (names only), and, if present, basic raid (devices only, and if inactive, notes that). similar to: $SCRIPT_NAME^-b" + print_lines_basic "2" "3" "Advanced CPU (-C), battery, network (-n) data, and switches on -x advanced data option." print_lines_basic "2" "4" "$partition_string_u size/filled data (-P) for (if present): /, /home, /var/, /boot. Shows full disk data (-D)." print_lines_basic "2" "5" "Audio card (-A); sensors^(-s), memory/ram^(-m), $partition_string label^(-l) and UUID^(-u), short form of optical drives, standard raid data (-R)." print_lines_basic "2" "6" "Full $partition_string (-p), unmounted $partition_string (-o), optical drive (-d), full raid; triggers -xx." @@ -2991,6 +3030,7 @@ show_options() print_lines_basic "1" "-W" "<location> Supported options for <location>: postal code; city, state/country; latitude, longitude. Only use if you want the weather somewhere other than the machine running $SCRIPT_NAME. Use only ascii characters, replace spaces in city/state/country names with '+'. Example:^$SCRIPT_NAME^-W^new+york,ny" fi print_lines_basic "1" "-x" "Adds the following extra data (only works with verbose or line output, not short form):" + print_lines_basic "2" "-B" "Vendor/model, status (if available)" print_lines_basic "2" "-C" "CPU Flags, Bogomips on Cpu;" print_lines_basic "2" "-d" "Extra optical drive data; adds rev version to optical drive." print_lines_basic "2" "-D" "Hdd temp with disk data if you have hddtemp installed, if you are root OR if you have added to /etc/sudoers (sudo v. 1.7 or newer) Example:^<username>^ALL^=^NOPASSWD:^/usr/sbin/hddtemp" @@ -3009,6 +3049,7 @@ show_options() fi print_lines_basic "1" "-xx" "Show extra, extra data (only works with verbose or line output, not short form):" print_lines_basic "2" "-A" "Chip vendor:product ID for each audio device." + print_lines_basic "2" "-B" "serial number, voltage (if available)." print_lines_basic "2" "-C" "Minimum CPU speed, if available." print_lines_basic "2" "-D" "Disk serial number." print_lines_basic "2" "-G" "Chip vendor:product ID for each video card." @@ -3023,6 +3064,7 @@ show_options() fi print_lines_basic "2" "-@ 11-14" "Automatically uploads debugger data tar.gz file to ftp.techpatterns.com. EG: $SCRIPT_NAME^-xx@14" print_lines_basic "1" "-xxx" "Show extra, extra, extra data (only works with verbose or line output, not short form):" + print_lines_basic "2" "-B" "chemistry, cycles, location (if available)." print_lines_basic "2" "-m" "Width of memory bus, data and total (if present and greater than data); Detail, if present, for Type; module voltage, if available." print_lines_basic "2" "-S" "Panel/shell information in desktop output, if in X (like gnome-shell, cinnamon, mate-panel)." if [[ $B_ALLOW_WEATHER == 'true' ]];then @@ -3958,6 +4000,233 @@ get_audio_alsa_data() eval $LOGFE } +get_battery_data() +{ + eval $LOGFS + local a_temp='' id_file='' count=0 + local id_dir='/sys/class/power_supply/' + local ids=$( ls $id_dir 2>/dev/null ) battery_file='' + + # ids='BAT0 BAT1 BAT2' + if [[ -n $ids && $B_FORCE_DMIDECODE == 'false' ]];then + for idx in $ids + do + battery_file=$id_dir$idx'/uevent' + if [[ -r $battery_file ]];then + # echo $battery_file + count=$(( $count + 1 )) + IFS=$'\n' + battery_data=$( + gawk -F '=' ' + BEGIN { + IGNORECASE=1 + name="" + status="" + present="" + chemistry="" + cycles="" + voltage_min_design="" + voltage_now="" + power_now="" + charge_full_design="" + charge_full="" + charge_now="" + capacity="" + capacity_level="" + model="" + company="" + serial="" + of_orig="" + location="" + } + { + gsub(/'"$BAN_LIST_NORMAL"'|,|battery|unknown/, "", $2) + gsub(/^ +| +$/, "", $2) + } + $1 ~ /^POWER_SUPPLY_NAME$/ { + name=$NF + } + $1 ~ /^POWER_SUPPLY_STATUS$/ { + status=$NF + } + $1 ~ /^POWER_SUPPLY$/ { + present=$NF + } + $1 ~ /^POWER_SUPPLY_TECHNOLOGY$/ { + chemistry=$NF + } + $1 ~ /^POWER_SUPPLY_CYCLE_COUNT$/ { + cycles=$NF + } + $1 ~ /^POWER_SUPPLY_VOLTAGE_MIN_DESIGN$/ { + voltage_min_design = $NF / 1000000 + voltage_min_design = sprintf( "%.1f", voltage_min_design ) + } + $1 ~ /^POWER_SUPPLY_VOLTAGE_NOW$/ { + voltage_now = $NF / 1000000 + voltage_now = sprintf( "%.1f", voltage_now ) + } + $1 ~ /^POWER_SUPPLY_POWER_NOW$/ { + power_now=$NF + } + $1 ~ /^POWER_SUPPLY_ENERGY_FULL_DESIGN$/ { + charge_full_design = $NF / 1000000 + } + $1 ~ /^POWER_SUPPLY_ENERGY_FULL$/ { + charge_full = $NF / 1000000 + } + $1 ~ /^POWER_SUPPLY_ENERGY_NOW$/ { + charge_now = $NF / 1000000 + charge_now = sprintf( "%.1f", charge_now ) + } + $1 ~ /^POWER_SUPPLY_CHARGE_FULL_DESIGN$/ { + charge_full_design = $NF / 100000 + } + $1 ~ /^POWER_SUPPLY_CHARGE_FULL$/ { + charge_full = $NF / 100000 + } + $1 ~ /^POWER_SUPPLY_CHARGE_NOW$/ { + charge_now = $NF / 100000 + } + $1 ~ /^POWER_SUPPLY_CAPACITY$/ { + if ( $NF != "" ){ + capacity=$NF "%" + } + } + $1 ~ /^POWER_SUPPLY_CAPACITY_LEVEL$/ { + capacity_level=$NF + } + $1 ~ /^POWER_SUPPLY_MODEL_NAME$/ { + model=$NF + } + $1 ~ /^POWER_SUPPLY_MANUFACTURER$/ { + company=$NF + } + $1 ~ /^POWER_SUPPLY_SERIAL_NUMBER$/ { + serial=$NF + } + END { + if (charge_now != "" && charge_full != "" ){ + capacity = 100*charge_now/charge_full + capacity = sprintf( "%.1f%", capacity ) + } + if (charge_full_design != "" && charge_full != "" ){ + of_orig=100*charge_full/charge_full_design + of_orig = sprintf( "%.0f%", of_orig ) + } + if (charge_now != "" ){ + charge_now = sprintf( "%.1f", charge_now ) + } + if (charge_full_design != "" ){ + charge_full_design = sprintf( "%.1f", charge_full_design ) + } + if ( charge_full != "" ){ + charge_full = sprintf( "%.1f", charge_full ) + } + entry = name "," status "," present "," chemistry "," cycles "," voltage_min_design "," voltage_now "," + entry = entry power_now "," charge_full_design "," charge_full "," charge_now "," capacity "," + entry = entry capacity_level "," of_orig "," model "," company "," serial "," location + print entry + }' < $battery_file ) + # <<< "$data" ) + # < $battery_file ) + A_BATTERY_DATA[$count]=$battery_data + IFS="$ORIGINAL_IFS" + fi + done + elif [[ $B_FORCE_DMIDECODE == 'true' ]] || [[ ! -d $id_dir && -z $ids ]];then + get_dmidecode_data + if [[ -n $DMIDECODE_DATA ]];then + if [[ $DMIDECODE_DATA == 'dmidecode-error-'* ]];then + A_BATTERY_DATA[0]=$DMIDECODE_DATA + # please note: only dmidecode version 2.11 or newer supports consistently the -s flag + else + IFS=$'\n' + # NOTE: this logic has a flaw, which is multiple batteries, which won't work without + # gawk arrays, but sorry, too much of a pain given how little useful data from dmidecode + A_BATTERY_DATA=( $( gawk -F ':' ' + BEGIN { + IGNORECASE=1 + name="" + status="" + present="" + chemistry="" + cycles="" + voltage_min_design="" + voltage_now="" + power_now="" + charge_full_design="" + charge_full="" + charge_now="" + capacity="" + capacity_level="" + model="" + company="" + serial="" + of_orig="" + location="" + bItemFound="false" + } + { + gsub(/'"$BAN_LIST_NORMAL"'|,|battery|unknown/, "", $2) + gsub(/^ +| +$/, "", $1) + gsub(/^ +| +$/, "", $2) + } + /^Portable Battery/ { + while ( getline && !/^$/ ) { + if ( $1 ~ /^Location/ ) { location=$2 } + if ( $1 ~ /^Manufacturer/ ) { company=$2 } + if ( $1 ~ /^Serial/ ) { serial=$2 } + if ( $1 ~ /^Name/ ) { model=$2 } + if ( $1 ~ /^Design Capacity/ ) { + sub(/^[[:space:]]*mwh/, "", $2) + charge_full_design = $NF / 1000 + charge_full_design = sprintf( "%.1f", charge_full_design ) + } + if ( $1 ~ /^Design Voltage/ ) { + sub(/^[[:space:]]*mv/, "", $2) + voltage_min_design = $NF / 1000 + voltage_min_design = sprintf( "%.1f", voltage_min_design ) + } + if ( $1 ~ /^SBDS Chemistry/ ) { chemistry=$2 } + } + testString=company serial model charge_full_design voltage_min_design + if ( testString != "" ) { + bItemFound="true" + exit # exit loop, we are not handling > 1 batteries + } + } + END { + if ( bItemFound == "true" ) { + name="BAT-1" + if (charge_now != "" && charge_full != "" ){ + capacity = 100*charge_now/charge_full + capacity = sprintf( "%.1f%", capacity ) + } + if (charge_full_design != "" && charge_full != "" ){ + of_orig=100*charge_full/charge_full_design + of_orig = sprintf( "%.0f%", of_orig ) + } + entry = name "," status "," present "," chemistry "," cycles "," voltage_min_design "," voltage_now "," + entry = entry power_now "," charge_full_design "," charge_full "," charge_now "," capacity "," + entry = entry capacity_level "," of_orig "," model "," company "," serial "," location + print entry + } + }' <<< "$DMIDECODE_DATA" ) ) + IFS="$ORIGINAL_IFS" + fi + fi + fi + # echo $array_string + + #echo ${#A_BATTERY_DATA[@]} + a_temp=${A_BATTERY_DATA[@]} + + # echo $a_temp + log_function_data "A_BATTERY_DATA: $a_temp" + 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() @@ -5088,7 +5357,7 @@ get_display_manager() get_distro_data() { eval $LOGFS - local i='' j='' distro='' distro_file='' a_distro_glob='' a_temp='' + local i='' j='' distro='' distro_file='' a_distro_glob='' a_temp='' b_osr='false' # may need modification if archbsd / debian can be id'ed with /etc files if [[ -n $BSD_TYPE ]];then @@ -5161,6 +5430,7 @@ get_distro_data() distro=$( get_distro_lsb_os_release_data 'lsb-file' ) elif [[ $distro_file == 'os-release' ]];then distro=$( get_distro_lsb_os_release_data 'os-release-file' ) + b_osr='true' # then if the distro id file was found and it's not in the exluded primary distro file list, read it elif [[ -n $distro_file && -s /etc/$distro_file && " $DISTROS_EXCLUDE_LIST " != *" $distro_file "* ]];then # new opensuse uses os-release, but older ones may have a similar syntax, so just use the first line @@ -5174,9 +5444,12 @@ get_distro_data() fi # otherwise try the default debian/ubuntu /etc/issue file elif [[ -f /etc/issue ]];then - # lsb gives more manageable and accurate output than issue, but mint should use issue for now + # os-release/lsb gives more manageable and accurate output than issue, but mint should use issue for now # some bashism, boolean must be in parenthesis to work correctly, ie [[ $(boolean) ]] not [[ $boolean ]] - if [[ $B_LSB_FILE == 'true' ]] && [[ -z $( grep -i 'mint' /etc/issue ) ]];then + if [[ $B_OS_RELEASE_FILE == 'true' ]] && [[ -z $( grep -i 'mint' /etc/issue ) ]];then + distro=$( get_distro_lsb_os_release_data 'os-release-file' ) + b_osr='true' + elif [[ $B_LSB_FILE == 'true' ]] && [[ -z $( grep -i 'mint' /etc/issue ) ]];then distro=$( get_distro_lsb_os_release_data 'lsb-file' ) else distro=$( gawk ' @@ -5199,20 +5472,28 @@ get_distro_data() fi fi fi - + # a final check. If a long value, before assigning the debugger output, if os-release + # exists then let's use that if it wasn't tried already. Maybe that will be better. if [[ ${#distro} -gt 80 ]] && [[ $B_HANDLE_CORRUPT_DATA != 'true' ]];then - distro="${RED}/etc/$distro_file corrupted, use -% to override${NORMAL}" + if [[ $B_OS_RELEASE_FILE == 'true' && $b_osr == 'false' ]];then + distro=$( get_distro_lsb_os_release_data 'os-release-file' ) + fi + if [[ ${#distro} -gt 80 ]];then + distro="${RED}/etc/$distro_file corrupted, use -% to override${NORMAL}" + fi fi ## note: would like to actually understand the method even if it's not used # : ${distro:=Unknown distro o_O} ## test for /etc/lsb-release as a backup in case of failure, in cases where > one version/release file ## were found but the above resulted in null distro value - if [[ -z $distro ]] && [[ $B_LSB_FILE == 'true' ]];then - distro=$( get_distro_lsb_os_release_data 'lsb-file' ) - fi + # Because os-release is now more common, we'll test for it first. if [[ -z $distro ]] && [[ $B_OS_RELEASE_FILE == 'true' ]];then distro=$( get_distro_lsb_os_release_data 'os-release-file' ) fi + if [[ -z $distro ]] && [[ $B_LSB_FILE == 'true' ]];then + distro=$( get_distro_lsb_os_release_data 'lsb-file' ) + fi + # now some final null tries if [[ -z $distro ]];then # if the file was null but present, which can happen in some cases, then use the file name itself to @@ -5412,7 +5693,7 @@ get_dmidecode_data() fi # these tests first, because bsd error messages like this (note how many : are in the string) # inxi: line 4928: /usr/local/sbin/dmidecode: Permission denied - if [[ ${#dmiData} -lt 100 ]];then + if [[ ${#dmiData} -lt 200 ]];then if [[ -z ${dmiData/*Permission denied*/} ]];then # if [[ -n $( grep -i 'Permission denied' <<< "$dmiData" ) ]];then DMIDECODE_DATA='dmidecode-error-requires-root' @@ -7862,9 +8143,9 @@ get_partition_data() if [[ $( grep -cs '[[:space:]]/$' <<< "$main_partition_data" ) -gt 1 ]];then main_partition_data="$( grep -vs '^rootfs' <<< "$main_partition_data" )" fi + # echo "$main_partition_data" log_function_data 'raw' "main_partition_data_post_rootfs:\n$main_partition_data\n\nswap_data:\n$swap_data" IFS=$'\n' - # sample line: /dev/sda2 ext3 15G 8.9G 4.9G 65% /home # $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 LVM 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 @@ -7878,8 +8159,9 @@ get_partition_data() # skipping these file systems because bsds do not support df --exclude-type=<fstype> # note that using $1 to handle older bsd df, which do not support -T. This will not be reliable but we will see ( bsdType != "" ) { - # skip if non disk/partition, or if raid primary id, which will not have a / in it - if ( $1 ~ /^(aufs|devfs|devtmpfs|fdescfs|iso9660|linprocfs|procfs|squashfs|sysfs|tmpfs|type|unionfs)$/ || + # skip if non disk/partition, or if raid primary id, which will not have a / in it. + # Note: kfreebsd uses /sys, not sysfs, is this a bug or expected behavior? + if ( $1 ~ /^(aufs|devfs|devtmpfs|fdescfs|iso9660|linprocfs|procfs|squashfs|\/sys|sysfs|tmpfs|type|unionfs)$/ || ( $1 ~ /^([^\/]+)$/ && $1 !~ /^ROOT/ ) ) { # note use next, not getline or it does not work right next @@ -7965,7 +8247,6 @@ get_partition_data() print $(NF - 2) " " $(NF - 1) " " $NF "," $(NF - 6) "," $(NF - 5) "," $(NF - 3) ",secondary," fileSystem "," devBase } }' ) - # now add the swap partition data, don't want to show swap files, just partitions, # though this can include /dev/ramzswap0. Note: you can also use /proc/swaps for this # data, it's the same exact output as swapon -s @@ -8068,7 +8349,7 @@ get_partition_data() fi done a_temp=${A_PARTITION_DATA[@]} - # echo $a_temp + # echo $a_temp;exit log_function_data "2: A_PARTITION_DATA:\n$a_temp" if [[ $B_SHOW_LABELS == 'true' || $B_SHOW_UUIDS == 'true' ]];then get_partition_data_advanced @@ -11142,6 +11423,9 @@ print_it_out() if [[ $B_SHOW_MACHINE == 'true' ]];then print_machine_data fi + if [[ $B_SHOW_BATTERY == 'true' ]];then + print_battery_data + fi if [[ $B_SHOW_BASIC_CPU == 'true' || $B_SHOW_CPU == 'true' ]];then print_cpu_data fi @@ -11479,6 +11763,188 @@ print_audio_data() eval $LOGFE } +print_battery_data() +{ + eval $LOGFS + local line_starter='Battery' print_data='' + get_battery_data + if [[ -n ${A_BATTERY_DATA[@]} ]];then + local battery_data='' battery_string='' + local present='' chemistry='' cycles='' voltage_min_design='' voltage_now='' + local power_now='' charge_full_design='' charge_full='' charge_now='' capacity='' + local capacity_level='' model='' company='' serial='' of_orig='' model='' condition='' + local power='' + + # echo ${A_BATTERY_DATA[@]} + for (( i=0; i< ${#A_BATTERY_DATA[@]}; i++ )) + do + battery_data='' + print_data='' + battery_string='' + charge='' + model='' + condition='' + voltage='' + + name='' + status='' + present='' + chemistry='' + cycles='' + voltage_min_design='' + voltage_now='' + power_now='' + charge_full_design='' + charge_full='' + charge_now='' + capacity='' + capacity_level='' + of_orig='' + model='' + company='' + serial='' + location='' # dmidecode only + IFS="," + a_battery_working=( ${A_BATTERY_DATA[i]} ) + IFS="$ORIGINAL_IFS" + bat_id="$(( $i + 1 ))" + + if [[ -n ${a_battery_working[10]} ]];then + charge="${a_battery_working[10]} Wh " + fi + if [[ -n ${a_battery_working[11]} ]];then + charge="$charge${a_battery_working[11]} " + fi + if [[ $charge == '' ]];then + charge='N/A ' + fi + charge="${C1}charge$SEP3${C2} $charge" + if [[ -n ${a_battery_working[9]} ]];then + condition="${a_battery_working[9]}" + else + condition='NA' + fi + if [[ -n ${a_battery_working[8]} ]];then + condition="$condition/${a_battery_working[8]} Wh " + else + condition="$condition/NA Wh " + fi + if [[ -n ${a_battery_working[13]} ]];then + condition="$condition(${a_battery_working[13]}) " + fi + if [[ $condition == '' ]];then + condition='N/A ' + fi + condition="${C1}condition$SEP3${C2} $condition" + if [[ $B_EXTRA_DATA == 'true' ]];then + if [[ -n ${a_battery_working[15]} ]];then + model="${a_battery_working[15]} " + fi + if [[ -n ${a_battery_working[14]} ]];then + model="$model${a_battery_working[14]} " + fi + if [[ $model == '' ]];then + model='N/A ' + fi + model="${C1}model$SEP3${C2} $model" + + if [[ -n ${a_battery_working[1]} ]];then + status="${a_battery_working[1]} " + else + status="N/A " + fi + status="${C1}status$SEP3${C2} $status" + fi + if [[ $B_EXTRA_EXTRA_DATA == 'true' ]];then + if [[ -n ${a_battery_working[16]} ]];then + serial="${a_battery_working[16]} " + else + serial='N/A ' + fi + serial="${C1}serial$SEP3${C2} $serial" + if [[ -n ${a_battery_working[6]} ]];then + voltage="${a_battery_working[6]}" + fi + if [[ -n ${a_battery_working[5]} ]];then + if [[ $voltage == '' ]];then + voltage='NA' + fi + voltage="$voltage/${a_battery_working[5]} " + fi + if [[ $voltage == '' ]];then + voltage='NA ' + fi + voltage="${C1}volts$SEP3${C2} $voltage" + fi + if [[ $B_EXTRA_EXTRA_EXTRA_DATA == 'true' ]];then + if [[ -n ${a_battery_working[3]} ]];then + chemistry="${a_battery_working[3]} " + fi + if [[ -n ${a_battery_working[4]} ]];then + cycles="${C1}cycles$SEP3${C2} ${a_battery_working[4]} " + fi + # location is dmidecode only + if [[ -n ${a_battery_working[17]} ]];then + location="${C1}loc$SEP3${C2} ${a_battery_working[17]} " + fi + fi + if [[ -n ${a_battery_working[15]} ]];then + battery_string="${C1}${a_battery_working[0]}$SEP3${C2} $charge$condition" + battery_data="$model$chemistry$serial$status$cycles$location" + fi + + if [[ ${A_BATTERY_DATA[0]} == 'dmidecode-error-'* ]];then + error_string=$( print_dmidecode_error 'bat' "${A_BATTERY_DATA[0]}" ) + battery_string=${C2}$error_string + battery_data='' + voltage='' + fi + + if [[ -n $battery_string ]];then + if [[ $( calculate_line_length "$battery_string$voltage$battery_data" ) -lt $COLS_INNER ]];then + #echo one + print_data=$( create_print_line "$line_starter" "$battery_string$voltage$battery_data" ) + print_screen_output "$print_data" + # print the line + else + # keep the driver on the same line no matter what, looks weird alone on its own line + if [[ $( calculate_line_length "$battery_string$voltage$battery_data" ) -gt $COLS_INNER ]];then + if [[ $( calculate_line_length "$battery_string$voltage" ) -gt $COLS_INNER ]];then + print_data=$( create_print_line "$line_starter" "$battery_string" ) + print_screen_output "$print_data" + line_starter=' ' + battery_string='' + print_data=$( create_print_line "$line_starter" "$voltage" ) + print_screen_output "$print_data" + voltage='' + else + print_data=$( create_print_line "$line_starter" "$battery_string$voltage" ) + print_screen_output "$print_data" + line_starter=' ' + voltage='' + battery_string='' + fi + #echo two + if [[ $battery_data != '' ]];then + print_data=$( create_print_line "$line_starter" "$battery_data" ) + print_screen_output "$print_data" + fi + else + #echo three + print_data=$( create_print_line "$line_starter" "$battery_string$voltage$battery_data" ) + print_screen_output "$print_data" + fi + fi + line_starter=' ' + fi + done + elif [[ $B_SHOW_BATTERY_FORCED == 'true' ]];then + print_data=$( create_print_line "$line_starter" "No battery data found in /sys or dmidecode. Is one present?" ) + print_screen_output "$print_data" + fi + eval $LOGFE +} + print_cpu_data() { eval $LOGFS @@ -11753,19 +12219,21 @@ print_cpu_flags_full() eval $LOGFE } -# args: $1 - type [sys/default]; $2 - get_dmidecode_data error return +# args: $1 - type [sys/bat/default]; $2 - get_dmidecode_data error return print_dmidecode_error() { eval $LOGFS local error_message='Unknown dmidecode error.' local sysDmiError='Using ' - if [[ $1 == 'sys' ]];then + if [[ $1 == 'sys' || $1 == 'bat' ]];then if [[ $B_FORCE_DMIDECODE == 'true' ]];then sysDmiError='Forcing ' # dragonfly has /sys, but it's empty - elif [[ $BSD_TYPE == '' || -d /sys/devices ]];then + elif [[ $1 == 'sys' ]] && [[ $BSD_TYPE == '' || -d /sys/devices ]];then sysDmiError='No /sys/class/dmi; using ' + #elif [[ $1 == 'bat' ]] && [[ $BSD_TYPE == '' || -d /sys/devices ]];then + # sysDmiError='No /sys/ battery; using ' else sysDmiError='Using ' fi @@ -11776,6 +12244,8 @@ print_dmidecode_error() error_message="${sysDmiError}dmidecode: dmidecode is not installed." elif [[ $2 == 'dmidecode-error-no-smbios-dmi-data' ]];then error_message="${sysDmiError}dmidecode: no smbios data available. Old system?" + elif [[ $2 == 'dmidecode-error-no-battery-data' ]];then + error_message="${sysDmiError}dmidecode: no battery data available." elif [[ $2 == 'dmidecode-error-unknown-error' ]];then error_message="${sysDmiError}dmidecode: unknown error occured" fi |