Accept a name for dl and include starter script file
[khome.git] / home / lib / login_functions.sh
index 3748981..56e0c2b 100644 (file)
@@ -1,4 +1,4 @@
-#
+#! /bin/bash
 
 ## open : string -> unit
 ##
@@ -26,55 +26,31 @@ notify_done() {
     fi
 }
 
-## p : string -> unit
-p() {
-    awk \
-        -v _s="$1" \
-        '
-            BEGIN {_s = tolower(_s)}
-
-            # TODO fzf/dmenu select instead of searching:
-            /^[a-zA-Z]/ && tolower($1) ~ _s && NF >= 2 {
-                n++
-                s = $1
-                p = $NF
-                if (NF == 2) {
-                    e = ""
-                    u = ""
-                } else if (NF == 3) {
-                    e = $2
-                    u = ""
-                } else {
-                    e = $2
-                    u = $3
-                } # TODO What would NF > 4 mean?
-
-                printf("%d [O] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
-                if (match(u, "@")) {
-                    tmp = e
-                    e = u
-                    u = tmp
-                    printf("%d [C] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
-                }
+_dl_script() {
+cat << EOF
+#! /bin/bash
+wget -c \$(< ./url)
+EOF
+}
 
-                printf "%s", p # XXX Intentionally avoiding newline in the result.
-            }
+dl() {
+    local -r name="$1"
+    local -r url="$2"
 
-            END {
-                if (n == 1) {
-                    exit 0
-                } else if (n == 0) {
-                    printf "[ERROR] Found nothing.\n" > "/dev/stderr"
-                    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"
-                    exit 0
-                }
-            }
-        ' \
-        ~/._p/p \
-        | xsel -i -b -t 30000
+    local -r timestamp="$(date --iso-8601=ns)"
+    local -r dir="$HOME"/dl/adhoc/"$timestamp"--"$name"
+    local -r url_file_path="${dir}/url"
+    local -r dl_file_path="${dir}/dl"
+
+    mkdir -p "$dir"
+    touch "$url_file_path"
+    if [ "$url" != '' ]
+    then
+        echo "$url" > "$url_file_path"
+    fi
+    _dl_script > "$dl_file_path"
+    chmod +x "$dl_file_path"
+    cd "$dir"
 }
 
 ## web search
@@ -237,32 +213,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 +230,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
@@ -440,12 +390,12 @@ $(date '+%F %A')
 ===============================================================================
 
 -------------------------------------------------------------------------------
-CURRENTLY IMPORTANT
+TODAY
 -------------------------------------------------------------------------------
 
 
 -------------------------------------------------------------------------------
-TO FINISH TODAY
+CURRENT
 -------------------------------------------------------------------------------
 
 
@@ -471,7 +421,7 @@ today() {
     then
         daily_todo_file_template > "$file"
     fi
-    cd "$DIR_TODO" && "$EDITOR" "$file"
+    cd "$DIR_TODO" && "$EDITOR" $EDITOR_ARGS "$file"
 }
 
 todo() {
@@ -655,11 +605,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
 
@@ -790,6 +783,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)) {
This page took 0.033051 seconds and 4 git commands to generate.