X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=home%2Flib%2Flogin_functions.sh;h=75cfd1d8ac7aa0f75c41d6b216d775e8f34ca25c;hb=71ce30e23a8c3093aa9c488b8f3c528b0996678d;hp=1f6906100e840a0ef05bc97c48e207f5deb8e109;hpb=d87138ae6c34ddd2dce2ee2c3703a4afcf2c27f3;p=khome.git diff --git a/home/lib/login_functions.sh b/home/lib/login_functions.sh index 1f69061..75cfd1d 100644 --- a/home/lib/login_functions.sh +++ b/home/lib/login_functions.sh @@ -1,10 +1,32 @@ # +## web search +## ws : string -> unit +ws() { + local line search_string0 search_string + + search_string0="$*" + case "$search_string0" in + '') + while read -r line; do + search_string="${search_string} ${line}" + done;; + *) + search_string="$search_string0";; + esac + + firefox --search "$search_string" +} + + +## dictionary +## d : string -> string list d() { local -r word=$(fzf < /usr/share/dict/words) dict "$word" } +## shell_activity_report : (mon | dow) -> string list shell_activity_report() { # TODO: optional concrete number output # TODO: optional combinations of granularities: hour, weekday, month, year @@ -102,6 +124,7 @@ shell_activity_report() { }' } +## top_commands : unit -> (command:string * count:number * bar:string) list top_commands() { history \ | awk ' @@ -136,10 +159,13 @@ top_commands() { | column -t } -# Top Disk-Using directories -# TODO: Consider using numfmt instead of awk +## Top Disk-Using directories +## TODO: Consider using numfmt instead of awk +## tdu : path-string -> (size:number * directory:path-string) list tdu() { - du "$1" \ + local -r root_path="$1" + + du "$root_path" \ | awk ' { size = $1 @@ -165,9 +191,10 @@ tdu() { # A slight optimization: head can exit before traversing the full input. } -# Top Disk-Using Files +## Top Disk-Using Files +## tduf : path-string list -> (size:number * file:path-string) list tduf() { - find "$1" -type f -printf '%s\t%p\0' \ + find "$@" -type f -printf '%s\t%p\0' \ | sort -z -n -k 1 \ | tail -z -n 50 \ | gawk -v RS='\0' ' @@ -181,13 +208,12 @@ tduf() { } # Most-recently modified file system objects +## recent : ?(path-string list) -> path-string list recent() { # NOTES: - # - intentionally not quoting the parameters, so that some can be ignored - # if not passed, rather than be passed to find as an empty string; # - %T+ is a GNU extension; # - gawk is able to split records on \0, while awk cannot. - find $@ -printf '%T@ %T+ %p\0' \ + find "$@" -printf '%T@ %T+ %p\0' \ | tee >(gawk -v RS='\0' 'END { printf("[INFO] Total found: %d\n", NR); }') \ | sort -z -k 1 -n -r \ | head -n "$(stty size | awk 'NR == 1 {print $1 - 5}')" -z \ @@ -200,23 +226,28 @@ recent() { }' } +## recent_dirs : ?(path-string list) -> path-string list recent_dirs() { - recent "$1" -type d + recent "$@" -type d } +## recent_files : ?(path-string list) -> path-string list recent_files() { - recent "$1" -type f + recent "$@" -type f } +## pa_def_sink : unit -> string pa_def_sink() { pactl info | awk '/^Default Sink:/ {print $3}' } +## void_pkgs : ?(string) -> json void_pkgs() { curl "https://xq-api.voidlinux.org/v1/query/x86_64?q=$1" | jq '.data' } -# Colorful man +## Colorful man +## man : string -> string man() { # mb: begin blink # md: begin bold @@ -237,15 +268,20 @@ man() { command man "$@" } -# new experiment +## new experiment +## x : string list -> unit x() { cd "$(~/bin/x $@)" || kill -INT $$ } +## ocaml repl +## hump : unit -> unit hump() { ledit -l "$(stty size | awk '{print $2}')" ocaml $@ } +## search howtos +## howto : unit -> string howto() { cat "$(find ~/arc/doc/HOWTOs -mindepth 1 -maxdepth 1 | sort | fzf)" } @@ -256,7 +292,7 @@ _yt() { 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 title=$(youtube-dlc --get-title "$uri" | sed 's/[^А-Яа-яA-Za-z0-9._-]/_/g') local -r dir="${base_dir}/${title}--${id}" mkdir -p "$dir" @@ -348,15 +384,6 @@ note() { vim -c 'set spell' "$DIR_NOTES/$(date +'%Y_%m_%d--%H_%M_%S%z')--$1.md" } -weather() { - local _weather_location - case "$1" in - '') _weather_location="$WEATHER_LOCATION";; - *) _weather_location="$1" - esac - curl "http://wttr.in/$_weather_location?format=v2" -} - _bt_devs_infos() { # grep's defintion of a line does not include \r, wile awk's does and # which bluetoothctl outputs @@ -536,13 +563,11 @@ status() { echo printf '%smem by proc\n' "$indent_unit" - ps -eo rss,cmd \ + ps -eo rss,comm \ | awk -v total="$(free | awk '$1 == "Mem:" {print $2; exit}')" ' NR > 1 { rss = $1 - cmd = $2 - n = split(cmd, path, "/") # _may_ be a path - proc = path[n] + proc = $2 by_proc[proc] += rss } @@ -667,10 +692,10 @@ status() { echo "${indent_unit}<->" - printf '%sTCP: ' "${indent_unit}${indent_unit}" + printf '%sTCP\t' "${indent_unit}${indent_unit}" sudo -n netstat -tnp \ | awk 'NR > 2 && $6 == "ESTABLISHED" {print $7}' \ - | awk -F/ '{print $2}' \ + | awk '{sub("^[0-9]+/", ""); print}' \ | sort -u \ | xargs \ | column -t @@ -678,19 +703,75 @@ status() { # TODO: iptables summary } -ssh_invalid_attempts_from() { +ssh_invalid_by_addr() { awk ' /: Invalid user/ && $5 ~ /^sshd/ { - u=$8 addr=$10 == "port" ? $9 : $10 max++ - curr[addr]++ + by_addr[addr]++ + } + + END { + for (addr in by_addr) + if ((c = by_addr[addr]) > 1) + printf "%d %d %s\n", c, max, addr + } + ' \ + /var/log/auth.log \ + /var/log/auth.log.1 \ + | sort -n -k 1 \ + | bar_gauge -v width="$(stty size | awk '{print $2}')" -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \ + | column -t +} + +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 + } + ' \ + /var/log/auth.log \ + /var/log/auth.log.1 \ + | sort -k 3 \ + | bar_gauge -v width="$(stty size | awk '{print $2}')" -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \ + | column -t +} + +ssh_invalid_by_user() { + awk ' + /: Invalid user/ && $5 ~ /^sshd/ { + user=$8 + max++ + by_user[user]++ } END { - for (addr in curr) - if ((c = curr[addr]) > 1) - print c, max, addr + for (user in by_user) + if ((c = by_user[user]) > 1) + printf "%d %d %s\n", c, max, user } ' \ /var/log/auth.log \