#!/bin/bash # # Copyright (c) 2017 Igor Pecovnik, igor.pecovnik@gma**.com # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. #-----------------------------------------------------------------------------------------------------------------------------------------# # check for root # if [[ $EUID != 0 ]]; then echo "Warning. This script requires root privileges. Exiting ..." sleep 2 exit fi #-----------------------------------------------------------------------------------------------------------------------------------------# # check if we have internet connection to install dependencies # echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1 if [[ $? -ne 0 ]]; then read -n 1 -s -p "Warning. Configurator can't work properly without internet connection. \ Press CTRL C to stop to stop or any key to ignore and continue." else [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' bc 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install bc [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' expect 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install expect [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' rcconf 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install rcconf [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' dialog 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install dialog [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' network-manager 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install network-manager [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' sunxi-tools 2>/dev/null) != *ii* ]] && \ apt-get -qq -y --no-install-recommends install sunxi-tools fi #-----------------------------------------------------------------------------------------------------------------------------------------# # # create interface configuration section # function create_if_config() { address=$(ip -4 addr show dev $1 | awk '/inet/ {print $2}' | cut -d'/' -f1) netmask=$(ifconfig $1 | sed -rn '2s/ .*:(.*)$/\1/p') gateway=$(route -n | grep 'UG[ \t]' | awk '{print $2}' | sed -n '1p') echo -e "# armbian-config created" echo -e "source /etc/network/interfaces.d/*\n" echo -e "allow-hotplug $2\nno-auto-down $2" if [[ "$3" != "fixed" ]]; then echo -e "iface $2 inet dhcp" else echo -e "iface $2 inet static\n\taddress $address\n\tnetmask $netmask\n\tgateway $gateway\n\tdns-nameservers 8.8.8.8" fi } # function reload-nety() { if [[ "$1" == "reload" ]]; then WHATODO="Reloading services"; else WHATODO="Stopping services"; fi (service network-manager stop; echo 10; sleep 1;\ service hostapd stop; echo 20; sleep 1;\ service dnsmasq stop; echo 30; sleep 1;\ [[ "$1" == "reload" ]] && service dnsmasq start && echo 60 && sleep 1 && service hostapd start && echo 80 && sleep 1;\ service network-manager start; echo 90; sleep 5;) | dialog --backtitle "$BACKTITLE" --title " $WHATODO " --gauge "" 6 70 0 } #-----------------------------------------------------------------------------------------------------------------------------------------# # gather info about the board and start with loading menu # [[ -f /etc/armbian-release ]] && source /etc/armbian-release && ARMBIAN="Armbian $VERSION $IMAGE_TYPE"; DISTRO=$(lsb_release -is) DISTROID=$(lsb_release -sc) KERNELID=$(uname -r) BACKTITLE="Configuration utility, $ARMBIAN, https://www.armbian.com" TITLE="$BOARD_NAME " DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)') dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading Armbian configuration utility ... " 5 45 #-----------------------------------------------------------------------------------------------------------------------------------------# # # Check if something is running on port $1 and display info # check_port () { [[ -n $(netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".'$1'"') ]] && dialog --backtitle "$BACKTITLE" --title "Checking service" \ --msgbox "\nIt looks good.\n\nThere is $2 service on port $1" 9 52 } #-----------------------------------------------------------------------------------------------------------------------------------------# # # show disclaimer # function beta_disclaimer () { exec 3>&1 ACKNOWLEDGEMENT=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse --title " Warning " --clear \--radiolist "\n$1.\n \n" 12 56 7 "Yes, I understand" "" off 2>&1 1>&3) exec 3>&- } #-----------------------------------------------------------------------------------------------------------------------------------------# # # show box # function show_box () { dialog --no-shadow --backtitle "$BACKTITLE" --no-collapse --title " $1 " --clear --msgbox "\n$2\n \n" $3 56 } #-----------------------------------------------------------------------------------------------------------------------------------------# # # show description for MOTD files # function description { case $1 in *header*) echo "Big board logo and kernel info" ;; *sysinfo*) echo "Sysinfo - load, ip, memory, uptime, ..." ;; *tips*) echo "Shows tip of the day" ;; *updates*) echo "Display number of avaliable updates" ;; *armbian-config*) echo "Show command for system configuration" ;; *autoreboot-warn*) echo "Show warning when reboot is needed" ;; *) echo "" ;; esac } function ip_editor () { exec 3>&1 dialog --title " Static IP configuration" --backtitle "$BACKTITLE" --form "\nAdapter: $1 \n " 12 38 0 \ "Address:" 1 1 "$address" 1 15 15 0 \ "Netmask:" 2 1 "$netmask" 2 15 15 0 \ "Gateway:" 3 1 "$gateway" 3 15 15 0 \ 2>&1 1>&3 | { read -r address;read -r netmask;read -r gateway if [[ $? = 0 ]]; then echo -e "# armbian-config created\nsource /etc/network/interfaces.d/*\n\nallow-hotplug $2\nno-auto-down $2\niface $2 inet static\n\taddress $address\n\tnetmask $netmask\n\tgateway $gateway\n\tdns-nameservers 8.8.8.8" > $3 fi } } #-----------------------------------------------------------------------------------------------------------------------------------------# # edit hostapd parameters # function wlan_edit_basic () { source /etc/hostapd.conf exec 3>&1 dialog --title "AP configuration" --backtitle "$BACKTITLE" --form "\nWPA2 enabled, \ advanced config: edit /etc/hostapd.conf\n " 12 58 0 \ "SSID:" 1 1 "$ssid" 1 31 22 0 \ "Password:" 2 1 "$wpa_passphrase" 2 31 22 0 \ "Channel:" 3 1 "$channel" 3 31 3 0 \ 2>&1 1>&3 | { read -r ssid;read -r wpa_passphrase;read -r channel if [[ $? = 0 ]]; then sed -i "s/^ssid=.*/ssid=$ssid/" /etc/hostapd.conf sed -i "s/^wpa_passphrase=.*/wpa_passphrase=$wpa_passphrase/" /etc/hostapd.conf sed -i "s/^channel=.*/channel=$channel/" /etc/hostapd.conf wpa_psk=$(wpa_passphrase $ssid $wpa_passphrase | grep '^[[:blank:]]*[^[:blank:]#;]' | grep psk | cut -d= -f2-) sed -i "s/^wpa_psk=.*/wpa_psk=$wpa_psk/" /etc/hostapd.conf fi } } #-----------------------------------------------------------------------------------------------------------------------------------------# # edit hostapd parameters # function wlan_edit () { # select default interfaces if there is more than one select_default_interface dialog --title " Configuration edit " --colors --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Basic" --no-label "Advanced" --yesno "\n\Z1Basic:\Z0 Change SSID, password and channel\n\n\Z1Advanced:\Z0 Edit /etc/hostapd.conf file" 9 70 if [[ $? = 0 ]]; then wlan_edit_basic elif [[ $? = 1 ]]; then dialog --backtitle "$BACKTITLE" --title " Edit hostapd configuration /etc/hostapd.conf" --no-collapse \ --ok-label "Save" --editbox /etc/hostapd.conf 30 0 2> /etc/hostapd.conf.out [[ $? = 0 ]] && mv /etc/hostapd.conf.out /etc/hostapd.conf && service hostapd restart fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # naming exceptions for packages # function exceptions () { TARGET_FAMILY=$LINUXFAMILY UBOOT_BRANCH=$TARGET_BRANCH # uboot naming is different case $BOARD in cubietruck | cubieboard2 | bananapipro | lamobo-r1 | orangepi | orangepimini | lime* | micro | pcduino3 | pcduino3nano) if [[ $TARGET_BRANCH == "default" ]]; \ then TARGET_FAMILY="sun7i"; TARGET_BRANCH=""; else TARGET_FAMILY="sunxi"; TARGET_BRANCH="-"$TARGET_BRANCH; fi ;; cubieboard | lime-a10 | pcduino2) if [[ $TARGET_BRANCH == "default" ]]; \ then TARGET_FAMILY="sun4i"; TARGET_BRANCH=""; else TARGET_FAMILY="sunxi"; TARGET_BRANCH="-"$TARGET_BRANCH; fi ;; *) if [[ $TARGET_BRANCH == "default" ]]; \ then TARGET_BRANCH=""; else TARGET_BRANCH="-"$TARGET_BRANCH; fi esac } #-----------------------------------------------------------------------------------------------------------------------------------------# # here we add wifi exceptions # function wlan_exceptions () { [[ -n "$(lsmod | grep -w dhd)" && $1 = "on" ]] && \ echo 'options dhd op_mode=2' >/etc/modprobe.d/ap6212.conf && rmmod dhd && modprobe dhd [[ -n "$(lsmod | grep -w dhd)" && $1 = "off" ]] && \ rm /etc/modprobe.d/ap6212.conf && rmmod dhd && modprobe dhd } #-----------------------------------------------------------------------------------------------------------------------------------------# # check if board has alternative kernels # function aval_kernel () { IFS=$'\r\n' GLOBIGNORE='*' AVAL_KERNEL=($(apt-cache search --names-only '^linux-'$(lsb_release -cs)'-root.*.'$BOARD'*' \ | grep -w "$BOARD " | sed 's/.*(\(.*\))/\1/' | awk '{print $1}' | grep -v "$BRANCH" )) local LIST=() for i in "${AVAL_KERNEL[@]}" do LIST+=( "${i[0]//[[:blank:]]/}" "" ) done LIST_LENGHT=$((${#LIST[@]}/2)); if [ "$LIST_LENGHT" -eq 1 ]; then TARGET_BRANCH=${AVAL_KERNEL[0]} else exec 3>&1 TARGET_BRANCH=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \ --title "Upgrade from $BRANCH to:" --clear --menu "" $((6+${LIST_LENGHT})) 40 15 "${LIST[@]}" 2>&1 1>&3) exec 3>&- fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # search for wlan interfaces and provide a selection menu if there are more than one # function get_wlan_interface () { IFS=$'\r\n' GLOBIGNORE='*' WLAN_INTERFACES=($(nmcli dev status | grep wifi | grep disconnected |awk '{print $1}')) local LIST=() for i in "${WLAN_INTERFACES[@]}" do LIST+=( "${i[0]//[[:blank:]]/}" "" ) done LIST_LENGHT=$((${#LIST[@]}/2)); if [ "$LIST_LENGHT" -eq 1 ]; then WIRELESS_ADAPTER=${WLAN_INTERFACES[0]} else exec 3>&1 WIRELESS_ADAPTER=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \ --title "Select interface" --clear --menu "" $((6+${LIST_LENGHT})) 30 15 "${LIST[@]}" 2>&1 1>&3) exec 3>&- fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # select interface if there is more than one # function select_default_interface () { IFS=$'\r\n' GLOBIGNORE='*' local ADAPTER=($(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')) local LIST=() for i in "${ADAPTER[@]}" do LIST+=( "${i[0]//[[:blank:]]/}" "" ) done LIST_LENGHT=$((${#LIST[@]}/2)); if [ "$LIST_LENGHT" -eq 1 ]; then DEFAULT_ADAPTER=${ADAPTER[0]} else exec 3>&1 DEFAULT_ADAPTER=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \ --title "Select default interface" --clear --menu "" $((6+${LIST_LENGHT})) 30 15 "${LIST[@]}" 2>&1 1>&3) exec 3>&- fi } # search for BT devices and connect # function connect_bt_interface () { IFS=$'\r\n' GLOBIGNORE='*' dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nDiscovering Bluetooth devices ... " 5 37 BT_INTERFACES=($(hcitool scan | sed '1d')) local LIST=() for i in "${BT_INTERFACES[@]}" do local a=$(echo ${i[0]//[[:blank:]]/} | sed -e 's/^\(.\{17\}\).*/\1/') local b=${i[0]//$a/} local b=$(echo $b | sed -e 's/^[ \t]*//') LIST+=( "$a" "$b") done LIST_LENGHT=$((${#LIST[@]}/2)); if [ "$LIST_LENGHT" -eq 0 ]; then BT_ADAPTER=${WLAN_INTERFACES[0]} dialog --backtitle "$BACKTITLE" --title "Bluetooth" --msgbox "\nNo nearby Bluetooth devices were found!" 7 43 else exec 3>&1 BT_ADAPTER=$(dialog --backtitle "$BACKTITLE" --no-collapse --title "Select interface" \ --clear --menu "" $((6+${LIST_LENGHT})) 50 15 "${LIST[@]}" 2>&1 1>&3) exec 3>&- if [[ $BT_ADAPTER != "" ]]; then dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nConnecting to $BT_ADAPTER " 5 35 BT_EXEC=$(expect -c 'set prompt "#";set address '$BT_ADAPTER';spawn bluetoothctl;expect -re $prompt;send "disconnect $address\r";sleep 1;send "remove $address\r";sleep 1;expect -re $prompt;send "scan on\r";sleep 8;send "scan off\r";expect "Controller";send "trust $address\r";sleep 2;send "pair $address\r";sleep 2;send "connect $address\r";send_user "\nShould be paired now.\r";sleep 2;send "quit\r";expect eof') echo "$BT_EXEC" > /tmp/bt-connect-debug.log if [[ $(echo "$BT_EXEC" | grep "Connection successful" ) != "" ]]; then dialog --backtitle "$BACKTITLE" --title "Bluetooth" --msgbox "\nYour device is ready to use!" 7 32 else dialog --backtitle "$BACKTITLE" --title "Bluetooth" --msgbox "\nError connecting. Try again!" 7 32 fi fi fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # menu for software # function submenu_software () { while true; do LIST=() [[ -f /usr/bin/softy ]] && LIST+=( "Softy" "3rd party applications installer" ) #if [[ -n $(netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".'32032'"') ]]; then # LIST+=( "USB redirector" "Disable USB devices sharing over Ethernet" ) # else # LIST+=( "USB redirector" "Enable USB devices sharing over Ethernet" ) #fi [[ -f /usr/bin/h3consumption && "$LINUXFAMILY" = "sun8i" && "$BRANCH" = "default" ]] && \ LIST+=( "Consumption" "Control board consumption" ) [[ -f /usr/bin/armbianmonitor ]] && LIST+=( "Monitor" "Simple CLI monitoring" ) [[ -f /usr/bin/armbianmonitor ]] && LIST+=( "Diagnostics" "Send diagnostics" ) [[ -f /usr/bin/bin2fex && "$LINUXFAMILY" = sun*i && "$BRANCH" = "default" ]] && LIST+=( "Fexedit" "Board (fex) settings editor" ) if [[ -n $(dpkg -l | grep linux-headers) ]]; then LIST+=( "Headers" "Remove kernel headers" ); else LIST+=( "Headers" "Install kernel headers" ); fi [[ -f /usr/bin/h3disp && "$LINUXFAMILY" = "sun8i" && "$BRANCH" = "default" && \ -n $(bin2fex /dev/null | grep -w "hdmi_used = 1") ]] && LIST+=( "Display" "set the display resolution" ) # count number of menu items to adjust window sizee LISTLENGHT="$((11+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} # display warning only we have wifi if [[ " ${LIST[*]} " == *" Hotspot "* ]]; then local disclaimer="\nNote: wireless networking in Linux is problematic. Our tools make it easy for some cases but can't enable AP on every random WiFi chip. If this tool fail, you are on your own.\n " else LISTLENGHT="$((6+${#LIST[@]}/2))" fi DIALOG_CANCEL=1 DIALOG_ESC=255 exec 3>&1 selection=$(dialog --backtitle "$BACKTITLE" --title "System and 3rd party software" --clear \ --cancel-label "Back" --menu "$disclaimer" $LISTLENGHT 70 $BOXLENGHT \ "${LIST[@]}" 2>&1 1>&3) exit_status=$? exec 3>&- [[ $exit_status == $DIALOG_CANCEL || $exit_status == $DIALOG_ESC ]] && clear && break jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # menu for networking # function submenu_networking () { select_default_interface while true; do LIST=() LIST+=( "IP" "Select dynamic or edit static IP address" ) HOSTAPDBRIDGE=$(cat /etc/hostapd.conf 2> /dev/null | grep -w "^bridge=br0") HOSTAPDSTATUS=$(service hostapd status | grep -w active | grep -w running) if [[ -n "$HOSTAPDSTATUS" ]]; then HOSTAPDINFO=$(hostapd_cli get_config 2> /dev/null | grep ^ssid | sed 's/ssid=//g') HOSTAPDCLIENTS=$(hostapd_cli all_sta 2> /dev/null | grep connected_time | wc -l) LIST+=( "Hotspot" "Manage active wireless access point" ) else [[ -n $(nmcli device status | grep wifi | grep -w disconnected) ]] && LIST+=( "Hotspot" "Create WiFi access point" ) fi [[ -n $(nmcli device status | grep wifi | grep -v unavailable | grep -v unmanaged) ]] && LIST+=( "WiFi" "Manage wireless networking" ) if [[ -n $(service bluetooth status | grep -w active | grep -w running) ]]; then [[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Bluetooth" "Connect Bluetooth devices" ) fi LIST+=( "Advanced" "Edit /etc/network/interfaces" ) [[ $(ls -1 /etc/NetworkManager/system-connections 2> /dev/null) ]] && LIST+=( "Forget" "Disconnect and forget all wireless connections" ) # count number of menu items to adjust window sizee LISTLENGHT="$((13+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} WIFICONNECTED=$(nmcli -f NAME,TYPE connection show --active | grep wireless | awk 'NF{NF-=1};1') local disclaimer="" local ipadd=$(ip -4 addr show dev $DEFAULT_ADAPTER | awk '/inet/ {print $2}' | cut -d'/' -f1) if [[ -n $(grep $DEFAULT_ADAPTER /etc/network/interfaces | grep static) ]]; then local ifup="\nStatic IP ($DEFAULT_ADAPTER) via IFUPDOWN: \Z1${ipadd}\n\Z0 " elif [[ -n $(grep $DEFAULT_ADAPTER /etc/network/interfaces | grep dhcp) ]]; then local ifup="\nDynamic IP ($DEFAULT_ADAPTER) via IFUPDOWN: \Z1${ipadd}\n\Z0 " else local ifup="\nDynamic IP ($DEFAULT_ADAPTER) via Network Manager: \Z1${ipadd}\n\Z0 " fi disclaimer="$ifup" if [[ -n $WIFICONNECTED ]]; then LISTLENGHT=$((LISTLENGHT+2)) local connected="\n\Z0Connected to SSID: \Z1${WIFICONNECTED}\n\Z0 " disclaimer=$disclaimer"$connected" fi if [[ -n $HOSTAPDINFO && -n $HOSTAPDSTATUS ]]; then LISTLENGHT=$((LISTLENGHT+2)) disclaimer=$disclaimer$"\n\Z0Hotspot SSID: \Z1$HOSTAPDINFO\Zn Band:"; if [[ `grep ^ieee80211a /etc/hostapd.conf` ]]; then local band="5Ghz"; else band="2.4Ghz"; fi if [[ `grep ^ieee80211n /etc/hostapd.conf` ]]; then local type="N"; fi if [[ `grep ^ieee80211ac /etc/hostapd.conf` ]]; then local type="AC"; fi disclaimer=$disclaimer$" \Z1${band} ${type}\Z0 " if [ "$HOSTAPDCLIENTS" -gt "0" ]; then disclaimer=$disclaimer$" Connected clients: \Z1$HOSTAPDCLIENTS\Zn"; fi disclaimer=$disclaimer$"\n"; fi #disclaimer=$disclaimer"\n" # display warning only we have wifi #if [[ " ${LIST[*]} " == *" Hotspot "* ]]; then disclaimer=$disclaimer"\n\Z1Note\Zn: wireless networking in Linux is problematic. Our tools make it easy for some cases but can't enable AP on every random WiFi chip. If this tool fail, you are on your own.\n " #else # LISTLENGHT="$((6+${#LIST[@]}/2))" #fi DIALOG_CANCEL=1 DIALOG_ESC=255 exec 3>&1 selection=$(dialog --backtitle "$BACKTITLE" --colors --title " Wired, Wireless, Bluetooth, Hotspot " --clear \ --cancel-label "Back" --menu "${disclaimer}" $LISTLENGHT 70 $BOXLENGHT \ "${LIST[@]}" 2>&1 1>&3) exit_status=$? exec 3>&- [[ $exit_status == $DIALOG_CANCEL || $exit_status == $DIALOG_ESC ]] && clear && break jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # menu for settings # function submenu_settings () { while true; do LIST=() # check for display manager statuses LIST+=( "Timezone" "Change timezone ($(date +%Z))" ) LIST+=( "Locales" "Reconfigure language ($(locale | grep LANGUAGE | cut -d= -f2 | cut -d_ -f1)) and character set" ) LIST+=( "Hostname" "Change your hostname ($(cat /etc/hostname))" ) # check for display manager statuses DISPLAY_MANAGER=""; DESKTOP_INSTALLED="" [[ -n $(service lightdm status 2> /dev/null | grep -w active) ]] && DISPLAY_MANAGER="lightdm" [[ -n $(service nodm status 2> /dev/null | grep -w active) ]] && DISPLAY_MANAGER="nodm" [[ -d /etc/lightdm || -f /etc/default/nodm ]] && DESKTOP_INSTALLED="true" if [[ -n $DISPLAY_MANAGER ]]; then LIST+=( "Desktop" "Disable desktop" ) [[ $DISPLAY_MANAGER == 'nodm' ]] && LIST+=( "Lightdm" "Switch to standard login manager" ) [[ $DISPLAY_MANAGER == 'lightdm' ]] && LIST+=( "Nodm" "Switch to simple auto login manager" ) else LIST+=( "Desktop" "Enable desktop" ) fi if [[ $DESKTOP_INSTALLED ]]; then if [[ $(service xrdp status 2> /dev/null | grep -w active) ]]; then LIST+=( "RDP" "Disable remote desktop access from Windows" ) else LIST+=( "RDP" "Enable remote desktop access from Windows" ) fi fi LIST+=( "Services" "Toggle running services" ) if [[ "$DISTRO" == "Ubuntu" && "$(modinfo overlay > /dev/null 2>&1; echo $?)" == "0" ]]; then if [ -n "$(mount | grep -w tmpfs-root)" ]; then LIST+=( "Overlayroot" "Disable virtual read-only root filesystem" ) else LIST+=( "Overlayroot" "Enable virtual read-only root filesystem" ) fi fi # count number of menu items to adjust window sizee LISTLENGHT="$((11+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} # display warning only we have wifi if [[ " ${LIST[*]} " == *" Hotspot "* ]]; then local disclaimer="\nNote: wireless networking in Linux is problematic. Our tools make it easy for some cases but can't enable AP on every random WiFi chip. If this tool fail, you are on your own.\n " else LISTLENGHT="$((6+${#LIST[@]}/2))" fi DIALOG_CANCEL=1 DIALOG_ESC=255 exec 3>&1 selection=$(dialog --backtitle "$BACKTITLE" --title " System settings " --clear \ --cancel-label "Back" --menu "$disclaimer" $LISTLENGHT 70 $BOXLENGHT \ "${LIST[@]}" 2>&1 1>&3) exit_status=$? exec 3>&- [[ $exit_status == $DIALOG_CANCEL || $exit_status == $DIALOG_ESC ]] && clear && break jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # menu for armbian # function submenu_hardware () { while true; do LIST=() [[ $(sed -n 's/^DEVNAME=//p' /sys/dev/block/$(mountpoint -d /)/uevent) == mmcblk* && -f /usr/sbin/nand-sata-install ]] && LIST+=( "Install" "Install to SATA, eMMC, NAND or USB" ) if [[ -n $(apt-mark showhold | grep -w "$BOARD") ]]; then LIST+=( "Unhold" "Un-Freeze kernel and board support packages" ) else LIST+=( "Hold" "Freeze kernel and board support packages" ) fi [[ -n $(grep -w "#kernel.printk" /etc/sysctl.conf ) ]] && LIST+=( "Lowlevel" "Stop low-level messages on console" ) [[ -f /boot/armbianEnv.txt ]] && LIST+=( "Bootenv" "Edit boot environment" ) [[ -f /boot/boot.ini ]] && LIST+=( "Bootscript" "Edit boot script" ) LIST+=( "Welcome" "Toggle welcome screen items" ) if [[ -z $(apt-mark showhold | grep -w "$BOARD") ]]; then [[ -f /etc/apt/sources.list.d/armbian.list ]] && [[ -n $(grep -w apt /etc/apt/sources.list.d/armbian.list) ]] \ && LIST+=( "Nightly" "Switch to nightly builds" ) [[ -f /etc/apt/sources.list.d/armbian.list ]] && [[ -n $(grep -w beta /etc/apt/sources.list.d/armbian.list) ]] \ && LIST+=( "Stable" "Switch to stable builds" ) fi [[ -d /boot/dtb/overlay && $LINUXFAMILY == sun*i && $BRANCH != default ]] && LIST+=( "Overlays" "Toggle board functions: UART, I2C, SPI, ..." ) [[ $(apt-cache search --names-only '^linux-'$(lsb_release -cs)'-root.*.'$BOARD'' | sed 's/.*(\(.*\))/\1/' | awk '{print $1}' \ | wc -l) -gt 1 ]] && LIST+=( "Switch" "Switch to alternative kernels" ) # count number of menu items to adjust window sizee LISTLENGHT="$((11+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} # display warning only we have wifi if [[ " ${LIST[*]} " == *" Hotspot "* ]]; then local disclaimer="\nNote: wireless networking in Linux is problematic. Our tools make it easy for some cases but can't enable AP on every random WiFi chip. If this tool fail, you are on your own.\n " else LISTLENGHT="$((6+${#LIST[@]}/2))" fi DIALOG_CANCEL=1 DIALOG_ESC=255 exec 3>&1 selection=$(dialog --backtitle "$BACKTITLE" --title " Armbian specific settings " --clear \ --cancel-label "Back" --menu "$disclaimer" $LISTLENGHT 70 $BOXLENGHT \ "${LIST[@]}" 2>&1 1>&3) exit_status=$? exec 3>&- [[ $exit_status == $DIALOG_CANCEL || $exit_status == $DIALOG_ESC ]] && clear && break jobs "$selection" done }