debian-config 26.7 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
28
29
30
31
32
33
34
35
		[[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' bc 2>/dev/null) != *ii* ]] && \
		apt-get -qq -y --no-install-recommends install expect
		[[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' expect 2>/dev/null) != *ii* ]] && \
		apt-get -qq -y --no-install-recommends install bc
		[[ $(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
36
fi
37

Igor Pecovnik's avatar
Igor Pecovnik committed
38
# gather info about the board
39
#
Igor Pecovnik's avatar
Igor Pecovnik committed
40
41
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"



48

Igor Pecovnik's avatar
Igor Pecovnik committed
49
50
51
52
#-----------------------------------------------------------------------------------------------------------------------------------------#
#
# 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
}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
185
#
Igor Pecovnik's avatar
Igor Pecovnik committed
186
#-----------------------------------------------------------------------------------------------------------------------------------------#
187

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

Igor Pecovnik's avatar
Igor Pecovnik committed
189
190
# Show disclaimer where you need to press SPACE to continue. To make sure warning is read.
#
191
exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
192
193
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)
194
195
196
exec 3>&-
if [[ $ACKNOWLEDGEMENT == "" ]]; then exit; fi

197

Igor Pecovnik's avatar
Igor Pecovnik committed
198
199
200
# Main loop
#
while true; do
201

Igor Pecovnik's avatar
Igor Pecovnik committed
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
	LIST=()
	#
	# here we add new items to menu. with condition when needed
	[[ -f /usr/sbin/nand-sata-install ]] && LIST+=( "Install" "Install to SATA, eMMC, NAND or USB" )
	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
	[[ -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" )
	[[ -f /boot/armbianEnv.txt ]] && LIST+=( "Booting" "Edit boot environment" )
	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
	[[ $(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" )
	[[ "$DISTRO" == "Ubuntu" && "$(modinfo overlay > /dev/null 2>&1; echo $?)" == "0" ]] && \
	LIST+=( "Overlayroot" "Toggle virtual read-only root filesystem" )
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
244

Igor Pecovnik's avatar
Igor Pecovnik committed
245
246
247
	# count number of menu items to adjust window sizee
	LISTLENGHT="$((7+${#LIST[@]}/2))"
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
248

Igor Pecovnik's avatar
Igor Pecovnik committed
249
250
251
	# main dialog routine
	DIALOG_CANCEL=1
	DIALOG_ESC=255
252

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
253
	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
254
255
	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
256
257
258
259
260
	"${LIST[@]}" 2>&1 1>&3)
	exit_status=$?
	exec 3>&-
	case $exit_status in
	$DIALOG_CANCEL)
261
262
		#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
263
264
265
266
267
268
269
270
		exit
	;;
	$DIALOG_ESC)
		clear
		exit 1
		;;
	esac

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

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
273
274
	case $selection in

Igor Pecovnik's avatar
Igor Pecovnik committed
275
276
277

	# Toogle welcome screen items
	#
278
279
280
281
282
	"Welcome" )
		while true; do
		HOME="/etc/update-motd.d/"
		MOTD=()
		LINES=()
Igor Pecovnik's avatar
Igor Pecovnik committed
283
		LIST_CONST=6
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
		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
300
				selection=$(dialog --backtitle "$BACKTITLE" --title "Toogle motd executing scripts" --clear --cancel-label \
Igor Pecovnik's avatar
Igor Pecovnik committed
301
302
				"Exit" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
				$LISTLENGHT 70 15 "${MOTD[@]}" 2>&1 1>&3)
303
304
305
306
307
308
309
310
311
312
313
314
				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
315
316
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
317
318
319

	# Set the display resolution
	#
320
321
322
323
	"Display" )
		h3disp
		exit
	;;
324

Igor Pecovnik's avatar
Igor Pecovnik committed
325
326
	# Enable or disable desktop
	#
327
328
	"Desktop" )
		if [[ -f /usr/sbin/nodm && -n $(service nodm status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
329
330
			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
331
332
333
			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
334
335
			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
336
337
338
339
340
			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
341
342
343

	# Control board consumption
	#
344
345
346
347
	"Consumption" )
		h3consumption
		exit
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
348
349
350
351


	# Board (fex) settings editor
	#
352
353
354
355
	"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
Igor Pecovnik's avatar
Igor Pecovnik committed
356
357
		dialog --title "Edit u-boot environment" --help-button --help-label "Save & reboot" \
		--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt  40 0 2> ${TEMP}/tempfex.out
358
359
360
361
		exitstatus=$?;
		[[ $exitstatus = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
		[[ $exitstatus = 2 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin && reboot
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
362
363
364
365


	# Toggle running services
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
366
367
368
369
	"Services" )
		rcconf
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
370
371
372

	# Stop low-level messages on console
	#
373
	"Lowlevel" )
Igor Pecovnik's avatar
Igor Pecovnik committed
374
375
		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
376
377
378
379
380
		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
381
382
	# Toggle virtual read-only root filesystem
	#
383
384
	"Overlayroot" )
		if [[ -n $(mount | grep -w overlay) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
385
386
387
388
389
			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 && \
			rm /etc/update-motd.d/97-overlayroot && reboot
390
		else
391
			debconf-apt-progress -- apt-get -y --no-install-recommends install overlayroot
392
			echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
393
			echo 'echo -e "[\e[0m \e[1mremember: root is in virtual read only mode\e[0m ]\n"' >> /etc/update-motd.d/97-overlayroot
Igor Pecovnik's avatar
Igor Pecovnik committed
394
395
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
396
397
398
399
			[[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
400
401
	# Edit network settings
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
402
	"Network" )
Igor Pecovnik's avatar
Igor Pecovnik committed
403
404
		dialog --backtitle "$BACKTITLE" --title "Edit network configuration" --no-collapse --help-button --help-label "Save & reboot" \
		--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
405
406
407
		exitstatus=$?;
		[[ $exitstatus = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && service network-manager restart
		[[ $exitstatus = 2 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && reboot
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
408
409
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
410
411
	# Create WiFi access point
	#
412
	"Hotspot" )
413
		systemctl daemon-reload
414
		CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
415
		if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
416
417
			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
418
			exitstatus=$?;
Igor Pecovnik's avatar
Igor Pecovnik committed
419
420
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
421
			if [[ $exitstatus = 1 ]]; then wlan_edit; service hostapd stop; sleep 1; service hostapd start; fi
422
423
424
425
		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
426
		else
427
			# change special adapters to AP mode
Igor Pecovnik's avatar
Igor Pecovnik committed
428
			wlan_exceptions "on"
429
430
431
			# check for WLAN interfaces
			get_wlan_interface
			# display dialog
Igor Pecovnik's avatar
Igor Pecovnik committed
432
433
			dialog --backtitle "$BACKTITLE" --title "Please wait" \
			--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing nl80211 hostapd driver compatibility." 7 50
434
435
			apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd > /dev/null
			# change to selected interface
436
			sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
437
438
439
440
441
			# 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
442
443
				dialog --backtitle "$BACKTITLE" --title "Please wait" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nProbing Realtek hostapd driver compatibility." 7 50
444
445
				apt-get -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd-realtek > /dev/null
				# change to selected interface
446
				sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
447
448
449
450
			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
451
452
				dialog --backtitle "$BACKTITLE" --title "Warning" \
				--infobox "\nWireless adapter: $WIRELESS_ADAPTER\n\nNo compatible hostapd driver found." 7 39
453
454
455
456
457
458
				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
459
460
461
			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
462
463
			response=$?
			DEFAULT_ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
Igor Pecovnik's avatar
Igor Pecovnik committed
464
465
			NETWORK_CONF="/etc/network/interfaces"
			TEMP_CONF="/etc/network/interfaces.out"
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
			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
494
					apt-get -qq -y --no-install-recommends install dnsmasq iptables
Igor Pecovnik's avatar
Igor Pecovnik committed
495
496
					echo -e "\nallow-hotplug $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER \
					inet static\naddress 172.24.1.1\nnetmask 255.255.255.0\nnetwork 172.24.1.0\nbroadcast 172.24.1.255" >> $TEMP_CONF
497
498
499
					# 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
500
501
					echo "bind-interfaces							# Bind to the interface to make sure we aren't sending \
					things elsewhere" >> /etc/dnsmasq.conf
502
503
					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
504
505
506
507
					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
508
509
510
511
512
513
514
515
516
					# - 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
517
518
519
520
521
					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
522
				;;
523
524
			3)exit;;

525
526
			255) exit;;
			esac
527
528
			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"
529
			service hostapd stop
530
531
532
533
			if [[ $? = 0 ]]; then
				mv $TEMP_CONF $NETWORK_CONF
				reboot
			fi
534
535
536
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
537
538
539

	# Edit boot environment
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
540
	"Booting" )
Igor Pecovnik's avatar
Igor Pecovnik committed
541
542
		dialog --title "Edit u-boot environment" --help-button --help-label "Save & reboot" --ok-label "Save" \
		--no-collapse --editbox /boot/armbianEnv.txt 30 0 2> /boot/armbianEnv.txt.out
543
544
545
		exitstatus=$?;
		[[ $exitstatus = 0 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt
		[[ $exitstatus = 2 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt && reboot
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
546
547
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
548
549
550

	# Switch to daily builds
	#
551
	"Nightly" )
Igor Pecovnik's avatar
Igor Pecovnik committed
552
553
554
		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
555
556
557
558
		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
559
560
			dialog --title "Switching to nightly" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nReboot to apply new settings?" 7 34
561
562
			if [[ $? = 0 ]]; then reboot; fi
		fi
563
	;;
564

Igor Pecovnik's avatar
Igor Pecovnik committed
565
566
567

	# Switch to stable builds
	#
568
	"Stable" )
Igor Pecovnik's avatar
Igor Pecovnik committed
569
570
571
572
573
574
575
576
577
578
579
		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
580
581
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
582
583
584

	# Freeze and unfreeze kernel and board support packages
	#
585
	"Hold" | "Unhold" )
Igor Pecovnik's avatar
Igor Pecovnik committed
586
587
		dialog --title "Update" --backtitle "$BACKTITLE" --yes-label "$selection" --no-label "Cancel" \
		--yesno "\nDo you want to ${selection,,} kernel updates?" 7 50
588
589
590
		if [[ $? = 0 ]]; then
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
Igor Pecovnik's avatar
Igor Pecovnik committed
591
592
593
594
595
		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
596
597
		fi
	;;
598

Igor Pecovnik's avatar
Igor Pecovnik committed
599
600
601

	# Install to SATA, eMMC, NAND or USB
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
602
603
604
605
	"Install" )
		nand-sata-install
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
606
607
608

	# Connect to wireless access point
	#
609
	"WiFi" )
610
		# scan for wifi modules
611
		array=( $(nmcli dev | grep "wifi" | awk '{print $1}') )
612
613
614
615
616
617
618
		declared_wlans=0;
		for i in "${array[@]}"
			do
			if grep --quiet "^iface $i" /etc/network/interfaces; then
				let declared_wlans+=1
			fi
		done
619
620
621
622
623
		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
624
625
			if [[ $exitstatus = 0 ]]; then service hostapd stop ; sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd; \
			systemctl daemon-reload; fi
626
627
628
629
			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
630
		else
631
			CURRENT_UUID=$(nmcli -f UUID,TYPE connection show --active | grep wireless | awk '{print $1}')
632
			if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
633
634
				dialog --title "Error" --backtitle "$BACKTITLE" --no-collapse \
				--msgbox "\nHostapd service is running. Disable it and try again." 7 57
635
				exit
636
			elif [[ -n $CURRENT_UUID ]]; then
637
638
				dialog --title "Info" --backtitle "$BACKTITLE" --no-collapse \
				--yesno "\nAlready connected via wireless.\n\nDo you want to disconnect?" 9 57
639
				[[ $? = 0 ]] && nmcli connection down uuid $CURRENT_UUID
640
			else
641
642
			# disable AP mode on certain adapters
			wlan_exceptions "off"
643
644
			nmtui-connect
			fi
645
		fi
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
646
647
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
648
649
650

	# Send diagnostics
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
651
652
653
654
655
656
657
	"Diagnostics" )
		clear
		armbianmonitor -u
		echo ""
		read -n 1 -s -p "Press any key to continue"
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
658
659
660

	# Application installer
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
661
662
663
664
	"Softy" )
		softy
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
665
666
667

	# Switch to alternative kernels
	#
668
669
670
	"Switch" )
		aval_kernel
		exceptions "$INSTALL_KERNEL"
Igor Pecovnik's avatar
Igor Pecovnik committed
671
672
673
		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
674
675
676
		if [[ $? = 0 ]]; then
			# remove old
			dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nRemoving current kernel." 5 28
Igor Pecovnik's avatar
Igor Pecovnik committed
677
678
679
			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
680
681
682
683
684
685
			# 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
686
			# install new
Igor Pecovnik's avatar
Igor Pecovnik committed
687
688
689
690
691
			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
692
693
694
			reboot
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
695
696
697

	# Simple CLI monitoring
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
698
699
700
701
702
703
	"Monitor" )
		clear
		armbianmonitor -m | dialog --backtitle "$BACKTITLE" --title "Simple CLI monitoring $BOARD" --progressbox 15 64
	;;

	esac
Igor Pecovnik's avatar
Igor Pecovnik committed
704

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