#!C:\Programme2\Python25\python.exe # **************************************** # +++ BioCASE # +++ pywrapper # # See http://www.biocase.org for details # # **************************************** from xml.dom.minidom import Document import os, cgi, sys, zipfile, os.path import xml.dom.minidom from xml.dom.minidom import Node import xml.sax import pprint import traceback # ***** include the biocase.lib directory in the python sys path for module importing ***** execfile( os.path.abspath(os.path.join(os.path.dirname( __file__ ), os.path.pardir, 'lib', 'biocase', 'adjustpath.py')) ) import biocase.configuration cfg = biocase.configuration.Cfg() import logging, biocase.initlogs log = logging.getLogger("pywrapper") from biocase.wrapper.pywrapper import pywrapper archiveRequest = 0 archiveAppend = 1 archiveFileName = "aabcd.zip" ticket = "" hits = 0 rcount = 0 dropped = 0 try: # get datasource alias from GET querystring if os.environ.has_key("QUERY_STRING"): QS = cgi.parse_qs( os.environ["QUERY_STRING"] ) if QS.has_key('archiverequest'): if QS['archiverequest'][0] == "on" or QS['archiverequest'][0] == "1": archiveRequest = 1 else: archiveRequest = 0 if QS.has_key('archiveappend'): if QS['archiveappend'][0] == "on" or QS['archiveappend'][0] == "1": archiveAppend = 1 else: archiveAppend = 0 if QS.has_key('archivefilename'): archiveFileName = QS['archivefilename'][0] if QS.has_key('ticket'): ticket = QS['ticket'][0] if QS.has_key('dsa'): dsa = QS['dsa'][0] elif QS.has_key('DSA'): dsa = QS['DSA'][0] elif QS.has_key('datasource'): dsa = QS['datasource'][0] else: raise "No Datasource alias given!" else: raise "No querystring given. Pass at least a datasource alias via dsa=XXX!" except Error: raise Error biocase.initlogs.initWrapperLogging(dsa) pywInstance = pywrapper('biocase', dsa=dsa) # create a request from CGI log.debug("pywInstance.parseRequest...") pywInstance.parseRequest() # print the result to the stream log.debug("pywInstance.doResponse...") errors = [] def extractContent(fileName): if not os.path.exists(fileName): errors.append("Dumpfile not found") return "" global hits global rcount global dropped global pywInstance hits = 0 rcount = 0 dropped = 0 try: f = open(fileName, "r") foundStart = False foundEnd = False out = [] for line in f: if foundStart: if line.lstrip()[0:17] == "') elif line.lstrip()[0:16] == "\n' else: del out out = [] dom = xml.dom.minidom.parse(fileName) e = dom.getElementsByTagName("biocase:diagnostic") for ee in e: s = ee.getAttribute("severity") if s == "ERROR": errors.append(ee.firstChild.data) return "".join(out) except: et, ev, tb = sys.exc_info() error = str(sys.exc_info()[1]) while tb : co = tb.tb_frame.f_code filename = "Filename = " + str(co.co_filename) line_no = "Error Line # = " + str(traceback.tb_lineno(tb)) print filename print line_no tb = tb.tb_next print "et = ", et print "ev = ", ev #writeResponse("error", error) #exit(0) errors.append(error) def writeResponse(status, message): global hits global rcount global dropped global errors if len(errors) > 0: status = "error" message = "\n".join(errors) #print "" print "" print "" + status + "" print "" + message + "" print "" + str(hits) + "" print "" + str(rcount) + "" print "" + str(dropped) + "" print "" if archiveRequest == 1: sys.stdout.write('Content-Type: text/xml\n\n') archivePath = os.path.abspath(".." + os.sep + "archive") + os.sep + dsa + os.sep if not os.path.exists(archivePath): os.makedirs(archivePath) conf = archivePath + archiveFileName + ".config.xml" _ticket = "" if os.path.exists(conf): _dom = xml.dom.minidom.parse(conf) _ticket = str(_dom.getElementsByTagName("ticket")[0].firstChild.data) if (_ticket != ticket) or ticket == "" or _ticket == "": writeResponse("error", "Authorization failed.") sys.exit(0) try: import zlib compression = zipfile.ZIP_DEFLATED except: compression = zipfile.ZIP_STORED try: if archiveAppend == 1: dumpName = archivePath+archiveFileName+".dump.xml" zipName = "response.1.xml" tmpName = archivePath+archiveFileName+"."+zipName if not os.path.exists(archivePath + archiveFileName): zip = zipfile.ZipFile(archivePath + archiveFileName, "w") else: zip = zipfile.ZipFile(archivePath + archiveFileName, "a") tmpName = archivePath+archiveFileName+".response." + str(len(zip.namelist()) + 1) + ".xml" zipName = "response." + str(len(zip.namelist()) + 1) + ".xml" tmpFile = open(dumpName, "w") pywInstance.doResponse(stream=tmpFile, httpHeader=0) tmpFile.close() content = extractContent(dumpName) if hits > 0: tmpFile = open(tmpName, "w") tmpFile.write(content) tmpFile.close() zip.write(tmpName, zipName, compression) zip.close() os.remove(tmpFile.name) writeResponse("ok", zipName + " appended to archive " + archiveFileName) else: writeResponse("ok", "No records to process") else: dumpName = archivePath+archiveFileName+".dump.xml" zipName = "response.1.xml" tmpName = archivePath+archiveFileName+"."+zipName tmpFile = open(dumpName, "w") pywInstance.doResponse(stream=tmpFile, httpHeader=0) tmpFile.close() content = extractContent(dumpName) if hits > 0: tmpFile = open(tmpName, "w") tmpFile.write(content) tmpFile.close() zip = zipfile.ZipFile(archivePath + archiveFileName, "w") zip.write(tmpName, zipName, compression) zip.close() os.remove(tmpFile.name) writeResponse("ok", zipName + " stored in archive " + archiveFileName) else: writeResponse("ok", "No records to process") except: errors.append("An internal error at pywrapper occured:"+str(sys.exc_info()[1])) et, ev, tb = sys.exc_info() errors.append("Traceback:") while tb : co = tb.tb_frame.f_code filename = "Filename = " + str(co.co_filename) line_no = "Error Line # = " + str(traceback.tb_lineno(tb)) errors.append(filename) errors.append(line_no) tb = tb.tb_next writeResponse("","") else: pywInstance.doResponse(httpHeader=1) log.info("PyWrapper response successful")