更新: 3 个文件 - 2026-03-17 21:32:04
这个提交包含在:
@@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>com.hao.websafe.autosync</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/bin/bash</string>
|
||||||
|
<string>/Users/x/websafe/scripts/sync-gitea.sh</string>
|
||||||
|
<string>--autosync</string>
|
||||||
|
</array>
|
||||||
|
<key>WorkingDirectory</key>
|
||||||
|
<string>/Users/x/websafe</string>
|
||||||
|
<key>StartInterval</key>
|
||||||
|
<integer>300</integer>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
<key>StandardOutPath</key>
|
||||||
|
<string>/Users/x/Library/Logs/websafe-autosync.out.log</string>
|
||||||
|
<key>StandardErrorPath</key>
|
||||||
|
<string>/Users/x/Library/Logs/websafe-autosync.err.log</string>
|
||||||
|
<key>EnvironmentVariables</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -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"
|
||||||
@@ -18,6 +18,8 @@ REPO_DESC="${REPO_DESC:-授权攻防实验与研究知识库}"
|
|||||||
GITEA_TOKEN="${GITEA_TOKEN:-}"
|
GITEA_TOKEN="${GITEA_TOKEN:-}"
|
||||||
GIT_USER="${GIT_USER:-hao}"
|
GIT_USER="${GIT_USER:-hao}"
|
||||||
GIT_EMAIL="${GIT_EMAIL:-hao@users.noreply.git.hk.hao.work}"
|
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"
|
cd "$REPO_DIR"
|
||||||
|
|
||||||
@@ -52,8 +54,17 @@ repo_git_url() {
|
|||||||
echo "${GITEA_URL}/${GIT_USER}/${REPO_NAME}.git"
|
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() {
|
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}"
|
log_info "远程仓库已存在: ${GIT_USER}/${REPO_NAME}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@@ -77,6 +88,23 @@ EOF
|
|||||||
log_success "远程仓库创建完成"
|
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() {
|
init_repo() {
|
||||||
log_info "初始化 Git 仓库..."
|
log_info "初始化 Git 仓库..."
|
||||||
@@ -118,6 +146,17 @@ init_repo() {
|
|||||||
commit_changes() {
|
commit_changes() {
|
||||||
log_info "检查更改..."
|
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
|
git add -A
|
||||||
|
|
||||||
@@ -168,6 +207,31 @@ push_changes() {
|
|||||||
log_error "推送失败"
|
log_error "推送失败"
|
||||||
return 1
|
return 1
|
||||||
fi
|
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
|
push_changes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto_sync() {
|
||||||
|
acquire_lock || return 0
|
||||||
|
full_sync
|
||||||
|
}
|
||||||
|
|
||||||
# 显示帮助
|
# 显示帮助
|
||||||
show_help() {
|
show_help() {
|
||||||
echo "用法: $0 [选项]"
|
echo "用法: $0 [选项]"
|
||||||
@@ -185,6 +254,7 @@ show_help() {
|
|||||||
echo " --init 初始化 Git 仓库"
|
echo " --init 初始化 Git 仓库"
|
||||||
echo " --commit 仅提交更改"
|
echo " --commit 仅提交更改"
|
||||||
echo " --push 仅推送到远程"
|
echo " --push 仅推送到远程"
|
||||||
|
echo " --autosync 定时任务模式: 无并发锁 + 校验 + 提交 + 推送"
|
||||||
echo " --ensure 检查远程仓库;不存在则创建"
|
echo " --ensure 检查远程仓库;不存在则创建"
|
||||||
echo " --status 显示仓库状态"
|
echo " --status 显示仓库状态"
|
||||||
echo " --help 显示此帮助"
|
echo " --help 显示此帮助"
|
||||||
@@ -223,6 +293,9 @@ case "${1:-}" in
|
|||||||
--push)
|
--push)
|
||||||
push_changes
|
push_changes
|
||||||
;;
|
;;
|
||||||
|
--autosync)
|
||||||
|
auto_sync
|
||||||
|
;;
|
||||||
--ensure)
|
--ensure)
|
||||||
init_repo
|
init_repo
|
||||||
;;
|
;;
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户