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