#!/usr/bin/env bash
set -euo pipefail
test "${EUID}" -eq 0 || { echo "Execute como root."; exit 1; }
test -n "${ZFILA_PAIRING_CODE:-}" || { echo "Defina ZFILA_PAIRING_CODE."; exit 1; }
server_url="${ZFILA_URL:-https://zfila.com}"
case "$server_url" in https://*) ;; *) echo "ZFILA_URL deve usar HTTPS." >&2; exit 2;; esac
install -d -m 0750 -o root -g root /opt/zfila-edge
install -d -m 0700 -o root -g root /var/lib/zfila-edge
install -d -m 0750 -o root -g root /opt/zfila-edge/public
curl -fsS "$server_url/edge-agent/edge-agent.js" -o /opt/zfila-edge/edge-agent.js
curl -fsS "$server_url/edge-agent/printer-provider.js" -o /opt/zfila-edge/printer-provider.js
curl -fsS "$server_url/edge-agent/release-verifier.js" -o /opt/zfila-edge/release-verifier.js
curl -fsS "$server_url/edge-agent/updater.js" -o /opt/zfila-edge/updater.js
curl -fsS "$server_url/edge-agent/media-downloader.js" -o /opt/zfila-edge/media-downloader.js
for file in edge.html edge.css edge.js; do curl -fsS "$server_url/edge-agent/public/$file" -o "/opt/zfila-edge/public/$file"; done
curl -fsS "$server_url/voice.js" -o /opt/zfila-edge/public/voice.js
curl -fsS "$server_url/logo.png" -o /opt/zfila-edge/public/logo.png
edge_bind="${ZFILA_EDGE_BIND:-127.0.0.1}"
edge_key="${ZFILA_EDGE_LOCAL_KEY:-}"
if test "$edge_bind" != "127.0.0.1" && test "${#edge_key}" -lt 16; then echo "Defina ZFILA_EDGE_LOCAL_KEY com pelo menos 16 caracteres para acesso pela rede." >&2; exit 3; fi
printer_provider="${ZFILA_PRINTER_PROVIDER:-}"
if test -n "${ZFILA_PRINTER_HOST:-}" && test -z "$printer_provider"; then printer_provider=ESC_POS_NETWORK; fi
case "$printer_provider" in ''|ESC_POS_NETWORK|ESC_POS_USB|ESC_POS_BLUETOOTH) ;; *) echo "ZFILA_PRINTER_PROVIDER inválido." >&2; exit 4;; esac
chmod 0750 /opt/zfila-edge/edge-agent.js
chmod 0640 /opt/zfila-edge/printer-provider.js
chmod 0640 /opt/zfila-edge/release-verifier.js
chmod 0640 /opt/zfila-edge/updater.js
chmod 0640 /opt/zfila-edge/media-downloader.js
cat >/opt/zfila-edge/status.sh <<'EOF'
#!/usr/bin/env bash
set -u
port="${ZFILA_EDGE_PORT:-3210}"
echo "Serviço: $(systemctl is-active zfila-edge.service 2>/dev/null || true)"
echo "Arranque automático: $(systemctl is-enabled zfila-edge.service 2>/dev/null || true)"
echo "Saúde local:"
curl --max-time 3 -fsS "http://127.0.0.1:${port}/health" 2>/dev/null || echo '{"status":"sem resposta"}'
echo
echo "Últimos eventos:"
journalctl -u zfila-edge.service -n 10 --no-pager 2>/dev/null || true
EOF
chmod 0750 /opt/zfila-edge/status.sh
cat >/etc/systemd/system/zfila-edge.service <<EOF
[Unit]
Description=ZFila Edge local contingency
After=network-online.target
[Service]
Type=simple
Environment=ZFILA_URL=${server_url}
Environment=ZFILA_EDGE_DATA=/var/lib/zfila-edge
Environment=ZFILA_EDGE_PUBLIC=/opt/zfila-edge/public
Environment=ZFILA_EDGE_BIND=${edge_bind}
${edge_key:+Environment=ZFILA_EDGE_LOCAL_KEY=${edge_key}}
Environment=ZFILA_PAIRING_CODE=${ZFILA_PAIRING_CODE}
${printer_provider:+Environment=ZFILA_PRINTER_PROVIDER=${printer_provider}}
${ZFILA_PRINTER_HOST:+Environment=ZFILA_PRINTER_HOST=${ZFILA_PRINTER_HOST}}
${ZFILA_PRINTER_HOST:+Environment=ZFILA_PRINTER_PORT=${ZFILA_PRINTER_PORT:-9100}}
${ZFILA_PRINTER_DEVICE:+Environment=ZFILA_PRINTER_DEVICE=${ZFILA_PRINTER_DEVICE}}
ExecStart=/usr/bin/node /opt/zfila-edge/edge-agent.js
Restart=always
RestartSec=3
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/lib/zfila-edge
ReadWritePaths=/opt/zfila-edge
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now zfila-edge.service
sed -i '/ZFILA_PAIRING_CODE=/d' /etc/systemd/system/zfila-edge.service
systemctl daemon-reload
echo "ZFila Edge instalado. Consulte: systemctl status zfila-edge"
echo "Portal local: http://$(hostname -I | awk '{print $1}'):${ZFILA_EDGE_PORT:-3210}/"
echo "Diagnóstico: sudo /opt/zfila-edge/status.sh"
if test -n "${ZFILA_PRINTER_HOST:-}"; then echo "ESC/POS: ${ZFILA_PRINTER_HOST}:${ZFILA_PRINTER_PORT:-9100}"; fi
if test -n "${ZFILA_PRINTER_DEVICE:-}"; then echo "ESC/POS ${ZFILA_PRINTER_PROVIDER:-USB}: ${ZFILA_PRINTER_DEVICE}"; fi
