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) |