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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#============================================================================
# Copyright (C) 2005 Mike Wray <mike.wray@hp.com>
#============================================================================
# HTTP interface onto xenstore (read-only).
# Mainly intended for testing.
import os
import os.path
from xen.web.httpserver import HttpServer, UnixHttpServer
from xen.web.SrvBase import SrvBase
from xen.web.SrvDir import SrvDir
from xen.xend.Args import FormFn
from xen.xend.xenstore import XenNode
def pathurl(req):
url = req.prePathURL()
if not url.endswith('/'):
url += '/'
return url
def writelist(req, l):
req.write('(')
for k in l:
req.write(' ' + k)
req.write(')')
def lsData(dbnode, req, url):
v = dbnode.getData()
if v is None:
req.write('<p>No data')
else:
req.write('<p>Data: <pre>')
req.write(str(v))
req.write('</pre>')
v = dbnode.getLock()
if v is None:
req.write("<p>Unlocked")
else:
req.write("<p>Lock = %s" % v)
def lsChildren(dbnode, req, url):
l = dbnode.ls()
if l:
req.write('<p>Children: <ul>')
for key in l:
child = dbnode.getChild(key)
data = child.getData()
if data is None: data = ""
req.write('<li><a href="%(url)s%(key)s">%(key)s</a> %(data)s</li>'
% { "url": url, "key": key, "data": data })
req.write('</ul>')
else:
req.write('<p>No children')
class DBDataResource(SrvBase):
"""Resource for the node data.
"""
def __init__(self, dbnode):
SrvBase.__init__(self)
self.dbnode = dbnode
def render_GET(self, req):
req.write('<html><head></head><body>')
self.print_path(req)
req.write("<pre>")
req.write(self.getData() or self.getNoData())
req.write("</pre>")
req.write('</body></html>')
def getContentType(self):
# Use content-type from metadata.
return "text/plain"
def getData(self):
v = self.dbnode.getData()
if v is None: return v
return str(v)
def getNoData(self):
return ""
class DBNodeResource(SrvDir):
"""Resource for a DB node.
"""
def __init__(self, dbnode):
SrvDir.__init__(self)
self.dbnode = dbnode
def get(self, x):
val = None
if x == "__data__":
val = DBDataResource(self.dbnode)
else:
if self.dbnode.exists(x):
child = self.dbnode.getChild(x, create=False)
else:
child = None
if child is not None:
val = DBNodeResource(child)
return val
def render_POST(self, req):
return self.perform(req)
def ls(self, req, use_sxp=0):
if use_sxp:
writelist(req, self.dbnode.getChildren())
else:
url = pathurl(req)
req.write("<fieldset>")
lsData(self.dbnode, req, url)
lsChildren(self.dbnode, req, url)
req.write("</fieldset>")
def form(self, req):
url = req.prePathURL()
pass
class DBRootResource(DBNodeResource):
"""Resource for the root of a DB.
"""
def __init__(self):
DBNodeResource.__init__(self, XenNode())
def main(argv):
root = SrvDir()
root.putChild('xenstore', DBRootResource())
interface = ''
port = 8003
server = HttpServer(root=root, interface=interface, port=port)
server.run()
|