debian-config 29.3 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
[[ -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"



50

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

Igor Pecovnik's avatar
Igor Pecovnik committed
82
83
84

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

Igor Pecovnik's avatar
Igor Pecovnik committed
106
107
108

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

Igor Pecovnik's avatar
Igor Pecovnik committed
128
129
130

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

Igor Pecovnik's avatar
Igor Pecovnik committed
139
140
141

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

Igor Pecovnik's avatar
Igor Pecovnik committed
164

165
166
# search for wlan interfaces and provide a selection menu if there are more than one
#
Igor Pecovnik's avatar
Igor Pecovnik committed
167
168
function get_wlan_interface ()
{
169
170
171
	IFS=$'\r\n'
	GLOBIGNORE='*'
	WLAN_INTERFACES=($(nmcli dev status | grep wifi |awk '{print $1}'))
172
173
174
175
176
177
178
	local LIST=()
	for i in "${WLAN_INTERFACES[@]}"
	do
			LIST+=( "${i[0]//[[:blank:]]/}" "" )
	done
	LIST_LENGHT=$((${#LIST[@]}/2));
	if [ "$LIST_LENGHT" -eq 1 ]; then
179
			WIRELESS_ADAPTER=${WLAN_INTERFACES[0]}
180
181
	else
			exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
182
183
			WIRELESS_ADAPTER=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \
			--title "Select interface" --clear --menu "" $((6+${LIST_LENGHT})) 30 15 "${LIST[@]}" 2>&1 1>&3)
184
185
186
			exec 3>&-
	fi
}
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
227
228


# 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
229
#
Igor Pecovnik's avatar
Igor Pecovnik committed
230
#-----------------------------------------------------------------------------------------------------------------------------------------#
231

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

Igor Pecovnik's avatar
Igor Pecovnik committed
233
234
# Show disclaimer where you need to press SPACE to continue. To make sure warning is read.
#
235
exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
236
237
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)
238
239
240
exec 3>&-
if [[ $ACKNOWLEDGEMENT == "" ]]; then exit; fi

241

Igor Pecovnik's avatar
Igor Pecovnik committed
242
243
244
# Main loop
#
while true; do
245

Igor Pecovnik's avatar
Igor Pecovnik committed
246
247
248
	LIST=()
	#
	# here we add new items to menu. with condition when needed
Igor Pecovnik's avatar
Igor Pecovnik committed
249
	LIST+=( "Timezone" "Change your timezone" )
250
	[[ $(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
251
252
253
254
255
256
	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
257
	[[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Bluetooth" "Connect Bluetooth devices" )
Igor Pecovnik's avatar
Igor Pecovnik committed
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
	[[ -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" )
	[[ -f /usr/sbin/nodm && -n $(service nodm status | grep -w active | grep -w running) ]] && LIST+=( "Desktop" "Disable desktop" )
	[[ -f /usr/sbin/nodm && -n $(service nodm status | grep -w inactive) ]] && LIST+=( "Desktop" "Enable desktop" )
	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
275
276
	[[ -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
277
278
279
280
281
282
283
284
285
286
	LIST+=( "Network" "Edit network settings" )
	LIST+=( "-" "" )
	LIST+=( "Services" "Toggle running services" )
	LIST+=( "Welcome" "Toogle 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
287
288
	[[ $(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" )
289
290
291
292
293
294
295
	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
296
297
298
	# count number of menu items to adjust window sizee
	LISTLENGHT="$((7+${#LIST[@]}/2))"
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
299

Igor Pecovnik's avatar
Igor Pecovnik committed
300
301
302
	# main dialog routine
	DIALOG_CANCEL=1
	DIALOG_ESC=255
303

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
304
	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
305
306
	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
307
308
309
310
311
	"${LIST[@]}" 2>&1 1>&3)
	exit_status=$?
	exec 3>&-
	case $exit_status in
	$DIALOG_CANCEL)
312
313
		#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
314
315
316
317
318
319
320
321
		exit
	;;
	$DIALOG_ESC)
		clear
		exit 1
		;;
	esac

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

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
324
325
	case $selection in

Igor Pecovnik's avatar
Igor Pecovnik committed
326
327
328

	# Toogle welcome screen items
	#
329
330
331
332
333
	"Welcome" )
		while true; do
		HOME="/etc/update-motd.d/"
		MOTD=()
		LINES=()
Igor Pecovnik's avatar
Igor Pecovnik committed
334
		LIST_CONST=6
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
		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
Igor Pecovnik's avatar
Igor Pecovnik committed
351
				selection=$(dialog --backtitle "$BACKTITLE" --title "Toogle motd executing scripts" --clear --cancel-label \
Igor Pecovnik's avatar
Igor Pecovnik committed
352
353
				"Exit" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
				$LISTLENGHT 70 15 "${MOTD[@]}" 2>&1 1>&3)
354
355
356
357
358
359
360
361
362
363
364
365
				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
366
367
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
368
369
370

	# Set the display resolution
	#
371
372
373
374
	"Display" )
		h3disp
		exit
	;;
375

Igor Pecovnik's avatar
Igor Pecovnik committed
376
377
	# Enable or disable desktop
	#
378
379
	"Desktop" )
		if [[ -f /usr/sbin/nodm && -n $(service nodm status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
380
381
			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
382
383
384
			exitstatus=$?;
			[[ $exitstatus = 0 ]] && service nodm stop && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=false/" /etc/default/nodm
		else
Igor Pecovnik's avatar
Igor Pecovnik committed
385
386
			dialog --title "Desktop is disabled" --backtitle "$BACKTITLE" --yes-label "Start" \
			--no-label "Cancel" --yesno "\nDo you want to enable and start this service?" 7 50
387
388
389
390
391
			exitstatus=$?;
			[[ $exitstatus = 0 ]] && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=true/" /etc/default/nodm && service nodm start
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
392
393
394

	# Control board consumption
	#
395
396
397
398
	"Consumption" )
		h3consumption
		exit
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
399
400
401
402


	# Board (fex) settings editor
	#
403
404
405
406
	"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
407
		dialog --title "Edit u-boot environment" \
Igor Pecovnik's avatar
Igor Pecovnik committed
408
		--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt  40 0 2> ${TEMP}/tempfex.out
409
		[[ $? = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
410
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
411
412
413
414


	# Toggle running services
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
415
416
417
418
	"Services" )
		rcconf
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
419
420
421
422
423
424
	# Change timezone
	#
	"Timezone" )
		dpkg-reconfigure tzdata
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
425
426
427

	# Stop low-level messages on console
	#
428
	"Lowlevel" )
Igor Pecovnik's avatar
Igor Pecovnik committed
429
430
		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
431
432
433
434
435
		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
436
437
	# Toggle virtual read-only root filesystem
	#
438
439
	"Overlayroot" )
		if [[ -n $(mount | grep -w overlay) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
440
441
442
443
			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 && \
444
			overlayroot-chroot rm /etc/update-motd.d/97-overlayroot && reboot
445
		else
446
			debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confnew" -y --no-install-recommends install overlayroot
447
			echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
448
449
			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
450
451
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
452
453
454
455
			[[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
456
457
	# Edit network settings
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
458
	"Network" )
459
		dialog --backtitle "$BACKTITLE" --title "Edit network configuration" --no-collapse \
Igor Pecovnik's avatar
Igor Pecovnik committed
460
		--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
461
		[[ $? = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && service network-manager restart
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
462
463
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
464
465
	# Create WiFi access point
	#
466
	"Hotspot" )
467
		systemctl daemon-reload
468
		CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
469
		if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
470
471
			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
472
			exitstatus=$?;
Igor Pecovnik's avatar
Igor Pecovnik committed
473
474
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
475
			if [[ $exitstatus = 1 ]]; then wlan_edit; service hostapd stop; sleep 1; service hostapd start; fi
476
477
478
479
		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
480
		else
481
			# change special adapters to AP mode
Igor Pecovnik's avatar
Igor Pecovnik committed
482
			wlan_exceptions "on"
483
484
485
			# check for WLAN interfaces
			get_wlan_interface
			# display dialog
Igor Pecovnik's avatar
Igor Pecovnik committed
486
487
			dialog --backtitle "$BACKTITLE" --title "Please wait" \
			--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing nl80211 hostapd driver compatibility." 7 50
488
489
			apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd > /dev/null
			# change to selected interface
490
			sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
491
492
493
494
495
			# 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
496
497
				dialog --backtitle "$BACKTITLE" --title "Please wait" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing Realtek hostapd driver compatibility." 7 50
498
499
				apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd-realtek > /dev/null
				# change to selected interface
500
				sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
501
502
503
504
			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
505
506
				dialog --backtitle "$BACKTITLE" --title "Warning" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nNo compatible hostapd driver found." 7 39
507
508
509
510
511
512
				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
513
514
515
			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
516
517
			response=$?
			DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
Igor Pecovnik's avatar
Igor Pecovnik committed
518
519
			NETWORK_CONF="/etc/network/interfaces"
			TEMP_CONF="/etc/network/interfaces.out"
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
			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
548
549
550
					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
551
552
553
					# 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
554
555
					echo "bind-interfaces							# Bind to the interface to make sure we aren't sending \
					things elsewhere" >> /etc/dnsmasq.conf
556
557
					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
558
559
560
561
					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
562
563
564
565
566
567
568
569
570
					# - 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
571
572
573
574
575
					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
576
				;;
577
578
			3)exit;;

579
580
			255) exit;;
			esac
581
582
			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"
583
			service hostapd stop
584
585
586
587
			if [[ $? = 0 ]]; then
				mv $TEMP_CONF $NETWORK_CONF
				reboot
			fi
588
589
590
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
591

592
593
594
595
596
597
598
	# 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
599
600
	# Edit boot environment
	#
Igor Pecovnik's avatar
Igor Pecovnik committed
601
	"Bootenv" )
602
		dialog --title "Edit u-boot environment" --ok-label "Save" \
Igor Pecovnik's avatar
Igor Pecovnik committed
603
		--no-collapse --editbox /boot/armbianEnv.txt 30 0 2> /boot/armbianEnv.txt.out
604
		[[ $? = 0 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
605
606
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
607
608
609
610
611
612
613
614
615
	# 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
616
617
618

	# Switch to daily builds
	#
619
	"Nightly" )
Igor Pecovnik's avatar
Igor Pecovnik committed
620
621
622
		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
623
624
625
626
		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
627
628
			dialog --title "Switching to nightly" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nReboot to apply new settings?" 7 34
629
630
			if [[ $? = 0 ]]; then reboot; fi
		fi
631
	;;
632

Igor Pecovnik's avatar
Igor Pecovnik committed
633
634
635

	# Switch to stable builds
	#
636
	"Stable" )
Igor Pecovnik's avatar
Igor Pecovnik committed
637
638
639
640
641
642
643
644
645
646
647
		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
648
649
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
650
651
652

	# Freeze and unfreeze kernel and board support packages
	#
653
	"Hold" | "Unhold" )
Igor Pecovnik's avatar
Igor Pecovnik committed
654
655
		dialog --title "Update" --backtitle "$BACKTITLE" --yes-label "$selection" --no-label "Cancel" \
		--yesno "\nDo you want to ${selection,,} kernel updates?" 7 50
656
657
658
		if [[ $? = 0 ]]; then
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
Igor Pecovnik's avatar
Igor Pecovnik committed
659
660
661
662
663
		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
664
665
		fi
	;;
666

Igor Pecovnik's avatar
Igor Pecovnik committed
667
668
669

	# Install to SATA, eMMC, NAND or USB
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
670
671
672
673
	"Install" )
		nand-sata-install
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
674
675
676

	# Connect to wireless access point
	#
677
	"WiFi" )
678
		# scan for wifi modules
679
		array=( $(nmcli dev | grep "wifi" | awk '{print $1}') )
680
681
682
683
684
685
686
		declared_wlans=0;
		for i in "${array[@]}"
			do
			if grep --quiet "^iface $i" /etc/network/interfaces; then
				let declared_wlans+=1
			fi
		done
687
688
689
690
691
		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
692
693
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
694
695
696
697
			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
698
		else
699
			CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
700
			if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
701
702
				dialog --title "Error" --backtitle "$BACKTITLE" --no-collapse \
				--msgbox "\nHostapd service is running. Disable it and try again." 7 57
703
				exit
704
			elif [[ -n $CURRENT_UUID ]]; then
705
706
				dialog --title "Info" --backtitle "$BACKTITLE" --no-collapse \
				--yesno "\nAlready connected via wireless.\n\nDo you want to disconnect?" 9 57
707
				[[ $? = 0 ]] && nmcli connection down uuid $CURRENT_UUID
708
			else
709
710
			# disable AP mode on certain adapters
			wlan_exceptions "off"
711
712
			nmtui-connect
			fi
713
		fi
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
714
715
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
716
717
718

	# Send diagnostics
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
719
720
721
722
723
724
725
	"Diagnostics" )
		clear
		armbianmonitor -u
		echo ""
		read -n 1 -s -p "Press any key to continue"
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
726
727
728

	# Application installer
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
729
730
731
732
	"Softy" )
		softy
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
733
734
735

	# Switch to alternative kernels
	#
736
737
738
	"Switch" )
		aval_kernel
		exceptions "$INSTALL_KERNEL"
Igor Pecovnik's avatar
Igor Pecovnik committed
739
740
741
		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
742
743
744
		if [[ $? = 0 ]]; then
			# remove old
			dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nRemoving current kernel." 5 28
Igor Pecovnik's avatar
Igor Pecovnik committed
745
746
747
			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
748
749
750
751
752
753
			# 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
754
			# install new
Igor Pecovnik's avatar
Igor Pecovnik committed
755
756
757
758
759
			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
760
761
762
			reboot
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
763
764
765

	# Simple CLI monitoring
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
766
767
768
769
770
771
	"Monitor" )
		clear
		armbianmonitor -m | dialog --backtitle "$BACKTITLE" --title "Simple CLI monitoring $BOARD" --progressbox 15 64
	;;

	esac
Igor Pecovnik's avatar
Igor Pecovnik committed
772

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
773
done