#!/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. DIALOG_CANCEL=1 DIALOG_ESC=255 #-----------------------------------------------------------------------------------------------------------------------------------------# # 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+)') [[ -z "${DEFAULT_ADAPTER// }" ]] && DEFAULT_ADAPTER="lo" dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading Armbian configuration utility ... " 5 45 sleep 1 check_if_installed (){ #------------------------------------------------------------------------------------------------------------------------------------------ # check dpkg status of $1 -- currently only 'not installed at all' case catched #------------------------------------------------------------------------------------------------------------------------------------------ local DPKG_Status="$(dpkg -s "$1" 2>/dev/null | awk -F": " '/^Status/ {print $2}')" if [[ "X${DPKG_Status}" = "X" || "${DPKG_Status}" = *deinstall* ]]; then return 1 else return 0 fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # check all possible wireless modes # function check_advanced_modes () { CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;sleep 2;service hostapd status|grep fail) # check n,a and ac modes if [[ -z "$CHECK" ]]; then dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors --infobox "\nProbing wireless 802.11n \Z1(150-300Mbps)\Z0" 5 43 sleep 2 sed '/### IEEE 802.11n/,/^### IEEE 802.11n/ s/^# *//' -i /etc/hostapd.conf CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;sleep 2;service hostapd status|grep fail) if [[ -z "$CHECK" ]]; then # check various HT modes check_ht_capab # than go to check 5Ghz dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors --infobox "\nProbing wireless 802.11a \Z1(5Ghz)\Z0" 5 36 sleep 2 sed '/### IEEE 802.11a\>/,/^### IEEE 802.11a\>/ s/^# *//' -i /etc/hostapd.conf CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;sleep 2;service hostapd status|grep fail) if [[ -n "$CHECK" ]]; then check_channels fi CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;service hostapd status|grep fail) if [[ -z "$CHECK" ]]; then dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors \ --infobox "\nProbing wireless 802.11ac \Z1(433Mbps x n @ 5Ghz)\Z0" 5 51 sleep 2 sed '/### IEEE 802.11ac\>/,/^### IEEE 802.11ac\>/ s/^# *//' -i /etc/hostapd.conf CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;service hostapd status|grep fail) if [[ -n "$CHECK" ]]; then dialog --title " Reverting configuration " --backtitle "$BACKTITLE" --no-collapse --colors \ --infobox "\nWireless 802.11ac \Z1(433Mbps x n @ 5Ghz)\Z0 is not supported!" 5 60 sed '/## IEEE 802.11ac\>/,/^## IEEE 802.11ac\>/ s/.*/#&/' -i /etc/hostapd.conf fi else dialog --title " Reverting configuration " --backtitle "$BACKTITLE" --no-collapse --colors \ --infobox "\nWireless 802.11a \Z1(5Ghz)\Z0 is not supported!" 5 45 sed -i "s/^channel=.*/channel=5/" /etc/hostapd.conf sed '/## IEEE 802.11a\>/,/^## IEEE 802.11a\>/ s/.*/#&/' -i /etc/hostapd.conf fi else dialog --title " Reverting configuration " --backtitle "$BACKTITLE" --no-collapse --colors \ --infobox "\nWireless 802.11n \Z1(150-300Mbps)\Z0 is not supported!" 5 52 sed '/## IEEE 802.11n/,/^## IEEE 802.11n/ s/.*/#&/' -i /etc/hostapd.conf fi 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 } # #-----------------------------------------------------------------------------------------------------------------------------------------# # # reaload network related services. some are "just in case" # function reload-nety() { systemctl daemon-reload 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 systemctl restart systemd-resolved.service } #-----------------------------------------------------------------------------------------------------------------------------------------# # # 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 --colors --backtitle "$BACKTITLE" --no-collapse --title " $1 " --clear --msgbox "\n$2\n \n" $3 56 } #-----------------------------------------------------------------------------------------------------------------------------------------# # # check wifi high throughput # function check_ht_capab () { declare -a arr=("[HT40+][LDPC][SHORT-GI-20][SHORT-GI-40][TX-STBC][RX-STBC1][DSSS_CCK-40][SMPS-STATIC]" \ "[HT40-][SHORT-GI-40][SHORT-GI-40][DSSS_CCK-40]" "[SHORT-GI-20][SHORT-GI-40][HT40+]") local j=0 for i in "${arr[@]}" do j=$((j+1)) dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors \ --infobox "\nProbing high throughput capabilities \Z1(${j})\Z0" 5 46 sed -i "s/^ht_capab=.*/ht_capab=$i/" /etc/hostapd.conf CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;sleep 2;service hostapd status|grep fail) if [[ -z "$CHECK" ]]; then break; fi done } #-----------------------------------------------------------------------------------------------------------------------------------------# # # check 5Ghz channels # function check_channels () { declare -a arr=("36" "40") for i in "${arr[@]}" do dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors --infobox "\nProbing channels \Z1(${i})\Z0" 5 26 sed -i "s/^channel=.*/channel=$i/" /etc/hostapd.conf CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;sleep 2;service hostapd status|grep fail) if [[ -z "$CHECK" ]]; then break; fi done } #-----------------------------------------------------------------------------------------------------------------------------------------# # # 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" ;; *uk.armbian.com*) echo "United Kingdom" ;; *.armbian.com*) echo "Estonia" ;; *) echo "" ;; esac } #-----------------------------------------------------------------------------------------------------------------------------------------# # edit ip address # 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 if [[ $TARGET_BRANCH == "default" ]]; then TARGET_BRANCH=""; else TARGET_BRANCH="-"$TARGET_BRANCH; fi if [[ $TARGET_FAMILY == sun*i ]]; then TARGET_FAMILY="sunxi" if [[ $UBOOT_BRANCH == "default" ]]; then TARGET_FAMILY=$(cat /proc/cpuinfo | grep "Hardware" | sed 's/^.*Allwinner //' | awk '{print $1;}') fi fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # 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 --cancel-label "Back" --backtitle "$BACKTITLE" --no-collapse \ --title "Upgrade from $BRANCH to:" --clear --menu "" $((6+${LIST_LENGHT})) 40 15 "${LIST[@]}" 2>&1 1>&3) exitstatus=$?; exec 3>&- fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # select video modes for a10 and a20 # function get_a20modes () { IFS=$'\r' GLOBIGNORE='*' SCREEN_RESOLUTION=("1920x1080p60" "1280x720p60" "1920x1080p50" "1280x1024p60" "1024x768p60" "800x600p60" "640x480p60" "1360x768p60" "1440x900p60" "1680x1050p60") local LIST=() for i in "${SCREEN_RESOLUTION[@]}" do LIST+=( "${i[0]//[[:blank:]]/}" "" ) done LIST_LENGHT=$((${#LIST[@]}/2)); #echo $LIST_LENGHT #exit if [ "$LIST_LENGHT" -eq 1 ]; then SCREEN_RESOLUTION=${SCREEN_RESOLUTION[0]} else exec 3>&1 SCREEN_RESOLUTION=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \ --title "Select video mode" --clear --menu "" $((6+${LIST_LENGHT})) 25 $((1+${LIST_LENGHT})) "${LIST[@]}" 2>&1 1>&3) exec 3>&- fi } #-----------------------------------------------------------------------------------------------------------------------------------------# # select video modes for h3 # function get_h3modes () { IFS=$'\r\n' GLOBIGNORE='*' SCREEN_RESOLUTION=($(h3disp -i)) local LIST=() for i in "${SCREEN_RESOLUTION[@]}" do LIST+=( "${i[0]//[[:blank:]]/}" "" ) done LIST_LENGHT=$((${#LIST[@]}/2)); #echo $LIST_LENGHT #exit if [ "$LIST_LENGHT" -eq 1 ]; then SCREEN_RESOLUTION=${SCREEN_RESOLUTION[0]} else exec 3>&1 SCREEN_RESOLUTION=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \ --title "Select video mode" --clear --menu "" $((6+${LIST_LENGHT})) 25 $((1+${LIST_LENGHT})) "${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 0 ]; then DEFAULT_ADAPTER="lo" elif [ "$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 } #-----------------------------------------------------------------------------------------------------------------------------------------# # system # function submenu_settings () { while true; do LIST=() LIST+=( "Timezone" "Change timezone \Z5($(date +%Z))\Z0" ) LIST+=( "Locales" "Reconfigure language \Z5($(locale | grep LANGUAGE | cut -d= -f2 | cut -d_ -f1))\Z0 and character set" ) LIST+=( "Hostname" "Change your hostname \Z5($(cat /etc/hostname))\Z0" ) LIST+=( "SSH" "Reconfigure SSH daemon" ) LIST+=( "Firmware" "Upgrade board firmware" ) # detect desktop DISPLAY_MANAGER=""; DESKTOP_INSTALLED="" if [ $(dpkg-query -W -f='${db:Status-Abbrev}\n' nodm 2>/dev/null) <> "*ii*" ]; then DESKTOP_INSTALLED="nodm"; fi if [ $(dpkg-query -W -f='${db:Status-Abbrev}\n' lightdm 2>/dev/null) <> "*ii*" ]; then DESKTOP_INSTALLED="lightdm"; fi [[ -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" 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" ) elif [[ -n $DESKTOP_INSTALLED ]]; then LIST+=( "Desktop" "Enable desktop" ) fi if [[ -n $DISPLAY_MANAGER ]]; 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="$((6+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} exec 3>&1 selection=$(dialog --colors --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 # run main function jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # menu for networking # function submenu_networking () { # if there is more than one connected device 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 if pgrep -x "iperf3" > /dev/null then LIST+=( "Iperf3" "Disable network throughput tests daemon" ) else LIST+=( "Iperf3" "Enable network throughput tests daemon" ) fi if [[ -n $(nmcli device status | grep wifi | grep -v unavailable | grep -v unmanaged) ]]; then LIST+=( "WiFi" "Manage wireless networking" ) else LIST+=( "Clear" "Clear possible blocked interfaces" ) fi if [[ -n $(service bluetooth status | grep -w active | grep -w running) ]]; then [[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Discover" "Discover and connect Bluetooth devices" ) fi [[ -d /usr/local/vpnclient ]] && LIST+=( "VPN" "Manage Softether VPN client" ) && VPNSERVERIP=$(/usr/local/vpnclient/vpncmd /client localhost /cmd accountlist | grep "VPN Server" |grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1) 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="$((12+${#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 $(nmcli device status | grep wlan0 | grep connected) ]]; then local ifup="\nIP ($DEFAULT_ADAPTER) via Network Manager: \Z1${ipadd}\n\Z0 " else local ifup="\nIP ($DEFAULT_ADAPTER) via IFUPDOWN: \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 $VPNSERVERIP ]]; then local vpnserverip="\n\Z0Connected to VPN server: \Z1${VPNSERVERIP}\n\Z0 " disclaimer=$disclaimer"$vpnserverip" LISTLENGHT=$((LISTLENGHT+2)) fi if [[ -n $HOSTAPDINFO && -n $HOSTAPDSTATUS ]]; then LISTLENGHT=$((LISTLENGHT+2)) chpid=$(dmesg | grep $(grep ^interface /etc/hostapd.conf | sed 's/interface=//g') | head -1 | sed 's/\[.*\]//g' | awk '{print $1}') disclaimer=$disclaimer$"\n\Z0Hotspot SSID: \Z1$HOSTAPDINFO\Zn Band:"; if [[ `grep ^hw_mode=a /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 [ -n $chpid ]; then disclaimer=$disclaimer$"\n\nChip: \Z1${chpid}\Z0"; fi if [ "$HOSTAPDCLIENTS" -gt "0" ]; then disclaimer=$disclaimer$" Connected clients: \Z1$HOSTAPDCLIENTS\Zn"; fi if [ -n $chip ] || [ "$HOSTAPDCLIENTS" -gt "0" ]; then LISTLENGHT=$((LISTLENGHT+2)); fi disclaimer=$disclaimer$"\n"; fi disclaimer=$disclaimer"\n\Z1Note\Zn: This tool can be successful only when drivers are in good shape. If autodetection fails, you are on your own.\n " 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 # run main function jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # armbian # function submenu_hardware () { while true; do LIST=() [[ $(sed -n 's/^DEVNAME=//p' /sys/dev/block/$(mountpoint -d /)/uevent 2> /dev/null) == 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+=( "Defreeze" "Defreeze firmware upgrade" ) else LIST+=( "Freeze" "Freeze firmware upgrade" ) 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" ) [[ -f /etc/apt/sources.list.d/armbian.list ]] && LIST+=( "Mirror" "Change repository server" ) 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="$((6+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} 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 # run main function jobs "$selection" done } #-----------------------------------------------------------------------------------------------------------------------------------------# # software # function submenu_software () { while true; do LIST=() [[ -f /usr/bin/softy ]] && LIST+=( "Softy" "3rd party applications installer" ) [[ -f /usr/bin/h3consumption && "$LINUXFAMILY" = "sun8i" && "$BRANCH" = "default" ]] && \ LIST+=( "Consumption" "Control board consumption" ) check_if_installed bluetooth && LIST+=( "Remove BT" "Remove Bluetooth support" ) || LIST+=( "Bluetooth" "Install Bluetooth support" ) check_if_installed lirc && LIST+=( "Remove IR" "Remove IR support" ) || LIST+=( "IR" "Install IR support" ) [[ -f /usr/bin/armbianmonitor ]] && LIST+=( "Monitor" "Simple CLI board 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 [[ "$LINUXFAMILY" = sun*i && "$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="$((6+${#LIST[@]}/2))" BOXLENGHT=${#LIST[@]} 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 # run main function jobs "$selection" done }