Files
postgres-web/tools/migrate/migrate_single_account.py

101 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python
#
# This script will migrate a single user from the old system to the new one. This will
# reset the users password in the process - there is no way around that.
#
# This process is automatically done when the user logs in to the new website, but it
# is useful to do this if the user has lost his password before he/she logs into the new
# site for the first time, since the password recovery feature only works once the account
# has been migrated.
#
import sys
import os
# Set up for accessing django
from django.core.management import setup_environ
sys.path.append(os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), '../../pgweb'))
import settings
setup_environ(settings)
from django.contrib.auth.models import User
from django.db import connection, transaction
from pgweb.core.models import UserProfile
from random import choice
import string
# This does not generate a strong password. But it's only a temporary one anyway,
# so this doesn't matter.
def GenPasswd(l):
return ''.join([choice(string.letters + string.digits) for i in xrange(l)])
if __name__=="__main__":
if len(sys.argv) != 2:
print "Usage: migrate_single_account.py <userid>"
sys.exit(1)
u = sys.argv[1].lower()
try:
user = User.objects.get(username=u)
print "User %s (%s %s) already exists!" % (u, user.first_name, user.last_name)
sys.exit(1)
except User.DoesNotExist:
print "User does not exist in new system, that's expected..."
pass
transaction.enter_transaction_management()
transaction.managed()
# Attempt login against old system
curs = connection.cursor()
curs.execute("SELECT userid, fullname, email, sshkey FROM users_old WHERE userid=%s", (u,))
rows = curs.fetchall()
if len(rows) == 0:
print "User %s does not exist in the old system." % u
sys.exit(1)
if len(rows) != 1:
print "Userid lookup returned %s rows, not 1!" % len(rows)
sys.exit(1)
print "Found user %s in the old system" % u
print "Fullname: %s" % rows[0][1]
print "Email: %s" % rows[0][2]
print ""
while True:
yn = raw_input("Are you sure you want to migrate this user, resetting his/her password? [y/n]?")
if yn == "y":
print "Ok, migrating..."
break
elif yn == "n":
print "Aborting"
sys.exit(1)
else:
continue
pwd = GenPasswd(12)
print "New password: %s" % pwd
namepieces = rows[0][1].split(None, 2)
if len(namepieces) == 0: namepieces = ['', '']
if len(namepieces) == 1: namepieces.append('')
print "Creating new user record..."
user = User(username=u, email=rows[0][2], first_name=namepieces[0], last_name=namepieces[1])
user.set_password(pwd)
user.save()
if rows[0][3]:
print "Migrating SSH key..."
profile = UserProfile(user=user)
profile.sshkey = rows[0][3]
profile.save()
print "Removing user from the old system..."
curs.execute("SELECT * FROM community_login_old_delete(%s)", (u, ))
transaction.commit()
print "Done. Don't forget to email the user at %s, informing him/her about the new password %s" % (rows[0][2], pwd)