Files
devops/docker/paperless/plugins/docker_patch.sh
2026-01-11 11:50:55 +08:00

149 lines
4.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 定义文件替换对(数组形式,格式:源文件 目标文件)
# 可按需添加/删除行,每行一组 源文件 目标文件
FILE_PAIRS=(
"/usr/src/paperless/scripts/parsers.py" "/usr/src/paperless/src/paperless_tesseract/parsers.py"
# 示例:新增更多文件对
#"/usr/src/paperless/git_scripts/parse_filename.py" "/usr/src/paperless/scripts/parse_filename.py"
# "/path/to/source/file3" "/path/to/dest/file3"
# "/path/to/source/file4" "/path/to/dest/file4"
)
# 检查所有文件是否存在仅检查replace/check操作需要的文件
check_files_exist() {
local missing=0
local pair_count=${#FILE_PAIRS[@]}
# 遍历文件对步长2源文件、目标文件为一组
for ((i=0; i<pair_count; i+=2)); do
local source="${FILE_PAIRS[$i]}"
local dest="${FILE_PAIRS[$i+1]}"
# 根据操作类型检查对应文件
if [ "$1" = "replace" ] || [ "$1" = "check" ]; then
if [ ! -f "$source" ]; then
echo "错误:源文件不存在 - $source"
missing=1
fi
if [ ! -f "$dest" ]; then
echo "错误:目标文件不存在 - $dest"
missing=1
fi
elif [ "$1" = "rollback" ]; then
if [ ! -f "$dest.bak" ]; then
echo "警告:备份文件不存在(未执行过替换?) - $dest.bak"
missing=1
fi
fi
done
if [ $missing -eq 1 ] && [ "$1" != "rollback" ]; then
echo "错误:关键文件缺失,无法继续执行"
exit 1
fi
}
# 显示所有文件对的差异
show_diffs() {
local pair_count=${#FILE_PAIRS[@]}
echo "=== 开始检查文件差异 ==="
for ((i=0; i<pair_count; i+=2)); do
local source="${FILE_PAIRS[$i]}"
local dest="${FILE_PAIRS[$i+1]}"
echo -e "\n--- 检查 $dest <-> $source 的差异 ---"
diff -u "$dest" "$source" || true # 无差异时不报错
done
}
# 备份单个文件(添加 .bak 后缀,保留原权限)
backup_file() {
local file="$1"
local backup="$file.bak"
if [ -f "$backup" ]; then
echo "提示:旧备份文件已存在,将覆盖 - $backup"
rm -f "$backup"
fi
cp -a "$file" "$backup" # -a 保留权限、属性、时间戳等
echo "已备份:$file -> $backup"
}
# 替换所有文件对
replace_files() {
local pair_count=${#FILE_PAIRS[@]}
echo "=== 开始替换文件(先备份目标文件) ==="
for ((i=0; i<pair_count; i+=2)); do
local source="${FILE_PAIRS[$i]}"
local dest="${FILE_PAIRS[$i+1]}"
echo -e "\n--- 处理文件对:$source -> $dest ---"
backup_file "$dest"
cp -f "$source" "$dest"
echo "已替换:$source 覆盖 $dest"
done
echo -e "\n=== 替换完成,验证最终差异(应无差异) ==="
show_diffs
}
# 回滚替换操作(恢复 .bak 备份文件)
rollback_files() {
local pair_count=${#FILE_PAIRS[@]}
echo "=== 开始回滚替换操作 ==="
for ((i=0; i<pair_count; i+=2)); do
local dest="${FILE_PAIRS[$i+1]}"
local backup="$dest.bak"
echo -e "\n--- 处理回滚:$backup -> $dest ---"
if [ -f "$backup" ]; then
# 先备份当前文件(防止回滚出错)
cp -a "$dest" "$dest.rollback_temp" 2>/dev/null || true
# 恢复备份文件
mv -f "$backup" "$dest"
echo "已回滚:$dest 恢复为备份版本"
# 删除临时文件
rm -f "$dest.rollback_temp" 2>/dev/null || true
else
echo "跳过:备份文件不存在 - $backup"
fi
done
echo -e "\n=== 回滚操作执行完成 ==="
}
# 主逻辑
main() {
case "$1" in
check)
echo "=== 执行文件差异检查(不修改文件) ==="
check_files_exist "check"
show_diffs
;;
replace)
echo "=== 执行文件替换操作(自动备份) ==="
check_files_exist "replace"
replace_files
;;
rollback)
echo "=== 执行文件回滚操作(恢复备份) ==="
check_files_exist "rollback"
rollback_files
;;
*)
echo "用法:$0 [check|replace|rollback]"
echo " check - 仅检查所有文件对的差异,不做修改"
echo " replace - 备份所有目标文件并执行替换,完成后验证差异"
echo " rollback - 回滚替换操作(恢复 .bak 备份文件)"
exit 1
;;
esac
}
# 启动主逻辑
main "$1"