Add socket character device
[qemu/aliguori.git] / qsh
blob81ab50db8d9b0b6c226ab882a6b107c9fe48989f
1 #!/usr/bin/python
3 import json, socket
4 import sys
6 class QmpException(Exception):
7 def __init__(self, cls, desc):
8 Exception.__init__(self, desc)
10 class QmpClient(object):
11 def __init__(self, host, port):
12 s = socket.socket(socket.AF_INET)
13 s.connect((host, port))
15 self.s = s
16 self.buffer = ''
17 self.readline()
19 def readline(self):
20 while not self.buffer.find('\n') != -1:
21 self.buffer += self.s.recv(1024)
23 line, self.buffer = self.buffer.split('\n', 1)
24 return line
26 def _command(self, _command_name, **args):
27 req = { "execute": _command_name, "arguments": args }
28 self.s.sendall(json.dumps(req))
30 rsp = json.loads(self.readline())
31 if rsp.has_key('error'):
32 raise QmpException(rsp['error']['class'], rsp['error']['desc'])
33 return rsp['return']
35 def qmp_capabilities(self):
36 return self._command('qmp_capabilities')
38 def plug_create(self, typename, name, **args):
39 self._command('plug_create', id=name, type=typename, **args)
41 def plug_list(self):
42 return self._command('plug_list')
44 def plug_get(self, name, propname):
45 return self._command('plug_get', id=name, name=propname)
47 def plug_set(self, name, propname, value):
48 self._command('plug_set', id=name, name=propname, value=value)
50 def plug_list_props(self, name):
51 return self._command('plug_list_props', id=name)
53 def quit(self):
54 self._command('quit')
56 from ConfigParser import SafeConfigParser
57 import re
59 class GitConfigParser(SafeConfigParser):
60 SECTCRE = re.compile(r'\[(?P<header>[^\"]+"[^"]*")\]')
63 def resolve_property(qmp, value):
64 value = value[1:]
66 components = value.split('/')
68 name = components[0]
69 components = components[1:]
71 prop = components[-1]
72 for component in components[:-1]:
73 if component.startswith('@'):
74 component = component[1:]
75 name = qmp.plug_get(name, component)
77 if prop.startswith('@'):
78 prop = prop[1:]
80 return name, prop
82 def parse_property(srv, value):
83 if value == 'True':
84 value = True
85 elif value == 'False':
86 value = False
87 elif value[0] in '0123456789-':
88 value = int(value)
89 elif value[0] == '/':
90 name, prop = resolve_property(srv, value)
91 value = qmp.plug_get(name, prop)
92 elif value[0] == '"':
93 value = value[1:-1]
94 return value
96 qmp = QmpClient('localhost', 8080)
97 qmp.qmp_capabilities()
99 command = sys.argv[1]
101 if command == 'import':
102 cp = GitConfigParser()
103 cp.read([sys.argv[2]])
105 for section in cp.sections():
106 kind, name = section.split(' ', 1)
107 name = name[1:-1]
108 qmp.plug_create(kind, name)
110 for section in cp.sections():
111 kind, name = section.split(' ', 1)
112 name = name[1:-1]
114 for key, value in cp.items(section):
115 value = parse_property(qmp, value)
116 qmp.plug_set(name, key, value)
117 elif command == 'create':
118 if len(sys.argv) != 4:
119 sys.exit(1)
120 qmp.plug_create(sys.argv[2], sys.argv[3])
121 elif command == 'exit':
122 qmp.quit()
123 elif command == 'set':
124 if len(sys.argv) != 4:
125 sys.exit(1)
127 name, prop = resolve_property(qmp, sys.argv[2])
129 value = parse_property(qmp, sys.argv[3])
130 qmp.plug_set(name, prop, value)
131 elif command == 'get':
132 if len(sys.argv) != 3:
133 sys.exit(1)
135 name, prop = resolve_property(qmp, sys.argv[2])
136 print qmp.plug_get(name, prop)
137 elif command == 'ls':
138 if len(sys.argv) != 3:
139 sys.exit(1)
141 path = sys.argv[2]
143 while path.endswith('/'):
144 path = path[:-1]
146 if path == '':
147 path = '/'
149 if path == '/':
150 items = qmp.plug_list()
151 for item in items:
152 print '%s/' % item['id']
153 else:
154 if path[1:].find('/') == -1:
155 items = qmp.plug_list_props(path[1:])
156 else:
157 name, prop = resolve_property(qmp, path)
158 name = qmp.plug_get(name, prop)
159 items = qmp.plug_list_props(name)
161 for item in items:
162 if item['type'].startswith('plug<'):
163 print '%s/' % item['name']
164 elif item['type'].startswith('socket<'):
165 print '@%s/' % item['name']
166 else:
167 print '%s' % item['name']