24
24
import VirtualDevice
26
from XMLBuilderDomain import _xml_property
26
27
from virtinst import _virtinst as _
29
def _get_mode_prop(channel_type):
30
xpath = "./channel[@name='%s']/@mode" % channel_type
32
return s._channels.get(channel_type, None)
34
s._channels[channel_type] = val
35
return _xml_property(get_mode, set_mode, xpath=xpath)
28
37
class VirtualGraphics(VirtualDevice.VirtualDevice):
30
39
_virtual_device_type = VirtualDevice.VirtualDevice.VIRTUAL_DEV_GRAPHICS
45
types = [TYPE_VNC, TYPE_SDL, TYPE_RDP, TYPE_SPICE]
47
CHANNEL_TYPE_MAIN = "main"
48
CHANNEL_TYPE_DISPLAY = "display"
49
CHANNEL_TYPE_INPUTS = "inputs"
50
CHANNEL_TYPE_CURSOR = "cursor"
51
CHANNEL_TYPE_PLAYBACK = "playback"
52
CHANNEL_TYPE_RECORD = "record"
53
channel_types = [CHANNEL_TYPE_MAIN, CHANNEL_TYPE_DISPLAY,
54
CHANNEL_TYPE_INPUTS, CHANNEL_TYPE_CURSOR,
55
CHANNEL_TYPE_PLAYBACK, CHANNEL_TYPE_RECORD]
57
CHANNEL_MODE_SECURE = "secure"
58
CHANNEL_MODE_INSECURE = "insecure"
59
CHANNEL_MODE_ANY = "any"
60
channel_modes = [CHANNEL_MODE_SECURE, CHANNEL_MODE_INSECURE,
35
63
KEYMAP_LOCAL = "local"
64
KEYMAP_DEFAULT = "default"
65
_special_keymaps = [KEYMAP_LOCAL, KEYMAP_DEFAULT]
70
Return a list of valid keymap values.
74
orig_list = keytable.keytable.values()
79
if k not in sort_list:
37
84
def __init__(self, type=TYPE_VNC, port=-1, listen=None, passwd=None,
38
keymap=None, conn=None):
40
VirtualDevice.VirtualDevice.__init__(self, conn=conn)
42
if type != self.TYPE_VNC and type != self.TYPE_SDL:
43
raise ValueError(_("Unknown graphics type"))
85
keymap=KEYMAP_DEFAULT, conn=None, parsexml=None,
86
parsexmlnode=None, tlsPort=-1, channels=None,
87
caps=None, passwdValidTo=None):
89
VirtualDevice.VirtualDevice.__init__(self, conn,
90
parsexml, parsexmlnode, caps)
47
95
self._listen = None
48
96
self._passwd = None
97
self._passwdValidTo = None
49
98
self._keymap = None
52
self.set_keymap(keymap)
53
self.set_listen(listen)
54
self.set_passwd(passwd)
109
self.tlsPort = tlsPort
113
self.passwdValidTo = passwdValidTo
115
self.channels = channels
56
118
def _default_keymap(self):
64
126
def get_type(self):
66
type = property(get_type)
128
def set_type(self, val):
129
if val not in self.types:
130
raise ValueError(_("Unknown graphics type"))
133
type = _xml_property(get_type, set_type,
136
def _get_xauth(self):
138
def _set_xauth(self, val):
140
xauth = _xml_property(_get_xauth, _set_xauth,
143
def _get_display(self):
145
def _set_display(self, val):
147
display = _xml_property(_get_display, _set_display,
68
150
def get_keymap(self):
151
if self._keymap == self.KEYMAP_DEFAULT:
152
return self._default_keymap()
153
if self._keymap == self.KEYMAP_LOCAL:
154
return _util.default_keymap()
69
155
return self._keymap
70
156
def set_keymap(self, val):
72
val = self._default_keymap()
157
# At this point, 'None' is a valid value
75
# At this point, 'None' is a valid value
162
if val in self._special_keymaps:
76
163
self._keymap = val
79
if type(val) != type("string"):
80
raise ValueError, _("Keymap must be a string")
166
if type(val) is not str:
167
raise ValueError(_("Keymap must be a string"))
82
168
if val.lower() == self.KEYMAP_LOCAL:
83
169
val = _util.default_keymap()
84
170
elif len(val) > 16:
85
raise ValueError, _("Keymap must be less than 16 characters")
171
raise ValueError(_("Keymap must be less than 16 characters"))
86
172
elif re.match("^[a-zA-Z0-9_-]*$", val) == None:
87
raise ValueError, _("Keymap can only contain alphanumeric, '_', or '-' characters")
173
raise ValueError(_("Keymap can only contain alphanumeric, "
174
"'_', or '-' characters"))
89
176
self._keymap = val
90
keymap = property(get_keymap, set_keymap)
177
keymap = _xml_property(get_keymap, set_keymap,
92
180
def get_port(self):
94
182
def set_port(self, val):
97
elif type(val) is not int \
98
or (val != -1 and (val < 5900 or val > 65535)):
99
raise ValueError, _("VNC port must be a number between 5900 and 65535, or -1 for auto allocation")
191
if (type(val) is not int or
192
(val != -1 and (val < 5900 or val > 65535))):
193
raise ValueError(_("VNC port must be a number between "
194
"5900 and 65535, or -1 for auto allocation"))
101
port = property(get_port, set_port)
196
port = _xml_property(get_port, set_port,
197
get_converter=lambda s, x: int(x or -1),
103
200
def get_listen(self):
104
201
return self._listen
105
202
def set_listen(self, val):
106
203
self._listen = val
107
listen = property(get_listen, set_listen)
204
listen = _xml_property(get_listen, set_listen,
109
207
def get_passwd(self):
110
208
return self._passwd
111
209
def set_passwd(self, val):
112
210
self._passwd = val
113
passwd = property(get_passwd, set_passwd)
115
def valid_keymaps(self):
117
Return a list of valid keymap values.
121
orig_list = keytable.keytable.values()
126
if k not in sort_list:
211
passwd = _xml_property(get_passwd, set_passwd,
214
def get_passwdValidTo(self):
215
return self._passwdValidTo
216
def set_passwdValidTo(self, val):
217
self._passwdValidTo = val
218
passwdValidTo = _xml_property(get_passwdValidTo, set_passwdValidTo,
219
xpath="./@passwdValidTo")
221
def _get_socket(self):
223
def _set_socket(self, val):
225
socket = _xml_property(_get_socket, _set_socket,
228
def get_tlsPort(self):
230
def set_tlsPort(self, val):
239
if (type(val) is not int or
240
(val != -1 and (val < 5900 or val > 65535))):
241
raise ValueError(_("TLS port must be a number between "
242
"5900 and 65535, or -1 for auto allocation"))
244
tlsPort = _xml_property(get_tlsPort, set_tlsPort,
245
get_converter=lambda s, x: int(x or -1),
248
channel_main_mode = _get_mode_prop(CHANNEL_TYPE_MAIN)
249
channel_display_mode = _get_mode_prop(CHANNEL_TYPE_DISPLAY)
250
channel_inputs_mode = _get_mode_prop(CHANNEL_TYPE_INPUTS)
251
channel_cursor_mode = _get_mode_prop(CHANNEL_TYPE_CURSOR)
252
channel_playback_mode = _get_mode_prop(CHANNEL_TYPE_PLAYBACK)
253
channel_record_mode = _get_mode_prop(CHANNEL_TYPE_RECORD)
255
def _build_xml(self, port=None, listen=None, keymap=None, passwd=None,
256
display=None, xauth=None, tlsPort=None, autoport=False,
257
passwdValidTo=None, socket=None):
259
doautoport = (autoport and (port == -1 or tlsPort == -1))
260
portxml = (port != None and (" port='%d'" % port) or "")
261
tlsportxml = (tlsPort != None and (" tlsPort='%d'" % tlsPort) or "")
262
autoportxml = (doautoport and " autoport='yes'" or "")
264
keymapxml = (keymap and (" keymap='%s'" % keymap) or "")
265
listenxml = (listen and (" listen='%s'" % listen) or "")
266
passwdxml = (passwd and (" passwd='%s'" % passwd) or "")
267
passwdValidToxml = (passwdValidTo and
268
( "passwdValidTo='%s'" % passwdValidTo) or "")
270
xauthxml = (xauth and (" xauth='%s'" % xauth) or "")
271
displayxml = (display and (" display='%s'" % display) or "")
273
socketxml = (socket and (" socket='%s'" % socket) or "")
276
"<graphics type='%s'" % self.type +
131
290
def _sdl_config(self):
132
if not os.environ.has_key("DISPLAY"):
291
if "DISPLAY" not in os.environ and not self.display:
133
292
raise RuntimeError("No DISPLAY environment variable set.")
135
disp = os.environ["DISPLAY"]
136
xauth = os.path.expanduser("~/.Xauthority")
138
return """ <graphics type='sdl' display='%s' xauth='%s'/>""" % \
141
def get_xml_config(self):
294
disp = self.display or os.environ["DISPLAY"]
295
xauth = self.xauth or os.path.expanduser("~/.Xauthority")
297
return self._build_xml(display=disp, xauth=xauth)
299
def _spice_config(self):
300
return self._build_xml(port=self.port, keymap=self.keymap,
301
passwd=self.passwd, listen=self.listen,
302
tlsPort=self.tlsPort, autoport=True,
303
passwdValidTo=self.passwdValidTo)
305
def _vnc_config(self):
306
return self._build_xml(port=self.port, keymap=self.keymap,
307
passwd=self.passwd, listen=self.listen,
308
passwdValidTo=self.passwdValidTo,
311
def _get_xml_config(self):
142
312
if self._type == self.TYPE_SDL:
143
313
return self._sdl_config()
148
keymapxml = " keymap='%s'" % self._keymap
150
listenxml = " listen='%s'" % self._listen
152
passwdxml = " passwd='%s'" % self._passwd
153
xml = " <graphics type='vnc' " + \
154
"port='%(port)d'" % { "port" : self._port } + \
155
"%(keymapxml)s" % { "keymapxml" : keymapxml } + \
156
"%(listenxml)s" % { "listenxml" : listenxml } + \
157
"%(passwdxml)s" % { "passwdxml" : passwdxml } + \
314
if self._type == self.TYPE_SPICE:
315
return self._spice_config()
316
if self._type == self.TYPE_VNC:
317
return self._vnc_config()
319
raise ValueError(_("Unknown graphics type"))