#
+## 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)}
-
- /^[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?
+ -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, "@")) {
u = tmp
printf("%d [C] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
}
+ ps[n] = p
+ }
- printf "%s", p # XXX Intentionally avoiding newline in the result.
- }
- ' \
- ~/._p/p \
- | xsel -i -b -t 30000
+ END {
+ printf "%s", ps[n] # XXX Intentionally avoiding newline in the result.
+ 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. Selecting the last one.\n" > "/dev/stderr"
+ exit 0
+ }
+ }
+ ' \
+ ~/._p/p \
+ | xsel -i -b -t 30000
}
## web search
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() {
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 {}
}
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')
+===============================================================================
+
+-------------------------------------------------------------------------------
+TODAY
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+CURRENT
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+BLOCKED
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+BACKLOG
+-------------------------------------------------------------------------------
+EOF
+}
+
+today() {
+ 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" $EDITOR_ARGS "$file"
+}
+
+todo() {
+ cd "$DIR_TODO" && "$EDITOR" TODO
+}
+
work_log_template() {
cat << EOF
$(date '+%F %A')
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}<->"
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 \