X-Git-Url: https://git.xandkar.net/?p=khome.git;a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=8e25bc06ee60507eda0ce6a3d26552f1ed0eaa96;hp=e6c159dc43042eeab34c9f4badd3a28dc1e90703;hb=502dff1e7e6d6dc9f6c74813586de2b937fe17df;hpb=db8ff593eef1ce8abdb0b84406d79df6714f60e4 diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index e6c159d..8e25bc0 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -140,17 +140,29 @@ top_commands() { # TODO: Consider using numfmt instead of awk tdu() { du "$1" \ - | sort -n -k 1 \ - | tail -50 \ | awk ' { size = $1 path = $0 sub("^" $1 "\t+", "", path) - gb = size / 1024 / 1024 - printf("%f\t%s\n", gb, path) - }' \ - | cut -c 1-115 + paths[path] = size + if (size > max) + max = size + } + + END { + for (path in paths) { + size = paths[path] + pct = 100 * (size / max) + gb = size / 1024 / 1024 + printf("%6.2f %3d%% %s\n", gb, pct, path) + } + } + ' \ + | sort -r -n -k 1 \ + | head -50 \ + | tac + # A slight optimization: head can exit before traversing the full input. } # Top Disk-Using Files @@ -225,8 +237,9 @@ man() { command man "$@" } -experiment() { - cd "$(~/bin/experiment $@)" || kill -INT $$ +# new experiment +x() { + cd "$(~/bin/x $@)" || kill -INT $$ } hump() { @@ -234,13 +247,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 +267,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() { @@ -263,7 +276,10 @@ yt_video() { } gh_fetch_repos() { - curl "https://api.github.com/$1/$2/repos?page=1&per_page=10000" + local -r user_type="$1" + local -r user_name="$2" + + curl "https://api.github.com/$user_type/$user_name/repos?page=1&per_page=10000" } gh_clone() { @@ -428,7 +444,11 @@ flat_top_5() { ' } -motd_batt() { +internet_addr() { + curl --silent --show-error --max-time "${1:=1}" 'https://api.ipify.org' 2>&1 +} + +status_batt() { case "$(uname)" in 'Linux') if which upower > /dev/null @@ -466,7 +486,7 @@ indent() { awk -v unit="$1" '{printf "%s%s\n", unit, $0}' } -motd() { +status() { local -r indent_unit=' ' uname -srvmo @@ -507,7 +527,7 @@ motd() { ( 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=60 -v pct=1 \ | column -t \ @@ -536,7 +556,22 @@ motd() { 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 ' @@ -584,21 +619,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}<->" @@ -609,6 +659,8 @@ motd() { | sort -u \ | xargs \ | column -t + + # TODO: iptables summary } ssh_invalid_attempts_from() { @@ -639,7 +691,7 @@ loggers() { split($5, prog, "[") sub(":$", "", prog[1]) # if there were no [], than : will is left behind print prog[1] - }' /var/log/syslog \ + }' /var/log/syslog /var/log/syslog.1 \ | awk ' { n = split($1, path, "/") # prog may be in path form @@ -652,6 +704,7 @@ loggers() { 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 }