aboutsummaryrefslogtreecommitdiff
path: root/modules/scripts/motd/default.nix
blob: 2b60ca33c6a2b006ba5c584432705394f75d6d5a (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
{ config, lib, pkgs, ... }:
with lib;
let
  cfg = config.programs.motd;

  motd = pkgs.writeShellScriptBin "motd" ''
    #!/usr/bin/env bash

    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
    '';
  };
}