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()
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)