X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=6e8242d8dc3223c03a9f25f2a8941de6cd5868b7;hb=3b50a499e0d02f73dc51b6b3b8e88e9d7ddda5ef;hp=01ada21a5c79023a10ddd738597f516412c8b34a;hpb=8a52188cb6a2b42278a4ab10e970facf4b1c33a2;p=khome.git diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index 01ada21..6e8242d 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -341,16 +341,20 @@ weather() { curl "http://wttr.in/$_weather_location?format=v2" } +_bt_devs_infos() { + # grep's defintion of a line does not include \r, wile awk's does and + # which bluetoothctl outputs + awk '/^Device +/ {print $2}' \ + | xargs -I% sh -c 'echo info % | bluetoothctl' \ + | awk '/^Device |^\t[A-Z][A-Za-z0-9]+: /' +} + bt_devs_paired() { - bluetoothctl -- paired-devices \ - | awk '{print $2}' \ - | xargs bluetoothctl -- info + echo 'paired-devices' | bluetoothctl | _bt_devs_infos } bt_devs() { - bluetoothctl -- devices \ - | awk '{print $2}' \ - | xargs bluetoothctl -- info + echo 'devices' | bluetoothctl | _bt_devs_infos } run() { @@ -371,10 +375,14 @@ run() { bar_gauge() { awk "$@" ' BEGIN { + # CLI options + width = width ? width : 80 ch_left = ch_left ? ch_left : "[" ch_right = ch_right ? ch_right : "]" ch_blank = ch_blank ? ch_blank : "-" ch_used = ch_used ? ch_used : "|" + num = num ? 1 : 0 + pct = pct ? 1 : 0 } { @@ -385,9 +393,10 @@ bar_gauge() { cur_scaled = num_scale(cur, max, 1, width) printf \ - "%s%s%s", \ + "%s%s%s%s", \ lab ? lab " " : "", \ num ? cur "/" max " " : "", \ + pct ? sprintf("%3.0f%% ", cur / max * 100) : "", \ ch_left for (i=1; i<=width; i++) { c = i <= cur_scaled ? ch_used : ch_blank @@ -402,33 +411,53 @@ bar_gauge() { ' } -motd_batt() { - case "$(uname)" in - 'Linux') - upower --dump \ - | awk ' - /^Device:[ \t]+/ { - device["path"] = $2 - next - } - - / battery/ && device["path"] { - device["is_battery"] = 1 - next - } +flat_top_5() { + sort -n -k 1 -r \ + | head -5 \ + | awk ' + { + cur = $1 + max = $2 + name = $3 + pct = cur / max * 100 + printf "%s%s %.2f%%", sep, name, pct + sep = ", " + } - / percentage:/ && device["is_battery"] { - device["battery_percentage"] = $2 - sub("%$", "", device["battery_percentage"]) - next - } + END {printf "\n"} + ' +} - /^$/ { - if (device["is_battery"] && device["path"] == "/org/freedesktop/UPower/devices/DisplayDevice") - print device["battery_percentage"], 100, "batt" - delete device - } - ' +status_batt() { + case "$(uname)" in + 'Linux') + if which upower > /dev/null + then + upower --dump \ + | awk ' + /^Device:[ \t]+/ { + device["path"] = $2 + next + } + + / battery/ && device["path"] { + device["is_battery"] = 1 + next + } + + / percentage:/ && device["is_battery"] { + device["battery_percentage"] = $2 + sub("%$", "", device["battery_percentage"]) + next + } + + /^$/ { + if (device["is_battery"] && device["path"] == "/org/freedesktop/UPower/devices/DisplayDevice") + print device["battery_percentage"], 100, "batt" + delete device + } + ' + fi ;; esac } @@ -437,8 +466,7 @@ indent() { awk -v unit="$1" '{printf "%s%s\n", unit, $0}' } -motd() { - local -r bar_width='60' +status() { local -r indent_unit=' ' uname -srvmo @@ -447,25 +475,68 @@ motd() { echo - printf 'tmux: sessions %d, clients: %d\n' \ + echo 'accounting' + + printf '%stmux\n%ssessions %d, clients %d\n' \ + "$indent_unit" \ + "${indent_unit}${indent_unit}" \ "$(tmux list-sessions 2> /dev/null | wc -l)" \ "$(tmux list-clients 2> /dev/null | wc -l)" echo - echo 'Resources' + printf '%sprocs by user\n' "${indent_unit}" + ps -eo user \ + | awk ' + NR > 1 { + count_by_user[$1]++ + total++ + } + + END { + for (user in count_by_user) + print count_by_user[user], total, user + } + ' \ + | flat_top_5 \ + | indent "${indent_unit}${indent_unit}" + + echo + + echo 'resources' ( free | awk '$1 == "Mem:" {print $3, $2, "mem"}' df ~ | awk 'NR == 2 {print $3, $3 + $4, "disk"}' - motd_batt + status_batt ) \ - | bar_gauge -v width="$bar_width" \ + | bar_gauge -v width=60 -v pct=1 \ | column -t \ | indent "$indent_unit" echo - echo 'Network' + printf '%smem by proc\n' "$indent_unit" + ps -eo rss,cmd \ + | awk -v total="$(free | awk '$1 == "Mem:" {print $2; exit}')" ' + NR > 1 { + rss = $1 + cmd = $2 + n = split(cmd, path, "/") # _may_ be a path + proc = path[n] + by_proc[proc] += rss + } + + END { + for (proc in by_proc) + print by_proc[proc], total, proc + } + ' \ + | flat_top_5 \ + | indent "${indent_unit}${indent_unit}" + + echo + + echo 'net' echo "${indent_unit}if" (ifconfig; iwconfig) 2> /dev/null \ | awk ' @@ -539,10 +610,38 @@ motd() { | xargs \ | column -t - echo + # TODO: iptables summary +} - echo 'Loggers' - awk '{split($5, prog, "["); print prog[1]}' /var/log/syslog \ +ssh_invalid_attempts_from() { + awk ' + /: Invalid user/ && $5 ~ /^sshd/ { + u=$8 + addr=$10 == "port" ? $9 : $10 + max++ + curr[addr]++ + } + + END { + for (addr in curr) + if ((c = curr[addr]) > 1) + print c, max, addr + } + ' \ + /var/log/auth.log \ + /var/log/auth.log.1 \ + | sort -n -k 1 \ + | bar_gauge -v width="$(stty size | awk '{print $2}')" -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \ + | column -t +} + +loggers() { + awk ' + { + split($5, prog, "[") + sub(":$", "", prog[1]) # if there were no [], than : will is left behind + print prog[1] + }' /var/log/syslog /var/log/syslog.1 \ | awk ' { n = split($1, path, "/") # prog may be in path form @@ -555,8 +654,7 @@ motd() { for (prog in count) print count[prog], total, prog }' \ - | sort -n -k 1 -r \ - | bar_gauge -v width=30 -v num=1 -v ch_left=' ' -v ch_right=' ' -v ch_blank=' ' \ - | column -t \ - | indent "${indent_unit}" + | sort -n -k 1 \ + | bar_gauge -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \ + | column -t }