#!/usr/bin/env bash
#
# sish-tunnel-install.sh
# Cài đặt tunnel ngầm (background service) kết nối tới sish trên entry.io.vn.
# Dùng autossh + systemd: tự kết nối lại khi rớt, tự chạy khi boot.
#
# Cách dùng (chạy với quyền root trên máy Linux cần expose service):
#   sudo bash sish-tunnel-install.sh
# Sau đó sửa /etc/sish-tunnel/tunnel.conf (SUBDOMAIN, LOCAL_PORT) rồi:
#   sudo systemctl restart sish-tunnel
#
set -euo pipefail

CONF_DIR=/etc/sish-tunnel
KEY="$CONF_DIR/id_ed25519"
CONF="$CONF_DIR/tunnel.conf"
UNIT=/etc/systemd/system/sish-tunnel.service

echo "==> 1) Cài autossh + openssh-client"
if   command -v apt-get >/dev/null 2>&1; then apt-get update -qq && apt-get install -y -qq autossh openssh-client
elif command -v dnf     >/dev/null 2>&1; then dnf install -y autossh openssh-clients
elif command -v yum     >/dev/null 2>&1; then yum install -y autossh openssh-clients
elif command -v apk     >/dev/null 2>&1; then apk add --no-cache autossh openssh-client
else echo "!! Không nhận diện được package manager. Cài 'autossh' thủ công rồi chạy lại."; exit 1
fi

echo "==> 2) Tạo thư mục cấu hình + SSH key (nếu chưa có)"
mkdir -p "$CONF_DIR"
chmod 700 "$CONF_DIR"
if [ ! -f "$KEY" ]; then
  ssh-keygen -t ed25519 -N '' -f "$KEY" -C "sish-tunnel@$(hostname)" -q
  echo "   -> đã tạo key mới: $KEY"
else
  echo "   -> key đã tồn tại: $KEY"
fi

echo "==> 3) Ghi file cấu hình (nếu chưa có)"
if [ ! -f "$CONF" ]; then
  cat > "$CONF" <<'CFG'
# ==== Cấu hình tunnel sish ====
SISH_HOST=entry.io.vn
SISH_PORT=2222
# Subdomain công khai mong muốn -> https://<SUBDOMAIN>.entry.io.vn
SUBDOMAIN=myapp
# Service local cần expose:
LOCAL_HOST=localhost
LOCAL_PORT=3000
CFG
  echo "   -> đã tạo $CONF (hãy sửa SUBDOMAIN và LOCAL_PORT cho đúng)"
else
  echo "   -> giữ nguyên $CONF đã có"
fi

echo "==> 4) Tạo systemd service"
cat > "$UNIT" <<UNITEOF
[Unit]
Description=sish background tunnel to entry.io.vn
After=network-online.target
Wants=network-online.target

[Service]
EnvironmentFile=$CONF
Environment=AUTOSSH_GATETIME=0
ExecStart=/usr/bin/autossh -M 0 -N \\
  -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \\
  -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=accept-new \\
  -o UserKnownHostsFile=$CONF_DIR/known_hosts \\
  -i $KEY -p \${SISH_PORT} \\
  -R \${SUBDOMAIN}:80:\${LOCAL_HOST}:\${LOCAL_PORT} \${SISH_HOST}
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
UNITEOF

systemctl daemon-reload
systemctl enable sish-tunnel >/dev/null 2>&1 || true

echo
echo "============================================================"
echo " GẦN XONG! Còn 2 bước:"
echo "------------------------------------------------------------"
echo " (a) Gửi PUBLIC KEY dưới đây cho admin để thêm vào sish:"
echo
echo "   $(cat "$KEY.pub")"
echo
echo " (b) Sau khi key đã được thêm, sửa $CONF (SUBDOMAIN/LOCAL_PORT)"
echo "     rồi khởi động:"
echo "        sudo systemctl restart sish-tunnel"
echo "        sudo systemctl status sish-tunnel --no-pager"
echo
echo " Khi chạy OK, service sẽ ở: https://<SUBDOMAIN>.entry.io.vn"
echo " Xem log: journalctl -u sish-tunnel -f"
echo "============================================================"
