Add ssh invalid reports by day and by user
[khome.git] / home / lib / login_functions.sh
index 9442579..426cbb2 100644 (file)
@@ -140,16 +140,29 @@ top_commands() {
 # TODO: Consider using numfmt instead of awk
 tdu() {
     du "$1" \
-    | sort -n -k 1 \
-    | tail -50 \
     | awk '
         {
             size = $1
             path = $0
             sub("^" $1 "\t+", "", path)
-            gb = size / 1024 / 1024
-            printf("%f\t%s\n", gb, path)
-        }'
+            paths[path] = size
+            if (size > max)
+                max = size
+        }
+
+        END {
+            for (path in paths) {
+                size = paths[path]
+                pct = 100 * (size / max)
+                gb = size / 1024 / 1024
+                printf("%6.2f %3d%% %s\n", gb, pct, path)
+            }
+        }
+    ' \
+    | sort -r -n -k 1 \
+    | head -50 \
+    | tac
+    # A slight optimization: head can exit before traversing the full input.
 }
 
 # Top Disk-Using Files
@@ -224,8 +237,9 @@ man() {
     command man "$@"
 }
 
-experiment() {
-    cd "$(~/bin/experiment $@)" || kill -INT $$
+# new experiment
+x() {
+    cd "$(~/bin/x $@)" || kill -INT $$
 }
 
 hump() {
@@ -262,7 +276,10 @@ yt_video() {
 }
 
 gh_fetch_repos() {
-    curl "https://api.github.com/$1/$2/repos?page=1&per_page=10000"
+    local -r user_type="$1"
+    local -r user_name="$2"
+
+    curl "https://api.github.com/$user_type/$user_name/repos?page=1&per_page=10000"
 }
 
 gh_clone() {
@@ -317,7 +334,7 @@ EOF
 
 work_log() {
     mkdir -p "$DIR_WORK_LOG"
-    local -r file_work_log_today="${DIR_WORK_LOG}/$(date +%F).md"
+    local -r file_work_log_today="${DIR_WORK_LOG}/daily-$(date +%F).md"
     if [ ! -f "$file_work_log_today" ]
     then
         work_log_template > "$file_work_log_today"
@@ -539,12 +556,37 @@ status() {
 
     echo
 
-    local -r internet_addr=$(internet_addr 0.5)
-    local -r internet_ptr=$(host -W 1 "$internet_addr" | awk 'NR == 1 {print $NF}' )
+    local _dir temp_input label_file label
+
+    printf '%sthermal\n' "$indent_unit"
+    for _dir in /sys/class/hwmon/hwmon*; do
+        cat "$_dir"/name
+        find "$_dir"/ -name 'temp*_input' \
+            | while read -r temp_input; do
+                label_file=${temp_input//_input/_label}
+                if [ -f "$label_file" ]; then
+                    label=$(< "$label_file")
+                else
+                    label=''
+                fi
+                awk -v label="$label" '{
+                        if (label)
+                            label = sprintf(" (%s)", label)
+                            printf("%.2f°C%s\n", $1 / 1000, label)
+                    }' \
+                    "$temp_input"
+            done \
+            | sort \
+            | indent "$indent_unit"
+    done \
+    | indent "${indent_unit}${indent_unit}"
 
     echo 'net'
-    echo "${indent_unit}internet"
-    echo "${indent_unit}${indent_unit}$internet_addr  $internet_ptr"
+    #local -r internet_addr=$(internet_addr 0.5)
+    #local -r internet_ptr=$(host -W 1 "$internet_addr" | awk 'NR == 1 {print $NF}' )
+
+    #echo "${indent_unit}internet"
+    #echo "${indent_unit}${indent_unit}$internet_addr  $internet_ptr"
     echo "${indent_unit}if"
     (ifconfig; iwconfig) 2> /dev/null \
     | awk '
@@ -636,19 +678,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 -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_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 \
This page took 0.031903 seconds and 4 git commands to generate.