#!/bin/bash
#
# ============================================================
# SnowTV Player – Installationsskript Typ 1
# Version: 2.0
# Quelle:  https://172.105.95.252/
# ============================================================
#
# ============================================================
# VORAUSSETZUNGEN (manuell vor Skriptausführung erledigen)
# ============================================================
#
# 1. sudo installieren (auf frischem Debian nicht vorhanden):
#    $ su
#    # apt install sudo
#    # adduser snowtv sudo
#    # exit
#    Danach Rechner neu starten (Abmelden reicht nicht).
#
# 2. Falls sudo/reboot/shutdown nicht gefunden wird, PATH ergänzen:
#    $ sudo vim ~/.bashrc
#    export PATH="$PATH:/usr/sbin/"
#    Alternativ direkt aufrufen: /sbin/reboot, /sbin/shutdown
#
# 3. Shutdown/Reboot ohne Passwort (via visudo):
#    $ sudo visudo
#    Am Ende einfügen:
#    snowtv ALL=(ALL) NOPASSWD: /sbin/poweroff, /sbin/reboot, /sbin/shutdown
#    (Achtung: /etc/sudoers nur mit visudo bearbeiten!)
#
# 4. vim installieren (für Konfigurationsdateien wie visudo, bashrc):
#    $ su
#    # apt install vim
#    # exit
#
# 5. Timeshift-Snapshot erstellen (VOR diesem Skript!):
#    $ sudo apt install timeshift
#    $ sudo timeshift --create --comments "vor swinstall v2.0"
#    Snapshot-Liste prüfen: sudo timeshift --list
#    Bei Bedarf restore: sudo timeshift --restore
#
# ============================================================

VERSION="2.0"
BASE_URL="https://172.105.95.252"
WGET="wget --no-check-certificate"

# System aktualisieren
sudo apt update
sudo apt -y upgrade

# Software installieren
sudo apt -y install \
  openbox \
  firefox-esr \
  chromium \
  xorg \
  vim \
  vim-gtk3 \
  feh \
  x11vnc \
  libavcodec-extra \
  firmware-realtek \
  network-manager \
  network-manager-gnome \
  autossh \
  openvpn \
  network-manager-openvpn \
  network-manager-openvpn-gnome \
  modemmanager \
  libqmi-utils \
  libmbim-utils \
  xbacklight \
  pcmanfm \
  lxappearance \
  lxpanel \
  gmrun \
  gnome-terminal \
  pulseaudio \
  pavucontrol \
  paprefs \
  avahi-daemon \
  alsa-utils \
  libasound2-plugins \
  xdotool \
  zip \
  dnsutils \
  htop \
  silversearcher-ag \
  yt-dlp \
  mplayer \
  net-tools \
  tmux \
  fastfetch \
  figlet \
  curl \
  bc \
  lftp \
  imagemagick \
  netcat-openbsd \
  mtr \
  less \
  tint2 \
  jq \
  scrot \
  usbutils \
  pulsemixer \
  speedtest-cli

# OpenVPN 3 (nicht in Standard-Debian-Repos – OpenVPN-Repository erforderlich)
# Quelle: https://openvpn.net/cloud-docs/tutorials/configuration-tutorials/connectors/operating-system-support/debian-based-linux.html
curl -fsSL https://packages.openvpn.net/packages-repo.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/openvpn.gpg > /dev/null
echo "deb [signed-by=/etc/apt/trusted.gpg.d/openvpn.gpg] https://packages.openvpn.net/openvpn3/debian $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/openvpn3.list
sudo apt update
sudo apt -y install openvpn3

# Intel GPU Tools
sudo apt -y install intel-gpu-tools

# Hardware-Info (Grafikkarte auslesen via: sudo lshw -C display)
sudo apt -y install lshw

# Chafa (Bildanzeige im Terminal)
sudo apt -y install chafa

# CEC-Client (HDMI-Gerätesteuerung)
# Quellen: https://www.endpoint.com/blog/2012/11/08/using-cec-client-to-control-hdmi-devices
#          https://forum.arduino.cc/t/permission-denied-on-dev-ttyacm0/475568/13
sudo apt -y install cec-utils
sudo usermod -a -G dialout,video,render snowtv

# WiFi-Firmware für fitlet (nur bei WiFi-Nutzung erforderlich)
# Quelle: https://wiki.debian.org/iwlwifi
sudo apt -y install firmware-iwlwifi

cat >> /home/snowtv/.bash_aliases << 'EOF'
alias reboot='sudo /sbin/reboot'
alias shutdown='sudo /sbin/shutdown'
EOF

# SSH – Schlüsselbasierte Authentifizierung
sudo apt -y install openssh-server
# SSH-Verzeichnis und authorized_keys anlegen
mkdir -p /home/snowtv/.ssh
chmod 700 /home/snowtv/.ssh
touch /home/snowtv/.ssh/authorized_keys
chmod 600 /home/snowtv/.ssh/authorized_keys
chown -R snowtv:snowtv /home/snowtv/.ssh
# sshd_config härten
# Setzt oder ersetzt jeden Parameter (auch auskommentierte Zeilen).
_sshset() {
    local cfg="/etc/ssh/sshd_config"
    if sudo grep -qiE "^[#[:space:]]*${1}[[:space:]]" "$cfg"; then
        sudo sed -i -E "s|^[#[:space:]]*${1}[[:space:]].*|${1} ${2}|i" "$cfg"
    else
        echo "${1} ${2}" | sudo tee -a "$cfg" > /dev/null
    fi
}
_sshset PermitRootLogin        no
_sshset PasswordAuthentication yes     # Ausnahme: Passwort-Login bleibt aktiv
_sshset PermitEmptyPasswords   no
_sshset MaxAuthTries           3
_sshset PubkeyAuthentication   yes
_sshset AuthorizedKeysFile     ".ssh/authorized_keys"
_sshset LoginGraceTime         20
_sshset MaxSessions            3
_sshset ClientAliveInterval    300
_sshset ClientAliveCountMax    2
_sshset TCPKeepAlive           yes
_sshset X11Forwarding          no
_sshset AllowAgentForwarding   no
_sshset AllowTcpForwarding     no
_sshset PermitUserEnvironment  no
_sshset KexAlgorithms          "curve25519-sha256,diffie-hellman-group16-sha512"
_sshset Ciphers                "chacha20-poly1305@openssh.com,aes256-gcm@openssh.com"
_sshset MACs                   "hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com"
sudo sshd -t && sudo systemctl restart ssh
# Hinweis: Öffentlichen Schlüssel manuell in /home/snowtv/.ssh/authorized_keys eintragen

# SnowTV Player-Skripte herunterladen
rm -rf /home/snowtv/bin
mkdir -p /home/snowtv/bin
$WGET -r -nd -np -l1 -A "*" -P /home/snowtv/bin "${BASE_URL}/"
chmod +x /home/snowtv/bin/*.sh
# Token-Datei initialisieren (leer → Server sendet beim ersten Poll ein neues Token)
touch /home/snowtv/bin/token
# mcid.cfg mit Default-ID anlegen (wird von set_mcid.sh auf korrekte ID gesetzt)
echo "ID=102" > /home/snowtv/bin/mcid.cfg
chown -R snowtv:snowtv /home/snowtv/bin

# Bilder herunterladen
mkdir -p /home/snowtv/Bilder
$WGET -r -nd -np -l1 -P /home/snowtv/Bilder "${BASE_URL}/bilder/"
chown -R snowtv:snowtv /home/snowtv/Bilder

# Standard-Verzeichnisse sicherstellen
for dir in Bilder Dokumente Videos Downloads Musik; do
    mkdir -p "/home/snowtv/${dir}"
done
chown -R snowtv:snowtv /home/snowtv/Bilder /home/snowtv/Dokumente /home/snowtv/Videos /home/snowtv/Downloads /home/snowtv/Musik

# Intel Microcode (Hardware-Videodekodierung in Chromium)
# Quelle: https://askubuntu.com/questions/1001010
sudo apt -y install intel-microcode

# /etc/network/interfaces bereinigen: Ethernet-Einträge entfernen damit NM eno1 verwaltet
# Der Debian-Installer trägt eno1 ein → NM markiert es sonst als "nicht verwaltet"
sudo sed -i '/allow-hotplug eno[0-9]/d; /iface eno[0-9] inet dhcp/d' /etc/network/interfaces
sudo systemctl restart NetworkManager
sleep 3

# vnstat (Netzwerkstatistik)
# Quelle: https://askubuntu.com/questions/9382
sudo apt -y install vnstat
ETH="$(ip r | grep default | awk '{print $5}')"
# Standard-Interface in vnstat.conf setzen (vnstat 2.x erstellt DB automatisch beim Start)
sudo sed -i "s/^Interface .*/Interface \"$ETH\"/" /etc/vnstat.conf
sudo systemctl enable vnstat
sudo systemctl restart vnstat

# cfg_files herunterladen (für logrotate und weitere Konfigurationen)
mkdir -p /tmp/cfg_files
$WGET -r -nd -np -l1 -A "*" -P /tmp/cfg_files "${BASE_URL}/cfg_files/"

# SSH-Keys deployen (für Reverse-SSH-Tunnel via autossh)
cp /tmp/cfg_files/id_ed25519     /home/snowtv/.ssh/id_ed25519
chmod 600 /home/snowtv/.ssh/id_ed25519
cp /tmp/cfg_files/id_ed25519.pub /home/snowtv/.ssh/id_ed25519.pub
chmod 644 /home/snowtv/.ssh/id_ed25519.pub
chown snowtv:snowtv /home/snowtv/.ssh/id_ed25519 /home/snowtv/.ssh/id_ed25519.pub

# logrotate für stv.log
sudo cp /tmp/cfg_files/stvlog /etc/logrotate.d/stvlog
sudo chown root:root /etc/logrotate.d/stvlog
sudo chmod 644 /etc/logrotate.d/stvlog

# logrotate für cron.log
sudo cp /tmp/cfg_files/cronlog /etc/logrotate.d/cronlog
sudo chown root:root /etc/logrotate.d/cronlog
sudo chmod 644 /etc/logrotate.d/cronlog

# SSD-Pflege: TRIM wöchentlich aktivieren
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

# Systemd-Journal auf 100 MB begrenzen
sudo mkdir -p /etc/systemd/journald.conf.d
echo -e "[Journal]\nSystemMaxUse=100M" | sudo tee /etc/systemd/journald.conf.d/size.conf > /dev/null
sudo systemctl restart systemd-journald

# Logfile anlegen
sudo touch /var/log/stv.log
sudo chown snowtv:snowtv /var/log/stv.log

# openbox-Konfiguration einrichten
mkdir -p /home/snowtv/.config/openbox
cp /tmp/cfg_files/rc.xml   /home/snowtv/.config/openbox/
cp /tmp/cfg_files/menu.xml /home/snowtv/.config/openbox/
chown snowtv:snowtv /home/snowtv/.config/openbox/rc.xml /home/snowtv/.config/openbox/menu.xml
cp /tmp/cfg_files/autostart /home/snowtv/.config/openbox/autostart
chown snowtv:snowtv /home/snowtv/.config/openbox/autostart
sudo cp /tmp/cfg_files/autostart_syswide /etc/xdg/openbox/autostart

# Crontab installieren
crontab /tmp/cfg_files/crontab

# Autologin und Autostart X (systemd)
sudo systemctl set-default multi-user.target
sudo mkdir -p /etc/systemd/system/getty@tty1.service.d
sudo cp /home/snowtv/bin/override.conf /etc/systemd/system/getty@tty1.service.d/override.conf
cat >> /home/snowtv/.profile << 'EOF'
[ "$(tty)" = "/dev/tty1" ] && exec startx
EOF

# Reboot und Shutdown ohne Root-Rechte (am Ende, damit alle vorigen sudo-Aufrufe funktionieren)
# Einziger sudo-Aufruf: verhindert dass die Datei nach dem ersten tee bereits eingeschränkt ist
sudo sh -c 'printf "snowtv ALL=NOPASSWD: /sbin/shutdown\nsnowtv ALL=NOPASSWD: /sbin/reboot\nsnowtv ALL=NOPASSWD: /usr/bin/nmcli\nsnowtv ALL=NOPASSWD: /usr/bin/mmcli\nsnowtv ALL=NOPASSWD: /usr/bin/sh\nsnowtv ALL=NOPASSWD: /bin/bash /home/snowtv/bin/gdssetup.sh\nsnowtv ALL=NOPASSWD: /bin/bash /home/snowtv/bin/uninstallgds.sh\n" > /etc/sudoers.d/snowtv && chmod 440 /etc/sudoers.d/snowtv'

# Neustart
echo "Installation abgeschlossen. Rechner wird in 5 Sekunden neu gestartet..."
sleep 5
sudo /sbin/reboot

exit 0
