mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-07-28 12:02:00 +08:00
228 lines
7.9 KiB
Bash
Executable File
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 |