diff --git a/.build/images/dietpi-build b/.build/images/dietpi-build
index 17f17785dd..5de5354459 100755
--- a/.build/images/dietpi-build
+++ b/.build/images/dietpi-build
@@ -131,6 +131,7 @@ case $HW_MODEL in
84) iname='Star64' HW_ARCH=11 root_size=639;;
85) iname='ROCK5A' HW_ARCH=3 PTTYPE='gpt' partition_start=16 root_size=752;;
86) iname='ASUSTB2' HW_ARCH=3 partition_start=16 root_size=752;;
+ 87) iname='OrangePi3B' HW_ARCH=3 PTTYPE='gpt' partition_start=16 root_size=880;;
*) G_DIETPI-NOTIFY 1 "Invalid hardware model \"$HW_MODEL\" passed, aborting..."; exit 1;;
esac
@@ -595,10 +596,10 @@ _EOF_
G_CONFIG_INJECT 'AUTO_SETUP_AUTOSTART_TARGET_INDEX=' 'AUTO_SETUP_AUTOSTART_TARGET_INDEX=0' rootfs/boot/dietpi.txt
# Force ARMv6 arch on Raspbian
- (( $HW_ARCH == 1 )) && echo 'sed -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh
+ (( $HW_ARCH == 1 )) && echo 'sed --follow-symlinks -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh
# Temporary fix for failing NAA Daemon install on Trixie
- (( $DISTRO == 8 )) && G_EXEC sed -i '\|www.signalyst.eu|s|bookworm/bullseye|trixie/bullseye|' rootfs/boot/dietpi/dietpi-software
+ (( $DISTRO == 8 )) && G_EXEC sed --follow-symlinks -i '\|www.signalyst.eu|s|bookworm/bullseye|trixie/bullseye|' rootfs/boot/dietpi/dietpi-software
# Skip filesystem expansion
G_EXEC rm rootfs/etc/systemd/system/local-fs.target.wants/dietpi-fs_partition_resize.service
@@ -627,7 +628,7 @@ then
systemctl mask serial-getty@ttyS0
/boot/dietpi/func/dietpi-set_hardware serialconsole 1 serial0
G_CONFIG_INJECT 'temp_limit=' 'temp_limit=75' /boot/config.txt # since most RPis are now RPi 4 and Allo ships the CM3 with USBridge Sig and Allo GUI image
- G_EXEC sed -Ei 's/^(arm_freq|over_voltage)=/#\1=/' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei 's/^(arm_freq|over_voltage)=/#\1=/' /boot/config.txt
fi
# FirstBoot
@@ -658,7 +659,7 @@ G_EXEC rm /etc/bashrc.d/00-dietpi-build.sh /boot/Automation_Custom_Script.sh
poweroff
}
_EOF_
- (( $HW_ARCH == 1 )) && G_EXEC sed -i 's/Custom_Script/Custom_{Pre,}Script/' rootfs/boot/Automation_Custom_Script.sh
+ (( $HW_ARCH == 1 )) && G_EXEC sed --follow-symlinks -i 's/Custom_Script/Custom_{Pre,}Script/' rootfs/boot/Automation_Custom_Script.sh
# Start container
# - Bind mounts required to allow container reading its own drive info, /dev/disk for GRUB and probably other tools to detect UUIDs
@@ -1053,37 +1054,14 @@ then
[[ -x 'upload.sh' ]] && G_EXEC_OUTPUT=1 G_EXEC ./upload.sh "$image_name.vhdx.xz"{,.sha256} "${signature[@]}" && G_EXEC rm "$image_name.vhdx.xz"{,.sha256} "${signature[@]}"
fi
-####### Proxmox ############################
-if [[ $VMTYPE =~ ^(proxmox|all)$ ]]
-then
- image_name=${OUTPUT_IMG_NAME/_VM-/_Proxmox-}
- # Convert raw image to QCOW2
- G_EXEC qemu-img convert -c -O qcow2 "$OUTPUT_IMG_NAME.img" "$image_name.qcow2"
-
- # Keep QCOW2 in compression when UTM appliance shall be generated from it as well.
- keep=()
- [[ $VMTYPE == 'all' ]] && keep=('-k')
-
- G_EXEC_DESC='Creating Proxmox xz archive' G_EXEC xz -9e "${limit_threads[@]}" "${keep[@]}" "$image_name.qcow2"
- G_EXEC_DESC='Generating SHA256 hash' G_EXEC eval "sha256sum '$image_name.qcow2.xz' > '$image_name.qcow2.xz.sha256'"
- signature=()
- [[ $SIGN_PASS ]] && { G_DIETPI-NOTIFY 2 'Signing archive ...'; gpg --batch --pinentry-mode loopback --passphrase "$SIGN_PASS" -b --armor "$image_name.qcow2.xz" || exit 1; signature=("$image_name.qcow2.xz.asc"); }
- [[ -x 'upload.sh' ]] && G_EXEC_OUTPUT=1 G_EXEC ./upload.sh "$image_name.qcow2.xz"{,.sha256} "${signature[@]}" && G_EXEC rm "$image_name.qcow2.xz"{,.sha256} "${signature[@]}"
-fi
-
####### UTM ##############################
if [[ $VMTYPE =~ ^(utm|all)$ ]]
then
image_name=${OUTPUT_IMG_NAME/_VM-/_UTM-}
# Create directory which is interpreted as VM appliance file on macOS
G_EXEC mkdir -p "$image_name.utm/Images"
- # Reuse or convert raw image to QCOW2
- if [[ $VMTYPE == 'all' ]]
- then
- G_EXEC mv "${OUTPUT_IMG_NAME/_VM-/_Proxmox-}.qcow2" "$image_name.utm/Images/data.qcow2"
- else
- G_EXEC qemu-img convert -c -O qcow2 "$OUTPUT_IMG_NAME.img" "$image_name.utm/Images/data.qcow2"
- fi
+ # Convert raw image to QCOW2
+ G_EXEC qemu-img convert -c -O qcow2 "$OUTPUT_IMG_NAME.img" "$image_name.utm/Images/data.qcow2"
# Generate random MAC address and UUID for VM
mac=$(tr -dc '0-9A-F' < /dev/urandom | head -c10 | sed -E 's/(..)/\1:/g;s/:$//;s/^/02:/') # ToDo: Beginning with "D2:"?
vmuuid=$( '$image_name.qcow2.xz.sha256'"
+ signature=()
+ [[ $SIGN_PASS ]] && { G_DIETPI-NOTIFY 2 'Signing archive ...'; gpg --batch --pinentry-mode loopback --passphrase "$SIGN_PASS" -b --armor "$image_name.qcow2.xz" || exit 1; signature=("$image_name.qcow2.xz.asc"); }
+ [[ -x 'upload.sh' ]] && G_EXEC_OUTPUT=1 G_EXEC ./upload.sh "$image_name.qcow2.xz"{,.sha256} "${signature[@]}" && G_EXEC rm "$image_name.qcow2.xz"{,.sha256} "${signature[@]}"
+fi
+
# Cleanup
G_EXEC rm "$OUTPUT_IMG_NAME.img"
diff --git a/.build/images/dietpi-imager b/.build/images/dietpi-imager
index 5679df1b30..e69025bf47 100755
--- a/.build/images/dietpi-imager
+++ b/.build/images/dietpi-imager
@@ -667,7 +667,7 @@ _EOF_
sed '/^menuentry /,$d' tmpiso/boot/grub/clonezilla.cfg > tmpiso/boot/grub/grub.cfg
sed -n '/menuentry .*Safe graphic/,/}/s/^ //p' tmpiso/boot/grub/clonezilla.cfg >> tmpiso/boot/grub/grub.cfg
# shellcheck disable=SC2016
- sed -i -e '/^set timeout=/c\set timeout="-1"' -e '/^set pref=/a\set theme=\$pref/theme.txt' -e '/^menuentry /c\menuentry "Install DietPi" {' \
+ sed --follow-symlinks -i -e '/^set timeout=/c\set timeout="-1"' -e '/^set pref=/a\set theme=\$pref/theme.txt' -e '/^menuentry /c\menuentry "Install DietPi" {' \
-e 's/locales= /locales=C.UTF-8 /' -e 's/keyboard-layouts= /keyboard-layouts=gb /' -e 's/ocs-live-general/ocs-live-restore/' \
-e "s|ocs_live_extra_param=\"\"|ocs_live_extra_param=\"-icds -k1 -r -e2 -j2 -b -p poweroff restoredisk $OUTPUT_IMG_NAME ask_user\"|" \
-e 's/ocs_live_batch="no"/ocs_live_batch="yes"/' tmpiso/boot/grub/grub.cfg
@@ -680,10 +680,10 @@ _EOF_
G_EXEC curl -sSf "$DIETPI_REPO/.build/images/Clonezilla/dietpi-background_480p.png" -o tmpiso/syslinux/dietpibg.png
G_EXEC cp /usr/lib/syslinux/modules/bios/poweroff.c32 tmpiso/syslinux/
G_EXEC mv tmpiso/syslinux/{syslinux,clonezilla}.cfg
- sed -i '/^MENU TITLE/c\MENU TITLE Clonezilla live' tmpiso/syslinux/clonezilla.cfg
+ sed --follow-symlinks -i '/^MENU TITLE/c\MENU TITLE Clonezilla live' tmpiso/syslinux/clonezilla.cfg
sed '/^label /,$d' tmpiso/syslinux/clonezilla.cfg > tmpiso/syslinux/syslinux.cfg
sed -n '/^label .*framebuffer/,/ENDTEXT/p' tmpiso/syslinux/clonezilla.cfg >> tmpiso/syslinux/syslinux.cfg
- sed -i -e '/^timeout /c\timeout 0' -e 's|\(MENU BACKGROUND\) .*|\1 dietpibg.png|' -e '/^MENU TITLE /c\MENU TABMSG' \
+ sed --follow-symlinks -i -e '/^timeout /c\timeout 0' -e 's|\(MENU BACKGROUND\) .*|\1 dietpibg.png|' -e '/^MENU TITLE /c\MENU TABMSG' \
-e '/menu title/d' -e '/^say /d' -e '/MENU MARGIN/a\MENU HSHIFT 80\n MENU COLOR BORDER 0 #00000000 #00000000 none' \
-e '/^label /c\label Install DietPi' -e '/^ MENU LABEL /c\ MENU LABEL Install DietPi' -e '/^ TEXT HELP/,/^ ENDTEXT/d' \
-e 's/locales= /locales=C.UTF-8 /' -e 's/keyboard-layouts= /keyboard-layouts=gb /' -e 's/ocs-live-general/ocs-live-restore/' \
diff --git a/.build/images/dietpi-installer b/.build/images/dietpi-installer
index 78bed75eeb..7007969c45 100755
--- a/.build/images/dietpi-installer
+++ b/.build/images/dietpi-installer
@@ -388,6 +388,7 @@ _EOF_
'77' ': ROCK 3A'
'78' ': ROCK 5B'
'85' ': ROCK 5A'
+ '87' ': Orange Pi 3B'
'80' ': Orange Pi 5'
'82' ': Orange Pi 5 Plus'
'83' ': Orange Pi Zero 3'
@@ -578,15 +579,15 @@ _EOF_
local model='OdroidC1'
(( $G_HW_MODEL == 11 )) && model='OdroidXU4'
G_EXEC mv "DietPi-$G_GITBRANCH/.build/images/$model/boot.ini" /boot/boot.ini
- G_EXEC sed -i "s/root=[^[:blank:]]*/root=UUID=$(findmnt -Ufnro UUID -M /)/" /boot/boot.ini
- G_EXEC sed -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/boot.ini
+ G_EXEC sed --follow-symlinks -i "s/root=[^[:blank:]]*/root=UUID=$(findmnt -Ufnro UUID -M /)/" /boot/boot.ini
+ G_EXEC sed --follow-symlinks -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/boot.ini
G_EXEC mkdir -p /etc/kernel/post{inst,rm}.d /etc/initramfs/post-update.d
G_EXEC mv "DietPi-$G_GITBRANCH/.build/images/U-Boot/dietpi-initramfs_cleanup" /etc/kernel/postinst.d/dietpi-initramfs_cleanup
G_EXEC ln -sf /etc/kernel/post{inst,rm}.d/dietpi-initramfs_cleanup
G_EXEC mv "DietPi-$G_GITBRANCH/.build/images/U-Boot/99-dietpi-uboot" /etc/initramfs/post-update.d/99-dietpi-uboot
- G_EXEC sed -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot
+ G_EXEC sed --follow-symlinks -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot
- elif [[ $G_HW_MODEL =~ ^(12|15|16|40|42|43|44|45|46|47|48|52|54|55|56|57|58|59|60|62|63|64|65|66|67|68|72|73|74|77|78|80|82|83|85|86)$ ]]
+ elif [[ $G_HW_MODEL =~ ^(12|15|16|40|42|43|44|45|46|47|48|52|54|55|56|57|58|59|60|62|63|64|65|66|67|68|72|73|74|77|78|80|82|83|85|86|87)$ ]]
then
armbian_repo=1
G_EXEC mv "DietPi-$G_GITBRANCH/.build/images/U-Boot/boot.cmd" /boot/boot.cmd
@@ -600,36 +601,36 @@ _EOF_
# Odroid C2: Fix USB device detection: https://github.com/MichaIng/DietPi/issues/5963
if (( $G_HW_MODEL == 12 ))
then
- G_EXEC sed -i 's/coherent_pool=2M/coherent_pool=2M usbcore.autosuspend=-1/' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i 's/coherent_pool=2M/coherent_pool=2M usbcore.autosuspend=-1/' /boot/boot.cmd
# Odroid N2/HC4
elif [[ $G_HW_MODEL =~ ^(15|16)$ ]]
then
# Enable USB boot via petitboot support: https://github.com/MichaIng/DietPi/issues/5634
- G_EXEC sed -i '1i[main]' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i '1i[main]' /boot/dietpiEnv.txt
# shellcheck disable=SC2016
- (( $G_HW_MODEL == 15 )) && G_EXEC sed -i '/^setenv overlay_error/a\
+ (( $G_HW_MODEL == 15 )) && G_EXEC sed --follow-symlinks -i '/^setenv overlay_error/a\
\n# petitboot workarounds\
if test "${variant}" = "n2_plus"; then setenv variant "n2-plus"; fi\
setenv fdtfile "amlogic/meson-g12b-odroid-${variant}.dtb"\
setenv rootuuid "true"' /boot/boot.cmd
# shellcheck disable=SC2016
- (( $G_HW_MODEL == 16 )) && G_EXEC sed -i '/^setenv overlay_error/a\
+ (( $G_HW_MODEL == 16 )) && G_EXEC sed --follow-symlinks -i '/^setenv overlay_error/a\
\n# petitboot workarounds\
setenv fdtfile "amlogic/meson-sm1-odroid-${variant}.dtb"\
setenv rootuuid "true"' /boot/boot.cmd
# shellcheck disable=SC2016
- G_EXEC sed -i '/env import/c\ ini main ${scriptaddr} || env import -t ${scriptaddr} ${filesize}' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i '/env import/c\ ini main ${scriptaddr} || env import -t ${scriptaddr} ${filesize}' /boot/boot.cmd
# shellcheck disable=SC2016
- G_EXEC sed -i '/test -e/s/fixup.scr;/fixup.scr || test "${petitboot_active}" = "1";/' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i '/test -e/s/fixup.scr;/fixup.scr || test "${petitboot_active}" = "1";/' /boot/boot.cmd
# Odroid N2: Assure that hardware random generator driver is loaded as early as possible to prevent rngd failures: https://github.com/MichaIng/DietPi/issues/6483
(( $G_HW_MODEL == 15 )) && G_EXEC eval 'echo '\''meson_rng'\'' > /etc/modules-load.d/dietpi-hwrng.conf'
# Rockchip 64-bit (configs work with Amlogic OOTB)
- elif [[ $G_HW_MODEL =~ ^(42|43|46|47|55|56|58|68|72|73|77|78|80|82|85|86)$ ]]
+ elif [[ $G_HW_MODEL =~ ^(42|43|46|47|55|56|58|68|72|73|77|78|80|82|85|86|87)$ ]]
then
- G_EXEC sed -Ei '/^setenv (kernel|fdt)_addr_r/d' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -Ei '/^setenv (kernel|fdt)_addr_r/d' /boot/boot.cmd
G_CONFIG_INJECT 'setenv scriptaddr ' 'setenv scriptaddr "0x9000000"' /boot/boot.cmd
G_CONFIG_INJECT 'overlay_path=' 'overlay_path=rockchip' /boot/dietpiEnv.txt
case $G_HW_MODEL in
@@ -645,34 +646,35 @@ setenv rootuuid "true"' /boot/boot.cmd
77) G_CONFIG_INJECT 'fdtfile=' 'fdtfile=rockchip/rk3568-rock-3a.dtb' /boot/dietpiEnv.txt;;
78) G_CONFIG_INJECT 'fdtfile=' 'fdtfile=rockchip/rk3588-rock-5b.dtb' /boot/dietpiEnv.txt;;
85) G_CONFIG_INJECT 'fdtfile=' 'fdtfile=rockchip/rk3588s-rock-5a.dtb' /boot/dietpiEnv.txt;;
+ 87) G_CONFIG_INJECT 'fdtfile=' 'fdtfile=rockchip/rk3566-orangepi-3b.dtb' /boot/dietpiEnv.txt;;
*) :;;
esac
case $G_HW_MODEL in
73) G_CONFIG_INJECT 'consoleargs=' 'consoleargs=console=ttyS0,1500000' /boot/dietpiEnv.txt;; # headless
47|55|56) G_CONFIG_INJECT 'consoleargs=' 'consoleargs=console=ttyS2,1500000' /boot/dietpiEnv.txt;; # headless
- 78|80|82) G_EXEC sed -i 's/ttyAML0,115200/ttyFIQ0,1500000/' /boot/dietpiEnv.txt;;
- *) G_EXEC sed -i 's/ttyAML0,115200/ttyS2,1500000/' /boot/dietpiEnv.txt;;
+ 78|80|82) G_EXEC sed --follow-symlinks -i 's/ttyAML0,115200/ttyFIQ0,1500000/' /boot/dietpiEnv.txt;;
+ *) G_EXEC sed --follow-symlinks -i 's/ttyAML0,115200/ttyS2,1500000/' /boot/dietpiEnv.txt;;
esac
# ASUS Tinker Board (32-bit)
elif (( $G_HW_MODEL == 52 ))
then
- G_EXEC sed -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot /boot/boot.cmd
- G_EXEC sed -Ei '/^setenv (kernel_addr_r|fdt_addr_r|overlay_path)/d' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -Ei '/^setenv (kernel_addr_r|fdt_addr_r|overlay_path)/d' /boot/boot.cmd
G_CONFIG_INJECT 'setenv scriptaddr ' 'setenv scriptaddr "0x39000000"' /boot/boot.cmd
G_CONFIG_INJECT 'setenv ramdisk_addr_r ' 'setenv ramdisk_addr_r "0x21000000"' /boot/boot.cmd '^setenv scriptaddr'
# shellcheck disable=SC2016
- G_EXEC sed -i -e 's|\${prefix}Image|${prefix}zImage|' -e 's/booti/bootz/' -e 's|\${overlay_path}/||' /boot/boot.cmd
- G_EXEC sed -i '/^overlay_path/d' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i -e 's|\${prefix}Image|${prefix}zImage|' -e 's/booti/bootz/' -e 's|\${overlay_path}/||' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i '/^overlay_path/d' /boot/dietpiEnv.txt
G_CONFIG_INJECT 'overlay_prefix=' 'overlay_prefix=rockchip' /boot/dietpiEnv.txt
G_CONFIG_INJECT 'overlays=' 'overlays=uart2' /boot/dietpiEnv.txt
# ASUS Tinker Board: https://github.com/MichaIng/DietPi/issues/5554
- G_EXEC sed -i -e 's/ttyAML0/ttyS2/' -e '/^extraargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i -e 's/ttyAML0/ttyS2/' -e '/^extraargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/dietpiEnv.txt
# Allwinner 64-bit
elif [[ $G_HW_MODEL =~ ^(40|44|45|57|65|67|83)$ ]]
then
- G_EXEC sed -Ei '/^setenv (kernel|fdt)_addr_r/d' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -Ei '/^setenv (kernel|fdt)_addr_r/d' /boot/boot.cmd
G_CONFIG_INJECT 'setenv scriptaddr ' 'setenv scriptaddr "0x45000000"' /boot/boot.cmd
G_CONFIG_INJECT 'overlay_path=' 'overlay_path=allwinner' /boot/dietpiEnv.txt
case $G_HW_MODEL in
@@ -693,18 +695,18 @@ setenv rootuuid "true"' /boot/boot.cmd
esac
case $G_HW_MODEL in
57|65) G_CONFIG_INJECT 'consoleargs=' 'consoleargs=console=ttyS0,115200' /boot/dietpiEnv.txt;; # headless
- *) G_EXEC sed -i 's/ttyAML0/ttyS0/' /boot/dietpiEnv.txt;;
+ *) G_EXEC sed --follow-symlinks -i 's/ttyAML0/ttyS0/' /boot/dietpiEnv.txt;;
esac
# Allwinner H3 (32-bit)
elif [[ $G_HW_MODEL =~ ^(48|59|60|63|64|66)$ ]]
then
- G_EXEC sed -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot /boot/boot.cmd
- G_EXEC sed -Ei '/^setenv (kernel_addr_r|fdt_addr_r|overlay_path)/d' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i 's/arm64/arm/' /etc/initramfs/post-update.d/99-dietpi-uboot /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -Ei '/^setenv (kernel_addr_r|fdt_addr_r|overlay_path)/d' /boot/boot.cmd
G_CONFIG_INJECT 'setenv scriptaddr ' 'setenv scriptaddr "0x45000000"' /boot/boot.cmd
# shellcheck disable=SC2016
- G_EXEC sed -i -e 's|\${prefix}Image|${prefix}zImage|' -e 's/booti/bootz/' -e 's|\${overlay_path}/||' /boot/boot.cmd
- G_EXEC sed -i '/^overlay_path/d' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i -e 's|\${prefix}Image|${prefix}zImage|' -e 's/booti/bootz/' -e 's|\${overlay_path}/||' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i '/^overlay_path/d' /boot/dietpiEnv.txt
G_CONFIG_INJECT 'overlay_prefix=' 'overlay_prefix=sun8i-h3' /boot/dietpiEnv.txt
case $G_HW_MODEL in
48) G_CONFIG_INJECT 'overlays=' 'overlays=usbhost1 usbhost2 uart1' /boot/dietpiEnv.txt;;
@@ -715,20 +717,20 @@ setenv rootuuid "true"' /boot/boot.cmd
case $G_HW_MODEL in
48) G_CONFIG_INJECT 'consoleargs=' 'consoleargs=console=ttyS1,115200' /boot/dietpiEnv.txt;; # headless
59|60|64) G_CONFIG_INJECT 'consoleargs=' 'consoleargs=console=ttyS0,115200' /boot/dietpiEnv.txt;; # headless
- *) G_EXEC sed -i 's/ttyAML0/ttyS0/' /boot/dietpiEnv.txt;;
+ *) G_EXEC sed --follow-symlinks -i 's/ttyAML0/ttyS0/' /boot/dietpiEnv.txt;;
esac
# NanoPi M3/T3/Fire3 (64-bit)
elif (( $G_HW_MODEL == 62 ))
then
G_EXEC mv "DietPi-$G_GITBRANCH/.build/images/NanoPiM3/boot.cmd" /boot/boot.cmd
- G_EXEC sed -i '/overlay/d' /boot/dietpiEnv.txt
- G_EXEC sed -i 's/ttyAML0/ttySAC0/' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i '/overlay/d' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i 's/ttyAML0/ttySAC0/' /boot/dietpiEnv.txt
fi
fi
# shellcheck disable=SC2016
- [[ -f '/etc/initramfs/post-update.d/99-dietpi-uboot' && $(findmnt -t vfat -M /boot) ]] && G_EXEC sed -i '/^ln -s/c\mv -v "/boot/uInitrd-$1" /boot/uInitrd' /etc/initramfs/post-update.d/99-dietpi-uboot # FAT does not support symlinks
+ [[ -f '/etc/initramfs/post-update.d/99-dietpi-uboot' && $(findmnt -t vfat -M /boot) ]] && G_EXEC sed --follow-symlinks -i '/^ln -s/c\mv -v "/boot/uInitrd-$1" /boot/uInitrd' /etc/initramfs/post-update.d/99-dietpi-uboot # FAT does not support symlinks
G_EXEC mv "DietPi-$G_GITBRANCH/dietpi.txt" /boot/
G_EXEC mv "DietPi-$G_GITBRANCH/README.md" /boot/dietpi-README.md
@@ -833,7 +835,6 @@ _EOF_
'locales' # Support locales, used by dietpi-config > Language/Regional Options > Locale
'mawk' # Minimal awk implementation
'nano' # Simple text editor
- 'p7zip' # .7z archiver
'parted' # partprobe + drive partitioning, used by DietPi-Drive_Manager
'procps' # "kill", "ps", "pgrep", "sysctl", used by several DietPi scripts
'psmisc' # "killall", used by several DietPi scripts
@@ -847,6 +848,14 @@ _EOF_
#'xz-utils' # (.tar).xz archiver
)
+ # - Trixie: 7zip now provides the same commands p7zip does, so we can do a smooth migration without adjusting commands across our scripts.
+ if (( $DISTRO_TARGET > 7 ))
+ then
+ aPACKAGES_REQUIRED_INSTALL+=('7zip')
+ else
+ aPACKAGES_REQUIRED_INSTALL+=('p7zip')
+ fi
+
# Install gdisk if root filesystem is on a GPT partition, used by DietPi-FS_partition_resize
local ROOT_DEVICE=$(findmnt -Ufnro SOURCE -M /)
[[ $(blkid -s PTTYPE -o value -c /dev/null "$(lsblk -npo PKNAME "$ROOT_DEVICE")") == 'gpt' ]] && aPACKAGES_REQUIRED_INSTALL+=('gdisk')
@@ -1064,6 +1073,7 @@ _EOF_
82) model='orangepi5-plus' kernel='rk35xx' branch='legacy';;
85) model='rock-5a' kernel='rk35xx' branch='legacy';;
86) model='tinkerboard-2' kernel='rockchip64';;
+ 87) model='orangepi3b' kernel='rockchip64'; branch='edge';;
*) :;;
esac
# Download and pre-install U-Boot hosted on dietpi.com where it has not been ported to the Armbian Bookworm repo or has been removed completely
@@ -1244,8 +1254,8 @@ _EOF_
done
G_EXEC_OUTPUT=1 G_EXEC dpkg -i package.deb
G_EXEC rm package.deb
- G_EXEC sed -i "s/root=[^[:blank:]]*/root=PARTUUID=$(findmnt -Ufnro PARTUUID -M /)/" /boot/extlinux/extlinux.conf
- G_EXEC sed -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/extlinux/extlinux.conf
+ G_EXEC sed --follow-symlinks -i "s/root=[^[:blank:]]*/root=PARTUUID=$(findmnt -Ufnro PARTUUID -M /)/" /boot/extlinux/extlinux.conf
+ G_EXEC sed --follow-symlinks -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/extlinux/extlinux.conf
aPACKAGES_REQUIRED_INSTALL+=('libubootenv-tool')
# Star64
@@ -1258,8 +1268,8 @@ _EOF_
done
G_EXEC_OUTPUT=1 G_EXEC dpkg -i package.deb
G_EXEC rm package.deb
- G_EXEC sed -i "s/root=[^[:blank:]]*/root=PARTUUID=$(findmnt -Ufnro PARTUUID -M /)/" /boot/extlinux/extlinux.conf
- G_EXEC sed -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/extlinux/extlinux.conf
+ G_EXEC sed --follow-symlinks -i "s/root=[^[:blank:]]*/root=PARTUUID=$(findmnt -Ufnro PARTUUID -M /)/" /boot/extlinux/extlinux.conf
+ G_EXEC sed --follow-symlinks -i "s/rootfstype=[^[:blank:]]*/rootfstype=$(findmnt -Ufnro FSTYPE -M /)/" /boot/extlinux/extlinux.conf
aPACKAGES_REQUIRED_INSTALL+=('libubootenv-tool')
# Orange Pi Zero 3
@@ -1285,7 +1295,7 @@ _EOF_
# Apply device tree adjustment for Ethernet adapter
# shellcheck disable=SC2016
- sed -i -e '/^setenv bootargs /s/"$/ ethernet_phy=${ethernet_phy}"/' -e '/^# Boot/i\
+ sed --follow-symlinks -i -e '/^setenv bootargs /s/"$/ ethernet_phy=${ethernet_phy}"/' -e '/^# Boot/i\
if test "${ethernet_phy}" = "rtl8211f"; then\
echo "Ethernet adapter: ${ethernet_phy}, adjusting device tree ..."\
fdt set "/soc/ethernet@5020000" "allwinner,rx-delay-ps" "<3100>"\
@@ -1311,9 +1321,6 @@ fi\
# Cleanup
[[ -f '/boot/orangepiEnv.txt' ]] && G_EXEC rm /boot/orangepiEnv.txt
- # Load WiFi and Bluetooth modules explicitly, as they do not load automatically, until DietPi v8.24 does it via dietpi-set_hardware
- G_EXEC eval 'echo -e '\''sprdwl_ng\nsprdbt_tty'\'' > /etc/modules-load.d/dietpi-enable_wifi.conf'
-
# Sparky SBC
elif (( $G_HW_MODEL == 70 ))
then
@@ -1738,7 +1745,7 @@ _EOF_
#-----------------------------------------------------------------------------------
# Bash Profiles
# - Enable /etc/bashrc.d/ support for custom interactive non-login shell scripts:
- sed -i '\#/etc/bashrc\.d/#d' /etc/bash.bashrc
+ sed --follow-symlinks -i '\#/etc/bashrc\.d/#d' /etc/bash.bashrc
# shellcheck disable=SC2016
echo 'for i in /etc/bashrc.d/*.sh /etc/bashrc.d/*.bash; do [ -r "$i" ] && . $i; done; unset -v i' >> /etc/bash.bashrc
# - Enable bash-completion for non-login shells:
@@ -1956,7 +1963,7 @@ _EOF_'
/boot/dietpi/func/dietpi-set_hardware serialconsole enable ttyGS0
# ROCKPro64, ROCK64, Pinebook Pro, NanoPi R4S, Quartz64, ASUS Tinker Board, NanoPi R2S, NanoPi NEO3, NanoPi M4V2, NanoPi M4/T4/NEO4, ROCK 4, ROCK 3A, ASUS Tinker Board 2
- elif [[ $G_HW_MODEL =~ ^(42|43|46|47|49|52|55|56|58|68|72|77|86)$ ]]
+ elif [[ $G_HW_MODEL =~ ^(42|43|46|47|49|52|55|56|58|68|72|77|86|87)$ ]]
then
/boot/dietpi/func/dietpi-set_hardware serialconsole enable ttyS2
@@ -2094,14 +2101,14 @@ rm -v /tmp/ax88179_178a.ko || exit 0
_EOF_
G_EXEC chmod +x /etc/kernel/postinst.d/dietpi-USBridgeSig
# Force upgrade now, regardless of current host machine
- G_EXEC sed -i 's/^grep/#grep/' /etc/kernel/postinst.d/dietpi-USBridgeSig
+ G_EXEC sed --follow-symlinks -i 's/^grep/#grep/' /etc/kernel/postinst.d/dietpi-USBridgeSig
for i in /lib/modules/*-v7+
do
[[ -d $i ]] || continue
i=${i##*/}
/etc/kernel/postinst.d/dietpi-USBridgeSig "$i"
done
- G_EXEC sed -i 's/^#grep/grep/' /etc/kernel/postinst.d/dietpi-USBridgeSig
+ G_EXEC sed --follow-symlinks -i 's/^#grep/grep/' /etc/kernel/postinst.d/dietpi-USBridgeSig
# For backwards compatibility with software compiled against older libraspberrypi0, create symlinks from old to new filenames
if (( $G_HW_ARCH < 3 ))
@@ -2188,7 +2195,7 @@ _EOF_
then
G_CONFIG_INJECT 'CONFIG_NTP_MODE=' 'CONFIG_NTP_MODE=0' /boot/dietpi.txt
else
- G_EXEC_DESC='Enable Dropbear autostart' G_EXEC sed -i '/NO_START=1/c\NO_START=0' /etc/default/dropbear
+ G_EXEC_DESC='Enable Dropbear autostart' G_EXEC sed --follow-symlinks -i '/NO_START=1/c\NO_START=0' /etc/default/dropbear
G_EXEC systemctl unmask dropbear
G_EXEC systemctl enable dropbear
fi
@@ -2205,7 +2212,7 @@ _EOF_
# Re-enable for next run
(( $G_HW_MODEL == 75 )) || G_CONFIG_INJECT 'AUTO_SETUP_SWAPFILE_SIZE=' 'AUTO_SETUP_SWAPFILE_SIZE=1' /boot/dietpi.txt
# Reset /tmp size to default (512 MiB)
- sed -i '\|/tmp|s|size=[^,]*,||' /etc/fstab
+ sed --follow-symlinks -i '\|/tmp|s|size=[^,]*,||' /etc/fstab
# Set WiFi
local tmp_info='Disabling'
@@ -2236,10 +2243,8 @@ _EOF_
fi
# - x86_64: GRUB install and config
- if (( $G_HW_ARCH == 10 && $G_HW_MODEL != 75 )); then
-
- G_EXEC_DESC='Detecting additional OS installed on system' G_EXEC_OUTPUT=1 G_EXEC os-prober
-
+ if (( $G_HW_ARCH == 10 && $G_HW_MODEL != 75 ))
+ then
# UEFI
if [[ -d '/boot/efi' ]] && dpkg-query -s 'grub-efi-amd64' &> /dev/null
then
@@ -2266,9 +2271,6 @@ _EOF_
G_CONFIG_INJECT 'GRUB_CMDLINE_LINUX=' 'GRUB_CMDLINE_LINUX="net.ifnames=0"' /etc/default/grub
G_CONFIG_INJECT 'GRUB_TIMEOUT=' 'GRUB_TIMEOUT=0' /etc/default/grub
G_EXEC_DESC='Regenerating GRUB config' G_EXEC_OUTPUT=1 G_EXEC grub-mkconfig -o /boot/grub/grub.cfg
-
- # Purge "os-prober" again
- G_AGP os-prober
fi
G_DIETPI-NOTIFY 2 'Disabling soundcards by default'
diff --git a/.build/software/Amiberry/build.bash b/.build/software/Amiberry/build.bash
index e2f559fb8f..488dabbac2 100755
--- a/.build/software/Amiberry/build.bash
+++ b/.build/software/Amiberry/build.bash
@@ -183,7 +183,7 @@ do
done
DEPS_APT_VERSIONED=${DEPS_APT_VERSIONED%,}
# shellcheck disable=SC2001
-[[ $G_HW_ARCH_NAME == 'armv6l' ]] && DEPS_APT_VERSIONED=$(sed 's/+rp[it][0-9]\+[^)]*)/)/g' <<< "$DEPS_APT_VERSIONED") || DEPS_APT_VERSIONED=$(sed 's/+b[0-9]\+)/)/g' <<< "$DEPS_APT_VERSIONED")
+grep -q '^ID=raspbian' /etc/os-release && DEPS_APT_VERSIONED=$(sed 's/+rp[it][0-9]\+[^)]*)/)/g' <<< "$DEPS_APT_VERSIONED") || DEPS_APT_VERSIONED=$(sed 's/+b[0-9]\+)/)/g' <<< "$DEPS_APT_VERSIONED")
# - Obtain version suffix
G_EXEC curl -sSfo package.deb "https://dietpi.com/downloads/binaries/$G_DISTRO_NAME/amiberry_$PLATFORM.deb"
diff --git a/.build/software/Amiberry/container_build.bash b/.build/software/Amiberry/container_build.bash
index 67c9d5f874..45da9337b6 100755
--- a/.build/software/Amiberry/container_build.bash
+++ b/.build/software/Amiberry/container_build.bash
@@ -84,7 +84,7 @@ G_EXEC mkdir rootfs
G_EXEC mount "${FP_LOOP}p1" rootfs
# Enforce ARMv6 arch on Raspbian
-(( $arch > 1 )) || echo 'sed -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh || Error_Exit 'Failed to generate Automation_Custom_PreScript.sh'
+(( $arch > 1 )) || echo 'sed --follow-symlinks -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh || Error_Exit 'Failed to generate Automation_Custom_PreScript.sh'
# Enable automated setup
G_CONFIG_INJECT 'AUTO_SETUP_AUTOMATED=' 'AUTO_SETUP_AUTOMATED=1' rootfs/boot/dietpi.txt
diff --git a/.build/software/dietpi-software-build.bash b/.build/software/dietpi-software-build.bash
index cc05c7d281..f5346d543e 100644
--- a/.build/software/dietpi-software-build.bash
+++ b/.build/software/dietpi-software-build.bash
@@ -89,7 +89,7 @@ G_EXEC mkdir rootfs
G_EXEC mount "${FP_LOOP}p1" rootfs
# Enforce ARMv6 arch on Raspbian
-(( $arch > 1 )) || echo 'sed -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh || Error_Exit 'Failed to generate Automation_Custom_PreScript.sh'
+(( $arch > 1 )) || echo 'sed --follow-symlinks -i -e '\''/^G_HW_ARCH=/c\G_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/c\G_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' > rootfs/boot/Automation_Custom_PreScript.sh || Error_Exit 'Failed to generate Automation_Custom_PreScript.sh'
# Enable automated setup
G_CONFIG_INJECT 'AUTO_SETUP_AUTOMATED=' 'AUTO_SETUP_AUTOMATED=1' rootfs/boot/dietpi.txt
diff --git a/.build/software/gmediarender/build.bash b/.build/software/gmediarender/build.bash
index 791313df19..a75b6da683 100755
--- a/.build/software/gmediarender/build.bash
+++ b/.build/software/gmediarender/build.bash
@@ -41,7 +41,8 @@ G_EXEC strip --remove-section=.comment --remove-section=.note "src/$name"
# Package dir: In case of Raspbian, force ARMv6
G_DIETPI-NOTIFY 2 "Preparing $name_pretty DEB package directory"
G_EXEC cd /tmp
-grep -q 'raspbian' /etc/os-release && DIR='gmediarender_armv6l' || DIR="gmediarender_$G_HW_ARCH_NAME"
+grep -q '^ID=raspbian' /etc/os-release && G_HW_ARCH_NAME='armv6l'
+DIR="gmediarender_$G_HW_ARCH_NAME"
[[ -d $DIR ]] && G_EXEC rm -R "$DIR"
# - Control files, config, systemd service, executable, icons, copyright
G_EXEC mkdir -p "$DIR/"{DEBIAN,etc/default,lib/systemd/system,usr/{bin,share/{,doc/}gmediarender}}
@@ -97,7 +98,7 @@ then
INTERFACE=$(ip r l 0/0 | awk '{print $5;exit}')
[ "$INTERFACE" ] || INTERFACE=$(ip -br a | awk '$2=="UP"{print $1;exit}')
[ "$INTERFACE" ] || exit 1
- sed -i "s/-u UUID -f HOSTNAME -I eth0/-u $G_HW_UUID -f $HOSTNAME -I $INTERFACE/" /etc/default/gmediarender
+ sed --follow-symlinks -i "s/-u UUID -f HOSTNAME -I eth0/-u $G_HW_UUID -f $HOSTNAME -I $INTERFACE/" /etc/default/gmediarender
fi
if getent passwd gmediarender > /dev/null
diff --git a/.build/software/gogs/build.bash b/.build/software/gogs/build.bash
index e29b14dc36..57ca5c09a2 100755
--- a/.build/software/gogs/build.bash
+++ b/.build/software/gogs/build.bash
@@ -20,6 +20,7 @@ G_EXEC_OUTPUT=1 G_EXEC go install 'gogs.io/gogs@latest'
G_EXEC mkdir gogs
G_EXEC mv /root/go/bin/gogs gogs/
G_EXEC strip gogs/gogs
+grep -q '^ID=raspbian' /etc/os-release && G_HW_ARCH_NAME='armv6l'
G_EXEC "$c7zip" a -mx=9 "/tmp/gogs_$G_HW_ARCH_NAME.7z" gogs
# Cleanup
diff --git a/.build/software/raspberrypi-sys-mods/build.bash b/.build/software/raspberrypi-sys-mods/build.bash
index 2e9ba2badb..ac91cd6ef2 100755
--- a/.build/software/raspberrypi-sys-mods/build.bash
+++ b/.build/software/raspberrypi-sys-mods/build.bash
@@ -37,7 +37,7 @@ G_EXEC curl -sSfo raspberrypi-sys-mods/lib/udev/rules.d/15-i2c-modprobe.rules 'h
G_EXEC curl -sSfo raspberrypi-sys-mods/lib/udev/rules.d/99-com.rules 'https://raw.githubusercontent.com/RPi-Distro/raspberrypi-sys-mods/master/etc.armhf/udev/rules.d/99-com.rules'
# The original rule uses the "strings" command from binutils, which we do not want to have pre-installed (it is huge!). So we use cat, which is safe for the node values read here.
-G_EXEC sed -i 's/(strings/(cat/g' raspberrypi-sys-mods/lib/udev/rules.d/99-com.rules
+G_EXEC sed --follow-symlinks -i 's/(strings/(cat/g' raspberrypi-sys-mods/lib/udev/rules.d/99-com.rules
cat << '_EOF_' > raspberrypi-sys-mods/DEBIAN/preinst
#!/bin/dash
diff --git a/.build/software/shairport-sync/build.bash b/.build/software/shairport-sync/build.bash
index 940e13ff1a..37ca209a36 100755
--- a/.build/software/shairport-sync/build.bash
+++ b/.build/software/shairport-sync/build.bash
@@ -53,7 +53,8 @@ G_EXEC strip --remove-section=.comment --remove-section=.note "$name"
# Package dir: In case of Raspbian, force ARMv6
G_DIETPI-NOTIFY 2 "Preparing $name_pretty DEB package directory"
G_EXEC cd /tmp
-grep -q 'raspbian' /etc/os-release && DIR="${name}_armv6l" || DIR="${name}_$G_HW_ARCH_NAME"
+grep -q '^ID=raspbian' /etc/os-release && G_HW_ARCH_NAME='armv6l'
+DIR="${name}_$G_HW_ARCH_NAME"
[[ -d $DIR ]] && G_EXEC rm -R "$DIR"
# - Control files, systemd service, executable, configs, copyright
G_EXEC mkdir -p "$DIR/"{DEBIAN,lib/systemd/system,usr/local/{bin,etc,"share/doc/$name"},etc/dbus-1/system.d}
diff --git a/.build/software/squeezelite/build.bash b/.build/software/squeezelite/build.bash
index 1acf1e07b0..ccf8c3b921 100755
--- a/.build/software/squeezelite/build.bash
+++ b/.build/software/squeezelite/build.bash
@@ -36,7 +36,8 @@ G_DIETPI-NOTIFY 2 'Starting packaging...'
# Package dir
G_EXEC cd /tmp
-grep -q 'raspbian' /etc/os-release && DIR='squeezelite_armv6l' || DIR="squeezelite_$G_HW_ARCH_NAME"
+grep -q '^ID=raspbian' /etc/os-release && G_HW_ARCH_NAME='armv6l'
+DIR="squeezelite_$G_HW_ARCH_NAME"
G_EXEC rm -Rf "$DIR"
G_EXEC mkdir -p "$DIR/"{DEBIAN,lib/systemd/system,etc/default,usr/{bin,share/doc/squeezelite,share/man/man1}}
diff --git a/.build/software/vaultwarden/build.bash b/.build/software/vaultwarden/build.bash
index d269988f76..dd09f2cc07 100755
--- a/.build/software/vaultwarden/build.bash
+++ b/.build/software/vaultwarden/build.bash
@@ -134,7 +134,7 @@ cat << '_EOF_' > "$DIR/DEBIAN/postinst"
if [[ ! $2 ]] && grep -q '^# ROCKET_ADDRESS=0.0.0.0$' /mnt/dietpi_userdata/vaultwarden/vaultwarden.env
then
echo 'Enabling web vault remote access ...'
- sed -i '/^# ROCKET_ADDRESS=0.0.0.0$/c\ROCKET_ADDRESS=0.0.0.0' /mnt/dietpi_userdata/vaultwarden/vaultwarden.env
+ sed --follow-symlinks -i '/^# ROCKET_ADDRESS=0.0.0.0$/c\ROCKET_ADDRESS=0.0.0.0' /mnt/dietpi_userdata/vaultwarden/vaultwarden.env
fi
if [[ -d '/run/systemd/system' ]]
diff --git a/.build/software/ympd/build.bash b/.build/software/ympd/build.bash
index 202a2660a2..8e08f05e17 100644
--- a/.build/software/ympd/build.bash
+++ b/.build/software/ympd/build.bash
@@ -39,6 +39,7 @@ G_DIETPI-NOTIFY 2 'Starting packaging...'
# Package dir
G_EXEC cd /tmp
+grep -q '^ID=raspbian' /etc/os-release && G_HW_ARCH_NAME='armv6l'
DIR="ympd_$G_HW_ARCH_NAME"
[[ -d $DIR ]] && G_EXEC rm -R "$DIR"
G_EXEC mkdir -p "$DIR/"{DEBIAN,lib/systemd/system,usr/{bin,share/man/man1}}
@@ -142,7 +143,7 @@ do
done
DEPS_APT_VERSIONED=${DEPS_APT_VERSIONED%,}
# shellcheck disable=SC2001
-(( $G_HW_ARCH == 1 )) && DEPS_APT_VERSIONED=$(sed 's/+rp[it][0-9]\+[^)]*)/)/g' <<< "$DEPS_APT_VERSIONED") || DEPS_APT_VERSIONED=$(sed 's/+b[0-9]\+)/)/g' <<< "$DEPS_APT_VERSIONED")
+[[ $G_HW_ARCH_NAME == 'armv6l' ]] && DEPS_APT_VERSIONED=$(sed 's/+rp[it][0-9]\+[^)]*)/)/g' <<< "$DEPS_APT_VERSIONED") || DEPS_APT_VERSIONED=$(sed 's/+b[0-9]\+)/)/g' <<< "$DEPS_APT_VERSIONED")
# - Obtain version
version="$(mawk -F\" '/CPACK_PACKAGE_VERSION_MAJOR/{print $2;exit}' ympd-master/CMakeLists.txt).$(mawk -F\" '/CPACK_PACKAGE_VERSION_MINOR/{print $2;exit}' ympd-master/CMakeLists.txt).$(mawk -F\" '/CPACK_PACKAGE_VERSION_PATCH/{print $2;exit}' ympd-master/CMakeLists.txt)"
diff --git a/.conf/dps_114/lighttpd.nextcloud.conf b/.conf/dps_114/lighttpd.nextcloud.conf
index 0b908919b7..1604d1c625 100644
--- a/.conf/dps_114/lighttpd.nextcloud.conf
+++ b/.conf/dps_114/lighttpd.nextcloud.conf
@@ -9,7 +9,6 @@ url.redirect += (
)
$HTTP["url"] =~ "^/nextcloud($|/)" {
-
# Hardening
# - Directories
$HTTP["url"] =~ "^/nextcloud/(build|tests|config|lib|3rdparty|templates|data)($|/)" { url.access-deny = ("") }
@@ -18,7 +17,7 @@ $HTTP["url"] =~ "^/nextcloud($|/)" {
# - Directory listing
dir-listing.activate = "disable"
# - Security and cache control headers for static resources
- $HTTP["url"] =~ "\.(css|js|svg|gif|png|jpg|ico|wasm|tflite|map|woff2?)$" {
+ $HTTP["url"] =~ "\.(css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map|woff2?)$" {
setenv.add-response-header += (
"Referrer-Policy" => "no-referrer",
"X-Content-Type-Options" => "nosniff",
@@ -30,15 +29,13 @@ $HTTP["url"] =~ "^/nextcloud($|/)" {
"Cache-Control" => "public, max-age=15778463",
)
}
-
# Rewrites
url.rewrite-once += (
"^/nextcloud/remote/(.*)" => "/nextcloud/remote.php/$1",
"^/nextcloud/ocm-provider($|/\?.*)" => "/nextcloud/index.php$1"
)
url.rewrite-if-not-file += (
- "^/nextcloud/((core/ajax/update|cron|public|remote|status|ocs/v[12])\.php|ocs-provider/|updater/)" => "",
+ "^/nextcloud/((core/ajax/update|cron|public|remote|status|ocs/v[12]|richdocumentscode(_arm64)?/proxy)\.php|ocs-provider/|updater/)" => "",
"^/nextcloud(.*)" => "/nextcloud/index.php$1"
)
-
}
diff --git a/.conf/dps_114/nginx.nextcloud.conf b/.conf/dps_114/nginx.nextcloud.conf
index 9e14d43b1c..d537626e4b 100644
--- a/.conf/dps_114/nginx.nextcloud.conf
+++ b/.conf/dps_114/nginx.nextcloud.conf
@@ -77,7 +77,7 @@ location ^~ /nextcloud {
fastcgi_max_temp_file_size 0; # Allow downloads > 1 GiB: https://github.com/nextcloud/documentation/pull/7979
}
- location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
+ location ~ \.(?:css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
try_files $uri /nextcloud/index.php$request_uri;
expires 6M; # Cache-Control policy borrowed from `.htaccess`
access_log off; # Optional: Don't log access to assets
diff --git a/.conf/dps_27/lighttpd.tasmoadmin.3.conf b/.conf/dps_27/lighttpd.tasmoadmin.3.conf
index f69c58c72a..5763c3b9e0 100644
--- a/.conf/dps_27/lighttpd.tasmoadmin.3.conf
+++ b/.conf/dps_27/lighttpd.tasmoadmin.3.conf
@@ -9,6 +9,6 @@ $HTTP["url"] =~ "^/tasmoadmin($|/)" {
# TasmoAdmin URL rewrites
else $HTTP["url"] !~ "^/tasmoadmin/index\.php($|/)" {
- url.rewrite-if-not-file = ("^/tasmoadmin/(.*)$" => "/tasmoadmin/index.php?$1")
+ url.rewrite-if-not-file = ("" => "/tasmoadmin/index.php${qsa}")
}
}
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 76df2760b4..d17c594ffe 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -4,6 +4,7 @@ about: Create a report to help us improve
---
### Creating a bug report/issue
+- [ ] I have searched the existing open and closed issues
#### Required Information
- DietPi version | `cat /boot/dietpi/.version`
diff --git a/.github/workflows/dietpi-build.yml b/.github/workflows/dietpi-build.yml
index 96f7cfdff2..1a87afbe73 100644
--- a/.github/workflows/dietpi-build.yml
+++ b/.github/workflows/dietpi-build.yml
@@ -85,7 +85,8 @@ jobs:
'"-m 83 -d 6", "-m 83 -d 7", "-m 83 -d 8", '\
'"-m 84 -d 8", '\
'"-m 85 -d 6", "-m 85 -d 7", "-m 85 -d 8", '\
- '"-m 86 -d 6", "-m 86 -d 7", "-m 86 -d 8"]' >> "$GITHUB_OUTPUT"
+ '"-m 86 -d 6", "-m 86 -d 7", "-m 86 -d 8", '\
+ '"-m 87 -d 6", "-m 87 -d 7", "-m 87 -d 8"]' >> "$GITHUB_OUTPUT"
elif [ "${{ github.event.inputs.buildargs }}" = 'quartz64' ]
then
echo buildargs=[\
diff --git a/.github/workflows/dietpi-software.bash b/.github/workflows/dietpi-software.bash
index 663ea4e861..8b4c6f43aa 100644
--- a/.github/workflows/dietpi-software.bash
+++ b/.github/workflows/dietpi-software.bash
@@ -285,7 +285,7 @@ G_EXEC mkdir rootfs
G_EXEC mount "${FP_LOOP}p1" rootfs
# Force ARMv6 arch on Raspbian
-(( $arch == 1 )) && G_EXEC sed -i '/# Start DietPi-Software/iG_EXEC sed -i -e '\''/^G_HW_ARCH=/cG_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/cG_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' rootfs/boot/dietpi/dietpi-login
+(( $arch == 1 )) && G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/iG_EXEC sed -i -e '\''/^G_HW_ARCH=/cG_HW_ARCH=1'\'' -e '\''/^G_HW_ARCH_NAME=/cG_HW_ARCH_NAME=armv6l'\'' /boot/dietpi/.hw_model' rootfs/boot/dietpi/dietpi-login
# Force RPi on ARM systems if requested
if [[ $RPI == 'true' ]] && (( $arch < 10 ))
@@ -298,7 +298,7 @@ then
esac
G_EXEC rm rootfs/etc/.dietpi_hw_model_identifier
G_EXEC touch rootfs/boot/{bcm-rpi-dummy.dtb,config.txt,cmdline.txt}
- G_EXEC sed -i "/# Start DietPi-Software/iG_EXEC sed -i -e '/^G_HW_MODEL=/cG_HW_MODEL=$model' -e '/^G_HW_MODEL_NAME=/cG_HW_MODEL_NAME=\"RPi $model ($ARCH)\"' /boot/dietpi/.hw_model" rootfs/boot/dietpi/dietpi-login
+ G_EXEC sed --follow-symlinks -i "/# Start DietPi-Software/iG_EXEC sed -i -e '/^G_HW_MODEL=/cG_HW_MODEL=$model' -e '/^G_HW_MODEL_NAME=/cG_HW_MODEL_NAME=\"RPi $model ($ARCH)\"' /boot/dietpi/.hw_model" rootfs/boot/dietpi/dietpi-login
G_EXEC curl -sSfo keyring.deb 'https://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-archive-keyring/raspberrypi-archive-keyring_2021.1.1+rpt1_all.deb'
G_EXEC dpkg --root=rootfs -i keyring.deb
G_EXEC rm keyring.deb
@@ -312,7 +312,7 @@ fi
# Install test builds from dietpi.com if requested
# shellcheck disable=SC2016
-[[ $TEST == 'true' ]] && G_EXEC sed -i '/# Start DietPi-Software/a\sed -i '\''s|dietpi.com/downloads/binaries/$G_DISTRO_NAME/|dietpi.com/downloads/binaries/$G_DISTRO_NAME/testing/|'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
+[[ $TEST == 'true' ]] && G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/a\sed -i '\''s|dietpi.com/downloads/binaries/$G_DISTRO_NAME/|dietpi.com/downloads/binaries/$G_DISTRO_NAME/testing/|'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
# Workaround invalid TERM on login
# shellcheck disable=SC2016
@@ -365,27 +365,34 @@ G_EXEC eval 'echo -e '\''[Service]\nAmbientCapabilities='\'' > rootfs/etc/system
# Workarounds for failing MariaDB install on Buster within GitHub Actions runner (both cannot be replicated on my test systems with and without QEMU):
# - mysqld does not have write access if our symlink is in place, even that directory permissions are correct.
-# - Type=notify leads to a service start timeout while mysqld has actually fully started.
+# - Type=notify leads to a service start timeout while mysqld has actually fully started. However, with Type=exec, /etc/mysql/debian-start starts too soon after mysqld, so that the UNIX socket is not yet ready to listen. Hence add a second to wait for it.
if [[ $DISTRO == 'buster' ]]
then
- G_EXEC sed -i '/# Start DietPi-Software/a\sed -i -e '\''s|rm -Rf /var/lib/mysql|rm -Rf /mnd/dietpi_userdata/mysql|'\'' -e '\''s|ln -s /mnt/dietpi_userdata/mysql /var/lib/mysql|ln -s /var/lib/mysql /mnt/dietpi_userdata/mysql|'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
+ G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/a\sed -i -e '\''s|rm -Rf /var/lib/mysql|rm -Rf /mnd/dietpi_userdata/mysql|'\'' -e '\''s|ln -s /mnt/dietpi_userdata/mysql /var/lib/mysql|ln -s /var/lib/mysql /mnt/dietpi_userdata/mysql|'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
G_EXEC mkdir rootfs/etc/systemd/system/mariadb.service.d
- G_EXEC eval 'echo -e '\''[Service]\nType=exec'\'' > rootfs/etc/systemd/system/mariadb.service.d/dietpi-container.conf'
+ cat << '_EOF_' > rootfs/etc/systemd/system/mariadb.service.d/dietpi-container.conf || exit 1
+[Service]
+Type=exec
+ExecStartPost=
+ExecStartPost=/bin/sleep 1
+ExecStartPost=/bin/sh -c "systemctl unset-environment _WSREP_START_POSITION"
+ExecStartPost=/etc/mysql/debian-start
+_EOF_
fi
# Workaround for failing 32-bit ARM Rust builds on ext4 in QEMU emulated container on 64-bit host: https://github.com/rust-lang/cargo/issues/9545
(( $arch < 3 && $G_HW_ARCH > 9 )) && G_EXEC eval 'echo -e '\''tmpfs /mnt/dietpi_userdata tmpfs size=3G,noatime,lazytime\ntmpfs /root tmpfs size=3G,noatime,lazytime'\'' >> rootfs/etc/fstab'
# Workaround for Node.js on ARMv6
-(( $arch == 1 )) && G_EXEC sed -i '/# Start DietPi-Software/a\sed -i '\''/G_EXEC chmod +x node-install.sh/a\\sed -i "/^ARCH=/c\\ARCH=armv6l" node-install.sh'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
+(( $arch == 1 )) && G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/a\sed -i '\''/G_EXEC chmod +x node-install.sh/a\\sed -i "/^ARCH=/c\\ARCH=armv6l" node-install.sh'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
# Workaround for sysctl: permission denied on key "net.core.rmem_max" in containers
-G_EXEC sed -i '/# Start DietPi-Software/a\sed -i '\''/G_EXEC sysctl -w net\.core\.rmem_max/d'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
+G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/a\sed -i '\''/G_EXEC sysctl -w net\.core\.rmem_max/d'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
# Check for service status, ports and commands
# shellcheck disable=SC2016
# - Start all services
-G_EXEC sed -i '/# Start DietPi-Software/a\sed -i '\''/# Custom 1st run script/a\\for i in "${aSTART_SERVICES[@]}"; do G_EXEC_NOHALT=1 G_EXEC systemctl start "$i"; done'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
+G_EXEC sed --follow-symlinks -i '/# Start DietPi-Software/a\sed -i '\''/# Custom 1st run script/a\\for i in "${aSTART_SERVICES[@]}"; do G_EXEC_NOHALT=1 G_EXEC systemctl start "$i"; done'\'' /boot/dietpi/dietpi-software' rootfs/boot/dietpi/dietpi-login
delay=10
for i in "${aDELAY[@]}"; do (( $i > $delay )) && delay=$i; done
G_EXEC eval "echo -e '#!/bin/dash\nexit_code=0; /boot/dietpi/dietpi-services start || exit_code=1; echo Waiting $delay seconds for service starts; sleep $delay' > rootfs/boot/Automation_Custom_Script.sh"
@@ -430,7 +437,7 @@ done
G_EXEC eval 'echo '\''[ $exit_code = 0 ] && > /success || { journalctl -n 50; ss -tlpn; df -h; free -h; poweroff; }; poweroff'\'' >> rootfs/boot/Automation_Custom_Script.sh'
# Shutdown as well on failure
-G_EXEC sed -i 's|Prompt_on_Failure$|{ journalctl -n 50; ss -tulpn; df -h; free -h; poweroff; }|' rootfs/boot/dietpi/dietpi-login
+G_EXEC sed --follow-symlinks -i 's|Prompt_on_Failure$|{ journalctl -n 50; ss -tulpn; df -h; free -h; poweroff; }|' rootfs/boot/dietpi/dietpi-login
##########################################
# Boot container
diff --git a/.github/workflows/quartz64.yml b/.github/workflows/quartz64.yml
index 49aa85a11b..c508f04166 100644
--- a/.github/workflows/quartz64.yml
+++ b/.github/workflows/quartz64.yml
@@ -13,12 +13,12 @@ jobs:
# https://github.com/actions/runner-images
runs-on: ubuntu-22.04
env:
- uboot_branch: 'v2022.07-dietpi'
+ uboot_version: '2023.10'
CROSS_COMPILE: 'aarch64-linux-gnu-'
ARCH: 'arm64'
steps:
# https://github.com/actions/setup-python/tags
- - uses: actions/setup-python@v4
+ - uses: actions/setup-python@v5
with:
python-version: '3.x'
check-latest: true
@@ -26,11 +26,11 @@ jobs:
run: |
{ python3 -m pip install --no-cache-dir -U pip setuptools wheel; python3 -m pip install --no-cache-dir -U pyelftools; } &
{ sudo apt-get -q update; sudo DEBIAN_FRONTEND=noninteractive apt-get --no-install-recommends -qq install make gcc libc6-dev flex bison gcc-aarch64-linux-gnu bc libssl-dev swig; } &
- { curl -fO "https://gitlab.com/MichaIng/u-boot/-/archive/$uboot_branch/u-boot-$uboot_branch.tar.bz2"; tar xf "u-boot-$uboot_branch.tar.bz2"; rm "u-boot-$uboot_branch.tar.bz2"; } &
+ { curl -fLO "https://github.com/u-boot/u-boot/archive/v$uboot_version.tar.gz"; tar xf "v$uboot_version.tar.gz"; rm "v$uboot_version.tar.gz"; } &
{ curl -fO 'https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapshot/linux-rolling-stable.tar.gz'; tar xf linux-rolling-stable.tar.gz; rm linux-rolling-stable.tar.gz; } &
wait
- curl -sSfo "u-boot-$uboot_branch/u-boot-spl-ddr.bin" 'https://raw.githubusercontent.com/JeffyCN/mirrors/ddf03c1/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin' &
- curl -sSfo "u-boot-$uboot_branch/bl31.elf" 'https://raw.githubusercontent.com/JeffyCN/mirrors/6186deb/bin/rk35/rk3568_bl31_v1.28.elf' &
+ curl -sSfo "u-boot-$uboot_version/ddr.bin" 'https://raw.githubusercontent.com/JeffyCN/mirrors/ddf03c1/bin/rk35/rk3568_ddr_1560MHz_v1.13.bin' &
+ curl -sSfo "u-boot-$uboot_version/bl31.elf" 'https://raw.githubusercontent.com/JeffyCN/mirrors/6186deb/bin/rk35/rk3568_bl31_v1.28.elf' &
curl -sSfo linux-rolling-stable/arch/arm64/configs/quartz64_defconfig "https://raw.githubusercontent.com/$GITHUB_REPOSITORY_OWNER/DietPi/$GITHUB_REF_NAME/.build/images/Quartz64/quartz64_defconfig" &
rm -Rf firmware-quartz64a/DEBIAN firmware-quartz64a/boot/extlinux firmware-quartz64a/lib/firmware/brcm
mkdir -p firmware-quartz64a/DEBIAN firmware-quartz64a/boot/extlinux firmware-quartz64a/lib/firmware/brcm
@@ -41,19 +41,22 @@ jobs:
wait
- name: Build U-Boot
run: |
+ export ROCKCHIP_TPL='ddr.bin'
export BL31='bl31.elf'
- cd "u-boot-$uboot_branch"
+ cd "u-boot-$uboot_version"
+ # Patch kernel_comp_addr_r being too narrow for our kernel image
+ sed --follow-symlinks -i 's/kernel_comp_addr_r=0x08000000/kernel_comp_addr_r=0x10000000/' include/configs/rk3568_common.h
make quartz64-a-rk3566_defconfig
make -j$(nproc)
mv u-boot-rockchip.bin ../firmware-quartz64a/boot/u-boot.bin
make quartz64-b-rk3566_defconfig
make -j$(nproc)
mv u-boot-rockchip.bin ../firmware-quartz64b/boot/u-boot.bin
- make soquartz-rk3566_defconfig
+ make soquartz-cm4-rk3566_defconfig
make -j$(nproc)
mv u-boot-rockchip.bin ../firmware-soquartz/boot/u-boot.bin
cd ..
- rm -R "u-boot-$uboot_branch"
+ rm -R "u-boot-$uboot_version"
- name: Build Linux
run: |
cd linux-rolling-stable
@@ -67,7 +70,7 @@ jobs:
mv arch/arm64/boot/dts/rockchip/rk3566-soquartz-cm4.dtb ../firmware-soquartz/boot/
make modules_install INSTALL_MOD_PATH='../firmware-quartz64a'
cd ..
- rm firmware-quartz64a/lib/modules/*/build firmware-quartz64a/lib/modules/*/source
+ rm firmware-quartz64a/lib/modules/*/build
cp -R firmware-quartz64a/lib/modules firmware-quartz64b/lib/
cp -R firmware-quartz64a/lib/modules firmware-soquartz/lib/
- name: Build package
@@ -95,9 +98,9 @@ jobs:
append root=/dev/mmcblk0p1 rootfstype=ext4 rootwait earlycon=uart8250,mmio32,0xfe660000 console=ttyS2,1500000n8 console=tty1 consoleblank=0 net.ifnames=0
_EOF_
cp firmware-quartz64a/boot/extlinux/extlinux.conf firmware-quartz64b/boot/extlinux/
- sed -i 's/quartz64-a.dtb/quartz64-b.dtb/' firmware-quartz64b/boot/extlinux/extlinux.conf
+ sed --follow-symlinks -i 's/quartz64-a.dtb/quartz64-b.dtb/' firmware-quartz64b/boot/extlinux/extlinux.conf
cp firmware-quartz64a/boot/extlinux/extlinux.conf firmware-soquartz/boot/extlinux/
- sed -i 's/quartz64-a.dtb/soquartz-cm4.dtb/' firmware-soquartz/boot/extlinux/extlinux.conf
+ sed --follow-symlinks -i 's/quartz64-a.dtb/soquartz-cm4.dtb/' firmware-soquartz/boot/extlinux/extlinux.conf
echo '/boot/extlinux/extlinux.conf' > firmware-quartz64a/DEBIAN/conffiles
echo '/boot/extlinux/extlinux.conf' > firmware-quartz64b/DEBIAN/conffiles
echo '/boot/extlinux/extlinux.conf' > firmware-soquartz/DEBIAN/conffiles
@@ -124,7 +127,7 @@ jobs:
echo 'ERROR: Unable to detect root filessystem PARTUUID, aborting'
exit 1
fi
- sed -i "s|root=/dev/mmcblk0p1|root=PARTUUID=$ROOT_PARTUUID|" /boot/extlinux/extlinux.conf
+ sed --follow-symlinks -i "s|root=/dev/mmcblk0p1|root=PARTUUID=$ROOT_PARTUUID|" /boot/extlinux/extlinux.conf
ROOT_FSTYPE=$(findmnt -Ufnro FSTYPE -M /)
if [ $ROOT_FSTYPE ]
then
@@ -133,7 +136,7 @@ jobs:
echo 'ERROR: Unable to detect root filesystem type, aborting'
exit 1
fi
- sed -i "s|rootfstype=ext4|rootfstype=$ROOT_FSTYPE|" /boot/extlinux/extlinux.conf
+ sed --follow-symlinks -i "s|rootfstype=ext4|rootfstype=$ROOT_FSTYPE|" /boot/extlinux/extlinux.conf
fi
exit 0
_EOF_
@@ -155,15 +158,16 @@ jobs:
Priority: optional
Description: Linux kernel and U-Boot bootloader for Quartz64 Model A
_EOF_
- sed -i "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-quartz64a' | mawk '{print $1}')" firmware-quartz64a/DEBIAN/control
+ sed --follow-symlinks -i "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-quartz64a' | mawk '{print $1}')" firmware-quartz64a/DEBIAN/control
cp firmware-quartz64a/DEBIAN/control firmware-quartz64b/DEBIAN/
- sed -i -e 's/quartz64a/quartz64b/' -e 's/Model A$/Model B/' -e "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-quartz64b' | mawk '{print $1}')" firmware-quartz64b/DEBIAN/control
+ sed --follow-symlinks -i -e 's/quartz64a/quartz64b/' -e 's/Model A$/Model B/' -e "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-quartz64b' | mawk '{print $1}')" firmware-quartz64b/DEBIAN/control
cp firmware-quartz64a/DEBIAN/control firmware-soquartz/DEBIAN/
- sed -i -e 's/quartz64a/soquartz/' -e 's/Quartz64 Model A$/SOQuartz/' -e "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-soquartz' | mawk '{print $1}')" firmware-soquartz/DEBIAN/control
+ sed --follow-symlinks -i -e 's/quartz64a/soquartz/' -e 's/Quartz64 Model A$/SOQuartz/' -e "/^Installed-Size:/c\Installed-Size: $(du -sk 'firmware-soquartz' | mawk '{print $1}')" firmware-soquartz/DEBIAN/control
+ sudo chown -R root:root firmware-quartz64a firmware-quartz64b firmware-soquartz
dpkg-deb -b -Zxz -z9 -Sextreme firmware-quartz64a
dpkg-deb -b -Zxz -z9 -Sextreme firmware-quartz64b
dpkg-deb -b -Zxz -z9 -Sextreme firmware-soquartz
- rm -R firmware-quartz64a firmware-quartz64b firmware-soquartz
+ sudo rm -R firmware-quartz64a firmware-quartz64b firmware-soquartz
- name: Upload
run: |
[ -d ~/.ssh ] || mkdir ~/.ssh
diff --git a/.meta/dietpi-bookworm-upgrade b/.meta/dietpi-bookworm-upgrade
index 736a62ec0b..ac630cc000 100755
--- a/.meta/dietpi-bookworm-upgrade
+++ b/.meta/dietpi-bookworm-upgrade
@@ -55,16 +55,16 @@ mapfile -t apackages < <(apt-mark showhold)
unset -v apackages
G_DIETPI-NOTIFY 2 'Migrating package lists to Bookworm suite'
-G_EXEC sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list
-(( $G_RASPBIAN )) || G_EXEC sed -i 's/ non-free$/ non-free non-free-firmware/' /etc/apt/sources.list
-[[ $(find /etc/apt/sources.list.d/*.list 2> /dev/null) ]] && G_EXEC sed -i 's/bullseye/bookworm/g' /etc/apt/sources.list.d/*.list
-[[ -f '/etc/apt/sources.list.d/dietpi-mympd.list' ]] && G_EXEC sed -i 's/Debian_11/Debian_12/' /etc/apt/sources.list.d/dietpi-mympd.list
+G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/g' /etc/apt/sources.list
+(( $G_RASPBIAN )) || G_EXEC sed --follow-symlinks -i 's/ non-free$/ non-free non-free-firmware/' /etc/apt/sources.list
+[[ $(find /etc/apt/sources.list.d/*.list 2> /dev/null) ]] && G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/g' /etc/apt/sources.list.d/*.list
+[[ -f '/etc/apt/sources.list.d/dietpi-mympd.list' ]] && G_EXEC sed --follow-symlinks -i 's/Debian_11/Debian_12/' /etc/apt/sources.list.d/dietpi-mympd.list
G_DIETPI-NOTIFY 2 'Reverting some package lists to Bullseye which have no Bookworm suite (yet)'
-[[ -f '/etc/apt/sources.list.d/radxa.list' ]] && G_EXEC sed -i 's/bookworm/bullseye/g' /etc/apt/sources.list.d/radxa.list
-[[ -f '/etc/apt/sources.list.d/dietpi-radxa.list' ]] && G_EXEC sed -i 's/bookworm/bullseye/g' /etc/apt/sources.list.d/dietpi-radxa.list
-[[ -f '/etc/apt/sources.list.d/influxdb.list' ]] && G_EXEC sed -i 's/bookworm/bullseye/' /etc/apt/sources.list.d/influxdb.list
-[[ -f '/etc/apt/sources.list.d/mopidy.list' ]] && G_EXEC sed -i 's/bookworm/bullseye/' /etc/apt/sources.list.d/mopidy.list
+[[ -f '/etc/apt/sources.list.d/radxa.list' ]] && G_EXEC sed --follow-symlinks -i 's/bookworm/bullseye/g' /etc/apt/sources.list.d/radxa.list
+[[ -f '/etc/apt/sources.list.d/dietpi-radxa.list' ]] && G_EXEC sed --follow-symlinks -i 's/bookworm/bullseye/g' /etc/apt/sources.list.d/dietpi-radxa.list
+[[ -f '/etc/apt/sources.list.d/influxdb.list' ]] && G_EXEC sed --follow-symlinks -i 's/bookworm/bullseye/' /etc/apt/sources.list.d/influxdb.list
+[[ -f '/etc/apt/sources.list.d/mopidy.list' ]] && G_EXEC sed --follow-symlinks -i 's/bookworm/bullseye/' /etc/apt/sources.list.d/mopidy.list
if (( $G_HW_MODEL == 4 )) && dpkg-query -s rpi-eeprom &> /dev/null
then
@@ -111,7 +111,7 @@ G_EXEC rm -Rf /etc/php/7.4 /usr/local/lib/python3.9 /usr/local/bin/pip3*
# Install (mark as manually installed) root trust anchors for Unbound, which was degraded from dependency to recommendation: https://github.com/MichaIng/DietPi/issues/5612
dpkg-query -s unbound &> /dev/null && G_AGI dns-root-data
# Allow IPv6 port binding failure explicitly, not implicit anymore since Bookworm: https://github.com/MichaIng/DietPi/pull/6103#issuecomment-1407749720
-[[ -f '/etc/redis/redis.conf' ]] && G_EXEC sed -i '/^bind 127.0.0.1 ::1$/c\bind 127.0.0.1 -::1' /etc/redis/redis.conf
+[[ -f '/etc/redis/redis.conf' ]] && G_EXEC sed --follow-symlinks -i '/^bind 127.0.0.1 ::1$/c\bind 127.0.0.1 -::1' /etc/redis/redis.conf
# Reinstall all PHP applications which require non-standard PHP modules, webservers which did access a versioned PHP-FPM socket, Python applications installed via pip, ...
G_PROMPT_BACKUP_DISABLED=1 /boot/dietpi/dietpi-software reinstall 38 40 47 48 83 84 85 89 93 114 118 125 130 134 136 139 143 153 155 157 180
diff --git a/.meta/dietpi-rpi-firmware-migration b/.meta/dietpi-rpi-firmware-migration
new file mode 100644
index 0000000000..78e91ddf85
--- /dev/null
+++ b/.meta/dietpi-rpi-firmware-migration
@@ -0,0 +1,64 @@
+#!/bin/bash
+{
+# Import DietPi-Globals ---------------------------------------------------------------
+. /boot/dietpi/func/dietpi-globals
+readonly G_PROGRAM_NAME='dietpi-rpi-firmware-migration'
+(( $G_HW_MODEL > 9 )) && { G_DIETPI-NOTIFY 1 'You can run this script on RPi systems or Trixie only!'; exit 1; }
+[[ $G_DISTRO == [78] ]] || { G_DIETPI-NOTIFY 1 'You can run this script on Debian Bookworm or Trixie systems only!'; exit 1; }
+G_CHECK_ROOT_USER
+G_CHECK_ROOTFS_RW
+G_CHECK_FREESPACE / 200
+(( $(findmnt -nbo SIZE /boot) > 128000000 )) || { G_DIETPI-NOTIFY 1 'You can run this script on a system with at least 128 MiB boot partition only!'; exit 1; }
+G_INIT
+# Import DietPi-Globals ---------------------------------------------------------------
+
+# Offer a backup before doing any changes to the system
+G_PROMPT_BACKUP
+
+G_DIETPI-NOTIFY 2 'Updating DietPi to latest version'
+/boot/dietpi/dietpi-update 1
+
+# Temporary rootfs mount
+G_EXEC mkdir -p rootfs
+G_EXEC mount "$G_ROOTFS_DEV" rootfs
+
+# Copy DietPi files from bootfs to rootfs
+G_EXEC cp -a /boot/dietpi* rootfs/boot/
+G_EXEC chmod -x rootfs/boot/dietpi{.txt,/.??*,/func/dietpi-globals}
+
+# Remount bootfs to /boot/firmware
+G_EXEC mkdir -p rootfs/boot/firmware
+G_EXEC sed -i 's|[[:blank:]]/boot[[:blank:]]| /boot/firmware |' /etc/fstab
+G_EXEC systemctl daemon-reload
+G_EXEC umount /boot
+G_EXEC mount /boot/firmware
+G_EXEC umount rootfs
+
+# Generate config symlinks
+G_EXEC ln -s firmware/cmdline.txt /boot/cmdline.txt
+G_EXEC ln -s firmware/config.txt /boot/config.txt
+
+# Install new firmware packages
+apackages=('linux-image-rpi-v8')
+dpkg-query -s 'raspberrypi-kernel-headers' &> /dev/null && apackages+=('linux-headers-rpi-v8')
+if [[ $(dpkg --print-architecture) == 'armhf' ]]
+then
+ apackages+=('linux-image-rpi-v6' 'linux-image-rpi-v7' 'linux-image-rpi-v7l')
+ dpkg-query -s 'raspberrypi-kernel-headers' &> /dev/null && apackages+=('linux-headers-rpi-v6' 'linux-headers-rpi-v7' 'linux-headers-rpi-v7l')
+ # Add foreign arm64 arch until the 64-bit kernel package has been added to the armhf repo: https://github.com/RPi-Distro/repo/issues/356
+ G_EXEC dpkg --add-architecture arm64
+else
+ apackages+=('linux-image-rpi-2712')
+ dpkg-query -s 'raspberrypi-kernel-headers' &> /dev/null && apackages+=('linux-headers-rpi-2712')
+fi
+G_AGUP
+G_AGI "${apackages[@]}" raspi-firmware
+
+# Remove old firmware packages
+G_AGP raspberrypi-kernel raspberrypi-headers-kernel raspberrypi-bootloader
+
+# Remove obsolete files
+G_EXEC rm -Rf /boot/firmware/{dietpi*,COPYING.linux}
+
+G_WHIP_YESNO 'All finished!\n\nWe highly recommend to reboot, shall we reboot now?' && reboot
+}
\ No newline at end of file
diff --git a/.meta/dietpi-survey_report b/.meta/dietpi-survey_report
index 04ebb14276..2914d430b6 100755
--- a/.meta/dietpi-survey_report
+++ b/.meta/dietpi-survey_report
@@ -90,6 +90,7 @@ shopt -s extglob
[84]='Star64'
[85]='ROCK 5A'
[86]='ASUS Tinker Board 2'
+ [87]='Orange Pi 3B'
)
## Benchmark data arrays: aBENCH_XX[$HW_MODEL,${aBENCH_XX_INDEX[$HW_MODEL]}]
@@ -698,14 +699,16 @@ shopt -s extglob
aSOFTWARE_NAME8_23=()
aSOFTWARE_NAME8_24=()
+ aSOFTWARE_NAME8_25=()
for i in "${!aSOFTWARE_NAME8_22[@]}"
do
aSOFTWARE_NAME8_23[i]=${aSOFTWARE_NAME8_22[i]}
aSOFTWARE_NAME8_24[i]=${aSOFTWARE_NAME8_23[i]}
+ aSOFTWARE_NAME8_25[i]=${aSOFTWARE_NAME8_24[i]}
done
# Pre-create software counter array so that we can see also software (available in newest version) with 0 installs
- for i in "${aSOFTWARE_NAME8_24[@]}"
+ for i in "${aSOFTWARE_NAME8_25[@]}"
do
aSOFTWARE[$i]=0
done
diff --git a/.update/patches b/.update/patches
index df0c50a976..c72b669d0c 100755
--- a/.update/patches
+++ b/.update/patches
@@ -54,13 +54,13 @@ Patch_7_1()
[[ -d '/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn' ]] && G_EXEC mv /var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn /var/lib/dietpi/dietpi-vpn
if [[ -f '/var/lib/dietpi/dietpi-vpn/settings_dietpi.conf' ]]
then
- G_EXEC sed -Ei 's/^NORDVPN_(SERVER|USERNAME|PASSWORD)=/VPN_\1=/' /var/lib/dietpi/dietpi-vpn/settings_dietpi.conf
+ G_EXEC sed --follow-symlinks -Ei 's/^NORDVPN_(SERVER|USERNAME|PASSWORD)=/VPN_\1=/' /var/lib/dietpi/dietpi-vpn/settings_dietpi.conf
local PROTOCOL VPN_SERVER
# shellcheck disable=SC1091
. /var/lib/dietpi/dietpi-vpn/settings_dietpi.conf
[[ -f '/etc/openvpn/client.ovpn' ]] || G_EXEC cp -a "/etc/openvpn/ovpn_$PROTOCOL/$VPN_SERVER" /etc/openvpn/client.ovpn
unset -v VPN_SERVER PROTOCOL VPN_USERNAME VPN_PASSWORD
- G_EXEC sed -i 's|/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/|/var/lib/dietpi/dietpi-vpn/|' /etc/openvpn/client.ovpn
+ G_EXEC sed --follow-symlinks -i 's|/var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/|/var/lib/dietpi/dietpi-vpn/|' /etc/openvpn/client.ovpn
fi
if [[ -f '/etc/systemd/system/dietpi-nordvpn.service' ]]
then
@@ -84,7 +84,7 @@ Patch_7_1()
\nSimply run "dietpi-ddns" from console, select "No-IP" as provider, enter domain and credentials, then select "Apply". The old No-IP client and service will be removed automatically as last step, once a final DDNS update test succeeded.'
# Remove obsolete DietPi-NordVPN and No-IP install states
- [[ -f '/boot/dietpi/.installed' ]] && grep -qE '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(67|171)\]=' /boot/dietpi/.installed && G_EXEC sed -Ei '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(67|171)\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -qE '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(67|171)\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(67|171)\]=/d' /boot/dietpi/.installed
# Inform user about possible Sonarr v2 => v3 upgrade
[[ -f '/mnt/dietpi_userdata/sonarr/nzbdrone.pid' ]] && G_WHIP_MSG '[ INFO ] Sonarr v3 has been released
@@ -144,14 +144,14 @@ Patch_7_2()
fi
# Fix disabling dietpi-desktop_setup
- [[ -f '/var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh' ]] && grep -q 'echo -e' /var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh && G_EXEC sed -i 's/echo -e/echo/' /var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh
+ [[ -f '/var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh' ]] && grep -q 'echo -e' /var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh && G_EXEC sed --follow-symlinks -i 's/echo -e/echo/' /var/lib/dietpi/dietpi-software/installed/desktop/dietpi-desktop_setup.sh
for i in /{root,home/*}/.config/autostart/dietpi-desktop_setup.desktop
do
- [[ -f $i ]] && grep -q '^-e ' "$i" && G_EXEC sed -i 's/^-e //' "$i"
+ [[ -f $i ]] && grep -q '^-e ' "$i" && G_EXEC sed --follow-symlinks -i 's/^-e //' "$i"
done
# LibSSL1.0.0: Remove obsolete install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[126\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[126\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[126\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[126\]=/d' /boot/dietpi/.installed
# Roon Extension Manager: Inform users about available upgrade: https://github.com/MichaIng/DietPi/pull/4399
[[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[86\]=2' /boot/dietpi/.installed && G_WHIP_MSG '[ INFO ] Roon Extension Manager: Major upgrade available
@@ -203,10 +203,10 @@ _EOF_
fi
# RPi: Remove deprecated I2C setting from config.txt
- (( $G_HW_MODEL > 9 )) || G_EXEC sed -i '/dtparam=i2c1=/d' /boot/config.txt
+ (( $G_HW_MODEL > 9 )) || G_EXEC sed --follow-symlinks -i '/dtparam=i2c1=/d' /boot/config.txt
# Tomcat 8: Remove obsolete install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[125\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[125\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[125\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[125\]=/d' /boot/dietpi/.installed
# Remove license (flag) file if AUTO_SETUP_AUTOMATED=1 is set, which would otherwise never happen on pre-v7.2 images, and if AUTO_SETUP_ACCEPT_LICENSE=1 is set, to assure the prompt is skipped when for some reason the script is reloaded between update and first installs.
[[ -f '/var/lib/dietpi/license.txt' ]] && grep -Eq '^[[:blank:]]*AUTO_SETUP_A(UTOMATED|CCEPT_LICENSE)=1' /boot/dietpi.txt && G_EXEC rm /var/lib/dietpi/license.txt
@@ -239,8 +239,8 @@ Patch_7_5()
if [[ $G_HW_MODEL -le 9 && -f '/boot/dietpi/.dietpi-autostart_index' && $( 4 ))
then
G_DIETPI-NOTIFY 2 'Removing obsolete "elevator" entry from /boot/cmdline.txt'
- G_EXEC sed -Ei 's/elevator=[^[:blank:]]*[[:blank:]]+//' /boot/cmdline.txt
- G_EXEC sed -Ei 's/[[:blank:]]*elevator=[^[:blank:]]*//' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -Ei 's/elevator=[^[:blank:]]*[[:blank:]]+//' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -Ei 's/[[:blank:]]*elevator=[^[:blank:]]*//' /boot/cmdline.txt
fi
# https://github.com/jirka-h/haveged/pull/7 https://github.com/MichaIng/DietPi/issues/3689#issuecomment-678322767
@@ -290,8 +290,8 @@ Patch_7_6()
Patch_7_7()
{
G_DIETPI-NOTIFY 2 'Reverting Mosquitto and Webmin repositories back to HTTPS'
- G_EXEC sed -Ei 's#http://(repo.mosquitto.org|download.webmin.com)#https://\1#' /etc/apt/sources.list
- [[ $(find /etc/apt/sources.list/*.list 2> /dev/null) ]] && G_EXEC sed -Ei 's#http://(repo.mosquitto.org|download.webmin.com)#https://\1#' /etc/apt/sources.list.d/*.list
+ G_EXEC sed --follow-symlinks -Ei 's#http://(repo.mosquitto.org|download.webmin.com)#https://\1#' /etc/apt/sources.list
+ [[ $(find /etc/apt/sources.list/*.list 2> /dev/null) ]] && G_EXEC sed --follow-symlinks -Ei 's#http://(repo.mosquitto.org|download.webmin.com)#https://\1#' /etc/apt/sources.list.d/*.list
# Inform users about abandoned CouchPotato and in case add service to DietPi-Services includes, as it has been removed from the hardcoded list
if [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[142\]=2' /boot/dietpi/.installed
@@ -309,13 +309,13 @@ Patch_7_7()
fi
fi
# Remove obsolete CouchPotato install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[142\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[142\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[142\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[142\]=/d' /boot/dietpi/.installed
# Fix Deluge web interface service on Bullseye: https://github.com/MichaIng/DietPi/issues/4785
if [[ $G_DISTRO -ge 6 && -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[45\]=2' /boot/dietpi/.installed && ! grep -q 'ExecStart.* -d ' /etc/systemd/system/deluge-web.service
then
G_DIETPI-NOTIFY 2 'Patching Deluge web interface service to fix startup at Bullseye'
- G_EXEC sed -i 's/deluge-web -l/deluge-web -d -l/' /etc/systemd/system/deluge-web.service
+ G_EXEC sed --follow-symlinks -i 's/deluge-web -l/deluge-web -d -l/' /etc/systemd/system/deluge-web.service
fi
# Mono: Migrate APT list and key to new location and naming
@@ -331,8 +331,8 @@ Patch_7_7()
if [[ -f '/etc/wireguard/wg0.conf' ]]
then
G_DIETPI-NOTIFY 2 'Updating WireGuard wg0 configuration'
- G_EXEC sed -i '\|/boot/dietpi/func/obtain_network_details|d' /etc/wireguard/wg0.conf
- G_EXEC sed -Ei "s#mawk .NR==3. /(run|boot|DietPi)/dietpi/.network#ip r l 0/0 | mawk '{print \$5;exit}'#g" /etc/wireguard/wg0.conf
+ G_EXEC sed --follow-symlinks -i '\|/boot/dietpi/func/obtain_network_details|d' /etc/wireguard/wg0.conf
+ G_EXEC sed --follow-symlinks -Ei "s#mawk .NR==3. /(run|boot|DietPi)/dietpi/.network#ip r l 0/0 | mawk '{print \$5;exit}'#g" /etc/wireguard/wg0.conf
fi
# GMediaRender: Patch service
@@ -379,7 +379,7 @@ _EOF_
then
/boot/dietpi/func/dietpi-set_software boot_wait_for_network 1
fi
- G_EXEC sed -i '/^[[:blank:]]*CONFIG_BOOT_WAIT_FOR_NETWORK=/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*CONFIG_BOOT_WAIT_FOR_NETWORK=/d' /boot/dietpi.txt
# Enable systemd-timesyncd on oneshot modes to start early at boot
local time_sync_mode=$(sed -n '/^[[:blank:]]*CONFIG_NTP_MODE=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)
@@ -392,8 +392,8 @@ _EOF_
then
[[ -d '/root/.ssh' ]] || G_EXEC mkdir -p /root/.ssh
[[ -f '/root/.ssh/known_hosts' ]] || > /root/.ssh/known_hosts
- G_EXEC sed -i '/^dietpi.com/d' /root/.ssh/known_hosts
- G_EXEC sed -i '/^185.101.93.93/d' /root/.ssh/known_hosts
+ G_EXEC sed --follow-symlinks -i '/^dietpi.com/d' /root/.ssh/known_hosts
+ G_EXEC sed --follow-symlinks -i '/^185.101.93.93/d' /root/.ssh/known_hosts
G_CONFIG_INJECT '\[?ssh.dietpi.com(]:29248)?[[:blank:]]' '[ssh.dietpi.com]:29248 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE6aw3r6aOEqendNu376iiCHr9tGBIWPgfrLkzjXjEsHGyVSUFNnZt6pftrDeK7UX+qX4FxOwQlugG4fymOHbimRCFiv6cf7VpYg1Ednquq9TLb7/cIIbX8a6AuRmX4fjdGuqwmBq3OG7ZksFcYEFKt5U4mAJIaL8hXiM2iXjgY02LqiQY/QWATsHI4ie9ZOnwrQE+Rr6mASN1BVFuIgyHIbwX54jsFSnZ/7CdBMkuAd9B8JkxppWVYpYIFHE9oWNfjh/epdK8yv9Oo6r0w5Rb+4qaAc5g+RAaknHeV6Gp75d2lxBdCm5XknKKbGma2+/DfoE8WZTSgzXrYcRlStYN' /root/.ssh/known_hosts
fi
@@ -407,8 +407,8 @@ _EOF_
Patch_7_8()
{
# Remove IPv4 preference
- G_EXEC sed -i '/CONFIG_PREFER_IPV4/d' /boot/dietpi.txt
- [[ -f '/etc/wgetrc' ]] && G_EXEC sed -i 's/^[[:blank:]]*prefer-family[[:blank:]]*=/#&/' /etc/wgetrc
+ G_EXEC sed --follow-symlinks -i '/CONFIG_PREFER_IPV4/d' /boot/dietpi.txt
+ [[ -f '/etc/wgetrc' ]] && G_EXEC sed --follow-symlinks -i 's/^[[:blank:]]*prefer-family[[:blank:]]*=/#&/' /etc/wgetrc
[[ -f '/etc/apt/apt.conf.d/99-dietpi-force-ipv4' ]] && G_EXEC rm /etc/apt/apt.conf.d/99-dietpi-force-ipv4
# Inform users about removed Subsonic and in case add service to DietPi-Services includes, as it has been removed from the hardcoded list
@@ -427,7 +427,7 @@ Patch_7_8()
fi
fi
# Remove obsolete Subsonic install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[34\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[34\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[34\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[34\]=/d' /boot/dietpi/.installed
# Inform users about removed emonHub and in case add service to DietPi-Services includes, as it has been removed from the hardcoded list
if [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[99\]=2' /boot/dietpi/.installed
@@ -445,9 +445,9 @@ Patch_7_8()
fi
fi
# Remove obsolete emonHub install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[99\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[99\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[99\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[99\]=/d' /boot/dietpi/.installed
# Remove obsolete emonHub API key setting from dietpi.txt
- grep -q 'SOFTWARE_EMONHUB_APIKEY' /boot/dietpi.txt && G_EXEC sed -Ei '/(SOFTWARE_EMONHUB_APIKEY|^#.*EmonCMS)/d' /boot/dietpi.txt
+ grep -q 'SOFTWARE_EMONHUB_APIKEY' /boot/dietpi.txt && G_EXEC sed --follow-symlinks -Ei '/(SOFTWARE_EMONHUB_APIKEY|^#.*EmonCMS)/d' /boot/dietpi.txt
# Reinstall Roon Server
if [[ -f '/boot/dietpi/.installed' && ! -d '/opt/roonserver' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[154\]=2' /boot/dietpi/.installed
@@ -471,7 +471,7 @@ Patch_7_8()
if (( $G_HW_MODEL < 10 )) && grep -Eq '(^|[[:blank:]])rootwait([[:blank:]]|$)' /boot/cmdline.txt && grep -Eq '(^|[[:blank:]])rootdelay=' /boot/cmdline.txt
then
G_DIETPI-NOTIFY 2 'Removing ineffective "rootdelay" argument from /boot/cmdline.txt'
- G_EXEC sed -i -e 's/^rootdelay=[^[:blank:]]*[[:blank:]]*//g' -e 's/[[:blank:]]*[[:blank:]]rootdelay=[^[:blank:]]*//g' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i -e 's/^rootdelay=[^[:blank:]]*[[:blank:]]*//g' -e 's/[[:blank:]]*[[:blank:]]rootdelay=[^[:blank:]]*//g' /boot/cmdline.txt
fi
# DietPi-Backup: Move logs to persistent backup location
@@ -500,7 +500,7 @@ Patch_7_9()
fi
# Update choice and preference index variables
- [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed -Ei -e 's/INDEX_(LOGGING|WEBSERVER|DESKTOP|BROWSER)_CURRENT/INDEX_\1/g' -e '/INDEX_(LOGGING|WEBSERVER|DESKTOP|BROWSER|SSHSERVER|FILESERVER)_TARGET/d' -e '/INDEX_(SSHSERVER|FILESERVER)_CURRENT/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed --follow-symlinks -Ei -e 's/INDEX_(LOGGING|WEBSERVER|DESKTOP|BROWSER)_CURRENT/INDEX_\1/g' -e '/INDEX_(LOGGING|WEBSERVER|DESKTOP|BROWSER|SSHSERVER|FILESERVER)_TARGET/d' -e '/INDEX_(SSHSERVER|FILESERVER)_CURRENT/d' /boot/dietpi/.installed
# Offer to update DietPi-Dashboard TCP port: https://github.com/MichaIng/DietPi/issues/4966
if [[ -f '/opt/dietpi-dashboard/config.toml' ]] && grep -Eq '^[[:blank:]]*port[[:blank:]]+=[[:blank:]]+8088$' /opt/dietpi-dashboard/config.toml
@@ -513,8 +513,8 @@ Patch_7_9()
fi
# ownCloud/Nextcloud: Disable maintenance mode once manually, since DietPi-Services enabled of before this update but doesn't handle/disable it anymore afterwards.
- [[ -f '/var/www/owncloud/config/config.php' ]] && grep -Eq "^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$" /var/www/owncloud/config/config.php && G_EXEC sed -Ei "s/^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$/ 'maintenance' => false,/" /var/www/owncloud/config/config.php
- [[ -f '/var/www/nextcloud/config/config.php' ]] && grep -Eq "^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$" /var/www/nextcloud/config/config.php && G_EXEC sed -Ei "s/^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$/ 'maintenance' => false,/" /var/www/nextcloud/config/config.php
+ [[ -f '/var/www/owncloud/config/config.php' ]] && grep -Eq "^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$" /var/www/owncloud/config/config.php && G_EXEC sed --follow-symlinks -Ei "s/^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$/ 'maintenance' => false,/" /var/www/owncloud/config/config.php
+ [[ -f '/var/www/nextcloud/config/config.php' ]] && grep -Eq "^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$" /var/www/nextcloud/config/config.php && G_EXEC sed --follow-symlinks -Ei "s/^[[:blank:]]*'maintenance'[[:blank:]]+=>[[:blank:]]+true,\$/ 'maintenance' => false,/" /var/www/nextcloud/config/config.php
}
Patch_8_0()
@@ -525,7 +525,7 @@ Patch_8_0()
G_DIETPI-NOTIFY 2 'Fixing doubled CMA size in KMS overlay setting'
while grep -Eq 'dtoverlay=vc4-f?kms-v3d.*,cma-.*,cma-' /boot/config.txt
do
- G_EXEC sed -Ei '/dtoverlay=vc4-f?kms-v3d.*,cma-.*,cma-/s/,cma-[^,]*//' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei '/dtoverlay=vc4-f?kms-v3d.*,cma-.*,cma-/s/,cma-[^,]*//' /boot/config.txt
done
fi
@@ -551,10 +551,10 @@ Patch_8_0()
fi
# RPi: Fix forced max frequencies: https://github.com/MichaIng/DietPi/issues/5088
- (( $G_HW_MODEL < 10 )) && grep -Eq '(.){100}' /boot/config.txt && G_EXEC sed -Ei 's/^((.){99})..*$/\1/' /boot/config.txt
+ (( $G_HW_MODEL < 10 )) && grep -Eq '(.){100}' /boot/config.txt && G_EXEC sed --follow-symlinks -Ei 's/^((.){99})..*$/\1/' /boot/config.txt
# Blynk Server: Apply Log4Shell mitigation
- [[ -f '/etc/systemd/system/blynkserver.service' ]] && ! grep -q '\-Dlog4j2.formatMsgNoLookups=true' /etc/systemd/system/blynkserver.service && G_EXEC sed -i 's/java -jar/java -Dlog4j2.formatMsgNoLookups=true -jar/' /etc/systemd/system/blynkserver.service
+ [[ -f '/etc/systemd/system/blynkserver.service' ]] && ! grep -q '\-Dlog4j2.formatMsgNoLookups=true' /etc/systemd/system/blynkserver.service && G_EXEC sed --follow-symlinks -i 's/java -jar/java -Dlog4j2.formatMsgNoLookups=true -jar/' /etc/systemd/system/blynkserver.service
}
Patch_8_1()
@@ -566,7 +566,7 @@ Patch_8_1()
# RPi: Remove obsolete VCSM overlay since the device node has been removed
if (( $G_HW_MODEL < 10 ))
then
- grep -q 'dtoverlay=dietpi-disable_vcsm' /boot/config.txt && G_EXEC sed -i '/dtoverlay=dietpi-disable_vcsm/d' /boot/config.txt
+ grep -q 'dtoverlay=dietpi-disable_vcsm' /boot/config.txt && G_EXEC sed --follow-symlinks -i '/dtoverlay=dietpi-disable_vcsm/d' /boot/config.txt
[[ -f '/boot/overlays/dietpi-disable_vcsm.dtbo' ]] && G_EXEC rm /boot/overlays/dietpi-disable_vcsm.dtbo
fi
@@ -587,10 +587,10 @@ _EOF_
Patch_8_2()
{
# Remove obsolete quotation from armbianEnv.txt
- [[ -f '/boot/armbianEnv.txt' ]] && grep -q '^[[:blank:]]*extraargs="' /boot/armbianEnv.txt && G_EXEC sed -i -e 's/^[[:blank:]]*extraargs="[[:blank:]]*/extraargs=/' -e 's/[[:blank:]]*"[[:blank:]]*$//' /boot/armbianEnv.txt
+ [[ -f '/boot/armbianEnv.txt' ]] && grep -q '^[[:blank:]]*extraargs="' /boot/armbianEnv.txt && G_EXEC sed --follow-symlinks -i -e 's/^[[:blank:]]*extraargs="[[:blank:]]*/extraargs=/' -e 's/[[:blank:]]*"[[:blank:]]*$//' /boot/armbianEnv.txt
# RPi: Remove multiple cgroup_enable=memory entries from cmdline.txt: https://github.com/MichaIng/DietPi/issues/5225#issuecomment-1033056312
- [[ -f '/boot/cmdline.txt' ]] && while grep -q 'cgroup_enable=memory cgroup_enable=memory' /boot/cmdline.txt; do G_EXEC sed -i 's/cgroup_enable=memory cgroup_enable=memory/cgroup_enable=memory/g' /boot/cmdline.txt; done
+ [[ -f '/boot/cmdline.txt' ]] && while grep -q 'cgroup_enable=memory cgroup_enable=memory' /boot/cmdline.txt; do G_EXEC sed --follow-symlinks -i 's/cgroup_enable=memory cgroup_enable=memory/cgroup_enable=memory/g' /boot/cmdline.txt; done
# Apply cgroups-v2 workaround if the kernel does not support it: https://github.com/MichaIng/DietPi/issues/4705
# - This is required on Bullseye only, but we'll apply it on Buster as well to cover later distro upgrades, since the logic is too complicated for our upgrade blog article.
@@ -600,19 +600,19 @@ Patch_8_2()
if [[ $G_HW_MODEL -gt 9 && $G_HW_MODEL -le 16 && -f '/boot/boot.ini' ]] && ! grep -q 'systemd.unified_cgroup_hierarchy=0' /boot/boot.ini
then
G_DIETPI-NOTIFY 2 'Forcing legacy cgroups v1 hierarchy on old kernel device'
- G_EXEC sed -i '/^setenv bootargs "/s/"$/ systemd.unified_cgroup_hierarchy=0"/' /boot/boot.ini
+ G_EXEC sed --follow-symlinks -i '/^setenv bootargs "/s/"$/ systemd.unified_cgroup_hierarchy=0"/' /boot/boot.ini
# Sparky SBC
elif [[ $G_HW_MODEL == 70 && -f '/boot/uenv.txt' ]] && ! grep -q 'systemd.unified_cgroup_hierarchy=0' /boot/uenv.txt
then
G_DIETPI-NOTIFY 2 'Forcing legacy cgroups v1 hierarchy on old kernel device'
- G_EXEC sed -i '/^bootargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/uenv.txt
+ G_EXEC sed --follow-symlinks -i '/^bootargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/uenv.txt
# ROCK Pi S
elif [[ $G_HW_MODEL == 73 && -f '/boot/boot.cmd' ]] && ! grep -q 'systemd.unified_cgroup_hierarchy=0' /boot/boot.cmd
then
G_DIETPI-NOTIFY 2 'Forcing legacy cgroups v1 hierarchy on old kernel device'
- G_EXEC sed -i '/^setenv bootargs "/s/"$/ systemd.unified_cgroup_hierarchy=0"/' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i '/^setenv bootargs "/s/"$/ systemd.unified_cgroup_hierarchy=0"/' /boot/boot.cmd
G_AG_CHECK_INSTALL_PREREQ u-boot-tools
G_EXEC mkimage -C none -A arm64 -T script -d /boot/boot.cmd /boot/boot.scr
fi
@@ -622,7 +622,7 @@ Patch_8_2()
if [[ $G_HW_MODEL == 40 && $(uname -r) == '5'* ]]
then
[[ -f '/etc/bashrc.d/dietpi-pine64-cursorfix.sh' ]] && G_EXEC rm /etc/bashrc.d/dietpi-pine64-cursorfix.sh
- grep -q '^8723bs$' /etc/modules && G_EXEC sed -i '/^8723bs$/d' /etc/modules
+ grep -q '^8723bs$' /etc/modules && G_EXEC sed --follow-symlinks -i '/^8723bs$/d' /etc/modules
fi
# Remove and migrate Chromium config files
@@ -635,7 +635,7 @@ Patch_8_2()
[[ -f '/etc/chromium.d/custom_flags' ]] && G_EXEC mv /etc/chromium.d/{custom_flags,dietpi}
# Remove obsolete Nvidia install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[151\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[151\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[151\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[151\]=/d' /boot/dietpi/.installed
# Deluge: Apply autoconnect for web interface
if [[ -f '/mnt/dietpi_userdata/deluge/.config/deluge/hostlist.conf' && -f '/mnt/dietpi_userdata/deluge/.config/deluge/web.conf' ]] && grep -q '"default_daemon": "",' /mnt/dietpi_userdata/deluge/.config/deluge/web.conf
@@ -653,11 +653,11 @@ Patch_8_4()
if [[ -f '/boot/armbianEnv.txt' ]] && grep -q 'extraargs="net.ifnames=0"' /boot/armbianEnv.txt
then
G_DIETPI-NOTIFY 2 'Fixing syntax for legacy network interface nameing (eth0/wlan0). \e[33mNB: If you rely on "predictable" interface naming (enp0s0/wlp0s0), remove "net.ifnames=0" from /boot/armbianEnv.txt!'
- G_EXEC sed -i 's/extraargs="net.ifnames=0"/extraargs=net.ifnames=0/' /boot/armbianEnv.txt
+ G_EXEC sed --follow-symlinks -i 's/extraargs="net.ifnames=0"/extraargs=net.ifnames=0/' /boot/armbianEnv.txt
fi
# Update workaround for numpy on ARMv6/7 Buster
- (( $G_HW_ARCH < 3 && $G_DISTRO == 5 )) && [[ -f '/etc/pip-constraints.txt' ]] && G_EXEC sed -i '/^numpy!=1.21.5; python_version=='\''3.7'\''$/c\numpy<1.21.5; python_version=='\''3.7'\' /etc/pip-constraints.txt
+ (( $G_HW_ARCH < 3 && $G_DISTRO == 5 )) && [[ -f '/etc/pip-constraints.txt' ]] && G_EXEC sed --follow-symlinks -i '/^numpy!=1.21.5; python_version=='\''3.7'\''$/c\numpy<1.21.5; python_version=='\''3.7'\' /etc/pip-constraints.txt
# https://github.com/MichaIng/DietPi/issues/5441
if [[ -f '/etc/sudoers.d/dietpi' ]]
@@ -667,11 +667,11 @@ Patch_8_4()
fi
# Remove obsolete software preference indices
- [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed -Ei '/^[[:blank:]]*INDEX_(WEBSERVER|DESKTOP|BROWSER)=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*INDEX_(WEBSERVER|DESKTOP|BROWSER)=/d' /boot/dietpi/.installed
# Remove obsolete license file and setting
[[ -f '/var/lib/dietpi/license.txt' ]] && G_EXEC rm /var/lib/dietpi/license.txt
- G_EXEC sed -i '/^[[:blank:]]*AUTO_SETUP_ACCEPT_LICENSE=/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*AUTO_SETUP_ACCEPT_LICENSE=/d' /boot/dietpi.txt
# Update DietPi initramfs cleanup script, following reasonable changes done by Armbian
if [[ -f '/etc/kernel/preinst.d/dietpi-initramfs_cleanup' ]]
@@ -695,7 +695,7 @@ Patch_8_4()
fi
# Remove obsolete OpenBazaar install state
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[58\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[58\]=/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[58\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[58\]=/d' /boot/dietpi/.installed
}
Patch_8_5(){ :; }
@@ -731,7 +731,7 @@ Patch_8_7()
(( $G_HW_MODEL > 9 )) || while grep -q 'cgroup_enable=memory.* cgroup_enable=memory' /boot/cmdline.txt
do
G_DIETPI-NOTIFY 2 'Removing duplicate "cgroup_enable=memory" kernel command-line argument...'
- G_EXEC sed -i 's/ cgroup_enable=memory//' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i 's/ cgroup_enable=memory//' /boot/cmdline.txt
done
}
@@ -765,8 +765,8 @@ Patch_8_9()
if [[ -f '/etc/turnserver.conf' && -f '/boot/dietpi/.installed' ]] && grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[168\]=2' /boot/dietpi/.installed
then
G_DIETPI-NOTIFY 2 'Removing obsolete Coturn settings...'
- grep -q '^[[:blank:]]*use-auth-secret' /etc/turnserver.conf && grep -q '^[[:blank:]]*lt-cred-mech' /etc/turnserver.conf && G_EXEC sed -i 's/^[[:blank:]]*lt-cred-mech/#lt-cred-mech/' /etc/turnserver.conf
- grep -q '^[[:blank:]]*no-loopback-peers' /etc/turnserver.conf && G_EXEC sed -i -e '/^[[:blank:]]*no-loopback-peers/d' -e 's/^[[:blank:]]*allow-loopback-peers/#allow-loopback-peers/' /etc/turnserver.conf
+ grep -q '^[[:blank:]]*use-auth-secret' /etc/turnserver.conf && grep -q '^[[:blank:]]*lt-cred-mech' /etc/turnserver.conf && G_EXEC sed --follow-symlinks -i 's/^[[:blank:]]*lt-cred-mech/#lt-cred-mech/' /etc/turnserver.conf
+ grep -q '^[[:blank:]]*no-loopback-peers' /etc/turnserver.conf && G_EXEC sed --follow-symlinks -i -e '/^[[:blank:]]*no-loopback-peers/d' -e 's/^[[:blank:]]*allow-loopback-peers/#allow-loopback-peers/' /etc/turnserver.conf
fi
}
@@ -809,12 +809,12 @@ Patch_8_11()
if [[ -f '/etc/apt/sources.list.d/armbian.list' ]] && grep -q 'http://apt.armbian.com' /etc/apt/sources.list.d/armbian.list
then
G_DIETPI-NOTIFY 2 'Connecting to apt.armbian.com via secure HTTPS since their router now handles HTTPS redirects reliably'
- G_EXEC sed -i 's|http://apt.armbian.com|https://apt.armbian.com|' /etc/apt/sources.list.d/armbian.list
+ G_EXEC sed --follow-symlinks -i 's|http://apt.armbian.com|https://apt.armbian.com|' /etc/apt/sources.list.d/armbian.list
fi
if [[ -f '/etc/apt/sources.list.d/dietpi-armbian.list' ]] && grep -q 'http://apt.armbian.com' /etc/apt/sources.list.d/dietpi-armbian.list
then
G_DIETPI-NOTIFY 2 'Connecting to apt.armbian.com via secure HTTPS since their router now handles HTTPS redirects reliably'
- G_EXEC sed -i 's|http://apt.armbian.com|https://apt.armbian.com|' /etc/apt/sources.list.d/dietpi-armbian.list
+ G_EXEC sed --follow-symlinks -i 's|http://apt.armbian.com|https://apt.armbian.com|' /etc/apt/sources.list.d/dietpi-armbian.list
fi
if (( $G_HW_MODEL == 56 ))
@@ -823,7 +823,7 @@ Patch_8_11()
if [[ -f '/boot/dtb/rockchip/rk3328-nanopi-neo3-rev02.dtb' ]] && grep -q 'rk3328-nanopi-r2-rev00.dtb' /boot/armbianEnv.txt
then
G_DIETPI-NOTIFY 2 'Switching back to NEO3 device tree, which is available again'
- G_EXEC sed -i 's/rk3328-nanopi-r2-rev00.dtb/rk3328-nanopi-neo3-rev02.dtb/' /boot/armbianEnv.txt
+ G_EXEC sed --follow-symlinks -i 's/rk3328-nanopi-r2-rev00.dtb/rk3328-nanopi-neo3-rev02.dtb/' /boot/armbianEnv.txt
fi
fi
@@ -847,11 +847,11 @@ Patch_8_11()
elif (( $G_HW_MODEL == 52 ))
then
# https://github.com/MichaIng/DietPi/issues/5554
- grep -q 'systemd.unified_cgroup_hierarchy=0' /boot/armbianEnv.txt || G_EXEC sed -i '/^extraargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/armbianEnv.txt
+ grep -q 'systemd.unified_cgroup_hierarchy=0' /boot/armbianEnv.txt || G_EXEC sed --follow-symlinks -i '/^extraargs=/s/$/ systemd.unified_cgroup_hierarchy=0/' /boot/armbianEnv.txt
fi
# https://github.com/MichaIng/DietPi/issues/5830
- [[ -f '/var/lib/dietpi/dietpi-ddns/update.sh' ]] && grep -q '^curl -6or4' /var/lib/dietpi/dietpi-ddns/update.sh && G_EXEC sed -i 's/^curl -6or4/curl/' /var/lib/dietpi/dietpi-ddns/update.sh
+ [[ -f '/var/lib/dietpi/dietpi-ddns/update.sh' ]] && grep -q '^curl -6or4' /var/lib/dietpi/dietpi-ddns/update.sh && G_EXEC sed --follow-symlinks -i 's/^curl -6or4/curl/' /var/lib/dietpi/dietpi-ddns/update.sh
[[ -f '/etc/dpkg/dpkg.cfg.d/01-dietpi-exclude_doubled_devicetrees' ]] && G_EXEC_DESC='Removing obsolete DPKG exclude' G_EXEC rm /etc/dpkg/dpkg.cfg.d/01-dietpi-exclude_doubled_devicetrees
}
@@ -893,7 +893,7 @@ _EOF_
if [[ $G_HW_MODEL == 12 && -f '/boot/boot.cmd' ]] && ! grep -q 'usbcore.autosuspend=-1' /boot/boot.cmd
then
G_DIETPI-NOTIFY 2 'Fixing USB device detection on Odroid C2'
- G_EXEC sed -i 's/coherent_pool=2M/coherent_pool=2M usbcore.autosuspend=-1/' /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -i 's/coherent_pool=2M/coherent_pool=2M usbcore.autosuspend=-1/' /boot/boot.cmd
G_EXEC mkimage -C none -A arm64 -T script -d /boot/boot.cmd /boot/boot.scr
fi
}
@@ -951,7 +951,7 @@ Patch_8_15()
[[ -d '/etc/systemd/system/haveged.service.d' ]] || G_EXEC rm -R /etc/systemd/system/haveged.service.d
# Revert with new kernel: https://github.com/MichaIng/DietPi/issues/5890
- grep -q ' systemd.unified_cgroup_hierarchy=0' /boot/extlinux/extlinux.conf && G_EXEC sed -i '/^append /s/ systemd.unified_cgroup_hierarchy=0//' /boot/extlinux/extlinux.conf
+ grep -q ' systemd.unified_cgroup_hierarchy=0' /boot/extlinux/extlinux.conf && G_EXEC sed --follow-symlinks -i '/^append /s/ systemd.unified_cgroup_hierarchy=0//' /boot/extlinux/extlinux.conf
fi
(( $G_DISTRO > 6 )) || for i in '/etc/systemd/system/serial-getty@'*'.service.d/dietpi-baudrate.conf'
@@ -971,7 +971,7 @@ _EOF_
grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[60\]=2' /boot/dietpi/.installed && G_EXEC systemctl enable hostapd isc-dhcp-server
# Remove obsolete Build-Essential install state
- grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[16\]=' /boot/dietpi/.installed && G_EXEC sed -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[16\]=/d' /boot/dietpi/.installed
+ grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[16\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[16\]=/d' /boot/dietpi/.installed
# Remove obsolete CAVA console font
grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[119\]=' /boot/dietpi/.installed && G_EXEC rm -f /{root,home/*}/cava.psf
@@ -985,7 +985,7 @@ Patch_8_16()
if systemctl -q is-enabled 'serial-getty@ttyS2'
then
G_DIETPI-NOTIFY 2 'Fixing UART console on ttyFIQ0 instead of ttyS2'
- G_EXEC sed -i '/^consoleargs=console=ttyS2,1500000 console=tty1$/c\consoleargs=console=ttyFIQ0,1500000 console=tty1' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i '/^consoleargs=console=ttyS2,1500000 console=tty1$/c\consoleargs=console=ttyFIQ0,1500000 console=tty1' /boot/dietpiEnv.txt
/boot/dietpi/func/dietpi-set_hardware serialconsole disable ttyS2
/boot/dietpi/func/dietpi-set_hardware serialconsole enable ttyFIQ0
fi
@@ -1096,7 +1096,7 @@ Patch_8_16()
fi
# Remove custom mode from /var/log tmpfs mount. It has common 0755 by default, not sure why we change that.
- grep -q '^tmpfs /var/log tmpfs .*,mode=1777$' /etc/fstab && G_EXEC sed -i '\|^tmpfs /var/log tmpfs |s|,mode=1777$||' /etc/fstab
+ grep -q '^tmpfs /var/log tmpfs .*,mode=1777$' /etc/fstab && G_EXEC sed --follow-symlinks -i '\|^tmpfs /var/log tmpfs |s|,mode=1777$||' /etc/fstab
# CONFIG_GPU_DRIVER Change: https://github.com/MichaIng/DietPi/issues/6262
if (( $G_HW_MODEL == 21 && $G_DIETPI_INSTALL_STAGE == 2 ))
@@ -1127,13 +1127,13 @@ Patch_8_17()
[[ -f '/etc/modprobe.d/dietpi-disable_rpi_sound.conf' ]] && G_EXEC mv /etc/modprobe.d/dietpi-disable_rpi_{sound,audio}.conf
if grep -q '^[[:blank:]]*dtoverlay=dietpi-disable_hdmi_audio' /boot/config.txt
then
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=dietpi-disable_hdmi_audio/d' /boot/config.txt
- G_EXEC sed -i '/root=/s/$/ snd_bcm2835.enable_hdmi=0/' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=dietpi-disable_hdmi_audio/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/root=/s/$/ snd_bcm2835.enable_hdmi=0/' /boot/cmdline.txt
fi
if grep -q '^[[:blank:]]*dtoverlay=dietpi-disable_headphones' /boot/config.txt
then
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=dietpi-disable_headphones/d' /boot/config.txt
- G_EXEC sed -i '/root=/s/$/ snd_bcm2835.enable_headphones=0/' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=dietpi-disable_headphones/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/root=/s/$/ snd_bcm2835.enable_headphones=0/' /boot/cmdline.txt
fi
[[ -f '/boot/overlays/dietpi-disable_hdmi_audio.dtbo' ]] && G_EXEC rm /boot/overlays/dietpi-disable_hdmi_audio.dtbo
[[ -f '/boot/overlays/dietpi-disable_headphones.dtbo' ]] && G_EXEC rm /boot/overlays/dietpi-disable_headphones.dtbo
@@ -1142,13 +1142,13 @@ Patch_8_17()
if (( $G_DISTRO > 5 )) && grep -q '^[[:blank:]]*dtoverlay=rpivid-v4l2$' /boot/config.txt
then
G_DIETPI-NOTIFY 2 'Removing deprecated device tree overlay: rpivid-v4l2'
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=rpivid-v4l2$/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=rpivid-v4l2$/d' /boot/config.txt
fi
# Sparky SBC: Fix Roonbridge: https://dietpi.com/forum/t/allogui-not-working-apache-service-doesnt-start/15708/13
elif (( $G_HW_MODEL == 70 ))
then
- [[ -f '/etc/systemd/system/roonbridge.service' ]] && G_EXEC sed -i '/^AmbientCapabilities=/d' /etc/systemd/system/roonbridge.service
+ [[ -f '/etc/systemd/system/roonbridge.service' ]] && G_EXEC sed --follow-symlinks -i '/^AmbientCapabilities=/d' /etc/systemd/system/roonbridge.service
[[ -f '/etc/systemd/system/roonbridge.service.d/dietpi-no-caps.conf' ]] && G_EXEC rm /etc/systemd/system/roonbridge.service.d/dietpi-no-caps.conf
[[ -f '/etc/systemd/system/roonbridge.service.d' ]] && G_EXEC rmdir --ignore-fail-on-non-empty /etc/systemd/system/roonbridge.service.d
@@ -1253,10 +1253,10 @@ Patch_8_19()
if [[ -f '/boot/dietpi/.installed' ]]
then
# Remove obsolete Spotify Connect Web and Firefox Sync Server install states
- grep -Eq '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(141|177)\]=' /boot/dietpi/.installed && G_EXEC sed -Ei '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(141|177)\]=/d' /boot/dietpi/.installed
+ grep -Eq '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(141|177)\]=' /boot/dietpi/.installed && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[(141|177)\]=/d' /boot/dietpi/.installed
# Mopidy: Bullseye suite now available in official APT repo
- (( $G_DISTRO > 5 )) && [[ -f '/etc/apt/sources.list.d/mopidy.list' ]] && grep -q buster /etc/apt/sources.list.d/mopidy.list && G_EXEC sed -i 's/buster/bullseye/' /etc/apt/sources.list.d/mopidy.list
+ (( $G_DISTRO > 5 )) && [[ -f '/etc/apt/sources.list.d/mopidy.list' ]] && grep -q buster /etc/apt/sources.list.d/mopidy.list && G_EXEC sed --follow-symlinks -i 's/buster/bullseye/' /etc/apt/sources.list.d/mopidy.list
# GMediaRender
grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[163\]=2' /boot/dietpi/.installed && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' gmediarender 2> /dev/null)" lt 0.1-dietpi1 && G_WHIP_MSG '[ INFO ] GMediaRender update available
@@ -1323,22 +1323,22 @@ Patch_8_20()
# - Apache
if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[83\]=2' /boot/dietpi/.installed
then
- [[ -f '/etc/apache2/conf-available/dietpi.conf' ]] && G_EXEC sed -i '/^Header set X-XSS-Protection "/c\Header set X-XSS-Protection "0"' /etc/apache2/conf-available/dietpi.conf
+ [[ -f '/etc/apache2/conf-available/dietpi.conf' ]] && G_EXEC sed --follow-symlinks -i '/^Header set X-XSS-Protection "/c\Header set X-XSS-Protection "0"' /etc/apache2/conf-available/dietpi.conf
# Nextcloud: Revert to mute Nextcloud's outdated admin panel warning
- [[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] && G_EXEC sed -i '/<\/IfModule>/a\\n\t# Mute outdated admin panel warning\n\tHeader set X-XSS-Protection "1; mode=block"' /etc/apache2/sites-available/dietpi-nextcloud.conf
+ [[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] && G_EXEC sed --follow-symlinks -i '/<\/IfModule>/a\\n\t# Mute outdated admin panel warning\n\tHeader set X-XSS-Protection "1; mode=block"' /etc/apache2/sites-available/dietpi-nextcloud.conf
fi
# - ownCloud
if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[47\]=2' /boot/dietpi/.installed
then
- [[ -f '/etc/nginx/sites-dietpi/dietpi-owncloud.conf' ]] && G_EXEC sed -i 's/add_header X-XSS-Protection "1; mode=block" always;/add_header X-XSS-Protection "0" always;/' /etc/nginx/sites-dietpi/dietpi-owncloud.conf
- [[ -f '/etc/lighttpd/conf-available/99-dietpi-owncloud.conf' ]] && G_EXEC sed -i 's/"X-XSS-Protection" => "1; mode=block"/"X-XSS-Protection" => "0"/' /etc/lighttpd/conf-available/99-dietpi-owncloud.conf
+ [[ -f '/etc/nginx/sites-dietpi/dietpi-owncloud.conf' ]] && G_EXEC sed --follow-symlinks -i 's/add_header X-XSS-Protection "1; mode=block" always;/add_header X-XSS-Protection "0" always;/' /etc/nginx/sites-dietpi/dietpi-owncloud.conf
+ [[ -f '/etc/lighttpd/conf-available/99-dietpi-owncloud.conf' ]] && G_EXEC sed --follow-symlinks -i 's/"X-XSS-Protection" => "1; mode=block"/"X-XSS-Protection" => "0"/' /etc/lighttpd/conf-available/99-dietpi-owncloud.conf
fi
# - Pi-hole
if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[93\]=2' /boot/dietpi/.installed
then
- [[ -f '/etc/nginx/sites-dietpi/dietpi-pihole.conf' ]] && G_EXEC sed -i 's/add_header X-XSS-Protection "1; mode=block";/add_header X-XSS-Protection "0";/' /etc/nginx/sites-dietpi/dietpi-pihole.conf
- [[ -f '/etc/lighttpd/conf-available/99-dietpi-pihole.conf' ]] && G_EXEC sed -i 's/"X-XSS-Protection" => "1; mode=block"/"X-XSS-Protection" => "0"/' /etc/lighttpd/conf-available/99-dietpi-pihole.conf
+ [[ -f '/etc/nginx/sites-dietpi/dietpi-pihole.conf' ]] && G_EXEC sed --follow-symlinks -i 's/add_header X-XSS-Protection "1; mode=block";/add_header X-XSS-Protection "0";/' /etc/nginx/sites-dietpi/dietpi-pihole.conf
+ [[ -f '/etc/lighttpd/conf-available/99-dietpi-pihole.conf' ]] && G_EXEC sed --follow-symlinks -i 's/"X-XSS-Protection" => "1; mode=block"/"X-XSS-Protection" => "0"/' /etc/lighttpd/conf-available/99-dietpi-pihole.conf
fi
# DietPi-Dashboard: https://github.com/ravenclaw900/DietPi-Dashboard/releases/tag/v0.6.2
@@ -1365,7 +1365,7 @@ Patch_8_21()
local apackages=('linux-image-legacy-rk35xx' 'linux-dtb-legacy-rk35xx')
dpkg-query -s 'linux-headers-legacy-rockchip-rk3588' &> /dev/null && apackages+=('linux-headers-legacy-rk35xx')
G_AGI "${apackages[@]}"
- (( $G_HW_MODEL == 80 )) && G_CONFIG_INJECT 'overlay_prefix=' 'overlay_prefix=rk3588' /boot/dietpiEnv.txt && G_EXEC sed -i '/^[[:blank:]]*fdtfile=/d' /boot/dietpiEnv.txt
+ (( $G_HW_MODEL == 80 )) && G_CONFIG_INJECT 'overlay_prefix=' 'overlay_prefix=rk3588' /boot/dietpiEnv.txt && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*fdtfile=/d' /boot/dietpiEnv.txt
G_EXEC apt-mark auto "${apackages[@]/rk35xx/rockchip-rk3588}"
fi
}
@@ -1398,7 +1398,7 @@ _EOF_
elif (( $G_HW_MODEL == 80 )) && grep -q '^fdtfile=$' /boot/dietpiEnv.txt
then
G_DIETPI-NOTIFY 2 'Fixing fdtfile entry in dietpiEnv.txt ...'
- G_EXEC sed -i '/^fdtfile=$/d' /boot/dietpiEnv.txt
+ G_EXEC sed --follow-symlinks -i '/^fdtfile=$/d' /boot/dietpiEnv.txt
fi
}
@@ -1474,21 +1474,8 @@ Patch_8_23()
Patch_8_24()
{
- # Quartz64
- if (( $G_HW_MODEL == 49 ))
- then
- for i in quartz64{a,b} soquartz
- do
- dpkg --compare-versions "$(dpkg-query -Wf '${Version}' "firmware-$i" 2> /dev/null)" lt-nl 6.5.11-dietpi2 || continue
- G_DIETPI-NOTIFY 2 "Updating $i kernel and bootloader ..."
- G_EXEC_OUTPUT=1 G_EXEC curl -fo package.deb "https://dietpi.com/downloads/binaries/firmware-$i.deb"
- G_EXEC_OUTPUT=1 G_EXEC dpkg -i --force-confdef,confold package.deb
- G_EXEC rm package.deb
- break
- done
-
# ROCK 3A: The "rk35xx" kernel packages have been merged into "rockchip64", and "edge-rk35xx" is Linux 6.1.11, older than "current-rockchip64", which is 6.1.50
- elif (( $G_HW_MODEL == 77 )) && dpkg-query -s 'linux-image-edge-rk35xx' &> /dev/null
+ if (( $G_HW_MODEL == 77 )) && dpkg-query -s 'linux-image-edge-rk35xx' &> /dev/null
then
G_DIETPI-NOTIFY 2 'Updating ROCK 3A kernel package ...'
local apackages=('linux-image-current-rockchip64' 'linux-dtb-current-rockchip64')
@@ -1496,14 +1483,6 @@ Patch_8_24()
G_AGI "${apackages[@]}"
G_EXEC apt-mark auto "${apackages[@]/current-rockchip64/edge-rk35xx}"
- # VisionFive 2
- elif (( $G_HW_MODEL == 81 )) && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' linux-image-visionfive2 2> /dev/null)" lt-nl 6.1.62-dietpi1
- then
- G_DIETPI-NOTIFY 2 'Updating RISC-V StarFive VisionFive 2 kernel ...'
- G_EXEC_OUTPUT=1 G_EXEC curl -fo package.deb 'https://dietpi.com/downloads/binaries/linux-image-visionfive2.deb'
- G_EXEC_OUTPUT=1 G_EXEC dpkg -i --force-confdef,confold package.deb
- G_EXEC rm package.deb
-
# Orange Pi Zero 3: Pre-v8.24 WiFi config migration
elif [[ $G_HW_MODEL == 83 && -f '/etc/modules-load.d/dietpi-enable_wifi.conf' ]]
then
@@ -1527,9 +1506,38 @@ Patch_8_24()
G_AGI ./package.deb
G_EXEC rm package.deb
fi
+ fi
+}
+Patch_8_25()
+{
+ # Quartz64
+ if (( $G_HW_MODEL == 49 ))
+ then
+ for i in quartz64{a,b} soquartz
+ do
+ dpkg --compare-versions "$(dpkg-query -Wf '${Version}' "firmware-$i" 2> /dev/null)" lt-nl 6.6.7-dietpi1 || continue
+ G_DIETPI-NOTIFY 2 "Updating $i kernel and bootloader ..."
+ G_EXEC_OUTPUT=1 G_EXEC curl -fo package.deb "https://dietpi.com/downloads/binaries/firmware-$i.deb"
+ G_EXEC_OUTPUT=1 G_EXEC dpkg -i --force-confdef,confold package.deb
+ G_EXEC rm package.deb
+ break
+ done
+
+ # VisionFive 2
+ elif (( $G_HW_MODEL == 81 )) && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' linux-image-visionfive2 2> /dev/null)" lt-nl 6.1.68-dietpi1
+ then
+ G_DIETPI-NOTIFY 2 'Updating RISC-V StarFive VisionFive 2 kernel ...'
+ G_EXEC_OUTPUT=1 G_EXEC curl -fo package.deb 'https://dietpi.com/downloads/binaries/linux-image-visionfive2.deb'
+ G_EXEC_OUTPUT=1 G_EXEC dpkg -i --force-confdef,confold package.deb
+ G_EXEC rm package.deb
+ fi
+
+ # Software updates and migrations
+ if [[ -f '/boot/dietpi/.installed' ]]
+ then
# vaultwarden
- if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[183\]=2' /boot/dietpi/.installed && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' vaultwarden 2> /dev/null)" lt 1.30.0-dietpi1
+ if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[183\]=2' /boot/dietpi/.installed && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' vaultwarden 2> /dev/null)" lt 1.30.1-dietpi2
then
# Pre-v8.7 cleanup
if [[ -f '/opt/vaultwarden/target/release/vaultwarden' ]]
@@ -1544,12 +1552,23 @@ Patch_8_24()
fi
# Amiberry
- grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[108\]=2' /boot/dietpi/.installed && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' amiberry 2> /dev/null)" lt 5.6.3-dietpi1 && G_WHIP_YESNO '[ INFO ] Amiberry update available
-\nAn update to Amiberry v5.6.3 is available, including LibSDL2 v2.28.5.
+ grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[108\]=2' /boot/dietpi/.installed && dpkg --compare-versions "$(dpkg-query -Wf '${Version}' amiberry 2> /dev/null)" lt 5.6.4-dietpi2 && G_WHIP_YESNO '[ INFO ] Amiberry update available
+\nAn update to Amiberry v5.6.4 is available, including LibSDL2 v2.28.5.
Release notes: https://github.com/BlitterStudio/amiberry/releases
\nDo you want to apply the update now?
\nYou can manually apply it any time via:
# dietpi-software reinstall 108' && echo 108 >> /var/tmp/dietpi/dietpi-update_reinstalls
+
+ # NZBGet: Disable file logging
+ if grep -q '^[[:blank:]]*aSOFTWARE_INSTALL_STATE\[149\]=2' /boot/dietpi/.installed && [[ -f '/mnt/dietpi_userdata/nzbget/nzbget.conf' ]]
+ then
+ G_CONFIG_INJECT 'WriteLog=' 'WriteLog=none' /mnt/dietpi_userdata/nzbget/nzbget.conf
+ [[ -f '/etc/systemd/system/nzbget.service' ]] && G_EXEC sed --follow-symlinks -i -e '/^Type=/d' -e '/^ExecStart=/c\ExecStart=/mnt/dietpi_userdata/nzbget/nzbget -so OutputMode=log' /etc/systemd/system/nzbget.service
+ [[ -f '/var/log/nzbget.log' ]] && G_EXEC rm /var/log/nzbget.log
+ fi
+
+ # TasmoAdmin with Lighttpd: https://github.com/MichaIng/DietPi/issues/6805
+ [[ -f '/etc/lighttpd/conf-available/99-dietpi-tasmoadmin.conf' ]] && G_EXEC curl -sSfo /etc/lighttpd/conf-available/99-dietpi-tasmoadmin.conf "https://raw.githubusercontent.com/$G_GITOWNER/DietPi/$G_GITBRANCH/.conf/dps_27/lighttpd.tasmoadmin.3.conf"
fi
}
diff --git a/.update/pre-patches b/.update/pre-patches
index 2e8174e28e..56dd60e582 100755
--- a/.update/pre-patches
+++ b/.update/pre-patches
@@ -66,7 +66,7 @@ fi
if (( $G_DIETPI_VERSION_CORE < 7 || ( $G_DIETPI_VERSION_CORE == 7 && $G_DIETPI_VERSION_SUB < 6 ) )) && (( $G_HW_MODEL < 10 )) && [[ -f '/etc/apt/preferences.d/dietpi-lxde' ]] && ! grep -q ' lx\*$' /etc/apt/preferences.d/dietpi-lxde
then
G_DIETPI-NOTIFY 2 'Updating the Raspberry Pi desktop package blocks'
- G_EXEC sed -i '/^Package:/c\Package: openbox* obconf* libob* pcmanfm* libfm* gtk-* libgtk* libgail* gir1.2-gtk-* lx*' /etc/apt/preferences.d/dietpi-lxde
+ G_EXEC sed --follow-symlinks -i '/^Package:/c\Package: openbox* obconf* libob* pcmanfm* libfm* gtk-* libgtk* libgail* gir1.2-gtk-* lx*' /etc/apt/preferences.d/dietpi-lxde
fi
# v7.7
@@ -97,8 +97,8 @@ _EOF_
fi
G_DIETPI-NOTIFY 2 'Connecting to Mosquitto and Webmin repositories via plain HTTP once until latest OpenSSL has been installed: https://github.com/MichaIng/DietPi/issues/4795'
- G_EXEC sed -Ei 's#https://(repo.mosquitto.org|download.webmin.com)#http://\1#' /etc/apt/sources.list
- [[ $(find /etc/apt/sources.list/*.list 2> /dev/null) ]] && G_EXEC sed -Ei 's#https://(repo.mosquitto.org|download.webmin.com)#http://\1#' /etc/apt/sources.list.d/*.list
+ G_EXEC sed --follow-symlinks -Ei 's#https://(repo.mosquitto.org|download.webmin.com)#http://\1#' /etc/apt/sources.list
+ [[ $(find /etc/apt/sources.list/*.list 2> /dev/null) ]] && G_EXEC sed --follow-symlinks -Ei 's#https://(repo.mosquitto.org|download.webmin.com)#http://\1#' /etc/apt/sources.list.d/*.list
# Add execute permissions to kernel/initramfs hooks
[[ -f '/etc/initramfs/post-update.d/99-dietpi-uboot' && ! -x '/etc/initramfs/post-update.d/99-dietpi-uboot' ]] && G_EXEC chmod +x /etc/initramfs/post-update.d/99-dietpi-uboot
@@ -209,12 +209,12 @@ then
if (( $G_DISTRO > 6 )) && [[ -f '/etc/apt/sources.list.d/dietpi-jellyfin.list' ]] && grep -q 'bullseye' /etc/apt/sources.list.d/dietpi-jellyfin.list
then
G_DIETPI-NOTIFY 2 'Updating Jellyfin APT repo suite'
- G_EXEC sed -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-jellyfin.list
+ G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-jellyfin.list
fi
if (( $G_DISTRO > 6 )) && [[ -f '/etc/apt/sources.list.d/docker.list' ]] && grep -q 'bullseye' /etc/apt/sources.list.d/docker.list
then
G_DIETPI-NOTIFY 2 'Updating Docker APT repo suite'
- G_EXEC sed -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/docker.list
+ G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/docker.list
fi
fi
@@ -225,13 +225,13 @@ then
then
# https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.en.html#non-free-split
G_DIETPI-NOTIFY 2 'Adding new non-free-firmware component to APT lists, to re-enable firmware upgrades'
- G_EXEC sed -i '/non-free/s/$/ non-free-firmware/' /etc/apt/sources.list
+ G_EXEC sed --follow-symlinks -i '/non-free/s/$/ non-free-firmware/' /etc/apt/sources.list
fi
if (( $G_DISTRO > 6 )) && [[ -f '/etc/apt/sources.list.d/dietpi-armbian.list' || -f '/etc/apt/sources.list.d/armbian.list' ]]
then
G_DIETPI-NOTIFY 2 'Updating Armbian APT repo list with Bookworm suite'
- [[ -f '/etc/apt/sources.list.d/dietpi-armbian.list' ]] && G_EXEC sed -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-armbian.list
- [[ -f '/etc/apt/sources.list.d/armbian.list' ]] && G_EXEC sed -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/armbian.list
+ [[ -f '/etc/apt/sources.list.d/dietpi-armbian.list' ]] && G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-armbian.list
+ [[ -f '/etc/apt/sources.list.d/armbian.list' ]] && G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/armbian.list
fi
fi
@@ -310,7 +310,7 @@ then
[[ -f '/etc/apt/preferences.d/dietpi-ffmpeg' ]] && G_EXEC rm /etc/apt/preferences.d/dietpi-ffmpeg
G_DIETPI-NOTIFY 2 'Removing faulty non-free-firmware component if present'
- (( $G_RASPBIAN )) && G_EXEC sed -i 's/ non-free-firmware$//' /etc/apt/sources.list
+ (( $G_RASPBIAN )) && G_EXEC sed --follow-symlinks -i 's/ non-free-firmware$//' /etc/apt/sources.list
fi
# Migrate Armbian keyring from /etc/apt/trusted.gpg to /etc/apt/trusted.gpg.d for old images
@@ -340,12 +340,12 @@ then
if [[ $G_DISTRO -ge 7 && -f '/etc/apt/sources.list.d/dietpi-mosquitto.list' ]]
then
G_DIETPI-NOTIFY 2 'Migrating Mosquitto APT repository to Bookworm'
- G_EXEC sed -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-mosquitto.list
+ G_EXEC sed --follow-symlinks -i 's/bullseye/bookworm/' /etc/apt/sources.list.d/dietpi-mosquitto.list
fi
if [[ $G_DISTRO == 7 && -f '/etc/apt/sources.list.d/dietpi-mympd.list' ]]
then
G_DIETPI-NOTIFY 2 'Migrating myMPD APT repository from testing suite to Bookworm suite'
- G_EXEC sed -i 's/Debian_Testing/Debian_12/' /etc/apt/sources.list.d/dietpi-mympd.list
+ G_EXEC sed --follow-symlinks -i 's/Debian_Testing/Debian_12/' /etc/apt/sources.list.d/dietpi-mympd.list
fi
if [[ $G_DISTRO == 7 && -f '/etc/apt/sources.list.d/raspi.list' && -f '/etc/apt/preferences.d/dietpi-ffmpeg' ]]
then
@@ -355,7 +355,7 @@ then
if [[ -f '/etc/apt/sources.list.d/dietpi-openhab.list' ]]
then
G_DIETPI-NOTIFY 2 'Migrating openHAB APT repository from testing suite to stable suite'
- G_EXEC sed -i 's/ testing / stable /' /etc/apt/sources.list.d/dietpi-openhab.list
+ G_EXEC sed --follow-symlinks -i 's/ testing / stable /' /etc/apt/sources.list.d/dietpi-openhab.list
(( $G_DISTRO < 6 )) && G_EXEC eval 'echo -e '\''Package: openhab*\nPin: version 3.*\nPin-Priority: 501'\'' > /etc/apt/preferences.d/dietpi-openhab'
fi
if [[ $G_DISTRO -ge 7 && -f '/etc/apt/sources.list.d/raspi.list' ]] && dpkg-query -s 'kodi-repository-kodi' &> /dev/null
@@ -363,10 +363,21 @@ then
G_DIETPI-NOTIFY 2 'Purging conflicting kodi-repository-kodi package'
G_AGP kodi-repository-kodi
fi
- if (( $G_HW_MODEL == 4 && $G_DISTRO > 6 )) && dpkg-query -s rpi-eeprom &> /dev/null
+fi
+
+# v8.25
+if (( $G_DIETPI_VERSION_CORE < 8 || ( $G_DIETPI_VERSION_CORE == 8 && $G_DIETPI_VERSION_SUB < 25 ) ))
+then
+ if dpkg-query -s rpi-eeprom &> /dev/null
+ then
+ G_DIETPI-NOTIFY 2 'Reverting now obsolete rpi-eeprom hold'
+ G_EXEC apt-mark unhold rpi-eeprom
+ fi
+ if [[ -f '/etc/apt/sources.list.d/webmin.list' ]]
then
- G_DIETPI-NOTIFY 2 'Setting rpi-eeprom package on hold to prevent conflicting upgrade attempt'
- G_EXEC apt-mark hold rpi-eeprom
+ G_DIETPI-NOTIFY 2 'Updating Webmin APT repo'
+ G_EXEC eval 'curl -sSfL '\''https://webmin.com/developers-key.asc'\'' | gpg --dearmor -o /etc/apt/trusted.gpg.d/dietpi-webmin.gpg --yes'
+ G_EXEC eval 'echo '\''deb https://download.webmin.com/download/newkey/repository stable contrib'\'' > /etc/apt/sources.list.d/webmin.list'
fi
fi
diff --git a/.update/version b/.update/version
index 8be7f630f4..9031ea8398 100644
--- a/.update/version
+++ b/.update/version
@@ -2,7 +2,7 @@
# shellcheck disable=SC2034
# Available DietPi version
G_REMOTE_VERSION_CORE=8
-G_REMOTE_VERSION_SUB=24
+G_REMOTE_VERSION_SUB=25
G_REMOTE_VERSION_RC=1
# Minimum DietPi version to allow update
G_MIN_VERSION_CORE=6
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index ddada5475a..7f0bcc1128 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,27 @@
+v8.25
+(2023-12-16)
+
+New images:
+- Star64 | Support for the RISC-V StarFive VisionFive 2 clone from PINE64 has been added to DietPi. The images are highly experimental, like software support for the architecture in general. Find our images here, before they are added to our download page soon: https://dietpi.com/downloads/binaries/testing/
+- Orange Pi 3B | Support for this RK3566 SBC has been added to DietPi. Find our images here, before they are added to our download page soon: https://dietpi.com/downloads/binaries/testing/
+
+Enhancements:
+- Raspberry Pi | We applied preparations for supporting the new official Raspberry Pi firmware and kernel packages, which implies support for Raspberry Pi 5. A script allows to the migration to the new package set, including the switch for the boot mountpoint from /boot to /boot/firmware. Please see the following topic about how to apply the script. Note that it is in beta stage for now, since the change might cause issues among our scripts which we did not detect yet: https://github.com/MichaIng/DietPi/issues/6676
+- Quartz64 | The kernel receives a major upgrade to Linux 6.6.3 and we switched to latest unmodified mainline U-Boot 2023.10. Among others changes, this implies a fixed onboard Ethernet MAC address, which was previously changing on every boot.
+- DietPi-Software | NZBGet: We migrated to the repository of the new project maintainer, since the original author stopped development: https://dietpi.com/forum/t/nzbget-new-maintainer-dietpi-software-already-updated/18425. Being on it, plain text file logging has been disabled in favour for journal logging, i.e. all NZBGet related logs are now combined in "journalct -u nzbget". The logging change will be applied on next DietPi update, the NZBGet upgrade itself can be done via reinstall: dietpi-software reinstall 149
+
+Bug fixes:
+- Proxmox | Now really resolved the issue where the QEMU guest agent was not always installed automatically on first boot.
+- DietPi-Update | Resolved an issue on RPi 4 systems with 32-bit userland/OS (but 64-bit kernel enabled) where wrong package variants could have been installed during patch stages. Many thanks to @diment08 for reporting this issue: https://github.com/MichaIng/DietPi/issues/6768
+- DietPi-Backup | Resolved an issue where updating or restoring backups between different distro version may have been incomplete (particularly in case of Bookworm and Bullseye), since the /etc/debian_version is identical in size and mtime, and hence seen as identical by rsync (by default), while its content is different.
+- DietPi-Software | Ampache: Resolved an issue on Bullseye and Bookworm systems where the initial web UI access failed because our pre-generated database was too old. A template shipped with Ampache will now be used, the initial admin user and music catalogue added via CLI. Many thanks to @mostly_offline for reporting this issue: https://dietpi.com/forum/t/bypassing-ampache-update-page/17367
+- DietPi-Software | Kodi: Worked around an issue on RPi Bookworm systems where installing Kodi failed due to a missing directory. Many thanks to @joshi0531 for reporting this issue: https://github.com/MichaIng/DietPi/issues/6703
+- DietPi-Software | TasmoAdmin: Resolved an issue where the web updater did not work with Lighttpd, due to a wrong rewrite rule. Many thanks to @Boebbele for reporting this issue: https://github.com/MichaIng/DietPi/issues/6805
+
+As always, many smaller code performance and stability improvements, visual and spelling fixes have been done, too much to list all of them here. Check out all code changes of this release on GitHub: https://github.com/MichaIng/DietPi/pull/6808
+
+-----------------------------------------------------------------------------------------------------------
+
v8.24
(2023-11-18)
diff --git a/dietpi/dietpi-backup b/dietpi/dietpi-backup
index 7ad4fea2b6..0b502b24c8 100755
--- a/dietpi/dietpi-backup
+++ b/dietpi/dietpi-backup
@@ -216,6 +216,10 @@ However, this check is a rough estimation in reasonable time, thus it could be m
rsync "${aRSYNC_RUN_OPTIONS_BACKUP[@]}" -v --log-file="$FP_TARGET/$FP_LOG" "$FP_SOURCE" "$FP_TARGET/data/"
EXIT_CODE=$?
+ # Manually backup /etc/debian_version, since it can have same size and mtime between different Debian version, hence backing up e.g. a Bookworm system onto an existing Bullseye backup won't include this critical file.
+ # - The alternative would be "-c" to compare checksums, but this can increases the duration significantly.
+ G_EXEC cp -a "${FP_SOURCE}etc/debian_version" "$FP_TARGET/data/etc/debian_version"
+
# touch target directory to show the correct last update timestamp when restoring one of multiple backups from the archive. This needs to be done after the backup since it applies the root / timestamps.
G_EXEC touch "$FP_TARGET/data"
@@ -306,9 +310,9 @@ However, this check is a rough estimation in reasonable time, thus it could be m
do
[[ $mountpoint ]] || continue
local uuid=$(findmnt -Ufnro UUID -M "$mountpoint")
- [[ $uuid ]] && G_EXEC sed -i "\|[[:blank:]]${mountpoint}[[:blank:]]|s|^[[:blank:]]*UUID=[^[:blank:]]*|UUID=$uuid|" /etc/fstab
+ [[ $uuid ]] && G_EXEC sed --follow-symlinks -i "\|[[:blank:]]${mountpoint}[[:blank:]]|s|^[[:blank:]]*UUID=[^[:blank:]]*|UUID=$uuid|" /etc/fstab
local partuuid=$(findmnt -Ufnro PARTUUID -M "$mountpoint")
- [[ $partuuid ]] && G_EXEC sed -i "\|[[:blank:]]${mountpoint}[[:blank:]]|s|^[[:blank:]]*PARTUUID=[^[:blank:]]*|PARTUUID=$partuuid|" /etc/fstab
+ [[ $partuuid ]] && G_EXEC sed --follow-symlinks -i "\|[[:blank:]]${mountpoint}[[:blank:]]|s|^[[:blank:]]*PARTUUID=[^[:blank:]]*|PARTUUID=$partuuid|" /etc/fstab
done < <(lsblk -no MOUNTPOINT "$(lsblk -npo PKNAME "$G_ROOTFS_DEV")")
@@ -324,7 +328,7 @@ However, this check is a rough estimation in reasonable time, thus it could be m
# - RPi
elif (( $UPDATE_RPI == 1 ))
then
- G_EXEC sed -Ei "s/(^|[[:blank:]])root=[^[:blank:]]*/\1root=PARTUUID=$PARTUUID_ROOT/" /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -Ei "s/(^|[[:blank:]])root=[^[:blank:]]*/\1root=PARTUUID=$PARTUUID_ROOT/" /boot/cmdline.txt
# - DietPi modern U-Boot
elif (( $UPDATE_DIETPI == 1 ))
@@ -341,12 +345,12 @@ However, this check is a rough estimation in reasonable time, thus it could be m
# - Odroids / classic U-Boot
elif (( $UPDATE_ODROID == 1 ))
then
- G_EXEC sed -Ei -e "s/(\"|root=)UUID=[^[:blank:]\"]*/\1UUID=$UUID_ROOT/" -e "s/(\"|root=)PARTUUID=[^[:blank:]\"]*/\1PARTUUID=$PARTUUID_ROOT/" /boot/boot.ini
+ G_EXEC sed --follow-symlinks -Ei -e "s/(\"|root=)UUID=[^[:blank:]\"]*/\1UUID=$UUID_ROOT/" -e "s/(\"|root=)PARTUUID=[^[:blank:]\"]*/\1PARTUUID=$PARTUUID_ROOT/" /boot/boot.ini
# - Modern U-Boot
elif (( $UPDATE_UBOOT == 1 ))
then
- G_EXEC sed -Ei -e "s/(\"|root=)UUID=[^[:blank:]\"]*/\1UUID=$UUID_ROOT/" -e "s/(\"|root=)PARTUUID=[^[:blank:]\"]*/\1PARTUUID=$PARTUUID_ROOT/" /boot/boot.cmd
+ G_EXEC sed --follow-symlinks -Ei -e "s/(\"|root=)UUID=[^[:blank:]\"]*/\1UUID=$UUID_ROOT/" -e "s/(\"|root=)PARTUUID=[^[:blank:]\"]*/\1PARTUUID=$PARTUUID_ROOT/" /boot/boot.cmd
G_EXEC mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr
fi
}
@@ -388,6 +392,10 @@ However, this check is a rough estimation in reasonable time, thus it could be m
rsync "${aRSYNC_RUN_OPTIONS_RESTORE[@]}" -v --log-file="$FP_TARGET/$FP_LOG" "$FP_TARGET/$DATA/" "$FP_SOURCE"
EXIT_CODE=$?
+ # Manually restore /etc/debian_version, since it can have same size and mtime between different Debian version, hence restoring e.g. a Bullseye system on Bookworm won't restore this critical file.
+ # - The alternative would be "-c" to compare checksums, but this can increases the duration significantly.
+ G_EXEC cp -a "$FP_TARGET/$DATA/etc/debian_version" "${FP_SOURCE}etc/debian_version"
+
hash -r # Clear PATH cache
(( $UPDATE_UUIDs )) && Update_UUIDs
diff --git a/dietpi/dietpi-cleaner b/dietpi/dietpi-cleaner
index 774d63601e..1609ee9c48 100755
--- a/dietpi/dietpi-cleaner
+++ b/dietpi/dietpi-cleaner
@@ -336,7 +336,7 @@ $G_PROGRAM_NAME simulation has finished: Press any key to continue..."
# Mark for autoremoval
[[ ${apackages[0]} ]] && { apt-mark auto "${apackages[@]}"; G_AGA; }
- sed -i '/^aSOFTWARE_INSTALL_STATE\[16\]=/d' /boot/dietpi/.installed
+ sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[16\]=/d' /boot/dietpi/.installed
fi
diff --git a/dietpi/dietpi-config b/dietpi/dietpi-config
index 38bbc8e5bc..b788d8100a 100755
--- a/dietpi/dietpi-config
+++ b/dietpi/dietpi-config
@@ -285,7 +285,7 @@
G_CONFIG_INJECT 'disable_overscan=' 'disable_overscan=1' /boot/config.txt
for i in "${overscan_options[@]}"
do
- sed -i "/^[[:blank:]]*$i=/c\#$i=0" /boot/config.txt
+ sed --follow-symlinks -i "/^[[:blank:]]*$i=/c\#$i=0" /boot/config.txt
done
fi
@@ -550,8 +550,8 @@ A long (or insufficiently manufactured) cable may required a higher boost settin
if [[ $G_WHIP_RETURNED_VALUE == 'System default' ]]; then
- sed -i 's/^[[:blank:]]*GRUB_GFXMODE=/#GRUB_GFXMODE=/' /etc/default/grub
- sed -i 's/^[[:blank:]]*GRUB_GFXPAYLOAD_LINUX=/#GRUB_GFXPAYLOAD_LINUX=/' /etc/default/grub
+ sed --follow-symlinks -i 's/^[[:blank:]]*GRUB_GFXMODE=/#GRUB_GFXMODE=/' /etc/default/grub
+ sed --follow-symlinks -i 's/^[[:blank:]]*GRUB_GFXPAYLOAD_LINUX=/#GRUB_GFXPAYLOAD_LINUX=/' /etc/default/grub
else
@@ -691,8 +691,8 @@ Re-enabling HDMI requires a reboot. If you need emergency HDMI output, edit the
# Disable composite if not chosen
if [[ $G_WHIP_RETURNED_VALUE != 'sdtv_mode'* ]]; then
- sed -i '/sdtv_mode=/c\#sdtv_mode=0' /boot/config.txt
- sed -i '/enable_tvout=/c\#enable_tvout=0' /boot/config.txt
+ sed --follow-symlinks -i '/sdtv_mode=/c\#sdtv_mode=0' /boot/config.txt
+ sed --follow-symlinks -i '/enable_tvout=/c\#enable_tvout=0' /boot/config.txt
fi
@@ -849,7 +849,7 @@ Re-enabling HDMI requires a reboot. If you need emergency HDMI output, edit the
[[ $current_resolution != "$G_WHIP_RETURNED_VALUE" ]] && REBOOT_REQUIRED=1
# Always reset vga/dvi options
- sed -Ei 's/^[[:blank:]]*(setenv[[:blank:]]+vout[[:blank:]].*$)/#\1/' /boot/boot.ini
+ sed --follow-symlinks -Ei 's/^[[:blank:]]*(setenv[[:blank:]]+vout[[:blank:]].*$)/#\1/' /boot/boot.ini
# DVI / VU7+
if [[ $G_WHIP_RETURNED_VALUE == '1024x600p 60hz' ]]; then
@@ -1074,10 +1074,10 @@ Re-enabling HDMI requires a reboot. If you need emergency HDMI output, edit the
# ROCK 4: Device tree overlay required
(( $G_HW_MODEL == 72 )) || [[ -b '/dev/mtdblock0' && -f '/usr/lib/u-boot/platform_install.sh' ]] && G_WHIP_MENU_ARRAY+=('Update SPI bootloader' ': Flash current U-Boot to /dev/mtdblock0')
- # VisionFive 2: https://doc-en.rvspace.org/VisionFive2/PDF/VisionFive2_QSG.pdf
- elif (( $G_HW_MODEL == 81 ))
+ # VisionFive 2/Star64: https://doc-en.rvspace.org/VisionFive2/PDF/VisionFive2_QSG.pdf
+ elif (( $G_HW_MODEL == 81 || $G_HW_MODEL == 84 ))
then
- G_WHIP_MENU_ARRAY+=('Update bootloader' ': on VisionFive 2 SPI storage')
+ G_WHIP_MENU_ARRAY+=('Update bootloader' ': on VisionFive 2/Star64 SPI storage')
fi
# Serial/UART devices
@@ -1250,7 +1250,7 @@ Further information: https://www.raspberrypi.org/documentation/hardware/raspberr
elif [[ $G_WHIP_RETURNED_VALUE == 'Update bootloader' ]]; then
G_WHIP_YESNO '[ INFO ] SPI bootloader update
-\nThis will download and flash the latest U-Boot from StarFive to your VisionFive 2 SPI storage.
+\nThis will download and flash the latest U-Boot from StarFive to your VisionFive 2/Star64 SPI storage.
Latest release notes: https://github.com/starfive-tech/VisionFive2/releases
\nDo you want to continue?' || return 0
G_AG_CHECK_INSTALL_PREREQ libubootenv-tool
@@ -1645,7 +1645,7 @@ If unsure, set any value, 'Ondemand Down Factor' option on the next screen will
else
- G_EXEC sed -i "/^[[:blank:]]*arm_freq_min=/c\#arm_freq_min=$DEF_VALUE" /boot/config.txt
+ G_EXEC sed --follow-symlinks -i "/^[[:blank:]]*arm_freq_min=/c\#arm_freq_min=$DEF_VALUE" /boot/config.txt
fi
REBOOT_REQUIRED=1
@@ -1666,7 +1666,7 @@ If unsure, set any value, 'Ondemand Down Factor' option on the next screen will
else
- sed -i '/^[[:blank:]]*initial_turbo=/c\#initial_turbo=20' /boot/config.txt
+ sed --follow-symlinks -i '/^[[:blank:]]*initial_turbo=/c\#initial_turbo=20' /boot/config.txt
fi
REBOOT_REQUIRED=1
@@ -2058,7 +2058,7 @@ _EOF_
# Remove wireless-power setting if not supported by adapter/firmware
# shellcheck disable=SC2015
- (( $WIFI_HARDWARE )) && iw dev "$WIFI_DEV_IFACE" set power_save on 2> /dev/null && iw dev "$WIFI_DEV_IFACE" set power_save off 2> /dev/null || G_EXEC sed -i '/ iw dev .* set power_save /d' /etc/network/interfaces
+ (( $WIFI_HARDWARE )) && iw dev "$WIFI_DEV_IFACE" set power_save on 2> /dev/null && iw dev "$WIFI_DEV_IFACE" set power_save off 2> /dev/null || G_EXEC sed --follow-symlinks -i '/ iw dev .* set power_save /d' /etc/network/interfaces
# Update WiFi db/wpa_supplicant if enabled
(( $WIFI_DISABLED )) || /boot/dietpi/func/dietpi-wifidb 1
@@ -3057,11 +3057,11 @@ Additional benchmarks:
Reset_Overclocking()
{
- sed -i -e '/^[[:blank:]]*over_voltage=/c\#over_voltage=0' \
+ sed --follow-symlinks -i -e '/^[[:blank:]]*over_voltage=/c\#over_voltage=0' \
-e '/^[[:blank:]]*over_voltage_min=/c\#over_voltage_min=0' \
-e "/^[[:blank:]]*arm_freq=/c\#arm_freq=$arm_freq_default" \
-e "/^[[:blank:]]*core_freq=/c\#core_freq=$core_freq_default" /boot/config.txt
- (( $G_HW_MODEL == 4 )) || sed -i "/^[[:blank:]]*sdram_freq=/c\#sdram_freq=$sdram_freq_default" /boot/config.txt
+ (( $G_HW_MODEL == 4 )) || sed --follow-symlinks -i "/^[[:blank:]]*sdram_freq=/c\#sdram_freq=$sdram_freq_default" /boot/config.txt
REBOOT_REQUIRED=1
}
diff --git a/dietpi/dietpi-drive_manager b/dietpi/dietpi-drive_manager
index f310f5e1df..652a8ac5a2 100755
--- a/dietpi/dietpi-drive_manager
+++ b/dietpi/dietpi-drive_manager
@@ -73,7 +73,6 @@
aDRIVE_ISROM[$index]=0
aDRIVE_ISPARTITIONTABLE[$index]=0
aDRIVE_ISACCESS[$index]=1
-
}
Destroy(){
@@ -86,7 +85,6 @@
unset -v aDRIVE_ISFILESYSTEM aDRIVE_ISMOUNTED
unset -v aDRIVE_ISREADONLY_CURRENTLY aDRIVE_ISNETWORKED
unset -v aDRIVE_ISROM aDRIVE_ISPARTITIONTABLE aDRIVE_ISACCESS
-
}
Init_Drives_and_Refresh(){
@@ -262,7 +260,7 @@ $swap_mounts
# /boot is removed from local-fs.target by this (on Buster only?), allowing it to mount after RAMdisk starts and unmount before it stops.
# Source device entry
local dev_entry="UUID=${aDRIVE_UUID[$index]}"
- if [[ ${aDRIVE_MOUNT_TARGET[$index]} =~ ^/(boot(/efi)?)?$ ]]; then
+ if [[ ${aDRIVE_MOUNT_TARGET[$index]} =~ ^/(boot(/efi|/firmware)?)?$ ]]; then
# On RPi we need to use PARTUUID for Root/BootFS
(( $G_HW_MODEL > 9 )) || dev_entry="PARTUUID=${aDRIVE_PART_UUID[$index]}"
@@ -372,7 +370,7 @@ $swap_mounts
# - Container: Assume host supports it (relevant for network drives)
if (( $G_HW_MODEL != 75 )) && ! modprobe -nq autofs4
then
- sed -Ei '/x-systemd\.automount/s/,(noauto|x-systemd\.automount)//g' "$fp_fstab_tmp"
+ sed --follow-symlinks -Ei '/x-systemd\.automount/s/,(noauto|x-systemd\.automount)//g' "$fp_fstab_tmp"
G_DIETPI-NOTIFY 2 'autofs4 module not available in kernel, x-systemd.automount has been disabled, all drives will be mounted at boot instead'
fi
@@ -489,7 +487,7 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
local target=$1
G_EXEC_NOEXIT=1 G_EXEC umount "$target" || return 1
- sed -i "\#[[:blank:]]${target}[[:blank:]]#d" /etc/fstab # Only needed for network drives currently, as unmounted physical drives won't be re-added via Init_Drives_and_Refresh
+ sed --follow-symlinks -i "\#[[:blank:]]${target}[[:blank:]]#d" /etc/fstab # Only needed for network drives currently, as unmounted physical drives won't be re-added via Init_Drives_and_Refresh
# Stop automount to unlock mount point
local automount=${target#/}
[[ $automount ]] && { automount=${automount//-/\\x2d}; automount=${automount//\//-}; }
@@ -726,29 +724,29 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
# Update fstab
# - Remove automatic entry for target drive
- G_EXEC sed -i "\@[[:blank:]]${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}[[:blank:]]@d" "${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}/etc/fstab"
+ G_EXEC sed --follow-symlinks -i "\@[[:blank:]]${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}[[:blank:]]@d" "${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}/etc/fstab"
# - Replace old with new rootfs entry
local dev_entry="UUID=${aDRIVE_UUID[$MENU_DRIVE_INDEX]}"
(( $G_HW_MODEL < 10 )) && dev_entry="PARTUUID=${aDRIVE_PART_UUID[$MENU_DRIVE_INDEX]}"
- G_EXEC sed -i "\@[[:blank:]]/[[:blank:]]@c$dev_entry / ${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]} noatime,lazytime,rw 0 1" "${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}/etc/fstab"
+ G_EXEC sed --follow-symlinks -i "\@[[:blank:]]/[[:blank:]]@c$dev_entry / ${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]} noatime,lazytime,rw 0 1" "${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}/etc/fstab"
# Find and replace current root and rootfstype kernel command line entries
# - RPi: /boot/cmdline.txt
if (( $G_HW_MODEL < 10 ))
then
local rootfs_current=$(mawk '{for(i=1;i<=NF;i++) if($i~/^root=/) {print $i;exit}}' /boot/cmdline.txt)
- G_EXEC sed -i "s#$rootfs_current#root=$dev_entry#g" /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i "s#$rootfs_current#root=$dev_entry#g" /boot/cmdline.txt
local rootfstype_current=$(mawk '{for(i=1;i<=NF;i++) if($i~/^rootfstype=/) {print $i;exit}}' /boot/cmdline.txt)
- [[ $rootfstype_current ]] && G_EXEC sed -i "s#$rootfstype_current#rootfstype=${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]}#g" /boot/cmdline.txt
+ [[ $rootfstype_current ]] && G_EXEC sed --follow-symlinks -i "s#$rootfstype_current#rootfstype=${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]}#g" /boot/cmdline.txt
# - Odroids: /boot/boot.ini
else
local rootfs_current=$(mawk '-F[" ]' '{for(i=1;i<=NF;i++) if($i~/^root=/) {print $i;exit}}' /boot/boot.ini)
- G_EXEC sed -i "s#$rootfs_current#root=$dev_entry#g" /boot/boot.ini
+ G_EXEC sed --follow-symlinks -i "s#$rootfs_current#root=$dev_entry#g" /boot/boot.ini
local rootfstype_current=$(mawk '-F[" ]' '{for(i=1;i<=NF;i++) if($i~/^rootfstype=/) {print $i;exit}}' /boot/boot.ini)
- [[ $rootfstype_current ]] && G_EXEC sed -i "s#$rootfstype_current#rootfstype=${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]}#g" /boot/boot.ini
+ [[ $rootfstype_current ]] && G_EXEC sed --follow-symlinks -i "s#$rootfstype_current#rootfstype=${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]}#g" /boot/boot.ini
fi
G_EXEC systemctl daemon-reload
@@ -777,7 +775,7 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
if [[ ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} == '/' ]]; then
local line_number=$(grep -n "[[:blank:]]${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]}[[:blank:]].*,rw" /etc/fstab | cut -d : -f 1)
- sed -i "${line_number}s/,rw/,ro/" /etc/fstab
+ sed --follow-symlinks -i "${line_number}s/,rw/,ro/" /etc/fstab
fi
message_result=$(mount -v -o remount,ro "${aDRIVE_MOUNT_SOURCE[$MENU_DRIVE_INDEX]}" 2>&1)
@@ -953,7 +951,7 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
else
- Menu_Exit
+ TARGETMENUID=-1 # Exit
fi
@@ -1023,9 +1021,8 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
whiptail_desc+="\nAllocation: Capacity: ${aDRIVE_SIZE_TOTAL[$MENU_DRIVE_INDEX]}iB | Used: ${aDRIVE_SIZE_USED[$MENU_DRIVE_INDEX]}iB (${aDRIVE_SIZE_PERCENTUSED[$MENU_DRIVE_INDEX]})\nStatus: Drive is online and ready for use"
- # Unmount
- # - Disable mount control for /boot /rootfs
- if [[ ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} != '/' && ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} != '/boot' ]]; then
+ # Unmount: Disable for root and boot mounts
+ if [[ ! ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} =~ ^/(boot(/efi|/firmware)?)?$ ]]; then
G_WHIP_MENU_ARRAY+=('' '●─ Mount Control ')
if (( ${aDRIVE_ISNETWORKED[$MENU_DRIVE_INDEX]} )); then
@@ -1116,18 +1113,10 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
G_WHIP_MENU_ARRAY+=('Check & Repair' ': Check and optionally repair filesystem')
# Resize
- if [[ ${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]} =~ ^(ext[2-4]|f2fs|btrfs)$ ]]; then
-
- G_WHIP_MENU_ARRAY+=('Resize' ': Maximize the available filesystem size')
-
- fi
-
- # Format: Disabled for /boot and rootfs
- if [[ ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} != '/' && ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} != '/boot' ]]; then
+ [[ ${aDRIVE_FSTYPE[$MENU_DRIVE_INDEX]} =~ ^(ext[2-4]|f2fs|btrfs)$ ]] && G_WHIP_MENU_ARRAY+=('Resize' ': Maximize the available filesystem size')
- G_WHIP_MENU_ARRAY+=('Format' ': Select to see formatting options')
-
- fi
+ # Format: Disable for root and boot mounts
+ [[ ${aDRIVE_MOUNT_TARGET[$MENU_DRIVE_INDEX]} =~ ^/(boot(/efi|/firmware)?)?$ ]] || G_WHIP_MENU_ARRAY+=('Format' ': Select to see formatting options')
fi
@@ -1135,8 +1124,8 @@ Do you wish to ignore this warning, and, mount the drive regardless?" || return
if (( ${aDRIVE_ISACCESS[$MENU_DRIVE_INDEX]} && ! ${aDRIVE_ISROM[$MENU_DRIVE_INDEX]} && ! ${aDRIVE_ISNETWORKED[$MENU_DRIVE_INDEX]} ))
then
- # Transfer RootFS: Supported on RPi and Odroids C2/XU4/N2/C4 if /boot is a dedicated mount
- if [[ ${aDRIVE_MOUNT_SOURCE[$MENU_DRIVE_INDEX]} != "$G_ROOTFS_DEV" && ( $G_HW_MODEL -le 9 || $G_HW_MODEL == 1[1256] ) ]] && findmnt -M /boot > /dev/null; then
+ # Transfer RootFS: Supported on RPi and Odroids C2/XU4/N2/C4 if there is a dedicated boot mount
+ if [[ ${aDRIVE_MOUNT_SOURCE[$MENU_DRIVE_INDEX]} != "$G_ROOTFS_DEV" ]] && { (( $G_HW_MODEL < 10 )) || { (( $G_HW_MODEL < 20 )) && findmnt -M /boot > /dev/null; }; } then
G_WHIP_MENU_ARRAY+=('Transfer RootFS' ': Transfer RootFS to this drive')
@@ -1502,7 +1491,7 @@ Read more about I/O scheduling: https://wiki.archlinux.org/index.php/Improving_p
if [[ $G_WHIP_RETURNED_VALUE == 'Reset' ]]; then
- sed -i "/KERNEL==\"${aDRIVE_SOURCE_DEVICE[$MENU_DRIVE_INDEX]}\"/d" "$udev_rules"
+ sed --follow-symlinks -i "/KERNEL==\"${aDRIVE_SOURCE_DEVICE[$MENU_DRIVE_INDEX]}\"/d" "$udev_rules"
grep -q '^ACTION' "$udev_rules" || rm "$udev_rules"
G_WHIP_YESNO '[ INFO ] A reboot is required to reset the I/O scheduler to default.\n\nDo you wish to reboot now?' && reboot
@@ -1779,7 +1768,7 @@ username=$samba_clientuser
password=$samba_clientpassword
_EOF_
# Apply to fstab
- sed -i "\#[[:blank:]]${samba_fp_mount_target}[[:blank:]]#d" /etc/fstab
+ sed --follow-symlinks -i "\#[[:blank:]]${samba_fp_mount_target}[[:blank:]]#d" /etc/fstab
# - NB: Convert spaces to '\040': https://github.com/MichaIng/DietPi/issues/1201#issuecomment-339720271
echo "//$samba_clientname/${samba_clientshare//[[:blank:]]/\\040} $samba_fp_mount_target cifs cred=$cred,iocharset=utf8,uid=dietpi,gid=dietpi,file_mode=0770,dir_mode=0770,vers=$i,nofail,noauto,x-systemd.automount" >> /etc/fstab
@@ -1795,7 +1784,7 @@ _EOF_
done
# Failure
- sed -i '1i\[FAILED] Samba mount failed with the following error output:\n' "$fp_tmp"
+ sed --follow-symlinks -i '1i\[FAILED] Samba mount failed with the following error output:\n' "$fp_tmp"
G_WHIP_VIEWFILE "$fp_tmp"
rm "$fp_tmp"
rmdir --ignore-fail-on-non-empty "$samba_fp_mount_target"
@@ -1893,7 +1882,7 @@ _EOF_
if mount -vt nfs -o port=2049 "$nfs_server_ip:$nfs_fp_server_share" "$nfs_fp_mount_target" &> "$fp_tmp"
then
# Apply to fstab
- sed -i "\#[[:blank:]]${nfs_fp_mount_target}[[:blank:]]#d" /etc/fstab
+ sed --follow-symlinks -i "\#[[:blank:]]${nfs_fp_mount_target}[[:blank:]]#d" /etc/fstab
echo "$nfs_server_ip:$nfs_fp_server_share $nfs_fp_mount_target nfs nofail,noauto,x-systemd.automount" >> /etc/fstab
MENU_DRIVE_TARGET=$nfs_fp_mount_target
@@ -1906,7 +1895,7 @@ _EOF_
fi
# Failure
- sed -i '1i\[FAILED] NFS mount failed with the following error output:\n' "$fp_tmp"
+ sed --follow-symlinks -i '1i\[FAILED] NFS mount failed with the following error output:\n' "$fp_tmp"
G_WHIP_VIEWFILE "$fp_tmp"
rm "$fp_tmp"
rmdir --ignore-fail-on-non-empty "$nfs_fp_mount_target"
@@ -1951,14 +1940,6 @@ _EOF_
}
- Menu_Exit(){
-
- TARGETMENUID=0 # Main menu
- G_WHIP_SIZE_X_MAX=50
- G_WHIP_YESNO "Exit $G_PROGRAM_NAME?" && TARGETMENUID=-1 # Exit
-
- }
-
#/////////////////////////////////////////////////////////////////////////////////////
# Main Loop
#/////////////////////////////////////////////////////////////////////////////////////
diff --git a/dietpi/dietpi-led_control b/dietpi/dietpi-led_control
index 94d32ba298..bde7caa361 100755
--- a/dietpi/dietpi-led_control
+++ b/dietpi/dietpi-led_control
@@ -118,7 +118,7 @@
elif [[ $G_WHIP_RETURNED_VALUE == 'Reset' ]]; then
- G_EXEC_NOHALT=1 G_EXEC sed -i "/KERNEL==\"${aNAME[$SELECTED_LED]}\"/d" "$FP_UDEV_RULES" || return 1
+ G_EXEC_NOHALT=1 G_EXEC sed --follow-symlinks -i "/KERNEL==\"${aNAME[$SELECTED_LED]}\"/d" "$FP_UDEV_RULES" || return 1
unset -v "aTRIGGER_SELECTED[$SELECTED_LED]"
G_WHIP_MSG "LED trigger for ${aNAME[$SELECTED_LED]} has been reset to system defaults.\n\nThis will become active from next reboot."
[[ ${aTRIGGER_SELECTED[*]} || ! -f $FP_UDEV_RULES ]] || G_EXEC_NOHALT=1 G_EXEC rm "$FP_UDEV_RULES" || return 1
diff --git a/dietpi/dietpi-letsencrypt b/dietpi/dietpi-letsencrypt
index 46b42713dc..73055f5473 100755
--- a/dietpi/dietpi-letsencrypt
+++ b/dietpi/dietpi-letsencrypt
@@ -157,7 +157,7 @@ _EOF_
if (( $G_DISTRO > 5 ))
then
G_AG_CHECK_INSTALL_PREREQ lighttpd-mod-openssl
- G_EXEC sed -i 's/,-SessionTicket//' /etc/lighttpd/conf-available/50-dietpi-https.conf
+ G_EXEC sed --follow-symlinks -i 's/,-SessionTicket//' /etc/lighttpd/conf-available/50-dietpi-https.conf
fi
[[ -f '/etc/lighttpd/conf-enabled/50-dietpi-https.conf' ]] || G_EXEC lighty-enable-mod dietpi-https
@@ -238,7 +238,7 @@ _EOF_
fi
# Enable HTTP/2: https://github.com/certbot/certbot/issues/3646
- grep -q 'http2' /etc/nginx/sites-available/default || G_EXEC sed -i '/^[[:blank:]]*listen /s/443 ssl/443 ssl http2/' /etc/nginx/sites-available/default
+ grep -q 'http2' /etc/nginx/sites-available/default || G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*listen /s/443 ssl/443 ssl http2/' /etc/nginx/sites-available/default
Apply_To_Web_Applications
@@ -361,8 +361,8 @@ _EOF_
# Skip this if HTTP access is still possible
(( $LETSENCRYPT_REDIRECT || $LETSENCRYPT_HSTS )) || return
G_DIETPI-NOTIFY 2 'Applying HTTPS domain to known web application configs'
- [[ -f '/var/www/nextcloud/config/config.php' ]] && G_EXEC sed -i "s|'http://localhost/nextcloud'|'https://$primary_domain/nextcloud'|" /var/www/nextcloud/config/config.php
- [[ -f '/var/www/owncloud/config/config.php' ]] && G_EXEC sed -i "s|'http://localhost/owncloud'|'https://$primary_domain/owncloud'|" /var/www/owncloud/config/config.php
+ [[ -f '/var/www/nextcloud/config/config.php' ]] && G_EXEC sed --follow-symlinks -i "s|'http://localhost/nextcloud'|'https://$primary_domain/nextcloud'|" /var/www/nextcloud/config/config.php
+ [[ -f '/var/www/owncloud/config/config.php' ]] && G_EXEC sed --follow-symlinks -i "s|'http://localhost/owncloud'|'https://$primary_domain/owncloud'|" /var/www/owncloud/config/config.php
}
#/////////////////////////////////////////////////////////////////////////////////////
diff --git a/dietpi/dietpi-services b/dietpi/dietpi-services
index dee7d3e2e0..b597d02137 100755
--- a/dietpi/dietpi-services
+++ b/dietpi/dietpi-services
@@ -481,7 +481,7 @@ _EOF_
elif [[ $value == 'reset' ]]
then
unset -v "${aarray[$setting]}[$index]"
- [[ -f $fp ]] && G_EXEC sed -i "/^${asetting[$setting]}=/d" "$fp"
+ [[ -f $fp ]] && G_EXEC sed --follow-symlinks -i "/^${asetting[$setting]}=/d" "$fp"
# Apply process tool setting
else
@@ -768,13 +768,13 @@ This affects starts/stops/restarts during DietPi-Software installs, DietPi-Updat
if [[ $G_WHIP_RETURNED_VALUE == 'Include' ]]
then
# If service is listed here, it was excluded via include/exclude file.
- G_EXEC sed -i "/^- ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}/d" "$FP_INCLUDE_EXCLUDE"
+ G_EXEC sed --follow-symlinks -i "/^- ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}/d" "$FP_INCLUDE_EXCLUDE"
aSERVICE_CONTROL["$MENU_SERVICE_INDEX"]='included'
else
# Remove include entry if existent, else add exclude entry.
if grep -q "^+ ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}" "$FP_INCLUDE_EXCLUDE"
then
- G_EXEC sed -i "/^+ ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}/d" "$FP_INCLUDE_EXCLUDE"
+ G_EXEC sed --follow-symlinks -i "/^+ ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}/d" "$FP_INCLUDE_EXCLUDE"
unset -v "aSERVICE_NAME[$MENU_SERVICE_INDEX]"
# Service needs to be re-added from main menu
MENU_TARGETID=0 # Return to main menu
@@ -805,7 +805,7 @@ Please uncomment and edit only the lines that you need to change.\n\nTo undo cha
- rm $fp\n - systemctl daemon-reload\n - systemctl restart ${aSERVICE_NAME[$MENU_SERVICE_INDEX]}\n\nDo you want to continue?" || return 0
G_EXEC mkdir -p "$dp"
G_EXEC cp -a "${aFP_SERVICE[$MENU_SERVICE_INDEX]}" "$fp"
- G_EXEC sed -Ei 's/^([^[#])/#\1/' "$fp"
+ G_EXEC sed --follow-symlinks -Ei 's/^([^[#])/#\1/' "$fp"
fi
nano "$fp"
SYSTEMD_RELOAD_REQUIRED=1
diff --git a/dietpi/dietpi-software b/dietpi/dietpi-software
index aec1c8659e..2e66508688 100755
--- a/dietpi/dietpi-software
+++ b/dietpi/dietpi-software
@@ -149,7 +149,7 @@ Available commands:
else
encrypt=1
GLOBAL_PW=$(sed -n '/^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)
- grep -q '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /boot/dietpi.txt && G_EXEC sed -i '/^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=/c\#AUTO_SETUP_GLOBAL_PASSWORD= # Password has been encrypted and saved to rootfs' /boot/dietpi.txt
+ grep -q '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /boot/dietpi.txt && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=/c\#AUTO_SETUP_GLOBAL_PASSWORD= # Password has been encrypted and saved to rootfs' /boot/dietpi.txt
fi
# Fallback
@@ -2295,7 +2295,7 @@ done
if ! [ -f ~/.gtk-bookmarks ]
then
cp /var/lib/dietpi/dietpi-software/installed/desktop/.gtk-bookmarks ~/.gtk-bookmarks
- sed -i "s|/root|$HOME|g" ~/.gtk-bookmarks
+ sed --follow-symlinks -i "s|/root|$HOME|g" ~/.gtk-bookmarks
fi
# Disable this autostart entry
@@ -2449,7 +2449,7 @@ _EOF_
*'.xz'|*'.txz') command -v xz > /dev/null || aDEPS+=('xz-utils');;
*'.bz2'|*'.tbz2') command -v bzip2 > /dev/null || aDEPS+=('bzip2');;
*'.zip') command -v unzip > /dev/null || aDEPS+=('unzip');;
- *'.7z') command -v 7zr > /dev/null || aDEPS+=('p7zip');;
+ *'.7z') command -v 7zr > /dev/null || { (( $G_DISTRO > 7 )) && aDEPS+=('7zip') || aDEPS+=('p7zip'); };;
*) :;;
esac
@@ -2630,7 +2630,7 @@ _EOF_
{
if (( $G_HW_MODEL < 10 ))
then
- grep -Eq '(^|[[:blank:]])cgroup_enable=memory([[:blank:]]|$)' /boot/cmdline.txt || G_EXEC sed -i '/root=/s/[[:blank:]]*$/ cgroup_enable=memory/' /boot/cmdline.txt
+ grep -Eq '(^|[[:blank:]])cgroup_enable=memory([[:blank:]]|$)' /boot/cmdline.txt || G_EXEC sed --follow-symlinks -i '/root=/s/[[:blank:]]*$/ cgroup_enable=memory/' /boot/cmdline.txt
elif [[ -f '/boot/boot.scr' ]] && grep -q 'docker_optimizations' /boot/boot.scr
then
@@ -2899,7 +2899,7 @@ unix_socket_directories = '/run/postgresql'" > "$i/00dietpi.conf"
then
# Install persistent tmpfs
local var_log_size=$(sed -n '/^[[:blank:]]*AUTO_SETUP_RAMLOG_MAXSIZE=/{s/^[^=]*=//p;q}' /boot/dietpi.txt)
- sed -i '/[[:blank:]]\/var\/log[[:blank:]]/d' /etc/fstab
+ sed --follow-symlinks -i '/[[:blank:]]\/var\/log[[:blank:]]/d' /etc/fstab
echo "tmpfs /var/log tmpfs size=${var_log_size:-50}M,noatime,lazytime,nodev,nosuid" >> /etc/fstab
# Apply logging choice index
@@ -3147,9 +3147,9 @@ _EOF_
then
local chromium='chromium'
(( $G_HW_MODEL > 9 )) || chromium='chromium-browser'
- G_EXEC sed -i "s/firefox-esr/$chromium/" /etc/xdg/lxpanel/LXDE/panels/panel
+ G_EXEC sed --follow-symlinks -i "s/firefox-esr/$chromium/" /etc/xdg/lxpanel/LXDE/panels/panel
else
- G_EXEC sed -i 's/firefox-esr/mousepad/' /etc/xdg/lxpanel/LXDE/panels/panel
+ G_EXEC sed --follow-symlinks -i 's/firefox-esr/mousepad/' /etc/xdg/lxpanel/LXDE/panels/panel
fi
fi
@@ -3430,10 +3430,10 @@ _EOF_
dps_index=$software_id Download_Install 'conf' /etc/proftpd/proftpd.conf
# Do not allow root access via FTP
- G_EXEC sed -i 's/^[[:blank:]]*root/#root/' /etc/ftpusers
+ G_EXEC sed --follow-symlinks -i 's/^[[:blank:]]*root/#root/' /etc/ftpusers
# Bullseye: Fix ident lookup: https://github.com/MichaIng/DietPi/issues/4666
- (( $G_DISTRO < 6 )) || G_EXEC sed -i '/IdentLookups/c\\nIdentLookups off\n' /etc/proftpd/proftpd.conf
+ (( $G_DISTRO < 6 )) || G_EXEC sed --follow-symlinks -i '/IdentLookups/c\\nIdentLookups off\n' /etc/proftpd/proftpd.conf
fi
if To_Install 96 nmbd smbd # Samba Server
@@ -3470,7 +3470,7 @@ _EOF_
G_EXEC systemctl stop vsftpd
# Do not allow root access via FTP
- G_EXEC sed -i 's/^[[:blank:]]*root/#root/' /etc/ftpusers
+ G_EXEC sed --follow-symlinks -i 's/^[[:blank:]]*root/#root/' /etc/ftpusers
fi
if To_Install 109 nfs-kernel-server # NFS Server
@@ -3496,7 +3496,7 @@ _EOF_
_EOF_
# Otherwise assure that the webroot is changed, as all our install options depend on it.
else
- G_EXEC sed -i 's|/var/www/html|/var/www|g' /etc/apache2/sites-available/000-default.conf
+ G_EXEC sed --follow-symlinks -i 's|/var/www/html|/var/www|g' /etc/apache2/sites-available/000-default.conf
fi
local apackages=('apache2')
@@ -3581,10 +3581,10 @@ _EOF_
G_BACKUP_FP /etc/nginx/nginx.conf
dps_index=$software_id Download_Install 'nginx.conf' /etc/nginx/nginx.conf
# Adjust socket name to PHP version
- G_EXEC sed -i "s#/run/php/php.*-fpm.sock#/run/php/php$PHP_VERSION-fpm.sock#g" /etc/nginx/nginx.conf
+ G_EXEC sed --follow-symlinks -i "s#/run/php/php.*-fpm.sock#/run/php/php$PHP_VERSION-fpm.sock#g" /etc/nginx/nginx.conf
# CPU core count
- G_EXEC sed -i "/worker_processes/c\worker_processes $G_HW_CPU_CORES;" /etc/nginx/nginx.conf
+ G_EXEC sed --follow-symlinks -i "/worker_processes/c\worker_processes $G_HW_CPU_CORES;" /etc/nginx/nginx.conf
# Default site
dps_index=$software_id Download_Install 'nginx.default' /etc/nginx/sites-available/default
@@ -3608,15 +3608,15 @@ _EOF_
if grep -q 'create-mime\.assign\.pl' /etc/lighttpd/lighttpd.conf
then
G_DIETPI-NOTIFY 2 'Buster upgrade detected: Migrating from "create-mime.assign.pl" to "create-mime.conf.pl"'
- G_EXEC sed -i 's/create-mime\.assign\.pl/create-mime.conf.pl/' /etc/lighttpd/lighttpd.conf
+ G_EXEC sed --follow-symlinks -i 's/create-mime\.assign\.pl/create-mime.conf.pl/' /etc/lighttpd/lighttpd.conf
fi
# Bullseye: mod_compress has been superseded by mod_deflate
if (( $G_DISTRO > 5 )) && grep -q '^[[:blank:]]*"mod_compress",$' /etc/lighttpd/lighttpd.conf
then
G_DIETPI-NOTIFY 2 'Bullseye upgrade detected: Migrating from mod_compress to mod_deflate'
- G_EXEC sed -Ei '/^compress\..*=[[:blank:]]*["(].*[")]$/d' /etc/lighttpd/lighttpd.conf
- G_EXEC sed -i '/^[[:blank:]]*"mod_compress",$/d' /etc/lighttpd/lighttpd.conf
+ G_EXEC sed --follow-symlinks -Ei '/^compress\..*=[[:blank:]]*["(].*[")]$/d' /etc/lighttpd/lighttpd.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*"mod_compress",$/d' /etc/lighttpd/lighttpd.conf
deflate=('lighttpd-mod-deflate')
fi
@@ -3625,14 +3625,14 @@ _EOF_
then
G_DIETPI-NOTIFY 2 'DietPi-LetsEncrypt usage detected: Installing OpenSSL module'
openssl=('lighttpd-mod-openssl')
- [[ -f '/etc/lighttpd/conf-available/50-dietpi-https.conf' ]] && ! grep -q '"mod_openssl"' /etc/lighttpd/conf-available/50-dietpi-https.conf && G_EXEC sed -i '1iserver.modules += ( "mod_openssl" )' /etc/lighttpd/conf-available/50-dietpi-https.conf
+ [[ -f '/etc/lighttpd/conf-available/50-dietpi-https.conf' ]] && ! grep -q '"mod_openssl"' /etc/lighttpd/conf-available/50-dietpi-https.conf && G_EXEC sed --follow-symlinks -i '1iserver.modules += ( "mod_openssl" )' /etc/lighttpd/conf-available/50-dietpi-https.conf
fi
# Bullseye: Remove obsolete socket version string from FPM module
if [[ $G_DISTRO -gt 5 && -f '/etc/lighttpd/conf-available/15-fastcgi-php-fpm.conf' ]] && grep -q 'php.\..-fpm\.sock' /etc/lighttpd/conf-available/15-fastcgi-php-fpm.conf
then
G_DIETPI-NOTIFY 2 'Bullseye upgrade detected: Removing obsolete socket version string from FPM module'
- G_EXEC sed -i 's/php.\..-fpm\.sock/php-fpm.sock/' /etc/lighttpd/conf-available/15-fastcgi-php-fpm.conf
+ G_EXEC sed --follow-symlinks -i 's/php.\..-fpm\.sock/php-fpm.sock/' /etc/lighttpd/conf-available/15-fastcgi-php-fpm.conf
fi
fi
@@ -3650,7 +3650,7 @@ _EOF_
if [[ -f '/var/www/html/index.lighttpd.html' ]]
then
G_EXEC mv /var/www/html/index.lighttpd.html /var/www/
- G_EXEC sed -i 's|/var/www/html|/var/www|' /etc/lighttpd/lighttpd.conf
+ G_EXEC sed --follow-symlinks -i 's|/var/www/html|/var/www|' /etc/lighttpd/lighttpd.conf
fi
[[ -d '/var/www/html' ]] && G_EXEC rmdir --ignore-fail-on-non-empty /var/www/html
@@ -4029,8 +4029,8 @@ _EOF_
G_CONFIG_INJECT 'bind_addresses:[[:blank:]]' " bind_addresses: ['::']" homeserver.yaml
# Log to journal with log level WARNING
- G_EXEC sed -i 's/ handlers: \[.*\]$/ handlers: [console]/' "$servername.log.config"
- G_EXEC sed -i 's/ level: .*/ level: WARNING/' "$servername.log.config"
+ G_EXEC sed --follow-symlinks -i 's/ handlers: \[.*\]$/ handlers: [console]/' "$servername.log.config"
+ G_EXEC sed --follow-symlinks -i 's/ level: .*/ level: WARNING/' "$servername.log.config"
# Permissions
G_EXEC chown -R synapse:synapse .
@@ -4075,14 +4075,14 @@ _EOF_
G_CONFIG_INJECT 'playlist_directory[[:blank:]]' 'playlist_directory "/mnt/dietpi_userdata/Music"' /etc/mpd.conf
G_CONFIG_INJECT 'db_file[[:blank:]]' 'db_file "/mnt/dietpi_userdata/.mpd_cache/db_file"' /etc/mpd.conf
# - Log to journal
- G_EXEC sed -Ei 's/^[[:blank:]]*log_file[[:blank:]]+/#log_file /' /etc/mpd.conf
+ G_EXEC sed --follow-symlinks -Ei 's/^[[:blank:]]*log_file[[:blank:]]+/#log_file /' /etc/mpd.conf
# - PID file is not required for systemd
- G_EXEC sed -Ei 's/^[[:blank:]]*pid_file[[:blank:]]+/#pid_file /' /etc/mpd.conf
+ G_EXEC sed --follow-symlinks -Ei 's/^[[:blank:]]*pid_file[[:blank:]]+/#pid_file /' /etc/mpd.conf
G_CONFIG_INJECT 'state_file[[:blank:]]' 'state_file "/mnt/dietpi_userdata/.mpd_cache/state"' /etc/mpd.conf
G_CONFIG_INJECT 'sticker_file[[:blank:]]' 'sticker_file "/mnt/dietpi_userdata/.mpd_cache/sticker.sql"' /etc/mpd.conf
# - Our service starts as "mpd" user already
- G_EXEC sed -Ei 's/^[[:blank:]]*user[[:blank:]]+/#user /' /etc/mpd.conf
- G_EXEC sed -Ei 's/^[[:blank:]]*group[[:blank:]]+/#group /' /etc/mpd.conf
+ G_EXEC sed --follow-symlinks -Ei 's/^[[:blank:]]*user[[:blank:]]+/#user /' /etc/mpd.conf
+ G_EXEC sed --follow-symlinks -Ei 's/^[[:blank:]]*group[[:blank:]]+/#group /' /etc/mpd.conf
# - Enable UNIX socket
G_CONFIG_INJECT 'bind_to_address[[:blank:]]+"/run/mpd/socket"' 'bind_to_address "/run/mpd/socket"' /etc/mpd.conf
# - Add simple ALSA output, if none present yet
@@ -4247,8 +4247,8 @@ _EOF_
then
G_EXEC_OUTPUT=1 G_EXEC git clone 'https://git.sr.ht/~tsileo/microblog.pub' "$micro_data_dir"
# Enable remote access on port 8007
- G_EXEC sed -i 's/uvicorn app/uvicorn --host 0.0.0.0 --port 8007 app/' "$micro_data_dir/misc/supervisord.conf"
- G_EXEC sed -i 's/8000/8007/' "$micro_data_dir/data/tests.toml"
+ G_EXEC sed --follow-symlinks -i 's/uvicorn app/uvicorn --host 0.0.0.0 --port 8007 app/' "$micro_data_dir/misc/supervisord.conf"
+ G_EXEC sed --follow-symlinks -i 's/8000/8007/' "$micro_data_dir/data/tests.toml"
fi
# Disable pip cache
@@ -4581,8 +4581,6 @@ The install script will now exit. After applying one of the the above, rerun die
# For MariaDB, temporary database admin user needs to be created, as 'root' uses unix_socket login, which cannot be accessed by sudo -u www-data.
# - Create random temporary alphanumeric 30 characters password
local oc_password=$(tr -dc '[:alnum:]' < /dev/random | head -c30)
- # - Failsafe: Use non-blocking entropy source, if /dev/random fails
- (( ${#oc_password} == 30 )) || oc_password=$(tr -dc '[:alnum:]' < /dev/urandom | head -c30)
G_EXEC mysql -e "grant all privileges on *.* to tmp_root@localhost identified by '$oc_password' with grant option;"
G_EXEC_DESC='ownCloud occ install'
@@ -4606,13 +4604,13 @@ The install script will now exit. After applying one of the the above, rerun die
# If "1 => '" does not exist, the config.php is not copied e.g. from older instance, so we add entries.
if ! grep -q "1 => '" "$config_php"; then
- sed -i "/0 => 'localhost'/a 1 => '$(G_GET_NET ip)'," "$config_php"
- sed -i "/1 => '/a 2 => '$HOSTNAME'," "$config_php"
+ sed --follow-symlinks -i "/0 => 'localhost'/a 1 => '$(G_GET_NET ip)'," "$config_php"
+ sed --follow-symlinks -i "/1 => '/a 2 => '$HOSTNAME'," "$config_php"
fi
# Set CLI URL to ownCloud sub directory:
- G_EXEC sed -i "s|'http://localhost'|'http://localhost/owncloud'|" "$config_php"
+ G_EXEC sed --follow-symlinks -i "s|'http://localhost'|'http://localhost/owncloud'|" "$config_php"
# Set pretty URLs (without /index.php/) on Apache:
if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then
@@ -4689,9 +4687,9 @@ The install script will now exit. After applying one of the the above, rerun die
\nWe are patching the PHP version check, but this has two implications:
- You will see an integrity check error on Nextcloud admin panel.
- You will need to redo the patch after Nextcloud updates to future 25.x versions:
-# sed -i '\''s/>= 80200/>= 80300/'\'' /var/www/nextcloud/lib/versioncheck.php
+# sed --follow-symlinks -i '\''s/>= 80200/>= 80300/'\'' /var/www/nextcloud/lib/versioncheck.php
\nWe recommend to update to Nextcloud 26 as fast as possible to get official PHP 8.2 support.'
- G_EXEC sed -i 's/>= 80200/>= 80300/' /var/www/nextcloud/lib/versioncheck.php
+ G_EXEC sed --follow-symlinks -i 's/>= 80200/>= 80300/' /var/www/nextcloud/lib/versioncheck.php
fi
[[ ${aDEPS[0]} ]] && { G_DIETPI-NOTIFY 2 'Installing required PHP modules'; G_AGI "${aDEPS[@]}"; aDEPS=(); }
@@ -4848,8 +4846,6 @@ The install script will now exit. After applying one of the the above, rerun die
# For MariaDB, temporary database admin user needs to be created, as 'root' uses unix_socket login, which cannot be accessed by sudo -u www-data.
# - Create random temporary alphanumeric 30 characters password
local nc_password=$(tr -dc '[:alnum:]' < /dev/random | head -c30)
- # - Failsafe: Use non-blocking entropy source, if /dev/random fails
- (( ${#nc_password} == 30 )) || nc_password=$(tr -dc '[:alnum:]' < /dev/urandom | head -c30)
G_EXEC mysql -e "grant all privileges on *.* to tmp_root@localhost identified by '$nc_password' with grant option;"
G_EXEC_DESC='Nextcloud ncc install'
@@ -4883,10 +4879,10 @@ The install script will now exit. After applying one of the the above, rerun die
G_CONFIG_INJECT "'mysql.utf8mb4'" "'mysql.utf8mb4' => true," "$config_php" "'dbpassword'"
# Disable trusted_domains.
- grep -q "1 => '*'" "$config_php" || sed -i "/0 => 'localhost'/a 1 => '*'," "$config_php"
+ grep -q "1 => '*'" "$config_php" || sed --follow-symlinks -i "/0 => 'localhost'/a 1 => '*'," "$config_php"
# Set CLI URL to Nextcloud sub directory:
- G_EXEC sed -i "s|'http://localhost'|'http://localhost/nextcloud'|" "$config_php"
+ G_EXEC sed --follow-symlinks -i "s|'http://localhost'|'http://localhost/nextcloud'|" "$config_php"
# Set pretty URLs (without /index.php/) on Apache:
if (( ${aSOFTWARE_INSTALL_STATE[83]} > 0 )); then
@@ -4988,7 +4984,7 @@ The install script will now exit. After applying one of the the above, rerun die
GCI_PRESERVE=1 G_CONFIG_INJECT 'total-quota=' 'total-quota=100' /etc/turnserver.conf
GCI_PRESERVE=1 G_CONFIG_INJECT 'bps-capacity=' 'bps-capacity=0' /etc/turnserver.conf
G_CONFIG_INJECT 'stale-nonce' 'stale-nonce' /etc/turnserver.conf
- G_EXEC sed -i 's/^[[:blank:]]*allow-loopback-peers/#allow-loopback-peers/' /etc/turnserver.conf
+ G_EXEC sed --follow-symlinks -i 's/^[[:blank:]]*allow-loopback-peers/#allow-loopback-peers/' /etc/turnserver.conf
G_CONFIG_INJECT 'no-multicast-peers' 'no-multicast-peers' /etc/turnserver.conf
# Install Nextcloud Talk app
@@ -5116,7 +5112,7 @@ PrivateTmp=true
WantedBy=multi-user.target
_EOF_
# Sparky SBC: Workaround for failing service start: https://dietpi.com/forum/t/allogui-not-working-apache-service-doesnt-start/15708
- (( $G_HW_MODEL == 70 )) && G_EXEC sed -i '/^AmbientCapabilities=/d' /etc/systemd/system/roonbridge.service
+ (( $G_HW_MODEL == 70 )) && G_EXEC sed --follow-symlinks -i '/^AmbientCapabilities=/d' /etc/systemd/system/roonbridge.service
fi
if To_Install 119 # CAVA
@@ -5260,8 +5256,8 @@ _EOF_
else
[[ -f '/etc/apt/preferences.d/dietpi-kodi' ]] && G_EXEC rm /etc/apt/preferences.d/dietpi-kodi
- # 32-bit Buster: Apply missing dir workaround: https://github.com/RPi-Distro/repo/issues/153
- [[ $G_DISTRO == 5 && $(dpkg --print-architecture) == 'armhf' && ! -d '/etc/polkit-1/localauthority/50-local.d' ]] && G_EXEC mkdir -p /etc/polkit-1/localauthority/50-local.d
+ # 32-bit Buster and Bookworm: Apply missing dir workaround: https://github.com/RPi-Distro/repo/issues/153, https://github.com/MichaIng/DietPi/issues/6703
+ [[ $G_DISTRO == 5 && $(dpkg --print-architecture) == 'armhf' || $G_DISTRO == [78] ]] && G_EXEC mkdir -p /etc/polkit-1/localauthority/50-local.d
# Buster: fbset required to recover desktop with custom resolution and fix startup warning
# Bullseye: Enable hardware codecs
@@ -5499,7 +5495,7 @@ _EOF_
G_EXEC cp etc/raspimjpeg/raspimjpeg.1 /etc/raspimjpeg
G_EXEC ln -sf /etc/raspimjpeg /var/www/rpicam/raspimjpeg
# - Web base dir
- grep -q '/rpicam' /etc/raspimjpeg || G_EXEC sed -i 's|/var/www|/var/www/rpicam|g' /etc/raspimjpeg
+ grep -q '/rpicam' /etc/raspimjpeg || G_EXEC sed --follow-symlinks -i 's|/var/www|/var/www/rpicam|g' /etc/raspimjpeg
# - Service
dps_index=$software_id Download_Install 'raspimjpeg.sh' /var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh
G_EXEC chmod +x /var/lib/dietpi/dietpi-software/installed/raspimjpeg.sh
@@ -5581,7 +5577,7 @@ _EOF_
local id=$(tr -dc '0-9a-f' < /dev/random | head -c32)
G_EXEC chmod 0600 /mnt/dietpi_userdata/deluge/.config/deluge/hostlist.conf
G_CONFIG_INJECT '"[0-9a-f]{32}"' " \"$id\"," /mnt/dietpi_userdata/deluge/.config/deluge/hostlist.conf
- sed -i "/\"[0-9a-f]\{40\}\"/c\ \"$localpass\"" /mnt/dietpi_userdata/deluge/.config/deluge/hostlist.conf
+ sed --follow-symlinks -i "/\"[0-9a-f]\{40\}\"/c\ \"$localpass\"" /mnt/dietpi_userdata/deluge/.config/deluge/hostlist.conf
G_CONFIG_INJECT '"default_daemon":' " \"default_daemon\": \"$id\"," /mnt/dietpi_userdata/deluge/.config/deluge/web.conf
unset -v localpass id
RESTART_DELUGE_WEB=1
@@ -5632,15 +5628,15 @@ _EOF_
# RISC-V workaround until arch has been added to repo: https://download.webmin.com/download/repository/dists/sarge/contrib/
if (( $G_HW_ARCH == 11 ))
then
- Download_Install "https://download.webmin.com/download/repository/pool/contrib/w/webmin/$(curl -sSf 'https://download.webmin.com/download/repository/pool/contrib/w/webmin/' | grep -o 'webmin_[^_]*_all.deb' | tail -1)"
+ Download_Install "https://download.webmin.com/download/newkey/repository/pool/contrib/w/webmin/$(curl -sSf 'https://download.webmin.com/download/newkey/repository/pool/contrib/w/webmin/' | grep -o 'webmin_[^_]*_all.deb' | tail -1)"
else
# APT key
- local url='https://webmin.com/jcameron-key.asc'
+ local url='https://webmin.com/developers-key.asc'
G_CHECK_URL "$url"
G_EXEC eval "curl -sSfL '$url' | gpg --dearmor -o /etc/apt/trusted.gpg.d/dietpi-webmin.gpg --yes"
# APT list
- G_EXEC eval "echo 'deb https://download.webmin.com/download/repository/ sarge contrib' > /etc/apt/sources.list.d/webmin.list"
+ G_EXEC eval 'echo '\''deb https://download.webmin.com/download/newkey/repository stable contrib'\'' > /etc/apt/sources.list.d/webmin.list'
G_AGUP
# APT package
@@ -5715,9 +5711,9 @@ _EOF_
G_EXEC systemctl stop darkice icecast2
# IceCast: Set passwords if not yet done (default found)
- sed -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
- sed -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
- sed -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
+ sed --follow-symlinks -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
+ sed --follow-symlinks -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
+ sed --follow-symlinks -i "/hackme/c\ $GLOBAL_PW" /etc/icecast2/icecast.xml
# - Remove default service config
[[ -f '/etc/default/icecast2' ]] && G_EXEC rm /etc/default/icecast2
@@ -5960,7 +5956,7 @@ ExitPolicy reject *:*
_EOF_
[[ $ipv6 ]] && echo 'IPv6Exit 1' >> /etc/tor/torrc
# Apply Unbound as local DNS resolver for privacy reasons
- command -v resolvconf > /dev/null && G_EXEC sed -i 's/dns-nameservers.*$/dns-nameservers 127.0.0.1/' /etc/network/interfaces
+ command -v resolvconf > /dev/null && G_EXEC sed --follow-symlinks -i 's/dns-nameservers.*$/dns-nameservers 127.0.0.1/' /etc/network/interfaces
G_EXEC eval "echo 'nameserver 127.0.0.1' > /etc/resolv.conf" # Unbound is running and configured in the very next config step, so it is safe to switch the DNS nameserver right now.
fi
@@ -6018,14 +6014,14 @@ _EOF_
G_DIETPI-NOTIFY 2 'Configuring Pi-hole to use Unbound'
if [[ -f '/etc/dnsmasq.d/01-pihole.conf' ]]
then
- G_EXEC sed -i '/^[[:blank:]]*server=/d' /etc/dnsmasq.d/01-pihole.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*server=/d' /etc/dnsmasq.d/01-pihole.conf
G_CONFIG_INJECT 'server=' 'server=127.0.0.1#5335' /etc/dnsmasq.d/01-pihole.conf
systemctl -q is-active pihole-FTL && G_EXEC systemctl restart pihole-FTL
fi
if [[ -f '/etc/pihole/setupVars.conf' ]]
then
G_CONFIG_INJECT 'PIHOLE_DNS_1=' 'PIHOLE_DNS_1=127.0.0.1#5335' /etc/pihole/setupVars.conf
- G_EXEC sed -i '/^[[:blank:]]*PIHOLE_DNS_2=/d' /etc/pihole/setupVars.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*PIHOLE_DNS_2=/d' /etc/pihole/setupVars.conf
fi
fi
@@ -6078,8 +6074,8 @@ _EOF_
# - Skip supported OS check. We do not support Debian testing but we are testing it already now.
# - Workaround "dialog" issues with "xterm" by faking "linux" terminal
# - Skip web server install, since we allow to choose and install it prior to Pi-hole
- G_EXEC sed -Ei '/^[[:blank:]]*set(AdminFla|Loggin)g$/d' install.sh
- G_EXEC sed -i 's/QUERY_LOGGING=true/QUERY_LOGGING=false/' install.sh
+ G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*set(AdminFla|Loggin)g$/d' install.sh
+ G_EXEC sed --follow-symlinks -i 's/QUERY_LOGGING=true/QUERY_LOGGING=false/' install.sh
export PIHOLE_SKIP_OS_CHECK=true
local retry TERM_old=
[[ $TERM == 'xterm' ]] && { TERM_old=$TERM; export TERM=linux; }
@@ -6106,11 +6102,11 @@ _EOF_
if (( ${aSOFTWARE_INSTALL_STATE[182]} > 0 ))
then
G_DIETPI-NOTIFY 2 'Configuring Pi-hole to use Unbound'
- G_EXEC sed -i '/^[[:blank:]]*server=/d' /etc/dnsmasq.d/01-pihole.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*server=/d' /etc/dnsmasq.d/01-pihole.conf
G_CONFIG_INJECT 'server=' 'server=127.0.0.1#5335' /etc/dnsmasq.d/01-pihole.conf
systemctl -q is-active pihole-FTL && G_EXEC systemctl restart pihole-FTL
G_CONFIG_INJECT 'PIHOLE_DNS_1=' 'PIHOLE_DNS_1=127.0.0.1#5335' /etc/pihole/setupVars.conf
- G_EXEC sed -i '/^[[:blank:]]*PIHOLE_DNS_2=/d' /etc/pihole/setupVars.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*PIHOLE_DNS_2=/d' /etc/pihole/setupVars.conf
fi
# Enable required PHP modules: https://github.com/pi-hole/pi-hole/blob/development/automated%20install/basic-install.sh#L250
@@ -6348,7 +6344,7 @@ _EOF_
*) local arch='amd64';;
esac
- local fallback_url="https://github.com/navidrome/navidrome/releases/download/v0.50.0/navidrome_0.50.0_linux_$arch.tar.gz"
+ local fallback_url="https://github.com/navidrome/navidrome/releases/download/v0.50.2/navidrome_0.50.2_linux_$arch.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/navidrome/navidrome/releases/latest' | mawk -F\" "/^ *\"browser_download_url\": \".*\/navidrome_[0-9.]*_linux_$arch\.tar\.gz\"$/{print \$4}")" /opt/navidrome
# Data dir
@@ -6444,7 +6440,7 @@ _EOF_
*) local arch='x64';;
esac
- local fallback_url="https://github.com/Kareadita/Kavita/releases/download/v0.7.10.2/kavita-linux-$arch.tar.gz"
+ local fallback_url="https://github.com/Kareadita/Kavita/releases/download/v0.7.11.2/kavita-linux-$arch.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/Kareadita/Kavita/releases/latest' | mawk -F\" "/^ *\"browser_download_url\": \".*\/kavita-linux-$arch\.tar\.gz\"$/{print \$4}")"
G_EXEC chmod +x Kavita/Kavita
@@ -6652,7 +6648,7 @@ _EOF_
esac
# Download
- local fallback_url="https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_$arch.tar.gz"
+ local fallback_url="https://github.com/fatedier/frp/releases/download/v0.53.0/frp_0.53.0_linux_$arch.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/fatedier/frp/releases/latest' | mawk -F\" "/\"browser_download_url\": .*\/frp_[0-9.]*_linux_$arch\.tar\.gz\"/{print \$4}")"
G_EXEC cd frp_*
@@ -6860,10 +6856,10 @@ _EOF_
# Config: /etc/mosquitto/conf.d exists, but doubled settings do not override each other and lead to a startup failure instead, which breaks the purpose we want to use it for.
# - Disable PID file, not required for systemd handling
- G_EXEC sed -i '/^[[:blank:]]*pid_file[[:blank:]]/d' /etc/mosquitto/mosquitto.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*pid_file[[:blank:]]/d' /etc/mosquitto/mosquitto.conf
[[ -d '/run/mosquitto' ]] && G_EXEC rm -R /run/mosquitto
# - Log to default STDERR > systemd-journald
- G_EXEC sed -i '/^[[:blank:]]*log_dest[[:blank:]]/d' /etc/mosquitto/mosquitto.conf
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*log_dest[[:blank:]]/d' /etc/mosquitto/mosquitto.conf
[[ -d '/var/log/mosquitto' ]] && G_EXEC rm -R /var/log/mosquitto
# - Add default password file for authenticated requests: https://github.com/MichaIng/DietPi/issues/4133
GCI_PRESERVE=1 G_CONFIG_INJECT 'password_file[[:blank:]]' 'password_file /etc/mosquitto/passwd' /etc/mosquitto/mosquitto.conf
@@ -6926,7 +6922,7 @@ _EOF_
if [[ ! -f '/mnt/dietpi_userdata/blynk/client-tcp-local.js' ]]
then
G_EXEC curl -sSfL 'https://raw.githubusercontent.com/vshymanskyy/blynk-library-js/master/examples/nodejs/client-tcp-local.js' -o /mnt/dietpi_userdata/blynk/client-tcp-local.js
- G_EXEC sed -i "s|require('blynk-library')|require('/usr/local/lib/node_modules/blynk-library')|" /mnt/dietpi_userdata/blynk/client-tcp-local.js
+ G_EXEC sed --follow-symlinks -i "s|require('blynk-library')|require('/usr/local/lib/node_modules/blynk-library')|" /mnt/dietpi_userdata/blynk/client-tcp-local.js
G_EXEC chmod +x /mnt/dietpi_userdata/blynk/client-tcp-local.js
fi
@@ -7000,10 +6996,10 @@ _EOF_
G_EXEC_OUTPUT=1 G_EXEC patch -p1 -i webiopi-pi2bplus.patch
# Install for Python 3 only
- G_EXEC sed -i '/SEARCH="python python3"/c\SEARCH="python3"' setup.sh
+ G_EXEC sed --follow-symlinks -i '/SEARCH="python python3"/c\SEARCH="python3"' setup.sh
# Skip Weaved install prompt
- G_EXEC sed -i '/read response/c\response="n"' setup.sh
+ G_EXEC sed --follow-symlinks -i '/read response/c\response="n"' setup.sh
# Run setup script, skipping APT installs
G_EXEC_OUTPUT=1 G_EXEC ./setup.sh skip-apt
@@ -7014,7 +7010,7 @@ _EOF_
G_EXEC rm -R WebIOPi-master
# On fresh installs, change port to 8002 to avoid conflict with IceCast
- (( $reinstall )) || G_EXEC sed -i 's/^port = 8000$/port = 8002/' /etc/webiopi/config
+ (( $reinstall )) || G_EXEC sed --follow-symlinks -i 's/^port = 8000$/port = 8002/' /etc/webiopi/config
# Service
Remove_SysV webiopi 1
@@ -7573,7 +7569,7 @@ _EOF_
then
Download_Install 'https://github.com/gotson/komga/releases/download/v0.165.0/komga-0.165.0.jar' /mnt/dietpi_userdata/komga/komga.jar
else
- local fallback_url='https://github.com/gotson/komga/releases/download/1.7.2/komga-1.7.2.jar'
+ local fallback_url='https://github.com/gotson/komga/releases/download/1.9.0/komga-1.9.0.jar'
Download_Install "$(curl -sSfL 'https://api.github.com/repos/gotson/komga/releases/latest' | mawk -F\" '/^ *"browser_download_url": ".*\/komga-[^"\/]*\.jar"$/{print $4}')" /mnt/dietpi_userdata/komga/komga.jar
fi
@@ -7668,7 +7664,7 @@ _EOF_
local json=()
[[ $PHP_VERSION == 8* ]] || aDEPS+=("php$PHP_VERSION-json") json=('json')
- # Bullseye+
+ # Bullseye and above
if (( $G_DISTRO > 5 ))
then
local fallback_url="https://github.com/ampache/ampache/releases/download/6.1.0/ampache-6.1.0_all_php$PHP_VERSION.zip"
@@ -7676,7 +7672,7 @@ _EOF_
# Ampache is installed to /mnt/dietpi_userdata/ampache and the "public" directory linked to /var/www/ampache: https://github.com/MichaIng/DietPi/pull/5205
local fp_install='/mnt/dietpi_userdata' fp_public='ampache/public'
- # Ampache v5 requires PHP7.4, hence pull latest Ampache v4 on Buster: https://github.com/ampache/ampache/wiki/Ampache-Next-Changes
+ # Buster: Ampache v5 requires PHP7.4, hence pull latest Ampache v4: https://github.com/ampache/ampache/wiki/Ampache-Next-Changes
else
Download_Install 'https://github.com/ampache/ampache/releases/download/4.4.3/ampache-4.4.3_all.zip' ampache
# Ampache is installed to /var/www/ampache.
@@ -7702,30 +7698,20 @@ _EOF_
# Enable required PHP modules: https://github.com/ampache/ampache/wiki/Installation#prerequisites
G_EXEC phpenmod curl intl xml "${json[@]}"
- # Import our pre-made Ampache database, if not existent already
- if [[ ! -d '/mnt/dietpi_userdata/mysql/ampache' ]]
- then
- /boot/dietpi/func/create_mysql_db ampache ampache "$GLOBAL_PW"
- Download_Install 'https://dietpi.com/downloads/mysql_databases/ampache_mysql_3.8.2-v6.0.zip'
- G_EXEC mysql ampache < ampache.sql
- G_EXEC rm ampache.sql
- # Also update password here for rare but possible case that database was lost but config file still exists
- [[ -f $fp_install/ampache/config/ampache.cfg.php ]] && G_CONFIG_INJECT 'database_password[[:blank:]]+=' "database_password = \"$GLOBAL_PW\"" "$fp_install/ampache/config/ampache.cfg.php"
- fi
+ # Create random temporary alphanumeric 30 characters database password
+ local password=$(tr -dc '[:alnum:]' < /dev/random | head -c30)
- # Create new config, if not existent already
+ # Fresh install: Create new config
if [[ ! -f $fp_install/ampache/config/ampache.cfg.php ]]
then
- G_EXEC mv "$fp_install/ampache/config/ampache.cfg.php"{.dist,}
+ G_EXEC cp "$fp_install/ampache/config/ampache.cfg.php"{.dist,}
G_CONFIG_INJECT 'web_path[[:blank:]]+=' 'web_path = "/ampache"' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'database_hostname[[:blank:]]+=' 'database_hostname = /run/mysqld/mysqld.sock' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'database_name[[:blank:]]+=' 'database_name = ampache' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'database_username[[:blank:]]+=' 'database_username = ampache' "$fp_install/ampache/config/ampache.cfg.php"
- G_CONFIG_INJECT 'database_password[[:blank:]]+=' "database_password = \"$GLOBAL_PW\"" "$fp_install/ampache/config/ampache.cfg.php"
- G_CONFIG_INJECT 'waveform[[:blank:]]+=' 'waveform = "true"' "$fp_install/ampache/config/ampache.cfg.php"
+ GCI_PASSWORD=1 G_CONFIG_INJECT 'database_password[[:blank:]]+=' "database_password = \"$password\"" "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'tmp_dir_path[[:blank:]]+=' 'tmp_dir_path = "/tmp"' "$fp_install/ampache/config/ampache.cfg.php"
- G_CONFIG_INJECT 'generate_video_preview[[:blank:]]+=' 'generate_video_preview = "true"' "$fp_install/ampache/config/ampache.cfg.php"
- G_CONFIG_INJECT 'channel[[:blank:]]+=' 'channel = "true"' "$fp_install/ampache/config/ampache.cfg.php"
+ G_CONFIG_INJECT 'transcode_cmd[[:blank:]]+=' 'transcode_cmd = "ffmpeg"' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'transcode_m4a[[:blank:]]+=' 'transcode_m4a = "required"' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'transcode_flac[[:blank:]]+=' 'transcode_flac = "required"' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'transcode_mpc[[:blank:]]+=' 'transcode_mpc = "required"' "$fp_install/ampache/config/ampache.cfg.php"
@@ -7736,11 +7722,55 @@ _EOF_
G_CONFIG_INJECT 'transcode_mpg[[:blank:]]+=' 'transcode_mpg = "allowed"' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'encode_target[[:blank:]]+=' 'encode_target = mp3' "$fp_install/ampache/config/ampache.cfg.php"
G_CONFIG_INJECT 'encode_video_target[[:blank:]]+=' 'encode_video_target = webm' "$fp_install/ampache/config/ampache.cfg.php"
- G_CONFIG_INJECT 'transcode_cmd[[:blank:]]+=' 'transcode_cmd = "ffmpeg"' "$fp_install/ampache/config/ampache.cfg.php"
+ G_CONFIG_INJECT 'generate_video_preview[[:blank:]]+=' 'generate_video_preview = "true"' "$fp_install/ampache/config/ampache.cfg.php"
+ G_CONFIG_INJECT 'waveform[[:blank:]]+=' 'waveform = "true"' "$fp_install/ampache/config/ampache.cfg.php"
+
+ # Update password as well in rare but possible case that config file still exists but database was lost
+ elif [[ ! -d '/mnt/dietpi_userdata/mysql/ampache' ]]
+ then
+ GCI_PASSWORD=1 G_CONFIG_INJECT 'database_password[[:blank:]]+=' "database_password = \"$password\"" "$fp_install/ampache/config/ampache.cfg.php"
fi
- # Permissions: Ampache can automatically migrate old configs to the new config file
- G_EXEC chown www-data "$fp_install/ampache/config/ampache.cfg.php"
+ # Permissions: Permit config file updates via web UI
+ G_EXEC chown www-data "$fp_install/ampache/config/ampache.cfg.php"{.dist,}
+
+ # Fresh install: Generate database
+ G_EXEC systemctl start mariadb
+ if [[ ! -d '/mnt/dietpi_userdata/mysql/ampache' ]]
+ then
+ /boot/dietpi/func/create_mysql_db ampache ampache "$password"
+ if (( $G_DISTRO > 5 ))
+ then
+ # Import template
+ G_EXEC mysql ampache < /mnt/dietpi_userdata/ampache/resources/sql/ampache.sql
+ # Generate admin user: Replace password string internally to avoid printing it to console
+ G_EXEC_PRE_FUNC(){ acommand[6]=$GLOBAL_PW; }
+ G_EXEC php /mnt/dietpi_userdata/ampache/bin/cli admin:addUser -l 100 -p "${GLOBAL_PW//?/X}" dietpi
+ # Generate local music catalogue
+ G_EXEC_OUTPUT=1 G_EXEC php /mnt/dietpi_userdata/ampache/bin/cli run:addCatalog Music /mnt/dietpi_userdata/Music music
+ # Scan for music files
+ G_EXEC_OUTPUT=1 G_EXEC php /mnt/dietpi_userdata/ampache/bin/cli run:updateCatalog
+ else
+ # Import template
+ G_EXEC mysql ampache < /var/www/ampache/sql/ampache.sql
+ # Generate admin user: Replace password string internally to avoid printing it to console
+ G_EXEC_PRE_FUNC(){ acommand[7]=$GLOBAL_PW; }
+ G_EXEC php /var/www/ampache/bin/install/add_user.inc -u dietpi -l 100 -p "${GLOBAL_PW//?/X}"
+ # Generate local music catalogue
+ # shellcheck disable=SC2016
+ G_EXEC_OUTPUT=1 G_EXEC mysql -e 'use ampache; insert into `catalog` values (1,'\''Music'\'','\''local'\'',0,null,0,1,'\''%T - %t'\'','\''%a/%A'\'','\''music'\''); insert into `catalog_local` values (1,'\''/mnt/dietpi_userdata/Music'\'',1)'
+ # Scan for music files
+ G_EXEC_OUTPUT=1 G_EXEC php /var/www/ampache/bin/catalog_update.inc
+ fi
+
+ # Reinstall: Update database
+ elif (( $G_DISTRO > 5 ))
+ then
+ G_EXEC_OUTPUT=1 G_EXEC php /mnt/dietpi_userdata/ampache/bin/cli admin:updateDatabase
+ else
+ G_EXEC_OUTPUT=1 G_EXEC php /var/www/ampache/bin/install/update_db.inc
+ fi
+ unset -v password
fi
if To_Install 58 tailscaled # Tailscale
@@ -7893,12 +7923,12 @@ _EOF_
G_EXEC curl -sSfL 'https://raw.githubusercontent.com/pivpn/pivpn/master/auto_install/install.sh' -o install.bash
G_EXEC chmod +x install.bash
G_DIETPI-NOTIFY 2 'Preventing reboot from within PiVPN installer'
- G_EXEC sed -i '/^Thank you for using PiVPN./a\exit 0' install.bash
+ G_EXEC sed --follow-symlinks -i '/^Thank you for using PiVPN./a\exit 0' install.bash
G_DIETPI-NOTIFY 2 'Preventing install of unattended-upgrades'
- G_EXEC sed -i '/^[[:blank:]]*askUnattendedUpgrades$/c\UNATTUPG=0' install.bash
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*askUnattendedUpgrades$/c\UNATTUPG=0' install.bash
G_DIETPI-NOTIFY 2 'Prevent dhcpcd from being installed'
- G_EXEC sed -i '/^checkStaticIpSupported() {$/,/^}$/d' install.bash
- G_EXEC sed -i '/^####### FUNCTIONS ##########$/a\checkStaticIpSupported(){ return 1; }' install.bash
+ G_EXEC sed --follow-symlinks -i '/^checkStaticIpSupported() {$/,/^}$/d' install.bash
+ G_EXEC sed --follow-symlinks -i '/^####### FUNCTIONS ##########$/a\checkStaticIpSupported(){ return 1; }' install.bash
# Unattended install
local options=()
@@ -7988,7 +8018,7 @@ _EOF_
echo "INTERFACESv4=\"$wifi_iface\"" > /etc/default/isc-dhcp-server
# Remove all entries below wlan, so we can recreate them
- G_EXEC sed -Ei '/(allow-hotplug|auto)[[:blank:]]+wlan/q0' /etc/network/interfaces
+ G_EXEC sed --follow-symlinks -Ei '/(allow-hotplug|auto)[[:blank:]]+wlan/q0' /etc/network/interfaces
# Enable up wlan
G_CONFIG_INJECT 'allow-hotplug wlan' "allow-hotplug $wifi_iface" /etc/network/interfaces
@@ -8009,7 +8039,7 @@ up ip6tables-restore < /etc/iptables.ipv6.nat
_EOF_
# Remove wireless-power setting if not supported by adapter/firmware
# shellcheck disable=SC2015
- iw dev "$wifi_iface" set power_save on 2> /dev/null && iw dev "$wifi_iface" set power_save off 2> /dev/null || G_EXEC sed -i '/ iw dev .* set power_save /d' /etc/network/interfaces
+ iw dev "$wifi_iface" set power_save on 2> /dev/null && iw dev "$wifi_iface" set power_save off 2> /dev/null || G_EXEC sed --follow-symlinks -i '/ iw dev .* set power_save /d' /etc/network/interfaces
# Access point config
# - Parse dietpi.txt
@@ -8163,7 +8193,7 @@ _EOF_
G_CONFIG_INJECT 'SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=' 'SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=2' /boot/dietpi.txt
airplay2='-airplay2'
else
- G_EXEC sed -i '/^[[:blank:]]*SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=/c\#SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=2' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=/c\#SOFTWARE_SHAIRPORT_SYNC_AIRPLAY=2' /boot/dietpi.txt
airplay2=
fi
@@ -8308,7 +8338,7 @@ web.statistics.1.content.9.ds_graph_options.usbhdd_used.label=USB HDD used space
web.statistics.1.content.9.ds_graph_options.usbhdd_used.lines={ fill: true }
web.statistics.1.content.9.ds_graph_options.usbhdd_used.color="#7777FF"
_EOF_
- G_EXEC sed -i '\|include=/etc/rpimonitor/template/sdcard.conf|a\include=/etc/rpimonitor/template/usb_hdd.conf' /etc/rpimonitor/data.conf
+ G_EXEC sed --follow-symlinks -i '\|include=/etc/rpimonitor/template/sdcard.conf|a\include=/etc/rpimonitor/template/usb_hdd.conf' /etc/rpimonitor/data.conf
fi
fi
@@ -8386,13 +8416,13 @@ location = /.well-known/caldav { return 301 /baikal/html/dav.php; }' > /etc/ngi
# Cap total connections
local max_users=$(( $G_HW_CPU_CORES * 8 ))
- G_EXEC sed -i "/users=/c\users=$max_users" /etc/mumble-server.ini
+ G_EXEC sed --follow-symlinks -i "/users=/c\users=$max_users" /etc/mumble-server.ini
# Name the root channel
- G_EXEC sed -i '/registerName=/c\registerName=DietPi Mumble Server' /etc/mumble-server.ini
+ G_EXEC sed --follow-symlinks -i '/registerName=/c\registerName=DietPi Mumble Server' /etc/mumble-server.ini
# Disable DB logging
- G_EXEC sed -i '/logdays=/c\logdays=-1' /etc/mumble-server.ini
+ G_EXEC sed --follow-symlinks -i '/logdays=/c\logdays=-1' /etc/mumble-server.ini
# Set Superuser passwd: https://dietpi.com/forum/t/mumble-murmur-server-superuser-error/1371
murmurd -ini /etc/mumble-server.ini -supw "$GLOBAL_PW"
@@ -8699,7 +8729,7 @@ _EOF_
fi
# Since v4.2.0, PBKDF2 needs to be used: https://github.com/MichaIng/DietPi/issues/4711
- (( $G_DISTRO < 6 )) || G_EXEC sed -i '/^WebUI\\Password_ha1/c\WebUI\\Password_PBKDF2="@ByteArray(tpgNK76AcpP14rjOZP9vwg==:rQNtOB0P4HfNj20pJtxiTBi9miduS6L1Xqqazc4Y6Gpm3Rn02jMXnPPT3KH2JMDKhFQjAaTGVJz0dz5JVw2QUQ==)"' /home/qbittorrent/.config/qBittorrent/qBittorrent.conf
+ (( $G_DISTRO < 6 )) || G_EXEC sed --follow-symlinks -i '/^WebUI\\Password_ha1/c\WebUI\\Password_PBKDF2="@ByteArray(tpgNK76AcpP14rjOZP9vwg==:rQNtOB0P4HfNj20pJtxiTBi9miduS6L1Xqqazc4Y6Gpm3Rn02jMXnPPT3KH2JMDKhFQjAaTGVJz0dz5JVw2QUQ==)"' /home/qbittorrent/.config/qBittorrent/qBittorrent.conf
# Service
cat << _EOF_ > /etc/systemd/system/qbittorrent.service
@@ -8805,7 +8835,7 @@ _EOF_
[[ -f '/etc/.rutorrent-htaccess' ]] || echo "root:rtorrent:$(echo -n "root:rtorrent:$GLOBAL_PW" | md5sum | mawk '{print $1}')" > /etc/.rutorrent-htaccess
# Pre-v7.2: Remove obsolete entries from /etc/lighttpd/lighttpd.conf
- grep -q '^#RUTORRENT_DIETPI' /etc/lighttpd/lighttpd.conf && G_EXEC sed -i '/#RUTORRENT_DIETPI/,/#RUTORRENT_DIETPI/d' /etc/lighttpd/lighttpd.conf
+ grep -q '^#RUTORRENT_DIETPI' /etc/lighttpd/lighttpd.conf && G_EXEC sed --follow-symlinks -i '/#RUTORRENT_DIETPI/,/#RUTORRENT_DIETPI/d' /etc/lighttpd/lighttpd.conf
cat << '_EOF_' > /etc/lighttpd/conf-available/98-dietpi-rtorrent.conf
server.modules += ( "mod_auth", "mod_authn_file", "mod_scgi" )
@@ -8903,7 +8933,7 @@ _EOF_
# In case dist-upgraded systems, assure that daemon mode is enabled
G_CONFIG_INJECT 'system.daemon.set[[:blank:]=]' 'system.daemon.set = true' /mnt/dietpi_userdata/rtorrent/.rtorrent.rc
# Reinstall: Assure that rpi.socket is used, else ruTorrent connection would fail
- G_EXEC sed -i '/^[[:blank:]]*network.scgi.open_port[[:blank:]=]/d' /mnt/dietpi_userdata/rtorrent/.rtorrent.rc
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*network.scgi.open_port[[:blank:]=]/d' /mnt/dietpi_userdata/rtorrent/.rtorrent.rc
G_CONFIG_INJECT 'network.scgi.open_local[[:blank:]=]' 'network.scgi.open_local = /mnt/dietpi_userdata/downloads/.session/rpc.socket' /mnt/dietpi_userdata/rtorrent/.rtorrent.rc
G_CONFIG_INJECT 'execute.nothrow[[:blank:]]*=[[:blank:]]*chmod,666,/mnt/dietpi_userdata/downloads/.session/rpc.socket' 'execute.nothrow = chmod,666,/mnt/dietpi_userdata/downloads/.session/rpc.socket' /mnt/dietpi_userdata/rtorrent/.rtorrent.rc 'network.scgi.open_local[[:blank:]=]'
else
@@ -9095,7 +9125,7 @@ _EOF_
G_CONFIG_INJECT 'StartLimitIntervalSec=' 'StartLimitIntervalSec=600' /etc/systemd/system/medusa.service '\[Unit\]'
G_CONFIG_INJECT 'StartLimitBurst=' 'StartLimitBurst=3' /etc/systemd/system/medusa.service 'StartLimitIntervalSec='
# - Remove "Group=medusa" which does not exist, instead fallback to primary group "dietpi"
- G_EXEC sed -i '/^[[:blank:]]*Group=/d' /etc/systemd/system/medusa.service
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*Group=/d' /etc/systemd/system/medusa.service
# - Launch from our install and data directory
G_CONFIG_INJECT 'ExecStart=' 'ExecStart=/usr/bin/python3 /mnt/dietpi_userdata/medusa/start.py -q --nolaunch --datadir=/mnt/dietpi_userdata/medusa' /etc/systemd/system/medusa.service
@@ -9120,7 +9150,7 @@ _EOF_
*) local arch='arm';;
esac
- local fallback_url="https://github.com/syncthing/syncthing/releases/download/v1.26.1/syncthing-linux-$arch-v1.26.1.tar.gz"
+ local fallback_url="https://github.com/syncthing/syncthing/releases/download/v1.27.1/syncthing-linux-$arch-v1.27.1.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/syncthing/syncthing/releases/latest' | mawk -F\" "/\"browser_download_url\": .*\/syncthing-linux-$arch-[^\"\/]*\.tar\.gz\"/{print \$4}")"
G_EXEC mv syncthing-* /opt/syncthing
fi
@@ -9138,13 +9168,13 @@ _EOF_
G_EXEC_OUTPUT=1 G_EXEC sudo -u dietpi /opt/syncthing/syncthing -generate=/mnt/dietpi_userdata/syncthing
# Allow remote access: https://docs.syncthing.net/users/faq.html#how-do-i-access-the-web-gui-from-another-computer
- G_EXEC sed -i '\|:8384|c\ 0.0.0.0:8384' /mnt/dietpi_userdata/syncthing/config.xml
+ G_EXEC sed --follow-symlinks -i '\|:8384|c\ 0.0.0.0:8384' /mnt/dietpi_userdata/syncthing/config.xml
# Set default data directory
G_EXEC mkdir -p /mnt/dietpi_userdata/syncthing_data
G_EXEC chown -R dietpi:dietpi /mnt/dietpi_userdata/syncthing_data
- G_EXEC sed -i '\|[0-9]+<\/Port>/{s/^.*([0-9]+)<\/Port>.*$/\1/p;q}' /mnt/dietpi_userdata/sonarr/config.xml)
local apikey=$(sed -nE '/.+<\/ApiKey>/{s/^.*(.+)<\/ApiKey>.*$/\1/p;q}' /mnt/dietpi_userdata/sonarr/config.xml)
- G_EXEC sed -i '/\[sonarr\]/,/^$/s/^ip = .*$/ip = 127.0.0.1/' /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i "/\[sonarr\]/,/^$/s/^port = .*$/port = $port/" /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i '/\[sonarr\]/,/^$/s/^base_url = .*$/base_url = \//' /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i "/\[sonarr\]/,/^$/s/^apikey = .*$/apikey = $apikey/" /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i '/\[sonarr\]/,/^$/s/^ip = .*$/ip = 127.0.0.1/' /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i "/\[sonarr\]/,/^$/s/^port = .*$/port = $port/" /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i '/\[sonarr\]/,/^$/s/^base_url = .*$/base_url = \//' /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i "/\[sonarr\]/,/^$/s/^apikey = .*$/apikey = $apikey/" /mnt/dietpi_userdata/bazarr/config/config.ini
G_CONFIG_INJECT 'use_sonarr[[:blank:]]*=' 'use_sonarr = True' /mnt/dietpi_userdata/bazarr/config/config.ini '\[general\]'
fi
# Radarr
@@ -9968,10 +9998,10 @@ _EOF_
then
local port=$(sed -nE '/[0-9]+<\/Port>/{s/^.*([0-9]+)<\/Port>.*$/\1/p;q}' /mnt/dietpi_userdata/radarr/config.xml)
local apikey=$(sed -nE '/.+<\/ApiKey>/{s/^.*(.+)<\/ApiKey>.*$/\1/p;q}' /mnt/dietpi_userdata/radarr/config.xml)
- G_EXEC sed -i '/\[radarr\]/,/^$/s/^ip = .*$/ip = 127.0.0.1/' /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i "/\[radarr\]/,/^$/s/^port = .*$/port = $port/" /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i '/\[radarr\]/,/^$/s/^base_url = .*$/base_url = \//' /mnt/dietpi_userdata/bazarr/config/config.ini
- G_EXEC sed -i "/\[radarr\]/,/^$/s/^apikey = .*$/apikey = $apikey/" /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i '/\[radarr\]/,/^$/s/^ip = .*$/ip = 127.0.0.1/' /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i "/\[radarr\]/,/^$/s/^port = .*$/port = $port/" /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i '/\[radarr\]/,/^$/s/^base_url = .*$/base_url = \//' /mnt/dietpi_userdata/bazarr/config/config.ini
+ G_EXEC sed --follow-symlinks -i "/\[radarr\]/,/^$/s/^apikey = .*$/apikey = $apikey/" /mnt/dietpi_userdata/bazarr/config/config.ini
G_CONFIG_INJECT 'use_radarr[[:blank:]]*=' 'use_radarr = True' /mnt/dietpi_userdata/bazarr/config/config.ini '\[general\]'
fi
fi
@@ -10101,25 +10131,26 @@ _EOF_
then
local reinstall=0
[[ -f '/mnt/dietpi_userdata/nzbget/nzbget.conf' ]] && reinstall=1
- G_EXEC curl -sSfL 'https://nzbget.net/download/nzbget-latest-bin-linux.run' -o package.run
+
+ local fallback_url='https://github.com/nzbgetcom/nzbget/releases/download/v22.0/nzbget-22.0-bin-linux.run'
+ Download_Install "$(curl -sSfL 'https://api.github.com/repos/nzbgetcom/nzbget/releases/latest' | mawk -F\" '/^ *"browser_download_url": ".*\/nzbget-[^"/]*-bin-linux.run"$/{print $4}')" nzbget.run
G_EXEC mkdir -p /mnt/dietpi_userdata/nzbget
- G_EXEC_OUTPUT=1 G_EXEC dash package.run --destdir /mnt/dietpi_userdata/nzbget
- G_EXEC rm package.run
+ G_EXEC_OUTPUT=1 G_EXEC dash nzbget.run --destdir /mnt/dietpi_userdata/nzbget
+ G_EXEC rm nzbget.run
# User
Create_User -g dietpi -d /mnt/dietpi_userdata/nzbget nzbget
# Permissions
- G_EXEC touch /var/log/nzbget.log
- G_EXEC chown -R nzbget:root /mnt/dietpi_userdata/nzbget /var/log/nzbget.log
G_EXEC chmod 0600 /mnt/dietpi_userdata/nzbget/nzbget.conf
+ G_EXEC chown -R nzbget:root /mnt/dietpi_userdata/nzbget
# Config
if (( ! $reinstall ))
then
G_CONFIG_INJECT 'MainDir=' 'MainDir=/mnt/dietpi_userdata/downloads' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'DestDir=' 'DestDir=/mnt/dietpi_userdata/downloads/complete' /mnt/dietpi_userdata/nzbget/nzbget.conf
- G_CONFIG_INJECT 'LogFile=' 'LogFile=/var/log/nzbget.log' /mnt/dietpi_userdata/nzbget/nzbget.conf
+ G_CONFIG_INJECT 'WriteLog=' 'WriteLog=none' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'ControlUsername=' 'ControlUsername=admin' /mnt/dietpi_userdata/nzbget/nzbget.conf
GCI_PASSWORD=1 G_CONFIG_INJECT 'ControlPassword=' "ControlPassword=$GLOBAL_PW" /mnt/dietpi_userdata/nzbget/nzbget.conf
@@ -10127,13 +10158,13 @@ _EOF_
G_CONFIG_INJECT 'UMask=' 'UMask=0002' /mnt/dietpi_userdata/nzbget/nzbget.conf
# Optimisations
- G_CONFIG_INJECT 'Server1.Cipher=' 'Server1.Cipher=RC4-MD5' /mnt/dietpi_userdata/nzbget/nzbget.conf
+ G_CONFIG_INJECT 'Server1.Cipher=' 'Server1.Cipher=RC4-MD5' /mnt/dietpi_userdata/nzbget/nzbget.conf # RC4-MD5 is fastest: https://nzbget.com/documentation/choosing-cipher/
G_CONFIG_INJECT 'CrcCheck=' 'CrcCheck=no' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'ParScan=' 'ParScan=limited' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'ParThreads=' "ParThreads=$G_HW_CPU_CORES" /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'DebugTarget=' 'DebugTarget=none' /mnt/dietpi_userdata/nzbget/nzbget.conf
- G_CONFIG_INJECT 'CrashTrace=' 'CrashTrace=no' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'DetailTarget=' 'DetailTarget=none' /mnt/dietpi_userdata/nzbget/nzbget.conf
+ G_CONFIG_INJECT 'CrashTrace=' 'CrashTrace=no' /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'ParBuffer=' "ParBuffer=$(Optimise_BitTorrent 0)" /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'ArticleCache=' "ArticleCache=$(Optimise_BitTorrent 0)" /mnt/dietpi_userdata/nzbget/nzbget.conf
G_CONFIG_INJECT 'WriteBuffer=' "WriteBuffer=$(Optimise_BitTorrent 0)" /mnt/dietpi_userdata/nzbget/nzbget.conf
@@ -10147,10 +10178,9 @@ Wants=network-online.target
After=network-online.target remote-fs.target
[Service]
-Type=forking
User=nzbget
WorkingDirectory=/mnt/dietpi_userdata/nzbget
-ExecStart=/mnt/dietpi_userdata/nzbget/nzbget -D
+ExecStart=/mnt/dietpi_userdata/nzbget/nzbget -so OutputMode=log
[Install]
WantedBy=multi-user.target
@@ -10182,7 +10212,7 @@ _EOF_
*) local arch='x64';;
esac
- local fallback_url="https://github.com/Prowlarr/Prowlarr/releases/download/v1.9.4.4039/Prowlarr.master.1.9.4.4039.linux-core-$arch.tar.gz"
+ local fallback_url="https://github.com/Prowlarr/Prowlarr/releases/download/v1.10.5.4116/Prowlarr.master.1.10.5.4116.linux-core-$arch.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/Prowlarr/Prowlarr/releases/latest' | mawk -F\" "/^ *\"browser_download_url\": \".*linux-core-$arch\.tar\.gz\"$/{print \$4}")"
G_EXEC mv Prowlarr /opt/prowlarr
fi
@@ -10257,7 +10287,7 @@ _EOF_
*) local arch='x64';;
esac
- local fallback_url="https://github.com/Readarr/Readarr/releases/download/v0.3.10.2287/Readarr.develop.0.3.10.2287.linux-core-$arch.tar.gz"
+ local fallback_url="https://github.com/Readarr/Readarr/releases/download/v0.3.12.2327/Readarr.develop.0.3.12.2327.linux-core-$arch.tar.gz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/Readarr/Readarr/releases' | mawk -F\" "/^ *\"browser_download_url\": \".*linux-core-$arch\.tar\.gz\"$/{print \$4}" | head -1)"
G_EXEC mv Readarr /opt/readarr
fi
@@ -10757,7 +10787,7 @@ _EOF_
*) local arch='arm-6';;
esac
- local fallback_url="https://github.com/go-gitea/gitea/releases/download/v1.21.0/gitea-1.21.0-linux-$arch.xz"
+ local fallback_url="https://github.com/go-gitea/gitea/releases/download/v1.21.2/gitea-1.21.2-linux-$arch.xz"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/go-gitea/gitea/releases/latest' | mawk -F\" "/\"browser_download_url\": \".*\/gitea-[^\"\/]*-linux-$arch\.xz\"/{print \$4}")" /mnt/dietpi_userdata/gitea/gitea
# User
@@ -10836,7 +10866,7 @@ _EOF_
unset -v db_password
# Apply new app key
- GCI_PASSWORD=1 G_CONFIG_INJECT 'APP_KEY=' "APP_KEY=base64:$(base64 < <(tr -dc '[:graph:]' < /dev/urandom | head -c32))" allo/.env
+ GCI_PASSWORD=1 G_CONFIG_INJECT 'APP_KEY=' "APP_KEY=base64:$(base64 < <(tr -dc '[:graph:]' < /dev/random | head -c32))" allo/.env
# Install cleanly
[[ -d '/opt/allo' ]] && G_EXEC rm -R /opt/allo
@@ -10954,7 +10984,7 @@ _EOF_
(( $G_HW_ARCH == 2 )) && G_EXEC_OUTPUT=1 G_EXEC env/bin/pip install 'google-assistant-library~=1.0'
# Services
- G_EXEC sed -i 's|/home/pi|/mnt/dietpi_userdata|g' systemd/voice-recognizer.service
+ G_EXEC sed --follow-symlinks -i 's|/home/pi|/mnt/dietpi_userdata|g' systemd/voice-recognizer.service
G_CONFIG_INJECT 'User=' 'User=dietpi' systemd/voice-recognizer.service '\[Service\]'
G_EXEC cp systemd/{alsa-init,voice-recognizer}.service /etc/systemd/system/
@@ -11014,7 +11044,7 @@ _EOF_
G_EXEC cd /mnt/dietpi_userdata/mycroft-core
# -sm: Skip mimic build which is time intense and can be manually done any time later.
# - Remove PulseAudio from dependencies, we use ALSA
- G_EXEC sed -Ei 's/[^[:blank:]"'\'']*pulseaudio[^[:blank:]"'\'']*//g' ./dev_setup.sh
+ G_EXEC sed --follow-symlinks -Ei 's/[^[:blank:]"'\'']*pulseaudio[^[:blank:]"'\'']*//g' ./dev_setup.sh
G_EXEC_OUTPUT=1 G_EXEC sudo -u mycroft ./dev_setup.sh -sm
G_EXEC cd "$G_WORKING_DIR"
@@ -11140,7 +11170,7 @@ _EOF_
# Download
local version=$(curl -sSfL 'https://api.github.com/repos/ptitSeb/box86/releases/latest' | mawk -F\" '/^ *"tag_name": "[^"]*",$/{print $4}')
- [[ $version ]] || { version='v0.3.2'; G_DIETPI-NOTIFY 1 "Automatic latest ${aSOFTWARE_NAME[$software_id]} version detection failed. Version \"$version\" will be installed as fallback, but a newer version might be available. Please report this at: https://github.com/MichaIng/DietPi/issues"; }
+ [[ $version ]] || { version='v0.3.4'; G_DIETPI-NOTIFY 1 "Automatic latest ${aSOFTWARE_NAME[$software_id]} version detection failed. Version \"$version\" will be installed as fallback, but a newer version might be available. Please report this at: https://github.com/MichaIng/DietPi/issues"; }
Download_Install "https://github.com/ptitSeb/box86/archive/$version.tar.gz"
# Build for targets: https://github.com/ptitSeb/box86/blob/master/CMakeLists.txt
@@ -11185,7 +11215,7 @@ _EOF_
# Download
local version=$(curl -sSfL 'https://api.github.com/repos/ptitSeb/box64/releases/latest' | mawk -F\" '/^ *"tag_name": "[^"]*",$/{print $4}')
- [[ $version ]] || { version='v0.2.4'; G_DIETPI-NOTIFY 1 "Automatic latest ${aSOFTWARE_NAME[$software_id]} version detection failed. Version \"$version\" will be installed as fallback, but a newer version might be available. Please report this at: https://github.com/MichaIng/DietPi/issues"; }
+ [[ $version ]] || { version='v0.2.6'; G_DIETPI-NOTIFY 1 "Automatic latest ${aSOFTWARE_NAME[$software_id]} version detection failed. Version \"$version\" will be installed as fallback, but a newer version might be available. Please report this at: https://github.com/MichaIng/DietPi/issues"; }
Download_Install "https://github.com/ptitSeb/box64/archive/$version.tar.gz"
# Build for targets: https://github.com/ptitSeb/box64/blob/main/CMakeLists.txt
@@ -11203,6 +11233,12 @@ _EOF_
elif (( $G_HW_MODEL == 4 ))
then
G_EXEC cmake .. -DRPI4ARM64=1 -DNOGIT=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
+ # - RPi 5
+ elif (( $G_HW_MODEL == 5 ))
+ then
+ local ps16k=''
+ dpkg-query -s 'linux-image-rpi-2712' &> /dev/null && ps16k='PS16K'
+ G_EXEC cmake .. "-DRPI5ARM64$ps16k=1" -DNOGIT=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo
# - Odroid N2
elif (( $G_HW_MODEL == 15 ))
then
@@ -11292,7 +11328,7 @@ _EOF_
# v3 drops PHP 7.4 support: https://github.com/TasmoAdmin/TasmoAdmin/releases/tag/v3.0.0
if (( $G_DISTRO > 6 ))
then
- local fallback_url='https://github.com/TasmoAdmin/TasmoAdmin/releases/download/v3.2.0/tasmoadmin_v3.2.0.tar.gz'
+ local fallback_url='https://github.com/TasmoAdmin/TasmoAdmin/releases/download/v3.3.0/tasmoadmin_v3.3.0.tar.gz'
Download_Install "$(curl -sSfL 'https://api.github.com/repos/TasmoAdmin/TasmoAdmin/releases/latest' | mawk -F\" '/^ *"browser_download_url": ".*\/tasmoadmin_v[^"\/]*\.tar\.gz"$/{print $4}')"
# v2 drops PHP <7.4 support: https://github.com/TasmoAdmin/TasmoAdmin/releases/tag/v2.0.0
@@ -11379,12 +11415,12 @@ _EOF_
G_CONFIG_INJECT 'OPENHAB_HTTP_PORT=' 'OPENHAB_HTTP_PORT=0' /etc/default/openhab
# Do all logs to STDOUT => journalctl -u openhab
- G_EXEC sed -i 's|||' /var/lib/openhab/etc/log4j2.xml
+ G_EXEC sed --follow-symlinks -i 's|||' /var/lib/openhab/etc/log4j2.xml
local line='' last=''
grep -n '' /var/lib/openhab/etc/log4j2.xml | while read -r line
do
line=${line%%:*}
- (( $line == ${last:-$line} + 1 )) && G_EXEC sed -i "${last}d" /var/lib/openhab/etc/log4j2.xml
+ (( $line == ${last:-$line} + 1 )) && G_EXEC sed --follow-symlinks -i "${last}d" /var/lib/openhab/etc/log4j2.xml
last=$line
done
G_EXEC rm -f /var/log/openhab/*
@@ -11679,7 +11715,7 @@ _EOF_
G_EXEC systemctl stop snapserver
# Disable JSON RPC by default if setting was never touched yet
- [[ -f '/etc/snapserver.conf' ]] && G_EXEC sed -i '/^\[tcp\]/,/^\[/s/^#enabled = true$/enabled = false/' /etc/snapserver.conf
+ [[ -f '/etc/snapserver.conf' ]] && G_EXEC sed --follow-symlinks -i '/^\[tcp\]/,/^\[/s/^#enabled = true$/enabled = false/' /etc/snapserver.conf
fi
if To_Install 192 snapclient # Snapcast Client
@@ -11743,7 +11779,7 @@ _EOF_
*) local arch='amd64';;
esac
- local fallback_url="https://github.com/rclone/rclone/releases/download/v1.64.2/rclone-v1.64.2-linux-$arch.deb"
+ local fallback_url="https://github.com/rclone/rclone/releases/download/v1.65.0/rclone-v1.65.0-linux-$arch.deb"
Download_Install "$(curl -sSfL 'https://api.github.com/repos/rclone/rclone/releases/latest' | mawk -F\" "/^ *\"browser_download_url\": \".*\/rclone-v[^\"\/]*-linux-$arch.deb\"$/{print \$4}")"
fi
fi
@@ -13231,7 +13267,7 @@ If no WireGuard (auto)start is included, but you require it, please do the follo
G_DIETPI-NOTIFY 2 'Reconfiguring Unbound to work on its own'
G_CONFIG_INJECT 'port:[[:blank:]]' ' port: 53' /etc/unbound/unbound.conf.d/dietpi.conf
G_CONFIG_INJECT 'interface:[[:blank:]]' ' interface: 0.0.0.0' /etc/unbound/unbound.conf.d/dietpi.conf
- grep -E '^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$' /etc/resolv.conf && sed -Ei '/^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$/c\nameserver 127.0.0.1' /etc/resolv.conf # Failsafe
+ grep -E '^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$' /etc/resolv.conf && sed --follow-symlinks -Ei '/^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$/c\nameserver 127.0.0.1' /etc/resolv.conf # Failsafe
G_EXEC_NOEXIT=1 G_EXEC systemctl restart unbound
else
grep '^[[:blank:]]*nameserver[[:blank:]]' /etc/resolv.conf | grep -qvE '[[:blank:]]127.0.0.1(:53)?$' || echo 'nameserver 9.9.9.9' >> /etc/resolv.conf # Failsafe
@@ -13251,7 +13287,7 @@ If no WireGuard (auto)start is included, but you require it, please do the follo
G_DIETPI-NOTIFY 2 'Reconfiguring Unbound to work on its own'
G_CONFIG_INJECT 'port:[[:blank:]]' ' port: 53' /etc/unbound/unbound.conf.d/dietpi.conf
G_CONFIG_INJECT 'interface:[[:blank:]]' ' interface: 0.0.0.0' /etc/unbound/unbound.conf.d/dietpi.conf
- grep -E '^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$' /etc/resolv.conf && sed -Ei '/^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$/c\nameserver 127.0.0.1' /etc/resolv.conf # Failsafe
+ grep -E '^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$' /etc/resolv.conf && sed --follow-symlinks -Ei '/^[[:blank:]]*nameserver[[:blank:]]+127.0.0.1:5335$/c\nameserver 127.0.0.1' /etc/resolv.conf # Failsafe
G_EXEC_NOEXIT=1 G_EXEC systemctl restart unbound
else
grep '^[[:blank:]]*nameserver[[:blank:]]' /etc/resolv.conf | grep -qvE '[[:blank:]]127.0.0.1(:53)?$' || echo 'nameserver 9.9.9.9' >> /etc/resolv.conf # Failsafe
@@ -13382,7 +13418,7 @@ If no WireGuard (auto)start is included, but you require it, please do the follo
if To_Uninstall 117 # PiVPN
then
- [[ -f '/opt/pivpn/uninstall.sh' ]] && G_EXEC sed -i 's/ askreboot;//' /opt/pivpn/uninstall.sh
+ [[ -f '/opt/pivpn/uninstall.sh' ]] && G_EXEC sed --follow-symlinks -i 's/ askreboot;//' /opt/pivpn/uninstall.sh
command -v pivpn > /dev/null && G_EXEC_OUTPUT=1 G_EXEC pivpn -u
getent passwd pivpn > /dev/null && G_EXEC userdel pivpn
getent group pivpn > /dev/null && G_EXEC groupdel pivpn
@@ -13504,9 +13540,9 @@ If no WireGuard (auto)start is included, but you require it, please do the follo
# Set WiFi interface back to inactive and ready for use with dietpi-config.
local wifi_iface=$(G_GET_NET -t wlan iface)
# - Remove WLAN block, so we can recreate it
- G_EXEC sed -Ei '/(allow-hotplug|auto)[[:blank:]]+wlan/q0' /etc/network/interfaces
+ G_EXEC sed --follow-symlinks -Ei '/(allow-hotplug|auto)[[:blank:]]+wlan/q0' /etc/network/interfaces
# - Disable
- G_EXEC sed -i "/allow-hotplug wlan/c\#allow-hotplug $wifi_iface" /etc/network/interfaces
+ G_EXEC sed --follow-symlinks -i "/allow-hotplug wlan/c\#allow-hotplug $wifi_iface" /etc/network/interfaces
# - Add default WiFi settings to network interfaces config
cat << _EOF_ >> /etc/network/interfaces
iface $wifi_iface inet dhcp
@@ -13519,7 +13555,7 @@ post-down iw dev $wifi_iface set power_save on
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
_EOF_
# shellcheck disable=SC2015
- iw dev "$wifi_iface" set power_save on 2> /dev/null && iw dev "$wifi_iface" set power_save off 2> /dev/null || G_EXEC sed -i '/ iw dev .* set power_save /d' /etc/network/interfaces
+ iw dev "$wifi_iface" set power_save on 2> /dev/null && iw dev "$wifi_iface" set power_save off 2> /dev/null || G_EXEC sed --follow-symlinks -i '/ iw dev .* set power_save /d' /etc/network/interfaces
# - Flush iptables
iptables -F
iptables -t nat -F
@@ -13673,7 +13709,7 @@ _EOF_
[[ -f '/etc/.rutorrent-htaccess' ]] && G_EXEC rm /etc/.rutorrent-htaccess
# - Lighttpd
# Pre-v7.2: Remove from #RUTORRENT_DIETPI to #RUTORRENT_DIETPI in /etc/lighttpd/lighttpd.conf if exist
- [[ -f '/etc/lighttpd/lighttpd.conf' ]] && grep -q '^#RUTORRENT_DIETPI' /etc/lighttpd/lighttpd.conf && G_EXEC sed -i '/#RUTORRENT_DIETPI/,/#RUTORRENT_DIETPI/d' /etc/lighttpd/lighttpd.conf
+ [[ -f '/etc/lighttpd/lighttpd.conf' ]] && grep -q '^#RUTORRENT_DIETPI' /etc/lighttpd/lighttpd.conf && G_EXEC sed --follow-symlinks -i '/#RUTORRENT_DIETPI/,/#RUTORRENT_DIETPI/d' /etc/lighttpd/lighttpd.conf
# Remove rTorrent config from Lighttpd
[[ -f '/etc/lighttpd/conf-enabled/98-dietpi-rtorrent.conf' ]] && G_EXEC lighty-disable-mod dietpi-rtorrent
@@ -13766,7 +13802,7 @@ _EOF_
Remove_Service pi-spc
[[ -d '/var/lib/dietpi/dietpi-software/installed/pi-spc' ]] && G_EXEC rm -R /var/lib/dietpi/dietpi-software/installed/pi-spc
- G_EXEC sed -Ei '/^[[:blank:]]*dtoverlay=gpio-(shutdown|poweroff)/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*dtoverlay=gpio-(shutdown|poweroff)/d' /boot/config.txt
fi
if To_Uninstall 167 # Raspotify
@@ -14072,7 +14108,7 @@ _EOF_
findmnt /mnt/samba > /dev/null && G_EXEC umount -Rfl /mnt/samba
# Remove from fstab
- G_EXEC sed -i '\|/mnt/samba|d' /etc/fstab
+ G_EXEC sed --follow-symlinks -i '\|/mnt/samba|d' /etc/fstab
G_AGP cifs-utils smbclient
@@ -14085,7 +14121,7 @@ _EOF_
findmnt /mnt/nfs_client > /dev/null && G_EXEC umount -Rfl /mnt/nfs_client
# Remove from fstab
- G_EXEC sed -i '\|/mnt/nfs_client|d' /etc/fstab
+ G_EXEC sed --follow-symlinks -i '\|/mnt/nfs_client|d' /etc/fstab
# nfs-kernel-server depends on nfs-common
dpkg-query -s 'nfs-common' &> /dev/null && G_EXEC apt-mark auto nfs-common
@@ -14205,7 +14241,7 @@ _EOF_
if To_Uninstall 103 # DietPi-RAMlog
then
- G_EXEC sed -i '/[[:blank:]]\/var\/log[[:blank:]]/d' /etc/fstab
+ G_EXEC sed --follow-symlinks -i '/[[:blank:]]\/var\/log[[:blank:]]/d' /etc/fstab
G_EXEC mkdir -p /var/lib/dietpi/dietpi-ramlog
cat << '_EOF_' > /var/lib/dietpi/dietpi-ramlog/disable.sh
@@ -14216,9 +14252,9 @@ _EOF_
rm -R /var/tmp/dietpi/logs/dietpi-ramlog_store
if systemctl -q is-enabled rsyslog 2> /dev/null
then
- sed -i '/^[[:blank:]]*INDEX_LOGGING=/c\INDEX_LOGGING=-3' /boot/dietpi/.installed
+ sed --follow-symlinks -i '/^[[:blank:]]*INDEX_LOGGING=/c\INDEX_LOGGING=-3' /boot/dietpi/.installed
else
- sed -i '/^[[:blank:]]*INDEX_LOGGING=/c\INDEX_LOGGING=0' /boot/dietpi/.installed
+ sed --follow-symlinks -i '/^[[:blank:]]*INDEX_LOGGING=/c\INDEX_LOGGING=0' /boot/dietpi/.installed
fi
systemctl --no-reload disable dietpi-ramlog_disable
rm /etc/systemd/system/dietpi-ramlog_disable.service
@@ -14667,9 +14703,9 @@ _EOF_
then
if [[ $( /dev/null && G_EXEC mount -o remount /var/log
# Set time sync mode if no container system
@@ -14812,9 +14848,9 @@ _EOF_
# Apply current network settings statically
G_CONFIG_INJECT "iface[[:blank:]]+eth$eth_index" "iface eth$eth_index inet static" /etc/network/interfaces
- sed -i "0,\|^.*address[[:blank:]].*\$|s||address $eth_ip|" /etc/network/interfaces
- sed -i "0,\|^.*netmask[[:blank:]].*\$|s||netmask $eth_mask|" /etc/network/interfaces
- sed -i "0,\|^.*gateway[[:blank:]].*\$|s||gateway $eth_gateway|" /etc/network/interfaces
+ sed --follow-symlinks -i "0,\|^.*address[[:blank:]].*\$|s||address $eth_ip|" /etc/network/interfaces
+ sed --follow-symlinks -i "0,\|^.*netmask[[:blank:]].*\$|s||netmask $eth_mask|" /etc/network/interfaces
+ sed --follow-symlinks -i "0,\|^.*gateway[[:blank:]].*\$|s||gateway $eth_gateway|" /etc/network/interfaces
fi
# Get WiFi index
@@ -14832,9 +14868,9 @@ _EOF_
# Apply current network settings statically
G_CONFIG_INJECT "iface[[:blank:]]+wlan$wlan_index" "iface wlan$wlan_index inet static" /etc/network/interfaces
- sed -i "\|^iface wlan|,\$s|^.*address[[:blank:]].*\$|address $wlan_ip|" /etc/network/interfaces
- sed -i "\|^iface wlan|,\$s|^.*netmask[[:blank:]].*\$|netmask $wlan_mask|" /etc/network/interfaces
- sed -i "\|^iface wlan|,\$s|^.*gateway[[:blank:]].*\$|gateway $wlan_gateway|" /etc/network/interfaces
+ sed --follow-symlinks -i "\|^iface wlan|,\$s|^.*address[[:blank:]].*\$|address $wlan_ip|" /etc/network/interfaces
+ sed --follow-symlinks -i "\|^iface wlan|,\$s|^.*netmask[[:blank:]].*\$|netmask $wlan_mask|" /etc/network/interfaces
+ sed --follow-symlinks -i "\|^iface wlan|,\$s|^.*gateway[[:blank:]].*\$|gateway $wlan_gateway|" /etc/network/interfaces
fi
unset -f cidr2mask
@@ -14845,9 +14881,9 @@ _EOF_
if command -v resolvconf > /dev/null
then
- sed -i "/dns-nameservers[[:blank:]]/c\dns-nameservers ${nameservers% }" /etc/network/interfaces
+ sed --follow-symlinks -i "/dns-nameservers[[:blank:]]/c\dns-nameservers ${nameservers% }" /etc/network/interfaces
else
- sed -i "/dns-nameservers[[:blank:]]/c\#dns-nameservers ${nameservers% }" /etc/network/interfaces
+ sed --follow-symlinks -i "/dns-nameservers[[:blank:]]/c\#dns-nameservers ${nameservers% }" /etc/network/interfaces
> /etc/resolv.conf
for i in $nameservers; do echo "nameserver $i" >> /etc/resolv.conf; done
fi
diff --git a/dietpi/dietpi-vpn b/dietpi/dietpi-vpn
index a2a8563dc7..9c052ca47a 100755
--- a/dietpi/dietpi-vpn
+++ b/dietpi/dietpi-vpn
@@ -232,7 +232,7 @@ _EOF_
G_CONFIG_INJECT 'ca[[:blank:]]' "ca $FP_IPVANISH/ca.ipvanish.com.crt" "$FP_CLIENT_OVPN"
# Set protocol and port: UDP port 443 is default, but TCP 1194 and UDP 1194 are supported as well.
G_CONFIG_INJECT 'proto[[:blank:]]' "proto $PROTOCOL" "$FP_CLIENT_OVPN"
- G_EXEC sed -i '/^[[:blank:]]*remote[[:blank:]]/s/[[:blank:]][0-9][0-9]*$/ 1194/' "$FP_CLIENT_OVPN"
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*remote[[:blank:]]/s/[[:blank:]][0-9][0-9]*$/ 1194/' "$FP_CLIENT_OVPN"
elif [[ $VPN_PROVIDER == 'PIA' ]]
then
@@ -240,7 +240,7 @@ _EOF_
# Set protocol and port: UDP on 1197 is default but TCP on 501 is supported as well.
G_CONFIG_INJECT 'proto[[:blank:]]' "proto $PROTOCOL" "$FP_CLIENT_OVPN"
[[ $PROTOCOL == 'udp' ]] && VPN_PORT=1197 || VPN_PORT=501
- G_EXEC sed -i "/^[[:blank:]]*remote[[:blank:]]/s/[[:blank:]][0-9][0-9]*\$/ $VPN_PORT/" "$FP_CLIENT_OVPN"
+ G_EXEC sed --follow-symlinks -i "/^[[:blank:]]*remote[[:blank:]]/s/[[:blank:]][0-9][0-9]*\$/ $VPN_PORT/" "$FP_CLIENT_OVPN"
fi
cat << _EOF_ > "$FP_SETTINGS_OVPN"
@@ -269,9 +269,9 @@ _EOF_
# Apply or remove custom up/down scripts from client config
# shellcheck disable=SC2015
- [[ -f $FP_CUSTOM_UP ]] && G_CONFIG_INJECT 'route-up[[:blank:]]' "route-up $FP_CUSTOM_UP" "$FP_CLIENT_OVPN" 'up[[:blank:]]' || G_EXEC sed -i '/^[[:blank:]]*route-up[[:blank:]]/d' "$FP_CLIENT_OVPN"
+ [[ -f $FP_CUSTOM_UP ]] && G_CONFIG_INJECT 'route-up[[:blank:]]' "route-up $FP_CUSTOM_UP" "$FP_CLIENT_OVPN" 'up[[:blank:]]' || G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*route-up[[:blank:]]/d' "$FP_CLIENT_OVPN"
# shellcheck disable=SC2015
- [[ -f $FP_CUSTOM_DOWN ]] && G_CONFIG_INJECT 'route-pre-down[[:blank:]]' "route-pre-down $FP_CUSTOM_DOWN" "$FP_CLIENT_OVPN" 'down[[:blank:]]' || G_EXEC sed -i '/^[[:blank:]]*route-pre-down[[:blank:]]/d' "$FP_CLIENT_OVPN"
+ [[ -f $FP_CUSTOM_DOWN ]] && G_CONFIG_INJECT 'route-pre-down[[:blank:]]' "route-pre-down $FP_CUSTOM_DOWN" "$FP_CLIENT_OVPN" 'down[[:blank:]]' || G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*route-pre-down[[:blank:]]/d' "$FP_CLIENT_OVPN"
# Establish and test connection
G_AG_CHECK_INSTALL_PREREQ openvpn
diff --git a/dietpi/func/create_mysql_db b/dietpi/func/create_mysql_db
index e395dd1832..21a7ad1ad7 100755
--- a/dietpi/func/create_mysql_db
+++ b/dietpi/func/create_mysql_db
@@ -37,7 +37,7 @@
# Generate DB
# - 'identified by' overwrites unix_socket authentication, thus use this for non-root users only.
- # - Database names can only be quotes via backticks, passwords only via single quotes.
+ # - Database names can only be quoted via backticks, passwords only via single quotes.
grant_privileges="grant all privileges on \`$DATABASE_NAME\`.* to '$DATABASE_USER'@localhost identified by '$DATABASE_PW';flush privileges"
[[ $DATABASE_USER != 'root' ]] || grant_privileges=
mysql -e "create database \`$DATABASE_NAME\`;$grant_privileges"
diff --git a/dietpi/func/dietpi-globals b/dietpi/func/dietpi-globals
index 886f2ca1f3..19803b1d6a 100644
--- a/dietpi/func/dietpi-globals
+++ b/dietpi/func/dietpi-globals
@@ -54,7 +54,7 @@
[[ -f '/boot/dietpi/.version' ]] && . /boot/dietpi/.version
# - Assign defaults/code version as fallback
[[ $G_DIETPI_VERSION_CORE ]] || G_DIETPI_VERSION_CORE=8
- [[ $G_DIETPI_VERSION_SUB ]] || G_DIETPI_VERSION_SUB=24
+ [[ $G_DIETPI_VERSION_SUB ]] || G_DIETPI_VERSION_SUB=25
[[ $G_DIETPI_VERSION_RC ]] || G_DIETPI_VERSION_RC=1
[[ $G_GITBRANCH ]] || G_GITBRANCH='master'
[[ $G_GITOWNER ]] || G_GITOWNER='MichaIng'
@@ -825,7 +825,8 @@ $grey─────────────────────────
# - $G_EXEC_ARRAY_ACTION[] | Associative array, containing uneven $G_EXEC_ARRAY_TEXT[] values as keys and related commands as values
G_EXEC(){
- local exit_code fp_log='/tmp/G_EXEC_LOG' attempt=1 acommand=("$@") ecommand
+ local exit_code fp_log='/tmp/G_EXEC_LOG' attempt=1 acommand=("$@")
+ local ecommand=${acommand[*]//\\/\\\\}
# Enter retry loop
while :
@@ -835,7 +836,6 @@ $grey─────────────────────────
[[ $exit_code == 0 ]] && break
# Execute command, store output to $fp_log file and store exit code to $exit_code variable
- ecommand=${acommand[*]//\\/\\\\}
# - Print full command output if $G_EXEC_OUTPUT=1 is given
if [[ $G_EXEC_OUTPUT == 1 ]]; then
@@ -899,7 +899,7 @@ $grey─────────────────────────
- Hardware | $G_HW_MODEL_NAME (ID=$G_HW_MODEL)
- Kernel version | \`$(uname -a)\`
- Distro | $G_DISTRO_NAME (ID=$G_DISTRO${G_RASPBIAN:+,RASPBIAN=$G_RASPBIAN})
-- Command | \`${acommand[*]}\`
+- Command | \`$ecommand\`
- Exit code | $exit_code
- Software title | $G_PROGRAM_NAME
#### Steps to reproduce:
@@ -1002,7 +1002,7 @@ Press any key to continue...'
if [[ -f $fp_error_report ]]; then
# Add bug report ID if it was sent
- [[ $sent_bug_report == 1 ]] && sed -i "/^- Date | /a\- Bug report | $G_HW_UUID" "$fp_error_report"
+ [[ $sent_bug_report == 1 ]] && sed --follow-symlinks -i "/^- Date | /a\- Bug report | $G_HW_UUID" "$fp_error_report"
cat "$fp_error_report"
fi
@@ -2089,7 +2089,7 @@ Please retry with more specific parameter \$1 or apply the setting manually:
[[ $error ]] && { syntax_error; return 1; }
[[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a "$file" "$file.bak" && G_DIETPI-NOTIFY 2 "Config file backup created: $yellow$file.bak$reset"
- error=$(sed -Ei "0,/^[[:blank:]]*$pattern.*$/s//$setting/" "$file" 2>&1) || { syntax_error; return 1; }
+ error=$(sed --follow-symlinks -Ei "0,/^[[:blank:]]*$pattern.*$/s//$setting/" "$file" 2>&1) || { syntax_error; return 1; }
G_DIETPI-NOTIFY 0 "Setting in $yellow$file$reset adjusted: $yellow${setting_raw//\\/\\\\}$reset"
fi
@@ -2098,7 +2098,7 @@ Please retry with more specific parameter \$1 or apply the setting manually:
[[ $error ]] && { syntax_error; return 1; }
[[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a "$file" "$file.bak" && G_DIETPI-NOTIFY 2 "Config file backup created: $yellow$file.bak$reset"
- error=$(sed -Ei "0,/^[[:blank:]#;]*$pattern.*$/s//$setting/" "$file" 2>&1) || { syntax_error; return 1; }
+ error=$(sed --follow-symlinks -Ei "0,/^[[:blank:]#;]*$pattern.*$/s//$setting/" "$file" 2>&1) || { syntax_error; return 1; }
G_DIETPI-NOTIFY 0 "Comment in $yellow$file$reset converted to setting: $yellow${setting_raw//\\/\\\\}$reset"
else
@@ -2109,7 +2109,7 @@ Please retry with more specific parameter \$1 or apply the setting manually:
if error=$(grep -Eq "^[[:blank:]]*$after" "$file" 2>&1); then
[[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a "$file" "$file.bak" && G_DIETPI-NOTIFY 2 "Config file backup created: $yellow$file.bak$reset"
- error=$(sed -Ei "0,/^[[:blank:]]*$after.*$/s//&\n$setting/" "$file" 2>&1) || { syntax_error; return 1; }
+ error=$(sed --follow-symlinks -Ei "0,/^[[:blank:]]*$after.*$/s//&\n$setting/" "$file" 2>&1) || { syntax_error; return 1; }
G_DIETPI-NOTIFY 0 "Added setting $yellow${setting_raw//\\/\\\\}$reset to $yellow$file$reset after line $yellow$(grep -Em1 "^[[:blank:]]*$after" "$file" | sed 's|\\|\\\\|g')$reset"
else
@@ -2130,7 +2130,7 @@ could not be found in file \$3
[[ $GCI_BACKUP == 1 && ! -f $file.bak ]] && cp -a "$file" "$file.bak" && G_DIETPI-NOTIFY 2 "Config file backup created: $yellow$file.bak$reset"
# The following sed does not work on empty files:
[[ ! -s $file ]] && echo '# Added by DietPi:' >> "$file"
- error=$(sed -Ei "\$a\\$setting" "$file" 2>&1) || { syntax_error; return 1; }
+ error=$(sed --follow-symlinks -Ei "\$a\\$setting" "$file" 2>&1) || { syntax_error; return 1; }
G_DIETPI-NOTIFY 0 "Added setting $yellow${setting_raw//\\/\\\\}$reset to end of file $yellow$file$reset"
fi
diff --git a/dietpi/func/dietpi-obtain_hw_model b/dietpi/func/dietpi-obtain_hw_model
index c99e6416b5..30e7248fec 100755
--- a/dietpi/func/dietpi-obtain_hw_model
+++ b/dietpi/func/dietpi-obtain_hw_model
@@ -12,6 +12,7 @@
# - Generates /boot/dietpi/.hw_model
# - Called from /boot/dietpi/preboot, called by /etc/systemd/system/dietpi-preboot.service
#
+ # G_HW_MODEL 87 Orange Pi 3B
# G_HW_MODEL 86 ASUS Tinker Board 2
# G_HW_MODEL 85 ROCK 5A
# G_HW_MODEL 84 Star64
@@ -316,7 +317,12 @@
G_HW_MODEL=$(mawk 'NR==1' "$FP_G_HW_MODEL_IDENTIFIER")
- if (( $G_HW_MODEL == 86 )); then
+ if (( $G_HW_MODEL == 87 )); then
+
+ G_HW_MODEL_NAME='Orange Pi 3B'
+ G_HW_CPUID=9
+
+ elif (( $G_HW_MODEL == 86 )); then
G_HW_MODEL_NAME='ASUS Tinker Board 2'
G_HW_CPUID=3
diff --git a/dietpi/func/dietpi-set_hardware b/dietpi/func/dietpi-set_hardware
index b68e6b9343..9fed96642f 100755
--- a/dietpi/func/dietpi-set_hardware
+++ b/dietpi/func/dietpi-set_hardware
@@ -129,7 +129,7 @@ $FP_SCRIPT qemu-guest-agent|qga enable/disable
elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then
# Comment extended start setting
- G_EXEC sed -i '/^[[:blank:]]*start_x=/c\#start_x=1' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*start_x=/c\#start_x=1' /boot/config.txt
# Add modules blacklist, which are otherwise loaded by default since kernel 4.19/5.10
G_EXEC eval "echo -e 'blacklist bcm2835_v4l2\nblacklist bcm2835_isp' > /etc/modprobe.d/dietpi-disable_rpi_camera.conf"
@@ -163,7 +163,7 @@ $FP_SCRIPT qemu-guest-agent|qga enable/disable
G_EXEC eval "echo 'blacklist bcm2835_codec' > /etc/modprobe.d/dietpi-disable_rpi_codec.conf"
# Disable HEVC decoder
- grep -q '^[[:blank:]]*dtoverlay=rpivid-v4l2$' /boot/config.txt && G_EXEC sed -i '/^[[:blank:]]*dtoverlay=rpivid-v4l2$/d' /boot/config.txt
+ grep -q '^[[:blank:]]*dtoverlay=rpivid-v4l2$' /boot/config.txt && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=rpivid-v4l2$/d' /boot/config.txt
else
Unknown_Input_Mode
fi
@@ -187,7 +187,7 @@ Description=DietPi-rm_program_usb_boot_mode.service
[Service]
Type=oneshot
RemainAfterExit=yes
-ExecStartPre=/bin/sed -i '/^[[:blank:]]*program_usb_boot_mode=/d' /boot/config.txt
+ExecStartPre=/bin/sed --follow-symlinks -i '/^[[:blank:]]*program_usb_boot_mode=/d' /boot/config.txt
ExecStartPre=/bin/systemctl disable dietpi-rm_program_usb_boot_mode
ExecStart=/bin/rm /etc/systemd/system/dietpi-rm_program_usb_boot_mode.service
@@ -199,7 +199,7 @@ _EOF_
elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then
- G_EXEC sed -i '/^[[:blank:]]*program_usb_boot_mode=/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*program_usb_boot_mode=/d' /boot/config.txt
if [[ -f '/etc/systemd/system/dietpi-rm_program_usb_boot_mode.service' ]]; then
@@ -249,7 +249,7 @@ _EOF_
#/////////////////////////////////////////////////////////////////////////////////////
VF2_SPI_Update()
{
- (( $G_HW_MODEL == 81 )) || { Unsupported_Input_Name; return 1; } # Exit path for non-VisionFive 2
+ (( $G_HW_MODEL == 81 || $G_HW_MODEL == 84 )) || { Unsupported_Input_Name; return 1; } # Exit path for non-VisionFive 2
G_AG_CHECK_INSTALL_PREREQ mtd-utils
local version=$(curl -sSf 'https://api.github.com/repos/starfive-tech/VisionFive2/releases/latest' | mawk -F\" '/"tag_name": /{print $4}')
@@ -271,7 +271,7 @@ _EOF_
if disable_error=1 G_CHECK_VALIDINT "$INPUT_DEVICE_VALUE" 16 944
then
# Remove overridden "gpu_mem" setting
- grep -q '^[[:blank:]]*gpu_mem=' /boot/config.txt && G_EXEC sed -i '/^[[:blank:]]*gpu_mem=/d' /boot/config.txt
+ grep -q '^[[:blank:]]*gpu_mem=' /boot/config.txt && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*gpu_mem=/d' /boot/config.txt
local gpu_mem=$INPUT_DEVICE_VALUE
G_CONFIG_INJECT 'gpu_mem_1024=' "gpu_mem_1024=$gpu_mem" /boot/config.txt
@@ -313,7 +313,7 @@ _EOF_
# Disable HDMI hotplug detection, which requires it to be generally responsive/active
G_CONFIG_INJECT 'hdmi_ignore_hotplug=' 'hdmi_ignore_hotplug=1' /boot/config.txt
# Disable SDTV on RPi4 (default)
- G_EXEC sed -i '/^[[:blank:]]*enable_tvout=/c\#enable_tvout=0' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*enable_tvout=/c\#enable_tvout=0' /boot/config.txt
# Odroid C2 legacy image, provided until December 2021
elif [[ $G_HW_MODEL == 12 && -f '/boot/boot.ini' ]]; then
@@ -333,11 +333,11 @@ _EOF_
# RPi
if (( $G_HW_MODEL < 10 )); then
- G_EXEC sed -i '/^[[:blank:]]*max_framebuffers=/c\#max_framebuffers=2' /boot/config.txt
- #G_EXEC sed -i '/^[[:blank:]]*disable_splash=/c\#disable_splash=0' /boot/config.txt
- #G_EXEC sed -i '/^[[:blank:]]*hdmi_blanking=/c\#hdmi_blanking=0' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*hdmi_ignore_hotplug=/c\#hdmi_ignore_hotplug=0' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*enable_tvout=/c\#enable_tvout=0' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*max_framebuffers=/c\#max_framebuffers=2' /boot/config.txt
+ #G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*disable_splash=/c\#disable_splash=0' /boot/config.txt
+ #G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_blanking=/c\#hdmi_blanking=0' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_ignore_hotplug=/c\#hdmi_ignore_hotplug=0' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*enable_tvout=/c\#enable_tvout=0' /boot/config.txt
# Odroid C2 legacy image, provided until December 2021
elif [[ $G_HW_MODEL == 12 && -f '/boot/boot.ini' ]]; then
@@ -378,7 +378,7 @@ _EOF_
fi
[[ -d '/etc/systemd/system/justboom-ir-mpd.service.d' ]] && G_EXEC rm -R /etc/systemd/system/justboom-ir-mpd.service.d
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=gpio-ir/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=gpio-ir/d' /boot/config.txt
# Disable Odroids
elif (( $G_HW_MODEL < 20 )); then
@@ -648,7 +648,7 @@ _EOF_
local params=$(sed -En '/^[[:blank:]]*dtoverlay=vc4-f?kms-v3d(-pi4)?,/{s/^[^,]*//p;q}' /boot/config.txt)
# Always remove previous VC4 overlay entry
- G_EXEC sed -Ei '/^[[:blank:]]*dtoverlay=vc4-f?kms-v3d/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*dtoverlay=vc4-f?kms-v3d/d' /boot/config.txt
if [[ $INPUT_DEVICE_VALUE == 'vc4-kms-v3d' || $INPUT_DEVICE_VALUE == 'vc4-fkms-v3d' ]]; then
@@ -728,11 +728,11 @@ _EOF_
(( $G_HW_MODEL > 9 )) && return 0 # Skip on non-RPi
- G_EXEC sed -i '/^[[:blank:]]*hdmi_force_hotplug=/c\#hdmi_force_hotplug=1' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*hdmi_group=/c\#hdmi_group=2' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*hdmi_mode=/c\#hdmi_mode=87' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*hdmi_cvt=/c\#hdmi_cvt=1024 600 60 6 0 0 0' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*hdmi_drive=/c\#hdmi_drive=1' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_force_hotplug=/c\#hdmi_force_hotplug=1' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_group=/c\#hdmi_group=2' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_mode=/c\#hdmi_mode=87' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_cvt=/c\#hdmi_cvt=1024 600 60 6 0 0 0' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*hdmi_drive=/c\#hdmi_drive=1' /boot/config.txt
}
@@ -776,7 +776,7 @@ _EOF_
G_EXEC curl -sSfL 'https://raw.githubusercontent.com/waveshare/LCD-show/master/waveshare32b-overlay.dtb' -o /boot/overlays/waveshare32b.dtbo
#consoleblank=0 no effect
- G_EXEC sed -i 's/rootwait/rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo/' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i 's/rootwait/rootwait fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo/' /boot/cmdline.txt
G_CONFIG_INJECT 'dtparam=i2c_arm=' 'dtparam=i2c_arm=on' /boot/config.txt
G_CONFIG_INJECT 'dtparam=spi=' 'dtparam=spi=on' /boot/config.txt
@@ -849,16 +849,16 @@ _EOF_
if (( $G_HW_MODEL < 10 )); then
[[ -f '/boot/overlays/waveshare32b.dtbo' ]] && G_EXEC rm /boot/overlays/waveshare32b.dtbo
- G_EXEC sed -i 's/ fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo//' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i 's/ fbcon=map:10 fbcon=font:ProFont6x11 logo.nologo//' /boot/cmdline.txt
- G_EXEC sed -i '/Waveshare 32 LCD/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=waveshare32b/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=ads7846,cs=1,penirq=17/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=w1-gpio-pullup,gpiopin=4,extpullup=1/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/Waveshare 32 LCD/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=waveshare32b/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=ads7846,cs=1,penirq=17/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=w1-gpio-pullup,gpiopin=4,extpullup=1/d' /boot/config.txt
# Leave these enabled, just in case the user has other hardware that may use them.
- #G_EXEC sed -i '/^[[:blank:]]*dtparam=i2c_arm=/c\dtparam=i2c_arm=on' /boot/config.txt
- #G_EXEC sed -i '/^[[:blank:]]*dtparam=spi=/c\dtparam=spi=on' /boot/config.txt
+ #G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtparam=i2c_arm=/c\dtparam=i2c_arm=on' /boot/config.txt
+ #G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtparam=spi=/c\dtparam=spi=on' /boot/config.txt
# Move fb0 xorg.conf back: https://github.com/MichaIng/DietPi/issues/767
[[ -f '/usr/share/X11/99-fbturbo.conf' && ! -f '/usr/share/X11/xorg.conf.d/99-fbturbo.conf' ]] && G_EXEC mv /usr/share/X11/99-fbturbo.conf /usr/share/X11/xorg.conf.d/99-fbturbo.conf
@@ -873,8 +873,8 @@ _EOF_
fi
[[ -d '/etc/systemd/system/con2fbmap.service.d' ]] && G_EXEC rm -R /etc/systemd/system/con2fbmap.service.d
[[ -f '/etc/modprobe.d/waveshare32.conf' ]] && G_EXEC rm /etc/modprobe.d/waveshare32.conf
- G_EXEC sed -i '/^[[:blank:]]*spicc/d' /etc/modules
- G_EXEC sed -i '/^[[:blank:]]*fbtft_device/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*spicc/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*fbtft_device/d' /etc/modules
fi
@@ -894,8 +894,8 @@ _EOF_
Lcd_Panel_Odroidcloudshell_Disable(){
[[ -f '/etc/modprobe.d/odroid-cloudshell.conf' ]] && G_EXEC rm /etc/modprobe.d/odroid-cloudshell.conf
- G_EXEC sed -i '/^[[:blank:]]*spi_s3c64xx/d' /etc/modules
- G_EXEC sed -i '/^[[:blank:]]*fbtft_device/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*spi_s3c64xx/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*fbtft_device/d' /etc/modules
}
@@ -1106,16 +1106,16 @@ _EOF_
G_CONFIG_INJECT 'dtparam=i2c_arm=' 'dtparam=i2c_arm=on' /boot/config.txt
# DietPi-Software, set installed
- [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed -i '/^aSOFTWARE_INSTALL_STATE\[72\]=/c\aSOFTWARE_INSTALL_STATE\[72\]=2' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && G_EXEC sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[72\]=/c\aSOFTWARE_INSTALL_STATE\[72\]=2' /boot/dietpi/.installed
elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]; then
# Kernel modules
- G_EXEC sed -i '/^[[:blank:]]*i2c-bcm2708/d' /etc/modules
- G_EXEC sed -i '/^[[:blank:]]*i2c-dev/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*i2c-bcm2708/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*i2c-dev/d' /etc/modules
# config.txt
- G_EXEC sed -Ei 's/^[[:blank:]]*(dtparam=i2c.*)$/#\1/' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei 's/^[[:blank:]]*(dtparam=i2c.*)$/#\1/' /boot/config.txt
# Set baudrate (kHz) | valid int
elif disable_error=1 G_CHECK_VALIDINT "$INPUT_DEVICE_VALUE" 2 10000000; then
@@ -1153,7 +1153,7 @@ _EOF_
then
# config.txt
G_CONFIG_INJECT 'dtparam=spi=' 'dtparam=spi=off' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=spi[0-9]-[0-9]cs/d' /boot/config.txt # Alternative SPI interfaces and chip select lines
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=spi[0-9]-[0-9]cs/d' /boot/config.txt # Alternative SPI interfaces and chip select lines
# Disable in runtime seems to be possible?
#dtparam spi=off
@@ -1167,12 +1167,12 @@ _EOF_
if [[ $INPUT_DEVICE_VALUE == 'enable' ]]
then
# Add overlay to dietpiEnv.txt
- grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?spi1-cs1-spidev([[:blank:]]|$)' "$FP_UENV" || G_EXEC sed -i '/^[[:blank:]]*overlays=/s/[[:blank:]]*$/ spi1-cs1-spidev/' "$FP_UENV"
+ grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?spi1-cs1-spidev([[:blank:]]|$)' "$FP_UENV" || G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*overlays=/s/[[:blank:]]*$/ spi1-cs1-spidev/' "$FP_UENV"
elif [[ $INPUT_DEVICE_VALUE == 'disable' ]]
then
# Remove overlay from dietpiEnv.txt
- grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?spi1-cs1-spidev([[:blank:]]|$)' "$FP_UENV" && G_EXEC sed -Ei '/^[[:blank:]]*overlays=/s/[[:blank:]]*spi1-cs1-spidev([[:blank:]]*$)?//g' "$FP_UENV"
+ grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?spi1-cs1-spidev([[:blank:]]|$)' "$FP_UENV" && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*overlays=/s/[[:blank:]]*spi1-cs1-spidev([[:blank:]]*$)?//g' "$FP_UENV"
else
Unknown_Input_Mode
fi
@@ -1258,7 +1258,7 @@ Do you want to continue and disable the serial login console?' || return 1
fi
# Remove dtoverlay
- G_EXEC sed -i '/^[[:blank:]]*dtoverlay=disable-bt/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=disable-bt/d' /boot/config.txt
G_AG_CHECK_INSTALL_PREREQ pi-bluetooth
else
@@ -1337,9 +1337,9 @@ Do you want to continue and disable the serial login console?' || return 1
echo -e 'net.ipv6.conf.all.disable_ipv6=1\nnet.ipv6.conf.default.disable_ipv6=1' > /etc/sysctl.d/dietpi-disable_ipv6.conf
sysctl -qp /etc/sysctl.d/dietpi-disable_ipv6.conf
# - Comment IPv6 specific host entries
- sed -i 's/^::1[[:blank:]]/#::1 /' /etc/hosts
- sed -i 's/^ff02::1[[:blank:]]/#ff02::1 /' /etc/hosts
- sed -i 's/^ff02::2[[:blank:]]/#ff02::2 /' /etc/hosts
+ sed --follow-symlinks -i 's/^::1[[:blank:]]/#::1 /' /etc/hosts
+ sed --follow-symlinks -i 's/^ff02::1[[:blank:]]/#ff02::1 /' /etc/hosts
+ sed --follow-symlinks -i 's/^ff02::2[[:blank:]]/#ff02::2 /' /etc/hosts
# - dietpi.txt entry
G_CONFIG_INJECT 'CONFIG_ENABLE_IPV6=' 'CONFIG_ENABLE_IPV6=0' /boot/dietpi.txt
@@ -1357,7 +1357,7 @@ Do you want to continue and disable the serial login console?' || return 1
[[ $i != '/etc/sysctl.d/dietpi-disable_ipv6.conf' && -f $i ]] || continue
grep -q '^[[:blank:]]*net.ipv6.conf.[^[:blank:]]*.disable_ipv6[[:blank:]]*=' "$i" || continue
i=$(readlink -f "$i") # https://github.com/MichaIng/DietPi/issues/3003#issuecomment-669464255
- sed -i 's/^[[:blank:]]*net.ipv6.conf.[^[:blank:]]*.disable_ipv6[[:blank:]]*=/#&/' "$i"
+ sed --follow-symlinks -i 's/^[[:blank:]]*net.ipv6.conf.[^[:blank:]]*.disable_ipv6[[:blank:]]*=/#&/' "$i"
done
}
@@ -1469,7 +1469,7 @@ Do you want to continue and disable the serial login console?' || return 1
(( $G_HW_ONBOARD_WIFI )) || { Unsupported_Input_Mode; return 1; }
# Remove dtoverlay
- sed -i '/^[[:blank:]]*dtoverlay=disable-wifi/d' /boot/config.txt
+ sed --follow-symlinks -i '/^[[:blank:]]*dtoverlay=disable-wifi/d' /boot/config.txt
elif [[ $INPUT_DEVICE_VALUE == 'onboard_disable' ]]; then
@@ -1542,7 +1542,7 @@ Do you want to continue and disable the serial login console?' || return 1
# - RPi
elif (( $G_HW_MODEL < 10 ))
then
- grep -q "console=$INPUT_ADDITIONAL" /boot/cmdline.txt || sed -i "/root=/s/$/ console=$INPUT_ADDITIONAL,115200/" /boot/cmdline.txt
+ grep -q "console=$INPUT_ADDITIONAL" /boot/cmdline.txt || sed --follow-symlinks -i "/root=/s/$/ console=$INPUT_ADDITIONAL,115200/" /boot/cmdline.txt
# - Odroid C1/C2 legacy
elif [[ $G_HW_MODEL == 1[02] && -f '/boot/boot.ini' ]]
@@ -1567,7 +1567,7 @@ Do you want to continue and disable the serial login console?' || return 1
elif (( $DIETPIENV || $G_HW_MODEL == 49 || $G_HW_MODEL == 76 || $G_HW_MODEL == 79 ))
then
local baudrate='115200'
- if [[ $G_HW_MODEL =~ ^(42|43|46|47|49|55|56|58|68|72|77)$ && $INPUT_ADDITIONAL == 'ttyS2' ]] || [[ $G_HW_MODEL == 73 && $INPUT_ADDITIONAL == 'ttyS'[012] ]] || [[ $G_HW_MODEL =~ ^(76|78|79|80|82|85)$ && $INPUT_ADDITIONAL == 'ttyFIQ0' ]]
+ if [[ $G_HW_MODEL =~ ^(42|43|46|47|49|55|56|58|68|72|77|87)$ && $INPUT_ADDITIONAL == 'ttyS2' ]] || [[ $G_HW_MODEL == 73 && $INPUT_ADDITIONAL == 'ttyS'[012] ]] || [[ $G_HW_MODEL =~ ^(76|78|79|80|82|85)$ && $INPUT_ADDITIONAL == 'ttyFIQ0' ]]
then
baudrate='1500000'
[[ -d /etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d ]] || G_EXEC mkdir "/etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d"
@@ -1578,7 +1578,7 @@ $(sed -n '/^ExecStart=/s/ 115200/ 1500000,115200/p' '/lib/systemd/system/serial-
_EOF_
G_EXEC systemctl daemon-reload
fi
- (( $DIETPIENV )) && ! grep -q "^consoleargs=.*console=$INPUT_ADDITIONAL" "$FP_UENV" && sed -i "/^consoleargs=/s/[[:blank:]]*$/ console=$INPUT_ADDITIONAL,$baudrate/" "$FP_UENV"
+ (( $DIETPIENV )) && ! grep -q "^consoleargs=.*console=$INPUT_ADDITIONAL" "$FP_UENV" && sed --follow-symlinks -i "/^consoleargs=/s/[[:blank:]]*$/ console=$INPUT_ADDITIONAL,$baudrate/" "$FP_UENV"
# - Armbian: armbianEnv.txt only allows to toggle a fixed serial console depending on device
elif (( $ARMBIAN )) && grep -q "console=$INPUT_ADDITIONAL" /boot/boot.*
@@ -1637,17 +1637,17 @@ _EOF_
# - RPi
if (( $G_HW_MODEL < 10 ))
then
- sed -Ei "/root=/s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^[:blank:]]*([[:blank:]]*$)?//g" /boot/cmdline.txt
+ sed --follow-symlinks -Ei "/root=/s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^[:blank:]]*([[:blank:]]*$)?//g" /boot/cmdline.txt
# - Odroid C1/C2/XU4 legacy
elif [[ $G_HW_MODEL -le 12 && -f '/boot/boot.ini' ]]
then
- sed -i "s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^\"[:blank:]]*//g" /boot/boot.ini
+ sed --follow-symlinks -i "s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^\"[:blank:]]*//g" /boot/boot.ini
# - dietpiEnv.txt, Quartz64, NanoPi R5S, NanoPi R6S
elif (( $DIETPIENV || $G_HW_MODEL == 49 || $G_HW_MODEL == 76 || $G_HW_MODEL == 79 ))
then
- (( $DIETPIENV )) && grep -q "^consoleargs=.*console=$INPUT_ADDITIONAL" "$FP_UENV" && sed -Ei -e "/^consoleargs=/s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^[:blank:]]*([[:blank:]]*$)?//g" -e 's/^consoleargs=[[:blank:]]+/consoleargs=/' "$FP_UENV"
+ (( $DIETPIENV )) && grep -q "^consoleargs=.*console=$INPUT_ADDITIONAL" "$FP_UENV" && sed --follow-symlinks -Ei -e "/^consoleargs=/s/[[:blank:]]*console=${INPUT_ADDITIONAL}[^[:blank:]]*([[:blank:]]*$)?//g" -e 's/^consoleargs=[[:blank:]]+/consoleargs=/' "$FP_UENV"
[[ -f /etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d/dietpi-baudrate.conf ]] && G_EXEC rm "/etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d/dietpi-baudrate.conf"
[[ -d /etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d ]] && G_EXEC rmdir --ignore-fail-on-non-empty "/etc/systemd/system/serial-getty@$INPUT_ADDITIONAL.service.d"
@@ -1764,7 +1764,7 @@ _EOF_
Soundcard_Reset_RPi()
{
# Remove device tree overlays which disable HDMI audio and 3.5mm jack and those for known sound card, disable I2S and HDMI drive
- G_EXEC sed -Ei -e '/^[[:blank:]]*(dtoverlay=(allo-|applepi-dac|dionaudio-|googlevoicehat-soundcard|hifiberry-|i-sabre-q2m|iqaudio-|justboom-|rpi-dac)|dtparam=i2s)/d' -e 's/^[[:blank:]]*(hdmi_drive(:[01])?=.*$)/#\1/' /boot/config.txt
+ G_EXEC sed --follow-symlinks -Ei -e '/^[[:blank:]]*(dtoverlay=(allo-|applepi-dac|dionaudio-|googlevoicehat-soundcard|hifiberry-|i-sabre-q2m|iqaudio-|justboom-|rpi-dac)|dtparam=i2s)/d' -e 's/^[[:blank:]]*(hdmi_drive(:[01])?=.*$)/#\1/' /boot/config.txt
# Disable onboard sound
G_CONFIG_INJECT 'dtparam=audio=' 'dtparam=audio=off' /boot/config.txt
@@ -1773,11 +1773,11 @@ _EOF_
G_EXEC eval 'echo '\''blacklist snd_bcm2835'\'' > /etc/modprobe.d/dietpi-disable_rpi_audio.conf'
# Remove kernel module options
- G_EXEC sed -Ei '/root=/s/[[:blank:]]*snd_bcm2835.enable_[^[:blank:]]*([[:blank:]]*$)?//g' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -Ei '/root=/s/[[:blank:]]*snd_bcm2835.enable_[^[:blank:]]*([[:blank:]]*$)?//g' /boot/cmdline.txt
# Disable full KMS HDMI audio
local kms=$(grep -Em1 '^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?(,|$)' /boot/config.txt)
- [[ $kms && ! $kms =~ ',noaudio'(,|$) ]] && G_EXEC sed -Ei '/^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?(,|$)/s/$/,noaudio/' /boot/config.txt
+ [[ $kms && ! $kms =~ ',noaudio'(,|$) ]] && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?(,|$)/s/$/,noaudio/' /boot/config.txt
# Use "auto" as default
[[ $INPUT_DEVICE_VALUE == 'default' ]] && INPUT_DEVICE_VALUE='rpi-bcm2835-auto'
@@ -1797,7 +1797,7 @@ _EOF_
[[ -d '/etc/systemd/system/odroid-hifishield2.service.d' ]] && G_EXEC rm -R /etc/systemd/system/odroid-hifishield2.service.d
# HiFi Shield Plus and 2 kernel modules
- G_EXEC sed -Ei '/^[[:blank:]]*snd-soc-(odroid-dac|pcm51)/d' /etc/modules
+ G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*snd-soc-(odroid-dac|pcm51)/d' /etc/modules
}
Soundcard_Reset_OdroidN2()
@@ -1818,10 +1818,10 @@ _EOF_
Soundcard_Reset_SparkySBC()
{
# Allo Piano DAC
- G_EXEC sed -i '/^[[:blank:]]*snd-soc-allo-piano-dac/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*snd-soc-allo-piano-dac/d' /etc/modules
# Disable USB 1.1 compat
- G_EXEC sed -i 's/aotg.aotg1_speed=1/aotg.aotg1_speed=0/' "$FP_UENV"
+ G_EXEC sed --follow-symlinks -i 's/aotg.aotg1_speed=1/aotg.aotg1_speed=0/' "$FP_UENV"
# Set HDMI
SOUNDCARD_TARGET_DEVICE=1
@@ -1842,7 +1842,7 @@ _EOF_
if (( $ARMBIAN || $DIETPIENV ))
then
# Remove analogue 3.5mm jack device tree overlay
- grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?analog-codec([[:blank:]]|$)' "$FP_UENV" && G_EXEC sed -Ei '/^[[:blank:]]*overlays=/s/[[:blank:]]*analog-codec([[:blank:]]*$)?//g' "$FP_UENV"
+ grep -Eq '^[[:blank:]]*overlays=(.*[[:blank:]])?analog-codec([[:blank:]]|$)' "$FP_UENV" && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*overlays=/s/[[:blank:]]*analog-codec([[:blank:]]*$)?//g' "$FP_UENV"
# Legacy
else
@@ -1914,7 +1914,7 @@ _EOF_
if (( $G_HW_MODEL == 70 )); then
# USB 1.1 compat mode
- [[ $INPUT_DEVICE_VALUE == *'1.1' ]] && G_EXEC sed -i 's/aotg\.aotg1_speed=0/aotg.aotg1_speed=1/' "$FP_UENV"
+ [[ $INPUT_DEVICE_VALUE == *'1.1' ]] && G_EXEC sed --follow-symlinks -i 's/aotg\.aotg1_speed=0/aotg.aotg1_speed=1/' "$FP_UENV"
# Odroid C2: https://github.com/MichaIng/DietPi/issues/2101
elif (( $G_HW_MODEL == 12 )) && grep -q '^[[:blank:]]*63:.*dwc_otg' /proc/interrupts; then
@@ -2009,13 +2009,13 @@ _EOF_
if [[ $INPUT_DEVICE_VALUE == *'3.5mm' ]]
then
# Disable HDMI audio via kernel module option
- G_EXEC sed -i '/root=/s/$/ snd_bcm2835.enable_hdmi=0/' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i '/root=/s/$/ snd_bcm2835.enable_hdmi=0/' /boot/cmdline.txt
# Force HDMI output?
elif [[ $INPUT_DEVICE_VALUE == *'hdmi' ]]
then
# Disable headphones via kernel module option
- G_EXEC sed -i '/root=/s/$/ snd_bcm2835.enable_headphones=0/' /boot/cmdline.txt
+ G_EXEC sed --follow-symlinks -i '/root=/s/$/ snd_bcm2835.enable_headphones=0/' /boot/cmdline.txt
# Force HDMI audio via config.txt option
G_CONFIG_INJECT 'hdmi_drive=' 'hdmi_drive=2' /boot/config.txt
(( $G_HW_MODEL == 4 )) && G_CONFIG_INJECT 'hdmi_drive:1=' 'hdmi_drive:1=2' /boot/config.txt 'hdmi_drive='
@@ -2025,7 +2025,7 @@ _EOF_
if [[ $INPUT_DEVICE_VALUE != *'3.5mm' ]]
then
local kms=$(grep -Em1 '^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?,(noaudio|.+,noaudio)(,|$)' /boot/config.txt)
- [[ $kms ]] && G_EXEC sed -Ei '/^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?,/s/,noaudio(,|$)/\1/' /boot/config.txt
+ [[ $kms ]] && G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*dtoverlay=vc4-kms-v3d(-pi4)?,/s/,noaudio(,|$)/\1/' /boot/config.txt
fi
;;
@@ -2172,7 +2172,7 @@ _EOF_
if (( $ARMBIAN || $DIETPIENV ))
then
# Add analogue 3.5mm jack device tree overlay
- G_EXEC sed -i '/^[[:blank:]]*overlays=/s/[[:blank:]]*$/ analog-codec/' "$FP_UENV"
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*overlays=/s/[[:blank:]]*$/ analog-codec/' "$FP_UENV"
# Legacy
else
@@ -2381,16 +2381,16 @@ _EOF_
[[ $INPUT_DEVICE_VALUE == 'enable' ]] || { Unknown_Input_Mode; return 1; }
- [[ -e '/dev/virtio-ports/org.qemu.guest_agent.0' ]] || { G_DIETPI-NOTIFY 2 'No QEMU Guest Agent node detected, skipping daemon installation ...'; return 1; } # Exit if node is missing
+ # shellcheck disable=SC2015
+ modprobe 'virtio_console' &> /dev/null && [[ -e '/dev/virtio-ports/org.qemu.guest_agent.0' ]] || { G_DIETPI-NOTIFY 2 'No QEMU Guest Agent node detected, skipping daemon installation ...'; return 1; } # Exit if node is missing
+
+ # Enable logind for required ACPI functionality
+ G_AG_CHECK_INSTALL_PREREQ dbus
+ G_EXEC systemctl unmask systemd-logind
+ G_EXEC systemctl start systemd-logind
- # Bullseye: logind and hence dbus required
- if (( $G_DISTRO == 6 ))
- then
- G_AG_CHECK_INSTALL_PREREQ dbus
- G_EXEC systemctl unmask systemd-logind
- G_EXEC systemctl start systemd-logind
- fi
G_AG_CHECK_INSTALL_PREREQ qemu-guest-agent
+ G_EXEC systemctl start qemu-guest-agent
}
#/////////////////////////////////////////////////////////////////////////////////////
diff --git a/dietpi/func/dietpi-set_software b/dietpi/func/dietpi-set_software
index c2c9baa77a..4198589182 100755
--- a/dietpi/func/dietpi-set_software
+++ b/dietpi/func/dietpi-set_software
@@ -129,10 +129,10 @@ deb https://deb.debian.org/debian-security/ $G_DISTRO_NAME/updates main contrib
deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt/sources.list"
# Since Bullseye, dir structure has changed: https://deb.debian.org/debian-security/dists/
- (( $G_DISTRO > 5 )) && G_EXEC sed -i '3s|/updates|-security|' /etc/apt/sources.list
+ (( $G_DISTRO > 5 )) && G_EXEC sed --follow-symlinks -i '3s|/updates|-security|' /etc/apt/sources.list
# Since Bookworm, non-free firmware has been moved to new component: https://deb.debian.org/debian/pool/
- (( $G_DISTRO > 6 )) && G_EXEC sed -i 's/$/ non-free-firmware/' /etc/apt/sources.list
+ (( $G_DISTRO > 6 )) && G_EXEC sed --follow-symlinks -i 's/$/ non-free-firmware/' /etc/apt/sources.list
# Update dietpi.txt entry
G_CONFIG_INJECT 'CONFIG_APT_DEBIAN_MIRROR=' "CONFIG_APT_DEBIAN_MIRROR=$INPUT_MODE_VALUE" /boot/dietpi.txt
@@ -178,12 +178,12 @@ deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt
G_CONFIG_INJECT 'Dir::Cache[[:blank:]]' 'Dir::Cache "/tmp/apt";' "$fp"
GCI_PRESERVE=1 G_CONFIG_INJECT 'Dir::Cache::archives[[:blank:]]' 'Dir::Cache::archives "/var/cache/apt/archives";' "$fp"
- sed -i '/pkgcache[[:blank:]]/d' "$fp"
+ sed --follow-symlinks -i '/pkgcache[[:blank:]]/d' "$fp"
[[ -d '/var/cache/apt' ]] && G_EXEC rm -R /var/cache/apt
elif [[ $INPUT_ADDITIONAL_1 == 'disk' ]]; then
- sed -i '/^Dir::Cache/d' "$fp"
+ sed --follow-symlinks -i '/^Dir::Cache/d' "$fp"
[[ -d '/tmp/apt' ]] && G_EXEC rm -R /tmp/apt
fi
@@ -199,7 +199,7 @@ deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt
elif [[ $INPUT_ADDITIONAL_1 == 'disk' ]]; then
- sed -i '/^Dir::State/d' "$fp"
+ sed --follow-symlinks -i '/^Dir::State/d' "$fp"
[[ -d '/tmp/apt' ]] && G_EXEC rm -R /tmp/apt
fi
@@ -354,20 +354,20 @@ deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt
if [[ $INPUT_MODE_VALUE == 'eth_dhcp' ]]; then
G_CONFIG_INJECT 'iface eth' 'iface eth0 inet dhcp' /etc/network/interfaces
- sed -i '0,/^.*dns-nameservers[[:blank:]].*$/s//#dns-nameservers 9.9.9.9 149.112.112.112/' /etc/network/interfaces
+ sed --follow-symlinks -i '0,/^.*dns-nameservers[[:blank:]].*$/s//#dns-nameservers 9.9.9.9 149.112.112.112/' /etc/network/interfaces
elif [[ $INPUT_MODE_VALUE == 'eth_static' ]]; then
G_CONFIG_INJECT 'iface eth' 'iface eth0 inet static' /etc/network/interfaces
- [[ $INPUT_ADDITIONAL_1 ]] && sed -i "0,\|^.*address[[:blank:]].*\$|s||address $INPUT_ADDITIONAL_1|" /etc/network/interfaces
- [[ $INPUT_ADDITIONAL_2 ]] && sed -i "0,\|^.*gateway[[:blank:]].*\$|s||gateway $INPUT_ADDITIONAL_2|" /etc/network/interfaces
- [[ $INPUT_ADDITIONAL_3 ]] && sed -i "0,\|^.*netmask[[:blank:]].*\$|s||netmask $INPUT_ADDITIONAL_3|" /etc/network/interfaces
+ [[ $INPUT_ADDITIONAL_1 ]] && sed --follow-symlinks -i "0,\|^.*address[[:blank:]].*\$|s||address $INPUT_ADDITIONAL_1|" /etc/network/interfaces
+ [[ $INPUT_ADDITIONAL_2 ]] && sed --follow-symlinks -i "0,\|^.*gateway[[:blank:]].*\$|s||gateway $INPUT_ADDITIONAL_2|" /etc/network/interfaces
+ [[ $INPUT_ADDITIONAL_3 ]] && sed --follow-symlinks -i "0,\|^.*netmask[[:blank:]].*\$|s||netmask $INPUT_ADDITIONAL_3|" /etc/network/interfaces
[[ $INPUT_ADDITIONAL_4 ]] || return 0
if command -v resolvconf > /dev/null
then
- sed -i "0,\|^.*dns-nameservers[[:blank:]].*\$|s||dns-nameservers $INPUT_ADDITIONAL_4|" /etc/network/interfaces
+ sed --follow-symlinks -i "0,\|^.*dns-nameservers[[:blank:]].*\$|s||dns-nameservers $INPUT_ADDITIONAL_4|" /etc/network/interfaces
else
- sed -i "0,\|^.*dns-nameservers[[:blank:]].*\$|s||#dns-nameservers $INPUT_ADDITIONAL_4|" /etc/network/interfaces
+ sed --follow-symlinks -i "0,\|^.*dns-nameservers[[:blank:]].*\$|s||#dns-nameservers $INPUT_ADDITIONAL_4|" /etc/network/interfaces
> /etc/resolv.conf
local i
for i in $INPUT_ADDITIONAL_4; do echo "nameserver $i" >> /etc/resolv.conf; done
@@ -444,7 +444,7 @@ deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt
G_EXEC_DESC='Downloading current dietpi.txt' G_EXEC curl -sSfL "https://raw.githubusercontent.com/$G_GITOWNER/DietPi/$G_GITBRANCH/dietpi.txt" -o dietpi.txt_patch
# Remove empty and commented lines, and do not re-add the password setting, which is intended to stay commented after first boot
- sed -Ei '/^[[:blank:]]*(#|$|AUTO_SETUP_GLOBAL_PASSWORD=)/d' dietpi.txt_patch
+ sed --follow-symlinks -Ei '/^[[:blank:]]*(#|$|AUTO_SETUP_GLOBAL_PASSWORD=)/d' dietpi.txt_patch
local line entry value
while read -r line
@@ -504,7 +504,7 @@ deb $INPUT_MODE_VALUE $G_DISTRO_NAME-backports main contrib non-free' > /etc/apt
if [[ $pw_dietpi_software ]]
then
# Remove plain text password from dietpi.txt
- grep -q '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /boot/dietpi.txt && G_EXEC sed -i '/^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=/c\#AUTO_SETUP_GLOBAL_PASSWORD= # Password has been encrypted and saved to rootfs' /boot/dietpi.txt
+ grep -q '^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=' /boot/dietpi.txt && G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*AUTO_SETUP_GLOBAL_PASSWORD=/c\#AUTO_SETUP_GLOBAL_PASSWORD= # Password has been encrypted and saved to rootfs' /boot/dietpi.txt
[[ -d '/var/lib/dietpi/dietpi-software' ]] || G_EXEC mkdir -p /var/lib/dietpi/dietpi-software # Should already exist, failsafe
diff --git a/dietpi/func/dietpi-set_swapfile b/dietpi/func/dietpi-set_swapfile
index 0709d1b21d..700175d0bc 100755
--- a/dietpi/func/dietpi-set_swapfile
+++ b/dietpi/func/dietpi-set_swapfile
@@ -84,7 +84,7 @@
G_DIETPI-NOTIFY 2 'Disabling and deleting all existing swap files'
(( $G_HW_MODEL == 75 )) || grep -zaq '^container=' /proc/1/environ || G_EXEC swapoff -a
rm -fv "${SWAP_FILES_ACTIVE[@]}"
- sed -i '/[[:blank:]]swap[[:blank:]]/d' /etc/fstab
+ sed --follow-symlinks -i '/[[:blank:]]swap[[:blank:]]/d' /etc/fstab
# zram-swap
[[ -f '/etc/modules-load.d/dietpi-zram-swap.conf' ]] && rm -v /etc/modules-load.d/dietpi-zram-swap.conf
[[ -f '/etc/udev/rules.d/98-dietpi-zram-swap.rules' ]] && rm -v /etc/udev/rules.d/98-dietpi-zram-swap.rules
diff --git a/dietpi/misc/dietpi-justboom b/dietpi/misc/dietpi-justboom
index 36494f79b0..4f3d5d3c3c 100755
--- a/dietpi/misc/dietpi-justboom
+++ b/dietpi/misc/dietpi-justboom
@@ -146,29 +146,29 @@ Please select a sound card via 'dietpi-config' or install ALSA, or ideally an au
if (( $MPD_INSTALLED )); then
# Output format: Apply only if any value is enforced
- G_EXEC sed -Ei '/^[[:blank:]]*type[[:blank:]]+"alsa"/,/^[[:blank:]]*}$/{/^[[:blank:]#]*format[[:blank:]]/d}' "$FP_MPD_CONF"
- [[ $OUTPUT_FREQ$OUTPUT_BITRATE$OUTPUT_CHANNELS == '***' ]] || G_EXEC sed -Ei "/^[[:blank:]]*type[[:blank:]]+\"alsa\"/a\ format \"$OUTPUT_FREQ:$OUTPUT_BITRATE:$OUTPUT_CHANNELS\"" "$FP_MPD_CONF"
+ G_EXEC sed --follow-symlinks -Ei '/^[[:blank:]]*type[[:blank:]]+"alsa"/,/^[[:blank:]]*}$/{/^[[:blank:]#]*format[[:blank:]]/d}' "$FP_MPD_CONF"
+ [[ $OUTPUT_FREQ$OUTPUT_BITRATE$OUTPUT_CHANNELS == '***' ]] || G_EXEC sed --follow-symlinks -Ei "/^[[:blank:]]*type[[:blank:]]+\"alsa\"/a\ format \"$OUTPUT_FREQ:$OUTPUT_BITRATE:$OUTPUT_CHANNELS\"" "$FP_MPD_CONF"
if (( $SOXR_ENABLED )); then
G_CONFIG_INJECT 'samplerate_converter[[:blank:]]' "samplerate_converter \"soxr $SOXR_QUALITY\"" "$FP_MPD_CONF"
if [[ $OUTPUT_FREQ$OUTPUT_BITRATE$OUTPUT_CHANNELS == '***' ]]
then
- G_EXEC sed -i '/audio_output_format[[:blank:]]/d' "$FP_MPD_CONF"
+ G_EXEC sed --follow-symlinks -i '/audio_output_format[[:blank:]]/d' "$FP_MPD_CONF"
else
G_CONFIG_INJECT 'audio_output_format[[:blank:]]' "audio_output_format \"$OUTPUT_FREQ:$OUTPUT_BITRATE:$OUTPUT_CHANNELS\"" "$FP_MPD_CONF"
fi
else
- G_EXEC sed -i '/samplerate_converter[[:blank:]]/d' "$FP_MPD_CONF"
- G_EXEC sed -i '/audio_output_format[[:blank:]]/d' "$FP_MPD_CONF"
+ G_EXEC sed --follow-symlinks -i '/samplerate_converter[[:blank:]]/d' "$FP_MPD_CONF"
+ G_EXEC sed --follow-symlinks -i '/audio_output_format[[:blank:]]/d' "$FP_MPD_CONF"
fi
# Buffer
if [[ $MPD_AUDIO_BUFFER_SIZE == '*' ]]
then
- G_EXEC sed -i '/audio_buffer_size[[:blank:]]/d' "$FP_MPD_CONF"
+ G_EXEC sed --follow-symlinks -i '/audio_buffer_size[[:blank:]]/d' "$FP_MPD_CONF"
else
G_CONFIG_INJECT 'audio_buffer_size[[:blank:]]' "audio_buffer_size \"$MPD_AUDIO_BUFFER_SIZE\"" "$FP_MPD_CONF"
fi
diff --git a/dietpi/patch_file b/dietpi/patch_file
index 3d790605fc..ed32c869e8 100755
--- a/dietpi/patch_file
+++ b/dietpi/patch_file
@@ -28,7 +28,7 @@
# Disable and remove service and mount
systemctl disable dietpi-ramdisk
umount -Rl /DietPi
- sed -i '/[[:blank:]]\/DietPi[[:blank:]]/d' /etc/fstab
+ sed --follow-symlinks -i '/[[:blank:]]\/DietPi[[:blank:]]/d' /etc/fstab
rm -Rf /DietPi /boot/dietpi/{,func/}dietpi-ramdisk /etc/systemd/system/dietpi-ramdisk.service
# Create symlink for backwards compatibility
@@ -42,11 +42,11 @@
[[ -d '/run/dietpi' ]] || { mkdir -p /run/dietpi; chmod 777 /run/dietpi; }
# Pre-v6.22: Update Git owner due to official lead transfer from Fourdee to MichaIng: https://github.com/MichaIng/DietPi/issues/2589
- grep -q '^[[:blank:]]*DEV_GITOWNER=Fourdee' /boot/dietpi.txt && sed -i '/^[[:blank:]]*DEV_GITOWNER=/c\DEV_GITOWNER=MichaIng' /boot/dietpi.txt
+ grep -q '^[[:blank:]]*DEV_GITOWNER=Fourdee' /boot/dietpi.txt && sed --follow-symlinks -i '/^[[:blank:]]*DEV_GITOWNER=/c\DEV_GITOWNER=MichaIng' /boot/dietpi.txt
if [[ -f '/boot/dietpi/.version' ]] && grep -q '^G_GITOWNER=Fourdee' /boot/dietpi/.version; then
- sed -i '/^G_GITOWNER=/c\G_GITOWNER=MichaIng' /boot/dietpi/.version
+ sed --follow-symlinks -i '/^G_GITOWNER=/c\G_GITOWNER=MichaIng' /boot/dietpi/.version
# Pre-v6.17: New ".version" system
# - As loaded pre-v6.17 dietpi-update will overwrite ".version" to previous 2/3 line system, we need to rerun dietpi-update.
@@ -242,7 +242,7 @@ _EOF_
#-------------------------------------------------------------------------------
# Fix rare WiFi interface start issue: https://github.com/MichaIng/DietPi/issues/2074
# shellcheck disable=SC2016
- [[ -f '/etc/network/if-pre-up.d/wireless-tools' ]] && sed -i '\|^[[:blank:]]ifconfig "$IFACE" up$|c\\t/sbin/ip link set dev "$IFACE" up' /etc/network/if-pre-up.d/wireless-tools
+ [[ -f '/etc/network/if-pre-up.d/wireless-tools' ]] && sed --follow-symlinks -i '\|^[[:blank:]]ifconfig "$IFACE" up$|c\\t/sbin/ip link set dev "$IFACE" up' /etc/network/if-pre-up.d/wireless-tools
#-------------------------------------------------------------------------------
elif (( $G_DIETPI_VERSION_SUB == 16 )); then
@@ -253,8 +253,8 @@ _EOF_
# - On v6.15 this was missing in PREP, thus images created meanwhile, so redo with v6.17 patch:
[[ -d '/root/.ssh' ]] || G_EXEC mkdir /root/.ssh
[[ -f '/root/.ssh/known_hosts' ]] || > /root/.ssh/known_hosts
- G_EXEC sed -i '/^dietpi.com/d' /root/.ssh/known_hosts
- G_EXEC sed -i '/^185.101.93.93/d' /root/.ssh/known_hosts
+ G_EXEC sed --follow-symlinks -i '/^dietpi.com/d' /root/.ssh/known_hosts
+ G_EXEC sed --follow-symlinks -i '/^185.101.93.93/d' /root/.ssh/known_hosts
if (( $G_DISTRO < 7 ))
then
G_CONFIG_INJECT '\[?ssh.dietpi.com(]:29248)?[[:blank:]]' '[ssh.dietpi.com]:29248 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE6aw3r6aOEqendNu376iiCHr9tGBIWPgfrLkzjXjEsHGyVSUFNnZt6pftrDeK7UX+qX4FxOwQlugG4fymOHbimRCFiv6cf7VpYg1Ednquq9TLb7/cIIbX8a6AuRmX4fjdGuqwmBq3OG7ZksFcYEFKt5U4mAJIaL8hXiM2iXjgY02LqiQY/QWATsHI4ie9ZOnwrQE+Rr6mASN1BVFuIgyHIbwX54jsFSnZ/7CdBMkuAd9B8JkxppWVYpYIFHE9oWNfjh/epdK8yv9Oo6r0w5Rb+4qaAc5g+RAaknHeV6Gp75d2lxBdCm5XknKKbGma2+/DfoE8WZTSgzXrYcRlStYN' /root/.ssh/known_hosts
@@ -266,7 +266,7 @@ _EOF_
[[ $G_HW_MODEL == 43 && -f '/etc/X11/xorg.conf.d/20-armsoc.conf' ]] && G_EXEC rm /etc/X11/xorg.conf.d/20-armsoc.conf
#-------------------------------------------------------------------------------
# Convert and remove old dietpi.txt entry (this includes the comment)
- grep -q 'CONFIG_PREFER_IPVERSION' /boot/dietpi.txt && G_EXEC sed -i '/CONFIG_PREFER_IPVERSION/d' /boot/dietpi.txt
+ grep -q 'CONFIG_PREFER_IPVERSION' /boot/dietpi.txt && G_EXEC sed --follow-symlinks -i '/CONFIG_PREFER_IPVERSION/d' /boot/dietpi.txt
#-------------------------------------------------------------------------------
# Update IPv6 handling: https://github.com/MichaIng/DietPi/issues/2027
# - Advice user to re-enable IPv6 on kernel level
@@ -290,7 +290,7 @@ We strongly recommend you select "0 : Re-enable IPv6 on kernel level". By doing
local i
for i in /etc/modprobe.d/*
do
- [[ -f $i ]] && sed -i 's/^[[:blank:]]*blacklist[[:blank:]]ipv6/#&/' "$i"
+ [[ -f $i ]] && sed --follow-symlinks -i 's/^[[:blank:]]*blacklist[[:blank:]]ipv6/#&/' "$i"
done
# Remove boot cmd line entry
@@ -298,20 +298,20 @@ We strongly recommend you select "0 : Re-enable IPv6 on kernel level". By doing
if (( $G_HW_MODEL < 10 )); then
# Separately remove with leading and trailing blank, since we don't know, if it's first or last argument and we must not remove both blanks
- sed -i '/^[[:blank:]]*root=/s/[[:blank:]]ipv6.disable=1//' /boot/cmdline.txt
- sed -i '/^[[:blank:]]*root=/s/ipv6.disable=1[[:blank:]]//' /boot/cmdline.txt
+ sed --follow-symlinks -i '/^[[:blank:]]*root=/s/[[:blank:]]ipv6.disable=1//' /boot/cmdline.txt
+ sed --follow-symlinks -i '/^[[:blank:]]*root=/s/ipv6.disable=1[[:blank:]]//' /boot/cmdline.txt
# - Odroid
elif (( $G_HW_MODEL < 20 )); then
- sed -i '/^[[:blank:]]*setenv boot/s/[[:blank:]]ipv6.disable=1//' /boot/boot.ini
- sed -i '/^[[:blank:]]*setenv boot/s/ipv6.disable=1[[:blank:]]//' /boot/boot.ini
+ sed --follow-symlinks -i '/^[[:blank:]]*setenv boot/s/[[:blank:]]ipv6.disable=1//' /boot/boot.ini
+ sed --follow-symlinks -i '/^[[:blank:]]*setenv boot/s/ipv6.disable=1[[:blank:]]//' /boot/boot.ini
# - x86
elif (( $G_HW_ARCH == 10 )); then
- sed -i '/^[[:blank:]]*GRUB_CMDLINE_LINUX_DEFAULT="/s/[[:blank:]]ipv6.disable=1//' /etc/default/grub
- sed -i '/^[[:blank:]]*GRUB_CMDLINE_LINUX_DEFAULT="/s/ipv6.disable=1[[:blank:]]//' /etc/default/grub
+ sed --follow-symlinks -i '/^[[:blank:]]*GRUB_CMDLINE_LINUX_DEFAULT="/s/[[:blank:]]ipv6.disable=1//' /etc/default/grub
+ sed --follow-symlinks -i '/^[[:blank:]]*GRUB_CMDLINE_LINUX_DEFAULT="/s/ipv6.disable=1[[:blank:]]//' /etc/default/grub
update-grub
fi
@@ -353,7 +353,7 @@ We strongly recommend you select "0 : Re-enable IPv6 on kernel level". By doing
G_EXEC rm -Rf /boot/dietpi/{.patch_emr,dietpi-{obtain_hw_model,cpu_set,ramlog,logclear,banner}}
#-------------------------------------------------------------------------------
# Remove www-data under sudo without PW: https://github.com/MichaIng/DietPi/issues/2121
- G_EXEC sed -i '/^www-data ALL=NOPASSWD: ALL/d' /etc/sudoers
+ G_EXEC sed --follow-symlinks -i '/^www-data ALL=NOPASSWD: ALL/d' /etc/sudoers
#-------------------------------------------------------------------------------
elif (( $G_DIETPI_VERSION_SUB == 17 )); then
@@ -550,15 +550,15 @@ We strongly recommend you select "0 : Re-enable IPv6 on kernel level". By doing
(( $G_DIETPI_INSTALL_STAGE == 2 )) && grep -q '^aSOFTWARE_INSTALL_STATE\[168\]=2' /boot/dietpi/.installed && G_CONFIG_INJECT 'DAEMON_ARGS=' "DAEMON_ARGS='-c /etc/turnserver.conf -o -l stdout --no-stdout-log --simple-log'" /etc/default/coturn
#-------------------------------------------------------------------------------
# Remove nofail and x-systemd.automount option from /boot mount: https://github.com/MichaIng/DietPi/pull/2357#issuecomment-449177715
- G_EXEC sed -i '\|[[:blank:]]/boot[[:blank:]]|s|,x-systemd.automount||' /etc/fstab
- G_EXEC sed -i '\|[[:blank:]]/boot[[:blank:]]|s|,nofail||' /etc/fstab
+ G_EXEC sed --follow-symlinks -i '\|[[:blank:]]/boot[[:blank:]]|s|,x-systemd.automount||' /etc/fstab
+ G_EXEC sed --follow-symlinks -i '\|[[:blank:]]/boot[[:blank:]]|s|,nofail||' /etc/fstab
#-------------------------------------------------------------------------------
# Re-enable owncloud/Nextcloud Apache configs, to fix faulty v6.19 installs: https://github.com/MichaIng/DietPi/pull/2361/commits/e33ca150cf29a4f278f5df2defc495053700a91e
[[ -f '/etc/apache2/sites-available/dietpi-owncloud.conf' ]] && G_EXEC a2ensite dietpi-owncloud
[[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] && G_EXEC a2ensite dietpi-nextcloud
#-------------------------------------------------------------------------------
# Clear install state for Medusa
- [[ $G_DIETPI_INSTALL_STAGE == 2 && ! -d '/mnt/dietpi_userdata/medusa' ]] && sed -i '/^aSOFTWARE_INSTALL_STATE\[116\]=/d' /boot/dietpi/.installed
+ [[ $G_DIETPI_INSTALL_STAGE == 2 && ! -d '/mnt/dietpi_userdata/medusa' ]] && sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[116\]=/d' /boot/dietpi/.installed
# - Inform user about SickRage being replaced by Medusa
if [[ -d '/etc/sickrage' || -d '/mnt/dietpi_userdata/sickrage' ]]; then
@@ -579,16 +579,16 @@ Also have a look at "Sonarr", another alternative TV show manager, available for
if (( $G_HW_MODEL < 10 )); then
# Remove/Replace obsolete config.txt settings
- G_EXEC sed -i 's/display_rotate/display_hdmi_rotate/' /boot/config.txt
- G_EXEC sed -i '/disable_pvt/d' /boot/config.txt
- G_EXEC sed -i '/avoid_pwm_pll/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i 's/display_rotate/display_hdmi_rotate/' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/disable_pvt/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/avoid_pwm_pll/d' /boot/config.txt
# Remove doubled AUTO_SETUP_HEADLESS entry, introduced with Beta v6.20.2
if (( $(grep -c '^[[:blank:]]*AUTO_SETUP_HEADLESS=' /boot/dietpi.txt) > 1 )); then
# Last match is the correct one, added by "dietpi-set_hardware headless 1"
local current=$(grep '^[[:blank:]]*AUTO_SETUP_HEADLESS=' /boot/dietpi.txt | tail -1 | sed 's/^[^=]*=//')
- G_EXEC sed -i '/^[[:blank:]]*AUTO_SETUP_HEADLESS=/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*AUTO_SETUP_HEADLESS=/d' /boot/dietpi.txt
G_EXEC eval "echo 'AUTO_SETUP_HEADLESS=$current' >> /boot/dietpi.txt"
fi
@@ -597,7 +597,7 @@ Also have a look at "Sonarr", another alternative TV show manager, available for
grep -q '^[[:blank:]]*CONFIG_HDMI_OUTPUT=0' /boot/dietpi.txt && /boot/dietpi/func/dietpi-set_hardware headless 1
# Renamed to: AUTO_SETUP_HEADLESS (added by verify_dietpi.txt automatically)
- G_EXEC sed -i '/CONFIG_HDMI_OUTPUT/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_HDMI_OUTPUT/d' /boot/config.txt
fi
#-------------------------------------------------------------------------------
@@ -605,7 +605,7 @@ Also have a look at "Sonarr", another alternative TV show manager, available for
G_AGI procps
#-------------------------------------------------------------------------------
# Remove wireless-power setting from /etc/network/interfaces, if not supported by adapter/firmware: https://github.com/MichaIng/DietPi/issues/2198
- iwconfig "$(G_GET_NET -q -t wlan iface)" power off &> /dev/null || sed -i '/^wireless-power/d' /etc/network/interfaces
+ iwconfig "$(G_GET_NET -q -t wlan iface)" power off &> /dev/null || sed --follow-symlinks -i '/^wireless-power/d' /etc/network/interfaces
#-------------------------------------------------------------------------------
# Remove Armbian banner/profiles left on ASUS TB image
G_EXEC rm -f /etc/profile.d/armbian-*
@@ -627,7 +627,7 @@ Also have a look at "Sonarr", another alternative TV show manager, available for
#-------------------------------------------------------------------------------
# Redo our /etc/bash.bashrc entry, user confirmed 4 entries: https://github.com/MichaIng/DietPi/issues/2529
# As well allow ".bash" file ending and remove obsolete dietpi-*.sh scripts: https://github.com/MichaIng/DietPi/pull/2636
- G_EXEC sed -i '\#for i in /etc/bashrc#d' /etc/bash.bashrc
+ G_EXEC sed --follow-symlinks -i '\#for i in /etc/bashrc#d' /etc/bash.bashrc
# shellcheck disable=SC2016
G_CONFIG_INJECT '.*/etc/bashrc\.d/.*' 'for i in /etc/bashrc.d/*.sh /etc/bashrc.d/*.bash; do [ -r "$i" ] && . $i; done' /etc/bash.bashrc
G_EXEC rm -f /etc/bashrc.d/dietpi-*.sh
@@ -662,8 +662,8 @@ Do you still want to keep "p7zip-full"?'; then
# MPD: Fix permissions issue: https://github.com/MichaIng/DietPi/issues/2462
if [[ -f '/etc/mpd.conf' ]]; then
- G_EXEC sed -Ei '/^(user|group)[[:blank:]]/d' /etc/mpd.conf
- G_EXEC sed -i '/^Group=/d' /lib/systemd/system/mpd.service
+ G_EXEC sed --follow-symlinks -Ei '/^(user|group)[[:blank:]]/d' /etc/mpd.conf
+ G_EXEC sed --follow-symlinks -i '/^Group=/d' /lib/systemd/system/mpd.service
G_CONFIG_INJECT 'User=' 'User=mpd' /lib/systemd/system/mpd.service '\[Service\]'
G_CONFIG_INJECT 'PermissionsStartOnly=' 'PermissionsStartOnly=true' /lib/systemd/system/mpd.service '^User=mpd'
getent passwd mpd > /dev/null && G_EXEC usermod -aG audio,dietpi mpd
@@ -707,7 +707,7 @@ _EOF_
fi
#-------------------------------------------------------------------------------
# RPi | Remove "framebuffer_depth" handling: https://github.com/MichaIng/DietPi/pull/2635
- (( $G_HW_MODEL < 10 )) && G_EXEC sed -i '/framebuffer_depth/d' /boot/config.txt
+ (( $G_HW_MODEL < 10 )) && G_EXEC sed --follow-symlinks -i '/framebuffer_depth/d' /boot/config.txt
#-------------------------------------------------------------------------------
# Nextcloud: Add OCM/OCS provider redirects as this is checked and printed as warning on admin panel: https://github.com/MichaIng/DietPi/issues/2638
if [[ -f '/etc/apache2/sites-available/dietpi-nextcloud.conf' ]] &&
@@ -805,12 +805,12 @@ NB: When accessing "deluge-console" you need to do that as user "debian-deluged"
done
#-------------------------------------------------------------------------------
# Patch proxy settings changes: https://github.com/MichaIng/DietPi/pull/2716
- sed -i '/^[[:blank:]]*CONFIG_PROXY_ENABLED=/d' /boot/dietpi.txt
+ sed --follow-symlinks -i '/^[[:blank:]]*CONFIG_PROXY_ENABLED=/d' /boot/dietpi.txt
local proxy=''
if proxy=$(grep '^[[:blank:]]*export {http,https,ftp}_proxy=' /etc/bash.bashrc); then
[[ -f '/etc/bashrc.d/dietpi-proxy.sh' ]] || echo "$proxy" > /etc/bashrc.d/dietpi-proxy.sh
- G_EXEC sed -i '/^[[:blank:]]*export {http,https,ftp}_proxy=/d' /etc/bash.bashrc
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]]*export {http,https,ftp}_proxy=/d' /etc/bash.bashrc
fi
#-------------------------------------------------------------------------------
@@ -832,11 +832,11 @@ Further info and usage: https://dietpi.com/forum/t/dietpi-arr-to-ram-link-sonarr
if [[ -f '/etc/wireguard/wg0.conf' ]] && ! grep -q 'sysctl' /etc/wireguard/wg0.conf; then
[[ -f '/etc/sysctl.d/dietpi-wireguard.conf' ]] && G_EXEC rm /etc/sysctl.d/dietpi-wireguard.conf
- sed -i "/^ListenPort/a\PostUp = sysctl net.ipv4.conf.%i.forwarding=1 net.ipv4.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').forwarding=1" /etc/wireguard/wg0.conf
- sed -i "/^ListenPort/a\PostUp = sysctl net.ipv6.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').accept_ra=2" /etc/wireguard/wg0.conf
- sed -i "/^ListenPort/a\PostUp = sysctl net.ipv6.conf.%i.forwarding=1 net.ipv6.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').forwarding=1" /etc/wireguard/wg0.conf
- sed -i "/^ListenPort/a\PostUp = ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o \$(ip r l 0/0 | mawk '{print \$5;exit}') -j MASQUERADE" /etc/wireguard/wg0.conf
- sed -i "/^ListenPort/a\PostDown = ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o \$(ip r l 0/0 | mawk '{print \$5;exit}') -j MASQUERADE" /etc/wireguard/wg0.conf
+ sed --follow-symlinks -i "/^ListenPort/a\PostUp = sysctl net.ipv4.conf.%i.forwarding=1 net.ipv4.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').forwarding=1" /etc/wireguard/wg0.conf
+ sed --follow-symlinks -i "/^ListenPort/a\PostUp = sysctl net.ipv6.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').accept_ra=2" /etc/wireguard/wg0.conf
+ sed --follow-symlinks -i "/^ListenPort/a\PostUp = sysctl net.ipv6.conf.%i.forwarding=1 net.ipv6.conf.\$(ip r l 0/0 | mawk '{print \$5;exit}').forwarding=1" /etc/wireguard/wg0.conf
+ sed --follow-symlinks -i "/^ListenPort/a\PostUp = ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o \$(ip r l 0/0 | mawk '{print \$5;exit}') -j MASQUERADE" /etc/wireguard/wg0.conf
+ sed --follow-symlinks -i "/^ListenPort/a\PostDown = ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o \$(ip r l 0/0 | mawk '{print \$5;exit}') -j MASQUERADE" /etc/wireguard/wg0.conf
fi
#-----------------------------------------------------------------------
@@ -848,7 +848,7 @@ Further info and usage: https://dietpi.com/forum/t/dietpi-arr-to-ram-link-sonarr
. /var/lib/dietpi/dietpi-software/installed/dietpi-nordvpn/settings_dietpi.conf
if [[ -f /etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER && $(grep -c '^auth-user-pass' "/etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER") == 2 ]]; then
- sed -i '/^auth-user-pass$/d' "/etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER"
+ sed --follow-symlinks -i '/^auth-user-pass$/d' "/etc/openvpn/ovpn_$PROTOCOL/$NORDVPN_SERVER"
fi
unset -v NORDVPN_USERNAME NORDVPN_PASSWORD NORDVPN_SERVER PROTOCOL
@@ -865,7 +865,7 @@ Further info and usage: https://dietpi.com/forum/t/dietpi-arr-to-ram-link-sonarr
fi
#-----------------------------------------------------------------------
# Add /etc/network/interfaces.d/ drop-in config support
- grep -q 'interfaces\.d' /etc/network/interfaces || sed -i '1i\source interfaces.d/*' /etc/network/interfaces
+ grep -q 'interfaces\.d' /etc/network/interfaces || sed --follow-symlinks -i '1i\source interfaces.d/*' /etc/network/interfaces
#-----------------------------------------------------------------------
# Blynk: Fix logging and move to RAMlog: https://github.com/MichaIng/DietPi/pull/2779
if [[ -f '/etc/systemd/system/blynkserver.service' && -f '/mnt/dietpi_userdata/blynk/server.properties' ]]; then
@@ -907,9 +907,9 @@ NBB: Reinstall manually installed PHP modules via: G_AGI $PHP_NAME-"
# Update PHP socket
# - Lighttpd
- [[ -f '/etc/lighttpd/conf-available/15-fastcgi-php.conf' ]] && sed -i "s@\"socket\".*\$@\"socket\" => \"/run/php/$PHP_NAME-fpm.sock\",@" /etc/lighttpd/conf-available/15-fastcgi-php.conf
+ [[ -f '/etc/lighttpd/conf-available/15-fastcgi-php.conf' ]] && sed --follow-symlinks -i "s@\"socket\".*\$@\"socket\" => \"/run/php/$PHP_NAME-fpm.sock\",@" /etc/lighttpd/conf-available/15-fastcgi-php.conf
# - Nginx
- [[ -f '/etc/nginx/nginx.conf' ]] && sed -i "s#/run/php.*-fpm.sock#/run/php/$PHP_NAME-fpm.sock#g" /etc/nginx/nginx.conf
+ [[ -f '/etc/nginx/nginx.conf' ]] && sed --follow-symlinks -i "s#/run/php.*-fpm.sock#/run/php/$PHP_NAME-fpm.sock#g" /etc/nginx/nginx.conf
# Mark old PHP packages for autoremoval
local apackages=()
@@ -958,7 +958,7 @@ NBB: Reinstall manually installed PHP modules via: G_AGI $PHP_NAME-"
# Patch Lighttpd config file on ARMv6 (Buster version installed): https://github.com/MichaIng/DietPi/issues/2808
if [[ -f '/etc/lighttpd/lighttpd.conf' && ! -f '/usr/share/lighttpd/create-mime.assign.pl' && -f '/usr/share/lighttpd/create-mime.conf.pl' ]]; then
- sed -i 's|/usr/share/lighttpd/create-mime\.assign\.pl|/usr/share/lighttpd/create-mime.conf.pl|g' /etc/lighttpd/lighttpd.conf
+ sed --follow-symlinks -i 's|/usr/share/lighttpd/create-mime\.assign\.pl|/usr/share/lighttpd/create-mime.conf.pl|g' /etc/lighttpd/lighttpd.conf
fi
#-------------------------------------------------------------------------------
@@ -1012,17 +1012,17 @@ Use "dietpi-config" to adjust these settings to your needs.'
#-------------------------------------------------------------------------------
# Remove obsolete dietpi.txt entries
# - https://github.com/MichaIng/DietPi/commit/b330594f0e63a40a75484647033c3b393ecd05b3#diff-aca2a37c06074a66f2588f7c9e84d07a
- G_EXEC sed -i '/AUTO_SETUP_NET_WIFI/{/AUTO_SETUP_NET_WIFI_ENABLED/!d}' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/AUTO_SETUP_NET_WIFI/{/AUTO_SETUP_NET_WIFI_ENABLED/!d}' /boot/dietpi.txt
# - https://github.com/MichaIng/DietPi/commit/814823899667e896291ed240281cfd39971463d9#diff-aca2a37c06074a66f2588f7c9e84d07a
- G_EXEC sed -i '/CONFIG_SMBCLIENT/d' /boot/dietpi.txt
- G_EXEC sed -i '/CONFIG_CURLFTPFS/d' /boot/dietpi.txt
- G_EXEC sed -i '/CONFIG_NFSCLIENT/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_SMBCLIENT/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_CURLFTPFS/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_NFSCLIENT/d' /boot/dietpi.txt
#-------------------------------------------------------------------------------
# Transmission: Fix web UI settings not being applied to settings file: https://github.com/MichaIng/DietPi/issues/2793
[[ -f '/etc/systemd/system/transmission-daemon.service.d/dietpi-group.conf' ]] && echo -e '[Service]\nGroup=dietpi\nSupplementaryGroups=debian-transmission' > /etc/systemd/system/transmission-daemon.service.d/dietpi-group.conf
#-------------------------------------------------------------------------------
# RPi I-Sabre-Q2M: Switch systems to use the new integrated "i-sabre-q2m" overlay + remove obsolete "snd-bcm2835" module blacklisting (instead disable dtparam if blacklist found)
- [[ -f '/boot/config.txt' ]] && sed -i 's/i-sabre-k2m/i-sabre-q2m/g' /boot/config.txt
+ [[ -f '/boot/config.txt' ]] && sed --follow-symlinks -i 's/i-sabre-k2m/i-sabre-q2m/g' /boot/config.txt
if [[ -f '/etc/modprobe.d/rpi-bcm2708.conf' ]]; then
G_CONFIG_INJECT 'dtparam=audio=' 'dtparam=audio=off' /boot/config.txt
@@ -1071,7 +1071,7 @@ _EOF_
local current=$(grep '^[[:blank:]]*temp_limit=' /boot/config.txt | sed 's/^[^=]*=//' | tail -1) # Get current effective (last) value
disable_error=1 G_CHECK_VALIDINT "$current" || current=75 # If none, use 75'c as DietPi default on RPi3
- G_EXEC sed -i '/^[[:blank:]#]*temp_limit=/d' /boot/config.txt # Remove all entries, including comments
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]#]*temp_limit=/d' /boot/config.txt # Remove all entries, including comments
G_CONFIG_INJECT 'temp_limit=' "temp_limit=$current" /boot/config.txt # Re-add current effective value or default
fi
@@ -1083,7 +1083,7 @@ _EOF_
# MPD: Remove obsolete and wrong RuntimeDirectory definition: https://github.com/MichaIng/DietPi/commit/882ddfb533fdc1fa597231824810909770a910c9
if (( $G_DIETPI_INSTALL_STAGE == 2 )); then
- [[ -f '/lib/systemd/system/mpd.service' ]] && sed -i '/^[[:blank:]]*RuntimeDirectory=/d' /lib/systemd/system/mpd.service
+ [[ -f '/lib/systemd/system/mpd.service' ]] && sed --follow-symlinks -i '/^[[:blank:]]*RuntimeDirectory=/d' /lib/systemd/system/mpd.service
[[ -f '/var/www/ompd/include/config.inc.php' && ! -f '/var/www/ompd/include/config.local.inc.php' ]] && mv /var/www/ompd/include/config.inc.php /var/www/ompd/include/config.local.inc.php
if grep -q '^aSOFTWARE_INSTALL_STATE\[148\]=2' /boot/dietpi/.installed; then
@@ -1120,19 +1120,19 @@ A backup will be created to "/etc/mympd/mympd.conf.bak_DDMMYYY_N" from where you
[[ -f '/etc/systemd/system/rpi-bcm2835_forced_3.5mm.service' ]] && rm /etc/systemd/system/rpi-bcm2835_forced_3.5mm.service
if (( $G_HW_MODEL < 10 )); then
- G_EXEC sed -i '/dtoverlay=i2s-mmap/d' /boot/config.txt
- G_EXEC sed -i '/dtoverlay=i2s=/d' /boot/config.txt
- G_EXEC sed -i '/dtoverlay=lirc-rpi/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]#]*dtparam=gpio_in_pin=25/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]#]*i2c_arm_baudrate=/d' /boot/config.txt
- G_EXEC sed -i '/^[[:blank:]#]*bcm2835-v4l2/d' /etc/modules
+ G_EXEC sed --follow-symlinks -i '/dtoverlay=i2s-mmap/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/dtoverlay=i2s=/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/dtoverlay=lirc-rpi/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]#]*dtparam=gpio_in_pin=25/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]#]*i2c_arm_baudrate=/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/^[[:blank:]#]*bcm2835-v4l2/d' /etc/modules
grep -q '^[[:blank:]]*start_x=1' /boot/config.txt || /boot/dietpi/func/dietpi-set_hardware rpi-camera disable
[[ -f '/etc/modprobe.d/disable_bt.conf' ]] && G_CONFIG_INJECT 'dtoverlay=disable-bt' 'dtoverlay=disable-bt' /boot/config.txt
[[ -f '/etc/modprobe.d/disable_wifi_rpi3_onboard.conf' ]] && G_CONFIG_INJECT 'dtoverlay=disable-wifi' 'dtoverlay=disable-wifi' /boot/config.txt
# Offer re-adding of "initial_turbo" on RPi: https://github.com/MichaIng/DietPi/issues/3147
if ! grep -q '^[[:blank:]]*initial_turbo' /boot/config.txt; then
- G_EXEC sed -i '\|issues/1836|d' /boot/config.txt # Remove obsolete comment
+ G_EXEC sed --follow-symlinks -i '\|issues/1836|d' /boot/config.txt # Remove obsolete comment
G_WHIP_BUTTON_OKAY_TEXT='Yes' G_WHIP_BUTTON_CANCEL_TEXT='No' G_WHIP_YESNO 'Re-adding "initial_turbo" option\n
The firmware issues with the "initial_turbo" option have been fixed a recent update: https://github.com/raspberrypi/firmware/issues/1005\n
This option allows you to force highest CPU frequency for a set amount of seconds during boot. This significantly reduces boot time on RPi since it by default boots with lowest frequencies, until a systemd unit sets the chosen CPU governor at later boot stage. You can now set this setting again via:
@@ -1183,7 +1183,7 @@ Do you want to have the recommended "initial_turbo=20" re-added to your config.t
tvservice -o
fi
- G_EXEC sed -i '/hdmi_ignore_composite/d' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/hdmi_ignore_composite/d' /boot/config.txt
G_EXEC rm -f /etc/apt/sources.list.d/{dietpi-kodi,pipplware,kodi}.list
if dpkg-query -s kodi-rpi4 &> /dev/null; then
@@ -1207,7 +1207,7 @@ Do you want to have the recommended "initial_turbo=20" re-added to your config.t
if (( $G_DIETPI_INSTALL_STAGE == 2 )); then
# Remove obsolete install states: TightVPN and SDL2
- G_EXEC sed -Ei '/^aSOFTWARE_INSTALL_STATE\[(27|140)\]=/d' /boot/dietpi/.installed
+ G_EXEC sed --follow-symlinks -Ei '/^aSOFTWARE_INSTALL_STATE\[(27|140)\]=/d' /boot/dietpi/.installed
# Gogs: Remove /etc/__MACOSX that comes from our archive on ARMv6
if grep -q '^aSOFTWARE_INSTALL_STATE\[49\]=2' /boot/dietpi/.installed; then
@@ -1318,7 +1318,7 @@ Would you like to switch back to the Nginx authentication method now?' && certbo
fi
# Mono: Use new Buster repo on Buster/Bullseye systems
- (( $G_DISTRO > 4 )) && [[ -f '/etc/apt/sources.list.d/mono-xamarin.list' ]] && sed -i 's/stretch/buster/g' /etc/apt/sources.list.d/mono-xamarin.list
+ (( $G_DISTRO > 4 )) && [[ -f '/etc/apt/sources.list.d/mono-xamarin.list' ]] && sed --follow-symlinks -i 's/stretch/buster/g' /etc/apt/sources.list.d/mono-xamarin.list
# Aria2: https://github.com/MichaIng/DietPi/pull/3139
if [[ -f '/var/lib/dietpi/dietpi-software/installed/aria2.conf' ]]; then
@@ -1507,7 +1507,7 @@ _EOF_
G_DIETPI-NOTIFY 2 'Removing obsolete flag files'
G_EXEC rm -f /boot/dietpi/.{update_available,timesync_exit_status,network} /var/lib/dietpi/.ntpd_override /tmp/.dietpi_motd
#-------------------------------------------------------------------------------
- [[ -f '/boot/dietpi/.dietpi-backup_settings' ]] && l_message='Adjusting changed DietPi-Backup variable name' G_EXEC sed -i 's/^FP_TARGET_BACKUP=/FP_TARGET=/' /boot/dietpi/.dietpi-backup_settings
+ [[ -f '/boot/dietpi/.dietpi-backup_settings' ]] && l_message='Adjusting changed DietPi-Backup variable name' G_EXEC sed --follow-symlinks -i 's/^FP_TARGET_BACKUP=/FP_TARGET=/' /boot/dietpi/.dietpi-backup_settings
#-------------------------------------------------------------------------------
if [[ -f '/etc/default/crda' ]]; then
@@ -1516,21 +1516,21 @@ _EOF_
G_CONFIG_INJECT 'REGDOMAIN=' "REGDOMAIN=$country_code" /etc/default/crda
G_CONFIG_INJECT 'AUTO_SETUP_NET_WIFI_COUNTRY_CODE=' "AUTO_SETUP_NET_WIFI_COUNTRY_CODE=$country_code" /boot/dietpi.txt
# Remove from wpa_supplicant.conf
- [[ -f '/etc/wpa_supplicant/wpa_supplicant.conf' ]] && sed -i '/^[[:blank:]]*country=/d' /etc/wpa_supplicant/wpa_supplicant.conf
+ [[ -f '/etc/wpa_supplicant/wpa_supplicant.conf' ]] && sed --follow-symlinks -i '/^[[:blank:]]*country=/d' /etc/wpa_supplicant/wpa_supplicant.conf
fi
#-------------------------------------------------------------------------------
G_DIETPI-NOTIFY 2 'Removing obsolete dietpi.txt entries'
- G_EXEC sed -i '/CONFIG_AUTO_DIETPI_UPDATES=/d' /boot/dietpi.txt
- G_EXEC sed -i '/CONFIG_WIFI_COUNTRY_CODE=/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_AUTO_DIETPI_UPDATES=/d' /boot/dietpi.txt
+ G_EXEC sed --follow-symlinks -i '/CONFIG_WIFI_COUNTRY_CODE=/d' /boot/dietpi.txt
#-------------------------------------------------------------------------------
G_DIETPI-NOTIFY 2 'Removing obsolete dietpi-software config directory'
[[ -d '/var/lib/dietpi/dietpi-software/conf' ]] && G_EXEC rm -R /var/lib/dietpi/dietpi-software/conf
#-------------------------------------------------------------------------------
G_DIETPI-NOTIFY 2 'Removing obsolete hint about /DietPi RAMdisk from /boot config files'
- [[ -f '/boot/dietpi.txt' ]] && sed -Ei '/^# - (Modifications to \/boot\/dietpi\.txt|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/dietpi.txt
- [[ -f '/boot/config.txt' ]] && sed -Ei '/^# - (Modifications to \/boot\/config\.txt|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/config.txt
- [[ -f '/boot/boot.ini' ]] && sed -Ei '/^# - (Modifications to \/boot\/boot\.ini|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/boot.ini
+ [[ -f '/boot/dietpi.txt' ]] && sed --follow-symlinks -Ei '/^# - (Modifications to \/boot\/dietpi\.txt|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/dietpi.txt
+ [[ -f '/boot/config.txt' ]] && sed --follow-symlinks -Ei '/^# - (Modifications to \/boot\/config\.txt|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/config.txt
+ [[ -f '/boot/boot.ini' ]] && sed --follow-symlinks -Ei '/^# - (Modifications to \/boot\/boot\.ini|Please ensure you edit from the DietPi-RAMdisk)/d' /boot/boot.ini
#-------------------------------------------------------------------------------
# Sparky SBC: Update kernel/drivers
if (( $G_HW_MODEL == 70 )); then
@@ -1697,8 +1697,8 @@ To reinstall now, run: "dietpi-software reinstall 106 144 145"
# Fix default RPi3+ overclocking defaults: https://dietpi.com/phpbb/viewtopic.php?t=7804
if [[ $G_HW_MODEL == 3 && $G_HW_MODEL_NAME == *'+'* ]]; then
- G_EXEC sed -i '/#arm_freq=/c\#arm_freq=1400' /boot/config.txt
- G_EXEC sed -i '/#sdram_freq=/c\#sdram_freq=500' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/#arm_freq=/c\#arm_freq=1400' /boot/config.txt
+ G_EXEC sed --follow-symlinks -i '/#sdram_freq=/c\#sdram_freq=500' /boot/config.txt
fi
#-------------------------------------------------------------------------------
@@ -1708,7 +1708,7 @@ To reinstall now, run: "dietpi-software reinstall 106 144 145"
if (( $G_DIETPI_INSTALL_STAGE == 2 )); then
# Reset QuiteRSS install state if the package has not actually been installed: https://github.com/MichaIng/DietPi/commit/49f960a7953f44e5571ff2dde68a93efca37ec03
- dpkg-query -s quiterss &> /dev/null || sed -i '/^aSOFTWARE_INSTALL_STATE\[22\]=2/d' /boot/dietpi/.installed
+ dpkg-query -s quiterss &> /dev/null || sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[22\]=2/d' /boot/dietpi/.installed
if grep -q '^aSOFTWARE_INSTALL_STATE\[36\]=2' /boot/dietpi/.installed; then
@@ -1738,7 +1738,7 @@ To reinstall now, run: "dietpi-software reinstall 106 144 145"
# APT configs have been merged into a single file, contained in update archive
rm -fv /etc/apt/apt.conf.d/{99-dietpi-norecommends,98-dietpi-no_translations,99-dietpi-forceconf}
#-------------------------------------------------------------------------------
- [[ -f '/boot/config.txt' ]] && G_EXEC_DESC='Removing deprecated "max_usb_current" from config.txt' G_EXEC_NOHALT=1 G_EXEC sed -i '/^[[:blank:]#]*max_usb_current=/d' /boot/config.txt
+ [[ -f '/boot/config.txt' ]] && G_EXEC_DESC='Removing deprecated "max_usb_current" from config.txt' G_EXEC_NOHALT=1 G_EXEC sed --follow-symlinks -i '/^[[:blank:]#]*max_usb_current=/d' /boot/config.txt
#-----------------------------------------------------------------------
# Recreate /etc/sysctl.d/99-sysctl.conf -> ../sysctl.conf symlink if not existent: https://github.com/MichaIng/DietPi/issues/3003#issuecomment-669464255
if [[ ! -L '/etc/sysctl.d/99-sysctl.conf' ]]; then
@@ -1799,8 +1799,8 @@ To reinstall now, run: "dietpi-software reinstall 106 144 145"
G_EXEC mv /opt/{plexpy,tautulli}
[[ -d '/mnt/dietpi_userdata/plexpy' ]] && G_EXEC mv /mnt/dietpi_userdata/{plexpy,tautulli}
[[ -f '/opt/tautulli/config.ini' ]] && G_EXEC mv /{opt,mnt/dietpi_userdata}/tautulli/config.ini
- G_EXEC sed -i 's|/opt/plexpy|/opt/tautulli|' /mnt/dietpi_userdata/tautulli/config.ini
- G_EXEC sed -i 's|/mnt/dietpi_userdata/plexpy|/mnt/dietpi_userdata/tautulli|' /mnt/dietpi_userdata/tautulli/config.ini
+ G_EXEC sed --follow-symlinks -i 's|/opt/plexpy|/opt/tautulli|' /mnt/dietpi_userdata/tautulli/config.ini
+ G_EXEC sed --follow-symlinks -i 's|/mnt/dietpi_userdata/plexpy|/mnt/dietpi_userdata/tautulli|' /mnt/dietpi_userdata/tautulli/config.ini
[[ -f '/etc/systemd/system/plexpy.service' ]] && G_EXEC mv /etc/systemd/system/{plexpy,tautulli}.service
[[ -d '/etc/systemd/system/plexpy.service.d' ]] && G_EXEC mv /etc/systemd/system/{plexpy,tautulli}.service.d
getent passwd plexpy > /dev/null && G_EXEC userdel plexpy
@@ -1814,7 +1814,7 @@ To reinstall now, run: "dietpi-software reinstall 106 144 145"
[[ -f '/etc/lighttpd/conf-available/99-dietpi-nextcloud.conf' ]] && grep -q opcache /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf; then
G_DIETPI-NOTIFY 2 'Removing obsolete directive from Lighttpd Nextcloud config file'
- G_EXEC sed -i '/opcache/d' /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf
+ G_EXEC sed --follow-symlinks -i '/opcache/d' /etc/lighttpd/conf-available/99-dietpi-nextcloud.conf
for i in /etc/php/7.[234]/mods-available
do
@@ -1865,7 +1865,7 @@ opcache.max_accelerated_files=10000\nopcache.memory_consumption=128\nopcache.sav
(( $G_DIETPI_INSTALL_STAGE == 2 )) && grep -q '^aSOFTWARE_INSTALL_STATE\[28\]=2' /boot/dietpi/.installed && grep -q '^aSOFTWARE_INSTALL_STATE\[23\]=2' /boot/dietpi/.installed && G_AGI dbus-user-session
#-------------------------------------------------------------------------------
# Fail2Ban: https://github.com/MichaIng/DietPi/pull/3813
- [[ ! -f '/etc/fail2ban/jail.conf' ]] || sed -n '/^\[DEFAULT\]/,/^\[/p' /etc/fail2ban/jail.conf | grep -q '^[[:blank:]]*mode[[:blank:]]*=' || sed -i '/^\[DEFAULT\]/a\mode = normal' /etc/fail2ban/jail.conf
+ [[ ! -f '/etc/fail2ban/jail.conf' ]] || sed -n '/^\[DEFAULT\]/,/^\[/p' /etc/fail2ban/jail.conf | grep -q '^[[:blank:]]*mode[[:blank:]]*=' || sed --follow-symlinks -i '/^\[DEFAULT\]/a\mode = normal' /etc/fail2ban/jail.conf
#-------------------------------------------------------------------------------
elif (( $G_DIETPI_VERSION_SUB == 33 )); then
@@ -1874,16 +1874,16 @@ opcache.max_accelerated_files=10000\nopcache.memory_consumption=128\nopcache.sav
# Remove Tonido install flag
if [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[134\]=2' /boot/dietpi/.installed
then
- G_EXEC sed -i '/^aSOFTWARE_INSTALL_STATE\[134\]=2/d' /boot/dietpi/.installed
+ G_EXEC sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[134\]=2/d' /boot/dietpi/.installed
# Add service to custom includes if it has not been excluded, since it has been removed from the static DietPi-Services list
grep -q '^- tonido$' /boot/dietpi/.dietpi-services_include_exclude || G_CONFIG_INJECT '+ tonido' '+ tonido' /boot/dietpi/.dietpi-services_include_exclude
fi
#-------------------------------------------------------------------------------
# Remove CloudPrint install flag
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[137\]=2' /boot/dietpi/.installed && sed -i '/^aSOFTWARE_INSTALL_STATE\[137\]=2/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[137\]=2' /boot/dietpi/.installed && sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[137\]=2/d' /boot/dietpi/.installed
#-------------------------------------------------------------------------------
# Remove DietPi-CloudShell install flag
- [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[62\]=2' /boot/dietpi/.installed && sed -i '/^aSOFTWARE_INSTALL_STATE\[62\]=2/d' /boot/dietpi/.installed
+ [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[62\]=2' /boot/dietpi/.installed && sed --follow-symlinks -i '/^aSOFTWARE_INSTALL_STATE\[62\]=2/d' /boot/dietpi/.installed
#-------------------------------------------------------------------------------
if [[ -f '/boot/dietpi/.installed' ]] && grep -q '^aSOFTWARE_INSTALL_STATE\[29\]=2' /boot/dietpi/.installed && ! dpkg-query -s xorgxrdp &> /dev/null
then
@@ -2012,7 +2012,7 @@ _EOF_
# Beta 6.34.0+1
[[ -f '/mnt/dietpi_userdata/octoprint/pip2' ]] && G_EXEC rm /mnt/dietpi_userdata/octoprint/pip2
[[ -f '/mnt/dietpi_userdata/octoprint/pip3' ]] && G_EXEC rm /mnt/dietpi_userdata/octoprint/pip3
- [[ -f '/mnt/dietpi_userdata/octoprint/.octoprint/config.yaml' ]] && G_EXEC sed -i '/localPipCommand/d' /mnt/dietpi_userdata/octoprint/.octoprint/config.yaml
+ [[ -f '/mnt/dietpi_userdata/octoprint/.octoprint/config.yaml' ]] && G_EXEC sed --follow-symlinks -i '/localPipCommand/d' /mnt/dietpi_userdata/octoprint/.octoprint/config.yaml
# shellcheck disable=SC2046
command -v pip2 > /dev/null && pip2 uninstall -y $(pip2 freeze | mawk '/[Oo]cto[Pp]rint/{print $1}') 2> /dev/null
# shellcheck disable=SC2046
@@ -2069,7 +2069,7 @@ _EOF_
fi
#-------------------------------------------------------------------------------
# ReadyMedia: Fix database rebuild on service start
- [[ -f '/etc/systemd/system/minidlna.service' ]] && G_EXEC sed -i '/^ExecStart=/s/ -SR / -S -R /' /etc/systemd/system/minidlna.service
+ [[ -f '/etc/systemd/system/minidlna.service' ]] && G_EXEC sed --follow-symlinks -i '/^ExecStart=/s/ -SR / -S -R /' /etc/systemd/system/minidlna.service
#-------------------------------------------------------------------------------
# Raspberry Pi Microsoft VS Code repo: https://github.com/MichaIng/DietPi/issues/4083
[[ $G_HW_MODEL -le 9 && -f '/etc/apt/sources.list.d/vscode.list' ]] && { G_WHIP_BUTTON_OK_TEXT='Keep it' G_WHIP_BUTTON_CANCEL_TEXT='Remove it' G_WHIP_YESNO 'The Microsoft Visual Studio Code APT repository has been found on your system.
diff --git a/dietpi/pre-patch_file b/dietpi/pre-patch_file
index f5f79078a2..2e826ae479 100755
--- a/dietpi/pre-patch_file
+++ b/dietpi/pre-patch_file
@@ -63,8 +63,8 @@
if (( $G_DIETPI_VERSION_SUB < 21 )) && [[ -f '/etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf' ]] && grep -qi 'buster' /etc/os-release; then
echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 2 | Patching /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf for MariaDB v10.3/Buster support'
- sed -i '/innodb_large_prefix/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || exit 2
- sed -i '/innodb_file_format/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || exit 2
+ sed --follow-symlinks -i '/innodb_large_prefix/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || exit 2
+ sed --follow-symlinks -i '/innodb_file_format/d' /etc/mysql/mariadb.conf.d/99-dietpi-4byte.cnf || exit 2
fi
#-------------------------------------------------------------------------------
@@ -91,7 +91,7 @@
echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 6 | Migrating Jessie systems to "jessie-support" update branch'
if grep -q '^[[:blank:]]*DEV_GITBRANCH=' /DietPi/dietpi.txt; then
- sed -i '/^[[:blank:]]*DEV_GITBRANCH=/c\DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt || exit 6
+ sed --follow-symlinks -i '/^[[:blank:]]*DEV_GITBRANCH=/c\DEV_GITBRANCH=jessie-support' /DietPi/dietpi.txt || exit 6
else
@@ -238,7 +238,7 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=bullseye\nPin-
if (( $G_DIETPI_VERSION_SUB < 33 && $G_HW_MODEL > 10 && $G_HW_MODEL < 20 )); then
echo -e "\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 22 | Switch to our new Meveric's Odroid repo mirror on https://dietpi.com/meveric/"
- sed -Ei 's@(http://fuzon\.co\.uk|https?://oph\.mdrjr\.net)@https://dietpi.com@' /etc/apt/sources.list{,.d/*.list} || exit 22
+ sed --follow-symlinks -Ei 's@(http://fuzon\.co\.uk|https?://oph\.mdrjr\.net)@https://dietpi.com@' /etc/apt/sources.list{,.d/*.list} || exit 22
fi
#-------------------------------------------------------------------------------
@@ -249,13 +249,13 @@ Package: wireguard wireguard-dkms wireguard-tools\nPin: release n=bullseye\nPin-
if grep -q '/dev/disk/by-id/ata-VBOX_HARDDISK_VBeda89797-79ca820f' /var/cache/debconf/config.dat; then
echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 23 | Fixing the grub debconf drive ID'
- sed -i 's|/dev/disk/by-id/ata-VBOX_HARDDISK_VBeda89797-79ca820f|/dev/sda|' /var/cache/debconf/config.dat || exit 23
+ sed --follow-symlinks -i 's|/dev/disk/by-id/ata-VBOX_HARDDISK_VBeda89797-79ca820f|/dev/sda|' /var/cache/debconf/config.dat || exit 23
# Native PC BIOS
elif grep -q '/dev/disk/by-id/ata-M4-CT128M4SSD2_000000001151090024A1' /var/cache/debconf/config.dat; then
echo -e '\e[90m[\e[0m INFO \e[90m]\e[0m Pre-patch 23 | Fixing the grub debconf drive ID'
- sed -i 's|/dev/disk/by-id/ata-M4-CT128M4SSD2_000000001151090024A1|/dev/sda|' /var/cache/debconf/config.dat || exit 23
+ sed --follow-symlinks -i 's|/dev/disk/by-id/ata-M4-CT128M4SSD2_000000001151090024A1|/dev/sda|' /var/cache/debconf/config.dat || exit 23
fi
diff --git a/rootfs/var/lib/dietpi/services/dietpi-firstboot.bash b/rootfs/var/lib/dietpi/services/dietpi-firstboot.bash
index 6f7b29b118..152d127a95 100755
--- a/rootfs/var/lib/dietpi/services/dietpi-firstboot.bash
+++ b/rootfs/var/lib/dietpi/services/dietpi-firstboot.bash
@@ -32,58 +32,58 @@
# RPi Zero/Zero 2 W
if [[ $G_HW_MODEL_NAME == *'Zero'* ]]
then
- sed -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
- sed -i '/^#arm_freq=/c\#arm_freq=1000' /boot/config.txt
- sed -i '/^#core_freq=/c\#core_freq=400' /boot/config.txt
- sed -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
+ sed --follow-symlinks -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=1000' /boot/config.txt
+ sed --follow-symlinks -i '/^#core_freq=/c\#core_freq=400' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
# RPi 1: Apply safe overclock mode
elif (( $G_HW_MODEL < 2 ))
then
GCI_PRESERVE=1 G_CONFIG_INJECT 'arm_freq=' 'arm_freq=900' /boot/config.txt
grep -q '^arm_freq=900$' /boot/config.txt && G_CONFIG_INJECT 'over_voltage=' 'over_voltage=2' /boot/config.txt
- sed -i '/^#core_freq=/c\#core_freq=250' /boot/config.txt
- sed -i '/^#sdram_freq=/c\#sdram_freq=400' /boot/config.txt
+ sed --follow-symlinks -i '/^#core_freq=/c\#core_freq=250' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/c\#sdram_freq=400' /boot/config.txt
# RPi 2
elif (( $G_HW_MODEL == 2 ))
then
- sed -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
- sed -i '/^#arm_freq=/c\#arm_freq=900' /boot/config.txt
- sed -i '/^#core_freq=/c\#core_freq=250' /boot/config.txt
- sed -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
+ sed --follow-symlinks -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=900' /boot/config.txt
+ sed --follow-symlinks -i '/^#core_freq=/c\#core_freq=250' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
# RPi 3
elif (( $G_HW_MODEL == 3 ))
then
- sed -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
- sed -i '/^#core_freq=/c\#core_freq=400' /boot/config.txt
+ sed --follow-symlinks -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
+ sed --follow-symlinks -i '/^#core_freq=/c\#core_freq=400' /boot/config.txt
grep -q '^temp_limit=65$' /boot/config.txt && G_CONFIG_INJECT 'temp_limit=' 'temp_limit=75' /boot/config.txt # https://github.com/MichaIng/DietPi/issues/356
# A+/B+
if [[ $G_HW_MODEL_NAME == *'+'* ]]
then
- sed -i '/^#arm_freq=/c\#arm_freq=1400' /boot/config.txt
- sed -i '/^#sdram_freq=/c\#sdram_freq=500' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=1400' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/c\#sdram_freq=500' /boot/config.txt
else
- sed -i '/^#arm_freq=/c\#arm_freq=1200' /boot/config.txt
- sed -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=1200' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/c\#sdram_freq=450' /boot/config.txt
fi
# RPi 4
elif (( $G_HW_MODEL == 4 ))
then
- sed -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
- sed -i '/^#core_freq=/c\#core_freq=500' /boot/config.txt
- sed -i '/^#sdram_freq=/d' /boot/config.txt # Not supported on RPi4, defaults to 3200 MHz
+ sed --follow-symlinks -i '/^#over_voltage=/c\#over_voltage=0' /boot/config.txt
+ sed --follow-symlinks -i '/^#core_freq=/c\#core_freq=500' /boot/config.txt
+ sed --follow-symlinks -i '/^#sdram_freq=/d' /boot/config.txt # Not supported on RPi4, defaults to 3200 MHz
grep -q '^temp_limit=65$' /boot/config.txt && G_CONFIG_INJECT 'temp_limit=' 'temp_limit=75' /boot/config.txt # https://github.com/MichaIng/DietPi/issues/3019
# 400
if [[ $G_HW_MODEL_NAME == *'400'* ]]
then
- sed -i '/^#arm_freq=/c\#arm_freq=1800' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=1800' /boot/config.txt
else
- sed -i '/^#arm_freq=/c\#arm_freq=1500' /boot/config.txt
+ sed --follow-symlinks -i '/^#arm_freq=/c\#arm_freq=1500' /boot/config.txt
fi
fi
}
@@ -276,8 +276,8 @@ _EOF_
[[ $iface_wlan ]] || iface_wlan='wlan0'
# - Replace interface names with the ones obtained above
- sed -i "s/eth[0-9]/$iface_eth/g" /etc/network/interfaces
- sed -i "s/wlan[0-9]/$iface_wlan/g" /etc/network/interfaces
+ sed --follow-symlinks -i "s/eth[0-9]/$iface_eth/g" /etc/network/interfaces
+ sed --follow-symlinks -i "s/wlan[0-9]/$iface_wlan/g" /etc/network/interfaces
# - Grab user requested settings from dietpi.txt
local ethernet_enabled=$(grep -cm1 '^[[:blank:]]*AUTO_SETUP_NET_ETHERNET_ENABLED=1' /boot/dietpi.txt)
@@ -293,8 +293,8 @@ _EOF_
# Enable WiFi, disable Ethernet
ethernet_enabled=0
- sed -Ei "/(allow-hotplug|auto)[[:blank:]]+wlan/c\allow-hotplug $iface_wlan" /etc/network/interfaces
- sed -Ei "/(allow-hotplug|auto)[[:blank:]]+eth/c\#allow-hotplug $iface_eth" /etc/network/interfaces
+ sed --follow-symlinks -Ei "/(allow-hotplug|auto)[[:blank:]]+wlan/c\allow-hotplug $iface_wlan" /etc/network/interfaces
+ sed --follow-symlinks -Ei "/(allow-hotplug|auto)[[:blank:]]+eth/c\#allow-hotplug $iface_eth" /etc/network/interfaces
# Apply global SSID/keys from dietpi.txt to wpa_supplicant
/boot/dietpi/func/dietpi-wifidb 1
@@ -307,8 +307,8 @@ _EOF_
# Enable Ethernet, disable WiFi
wifi_enabled=0
- sed -Ei "/(allow-hotplug|auto)[[:blank:]]+eth/c\allow-hotplug $iface_eth" /etc/network/interfaces
- sed -Ei "/(allow-hotplug|auto)[[:blank:]]+wlan/c\#allow-hotplug $iface_wlan" /etc/network/interfaces
+ sed --follow-symlinks -Ei "/(allow-hotplug|auto)[[:blank:]]+eth/c\allow-hotplug $iface_eth" /etc/network/interfaces
+ sed --follow-symlinks -Ei "/(allow-hotplug|auto)[[:blank:]]+wlan/c\#allow-hotplug $iface_wlan" /etc/network/interfaces
# Disable WiFi kernel modules
/boot/dietpi/func/dietpi-set_hardware wifimodules disable
@@ -323,25 +323,25 @@ _EOF_
if (( $wifi_enabled )); then
- sed -i "/iface wlan/c\iface $iface_wlan inet static" /etc/network/interfaces
+ sed --follow-symlinks -i "/iface wlan/c\iface $iface_wlan inet static" /etc/network/interfaces
elif (( $ethernet_enabled )); then
- sed -i "/iface eth/c\iface $iface_eth inet static" /etc/network/interfaces
+ sed --follow-symlinks -i "/iface eth/c\iface $iface_eth inet static" /etc/network/interfaces
fi
- sed -i "/address/c\address $static_ip" /etc/network/interfaces
- sed -i "/netmask/c\netmask $static_mask" /etc/network/interfaces
- sed -i "/gateway/c\gateway $static_gateway" /etc/network/interfaces
+ sed --follow-symlinks -i "/address/c\address $static_ip" /etc/network/interfaces
+ sed --follow-symlinks -i "/netmask/c\netmask $static_mask" /etc/network/interfaces
+ sed --follow-symlinks -i "/gateway/c\gateway $static_gateway" /etc/network/interfaces
if command -v resolvconf > /dev/null; then
- sed -i "/dns-nameservers/c\dns-nameservers $static_dns" /etc/network/interfaces
+ sed --follow-symlinks -i "/dns-nameservers/c\dns-nameservers $static_dns" /etc/network/interfaces
else
> /etc/resolv.conf
for i in $static_dns; do echo "nameserver $i" >> /etc/resolv.conf; done
- sed -i "/dns-nameservers/c\#dns-nameservers $static_dns" /etc/network/interfaces
+ sed --follow-symlinks -i "/dns-nameservers/c\#dns-nameservers $static_dns" /etc/network/interfaces
fi