├── AutoBuild.sh ├── Depends ├── Projects │ ├── ImmortalWrt │ ├── Lede │ ├── Lienol │ └── Openwrt └── Sources_List │ ├── Codename │ ├── Mirror │ └── Template ├── LICENSE └── README.md /AutoBuild.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Project AutoBuild 3 | # Author Hyy2001 4 | # Github https://github.com/Hyy2001X/AutoBuild 5 | 6 | Update=2022.08.30 7 | Version=V4.4.8 8 | 9 | Second_Menu() { 10 | Project=$1 11 | Build_Path=${Home}/Projects/$1 12 | [[ ! -s ${Build_Path}/Makefile ]] && Source_Clone ${Project} ${Build_Path} 13 | 14 | while : 15 | do 16 | clear 17 | if [[ -s ${Build_Path}/Makefile ]] 18 | then 19 | cd ${Build_Path} 20 | ECHO G "源码位置: ${Build_Path}:$(GET_Branch ${Build_Path})" 21 | Version=$(egrep -o "R[0-9]+\.[0-9]+\.[0-9]+" package/lean/default-settings/files/zzz-default-settings 2> /dev/null) 22 | [[ -n ${Version} ]] && ECHO "源码版本: ${Version}" 23 | unset Version 24 | else 25 | return 26 | fi 27 | echo 28 | echo "1. 更新源代码" 29 | echo "2. 打开固件配置菜单" 30 | echo "3. 备份与恢复" 31 | echo "4. 编译选项" 32 | echo "5. 高级选项" 33 | ECHO X "\nm. 主菜单" 34 | echo "q. 返回" 35 | GET_Choose Choose 36 | case ${Choose} in 37 | q) 38 | AutoBuild_Second 39 | ;; 40 | m) 41 | AutoBuild_Core 42 | ;; 43 | 1) 44 | Sources_Update common ${Project} 45 | ;; 46 | 2) 47 | Menuconfig ${Project} ${Build_Path} 48 | ;; 49 | 3) 50 | Backups 51 | ;; 52 | 4) 53 | Module_Builder 54 | ;; 55 | 5) 56 | Project_Options 57 | esac 58 | done 59 | } 60 | 61 | Project_Options() { 62 | while :;do 63 | cd ${Build_Path} 64 | clear 65 | ECHO X "源码高级选项\n" 66 | echo "1. 下载源代码" 67 | echo "2. 强制更新源代码" 68 | echo "3. 空间清理" 69 | echo "4. 下载 dl 库" 70 | echo "5. 查看 commits" 71 | echo "6. 回退 commits" 72 | ECHO X "\nm. 主菜单" 73 | echo "q. 返回" 74 | GET_Choose Choose 75 | case ${Choose} in 76 | q) 77 | break 78 | ;; 79 | m) 80 | AutoBuild_Core 81 | ;; 82 | 1) 83 | Source_Clone ${Project} ${Build_Path} 84 | ;; 85 | 2) 86 | Sources_Update force ${Project} 87 | ;; 88 | 3) 89 | Space_Cleaner ${Project} ${Build_Path} 90 | ;; 91 | 4) 92 | Make_Download ${Project} ${Build_Path} 93 | ;; 94 | 5) 95 | clear 96 | if [[ -d .git ]] 97 | then 98 | git log -30 --graph --all --branches --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%cr)%C(reset) %C(bold green)(%ai)%C(reset) %C(white)%s' 99 | fi 100 | ;; 101 | 6) 102 | if [[ -d .git ]] 103 | then 104 | echo 105 | read -p '请输入回退到的 Commit ish:' reset_commit 106 | git reset --hard ${revert_commit} || ECHO R "\n回退失败!" 107 | Enter 108 | fi 109 | ;; 110 | esac 111 | done 112 | } 113 | 114 | Backups() { 115 | while : 116 | do 117 | clear 118 | ECHO X "备份与恢复\n" 119 | echo "1. 备份 [.config]" 120 | echo "2. 恢复 [.config]" 121 | echo "3. 备份 [${Project}] 源码" 122 | echo "4. 恢复 [${Project}] 源码" 123 | ECHO X "5. 链接 [dl]库" 124 | echo -e "\nq. 返回" 125 | GET_Choose Choose 126 | case ${Choose} in 127 | q) 128 | break 129 | ;; 130 | 1) 131 | cd ${Build_Path} 132 | while :;do 133 | clear 134 | ECHO X "备份 [.config]\n" 135 | echo -e "1. 固定名称" 136 | echo "2. 自定义名称" 137 | echo -e "\nq. 返回" 138 | GET_Choose Choose 139 | case ${Choose} in 140 | q) 141 | break 142 | ;; 143 | 1) 144 | if [ -f .config ] 145 | then 146 | cp .config ${Home}/Backups/Configs/Config_${Project}_$(date +%Y%m%d-%H%M%S) 147 | ECHO Y "\n[.config] 备份成功!" 148 | else 149 | ECHO R "\n[.config] 备份失败!" 150 | fi 151 | ;; 152 | 2) 153 | read -p '请输入自定义名称:' Backup_Config 154 | if [ -f .config ] 155 | then 156 | cp .config ${Home}/Backups/Configs/"${Backup_Config}" 157 | ECHO Y "\n[.config] 备份成功" 158 | else 159 | ECHO R "\n[.config] 备份失败!" 160 | fi 161 | ;; 162 | esac 163 | sleep 2 164 | done 165 | ;; 166 | 2) 167 | if [[ $(ls -A ${Home}/Backups/Configs) ]] 168 | then 169 | while : 170 | do 171 | clear 172 | ECHO X "恢复 [.config]\n" 173 | cd ${Home}/Backups/Configs 174 | ls -A1 | cat > ${Cache_Path}/Config.List 175 | ConfigList_File=${Cache_Path}/Config.List 176 | Max_ConfigList_Line=$(sed -n '$=' ${ConfigList_File}) 177 | for ((i=1;i<=${Max_ConfigList_Line};i++)); 178 | do 179 | ConfigFile_Name=$(sed -n ${i}p ${ConfigList_File}) 180 | echo -e "${i}. ${Yellow}${ConfigFile_Name}${White}" 181 | done 182 | echo -e "\nq.返回" 183 | GET_Choose Choose 184 | case ${Choose} in 185 | q) 186 | break 187 | ;; 188 | *) 189 | if [[ ${Choose} -le ${Max_ConfigList_Line} ]] 2> /dev/null 190 | then 191 | if [[ ! ${Choose} == 0 ]] 2> /dev/null 192 | then 193 | ConfigFile=$(sed -n ${Choose}p ${ConfigList_File}) 194 | if [[ -f ${ConfigFile} ]] 195 | then 196 | ConfigFile_Dir="${Home}/Backups/Configs/${ConfigFile}" 197 | cp "${ConfigFile_Dir}" ${Build_Path}/.config 198 | echo "${ConfigFile}" > ${Home}/Configs/${Project}_Recently_Config 199 | ECHO Y "\n配置文件 [$ConfigFile] 恢复成功!" 200 | sleep 2 201 | else 202 | ECHO R "\n未检测到对应的配置文件!" 203 | sleep 2 204 | fi 205 | else 206 | ECHO R "\n输入错误,请输入正确的数字!" 207 | sleep 2 208 | fi 209 | else 210 | ECHO R "\n输入错误,请输入正确的数字!" 211 | sleep 2 212 | fi 213 | ;; 214 | esac 215 | done 216 | else 217 | ECHO R "\n未找到备份文件,恢复失败!" 218 | sleep 2 219 | fi 220 | ;; 221 | 3) 222 | ECHO X "\n正在备份 [${Project}] 源码,请稍后 ..." 223 | [[ ! -d ${Home}/Backups/Projects/${Project} ]] && mkdir -p ${Home}/Backups/Projects/${Project} 224 | rm -rf ${Home}/Backups/Projects/${Project}/* 225 | for X in $(echo ${Backup_List[@]}) 226 | do 227 | cp -a ${Build_Path}/${X} ${Home}/Backups/Projects/${Project} 228 | done 229 | unset X 230 | ECHO Y "\n备份成功!源码已备份到 'Backups/Projects/${Project}'" 231 | ECHO Y "\n存储占用:$(du -sh ${Home}/Backups/Projects/${Project} | awk '{print $1}')B" 232 | sleep 3 233 | ;; 234 | 4) 235 | if [[ -f ${Home}/Backups/Projects/${Project}/Makefile ]] 236 | then 237 | ECHO X "\n正在恢复 [${Project}] 源码,请稍后 ..." 238 | for X in $(echo ${Backup_List[@]}) 239 | do 240 | rm -rf ${Home}/Projects/${X} 241 | cp -a ${Home}/Backups/Projects/${Project}/${X} ${Home}/Projects/${Projects}/${X} > /dev/null 2>&1 242 | done 243 | ECHO Y "\n恢复成功!源码文件已恢复到 'Projects/${Project}'" 244 | sleep 3 245 | else 246 | ECHO R "\n未找到备份文件!" 247 | sleep 2 248 | fi 249 | ;; 250 | 5) 251 | if [[ ! -h ${Build_Path}/dl ]] 252 | then 253 | [[ -d ${Build_Path}/dl ]] && mv -f ${Build_Path}/dl/* ${Home}/Backups/dl 254 | rm -rf ${Build_Path}/dl 255 | ln -s ${Home}/Backups/dl ${Build_Path}/dl 256 | fi 257 | ECHO Y "\n已创建软链接:'${Home}/Backups/dl' -> '${Build_Path}/dl'" 258 | sleep 3 259 | ;; 260 | esac 261 | done 262 | } 263 | 264 | Advanced_Options() { 265 | while : 266 | do 267 | clear 268 | ECHO X "高级选项\n" 269 | ECHO "1. 更新系统软件包" 270 | ECHO X "2. 安装编译环境" 271 | echo "3. SSH 服务" 272 | echo "4. 快捷指令启动" 273 | echo "5. 系统信息" 274 | echo "6. 系统下载源" 275 | ECHO "\nx. 更新脚本" 276 | ECHO X "q. 主菜单" 277 | GET_Choose Choose 278 | case ${Choose} in 279 | q) 280 | break 281 | ;; 282 | x) 283 | Module_Updater 284 | ;; 285 | 1) 286 | clear 287 | $(command -v sudo) apt-get -y update 288 | $(command -v sudo) apt-get -y upgrade 289 | $(command -v sudo) apt-get -y clean 290 | Enter 291 | ;; 292 | 2) 293 | echo 294 | read -p "是否启用单个软件包安装?[Y/n]:" if_Single 295 | clear 296 | $(command -v sudo) apt-get -y update 297 | local i=1;while [[ $i -le 3 ]];do 298 | clear 299 | ECHO X "开始第 $i 次安装...\n" 300 | sleep 2 301 | if [[ ${if_Single} == [Yy] ]] 302 | then 303 | for X in ${Dependency[@]} ${Extra_Dependency[@]};do 304 | $(command -v sudo) apt-get -y install ${X} > /dev/null 2>&1 305 | if [[ $? == 0 ]] 306 | then 307 | ECHO Y "已成功安装: ${X}" 308 | else 309 | ECHO R "未成功安装: ${X}" 310 | fi 311 | done 312 | else 313 | $(command -v sudo) apt-get -y install ${Dependency[@]} 314 | $(command -v sudo) apt-get -y install ${Extra_Dependency[@]} 315 | fi 316 | i=$(($i + 1)) 317 | sleep 1 318 | done 319 | unset i X 320 | $(command -v sudo) apt-get clean 321 | Enter 322 | ;; 323 | 3) 324 | Module_SSHServices 325 | ;; 326 | 4) 327 | echo 328 | read -p '请输入快速启动的指令:' FastOpen 329 | _SHELL=$(basename $(echo $SHELL)) 330 | for i in $(echo ~/.${_SHELL}rc /etc/profile);do 331 | if [[ -r $i ]] 332 | then 333 | ECHO B "\n写入到文件: [$i] ..." 334 | $(command -v sudo) sed -i "/AutoBuild.sh/d" ~/.bashrc 335 | $(command -v sudo) echo "alias ${FastOpen}='${Home}/AutoBuild.sh'" >> ~/.bashrc 336 | if [[ $? == 0 ]] 337 | then 338 | FastOpen_result=true 339 | else 340 | continue 341 | fi 342 | break 343 | fi 344 | done 345 | if [[ ${FastOpen_result} == true ]] 346 | then 347 | ECHO Y "\n创建成功! 下次登录在终端输入 ${FastOpen} 即可启动 AutoBuild." 348 | else 349 | ECHO R "\n创建失败! 请检查相关权限设置!" 350 | fi 351 | sleep 3 352 | ;; 353 | 5) 354 | Module_Systeminfo 355 | ;; 356 | 6) 357 | Module_SourcesList 358 | ;; 359 | esac 360 | done 361 | } 362 | 363 | Space_Cleaner() { 364 | while : 365 | do 366 | clear 367 | ECHO X "空间清理 [$1] [$2]\n" 368 | echo "1. 执行 [make clean]" 369 | echo "2. 执行 [make dirclean]" 370 | echo "3. 执行 [make distclean]" 371 | echo "4. 清理 [临时文件/编译缓存]" 372 | ECHO G "x. 彻底删除 [$1]" 373 | echo "q. 返回" 374 | GET_Choose Choose 375 | cd $2 376 | case ${Choose} in 377 | q) 378 | break 379 | ;; 380 | 1) 381 | ECHO X "\n正在执行 [make clean], 请稍后 ..." 382 | make clean > /dev/null 2>&1 383 | ;; 384 | 2) 385 | ECHO X "\n正在执行 [make dirclean], 请稍后 ..." 386 | make dirclean > /dev/null 2>&1 387 | ;; 388 | 3) 389 | ECHO X "\n正在执行 [make distclean], 请稍后 ..." 390 | make distclean > /dev/null 2>&1 391 | ;; 392 | 4) 393 | rm -r tmp 394 | ECHO Y "\n[临时文件/编译缓存] 删除成功!" 395 | ;; 396 | x) 397 | ECHO X "\n正在彻底删除 [$1], 请稍后 ..." 398 | rm -rf "$2" 399 | AutoBuild_Second 400 | ;; 401 | esac 402 | sleep 3 403 | done 404 | } 405 | 406 | Module_Updater() { 407 | if [[ $(NETWORK_CHECK 223.5.5.5) == 0 ]] 408 | then 409 | clear 410 | ECHO X "正在更新 [AutoBuild] 程序, 请稍后 ...\n" 411 | if [[ ! $(ls -A ${Home}/Backups/AutoBuild-Update 2> /dev/null) ]] 412 | then 413 | git clone https://github.com/Hyy2001X/AutoBuild ${Home}/Backups/AutoBuild-Update 414 | fi 415 | cd ${Home}/Backups/AutoBuild-Update 416 | Update_Logfile=${Home}/Log/Update_AutoBuild_$(date +%Y%m%d-%H%M).log 417 | git fetch --all | tee -a ${Update_Logfile} 418 | git reset --hard origin/master | tee -a ${Update_Logfile} || Update_Failed=1 419 | git pull 2>&1 | tee ${Update_Logfile} || Update_Failed=1 420 | if [[ -z ${Update_Failed} ]] 421 | then 422 | Old_Version=$(awk 'NR==7' ${Home}/AutoBuild.sh | awk -F'[="]+' '/Version/{print $2}') 423 | Backups_Dir=${Home}/Backups/OldVersion/AutoBuild-${Old_Version}-$(date +%Y%m%d-%H%M) 424 | mkdir -p ${Backups_Dir} 425 | mv ${Home}/AutoBuild.sh ${Backups_Dir}/AutoBuild.sh 426 | mv ${Home}/README.md ${Backups_Dir}/README.md 427 | mv ${Home}/LICENSE ${Backups_Dir}/LICENSE 428 | mv ${Home}/Depends ${Backups_Dir}/Depends 2> /dev/null 429 | cp -a * ${Home} 430 | ECHO Y "\n[AutoBuild] 程序更新成功!" 431 | Enter 432 | chmod 777 ${Home}/AutoBuild.sh && exec ${Home}/AutoBuild.sh 433 | else 434 | ECHO R "\n[AutoBuild] 程序更新失败!" 435 | Enter 436 | fi 437 | else 438 | ECHO R "\n网络连接错误,[AutoBuild] 更新失败!" 439 | sleep 2 440 | fi 441 | } 442 | 443 | Make_Download() { 444 | if [[ ! -f $2/.config ]] 445 | then 446 | ECHO R "\n未检测到 [.config], 无法执行 [make download]!" 447 | sleep 2 448 | return 449 | fi 450 | if [[ $(NETWORK_CHECK 223.5.5.5) == 1 ]] 451 | then 452 | ECHO R "\n网络连接错误,执行失败!" 453 | sleep 2 454 | return 455 | fi 456 | clear 457 | cd $2 458 | ECHO X "开始执行 [make download] ...\n" 459 | dl_Logfile=${Home}/Log/dl_${1}_$(date +%Y%m%d_%H%M).log 460 | if [[ $(ls -A dl 2> /dev/null) ]] 461 | then 462 | mv dl/* ${Home}/Backups/dl 2> /dev/null 463 | rm -r dl 2> /dev/null 464 | fi 465 | ln -sf ${Home}/Backups/dl $2/dl 2> /dev/null 466 | make -j${CPU_Threads} download V=s 2>&1 | tee -a ${dl_Logfile} 467 | find dl -size -1024c -exec rm -f {} \; 468 | ln -sf ${Home}/Backups/dl $2/dl 2> /dev/null 469 | Enter 470 | } 471 | 472 | Menuconfig() { 473 | cd $2 474 | echo 475 | read -p "是否删除旧配置文件?[Y/n]:" Choose 476 | clear 477 | ECHO B "Loading $1 Configuration ..." 478 | case ${Choose} in 479 | [Yy]) 480 | rm -r .config* 2> /dev/null 481 | ;; 482 | esac 483 | make menuconfig 484 | Enter 485 | } 486 | 487 | Source_Clone() { 488 | while :;do 489 | if [[ -s $2/Makefile ]] 490 | then 491 | ECHO Y "\n已检测到 [$1]源代码, 当前分支:[$(GET_Branch $2)]" 492 | sleep 2 493 | return 494 | fi 495 | clear 496 | Github_File=${Home}/Depends/Projects/$1 497 | Github_URL=$(egrep "http|https|git@" ${Github_File} | awk 'NR==1') 498 | ECHO X "[$1] 源码下载: 分支选择\n" 499 | ECHO G "仓库地址: ${Github_URL}\n" 500 | ECHO "请从下方选择一个分支:\n" 501 | Github_Branch_Array=($(egrep -v "http|https|git@" ${Github_File})) 502 | local i=0 ; while : 503 | do 504 | echo "$(($i + 1)). ${Github_Branch_Array[$i]}" 505 | i=$(($i + 1)) 506 | [[ $i == ${#Github_Branch_Array[@]} ]] && break 507 | done 508 | echo -e "\nq.返回" 509 | GET_Choose Choose_Branch 510 | case ${Choose_Branch} in 511 | q) 512 | break 513 | ;; 514 | [0-9]) 515 | if [[ ${Choose_Branch} -le ${#Github_Branch_Array[@]} && ${Choose_Branch} != 0 ]] 2> /dev/null 516 | then 517 | if [[ ${Github_URL} =~ github.com ]] 518 | then 519 | echo 520 | read -p "是否启用 [Ghproxy] 镜像加速?[Y/n]:" if_Ghproxy 521 | case ${if_Ghproxy} in 522 | [Yy]) 523 | Github_URL="https://ghproxy.com/${Github_URL}" 524 | ;; 525 | esac 526 | fi 527 | clear 528 | Github_Branch=${Github_Branch_Array[$((${Choose_Branch} - 1))]} 529 | ECHO B "下载地址: ${Yellow}${Github_URL}" 530 | ECHO B "远程分支: ${Yellow}${Github_Branch}\n" 531 | rm -r "$2" 2> /dev/null 532 | ECHO X "开始克隆 [$1] 到 '$2' ...\n" 533 | Clone_Logfile=${Home}/Log/Clone_${1}_$(date +%Y%m%d-%H%M).log 534 | echo "${Github_URL}:${Github_Branch}" > ${Clone_Logfile} 535 | git clone -b ${Github_Branch} ${Github_URL} $2 2>&1 | tee -a ${Clone_Logfile} 536 | if [[ $? == 0 ]] 537 | then 538 | ln -s ${Home}/Backups/dl $2/dl 539 | ECHO Y "\n[$1] 源码下载成功!" 540 | Enter 541 | Second_Menu $1 542 | else 543 | ECHO R "\n[$1] 源码下载失败!" 544 | Enter 545 | fi 546 | fi 547 | ;; 548 | esac 549 | done 550 | } 551 | 552 | Module_Builder() { 553 | if [[ ${LOGNAME} == root ]] 554 | then 555 | ECHO R "\n无法使用 [root] 用户进行编译!" 556 | sleep 3 557 | return 1 558 | fi 559 | if [[ ! -f ${Build_Path}/.config ]] 560 | then 561 | ECHO R "\n未检测到设备配置文件, 请先执行 [make menuconfig]" 562 | sleep 3 563 | return 1 564 | fi 565 | while :;do 566 | cd ${Build_Path} 567 | Openwrt_Repository=$(egrep -o "git.*" ${Build_Path}/.git/config) 568 | Openwrt_Branch=$(GET_Branch $(pwd)) 569 | Openwrt_Author=$(echo ${Openwrt_Repository} | cut -d "/" -f2) 570 | Openwrt_Reponame=$(echo ${Openwrt_Repository} | cut -d "/" -f3) 571 | case "${Openwrt_Author}/${Openwrt_Reponame}" in 572 | coolsnowwolf/[Ll]ede) 573 | Version_File=package/lean/default-settings/files/zzz-default-settings 574 | CURRENT_Version="$(egrep -o "R[0-9]+\.[0-9]+\.[0-9]+" ${Version_File})" 575 | ;; 576 | *) 577 | CURRENT_Version="R$(echo ${Openwrt_Branch} | egrep -o "[0-9]+.[0-9]+")" 578 | ;; 579 | esac 580 | while [[ -z ${x86_Test} ]];do 581 | x86_Test="$(egrep -o "CONFIG_TARGET.*DEVICE.*=y" .config | sed -r 's/CONFIG_TARGET_(.*)_DEVICE_(.*)=y/\1/')" 582 | [[ -n ${x86_Test} ]] && break 583 | x86_Test="$(egrep -o "CONFIG_TARGET.*Generic=y" .config | sed -r 's/CONFIG_TARGET_(.*)_Generic=y/\1/')" 584 | [[ -z ${x86_Test} ]] && break 585 | done 586 | [[ ${x86_Test} == x86_64 ]] && { 587 | TARGET_PROFILE=x86_64 588 | } || { 589 | TARGET_PROFILE="$(egrep -o "CONFIG_TARGET.*DEVICE.*=y" .config | sed -r 's/.*DEVICE_(.*)=y/\1/')" 590 | } 591 | TARGET_BOARD="$(awk -F '[="]+' '/TARGET_BOARD/{print $2}' .config)" 592 | [[ $(du .config | awk '{print $1}') -lt 100 ]] && { 593 | DIFF_CONFIG=1 594 | } || DIFF_CONFIG=0 595 | TARGET_SUBTARGET=$(awk -F '[="]+' '/TARGET_SUBTARGET/{print $2}' .config) 596 | TARGET_ARCH_PACKAGES=$(awk -F '[="]+' '/TARGET_ARCH_PACKAGES/{print $2}' .config) 597 | clear 598 | ECHO X "AutoBuild 固件编译 [${Openwrt_Repository}]\n" 599 | ECHO X "设备信息:${CPU_Model} ${CPU_Cores} Cores ${CPU_Threads} Threads\n" 600 | if [ -f .config ] 601 | then 602 | if [[ -f ${Home}/Configs/${Project}_Recently_Config ]] 603 | then 604 | echo -e "${Yellow}最近配置文件:${Blue}[$(cat ${Home}/Configs/${Project}_Recently_Config)]${White}\n" 605 | fi 606 | if [[ ${DIFF_CONFIG} == 0 ]] 607 | then 608 | echo -e "源码信息:${Yellow} ${Openwrt_Author}/${Openwrt_Reponame}:${Openwrt_Branch}${White}" 609 | echo -e "设备名称:${Yellow} ${TARGET_PROFILE}${White}" 610 | echo -e "CPU 架构:${Yellow} ${TARGET_BOARD}${White}" 611 | echo -e "CPU 型号:${Yellow} ${TARGET_SUBTARGET}${White}" 612 | echo -e "软件架构:${Yellow} ${TARGET_ARCH_PACKAGES}${White}" 613 | else 614 | ECHO R "[diff config], 请先执行 [make defconfig]" 615 | fi 616 | else 617 | ECHO R "警告:未检测到配置文件, 部分操作将不可用!" 618 | fi 619 | echo -e "${Yellow}\n1. make -j1 V=s" 620 | echo "2. make -j2 V=s" 621 | echo "3. make -j${CPU_Threads}" 622 | echo -e "4. make -j${CPU_Threads} V=s${White}" 623 | echo "5. make menuconfig" 624 | echo "6. make defconfig" 625 | ECHO X "7. 高级选项" 626 | echo "q. 返回" 627 | GET_Choose Choose_1 628 | case ${Choose_1} in 629 | q) 630 | break 631 | ;; 632 | 1) 633 | Compile_Threads="make -j1 V=s" 634 | ;; 635 | 2) 636 | Compile_Threads="make -j2 V=s" 637 | ;; 638 | 3) 639 | Compile_Threads="make -j${CPU_Threads}" 640 | ;; 641 | 4) 642 | Compile_Threads="make -j${CPU_Threads} V=s" 643 | ;; 644 | 5) 645 | Menuconfig ${Project} ${Build_Path} 646 | ;; 647 | 6) 648 | echo 649 | ECHO X "正在执行 [make defconfig], 请稍后 ..." 650 | make defconfig 651 | ;; 652 | 7) 653 | while :;do 654 | clear 655 | ECHO X "AutoBuild Firmware 高级选项\n" 656 | echo "1. 执行 [make kernel_menuconfig]" 657 | echo "2. 执行 [make download]" 658 | echo "3. 分离 [.config] > defconfig" 659 | echo "4. 删除 [.config]" 660 | echo "5. 空间清理" 661 | echo -e "\nq. 返回" 662 | ECHO X "m. 主菜单" 663 | GET_Choose Choose 664 | case ${Choose} in 665 | 1) 666 | clear 667 | ECHO X "正在执行 [make kernel_menuconfig], 请稍后 ..." 668 | make kernel_menuconfig 669 | ;; 670 | 2) 671 | Make_Download ${Project} ${Build_Path} 672 | ;; 673 | 3) 674 | if [[ -f .config ]] 675 | then 676 | diff_config="diffconfig_${Project}_$(date +%Y%m%d-%H%M%S)" 677 | ./scripts/diffconfig.sh > ${Home}/Backups/Configs/${diff_config} 678 | ECHO Y "\n新配置文件已保存到: 'Backups/Configs/${diff_config}'" 679 | else 680 | ECHO R "\n未检测到 [.config] 配置文件!" 681 | fi 682 | sleep 2 683 | ;; 684 | 4) 685 | rm -f ${Build_Path}/.config* 686 | ;; 687 | 5) 688 | Space_Cleaner ${Project} ${Build_Path} 689 | ;; 690 | q) 691 | break 692 | ;; 693 | m) 694 | AutoBuild_Core 695 | ;; 696 | esac 697 | done 698 | ;; 699 | esac 700 | case ${Choose_1} in 701 | 1 | 2 | 3 | 4) 702 | clear 703 | Firmware_Path="${Build_Path}/bin/targets/${TARGET_BOARD}/${TARGET_SUBTARGET}" 704 | Packages_Path=${Home}/Packages 705 | rm -r ${Firmware_Path} 2> /dev/null 706 | ECHO Y "执行指令: [${Compile_Threads}]\n" 707 | Build_Logfile=${Home}/Log/Build_${Project}_$(date +%Y%m%d-%H%M).log 708 | Compile_Started=$(date +"%Y-%m-%d %H:%M:%S") 709 | ${Compile_Threads} 2>&1 | tee ${Build_Logfile} 710 | if [[ $? != 0 ]] 711 | then 712 | ECHO R "\n编译失败!" 713 | Enter 714 | continue 715 | fi 716 | echo 717 | E="${Home}/Firmware/${TARGET_PROFILE}/$(date +%Y%m%d-%H%M)" 718 | mkdir -p $E 719 | List_Firmware ${Firmware_Path} | while read f 720 | do 721 | ECHO Y "检测到: $f" 722 | cp -a ${Firmware_Path}/$f $E 723 | done 724 | cp -a ${Firmware_Path}/config.buildinfo $E/config 725 | touch ${E}/"${Project} ${Openwrt_Branch}" 726 | echo 727 | ECHO X "备份当前 dl 库到 '${Home}/Backups/dl' ..." 728 | awk "BEGIN { cmd=\"cp -a ${Build_Path}/dl/* ${Home}/Backups/dl\"; print "n" | cmd; }" > /dev/null 2>&1 729 | ECHO X "备份软件包到 '${Home}/Packages' ..." 730 | mkdir -p ${Home}/Packages/${TARGET_ARCH_PACKAGES} 731 | mkdir -p "${Packages_Path}/${TARGET_ARCH_PACKAGES}/Kernel Modules" 732 | rm -r ${Cache_Path}/Packages && mkdir -p ${Cache_Path}/Packages 733 | cp -a $(find ${Build_Path}/bin -type f -name "*.ipk") ${Cache_Path}/Packages > /dev/null 2>&1 734 | mv -f $(find ${Cache_Path}/Packages -type f -name "kmod-*.ipk") "${Packages_Path}/${TARGET_ARCH_PACKAGES}/Kernel Modules" > /dev/null 2>&1 735 | mv -f $(find ${Cache_Path}/Packages -type f -name "*_${TARGET_ARCH_PACKAGES}.ipk") ${Packages_Path}/${TARGET_ARCH_PACKAGES} > /dev/null 2>&1 736 | mv -f $(find ${Cache_Path}/Packages -type f -name "luci-app-*.ipk") ${Packages_Path}/luci-app-common > /dev/null 2>&1 737 | mv -f $(find ${Cache_Path}/Packages -type f -name "luci-i18n-*.ipk") ${Packages_Path}/luci-app-common > /dev/null 2>&1 738 | mv -f $(find ${Cache_Path}/Packages -type f -name "luci-theme-*.ipk") ${Packages_Path}/luci-theme-common > /dev/null 2>&1 739 | mv -f $(find ${Cache_Path}/Packages -type f -name "*.ipk") ${Packages_Path} > /dev/null 2>&1 740 | mv -f $(find ${Build_Path}/bin/targets/${TARGET_BOARD}/${TARGET_SUBTARGET} -type f -name "kmod-*.ipk") "${Packages_Path}/${TARGET_ARCH_PACKAGES}/Kernel Modules" > /dev/null 2>&1 741 | mv -f $(find ${Build_Path}/bin/targets/${TARGET_BOARD}/${TARGET_SUBTARGET} -type f -name "*.ipk") ${Packages_Path}/${TARGET_ARCH_PACKAGES} > /dev/null 2>&1 742 | Enter 743 | ;; 744 | esac 745 | done 746 | } 747 | 748 | List_Firmware() { 749 | ls -1 $1 2> /dev/null | egrep -v "packages|buildinfo|sha256sums|manifest" | while read i 750 | do 751 | echo $i 752 | done 753 | } 754 | 755 | GET_Branch() { 756 | git -C $1 rev-parse --abbrev-ref HEAD | grep -v HEAD || \ 757 | git -C $1 describe --exact-match HEAD || \ 758 | git -C $1 rev-parse HEAD 759 | } 760 | 761 | Compile_Stopped() { 762 | Compile_Ended=$(date +"%Y-%m-%d %H:%M:%S") 763 | Start_Seconds=$(date -d "$Compile_Started" +%s) 764 | End_Seconds=$(date -d "$Compile_Ended" +%s) 765 | let Compile_Cost=($End_Seconds-$Start_Seconds)/60 766 | ECHO Y "\n$Compile_Started --> $Compile_Ended 编译用时: ${Compile_Cost} 分钟" 767 | } 768 | 769 | Module_Network_Test() { 770 | clear 771 | TMP_FILE=${Cache_Path}/NetworkTest.log 772 | PING_MODE=httping 773 | [[ -z $(which ${PING_MODE}) ]] && PING_MODE=ping 774 | ECHO X "网络测试 [${PING_MODE}]\n" 775 | ECHO G "网址 次数 延迟/Min 延迟/Avg 延迟/Max 状态\n" 776 | Run_Test www.baidu.com 2 777 | Run_Test git.openwrt.com 3 778 | Run_Test www.google.com 3 779 | Run_Test www.github.com 3 780 | Enter 781 | } 782 | 783 | Run_Test() { 784 | _URL=$1 785 | _COUNT=$2 786 | _TIMEOUT=$((${_COUNT}*2+1)) 787 | [[ -z $1 || -z $2 ]] && return 788 | [[ ! ${_COUNT} -gt 0 ]] 2> /dev/null && return 789 | timeout 3 ${PING_MODE} ${_URL} -c 1 > /dev/null 2>&1 790 | if [[ $? == 0 ]] 791 | then 792 | echo -ne "\r${Grey}测试中...${White}\r" 793 | timeout ${_TIMEOUT} ${PING_MODE} ${_URL} -c ${_COUNT} > ${TMP_FILE} 794 | _IP=$(egrep -o "[0-9]+.[0-9]+.[0-9]+.[0-9]" ${TMP_FILE} | awk 'NR==1') 795 | _PING=$(egrep -o "[0-9].+/[0-9]+.[0-9]+" ${TMP_FILE}) 796 | _PING_MIN=$(echo ${_PING} | egrep -o "[0-9]+.[0-9]+" | awk 'NR==1') 797 | _PING_AVG=$(echo ${_PING} | egrep -o "[0-9]+.[0-9]+" | awk 'NR==2') 798 | _PING_MAX=$(echo ${_PING} | egrep -o "[0-9]+.[0-9]+" | awk 'NR==3') 799 | _PING_PROC=$(echo ${_PING_AVG} | egrep -o "[0-9]+" | awk 'NR==1') 800 | if [[ ${_PING_PROC} -le 50 ]] 801 | then 802 | _TYPE="${Yellow}优秀" 803 | elif [[ ${_PING_PROC} -le 100 ]] 804 | then 805 | _TYPE="${Blue}良好" 806 | elif [[ ${_PING_PROC} -le 200 ]] 807 | then 808 | _TYPE="${Grey}一般" 809 | elif [[ ${_PING_PROC} -le 250 ]] 810 | then 811 | _TYPE="${Red}较差" 812 | else 813 | _TYPE="${Red}差" 814 | fi 815 | echo -e "${_URL} ${_COUNT} ${_PING_MIN} ${_PING_AVG} ${_PING_MAX} ${_TYPE}${White}" 816 | else 817 | echo -e "${_URL} ${Red}错误${White}" 818 | fi 819 | } 820 | 821 | Module_SourcesList() { 822 | local Mirror=${Home}/Depends/Sources_List/Mirror 823 | local Codename=${Home}/Depends/Sources_List/Codename 824 | local Source_Template=${Home}/Depends/Sources_List/Template 825 | local BAK_FILE=${Home}/Backups/sources.list.bak 826 | 827 | if [[ ${Short_OS} != Ubuntu ]] 828 | then 829 | ECHO R "\n暂不支持此操作系统!" 830 | sleep 2 && return 1 831 | else 832 | OS_ID=$(awk -F '[="]+' '/DISTRIB_ID/{print $2}' /etc/lsb-release) 833 | OS_Version=$(awk -F '[="]+' '/DISTRIB_RELEASE/{print $2}' /etc/lsb-release) 834 | if [[ ${Short_OS} != Ubuntu ]] 835 | then 836 | ECHO R "\n暂不支持此操作系统!" 837 | sleep 2 && return 1 838 | fi 839 | if [[ ! $(cat ${Codename} | awk '{print $1}') =~ ${OS_Version} ]] 840 | then 841 | ECHO R "\n暂不支持此 Ubuntu 系统版本: [${OS_Version}]" 842 | sleep 2 && return 1 843 | fi 844 | fi 845 | while :;do 846 | clear 847 | ECHO X "替换系统下载源\n" 848 | ECHO "操作系统${Yellow}: [${OS_ID}:${OS_Version}]" 849 | ECHO "当前系统源${Yellow}: [$(grep -v '#' /etc/apt/sources.list | awk '{print $2}' | sed -r 's/htt[ps]+:\/\/(.*)\/ubuntu\//\1/' | awk 'NR==1')]\n" 850 | if [[ -f ${Mirror} ]] 851 | then 852 | local i=1;for Mirror_Name in $(cat ${Mirror} | awk '{print $1}');do 853 | echo -e "${i}. ${Yellow}${Mirror_Name}${White}" 854 | i=$(($i + 1)) 855 | done 856 | else 857 | ECHO R "[未检测到镜像列表 ${Mirror}]" 858 | fi 859 | ECHO X "\nx. 恢复默认源" 860 | echo "q. 返回" 861 | GET_Choose Choose 862 | case ${Choose} in 863 | q) 864 | break 865 | ;; 866 | x) 867 | if [[ -f ${BAK_FILE} ]] 868 | then 869 | $(command -v sudo) mv ${BAK_FILE} /etc/apt/sources.list 870 | ECHO Y "\n[默认源] 恢复成功!" 871 | else 872 | ECHO R "\n未找到备份: [${BAK_FILE}], 恢复失败!" 873 | fi 874 | sleep 2 875 | ;; 876 | [0-9]) 877 | if [[ ${Choose} -gt 0 && ! ${Choose} -gt $(($i - 1)) ]] > /dev/null 2>&1 878 | then 879 | Server_Url=$(sed -n ${Choose}p ${Mirror} | awk '{print $2}') 880 | Server_Name=$(sed -n ${Choose}p ${Mirror} | awk '{print $1}') 881 | Code_Name=$(grep "${OS_Version}" ${Codename} | awk '{print $2}') 882 | if [[ -z ${Server_Url} || -z ${Server_Name} || -z ${Code_Name} ]] 883 | then 884 | ECHO R "\n参数获取失败, 请尝试更新 [AutoBuild] 后重试!" 885 | sleep 2 886 | continue 887 | fi 888 | if [[ -f /etc/apt/sources.list && ! -f ${BAK_FILE} ]] 889 | then 890 | $(command -v sudo) cp -a /etc/apt/sources.list ${BAK_FILE} 891 | $(command -v sudo) chmod 777 ${BAK_FILE} 892 | ECHO Y "\n当前系统源已自动备份到 '${BAK_FILE}'" 893 | fi 894 | $(command -v sudo) cp ${Source_Template} /etc/apt/sources.list 895 | $(command -v sudo) sed -i "s?ServerUrl?${Server_Url}?g" /etc/apt/sources.list 896 | $(command -v sudo) sed -i "s?Codename?${Code_Name}?g" /etc/apt/sources.list 897 | ECHO Y "\n系统源已切换到: [${Server_Name}]" 898 | sleep 2 899 | fi 900 | ;; 901 | esac 902 | done 903 | } 904 | 905 | ECHO() { 906 | local Color 907 | case $# in 908 | 1) 909 | echo -e "${White}${*}${White}" 910 | ;; 911 | 2) 912 | case $1 in 913 | R) Color="${Red}";; 914 | G) Color="${Green}";; 915 | B) Color="${Blue}";; 916 | Y) Color="${Yellow}";; 917 | X) Color="${Grey}";; 918 | *) Color="${White}";; 919 | esac 920 | shift 921 | echo -e "${Color}${*}${White}" 922 | ;; 923 | esac 924 | } 925 | 926 | GET_Choose() { 927 | echo -e "${White}" 928 | read -p '请从上方选择一个选项或操作:' $1 929 | } 930 | 931 | Enter() { 932 | echo -e "${White}" 933 | read -p "按下[回车]键以继续..." Key 934 | } 935 | 936 | Decoration() { 937 | printf "${Grey}%-${1}s${White}\n" "$2" | sed "s/\s/$2/g" 938 | } 939 | 940 | Module_SSHServices() { 941 | while :;do 942 | clear 943 | ECHO X "SSH Services" 944 | if [[ -n $(ls -A ${Home}/Configs/SSH) ]] 945 | then 946 | cd ${Home}/Configs/SSH 947 | echo "$(ls -A)" > ${Cache_Path}/SSHProfileList 948 | SSHProfileList=${Cache_Path}/SSHProfileList 949 | SSHProfileList_MaxLine=$(sed -n '$=' $SSHProfileList) 950 | ECHO X "配置文件列表" 951 | echo 952 | for ((i=1;i<=${SSHProfileList_MaxLine};i++)); 953 | do 954 | SSHProfile=$(sed -n ${i}p $SSHProfileList) 955 | echo -e "${i}. ${Yellow}${SSHProfile}${White}" 956 | done 957 | else 958 | ECHO R "\n[未检测到任何配置文件]" 959 | fi 960 | ECHO X "\nn. 创建新配置文件" 961 | [[ -n $(ls -A ${Home}/Configs/SSH) ]] && ECHO R "d. 删除所有配置文件" 962 | echo "x. 重置 [RSA Key Fingerprint]" 963 | echo -e "q. 返回\n" 964 | read -p '请从上方选择一个操作:' Choose 965 | case ${Choose} in 966 | q) 967 | return 0 968 | ;; 969 | n) 970 | Create_SSHProfile 971 | ;; 972 | d) 973 | rm -f ${Home}/Configs/SSH/* 2> /dev/null 974 | ECHO Y "\n已删除所有 [SSH] 配置文件!" 975 | sleep 2 976 | ;; 977 | x) 978 | rm -rf ~/.ssh 979 | ECHO Y "\n[SSH] [RSA Key Fingerprint] 重置成功!" 980 | sleep 2 981 | ;; 982 | *) 983 | if [[ ${Choose} -gt 0 ]] > /dev/null 2>&1 984 | then 985 | if [[ ${Choose} -le $SSHProfileList_MaxLine ]] > /dev/null 2>&1 986 | then 987 | SSHProfile_File="${Home}/Configs/SSH/$(sed -n ${Choose}p ${SSHProfileList})" 988 | Module_SSHServices_Menu 989 | else 990 | ECHO R "\n[SSH] 输入错误,请输入正确的数字!" 991 | sleep 2 992 | fi 993 | fi 994 | ;; 995 | esac 996 | done 997 | } 998 | 999 | Module_SSHServices_Menu() { 1000 | while :;do 1001 | . "$SSHProfile_File" 1002 | clear 1003 | echo -e "${Blue}配置文件: ${Yellow}[$SSHProfile_File]${White}" 1004 | echo -e "${Blue}连接参数: ${Yellow}[ssh ${SSH_User}@${SSH_IP} -p ${SSH_Port}: ${SSH_Password}]${White}\n" 1005 | ECHO "1. 连接到 SSH" 1006 | echo "2. 编辑配置" 1007 | echo "3. 重命名配置" 1008 | echo "4. 修改密码" 1009 | ECHO R "5. 删除此配置文件" 1010 | echo "6. 重置[RSA Key Fingerprint]" 1011 | echo -e "\nq. 返回" 1012 | GET_Choose Choose 1013 | case ${Choose} in 1014 | q) 1015 | break 1016 | ;; 1017 | 1) 1018 | ssh-keygen -R $SSH_IP > /dev/null 2>&1 1019 | SSH_Login 1020 | ;; 1021 | 2) 1022 | SSH_Profile="$SSHProfile_File" 1023 | read -p '[SSH] 请输入新的 IP 地址[回车即跳过修改]:' SSH_IP_New 1024 | [[ -n $SSH_IP_New ]] && { 1025 | sed -i "s?SSH_IP=${SSH_IP}?SSH_IP=${SSH_IP_New}?g" "$SSH_Profile" 1026 | SSH_IP=$SSH_IP_New 1027 | } 1028 | read -p '[SSH] 请输入新的端口号:' SSH_Port_New 1029 | [[ -n $SSH_Port_New ]] && { 1030 | sed -i "s?SSH_Port=${SSH_Port}?SSH_Port=${SSH_Port_New}?g" "$SSH_Profile" 1031 | SSH_Port=$SSH_Port_New 1032 | } 1033 | read -p '[SSH] 请输入新的用户名:' SSH_User_New 1034 | [[ -n $SSH_User_New ]] && { 1035 | sed -i "s?SSH_User=${SSH_User}?SSH_User=${SSH_User_New}?g" "$SSH_Profile" 1036 | SSH_User=$SSH_User_New 1037 | } 1038 | read -p '[SSH] 请输入新密码:' SSH_Password_New 1039 | [[ -n $SSH_Password_New ]] && { 1040 | if [[ -z $SSH_Password ]] 1041 | then 1042 | sed -i '/SSH_Password/d' "$SSHProfile" 1043 | echo "SSH_Password=$SSH_Password_New" >> "$SSHProfile" 1044 | else 1045 | sed -i "s?SSH_Password=${SSH_Password}?SSH_Password=${SSH_Password_New}?g" "$SSH_Profile" 1046 | fi 1047 | SSH_Password=$SSH_Password_New 1048 | } 1049 | ;; 1050 | 3) 1051 | echo 1052 | read -p '[SSH] 请输入新的配置名称:' SSHProfile_RN 1053 | if [[ ! -z "$SSHProfile_RN" ]] 1054 | then 1055 | cd ${Home}/Configs/SSH 1056 | mv "$SSHProfile_File" "$SSHProfile_RN" > /dev/null 2>&1 1057 | ECHO Y "\n重命名 [$SSHProfile_File] > [$SSHProfile_RN] 成功!" 1058 | SSHProfile_File="$SSHProfile_RN" 1059 | else 1060 | ECHO R "\n[SSH] 配置名称不能为空!" 1061 | fi 1062 | sleep 2 1063 | ;; 1064 | 4) 1065 | echo 1066 | read -p '[SSH] 请输入新的密码:' SSH_Password 1067 | sed -i '/SSH_Password/d' "$SSHProfile_File" 1068 | echo "SSH_Password=$SSH_Password" >> "$SSHProfile_File" 1069 | ECHO Y "\n[SSH] 配置文件已保存!" 1070 | sleep 2 1071 | ;; 1072 | 5) 1073 | rm -f "$SSHProfile_File" 1074 | ECHO Y "\n[SSH] 配置文件 [$SSHProfile_File] 删除成功!" 1075 | sleep 2 1076 | break 1077 | ;; 1078 | 6) 1079 | ssh-keygen -R $SSH_IP > /dev/null 2>&1 1080 | ECHO Y "\n[SSH] [RSA Key Fingerprint] 重置成功!" 1081 | sleep 2 1082 | ;; 1083 | esac 1084 | done 1085 | } 1086 | 1087 | Create_SSHProfile() { 1088 | cd ${Home} 1089 | echo 1090 | read -p '请输入新配置名称:' SSH_Profile 1091 | [[ -z $SSH_Profile ]] && SSH_Profile="${Home}/Configs/SSH/ssh-$(openssl rand -base64 4 | tr -d =)" || SSH_Profile=${Home}/Configs/SSH/"$SSH_Profile" 1092 | [[ -f $SSH_Profile ]] && { 1093 | ECHO R "\n[SSH] 已存在相同名称的配置文件!" 1094 | sleep 2 1095 | return 1096 | } 1097 | read -p '[SSH] 请输入IP地址:' SSH_IP 1098 | [[ -z $SSH_IP ]] && SSH_IP="192.168.1.1" 1099 | read -p '[SSH] 请输入端口号:' SSH_Port 1100 | [[ -z $SSH_Port ]] && SSH_Port=22 1101 | read -p '[SSH] 请输入用户名:' SSH_User 1102 | while [[ -z $SSH_User ]] 1103 | do 1104 | ECHO R "\n[SSH] 用户名不能为空!" 1105 | echo 1106 | read -p '[SSH] 请输入用户名:' SSH_User 1107 | done 1108 | read -p '[SSH] 请输入密码:' SSH_Password 1109 | echo "SSH_IP=$SSH_IP" > "$SSH_Profile" 1110 | echo "SSH_Port=$SSH_Port" >> "$SSH_Profile" 1111 | echo "SSH_User=$SSH_User" >> "$SSH_Profile" 1112 | echo "SSH_Password=$SSH_Password" >> "$SSH_Profile" 1113 | ECHO Y "\n[SSH] 配置文件已保存到 '$SSH_Profile'" 1114 | sleep 2 1115 | SSH_Login 1116 | } 1117 | 1118 | SSH_Login() { 1119 | clear 1120 | echo -e "${Blue}连接参数:${Yellow}[ssh ${SSH_User}@${SSH_IP} -p ${SSH_Port}]${White}\n" 1121 | expect -c " 1122 | set timeout 3 1123 | spawn ssh ${SSH_User}@${SSH_IP} -p ${SSH_Port} 1124 | expect { 1125 | *yes/no* { send \"yes\r\"; exp_continue } 1126 | *password:* { send \"${SSH_Password}\r\" } 1127 | } 1128 | interact" 1129 | sleep 1 1130 | } 1131 | 1132 | Module_Systeminfo() { 1133 | GET_System_Info 2 1134 | clear 1135 | ECHO X "系统信息\n" 1136 | Decoration 70 = 1137 | ECHO X "操作系统${Yellow} ${Short_OS}" 1138 | ECHO X "系统版本${Yellow} ${OS_INFO}" 1139 | ECHO X "计算机名称${Yellow} ${Computer_Name}" 1140 | ECHO X "登陆用户名${Yellow} ${USER}" 1141 | ECHO X "内核版本${Yellow} ${Kernel_Version}" 1142 | ECHO X "物理内存${Yellow} ${MemTotal_GB}GB/${MemTotal_MB}MB" 1143 | ECHO X "可用内存${Yellow} ${MemFree_GB}GB/${MemFree}MB" 1144 | ECHO X "CPU 型号${Yellow} ${CPU_Model}" 1145 | ECHO X "CPU 频率${Yellow} ${CPU_Freq}" 1146 | ECHO X "CPU 架构${Yellow} ${CPU_Info}" 1147 | ECHO X "CPU 核心数量${Yellow} ${CPU_Cores}" 1148 | ECHO X "CPU 当前频率${Yellow} ${Current_Freq}MHz" 1149 | ECHO X "CPU 当前温度${Yellow} ${Current_Temp}" 1150 | ECHO X "IP 地址${Yellow} ${IP_Address}" 1151 | ECHO X "开机时长${Yellow} ${Computer_Startup}" 1152 | Decoration 70 = 1153 | Enter 1154 | } 1155 | 1156 | GET_OS() { 1157 | [[ -f /etc/redhat-release ]] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return 1158 | [[ -f /etc/os-release ]] && awk -F '[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return 1159 | [[ -f /etc/lsb-release ]] && awk -F '[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return 1160 | } 1161 | 1162 | GET_System_Info() { 1163 | case $1 in 1164 | 1) 1165 | CPU_Model=$(awk -F ':[ ]' '/model name/{printf ($2);exit}' /proc/cpuinfo) 1166 | CPU_Cores=$(cat /proc/cpuinfo | grep processor | wc -l) 1167 | CPU_Threads=$(grep 'processor' /proc/cpuinfo | sort -u | wc -l) 1168 | CPU_Freq=$(awk '/model name/{print ""$NF;exit}' /proc/cpuinfo) 1169 | OS_INFO=$(GET_OS) 1170 | Short_OS=$(echo ${OS_INFO} | awk '{print $1}') 1171 | System_Bit=$(getconf LONG_BIT) 1172 | CPU_Base=$(uname -m) 1173 | [[ -z ${CPU_Base} ]] && CPU_Info="${System_Bit}" || CPU_Info="${System_Bit} (${CPU_Base} Bit)" 1174 | Computer_Name=$(hostname) 1175 | MemTotal_MB=$(free -m | awk '{print $2}' | awk 'NR==2') 1176 | MemTotal_GB=$(echo "scale=1; $MemTotal_MB / 1000" | bc) 1177 | ;; 1178 | 2) 1179 | Current_Freq=$(echo "$(grep 'MHz' /proc/cpuinfo | awk '{Freq_Sum += $4};END {print Freq_Sum}') / ${CPU_Threads}" | bc) 1180 | Current_Temp=$(echo "$(sensors 2> /dev/null | grep Core | awk '{Sum += $3};END {print Sum}') / ${CPU_Cores}" | bc 2> /dev/null | awk '{a=$1;b=32+$1*1.8} {printf("%d°C | %.1f°F\n",a,b)}') 1181 | Kernel_Version=$(uname -r) 1182 | Computer_Startup=$(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=($1%60)} {printf("%d 天 %d 小时 %d 分钟 %d 秒\n",a,b,c,d)}' /proc/uptime) 1183 | IP_Address=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:" | awk 'NR==1') 1184 | MemFree=$(free -m | awk '{print $7}' | awk 'NR==2') 1185 | MemFree_GB=$(echo "scale=1; $MemFree / 1000" | bc) 1186 | ;; 1187 | esac 1188 | } 1189 | 1190 | NETWORK_CHECK() { 1191 | if [[ -z $(command -v ping) ]] 1192 | then 1193 | echo 0 1194 | return 0 1195 | fi 1196 | ping $1 -c 1 -W 3 > /dev/null 2>&1 1197 | [[ $? == 0 ]] && echo 0 || echo 1 1198 | } 1199 | 1200 | AutoBuild_Core() { 1201 | while : 1202 | do 1203 | clear 1204 | ECHO X "${AutoBuild_Title}\n" 1205 | ECHO X "1. 项目菜单" 1206 | echo "2. 网络测试" 1207 | echo "3. 高级选项" 1208 | echo "q. 退出脚本" 1209 | GET_Choose Choose 1210 | case ${Choose} in 1211 | q | exit) 1212 | rm -r "${Cache_Path}/*" 2> /dev/null 1213 | exit 1214 | ;; 1215 | 1) 1216 | AutoBuild_Second 1217 | ;; 1218 | 2) 1219 | Module_Network_Test 1220 | ;; 1221 | 3) 1222 | Advanced_Options 1223 | ;; 1224 | esac 1225 | done 1226 | } 1227 | 1228 | 1229 | AutoBuild_Second() { 1230 | while :;do 1231 | clear 1232 | cd ${Home} 1233 | ECHO X "${AutoBuild_Title}\n" 1234 | ECHO X "[项目名称] [状态] [项目地址]\n" 1235 | for ((i=0;i<=${#Project_List[@]};i++));do 1236 | e=$(($i + 1)) 1237 | [[ ${Project_List[i]} ]] && Project_Details ${e} ${Project_List[i]} $(cat ${Home}/Depends/Projects/${Project_List[i]} | awk '{print $1}') 1238 | done ; unset e i 1239 | ECHO G "\nx. 更新所有项目" 1240 | ECHO X "m. 主菜单\n" 1241 | read -p '请从上方选择一个项目:' Choose 1242 | [[ ${Choose} =~ [0-9] ]] && Choose=$((${Choose} - 1)) 1243 | case ${Choose} in 1244 | q | m | exit) 1245 | AutoBuild_Core 1246 | ;; 1247 | x) 1248 | for X in ${Project_List[@]} 1249 | do 1250 | Sources_Update common ${X} 1251 | done ; unset X 1252 | ;; 1253 | [0-9]) 1254 | [[ ${Project_List[${Choose}]} ]] && \ 1255 | Second_Menu ${Project_List[${Choose}]} 1256 | ;; 1257 | esac 1258 | done 1259 | } 1260 | 1261 | Project_Details() { 1262 | if [[ -f ${Home}/Projects/$2/Makefile ]] 1263 | then 1264 | printf "%s. %-22s ${Yellow}%-19s${Grey}%-19s\n${White}" $1 $2 [正常] $3 1265 | else 1266 | printf "%s. %-22s ${Red}%-19s${Grey}%-19s\n${White}" $1 $2 [异常] $3 1267 | fi 1268 | } 1269 | 1270 | Sources_Update() { 1271 | if [[ ! -f ${Home}/Projects/$2/Makefile ]] 1272 | then 1273 | return 1274 | fi 1275 | if [[ $(NETWORK_CHECK 223.5.5.5) == 1 ]] 1276 | then 1277 | ECHO R "\n网络连接错误, 更新失败!" 1278 | sleep 2 1279 | return 1280 | fi 1281 | clear 1282 | Update_Logfile=${Home}/Log/Update_${2}_$(date +%Y%m%d-%H%M).log 1283 | cd ${Home}/Projects/$2 1284 | case $1 in 1285 | force) 1286 | ECHO X "开始强制更新[$2], 请稍后 ...\n" 1287 | git fetch --all | tee -a ${Update_Logfile} 1288 | git reset --hard origin/$(GET_Branch ${Build_Path}) | tee -a ${Update_Logfile} 1289 | ;; 1290 | common) 1291 | ECHO X "开始更新[$2], 请稍后 ...\n" 1292 | ;; 1293 | esac 1294 | git pull 2>&1 | tee ${Update_Logfile} 1295 | ./scripts/feeds update -a 2>&1 | tee -a ${Update_Logfile} 1296 | ./scripts/feeds install -a 2>&1 | tee -a ${Update_Logfile} 1297 | ECHO Y "\n[$2] 源码文件更新结束!" 1298 | sleep 2 1299 | } 1300 | 1301 | Home=$(cd $(dirname $0); pwd) 1302 | Cache_Path=${Home}/Cache 1303 | 1304 | White="\e[0m" 1305 | Yellow="\e[33m" 1306 | Red="\e[31m" 1307 | Blue="\e[34m" 1308 | Grey="\e[36m" 1309 | Green="\e[32m" 1310 | 1311 | Path_Depends=( 1312 | Projects 1313 | Cache 1314 | Packages 1315 | Packages/luci-app-common 1316 | Packages/luci-theme-common 1317 | Firmware 1318 | Backups 1319 | Backups/AutoBuild-Update 1320 | Backups/Projects 1321 | Backups/OldVersion 1322 | Backups/Configs 1323 | Backups/dl 1324 | Configs 1325 | Configs/SSH 1326 | Log 1327 | Depends/Sources_List 1328 | Depends/Projects 1329 | ) 1330 | 1331 | Backup_List=( 1332 | config 1333 | include 1334 | package 1335 | scripts 1336 | target 1337 | toolchain 1338 | tools 1339 | Config.in 1340 | Makefile 1341 | BSDmakefile 1342 | feeds.conf.default 1343 | rules.mk 1344 | ) 1345 | 1346 | Project_List=($(ls -1 ${Home}/Depends/Projects 2> /dev/null | sort | uniq)) 1347 | 1348 | Dependency=( 1349 | build-essential asciidoc binutils 1350 | bzip2 gawk gettext git 1351 | libncurses5-dev libz-dev patch python3 1352 | python2.7 unzip zlib1g-dev lib32gcc-s1 1353 | libc6-dev-i386 subversion flex uglifyjs git 1354 | gcc-multilib p7zip p7zip-full msmtp libssl-dev 1355 | texinfo libglib2.0-dev xmlto qemu-utils upx 1356 | libelf-dev autoconf automake libtool autopoint 1357 | device-tree-compiler g++-multilib antlr3 gperf 1358 | wget curl swig rsync busybox 1359 | ) 1360 | Extra_Dependency=(ntpdate httping ssh lm-sensors net-tools expect inetutils-ping) 1361 | 1362 | for X in ${Path_Depends[@]} 1363 | do 1364 | [[ ! -d ${Home}/${X} ]] && mkdir -p ${Home}/${X} 2> /dev/null 1365 | done ; unset X Path_Depends 1366 | 1367 | GET_System_Info 1 1368 | AutoBuild_Title="AutoBuild Core ${Version}-${Update} [${Short_OS}] [${LOGNAME}]" 1369 | AutoBuild_Core 1370 | -------------------------------------------------------------------------------- /Depends/Projects/ImmortalWrt: -------------------------------------------------------------------------------- 1 | https://github.com/immortalwrt/immortalwrt 2 | openwrt-21.02 3 | master 4 | openwrt-18.06 5 | openwrt-18.06-k5.4 6 | 7 | -------------------------------------------------------------------------------- /Depends/Projects/Lede: -------------------------------------------------------------------------------- 1 | https://github.com/coolsnowwolf/lede 2 | master 3 | -------------------------------------------------------------------------------- /Depends/Projects/Lienol: -------------------------------------------------------------------------------- 1 | https://github.com/lienol/openwrt 2 | 21.02 3 | 19.07-cannotuse 4 | 19.07 5 | 22.03 6 | master -------------------------------------------------------------------------------- /Depends/Projects/Openwrt: -------------------------------------------------------------------------------- 1 | https://github.com/openwrt/openwrt 2 | master 3 | lede-17.01 4 | openwrt-18.06 5 | openwrt-19.07 6 | openwrt-21.02 7 | openwrt-22.03 -------------------------------------------------------------------------------- /Depends/Sources_List/Codename: -------------------------------------------------------------------------------- 1 | 16.04 xenial 2 | 18.04 bonic 3 | 18.10 cosmic 4 | 19.04 disco 5 | 19.10 oean 6 | 20.04 focal 7 | 20.10 groovy 8 | 21.04 hirsute 9 | 21.10 impish 10 | 22.04 jammy 11 | 22.10 kinetic 12 | 23.04 lunar -------------------------------------------------------------------------------- /Depends/Sources_List/Mirror: -------------------------------------------------------------------------------- 1 | 阿里云 http://mirrors.aliyun.com/ubuntu/ 2 | 清华 https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ 3 | 中科大 https://mirrors.ustc.edu.cn/ubuntu/ 4 | 网易163 http://mirrors.163.com/ubuntu/ 5 | 中国 http://cn.archive.ubuntu.com/ubuntu/ 6 | 香港 http://hk.archive.ubuntu.com/ubuntu/ 7 | 新加坡 http://sg.archive.ubuntu.com/ubuntu/ 8 | -------------------------------------------------------------------------------- /Depends/Sources_List/Template: -------------------------------------------------------------------------------- 1 | deb ServerUrl Codename main restricted universe multiverse 2 | deb ServerUrl Codename-updates main restricted universe multiverse 3 | deb ServerUrl Codename-proposed main restricted universe multiverse 4 | deb ServerUrl Codename-security main restricted universe multiverse 5 | deb ServerUrl Codename-backports main restricted universe multiverse 6 | # deb-src ServerUrl Codename main restricted universe multiverse 7 | # deb-src ServerUrl Codename-updates main restricted universe multiverse 8 | # deb-src ServerUrl Codename-proposed main restricted universe multiverse 9 | # deb-src ServerUrl Codename-security main restricted universe multiverse 10 | # deb-src ServerUrl Codename-backports main restricted universe multiverse 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Hyy2001X 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AutoBuild/更方便地编译Openwrt 2 | 3 | 测试通过的操作系统: `Ubuntu 20.04、Ubuntu 19.10、Ubuntu 18.04、Deepin 20` 4 | 5 | ## 使用方法/Usage: 6 | 7 | 1.打开终端[Ctrl+Alt+A],更新系统软件包列表 8 | `sudo apt-get update` 9 | 10 | 2.安装 AutoBuild 的必要依赖 11 | `sudo apt-get -y install git httping ntpdate subversion ssh lm-sensors expect inetutils-ping bc` 12 | 13 | 3.克隆 `AutoBuild 项目`到电脑 14 | `git clone https://github.com/Hyy2001X/AutoBuild.git AutoBuild` 15 | 16 | 4.进入 AutoBuild 目录 17 | `cd ./AutoBuild` 18 | 19 | 5.为脚本设置可运行权限 20 | `chmod +x AutoBuild.sh` 21 | 22 | 6.运行脚本 23 | `./AutoBuild.sh` 24 | 25 | 步骤 `4 - 6` 快捷脚本 26 | `cd ./AutoBuild && chmod +x AutoBuild.sh && ./AutoBuild.sh` 27 | 28 | AutoBuild 支持使用自定义源码地址以及分支,修改 `Additional/GitLink_*` 即可实现自定义. 29 | --------------------------------------------------------------------------------