#!/bin/bash

set -e

echo "------------------------------------------------------------"
echo "  TOR RELAY INSTALLER – FULL STACK mit Performance-Tuning"
echo "------------------------------------------------------------"

if [[ $EUID -ne 0 ]]; then
  echo "Bitte führe das Skript als root aus."
  exit 1
fi

# Nickname
NICKNAME="$1"
if [[ -z "$NICKNAME" ]]; then
  read -rp "Wie soll dein Tor-Relay heißen? (Nickname): " NICKNAME
fi
if [[ -z "$NICKNAME" ]]; then
  echo "Kein Name eingegeben – Vorgang abgebrochen."
  exit 1
fi

echo "[*] Installiere benötigte Tools..."
apt update
apt install -y apt-transport-https curl gnupg lsb-release

# Architektur prüfen
ARCH=$(dpkg --print-architecture)
if [[ "$ARCH" != "amd64" && "$ARCH" != "arm64" && "$ARCH" != "i386" ]]; then
  echo "[!] Nicht unterstützte Architektur: $ARCH"
  exit 1
fi

# GPG-Key importieren
echo "[*] Installiere den offiziellen GPG-Key..."
curl -fsSL https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc \
  | gpg --dearmor \
  | tee /usr/share/keyrings/deb.torproject.org-keyring.gpg >/dev/null

# Codename ermitteln
CODENAME=$(lsb_release -cs)
if ! curl -fsSL "https://deb.torproject.org/torproject.org/dists/${CODENAME}/Release" >/dev/null 2>&1; then
  echo "[!] '$CODENAME' nicht direkt unterstützt – verwende Fallback: jammy"
  CODENAME="jammy"
fi

# Repository hinzufügen
echo "[*] Füge das Tor-Repository hinzu..."
cat > /etc/apt/sources.list.d/tor.list <<EOF
deb     [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org $CODENAME main
deb-src [signed-by=/usr/share/keyrings/deb.torproject.org-keyring.gpg] https://deb.torproject.org/torproject.org $CODENAME main
EOF

# Paketinstallation
echo "[*] Installiere Tor und Zusatzpakete..."
apt update
apt install -y tor deb.torproject.org-keyring nyx tor-geoipdb nload btop

# Konfiguration
echo "[*] Sichere alte torrc und schreibe neue..."
mv /etc/tor/torrc /etc/tor/torrc.bak.$(date +%s) 2>/dev/null || true

cat > /etc/tor/torrc <<EOF
RunAsDaemon 1
DataDirectory /var/lib/tor
ControlPort 9051
CookieAuthentication 1
DisableDebuggerAttachment 0
ShutdownWaitLength 60

ORPort 9001
ORPort 443
Nickname $NICKNAME
ContactInfo Marc Fischer <marc.fischer@packets-decraser.net>

DirPort 9030
DirPortFrontPage /etc/tor/tor-exit-notice.html

ExitPolicy reject *:*
MaxMemInQueues 5120 MB
EOF

# DirPort-Seite
mkdir -p /etc/tor
cat > /etc/tor/tor-exit-notice.html <<EOF
<html>
<head><title>Was ist Tor?</title></head>
<body>
<h1>Dies ist ein öffentlicher Tor-Knoten</h1>
<p>Dieser Server ist Teil des weltweiten Tor-Netzwerks zur Wahrung digitaler Privatsphäre.</p>
<p>Mehr Informationen: <a href="https://www.torproject.org/">torproject.org</a></p>
</body>
</html>
EOF

# sysctl Performance-Tuning
echo "[*] Optimiere sysctl..."
SYSCTL="/etc/sysctl.conf"
cp "$SYSCTL" "$SYSCTL.bak.$(date +%s)" || true
grep -q "ariazonaa_tor_tuning" "$SYSCTL" || cat >> "$SYSCTL" <<EOF

# ariazonaa_tor_tuning
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
fs.file-max = 2097152
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_max_tw_buckets = 1440000
net.core.optmem_max = 25165824
net.ipv4.tcp_mtu_probing = 1
EOF

sysctl -p

# Datei-Limits
cat > /etc/security/limits.d/99-tor.conf <<EOF
* soft nofile 1048576
* hard nofile 1048576
EOF

mkdir -p /etc/systemd/system/tor.service.d
cat > /etc/systemd/system/tor.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=1048576
EOF

systemctl daemon-reexec

# Dienst starten
systemctl enable tor
systemctl restart tor

echo ""
echo "------------------------------------------------------------"
echo "Tor-Relay '$NICKNAME' wurde erfolgreich eingerichtet."
echo "Starte Nyx zur Überwachung mit: sudo nyx"
echo "Status prüfen mit: systemctl status tor"
echo "------------------------------------------------------------"
