X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=c393938ccdbf784c6077b294e453a71e6d517eb5;hb=9492242e5dc9999cafafb7492077a7cc8f1ba6e3;hp=d1d458a284011845b283a55b3a9d1dafc1d36a05;hpb=e2b9f534cf88a0a8319e72dcf679e68289d55c0e;p=khome.git diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index d1d458a..c393938 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -1,4 +1,4 @@ -# +#! /bin/bash ## open : string -> unit ## @@ -28,8 +28,27 @@ notify_done() { ## p : string -> unit p() { + local -r usage='Usage: p [FILE] NAME' + local name + local file + + case "$#" in + 0) + echo "$usage" >&2 + return 1;; + 1) + file=~/._p/p + name="$1";; + 2) + file="$1" + name="$2";; + *) + echo "$usage" >&2 + return 1;; + esac + awk \ - -v _s="$1" \ + -v _s="$name" \ ' BEGIN {_s = tolower(_s)} @@ -56,11 +75,11 @@ p() { u = tmp printf("%d [C] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr" } - - printf "%s", p # XXX Intentionally avoiding newline in the result. + ps[n] = p } END { + printf "%s", ps[n] # XXX Intentionally avoiding newline in the result. if (n == 1) { exit 0 } else if (n == 0) { @@ -68,15 +87,25 @@ p() { exit 1 } else if (n > 1) { # TODO fzf-select which of the records the user (ahem, me) wants. - printf "[WARNING] Found more than one record.\n" > "/dev/stderr" + printf "[WARNING] Found more than one record. Selecting the last one.\n" > "/dev/stderr" exit 0 } } ' \ - ~/._p/p \ + "$file" \ | xsel -i -b -t 30000 } +dl() { + local -r timestamp="$(date --iso-8601=ns)" + local -r dir="$HOME"/dl/adhoc/"$timestamp" + local -r url_file_path="${dir}/url" + + mkdir -p "$dir" + touch "$url_file_path" + cd "$dir" +} + ## web search ## ws : string -> unit ws() { @@ -237,32 +266,12 @@ top_commands() { } ## Top Disk-Using directories -## TODO: Consider using numfmt instead of awk ## tdu : path-string -> (size:number * directory:path-string) list tdu() { local -r root_path="$1" - du "$root_path" \ - | awk ' - { - size = $1 - path = $0 - sub("^" $1 "\t+", "", path) - 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 \ + du -h "$root_path" \ + | sort -r -h -k 1 \ | head -50 \ | tac # A slight optimization: head can exit before traversing the full input. @@ -274,14 +283,8 @@ tduf() { find "$@" -type f -printf '%s\t%p\0' \ | sort -z -n -k 1 \ | tail -z -n 50 \ - | gawk -v RS='\0' ' - { - size = $1 - path = $0 - sub("^" $1 "\t+", "", path) - gb = size / 1024 / 1024 / 1024 - printf("%f\t%s\n", gb, path) - }' + | numfmt -z --to=iec \ + | tr '\0' '\n' } # Most-recently modified file system objects @@ -425,22 +428,57 @@ gh_clone_repo() { git clone "$1" } -todo() { +bar() { + local -r len="${1:-79}" # 1st arg or 79. + local -r char="${2:--}" # 2nd arg or a dash. + for _ in {1.."$len"}; do + printf '%c' "$char"; + done +} + +daily_todo_file_template() { +cat << EOF +=============================================================================== +$(date '+%F %A') +=============================================================================== + +------------------------------------------------------------------------------- +TODAY +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +CURRENT +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +BLOCKED +------------------------------------------------------------------------------- + + +------------------------------------------------------------------------------- +BACKLOG +------------------------------------------------------------------------------- +EOF +} + +today() { local date - local timestamp - local bar - date=$(date +%F) - timestamp=$(date '+%F %A') - bar=$(for _ in {1..80}; do printf '='; done) + date="$(date +%F)" local -r dir="$DIR_TODO/daily" local -r file="$dir/$date.txt" mkdir -p "$dir" if [ ! -f "$file" ] then - printf '%s\n%s\n%s\n' "$bar" "$timestamp" "$bar" > "$file" + daily_todo_file_template > "$file" fi - cd "$DIR_TODO" && "$EDITOR" "$file" + cd "$DIR_TODO" && "$EDITOR" $EDITOR_ARGS "$file" +} + +todo() { + cd "$DIR_TODO" && "$EDITOR" TODO } work_log_template() { @@ -620,11 +658,54 @@ status() { 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)" + # TODO Bring back seesion and client listing, but per server/socket. + printf '%stmux\n' "$indent_unit" + ps -eo comm,cmd \ + | awk ' + # Expecting lines like: + # "tmux: server tmux -L pistactl new-session -d -s pistactl" + # "tmux: client tmux -L foo" + # "tmux: client tmux -Lbar" + # "tmux: client tmux" + # "tmux: server tmux -L foo -S bar" <-- -S takes precedence + /^tmux:/ { + # XXX This of course assumes pervasive usage of -L + # TODO Handle -S + role=$2 + + split($0, sides_of_S, "-S") + split(sides_of_S[2], words_right_of_S, FS) + + split($0, sides_of_L, "-L") + split(sides_of_L[2], words_right_of_L, FS) + + if (words_right_of_S[1]) { + sock = "path." words_right_of_S[1] + } else if (words_right_of_L[1]) { + sock = "name." words_right_of_L[1] + } else { + sock = "default" + } + + roles[role]++ + socks[sock]++ + count[role, sock]++ + } + + END { + for (sock in socks) { + clients = count["client", sock] + printf "%s ", sock + if (clients) { + printf "<-> %d", clients + } + printf "\n" + } + printf "\n" + }' \ + | sort \ + | column -t \ + | indent "${indent_unit}${indent_unit}" echo @@ -755,6 +836,9 @@ status() { echo "${indent_unit}-->" + # TODO Populate pid->cmd dict from `ps -eo pid,comm` and lookup progs there + # since netstat -p output comes out truncated. + sudo -n netstat -tulnp \ | awk -v indent="${indent_unit}${indent_unit}" ' NR > 2 && ((/^tcp/ && proc = $7) || (/^udp/ && proc = $6)) {