From 316d36a20eddce45638b6f3fc5d0328ec092ef9b Mon Sep 17 00:00:00 2001 From: hao Date: Tue, 17 Mar 2026 21:32:04 -0700 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0:=203=20=E4=B8=AA=E6=96=87?= =?UTF-8?q?=E4=BB=B6=20-=202026-03-17=2021:32:04?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ops/launchd/com.hao.websafe.autosync.plist | 29 +++++++++ scripts/install-autosync-launchagent.sh | 19 ++++++ scripts/sync-gitea.sh | 75 +++++++++++++++++++++- 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 ops/launchd/com.hao.websafe.autosync.plist create mode 100755 scripts/install-autosync-launchagent.sh diff --git a/ops/launchd/com.hao.websafe.autosync.plist b/ops/launchd/com.hao.websafe.autosync.plist new file mode 100644 index 00000000..f252dc56 --- /dev/null +++ b/ops/launchd/com.hao.websafe.autosync.plist @@ -0,0 +1,29 @@ + + + + + Label + com.hao.websafe.autosync + ProgramArguments + + /bin/bash + /Users/x/websafe/scripts/sync-gitea.sh + --autosync + + WorkingDirectory + /Users/x/websafe + StartInterval + 300 + RunAtLoad + + StandardOutPath + /Users/x/Library/Logs/websafe-autosync.out.log + StandardErrorPath + /Users/x/Library/Logs/websafe-autosync.err.log + EnvironmentVariables + + PATH + /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + + + diff --git a/scripts/install-autosync-launchagent.sh b/scripts/install-autosync-launchagent.sh new file mode 100755 index 00000000..8b0bb797 --- /dev/null +++ b/scripts/install-autosync-launchagent.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +set -euo pipefail + +PLIST_SOURCE="/Users/x/websafe/ops/launchd/com.hao.websafe.autosync.plist" +PLIST_TARGET="$HOME/Library/LaunchAgents/com.hao.websafe.autosync.plist" +LABEL="com.hao.websafe.autosync" +GUI_DOMAIN="gui/$(id -u)" + +mkdir -p "$HOME/Library/LaunchAgents" "$HOME/Library/Logs" +cp "$PLIST_SOURCE" "$PLIST_TARGET" + +launchctl bootout "$GUI_DOMAIN" "$PLIST_TARGET" >/dev/null 2>&1 || true +launchctl bootstrap "$GUI_DOMAIN" "$PLIST_TARGET" +launchctl enable "$GUI_DOMAIN/$LABEL" +launchctl kickstart -k "$GUI_DOMAIN/$LABEL" + +echo "Installed and started $LABEL" +echo "Plist: $PLIST_TARGET" diff --git a/scripts/sync-gitea.sh b/scripts/sync-gitea.sh index 8f62b2ff..121ca40c 100755 --- a/scripts/sync-gitea.sh +++ b/scripts/sync-gitea.sh @@ -18,6 +18,8 @@ REPO_DESC="${REPO_DESC:-授权攻防实验与研究知识库}" GITEA_TOKEN="${GITEA_TOKEN:-}" GIT_USER="${GIT_USER:-hao}" GIT_EMAIL="${GIT_EMAIL:-hao@users.noreply.git.hk.hao.work}" +AUTO_PUSH_MAIN="${AUTO_PUSH_MAIN:-1}" +LOCK_DIR="${REPO_DIR}/.git/.sync-gitea.lock" cd "$REPO_DIR" @@ -52,8 +54,17 @@ repo_git_url() { echo "${GITEA_URL}/${GIT_USER}/${REPO_NAME}.git" } +remote_repo_reachable() { + git ls-remote --exit-code origin HEAD >/dev/null 2>&1 +} + ensure_remote_repo() { - if curl -fsS ${GITEA_TOKEN:+-H} ${GITEA_TOKEN:+"Authorization: token ${GITEA_TOKEN}"} "$(repo_api_url)" >/dev/null 2>&1; then + if remote_repo_reachable; then + log_info "远程仓库可访问: ${GIT_USER}/${REPO_NAME}" + return 0 + fi + + if curl --connect-timeout 5 --max-time 15 -fsS ${GITEA_TOKEN:+-H} ${GITEA_TOKEN:+"Authorization: token ${GITEA_TOKEN}"} "$(repo_api_url)" >/dev/null 2>&1; then log_info "远程仓库已存在: ${GIT_USER}/${REPO_NAME}" return 0 fi @@ -77,6 +88,23 @@ EOF log_success "远程仓库创建完成" } +run_validations() { + log_info "运行校验: lab validate" + python3 "$REPO_DIR/scripts/lab/main.py" validate + log_info "运行校验: intel validate" + python3 "$REPO_DIR/scripts/intel/main.py" validate + log_success "校验通过" +} + +acquire_lock() { + if mkdir "$LOCK_DIR" 2>/dev/null; then + trap 'rm -rf "$LOCK_DIR"' EXIT + return 0 + fi + log_warning "检测到另一个同步任务正在运行,跳过本次执行" + return 1 +} + # 初始化仓库 init_repo() { log_info "初始化 Git 仓库..." @@ -117,6 +145,17 @@ init_repo() { # 提交更改 commit_changes() { log_info "检查更改..." + + if git status --porcelain | grep -q .; then + if [ "${SKIP_VALIDATE:-0}" != "1" ]; then + run_validations + else + log_warning "已跳过 validate" + fi + else + log_info "没有需要提交的更改" + return 0 + fi # 添加所有文件 git add -A @@ -168,6 +207,31 @@ push_changes() { log_error "推送失败" return 1 fi + + if [ "$AUTO_PUSH_MAIN" = "1" ]; then + if git ls-remote --exit-code --heads origin main >/dev/null 2>&1; then + git fetch origin main >/dev/null 2>&1 || true + if git merge-base --is-ancestor FETCH_HEAD HEAD; then + if [ -n "$GITEA_TOKEN" ]; then + git -c http.extraHeader="Authorization: token ${GITEA_TOKEN}" push origin HEAD:main + else + git push origin HEAD:main + fi + git branch -f main HEAD >/dev/null 2>&1 || true + log_success "main 已快进到当前提交" + else + log_warning "origin/main 不是当前 HEAD 的祖先,跳过 main 快进推送" + fi + else + if [ -n "$GITEA_TOKEN" ]; then + git -c http.extraHeader="Authorization: token ${GITEA_TOKEN}" push origin HEAD:main + else + git push origin HEAD:main + fi + git branch -f main HEAD >/dev/null 2>&1 || true + log_success "main 已创建并指向当前提交" + fi + fi } # 完整同步 @@ -177,6 +241,11 @@ full_sync() { push_changes } +auto_sync() { + acquire_lock || return 0 + full_sync +} + # 显示帮助 show_help() { echo "用法: $0 [选项]" @@ -185,6 +254,7 @@ show_help() { echo " --init 初始化 Git 仓库" echo " --commit 仅提交更改" echo " --push 仅推送到远程" + echo " --autosync 定时任务模式: 无并发锁 + 校验 + 提交 + 推送" echo " --ensure 检查远程仓库;不存在则创建" echo " --status 显示仓库状态" echo " --help 显示此帮助" @@ -223,6 +293,9 @@ case "${1:-}" in --push) push_changes ;; + --autosync) + auto_sync + ;; --ensure) init_repo ;;