Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fe9ec13323 | |||
| 3f83643cb2 | |||
| 8fa54c5ae3 | |||
| 6aa3a55f32 | |||
| 3d77814af4 | |||
| cfd573c5c8 | |||
| a9b7f09e06 | |||
| 2b5026d76c |
@@ -0,0 +1,30 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# 根目录配置文件
|
||||
root = true
|
||||
|
||||
|
||||
# 默认规则
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
|
||||
# Shell scripts
|
||||
[*.sh]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
|
||||
# Markdown documents
|
||||
[*.md]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
|
||||
[*.{json,yml,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
@@ -0,0 +1,62 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 安装 Image Builder 构建所需依赖
|
||||
install_dependencies() {
|
||||
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
|
||||
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
|
||||
}
|
||||
|
||||
# =============================================================
|
||||
# 交互输入函数
|
||||
# 参数1: 提示信息
|
||||
# 参数2: 默认值
|
||||
# 返回: 用户输入值,直接回车返回默认值
|
||||
# =============================================================
|
||||
ask_input() {
|
||||
local prompt="$1"
|
||||
local default="$2"
|
||||
|
||||
read -p "${prompt} [ 默认: ${default} ]: " value
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "$default"
|
||||
else
|
||||
echo "$value"
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取lan口ip
|
||||
input_lan_ip() {
|
||||
local default_ip="$1"
|
||||
|
||||
while true; do
|
||||
local ip
|
||||
|
||||
ip=$(ask_input "请输入lan口ip" "$default_ip")
|
||||
|
||||
if valid_ipv4 "$ip"; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo "[错误] IP地址格式不正确,请重新输入" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
valid_ipv4() {
|
||||
local ip="$1"
|
||||
|
||||
# 第一层:检查格式,必须是4段数字
|
||||
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
|
||||
|
||||
# 第二层:检查每段范围
|
||||
echo "$ip" | awk -F. '
|
||||
$1>=0 && $1<=255 &&
|
||||
$2>=0 && $2<=255 &&
|
||||
$3>=0 && $3<=255 &&
|
||||
$4>=0 && $4<=255
|
||||
' | grep -q . || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
+41
-89
@@ -1,10 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
install_dependencies() {
|
||||
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
|
||||
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
|
||||
}
|
||||
source common.sh
|
||||
|
||||
download_imagebuilder() {
|
||||
local version="$1"
|
||||
@@ -49,7 +46,12 @@ build() {
|
||||
# ────────────────────────────────────────────
|
||||
# lan口ip
|
||||
# ────────────────────────────────────────────
|
||||
LAN_IP=${2}
|
||||
LAN_IP="${2}"
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# =============================================================
|
||||
PACKAGES="${3}"
|
||||
|
||||
# =============================================================
|
||||
# 固件输出目录
|
||||
@@ -62,25 +64,6 @@ build() {
|
||||
# =============================================================
|
||||
EXTRA_IMAGE_NAME="hc5962"
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表(按需增删)
|
||||
# =============================================================
|
||||
PKG_LIST=(
|
||||
vim
|
||||
nano-full
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
|
||||
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
|
||||
|
||||
# =============================================================
|
||||
# 颜色输出
|
||||
# =============================================================
|
||||
@@ -102,15 +85,6 @@ build() {
|
||||
|
||||
mkdir -p "$FILES_DIR"
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
# =============================================================
|
||||
# 复制自定义 files 目录(如果存在)
|
||||
# =============================================================
|
||||
@@ -118,6 +92,15 @@ build() {
|
||||
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
|
||||
fi
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
|
||||
# =============================================================
|
||||
# 校验 ImageBuilder 环境
|
||||
@@ -156,61 +139,6 @@ build() {
|
||||
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
|
||||
}
|
||||
|
||||
# =============================================================
|
||||
# 交互输入函数
|
||||
# 参数1: 提示信息
|
||||
# 参数2: 默认值
|
||||
# 返回: 用户输入值,直接回车返回默认值
|
||||
# =============================================================
|
||||
ask_input() {
|
||||
local prompt="$1"
|
||||
local default="$2"
|
||||
|
||||
read -p "${prompt} [ 默认: ${default} ]: " value
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "$default"
|
||||
else
|
||||
echo "$value"
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取lan口ip
|
||||
input_lan_ip() {
|
||||
local default_ip="$1"
|
||||
|
||||
while true; do
|
||||
local ip
|
||||
|
||||
ip=$(ask_input "请输入lan口ip" "$default_ip")
|
||||
|
||||
if valid_ipv4 "$ip"; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo "[错误] IP地址格式不正确,请重新输入" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
valid_ipv4() {
|
||||
local ip="$1"
|
||||
|
||||
# 第一层:检查格式,必须是4段数字
|
||||
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
|
||||
|
||||
# 第二层:检查每段范围
|
||||
echo "$ip" | awk -F. '
|
||||
$1>=0 && $1<=255 &&
|
||||
$2>=0 && $2<=255 &&
|
||||
$3>=0 && $3<=255 &&
|
||||
$4>=0 && $4<=255
|
||||
' | grep -q . || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
|
||||
default_version="25.12.1"
|
||||
@@ -220,8 +148,32 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
|
||||
default_lan_ip="192.168.1.1"
|
||||
lan_ip=$(input_lan_ip "$default_lan_ip")
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
pkg_list=(
|
||||
vim
|
||||
nano-full
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
packages=$(printf "%s " "${pkg_list[@]}") # 动态拼接成字符串
|
||||
|
||||
# 进入项目根目
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
install_dependencies
|
||||
|
||||
builder_dir="$(download_imagebuilder "$version")"
|
||||
|
||||
build $builder_dir $lan_ip
|
||||
build "$builder_dir" "$lan_ip" "$packages"
|
||||
+43
-88
@@ -1,10 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
install_dependencies() {
|
||||
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
|
||||
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
|
||||
}
|
||||
source common.sh
|
||||
|
||||
download_imagebuilder() {
|
||||
local version="$1"
|
||||
@@ -32,24 +29,7 @@ download_imagebuilder() {
|
||||
echo "$(pwd)/$folder"
|
||||
}
|
||||
|
||||
# =============================================================
|
||||
# 交互输入函数
|
||||
# 参数1: 提示信息
|
||||
# 参数2: 默认值
|
||||
# 返回: 用户输入值,直接回车返回默认值
|
||||
# =============================================================
|
||||
ask_input() {
|
||||
local prompt="$1"
|
||||
local default="$2"
|
||||
|
||||
read -p "${prompt} [ 默认: ${default} ]: " value
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "$default"
|
||||
else
|
||||
echo "$value"
|
||||
fi
|
||||
}
|
||||
|
||||
build() {
|
||||
# =============================================================
|
||||
@@ -65,11 +45,16 @@ build() {
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
BUILDER_DIR="$1"
|
||||
|
||||
# ────────────────────────────────────────────
|
||||
# =============================================================
|
||||
# lan口ip
|
||||
# ────────────────────────────────────────────
|
||||
# =============================================================
|
||||
LAN_IP=${2}
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# =============================================================
|
||||
PACKAGES=${3}
|
||||
|
||||
# =============================================================
|
||||
# 固件输出目录
|
||||
# =============================================================
|
||||
@@ -81,25 +66,6 @@ build() {
|
||||
# =============================================================
|
||||
EXTRA_IMAGE_NAME="newifi3"
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表(按需增删)
|
||||
# =============================================================
|
||||
PKG_LIST=(
|
||||
vim
|
||||
nano-full
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
|
||||
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
|
||||
|
||||
# =============================================================
|
||||
# 颜色输出
|
||||
# =============================================================
|
||||
@@ -121,14 +87,6 @@ build() {
|
||||
|
||||
mkdir -p "$FILES_DIR"
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
# =============================================================
|
||||
# 复制自定义 files 目录(如果存在)
|
||||
@@ -137,6 +95,15 @@ build() {
|
||||
cp -rf "${SCRIPT_DIR}/files/." "$BUILDER_DIR/files/"
|
||||
fi
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
# =============================================================
|
||||
# 校验 ImageBuilder 环境
|
||||
# =============================================================
|
||||
@@ -174,43 +141,6 @@ build() {
|
||||
echo -e "固件输出: ${PROJECT_OUTPUT_DIR}"
|
||||
}
|
||||
|
||||
# 获取lan口ip
|
||||
input_lan_ip() {
|
||||
local default_ip="$1"
|
||||
|
||||
while true; do
|
||||
local ip
|
||||
|
||||
ip=$(ask_input "请输入lan口ip" "$default_ip")
|
||||
|
||||
if valid_ipv4 "$ip"; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo "[错误] IP地址格式不正确,请重新输入" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
valid_ipv4() {
|
||||
local ip="$1"
|
||||
|
||||
# 第一层:检查格式,必须是4段数字
|
||||
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
|
||||
|
||||
# 第二层:检查每段范围
|
||||
echo "$ip" | awk -F. '
|
||||
$1>=0 && $1<=255 &&
|
||||
$2>=0 && $2<=255 &&
|
||||
$3>=0 && $3<=255 &&
|
||||
$4>=0 && $4<=255
|
||||
' | grep -q . || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
|
||||
default_version="25.12.1"
|
||||
@@ -220,6 +150,31 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
|
||||
default_lan_ip="192.168.1.1"
|
||||
lan_ip=$(input_lan_ip "$default_lan_ip")
|
||||
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
pkg_list=(
|
||||
vim
|
||||
nano-full
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
packages=$(printf "%s " "${pkg_list[@]}") # 动态拼接成字符串
|
||||
|
||||
# 进入项目根目
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 安装依赖
|
||||
install_dependencies
|
||||
|
||||
@@ -227,4 +182,4 @@ install_dependencies
|
||||
builder_dir="$(download_imagebuilder "$version")"
|
||||
|
||||
# 构建固件
|
||||
build "$builder_dir" $lan_ip
|
||||
build "$builder_dir" "$lan_ip" "$packages"
|
||||
@@ -1,11 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 安装 Image Builder 构建所需依赖
|
||||
install_dependencies() {
|
||||
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
|
||||
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
|
||||
}
|
||||
source common.sh
|
||||
|
||||
# 下载并解压 FriendlyARM NanoPi R2S 的 Image Builder
|
||||
# 参数 1: ImmortalWrt 版本号,例如 25.12.1
|
||||
@@ -77,42 +73,10 @@ build(){
|
||||
# ────────────────────────────────────────────
|
||||
LAN_IP=${3}
|
||||
|
||||
# =============================================================
|
||||
# ────────────────────────────────────────────
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
PKG_LIST=(
|
||||
vim-full
|
||||
nano-plus
|
||||
bash
|
||||
curl
|
||||
shadow-chsh
|
||||
openssh-sftp-server
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
luci-i18n-firewall-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
|
||||
# 现代终端工具
|
||||
ripgrep
|
||||
diffutils
|
||||
less
|
||||
|
||||
# 分区扩容
|
||||
luci-i18n-diskman-zh-cn
|
||||
cfdisk
|
||||
resize2fs
|
||||
e2fsprogs
|
||||
losetup
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-daed-zh-cn
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
|
||||
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
|
||||
# ────────────────────────────────────────────
|
||||
PACKAGES="${4}"
|
||||
|
||||
GREEN="\033[0;32m"
|
||||
YELLOW="\033[1;33m"
|
||||
@@ -133,24 +97,22 @@ build(){
|
||||
|
||||
cd "$BUILDER_DIR"
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
mkdir -p "$FILES_DIR"
|
||||
# 复制 files 目录下的自定义文件到 Image Builder 的 files 目录
|
||||
if [ -d "${SCRIPT_DIR}/files" ]; then
|
||||
echo -e "${YELLOW}[提示] 复制自定义 files/ 目录到 Image Builder${NC}"
|
||||
cp ${SCRIPT_DIR}/files/* $BUILDER_DIR/files/ -rf
|
||||
else
|
||||
echo -e "${YELLOW}[提示] 未找到自定义 files/ 目录,跳过复制${NC}"
|
||||
fi
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
if [ ! -f "Makefile" ]; then
|
||||
echo -e "${RED}[错误] 未找到 Makefile,请在 imagebuilder 根目录下运行本脚本!${NC}"
|
||||
@@ -203,64 +165,6 @@ build(){
|
||||
fi
|
||||
}
|
||||
|
||||
# =============================================================
|
||||
# 交互输入函数
|
||||
# 参数1: 提示信息
|
||||
# 参数2: 默认值
|
||||
# 返回: 用户输入值,直接回车返回默认值
|
||||
# =============================================================
|
||||
ask_input() {
|
||||
local prompt="$1"
|
||||
local default="$2"
|
||||
|
||||
read -p "${prompt} [ 默认: ${default} ]: " value
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "$default"
|
||||
else
|
||||
echo "$value"
|
||||
fi
|
||||
}
|
||||
|
||||
# 获取lan口ip
|
||||
input_lan_ip() {
|
||||
local default_ip="$1"
|
||||
|
||||
while true; do
|
||||
local ip
|
||||
|
||||
ip=$(ask_input "请输入lan口ip" "$default_ip")
|
||||
|
||||
if valid_ipv4 "$ip"; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo "[错误] IP地址格式不正确,请重新输入" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
valid_ipv4() {
|
||||
local ip="$1"
|
||||
|
||||
# 第一层:检查格式,必须是4段数字
|
||||
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
|
||||
|
||||
# 第二层:检查每段范围
|
||||
echo "$ip" | awk -F. '
|
||||
$1>=0 && $1<=255 &&
|
||||
$2>=0 && $2<=255 &&
|
||||
$3>=0 && $3<=255 &&
|
||||
$4>=0 && $4<=255
|
||||
' | grep -q . || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 项目根目录,保证从任意位置执行 r2s.sh 都能找到其他资源
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
|
||||
default_version="25.12.1"
|
||||
version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
|
||||
@@ -269,12 +173,52 @@ version=$(ask_input "请输入 ImmortalWrt 版本" "$default_version")
|
||||
default_rootfs_partsize="600"
|
||||
rootfs_partsize=$(ask_input "请输入根分区大小(MB)" "$default_rootfs_partsize")
|
||||
|
||||
# 项目根目录
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# lan口ip
|
||||
default_lan_ip="192.168.1.1"
|
||||
lan_ip=$(input_lan_ip "$default_lan_ip")
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
pkg_list=(
|
||||
vim-full
|
||||
nano-plus
|
||||
bash
|
||||
curl
|
||||
shadow-chsh
|
||||
openssh-sftp-server
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
luci-i18n-firewall-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
|
||||
# 现代终端工具
|
||||
ripgrep
|
||||
diffutils
|
||||
less
|
||||
|
||||
# 分区扩容
|
||||
luci-i18n-diskman-zh-cn
|
||||
cfdisk
|
||||
resize2fs
|
||||
e2fsprogs
|
||||
losetup
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-daed-zh-cn
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
)
|
||||
packages=$(printf "%s " "${pkg_list[@]}") # 动态拼接成字符串
|
||||
|
||||
install_dependencies
|
||||
|
||||
builder_dir="$(download_imagebuilder "$version")"
|
||||
|
||||
build $builder_dir $rootfs_partsize $lan_ip
|
||||
build "$builder_dir" "$rootfs_partsize" "$lan_ip" "$packages"
|
||||
@@ -1,11 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# 安装 Image Builder 构建所需依赖
|
||||
install_dependencies() {
|
||||
sudo apt install -y build-essential libncurses-dev zlib1g-dev gawk git \
|
||||
gettext libssl-dev xsltproc rsync wget unzip python3 qemu-utils mkisofs zstd
|
||||
}
|
||||
source common.sh
|
||||
|
||||
# 下载并解压 x86-64 的 Image Builder
|
||||
# 参数 1: ImmortalWrt 版本号,例如 25.12.1
|
||||
@@ -74,52 +70,12 @@ build(){
|
||||
# ────────────────────────────────────────────
|
||||
# lan口ip
|
||||
# ────────────────────────────────────────────
|
||||
LAN_IP=${3}
|
||||
LAN_IP="${3}"
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
PKG_LIST=(
|
||||
-dropbear
|
||||
openssh-server
|
||||
|
||||
vim-full
|
||||
nano-plus
|
||||
bash
|
||||
curl
|
||||
shadow-chsh
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
luci-i18n-firewall-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
|
||||
# 现代终端工具
|
||||
ripgrep
|
||||
diffutils
|
||||
less
|
||||
eza
|
||||
fish
|
||||
|
||||
# 分区扩容
|
||||
luci-i18n-diskman-zh-cn
|
||||
cfdisk
|
||||
resize2fs
|
||||
e2fsprogs
|
||||
losetup
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-daed-zh-cn
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
|
||||
)
|
||||
|
||||
# 动态拼接成字符串
|
||||
PACKAGES=$(printf "%s " "${PKG_LIST[@]}")
|
||||
# ────────────────────────────────────────────
|
||||
# 插件包列表字符串
|
||||
# ────────────────────────────────────────────
|
||||
PACKAGES="${4}"
|
||||
|
||||
|
||||
# 颜色输出
|
||||
@@ -147,14 +103,6 @@ build(){
|
||||
mkdir -p "$FILES_DIR"
|
||||
fi
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${SCRIPT_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
# 复制 files 目录下的自定义文件到 Image Builder 的 files 目录
|
||||
if [ -d "${SCRIPT_DIR}/files" ]; then
|
||||
@@ -164,6 +112,15 @@ build(){
|
||||
echo -e "${YELLOW}[提示] 未找到自定义 files/ 目录,跳过复制${NC}"
|
||||
fi
|
||||
|
||||
# 如果存在 LAN IP 设置脚本,则修改默认 LAN 地址
|
||||
LAN_SETTING_FILE="${BUILDER_DIR}/files/etc/uci-defaults/98-network-setting"
|
||||
if [ -e "$LAN_SETTING_FILE" ]; then
|
||||
# 根据用户输入的 LAN_IP 修改默认 IP
|
||||
sed -i \
|
||||
"s/^update_lan_ip .*/update_lan_ip ${LAN_IP}/" \
|
||||
"$LAN_SETTING_FILE"
|
||||
fi
|
||||
|
||||
# 修改.config文件, 不构建以下格式固件
|
||||
sed -i \
|
||||
-e 's/^CONFIG_ISO_IMAGES=y/# CONFIG_ISO_IMAGES is not set/' \
|
||||
@@ -191,35 +148,8 @@ build(){
|
||||
EXTRA_IMAGE_NAME="$EXTRA_IMAGE_NAME" \
|
||||
${ROOTFS_PARTSIZE:+ROOTFS_PARTSIZE="$ROOTFS_PARTSIZE"} # ROOTFS_PARTSIZE 参数不为空才添加
|
||||
|
||||
# 构建结果判断
|
||||
if [ $? -eq 0 ]; then
|
||||
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
|
||||
if [ ! -d "$OUTPUT_DIR" ]; then
|
||||
echo -e "${RED} 未找到构建输出目录: ${OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -e "$PROJECT_OUTPUT_DIR" ]; then
|
||||
BACKUP_OUTPUT_DIR="${PROJECT_OUTPUT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
|
||||
if ! mv "$PROJECT_OUTPUT_DIR" "$BACKUP_OUTPUT_DIR"; then
|
||||
echo -e "${RED} 备份已有输出目录失败: ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${YELLOW} 已有输出目录,已备份到: ${BACKUP_OUTPUT_DIR}${NC}"
|
||||
fi
|
||||
|
||||
if ! mv "$OUTPUT_DIR" "$PROJECT_OUTPUT_DIR"; then
|
||||
echo -e "${RED} 移动构建输出目录失败: ${OUTPUT_DIR} -> ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo -e "${GREEN} 构建成功!${NC}"
|
||||
echo -e "${GREEN} 固件路径: ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
else
|
||||
# 构建失败
|
||||
if [ $? -ne 0 ]; then
|
||||
echo ""
|
||||
echo -e "${RED}========================================${NC}"
|
||||
echo -e "${RED} 构建失败,请检查上方错误日志${NC}"
|
||||
@@ -227,65 +157,37 @@ build(){
|
||||
exit 1
|
||||
fi
|
||||
|
||||
}
|
||||
# 构建成功
|
||||
if [ "$OUTPUT_DIR" != "$PROJECT_OUTPUT_DIR" ]; then
|
||||
if [ ! -d "$OUTPUT_DIR" ]; then
|
||||
echo -e "${RED} 未找到构建输出目录: ${OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# =============================================================
|
||||
# 交互输入函数
|
||||
# 参数1: 提示信息
|
||||
# 参数2: 默认值
|
||||
# 返回: 用户输入值,直接回车返回默认值
|
||||
# =============================================================
|
||||
ask_input() {
|
||||
local prompt="$1"
|
||||
local default="$2"
|
||||
if [ -e "$PROJECT_OUTPUT_DIR" ]; then
|
||||
BACKUP_OUTPUT_DIR="${PROJECT_OUTPUT_DIR}.bak.$(date +%Y%m%d%H%M%S)"
|
||||
|
||||
read -p "${prompt} [ 默认: ${default} ]: " value
|
||||
if ! mv "$PROJECT_OUTPUT_DIR" "$BACKUP_OUTPUT_DIR"; then
|
||||
echo -e "${RED} 备份已有输出目录失败: ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$value" ]; then
|
||||
echo "$default"
|
||||
else
|
||||
echo "$value"
|
||||
echo -e "${YELLOW} 已有输出目录,已备份到: ${BACKUP_OUTPUT_DIR}${NC}"
|
||||
fi
|
||||
|
||||
if ! mv "$OUTPUT_DIR" "$PROJECT_OUTPUT_DIR"; then
|
||||
echo -e "${RED} 移动构建输出目录失败: ${OUTPUT_DIR} -> ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
echo ""
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
echo -e "${GREEN} 构建成功!${NC}"
|
||||
echo -e "${GREEN} 固件路径: ${PROJECT_OUTPUT_DIR}${NC}"
|
||||
echo -e "${GREEN}========================================${NC}"
|
||||
|
||||
}
|
||||
|
||||
# 获取lan口ip
|
||||
input_lan_ip() {
|
||||
local default_ip="$1"
|
||||
|
||||
while true; do
|
||||
local ip
|
||||
|
||||
ip=$(ask_input "请输入lan口ip" "$default_ip")
|
||||
|
||||
if valid_ipv4 "$ip"; then
|
||||
echo "$ip"
|
||||
return 0
|
||||
else
|
||||
echo "[错误] IP地址格式不正确,请重新输入" >&2
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
valid_ipv4() {
|
||||
local ip="$1"
|
||||
|
||||
# 第一层:检查格式,必须是4段数字
|
||||
echo "$ip" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' || return 1
|
||||
|
||||
# 第二层:检查每段范围
|
||||
echo "$ip" | awk -F. '
|
||||
$1>=0 && $1<=255 &&
|
||||
$2>=0 && $2<=255 &&
|
||||
$3>=0 && $3<=255 &&
|
||||
$4>=0 && $4<=255
|
||||
' | grep -q . || return 1
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# 项目根目录,用来保证从任意位置执行 main.sh 都能找到其他脚本
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 要构建的 ImmortalWrt 版本, 可以在 https://github.com/immortalwrt/immortalwrt 查询版本号
|
||||
default_version="25.12.1"
|
||||
@@ -298,7 +200,52 @@ rootfs_partsize=$(ask_input "请输入根分区大小(MB)" "$default_rootfs_part
|
||||
# lan口ip
|
||||
default_lan_ip="192.168.1.1"
|
||||
lan_ip=$(input_lan_ip "$default_lan_ip")
|
||||
echo $lan_ip
|
||||
|
||||
# =============================================================
|
||||
# 插件包列表
|
||||
# - 前面加 - 表示从固件中移除该包,例如 -dnsmasq
|
||||
# - 每行一个,方便增删注释
|
||||
# =============================================================
|
||||
pkg_list=(
|
||||
-dropbear
|
||||
openssh-server
|
||||
|
||||
vim-full
|
||||
nano-plus
|
||||
bash
|
||||
curl
|
||||
shadow-chsh
|
||||
openssh-sftp-server
|
||||
luci-i18n-vlmcsd-zh-cn
|
||||
luci-i18n-argon-config-zh-cn
|
||||
luci-i18n-package-manager-zh-cn
|
||||
luci-i18n-firewall-zh-cn
|
||||
luci-i18n-arpbind-zh-cn
|
||||
|
||||
# 现代终端工具
|
||||
ripgrep
|
||||
diffutils
|
||||
less
|
||||
eza
|
||||
fish
|
||||
# 分区扩容
|
||||
luci-i18n-diskman-zh-cn
|
||||
cfdisk
|
||||
resize2fs
|
||||
e2fsprogs
|
||||
losetup
|
||||
|
||||
# 代理插件
|
||||
luci-i18n-daed-zh-cn
|
||||
luci-i18n-homeproxy-zh-cn
|
||||
sing-box
|
||||
|
||||
)
|
||||
packages=$(printf "%s " "${pkg_list[@]}") # 动态拼接成字符串
|
||||
|
||||
# 进入项目根目
|
||||
project_dir="$(cd "$(dirname "$0")" && pwd)"
|
||||
cd "$project_dir"
|
||||
|
||||
# 安装依赖
|
||||
install_dependencies
|
||||
@@ -307,4 +254,4 @@ install_dependencies
|
||||
builder_dir="$(download_imagebuilder "$version")"
|
||||
|
||||
# 构建固件
|
||||
build $builder_dir $rootfs_partsize $lan_ip
|
||||
build "$builder_dir" "$rootfs_partsize" "$lan_ip" "$packages"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
source $(pwd)/x86-64.sh
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
cd ${SCRIPT_DIR}
|
||||
|
||||
# 如果img-installer文件夹不存在, 下载img-installer
|
||||
if [ ! -d "${SCRIPT_DIR}/img-installer" ]; then
|
||||
git clone https://github.com/wukongdaily/img-installer.git
|
||||
fi
|
||||
chmod +x "${SCRIPT_DIR}/img-installer/custom.sh"
|
||||
chmod +x "${SCRIPT_DIR}/img-installer/supportFiles/custom/build.sh"
|
||||
|
||||
# 构建ISO固件
|
||||
PROJECT_OUTPUT_DIR="${SCRIPT_DIR}/x86-64_output"
|
||||
TARGET_FILE=$(ls ${PROJECT_OUTPUT_DIR}/*ext4-combined.img.gz)
|
||||
INPUT_FILE=${SCRIPT_DIR}/img-installer/input.img.gz
|
||||
cp $TARGET_FILE $INPUT_FILE
|
||||
cd ${SCRIPT_DIR}/img-installer
|
||||
bash autobuild/autobuild.sh "$INPUT_FILE"
|
||||
mv ${SCRIPT_DIR}/img-installer/output/custom-installer-x86_64.iso ${PROJECT_OUTPUT_DIR}
|
||||
echo ""
|
||||
echo 构建 ISO 镜像成功
|
||||
Reference in New Issue
Block a user