Mercurial > treepkg > treepkg
annotate treepkg/web.py @ 459:31874ce6d621
Filter deprecation warnings from cherrypy in a more specific way
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Wed, 25 Aug 2010 08:48:58 +0000 |
parents | 18c175c28077 |
children |
rev | line source |
---|---|
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
2 # Authors: |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
3 # Bernhard Herzog <bh@intevation.de> |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
4 # |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
5 # This program is free software under the GPL (>=v2) |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
6 # Read the file COPYING coming with the software for details. |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
7 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
8 import os |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
9 import shutil |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
10 import re |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
11 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
12 from genshi.template import TemplateLoader |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
13 |
454
18c175c28077
Do not show warnings caused by using cherrypy
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
14 # TODO see issue #1557 eliminate the dependency on cherrypy |
18c175c28077
Do not show warnings caused by using cherrypy
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
15 # For now just ignore the warnings caused by cherrypy |
18c175c28077
Do not show warnings caused by using cherrypy
Andre Heinecke <aheinecke@intevation.de>
parents:
443
diff
changeset
|
16 import warnings |
459
31874ce6d621
Filter deprecation warnings from cherrypy in a more specific way
Andre Heinecke <aheinecke@intevation.de>
parents:
454
diff
changeset
|
17 warnings.filterwarnings("ignore", "the md5 module is deprecated", |
31874ce6d621
Filter deprecation warnings from cherrypy in a more specific way
Andre Heinecke <aheinecke@intevation.de>
parents:
454
diff
changeset
|
18 category=DeprecationWarning, module=__name__) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
19 import cherrypy |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
20 from cherrypy import expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
21 from cherrypy.lib import cptools |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
22 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
23 import report |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
24 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
25 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
26 class Status(object): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
27 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
28 """Implements the tree packager status pages""" |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
29 |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
30 def __init__(self, treepkg_config, template, logs): |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
31 self.treepkg_config = treepkg_config |
152
4adcb15cbdfb
Let the user supply the filename of the template to use for the status page.
Bernhard Herzog <bh@intevation.de>
parents:
150
diff
changeset
|
32 self.template = template |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
33 self.logs = logs |
150
879a7e391867
Move the default template for the status web page to the new directory
Bernhard Herzog <bh@intevation.de>
parents:
148
diff
changeset
|
34 self.loader = TemplateLoader([os.path.join(os.path.dirname(__file__), |
879a7e391867
Move the default template for the status web page to the new directory
Bernhard Herzog <bh@intevation.de>
parents:
148
diff
changeset
|
35 os.path.pardir, |
879a7e391867
Move the default template for the status web page to the new directory
Bernhard Herzog <bh@intevation.de>
parents:
148
diff
changeset
|
36 "web")]) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
37 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
38 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
39 def index(self): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
40 group = report.get_packager_group(self.treepkg_config) |
152
4adcb15cbdfb
Let the user supply the filename of the template to use for the status page.
Bernhard Herzog <bh@intevation.de>
parents:
150
diff
changeset
|
41 tmpl = self.loader.load(self.template) |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
42 stream = tmpl.generate(report=report.prepare_report(group, self.logs)) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
43 return stream.render('html') |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
44 |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
45 def determine_log_filename(self, package_track_name, revdir, log_basename): |
148
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
46 """Returns the name of a log file of a revision if it exists""" |
329
e749fe36ece3
Revisions are now handled as strings
Andre Heinecke <aheinecke@intevation.de>
parents:
239
diff
changeset
|
47 if re.match("(?P<revno>[0-9a-f]+)-(?P<rulesrev>[0-9a-f]+)$", revdir): |
e749fe36ece3
Revisions are now handled as strings
Andre Heinecke <aheinecke@intevation.de>
parents:
239
diff
changeset
|
48 revno, rulesrev = map(str, revdir.split("-")) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
49 group = report.get_packager_group(self.treepkg_config) |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
50 for track in group.get_package_tracks(): |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
51 if track.name == package_track_name: |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
52 for revision in track.get_revisions(): |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
53 if (revision.revision == revno |
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
54 and revision.rules_revision == rulesrev): |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
55 for title, filename in revision.list_log_files( |
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
56 self.logs): |
148
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
57 if os.path.basename(filename) == log_basename: |
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
58 return filename |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
59 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
60 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
61 def default(self, *rest): |
148
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
62 """Handles requests for logfiles of the form .../pkg/revno/*""" |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
63 filename = None |
148
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
64 if len(rest) == 3: |
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
65 filename = self.determine_log_filename(*rest) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
66 if filename is not None: |
155
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
67 if filename.endswith(".html"): |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
68 content_type = "text/html" |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
69 else: |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
70 content_type = "text/plain" |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
71 return cptools.serveFile(filename, contentType=content_type) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
72 else: |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
73 raise cherrypy.HTTPError(status="404") |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
74 |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
75 def create_static_site(self, destdir): |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
76 """Creates a static web-page under destdir""" |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
77 # make sure we have an empty destdir |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
78 shutil.rmtree(destdir, True) |
443
464b2947af23
fix: function name is makedirs instead of mkdirs
Bjoern Ricks <bricks@intevation.de>
parents:
442
diff
changeset
|
79 os.makedirs(destdir) |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
80 |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
81 # create the index file |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
82 f = open(os.path.join(destdir, "index.html"), "wt") |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
83 f.write(self.index()) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
84 f.close() |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
85 |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
86 # symlink the build-logs |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
87 group = report.get_packager_group(self.treepkg_config) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
88 for track in group.get_package_tracks(): |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
89 trackdir = os.path.join(destdir, track.name) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
90 for revision in track.get_revisions(): |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
91 revdir = os.path.join(trackdir, |
329
e749fe36ece3
Revisions are now handled as strings
Andre Heinecke <aheinecke@intevation.de>
parents:
239
diff
changeset
|
92 "%s-%s" % (revision.revision, |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
93 revision.rules_revision)) |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
94 if revision.has_build_log(): |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
95 if not os.path.isdir(trackdir): |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
96 os.mkdir(trackdir) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
97 os.mkdir(revdir) |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
98 for title, filename in revision.list_log_files(self.logs): |
148
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
99 os.symlink(filename, |
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
100 os.path.join(revdir, |
25d4949ac2d8
Adapt web.py to use list_log_files when handling log files.
Bernhard Herzog <bh@intevation.de>
parents:
75
diff
changeset
|
101 os.path.basename(filename))) |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
102 |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
103 |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
104 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
105 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
106 class TreePKG(object): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
107 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
108 """Root object for the tree packager web interface""" |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
109 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
110 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
111 def index(self): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
112 raise cherrypy.HTTPRedirect('/status') |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
113 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
114 |
152
4adcb15cbdfb
Let the user supply the filename of the template to use for the status page.
Bernhard Herzog <bh@intevation.de>
parents:
150
diff
changeset
|
115 def runserver(treepkg_config, cherrypy_config, status_template): |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
116 cherrypy.root = TreePKG() |
152
4adcb15cbdfb
Let the user supply the filename of the template to use for the status page.
Bernhard Herzog <bh@intevation.de>
parents:
150
diff
changeset
|
117 cherrypy.root.status = Status(treepkg_config=treepkg_config, |
4adcb15cbdfb
Let the user supply the filename of the template to use for the status page.
Bernhard Herzog <bh@intevation.de>
parents:
150
diff
changeset
|
118 template=status_template) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
119 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
120 cherrypy.config.update(file=cherrypy_config) |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
121 cherrypy.server.start() |