# Message of the day - MOTD

# Message Of The Day (MOTD)

<p class="callout info">**Co to jest MOTD?**</p>

Message Of The Day (MOTD) to tekst wyświetlany po zalogowaniu do systemu, zazwyczaj zawiera powitanie lub najważniejsze informacje o systemie. W systemach Unix/Linux plik `/etc/motd` jest prostym plikiem tekstowym, który nie interpretuje poleceń, wyświetla jedynie statyczną zawartość.

<p class="callout info">**Dlaczego plik /etc/motd nie może wykonywać poleceń?**</p>

Plik `/etc/motd` jest tylko zwykłym plikiem tekstowym i nie jest interpretowany jako skrypt ani polecenie. Aby mieć dynamiczne i kolorowe wiadomości, tworzymy osobny skrypt Bash, który jest wywoływany podczas logowania przez plik startowy powłoki.

## Skrypt motd – sekcje i wyjaśnienia poleceń

```bash
#!/bin/bash
```

```bash
#!/usr/local/bin/bash
```

<p class="callout info">**Wyjaśnienie:** Ścieżka do interpretera bash w systemach, gdzie bash jest zainstalowany w /usr/local/bin.</p>

```bash

RED='\033[31m'
GREEN='\033[32m'
YELLOW='\033[33m'
CYAN='\033[36m'
RESET='\033[0m'

```

<p class="callout info">**Wyjaśnienie:** Definiujemy zmienne reprezentujące kody ANSI do kolorowania tekstu na terminalu.</p>

```bash
echo -e "${CYAN} __  __ _____ ____  ____  ______     __"echo -e "|  \\/  |_   _|___ \\/ ___||  _ \\ \\   / /"echo -e "| |\\/| | | |   __) \\___ \\| |_) \\ \\ / / "echo -e "| |  | | | |  / __/ ___) |  _ < \\ V /  "echo -e "|_|  |_| |_| |_____|____/|_| \\_\\ \\_/   ${RESET}"
```

<p class="callout info">**Wyjaśnienie:** Wyświetlamy kolorowy napis ASCII art symbolizujący nazwę serwera w stylu retro. Polecenie `echo -e` interpretuje kody ucieczki dla kolorów, a instrukcje formatowania nadają kolor i resetują go po wyświetleniu.</p>

```
LOAD=$(sysctl -n vm.loadavg | awk '{print $2, $3, $4}')
```

<p class="callout info">**Wyjaśnienie:** Pobieramy średnie obciążenie CPU (load average) korzystając z `sysctl`, a `awk` wyciąga drugą, trzecią i czwartą wartość z wyniku (odpowiednio 1-, 5- i 15-minutowy load).</p>

```bash
MEM_TOTAL=$(sysctl -n hw.physmem)
MEM_TOTAL_MB=$((MEM_TOTAL / 1024 / 1024))
PAGE_SIZE=$(sysctl -n hw.pagesize)
FREE_PAGES=$(sysctl -n vm.stats.vm.v_free_count)
MEM_FREE_BYTES=$((FREE_PAGES * PAGE_SIZE))
MEM_FREE_MB=$((MEM_FREE_BYTES / 1024 / 1024))
```

<p class="callout info">**Wyjaśnienie:** Pobieramy całkowitą pamięć RAM i wyliczamy jej wartość w megabajtach. Następnie obliczamy ilość wolnej pamięci na podstawie liczby wolnych stron pamięci i rozmiaru strony. Wynik również jest konwertowany na megabajty.</p>

```bash
echo -e "${YELLOW}Aktualne obciążenie CPU:${RESET} ${GREEN}${LOAD}${RESET}"
echo -e "${YELLOW}Pamięć całkowita:${RESET} ${GREEN}${MEM_TOTAL_MB} MB${RESET}"
echo -e "${YELLOW}Wolna pamięć:${RESET} ${GREEN}${MEM_FREE_MB} MB${RESET}"

```

<p class="callout info">**Wyjaśnienie:** Wyświetlamy pobrane wartości obciążenia CPU i pamięci RAM z kolorami, nadając nagłówkom i wartościom różne kolory dla czytelności.</p>

```bash
df -h | awk -v CYAN="${CYAN}" -v GREEN="${GREEN}" -v RESET="${RESET}" '
NR>1 {
    free_perc = 100 - gensub(/%/, "", "g", $5)
    printf "%s%s%s: %s%d%%%s  ", CYAN, $6, RESET, GREEN, free_perc, RESET
}
END {print ""}'

```

<p class="callout info">**Wyjaśnienie:** Polecenie `df -h` pokazuje rozmiary systemów plików w czytelnej formie. Za pomocą `awk` zliczamy procent wolnego miejsca (100 minus procent użycia z kolumny 5) i wyświetlamy punkt montowania (kolumna 6) razem z procentem wolnego miejsca, kolorując je odpowiednio.</p>

```bash
count_process() {
  ps aux | grep -w "$1" | grep -v grep | wc -l
}

COUNT_GAME=$(count_process "game")
COUNT_DB=$(count_process "db")
COUNT_AUTH=$(count_process "auth")

```

<p class="callout info">**Wyjaśnienie:** Definiujemy funkcję, która liczy liczbę procesów zawierających podany ciąg znaków w pełnej nazwie procesu. Następnie zliczamy liczbę obecnie działających procesów: "game", "db" oraz "auth".</p>

```bash
color_status() {
  if [ "$1" -gt 0 ]; then
    echo -e "${GREEN}RUNNING (${1})${RESET}"
  else
    echo -e "${RED}NOT RUNNING${RESET}"
  fi
}

echo -e "${YELLOW}Status procesów gry MT2SRV:${RESET}"
echo -e "game: $(color_status $COUNT_GAME)"
echo -e "db: $(color_status $COUNT_DB)"
echo -e "auth: $(color_status $COUNT_AUTH)"

```

<p class="callout info">**Wyjaśnienie:** Funkcja `color_status` przyjmuje liczbę procesów i zwraca tekst z informacją, czy procesy są uruchomione (zielony napis) lub nie (czerwony napis). Następnie wypisujemy status każdej aplikacji gry.</p>

```bash
echo -e "${YELLOW}Szczegóły procesów game/db/auth:${RESET}"
ps aux | grep -E 'game|db|auth' | grep -v grep | awk -v GREEN="${GREEN}" -v RESET="${RESET}" '{print GREEN $0 RESET}'

```

<p class="callout info">**Wyjaśnienie:** Pokazujemy szczegóły działających procesów o nazwach zawierających "game", "db" lub "auth". Wynik jest kolorowany na zielono dla lepszej czytelności w terminalu.</p>

## Jak używać tego skryptu?

<p class="callout success">Skrypt zapisujemy jako plik wykonywalny, np. `/etc/motd.sh`. Nadajemy mu uprawnienia wykonania (`chmod +x /etc/motd.sh`) i wywołujemy go z pliku startowego powłoki, np. `~/.bash_profile` lub globalnie w `/etc/profile`, dodając w nich linię:</p>

```bash
/etc/motd.sh
```

<p class="callout success">Dzięki temu podczas każdego logowania do powłoki pojawi się dynamiczny i kolorowy *Message Of The Day* z najważniejszymi informacjami o systemie i stanie procesów.</p>