X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=15f6e3c412f9bccf82ef273bf71b8f35c93aca67;hb=1be8e74bb12167f8e6adf899612b20cfb16a9ce5;hp=664636531884adab5a091e7de954ee02a244ace7;hpb=48c2317325e496fdf5bd93ae91ce938401873bf2;p=khome.git diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index 6646365..15f6e3c 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -149,8 +149,7 @@ tdu() { sub("^" $1 "\t+", "", path) gb = size / 1024 / 1024 printf("%f\t%s\n", gb, path) - }' \ - | cut -c 1-115 + }' } # Top Disk-Using Files @@ -225,8 +224,9 @@ man() { command man "$@" } -experiment() { - cd "$(~/bin/experiment $@)" || kill -INT $$ +# new experiment +x() { + cd "$(~/bin/x $@)" || kill -INT $$ } hump() { @@ -234,13 +234,13 @@ hump() { } howto() { - cat "$(find ~/Archives/Documents/HOWTOs -mindepth 1 -maxdepth 1 | sort | fzf)" + cat "$(find ~/arc/doc/HOWTOs -mindepth 1 -maxdepth 1 | sort | fzf)" } _yt() { local -r base_dir="$1" - local -r opts="$2" - local -r uri="$3" + local -r uri="$2" + local -r opts="$3" local -r id=$(youtube-dlc --get-id "$uri") local -r title=$(youtube-dlc --get-title "$uri" | sed 's/[^A-Za-z0-9._-]/_/g') @@ -254,7 +254,7 @@ _yt() { yt_audio() { local -r uri="$1" - _yt "${DIR_YOUTUBE_AUDIO}/individual" '-f 140' "$uri" + _yt "${DIR_YOUTUBE_AUDIO}/individual" "$uri" '-f 140' } yt_video() { @@ -375,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 } { @@ -407,33 +411,57 @@ bar_gauge() { ' } -motd_batt() { - case "$(uname)" in - 'Linux') - upower --dump \ - | awk ' - /^Device:[ \t]+/ { - device["path"] = $2 - 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 = ", " + } - / battery/ && device["path"] { - device["is_battery"] = 1 - next - } + END {printf "\n"} + ' +} - / percentage:/ && device["is_battery"] { - device["battery_percentage"] = $2 - sub("%$", "", device["battery_percentage"]) - next - } +internet_addr() { + curl --silent --show-error --max-time "${1:=1}" 'https://api.ipify.org' 2>&1 +} - /^$/ { - 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 } @@ -442,8 +470,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 @@ -452,25 +479,83 @@ 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" -v pct=1 \ + | 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 + + printf '%sthermal\n' "$indent_unit" + for _dir in /sys/class/thermal/thermal_zone* + do + printf '%s %.2f C\n' \ + $(cat "$_dir"/type) \ + $(( $(cat "$_dir"/temp) / 1000 )) + done \ + | column -t \ + | indent "${indent_unit}${indent_unit}" + + echo 'net' + local -r internet_addr=$(internet_addr 0.5) + local -r internet_ptr=$(host -W 1 "$internet_addr" | awk 'NR == 1 {print $NF}' ) + + echo "${indent_unit}internet" + echo "${indent_unit}${indent_unit}$internet_addr $internet_ptr" echo "${indent_unit}if" (ifconfig; iwconfig) 2> /dev/null \ | awk ' @@ -518,21 +603,36 @@ motd() { echo "${indent_unit}-->" - printf '%sUDP: ' "${indent_unit}${indent_unit}" - sudo -n netstat -ulnp \ - | awk 'NR > 2 {print $6}' \ - | awk -F/ '{print $2}' \ - | sort -u \ - | xargs \ - | column -t - - printf '%sTCP: ' "${indent_unit}${indent_unit}" - sudo -n netstat -tlnp \ - | awk 'NR > 2 {print $7}' \ - | awk -F/ '{print $2}' \ - | sort -u \ - | xargs \ - | column -t + sudo -n netstat -tulnp \ + | awk -v indent="${indent_unit}${indent_unit}" ' + NR > 2 && ((/^tcp/ && proc = $7) || (/^udp/ && proc = $6)) { + protocol = $1 + addr = $4 + port = a[split(addr, a, ":")] + name = p[split(proc, p, "/")] + names[name] = 1 + protocols[protocol] = 1 + if (!seen[protocol, name, port]++) + ports[protocol, name, ++seen[protocol, name]] = port + } + + END { + for (protocol in protocols) { + printf "%s%s\t", indent, toupper(protocol) + for (name in names) { + if (n = seen[protocol, name]) { + sep = "" + printf "%s:", name + for (i = 1; i <= n; i++) { + printf "%s%d", sep, ports[protocol, name, i] + sep = "," + } + printf " " + } + } + printf "\n" + } + }' echo "${indent_unit}<->" @@ -544,31 +644,7 @@ motd() { | xargs \ | column -t - echo - - echo 'Loggers' - awk ' - { - split($5, prog, "[") - sub(":$", "", prog[1]) # if there were no [], than : will is left behind - print prog[1] - }' /var/log/syslog \ - | awk ' - { - n = split($1, path, "/") # prog may be in path form - prog = path[n] - total++ - count[prog]++ - } - - END { - 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}" + # TODO: iptables summary } ssh_invalid_attempts_from() { @@ -592,3 +668,27 @@ ssh_invalid_attempts_from() { | 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 + prog = path[n] + total++ + count[prog]++ + } + + END { + for (prog in count) + print count[prog], total, prog + }' \ + | sort -n -k 1 \ + | bar_gauge -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \ + | column -t +}