make runnable on Linux (ignore win imports conditionally); avoid hard-coded path and port setting
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2105 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
999c25bf0b
commit
eee4e198c0
3 changed files with 96 additions and 77 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -3,36 +3,36 @@
|
|||
<div class="body">
|
||||
|
||||
<div class="content even menu-1">
|
||||
<a href="http://localhost:8080" class="">Startpage</a>
|
||||
<a href="/" class="">Startpage</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-2">Agent configuration</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/joboverview" class="">
|
||||
<a href="/joboverview" class="">
|
||||
job overview
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/collectOutlookMails" class="">
|
||||
<a href="/collectOutlookMails" class="">
|
||||
add outlook crawl job
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/collectFilesystem" class="">
|
||||
<a href="/collectFilesystem" class="">
|
||||
add filesystem crawl job</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/viewRessources" class="">
|
||||
<a href="/viewRessources" class="">
|
||||
view collected ressources
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="content odd menu-3">
|
||||
<a href="http://localhost:8080/loggingoptions" class="" title="">
|
||||
<a href="/loggingoptions" class="" title="">
|
||||
logging options
|
||||
</a>
|
||||
</div>
|
||||
|
|
150
agent/ui/web.py
150
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)]
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue