mirror of
https://github.com/QYG2297248353/appstore-1panel.git
synced 2026-06-16 01:02:14 +08:00
Update README.md
This commit is contained in:
@@ -326,6 +326,171 @@ curl -sSL https://install.lifebus.top/pre_app_uninstall.sh | bash
|
|||||||
curl -sSL https://install.lifebus.top/local_app_uninstall.sh | bash
|
curl -sSL https://install.lifebus.top/local_app_uninstall.sh | bash
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 1Panel v2 (自动同步)
|
||||||
|
由于官方不支持自动同步本地应用,每次都需要用户手动去点击同步按钮。我们多次提交过意见,奈何没有得到官方重视。因此出了这个折中方案。
|
||||||
|
### 前置条件
|
||||||
|
1. API 密钥
|
||||||
|
请前往 `面板设置` >> `API 接口` 中生成 `接口密钥` 有效期填写 `0` 长期有效,白名单可以填写 `127.0.0.1`
|
||||||
|
### 创建计划任务
|
||||||
|
请将 `API_KEY` `PANEL_PORT` 填写为正确的值即可
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# 用户需填写的变量
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
API_KEY="面板API密钥"
|
||||||
|
PANEL_HOST="127.0.0.1"
|
||||||
|
PANEL_PORT="面板访问端口"
|
||||||
|
|
||||||
|
# 两个接口地址(不用动)
|
||||||
|
API_SYNC_LOCAL="/api/v2/apps/sync/local"
|
||||||
|
API_READ_FILE="/api/v2/files/read"
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# 工具函数
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
# 生成 UUID(Linux 通用方法)
|
||||||
|
gen_uuid() {
|
||||||
|
cat /proc/sys/kernel/random/uuid
|
||||||
|
}
|
||||||
|
|
||||||
|
# 生成 token
|
||||||
|
gen_token() {
|
||||||
|
local ts=$(date +%s)
|
||||||
|
local tk=$(echo -n "1panel${API_KEY}${ts}" | md5sum | awk '{print $1}')
|
||||||
|
echo "${tk},${ts}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 判断系统是否有 jq
|
||||||
|
HAS_JQ=0
|
||||||
|
if command -v jq >/dev/null 2>&1; then
|
||||||
|
HAS_JQ=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# 主逻辑开始
|
||||||
|
#############################################
|
||||||
|
|
||||||
|
TASK_ID=$(gen_uuid)
|
||||||
|
echo "📌 生成 Task ID: ${TASK_ID}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
TOKEN_INFO=$(gen_token)
|
||||||
|
TOKEN=$(echo "$TOKEN_INFO" | cut -d',' -f1)
|
||||||
|
TIMESTAMP=$(echo "$TOKEN_INFO" | cut -d',' -f2)
|
||||||
|
|
||||||
|
echo "📌 时间戳: $TIMESTAMP"
|
||||||
|
echo "📌 Token: $TOKEN"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
# STEP 1 — 触发同步任务
|
||||||
|
#################################################
|
||||||
|
echo "🚀 STEP 1: 调用接口 1 开始同步任务..."
|
||||||
|
echo "POST http://${PANEL_HOST}:${PANEL_PORT}${API_SYNC_LOCAL}"
|
||||||
|
|
||||||
|
RESP1=$(curl -s -X POST "http://${PANEL_HOST}:${PANEL_PORT}${API_SYNC_LOCAL}" \
|
||||||
|
-H "1Panel-Token: ${TOKEN}" \
|
||||||
|
-H "1Panel-Timestamp: ${TIMESTAMP}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"taskID\":\"${TASK_ID}\"}")
|
||||||
|
|
||||||
|
echo "返回内容:$RESP1"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
CODE1=$(echo "$RESP1" | grep -o '"code":[0-9]*' | cut -d: -f2)
|
||||||
|
if [ "$CODE1" != "200" ]; then
|
||||||
|
echo "❌ 启动任务失败,停止执行!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ 任务启动成功!"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
#################################################
|
||||||
|
# STEP 2 — 轮询任务日志接口(含 jq / 无 jq 双模式)
|
||||||
|
#################################################
|
||||||
|
echo "🚀 STEP 2: 查询任务执行状态..."
|
||||||
|
echo "POST http://${PANEL_HOST}:${PANEL_PORT}${API_READ_FILE}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
LAST_LINE_COUNT=0
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
TOKEN_INFO=$(gen_token)
|
||||||
|
TOKEN=$(echo "$TOKEN_INFO" | cut -d',' -f1)
|
||||||
|
TIMESTAMP=$(echo "$TOKEN_INFO" | cut -d',' -f2)
|
||||||
|
|
||||||
|
RESP2=$(curl -s -X POST "http://${PANEL_HOST}:${PANEL_PORT}${API_READ_FILE}" \
|
||||||
|
-H "1Panel-Token: ${TOKEN}" \
|
||||||
|
-H "1Panel-Timestamp: ${TIMESTAMP}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{\"id\":0,\"type\":\"task\",\"name\":\"\",\"page\":1,\"pageSize\":500,\"latest\":true,\"taskID\":\"${TASK_ID}\",\"taskType\":\"\",\"taskOperate\":\"\",\"resourceID\":0}")
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# 有 jq:强力 JSON 解析模式
|
||||||
|
#############################################
|
||||||
|
if [ $HAS_JQ -eq 1 ]; then
|
||||||
|
|
||||||
|
mapfile -t LINES < <(echo "$RESP2" | jq -r '.data.lines[]')
|
||||||
|
|
||||||
|
TOTAL_LINES=${#LINES[@]}
|
||||||
|
if [ $TOTAL_LINES -gt $LAST_LINE_COUNT ]; then
|
||||||
|
for ((i=LAST_LINE_COUNT; i<TOTAL_LINES; i++)); do
|
||||||
|
echo "${LINES[$i]}"
|
||||||
|
done
|
||||||
|
LAST_LINE_COUNT=$TOTAL_LINES
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "$RESP2" | jq -e '.data.lines[] | select(contains("[TASK-END]"))' >/dev/null; then
|
||||||
|
STATUS=$(echo "$RESP2" | jq -r '.data.taskStatus')
|
||||||
|
echo ""
|
||||||
|
echo "🎉🎉🎉 任务已结束!检测到 [TASK-END]"
|
||||||
|
echo "执行状态:$STATUS"
|
||||||
|
echo ""
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
#############################################
|
||||||
|
# 无 jq:兼容模式(grep + sed + awk)
|
||||||
|
#############################################
|
||||||
|
else
|
||||||
|
LINES_BLOCK=$(echo "$RESP2" | sed -n '/"lines": \[/,/\]/p' | sed '1d;$d')
|
||||||
|
|
||||||
|
mapfile -t LINES < <(
|
||||||
|
echo "$LINES_BLOCK" |
|
||||||
|
sed 's/^[[:space:]]*"//;s/"[[:space:]]*,\?$//'
|
||||||
|
)
|
||||||
|
|
||||||
|
TOTAL_LINES=${#LINES[@]}
|
||||||
|
|
||||||
|
if [ $TOTAL_LINES -gt $LAST_LINE_COUNT ]; then
|
||||||
|
for ((i=LAST_LINE_COUNT; i<TOTAL_LINES; i++)); do
|
||||||
|
echo "${LINES[$i]}"
|
||||||
|
done
|
||||||
|
LAST_LINE_COUNT=$TOTAL_LINES
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$LINES_BLOCK" | grep -q "\[TASK-END\]"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
STATUS=$(echo "$RESP2" | grep -o '"taskStatus"[[:space:]]*:[[:space:]]*"[^"]*' | sed 's/.*"//')
|
||||||
|
echo ""
|
||||||
|
echo "🎉🎉🎉 任务已结束!检测到 [TASK-END]"
|
||||||
|
echo "执行状态:${STATUS:-Unknown}"
|
||||||
|
echo ""
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 3
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## DPanel 导入应用商店
|
## DPanel 导入应用商店
|
||||||
|
|
||||||
> 温馨提示:
|
> 温馨提示:
|
||||||
|
|||||||
Reference in New Issue
Block a user