mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-15 10:46:15 +02:00
0fabb348ba
While we don't have any easy way to forcibly notify everyone about the impending breakage (or forcibly migrate the users on their system), this script enables those who do hear about the problem to migrate their systems before they take the macOS update. It should also enable people who only discover it after the update when a build fails to ~fix their installs without a full reinstall.
46 lines
1.6 KiB
Bash
Executable file
46 lines
1.6 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
((NEW_NIX_FIRST_BUILD_UID=301))
|
|
|
|
id_unavailable(){
|
|
dscl . list /Users UniqueID | grep -E '\b'"$1"'\b' >/dev/null
|
|
}
|
|
|
|
change_nixbld_names_and_ids(){
|
|
local name uid next_id
|
|
((next_id=NEW_NIX_FIRST_BUILD_UID))
|
|
echo "Attempting to migrate nixbld users."
|
|
echo "Each user should change from nixbld# to _nixbld#"
|
|
echo "and their IDs relocated to $next_id+"
|
|
while read -r name uid; do
|
|
echo " Checking $name (uid: $uid)"
|
|
# iterate for a clean ID
|
|
while id_unavailable "$next_id"; do
|
|
((next_id++))
|
|
if ((next_id >= 400)); then
|
|
echo "We've hit UID 400 without placing all of your users :("
|
|
echo "You should use the commands in this script as a starting"
|
|
echo "point to review your UID-space and manually move the"
|
|
echo "remaining users (or delete them, if you don't need them)."
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [[ "$name" == _* ]]; then
|
|
echo " It looks like $name has already been renamed--skipping."
|
|
else
|
|
# first 3 are cleanup, it's OK if they aren't here
|
|
sudo dscl . delete "/Users/$name" dsAttrTypeNative:_writers_passwd &>/dev/null || true
|
|
sudo dscl . change "/Users/$name" NFSHomeDirectory "/private/var/empty 1" "/var/empty" &>/dev/null || true
|
|
# remove existing user from group
|
|
sudo dseditgroup -o edit -t user -d "$name" nixbld || true
|
|
sudo dscl . change "/Users/$name" UniqueID "$uid" "$next_id"
|
|
sudo dscl . change "/Users/$name" RecordName "$name" "_$name"
|
|
# add renamed user to group
|
|
sudo dseditgroup -o edit -t user -a "_$name" nixbld
|
|
echo " $name migrated to _$name (uid: $next_id)"
|
|
fi
|
|
done < <(dscl . list /Users UniqueID | grep nixbld | sort -n -k2)
|
|
}
|
|
|
|
change_nixbld_names_and_ids
|