149 lines
4.1 KiB
Python
149 lines
4.1 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
import sys
|
||
|
import os
|
||
|
import string
|
||
|
#from qt import *
|
||
|
from jabber import *
|
||
|
import StringIO
|
||
|
#import time
|
||
|
from account import Account
|
||
|
from config import Config
|
||
|
#from re import *
|
||
|
from optparse import OptionParser
|
||
|
|
||
|
#from threading import *
|
||
|
from xml.sax import saxutils
|
||
|
from xml.sax import make_parser
|
||
|
# for prettyprint
|
||
|
from xml.dom.ext import *
|
||
|
from xml.dom.ext.reader.Sax import *
|
||
|
|
||
|
class Answer:
|
||
|
def __init__(self,question,answerlist):
|
||
|
self._answer=None
|
||
|
while not self._answer:
|
||
|
sys.stderr.write(question)
|
||
|
tmp_ans=raw_input()
|
||
|
if tmp_ans in (answerlist): self._answer=tmp_ans
|
||
|
|
||
|
def get(self):
|
||
|
return self._answer;
|
||
|
|
||
|
|
||
|
class JabSync:
|
||
|
def __init__(self):
|
||
|
# init des var
|
||
|
self._commonJIDs={}
|
||
|
self._commonTransports={}
|
||
|
self._configFile=None
|
||
|
self._config=None
|
||
|
self._accountList=None
|
||
|
self._jabservers={}
|
||
|
|
||
|
def parseCmdLine(self):
|
||
|
parser=OptionParser()
|
||
|
parser.add_option("-c","--config",\
|
||
|
action="store", type="string", dest="filename",\
|
||
|
help="Use file a configuration file",metavar="config")
|
||
|
(options,args)=parser.parse_args()
|
||
|
if options.filename:
|
||
|
self._configFile=options.filename
|
||
|
else:
|
||
|
self._configFile=os.path.join(os.path.expanduser("~"),".jabsync")
|
||
|
print "Configuration file: "+self._configFile
|
||
|
def init(self):
|
||
|
self._config=Config()
|
||
|
self._config.loadFromFile(self._configFile)
|
||
|
self._accountList=self._config.getAccounts()
|
||
|
for account in self._accountList:
|
||
|
account.connect()
|
||
|
agents=account.getAgents()
|
||
|
self._commonTransports.update(agents)
|
||
|
for transport in self._commonTransports.keys():
|
||
|
print "Transport: "+transport
|
||
|
|
||
|
def giveTransport(self,hostName):
|
||
|
if self._jabservers.has_key(hostName):
|
||
|
trans_proto=hostName
|
||
|
return trans_proto
|
||
|
else:
|
||
|
if self._commonTransports.has_key(hostName):
|
||
|
trans_proto=self._commonTransports[hostName]
|
||
|
return trans_proto
|
||
|
else:
|
||
|
# TODO: ask user input
|
||
|
is_jabber=Answer(\
|
||
|
"# ERR : is "+hostName+" a jabber server ? [y/n]\n",\
|
||
|
["y","n"]).get()
|
||
|
if is_jabber == "y":
|
||
|
self._jabservers[hostName]=1
|
||
|
else:
|
||
|
what_tp_ans={\
|
||
|
"a" : "aim",\
|
||
|
"i" : "icq",\
|
||
|
"r" : "irc",\
|
||
|
"g" : "gadu",\
|
||
|
"m" : "msn",\
|
||
|
"p" : "public",\
|
||
|
"v" : "private",\
|
||
|
"y" : "yahoo",\
|
||
|
"-" : "forget"}
|
||
|
what_transport=Answer(\
|
||
|
" Select transport type :\n"+\
|
||
|
" [a]im"+\
|
||
|
" [i]cq"+\
|
||
|
" i[r]c):"+\
|
||
|
" [g]adu"+\
|
||
|
" [m]sn"+\
|
||
|
" [p]ublic:"+\
|
||
|
" pri[v]ate:"+\
|
||
|
" [y]ahoo"+\
|
||
|
" [-] Forget JIDs using this host",\
|
||
|
what_tp_ans.keys())
|
||
|
trans_proto=what_tp_ans[what_transport]
|
||
|
if trans_proto == "forget":
|
||
|
# TODO: ajouter regles d'exclusion
|
||
|
zero=0
|
||
|
else:
|
||
|
# TODO: ajouter transport a la config XML
|
||
|
zero=0
|
||
|
return self.giveTransport(hostName)
|
||
|
|
||
|
def get(self):
|
||
|
#get Roster
|
||
|
for account in self._accountList:
|
||
|
roster=account.getRoster()
|
||
|
# fusionner les roster
|
||
|
jid_list=roster.getJIDs()
|
||
|
for jid in jid_list:
|
||
|
transport=jid.getDomain()
|
||
|
trans_proto=self.giveTransport(transport)
|
||
|
if not self._commonJIDs.has_key(trans_proto):
|
||
|
self._commonJIDs[trans_proto]={}
|
||
|
jid_name=roster.getName(jid)
|
||
|
jid_groups=roster.getGroups(jid)
|
||
|
if not jid_name: jid_name=jid.getNode()
|
||
|
if not self._commonJIDs[trans_proto].has_key(jid.getNode()):
|
||
|
self._commonJIDs[trans_proto][jid.getNode()]=(jid_name,jid_groups)
|
||
|
# print " <- "+jid.getNode()+" @ "+trans_proto+" = "+jid_name
|
||
|
print "\x1B[G <- "+jid.getNode()+" @ "+trans_proto+" = "+jid_name
|
||
|
|
||
|
#upload rosters
|
||
|
def set(self):
|
||
|
for account in self._accountList:
|
||
|
account.setRoster(self._commonJIDs)
|
||
|
|
||
|
def stop(self):
|
||
|
for account in self._accountList:
|
||
|
account.disconnect()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
jabsync=JabSync()
|
||
|
jabsync.parseCmdLine()
|
||
|
jabsync.init()
|
||
|
jabsync.get()
|
||
|
jabsync.set()
|
||
|
jabsync.stop()
|
||
|
|