aboutsummaryrefslogtreecommitdiffstats
path: root/utils/convert_purple.py
diff options
context:
space:
mode:
authorWilmer van der Gaast <wilmer@gaast.net>2010-08-22 12:37:49 +0100
committerWilmer van der Gaast <wilmer@gaast.net>2010-08-22 12:37:49 +0100
commitf29f50ec080cf6b1f4298465faf5e0348386e9be (patch)
treefe793a82124d79ad2ab74ff05830350406774617 /utils/convert_purple.py
parentc00dd7117be2a5fda92d6f7d72b0e4e54fa5d615 (diff)
Cleaning up utils directory, those scripts generate old-style files no longer
supported by BitlBee. Adding a script that converts libpurple configs (generated by stuff like Pidgin, Finch, possibly Adium, maybe other programs that are not BitlBee) into formats understood by BitlBee.
Diffstat (limited to 'utils/convert_purple.py')
-rwxr-xr-xutils/convert_purple.py113
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)