Mercurial > treepkg > treepkg
annotate treepkg/web.py @ 442:c29714c601da
use os.mkdirs to create static web directory to get rid of noisy errors if a build machine is rebooted and tmp dir is cleaned
author | Bjoern Ricks <bricks@intevation.de> |
---|---|
date | Fri, 06 Aug 2010 14:27:01 +0000 |
parents | ef87d30468b6 |
children | 464b2947af23 |
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 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
14 import cherrypy |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
15 from cherrypy import expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
16 from cherrypy.lib import cptools |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
17 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
18 import report |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
19 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
20 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
21 class Status(object): |
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 """Implements the tree packager status pages""" |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
24 |
372
ef87d30468b6
Added the option to expose additional log files from the log directory.
Andre Heinecke <aheinecke@intevation.de>
parents:
329
diff
changeset
|
25 def __init__(self, treepkg_config, template, logs): |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
26 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
|
27 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
|
28 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
|
29 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
|
30 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
|
31 "web")]) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
32 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
33 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
34 def index(self): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
35 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
|
36 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
|
37 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
|
38 return stream.render('html') |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
39 |
239
99be67db8a12
Add the rules revision number to the filenames used by the web status
Bernhard Herzog <bh@intevation.de>
parents:
155
diff
changeset
|
40 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
|
41 """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
|
42 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
|
43 revno, rulesrev = map(str, revdir.split("-")) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
44 group = report.get_packager_group(self.treepkg_config) |
52
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
45 for track in group.get_package_tracks(): |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
46 if track.name == package_track_name: |
78cf5f6778ec
Rename 'packagel ine' -> 'package track'
Bernhard Herzog <bh@intevation.de>
parents:
20
diff
changeset
|
47 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
|
48 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
|
49 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
|
50 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
|
51 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
|
52 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
|
53 return filename |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
54 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
55 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
56 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
|
57 """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
|
58 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
|
59 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
|
60 filename = self.determine_log_filename(*rest) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
61 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
|
62 if filename.endswith(".html"): |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
63 content_type = "text/html" |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
64 else: |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
65 content_type = "text/plain" |
236e91be522c
Serve log files ending with .html as text/html
Bernhard Herzog <bh@intevation.de>
parents:
152
diff
changeset
|
66 return cptools.serveFile(filename, contentType=content_type) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
67 else: |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
68 raise cherrypy.HTTPError(status="404") |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
69 |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
70 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
|
71 """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
|
72 # 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
|
73 shutil.rmtree(destdir, True) |
442
c29714c601da
use os.mkdirs to create static web directory to get rid of noisy errors if a build machine is rebooted and tmp dir is cleaned
Bjoern Ricks <bricks@intevation.de>
parents:
372
diff
changeset
|
74 os.mkdirs(destdir) |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
75 |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
76 # create the index file |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
77 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
|
78 f.write(self.index()) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
79 f.close() |
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 # symlink the build-logs |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
82 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
|
83 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
|
84 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
|
85 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
|
86 revdir = os.path.join(trackdir, |
329
e749fe36ece3
Revisions are now handled as strings
Andre Heinecke <aheinecke@intevation.de>
parents:
239
diff
changeset
|
87 "%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
|
88 revision.rules_revision)) |
64
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
89 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
|
90 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
|
91 os.mkdir(trackdir) |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 |
2ff966839859
web: add method to create a static status web-site
Bernhard Herzog <bh@intevation.de>
parents:
52
diff
changeset
|
98 |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
99 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
100 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
101 class TreePKG(object): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
102 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
103 """Root object for the tree packager web interface""" |
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 @expose |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
106 def index(self): |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
107 raise cherrypy.HTTPRedirect('/status') |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
108 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
109 |
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
|
110 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
|
111 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
|
112 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
|
113 template=status_template) |
20
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
114 |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
115 cherrypy.config.update(file=cherrypy_config) |
467013d9d627
Add simple web interface for status reports
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
116 cherrypy.server.start() |