Statistics
| Branch: | Revision:

root / QMP / qom-fuse @ 992aeb8e

History | View | Annotate | Download (4.3 kB)

1 5ade7674 Anthony Liguori
#!/usr/bin/python
2 5ade7674 Anthony Liguori
##
3 5ade7674 Anthony Liguori
# QEMU Object Model test tools
4 5ade7674 Anthony Liguori
#
5 5ade7674 Anthony Liguori
# Copyright IBM, Corp. 2012
6 5ade7674 Anthony Liguori
#
7 5ade7674 Anthony Liguori
# Authors:
8 5ade7674 Anthony Liguori
#  Anthony Liguori   <aliguori@us.ibm.com>
9 5ade7674 Anthony Liguori
#
10 5ade7674 Anthony Liguori
# This work is licensed under the terms of the GNU GPL, version 2 or later.  See
11 5ade7674 Anthony Liguori
# the COPYING file in the top-level directory.
12 5ade7674 Anthony Liguori
##
13 5ade7674 Anthony Liguori
14 5ade7674 Anthony Liguori
import fuse, stat
15 5ade7674 Anthony Liguori
from fuse import Fuse
16 5ade7674 Anthony Liguori
import os, posix
17 5ade7674 Anthony Liguori
from errno import *
18 5ade7674 Anthony Liguori
from qmp import QEMUMonitorProtocol
19 5ade7674 Anthony Liguori
20 5ade7674 Anthony Liguori
fuse.fuse_python_api = (0, 2)
21 5ade7674 Anthony Liguori
22 5ade7674 Anthony Liguori
class QOMFS(Fuse):
23 5ade7674 Anthony Liguori
    def __init__(self, qmp, *args, **kwds):
24 5ade7674 Anthony Liguori
        Fuse.__init__(self, *args, **kwds)
25 5ade7674 Anthony Liguori
        self.qmp = qmp
26 5ade7674 Anthony Liguori
        self.qmp.connect()
27 5ade7674 Anthony Liguori
        self.ino_map = {}
28 5ade7674 Anthony Liguori
        self.ino_count = 1
29 5ade7674 Anthony Liguori
30 5ade7674 Anthony Liguori
    def get_ino(self, path):
31 5ade7674 Anthony Liguori
        if self.ino_map.has_key(path):
32 5ade7674 Anthony Liguori
            return self.ino_map[path]
33 5ade7674 Anthony Liguori
        self.ino_map[path] = self.ino_count
34 5ade7674 Anthony Liguori
        self.ino_count += 1
35 5ade7674 Anthony Liguori
        return self.ino_map[path]
36 5ade7674 Anthony Liguori
37 5ade7674 Anthony Liguori
    def is_object(self, path):
38 5ade7674 Anthony Liguori
        try:
39 5ade7674 Anthony Liguori
            items = self.qmp.command('qom-list', path=path)
40 5ade7674 Anthony Liguori
            return True
41 5ade7674 Anthony Liguori
        except:
42 5ade7674 Anthony Liguori
            return False
43 5ade7674 Anthony Liguori
44 5ade7674 Anthony Liguori
    def is_property(self, path):
45 5ade7674 Anthony Liguori
        try:
46 5ade7674 Anthony Liguori
            path, prop = path.rsplit('/', 1)
47 5ade7674 Anthony Liguori
            for item in self.qmp.command('qom-list', path=path):
48 5ade7674 Anthony Liguori
                if item['name'] == prop:
49 5ade7674 Anthony Liguori
                    return True
50 5ade7674 Anthony Liguori
            return False
51 5ade7674 Anthony Liguori
        except:
52 5ade7674 Anthony Liguori
            return False
53 5ade7674 Anthony Liguori
54 5ade7674 Anthony Liguori
    def is_link(self, path):
55 5ade7674 Anthony Liguori
        try:
56 5ade7674 Anthony Liguori
            path, prop = path.rsplit('/', 1)
57 5ade7674 Anthony Liguori
            for item in self.qmp.command('qom-list', path=path):
58 5ade7674 Anthony Liguori
                if item['name'] == prop:
59 5ade7674 Anthony Liguori
                    if item['type'].startswith('link<'):
60 5ade7674 Anthony Liguori
                        return True
61 5ade7674 Anthony Liguori
                    return False
62 5ade7674 Anthony Liguori
            return False
63 5ade7674 Anthony Liguori
        except:
64 5ade7674 Anthony Liguori
            return False
65 5ade7674 Anthony Liguori
66 5ade7674 Anthony Liguori
    def read(self, path, length, offset):
67 5ade7674 Anthony Liguori
        if not self.is_property(path):
68 5ade7674 Anthony Liguori
            return -ENOENT
69 5ade7674 Anthony Liguori
70 5ade7674 Anthony Liguori
        path, prop = path.rsplit('/', 1)
71 5ade7674 Anthony Liguori
        try:
72 5ade7674 Anthony Liguori
            data = str(self.qmp.command('qom-get', path=path, property=prop))
73 5ade7674 Anthony Liguori
            data += '\n' # make values shell friendly
74 5ade7674 Anthony Liguori
        except:
75 5ade7674 Anthony Liguori
            return -EPERM
76 5ade7674 Anthony Liguori
77 5ade7674 Anthony Liguori
        if offset > len(data):
78 5ade7674 Anthony Liguori
            return ''
79 5ade7674 Anthony Liguori
80 5ade7674 Anthony Liguori
        return str(data[offset:][:length])
81 5ade7674 Anthony Liguori
82 5ade7674 Anthony Liguori
    def readlink(self, path):
83 5ade7674 Anthony Liguori
        if not self.is_link(path):
84 5ade7674 Anthony Liguori
            return False
85 5ade7674 Anthony Liguori
        path, prop = path.rsplit('/', 1)
86 5ade7674 Anthony Liguori
        prefix = '/'.join(['..'] * (len(path.split('/')) - 1))
87 5ade7674 Anthony Liguori
        return prefix + str(self.qmp.command('qom-get', path=path,
88 5ade7674 Anthony Liguori
                                             property=prop))
89 5ade7674 Anthony Liguori
90 5ade7674 Anthony Liguori
    def getattr(self, path):
91 5ade7674 Anthony Liguori
        if self.is_link(path):
92 5ade7674 Anthony Liguori
            value = posix.stat_result((0755 | stat.S_IFLNK,
93 5ade7674 Anthony Liguori
                                       self.get_ino(path),
94 5ade7674 Anthony Liguori
                                       0,
95 5ade7674 Anthony Liguori
                                       2,
96 5ade7674 Anthony Liguori
                                       1000,
97 5ade7674 Anthony Liguori
                                       1000,
98 5ade7674 Anthony Liguori
                                       4096,
99 5ade7674 Anthony Liguori
                                       0,
100 5ade7674 Anthony Liguori
                                       0,
101 5ade7674 Anthony Liguori
                                       0))
102 5ade7674 Anthony Liguori
        elif self.is_object(path):
103 5ade7674 Anthony Liguori
            value = posix.stat_result((0755 | stat.S_IFDIR,
104 5ade7674 Anthony Liguori
                                       self.get_ino(path),
105 5ade7674 Anthony Liguori
                                       0,
106 5ade7674 Anthony Liguori
                                       2,
107 5ade7674 Anthony Liguori
                                       1000,
108 5ade7674 Anthony Liguori
                                       1000,
109 5ade7674 Anthony Liguori
                                       4096,
110 5ade7674 Anthony Liguori
                                       0,
111 5ade7674 Anthony Liguori
                                       0,
112 5ade7674 Anthony Liguori
                                       0))
113 5ade7674 Anthony Liguori
        elif self.is_property(path):
114 5ade7674 Anthony Liguori
            value = posix.stat_result((0644 | stat.S_IFREG,
115 5ade7674 Anthony Liguori
                                       self.get_ino(path),
116 5ade7674 Anthony Liguori
                                       0,
117 5ade7674 Anthony Liguori
                                       1,
118 5ade7674 Anthony Liguori
                                       1000,
119 5ade7674 Anthony Liguori
                                       1000,
120 5ade7674 Anthony Liguori
                                       4096,
121 5ade7674 Anthony Liguori
                                       0,
122 5ade7674 Anthony Liguori
                                       0,
123 5ade7674 Anthony Liguori
                                       0))
124 5ade7674 Anthony Liguori
        else:
125 5ade7674 Anthony Liguori
            value = -ENOENT
126 5ade7674 Anthony Liguori
        return value
127 5ade7674 Anthony Liguori
128 5ade7674 Anthony Liguori
    def readdir(self, path, offset):
129 5ade7674 Anthony Liguori
        yield fuse.Direntry('.')
130 5ade7674 Anthony Liguori
        yield fuse.Direntry('..')
131 5ade7674 Anthony Liguori
        for item in self.qmp.command('qom-list', path=path):
132 5ade7674 Anthony Liguori
            yield fuse.Direntry(str(item['name']))
133 5ade7674 Anthony Liguori
134 5ade7674 Anthony Liguori
if __name__ == '__main__':
135 5ade7674 Anthony Liguori
    import sys, os
136 5ade7674 Anthony Liguori
137 5ade7674 Anthony Liguori
    fs = QOMFS(QEMUMonitorProtocol(os.environ['QMP_SOCKET']))
138 5ade7674 Anthony Liguori
    fs.main(sys.argv)