Skip to content

Instantly share code, notes, and snippets.

@alerque
Created June 1, 2021 13:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alerque/d7976cce609053cde589aa177e1bc2b6 to your computer and use it in GitHub Desktop.
Save alerque/d7976cce609053cde589aa177e1bc2b6 to your computer and use it in GitHub Desktop.
Migrate LDAP‌ users in Nextcloud from UUIDs to Keycloak usernames
#!/usr/bin/env zsh
# This is provided with NO SUPPORT, it worked for me but it is also hard coded to the exact
# circumstances of by previous databaase and desired end schema. The paths to by data files
# and database credentials would need to be adjusted. Backup both your file repository and
# databased before even touching this.
# Note this script is setup to run BTRFS snapshots and data dumps accourding to my backup
# schemed on every run so I could experiment with several and rollback, but these sections
# would be your responsibility to adapt to your backup methods.
exit 1
set -e
set -x
sudo -v
test -n "$DB_PASSWORD"
get_uuids() {
occ user:list --output json -i |
jq -r '.[] | select(.backend == "LDAP") | .user_id' |
grep -E '^.{36}$'
}
get_uid() {
occ user:setting --output json $1 |
jq -r .user_ldap.uid
}
sql() {
echo "UPDATE $1 SET $2 = '$username' WHERE $2 = '$uuid';"
}
sql_replace() {
echo "UPDATE $1 SET $2 = REPLACE($2, '$3$uuid', '$3$username');"
}
date=$(date +%Y-%m-%d-%H-%M-%S)
occ maintenance:mode | grep -q disabled
get_uuids |
while read uuid; do
get_uid $uuid | read username
echo $uuid $username | sudo tee -a /bak/cruft/${date}_map >/dev/null
# filecache has path_hash wich is md5sum(), can
echo "START TRANSACTION;"
sql accounts uid
sql activity affecteduser
sql activity user
sql_replace addressbooks principaluri
sql authtoken uid
sql_replace calendars principaluri
sql_replace cards carddata CLOUD:
sql_replace cards carddata UID:
sql_replace cards_properties preferred
sql cards uid
sql collres_accesscache user_id
sql comments actor_id
sql comments_read_markers user_id
sql_replace filecache path
sql files_trash user
sql group_admin uid
sql group_user uid
sql ldap_user_mapping owncloud_name
sql ldap_user_mapping directory_uuid
sql_replace mounts mount_point
sql mounts user_id
sql preferences userid
sql share share_with
sql share uid_initiator
sql share uid_owner
sql_replace storages id home::
sql talk_attendees actor_id
sql talk_rooms name
sql twofactor_providers uid
sql user_status user_id
sql vcategory uid
echo "COMMIT;"
done |
sudo tee /bak/cruft/${date}_updates.sql > /dev/null
occ maintenance:mode --on
# Backups
sudo cp $0 /bak/cruft/${date}_script
mysqldump -unextcloud -p$DB_PASSWORD nextcloud | sudo tee /bak/cruft/${date}_dump.sql >/dev/null
sudo btrfs subvolume snapshot -r /srv/nextcloud/ /srv/.snapshots/nextcloud-$date
sudo btrfs subvolume snapshot -r /srv/mariadb/ /srv/.snapshots/mariadb-$date
# HOT STUFF, procede at your own risk
exit 1
mysql -unextcloud -p$DB_PASSWORD nextcloud < /bak/cruft/${date}_updates.sql
echo "mysql -unextcloud -p\$DB_PASSWORD nextcloud < /bak/cruft/${date}_dump.sql" | sudo tee -a /bak/cruft/${date}_revert
while read uuid username; do
sudo mv /srv/nextcloud/{$uuid,$username}
echo "sudo mv /srv/nextcloud/{$uuid,$username}" | sudo tee -a /bak/cruft/${date}_revert
done < /bak/cruft/${date}_map
occ maintenance:mode --off
# move flolder
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment