~ruther/guix-local

dd476cfb76511063e19ac3e70afd1d5a391b47f7 — Ludovic Courtès 2 years ago 7451780
guix-install.sh: Add ‘--uninstall’ flag.

* etc/guix-install.sh (REQUIRE): Add groupdel and userdel.
(chk_term): Handle ‘WAR’.
(sys_delete_store, sys_delete_build_user, sys_delete_guix_daemon)
(sys_delete_init_profile, sys_delete_user_profiles): New functions.
(main): Rename to…
(main_install): … this.
(main_uninstall): New function.
(main): Dispatch between these two.
* doc/guix.texi (Installation): Refer to “Binary Installation” instead
of repeating it.
(Binary Installation): Document uninstallation.

Co-authored-by: Ludovic Courtès <ludo@gnu.org>
Change-Id: I55b7c10823773bced2e268273e8ce828cb3bd98d
2 files changed, 184 insertions(+), 7 deletions(-)

M doc/guix.texi
M etc/guix-install.sh
M doc/guix.texi => doc/guix.texi +19 -4
@@ 696,12 696,11 @@ to join!  @xref{Contributing}, for information about how you can help.
We recommend the use of this
@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh,
shell installer script} to install Guix on top of a running GNU/Linux system,
thereafter called a @dfn{foreign distro}.@footnote{This section is concerned
thereafter called a @dfn{foreign distro}@footnote{This section is concerned
with the installation of the package manager, which can be done on top of a
running GNU/Linux system.  If, instead, you want to install the complete GNU
operating system, @pxref{System Installation}.} The script automates the
download, installation, and initial configuration of Guix.  It should be run
as the root user.
operating system, @pxref{System Installation}.}.  @xref{Binary
Installation}, for more information.
@end quotation

@cindex foreign distro


@@ 758,6 757,22 @@ chmod +x guix-install.sh
./guix-install.sh
@end example

The script automates the download, installation, and initial
configuration of Guix, interactively offering various configuration
options.

@cindex uninstalling Guix
@cindex uninstallation, of Guix
Should you eventually want to uninstall Guix, run the same script with
the @option{--uninstall} flag:

@example
./guix-install.sh --uninstall
@end example

With @option{--uninstall}, the script irreversibly deletes all the Guix
files, configuration, and services.

If you're running Debian or a derivative such as Ubuntu, you can instead
install the package (it might be a version older than @value{VERSION}
but you can update it afterwards by running @samp{guix pull}):

M etc/guix-install.sh => etc/guix-install.sh +165 -3
@@ 12,6 12,7 @@
# Copyright © 2021, 2022, 2023 Maxim Cournoyer <maxim.cournoyer@gmail.com>
# Copyright © 2022 Prafulla Giri <prafulla.giri@protonmail.com>
# Copyright © 2023 Andrew Tropin <andrew@trop.in>
# Copyright © 2020 David A. Redick <david.a.redick@gmail.com>
#
# This file is part of GNU Guix.
#


@@ 70,7 71,9 @@ REQUIRE=(
    "chmod"
    "uname"
    "groupadd"
    "groupdel"
    "useradd"
    "userdel"
    "tail"
    "tr"
    "xz"


@@ 191,6 194,7 @@ chk_term()
                *)
                    ERR="[ FAIL ] "
                    PAS="[ PASS ] "
                    WAR="[ WARN ] "
                    ;;
            esac
        fi


@@ 377,6 381,18 @@ sys_create_store()
    _msg "${PAS}activated root profile at ${GUIX_PROFILE}"
}

sys_delete_store()
{
    _msg "${INF}removing /var/guix"
    rm -rf /var/guix

    _msg "${INF}removing /gnu"
    rm -rf /gnu

    _msg "${INF}removing ${ROOT_HOME}/.config/guix"
    rm -rf ${ROOT_HOME}/.config/guix
}

sys_create_build_user()
{ # Create the group and user accounts for build users.



@@ 411,6 427,16 @@ sys_create_build_user()
    done
}

sys_delete_build_user()
{
    for i in $(seq -w 1 10); do
        userdel -f guixbuilder${i}
    done

    _msg "${INF}delete group guixbuild"
    groupdel -f guixbuild
}

sys_enable_guix_daemon()
{ # Run the daemon, and set it to automatically start on boot.



@@ 500,6 526,65 @@ sys_enable_guix_daemon()
    done
}

sys_delete_guix_daemon()
{ # Disabled, stop and remove the various guix daemons.

    local info_path
    local local_bin
    local var_guix

    _debug "--- [ $FUNCNAME ] ---"

    info_path="/usr/local/share/info"
    local_bin="/usr/local/bin"


    case "$INIT_SYS" in
        upstart)
            _msg "${INF}stopping guix-daemon"
            stop guix-daemon
            _msg "${INF}removing guix-daemon"
            rm /etc/init/guix-daemon.conf
            ;;

        systemd)
            _msg "${INF}disabling guix-daemon"
            systemctl disable guix-daemon
            _msg "${INF}stopping guix-daemon"
            systemctl stop guix-daemon
            _msg "${INF}removing guix-daemon"
            rm -f /etc/systemd/system/guix-daemon.service

            if [ -x /etc/systemd/system/gnu-store.mount ]; then
                _msg "${INF}disabling gnu-store.mount"
                systemctl disable gnu-store.mount
                _msg "${INF}stopping gnu-store.mount"
                systemctl stop gnu-store.mount
                _msg "${INF}removing gnu-store.mount"
                rm -f /etc/systemd/system/gnu-store.mount
            fi
            systemctl daemon-reload
            ;;

        sysv-init)
            update-rc.d guix-daemon disable
            service guix-daemon stop
            rm -rf /etc/init.d/guix-daemon
            ;;
        NA|*)
            _msg "${ERR}unsupported init system; disable, stop and remove the daemon manually:"
            echo "  ${ROOT_HOME}/.config/guix/current/bin/guix-daemon --build-users-group=guixbuild"
            ;;
    esac


    _msg "${INF}removing $local_bin/guix"
    rm -f "$local_bin"/guix

    _msg "${INF}removing $info_path/guix*"
    rm -f "$info_path"/guix*
}

sys_authorize_build_farms()
{ # authorize the public key(s) of the build farm(s)
    local hosts=(


@@ 623,8 708,29 @@ sys_maybe_setup_selinux()
    restorecon -R /gnu /var/guix
}

sys_delete_init_profile()
{
    _msg "${INF}removing /etc/profile.d/guix.sh"
    rm -f /etc/profile.d/guix.sh
}

sys_delete_user_profiles()
{
    _msg "${INF}removing ${ROOT_HOME}/.guix-profile"
    rm -f ${ROOT_HOME}/.guix-profile
    rm -rf ${ROOT_HOME}/.cache/guix

    _msg "${INF}removing .guix-profile, .cache/guix and .config/guix of all /home users"
    for user in `ls -1 /home`; do
        rm -f /home/$user/.guix-profile
        rm -rf /home/$user/.cache/guix
        rm -rf /home/$user/.config/guix
    done
}

welcome()
{
    local uninstall_flag="$1"
    local char
    cat<<"EOF"
    ░░░                                     ░░░


@@ 647,10 753,17 @@ welcome()
   | |__| | |\  | |__| | | |__| | |_| | |>  <
    \_____|_| \_|\____/   \_____|\__,_|_/_/\_\

This script installs GNU Guix on your system

https://www.gnu.org/software/guix/
EOF

    if [ '--uninstall' = "$uninstall_flag" ]; then
        echo "${WARN}This script will uninstall GNU Guix from your system"
        echo "To install, run this script with no parameters."
    else
        echo "This script installs GNU Guix on your system"
        echo "To uninstall, pass in the '--uninstall' parameter."
    fi

    # Don't use ‘read -p’ here!  It won't display when run non-interactively.
    echo -n "Press return to continue..."$'\r'
    if ! read -r char; then


@@ 665,7 778,7 @@ EOF
    fi
}

main()
main_install()
{
    local tmp_path
    welcome


@@ 715,4 828,53 @@ main()
    _msg "${INF}Please log out and back in to complete the installation."
 }

main_uninstall()
{
    welcome --uninstall
    _msg "Starting uninstall process ($(date))"

    chk_term
    chk_require "${REQUIRE[@]}"
    # it's ok to leave the gpg key
    chk_init_sys
    chk_sys_arch

    _msg "${INF}system is ${ARCH_OS}"

    # stop the build, package system.
    sys_delete_guix_daemon
    # stop people from accessing their profiles.
    sys_delete_user_profiles
    # kill guix off all the guts of guix
    sys_delete_store
    # clean up the system
    sys_delete_init_profile
    sys_delete_build_user

    # these directories are created on the fly during usage.
    _msg "${INF}removing /etc/guix"
    rm -rf /etc/guix
    _msg "${INF}removing /var/log/guix"
    rm -rf /var/log/guix

    _msg "${PAS}Guix has successfully been uninstalled!"
}

main()
{
    # expect no parameters
    # or '--uninstall'
    if [ 0 -eq $# ]; then
        main_install
    else
        local uninstall_flag="$1"
        if [ '--uninstall' = "${uninstall_flag}" ]; then
            main_uninstall
        else
            echo "unsupported parameters: $@"
            exit 1
        fi
    fi
}

main "$@"