diff options
| author | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-24 13:19:52 +0100 | 
|---|---|---|
| committer | Wilmer van der Gaast <wilmer@gaast.net> | 2010-08-24 13:19:52 +0100 | 
| commit | ea728e661f521405c2883c70865d563750223770 (patch) | |
| tree | 31ee3abe6715bf4b75a895eb35d76b2026d5efec /utils/convert_purple.py | |
| parent | 9b1d2d6fa7edb911e3dbcd8785aaa797ebb20d0a (diff) | |
| parent | bd599b9aeabee36ac6fdb379ca09aec27cce13a4 (diff) | |
Merging mainline.
Diffstat (limited to 'utils/convert_purple.py')
| -rwxr-xr-x | utils/convert_purple.py | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/utils/convert_purple.py b/utils/convert_purple.py new file mode 100755 index 00000000..85433119 --- /dev/null +++ b/utils/convert_purple.py @@ -0,0 +1,113 @@ +#!/usr/bin/python +# +# Part of BitlBee. Reads a libpurple accounts.xml file and generates some +# commands/XML that BitlBee understands. For easy migration from Pidgin/ +# Finch/whatever to BitlBee, be it a public server or your own. +# +# Licensed under the GPL2 like the rest of BitlBee. +# +# Copyright 2010 Wilmer van der Gaast <wilmer@gaast.net> +# + +import getopt +import getpass +import os +import subprocess +import sys + +import xml.dom.minidom + +BITLBEE = '/usr/sbin/bitlbee' + +def parse_purple(f): +	protomap = { +		'msn-pecan': 'msn', +		'aim': 'oscar', +		'icq': 'oscar', +	} +	supported = ('msn', 'jabber', 'oscar', 'yahoo', 'twitter') +	accs = list() +	 +	if os.path.isdir(f): +		f = f + '/accounts.xml' +	xt = xml.dom.minidom.parse(f) +	for acc in xt.getElementsByTagName('account')[1:]: +		protocol = acc.getElementsByTagName('protocol')[0].firstChild.wholeText +		name = acc.getElementsByTagName('name')[0].firstChild.wholeText +		password = acc.getElementsByTagName('password')[0].firstChild.wholeText +		if protocol.startswith('prpl-'): +			protocol = protocol[5:] +		if name.endswith('/'): +			name = name[:-1] +		if protocol in protomap: +			protocol = protomap[protocol] +		if protocol not in supported: +			print 'Warning: protocol probably not supported by BitlBee: ' + protocol +		accs.append((protocol, name, password)) +	 +	return accs + +def print_commands(accs): +	print 'To copy all your Pidgin accounts to BitlBee, just copy-paste the following' +	print 'commands into your &bitlbee channel:' +	print +	for acc in accs: +		print 'account add %s %s %s' % acc + +def bitlbee_x(*args): +	bb = subprocess.Popen([BITLBEE, '-x'] + list(args), stdout=subprocess.PIPE) +	return bb.stdout.read().strip() + +def print_xml(accs): +	try: +		bitlbee_x('hash', 'blaataap') +	except: +		print "Can't find/use BitlBee binary. It has to be a 1.2.5 binary or higher." +		print +		usage() +	 +	print 'BitlBee .xml files are encrypted using the identify password. Please type your' +	print 'preferred identify password.' +	user = getpass.getuser() +	pwd = getpass.getpass() +	 +	root = xml.dom.minidom.Element('user') +	root.setAttribute('nick', user) +	root.setAttribute('password', bitlbee_x('hash', pwd)) +	root.setAttribute('version', '1') +	for acc in accs: +		accx = xml.dom.minidom.Element('account') +		accx.setAttribute('protocol', acc[0]) +		accx.setAttribute('handle', acc[1]) +		accx.setAttribute('password', bitlbee_x('enc', pwd, acc[2])) +		accx.setAttribute('autoconnect', '1') +		root.appendChild(accx) +	 +	print +	print 'Write the following XML data to a file called %s.xml (rename it if' +	print 'you want to use a different nickname). It should be in the directory where' +	print 'your BitlBee account files are stored (most likely /var/lib/bitlbee).' +	print +	print root.toprettyxml() + +def usage(): +	print 'Usage: %s [-f <purple accounts file>] [-b <bitlbee executable>] [-x]' % sys.argv[0] +	print +	print 'Generates "account add" commands by default. -x generates a .xml file instead.' +	print 'The accounts file can normally be found in ~/.purple/.' +	sys.exit(os.EX_USAGE) + +try: +	flags = dict(getopt.getopt(sys.argv[1:], 'f:b:x')[0]) +except getopt.GetoptError: +	usage() +if '-f' not in flags: +	usage() +if '-b' in flags: +	BITLBEE = flags['-b'] + +parsed = parse_purple(flags['-f']) +if '-x' in flags: +	print_xml(parsed) +else: +	print_commands(parsed) | 
