diff --git a/apps/ivr/py/log.patch b/apps/ivr/py/log.patch deleted file mode 100644 index 2729a735..00000000 --- a/apps/ivr/py/log.patch +++ /dev/null @@ -1,83 +0,0 @@ -Index: log.py -=================================================================== ---- log.py (.../branches/inter_plugin_com/apps/ivr/py/log.py) (revision 22559) -+++ log.py (.../trunk/apps/ivr/py/log.py) (revision 21770) -@@ -1,52 +1,35 @@ - import ivr --import sys,logging -+import sys - --from com.iptel.log.Logger import * -- - # These are the same as in log.h - L_ERR = 0 - L_WARN = 1 - L_INFO = 2 - L_DBG = 3 - --def fromPyLogLevel(py_level): -+def log(level, msg, args): - -- level = 0 -- if py_level >= logging.ERROR: -- level = L_ERR -- elif py_level >= logging.WARN: -- level = L_WARN -- elif py_level >= logging.INFO: -- level = L_INFO -+ if args != None: -+ tmp_msg = msg % args - else: -- level = L_DBG -+ tmp_msg = msg -+ -+ ivr.log(level,"Ivr-Python: " + tmp_msg + "\n") - -- return level -- - --def toPyLogLevel(level): -+def error(msg, args=None): -+ log(L_ERR, msg, args) - -- py_level = 0 -- if level >= L_DBG: -- py_level = logging.DEBUG -- elif level >= L_INFO: -- py_level = logging.INFO -- elif level >= L_WARN: -- py_level = logging.WARN -- else: -- py_level = logging.ERROR -+def warn(msg, args=None): -+ log(L_WARN, msg, args) - -- return py_level -+def info(msg, args=None): -+ log(L_INFO, msg, args) -+ -+def debug(msg, args=None): -+ log(L_DBG, msg, args) - - --class SemsLogHandler(logging.Handler): -- -- def emit(self, record): -- -- msg = self.format(record) -- ivr.log(fromPyLogLevel(record.levelno),msg + '\n') -- -- - def stacktrace(tb): - - if tb: last_file = stacktrace(tb.tb_next) -@@ -72,9 +55,5 @@ - - - # init code --if not hasattr(Logger,"logger"): -- initLogger("sems",toPyLogLevel(ivr.SEMS_LOG_LEVEL)) -- getLogger().addLogHandler(SemsLogHandler()) -- - sys.excepthook = log_excepthook - debug("Python-Ivr logging started") diff --git a/apps/ivr/py/log.py b/apps/ivr/py/log.py index 1dcac712..3c673178 100644 --- a/apps/ivr/py/log.py +++ b/apps/ivr/py/log.py @@ -1,7 +1,5 @@ import ivr -import sys,logging - -from com.iptel.log.Logger import * +import sys # These are the same as in log.h L_ERR = 0 @@ -9,42 +7,27 @@ L_WARN = 1 L_INFO = 2 L_DBG = 3 -def fromPyLogLevel(py_level): +def log(level, msg, args): - level = 0 - if py_level >= logging.ERROR: - level = L_ERR - elif py_level >= logging.WARN: - level = L_WARN - elif py_level >= logging.INFO: - level = L_INFO + if args != None: + tmp_msg = msg % args else: - level = L_DBG - - return level - + tmp_msg = msg + + ivr.log(level,"Ivr-Python: " + tmp_msg + "\n") -def toPyLogLevel(level): - - py_level = 0 - if level >= L_DBG: - py_level = logging.DEBUG - elif level >= L_INFO: - py_level = logging.INFO - elif level >= L_WARN: - py_level = logging.WARN - else: - py_level = logging.ERROR - return py_level +def error(msg, args=None): + log(L_ERR, msg, args) +def warn(msg, args=None): + log(L_WARN, msg, args) -class SemsLogHandler(logging.Handler): - - def emit(self, record): - - msg = self.format(record) - ivr.log(fromPyLogLevel(record.levelno),msg + '\n') +def info(msg, args=None): + log(L_INFO, msg, args) + +def debug(msg, args=None): + log(L_DBG, msg, args) def stacktrace(tb): @@ -72,9 +55,5 @@ def log_excepthook(exception, value, tb): # init code -if not hasattr(Logger,"logger"): - initLogger("sems",toPyLogLevel(ivr.SEMS_LOG_LEVEL)) - getLogger().addLogHandler(SemsLogHandler()) - sys.excepthook = log_excepthook debug("Python-Ivr logging started") diff --git a/apps/ivr/py/log.pyc b/apps/ivr/py/log.pyc index c0d42454..ae75f73d 100644 Binary files a/apps/ivr/py/log.pyc and b/apps/ivr/py/log.pyc differ diff --git a/apps/mailbox/Makefile b/apps/mailbox/Makefile index ed0c3024..63f03852 100644 --- a/apps/mailbox/Makefile +++ b/apps/mailbox/Makefile @@ -31,7 +31,7 @@ compile: /usr/bin/python${PYTHON_VERSION} /usr/lib/python${PYTHON_VERSION}/compileall.py -q ${LIBDIR} install: all - install -d ${BASEDIR}/${LIB_INSTALLDIR} + install -d ${BASEDIR}/${LIB_INSTALLDIR} install -m ${LIB_PERMISSIONS} -o ${OWNER} -g ${GROUP} ${LIBDIR}/*.pyc ${BASEDIR}/${LIB_INSTALLDIR} uninstall: diff --git a/apps/mailbox/imap_mailbox/MailboxURL.py b/apps/mailbox/imap_mailbox/MailboxURL.py new file mode 100644 index 00000000..95f67182 --- /dev/null +++ b/apps/mailbox/imap_mailbox/MailboxURL.py @@ -0,0 +1,50 @@ + +import re + +class InvalidMailboxURL(Exception): + + value = "" + + def __init__(self,value): + self.value = value + Exception.__init__(value) + + def __str__(self): + return repr(self.value) + + +class MailboxURL: + + + url = "" + user = "" + passwd = "" + host = "" + port = 0 + path = "" + + def __init__(self,url): + self.url = url + self._parse() + + + def _parse(self): + m = re.match('imap://(.+):(.+)@(.+):([0-9]+)/(.+)',self.url) + if m is None: + raise InvalidMailboxURL('regex did not match') + + self.user = m.group(1) + self.passwd = m.group(2) + self.host = m.group(3) + self.port = int(m.group(4)) + self.path = m.group(5) + + def __str__(self): + return ("url:\t%s\n" % self.url) + \ + ("user:\t%s\n" % self.user) + \ + ("passwd:\t%s\n" % self.passwd) + \ + ("host:\t%s\n" % self.host) + \ + ("port:\t%i\n" % self.port) + \ + ("path:\t%s\n" % self.path) + + diff --git a/apps/mailbox/imap_mailbox/__init__.py b/apps/mailbox/imap_mailbox/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/apps/mailbox/imap_mailbox/imap4ext.py b/apps/mailbox/imap_mailbox/imap4ext.py new file mode 100644 index 00000000..cda7e19d --- /dev/null +++ b/apps/mailbox/imap_mailbox/imap4ext.py @@ -0,0 +1,235 @@ +import os,base64,time +from imaplib import IMAP4 + +from MailboxURL import * + + +READ_BUFSIZE = 4096 + + +def IMAPCALL(call_res): + + (t,d) = call_res + if t != 'OK': + raise IMAP4.error(d[0]) + return (t,d) + + +class IMAP4_MsgBODY: + + uid = '' + parts = [] + ct = '' + + def __init__(self,imap,uid): + + self.uid = '' + self.parts = [] + self.ct = '' + + (t,d) = imap.uid('FETCH',uid,'(BODY)') + if d[0] is None: + raise IMAP4.error('No message with UID "%s" has been found' % uid) + self._parse_body_desc(d[0]) + + def part_ct(self,part): + + return '%s/%s' % (self.parts[part][0],self.parts[part][1]) + + def fetch2file(self,imap,part,filename=None): + + (t,d) = imap.uid('fetch',self.uid,'(BODY.PEEK[%i])' % (part+1)) + if (t != "OK") or (len(d[0]) != 2): + raise IMAP4.error("could not retrieve part %s/%i" \ + % (self.uid, part+1)) + + msg = d[0][1] + msg = base64.decodestring(msg) + if filename is None: + out_file = os.tmpfile() + else: + out_file = open(filename,'w+') + + out_file.write(msg) + out_file.seek(0) + + if filename is None: + return out_file + else: + out_file.close() + return None + + + def _parse_body_desc(self,desc): + + (_dummy,s) = self._parenthesis2seq(desc)[1] + + self.uid = s[1] + + if type(s[3][0]) is not str: + + # Multipart message + for i in s[3]: + if type(i) is str: + self.ct = i + break + self.parts.append(i) + else: + self.parts.append(s[3]) + self.ct = s[3][0] + + + def _parenthesis2seq(self,s,ibeg=0): + + seq = [] + i = elmt_beg = ibeg + + while i < len(s): + + if s[i] == '(': + (i,tmp_seq) = self._parenthesis2seq(s,i+1) + elmt_beg = i + seq.append(tmp_seq) + + elif s[i] == ')': + if elmt_beg < i: + seq.append(s[elmt_beg:i]) + return (i+1,seq) + + elif s[i] == ' ': + if elmt_beg < i: + if s[elmt_beg] == '"': + seq.append(s[elmt_beg+1:i-1]) + else: + seq.append(s[elmt_beg:i]) + i = i+1 + elmt_beg = i + else: + i = i+1 + + return (i,seq) + + + +class IMAP4_Mailbox: + + url = None + imap = None + + def __init__(self,url): + + self.url = None + self.url = MailboxURL(url) + + def __del__(self): + + if self.imap != None: + self.imap.logout() + self.imap = None + + + def createBox(self): + + self._login() + debug("Creating account: " + \ + repr(IMAPCALL(self.imap.create(self.url.path)))) + + + def deleteBox(self): + + self._login() + debug("Deleting account: " + \ + repr(IMAPCALL(self.imap.delete(self.url.path)))) + + + def uploadMsg(self,msg): + + self._login() + IMAPCALL(self.imap.append(self.url.path,None,time.gmtime(),msg)) + + def deleteMsg(self,uid): + + self._login() + IMAPCALL(self.imap.select(self.url.path)) + IMAPCALL(self.imap.uid('STORE',uid,'+flags', '(\\Deleted)')) + IMAPCALL(self.imap.expunge()) + IMAPCALL(self.imap.close()) + + def saveMsg(self,uid): + + self._login() + IMAPCALL(self.imap.select(self.url.path)) + IMAPCALL(self.imap.uid('STORE',uid,'+flags','(\\seen)')) + IMAPCALL(self.imap.close()) + + def getWavMsgList(self,search_criterion): + + self._login() + IMAPCALL(self.imap.select(self.url.path)) + + (t,d) = self.imap.uid('SEARCH',search_criterion) + IMAPCALL((t,d)) + + msg_list = [] + for i in d[0].split(): + body = IMAP4_MsgBODY(self.imap,i) + for p in range(len(body.parts)): + if body.part_ct(p) == 'AUDIO/X-WAV': + msg_list.append(body.uid) + + IMAPCALL(self.imap.close()) + return msg_list + + + def downloadWAV(self,msg_uid): + + self._login() + IMAPCALL(self.imap.select(self.url.path)) + body = IMAP4_MsgBODY(self.imap,msg_uid) + + fp = None + for p in range(len(body.parts)): + if body.part_ct(p) == 'AUDIO/X-WAV': + fp = body.fetch2file(self.imap,p) + break + + IMAPCALL(self.imap.close()) + return fp + + + def downloadWAVs(self,search_criterion,file_prefix): + + self._login() + IMAPCALL(self.imap.select(self.url.path)) + + (t,d) = self.imap.uid('SEARCH',search_criterion) + IMAPCALL((t,d)) + + msg_list = [] + for i in d[0].split(): + + body = IMAP4_MsgBODY(self.imap,i) + + for p in range(len(body.parts)): + + if body.part_ct(p) == 'AUDIO/X-WAV': + + filename = file_prefix + '-' + body.uid + '.wav' + msg_list.append(filename) + body.fetch2file(self.imap,p,filename) + + IMAPCALL(self.imap.close()) + return msg_list + + def _login(self): + + if self.imap != None: + return + + self.imap = IMAP4(self.url.host,self.url.port) + try: + IMAPCALL(self.imap.login(self.url.user,self.url.passwd)) + except: + self.imap = None + raise + diff --git a/apps/mailbox/mailbox.py b/apps/mailbox/mailbox.py index 1c05df6a..2d93f5fb 100644 --- a/apps/mailbox/mailbox.py +++ b/apps/mailbox/mailbox.py @@ -3,8 +3,7 @@ import base64,time from log import * from ivr import * -from com.iptel.log.Logger import * -from com.iptel.imap.imap4ext import * +from imap_mailbox.imap4ext import * class IvrDialog(IvrDialogBase): diff --git a/apps/mailbox/mailbox_query.py b/apps/mailbox/mailbox_query.py index 7560b3bf..9bb52836 100644 --- a/apps/mailbox/mailbox_query.py +++ b/apps/mailbox/mailbox_query.py @@ -3,8 +3,7 @@ import os,weakref from log import * from ivr import * -from com.iptel.log.Logger import * -from com.iptel.imap.imap4ext import * +from imap_mailbox.imap4ext import * class List(list):