blob: 6d951193288eeb770aa181e27695770fa1c58fdf (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
{
config,
lib,
pkgs,
...
}:
with lib;
let
cfg = config.programs.motd;
motd = pkgs.writeShellScriptBin "motd" ''
RED="\e[31m"
GREEN="\e[32m"
YELLOW="\e[33m"
BOLD="\e[1m"
ENDCOLOR="\e[0m"
case "$(date +'%H')" in
[0-9]|1[0-1])
TIME="morning"
;;
1[2-7])
TIME="afternoon"
;;
*)
TIME="evening"
;;
esac
UPTIME=$(cat /proc/uptime | cut -f1 -d.)
UPDAYS=$((UPTIME/60/60/24))
UPHOURS=$((UPTIME/60/60%24))
UPMINS=$((UPTIME/60%60))
UPSECS=$((UPTIME%60))
MEMORY=$(free -m | awk 'NR == 2 { printf "%s/%sMB (%.2f%%)\n", $3, $2, ($3 * 100) / $2 }')
SERVICES=$(systemctl list-units | grep -P 'podman-|${strings.concatStringsSep "|" cfg.servicesToCheck}')
printf "\n"
printf "''${BOLD}Good $TIME $(whoami), welcome to $(hostname)!$ENDCOLOR\n"
printf "\n"
${strings.concatStrings (
lists.forEach cfg.networkInterfaces (
int:
"printf \"$BOLD * %-20s$ENDCOLOR %s\\n\" \"IPv4 ${int}\" \"$(ip -4 addr show ${int} | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}')\"\n"
)
)}
printf "$BOLD * %-20s$ENDCOLOR %s\n" "Release" "$(awk -F= '/PRETTY_NAME/ { print $2 }' /etc/os-release | tr -d '"')"
printf "$BOLD * %-20s$ENDCOLOR %s\n" "Kernel" "$(uname -rs)"
printf "\n"
printf "$BOLD * %-20s$ENDCOLOR %s\n" "CPU Usage" "$(awk '{ print $1 ", " $2 ", " $3 }' /proc/loadavg) (1, 5, 15 min)"
printf "$BOLD * %-20s$ENDCOLOR %s\n" "Memory" "$MEMORY"
printf "$BOLD * %-20s$ENDCOLOR %s\n" "System Uptime" "$UPDAYS days $UPHOURS hours $UPMINS minutes $UPSECS seconds"
printf "\n"
[ -z "$SERVICES" ] && exit
printf "''${BOLD}Service status:$ENDCOLOR\n"
while IFS= read -r line; do
if [[ ! $line =~ ".service" ]] || [[ $line =~ ".mount" ]]; then
continue
fi
if echo "$line" | grep -q 'failed'; then
name=$(echo "$line" | awk '{ print $1 }' | sed 's/podman-//g')
printf "$RED• $ENDCOLOR%-50s $RED[failed]$ENDCOLOR\n" "$name"
elif echo "$line" | grep -q 'running'; then
name=$(echo "$line" | awk '{ print $1 }' | sed 's/podman-//g')
printf "$GREEN• $ENDCOLOR%-50s $GREEN[active]$ENDCOLOR\n" "$name"
elif echo "$line" | grep -q 'exited'; then
name=$(echo "$line" | awk '{ print $1 }' | sed 's/podman-//g')
printf "$YELLOW• $ENDCOLOR%-50s $YELLOW[exited]$ENDCOLOR\n" "$name"
else
echo "service status unknown"
fi
done <<< "$SERVICES"
printf "\n"
'';
in
{
options = {
programs.motd = {
enable = mkEnableOption "motd";
networkInterfaces = mkOption {
default = [ ];
type = types.listOf types.str;
description = "Network interfaces to monitor.";
};
servicesToCheck = mkOption {
default = [ ];
type = types.listOf types.str;
description = "Services to validate alongside podman containers.";
};
};
};
config = mkIf cfg.enable {
environment.systemPackages = [ motd ];
programs.bash.loginShellInit = ''
[ -z "$PS1" ] && return
if command -v motd &> /dev/null; then
motd
fi
'';
};
}
|