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

Igor Pecovnik's avatar
Igor Pecovnik committed
9

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
10
11
12
# check for root
#
if [[ $EUID != 0 ]]; then
13
	echo "Warning. This script requires root privileges. Exiting ..."
Igor Pecovnik's avatar
Igor Pecovnik committed
14
	sleep 2
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
15
16
17
	exit
fi

Igor Pecovnik's avatar
Igor Pecovnik committed
18
19
20

# check if we have internet connection to install dependencies
#
21
22
echo -e "GET http://google.com HTTP/1.0\n\n" | nc google.com 80 > /dev/null 2>&1
if [[ $? -ne 0 ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
23
24
		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."
25
	else
Igor Pecovnik's avatar
Igor Pecovnik committed
26
27
		[[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' bc 2>/dev/null) != *ii* ]] && \
		apt-get -qq -y --no-install-recommends install bc
28
29
		[[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' expect 2>/dev/null) != *ii* ]] && \
		apt-get -qq -y --no-install-recommends install expect
Igor Pecovnik's avatar
Igor Pecovnik committed
30
31
32
33
34
35
		[[ $(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
Igor Pecovnik's avatar
Igor Pecovnik committed
36
37
		[[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' sunxi-tools 2>/dev/null) != *ii* ]] && \
		apt-get -qq -y --no-install-recommends install sunxi-tools
38
fi
39

Igor Pecovnik's avatar
Igor Pecovnik committed
40
# gather info about the board
41
#
Igor Pecovnik's avatar
Igor Pecovnik committed
42
43
44
45
46
47
48
49
50
51
52
[[ -f /etc/armbian-release ]] && source /etc/armbian-release && ARMBIAN="Armbian $VERSION $IMAGE_TYPE";
DISTRO=$(lsb_release -is)
DISTROID=$(lsb_release -rs)
BACKTITLE="$ARMBIAN $DISTRO $DISTROID configuration utility, http://www.armbian.com"
TITLE="Configuring $BOARD_NAME"


#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# show description for MOTD files
#
53
54
function description
{
Igor Pecovnik's avatar
Igor Pecovnik committed
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
	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
78
79
}

Igor Pecovnik's avatar
Igor Pecovnik committed
80
81
82

# edit hostapd parameters
#
83
84
function wlan_edit ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
	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
		}
102
103
}

Igor Pecovnik's avatar
Igor Pecovnik committed
104
105
106

# naming exceptions for packages
#
107
108
function exceptions ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
109
110
111
112
113
114
	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
115
116
		;;
		cubieboard | lime-a10 | pcduino2)
Igor Pecovnik's avatar
Igor Pecovnik committed
117
118
		if [[ $TARGET_BRANCH == "default" ]]; \
		then TARGET_FAMILY="sun4i"; TARGET_BRANCH=""; else TARGET_FAMILY="sunxi"; TARGET_BRANCH="-"$TARGET_BRANCH; fi
119
120
		;;
		*)
Igor Pecovnik's avatar
Igor Pecovnik committed
121
122
123
		if [[ $TARGET_BRANCH == "default" ]]; \
		then TARGET_BRANCH=""; else TARGET_BRANCH="-"$TARGET_BRANCH; fi
	esac
124
125
}

Igor Pecovnik's avatar
Igor Pecovnik committed
126
127
128

# here we add wifi exceptions
#
129
130
function wlan_exceptions ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
131
132
133
134
	[[ -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
135
136
}

Igor Pecovnik's avatar
Igor Pecovnik committed
137
138
139

# check if board has alternative kernels
#
140
141
142
143
function aval_kernel ()
{
	IFS=$'\r\n'
	GLOBIGNORE='*'
Igor Pecovnik's avatar
Igor Pecovnik committed
144
145
	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" ))
146
147
148
149
150
151
152
153
154
155
	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
Igor Pecovnik's avatar
Igor Pecovnik committed
156
157
			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)
158
159
160
161
			exec 3>&-
	fi
}

Igor Pecovnik's avatar
Igor Pecovnik committed
162

163
164
# search for wlan interfaces and provide a selection menu if there are more than one
#
Igor Pecovnik's avatar
Igor Pecovnik committed
165
166
function get_wlan_interface ()
{
167
168
169
	IFS=$'\r\n'
	GLOBIGNORE='*'
	WLAN_INTERFACES=($(nmcli dev status | grep wifi |awk '{print $1}'))
170
171
172
173
174
175
176
	local LIST=()
	for i in "${WLAN_INTERFACES[@]}"
	do
			LIST+=( "${i[0]//[[:blank:]]/}" "" )
	done
	LIST_LENGHT=$((${#LIST[@]}/2));
	if [ "$LIST_LENGHT" -eq 1 ]; then
177
			WIRELESS_ADAPTER=${WLAN_INTERFACES[0]}
178
179
	else
			exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
180
181
			WIRELESS_ADAPTER=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \
			--title "Select interface" --clear --menu "" $((6+${LIST_LENGHT})) 30 15 "${LIST[@]}" 2>&1 1>&3)
182
183
184
			exec 3>&-
	fi
}
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226


# 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
}

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
227
#
Igor Pecovnik's avatar
Igor Pecovnik committed
228
#-----------------------------------------------------------------------------------------------------------------------------------------#
229

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
230

Igor Pecovnik's avatar
Igor Pecovnik committed
231
232
# Show disclaimer where you need to press SPACE to continue. To make sure warning is read.
#
233
234
235
236
237
#exec 3>&1
#ACKNOWLEDGEMENT=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse --title "Warning" --clear \--radiolist "\nThis configuration tool runs under superuser rights.\n \n" 10 56 7 "Yes, I understand the risks" "" off	 2>&1 1>&3)
#exec 3>&-
#	if [[ $ACKNOWLEDGEMENT == "" ]]; then exit; fi
dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading Armbian configuration utility ... " 5 45
238

Igor Pecovnik's avatar
Igor Pecovnik committed
239
240
241
# Main loop
#
while true; do
242

243
244
245
246
247
	DISPLAY_MANAGER=""; DESKTOP_INSTALLED=""
	[[ -n $(service lightdm status | grep -w active) ]] && DISPLAY_MANAGER="lightdm"
	[[ -n $(service nodm status | grep -w active) ]] && DISPLAY_MANAGER="nodm"
	[[ -d /etc/lightdm || -f /etc/default/nodm ]] && DESKTOP_INSTALLED="true"

Igor Pecovnik's avatar
Igor Pecovnik committed
248
249
250
	LIST=()
	#
	# here we add new items to menu. with condition when needed
Igor Pecovnik's avatar
Igor Pecovnik committed
251
	LIST+=( "Timezone" "Change your timezone" )
252
	[[ $(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" )
Igor Pecovnik's avatar
Igor Pecovnik committed
253
254
255
256
257
258
	if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
			[[ -n $(nmcli -f DEVICE,TYPE device status | grep wifi) ]] && LIST+=( "Hotspot" "Manage WiFi access point" )
		else
			[[ -n $(nmcli -f DEVICE,TYPE device status | grep wifi) ]] && LIST+=( "WiFi" "Connect to wireless access point" )
			[[ -n $(nmcli -f DEVICE,TYPE device status | grep wifi) ]] && LIST+=( "Hotspot" "Create WiFi access point" )
	fi
259
	[[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Bluetooth" "Connect Bluetooth devices" )
Igor Pecovnik's avatar
Igor Pecovnik committed
260
261
	[[ -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" )
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278

	if [[ -n $DISPLAY_MANAGER ]]; then
			LIST+=( "Desktop" "Disable desktop" )
			[[ $DISPLAY_MANAGER == 'nodm' ]] && LIST+=( "Lightdm" "Enable standard login manager" )
			[[ $DISPLAY_MANAGER == 'lightdm' ]] && LIST+=( "Nodm" "Enable simple auto login manager" )
			else
			LIST+=( "Desktop" "Enable desktop" )
	fi

	if [[ $DESKTOP_INSTALLED ]]; then
			if [[ $(service xrdp status | grep -w active) ]]; then
				LIST+=( "RDP" "Disable remote desktop from Windows" )
				else
				LIST+=( "RDP" "Enable remote desktop from Windows" )
			fi
	fi

Igor Pecovnik's avatar
Igor Pecovnik committed
279
280
281
282
283
284
285
286
287
288
289
290
291
	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
	[[ -f /usr/bin/softy ]] && LIST+=( "Softy" "Application installer" )
	[[ ${#LIST[@]} > 0 ]] && LIST+=( "-" "" )
	[[ -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" )
	[[ -n $(grep -w "#kernel.printk" /etc/sysctl.conf ) ]] && LIST+=( "Lowlevel" "Stop low-level messages on console" )
Igor Pecovnik's avatar
Igor Pecovnik committed
292
293
	[[ -f /boot/armbianEnv.txt ]] && LIST+=( "Bootenv" "Edit boot environment" )
	[[ -f /boot/boot.ini ]] && LIST+=( "Bootscript" "Edit boot script" )
Igor Pecovnik's avatar
Igor Pecovnik committed
294
295
296
	LIST+=( "Network" "Edit network settings" )
	LIST+=( "-" "" )
	LIST+=( "Services" "Toggle running services" )
Chris Rohlfs's avatar
Chris Rohlfs committed
297
	LIST+=( "Welcome" "Toggle welcome screen items" )
Igor Pecovnik's avatar
Igor Pecovnik committed
298
299
300
301
302
303
	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
304
305
	[[ $(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" )
306
307
308
309
310
311
312
	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
Igor Pecovnik's avatar
Igor Pecovnik committed
313
314
315
	# count number of menu items to adjust window sizee
	LISTLENGHT="$((7+${#LIST[@]}/2))"
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
316

Igor Pecovnik's avatar
Igor Pecovnik committed
317
318
319
	# main dialog routine
	DIALOG_CANCEL=1
	DIALOG_ESC=255
320

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
321
	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
322
323
	selection=$(dialog --backtitle "$BACKTITLE" --title "$TITLE" --clear \
	--cancel-label "Exit to shell" --menu "Please select:" $LISTLENGHT 70 $BOXLENGHT \
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
324
325
326
327
328
	"${LIST[@]}" 2>&1 1>&3)
	exit_status=$?
	exec 3>&-
	case $exit_status in
	$DIALOG_CANCEL)
329
330
		#clear
		#echo -e "\n\e[0;33mThank you for using Armbian configuration tool! Support: \e[1m\e[39mwww.armbian.com\x1B[0m\n"
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
331
332
333
334
335
336
337
338
		exit
	;;
	$DIALOG_ESC)
		clear
		exit 1
		;;
	esac

Igor Pecovnik's avatar
Igor Pecovnik committed
339
340
	dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading submodule ... " 5 26

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
341
342
	case $selection in

Igor Pecovnik's avatar
Igor Pecovnik committed
343

Chris Rohlfs's avatar
Chris Rohlfs committed
344
	# Toggle welcome screen items
Igor Pecovnik's avatar
Igor Pecovnik committed
345
	#
346
347
348
349
350
	"Welcome" )
		while true; do
		HOME="/etc/update-motd.d/"
		MOTD=()
		LINES=()
Igor Pecovnik's avatar
Igor Pecovnik committed
351
		LIST_CONST=6
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
		j=0
		DIALOG_CANCEL=1
		DIALOG_ESC=255

		while read line
		do
				STATUS=$([[ -x ${HOME}${line} ]] && echo "on")
			DESC=$(description "$line")
			MOTD+=( "$line" "$DESC" "$STATUS")
			LINES[ $j ]=$line
			(( j++ ))
		done < <(ls -1 $HOME)

				LISTLENGHT="$(($LIST_CONST+${#MOTD[@]}/2))"

				exec 3>&1
Chris Rohlfs's avatar
Chris Rohlfs committed
368
				selection=$(dialog --backtitle "$BACKTITLE" --title "Toggle motd executing scripts" --clear --cancel-label \
Igor Pecovnik's avatar
Igor Pecovnik committed
369
370
				"Exit" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
				$LISTLENGHT 70 15 "${MOTD[@]}" 2>&1 1>&3)
371
372
373
374
375
376
377
378
379
380
381
382
				exit_status=$?
				exec 3>&-
				case $exit_status in
				$DIALOG_CANCEL | $DIALOG_ESC)
						exit 1
						;;
				0)
						chmod -x ${HOME}*
						chmod +x $(echo "$selection" | sed "s|[^ ]* *|${HOME}&|g")
				;;
				esac
		done
383
384
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
385
386
387

	# Set the display resolution
	#
388
389
390
391
	"Display" )
		h3disp
		exit
	;;
392

393
394
395
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
	"RDP" )
		if [[ -n $(service xrdp status | grep -w active) ]]; then
			systemctl stop xrdp.service >/dev/null 2>&1
			systemctl disable xrdp.service >/dev/null 2>&1
		else
			apt-get -y -qq --no-install-recommends install xrdp vnc4server
			systemctl enable xrdp.service >/dev/null 2>&1
			systemctl start xrdp.service >/dev/null 2>&1
			dialog --title "Info" --backtitle "$BACKTITLE" --nocancel --no-collapse --pause \
			"\nRemote graphical login to $BOARD_NAME using Microsoft Remote Desktop Protocol (RDP) is enabled." 11 57 3
		fi
	;;




	"Nodm" )
		systemctl disable lightdm.service >/dev/null 2>&1
		systemctl stop lightdm.service >/dev/null 2>&1
		sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=true/" /etc/default/nodm && service nodm start
	;;

	"Lightdm" )
		service nodm stop && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=false/" /etc/default/nodm
		apt-get -o Dpkg::Options::="--force-confold" -y -qq --no-install-recommends install lightdm-gtk-greeter lightdm >/dev/null 2>&1
		systemctl enable lightdm.service >/dev/null 2>&1
		systemctl start lightdm.service >/dev/null 2>&1
	;;


Igor Pecovnik's avatar
Igor Pecovnik committed
423
424
	# Enable or disable desktop
	#
425
	"Desktop" )
426
		if [[ -n $(service lightdm status | grep -w active | grep -w running) || -n $(service nodm status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
427
428
			dialog --title "Desktop is enabled and running" --backtitle "$BACKTITLE" \
			--yes-label "Stop" --no-label "Cancel" --yesno "\nDo you want to stop and disable this service?" 7 50
429
			exitstatus=$?;
430
			[[ $exitstatus = 0 ]] && service nodm stop && service lightdm stop && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=false/" /etc/default/nodm
431
		else
432
433
			dialog --title "Choose a display manager" --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Lightdm" \
			--no-label "Nodm" --yesno "\nLightdm = full featured login display manager\nNodm = autoloading into desktop" 8 70
434
			exitstatus=$?;
435
436
			[[ $exitstatus = 0 ]] && systemctl start lightdm.service
			[[ $exitstatus = 1 ]] && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=true/" /etc/default/nodm && service nodm start
437
438
439
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
440
441
442

	# Control board consumption
	#
443
444
445
446
	"Consumption" )
		h3consumption
		exit
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
447
448
449
450


	# Board (fex) settings editor
	#
451
452
453
454
	"Fexedit" )
		TEMP=$(mktemp -d || exit 1)
		trap "rm -rf \"${TEMP}\" ; exit 0" 0 1 2 3 15
		bin2fex /boot/script.bin ${TEMP}/tempfex.txt >/dev/null 2>&1
455
		dialog --title "Edit u-boot environment" \
Igor Pecovnik's avatar
Igor Pecovnik committed
456
		--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt  40 0 2> ${TEMP}/tempfex.out
457
		[[ $? = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
458
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
459
460
461
462


	# Toggle running services
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
463
464
465
466
	"Services" )
		rcconf
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
467
468
469
470
471
472
	# Change timezone
	#
	"Timezone" )
		dpkg-reconfigure tzdata
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
473
474
475

	# Stop low-level messages on console
	#
476
	"Lowlevel" )
Igor Pecovnik's avatar
Igor Pecovnik committed
477
478
		dialog --title "Kernel messages" --backtitle "$BACKTITLE" --help-button \
		--help-label "Yes & reboot" --yes-label "Yes" --no-label "Cancel" --yesno "\nStop low-level messages on console?" 7 64
479
480
481
482
483
		exitstatus=$?;
		[[ $exitstatus = 0 ]] && sed -i 's/^#kernel.printk\(.*\)/kernel.printk\1/' /etc/sysctl.conf
		[[ $exitstatus = 2 ]] && sed -i 's/^#kernel.printk\(.*\)/kernel.printk\1/' /etc/sysctl.conf && reboot
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
484
485
	# Toggle virtual read-only root filesystem
	#
486
487
	"Overlayroot" )
		if [[ -n $(mount | grep -w overlay) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
488
489
490
491
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Disable" \
			--no-label "Cancel" \
			--yesno "\nYour system is already virtual read-only.\n\nDo you want to disable this feature and reboot?" 9 60
			[[ $? = 0 ]] && overlayroot-chroot sed -i "s/^overlayroot=.*/overlayroot=\"\"/" /etc/overlayroot.conf && \
492
			overlayroot-chroot rm /etc/update-motd.d/97-overlayroot && reboot
493
		else
494
			debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confnew" -y --no-install-recommends install overlayroot
495
			echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
496
497
			echo 'if [ -n "$(mount | grep -w tmpfs-root)" ]; then echo -e "\n[\e[0m \e[1mremember: your system is in virtual read only mode\e[0m ]";fi' >> /etc/update-motd.d/97-overlayroot
			chmod +x /etc/update-motd.d/97-overlayroot
Igor Pecovnik's avatar
Igor Pecovnik committed
498
499
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
500
501
502
503
			[[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
504
505
	# Edit network settings
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
506
	"Network" )
507
		dialog --backtitle "$BACKTITLE" --title "Edit network configuration" --no-collapse \
Igor Pecovnik's avatar
Igor Pecovnik committed
508
		--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
509
		[[ $? = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && service network-manager restart
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
510
511
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
512
513
	# Create WiFi access point
	#
514
	"Hotspot" )
515
		systemctl daemon-reload
516
		CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
517
		if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
518
519
			dialog --title "Hostapd service is running" --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Stop" \
			--no-label "Edit" --yesno "\nStop: stop and disable\n\nEdit: change basic parameters: SSID, password and channel" 9 70
520
			exitstatus=$?;
Igor Pecovnik's avatar
Igor Pecovnik committed
521
522
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
523
			if [[ $exitstatus = 1 ]]; then wlan_edit; service hostapd stop; sleep 1; service hostapd start; fi
524
525
526
527
		elif [[ -n $CURRENT_UUID ]]; then
				dialog --title "Info" --backtitle "$BACKTITLE" --no-collapse \
				--yesno "\nWireless connection is in use.\n\nDo you want to disconnect?" 9 57
				[[ $? = 0 ]] && nmcli connection down uuid $CURRENT_UUID
528
		else
529
			# change special adapters to AP mode
Igor Pecovnik's avatar
Igor Pecovnik committed
530
			wlan_exceptions "on"
531
532
			# check for WLAN interfaces
			get_wlan_interface
533
534
535
536
			# add interface to unmanaged list
			echo "[keyfile]" > /etc/NetworkManager/conf.d/armbian.conf
			echo "unmanaged-devices=interface-name:$WIRELESS_ADAPTER" >>/etc/NetworkManager/conf.d/armbian.conf
			service network-manager reload
537
			# display dialog
Igor Pecovnik's avatar
Igor Pecovnik committed
538
539
			dialog --backtitle "$BACKTITLE" --title "Please wait" \
			--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing nl80211 hostapd driver compatibility." 7 50
540
541
			apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd > /dev/null
			# change to selected interface
542
			sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
543
544
545
546
547
			# add hostapd.conf to services
			sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=\/etc\/hostapd.conf/" /etc/init.d/hostapd
			# check both options
			CHECK=$(systemctl daemon-reload;service hostapd restart;service hostapd status|grep fail)
			if [[ -n "$CHECK" ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
548
549
				dialog --backtitle "$BACKTITLE" --title "Please wait" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing Realtek hostapd driver compatibility." 7 50
550
551
				apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd-realtek > /dev/null
				# change to selected interface
552
				sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
553
554
555
556
			fi
			CHECK=$(systemctl daemon-reload;service hostapd restart;service hostapd status|grep fail)
			# if both fails there is other problem
			if [[ -n "$CHECK" ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
557
558
				dialog --backtitle "$BACKTITLE" --title "Warning" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nNo compatible hostapd driver found." 7 39
559
560
561
562
563
564
				sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd
				systemctl daemon-reload;service hostapd restart
				sleep 3
				exit
			fi

Igor Pecovnik's avatar
Igor Pecovnik committed
565
566
567
			dialog --title "Choose Access Point mode for $WIRELESS_ADAPTER" --backtitle "$BACKTITLE" --help-button \
			--help-label "Manual" --yes-label "Bridge" --no-label "NAT" --yesno "\nBridge: wireless clients will use your routers DHCP \
			server\n\nNAT: with own DHCP server, out of your primary network\n\nManual: edit configuration manually" 11 70
568
569
			response=$?
			DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
Igor Pecovnik's avatar
Igor Pecovnik committed
570
571
			NETWORK_CONF="/etc/network/interfaces"
			TEMP_CONF="/etc/network/interfaces.out"
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
			cp $NETWORK_CONF $TEMP_CONF

			case $response in
				# bridge
				0)
					sed -i '/^#/ d' $TEMP_CONF
					apt-get -qq -y --no-install-recommends install bridge-utils >> /dev/null
					sed -i "s/^auto lo.*/auto lo br0/" $TEMP_CONF
					# if we have dhcp on default adapter
					if [[ -n $(grep dhcp $TEMP_CONF | grep "$DEFAULT_ADAPTER" | grep -v br) ]]; then
						sed -i "s/^iface $DEFAULT_ADAPTER inet dhcp/iface $DEFAULT_ADAPTER inet manual/" $TEMP_CONF
						echo -e "\niface br0 inet dhcp\nbridge_ports $DEFAULT_ADAPTER $WIRELESS_ADAPTER" >> $TEMP_CONF
						echo -e "\nauto $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER inet manual" >> $TEMP_CONF
					#fi
					# if we have static on default adapter
					#if [[ -n $(grep static $TEMP_CONF | grep "$DEFAULT_ADAPTER" | grep -v br) ]]; then
					else
						sed -i "s/^iface $DEFAULT_ADAPTER inet static/iface $DEFAULT_ADAPTER inet manual/" $TEMP_CONF
						sed -i "/^iface $DEFAULT_ADAPTER inet manual/a iface br0 inet static" $TEMP_CONF
						echo -e "bridge_ports $DEFAULT_ADAPTER $WIRELESS_ADAPTER" >> $TEMP_CONF
						echo -e "\nauto $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER inet manual" >> $TEMP_CONF
					fi
					sed -i 's/^bridge=.*/bridge=br0/' /etc/hostapd.conf
				;;

				# NAT
				1)
					sed -i '/^#/ d' $TEMP_CONF
Igor Pecovnik's avatar
Igor Pecovnik committed
600
601
602
					debconf-apt-progress -- apt-get -qq -y --no-install-recommends install dnsmasq iptables
					echo -e "\nallow-hotplug $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER inet static " >> $TEMP_CONF
					echo -e "\naddress 172.24.1.1\nnetmask 255.255.255.0\nnetwork 172.24.1.0\nbroadcast 172.24.1.255" >> $TEMP_CONF
603
604
605
					# create new configuration
					echo "interface=$WIRELESS_ADAPTER				# Use interface $WIRELESS_ADAPTER" > /etc/dnsmasq.conf
					echo "listen-address=172.24.1.1					# Explicitly specify the address to listen on" >> /etc/dnsmasq.conf
Igor Pecovnik's avatar
Igor Pecovnik committed
606
607
					echo "bind-interfaces							# Bind to the interface to make sure we aren't sending \
					things elsewhere" >> /etc/dnsmasq.conf
608
609
					echo "server=8.8.8.8							# Forward DNS requests to Google DNS" >> /etc/dnsmasq.conf
					echo "domain-needed								# Don't forward short names" >> /etc/dnsmasq.conf
Igor Pecovnik's avatar
Igor Pecovnik committed
610
611
612
613
					echo "bogus-priv								# Never forward addresses in the non-routed address spaces" \
					>> /etc/dnsmasq.conf
					echo "dhcp-range=172.24.1.50,172.24.1.150,12h	# Assign IP addresses between 172.24.1.50 and 172.24.1.150 with \
					a 12 hour lease time" >> /etc/dnsmasq.conf
614
615
616
617
618
619
620
621
622
					# - Enable IPv4 forwarding
					sed -i "/net.ipv4.ip_forward=/c\net.ipv4.ip_forward=1" /etc/sysctl.conf
					echo 1 > /proc/sys/net/ipv4/ip_forward
					# - Apply iptables
					iptables -t nat -A POSTROUTING -o $DEFAULT_ADAPTER -j MASQUERADE
					iptables -A FORWARD -i $DEFAULT_ADAPTER -o $WIRELESS_ADAPTER -m state --state RELATED,ESTABLISHED -j ACCEPT
					iptables -A FORWARD -i $WIRELESS_ADAPTER -o $DEFAULT_ADAPTER -j ACCEPT
					# - Save IP tables, applied during ifup in /etc/network/interfaces.
					iptables-save > /etc/iptables.ipv4.nat
623
624
625
626
627
					service dnsmasq restart
					sed -i 's/^bridge=.*/#&/' /etc/hostapd.conf
					sed -e 's/exit 0//g' -i /etc/rc.local
					echo "iptables-restore < /etc/iptables.ipv4.nat" >> /etc/rc.local
					echo "exit 0" >> /etc/rc.local
628
				;;
629
630
			3)exit;;

631
632
			255) exit;;
			esac
633
634
			dialog --title "Manually adjust network configuration if needed" --backtitle "$BACKTITLE" \
			--ok-label "Reboot to apply new settings" --no-collapse --editbox $TEMP_CONF 30 0 2> $TEMP_CONF".tmp"
635
			service hostapd stop
636
637
638
639
			if [[ $? = 0 ]]; then
				mv $TEMP_CONF $NETWORK_CONF
				reboot
			fi
640
641
642
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
643

644
645
646
647
648
649
650
	# Connect to Bluetooth
	#
	"Bluetooth" )
	dialog --backtitle "$BACKTITLE" --title "Bluetooth" --msgbox "\nMake sure your Bluetooth devices are discoverable!" 7 54
	connect_bt_interface
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
651
652
	# Edit boot environment
	#
Igor Pecovnik's avatar
Igor Pecovnik committed
653
	"Bootenv" )
654
		dialog --title "Edit u-boot environment" --ok-label "Save" \
Igor Pecovnik's avatar
Igor Pecovnik committed
655
		--no-collapse --editbox /boot/armbianEnv.txt 30 0 2> /boot/armbianEnv.txt.out
656
		[[ $? = 0 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
657
658
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
659
660
661
662
663
664
665
666
667
	# Edit boot script
	#
	"Bootscript" )
		if [[ -f /boot/boot.ini ]]; then
		dialog --title "Edit boot.ini script" --ok-label "Save" \
		--no-collapse --editbox /boot/boot.ini 30 0 2> /boot/boot.ini.out
		[[ $? = 0 ]] && mv /boot/boot.ini.out /boot/boot.ini
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
668
669
670

	# Switch to daily builds
	#
671
	"Nightly" )
Igor Pecovnik's avatar
Igor Pecovnik committed
672
673
674
		dialog --title "Warning" --backtitle "$BACKTITLE" --yes-label "OK" --no-label "Cancel" \
		--yesno "\nYou are switching to automated nightly repository which is untested and might break your system.\
		Are you fine with that?" 9 48
675
676
677
678
		if [[ $? = 0 ]]; then
			sed -i 's/apt.armbian.com/beta.armbian.com/' /etc/apt/sources.list.d/armbian.list
			debconf-apt-progress -- apt-get update
			debconf-apt-progress -- apt-get -y upgrade
Igor Pecovnik's avatar
Igor Pecovnik committed
679
680
			dialog --title "Switching to nightly" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nReboot to apply new settings?" 7 34
681
682
			if [[ $? = 0 ]]; then reboot; fi
		fi
683
	;;
684

Igor Pecovnik's avatar
Igor Pecovnik committed
685
686
687

	# Switch to stable builds
	#
688
	"Stable" )
Igor Pecovnik's avatar
Igor Pecovnik committed
689
690
691
692
693
694
695
696
697
698
699
		dialog --title "Warning" --backtitle "$BACKTITLE" --yes-label "OK" --no-label "Cancel" \
		--yesno "\nYou are switching back to stable respository where you are going to get future updates.\
		Are you fine with that?" 9 44
		if [[ $? = 0 ]]; then
			sed -i 's/beta.armbian.com/apt.armbian.com/' /etc/apt/sources.list.d/armbian.list
			debconf-apt-progress -- apt-get update
			debconf-apt-progress -- apt-get -y upgrade
			dialog --title "Switching to stable" --backtitle "$BACKTITLE" --yes-label "Reboot" --no-label "Cancel" --yesno \
			"\nReboot to apply new settings?" 7 34
			if [[ $? = 0 ]]; then reboot; fi
		fi
700
701
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
702
703
704

	# Freeze and unfreeze kernel and board support packages
	#
705
	"Hold" | "Unhold" )
Igor Pecovnik's avatar
Igor Pecovnik committed
706
707
		dialog --title "Update" --backtitle "$BACKTITLE" --yes-label "$selection" --no-label "Cancel" \
		--yesno "\nDo you want to ${selection,,} kernel updates?" 7 50
708
709
710
		if [[ $? = 0 ]]; then
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
Igor Pecovnik's avatar
Igor Pecovnik committed
711
712
713
714
715
		apt-mark ${selection,,} linux-image${TARGET_BRANCH}-${TARGET_FAMILY} linux-headers${TARGET_BRANCH}-${TARGET_FAMILY} \
		linux-u-boot-${BOARD}-${UBOOT_BRANCH} linux-$(lsb_release -cs)-root$TARGET_BRANCH-$BOARD | dialog --backtitle "$BACKTITLE" \
		--title "Package locking" --progressbox 6 64
		[[ $BRANCH != "default" ]] && apt-mark ${selection,,} linux-dtb$TARGET_BRANCH-$TARGET_FAMILY | dialog --backtitle "$BACKTITLE" \
		--title "Package locking" --progressbox 3 64
716
717
		fi
	;;
718

Igor Pecovnik's avatar
Igor Pecovnik committed
719
720
721

	# Install to SATA, eMMC, NAND or USB
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
722
723
724
725
	"Install" )
		nand-sata-install
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
726
727
728

	# Connect to wireless access point
	#
729
	"WiFi" )
730
		# scan for wifi modules
731
		array=( $(nmcli dev | grep "wifi" | awk '{print $1}') )
732
733
734
735
736
737
738
		declared_wlans=0;
		for i in "${array[@]}"
			do
			if grep --quiet "^iface $i" /etc/network/interfaces; then
				let declared_wlans+=1
			fi
		done
739
740
741
742
743
		if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
			DIALOG_CANCEL=1
			dialog --title "Hostapd service is running" --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Stop" \
			--no-label "Edit" --yesno "\nStop: stop and disable\n\nEdit: change basic parameters: SSID, password and channel" 9 70
			exitstatus=$?;
Igor Pecovnik's avatar
Igor Pecovnik committed
744
745
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
746
747
748
749
			if [[ $exitstatus = 1 ]]; then wlan_edit; service hostapd stop; sleep 1; service hostapd start; fi
		elif [ $declared_wlans = ${#array[@]} ]; then
			dialog --title "Error" --backtitle "$BACKTITLE" --no-collapse \
			--msgbox "\nWireless network is in use by if-up service. Remove it from config." 8 57
750
		else
751
			CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
752
			if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
753
754
				dialog --title "Error" --backtitle "$BACKTITLE" --no-collapse \
				--msgbox "\nHostapd service is running. Disable it and try again." 7 57
755
				exit
756
			elif [[ -n $CURRENT_UUID ]]; then
757
758
				dialog --title "Info" --backtitle "$BACKTITLE" --no-collapse \
				--yesno "\nAlready connected via wireless.\n\nDo you want to disconnect?" 9 57
759
				[[ $? = 0 ]] && nmcli connection down uuid $CURRENT_UUID
760
			else
761
762
			# disable AP mode on certain adapters
			wlan_exceptions "off"
763
764
			nmtui-connect
			fi
765
		fi
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
766
767
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
768
769
770

	# Send diagnostics
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
771
772
773
774
775
776
777
	"Diagnostics" )
		clear
		armbianmonitor -u
		echo ""
		read -n 1 -s -p "Press any key to continue"
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
778
779
780

	# Application installer
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
781
782
783
784
	"Softy" )
		softy
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
785
786
787

	# Switch to alternative kernels
	#
788
789
790
	"Switch" )
		aval_kernel
		exceptions "$INSTALL_KERNEL"
Igor Pecovnik's avatar
Igor Pecovnik committed
791
792
793
		dialog --title "Install and reboot" --backtitle "$BACKTITLE" --yes-label "OK" --no-label "Cancel" \
		--yesno "\nSwitching to linux-image${TARGET_BRANCH}-${TARGET_FAMILY} \n\nMake sure you know what you are doing! \
		\n\nBoard config will be reverted to defaults." 11 46
794
795
796
		if [[ $? = 0 ]]; then
			# remove old
			dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nRemoving current kernel." 5 28
Igor Pecovnik's avatar
Igor Pecovnik committed
797
798
799
			apt-get -s -y -qq --no-install-recommends install linux-image${TARGET_BRANCH}-${TARGET_FAMILY} \
			linux-headers${TARGET_BRANCH}-${TARGET_FAMILY} linux-u-boot-${BOARD}-${UBOOT_BRANCH} \
			linux-$(lsb_release -cs)-root$TARGET_BRANCH-$BOARD > /dev/null 2>&1
800
801
802
803
804
805
			# if test download is ok, remove old kernel
			if [[ $? = 0 ]]; then
				aptitude remove ~nlinux-image --quiet=100 >> /var/log/upgrade.log
				aptitude remove ~nlinux-dtb --quiet=100 >> /var/log/upgrade.log
				aptitude remove ~nlinux-headers --quiet=100 >> /var/log/upgrade.log
			fi
806
			# install new
Igor Pecovnik's avatar
Igor Pecovnik committed
807
808
809
810
811
			debconf-apt-progress -- apt-get -y	--no-install-recommends install linux-image${TARGET_BRANCH}-${TARGET_FAMILY} \
			linux-headers${TARGET_BRANCH}-${TARGET_FAMILY} linux-u-boot-${BOARD}-${UBOOT_BRANCH} \
			linux-$(lsb_release -cs)-root$TARGET_BRANCH-$BOARD
			[[ $UBOOT_BRANCH != "default" ]] && debconf-apt-progress -- apt-get -y --no-install-recommends \
			install linux-dtb$TARGET_BRANCH-$TARGET_FAMILY
812
813
814
			reboot
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
815
816
817

	# Simple CLI monitoring
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
818
819
820
821
822
823
	"Monitor" )
		clear
		armbianmonitor -m | dialog --backtitle "$BACKTITLE" --title "Simple CLI monitoring $BOARD" --progressbox 15 64
	;;

	esac
Igor Pecovnik's avatar
Igor Pecovnik committed
824

Chris Rohlfs's avatar
Chris Rohlfs committed
825
done