Implement ssh_invalid_attempts_from counter gauge
[khome.git] / home / lib / login_functions.sh
index fa45b80..a161d4b 100644 (file)
@@ -341,16 +341,20 @@ weather() {
     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
+    awk '/^Device +/ {print $2}' \
+    | xargs -I% sh -c 'echo info % | bluetoothctl' \
+    | awk '/^Device |^\t[A-Z][A-Za-z0-9]+: /'
+}
+
 bt_devs_paired() {
-    bluetoothctl -- paired-devices \
-    | awk '{print $2}' \
-    | xargs bluetoothctl -- info
+    echo 'paired-devices' | bluetoothctl | _bt_devs_infos
 }
 
 bt_devs() {
-    bluetoothctl -- devices \
-    | awk '{print $2}' \
-    | xargs bluetoothctl -- info
+    echo 'devices' | bluetoothctl | _bt_devs_infos
 }
 
 run() {
@@ -369,21 +373,31 @@ run() {
 }
 
 bar_gauge() {
-    local -r width="$1"
+    awk "$@" '
+        BEGIN {
+            ch_left  = ch_left  ? ch_left  : "["
+            ch_right = ch_right ? ch_right : "]"
+            ch_blank = ch_blank ? ch_blank : "-"
+            ch_used  = ch_used  ? ch_used  : "|"
+        }
 
-    awk -v width="$width" '
         {
-            used  = $1
-            total = $2
+            cur = $1
+            max = $2
+            lab = $3
 
-            u = num_scale(used, total, 1, width)
+            cur_scaled = num_scale(cur, max, 1, width)
 
-            printf "["
+            printf \
+                "%s%s%s", \
+                lab ? lab         " " : "", \
+                num ? cur "/" max " " : "", \
+                ch_left
             for (i=1; i<=width; i++) {
-                c = i <= u ? "|" : " "
-                printf "%c", c
+                c = i <= cur_scaled ? ch_used : ch_blank
+                printf "%s", c
             }
-            printf "]\n"
+            printf "%s\n", ch_right
         }
 
         function num_scale(src_cur, src_max, dst_min, dst_max) {
@@ -392,30 +406,9 @@ bar_gauge() {
     '
 }
 
-motd() {
-    uname -srvmo
-    hostname | figlet
-    uptime
-
-    echo
-
-    printf 'tmux sessions: %d\n' "$(tmux ls 2> /dev/null | wc -l)"
-
-    echo
-
-    printf 'mem  '
-    free \
-    | awk '$1 == "Mem:" {total=$2; used=$3; print used, total}' \
-    | bar_gauge 73
-
-    printf 'disk '
-    df ~ \
-    | awk 'NR == 2 {used=$3; avail=$4; total=used+avail; print used, total}' \
-    | bar_gauge 73
-
+motd_batt() {
     case "$(uname)" in
         'Linux')
-            printf 'batt '
             upower --dump \
             | awk '
                 /^Device:[ \t]+/ {
@@ -436,16 +429,48 @@ motd() {
 
                 /^$/ {
                     if (device["is_battery"] && device["path"] == "/org/freedesktop/UPower/devices/DisplayDevice")
-                        print device["battery_percentage"], 100
+                        print device["battery_percentage"], 100, "batt"
                     delete device
                 }
-            ' \
-            | bar_gauge 73
+            '
         ;;
     esac
+}
+
+indent() {
+    awk -v unit="$1" '{printf "%s%s\n", unit, $0}'
+}
+
+motd() {
+    local -r bar_width='60'
+    local -r indent_unit='    '
+
+    uname -srvmo
+    hostname | figlet
+    uptime
+
+    echo
+
+    printf 'tmux: sessions %d, clients %d\n' \
+        "$(tmux list-sessions 2> /dev/null | wc -l)" \
+        "$(tmux list-clients  2> /dev/null | wc -l)"
+
+    echo
+
+    echo 'Resources'
+    (
+        free | awk '$1 == "Mem:" {print $3, $2, "mem"}'
+        df ~ | awk 'NR == 2 {print $3, $3 + $4, "disk"}'
+        motd_batt
+    ) \
+    | bar_gauge -v width="$bar_width" \
+    | column -t \
+    | indent "$indent_unit"
 
     echo
 
+    echo 'Network'
+    echo "${indent_unit}if"
     (ifconfig; iwconfig) 2> /dev/null \
     | awk '
         /^[^ ]/ {
@@ -479,16 +504,90 @@ motd() {
                 if (device != "lo") {
                     l = link[device]
                     e = essid[device]
-                    l = l ? l : "--"
+                    l = l ? sprintf("%.0f%%", l) : "--"
                     e = e ? e : "--"
                     print device, address[device], e, l
                 }
         }
         ' \
-    | column -t
+    | column -t \
+    | indent "${indent_unit}${indent_unit}"
 
-    #echo
-    # TODO: netstat summary
     # WARN: ensure: $USER ALL=(ALL) NOPASSWD:/bin/netstat
-    #sudo -n netstat -tulpn | awk '/^udp/ && !first++ {printf "\n"} 1'
+
+    echo "${indent_unit}-->"
+
+    printf '%sUDP: ' "${indent_unit}${indent_unit}"
+    sudo -n netstat -ulnp \
+    | awk 'NR > 2 {print $6}' \
+    | awk -F/ '{print $2}' \
+    | sort -u \
+    | xargs \
+    | column -t
+
+    printf '%sTCP: ' "${indent_unit}${indent_unit}"
+    sudo -n netstat -tlnp \
+    | awk 'NR > 2 {print $7}' \
+    | awk -F/ '{print $2}' \
+    | sort -u \
+    | xargs \
+    | column -t
+
+    echo "${indent_unit}<->"
+
+    printf '%sTCP: ' "${indent_unit}${indent_unit}"
+    sudo -n netstat -tnp \
+    | awk 'NR > 2 && $6 == "ESTABLISHED" {print $7}' \
+    | awk -F/ '{print $2}' \
+    | sort -u \
+    | xargs \
+    | column -t
+
+    echo
+
+    echo 'Loggers'
+    awk '
+        {
+            split($5, prog, "[")
+            sub(":$", "", prog[1]) # if there were no [], than : will is left behind
+            print prog[1]
+        }' /var/log/syslog \
+    | awk '
+        {
+            n = split($1, path, "/")  # prog may be in path form
+            prog = path[n]
+            total++
+            count[prog]++
+        }
+
+        END {
+            for (prog in count)
+                print count[prog], total, prog
+        }' \
+    | sort -n -k 1 -r \
+    | bar_gauge -v width=30 -v num=1 -v ch_left=' ' -v ch_right=' ' -v ch_blank=' ' \
+    | column -t \
+    | indent "${indent_unit}"
+}
+
+ssh_invalid_attempts_from() {
+    awk '
+        /: Invalid user/ && $5 ~ /^sshd/ {
+            u=$8
+            addr=$10 == "port" ? $9 : $10
+            max++
+            curr[addr]++
+        }
+
+        END {
+            for (addr in curr)
+                if ((c = curr[addr]) > 1)
+                    print c, max, addr
+        }
+        ' \
+        /var/log/auth.log \
+        /var/log/auth.log.1 \
+    | sort -n -k 1 \
+    | bar_gauge -v width=80 -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \
+    | column -t
 }
This page took 0.045424 seconds and 4 git commands to generate.