debian-config-submenu 27.1 KB
Newer Older
Igor Pecovnik's avatar
Igor Pecovnik committed
1
2
3
4
5
6
7
8
9
#!/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.


10
11
12
DIALOG_CANCEL=1
DIALOG_ESC=255

Igor Pecovnik's avatar
Igor Pecovnik committed
13
14
15
16




17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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)
34
35
36
37
						if [[ -n "$CHECK" ]]; then
							check_channels
						fi
						CHECK=$(systemctl daemon-reload;service hostapd stop; sleep 2;service hostapd start;service hostapd status|grep fail)
38
39
40
41
42
43
44
45
46
47
48
						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
49
								sed -i "s/^channel=.*/channel=5/" /etc/hostapd.conf
50
51
52
53
54
55
56
57
58
59
								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
}


Igor Pecovnik's avatar
Igor Pecovnik committed
60
61
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
62
# create interface configuration section
Igor Pecovnik's avatar
Igor Pecovnik committed
63
#
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
64
function create_if_config() {
Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
65
66
67
68
69
		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"
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
70
		echo -e "allow-hotplug $2\nno-auto-down $2"
Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
71
		if [[ "$3" != "fixed" ]]; then
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
72
73
			echo -e "iface $2 inet dhcp"
		else
Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
74
			echo -e "iface $2 inet static\n\taddress $address\n\tnetmask $netmask\n\tgateway $gateway\n\tdns-nameservers 8.8.8.8"
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
75
76
		fi
} #
Igor Pecovnik's avatar
Igor Pecovnik committed
77

78
function reload-nety() {
79
systemctl daemon-reload
80
81
82
83
84
85
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
86
systemctl restart systemd-resolved.service
87
88
}

Igor Pecovnik's avatar
Igor Pecovnik committed
89
90
91
92
93
94
95
96
97
98

#-----------------------------------------------------------------------------------------------------------------------------------------#
# 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 "
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
99
DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
Igor Pecovnik's avatar
Igor Pecovnik committed
100

Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
101
dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading Armbian configuration utility ... " 5 45
Igor Pecovnik's avatar
Igor Pecovnik committed
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# 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
Igor Pecovnik's avatar
Igor Pecovnik committed
121
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)
Igor Pecovnik's avatar
Igor Pecovnik committed
122
123
124
125
exec 3>&-
}


Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
126
127
128
129
130
131
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# show box
#
function show_box ()
{
132
dialog --colors --backtitle "$BACKTITLE" --no-collapse --title " $1 " --clear --msgbox "\n$2\n \n" $3 56
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
133
134
135
}


136
137
138
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+]")
139
local j=0
140
141
for i in "${arr[@]}"
do
142
143
	j=$((j+1))
	dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --colors --infobox "\nProbing high throughput capabilities \Z1(${j})\Z0" 5 46
144
145
146
147
148
149
	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
}

150
151
152
153
154
155
156
157
158
159
160
161
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
}

162
163


Igor Pecovnik's avatar
Igor Pecovnik committed
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# 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
}


Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
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
		}
}


Igor Pecovnik's avatar
Igor Pecovnik committed
213
214
215
#-----------------------------------------------------------------------------------------------------------------------------------------#
# edit hostapd parameters
#
216
function wlan_edit_basic ()
Igor Pecovnik's avatar
Igor Pecovnik committed
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
{
	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
		}
}

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
#-----------------------------------------------------------------------------------------------------------------------------------------#
# 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
}

Igor Pecovnik's avatar
Igor Pecovnik committed
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308

#-----------------------------------------------------------------------------------------------------------------------------------------#
# 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
309
			TARGET_BRANCH=$(dialog --cancel-label "Back" --backtitle "$BACKTITLE" --no-collapse \
Igor Pecovnik's avatar
Igor Pecovnik committed
310
			--title "Upgrade from $BRANCH to:" --clear --menu "" $((6+${LIST_LENGHT})) 40 15 "${LIST[@]}" 2>&1 1>&3)
311
			exitstatus=$?;
Igor Pecovnik's avatar
Igor Pecovnik committed
312
313
314
315
316
			exec 3>&-
	fi
}


317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#-----------------------------------------------------------------------------------------------------------------------------------------#
# select video mode 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
}


Igor Pecovnik's avatar
Igor Pecovnik committed
344
345
346
347
348
349
350
#-----------------------------------------------------------------------------------------------------------------------------------------#
# search for wlan interfaces and provide a selection menu if there are more than one
#
function get_wlan_interface ()
{
	IFS=$'\r\n'
	GLOBIGNORE='*'
Igor Pecovnik's avatar
Igor Pecovnik committed
351
	WLAN_INTERFACES=($(nmcli dev status | grep wifi | grep disconnected |awk '{print $1}'))
352

Igor Pecovnik's avatar
Igor Pecovnik committed
353
354
355
356
357
358
	local LIST=()
	for i in "${WLAN_INTERFACES[@]}"
	do
			LIST+=( "${i[0]//[[:blank:]]/}" "" )
	done
	LIST_LENGHT=$((${#LIST[@]}/2));
359

Igor Pecovnik's avatar
Igor Pecovnik committed
360
361
362
363
364
365
366
367
368
369
370
	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
}


Igor Pecovnik's avatar
Igor Pecovnik committed
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
#-----------------------------------------------------------------------------------------------------------------------------------------#
# 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
}


Igor Pecovnik's avatar
Igor Pecovnik committed
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
# 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" )
445
446
447
448
449
	#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
Igor Pecovnik's avatar
Igor Pecovnik committed
450
451
	[[ -f /usr/bin/h3consumption && "$LINUXFAMILY" = "sun8i" && "$BRANCH" = "default" ]] && \
	LIST+=( "Consumption" "Control board consumption" )
452
	[[ -f /usr/bin/armbianmonitor ]] && LIST+=( "Monitor" "Simple CLI board monitoring" )
Igor Pecovnik's avatar
Igor Pecovnik committed
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
	[[ -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 </boot/script.bin 2>/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 ()
{
488
select_default_interface
Igor Pecovnik's avatar
Igor Pecovnik committed
489
490
while true; do
	LIST=()
Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
491
	LIST+=( "IP" "Select dynamic or edit static IP address" )
Igor Pecovnik's avatar
Igor Pecovnik committed
492
493
494
495
496
497
	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" )
Igor Pecovnik's avatar
Igor Pecovnik committed
498
		else
Igor Pecovnik's avatar
Igor Pecovnik committed
499
			[[ -n $(nmcli device status | grep wifi | grep -w disconnected) ]] && LIST+=( "Hotspot" "Create WiFi access point" )
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
500

Igor Pecovnik's avatar
Igor Pecovnik committed
501
	fi
502
503
504
505
506
507

	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
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
508

Igor Pecovnik's avatar
Igor Pecovnik committed
509
510
511
512
	if [[ -n $(service bluetooth status | grep -w active | grep -w running) ]]; then
		[[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Bluetooth" "Connect Bluetooth devices" )
	fi

Igor Pecovnik's avatar
RC1    
Igor Pecovnik committed
513
	LIST+=( "Advanced" "Edit /etc/network/interfaces" )
514
	[[ $(ls -1 /etc/NetworkManager/system-connections 2> /dev/null) ]] && LIST+=( "Forget" "Disconnect and forget all wireless connections" )
Igor Pecovnik's avatar
Igor Pecovnik committed
515
516

	# count number of menu items to adjust window sizee
517
	LISTLENGHT="$((13+${#LIST[@]}/2))"
Igor Pecovnik's avatar
Igor Pecovnik committed
518
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
Igor Pecovnik committed
519
	WIFICONNECTED=$(nmcli -f NAME,TYPE connection show --active | grep wireless | awk 'NF{NF-=1};1')
Igor Pecovnik's avatar
Igor Pecovnik committed
520

Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
521
	local disclaimer=""
522
523
524
525
526
527
528
529
530
531
532
533
534
535


	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"


Igor Pecovnik's avatar
Igor Pecovnik committed
536
	if [[ -n $WIFICONNECTED ]]; then
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
537
		LISTLENGHT=$((LISTLENGHT+2))
538
539
		local connected="\n\Z0Connected to SSID: \Z1${WIFICONNECTED}\n\Z0 "
		disclaimer=$disclaimer"$connected"
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
540
541
	fi

Igor Pecovnik's avatar
Igor Pecovnik committed
542
	if [[ -n $HOSTAPDINFO && -n $HOSTAPDSTATUS ]]; then
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
543
		LISTLENGHT=$((LISTLENGHT+2))
544
		chipid=$(dmesg | grep $(grep ^interface /etc/hostapd.conf | sed 's/interface=//g') | head -1 | sed 's/\[.*\]//g' |  awk '{print $1}')
545
		disclaimer=$disclaimer$"\n\Z0Hotspot SSID: \Z1$HOSTAPDINFO\Zn Band:";
546
		if [[ `grep ^hw_mode=a /etc/hostapd.conf` ]]; then local band="5Ghz"; else band="2.4Ghz"; fi
547
548
		if [[ `grep ^ieee80211n /etc/hostapd.conf` ]]; then local type="N"; fi
		if [[ `grep ^ieee80211ac /etc/hostapd.conf` ]]; then local type="AC"; fi
549
550
		disclaimer=$disclaimer$" \Z1${band} ${type}\Z0"
		if [ -n $chipid ]; then disclaimer=$disclaimer$"\n\nChip: \Z1${chipid}\Z0"; fi
Igor Pecovnik's avatar
Igor Pecovnik committed
551
		if [ "$HOSTAPDCLIENTS" -gt "0" ]; then disclaimer=$disclaimer$" Connected clients: \Z1$HOSTAPDCLIENTS\Zn"; fi
552
		if [ -n $chip ] || [ "$HOSTAPDCLIENTS" -gt "0" ]; then LISTLENGHT=$((LISTLENGHT+2)); fi
Igor Pecovnik's avatar
Igor Pecovnik committed
553
		disclaimer=$disclaimer$"\n";
Igor Pecovnik's avatar
Igor Pecovnik committed
554
	fi
Igor Pecovnik's avatar
Cleanup    
Igor Pecovnik committed
555
	#disclaimer=$disclaimer"\n"
Igor Pecovnik's avatar
Igor Pecovnik committed
556

Igor Pecovnik's avatar
Igor Pecovnik committed
557
558
	# display warning only we have wifi
	#if [[ " ${LIST[*]} " == *" Hotspot "* ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
559
		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 "
Igor Pecovnik's avatar
Igor Pecovnik committed
560
561
562
563
	#else
	#	LISTLENGHT="$((6+${#LIST[@]}/2))"
	#fi

Igor Pecovnik's avatar
Igor Pecovnik committed
564
565
566
567
	DIALOG_CANCEL=1
	DIALOG_ESC=255

	exec 3>&1
568
	selection=$(dialog --backtitle "$BACKTITLE" --colors --title " Wired, Wireless, Bluetooth, Hotspot " --clear \
Igor Pecovnik's avatar
Igor Pecovnik committed
569
	--cancel-label "Back" --menu "${disclaimer}" $LISTLENGHT 70 $BOXLENGHT \
Igor Pecovnik's avatar
Igor Pecovnik committed
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
	"${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
587
588
589
	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" )
590
	LIST+=( "SSHd" "Reconfigure SSH daemon" )
591
	LIST+=( "Firmware" "Upgrade board firmware" )
Igor Pecovnik's avatar
Igor Pecovnik committed
592
	# check for display manager statuses
593
594

	# detect desktop
Igor Pecovnik's avatar
Igor Pecovnik committed
595
	DISPLAY_MANAGER=""; DESKTOP_INSTALLED=""
596
597
598
	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

Igor Pecovnik's avatar
Igor Pecovnik committed
599
600
	[[ -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"
601

Igor Pecovnik's avatar
Igor Pecovnik committed
602
603
604
605
	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" )
606
		elif [[ -n $DESKTOP_INSTALLED ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
607
608
609
			LIST+=( "Desktop" "Enable desktop" )
	fi

610
	if [[ -n $DISPLAY_MANAGER ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
611
612
613
614
615
616
			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
Igor Pecovnik's avatar
Igor Pecovnik committed
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
	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
641
	selection=$(dialog --colors --backtitle "$BACKTITLE" --title " System settings " --clear \
Igor Pecovnik's avatar
Igor Pecovnik committed
642
643
644
645
646
647
648
649
650
	--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
}

651

Igor Pecovnik's avatar
Igor Pecovnik committed
652
#-----------------------------------------------------------------------------------------------------------------------------------------#
653
# Armbian specific settings
Igor Pecovnik's avatar
Igor Pecovnik committed
654
655
656
657
658
659
#
function submenu_hardware ()
{
while true; do

	LIST=()
660
661
662

	[[ $(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" )
Igor Pecovnik's avatar
Igor Pecovnik committed
663
664
665
666
667
	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
Igor Pecovnik's avatar
Igor Pecovnik committed
668
669
670
671
672
673
674
675
676
677
	[[ -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
678
679
	[[ -d /boot/dtb/overlay && $LINUXFAMILY == sun*i && $BRANCH != default ]] && \
	LIST+=( "Overlays" "Toggle board functions: UART, I2C, SPI, ..." )
Igor Pecovnik's avatar
Igor Pecovnik committed
680
681
682
683
	[[ $(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
684
	LISTLENGHT="$((6+${#LIST[@]}/2))"
Igor Pecovnik's avatar
Igor Pecovnik committed
685
686
687
	BOXLENGHT=${#LIST[@]}

	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
688
	selection=$(dialog --backtitle "$BACKTITLE" --title " Armbian specific settings " --clear \
Igor Pecovnik's avatar
Igor Pecovnik committed
689
690
691
692
693
	--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
694
695

	# run main function
Igor Pecovnik's avatar
Igor Pecovnik committed
696
	jobs "$selection"
697

Igor Pecovnik's avatar
Igor Pecovnik committed
698
done
Igor Pecovnik's avatar
Igor Pecovnik committed
699
}