1759 lines
65 KiB
Plaintext
1759 lines
65 KiB
Plaintext
|
|
#!/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.
|
||
|
|
|
||
|
|
[[ -n ${SUDO_USER} ]] && SUDO="sudo "
|
||
|
|
|
||
|
|
function jobs ()
|
||
|
|
{
|
||
|
|
# Shows box with loading ...
|
||
|
|
#
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nLoading ${selection,,} submodule ... " 5 $((26+${#selection}))
|
||
|
|
|
||
|
|
unset selection
|
||
|
|
|
||
|
|
case $1 in
|
||
|
|
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
|
||
|
|
|
||
|
|
# Application installer
|
||
|
|
#
|
||
|
|
"Softy" )
|
||
|
|
[[ -f softy ]] && ./softy || softy
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Remove BT
|
||
|
|
#
|
||
|
|
"BT remove" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y remove bluetooth bluez bluez-tools
|
||
|
|
check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y remove pulseaudio-module-bluetooth blueman
|
||
|
|
debconf-apt-progress -- apt -y -qq autoremove
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Enabling BT
|
||
|
|
#
|
||
|
|
"BT install" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y install bluetooth bluez bluez-tools
|
||
|
|
check_if_installed xserver-xorg && debconf-apt-progress -- apt-get -y --no-install-recommends install pulseaudio-module-bluetooth blueman
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Removing IR
|
||
|
|
#
|
||
|
|
"Remove IR" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y remove lirc
|
||
|
|
debconf-apt-progress -- apt -y -qq autoremove
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Enabling IR
|
||
|
|
#
|
||
|
|
"IR" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y --no-install-recommends install lirc
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Sharing USB ports
|
||
|
|
#
|
||
|
|
"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}
|
||
|
|
if (( "${array[0]}" == "4" )) && (( "${array[1]}" >= "1" )); then
|
||
|
|
rm -rf /usr/src/usb-redirector-linux-arm-gnueabi
|
||
|
|
wget -qO- https://www.incentivespro.com/usb-redirector-linux-arm-gnueabi.tar.gz | tar xz -C /usr/src
|
||
|
|
cd /usr/src/usb-redirector-linux-arm-gnueabi/
|
||
|
|
else
|
||
|
|
rm -rf /usr/src/usb-redirector-linux-arm-eabi
|
||
|
|
wget -qO- https://raw.githubusercontent.com/armbian/build/master/packages/blobs/usb-redirector/usb-redirector-old.tgz \
|
||
|
|
| tar xz -C /usr/src
|
||
|
|
cd /usr/src/usb-redirector-linux-arm-eabi/
|
||
|
|
fi
|
||
|
|
./installer.sh install
|
||
|
|
sleep 3
|
||
|
|
check_port "32032" "USB Redirector"
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Simple CLI monitoring
|
||
|
|
#
|
||
|
|
"Monitor" )
|
||
|
|
clear
|
||
|
|
orangepimonitor -m
|
||
|
|
sleep 2
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# SBC-becn
|
||
|
|
#
|
||
|
|
"Benchmarking" )
|
||
|
|
if [[ ! -f /usr/local/bin/sbc-bench ]]; then
|
||
|
|
wget -q -O /usr/local/bin/sbc-bench https://gitee.com/leeboby/sbc-bench/raw/master/sbc-bench.sh
|
||
|
|
|
||
|
|
if [[ -z "$(command -v git)" ]]; then
|
||
|
|
sudo apt-get update
|
||
|
|
sudo apt-get install -y git
|
||
|
|
fi
|
||
|
|
|
||
|
|
chmod +x /usr/local/bin/sbc-bench
|
||
|
|
fi
|
||
|
|
sbc-bench
|
||
|
|
echo ""
|
||
|
|
read -n 1 -s -p "Press any key to continue"
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Send diagnostics
|
||
|
|
#
|
||
|
|
"Diagnostics" )
|
||
|
|
clear
|
||
|
|
orangepimonitor -u
|
||
|
|
echo ""
|
||
|
|
read -n 1 -s -p "Press any key to continue"
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Control board consumption
|
||
|
|
#
|
||
|
|
"Consumption" )
|
||
|
|
clear
|
||
|
|
h3consumption
|
||
|
|
echo -e "\nType \e[92m${SUDO}${0##*/}\e[0m to get back\n"
|
||
|
|
exit
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Board (fex) settings editor
|
||
|
|
#
|
||
|
|
"Fexedit" )
|
||
|
|
exec 3>&1
|
||
|
|
monitor=$(dialog --print-maxsize 2>&1 1>&3)
|
||
|
|
exec 3>&-
|
||
|
|
mon_x=$(echo $monitor | awk '{print $2}' | sed 's/,//')
|
||
|
|
mon_y=$(echo $monitor | awk '{print $3}' | sed 's/,//')
|
||
|
|
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
|
||
|
|
dialog --title "Edit u-boot environment" \
|
||
|
|
--ok-label "Save" --no-collapse --editbox ${TEMP}/tempfex.txt $mon_y 0 2> ${TEMP}/tempfex.out
|
||
|
|
[[ $? = 0 ]] && fex2bin ${TEMP}/tempfex.out /boot/script.bin
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#
|
||
|
|
# Install kernel headers
|
||
|
|
#
|
||
|
|
"Headers_install" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if [[ -f /etc/orangepi-release ]]; then
|
||
|
|
INSTALL_PKG="linux-headers-${BRANCH}-${LINUXFAMILY}";
|
||
|
|
else
|
||
|
|
INSTALL_PKG="linux-headers-$(uname -r | sed 's/'-$(dpkg --print-architecture)'//')";
|
||
|
|
fi
|
||
|
|
debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
#
|
||
|
|
# Remove kernel headers
|
||
|
|
#
|
||
|
|
"Headers_remove" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
REMOVE_PKG="linux-headers-*"
|
||
|
|
if [[ -n $(dpkg -l | grep linux-headers) ]]; then
|
||
|
|
debconf-apt-progress -- apt-get -y purge ${REMOVE_PKG}
|
||
|
|
rm -rf /usr/src/linux-headers*
|
||
|
|
else
|
||
|
|
debconf-apt-progress -- apt-get -y install ${INSTALL_PKG}
|
||
|
|
fi
|
||
|
|
# cleanup
|
||
|
|
apt clean
|
||
|
|
debconf-apt-progress -- apt -y autoremove
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
#
|
||
|
|
# Install kernel source
|
||
|
|
#
|
||
|
|
"Source_install" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
LIST=()
|
||
|
|
for pkg in $SOURCE_PKG_LIST
|
||
|
|
do
|
||
|
|
LIST+=( "$pkg" "" )
|
||
|
|
done
|
||
|
|
|
||
|
|
exec 3>&1
|
||
|
|
selection=$(dialog --backtitle "$BACKTITLE" --title "Kernel install" --clear --cancel-label "Back" \
|
||
|
|
--menu "Choose kernel version" 12 70 ${#LIST[@]} "${LIST[@]}" 2>&1 1>&3)
|
||
|
|
exit_status=$?
|
||
|
|
exec 3>&-
|
||
|
|
[[ $exit_status == 1 || $exit_status == 255 ]] && clear
|
||
|
|
else
|
||
|
|
selection=$(echo $SOURCE_PKG_LIST | awk '{ print $NF }')
|
||
|
|
fi
|
||
|
|
|
||
|
|
PACKAGE=$(echo "$selection" | sed "s/-current//" | sed "s/-dev//" | sed "s/-legacy//")
|
||
|
|
if [[ -n $PACKAGE ]]; then
|
||
|
|
debconf-apt-progress -- apt-get -y install ${selection}
|
||
|
|
mkdir -p /usr/src/$PACKAGE
|
||
|
|
(pv -n /usr/src/$PACKAGE".tar.xz" | xz -d -T0 - | tar xf - -C /usr/src/$PACKAGE ) 2>&1 | dialog --colors --backtitle "$BACKTITLE" --title " Please wait! " --gauge "\nDecompressing kernel sources to /usr/src/$PACKAGE" 8 80
|
||
|
|
xz -d /usr/src/*config.xz --stdout > /usr/src/$PACKAGE/.config
|
||
|
|
rm /usr/src/$PACKAGE".tar.xz" /usr/src/*config.xz
|
||
|
|
apt clean
|
||
|
|
debconf-apt-progress -- apt-get -y purge linux-source*
|
||
|
|
debconf-apt-progress -- apt -y autoremove
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
dialog --colors --backtitle "$BACKTITLE" --no-collapse --title " Kernel source " --clear --msgbox "\nYou will find pre-configured kernel sources in /usr/src/$PACKAGE" 7 72
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nLoading software submodule ... " 5 34
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#
|
||
|
|
# Remove kernel source
|
||
|
|
#
|
||
|
|
"Source_remove" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
LIST=()
|
||
|
|
for pkg in $SOURCE_PKG_LIST_INSTALLED
|
||
|
|
do
|
||
|
|
LIST+=( "$pkg" "" )
|
||
|
|
done
|
||
|
|
|
||
|
|
exec 3>&1
|
||
|
|
selection=$(dialog --backtitle "$BACKTITLE" --title "Kernel remove" --clear --cancel-label "Back" \
|
||
|
|
--menu "Choose kernel version" 12 70 ${#LIST[@]} "${LIST[@]}" 2>&1 1>&3)
|
||
|
|
exit_status=$?
|
||
|
|
exec 3>&-
|
||
|
|
[[ $exit_status == 1 || $exit_status == 255 ]] && clear
|
||
|
|
else
|
||
|
|
selection=$(echo $SOURCE_PKG_LIST_INSTALLED | awk '{ print $NF }')
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ -n $selection ]]; then
|
||
|
|
PACKAGE="linux-source-$(echo $selection | sed 's/[-|(|[:alpha:]|(|[:space:]|(|/]//g')-${BRANCH}-${LINUXFAMILY}"
|
||
|
|
if ls $selection 1> /dev/null 2>&1; then
|
||
|
|
debconf-apt-progress -- apt-get -y purge $PACKAGE
|
||
|
|
debconf-apt-progress -- apt -y autoremove
|
||
|
|
apt clean
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nRemoving $selection ... " 5 72
|
||
|
|
rm -r $selection
|
||
|
|
fi
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
dialog --colors --backtitle "$BACKTITLE" --no-collapse --title " Kernel source " --clear --msgbox "\n$selection removed" 7 72
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nLoading software submodule ... " 5 34
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# Toggle mini and full firmware
|
||
|
|
#
|
||
|
|
"Full"|"Mini" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y purge orangepi-firmware* # workaround since pkg replace doesn't work properly
|
||
|
|
debconf-apt-progress -- apt-get -y install orangepi-firmware$(echo -"${1,,}" | sed 's/-mini//')
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Set the display resolution
|
||
|
|
#
|
||
|
|
"Display" )
|
||
|
|
# show display modes menu
|
||
|
|
if [[ -f /usr/bin/h3disp ]]; then
|
||
|
|
# h3 boards
|
||
|
|
get_h3modes
|
||
|
|
dialog --title " Display output type " --colors --help-button --help-label "Cancel" --no-label "DVI" --yes-label "HDMI" \
|
||
|
|
--backtitle "$BACKTITLE" --yesno "\nIn case you use an HDMI-to-DVI converter choose DVI!" 7 57
|
||
|
|
output_type=$?
|
||
|
|
if [[ $output_type = 0 || $output_type = 1 ]]; then
|
||
|
|
if [[ $output_type = 0 ]]; then
|
||
|
|
display_cmd="h3disp -m $SCREEN_RESOLUTION";
|
||
|
|
else
|
||
|
|
display_cmd="h3disp -m $SCREEN_RESOLUTION -d";
|
||
|
|
fi
|
||
|
|
|
||
|
|
|
||
|
|
fi
|
||
|
|
elif [[ "$LINUXFAMILY" = odroidc* || "$LINUXFAMILY" = odroidn2 ]]; then
|
||
|
|
get_odroidmodes
|
||
|
|
display_cmd="sed -i \"s/^setenv m .*/# &/\" /boot/boot.ini;sed -i '/setenv m \"$SCREEN_RESOLUTION\"/s/^# //g' /boot/boot.ini";
|
||
|
|
# odroid n2
|
||
|
|
display_cmd='sed -i "s/^setenv hdmimode .*/setenv hdmimode \"$SCREEN_RESOLUTION\"/" /boot/boot.ini; sed -i "s/^setenv display_autodetect .*/setenv display_autodetect \"false\"/" /boot/boot.ini';
|
||
|
|
else
|
||
|
|
# a20 boards
|
||
|
|
get_a20modes
|
||
|
|
display_cmd="sed -i \"s/^disp_mode=.*/disp_mode=$SCREEN_RESOLUTION/\" /boot/orangepiEnv.txt";
|
||
|
|
fi
|
||
|
|
|
||
|
|
dialog --title " Display resolution " --colors --no-label "Cancel" --backtitle "$BACKTITLE" --yesno \
|
||
|
|
"\nSwitching to \Z1$SCREEN_RESOLUTION\Z0 and reboot?" 7 42
|
||
|
|
if [[ $? = 0 ]]; then
|
||
|
|
eval $display_cmd > /dev/null
|
||
|
|
reboot
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# Select dynamic or edit static IP address
|
||
|
|
#
|
||
|
|
"IP" )
|
||
|
|
select_interface
|
||
|
|
# check if we have systemd networking in action
|
||
|
|
SYSTEMDNET=$(service systemd-networkd status | grep -w active | grep -w running)
|
||
|
|
dialog --title " IP address assignment " --colors --backtitle "$BACKTITLE" --help-button --help-label "Cancel" \
|
||
|
|
--yes-label "DHCP" --no-label "Static" --yesno \
|
||
|
|
"\n\Z1DHCP:\Z0 automatic IP assignment by your router or DHCP server\n\n\Z1Static:\Z0 manually fixed IP address" 9 70
|
||
|
|
exitstatus=$?;
|
||
|
|
|
||
|
|
# dynamic
|
||
|
|
if [[ $exitstatus = 0 ]]; then
|
||
|
|
if [[ -n $SYSTEMDNET ]]; then
|
||
|
|
filename="/etc/systemd/network/10-${SELECTED_ADAPTER}.network"
|
||
|
|
if [[ -f $filename ]]; then
|
||
|
|
sed -i '/Network/,$d' $filename
|
||
|
|
echo -e "[Network]" >>$filename
|
||
|
|
echo -e "DHCP=ipv4" >>$filename
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
if [[ -n $(LC_ALL=C nmcli device status | grep $SELECTED_ADAPTER ) ]]; then
|
||
|
|
nmcli connection delete uuid $(LC_ALL=C nmcli -f UUID,DEVICE connection show | grep $SELECTED_ADAPTER | awk '{print $1}') >/dev/null 2>&1
|
||
|
|
nmcli con add con-name "Orange Pi ethernet" type ethernet ifname $SELECTED_ADAPTER >/dev/null 2>&1
|
||
|
|
nmcli con up "Orange Pi ethernet" >/dev/null 2>&1
|
||
|
|
else
|
||
|
|
create_if_config "$SELECTED_ADAPTER" "$SELECTED_ADAPTER" "dynamic" > /etc/network/interfaces
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# static
|
||
|
|
if [[ $exitstatus = 1 ]]; then
|
||
|
|
create_if_config "$SELECTED_ADAPTER" "$SELECTED_ADAPTER" "fixed" > /dev/null
|
||
|
|
if [[ -n $SYSTEMDNET ]]; then
|
||
|
|
systemd_ip_editor "${SELECTED_ADAPTER}"
|
||
|
|
else
|
||
|
|
if [[ -n $(LC_ALL=C nmcli device status | grep $SELECTED_ADAPTER ) ]]; then
|
||
|
|
nm_ip_editor "$SELECTED_ADAPTER"
|
||
|
|
else
|
||
|
|
ip_editor "$SELECTED_ADAPTER" "$SELECTED_ADAPTER" "/etc/network/interfaces"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Start network performance daemon
|
||
|
|
#
|
||
|
|
"Iperf3" )
|
||
|
|
#
|
||
|
|
if pgrep -x "iperf3" > /dev/null
|
||
|
|
then
|
||
|
|
pkill iperf3
|
||
|
|
else
|
||
|
|
iperf3 -s -D
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Toggle IPv6
|
||
|
|
#
|
||
|
|
"IPV6" )
|
||
|
|
#
|
||
|
|
sed -i --follow-symlinks '/^net.ipv6.conf*/d' /etc/sysctl.d/99-sysctl.conf
|
||
|
|
if [ -f "/etc/apt/apt.conf.d/99force-ipv4" ]; then
|
||
|
|
rm /etc/apt/apt.conf.d/99force-ipv4
|
||
|
|
echo 'net.ipv6.conf.all.disable_ipv6 = 0' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
echo 'net.ipv6.conf.default.disable_ipv6 = 0' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
echo 'net.ipv6.conf.lo.disable_ipv6 = 0' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
else
|
||
|
|
echo 'Acquire::ForceIPv4 "true";' > /etc/apt/apt.conf.d/99force-ipv4
|
||
|
|
echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
echo 'net.ipv6.conf.lo.disable_ipv6 = 1' >> /etc/sysctl.d/99-sysctl.conf
|
||
|
|
fi
|
||
|
|
sysctl -p > /dev/null
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Connect to wireless access point
|
||
|
|
#
|
||
|
|
"WiFi" )
|
||
|
|
# disable AP mode on certain adapters
|
||
|
|
wlan_exceptions "off"
|
||
|
|
[[ "$reboot_module" == true ]] && dialog --backtitle "$BACKTITLE" --title " Warning " --msgbox "\nReboot is required for this adapter to switch to STA mode" 7 62 && reboot
|
||
|
|
nmtui-connect
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Connect to 3G/4G network
|
||
|
|
#
|
||
|
|
"LTE" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if [[ $LTE_MODEM == *online* ]]; then
|
||
|
|
dialog --title " LTE modem is connected " --colors --backtitle "$BACKTITLE" --yes-label "Back" --no-label "Disconnect" --yesno "\n\Z1Disconnect:\Z0 kill mobile connection\n\n" 7 42
|
||
|
|
[[ $? = 1 ]] && lte "$LTE_MODEM_ID" "off"
|
||
|
|
else
|
||
|
|
dialog --title " LTE modem is disconnected " --colors --backtitle "$BACKTITLE" --yes-label "Back" --no-label "Connect" --yesno "\n\Z1Connect:\Z0 dial mobile connection\n\n" 7 42
|
||
|
|
[[ $? = 1 ]] && lte "$LTE_MODEM_ID" "on"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Connect to wireless access point
|
||
|
|
#
|
||
|
|
"Clear" )
|
||
|
|
# remove managed interfaces
|
||
|
|
systemctl daemon-reload
|
||
|
|
nmcli con delete $(nmcli --fields NAME,UUID,TYPE con | grep wifi | awk '{print $2}')
|
||
|
|
sed 's/interface-name:wl.*//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
sed 's/,$//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
rm -f /etc/network/interfaces.d/orangepi.ap.*
|
||
|
|
rm -f /etc/dnsmasq.conf
|
||
|
|
systemctl stop dnsmasq
|
||
|
|
systemctl disable dnsmasq
|
||
|
|
iptables -t nat -D POSTROUTING 1 >/dev/null 2>&1
|
||
|
|
systemctl stop orangepi-restore-iptables.service
|
||
|
|
systemctl disable orangepi-restore-iptables.service
|
||
|
|
rm -f /etc/iptables.ipv4.nat
|
||
|
|
rm -f /var/run/hostapd/* >/dev/null 2>&1
|
||
|
|
reload-nety
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Create WiFi access point
|
||
|
|
#
|
||
|
|
"Hotspot" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
systemctl daemon-reload
|
||
|
|
CURRENT_UUID=$(LC_ALL=C nmcli -f DEVICE,TYPE,STATE device status | grep -w " wifi " | grep -w " disconnected")
|
||
|
|
if [[ -n $(service hostapd status | grep -w active | grep -w running) ]]; then
|
||
|
|
if [[ -n $HOSTAPDBRIDGE ]]; then
|
||
|
|
dialog --title " Hostapd service is running " --colors --backtitle "$BACKTITLE" --help-button \
|
||
|
|
--help-label "Cancel" --yes-label "Stop and reboot" --no-label "Edit" --yesno \
|
||
|
|
"\n\Z1Stop:\Z0 stop and reboot\n\n\Z1Edit:\Z0 change basic parameters: SSID, password and channel" 9 70
|
||
|
|
|
||
|
|
else
|
||
|
|
dialog --title " Hostapd service is running " --colors --backtitle "$BACKTITLE" --help-button \
|
||
|
|
--help-label "Cancel" --yes-label "Stop" --no-label "Edit" --yesno \
|
||
|
|
"\n\Z1Stop:\Z0 stop providing Access Point\n\n\Z1Edit:\Z0 change basic parameters: SSID, password and channel" 9 70
|
||
|
|
fi
|
||
|
|
exitstatus=$?;
|
||
|
|
if [[ $exitstatus = 0 ]]; then
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nDisabling hotspot. Please wait!" 5 35
|
||
|
|
sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=/" /etc/init.d/hostapd
|
||
|
|
# disable DNS
|
||
|
|
systemctl daemon-reload
|
||
|
|
systemctl disable dnsmasq.service >/dev/null 2>&1
|
||
|
|
|
||
|
|
ifdown $WIRELESS_ADAPTER 2> /dev/null
|
||
|
|
rm -f /etc/network/interfaces.d/orangepi.ap.*
|
||
|
|
rm -f /etc/dnsmasq.conf
|
||
|
|
iptables -t nat -D POSTROUTING 1 >/dev/null 2>&1
|
||
|
|
rm -f /etc/iptables.ipv4.nat
|
||
|
|
systemctl stop orangepi-restore-iptables.service
|
||
|
|
systemctl disable orangepi-restore-iptables.service
|
||
|
|
rm -f /var/run/hostapd/* >/dev/null 2>&1
|
||
|
|
sed -i '/^iptables/ d' /etc/rc.local
|
||
|
|
sed -i '/^service dnsmasq/ d' /etc/rc.local
|
||
|
|
sed 's/interface-name:wl.*//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
sed 's/,$//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
iptables -F
|
||
|
|
# reload services
|
||
|
|
reload-nety
|
||
|
|
[[ -n $HOSTAPDBRIDGE ]] && reboot
|
||
|
|
fi
|
||
|
|
if [[ $exitstatus = 1 ]]; then wlan_edit; reload-nety "reload"; fi
|
||
|
|
elif [[ -z $CURRENT_UUID ]]; then
|
||
|
|
dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --msgbox "\nAll wireless connections are in use." 7 40
|
||
|
|
else
|
||
|
|
# check for low quality drivers and combinations
|
||
|
|
check_and_warn
|
||
|
|
|
||
|
|
# remove interfaces from managed list
|
||
|
|
if [[ -f /etc/NetworkManager/conf.d/10-ignore-interfaces.conf ]]; then
|
||
|
|
sed 's/interface-name:wl.*//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
sed 's/,$//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
fi
|
||
|
|
|
||
|
|
# clear current settings
|
||
|
|
rm -f /etc/network/interfaces.d/orangepi.ap.nat
|
||
|
|
rm -f /etc/network/interfaces.d/orangepi.ap.bridge
|
||
|
|
service networking restart
|
||
|
|
service network-manager restart >/dev/null 2>&1
|
||
|
|
service NetworkManager restart >/dev/null 2>&1
|
||
|
|
{ for ((i = 0 ; i <= 100 ; i+=20)); do sleep 1; echo $i; done } | dialog --title " Initializing wireless adapters " --colors --gauge "" 5 50 0
|
||
|
|
|
||
|
|
# start with basic config
|
||
|
|
if grep -q "^## IEEE 802.11ac" /etc/hostapd.conf; then sed '/## IEEE 802.11ac\>/,/^## IEEE 802.11ac\>/ s/.*/#&/' -i /etc/hostapd.conf; fi
|
||
|
|
if grep -q "^## IEEE 802.11a" /etc/hostapd.conf; then sed '/## IEEE 802.11a\>/,/^## IEEE 802.11a\>/ s/.*/#&/' -i /etc/hostapd.conf; fi
|
||
|
|
if grep -q "^## IEEE 802.11n" /etc/hostapd.conf; then sed '/## IEEE 802.11n/,/^## IEEE 802.11n/ s/.*/#&/' -i /etc/hostapd.conf; fi
|
||
|
|
sed -i "s/^channel=.*/channel=5/" /etc/hostapd.conf
|
||
|
|
|
||
|
|
service network-manager reload >/dev/null 2>&1
|
||
|
|
service NetworkManager reload >/dev/null 2>&1
|
||
|
|
# change special adapters to AP mode
|
||
|
|
wlan_exceptions "on"
|
||
|
|
# check for WLAN interfaces
|
||
|
|
get_wlan_interface
|
||
|
|
# add interface to unmanaged list
|
||
|
|
if [[ -f /etc/NetworkManager/conf.d/10-ignore-interfaces.conf ]]; then
|
||
|
|
[[ -z $(grep -w unmanaged-devices= /etc/NetworkManager/conf.d/10-ignore-interfaces.conf) ]] && sed '$ s/$/,/' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
sed '$ s/$/'"interface-name:$WIRELESS_ADAPTER"'/' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
else
|
||
|
|
echo "[keyfile]" > /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
echo "unmanaged-devices=interface-name:$WIRELESS_ADAPTER" >> /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
fi
|
||
|
|
service network-manager reload >/dev/null 2>&1
|
||
|
|
service NetworkManager reload >/dev/null 2>&1
|
||
|
|
# display dialog
|
||
|
|
dialog --colors --backtitle "$BACKTITLE" --title "Please wait" --infobox \
|
||
|
|
"\nWireless adapter: \Z1${WIRELESS_ADAPTER}\Z0\n\nProbing nl80211 hostapd driver compatibility." 7 50
|
||
|
|
#debconf-apt-progress -- apt-get --reinstall -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd
|
||
|
|
# change to selected interface
|
||
|
|
sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
|
||
|
|
# add hostapd.conf to services
|
||
|
|
sed -i "s/^DAEMON_CONF=.*/DAEMON_CONF=\/etc\/hostapd.conf/" /etc/init.d/hostapd
|
||
|
|
# check both options
|
||
|
|
# add allow cli access if not exists. temporally
|
||
|
|
if ! grep -q "ctrl_interface" /etc/hostapd.conf; then
|
||
|
|
echo "" >> /etc/hostapd.conf
|
||
|
|
echo "ctrl_interface=/var/run/hostapd" >> /etc/hostapd.conf
|
||
|
|
echo "ctrl_interface_group=0" >> /etc/hostapd.conf
|
||
|
|
fi
|
||
|
|
#
|
||
|
|
check_advanced_modes
|
||
|
|
#
|
||
|
|
if [[ -n "$hostapd_error" ]]; then
|
||
|
|
dialog --colors --backtitle "$BACKTITLE" --title "Please wait" --infobox \
|
||
|
|
"\nWireless adapter: \Z1${WIRELESS_ADAPTER}\Z0\n\nProbing Realtek hostapd driver compatibility." 7 50
|
||
|
|
debconf-apt-progress -- apt-get --reinstall -o Dpkg::Options::="--force-confnew" -y -qq --no-install-recommends install hostapd-realtek
|
||
|
|
# change to selected interface
|
||
|
|
sed -i "s/^interface=.*/interface=$WIRELESS_ADAPTER/" /etc/hostapd.conf
|
||
|
|
# add allow cli access if not exists. temporally
|
||
|
|
if ! grep -q "ctrl_interface" /etc/hostapd.conf; then
|
||
|
|
echo "ctrl_interface=/var/run/hostapd" >> /etc/hostapd.conf
|
||
|
|
echo "ctrl_interface_group=0" >> /etc/hostapd.conf
|
||
|
|
fi
|
||
|
|
#
|
||
|
|
check_advanced_modes
|
||
|
|
#
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ -n "$hostapd_error" ]]; 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
|
||
|
|
# remove interfaces from managed list
|
||
|
|
sed 's/interface-name:wl.*//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
sed 's/,$//' -i /etc/NetworkManager/conf.d/10-ignore-interfaces.conf
|
||
|
|
systemctl daemon-reload;service hostapd restart
|
||
|
|
fi
|
||
|
|
|
||
|
|
# let's remove bridge out for this simple configurator
|
||
|
|
#
|
||
|
|
# dialog --title " Choose Access Point mode for $WIRELESS_ADAPTER " --colors --backtitle "$BACKTITLE" --no-label "Bridge" \
|
||
|
|
# --yes-label "NAT" --yesno "\n\Z1NAT:\Z0 with own DHCP server, out of your primary network\n\
|
||
|
|
# \n\Z1Bridge:\Z0 wireless clients will use your routers DHCP server" 9 70
|
||
|
|
# response=$?
|
||
|
|
#
|
||
|
|
# let's remove bridge out for this simple configurator
|
||
|
|
|
||
|
|
response=0
|
||
|
|
|
||
|
|
# create interfaces file if not exits
|
||
|
|
[[ ! -f /etc/network/interfaces ]] && echo "source /etc/network/interfaces.d/*" > /etc/network/interfaces
|
||
|
|
|
||
|
|
# select default interfaces if there is more than one
|
||
|
|
select_default_interface
|
||
|
|
|
||
|
|
NETWORK_CONF="/etc/network/interfaces"
|
||
|
|
|
||
|
|
case $response in
|
||
|
|
# bridge
|
||
|
|
1)
|
||
|
|
TEMP_CONF="/etc/network/interfaces.d/orangepi.ap.bridge"
|
||
|
|
|
||
|
|
sed -i 's/.bridge=.*/bridge=br0/' /etc/hostapd.conf
|
||
|
|
if [[ $DEFAULT_ADAPTER == "br0" ]]; then NEW_DEFAULT_ADAPTER="eth0"; else NEW_DEFAULT_ADAPTER="$DEFAULT_ADAPTER"; fi
|
||
|
|
echo -e "#bridged wireless for hostapd by orangepi-config\n" > $TEMP_CONF
|
||
|
|
echo -e "auto lo br0\niface lo inet loopback" >> $TEMP_CONF
|
||
|
|
echo -e "\nauto $NEW_DEFAULT_ADAPTER\nallow-hotplug $NEW_DEFAULT_ADAPTER\niface $NEW_DEFAULT_ADAPTER inet manual" >> $TEMP_CONF
|
||
|
|
echo -e "\nauto $WIRELESS_ADAPTER\nallow-hotplug $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER inet manual\n" >> $TEMP_CONF
|
||
|
|
create_if_config "$DEFAULT_ADAPTER" "br0" >> $TEMP_CONF
|
||
|
|
echo -e "\nbridge_ports $NEW_DEFAULT_ADAPTER $WIRELESS_ADAPTER" >> $TEMP_CONF
|
||
|
|
|
||
|
|
;;
|
||
|
|
# NAT
|
||
|
|
0)
|
||
|
|
TEMP_CONF="/etc/network/interfaces.d/orangepi.ap.nat"
|
||
|
|
|
||
|
|
# install dnsmas and iptables
|
||
|
|
if [[ $(dpkg-query -W -f='${db:Status-Abbrev}\n' dnsmasq 2>/dev/null) != "*ii*" ]]; then
|
||
|
|
debconf-apt-progress -- apt-get -qq -y --no-install-recommends install dnsmasq;
|
||
|
|
systemctl enable dnsmasq
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo -e "# orangepi NAT hostapd\nallow-hotplug $WIRELESS_ADAPTER\niface $WIRELESS_ADAPTER inet static " > $TEMP_CONF
|
||
|
|
echo -e "\taddress 172.24.1.1\n\tnetmask 255.255.255.0\n\tnetwork 172.24.1.0\n\tbroadcast 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
|
||
|
|
# Clear iptables
|
||
|
|
iptables-save | awk '/^[*]/ { print $1 } /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; } /COMMIT/ { print $0; }' | iptables-restore
|
||
|
|
if [[ ${DISTRIBUTION_CODENAME} == buster ]]; then
|
||
|
|
echo 1 | update-alternatives --config iptables > /dev/null
|
||
|
|
fi
|
||
|
|
# - 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
|
||
|
|
sed -i 's/^bridge=.*/#&/' /etc/hostapd.conf
|
||
|
|
#sed -e 's/exit 0//g' -i /etc/rc.local
|
||
|
|
# workaround if hostapd is too slow
|
||
|
|
#echo "service dnsmasq start" >> /etc/rc.local
|
||
|
|
#echo "iptables-restore < /etc/iptables.ipv4.nat" >> /etc/rc.local
|
||
|
|
#echo "exit 0" >> /etc/rc.local
|
||
|
|
systemctl stop orangepi-restore-iptables.service
|
||
|
|
systemctl disable orangepi-restore-iptables.service
|
||
|
|
cat <<-EOF > /etc/systemd/system/orangepi-restore-iptables.service
|
||
|
|
[Unit]
|
||
|
|
Description="Restore IP tables"
|
||
|
|
[Timer]
|
||
|
|
OnBootSec=20Sec
|
||
|
|
[Service]
|
||
|
|
Type=oneshot
|
||
|
|
ExecStart=/sbin/iptables-restore /etc/iptables.ipv4.nat
|
||
|
|
[Install]
|
||
|
|
WantedBy=sysinit.target
|
||
|
|
EOF
|
||
|
|
systemctl enable orangepi-restore-iptables.service
|
||
|
|
;;
|
||
|
|
3)exit;;
|
||
|
|
|
||
|
|
255) exit;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Please wait " --infobox "\nEnabling hotspot. Please wait!" 5 34
|
||
|
|
|
||
|
|
#
|
||
|
|
# only for bridged connection we need to check and reboot. tdlr check if it can be done on the fly
|
||
|
|
HOSTAPDBRIDGE=$(cat /etc/hostapd.conf 2> /dev/null | grep -w "^bridge=br0")
|
||
|
|
if [[ -n $HOSTAPDBRIDGE ]]; then
|
||
|
|
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=$?
|
||
|
|
if [[ $response = 0 ]]; then
|
||
|
|
mv $TEMP_CONF".tmp" $TEMP_CONF
|
||
|
|
#reboot
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
ifdown $WIRELESS_ADAPTER 2> /dev/null
|
||
|
|
sleep 2
|
||
|
|
ifup $WIRELESS_ADAPTER 2> /dev/null
|
||
|
|
echo "nameserver 8.8.8.8" > /etc/resolvconf/resolv.conf.d/base
|
||
|
|
[[ "$reboot_module" == true ]] && dialog --backtitle "$BACKTITLE" --title " Warning " --msgbox "\nReboot is required for this adapter to switch to AP mode" 7 61 && reboot
|
||
|
|
# reload services
|
||
|
|
reload-nety "reload"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Manage Softether VPN
|
||
|
|
#
|
||
|
|
"VPN" )
|
||
|
|
VPNDIR="/usr/local/vpnclient/"
|
||
|
|
|
||
|
|
function vpn_reconfigure ()
|
||
|
|
{
|
||
|
|
if [[ -f /etc/server.vpn ]]; then
|
||
|
|
${VPNDIR}vpnclient stop >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpnclient start >/dev/null 2>&1
|
||
|
|
# purge old settings
|
||
|
|
${VPNDIR}vpncmd /client localhost /cmd accountlist | grep "VPN Connection Setting Name" | cut -d "|" -f 2 | sed 's/^/"/;s/$/"/' | xargs /usr/local/vpnclient/vpncmd /client localhost /cmd accountdisconnect >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpncmd /client localhost /cmd accountlist | grep "VPN Connection Setting Name" | cut -d "|" -f 2 | sed 's/^/"/;s/$/"/' | xargs /usr/local/vpnclient/vpncmd /client localhost /cmd accountdelete >/dev/null 2>&1
|
||
|
|
# import new
|
||
|
|
${VPNDIR}vpncmd /client localhost /cmd accountimport //etc//server.vpn >/dev/null 2>&1
|
||
|
|
# reload to connect
|
||
|
|
${VPNDIR}vpnclient stop >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpnclient start >/dev/null 2>&1
|
||
|
|
[[ $? = 0 ]] && dialog --backtitle "$BACKTITLE" --title " VPN " --msgbox "\nConfiguration was successfully imported!" 7 43
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
function get_numbers {
|
||
|
|
EXCLUDE=$(ip neigh | grep vpn_se | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.' | head -1)
|
||
|
|
ADAPTER=$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | grep -v vpn_se | head -1)
|
||
|
|
IP=$(ip route | grep $ADAPTER | grep default | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1)
|
||
|
|
VPNSERVERIP=$(${VPNDIR}vpncmd /client localhost /cmd accountlist | grep "VPN Server" |grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1)
|
||
|
|
SUBNET=$(ifconfig vpn_se | grep 'inet addr:' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')
|
||
|
|
GW=$(ip neigh | grep vpn_se | grep $SUBNET | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' | head -1)
|
||
|
|
}
|
||
|
|
|
||
|
|
function raise_dev {
|
||
|
|
i=0;
|
||
|
|
while [[ -z "$TEMP" && $i<5 ]]; do
|
||
|
|
TEMP=$(${VPNDIR}vpncmd /client localhost /cmd accountlist | grep Status | grep Connected)
|
||
|
|
sleep 1
|
||
|
|
i=$((i+1))
|
||
|
|
done
|
||
|
|
dhclient vpn_se
|
||
|
|
}
|
||
|
|
|
||
|
|
if pgrep -x "vpnclient" > /dev/null
|
||
|
|
then
|
||
|
|
${VPNDIR}vpnclient stop >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpnclient start >/dev/null 2>&1
|
||
|
|
if [[ -z $(${VPNDIR}vpncmd /client localhost /cmd nicList | grep Enabled) ]]; then
|
||
|
|
${VPNDIR}vpncmd /client localhost /cmd niccreate se >/dev/null 2>&1
|
||
|
|
fi
|
||
|
|
if [[ -z $(${VPNDIR}vpncmd /client localhost /cmd accountlist | grep "VPN Server") ]]; then
|
||
|
|
dialog --backtitle "$BACKTITLE" --no-label " Cancel " --yes-label " Import " --title " VPN " --yesno "\nA VPN configuration was not found.\n\nPlace valid file at /etc/server.vpn" 9 45
|
||
|
|
if [[ $? = 0 && -f /etc/server.vpn ]]; then
|
||
|
|
${VPNDIR}vpncmd /client localhost /cmd accountimport //etc//server.vpn >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpnclient stop >/dev/null 2>&1
|
||
|
|
${VPNDIR}vpnclient start >/dev/null 2>&1
|
||
|
|
[[ $? = 0 ]] && dialog --backtitle "$BACKTITLE" --title " VPN " --msgbox "\nConfiguration was successfully imported!" 7 43
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
# raise devices
|
||
|
|
raise_dev
|
||
|
|
|
||
|
|
if [[ -n $(${VPNDIR}vpncmd /client localhost /cmd accountlist | grep Status | grep Connected) ]]; then
|
||
|
|
get_numbers
|
||
|
|
echo "ip route add $VPNSERVERIP via $IP dev $ADAPTER"
|
||
|
|
echo "ip route del default"
|
||
|
|
echo "ip route add default via $GW dev vpn_se"
|
||
|
|
read
|
||
|
|
dialog --title "VPN client is connected to $VPNSERVERIP" --colors --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Stop" --no-label " Import " --yesno "\n\Z1Stop: \Z0 stop\n\n\Z1Import:\Z0 import new config from /etc/orangepi.vpn" 9 70
|
||
|
|
fi
|
||
|
|
response=$?
|
||
|
|
if [[ $response = 0 ]]; then
|
||
|
|
get_numbers
|
||
|
|
echo "ip route del $VPNSERVERIP"
|
||
|
|
echo "ip route del default"
|
||
|
|
echo "ip route add default via $IP dev $ADAPTER"
|
||
|
|
read
|
||
|
|
dialog --backtitle "$BACKTITLE" --nocancel --nook --infobox "\nClosing VPN connection" 5 27
|
||
|
|
${VPNDIR}vpnclient stop >/dev/null 2>&1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
dialog --title "VPN client is disconnected" --colors --backtitle "$BACKTITLE" --help-button --help-label "Cancel" --yes-label "Connect" --no-label " Import " --yesno "\n\Z1Connect:\Z0 Connect with your VPN server \n\n\Z1Import:\Z0 import new config from /etc/orangepi.vpn" 9 70
|
||
|
|
response=$?
|
||
|
|
if [[ $response = 0 ]]; then
|
||
|
|
${VPNDIR}vpnclient start >/dev/null 2>&1
|
||
|
|
|
||
|
|
# raise devices
|
||
|
|
raise_dev
|
||
|
|
get_numbers
|
||
|
|
echo "ip route add $VPNSERVERIP via $IP dev $ADAPTER"
|
||
|
|
echo "ip route del default"
|
||
|
|
echo "ip route add default via $GW dev vpn_se"
|
||
|
|
read
|
||
|
|
|
||
|
|
fi
|
||
|
|
[[ $response = 1 ]] && vpn_reconfigure
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Connect to Bluetooth
|
||
|
|
#
|
||
|
|
"BT discover" )
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Bluetooth " --msgbox "\nVerify that your Bluetooth device is discoverable!" 7 54
|
||
|
|
connect_bt_interface
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Edit network settings
|
||
|
|
#
|
||
|
|
"Advanced" )
|
||
|
|
dialog --backtitle "$BACKTITLE" --title " Edit ifupdown network configuration /etc/network/interfaces" --no-collapse \
|
||
|
|
--ok-label "Save" --editbox /etc/network/interfaces 30 0 2> /etc/network/interfaces.out
|
||
|
|
[[ $? = 0 ]] && mv /etc/network/interfaces.out /etc/network/interfaces && reload-nety "reload"
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Remove automatic wifi conections
|
||
|
|
#
|
||
|
|
"Forget" )
|
||
|
|
LC_ALL=C nmcli --fields UUID,TIMESTAMP-REAL,TYPE con show | grep wifi | awk '{print $1}' | while read line; \
|
||
|
|
do nmcli con delete uuid $line; done > /dev/null
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
#-------------------------------------------------------------------------------------------------------------------------------------#
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# Change timezone
|
||
|
|
#
|
||
|
|
"Timezone" )
|
||
|
|
dpkg-reconfigure tzdata
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Change locales
|
||
|
|
#
|
||
|
|
"Locales" )
|
||
|
|
dpkg-reconfigure locales
|
||
|
|
source /etc/default/locale
|
||
|
|
sed -i "s/^LANGUAGE=.*/LANGUAGE=$LANG/" /etc/default/locale
|
||
|
|
export LANGUAGE=$LANG
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Change keyboard
|
||
|
|
#
|
||
|
|
"Keyboard" )
|
||
|
|
dpkg-reconfigure keyboard-configuration
|
||
|
|
setupcon
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Change Hostname
|
||
|
|
#
|
||
|
|
"Hostname" )
|
||
|
|
hostname_current=$(cat /etc/hostname)
|
||
|
|
hostname_new=$(\
|
||
|
|
dialog --no-cancel --title " Change hostname " --backtitle "$BACKTITLE" --inputbox "\nType new hostname\n " 10 50 $hostname_current \
|
||
|
|
3>&1 1>&2 2>&3 3>&- \
|
||
|
|
)
|
||
|
|
if [[ $? = 0 && -n $hostname_new ]]; then
|
||
|
|
sed -i "s/$hostname_current/$hostname_new/g" /etc/hosts
|
||
|
|
sed -i "s/$hostname_current/$hostname_new/g" /etc/hostname
|
||
|
|
hostname $hostname_new
|
||
|
|
systemctl restart systemd-logind.service
|
||
|
|
dialog --title " Info " --backtitle "$BACKTITLE" --no-collapse --msgbox "\nYou need to logout to make the changes effective." 7 53
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Bash
|
||
|
|
#
|
||
|
|
"BASH" )
|
||
|
|
# change shell for root
|
||
|
|
chsh -s /bin/bash
|
||
|
|
add_choose_user
|
||
|
|
if [ -n "$CHOSEN_USER" ]; then
|
||
|
|
chsh -s /bin/bash $CHOSEN_USER
|
||
|
|
fi
|
||
|
|
# cleanup
|
||
|
|
rm -rf /etc/oh-my-zsh /etc/skel/.zshrc /etc/skel/.oh-my-zsh
|
||
|
|
rm -rf /root/{.zshrc,.oh-my-zsh}
|
||
|
|
# and for selected normal user
|
||
|
|
add_choose_user
|
||
|
|
if [ -n "$CHOSEN_USER" ]; then
|
||
|
|
rm -rf /home/$CHOSEN_USER/{.zshrc,.oh-my-zsh}
|
||
|
|
fi
|
||
|
|
# change shell for future users
|
||
|
|
sed -i "s/^SHELL=.*/SHELL=\/bin\/bash/" /etc/default/useradd
|
||
|
|
# remove crontab
|
||
|
|
crontab -l | grep -v oh-my | crontab -
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
dialog --backtitle "$BACKTITLE" --title "Info" --colors --msgbox "\nYour default shell was switched to: \Z1BASH\Z0\n\nPlease logout & login from this session!" 9 47
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# ZSH
|
||
|
|
#
|
||
|
|
"ZSH" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if ! check_if_installed zsh ; then
|
||
|
|
debconf-apt-progress -- apt-get update
|
||
|
|
debconf-apt-progress -- apt-get install -y zsh tmux git
|
||
|
|
fi
|
||
|
|
rm -rf /etc/oh-my-zsh
|
||
|
|
git clone --quiet https://github.com/robbyrussell/oh-my-zsh.git /etc/oh-my-zsh
|
||
|
|
cp /etc/oh-my-zsh/templates/zshrc.zsh-template /etc/skel/.zshrc
|
||
|
|
mkdir -p /etc/skel/.oh-my-zsh/cache
|
||
|
|
# change shell for future users
|
||
|
|
sed -i "s/^SHELL=.*/SHELL=\/usr\/bin\/zsh/" /etc/default/useradd
|
||
|
|
# we have common settings
|
||
|
|
sed -i "s/^export ZSH=.*/export ZSH=\/etc\/oh-my-zsh/" /etc/skel/.zshrc
|
||
|
|
# user cache
|
||
|
|
sed -i "/^export ZSH=.*/a export ZSH_CACHE_DIR=~\/.oh-my-zsh\/cache" /etc/skel/.zshrc
|
||
|
|
# define theme
|
||
|
|
sed -i 's/^ZSH_THEME=.*/ZSH_THEME="risto"/' /etc/skel/.zshrc
|
||
|
|
# disable prompt while update
|
||
|
|
sed -i 's/# DISABLE_UPDATE_PROMPT="true"/DISABLE_UPDATE_PROMPT="true"/g' /etc/skel/.zshrc
|
||
|
|
# define default plugins
|
||
|
|
sed -i 's/^plugins=.*/plugins=(git git-extras debian tmux screen history extract colorize web-search docker)/' /etc/skel/.zshrc
|
||
|
|
# change shell for root
|
||
|
|
chsh -s $(grep /zsh$ /etc/shells | tail -1)
|
||
|
|
# copy cache directory
|
||
|
|
cp -R --attributes-only /etc/skel/.oh-my-zsh /root/.oh-my-zsh
|
||
|
|
cp /etc/skel/.zshrc /root/.zshrc
|
||
|
|
# and for selected normal user
|
||
|
|
add_choose_user
|
||
|
|
if [ -n "$CHOSEN_USER" ]; then
|
||
|
|
chsh -s $(grep /zsh$ /etc/shells | tail -1) $CHOSEN_USER
|
||
|
|
# copy cache directory
|
||
|
|
cp -R --attributes-only /etc/skel/.oh-my-zsh /home/$CHOSEN_USER/.oh-my-zsh
|
||
|
|
cp /etc/skel/.zshrc /home/$CHOSEN_USER/.zshrc
|
||
|
|
chown -R ${CHOSEN_USER}:${CHOSEN_USER} /home/${CHOSEN_USER}/{.zshrc,.oh-my-zsh}
|
||
|
|
fi
|
||
|
|
# add a cronjob to update oh-my-zsh once per month
|
||
|
|
(crontab -l 2>/dev/null; echo "0 0 1 * * cd /etc/oh-my-zsh ; git pull origin master >/dev/null 2>/dev/null") | crontab -
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
dialog --backtitle "$BACKTITLE" --title "Info" --colors --msgbox "\nYour default shell was switched to: \Z1ZSH\Z0\n\nPlease logout & login from this session!" 9 47
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Firmware update
|
||
|
|
#
|
||
|
|
"Firmware" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
clear
|
||
|
|
exec 3>&1
|
||
|
|
monitor=$(dialog --print-maxsize 2>&1 1>&3)
|
||
|
|
exec 3>&-
|
||
|
|
mon_x=$(echo $monitor | awk '{print $2}' | sed 's/,//');mon_x=$(( $mon_x / 2 ))
|
||
|
|
mon_y=$(echo $monitor | awk '{print $3}' | sed 's/,//');
|
||
|
|
if [[ -z $scripted ]]; then
|
||
|
|
dialog --title " Update " --backtitle "$BACKTITLE" --no-label "No" --yesno "\nDo you want to update board firmware?" 7 41
|
||
|
|
fi
|
||
|
|
if [[ $? -eq 0 ]]; then
|
||
|
|
debconf-apt-progress -- apt-get update
|
||
|
|
debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" -y upgrade
|
||
|
|
[[ -z $scripted ]] && \
|
||
|
|
dialog --title " Firmware update " --colors --no-label "No" --backtitle "$BACKTITLE" --yesno \
|
||
|
|
"\nFirmware has been updated. Reboot? " 7 39
|
||
|
|
if [[ $? -eq 0 ]]; then reboot; fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Install to SATA, eMMC, NAND or USB
|
||
|
|
#
|
||
|
|
"Install" )
|
||
|
|
nand-sata-install
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Freeze and unfreeze kernel and board support packages
|
||
|
|
#
|
||
|
|
"Freeze" | "Defreeze" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if [[ -z $scripted ]]; then dialog --title " Updating " --backtitle "$BACKTITLE" --yes-label "$1" --no-label "Cancel" --yesno \
|
||
|
|
"\nDo you want to ${1,,} Orange Pi firmware updates?" 7 54
|
||
|
|
fi
|
||
|
|
if [[ $? -eq 0 ]]; then
|
||
|
|
|
||
|
|
unset PACKAGE_LIST
|
||
|
|
|
||
|
|
# basic packages
|
||
|
|
|
||
|
|
check_if_installed linux-u-boot-${BOARD}-${BRANCH} && PACKAGE_LIST+=" linux-u-boot-${BOARD}-${BRANCH}"
|
||
|
|
check_if_installed linux-image-${BRANCH}-${LINUXFAMILY} && PACKAGE_LIST+=" linux-image-${BRANCH}-${LINUXFAMILY}"
|
||
|
|
check_if_installed linux-dtb-${BRANCH}-${LINUXFAMILY} && PACKAGE_LIST+=" linux-dtb-${BRANCH}-${LINUXFAMILY}"
|
||
|
|
check_if_installed linux-headers-${BRANCH}-${LINUXFAMILY} && PACKAGE_LIST+=" linux-headers-${BRANCH}-${LINUXFAMILY}"
|
||
|
|
|
||
|
|
# new BSP
|
||
|
|
check_if_installed orangepi-${LINUXFAMILY} && PACKAGE_LIST+=" orangepi-${LINUXFAMILY}"
|
||
|
|
check_if_installed orangepi-${BOARD} && PACKAGE_LIST+=" orangepi-${BOARD}"
|
||
|
|
check_if_installed orangepi-${DISTROID} && PACKAGE_LIST+=" orangepi-${DISTROID}"
|
||
|
|
check_if_installed orangepi-${DISTROID}-desktop-xfce && PACKAGE_LIST+=" orangepi-${DISTROID}-desktop-xfce"
|
||
|
|
check_if_installed orangepi-firmware && PACKAGE_LIST+=" orangepi-firmware"
|
||
|
|
check_if_installed orangepi-firmware-full && PACKAGE_LIST+=" orangepi-firmware-full"
|
||
|
|
|
||
|
|
local words=( $PACKAGE_LIST )
|
||
|
|
local command="unhold"
|
||
|
|
IFS=" "
|
||
|
|
[[ $1 == "Freeze" ]] && local command="hold"
|
||
|
|
for word in $PACKAGE_LIST; do apt-mark $command $word; done | dialog --backtitle "$BACKTITLE" --title "Packages ${1,,}" --progressbox $((${#words[@]}+2)) 64
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Switch to other kernel versions
|
||
|
|
"Other")
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
other_kernel_version
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# Enable or disable desktop
|
||
|
|
#
|
||
|
|
"Desktop" )
|
||
|
|
if [[ -n $DISPLAY_MANAGER ]]; then
|
||
|
|
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
|
||
|
|
exitstatus=$?;
|
||
|
|
if [[ $exitstatus = 0 ]]; then
|
||
|
|
function stop_display()
|
||
|
|
{
|
||
|
|
bash -c "service lightdm stop >/dev/null 2>&1
|
||
|
|
systemctl disable lightdm.service >/dev/null 2>&1
|
||
|
|
service nodm stop >/dev/null 2>&1
|
||
|
|
systemctl disable nodm.service >/dev/null 2>&1"
|
||
|
|
}
|
||
|
|
if xhost >& /dev/null ; then
|
||
|
|
stop_display &
|
||
|
|
else
|
||
|
|
stop_display
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
# remove nodm and install lightdm = backward compatibility
|
||
|
|
[[ -n $(dpkg -l | grep nodm) ]] && debconf-apt-progress -- apt-get -y purge nodm
|
||
|
|
[[ -z $(dpkg -l | grep lightdm) ]] && debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confold" -y --no-install-recommends install lightdm-gtk-greeter lightdm
|
||
|
|
if [[ -n $DESKTOP_INSTALLED ]]; then
|
||
|
|
dialog --title " Display manager " --backtitle "$BACKTITLE" --yesno "\nDo you want to enable autologin?" 7 36
|
||
|
|
exitstatus=$?;
|
||
|
|
if [[ $exitstatus = 0 ]]; then
|
||
|
|
add_choose_user
|
||
|
|
if [ -n "$CHOSEN_USER" ]; then
|
||
|
|
mkdir -p /etc/lightdm/lightdm.conf.d
|
||
|
|
echo "[Seat:*]" > /etc/lightdm/lightdm.conf.d/22-orangepi-autologin.conf
|
||
|
|
echo "autologin-user=$CHOSEN_USER" >> /etc/lightdm/lightdm.conf.d/22-orangepi-autologin.conf
|
||
|
|
echo "autologin-user-timeout=0" >> /etc/lightdm/lightdm.conf.d/22-orangepi-autologin.conf
|
||
|
|
echo "user-session=xfce" >> /etc/lightdm/lightdm.conf.d/22-orangepi-autologin.conf
|
||
|
|
ln -s /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service >/dev/null 2>&1
|
||
|
|
service lightdm start >/dev/null 2>&1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
rm /etc/lightdm/lightdm.conf.d/22-orangepi-autologin.conf >/dev/null 2>&1
|
||
|
|
ln -s /lib/systemd/system/lightdm.service /etc/systemd/system/display-manager.service >/dev/null 2>&1
|
||
|
|
service lightdm start >/dev/null 2>&1
|
||
|
|
fi
|
||
|
|
# kill this bash script after desktop is up and if executed on console
|
||
|
|
[[ $(tty | sed -e "s:/dev/::") == tty* ]] && kill -9 $$
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Default" )
|
||
|
|
configure_desktop "--install-recommends"
|
||
|
|
;;
|
||
|
|
|
||
|
|
"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
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
debconf-apt-progress -- apt-get -y install xrdp vnc4server xorgxrdp
|
||
|
|
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
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Thunderbird" )
|
||
|
|
if ! check_if_installed thunderbird then ; then
|
||
|
|
debconf-apt-progress -- apt-get -y install thunderbird
|
||
|
|
else
|
||
|
|
debconf-apt-progress -- apt-get -y purge thunderbird
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Gimp" )
|
||
|
|
if ! check_if_installed gimp then ; then
|
||
|
|
debconf-apt-progress -- apt-get -y install gimp
|
||
|
|
else
|
||
|
|
debconf-apt-progress -- apt-get -y purge gimp
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Libre" )
|
||
|
|
debconf-apt-progress -- apt-get -y purge libreoffice*
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Writer" )
|
||
|
|
pkg_install="libreoffice-writer libreoffice-style-tango"
|
||
|
|
if [[ "$DISTROID" == "xenial" ]]; then pkg_install+=" libreoffice-gtk"; else pkg_install+=" libreoffice-gtk2"; fi
|
||
|
|
debconf-apt-progress -- apt-get -y install $pkg_install
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Suite" )
|
||
|
|
pkg_install="libreoffice libreoffice-style-tango"
|
||
|
|
if [[ "$DISTROID" == "xenial" ]]; then pkg_install+=" libreoffice-gtk"; else pkg_install+=" libreoffice-gtk2"; fi
|
||
|
|
debconf-apt-progress -- apt-get -y install $pkg_install
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Stop low-level messages on console
|
||
|
|
#
|
||
|
|
"Lowlevel" )
|
||
|
|
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
|
||
|
|
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
|
||
|
|
;;
|
||
|
|
|
||
|
|
# CPU speed and governor
|
||
|
|
#
|
||
|
|
"CPU" )
|
||
|
|
POLICY="policy0"
|
||
|
|
[[ $(grep -c '^processor' /proc/cpuinfo) -gt 4 ]] && POLICY="policy4"
|
||
|
|
[[ ! -d /sys/devices/system/cpu/cpufreq/policy4 ]] && POLICY="policy0"
|
||
|
|
generic_select "$(cat /sys/devices/system/cpu/cpufreq/$POLICY/scaling_available_frequencies)" "Select minimum CPU speed"
|
||
|
|
MIN_SPEED=$PARAMETER
|
||
|
|
generic_select "$(cat /sys/devices/system/cpu/cpufreq/$POLICY/scaling_available_frequencies)" "Select maximum CPU speed" "$PARAMETER"
|
||
|
|
MAX_SPEED=$PARAMETER
|
||
|
|
generic_select "$(cat /sys/devices/system/cpu/cpufreq/$POLICY/scaling_available_governors)" "Select CPU governor"
|
||
|
|
GOVERNOR=$PARAMETER
|
||
|
|
if [[ -n $MIN_SPEED && -n $MAX_SPEED && -n $GOVERNOR ]]; then
|
||
|
|
dialog --colors --title " Apply and save changes " --backtitle "$BACKTITLE" --yes-label "OK" --no-label "Cancel" --yesno \
|
||
|
|
"\nCPU frequency will be within \Z1$(($MIN_SPEED / 1000))\Z0 and \Z1$(($MAX_SPEED / 1000)) MHz\Z0. The governor \Z1$GOVERNOR\Z0 will decide which speed to use within this range." 9 58
|
||
|
|
if [[ $? -eq 0 ]]; then
|
||
|
|
sed -i "s/MIN_SPEED=.*/MIN_SPEED=$MIN_SPEED/" /etc/default/cpufrequtils
|
||
|
|
sed -i "s/MAX_SPEED=.*/MAX_SPEED=$MAX_SPEED/" /etc/default/cpufrequtils
|
||
|
|
sed -i "s/GOVERNOR=.*/GOVERNOR=$GOVERNOR/" /etc/default/cpufrequtils
|
||
|
|
systemctl restart cpufrequtils
|
||
|
|
sync
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
"Avahi")
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if check_if_installed avahi-daemon ; then
|
||
|
|
service avahi-daemon stop
|
||
|
|
debconf-apt-progress -- apt-get -y purge avahi-daemon
|
||
|
|
else
|
||
|
|
debconf-apt-progress -- apt-get -y install avahi-daemon
|
||
|
|
[[ -f /usr/share/doc/avahi-daemon/examples/sftp-ssh.service ]] && cp /usr/share/doc/avahi-daemon/examples/sftp-ssh.service /etc/avahi/services/
|
||
|
|
[[ -f /usr/share/doc/avahi-daemon/examples/ssh.service ]] && cp /usr/share/doc/avahi-daemon/examples/ssh.service /etc/avahi/services/
|
||
|
|
service avahi-daemon restart
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Edit boot environment
|
||
|
|
#
|
||
|
|
"Bootenv" )
|
||
|
|
dialog --title " Edit u-boot environment " --ok-label "Save" \
|
||
|
|
--no-collapse --editbox /boot/orangepiEnv.txt 30 0 2> /boot/orangepiEnv.txt.out
|
||
|
|
[[ $? = 0 ]] && mv /boot/orangepiEnv.txt.out /boot/orangepiEnv.txt
|
||
|
|
sync
|
||
|
|
;;
|
||
|
|
|
||
|
|
# 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
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Toggle overlay items
|
||
|
|
#
|
||
|
|
"Hardware" )
|
||
|
|
# check if user agree to enter this area
|
||
|
|
CHANGES="false"
|
||
|
|
while true; do
|
||
|
|
overlay_prefix=$(cat /boot/orangepiEnv.txt | grep overlay_prefix | sed 's/overlay_prefix=//g')
|
||
|
|
TARGET_BRANCH=$BRANCH
|
||
|
|
exceptions "$BRANCH"
|
||
|
|
MOTD=()
|
||
|
|
LINES=()
|
||
|
|
LIST_CONST=-3
|
||
|
|
j=0
|
||
|
|
DIALOG_CANCEL=1
|
||
|
|
DIALOG_ESC=255
|
||
|
|
while read line
|
||
|
|
do
|
||
|
|
STATUS=$([[ -n $(cat /boot/orangepiEnv.txt | grep overlays | grep -w ${line}) ]] && echo "on")
|
||
|
|
DESC=$(description "$line")
|
||
|
|
MOTD+=( "$line" "$DESC" "$STATUS")
|
||
|
|
LINES[ $j ]=$line
|
||
|
|
(( j++ ))
|
||
|
|
done < <(ls -1 ${OVERLAYDIR}/${overlay_prefix}*.dtbo | sed 's/^.*\('${overlay_prefix}'.*\)/\1/g' | sed 's/'${overlay_prefix}'-//g' | sed 's/.dtbo//g' )
|
||
|
|
|
||
|
|
exec 3>&1
|
||
|
|
selection=$(dialog --backtitle "$BACKTITLE" --colors --title "Toggle hardware configuration" --clear --cancel-label \
|
||
|
|
"Back" --ok-label "Save" --checklist "\nUse \Z1<space>\Z0 to toggle functions and save them. Exit when you are done.\n " \
|
||
|
|
0 0 0 "${MOTD[@]}" 2>&1 1>&3)
|
||
|
|
exit_status=$?
|
||
|
|
exec 3>&-
|
||
|
|
|
||
|
|
case $exit_status in
|
||
|
|
$DIALOG_ESC)
|
||
|
|
break
|
||
|
|
;;
|
||
|
|
0)
|
||
|
|
CHANGES="true"
|
||
|
|
newoverlays="$(echo "$selection" | sed "s|[^ ]* *|&|g")"
|
||
|
|
sed -i "s/^overlays=.*/overlays=$newoverlays/" /boot/orangepiEnv.txt
|
||
|
|
if ! grep -q "overlays" /boot/orangepiEnv.txt; then echo "overlays=$newoverlays" >> /boot/orangepiEnv.txt; fi
|
||
|
|
if [[ -z $newoverlays ]]; then sed -i "/^overlays/d" /boot/orangepiEnv.txt; fi
|
||
|
|
sync
|
||
|
|
;;
|
||
|
|
1)
|
||
|
|
if [[ "$CHANGES" == "true" ]]; then
|
||
|
|
dialog --title " Applying changes " --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nReboot to enable new features?" 7 34
|
||
|
|
if [[ $? = 0 ]]; then reboot; else break; fi
|
||
|
|
else
|
||
|
|
break
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Change to other mirrors
|
||
|
|
#
|
||
|
|
"Mirror" )
|
||
|
|
|
||
|
|
IFS=$'\r\n'
|
||
|
|
GLOBIGNORE='*'
|
||
|
|
LIST_CONST=3
|
||
|
|
BEFORE="$(cat /etc/apt/sources.list.d/orangepi.list | sed 's/http/\nhttp/g' | grep ^http | sed 's/\(^http[^ <]*\)\(.*\)/\1/g' | sed 's/https\?:\/\///')"
|
||
|
|
BEFORE_DESC=$(description "${BEFORE}")
|
||
|
|
PREFIX="$(echo $BEFORE | cut -f1 -d".")"
|
||
|
|
AVAL_MIRROR=()
|
||
|
|
if [[ $PREFIX == beta ]]; then
|
||
|
|
AVAL_MIRROR=("beta.orangepi.com" "mirrors.netix.net/orangepi/apt/")
|
||
|
|
else
|
||
|
|
AVAL_MIRROR+=("apt.orangepi.com" "mirrors.tuna.tsinghua.edu.cn/orangepi/" "mirrors.netix.net/orangepi/apt/" "mirrors.dotsrc.org/orangepi-apt/")
|
||
|
|
fi
|
||
|
|
local LIST=()
|
||
|
|
for i in "${AVAL_MIRROR[@]}"
|
||
|
|
do
|
||
|
|
DESC=$(description "${i[0]}")
|
||
|
|
[[ "${i[0]}" != "$BEFORE" ]] && LIST+=( "${i[0]//[[:blank:]]/}" "$DESC" )
|
||
|
|
done
|
||
|
|
LIST_LENGTH=$(($LIST_CONST+${#LIST[@]}/2));
|
||
|
|
if [ "$LIST_LENGTH" -le 3 ]; then
|
||
|
|
TARGET_MIRROR=${AVAL_MIRROR[0]}
|
||
|
|
dialog --backtitle "$BACKTITLE" --title "Please wait" --colors --msgbox "\nThere are no mirrors available!" 7 35
|
||
|
|
else
|
||
|
|
exec 3>&1
|
||
|
|
TARGET_MIRROR=$(dialog --cancel-label "Cancel" --backtitle "$BACKTITLE" --no-collapse \
|
||
|
|
--title "Change repository location" --colors --clear --menu "\nfrom \Z1$BEFORE_DESC\Z0 to:\n " $((6+${LIST_LENGTH})) 60 15 "${LIST[@]}" 2>&1 1>&3)
|
||
|
|
exitstatus=$?;
|
||
|
|
exec 3>&-
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ $exitstatus == 0 ]]; then
|
||
|
|
sed -i "s~$BEFORE~$TARGET_MIRROR~" /etc/apt/sources.list.d/orangepi.list
|
||
|
|
dialog --backtitle "$BACKTITLE" --title "Info" --colors --msgbox "\nOrange Pi package repository was switched to:\n\n\Z1$TARGET_MIRROR\Z0" 9 47
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Toggle welcome screen items
|
||
|
|
#
|
||
|
|
"Welcome" )
|
||
|
|
while true; do
|
||
|
|
HOME="/etc/update-motd.d/"
|
||
|
|
MOTD=()
|
||
|
|
LINES=()
|
||
|
|
LIST_CONST=9
|
||
|
|
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)
|
||
|
|
|
||
|
|
LISTLENGTH="$(($LIST_CONST+${#MOTD[@]}/3))"
|
||
|
|
exec 3>&1
|
||
|
|
selection=$(dialog --backtitle "$BACKTITLE" --title "Toggle motd executing scripts" --clear --cancel-label \
|
||
|
|
"Back" --ok-label "Save" --checklist "\nChoose what you want to enable or disable:\n " \
|
||
|
|
$LISTLENGTH 80 15 "${MOTD[@]}" 2>&1 1>&3)
|
||
|
|
exit_status=$?
|
||
|
|
exec 3>&-
|
||
|
|
case $exit_status in
|
||
|
|
$DIALOG_CANCEL | $DIALOG_ESC)
|
||
|
|
break
|
||
|
|
;;
|
||
|
|
0)
|
||
|
|
chmod -x ${HOME}*
|
||
|
|
chmod +x $(echo "$selection" | sed "s|[^ ]* *|${HOME}&|g")
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Toggle sshd options
|
||
|
|
#
|
||
|
|
"SSH" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
while true; do
|
||
|
|
if ! check_if_installed libpam-google-authenticator ; then
|
||
|
|
debconf-apt-progress -- apt-get -y install libpam-google-authenticator
|
||
|
|
fi
|
||
|
|
if ! check_if_installed qrencode ; then
|
||
|
|
debconf-apt-progress -- apt-get -y install qrencode
|
||
|
|
fi
|
||
|
|
DIALOG_CANCEL=2
|
||
|
|
DIALOG_ESC=255
|
||
|
|
LIST_CONST=9
|
||
|
|
WINDOW_SIZE=21
|
||
|
|
|
||
|
|
# variables cleanup
|
||
|
|
PermitRootLogin="";
|
||
|
|
PubkeyAuthentication="";
|
||
|
|
PasswordAuthentication="";
|
||
|
|
PhoneAuthentication=""
|
||
|
|
MergeParameter="";
|
||
|
|
ExtraDesc="";
|
||
|
|
|
||
|
|
Buttons="--no-cancel --ok-label "Save" --help-button --help-label Cancel"
|
||
|
|
|
||
|
|
# read values
|
||
|
|
[[ $(grep "^PermitRootLogin" /etc/ssh/sshd_config | awk '{print $2}') == "yes" ]] && PermitRootLogin="on"
|
||
|
|
[[ $(grep "^@include common-auth" /etc/pam.d/sshd | awk '{print $2}') == "common-auth" ]] && PasswordAuthentication="on"
|
||
|
|
[[ $(grep "^PubkeyAuthentication" /etc/ssh/sshd_config | awk '{print $2}') == "yes" ]] && PubkeyAuthentication="on"
|
||
|
|
[[ -n $(grep "pam_google_authenticator.so" /etc/pam.d/sshd) ]] && PhoneAuthentication="on"
|
||
|
|
|
||
|
|
# create menu
|
||
|
|
MOTD=( "PermitRootLogin" "Allow root login" "$PermitRootLogin" )
|
||
|
|
MOTD+=( "PasswordAuthentication" "Password login" "$PasswordAuthentication" )
|
||
|
|
MOTD+=( "PubkeyAuthentication" "SSH key login" "$PubkeyAuthentication" )
|
||
|
|
MOTD+=( "PhoneAuthentication" "Google two-step authentication with one-time passcode" "$PhoneAuthentication" )
|
||
|
|
|
||
|
|
Buttons="--no-cancel --ok-label "Save" --help-button --help-label Cancel"
|
||
|
|
if [[ $PhoneAuthentication == "on" ]]; then
|
||
|
|
Buttons="--cancel-label Generate-token --ok-label "Save" --help-button --help-label Cancel"
|
||
|
|
ExtraDesc="\n\Z1Note:\Z0 Two-step verification token is identical for all users on the system.\n \n"
|
||
|
|
LIST_CONST=11
|
||
|
|
if [[ -f ~/.google_authenticator ]]; then
|
||
|
|
Buttons="--cancel-label New-token --ok-label "Save" --help-button --help-label Cancel --extra-button --extra-label Show-token"
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
LISTLENGTH="$((${#MOTD[@]}/3))"
|
||
|
|
HEIGHT="$((LISTLENGTH + $LIST_CONST))"
|
||
|
|
|
||
|
|
exec 3>&1
|
||
|
|
selection=$(dialog --colors $Buttons --backtitle "$BACKTITLE" --title " Toggle sshd options " --clear --checklist \
|
||
|
|
"\nChoose what you want to enable or disable:\n $ExtraDesc" $HEIGHT 0 $LISTLENGTH "${MOTD[@]}" 2>&1 1>&3)
|
||
|
|
exit_status=$?
|
||
|
|
exec 3>&-
|
||
|
|
|
||
|
|
case $exit_status in
|
||
|
|
$DIALOG_CANCEL | $DIALOG_ESC)
|
||
|
|
break
|
||
|
|
;;
|
||
|
|
0)
|
||
|
|
# read values, adjust config and restart service
|
||
|
|
my_array=($selection)
|
||
|
|
for((n=0;n<${#MOTD[@]};n++)); do
|
||
|
|
if (( $(($n % 3 )) == 0 )); then
|
||
|
|
|
||
|
|
# generic options if any
|
||
|
|
if [[ " ${my_array[*]} " == *" ${MOTD[$n]} "* ]]; then
|
||
|
|
sed -i "s/^#\?${MOTD[$n]}.*/${MOTD[$n]} yes/" /etc/ssh/sshd_config
|
||
|
|
else
|
||
|
|
sed -i "s/^#\?${MOTD[$n]}.*/${MOTD[$n]} no/" /etc/ssh/sshd_config
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ $n -eq 0 ]]; then
|
||
|
|
|
||
|
|
# phone
|
||
|
|
if [[ " ${my_array[*]} " == *" PhoneAuthentication "* ]]; then
|
||
|
|
MergeParameter="keyboard-interactive"
|
||
|
|
sed -i "s/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication yes/" /etc/ssh/sshd_config
|
||
|
|
sed -i -n '/password updating/{p;:a;N;/@include common-password/!ba;s/.*\n/auth required pam_google_authenticator.so nullok\n/};p' /etc/pam.d/sshd
|
||
|
|
else
|
||
|
|
MergeParameter=""
|
||
|
|
sed -i '/^auth required pam_google_authenticator.so nullok/ d' /etc/pam.d/sshd
|
||
|
|
sed -i "s/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/" /etc/ssh/sshd_config
|
||
|
|
fi
|
||
|
|
|
||
|
|
# password
|
||
|
|
if [[ " ${my_array[*]} " == *" PasswordAuthentication "* ]]; then
|
||
|
|
MergeParameter="password keyboard-interactive"
|
||
|
|
sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication yes/" /etc/ssh/sshd_config
|
||
|
|
sed -i "s/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication yes/" /etc/ssh/sshd_config
|
||
|
|
sed -i "s/^\#@include common-auth/\@include common-auth/" /etc/pam.d/sshd
|
||
|
|
else
|
||
|
|
sed -i "s/^#\?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config
|
||
|
|
#sed -i "s/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/" /etc/ssh/sshd_config
|
||
|
|
sed -i "s/^\@include common-auth/\#@include common-auth/" /etc/pam.d/sshd
|
||
|
|
fi
|
||
|
|
|
||
|
|
# pubkey
|
||
|
|
if [[ " ${my_array[*]} " == *" PubkeyAuthentication "* ]]; then
|
||
|
|
MergeParameter="publickey keyboard-interactive "
|
||
|
|
sed -i "s/^#\?PubkeyAuthentication.*/PubkeyAuthentication yes/" /etc/ssh/sshd_config
|
||
|
|
else
|
||
|
|
sed -i "s/^#\?PubkeyAuthentication.*/PubkeyAuthentication no/" /etc/ssh/sshd_config
|
||
|
|
fi
|
||
|
|
|
||
|
|
|
||
|
|
if [[ " ${my_array[*]} " == *" PubkeyAuthentication "* && " ${my_array[*]} " == *" PhoneAuthentication "* ]]; then
|
||
|
|
MergeParameter="publickey,password publickey,keyboard-interactive"
|
||
|
|
sed -i "s/^#\?PubkeyAuthentication.*/PubkeyAuthentication yes/" /etc/ssh/sshd_config
|
||
|
|
fi
|
||
|
|
|
||
|
|
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
if [[ -z $MergeParameter ]]; then
|
||
|
|
sed -i '/^AuthenticationMethods.*/ d' /etc/ssh/sshd_config
|
||
|
|
else
|
||
|
|
sed -i '/^AuthenticationMethods.*/ d' /etc/ssh/sshd_config
|
||
|
|
sed -i -n '/and ChallengeResponseAuthentication to/{p;:a;N;/UsePAM yes/!ba;s/.*\n/AuthenticationMethods '"$MergeParameter"'\n/};p' /etc/ssh/sshd_config
|
||
|
|
fi
|
||
|
|
|
||
|
|
# reload sshd
|
||
|
|
systemctl restart sshd.service
|
||
|
|
;;
|
||
|
|
3)
|
||
|
|
display_qr_code
|
||
|
|
;;
|
||
|
|
1)
|
||
|
|
dialog --colors --title " \Z1Warning\Z0 " --backtitle "$BACKTITLE" --yes-label "Generate" --no-label "No" --yesno "\nWhen you generate new token you have to scan it with your mobile device again.\n\nUnderstand?" 10 48
|
||
|
|
if [[ $? = 0 ]]; then
|
||
|
|
google-authenticator -t -d -f -r 3 -R 30 -W -q
|
||
|
|
google_token_allusers
|
||
|
|
display_qr_code
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
# Switch to daily builds
|
||
|
|
#
|
||
|
|
"Nightly" )
|
||
|
|
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
[[ -z $scripted ]] &&
|
||
|
|
dialog --colors --title " \Z1Warning\Z0 " --backtitle "$BACKTITLE" --yes-label "Yes" \
|
||
|
|
--no-label "No" --yesno \
|
||
|
|
"\nYou are switching to an untested auto-build repository which might break your system.\n\nContinue?" 10 48
|
||
|
|
|
||
|
|
if [[ $? = 0 || -n $scripted ]]; then
|
||
|
|
sed -i 's/^deb http:\/\/[^ ]*/deb http:\/\/beta.armbian.com/' /etc/apt/sources.list.d/armbian.list
|
||
|
|
reload_bsp $branch
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Switch to stable builds
|
||
|
|
#
|
||
|
|
"Stable" )
|
||
|
|
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
[[ -z $scripted ]] &&
|
||
|
|
dialog --colors --title " \Z1Warning\Z0 " --backtitle "$BACKTITLE" --yes-label "Yes" \
|
||
|
|
--no-label "No" --yesno \
|
||
|
|
"\nYou are switching to a stable repository where you will receive future updates.\n\nContinue?" 9 44
|
||
|
|
|
||
|
|
if [[ $? = 0 || -n $scripted ]]; then
|
||
|
|
sed -i 's/^deb http:\/\/beta/deb http:\/\/apt/' /etc/apt/sources.list.d/armbian.list
|
||
|
|
reload_bsp $branch
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
;;
|
||
|
|
|
||
|
|
# Switch to alternative configurations
|
||
|
|
#
|
||
|
|
"DTB" )
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
aval_dtbs
|
||
|
|
if [[ $exitstatus = 0 ]]; then
|
||
|
|
BOX_LENGTH=$((${#TARGET_BOARD}+28));
|
||
|
|
dialog --title "Switching board config" --backtitle "$BACKTITLE" --yes-label "Reboot" --no-label "Cancel" --yesno "\nReboot to $TARGET_BOARD settings?" 7 $BOX_LENGTH
|
||
|
|
if [[ $? = 0 ]]; then
|
||
|
|
sed -i "s/^fdt_file=.*/fdt_file=$TARGET_BOARD/" /boot/orangepiEnv.txt 2> /dev/null && grep -q "fdt_file=$TARGET_BOARD" /boot/orangepiEnv.txt 2> /dev/null || echo "fdt_file=$TARGET_BOARD" >> /boot/orangepiEnv.txt
|
||
|
|
[[ "$LINUXFAMILY" = odroidxu4 ]] && sed -i "s/^fdt_file/board_name/" /boot/orangepiEnv.txt && sed -i "s/^BOARD_NAME.*/BOARD_NAME=\"Odroid ${TARGET_BOARD^^}\"/" /etc/orangepi-release
|
||
|
|
reboot;
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
# Toggle virtual read-only root filesystem
|
||
|
|
#
|
||
|
|
"Overlayroot" )
|
||
|
|
#if ! is_package_manager_running; then
|
||
|
|
# if [[ -n $(mount | grep -w overlay | grep -v chromium) ]]; then
|
||
|
|
# 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 && \
|
||
|
|
# overlayroot-chroot rm /etc/update-motd.d/97-overlayroot && reboot
|
||
|
|
# else
|
||
|
|
# debconf-apt-progress -- apt-get -o Dpkg::Options::="--force-confnew" -y --no-install-recommends install overlayroot
|
||
|
|
# echo '#!/bin/bash' > /etc/update-motd.d/97-overlayroot
|
||
|
|
# echo 'if [ -n "$(mount | grep -w tmpfs-root)" ]; then \
|
||
|
|
# echo -e "[\e[0m \e[1mremember: your system is in virtual read only mode\e[0m ]\n";fi' >> /etc/update-motd.d/97-overlayroot
|
||
|
|
# chmod +x /etc/update-motd.d/97-overlayroot
|
||
|
|
# dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
# --no-label "Cancel" --yesno "\nEnable virtual read-only root and reboot." 7 45
|
||
|
|
# [[ ! -f /etc/overlayroot.conf ]] && cp /etc/overlayroot.conf.dpkg-new /etc/overlayroot.conf
|
||
|
|
# [[ $? = 0 ]] && sed -i "s/^overlayroot=.*/overlayroot=\"tmpfs\"/" /etc/overlayroot.conf && reboot
|
||
|
|
# fi
|
||
|
|
#fi
|
||
|
|
|
||
|
|
CONFIG_FILE="/etc/overlayroot.conf"
|
||
|
|
|
||
|
|
if findmnt -n -o SOURCE / | grep -q "overlayroot"; then
|
||
|
|
CONFIG_FILE="/media/root-ro/etc/overlayroot.conf"
|
||
|
|
OVERLAY_ACTIVE=1
|
||
|
|
else
|
||
|
|
if ! is_package_manager_running; then
|
||
|
|
if ! dpkg -l | grep -q "overlayroot"; then
|
||
|
|
debconf-apt-progress -- apt-get update
|
||
|
|
if [[ "$DISTROID" == "bookworm" ]]; then
|
||
|
|
cat <<-'EOF' > /usr/share/initramfs-tools/hooks/custom
|
||
|
|
cp /bin/grep "${DESTDIR}"/bin
|
||
|
|
cp /bin/mount "${DESTDIR}"/bin
|
||
|
|
cp /lib/aarch64-linux-gnu/libmount.so.1 "${DESTDIR}"/lib
|
||
|
|
EOF
|
||
|
|
chmod +x /usr/share/initramfs-tools/hooks/custom
|
||
|
|
export PATH=$PATH:/usr/sbin
|
||
|
|
update-initramfs -u > /dev/null 2>&1
|
||
|
|
fi
|
||
|
|
apt -y install overlayroot > /dev/null 2>&1
|
||
|
|
[[ ! $? == 0 ]] && apt remove --purge -y overlayroot >/dev/null 2>&1 && return
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
OVERLAY_ACTIVE=0
|
||
|
|
fi
|
||
|
|
|
||
|
|
CURRENT_MODE="none"
|
||
|
|
CURRENT_DEVICE="N/A"
|
||
|
|
|
||
|
|
if grep -q '^overlayroot="tmpfs"' "$CONFIG_FILE" 2>/dev/null; then
|
||
|
|
CURRENT_MODE="tmpfs"
|
||
|
|
elif grep -q '^overlayroot="device:dev=' "$CONFIG_FILE" 2>/dev/null; then
|
||
|
|
CURRENT_MODE="block"
|
||
|
|
CURRENT_DEVICE=$(grep -oP '(?<=overlayroot="device:dev=).*?(?=")' "$CONFIG_FILE")
|
||
|
|
elif grep -q '^overlayroot=""' "$CONFIG_FILE" 2>/dev/null; then
|
||
|
|
CURRENT_MODE="none"
|
||
|
|
fi
|
||
|
|
|
||
|
|
ALL_PARTITIONS=$(lsblk -lnp -o NAME,TYPE | awk '$2=="part" {print $1}' | grep -E '/dev/(mmcblk|nvme|sd)')
|
||
|
|
MOUNTED_PARTITIONS=$(findmnt -n -o SOURCE)
|
||
|
|
ROOT_SOURCE=$(findmnt -n -o SOURCE /)
|
||
|
|
[[ $OVERLAY_ACTIVE == "1" ]] && ROOT_SOURCE=$(findmnt -n -o SOURCE /media/root-ro)
|
||
|
|
ROOT_DEVICE=${ROOT_SOURCE%%p*}
|
||
|
|
ROOT_PARTITION=${ROOT_SOURCE##*p}
|
||
|
|
MENU_OPTIONS=()
|
||
|
|
for PART in $ALL_PARTITIONS; do
|
||
|
|
if ! grep -q "$PART" <<< "$MOUNTED_PARTITIONS"; then
|
||
|
|
DEVICE_NAME=$(echo "$PART" | sed -E 's/p[0-9]+$//')
|
||
|
|
PARTITION_NUMBER=$(echo "$PART" | grep -o '[0-9]*$')
|
||
|
|
|
||
|
|
if [[ "$DEVICE_NAME" == "$ROOT_DEVICE" && "$PARTITION_NUMBER" -gt "$ROOT_PARTITION" ]]; then
|
||
|
|
MENU_OPTIONS+=("$PART" "Available partition")
|
||
|
|
elif [[ "$DEVICE_NAME" != "$ROOT_DEVICE" ]]; then
|
||
|
|
MENU_OPTIONS+=("$PART" "Available partition")
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
|
||
|
|
NEW_PART="${ROOT_DEVICE}p$((ROOT_PARTITION + 1))"
|
||
|
|
if ! grep -q "$NEW_PART" <<< "$ALL_PARTITIONS"; then
|
||
|
|
MENU_OPTIONS+=("$NEW_PART" "Potential new partition (p$((ROOT_PARTITION + 1)))")
|
||
|
|
fi
|
||
|
|
|
||
|
|
MENU_ITEMS=(
|
||
|
|
"none" "disable overlayroot $( [ "$CURRENT_MODE" = "none" ] && echo "(active)" )"
|
||
|
|
"tmpfs" "tmpfs mode $( [ "$CURRENT_MODE" = "tmpfs" ] && echo "(active)" )"
|
||
|
|
"block" "block device mode $( [ "$CURRENT_MODE" = "block" ] && echo "(active: $CURRENT_DEVICE)" )"
|
||
|
|
)
|
||
|
|
CHOICE=$(dialog --clear --title "Overlayroot Configuration" --default-item "$CURRENT_MODE" \
|
||
|
|
--menu "\nChoose the storage mode:" 12 60 3 "${MENU_ITEMS[@]}" 3>&1 1>&2 2>&3)
|
||
|
|
|
||
|
|
clear
|
||
|
|
|
||
|
|
if [ "$OVERLAY_ACTIVE" -eq 1 ]; then
|
||
|
|
#echo "Remounting /media/root-ro as read-write..."
|
||
|
|
mount -o remount,rw /media/root-ro
|
||
|
|
fi
|
||
|
|
|
||
|
|
case "$CHOICE" in
|
||
|
|
"none")
|
||
|
|
sed -i "s/^overlayroot=.*/overlayroot=\"\"/" "$CONFIG_FILE"
|
||
|
|
if ! grep -q "overlayroot" "$CONFIG_FILE"; then echo "overlayroot=\"\"" >> "$CONFIG_FILE"; fi
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nDisable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
;;
|
||
|
|
"tmpfs")
|
||
|
|
sed -i "s/^overlayroot=.*/overlayroot=\"$CHOICE\"/" "$CONFIG_FILE"
|
||
|
|
if ! grep -q "overlayroot" "$CONFIG_FILE"; then echo "overlayroot=$CHOICE" >> "$CONFIG_FILE"; fi
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nEnable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
;;
|
||
|
|
"block")
|
||
|
|
if [ ${#MENU_OPTIONS[@]} -eq 0 ]; then
|
||
|
|
DEVICE=$(dialog --inputbox "No available partitions detected.\nEnter a block device path manually:" 10 50 "/dev/mmcblk0p2" 3>&1 1>&2 2>&3)
|
||
|
|
else
|
||
|
|
DEVICE=$(dialog --menu "Select a block device for storage:" 10 60 5 "${MENU_OPTIONS[@]}" 3>&1 1>&2 2>&3)
|
||
|
|
fi
|
||
|
|
clear
|
||
|
|
if [ -n "$DEVICE" ]; then
|
||
|
|
sed -i "s|^overlayroot=.*|overlayroot=\"device:dev=$DEVICE\"|" "$CONFIG_FILE"
|
||
|
|
if ! grep -q "overlayroot" "$CONFIG_FILE"; then echo "overlayroot=\"device:dev=$DEVICE\"" >> "$CONFIG_FILE"; fi
|
||
|
|
sync
|
||
|
|
#echo "Overlayroot set to block device mode using $DEVICE."
|
||
|
|
|
||
|
|
if [ "$DEVICE" = "$NEW_PART" ]; then
|
||
|
|
|
||
|
|
if [[ -b "$DEVICE" ]]; then
|
||
|
|
if [[ "$(lsblk -no FSTYPE $DEVICE)" != "ext4" ]]; then
|
||
|
|
dialog --yesno "Warning: format $DEVICE as ext4? This will erase all data." 10 50
|
||
|
|
[[ $? -eq 0 ]] && yes|mkfs.ext4 "$DEVICE"
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nEnable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
else
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nEnable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
fi
|
||
|
|
return
|
||
|
|
fi
|
||
|
|
|
||
|
|
dialog --yesno "Warning: Creating a new partition ($DEVICE) may destroy existing data." 10 50
|
||
|
|
[[ ! $? -eq 0 ]] && return
|
||
|
|
rootfs_size=$(df -BM | grep ^/dev | head -1 | awk '{print $3}' | tr -cd '[0-9]. \n')
|
||
|
|
sdsize=$(bc -l <<< "scale=0; ((($rootfs_size * 2) / 1 + 0) / 4 + 1) * 4")
|
||
|
|
#echo "sdsize: $sdsize"
|
||
|
|
rootsource=$ROOT_SOURCE
|
||
|
|
rootdevice=${rootsource%p*}
|
||
|
|
partitions=${rootsource##*p}
|
||
|
|
lastsector=$(fdisk -l ${rootdevice} |grep "Disk ${rootdevice}" |awk '{print $7}')
|
||
|
|
lastsector=$(( $lastsector - 1024 ))
|
||
|
|
startfrom=$(fdisk -l ${rootdevice} |grep ${rootsource} |awk '{print $2}')
|
||
|
|
partend=$(fdisk -l ${rootdevice} |grep ${rootsource} |awk '{print $3}')
|
||
|
|
new_part_size=$(($sdsize * 1024 * 1024 / 512))
|
||
|
|
new_partend=$((${new_part_size} + ${startfrom} -1))
|
||
|
|
new_partstart=$((${new_partend}+1))
|
||
|
|
LOOP=$(losetup -f)
|
||
|
|
losetup ${LOOP} ${rootsource}
|
||
|
|
e2fsck -f -y ${LOOP}
|
||
|
|
resize2fs ${LOOP} $((${new_part_size} / 8))
|
||
|
|
(echo d; echo $partitions; echo n; echo p; echo ; echo $startfrom; echo $new_partend ; echo w;)| fdisk $rootdevice
|
||
|
|
(echo n; echo p; echo ;echo $new_partstart; echo $lastsector; echo w;)| fdisk $rootdevice
|
||
|
|
e2fsck -f -y ${LOOP}
|
||
|
|
yes |mkfs.ext4 $DEVICE
|
||
|
|
sync
|
||
|
|
losetup -d ${LOOP}
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nEnable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
|
||
|
|
else
|
||
|
|
#if [[ "$(lsblk -no FSTYPE /dev/sda2)" != "ext4" ]]; then
|
||
|
|
dialog --yesno "Warning: format $DEVICE as ext4? This will erase all data." 10 50
|
||
|
|
[[ $? -eq 0 ]] && yes|mkfs.ext4 "$DEVICE"
|
||
|
|
dialog --title "Root overlay" --backtitle "$BACKTITLE" --yes-label "Reboot" \
|
||
|
|
--no-label "Cancel" --yesno "\nEnable overlayroot and reboot." 7 45
|
||
|
|
[[ $? == 0 ]] && reboot
|
||
|
|
#fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
else
|
||
|
|
:
|
||
|
|
fi
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
:
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
sync
|
||
|
|
;;
|
||
|
|
|
||
|
|
|
||
|
|
esac
|
||
|
|
|
||
|
|
|
||
|
|
[[ -n $scripted ]] && exit
|
||
|
|
}
|