Add TODO for iptables summary in motd
[khome.git] / home / lib / login_functions.sh
index 9f06a6b..97cb68a 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() {
@@ -371,10 +375,14 @@ run() {
 bar_gauge() {
     awk "$@" '
         BEGIN {
+            # CLI options
+            width    = width    ? width    : 80
             ch_left  = ch_left  ? ch_left  : "["
             ch_right = ch_right ? ch_right : "]"
             ch_blank = ch_blank ? ch_blank : "-"
             ch_used  = ch_used  ? ch_used  : "|"
+            num      = num      ? 1        : 0
+            pct      = pct      ? 1        : 0
         }
 
         {
@@ -385,9 +393,10 @@ bar_gauge() {
             cur_scaled = num_scale(cur, max, 1, width)
 
             printf \
-                "%s%s%s", \
+                "%s%s%s%s", \
                 lab ? lab         " " : "", \
                 num ? cur "/" max " " : "", \
+                pct ? sprintf("%3.0f%% ", cur / max * 100) : "", \
                 ch_left
             for (i=1; i<=width; i++) {
                 c = i <= cur_scaled ? ch_used : ch_blank
@@ -402,33 +411,53 @@ bar_gauge() {
     '
 }
 
+flat_top_5() {
+    sort -n -k 1 -r \
+    | head -5 \
+    | awk '
+        {
+            cur  = $1
+            max  = $2
+            name = $3
+            pct  = cur / max * 100
+            printf "%s%s %.2f%%", sep, name, pct
+            sep = ",  "
+        }
+
+        END {printf "\n"}
+        '
+}
+
 motd_batt() {
     case "$(uname)" in
         'Linux')
-            upower --dump \
-            | awk '
-                /^Device:[ \t]+/ {
-                    device["path"] = $2
-                    next
-                }
-
-                /  battery/ && device["path"] {
-                    device["is_battery"] = 1
-                    next
-                }
-
-                /    percentage:/ && device["is_battery"] {
-                    device["battery_percentage"] = $2
-                    sub("%$", "", device["battery_percentage"])
-                    next
-                }
-
-                /^$/ {
-                    if (device["is_battery"] && device["path"] == "/org/freedesktop/UPower/devices/DisplayDevice")
-                        print device["battery_percentage"], 100, "batt"
-                    delete device
-                }
-            '
+            if which upower > /dev/null
+            then
+                upower --dump \
+                | awk '
+                    /^Device:[ \t]+/ {
+                        device["path"] = $2
+                        next
+                    }
+
+                    /  battery/ && device["path"] {
+                        device["is_battery"] = 1
+                        next
+                    }
+
+                    /    percentage:/ && device["is_battery"] {
+                        device["battery_percentage"] = $2
+                        sub("%$", "", device["battery_percentage"])
+                        next
+                    }
+
+                    /^$/ {
+                        if (device["is_battery"] && device["path"] == "/org/freedesktop/UPower/devices/DisplayDevice")
+                            print device["battery_percentage"], 100, "batt"
+                        delete device
+                    }
+                '
+            fi
         ;;
     esac
 }
@@ -438,7 +467,6 @@ indent() {
 }
 
 motd() {
-    local -r bar_width='60'
     local -r indent_unit='    '
 
     uname -srvmo
@@ -447,25 +475,68 @@ motd() {
 
     echo
 
-    printf 'tmux: sessions %d, clients: %d\n' \
+    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)"
 
     echo
 
-    echo 'Resources'
+    printf '%sprocs by user\n' "${indent_unit}"
+    ps -eo user \
+    | awk '
+        NR > 1 {
+            count_by_user[$1]++
+            total++
+        }
+
+        END {
+            for (user in count_by_user)
+                print count_by_user[user], total, user
+        }
+        ' \
+    | flat_top_5 \
+    | indent "${indent_unit}${indent_unit}"
+
+    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" \
+    | bar_gauge -v width=60 -v pct=1 \
     | column -t \
     | indent "$indent_unit"
 
     echo
 
-    echo 'Network'
+    printf '%smem by proc\n' "$indent_unit"
+    ps -eo rss,cmd \
+    | 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]
+            by_proc[proc] += rss
+        }
+
+        END {
+            for (proc in by_proc)
+                print by_proc[proc], total, proc
+            }
+        ' \
+        | flat_top_5 \
+        | indent "${indent_unit}${indent_unit}"
+
+    echo
+
+    echo 'net'
     echo "${indent_unit}if"
     (ifconfig; iwconfig) 2> /dev/null \
     | awk '
@@ -539,9 +610,32 @@ motd() {
     | xargs \
     | column -t
 
-    echo
+    # TODO: iptables summary
+}
 
-    echo 'Loggers'
+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="$(stty size | awk '{print $2}')" -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \
+    | column -t
+}
+
+loggers() {
     awk '
         {
             split($5, prog, "[")
@@ -560,8 +654,6 @@ motd() {
             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}"
+    | bar_gauge -v num=1 -v ch_right=' ' -v ch_left=' ' -v ch_blank=' ' \
+    | column -t
 }
This page took 0.038139 seconds and 4 git commands to generate.