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

Igor Pecovnik's avatar
Igor Pecovnik committed
48
49
50
51
52
53
54
55
check_port ()
{
#------------------------------------------------------------------------------------------------------------------------------------------
# Check if something is running on port $1 and display info
#------------------------------------------------------------------------------------------------------------------------------------------
[[ -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
}
Igor Pecovnik's avatar
Igor Pecovnik committed
56

57
58
59
60
61
62
63
64
65
66
67
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# show disclaimer
#
function beta_disclaimer ()
{
exec 3>&1
ACKNOWLEDGEMENT=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse --title "Warning" --clear \--radiolist "\n$1.\n \n" 12 56 7 "Yes, I understand" "" off	 2>&1 1>&3)
exec 3>&-
}

Igor Pecovnik's avatar
Igor Pecovnik committed
68
69
70
71
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# show description for MOTD files
#
72
73
function description
{
Igor Pecovnik's avatar
Igor Pecovnik committed
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
	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
97
98
}

Igor Pecovnik's avatar
Igor Pecovnik committed
99
100
101

# edit hostapd parameters
#
102
103
function wlan_edit ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
	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
		}
121
122
}

Igor Pecovnik's avatar
Igor Pecovnik committed
123
124
125

# naming exceptions for packages
#
126
127
function exceptions ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
128
129
130
131
132
133
	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
134
135
		;;
		cubieboard | lime-a10 | pcduino2)
Igor Pecovnik's avatar
Igor Pecovnik committed
136
137
		if [[ $TARGET_BRANCH == "default" ]]; \
		then TARGET_FAMILY="sun4i"; TARGET_BRANCH=""; else TARGET_FAMILY="sunxi"; TARGET_BRANCH="-"$TARGET_BRANCH; fi
138
139
		;;
		*)
Igor Pecovnik's avatar
Igor Pecovnik committed
140
141
142
		if [[ $TARGET_BRANCH == "default" ]]; \
		then TARGET_BRANCH=""; else TARGET_BRANCH="-"$TARGET_BRANCH; fi
	esac
143
144
}

Igor Pecovnik's avatar
Igor Pecovnik committed
145
146
147

# here we add wifi exceptions
#
148
149
function wlan_exceptions ()
{
Igor Pecovnik's avatar
Igor Pecovnik committed
150
151
152
153
	[[ -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
154
155
}

Igor Pecovnik's avatar
Igor Pecovnik committed
156
157
158

# check if board has alternative kernels
#
159
160
161
162
function aval_kernel ()
{
	IFS=$'\r\n'
	GLOBIGNORE='*'
Igor Pecovnik's avatar
Igor Pecovnik committed
163
164
	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" ))
165
166
167
168
169
170
171
172
173
174
	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
175
176
			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)
177
178
179
180
			exec 3>&-
	fi
}

Igor Pecovnik's avatar
Igor Pecovnik committed
181

182
183
# search for wlan interfaces and provide a selection menu if there are more than one
#
Igor Pecovnik's avatar
Igor Pecovnik committed
184
185
function get_wlan_interface ()
{
186
187
188
	IFS=$'\r\n'
	GLOBIGNORE='*'
	WLAN_INTERFACES=($(nmcli dev status | grep wifi |awk '{print $1}'))
189
190
191
192
193
194
195
	local LIST=()
	for i in "${WLAN_INTERFACES[@]}"
	do
			LIST+=( "${i[0]//[[:blank:]]/}" "" )
	done
	LIST_LENGHT=$((${#LIST[@]}/2));
	if [ "$LIST_LENGHT" -eq 1 ]; then
196
			WIRELESS_ADAPTER=${WLAN_INTERFACES[0]}
197
198
	else
			exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
199
200
			WIRELESS_ADAPTER=$(dialog --nocancel --backtitle "$BACKTITLE" --no-collapse \
			--title "Select interface" --clear --menu "" $((6+${LIST_LENGHT})) 30 15 "${LIST[@]}" 2>&1 1>&3)
201
202
203
			exec 3>&-
	fi
}
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245


# 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
246
#
Igor Pecovnik's avatar
Igor Pecovnik committed
247
#-----------------------------------------------------------------------------------------------------------------------------------------#
248

249
dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nLoading Armbian configuration utility ... " 5 45
250

Igor Pecovnik's avatar
Igor Pecovnik committed
251
252
253
# Main loop
#
while true; do
254

255
256
257
258
259
	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
260
261
262
	LIST=()
	#
	# here we add new items to menu. with condition when needed
Igor Pecovnik's avatar
Igor Pecovnik committed
263
	LIST+=( "Timezone" "Change your timezone" )
264
	[[ $(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
265
266
267
268
269
270
	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
271
	[[ $(hcitool dev | sed '1d') != "" ]] && LIST+=( "Bluetooth" "Connect Bluetooth devices" )
Igor Pecovnik's avatar
Igor Pecovnik committed
272
273
	[[ -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" )
274
275
276

	if [[ -n $DISPLAY_MANAGER ]]; then
			LIST+=( "Desktop" "Disable desktop" )
277
278
			[[ $DISPLAY_MANAGER == 'nodm' ]] && LIST+=( "Lightdm" "Switch to standard login manager" )
			[[ $DISPLAY_MANAGER == 'lightdm' ]] && LIST+=( "Nodm" "Switch to simple auto login manager" )
279
280
281
282
283
284
285
286
287
288
289
290
			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
291
292
293
294
295
296

	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
297
298
299
300
301
302
303
304
305
306
307
308
	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" )
309
	if [[ -n $(dpkg -l | grep linux-headers) ]]; then LIST+=( "Headers" "Remove kernel headers" ); else LIST+=( "Headers" "Install kernel headers" ); fi
Igor Pecovnik's avatar
Igor Pecovnik committed
310
	[[ -n $(grep -w "#kernel.printk" /etc/sysctl.conf ) ]] && LIST+=( "Lowlevel" "Stop low-level messages on console" )
Igor Pecovnik's avatar
Igor Pecovnik committed
311
312
	[[ -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
313
314
315
	LIST+=( "Network" "Edit network settings" )
	LIST+=( "-" "" )
	LIST+=( "Services" "Toggle running services" )
316
	[[ -d /boot/dtb/overlay && $LINUXFAMILY == sunxi && $BRANCH != default ]] && LIST+=( "Overlay" "Toggle hardware functions: UART, I2C, SPI, W1, ..." )
Chris Rohlfs's avatar
Chris Rohlfs committed
317
	LIST+=( "Welcome" "Toggle welcome screen items" )
Igor Pecovnik's avatar
Igor Pecovnik committed
318
319
320
321
322
323
	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
324
325
	[[ $(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" )
326
327
328
329
330
331
332
	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
333
334
335
	# count number of menu items to adjust window sizee
	LISTLENGHT="$((7+${#LIST[@]}/2))"
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
336

Igor Pecovnik's avatar
Igor Pecovnik committed
337
338
339
	# main dialog routine
	DIALOG_CANCEL=1
	DIALOG_ESC=255
340

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
341
	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
342
343
	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
344
345
346
347
348
	"${LIST[@]}" 2>&1 1>&3)
	exit_status=$?
	exec 3>&-
	case $exit_status in
	$DIALOG_CANCEL)
349
350
		#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
351
352
353
354
355
356
357
358
		exit
	;;
	$DIALOG_ESC)
		clear
		exit 1
		;;
	esac

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

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
361
362
	case $selection in

Igor Pecovnik's avatar
Igor Pecovnik committed
363

364
365
366
367
368
369
370
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
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
	# Toggle welcome screen items
	#
	"Overlay" )
	# check if user agree to enter this area
			beta_disclaimer "You are entering beta area. Functions are not yet done - in case of troubles and advanced usage, check https://docs.armbian.com"
			if [[ -n $ACKNOWLEDGEMENT ]]; then
				overlay_prefix=$(cat /boot/armbianEnv.txt | grep overlay_prefix | sed 's/overlay_prefix=//g')
				TARGET_BRANCH=$BRANCH
				exceptions "$BRANCH"
				while true; do
				HOME="/boot/dtb/overlay"
				MOTD=()
				LINES=()
				LIST_CONST=2
				j=0
				DIALOG_CANCEL=1
				DIALOG_ESC=255

				while read line
				do
					STATUS=$([[ -n $(cat /boot/armbianEnv.txt | grep overlays | grep -w ${line}) ]] && echo "on")
					DESC=$(description "$line")
					MOTD+=( "$line" "$DESC" "$STATUS")
					LINES[ $j ]=$line
					(( j++ ))
				done < <(ls -1 $HOME/${overlay_prefix}*.dtbo | sed 's/^.*\('${overlay_prefix}'.*\)/\1/g' | sed 's/'${overlay_prefix}'-//g' | sed 's/.dtbo//g' )

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

						exec 3>&1
						selection=$(dialog --backtitle "$BACKTITLE" --title "Toggle motd executing scripts" --clear --cancel-label \
						"Exit" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
						$LISTLENGHT 70 22 "${MOTD[@]}" 2>&1 1>&3)
						exit_status=$?
						exec 3>&-
						case $exit_status in
						$DIALOG_CANCEL | $DIALOG_ESC)
								break
								;;
						0)
							newoverlays="$(echo "$selection" | sed "s|[^ ]* *|&|g")"
							sed -i "s/^overlays=.*/overlays=$newoverlays/" /boot/armbianEnv.txt || cat "overlays=$newoverlays" >> /boot/armbianEnv.txt
						;;
						esac
				done
			fi
	;;


Chris Rohlfs's avatar
Chris Rohlfs committed
413
	# Toggle welcome screen items
Igor Pecovnik's avatar
Igor Pecovnik committed
414
	#
415
416
417
418
419
	"Welcome" )
		while true; do
		HOME="/etc/update-motd.d/"
		MOTD=()
		LINES=()
Igor Pecovnik's avatar
Igor Pecovnik committed
420
		LIST_CONST=6
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
		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
437
				selection=$(dialog --backtitle "$BACKTITLE" --title "Toggle motd executing scripts" --clear --cancel-label \
Igor Pecovnik's avatar
Igor Pecovnik committed
438
439
				"Exit" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
				$LISTLENGHT 70 15 "${MOTD[@]}" 2>&1 1>&3)
440
441
442
443
				exit_status=$?
				exec 3>&-
				case $exit_status in
				$DIALOG_CANCEL | $DIALOG_ESC)
444
						break
445
446
447
448
449
450
451
						;;
				0)
						chmod -x ${HOME}*
						chmod +x $(echo "$selection" | sed "s|[^ ]* *|${HOME}&|g")
				;;
				esac
		done
452
453
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
454
455
456

	# Set the display resolution
	#
457
458
459
460
	"Display" )
		h3disp
		exit
	;;
461

462
463
464
465
466
	"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
Igor Pecovnik's avatar
Igor Pecovnik committed
467
			debconf-apt-progress -- apt-get -y install xrdp vnc4server
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
			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
490
491
	# Enable or disable desktop
	#
492
	"Desktop" )
493
		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
494
495
			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
496
			exitstatus=$?;
497
			[[ $exitstatus = 0 ]] && service nodm stop && service lightdm stop && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=false/" /etc/default/nodm
498
		else
499
500
			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
501
			exitstatus=$?;
502
			[[ $exitstatus = 0 ]] && apt-get -o Dpkg::Options::="--force-confold" -y -qq --no-install-recommends install lightdm-gtk-greeter lightdm >/dev/null 2>&1 && systemctl start lightdm.service
503
			[[ $exitstatus = 1 ]] && sed -i "s/^NODM_ENABLED=.*/NODM_ENABLED=true/" /etc/default/nodm && service nodm start
504
505
506
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
507
508
509

	# Control board consumption
	#
510
511
512
513
	"Consumption" )
		h3consumption
		exit
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
514
515
516
517


	# Board (fex) settings editor
	#
518
519
520
521
	"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
522
		dialog --title "Edit u-boot environment" \
Igor Pecovnik's avatar
Igor Pecovnik committed
523
		--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt  40 0 2> ${TEMP}/tempfex.out
524
		[[ $? = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
525
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
526
527
528
529


	# Toggle running services
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
530
531
532
533
	"Services" )
		rcconf
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
534
535
536
537
538
539
	# Change timezone
	#
	"Timezone" )
		dpkg-reconfigure tzdata
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
540
541
542
543
544
545
546
547
548
549
550
551
552
	"USB redirector" )
		if [[ -n $(netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".'32032'"') ]]; then
			[[ -f /usr/local/usb-redirector/uninstall.sh ]] && /usr/local/usb-redirector/uninstall.sh uninstall
			rm -f /usr/local/bin/usbclnt
		else
			TARGET_BRANCH=$BRANCH
			exceptions "$BRANCH"
			IFS='.' read -a array <<< $(uname -r)
			[[ -z $(dpkg -l | grep linux-headers) ]] && debconf-apt-progress -- apt-get -y install linux-headers${TARGET_BRANCH}-${TARGET_FAMILY}
			rm -rf /usr/src/usb-redirector-linux-arm-eabi
			if (( "${array[0]}" == "4" )) && (( "${array[1]}" >= "1" )); then
				wget -qO- http://www.incentivespro.com/usb-redirector-linux-arm-eabi.tar.gz | tar xz -C /usr/src
			else
Igor Pecovnik's avatar
Igor Pecovnik committed
553
				wget -qO- https://raw.githubusercontent.com/armbian/build/master/packages/blobs/usb-redirector/usb-redirector-old.tgz | tar xz -C /usr/src
Igor Pecovnik's avatar
Igor Pecovnik committed
554
555
556
			fi
			cd /usr/src/usb-redirector-linux-arm-eabi/
			./installer.sh install
Igor Pecovnik's avatar
Igor Pecovnik committed
557
			sleep 3
Igor Pecovnik's avatar
Igor Pecovnik committed
558
559
560
561
562
			check_port "32032" "USB Redirector"
		fi
	;;


563
564
565
566
567
568
569
570
571
	"Headers" )
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
		if [[ -n $(dpkg -l | grep linux-headers) ]]; then
			debconf-apt-progress -- apt-get -y remove linux-headers${TARGET_BRANCH}-${TARGET_FAMILY}
		else
			debconf-apt-progress -- apt-get -y install linux-headers${TARGET_BRANCH}-${TARGET_FAMILY}
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
572
573
574

	# Stop low-level messages on console
	#
575
	"Lowlevel" )
Igor Pecovnik's avatar
Igor Pecovnik committed
576
577
		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
578
579
580
581
582
		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
583
584
	# Toggle virtual read-only root filesystem
	#
585
586
	"Overlayroot" )
		if [[ -n $(mount | grep -w overlay) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
587
588
589
590
			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 && \
591
			overlayroot-chroot rm /etc/update-motd.d/97-overlayroot && reboot
592
		else
593
			debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confnew" -y --no-install-recommends install overlayroot
594
			echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
595
596
			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
597
598
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
599
600
601
602
			[[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
603
604
	# Edit network settings
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
605
	"Network" )
606
		dialog --backtitle "$BACKTITLE" --title "Edit network configuration" --no-collapse \
Igor Pecovnik's avatar
Igor Pecovnik committed
607
		--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
608
		[[ $? = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && service network-manager restart
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
609
610
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
611
612
	# Create WiFi access point
	#
613
	"Hotspot" )
614
		systemctl daemon-reload
615
		CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
616
		if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
617
618
			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
619
			exitstatus=$?;
620
621
622
623
624
625
626
			if [[ $exitstatus = 0 ]]; then
				service hostapd stop
				sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd
				systemctl daemon-reload
				rm /etc/NetworkManager/conf.d/armbian.conf
				service network-manager reload
			fi
627
			if [[ $exitstatus = 1 ]]; then wlan_edit; service hostapd stop; sleep 1; service hostapd start; fi
628
629
630
631
		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
632
		else
633
634
635
636
637
638
639
640
641
642
643
644
			# check if user agree to enter this area
			beta_disclaimer "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, check manual methods."
			if [[ -n $ACKNOWLEDGEMENT ]]; then
				# change special adapters to AP mode
				wlan_exceptions "on"
				# check for WLAN interfaces
				get_wlan_interface
				# 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
				# display dialog
Igor Pecovnik's avatar
Igor Pecovnik committed
645
				dialog --backtitle "$BACKTITLE" --title "Please wait" \
646
647
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing nl80211 hostapd driver compatibility." 7 50
				apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd > /dev/null
648
				# change to selected interface
649
				sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
				# 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
					dialog --backtitle "$BACKTITLE" --title "Please wait" \
					--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing Realtek hostapd driver compatibility." 7 50
					apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd-realtek > /dev/null
					# change to selected interface
					sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
				fi
				CHECK=$(systemctl daemon-reload;service hostapd restart;service hostapd status|grep fail)
				# if both fails there is other problem
				if [[ -n "$CHECK" ]]; then
					dialog --backtitle "$BACKTITLE" --title "Warning" \
					--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nNo compatible hostapd driver found." 7 39
					sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd
					systemctl daemon-reload;service hostapd restart
					sleep 3
Igor Pecovnik's avatar
Igor Pecovnik committed
669
					break
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
				fi

				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
				response=$?
				DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
				NETWORK_CONF="/etc/network/interfaces"
				dialog --title "Network configuration" --backtitle "$BACKTITLE" --yesno "\nStart with clean config?" 7 29
				[[ $? = 0 ]] && NETWORK_CONF="/etc/network/interfaces.default";

				TEMP_CONF="/etc/network/interfaces.out"
				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
						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
						# 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
						echo "bind-interfaces							# Bind to the interface to make sure we aren't sending \
						things elsewhere" >> /etc/dnsmasq.conf
						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
						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
						# - 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
						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
					;;
				3)exit;;

				255) exit;;
				esac
				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"
				response=$?
				service hostapd stop
				if [[ $response = 0 ]]; then
					mv $TEMP_CONF /etc/network/interfaces
749
					reboot
750
				fi
751
			fi
752
753
754
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
755

756
757
758
759
760
761
762
	# 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
763
764
	# Edit boot environment
	#
Igor Pecovnik's avatar
Igor Pecovnik committed
765
	"Bootenv" )
766
		dialog --title "Edit u-boot environment" --ok-label "Save" \
Igor Pecovnik's avatar
Igor Pecovnik committed
767
		--no-collapse --editbox /boot/armbianEnv.txt 30 0 2> /boot/armbianEnv.txt.out
768
		[[ $? = 0 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
769
770
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
771
772
773
774
775
776
777
778
779
	# 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
780
781
782

	# Switch to daily builds
	#
783
	"Nightly" )
Igor Pecovnik's avatar
Igor Pecovnik committed
784
785
786
		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
787
788
789
790
		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
791
792
			dialog --title "Switching to nightly" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nReboot to apply new settings?" 7 34
793
794
			if [[ $? = 0 ]]; then reboot; fi
		fi
795
	;;
796

Igor Pecovnik's avatar
Igor Pecovnik committed
797
798
799

	# Switch to stable builds
	#
800
	"Stable" )
Igor Pecovnik's avatar
Igor Pecovnik committed
801
802
803
804
805
806
807
808
809
810
811
		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
812
813
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
814
815
816

	# Freeze and unfreeze kernel and board support packages
	#
817
	"Hold" | "Unhold" )
Igor Pecovnik's avatar
Igor Pecovnik committed
818
819
		dialog --title "Update" --backtitle "$BACKTITLE" --yes-label "$selection" --no-label "Cancel" \
		--yesno "\nDo you want to ${selection,,} kernel updates?" 7 50
820
821
822
		if [[ $? = 0 ]]; then
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
823
824
825
		PACKAGE_LIST="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"
		[[ $BRANCH != "default" ]] && PACKAGE_LIST=$PACKAGE_LIST" linux-dtb$TARGET_BRANCH-$TARGET_FAMILY"
		apt-mark ${selection,,} $PACKAGE_LIST | dialog --backtitle "$BACKTITLE" --title "Package locking" --progressbox 7 64
826
827
		fi
	;;
828

Igor Pecovnik's avatar
Igor Pecovnik committed
829
830
831

	# Install to SATA, eMMC, NAND or USB
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
832
833
834
835
	"Install" )
		nand-sata-install
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
836
837
838

	# Connect to wireless access point
	#
839
	"WiFi" )
840
		# scan for wifi modules
841
		array=( $(nmcli dev | grep "wifi" | awk '{print $1}') )
842
843
844
845
846
847
848
		declared_wlans=0;
		for i in "${array[@]}"
			do
			if grep --quiet "^iface $i" /etc/network/interfaces; then
				let declared_wlans+=1
			fi
		done
849
850
851
852
853
		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
854
855
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
856
857
858
859
			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
860
		else
861
			CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
862
			if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
863
864
				dialog --title "Error" --backtitle "$BACKTITLE" --no-collapse \
				--msgbox "\nHostapd service is running. Disable it and try again." 7 57
865
				exit
866
			elif [[ -n $CURRENT_UUID ]]; then
867
868
				dialog --title "Info" --backtitle "$BACKTITLE" --no-collapse \
				--yesno "\nAlready connected via wireless.\n\nDo you want to disconnect?" 9 57
869
				[[ $? = 0 ]] && nmcli connection down uuid $CURRENT_UUID
870
			else
871
872
			# disable AP mode on certain adapters
			wlan_exceptions "off"
873
874
			nmtui-connect
			fi
875
		fi
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
876
877
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
878
879
880

	# Send diagnostics
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
881
882
883
884
885
886
887
	"Diagnostics" )
		clear
		armbianmonitor -u
		echo ""
		read -n 1 -s -p "Press any key to continue"
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
888
889
890

	# Application installer
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
891
892
893
894
	"Softy" )
		softy
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
895
896
897

	# Switch to alternative kernels
	#
898
899
900
	"Switch" )
		aval_kernel
		exceptions "$INSTALL_KERNEL"
Igor Pecovnik's avatar
Igor Pecovnik committed
901
902
903
		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
904
905
906
		if [[ $? = 0 ]]; then
			# remove old
			dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nRemoving current kernel." 5 28
Igor Pecovnik's avatar
Igor Pecovnik committed
907
908
909
			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
910
911
912
913
914
915
			# 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
916
			# install new
Igor Pecovnik's avatar
Igor Pecovnik committed
917
918
			INSTALL_DTB=""
			[[ -n $(apt-cache search --names-only "^linux-dtb$TARGET_BRANCH-$TARGET_FAMILY") ]] && INSTALL_DTB="linux-dtb$TARGET_BRANCH-$TARGET_FAMILY"
Igor Pecovnik's avatar
Igor Pecovnik committed
919
920
			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} \
Igor Pecovnik's avatar
Igor Pecovnik committed
921
922
923
924
925
			linux-$(lsb_release -cs)-root$TARGET_BRANCH-$BOARD $INSTALL_DTB

			dialog --title "Kernel switch" --backtitle "$BACKTITLE" --yes-label "Yes" --no-label "Cancel" --yesno "\nNew kernel was installed. Reboot?" 7 64
			exitstatus=$?;
			[[ $exitstatus = 0 ]] &&  reboot
926
927
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
928
929
930

	# Simple CLI monitoring
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
931
932
933
934
935
936
	"Monitor" )
		clear
		armbianmonitor -m | dialog --backtitle "$BACKTITLE" --title "Simple CLI monitoring $BOARD" --progressbox 15 64
	;;

	esac
Igor Pecovnik's avatar
Igor Pecovnik committed
937

Chris Rohlfs's avatar
Chris Rohlfs committed
938
done