chore: 针对备份及还原处理
This commit is contained in:
126
scripts/patch_tools/patch_fnc.sh
Normal file
126
scripts/patch_tools/patch_fnc.sh
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/bin/bash
|
||||
# patch_fnc.sh - 企业级增量补丁包生成脚本公共函数
|
||||
# 用于并行查找,提供给xargs使用
|
||||
|
||||
|
||||
# 文件工具函数
|
||||
parse_size() {
|
||||
local size_str="$1"
|
||||
local unit=$(echo "$size_str" | sed 's/[0-9.]//g' | tr 'a-z' 'A-Z')
|
||||
local value=$(echo "$size_str" | sed 's/[^0-9.]//g')
|
||||
|
||||
case "$unit" in
|
||||
"KB") echo "$(echo "$value * 1024" | bc)" ;;
|
||||
"MB") echo "$(echo "$value * 1024 * 1024" | bc)" ;;
|
||||
"GB") echo "$(echo "$value * 1024 * 1024 * 1024" | bc)" ;;
|
||||
*) echo "$value" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
get_file_hash() {
|
||||
local file_path="$1"
|
||||
local algorithm="${2:-sha256}"
|
||||
|
||||
case "$algorithm" in
|
||||
"md5") md5sum "$file_path" | cut -d' ' -f1 ;;
|
||||
"sha1") sha1sum "$file_path" | cut -d' ' -f1 ;;
|
||||
"sha256") sha256sum "$file_path" | cut -d' ' -f1 ;;
|
||||
*) sha256sum "$file_path" | cut -d' ' -f1 ;;
|
||||
esac
|
||||
}
|
||||
|
||||
get_file_info() {
|
||||
local file_path="$1"
|
||||
|
||||
if [[ ! -f "$file_path" ]]; then
|
||||
error "文件不存在: $file_path"
|
||||
return 1
|
||||
fi
|
||||
|
||||
local stat_output
|
||||
if stat --version 2>&1 | grep -q GNU; then
|
||||
# GNU stat
|
||||
stat_output=$(stat -c "%s|%Y|%Z|%a|%u|%g" "$file_path")
|
||||
else
|
||||
# BSD stat
|
||||
stat_output=$(stat -f "%z|%m|%c|%p|%u|%g" "$file_path")
|
||||
fi
|
||||
|
||||
echo "$stat_output"
|
||||
}
|
||||
|
||||
# 文件筛选
|
||||
should_include_file() {
|
||||
local file_path="$1"
|
||||
local file_info="$2"
|
||||
|
||||
IFS='|' read -r size mtime ctime permissions uid gid <<< "$file_info"
|
||||
|
||||
# 文件大小过滤
|
||||
local max_size=$(parse_size "$MAX_FILE_SIZE")
|
||||
local min_size=$(parse_size "$MIN_FILE_SIZE")
|
||||
|
||||
if [[ $size -gt $max_size ]] || [[ $size -lt $min_size ]]; then
|
||||
warn "文件大小超出范围: $file_path ($size bytes, 限制:$min_size-$max_size bytes)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 包含模式匹配
|
||||
local include_match=false
|
||||
for pattern in "${INCLUDE_PATTERNS[@]}"; do
|
||||
if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then
|
||||
include_match=true
|
||||
debug "文件匹配包含模式<$pattern>: $file_path"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ ${#INCLUDE_PATTERNS[@]} -gt 0 ]] && ! $include_match; then
|
||||
warn "文件不匹配任何包含模式: $file_path"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 排除模式匹配
|
||||
for pattern in "${EXCLUDE_PATTERNS[@]}"; do
|
||||
if [[ "$file_path" == $pattern ]] || [[ "$file_path" =~ $pattern ]]; then
|
||||
warn "文件匹配排除模式<$pattern>: $file_path"
|
||||
return 1
|
||||
fi
|
||||
done
|
||||
|
||||
# 时间过滤
|
||||
if [[ -n "$MODIFIED_AFTER" ]]; then
|
||||
local filter_time=$(date -d "$MODIFIED_AFTER" +%s 2>/dev/null || date +%s)
|
||||
if [[ $mtime -lt $filter_time ]]; then
|
||||
local mtime_str=$(date -d @$mtime +"%Y-%m-%d %H:%M:%S")
|
||||
warn "文件修改时间过早: $file_path ($mtime_str)"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 权限过滤
|
||||
if [[ "$PERMISSIONS_FILTER" == "true" ]]; then
|
||||
if [[ $permissions -ne 644 ]] && [[ $permissions -ne 755 ]]; then
|
||||
warn "文件权限不符合要求: $file_path ($permissions)"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 用户过滤
|
||||
if [[ "$UID_FILTER" == "true" ]]; then
|
||||
if [[ $uid -ne 0 ]] && [[ $uid -ne 1000 ]]; then
|
||||
warn "文件所有者不符合要求: $file_path ($uid)"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 组过滤
|
||||
if [[ "$GID_FILTER" == "true" ]]; then
|
||||
if [[ $gid -ne 0 ]] && [[ $gid -ne 1000 ]]; then
|
||||
warn "文件组不符合要求: $file_path ($gid)"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
Reference in New Issue
Block a user