diff --git a/agent/loops.tac b/agent/loops.tac
index 30296ba..96a86fd 100644
--- a/agent/loops.tac
+++ b/agent/loops.tac
@@ -1,15 +1,22 @@
+"""
+Start with ``twistd -noy loops/agent/loops.tac``.
+
+$Id$
+"""
+
from twisted.application import internet, service
from nevow import appserver
from loops.agent.core import Agent
from loops.agent.ui.web import AgentHome
-from loops.agent.config import conf
+agent = Agent()
+conf = agent.config
port = conf.ui.web.port or 10095
application = service.Application('LoopsAgent')
-site = appserver.NevowSite(resource=AgentHome(Agent()))
+site = appserver.NevowSite(resource=AgentHome(agent))
webServer = internet.TCPServer(port, site)
webServer.setServiceParent(application)
diff --git a/agent/ui/templates/navigation.html b/agent/ui/templates/navigation.html
index c2026f8..5b899de 100644
--- a/agent/ui/templates/navigation.html
+++ b/agent/ui/templates/navigation.html
@@ -3,36 +3,36 @@
diff --git a/agent/ui/web.py b/agent/ui/web.py
index a6eba8d..a4a938d 100644
--- a/agent/ui/web.py
+++ b/agent/ui/web.py
@@ -5,6 +5,11 @@
# version: 0.1
#------------------------------------------------------
+"""
+
+$Id$
+"""
+
import sys
import os
import tempfile
@@ -12,15 +17,20 @@ import cPickle
import traceback
import time
import email
-import _winreg as winreg
+try:
+ import _winreg as winreg
+ USE_WINDOWS = True
+except ImportError:
+ USE_WINDOWS = False
from nevow import loaders, rend, static, url, inevow, tags
from nevow.inevow import IRequest
from twisted.internet import defer
-from loops.agent.crawl import outlook
from loops.agent import core
-from loops.agent.crawl.outlook import OutlookResource
+if USE_WINDOWS:
+ from loops.agent.crawl import outlook
+ from loops.agent.crawl.outlook import OutlookResource
from loops.agent.crawl.filesystem import FileResource
# ---- global definitions and settings ---------------------------------
@@ -30,7 +40,7 @@ PICKLE_MAILS = 0
DEBUG = 1
resourcesDirectory = 'resources'
templatesDirectory = 'templates'
-
+
# some constatnts
_REG_KEY_CONST_ = "SOFTWARE\\Classes\\mailto\\shell\\open\\command"
_OUTLOOK_2007_ = "Office12"
@@ -41,7 +51,8 @@ _OUTLOOK_EXPRESS_ = "Office10"
def template(fn):
- return loaders.xmlfile(os.path.join(templatesDirectory, fn))
+ return loaders.xmlfile(os.path.join(
+ os.path.dirname(__file__), templatesDirectory, fn))
def getConfigIndex(agentobj, index_name, default_value, fn=None):
@@ -55,7 +66,7 @@ def getOutlookVersion():
checks what outlook version we have to handle
Returns the standard email application on this machine.
-
+
Therefor we have to read out the registry key
"HKEY_LOCAL_MACHINE\SOFTWARE\Classes\mailto\shell\open\command"
@@ -68,44 +79,44 @@ def getOutlookVersion():
Outlook versions installed and modify,
if needed the defined constants and return
values of the getOutlookVersion function
-
+
"""
# open registry key
- try:
- key = winreg.OpenKey(
- winreg.HKEY_LOCAL_MACHINE,
- _REG_KEY_CONST_ )
-
- except WindowsError:
+ try:
+ key = winreg.OpenKey(
+ winreg.HKEY_LOCAL_MACHINE,
+ _REG_KEY_CONST_ )
+
+ except WindowsError:
return None
-
- try:
- try:
- # read out current standard outlook version
+
+ try:
+ try:
+ # read out current standard outlook version
version = winreg.QueryValueEx(key, "")[0]
- # check what outlook we have
+ # check what outlook we have
if version:
if _OUTLOOK_2007_ in version:
version = _OUTLOOK_2007_
-
+
elif _OUTLOOK_2003_ in version:
version = _OUTLOOK_2003_
-
+
elif _OUTLOOK_EXPRESS_ in version:
- version = _OUTLOOK_EXPRESS_
-
- except WindowsError:
- version = ""
- finally:
- # close key
- winreg.CloseKey(key)
+ version = _OUTLOOK_EXPRESS_
+
+ except WindowsError:
+ version = ""
+ finally:
+ # close key
+ winreg.CloseKey(key)
#print '--> getOutlookVersion(): Outlook version found, version is: ', version
- # return key value
- return version
+ # return key value
+ return version
-# AgentHome
+# AgentHome
# root page of the Agent UI
class AgentHome(rend.Page):
@@ -123,10 +134,11 @@ class AgentHome(rend.Page):
__init__ -- Load the initial start-up settings from config
"""
-
- child_resources = static.File(resourcesDirectory)
+
+ child_resources = static.File(os.path.join(
+ os.path.dirname(__file__),resourcesDirectory))
docFactory = template('agent.html')
-
+
def __init__(self, agent=None, first_start=1):
""" Initialize the AgentHome object.
@@ -145,14 +157,14 @@ class AgentHome(rend.Page):
print "[AgentHome] setting self.usermode: ", self.agent.config.ui.web.usermode
else:
self.agent = agent
-
+
"""
def locateChild(self, ctx, segments):
return self, ()
"""
-
+
# calls to child pages
-
+
def child_joboverview(self, context):
""" User requested page from menue: 'job overview' """
return JobOverView(self.agent)
@@ -204,7 +216,7 @@ class AgentHome(rend.Page):
"""
selected_job = ((IRequest(context).uri).split("?"))[1]
crawl_index = selected_job.split(".")[1]
-
+
return JobOverViewDetails(self.agent, crawl_index)
# "add outlook crawl job" methods (class AgentOutlookMailCrawl)
@@ -216,12 +228,12 @@ class AgentHome(rend.Page):
crawlSubfolder = False
form = IRequest(context).args
if form != {}:
- index = getConfigIndex(self.agent, 'type', 'unused')
+ index = getConfigIndex(self.agent, 'type', 'unused')
#save job configuration
if form['mailCrawlInterval'][0] == "oneTime":
conf.crawl[index].state = 'completed'
else:
- conf.crawl[index].state = 'active'
+ conf.crawl[index].state = 'active'
conf.crawl[index].jobid = 'outlook.%i' %(index)
conf.crawl[index].type = 'OutlookMail'
if form.has_key('inbox'):
@@ -283,17 +295,17 @@ class AgentHome(rend.Page):
return deferred
else:
#TODO implement forwarding to next form (scheduler)
- return AgentOutlookMailCrawl(self.agent, "Scheduled Mail Crawling not implemented yet.")
-
+ return AgentOutlookMailCrawl(self.agent, "Scheduled Mail Crawling not implemented yet.")
+
else:
- return AgentOutlookMailCrawl(self.agent, "An error occurred: form data has been empty.")
+ return AgentOutlookMailCrawl(self.agent, "An error occurred: form data has been empty.")
return AgentOutlookMailCrawl(self.agent, "Crawl Job settings have been saved.")
-
+
def defMailCrawl(self, mail_collection, index, params, context):
"""Save and Forward the mail collection to a page view."""
if DEBUG:
print "====> seting and saving mails to disk"
- print "====> agent base dir: ",self.agent.tempdir
+ print "====> agent base dir: ",self.agent.tempdir
tmpdir = tempfile.mkdtemp(prefix='mailJob_%i_'%(index), dir=self.agent.tempdir)
if DEBUG:
print "====> outlook job dir: ", tmpdir
@@ -312,7 +324,7 @@ class AgentHome(rend.Page):
# Idea could be a object that stores all current paths and
# their crawlIDs
os.write(tmpfile[0], cPickle.dumps(elem))
- os.close(tmpfile[0])
+ os.close(tmpfile[0])
filenum = filenum + 1
return RessourceView(self.agent, mail_collection, "The collected mails have been saved in %s"%(tmpdir), tmpdir)
@@ -331,7 +343,7 @@ class AgentHome(rend.Page):
Returns page object which displays the available information.
"""
- selected_item = ((IRequest(context).uri).split("?"))[1]
+ selected_item = ((IRequest(context).uri).split("?"))[1]
form = IRequest(context).args
if form != {}:
requested_file=""
@@ -346,7 +358,7 @@ class AgentHome(rend.Page):
if elem.startswith(("%i_mail_"%(int(selected_item))), 0):
requested_file = elem
requested_file = os.path.join(form['ressourceObjData'][0], requested_file)
- if requested_file.find("mail") > 0:
+ if requested_file.find("mail") > 0:
fp = open(requested_file, "rb")
mail_parser = email.Parser.Parser()
mailobj = OutlookResource(mail_parser.parse(fp))
@@ -359,7 +371,7 @@ class AgentHome(rend.Page):
mail.append(elem)
if hasattr(mailobj.data, 'preamble'):
if DEBUG:
- print "====> copying preamble contents"
+ print "====> copying preamble contents"
mail.append(['Preamble', mailobj.data.preamble])
else:
mail.append(['Preamble',''])
@@ -372,7 +384,7 @@ class AgentHome(rend.Page):
return OutlookMailDetail(agent=self.agent, pagemessage="", mail=mail, filename=requested_file)
elif requested_file.find("file") > 0:
#TODO implement file analyzing
- return FileObjectDetail(agent=self.agent, pagemessage="", fileobj=fileobj, filename=requested_file)
+ return FileObjectDetail(agent=self.agent, pagemessage="", fileobj=fileobj, filename=requested_file)
if os.path.isdir(selected_item):
# selected item is a folder -> change to that folder
if DEBUG:
@@ -421,7 +433,7 @@ class AgentHome(rend.Page):
def render_header_fragment(self, context, data):
return context.tag[HeaderFragment(data)]
-
+
class FooterFragment(rend.Fragment):
docFactory = template('footer.html')
@@ -437,7 +449,7 @@ class TopFragment(rend.Fragment):
class HeaderFragment(rend.Fragment):
docFactory = template('header.html')
-
+
# subpages of AgentHome
class JobOverView(rend.Page):
@@ -445,7 +457,7 @@ class JobOverView(rend.Page):
"""Builds page that lists all currently registered jobs.
Instance variables:
- agent -- agent object where config and tempdir attributes can be accessed
+ agent -- agent object where config and tempdir attributes can be accessed
Class methods:
At the moment all methods of this class except the __init__
@@ -454,7 +466,7 @@ class JobOverView(rend.Page):
__init__ -- Store the initial settings retrieved from AgentHome.
"""
-
+
docFactory = template('joblisting.html')
def __init__(self, agent=None):
@@ -462,7 +474,7 @@ class JobOverView(rend.Page):
self.agent = agent
# rendering methods of job overview
-
+
def data_displayViewForm(self, context, data):
return "Overview of all running Crawling jobs"
@@ -536,7 +548,7 @@ class JobOverView(rend.Page):
class JobOverViewDetails(rend.Page):
-
+
"""Builds page that displays detailed information about a selected job.
Instance variables:
@@ -574,7 +586,7 @@ class JobOverViewDetails(rend.Page):
print "[render_displayJobDetails] usermode: ", self.agent.config.ui.web.usermode
print "*******************************************************"
- if self.selected_index != None:
+ if self.selected_index != None:
job_detailtable = [tags.tr
[
tags.td[tags.b[parameter[0]]],
@@ -598,7 +610,7 @@ class JobOverViewDetails(rend.Page):
class RessourceView(rend.Page):
-
+
"""Builds page that displays an overview of all collected mails.
Instance variables:
@@ -701,7 +713,7 @@ class RessourceView(rend.Page):
tags.th["Date modified"],
tags.th["Filetype"]
]
- ]
+ ]
elif isinstance(self.ressource_collection[0], FileResource):
if DEBUG:
print "====> instance is a FileResource"
@@ -713,7 +725,7 @@ class RessourceView(rend.Page):
tags.th["Date modified"],
tags.th["Filetype"]
]
- ]
+ ]
elif isinstance(self.ressource_collection[0], OutlookResource):
if DEBUG:
print "====> instance is a OutlookResource"
@@ -725,7 +737,7 @@ class RessourceView(rend.Page):
tags.th["Recipient"],
tags.th["Date"]
]
- ]
+ ]
# raise exception here?
return "could not find a matching object type"
@@ -736,7 +748,7 @@ class RessourceView(rend.Page):
print "====> building ressource with ressource_collection"
index = 0
ressource_table = []
- if isinstance(self.ressource_collection[0],OutlookResource):
+ if isinstance(self.ressource_collection[0],OutlookResource):
for ressourceObject in self.ressource_collection:
ressource_table.append(tags.form(name="ressourceEntry%i"%(index), action="viewRessourceDetails?%i"%(index), method="POST")[
tags.input(name="ressourceObjData", type="hidden", value="%s"%(self.temp_dir)),
@@ -765,7 +777,7 @@ class RessourceView(rend.Page):
if isinstance(self.ressource_collection[0],FileResource):
#TODO: implement building the table for file objects
return ressource_table
-
+
else:
if DEBUG:
print "====> building ressource by analyzing submitted dir"
@@ -797,7 +809,7 @@ class RessourceView(rend.Page):
tags.td[files_in_subdir]
]
)
-
+
elif os.path.isfile(element):
if elem.find("file") > 0:
if DEBUG:
@@ -866,7 +878,7 @@ class RessourceView(rend.Page):
class AgentOutlookMailCrawl(rend.Page):
-
+
"""Builds page where an Outlook Mail Crawler can be configured and run.
Instance variables:
@@ -924,7 +936,7 @@ class AgentOutlookMailCrawl(rend.Page):
class AgentFilesystemCrawl(rend.Page):
-
+
"""Builds page where an Filesystem Crawler can be configured and run.
Instance variables:
@@ -981,7 +993,7 @@ class AgentFilesystemCrawl(rend.Page):
class OutlookMailDetail(rend.Page):
-
+
"""Builds page that displays the selected mail in detail.
Instance variables:
@@ -997,7 +1009,7 @@ class OutlookMailDetail(rend.Page):
__init__ -- Store the mail collection object and the pagemessage
"""
-
+
docFactory = template('mail_detailed.html')
def __init__(self, agent=None, pagemessage="", mail=[], filename=""):
@@ -1032,7 +1044,7 @@ class OutlookMailDetail(rend.Page):
]
)
return mail_view
-
+
def render_footer_fragment(self, context, data):
return context.tag[FooterFragment(data)]
@@ -1044,4 +1056,4 @@ class OutlookMailDetail(rend.Page):
def render_header_fragment(self, context, data):
return context.tag[HeaderFragment(data)]
-
+