debian-config 27.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
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
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
}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
187
#
Igor Pecovnik's avatar
Igor Pecovnik committed
188
#-----------------------------------------------------------------------------------------------------------------------------------------#
189

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

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

199

Igor Pecovnik's avatar
Igor Pecovnik committed
200
201
202
# Main loop
#
while true; do
203

Igor Pecovnik's avatar
Igor Pecovnik committed
204
205
206
	LIST=()
	#
	# here we add new items to menu. with condition when needed
Igor Pecovnik's avatar
Igor Pecovnik committed
207
	LIST+=( "Timezone" "Change your timezone" )
208
	[[ $(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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
	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" )
Igor Pecovnik's avatar
Igor Pecovnik committed
232
233
	[[ -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
234
235
236
237
238
239
240
241
242
243
	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
244
245
	[[ $(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" )
246
247
248
249
250
251
252
	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
253
254
255
	# count number of menu items to adjust window sizee
	LISTLENGHT="$((7+${#LIST[@]}/2))"
	BOXLENGHT=${#LIST[@]}
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
256

Igor Pecovnik's avatar
Igor Pecovnik committed
257
258
259
	# main dialog routine
	DIALOG_CANCEL=1
	DIALOG_ESC=255
260

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
261
	exec 3>&1
Igor Pecovnik's avatar
Igor Pecovnik committed
262
263
	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
264
265
266
267
268
	"${LIST[@]}" 2>&1 1>&3)
	exit_status=$?
	exec 3>&-
	case $exit_status in
	$DIALOG_CANCEL)
269
270
		#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
271
272
273
274
275
276
277
278
		exit
	;;
	$DIALOG_ESC)
		clear
		exit 1
		;;
	esac

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

Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
281
282
	case $selection in

Igor Pecovnik's avatar
Igor Pecovnik committed
283
284
285

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

Igor Pecovnik's avatar
Igor Pecovnik committed
325
326
327

	# Set the display resolution
	#
328
329
330
331
	"Display" )
		h3disp
		exit
	;;
332

Igor Pecovnik's avatar
Igor Pecovnik committed
333
334
	# Enable or disable desktop
	#
335
336
	"Desktop" )
		if [[ -f /usr/sbin/nodm && -n $(service nodm status | grep -w active | grep -w running) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
337
338
			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
339
340
341
			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
342
343
			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
344
345
346
347
348
			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
349
350
351

	# Control board consumption
	#
352
353
354
355
	"Consumption" )
		h3consumption
		exit
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
356
357
358
359


	# Board (fex) settings editor
	#
360
361
362
363
	"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
364
		dialog --title "Edit u-boot environment" \
Igor Pecovnik's avatar
Igor Pecovnik committed
365
		--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt  40 0 2> ${TEMP}/tempfex.out
366
		[[ $? = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
367
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
368
369
370
371


	# Toggle running services
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
372
373
374
375
	"Services" )
		rcconf
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
376
377
378
379
380
381
	# Change timezone
	#
	"Timezone" )
		dpkg-reconfigure tzdata
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
382
383
384

	# Stop low-level messages on console
	#
385
	"Lowlevel" )
Igor Pecovnik's avatar
Igor Pecovnik committed
386
387
		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
388
389
390
391
392
		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
393
394
	# Toggle virtual read-only root filesystem
	#
395
396
	"Overlayroot" )
		if [[ -n $(mount | grep -w overlay) ]]; then
Igor Pecovnik's avatar
Igor Pecovnik committed
397
398
399
400
			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 && \
401
			overlayroot-chroot rm /etc/update-motd.d/97-overlayroot && reboot
402
		else
403
			debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confnew" -y --no-install-recommends install overlayroot
404
			echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
405
406
			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
407
408
			dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
409
410
411
412
			[[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
413
414
	# Edit network settings
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
415
	"Network" )
416
		dialog --backtitle "$BACKTITLE" --title "Edit network configuration" --no-collapse \
Igor Pecovnik's avatar
Igor Pecovnik committed
417
		--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
418
		[[ $? = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && service network-manager restart
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
419
420
	;;

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

536
537
			255) exit;;
			esac
538
539
			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"
540
			service hostapd stop
541
542
543
544
			if [[ $? = 0 ]]; then
				mv $TEMP_CONF $NETWORK_CONF
				reboot
			fi
545
546
547
		fi
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
548
549
550

	# Edit boot environment
	#
Igor Pecovnik's avatar
Igor Pecovnik committed
551
	"Bootenv" )
552
		dialog --title "Edit u-boot environment" --ok-label "Save" \
Igor Pecovnik's avatar
Igor Pecovnik committed
553
		--no-collapse --editbox /boot/armbianEnv.txt 30 0 2> /boot/armbianEnv.txt.out
554
		[[ $? = 0 ]] && mv /boot/armbianEnv.txt.out /boot/armbianEnv.txt
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
555
556
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
557
558
559
560
561
562
563
564
565
	# 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
566
567
568

	# Switch to daily builds
	#
569
	"Nightly" )
Igor Pecovnik's avatar
Igor Pecovnik committed
570
571
572
		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
573
574
575
576
		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
577
578
			dialog --title "Switching to nightly" --backtitle "$BACKTITLE" --yes-label "Reboot" \
			--no-label "Cancel" --yesno "\nReboot to apply new settings?" 7 34
579
580
			if [[ $? = 0 ]]; then reboot; fi
		fi
581
	;;
582

Igor Pecovnik's avatar
Igor Pecovnik committed
583
584
585

	# Switch to stable builds
	#
586
	"Stable" )
Igor Pecovnik's avatar
Igor Pecovnik committed
587
588
589
590
591
592
593
594
595
596
597
		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
598
599
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
600
601
602

	# Freeze and unfreeze kernel and board support packages
	#
603
	"Hold" | "Unhold" )
Igor Pecovnik's avatar
Igor Pecovnik committed
604
605
		dialog --title "Update" --backtitle "$BACKTITLE" --yes-label "$selection" --no-label "Cancel" \
		--yesno "\nDo you want to ${selection,,} kernel updates?" 7 50
606
607
608
		if [[ $? = 0 ]]; then
		TARGET_BRANCH=$BRANCH
		exceptions "$BRANCH"
Igor Pecovnik's avatar
Igor Pecovnik committed
609
610
611
612
613
		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
614
615
		fi
	;;
616

Igor Pecovnik's avatar
Igor Pecovnik committed
617
618
619

	# Install to SATA, eMMC, NAND or USB
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
620
621
622
623
	"Install" )
		nand-sata-install
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
624
625
626

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

Igor Pecovnik's avatar
Igor Pecovnik committed
666
667
668

	# Send diagnostics
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
669
670
671
672
673
674
675
	"Diagnostics" )
		clear
		armbianmonitor -u
		echo ""
		read -n 1 -s -p "Press any key to continue"
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
676
677
678

	# Application installer
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
679
680
681
682
	"Softy" )
		softy
	;;

Igor Pecovnik's avatar
Igor Pecovnik committed
683
684
685

	# Switch to alternative kernels
	#
686
687
688
	"Switch" )
		aval_kernel
		exceptions "$INSTALL_KERNEL"
Igor Pecovnik's avatar
Igor Pecovnik committed
689
690
691
		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
692
693
694
		if [[ $? = 0 ]]; then
			# remove old
			dialog --backtitle "$BACKTITLE" --title "Please wait" --infobox "\nRemoving current kernel." 5 28
Igor Pecovnik's avatar
Igor Pecovnik committed
695
696
697
			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
698
699
700
701
702
703
			# 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
704
			# install new
Igor Pecovnik's avatar
Igor Pecovnik committed
705
706
707
708
709
			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
710
711
712
			reboot
		fi
	;;
Igor Pecovnik's avatar
Igor Pecovnik committed
713
714
715

	# Simple CLI monitoring
	#
Igor Pecovnik's avatar
RFC #2    
Igor Pecovnik committed
716
717
718
719
720
721
	"Monitor" )
		clear
		armbianmonitor -m | dialog --backtitle "$BACKTITLE" --title "Simple CLI monitoring $BOARD" --progressbox 15 64
	;;

	esac
Igor Pecovnik's avatar
Igor Pecovnik committed
722

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