nix: fix purge.sh script on Darwin platform

Darwin lacks `userdel` and Nix users don't appear in `/etc/passwd`.

Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit is contained in:
Jakub Sokołowski 2022-04-12 11:54:03 +02:00
parent 2d6872976e
commit b2695e0b24
No known key found for this signature in database
GPG Key ID: 09AA5403E54D9931
2 changed files with 89 additions and 34 deletions

View File

@ -23,15 +23,28 @@ nix_install_type() {
NIX_STORE_DIR_GROUP=$(file_group /nix/store) NIX_STORE_DIR_GROUP=$(file_group /nix/store)
if [[ "$(os_name)" =~ NixOS ]]; then if [[ "$(os_name)" =~ NixOS ]]; then
echo "nixos" echo "nixos"
elif [[ "${NIX_STORE_DIR_GROUP}" == "nixbld" ]]; then
echo "multi"
elif [[ "${NIX_STORE_DIR_GROUP}" == "${USER}" ]]; then
echo "single"
elif [[ "${NIX_STORE_DIR_GROUP}" == "" ]]; then
echo "No Nix installtion detected!" >&2
echo "none"
else else
echo "Unknown Nix installtion type!" >&2 case "${NIX_STORE_DIR_GROUP}" in
exit 1 "nixbld") echo "multi";;
"30000") echo "multi";;
"(30000)") echo "multi";;
"wheel") echo "single";;
"users") echo "single";;
"${USER}") echo "single";;
"${UID}") echo "single";;
"(${UID})") echo "single";;
"") echo "none";
echo "No Nix installtion detected!" >&2;;
*) echo "Unknown Nix installtion type!" >&2; exit 1;;
esac
fi fi
} }
nix_root() {
NIX_ROOT="/nix"
if [[ $(uname -s) == "Darwin" ]]; then
# Special case due to read-only root on MacOS Catalina
NIX_ROOT="/opt/nix"
fi
echo "${NIX_ROOT}"
}

View File

@ -5,20 +5,58 @@ GIT_ROOT=$(cd "${BASH_SOURCE%/*}" && git rev-parse --show-toplevel)
source "${GIT_ROOT}/nix/scripts/lib.sh" source "${GIT_ROOT}/nix/scripts/lib.sh"
source "${GIT_ROOT}/scripts/colors.sh" source "${GIT_ROOT}/scripts/colors.sh"
nix_purge_multi_user() { nix_purge_linux_multi_user_service() {
sudo systemctl stop nix-daemon.socket NIX_SERVICES=(nix-daemon.service nix-daemon.socket)
sudo systemctl stop nix-daemon.service for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
sudo systemctl disable nix-daemon.socket sudo systemctl stop "${NIX_SERVICE}"
sudo systemctl disable nix-daemon.service sudo systemctl disable "${NIX_SERVICE}"
done
sudo systemctl daemon-reload sudo systemctl daemon-reload
sudo rm -fr /etc/nix }
sudo rm -f /etc/profile.d/nix.sh*
# Remove nix build users and groups nix_purge_linux_multi_user_users() {
for NIX_USER in $(awk -F: '/nixbld/{print $1}' /etc/passwd); do for NIX_USER in $(awk -F: '/nixbld/{print $1}' /etc/passwd); do
sudo userdel "${NIX_USER}" sudo userdel "${NIX_USER}"
done done
sudo groupdel nixbld sudo groupdel nixbld
}
nix_purge_darwin_multi_user_service() {
cd /Library/LaunchDaemons
NIX_SERVICES=(org.nixos.darwin-store.plist org.nixos.nix-daemon.plist)
for NIX_SERVICE in "${NIX_SERVICES[@]}"; do
sudo launchctl unload "${NIX_SERVICE}"
sudo launchctl remove "${NIX_SERVICE}"
done
}
nix_purge_darwin_multi_user_users() {
for NIX_USER in $(dscl . list /Users | grep nixbld); do
sudo dscl . -delete "/Users/${NIX_USER}"
done
sudo dscl . -delete /Groups/nixbld
}
# This still leaves an empty /nix, which will disappear after reboot.
nix_purge_darwin_multi_user_volumes() {
sudo sed -i.bkp '/nix/d' /etc/synthetic.conf
sudo sed -i.bkp '/nix/d' /etc/fstab
sudo diskutil apfs deleteVolume /nix
echo -e "${YLW}You will need to reboot your system!${RST}" >&2
}
nix_purge_multi_user() {
if [[ $(uname -s) == "Darwin" ]]; then
nix_purge_darwin_multi_user_service
nix_purge_darwin_multi_user_users
nix_purge_darwin_multi_user_volumes
else
nix_purge_linux_multi_user_service
nix_purge_linux_multi_user_users
fi
sudo rm -fr /etc/nix
sudo rm -f /etc/profile.d/nix.sh*
# Restore old shell profiles # Restore old shell profiles
NIX_PROFILE_FILES=( NIX_PROFILE_FILES=(
@ -41,11 +79,7 @@ nix_purge_user_profile() {
} }
nix_purge_root() { nix_purge_root() {
NIX_ROOT="/nix" NIX_ROOT=$(nix_root)
if [[ $(uname -s) == "Darwin" ]]; then
# Special case due to read-only root on MacOS Catalina
NIX_ROOT="/opt/nix"
fi
if [[ -z "${NIX_ROOT}" ]]; then if [[ -z "${NIX_ROOT}" ]]; then
echo -e "${RED}Unable to identify Nix root!${RST}" >&2 echo -e "${RED}Unable to identify Nix root!${RST}" >&2
exit 1 exit 1
@ -53,27 +87,35 @@ nix_purge_root() {
sudo rm -fr "${NIX_ROOT}" sudo rm -fr "${NIX_ROOT}"
} }
NIX_INSTALL_TYPE=$(nix_install_type) # Don't run anything if script is just sourced.
if (return 0 2>/dev/null); then
if [[ "${1}" == "--force" ]] && [[ "${NIX_INSTALL_TYPE}" != "nixos" ]]; then echo -e "${YLW}Script sourced, not running purge.${RST}"
echo -e "${YLW}Purge forced, no checks performed!${RST}" >&2 return
nix_purge_multi_user
nix_purge_user_profile
nix_purge_root
exit
fi fi
# Purging /nix on NixOS would be disasterous # Confirm user decission, unless --force is used.
if [[ "${1}" != "--force" ]]; then
echo -e "${YLW}Are you sure you want to purge Nix?${RST}" >&2
read -p "[y/n]: " -n 1 -r
echo
if [[ $REPLY =~ ^[^Yy]$ ]]; then
echo -e "${GRN}Aborting Nix purge!${RST}" >&2
exit 0
fi
fi
NIX_INSTALL_TYPE=$(nix_install_type)
# Purging /nix on NixOS would be disasterous.
if [[ "${NIX_INSTALL_TYPE}" == "nixos" ]]; then if [[ "${NIX_INSTALL_TYPE}" == "nixos" ]]; then
echo -e "${RED}You should not purge Nix files on NixOS!${RST}" >&2 echo -e "${RED}You should not purge Nix files on NixOS!${RST}" >&2
exit exit
elif [[ "${NIX_INSTALL_TYPE}" == "none" ]]; then elif [[ "${NIX_INSTALL_TYPE}" == "none" ]] && [[ "${1}" != "--force" ]]; then
echo -e "${YLW}Nothing to remove, Nix not installed.${RST}" >&2 echo -e "${YLW}Nothing to remove, Nix not installed.${RST}" >&2
exit exit
elif [[ "${NIX_INSTALL_TYPE}" == "multi" ]]; then elif [[ "${NIX_INSTALL_TYPE}" == "multi" ]] || [[ "${1}" == "--force" ]]; then
echo -e "${YLW}Detected multi-user Nix installation.${RST}" >&2 echo -e "${YLW}Detected multi-user Nix installation.${RST}" >&2
nix_purge_multi_user nix_purge_multi_user
elif [[ "${NIX_INSTALL_TYPE}" == "single" ]]; then elif [[ "${NIX_INSTALL_TYPE}" == "single" ]] || [[ "${1}" == "--force" ]]; then
echo -e "${YLW}Detected single-user Nix installation.${RST}" >&2 echo -e "${YLW}Detected single-user Nix installation.${RST}" >&2
nix_purge_user_profile nix_purge_user_profile
fi fi