Files
fnos-gitea-sync/GiteaHubSync/app/ui/index.cgi
T
cbb 4d6f71af5b feat: GiteaHubSync v1.0.0 — fnOS 原生应用:Gitea→GitHub 镜像同步
- 每次推送到飞牛 Gitea(3000 端口)的代码 10 秒内自动镜像到 GitHub 7 个私有仓库
  (SMB_Android / DCU_APP / GD32E50X_BOOT / DCU_DesktopController / Motor_v2 /
  DCU_ECAT_Master / GD32_BOOT),真镜像语义(删分支/标签同步删)
- 标准 .fpk 原生应用:不进 Docker,依赖 python312,安装后进入应用中心已安装列表
  和桌面启动台,支持启动/停止/重启/卸载,NAS 重启自动恢复
- 控制面板(:8899):自动同步开关、立即同步、仓库状态、同步日志、打开 Gitea
- GitHub 推送走 SSH 22 端口直连(HTTPS 443 本地网络被断),部署私钥随应用本地分发
- 附 fnos-install.js(命令行自动安装)、build.sh(重新构建 fpk)、genicon.py(图标生成)

注意:GitHub 部署私钥(GiteaHubSync/app/ssh/id_ed25519)与打包产物 .fpk
按 .gitignore 规则不进仓库,仅保留在工作目录本地分发。
2026-10-13 19:12:49 +08:00

60 lines
2.0 KiB
Bash

#!/bin/bash
# GiteaHubSync CGI 入口:把控制面板(127.0.0.1:8899)代理到飞牛同源路径下,
# 使桌面图标 iframe 可以直接打开面板(避免 http/https 混合内容问题)。
# 完整转发 HTTP 方法、Content-Type 与请求体(POST /api/toggle、/api/sync 等)。
PANEL="http://127.0.0.1:8899"
APP_SLUG="GiteaHubSync"
URI_NO_QUERY="${REQUEST_URI%%\?*}"
REL_PATH="/"
case "$URI_NO_QUERY" in
*index.cgi*) REL_PATH="${URI_NO_QUERY#*index.cgi}" ;;
esac
REL_PATH="${REL_PATH#/}"
[ -z "$REL_PATH" ] && REL_PATH="/"
case "$REL_PATH" in /*) ;; *) REL_PATH="/$REL_PATH" ;; esac
METHOD="${REQUEST_METHOD:-GET}"
CTYPE="${CONTENT_TYPE:-application/json}"
HDR="$(mktemp)"; BODY="$(mktemp)"; INBODY=""
CURL_ARGS=(-s -m 120 -X "$METHOD" -H "Content-Type: $CTYPE")
case "$METHOD" in
POST|PUT|PATCH)
CL="${CONTENT_LENGTH:-0}"
if [ "$CL" -gt 0 ] 2>/dev/null; then
INBODY="$(mktemp)"
head -c "$CL" > "$INBODY"
CURL_ARGS+=(--data-binary "@$INBODY")
fi
;;
esac
curl "${CURL_ARGS[@]}" -D "$HDR" -o "$BODY" "${PANEL}${REL_PATH}"
rc=$?
[ -n "$INBODY" ] && rm -f "$INBODY"
if [ $rc -ne 0 ]; then
rm -f "$HDR" "$BODY"
printf 'Status: 503 Service Unavailable\r\n'
printf 'Content-Type: text/html; charset=utf-8\r\n\r\n'
printf '<html><body style="font-family:sans-serif;padding:40px"><h3>同步服务未运行</h3><p>请到飞牛 应用中心 → 已安装 → GiteaHubSync 中启动应用。</p></body></html>\n'
exit 0
fi
CTYPE_OUT="$(grep -i '^content-type:' "$HDR" | head -1 | cut -d' ' -f2 | tr -d '\r')"
[ -z "$CTYPE_OUT" ] && CTYPE_OUT="text/html; charset=utf-8"
printf 'Content-Type: %s\r\n' "$CTYPE_OUT"
printf 'Cache-Control: no-store\r\n'
printf '\r\n'
case "$CTYPE_OUT" in
text/html*)
# 注入 <base>,让页面里的相对路径 API 请求落在本 CGI 前缀下
sed "s|<head>|<head><base href=\"/cgi/ThirdParty/${APP_SLUG}/index.cgi/\">|" "$BODY"
;;
*)
cat "$BODY"
;;
esac
rm -f "$HDR" "$BODY"
exit 0