op-packages/luci-app-partexp/root/usr/libexec/rpcd/partexp
github-actions[bot] 32600acc60 🌴 Sync 2026-03-05 23:51:42
2026-03-05 23:51:42 +08:00

228 lines
7.9 KiB
Bash
Executable File

#!/bin/sh
. /usr/share/libubox/jshn.sh
# 分区扩展服务
case "$1" in
list)
echo '{
"autopart": {
"description": "Execute automatic partition expansion"
},
"get_log": {
"description": "Get operation log",
"arguments": {
"position": "string"
}
},
"get_devices": {
"description": "Get available disk devices"
},
"get_status": {
"description": "Get operation status"
},
"save_config": {
"description": "Save configuration",
"arguments": {
"target_function": "string",
"target_disk": "string",
"keep_config": "string",
"format_type": "string"
}
}
}'
;;
call)
case "$2" in
autopart)
if [ -f "/var/run/partexp.lock" ]; then
echo '{"error": "Another operation is in progress"}'
return 1
fi
# 检查配置文件是否存在
if [ ! -f "/etc/config/partexp" ]; then
echo '{"error": "Configuration file not found. Please save settings first."}'
return 1
fi
# 创建锁文件
touch /var/run/partexp.lock
# 执行分区操作(后台异步执行)
{
# 清空日志文件
echo "" > /tmp/partexp.log
# 调用原 partexp 脚本
/usr/bin/partexp autopart > /tmp/partexp.log 2>&1
# 清理锁文件
rm -f /var/run/partexp.lock
} &
echo '{"success": true, "pid": "'$!'", "message": "Partition expansion started"}'
;;
get_log)
# 获取操作日志
read input
json_load "$input"
json_get_vars position
if [ ! -f "/tmp/partexp.log" ]; then
echo '{"log": "", "complete": true}'
return 0
fi
if [ -z "$position" ] || [ "$position" = "0" ]; then
# 从头读取
log_content=$(cat /tmp/partexp.log 2>/dev/null | tail -c 2048000)
new_position=$(stat -c%s /tmp/partexp.log 2>/dev/null || echo "0")
json_init
json_add_string "log" "$log_content"
json_add_boolean "complete" false
json_add_string "position" "$new_position"
json_dump
else
# 从指定位置读取
position=${position:-0}
file_size=$(stat -c%s /tmp/partexp.log 2>/dev/null || echo 0)
if [ "$position" -lt "$file_size" ]; then
log_content=$(tail -c +$((position + 1)) /tmp/partexp.log | head -c 2048000)
new_position=$((position + ${#log_content}))
json_init
json_add_string "log" "$log_content"
json_add_boolean "complete" false
json_add_string "position" "$new_position"
json_dump
else
json_init
json_add_string "log" ""
json_add_boolean "complete" true
json_add_string "position" "$position"
json_dump
fi
fi
;;
get_devices)
# 获取可用设备列表 - 仅磁盘
json_init
json_add_array "devices"
# 所有可能的磁盘设备模式
disk_patterns="
^sd[a-z]$
^mmcblk[0-9]+$
^nvme[0-9]+n[0-9]+$
^vd[a-z]$
^hd[a-z]$
^xvd[a-z]$
^ubd[a-z]+$
^dasd[a-z]+$
^cciss[0-9]+$
^ida[0-9]+$
^rd[0-9]+$
^mtdblock[0-9]+$
^nbd[0-9]+$
^zram[0-9]+$
"
for dev in /sys/class/block/*; do
dev_name=$(basename "$dev")
# 跳过分区、loop、dm 设备
if [ -f "$dev/partition" ] || [ -d "$dev/loop" ] || [ -d "$dev/dm" ]; then
continue
fi
# 检查是否为磁盘设备
is_disk=0
for pattern in $disk_patterns; do
if echo "$dev_name" | grep -qE "$pattern"; then
is_disk=1
break
fi
done
if [ $is_disk -eq 1 ]; then
size="0"
if [ -f "$dev/size" ]; then
size_sectors=$(cat "$dev/size")
size=$((size_sectors / 2048))
fi
json_add_object
json_add_string "name" "$dev_name"
json_add_string "dev" "/dev/$dev_name"
json_add_int "size" "$size"
json_close_object
fi
done
json_close_array
json_dump
;;
get_status)
# 获取操作状态
if [ -f "/var/run/partexp.lock" ]; then
echo '{"running": true}'
else
echo '{"running": false}'
fi
;;
save_config)
# 保存配置
read input
json_load "$input"
json_get_vars target_function target_disk keep_config format_type
# 验证参数
if [ -z "$target_function" ]; then
echo '{"error": "Missing target_function parameter"}'
return 1
fi
# 设置默认值
target_disk="${target_disk:-}"
keep_config="${keep_config:-0}"
format_type="${format_type:-0}"
# 构建配置内容
CONFIG_FILE="/etc/config/partexp"
mkdir -p "$(dirname "$CONFIG_FILE")"
cat > "$CONFIG_FILE" << EOF
# Auto-generated by partexp
config global global
option target_function '$target_function'
option target_disk '$target_disk'
option keep_config '$keep_config'
option format_type '$format_type'
EOF
if [ $? -eq 0 ]; then
echo '{"success": true, "message": "Configuration saved"}'
else
echo '{"error": "Failed to save configuration"}'
return 1
fi
;;
*)
echo '{"error": "Method not found"}'
;;
esac
;;
*)
echo '{"error": "Invalid action"}'
;;
esac