#!/bin/sh
set -e
[ "$1" = "configure" ] || exit 0
id nas >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin nas
getent group archa-users >/dev/null || groupadd --system archa-users
# účet nas ve skupině uživatelů: ve složkách s kvótou (soubory patří autorovi) smí dál zapisovat
id -nG nas | grep -qw archa-users || usermod -aG archa-users nas
# Web běží jako neprivilegovaný „archa“, root operace dělá archa-nas-helper (od 1.9.0)
id archa >/dev/null 2>&1 || useradd --system --no-create-home --home-dir /var/lib/mininas --shell /usr/sbin/nologin archa
mkdir -p /etc/mininas /var/lib/mininas /var/cache/archa-nas /etc/archa-nas /var/lib/archa-nas /var/log/archa-nas-backup
chmod 700 /etc/mininas /etc/archa-nas
chmod 755 /var/lib/archa-nas
# Tajné věci a soubory, které zapisuje root, patří mimo složky webu (ochrana před podvržením odkazů)
for f in tls.key tls.crt; do
    [ -f /etc/mininas/$f ] && [ ! -f /etc/archa-nas/$f ] && cp -p /etc/mininas/$f /etc/archa-nas/$f
done
[ -d /etc/mininas/backup_ssh ] && [ ! -d /etc/archa-nas/backup_ssh ] && mv /etc/mininas/backup_ssh /etc/archa-nas/backup_ssh
chown -R root:root /etc/archa-nas
for f in backup-state.json kernel.json; do
    [ -f /var/lib/mininas/$f ] && [ ! -f /var/lib/archa-nas/$f ] && mv /var/lib/mininas/$f /var/lib/archa-nas/$f
done
rm -f /var/lib/mininas/backup-state.json.lock /var/lib/mininas/events-in.jsonl.work
[ -f /var/lib/mininas/events-in.jsonl ] && cat /var/lib/mininas/events-in.jsonl >> /var/lib/archa-nas/events-in.jsonl && rm -f /var/lib/mininas/events-in.jsonl
[ -f /etc/nginx/sites-available/mininas ] && sed -i 's#/etc/mininas/tls#/etc/archa-nas/tls#g' /etc/nginx/sites-available/mininas
# HTTPS: vlastní certifikační autorita NASu (ke stažení v Nastavení). Nová instalace dostane rovnou certifikát od ní;
# starý vlastnoruční certifikát (do 1.18.7) se nemění – přepnutí spouští uživatel v Nastavení → HTTPS certifikát.
python3 /opt/mininas/tlscert.py ensure >/dev/null 2>&1 || true
if [ ! -f /etc/archa-nas/tls.crt ]; then        # záchrana, kdyby CA nešla vytvořit
    SAN="DNS:$(hostname)"
    for ip in $(hostname -I); do case "$ip" in *:*) ;; *) SAN="$SAN,IP:$ip";; esac; done
    openssl req -x509 -newkey rsa:2048 -nodes -days 3650 -subj "/CN=$(hostname)" -addext "subjectAltName=$SAN" \
        -keyout /etc/archa-nas/tls.key -out /etc/archa-nas/tls.crt 2>/dev/null
    chmod 600 /etc/archa-nas/tls.key
fi
# nginx – web jen přes HTTPS
if [ ! -e /etc/nginx/sites-available/mininas ]; then
    cp /usr/share/archa-nas/nginx-mininas.conf /etc/nginx/sites-available/mininas
fi
if [ ! -e /etc/nginx/sites-enabled/mininas ]; then
    ln -s /etc/nginx/sites-available/mininas /etc/nginx/sites-enabled/mininas
    rm -f /etc/nginx/sites-enabled/default
fi
# Samba – sdílení generuje web do mininas.conf
touch /etc/samba/mininas.conf
grep -q '^include = /etc/samba/mininas.conf' /etc/samba/smb.conf || echo 'include = /etc/samba/mininas.conf' >> /etc/samba/smb.conf
# Čerstvá instalace: účet správce se zakládá v průvodci prvním spuštěním na webu (jen z domácí sítě)
if ! grep -q admin_hash /etc/mininas/config.json 2>/dev/null; then
    python3 -c "import json,os,secrets;p='/etc/mininas/config.json'
try: c=json.load(open(p))
except Exception: c={}
c['setup_done']=False; c.setdefault('secret',secrets.token_hex(32))
open(p,'w').write(json.dumps(c)); os.chmod(p,0o600)"
    IP=$(ip -4 -o route get 1.1.1.1 2>/dev/null | sed -n 's/.* src \([0-9.]*\).*/\1/p')
    echo "Archa NAS: dokonči nastavení v prohlížeči – https://${IP:-<adresa NASu>}/"
fi
# Přejmenování ENTERPRISE NAS → Archa NAS: starý zdroj apt (jinak by byl repozitář uveden dvakrát), Samba popis, stará cache
rm -f /etc/apt/sources.list.d/enterprise-nas.sources /etc/apt/sources.list.d/enterprise-nas.sources.dpkg-*
sed -i 's/^\(   server string = \)ENTERPRISE NAS$/\1Archa NAS/' /etc/samba/smb.conf
rm -rf /var/cache/enterprise-nas
# Od 1.15.0 jediný kanál aktualizací (trixie) – NAS dřív přepnutý na testovací (trixie-testing) vrátit
sed -i 's/^Suites: trixie-testing$/Suites: trixie/' /etc/apt/sources.list.d/archa-nas.sources 2>/dev/null || true
# Od 1.29.2 repo na R2 – NAS s ručně upraveným zdrojem (conffile se při --force-confold nepřepíše) přepnout ze staré LANové adresy
sed -i 's#^URIs: http://192\.168\.30\.196/\?$#URIs: https://repo.holba-net.cz/#' /etc/apt/sources.list.d/archa-nas.sources 2>/dev/null || true
# Jazyk: nová instalace = angličtina (výchozí v aplikaci); stávající NAS z doby před jazyky zůstane česky
if [ -n "${2:-}" ] && [ -f /etc/mininas/config.json ] && ! grep -q '"lang"' /etc/mininas/config.json; then
    python3 -c "import json;p='/etc/mininas/config.json';c=json.load(open(p));c['lang']='cs';json.dump(c,open(p,'w'))"
fi
# Staré ručně nasazené jednotky (před balíčkem) by přebíjely ty z balíčku
for u in mininas.service mininas-autosnap.service mininas-autosnap.timer; do
    [ -f /etc/systemd/system/$u ] && rm -f /etc/systemd/system/$u
done
# Upozornění: události ZFS (ZED) → centrum upozornění ve webu
mkdir -p /etc/zfs/zed.d
ln -sf /usr/lib/archa-nas/zed-archa-nas.sh /etc/zfs/zed.d/all-archa-nas.sh
systemctl try-restart zfs-zed.service 2>/dev/null || true
mkdir -p /var/log/archa-nas-backup
# Data webu patří uživateli archa (jen tyto složky smí web měnit)
chown -R archa:archa /etc/mininas /var/lib/mininas /var/cache/archa-nas
chmod 700 /etc/mininas
# SSH přes VSOCK (systemd 257) NAS nepotřebuje; generátor bez VSOCK zařízení jen vypisuje chyby na konzoli
mkdir -p /etc/systemd/system-generators
[ -e /etc/systemd/system-generators/systemd-ssh-generator ] || ln -s /dev/null /etc/systemd/system-generators/systemd-ssh-generator
# Konzole bez chyb firmwaru (jen kritické hlášky jádra); NAS se nesmí uspat (víko notebooku, tlačítko, nečinnost)
sysctl -q -p /usr/lib/sysctl.d/90-archa-nas-console.conf >/dev/null 2>&1 || true
systemctl --no-reload mask sleep.target suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target >/dev/null 2>&1 || true
systemctl kill -s HUP systemd-logind >/dev/null 2>&1 || true
# přesný čas (zálohy, snapshoty, okno údržby): NTP přes systemd-timesyncd
timedatectl set-ntp true >/dev/null 2>&1 || systemctl enable --now systemd-timesyncd >/dev/null 2>&1 || true
# každou zvlášť – jedna zamaskovaná/chybějící jednotka nesmí zabránit povolení ostatních
for u in archa-nas-helper.service mininas.service mininas-autosnap.timer archa-nas-backup.timer archa-nas-zfsguard.service archa-nas-zfsretry.service archa-nas-bootenv.service archa-nas-maint.timer archa-nas-updcheck.timer archa-vm-snap.timer archa-nas-iscsi.service; do
    systemctl --no-reload enable "$u" >/dev/null 2>&1 || true
done
systemctl daemon-reload
# Uchovávání logů (od 1.33.0): systémový deník max 3 měsíce / 1 GB, protokol změn ve sdílení ve vlastním deníku
# archa-audit max 6 měsíců / 500 MB; při změně na stránce Logy je přepisuje pomocník (výchozí jen když chybí)
mkdir -p /etc/systemd/journald.conf.d
if [ ! -f /etc/systemd/journald.conf.d/archa-nas.conf ]; then
    printf '# Archa NAS – uchovávání systémových logů (mění stránka Logy systému)\n[Journal]\nSystemMaxUse=1G\nMaxRetentionSec=3month\n' > /etc/systemd/journald.conf.d/archa-nas.conf
    systemctl restart systemd-journald >/dev/null 2>&1 || true
fi
if [ ! -f /etc/systemd/journald@archa-audit.conf ]; then
    printf '# Archa NAS – protokol změn ve sdílení (mění stránka Logy systému)\n[Journal]\nStorage=persistent\nSystemMaxUse=500M\nMaxRetentionSec=6month\n' > /etc/systemd/journald@archa-audit.conf
fi
# Samba jednou restartovat, ať začne psát protokol do vlastního deníku (připojené počítače se samy připojí znovu)
if [ ! -f /var/lib/archa-nas/smbd-audit-ns ] && [ -f /lib/systemd/system/smbd.service.d/archa-nas-audit.conf ]; then
    mkdir -p /var/lib/archa-nas
    if systemctl is-active --quiet smbd; then systemctl restart smbd >/dev/null 2>&1 || true; fi
    touch /var/lib/archa-nas/smbd-audit-ns
fi
udevadm control --reload-rules >/dev/null 2>&1 || true
systemctl start archa-nas-backup.timer || true
systemctl start archa-nas-maint.timer || true
systemctl start archa-nas-updcheck.timer || true
systemctl start archa-vm-snap.timer || true
# pravidelné SMART testy a hlídání disků (smartd s konfigurací Archa NAS; bez disků se SMART skončí bez chyby)
systemctl restart smartmontools.service >/dev/null 2>&1 || true
# síť: statické nastavení bez DNS (instalace z ISO 1.25.x se statickou IP) → brána jako DNS; záložní DHCP pro novou kartu
for f in /etc/systemd/network/10-archa-*.network; do
    [ -f "$f" ] || continue
    if grep -q '^Address=' "$f" && ! grep -q '^DNS=' "$f"; then
        GW=$(sed -n 's/^Gateway=//p' "$f" | head -1)
        IF=$(sed -n 's/^Name=//p' "$f" | head -1)
        if [ -n "$GW" ] && sed -i "/^Gateway=/a DNS=$GW" "$f"; then
            resolvectl dns "$IF" "$GW" >/dev/null 2>&1 || true   # hned, bez restartu spojení (soubor platí od příštího startu)
        fi
    fi
done
if systemctl is-active --quiet systemd-networkd; then
    networkctl reload >/dev/null 2>&1 || true    # nová/změněná nastavení; běžící spojení beze změny souboru zůstávají
fi
systemctl restart archa-nas-helper.service || true
systemctl restart mininas.service || true
# iSCSI (od 1.28.0): disky naběhnou i bez restartu (start = jen když služba ještě neběží – sezení Windows se nepřeruší)
# jen s nainstalovaným rtslib – doinstalace by uvnitř běžícího dpkg čekala na zámek a aktualizace by se zasekla
[ -f /etc/mininas/iscsi.json ] && [ -d /usr/lib/python3/dist-packages/rtslib_fb ] && systemctl start archa-nas-iscsi.service >/dev/null 2>&1 || true
# UPS (od 1.27.0): zapnutá UPS → konfiguraci NUT sestavit znovu podle aktuální verze
if command -v upsmon >/dev/null 2>&1 && grep -q '"ups"' /etc/mininas/config.json 2>/dev/null && python3 -c "import json,sys;sys.exit(0 if (json.load(open('/etc/mininas/config.json')).get('ups') or {}).get('enabled') else 1)" 2>/dev/null; then
    ARCHA_NO_INSTALL=1 python3 /opt/mininas/ups.py apply >/dev/null 2>&1 || true
fi
# stav jádra hned po instalaci; chybí-li modul ZFS pro nejnovější jádro, připne se funkční jádro
python3 /opt/mininas/kernelcheck.py post-upgrade >/dev/null 2>&1 || true
systemctl start mininas-autosnap.timer || true
if nginx -t >/dev/null 2>&1; then
    systemctl reload nginx || true
    # staré kopie TLS ve složce webu smazat, až když nginx jede s novými cestami
    grep -q /etc/mininas/tls /etc/nginx/sites-available/mininas 2>/dev/null || rm -f /etc/mininas/tls.key /etc/mininas/tls.crt
fi
exit 0
