diff --git a/raspi-config b/raspi-config index a640864..b3cb8e7 100755 --- a/raspi-config +++ b/raspi-config @@ -11,8 +11,8 @@ CONFIG=/boot/config.txt USER=${SUDO_USER:-$(who -m | awk '{ print $1 }')} is_pi () { - ARCH=$(dpkg --print-architecture) - if [ "$ARCH" = "armhf" ] || [ "$ARCH" = "arm64" ] ; then + ARCH=$(arch) + if [ "$ARCH" = "aarch64" ]; then return 0 else return 1 @@ -98,7 +98,7 @@ has_analog() { } is_installed() { - if [ "$(dpkg -l "$1" 2> /dev/null | tail -n 1 | cut -d ' ' -f 1)" != "ii" ]; then + if [ "$(rpm -qa "$1" 2> /dev/null | wc -l)" == "0" ]; then return 1 else return 0 @@ -141,7 +141,7 @@ get_can_expand() { PART_NUM="$(echo "$ROOT_PART" | grep -o "[[:digit:]]*$")" - if [ "$PART_NUM" -ne 2 ]; then + if [ "$PART_NUM" -ne 3 ]; then echo 1 exit fi @@ -162,19 +162,30 @@ do_expand_rootfs() { # NOTE: the NOOBS partition layout confuses parted. For now, let's only # agree to work with a sufficiently simple partition layout - if [ "$PART_NUM" -ne 2 ]; then + if [ "$PART_NUM" -ne 3 ]; then whiptail --msgbox "Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway." 20 60 2 - return 0 + return -1 fi - LAST_PART_NUM=$(parted "$ROOT_DEV" -ms unit s p | tail -n 1 | cut -f 1 -d:) + PART_INFO=$(parted "$ROOT_DEV" -ms unit s p) + + LAST_PART_NUM=$(echo "$PART_INFO" | tail -n 1 | cut -f 1 -d:) if [ $LAST_PART_NUM -ne $PART_NUM ]; then whiptail --msgbox "$ROOT_PART is not the last partition. Don't know how to expand" 20 60 2 - return 0 + return -1 + fi + + PART_END=$(echo "$PART_INFO" | grep "^${PART_NUM}" | cut -f 3 -d: | sed 's/[^0-9]//g') + ROOT_END=$(echo "$PART_INFO" | grep "^/dev"| cut -f 2 -d: | sed 's/[^0-9]//g') + ((ROOT_END--)) # 31116287 + + if [ $PART_END -eq $ROOT_END ]; then + whiptail --msgbox "$ROOT_PART has been expanded!" 20 60 2 + return 2 fi # Get the starting offset of the root partition - PART_START=$(parted "$ROOT_DEV" -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g') + PART_START=$(echo "$PART_INFO" | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g') [ "$PART_START" ] || return 1 # Return value will likely be error for fdisk as it fails to reload the # partition table because the root fs is mounted @@ -190,6 +201,15 @@ $PART_START p w EOF + resize2fs $ROOT_PART + if [ $? -eq 0 ]; then + whiptail --msgbox "Root partition has been expanded successfully." 20 60 2 + return 0 + else + whiptail --msgbox "Fail to expand the root partition.\n\nPlease try again or reboot!" 20 60 2 + return -1 + fi + ASK_TO_REBOOT=1 # now set up an init.d script @@ -226,6 +246,7 @@ EOF if [ "$INTERACTIVE" = True ]; then whiptail --msgbox "Root partition has been resized.\nThe filesystem will be enlarged upon the next reboot" 20 60 2 fi + return 0 } set_config_var() { @@ -342,8 +363,9 @@ do_blanking() { CURRENT=1 fi if [ "$INTERACTIVE" = True ]; then - if [ "$(dpkg -l xscreensaver | tail -n 1 | cut -d ' ' -f 1)" = "ii" ]; then - whiptail --msgbox "Warning: xscreensaver is installed may override raspi-config settings" 20 60 2 + screensaver=$(rpm -qa *saver*) + if [ ! -z "$screensaver" ] ; then + whiptail --msgbox "Warning: $screensaver is installed may override raspi-config settings" 20 60 2 fi whiptail --yesno "Would you like to enable screen blanking?" $DEFAULT 20 60 2 RET=$? @@ -765,7 +787,7 @@ clear_overclock () { } get_ssh() { - if service ssh status | grep -q inactive; then + if systemctl status sshd.service | grep -q inactive; then echo 1 else echo 0 @@ -791,12 +813,12 @@ do_ssh() { fi if [ $RET -eq 0 ]; then ssh-keygen -A && - update-rc.d ssh enable && - invoke-rc.d ssh start && + systemctl enable sshd.service && + systemctl start sshd.service && STATUS=enabled elif [ $RET -eq 1 ]; then - update-rc.d ssh disable && - invoke-rc.d ssh stop && + systemctl disable sshd.service && + systemctl stop sshd.service && STATUS=disabled else return $RET @@ -807,7 +829,7 @@ do_ssh() { } get_vnc() { - if systemctl status vncserver-x11-serviced.service | grep -q -w active; then + if systemctl status vncserver@1.service | grep -q -w active; then echo 0 else echo 1 @@ -826,24 +848,54 @@ do_vnc() { RET=$1 fi if [ $RET -eq 0 ]; then - if is_installed realvnc-vnc-server || apt-get install realvnc-vnc-server; then - systemctl enable vncserver-x11-serviced.service && - systemctl start vncserver-x11-serviced.service && + if is_installed tigervnc-server || dnf install -y tigervnc-server; then + if [ ! -f /etc/systemd/system/vncserver@.service ]; then + cat > /etc/systemd/system/vncserver\@.service << EOF +[Unit] +Description=Remote desktop service (VNC) +After=syslog.target network.target + +[Service] +Type=forking +WorkingDirectory=/home/pi +User=pi +Group=pi + +PIDFile=/home/pi/.vnc/%H:%i.pid + +ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :%i > /dev/null 2>&1 || :' +ExecStart=/usr/bin/vncserver :%i +ExecStop=/usr/bin/vncserver -kill :%i + +Restart=on-success +RestartSec=15 + +[Install] +WantedBy=multi-user.target +EOF + fi + systemctl enable vncserver@1 && + systemctl start vncserver@1 && STATUS=enabled else return 1 fi elif [ $RET -eq 1 ]; then - if is_installed realvnc-vnc-server; then - systemctl disable vncserver-x11-serviced.service - systemctl stop vncserver-x11-serviced.service + if is_installed tigervnc-server; then + systemctl disable vncserver@1 + systemctl stop vncserver@1 fi STATUS=disabled else return $RET fi if [ "$INTERACTIVE" = True ]; then - whiptail --msgbox "The VNC Server is $STATUS" 20 60 1 + if [ -z $STATUS ]; then + whiptail --msgbox "Fail to start the VNC Server, please configure it manually!" 20 60 1 + return 1 + else + whiptail --msgbox "The VNC Server is $STATUS" 20 60 1 + fi fi } @@ -1313,6 +1365,9 @@ do_boot_behaviour() { B2*) systemctl set-default multi-user.target ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service + if [ ! -d /etc/systemd/system/getty@tty1.service.d ]; then + mkdir /etc/systemd/system/getty@tty1.service.d + fi cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF [Service] ExecStart= @@ -1320,21 +1375,24 @@ ExecStart=-/sbin/agetty --autologin $USER --noclear %I \$TERM EOF ;; B3*) - if [ -e /etc/init.d/lightdm ]; then + if [ -e /etc/lightdm ]; then systemctl set-default graphical.target ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service rm /etc/systemd/system/getty@tty1.service.d/autologin.conf sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/#autologin-user=/" disable_raspi_config_at_boot else - whiptail --msgbox "Do 'sudo apt-get install lightdm' to allow configuration of boot to desktop" 20 60 2 + whiptail --msgbox "Do 'sudo dnf install lightdm' to allow configuration of boot to desktop" 20 60 2 return 1 fi ;; B4*) - if [ -e /etc/init.d/lightdm ]; then + if [ -e /etc/lightdm ]; then systemctl set-default graphical.target ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service + if [ ! -d /etc/systemd/system/getty@tty1.service.d ]; then + mkdir /etc/systemd/system/getty@tty1.service.d + fi cat > /etc/systemd/system/getty@tty1.service.d/autologin.conf << EOF [Service] ExecStart= @@ -1343,7 +1401,7 @@ EOF sed /etc/lightdm/lightdm.conf -i -e "s/^\(#\|\)autologin-user=.*/autologin-user=$USER/" disable_raspi_config_at_boot else - whiptail --msgbox "Do 'sudo apt-get install lightdm' to allow configuration of boot to desktop" 20 60 2 + whiptail --msgbox "Do 'sudo dnf install lightdm' to allow configuration of boot to desktop" 20 60 2 return 1 fi ;; @@ -1733,19 +1791,19 @@ do_onewire() { } do_gldriver() { - if [ ! -e /boot/overlays/vc4-kms-v3d.dtbo ]; then - whiptail --msgbox "Driver and kernel not present on your system. Please update" 20 60 2 - return 1 - fi - for package in gldriver-test libgl1-mesa-dri; do - if [ "$(dpkg -l "$package" 2> /dev/null | tail -n 1 | cut -d ' ' -f 1)" != "ii" ]; then - missing_packages="$package $missing_packages" - fi - done - if [ -n "$missing_packages" ] && ! apt-get install $missing_packages; then - whiptail --msgbox "Required packages not found, please install: ${missing_packages}" 20 60 2 - return 1 - fi +# if [ ! -e /boot/overlays/vc4-kms-v3d.dtbo ]; then +# whiptail --msgbox "Driver and kernel not present on your system. Please update" 20 60 2 +# return 1 +# fi +# for package in gldriver-test libgl1-mesa-dri; do +# if [ "$(dpkg -l "$package" 2> /dev/null | tail -n 1 | cut -d ' ' -f 1)" != "ii" ]; then +# missing_packages="$package $missing_packages" +# fi +# done +# if [ -n "$missing_packages" ] && ! apt-get install $missing_packages; then +# whiptail --msgbox "Required packages not found, please install: ${missing_packages}" 20 60 2 +# return 1 +# fi if is_pifour ; then GLOPT=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "GL Driver" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT \ "G1 Legacy" "Original non-GL desktop driver" \ @@ -1895,8 +1953,8 @@ do_net_names () { } do_update() { - apt-get update && - apt-get install raspi-config && + dnf update && + dnf install raspi-config -y && printf "Sleeping 5 seconds before reloading raspi-config\n" && sleep 5 && exec raspi-config @@ -2070,6 +2128,63 @@ list_wlan_interfaces() { done } +do_wifi_ssid_passphrase_nmcli() { + IFACE_LIST="$(list_wlan_interfaces)" + IFACE="$(echo "$IFACE_LIST" | head -n 1)" + + if [ -z "$IFACE" ]; then + if [ "$INTERACTIVE" = True ]; then + whiptail --msgbox "No wireless interface found" 20 60 + fi + return 1 + fi + + SSID="$1" + while [ -z "$SSID" ] && [ "$INTERACTIVE" = True ]; do + SSID=$(whiptail --inputbox "Please enter SSID" 20 60 3>&1 1>&2 2>&3) + if [ $? -ne 0 ]; then + return 0 + elif [ -z "$SSID" ]; then + whiptail --msgbox "SSID cannot be empty. Please try again." 20 60 + fi + done + + PASSPHRASE="$2" + while [ "$INTERACTIVE" = True ]; do + PASSPHRASE=$(whiptail --passwordbox "Please enter passphrase. Leave it empty if none." 20 60 3>&1 1>&2 2>&3) + if [ $? -ne 0 ]; then + return 0 + else + break + fi + done + + # Escape special characters for embedding in regex below + local ssid="$(echo "$SSID" \ + | sed 's;\\;\\\\;g' \ + | sed -e 's;\.;\\\.;g' \ + -e 's;\*;\\\*;g' \ + -e 's;\+;\\\+;g' \ + -e 's;\?;\\\?;g' \ + -e 's;\^;\\\^;g' \ + -e 's;\$;\\\$;g' \ + -e 's;\/;\\\/;g' \ + -e 's;\[;\\\[;g' \ + -e 's;\];\\\];g' \ + -e 's;{;\\{;g' \ + -e 's;};\\};g' \ + -e 's;(;\\(;g' \ + -e 's;);\\);g' \ + -e 's;";\\\\\";g')" + + nmcli dev wifi connect "$SSID" password "$PASSPHRASE" + RET=$? + if [ $RET -ne 0 ] ; then + whiptail --msgbox "Connect to $SSID failed, try nmtui." 20 60 + fi + return $RET +} + do_wifi_ssid_passphrase() { RET=0 IFACE_LIST="$(list_wlan_interfaces)" @@ -2542,8 +2657,8 @@ do_proxy() { sed -i "/^export ${SCHEME}_/Id" /etc/profile.d/proxy.sh fi if [ "${SCHEME#*http}" != "$SCHEME" ]; then - if [ -f /etc/apt/apt.conf.d/01proxy ]; then - sed -i "/::${SCHEME}::Proxy/d" /etc/apt/apt.conf.d/01proxy + if [ -f /etc/yum.conf ]; then + sed -i "/^proxy/Id" /etc/yum.conf fi fi if [ -z "$ADDRESS" ]; then @@ -2557,7 +2672,7 @@ do_proxy() { echo "export ${SCHEME}_proxy=\"$ADDRESS\"" >> /etc/profile.d/proxy.sh fi if [ "${SCHEME#*http}" != "$SCHEME" ]; then - echo "Acquire::$SCHEME::Proxy \"$ADDRESS\";" >> /etc/apt/apt.conf.d/01proxy + echo "proxy=\"$ADDRESS\"" >> /etc/yum.conf fi done if [ "$INTERACTIVE" = True ]; then @@ -2588,7 +2703,9 @@ do --expand-rootfs) INTERACTIVE=False do_expand_rootfs - printf "Please reboot\n" + if [ $? -eq 0 ]; then + printf "Please reboot\n" + fi exit 0 ;; --apply-os-config) @@ -2634,8 +2751,8 @@ do_system_menu() { "S3 Password" "Change password for the '$USER' user" \ "S4 Hostname" "Set name for this computer on a network" \ "S5 Boot / Auto Login" "Select boot into desktop or to command line" \ - "S6 Network at Boot" "Select wait for network connection on boot" \ - "S7 Splash Screen" "Choose graphical splash screen or text boot" \ + `# "S6 Network at Boot" "Select wait for network connection on boot"` \ + `# "S7 Splash Screen" "Choose graphical splash screen or text boot"` \ "S8 Power LED" "Set behaviour of power LED" \ 3>&1 1>&2 2>&3) elif is_live ; then @@ -2661,7 +2778,7 @@ do_system_menu() { return 0 elif [ $RET -eq 0 ]; then case "$FUN" in - S1\ *) do_wifi_ssid_passphrase ;; + S1\ *) do_wifi_ssid_passphrase_nmcli ;; S2\ *) do_audio ;; S3\ *) do_change_pass ;; S4\ *) do_hostname ;; @@ -2707,7 +2824,7 @@ do_interface_menu() { FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Interfacing Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \ "P1 Camera" "Enable/disable connection to the Raspberry Pi Camera" \ "P2 SSH" "Enable/disable remote command line access using SSH" \ - "P3 VNC" "Enable/disable graphical remote access using RealVNC" \ + "P3 VNC" "Enable/disable graphical remote access using TigerVNC" \ "P4 SPI" "Enable/disable automatic loading of SPI kernel module" \ "P5 I2C" "Enable/disable automatic loading of I2C kernel module" \ "P6 Serial Port" "Enable/disable shell messages on the serial connection" \ @@ -2741,7 +2858,7 @@ do_performance_menu() { FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Performance Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \ "P1 Overclock" "Configure CPU overclocking" \ "P2 GPU Memory" "Change the amount of memory made available to the GPU" \ - "P3 Overlay File System" "Enable/disable read-only file system" \ + `# "P3 Overlay File System" "Enable/disable read-only file system"` \ "P4 Fan" "Set behaviour of GPIO fan" \ 3>&1 1>&2 2>&3) RET=$? @@ -2783,19 +2900,19 @@ do_advanced_menu() { if is_pifour ; then FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Advanced Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \ "A1 Expand Filesystem" "Ensures that all of the SD card is available" \ - "A2 GL Driver" "Enable/disable experimental desktop GL driver" \ - "A3 Compositor" "Enable/disable xcompmgr composition manager" \ + `# "A2 GL Driver" "Enable/disable experimental desktop GL driver"` \ + `# "A3 Compositor" "Enable/disable xcompmgr composition manager"` \ "A4 Network Interface Names" "Enable/disable predictable network i/f names" \ "A5 Network Proxy Settings" "Configure network proxy settings" \ - "A6 Boot Order" "Choose network or USB device boot" \ - "A7 Bootloader Version" "Select latest or default boot ROM software" \ + `# "A6 Boot Order" "Choose network or USB device boot"` \ + `# "A7 Bootloader Version" "Select latest or default boot ROM software"` \ "A8 HDMI / Composite" "Raspberry Pi 4 video output options" \ 3>&1 1>&2 2>&3) elif is_pi ; then FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Advanced Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \ "A1 Expand Filesystem" "Ensures that all of the SD card is available" \ - "A2 GL Driver" "Enable/disable experimental desktop GL driver" \ - "A3 Compositor" "Enable/disable xcompmgr composition manager" \ + `# "A2 GL Driver" "Enable/disable experimental desktop GL driver"` \ + `# "A3 Compositor" "Enable/disable xcompmgr composition manager"` \ "A4 Network Interface Names" "Enable/disable predictable network i/f names" \ "A5 Network Proxy Settings" "Configure network proxy settings" \ 3>&1 1>&2 2>&3) @@ -2819,7 +2936,7 @@ do_advanced_menu() { A7\ *) do_boot_rom ;; A8\ *) do_pi4video ;; *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;; - esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1 + esac || [ $? -eq 2 ] || whiptail --msgbox "There was an error running option $FUN" 20 60 1 fi } @@ -2856,17 +2973,17 @@ if [ "$INTERACTIVE" = True ]; then calc_wt_size while [ "$USER" = "root" ] || [ -z "$USER" ]; do if ! USER=$(whiptail --inputbox "raspi-config could not determine the default user.\\n\\nWhat user should these settings apply to?" 20 60 pi 3>&1 1>&2 2>&3); then - return 0 + exit 0 fi done while true; do if is_pi ; then - FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --backtitle "$(cat /proc/device-tree/model)" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \ + FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --backtitle "$(tr -d '\0' < /proc/device-tree/model)" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \ "1 System Options" "Configure system settings" \ "2 Display Options" "Configure display settings" \ "3 Interface Options" "Configure connections to peripherals" \ "4 Performance Options" "Configure performance settings" \ - "5 Localisation Options" "Configure language and regional settings" \ + `# "5 Localisation Options" "Configure language and regional settings"` \ "6 Advanced Options" "Configure advanced settings" \ "8 Update" "Update this tool to the latest version" \ "9 About raspi-config" "Information about this configuration tool" \