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
))
20 while not self
.buffer.find('\n') != -1:
21 self
.buffer += self
.s
.recv(1024)
23 line
, self
.buffer = self
.buffer.split('\n', 1)
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'])
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
)
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
)
56 from ConfigParser
import SafeConfigParser
59 class GitConfigParser(SafeConfigParser
):
60 SECTCRE
= re
.compile(r
'\[(?P<header>[^\"]+"[^"]*")\]')
63 def resolve_property(qmp
, value
):
66 components
= value
.split('/')
69 components
= 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('@'):
82 def parse_property(srv
, value
):
85 elif value
== 'False':
87 elif value
[0] in '0123456789-':
90 name
, prop
= resolve_property(srv
, value
)
91 value
= qmp
.plug_get(name
, prop
)
96 qmp
= QmpClient('localhost', 8080)
97 qmp
.qmp_capabilities()
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)
108 qmp
.plug_create(kind
, name
)
110 for section
in cp
.sections():
111 kind
, name
= section
.split(' ', 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:
120 qmp
.plug_create(sys
.argv
[2], sys
.argv
[3])
121 elif command
== 'exit':
123 elif command
== 'set':
124 if len(sys
.argv
) != 4:
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:
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:
143 while path
.endswith('/'):
150 items
= qmp
.plug_list()
152 print '%s/' % item
['id']
154 if path
[1:].find('/') == -1:
155 items
= qmp
.plug_list_props(path
[1:])
157 name
, prop
= resolve_property(qmp
, path
)
158 name
= qmp
.plug_get(name
, prop
)
159 items
= qmp
.plug_list_props(name
)
162 if item
['type'].startswith('plug<'):
163 print '%s/' % item
['name']
164 elif item
['type'].startswith('socket<'):
165 print '@%s/' % item
['name']
167 print '%s' % item
['name']