aboutsummaryrefslogtreecommitdiffstats
path: root/tools/python/xen/xend/xenstore/xsresource.py
blob: 37011bdea3c6a0311ef2d82c49bef659d16ef99a (plain)
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()