]>
git.proxmox.com Git - pve-manager.git/blob - www/manager/VNCConsole.js
1 Ext
.define('PVE.noVncConsole', {
2 extend
: 'Ext.panel.Panel',
3 alias
: 'widget.pveNoVncConsole',
9 consoleType
: undefined, // lxc or kvm
11 initComponent : function() {
15 throw "no node name specified";
19 throw "no VM ID specified";
22 if (!me
.consoleType
) {
23 throw "no console type specified";
26 // always use same iframe, to avoid running several noVnc clients
27 // at same time (to avoid performance problems)
28 var box
= Ext
.create('widget.uxiframe', { id
: "vncconsole" });
31 layout
: { type
: 'fit' },
36 box
.load('/?console=' + me
.consoleType
+ '&novnc=1&vmid='+ me
.vmid
+
37 '&node=' + me
.nodename
+ '&resize=scale');
46 PVE_vnc_console_event = function(appletid
, action
, err
) {
47 //console.log("TESTINIT param1 " + appletid + " action " + action);
49 if (action
=== "error") {
50 var compid
= appletid
.replace("-vncapp", "");
51 var comp
= Ext
.getCmp(compid
);
53 if (!comp
|| !comp
.vmid
|| !comp
.toplevel
) {
57 comp
.detectMigratedVM();
63 Ext
.define('PVE.VNCConsole', {
64 extend
: 'Ext.panel.Panel',
65 alias
: ['widget.pveVNCConsole'],
69 last_novnc_state
: undefined,
70 last_novnc_msg
: undefined,
72 detectMigratedVM: function() {
79 // try to detect migrated VM
80 PVE
.Utils
.API2Request({
81 url
: '/cluster/resources',
83 success: function(response
) {
84 var list
= response
.result
.data
;
85 Ext
.Array
.each(list
, function(item
) {
86 if (item
.type
=== 'qemu' && item
.vmid
== me
.vmid
) {
87 if (item
.node
!== me
.nodename
) {
88 me
.nodename
= item
.node
;
89 me
.url
= "/nodes/" + me
.nodename
+ "/" + item
.type
+ "/" + me
.vmid
+ "/vncproxy";
90 me
.wsurl
= "/nodes/" + me
.nodename
+ "/" + item
.type
+ "/" + me
.vmid
+ "/vncwebsocket";
93 return false; // break
100 initComponent : function() {
104 throw "no url specified";
107 var myid
= me
.id
+ "-vncapp";
115 throw "no web socket url specified";
117 box
= Ext
.create('widget.uxiframe', { id
: myid
});
119 box
= Ext
.create('Ext.Component', { border
: false, html
: "" });
122 var resize_window = function() {
123 //console.log("resize");
130 var novnciframe
= box
.getFrame();
132 var innerDoc
= novnciframe
.contentDocument
|| novnciframe
.contentWindow
.document
;
133 aw
= innerDoc
.getElementById('noVNC_canvas').width
;
134 ah
= innerDoc
.getElementById('noVNC_canvas').height
+ 8;
136 var novnc_state
= innerDoc
.getElementById('noVNC_status_state').innerHTML
;
137 var novnc_msg
= innerDoc
.getElementById('noVNC_status_msg').innerHTML
;
139 if (novnc_state
!== me
.last_novnc_state
|| novnc_msg
!== me
.last_novnc_msg
) {
140 me
.last_novnc_state
= novnc_state
;
141 me
.last_novnc_msg
= novnc_msg
;
143 if (novnc_state
!== 'normal') {
144 PVE
.Utils
.setErrorMask(box
, novnc_msg
|| 'unknown');
146 PVE
.Utils
.setErrorMask(box
); // clear mask
149 if (novnc_state
=== 'disconnected') {
150 me
.detectMigratedVM();
155 applet
= Ext
.getDom(myid
);
157 // try again when dom element is available
158 if (!(applet
&& Ext
.isFunction(applet
.getPreferredSize
))) {
159 return Ext
.Function
.defer(resize_window
, 1000);
162 var ps
= applet
.getPreferredSize();
167 if (aw
< 640) { aw
= 640; }
168 if (ah
< 400) { ah
= 400; }
170 var tbar
= me
.getDockedItems("[dock=top]")[0];
171 var tbh
= tbar
? tbar
.getHeight() : 0;
176 //console.log("size0 " + aw + " " + ah + " tbh " + tbh);
178 if (window
.innerHeight
) {
179 oh
= window
.innerHeight
;
180 ow
= window
.innerWidth
;
181 } else if (document
.documentElement
&&
182 document
.documentElement
.clientHeight
) {
183 oh
= document
.documentElement
.clientHeight
;
184 ow
= document
.documentElement
.clientWidth
;
185 } else if (document
.body
) {
186 oh
= document
.body
.clientHeight
;
187 ow
= document
.body
.clientWidth
;
189 throw "can't get window size";
193 Ext
.fly(applet
).setSize(aw
, ah
+ tbh
);
196 var offsetw
= aw
- ow
;
197 var offseth
= ah
+ tbh
- oh
;
199 if (offsetw
!== 0 || offseth
!== 0) {
200 //console.log("try resize by " + offsetw + " " + offseth);
201 try { window
.resizeBy(offsetw
, offseth
); } catch (e
) {}
204 Ext
.Function
.defer(resize_window
, 1000);
207 var resize_box = function() {
209 throw "implement me";
211 var applet
= Ext
.getDom(myid
);
213 if ((applet
&& Ext
.isFunction(applet
.getPreferredSize
))) {
214 var ps
= applet
.getPreferredSize();
215 Ext
.fly(applet
).setSize(ps
.width
, ps
.height
);
219 Ext
.Function
.defer(resize_box
, 1000);
222 var start_vnc_viewer = function(param
) {
226 var pveparams
= Ext
.urlEncode({
228 vncticket
: param
.ticket
231 var urlparams
= Ext
.urlEncode({
233 path
: "api2/json" + me
.wsurl
+ "?" + pveparams
,
234 password
: param
.ticket
236 box
.load('/novnc/vnc_pve.html?' + urlparams
);
240 var cert
= param
.cert
;
241 cert
= cert
.replace(/\n/g, "|");
247 code
: 'com.tigervnc.vncviewer.VncViewer',
248 archive
: '/vncterm/VncViewer.jar',
249 // NOTE: set size to '100%' - else resize does not work
253 {tag
: 'param', name
: 'id', value
: myid
},
254 {tag
: 'param', name
: 'PORT', value
: param
.port
},
255 {tag
: 'param', name
: 'PASSWORD', value
: param
.ticket
},
256 {tag
: 'param', name
: 'USERNAME', value
: param
.user
},
257 {tag
: 'param', name
: 'Show Controls', value
: 'No'},
258 {tag
: 'param', name
: 'Offer Relogin', value
: 'No'},
259 {tag
: 'param', name
: 'PVECert', value
: cert
}
265 Ext
.Function
.defer(resize_window
, 1000);
267 Ext
.Function
.defer(resize_box
, 1000);
274 autoScroll
: me
.toplevel
? false : true,
276 reloadApplet: function() {
277 var params
= Ext
.apply({}, me
.params
);
279 params
.websocket
= 1;
281 PVE
.Utils
.API2Request({
284 method
: me
.method
|| 'POST',
285 failure: function(response
, opts
) {
286 box
.update(gettext('Error') + ' ' + response
.htmlStatus
);
288 success: function(response
, opts
) {
289 start_vnc_viewer(response
.result
.data
);
298 me
.on("render", me
.reloadApplet
);
300 me
.on("show", me
.reloadApplet
);
301 me
.on("hide", function() { box
.update(""); });
306 Ext
.define('PVE.KVMConsole', {
307 extend
: 'PVE.VNCConsole',
308 alias
: ['widget.pveKVMConsole'],
310 initComponent : function() {
314 throw "no node name specified";
318 throw "no VM ID specified";
321 var baseUrl
= "/nodes/" + me
.nodename
+ "/qemu/" + me
.vmid
;
323 var vm_command = function(cmd
, params
, reload_applet
) {
324 PVE
.Utils
.API2Request({
326 url
: baseUrl
+ "/status/" + cmd
,
329 failure: function(response
, opts
) {
330 Ext
.Msg
.alert('Error', response
.htmlStatus
);
332 success: function() {
334 Ext
.Function
.defer(me
.reloadApplet
, 1000, me
);
342 text
: gettext('Start'),
343 handler: function() {
344 vm_command("start", {}, 1);
348 text
: gettext('Shutdown'),
349 handler: function() {
350 var msg
= Ext
.String
.format(gettext("Do you really want to shutdown VM {0}?"), me
.vmid
);
351 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
355 vm_command('shutdown');
360 text
: gettext('Stop'),
361 handler: function() {
362 var msg
= Ext
.String
.format(gettext("Do you really want to stop VM {0}?"), me
.vmid
);
363 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
372 xtype
: 'pveQemuSendKeyMenu',
373 nodename
: me
.nodename
,
377 text
: gettext('Reset'),
378 handler: function() {
379 var msg
= Ext
.String
.format(gettext("Do you really want to reset VM {0}?"), me
.vmid
);
380 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
389 text
: gettext('Suspend'),
390 handler: function() {
391 var msg
= Ext
.String
.format(gettext("Do you really want to suspend VM {0}?"), me
.vmid
);
392 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
396 vm_command("suspend");
401 text
: gettext('Resume'),
402 handler: function() {
403 vm_command("resume");
406 // Note: no migrate here, because we can't display migrate log
408 text
: gettext('Console'),
409 handler: function() {
410 PVE
.Utils
.openVNCViewer('kvm', me
.vmid
, me
.nodename
, me
.vmname
, me
.novnc
);
415 text
: gettext('Refresh'),
416 hidden
: me
.novnc
? true : false,
417 handler: function() {
418 var applet
= Ext
.getDom(me
.appletID
);
419 applet
.sendRefreshRequest();
423 text
: gettext('Reload'),
424 handler: function () {
433 url
: baseUrl
+ "/vncproxy",
434 wsurl
: baseUrl
+ "/vncwebsocket"
441 Ext
.define('PVE.LxcConsole', {
442 extend
: 'PVE.VNCConsole',
443 alias
: ['widget.pveLxcConsole'],
445 initComponent : function() {
449 throw "no node name specified";
453 throw "no VM ID specified";
456 var baseUrl
= "/nodes/" + me
.nodename
+ "/lxc/" + me
.vmid
;
458 var vm_command = function(cmd
, params
, reload_applet
) {
459 PVE
.Utils
.API2Request({
461 url
: baseUrl
+ "/status/" + cmd
,
464 failure: function(response
, opts
) {
465 Ext
.Msg
.alert('Error', response
.htmlStatus
);
467 success: function() {
469 Ext
.Function
.defer(me
.reloadApplet
, 1000, me
);
477 text
: gettext('Start'),
478 handler: function() {
483 text
: gettext('Shutdown'),
484 handler: function() {
485 var msg
= Ext
.String
.format(gettext("Do you really want to shutdown VM {0}?"), me
.vmid
);
486 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
490 vm_command("shutdown");
495 text
: gettext('Stop'),
496 handler: function() {
497 var msg
= Ext
.String
.format(gettext("Do you really want to stop VM {0}?"), me
.vmid
);
498 Ext
.Msg
.confirm(gettext('Confirm'), msg
, function(btn
) {
506 // Note: no migrate here, because we can't display migrate log
509 text
: gettext('Refresh'),
510 hidden
: me
.novnc
? true : false,
511 handler: function() {
512 var applet
= Ext
.getDom(me
.appletID
);
513 applet
.sendRefreshRequest();
517 text
: gettext('Reload'),
518 handler: function () {
526 url
: baseUrl
+ "/vncproxy",
527 wsurl
: baseUrl
+ "/vncwebsocket"
534 Ext
.define('PVE.Shell', {
535 extend
: 'PVE.VNCConsole',
536 alias
: ['widget.pveShell'],
538 ugradeSystem
: false, // set to true to run "apt-get dist-upgrade"
540 initComponent : function() {
544 throw "no node name specified";
551 text
: gettext('Refresh'),
552 handler: function() {
553 var applet
= Ext
.getDom(me
.appletID
);
554 applet
.sendRefreshRequest();
559 if (!me
.ugradeSystem
) {
560 // we dont want to restart the upgrade script
562 text
: gettext('Reload'),
563 handler: function () { me
.reloadApplet(); }
568 text
: gettext('Shell'),
569 handler: function() {
570 PVE
.Utils
.openVNCViewer('shell', undefined, me
.nodename
, undefined, me
.novnc
);
574 var baseUrl
= "/nodes/" + me
.nodename
;
578 url
: baseUrl
+ "/vncshell",
579 wsurl
: baseUrl
+ "/vncwebsocket"
582 if (me
.ugradeSystem
) {
583 me
.params
= { upgrade
: 1 };