X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=97de4b90fc807e9b1f95b4cf6a79bc91e6a5750d;hb=52045fbdc9797a11edfcf8bbc665252bbcdb5d39;hp=75cfd1d8ac7aa0f75c41d6b216d775e8f34ca25c;hpb=71ce30e23a8c3093aa9c488b8f3c528b0996678d;p=khome.git diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index 75cfd1d..97de4b9 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -1,5 +1,82 @@ # +## open : string -> unit +## +## Fork xdg-open so we don't block current terminal session when opening +## things like pdf files. For example: +## +## open book.pdf +## +open() { + (xdg-open "$1" &) & +} + +## notify_done : unit -> unit +notify_done() { + local -r _status_code="$?" + local -r _program="$1" + local _timestamp + _timestamp="$(timestamp)" + local -r _msg="$_timestamp [$_program] done " + if [[ "$_status_code" -eq 0 ]] + then + notify-send -u normal "$_msg OK: $_status_code" + else + notify-send -u critical "$_msg ERROR: $_status_code" + 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" + } + + printf "%s", p # XXX Intentionally avoiding newline in the result. + } + + 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 +} + ## web search ## ws : string -> unit ws() { @@ -291,14 +368,15 @@ _yt() { 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') + local -r yt=youtube-dl + local -r id=$("$yt" --get-id "$uri") + local -r title=$("$yt" --get-title "$uri" | sed 's/[^А-Яа-яA-Za-z0-9._-]/_/g') local -r dir="${base_dir}/${title}--${id}" mkdir -p "$dir" cd "$dir" || kill -INT $$ echo "$uri" > 'uri' - youtube-dlc $opts -c --write-description --write-info-json "$uri" + "$yt" $opts -c --write-all-thumbnails --write-description --write-info-json "$uri" } yt_audio() { @@ -326,7 +404,7 @@ gh_clone() { mkdir -p "$gh_dir" cd "$gh_dir" || kill -INT $$ gh_fetch_repos "$gh_user_type" "$gh_user_name" \ - | jq --raw-output '.[] | select(.fork | not) | .git_url' \ + | jq --raw-output '.[] | select(.fork | not) | .clone_url' \ | parallel -j 25 \ git clone {} } @@ -347,6 +425,40 @@ gh_clone_repo() { git clone "$1" } +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') +=============================================================================== + + +backlog +------------------------------------------------------------------------------- +EOF +} + +todo() { + local date + date="$(date +%F)" + local -r dir="$DIR_TODO/daily" + local -r file="$dir/$date.txt" + + mkdir -p "$dir" + if [ ! -f "$file" ] + then + daily_todo_file_template > "$file" + fi + cd "$DIR_TODO" && "$EDITOR" "$file" +} + work_log_template() { cat << EOF $(date '+%F %A') @@ -662,33 +774,33 @@ status() { 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" - } - }' + 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}<->" @@ -726,32 +838,32 @@ ssh_invalid_by_addr() { ssh_invalid_by_day() { awk ' - BEGIN { - m["Jan"] = "01" - m["Feb"] = "02" - m["Mar"] = "03" - m["Apr"] = "04" - m["May"] = "05" - m["Jun"] = "06" - m["Jul"] = "07" - m["Aug"] = "08" - m["Sep"] = "09" - m["Oct"] = "10" - m["Nov"] = "11" - m["Dec"] = "12" - } - - /: Invalid user/ && $5 ~ /^sshd/ { - day = m[$1] "-" $2 - max++ - by_day[day]++ - } - - END { - for (day in by_day) - if ((c = by_day[day]) > 1) - printf "%d %d %s\n", c, max, day - } + BEGIN { + m["Jan"] = "01" + m["Feb"] = "02" + m["Mar"] = "03" + m["Apr"] = "04" + m["May"] = "05" + m["Jun"] = "06" + m["Jul"] = "07" + m["Aug"] = "08" + m["Sep"] = "09" + m["Oct"] = "10" + m["Nov"] = "11" + m["Dec"] = "12" + } + + /: Invalid user/ && $5 ~ /^sshd/ { + day = m[$1] "-" $2 + max++ + by_day[day]++ + } + + END { + for (day in by_day) + if ((c = by_day[day]) > 1) + printf "%d %d %s\n", c, max, day + } ' \ /var/log/auth.log \ /var/log/auth.log.1 \