1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
import types
from xen.xend import sxp
from xen.xend import PrettyPrint
from xen.xend.Args import ArgError
from xen.xend.XendError import XendError
#from xen.xend.XendLogging import log
import resource
import http
from xen.web.SrvBase import SrvBase
class SrvConstructor:
"""Delayed constructor for sub-servers.
Does not import the sub-server class or create the object until needed.
"""
def __init__(self, klass):
"""Create a constructor. It is assumed that the class
should be imported as 'from xen.xend.server.klass import klass'.
klass name of its class
"""
self.klass = klass
self.obj = None
def getobj(self):
"""Get the sub-server object, importing its class and instantiating it if
necessary.
"""
if not self.obj:
exec 'from xen.xend.server.%s import %s' % (self.klass, self.klass)
klassobj = eval(self.klass)
self.obj = klassobj()
return self.obj
class SrvDir(SrvBase):
"""Base class for directory servlets.
"""
isLeaf = False
def __init__(self):
SrvBase.__init__(self)
self.table = {}
self.order = []
def noChild(self, msg):
return resource.ErrorPage(http.NOT_FOUND, msg=msg)
def getChild(self, x, req):
if x == '': return self
try:
val = self.get(x)
except XendError, ex:
return self.noChild(str(ex))
if val is None:
return self.noChild('Not found: ' + str(x))
else:
return val
def get(self, x):
val = self.table.get(x)
if isinstance(val, SrvConstructor):
val = val.getobj()
return val
def add(self, x, v=None):
if v is None:
v = 'SrvDir'
if isinstance(v, types.StringType):
v = SrvConstructor(v)
self.table[x] = v
self.order.append(x)
return v
def render_GET(self, req):
try:
if self.use_sxp(req):
req.setHeader("Content-type", sxp.mime_type)
self.ls(req, 1)
else:
req.write('<html><head></head><body>')
self.print_path(req)
self.ls(req)
self.form(req)
req.write('</body></html>')
return ''
except Exception, ex:
self._perform_err(ex, "GET", req)
def ls(self, req, use_sxp=0):
url = req.prePathURL()
if not url.endswith('/'):
url += '/'
if use_sxp:
req.write('(ls ')
for k in self.order:
req.write(' ' + k)
req.write(')')
else:
req.write('<ul>')
for k in self.order:
v = self.get(k)
req.write('<li><a href="%s%s">%s</a></li>'
% (url, k, k))
req.write('</ul>')
def form(self, req):
pass
|