diff --git a/Scripts/AutoBuild_Tools.sh b/Scripts/AutoBuild_Tools.sh index 0dbed9c..f710f53 100755 --- a/Scripts/AutoBuild_Tools.sh +++ b/Scripts/AutoBuild_Tools.sh @@ -3,7 +3,7 @@ # AutoBuild_Tools for Openwrt # Dependences: bash wget curl block-mount e2fsprogs smartmontools -Version=V1.8.4 +Version=V1.8.5 ECHO() { case $1 in @@ -42,7 +42,7 @@ ${White}q. 退出 exit 0 ;; u) - [ -s ${AutoUpdate_File} ] && { + [[ -s ${AutoUpdate_File} ]] && { AutoUpdate_UI } || { ECHO r "\n未检测到 '/bin/AutoUpdate.sh',请确保当前固件支持一键更新!" @@ -51,7 +51,8 @@ ${White}q. 退出 ;; x) wget -q ${Github_Raw}/Scripts/AutoBuild_Tools.sh -O ${Tools_Cache}/AutoBuild_Tools.sh - if [[ $? == 0 && -s ${Tools_Cache}/AutoBuild_Tools.sh ]];then + if [[ $? == 0 && -s ${Tools_Cache}/AutoBuild_Tools.sh ]] + then ECHO y "\n[AutoBuild_Tools] 脚本更新成功!" rm -f ${Tools_File} mv -f ${Tools_Cache}/AutoBuild_Tools.sh ${Tools_File} @@ -64,75 +65,53 @@ ${White}q. 退出 fi ;; 1) - [[ ! $(CHECK_PKG block) == true ]] && { - ECHO r "\n缺少相应依赖包,请先安装 [block-mount] !" - sleep 2 - } || AutoExpand_UI + if_PKG_Depends block lsblk mkfs.ext4:e2fsprogs && AutoExpand_UI ;; 2) - [[ ! $(CHECK_PKG block) == true ]] && { - ECHO r "\n缺少相应依赖包,请先安装 [block-mount] !" - sleep 2 - return - } - [[ ! $(CHECK_PKG smbpasswd) == true ]] && { - ECHO r "\n缺少相应依赖包,请先安装 [samba] !" - sleep 2 - return - } - Samba_UI + if_PKG_Depends smbpasswd:samba block && Samba_UI ;; 3) - ECHO y "\nLoading Service Configuration ..." - Netstat1=${Tools_Cache}/Netstat1 - Netstat2=${Tools_Cache}/Netstat2 - ps_Info=${Tools_Cache}/ps_Info - rm -f ${Netstat2} && touch -a ${Netstat2} - netstat -ntupa | grep -v "::ffff" |egrep ":::[0-9].+|0.0.0.0:[0-9]+|127.0.0.1:[0-9]+" | awk '{print $1" "$4" "$6" "$7}' | sed -r 's/0.0.0.0:/\1/;s/:::/\1/;s/127.0.0.1:/\1/;s/LISTEN/\1/' | sort | uniq > ${Netstat1} - ps -w > ${ps_Info} - local i=1;while :;do - Proto=$(sed -n ${i}p ${Netstat1} | awk '{print $1}') - [[ -z ${Proto} ]] && break - Port=$(sed -n ${i}p ${Netstat1} | awk '{print $2}') - _Service=$(sed -n ${i}p ${Netstat1} | awk '{print $3}') - [[ ${_Service} == '-' ]] && { - Service="Unknown" - } || { - Service=$(echo ${_Service} | cut -d '/' -f2) - PID=$(echo ${_Service} | cut -d '/' -f1) - Task=$(grep -v "grep" ${ps_Info} | grep "${PID}" | awk '{print $5}') - } - i=$(($i + 1)) - echo -e "${Proto} ${Port} ${Service} ${PID} ${Task}" | egrep "tcp|udp" >> ${Netstat2} - done - clear - ECHO x "端口占用列表\n" - printf "${Grey}%-10s %-16s %-22s %-12s %-40s\n${White}" 协议 占用端口 服务名称 PID 进程信息 - local X;while read X;do - printf "%-8s %-12s %-18s %-12s %-40s\n" ${X} - done < ${Netstat2} - ENTER + if_PKG_Depends netstat && { + ECHO y "\nLoading Service Configuration ..." + Netstat1=${Tools_Cache}/Netstat1 + Netstat2=${Tools_Cache}/Netstat2 + ps_Info=${Tools_Cache}/ps_Info + rm -f ${Netstat2} && touch -a ${Netstat2} + netstat -ntupa | grep -v "::ffff" |egrep ":::[0-9].+|0.0.0.0:[0-9]+|127.0.0.1:[0-9]+" | awk '{print $1" "$4" "$6" "$7}' | sed -r 's/0.0.0.0:/\1/;s/:::/\1/;s/127.0.0.1:/\1/;s/LISTEN/\1/' | sort | uniq > ${Netstat1} + ps -efww > ${ps_Info} + local i=1;while :;do + Proto=$(sed -n ${i}p ${Netstat1} | awk '{print $1}') + [[ -z ${Proto} ]] && break + Port=$(sed -n ${i}p ${Netstat1} | awk '{print $2}') + _Service=$(sed -n ${i}p ${Netstat1} | awk '{print $3}') + [[ ${_Service} == '-' ]] && { + Service="Unknown" + } || { + Service=$(echo ${_Service} | cut -d '/' -f2) + PID=$(echo ${_Service} | cut -d '/' -f1) + Task=$(grep -v "grep" ${ps_Info} | grep "${PID}" | awk '{print $5}') + } + i=$(($i + 1)) + echo -e "${Proto} ${Port} ${Service} ${PID} ${Task}" | egrep "tcp|udp" >> ${Netstat2} + done + clear + ECHO x "端口占用列表\n" + printf "${Grey}%-10s %-16s %-22s %-12s %-40s\n${White}" 协议 占用端口 服务名称 PID 进程信息 + local X;while read X;do + printf "%-8s %-12s %-18s %-12s %-40s\n" ${X} + done < ${Netstat2} + ENTER + } ;; 4) - [[ ! $(CHECK_PKG smartctl) == true ]] && { - ECHO r "\n缺少相应依赖包,请先安装 [smartmontools] !" - sleep 2 - } || SmartInfo_UI + if_PKG_Depends smartctl:smartmontools && SmartInfo_UI ;; 5) - if [[ $(CHECK_PKG curl) == true ]];then - ping 223.5.5.5 -c 1 -W 2 > /dev/null 2>&1 - [[ $? == 0 ]] && { - ECHO y "\n基础网络连接正常!" - } || { - ECHO r "\n基础网络连接错误!" - } - ping www.baidu.com -c 1 -W 2 > /dev/null 2>&1 - [[ $? == 0 ]] && { - ECHO y "Baidu 连接正常!" - } || { - ECHO r "Baidu 连接错误!" - } + if_PKG_Depends curl nslookup&& { + ping 223.5.5.5 -c 1 -W 2 > /dev/null 2>&1 && \ + ECHO y "\n基础网络连接正常!" || ECHO r "\n基础网络连接错误!" + nslookup -type=a 163.com > /dev/null 2>&1 && \ + ECHO y "基础 IPv4 DNS 解析正常!" || ECHO r "基础 IPv4 DNS 解析错误!" Google_Check=$(curl -I -s --connect-timeout 3 google.com -w %{http_code} | tail -n1) case ${Google_Check} in 301) @@ -142,10 +121,8 @@ ${White}q. 退出 ECHO r "Google 连接错误!" ;; esac - else - ECHO r "\n缺少相应依赖包,请先安装 [curl] !" - fi - sleep 2 + sleep 2 + } ;; 6) cp -a /rom/etc/AutoBuild/Default_Variable /etc/AutoBuild @@ -165,7 +142,7 @@ ${White}q. 退出 clear ECHO x "在线设备列表\n" printf "${Grey}%-8s %-24s %-20s %-10s${White}\n" 序号 "MAC 地址" "IP 地址" 设备名称 - i=1;grep "br-lan" /proc/net/arp | grep "0x2" | grep -v "0x0" | grep "$(echo $(GET_IP 4) | egrep -o "[0-9]+\.[0-9]+\.[0-9]+")" | awk '{print $4"\t"$1}' | while read X;do + i=1;grep "br-lan" /proc/net/arp | grep "0x2" | grep -v "0x0" | awk '{print $4"\t"$1}' | while read X;do printf " %-5s %-22s %-18s %-10s\n" ${i} ${X} $(if_Empty "$(grep $(echo ${X} | awk '{print $2}') /tmp/dhcp.leases | awk '{print $4}' | head -n 1)" 未知) i=$(($i + 1)) done @@ -173,32 +150,28 @@ ${White}q. 退出 ENTER ;; 9) - if [[ $(CHECK_PKG mkswap) == true ]];then - echo - read -p "请输入交换文件存放的位置:" swap_Path - read -p "请输入交换分区的大小:" swap_Size - if [[ -f ${swap_Path}/swapfile ]] - then - ECHO r "\n目录 '${swap_Path}' 下已存在交换文件 'swapfile', 且文件大小为 $(du ${swap_Path}/swapfile -h | cut -d '' -f1) + echo + read -p "请输入交换文件存放的位置:" swap_Path + read -p "请输入交换分区的大小:" swap_Size + if [[ -f ${swap_Path}/swapfile ]] + then + ECHO r "\n目录 '${swap_Path}' 下已存在交换文件 'swapfile', 且文件大小为 $(du ${swap_Path}/swapfile -h | cut -d '' -f1) 继续操作将会覆盖该目录下原有的 swapfile 文件!\n" - read -p "是否继续操作?[Y/n]:" Choose - [[ ! ${Choose} == [Yesyes] ]] && continue - [[ ! -w ${swap_Path}/swapfile ]] && chmod 777 ${swap_Path}/swapfile - swapoff -a - rm -rf ${swap_Path}/swapfile - fi - ECHO y "\n开始创建 ${swap_Path}/swapfile ..." - dd if=/dev/zero of=${swap_Path}/swapfile bs=1M count=${swap_Size} - if [[ $? == 0 ]] - then - mkswap ${swap_Path}/swapfile && ECHO y "已成功创建交换文件 [${swap_Path}/swapfile], 可手动前往 '系统-挂载点' 进行设置!" || ECHO r "交换文件创建失败!" - chmod 0600 ${swap_Path}/swapfile - else - ECHO r "交换文件创建失败!" - rm -rf ${swap_Path}/swapfile - fi + read -p "是否继续操作?[Y/n]:" Choose + [[ ! ${Choose} == [Yesyes] ]] && continue + [[ ! -w ${swap_Path}/swapfile ]] && chmod 777 ${swap_Path}/swapfile + swapoff -a + rm -rf ${swap_Path}/swapfile + fi + ECHO y "\n开始创建 ${swap_Path}/swapfile ..." + dd if=/dev/zero of=${swap_Path}/swapfile bs=1M count=${swap_Size} + if [[ $? == 0 ]] + then + mkswap ${swap_Path}/swapfile && ECHO y "已成功创建交换文件 [${swap_Path}/swapfile], 可手动前往 '系统-挂载点' 进行设置!" || ECHO r "交换文件创建失败!" + chmod 0600 ${swap_Path}/swapfile else - ECHO r "\n当前设备不支持创建虚拟内存!" + ECHO r "交换文件创建失败!" + rm -rf ${swap_Path}/swapfile fi sleep 3 ;; @@ -206,8 +179,29 @@ ${White}q. 退出 done } +if_PKG_Depends() { + while [[ $1 ]];do + CMD=$(echo $1 | cut -d ':' -f1) + PKG=$(echo $1 | cut -d ':' -f2) + [[ -z ${PKG} ]] && PKG=${CMD} + if [[ $(CHECK_PKG ${CMD}) == false ]] + then + if_False=1 + ECHO r "\n缺少软件包: [${PKG}]" + fi + shift + done + if [[ ${if_False} == 1 ]] + then + sleep 2 + return 1 + else + return 0 + fi +} + if_Empty() { - if [[ -n $1 ]] + if [[ $1 ]] then echo $1 else @@ -216,8 +210,7 @@ if_Empty() { } AutoExpand_UI() { - USB_Info - [[ $? == 0 ]] && { + USB_Info && { clear ECHO x "USB 扩展内部空间\n" printf "${Yellow}%-7s %-14s %-40s %-14s %-15s %-18s %-10s\n${White}" 编号 设备 UUID 分区格式 挂载点 可用空间 状态 @@ -247,18 +240,14 @@ AutoExpand_UI() { AutoExpand_UI ;; *) - [[ ${Choose} =~ [0-9] && ${Choose} -le ${Logic_Disk_Count} && ${Choose} -gt 0 ]] > /dev/null 2>&1 && { - if [[ $(CHECK_PKG mkfs.ext4) == true ]];then - Choose_Disk=$(sed -n ${Choose}p ${Disk_Processed_List} | awk '{print $2}') - Choose_Mount=$(grep "${Choose_Disk}" ${Disk_Processed_List} | awk '{print $5}') - AutoExpand_Core ${Choose_Disk} ${Choose_Mount} - else - ECHO r "\n系统缺少相应依赖包,请先安装 [e2fsprogs] !" && sleep 2 - return - fi - } || { + if [[ ${Choose} =~ [0-9] && ${Choose} -le ${Logic_Disk_Count} && ${Choose} -gt 0 ]] > /dev/null 2>&1 + then + Choose_Disk=$(sed -n ${Choose}p ${Disk_Processed_List} | awk '{print $2}') + Choose_Mount=$(grep "${Choose_Disk}" ${Disk_Processed_List} | awk '{print $5}') + AutoExpand_Core ${Choose_Disk} ${Choose_Mount} + else AutoExpand_UI - } + fi ;; esac } @@ -292,7 +281,7 @@ USB_Info() { lsblk | grep disk | awk '{print "/dev/"$1}' | sort | uniq > ${Phy_Disk_List} } echo -ne "\r \r" - [[ -n $(cat ${Phy_Disk_List}) ]] && return 0 || return 1 + [[ $(cat ${Phy_Disk_List}) ]] && return 0 || return 1 } AutoExpand_Core() { @@ -303,23 +292,21 @@ AutoExpand_Core() { [[ ${Choose} == [Yesyes] ]] && { ECHO y "\n开始运行一键挂载脚本 ..." sleep 2 - } || return + } || return 0 echo "禁用自动挂载 ..." uci set fstab.@global[0].auto_mount='0' uci commit fstab [[ ! $2 == '-' ]] && { echo "卸载设备 '$1' 位于 '$2' ..." - umount -l $2 > /dev/null 2>&1 - [[ $? != 0 ]] && { + umount -l $2 > /dev/null 2>&1 && { ECHO r "设备 '$2' 卸载失败!" exit 1 } } echo "正在格式化设备 '$1' 为 ext4 格式,请耐心等待 ..." - mkfs.ext4 -F $1 > /dev/null 2>&1 - [[ $? == 0 ]] && { - echo "设备 '$1' 已成功格式化为 ext4 格式!" + mkfs.ext4 -F $1 > /dev/null 2>&1 && { USB_Info + echo "设备 '$1' 已成功格式化为 ext4 格式!" } || { ECHO r "设备 '$1' 格式化失败!" exit 1 @@ -338,7 +325,6 @@ AutoExpand_Core() { mount --bind / /tmp/introot || { ECHO r "绑定 '/' 到 '/tmp/introot' 失败!" exit 1 - } mount $1 /tmp/extroot || { ECHO r "挂载 '$1' 到 '/tmp/extroot' 失败!" @@ -373,11 +359,10 @@ EOF } Samba_UI() { - USB_Info - Samba_tmp="${Tools_Cache}/AutoSamba" [[ ! -d ${Tools_Cache} ]] && mkdir -p "${Tools_Cache}" while : do + USB_Info autoshare_Mode="$(uci get samba.@samba[0].autoshare)" clear ECHO x "Samba 工具箱\n" @@ -447,16 +432,14 @@ EOF sed -i '/invalid users/d' /etc/samba/smb.conf.template >/dev/null 2>&1 ECHO y "\n注意: 将为 root 用户设置密码,同时自动允许 root 用户进行访问, 请连续输入两次相同的密码,输入的内容不会显示,完成后回车即可!\n" - smbpasswd -a root - [[ $? == 0 ]] && { + smbpasswd -a root && { ECHO y "\n已为 root 用户设置 Samba 访问密码!" /etc/init.d/samba restart - } || { - ECHO r "\nSamba 访问密码设置失败!" - } + } || ECHO r "\nSamba 访问密码设置失败!" ;; 5) - if [ -s /etc/samba/smbpasswd ];then + if [[ -s /etc/samba/smbpasswd ]] + then smbpasswd -x root ECHO y "\n已删除 Samba 访问密码!" /etc/init.d/samba restart @@ -515,14 +498,14 @@ ${White}q. 返回\n" 6) echo "" read -p "请输入新的 Github 地址:" Github_URL - [[ -n ${Github_URL} ]] && bash ${AutoUpdate_File} -C ${Github_URL} || { + [[ ${Github_URL} ]] && bash ${AutoUpdate_File} -C ${Github_URL} || { ECHO r "\nGithub 地址不能为空!" } ;; 7) echo "" read -p "请输入新的固件标签:" FLAG - [[ -n ${FLAG} ]] && bash ${AutoUpdate_File} --flag ${FLAG} || { + [[ ${FLAG} ]] && bash ${AutoUpdate_File} --flag ${FLAG} || { ECHO r "\n固件标签不能为空!" } ;; @@ -539,8 +522,8 @@ ${White}q. 返回\n" ;; 11) echo "" - read -p "请输入你想要的启动方式[UEFI/BIOS]:" _BOOT - [[ -n ${_BOOT} ]] && bash ${AutoUpdate_File} -B ${_BOOT} || { + read -p "请输入你想要的启动方式[UEFI/BIOS]:" BOOT + [[ ${BOOT} ]] && bash ${AutoUpdate_File} -B ${BOOT} || { ECHO r "\n启动方式不能为空!" } ;; @@ -550,9 +533,7 @@ done } SmartInfo_UI() { - USB_Info - if [[ $? == 0 ]] - then + USB_Info && { clear ECHO x "硬盘信息列表" cat ${Phy_Disk_List} | while read Phy_Disk;do @@ -560,11 +541,11 @@ SmartInfo_UI() { sleep 1 done ENTER - else + } || { ECHO r "未检测到任何外接设备,请检查 USB 接口可用性或插入更多 USB 设备!" sleep 2 return 1 - fi + } } SmartInfo_Core() { @@ -579,7 +560,7 @@ SmartInfo_Core() { Phy_Name=$(GET_INFO "Device Model:") FW_Version=$(GET_INFO "Firmware Version:") Phy_Temp=$(grep "Temperature_Celsius" ${Smart_Info3} | awk '{print $10}') - [[ -n ${Phy_Temp} ]] && Phy_Temp="${Phy_Temp}°C" + [[ ${Phy_Temp} ]] && Phy_Temp="${Phy_Temp}°C" Phy_ID=$(GET_INFO "Serial number:") Phy_Capacity=$(GET_INFO "User Capacity:") Phy_Part_Number=$(grep -c "${Phy_Disk}" ${Disk_Processed_List}) @@ -588,18 +569,20 @@ SmartInfo_Core() { TRIM_Command=$(GET_INFO "TRIM Command:") Power_On=$(grep "Power_On_Hours" ${Smart_Info3} | awk '{print $10}') Power_Cycle_Count=$(grep "Power_Cycle_Count" ${Smart_Info3} | awk '{print $10}') - if [[ -n ${Power_On} ]] + if [[ ${Power_On} ]] then Power_Status="${Power_On} 小时 / ${Power_Cycle_Count} 次" fi - if [[ $(GET_INFO "Rotation Rate:") =~ "Solid State" ]];then + if [[ $(GET_INFO "Rotation Rate:") =~ "Solid State" ]] + then Phy_Type="固态硬盘" Phy_RPM="不可用" local LBAs_Written="$(grep "Total_LBAs_Written" ${Smart_Info3} | awk '{a=$10*512/1024/1024} {printf("%.2f",a)}') GB" local LBAs_Read="$(grep "Total_LBAs_Read" ${Smart_Info3} | awk '{a=$10*512/1024/1024} {printf("%.2f",a)}') GB" else Phy_Type="其他" - if [[ $(GET_INFO "Rotation Rate:") =~ rpm ]];then + if [[ $(GET_INFO "Rotation Rate:") =~ rpm ]] + then Phy_RPM=$(GET_INFO "Rotation Rate:") Phy_Type="机械硬盘" fi @@ -609,7 +592,8 @@ SmartInfo_Core() { } Phy_LB=$(GET_INFO "Logical block size:") Phy_PB=$(GET_INFO "Physical block size:") - if [[ -n ${Phy_PB} ]];then + if [[ ${Phy_PB} ]] + then Phy_BS="${Phy_LB} / ${Phy_PB}" else Phy_BS="${Phy_LB}" @@ -643,7 +627,8 @@ Sysinfo() { CPU_Model=$(awk -F ':[ ]' '/model name/{printf ($2);exit}' /proc/cpuinfo) CPU_Threads=$(grep 'processor' /proc/cpuinfo | sort -u | wc -l) CPU_Usage=$(top -n 1 | grep "CPU:" | awk '{print $2}') - if [[ -z ${CPU_Model} ]];then + if [[ -z ${CPU_Model} ]] + then CPU_Model=$(awk -F ':[ ]' '/system type/{printf ($2);exit}' /proc/cpuinfo) Low_Mode=1 else @@ -681,7 +666,7 @@ Sysinfo() { } echo -e "${Grey}CPU 使用率${Yellow} ${CPU_Usage}" echo -e "${Grey}IPv4 地址${Yellow} $(echo ${IPv4})" - [[ -n ${IPv6} ]] && echo -e "${Grey}IPv6 地址${Yellow} [${IPv6}]" + [[ ${IPv6} ]] && echo -e "${Grey}IPv6 地址${Yellow} [${IPv6}]" echo -e "${Grey}运行时间${Yellow} ${Sys_Startup}" echo -e "${Grey}文件系统${Yellow} $(echo ${Support_Format})" echo -e "${Grey}在线用户${Yellow} ${Online_Users}" @@ -708,7 +693,7 @@ GET_INFO() { for i in ${Smart_Info1} ${Smart_Info2} ${Smart_Info3};do _Result="$(grep "$1" ${i} 2> /dev/null | cut -d ':' -f2-10)" Result=$(eval echo "\${_Result}") - [[ -n ${Result} ]] && break + [[ ${Result} ]] && break done echo ${Result} }