Files
postgres-web/tools/migrate/migrate_single_account.py
Magnus Hagander c3c882c1d4 Add script to migrate a single account from the old system to the new
Required in order to be able to do password recovery on accounts, since
we only migrate users when they actually log in...
2012-05-23 16:02:18 +02:00

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][2].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)