]> git.proxmox.com Git - pve-manager.git/blob - www/manager/VNCConsole.js
update shipped appliance info index
[pve-manager.git] / www / manager / VNCConsole.js
1 PVE_vnc_console_event = function(appletid, action, err) {
2 //console.log("TESTINIT param1 " + appletid + " action " + action);
3
4 if (action === "error") {
5 var compid = appletid.replace("-vncapp", "");
6 var comp = Ext.getCmp(compid);
7
8 if (!comp || !comp.vmid || !comp.toplevel) {
9 return;
10 }
11
12 // try to detect migrated VM
13 PVE.Utils.API2Request({
14 url: '/cluster/resources',
15 method: 'GET',
16 success: function(response) {
17 var list = response.result.data;
18 Ext.Array.each(list, function(item) {
19 if (item.type === 'qemu' && item.vmid == comp.vmid) {
20 if (item.node !== comp.nodename) {
21 //console.log("MOVED VM to node " + item.node);
22 comp.nodename = item.node;
23 comp.url = "/nodes/" + comp.nodename + "/" + item.type + "/" + comp.vmid + "/vncproxy";
24 //console.log("NEW URL " + comp.url);
25 comp.reloadApplet();
26 }
27 return false; // break
28 }
29 });
30 }
31 });
32 }
33
34 return;
35 /*
36 var el = Ext.get(appletid);
37 if (!el)
38 return;
39
40 if (action === "close") {
41 // el.remove();
42 } else if (action === "error") {
43 // console.log("TESTERROR: " + err);
44 // var compid = appletid.replace("-vncapp", "");
45 // var comp = Ext.getCmp(compid);
46 }
47
48 //Ext.get('mytestid').remove();
49 */
50
51 };
52
53 Ext.define('PVE.VNCConsole', {
54 extend: 'Ext.panel.Panel',
55 alias: ['widget.pveVNCConsole'],
56
57 initComponent : function() {
58 var me = this;
59
60 if (!me.url) {
61 throw "no url specified";
62 }
63
64 var myid = me.id + "-vncapp";
65
66 me.appletID = myid;
67
68 var box = Ext.create('Ext.Component', {
69 border: false,
70 html: ""
71 });
72
73 var resize_window = function() {
74 //console.log("resize");
75
76 var applet = Ext.getDom(myid);
77 //console.log("resize " + myid + " " + applet);
78
79 // try again when dom element is available
80 if (!(applet && Ext.isFunction(applet.getPreferredSize))) {
81 return Ext.Function.defer(resize_window, 1000);
82 }
83
84 var tbar = me.getDockedItems("[dock=top]")[0];
85 var tbh = tbar ? tbar.getHeight() : 0;
86 var ps = applet.getPreferredSize();
87 var aw = ps.width;
88 var ah = ps.height;
89
90 if (aw < 640) { aw = 640; }
91 if (ah < 400) { ah = 400; }
92
93 var oh;
94 var ow;
95
96 //console.log("size0 " + aw + " " + ah + " tbh " + tbh);
97
98 if (window.innerHeight) {
99 oh = window.innerHeight;
100 ow = window.innerWidth;
101 } else if (document.documentElement &&
102 document.documentElement.clientHeight) {
103 oh = document.documentElement.clientHeight;
104 ow = document.documentElement.clientWidth;
105 } else if (document.body) {
106 oh = document.body.clientHeight;
107 ow = document.body.clientWidth;
108 } else {
109 throw "can't get window size";
110 }
111
112 Ext.fly(applet).setSize(aw, ah + tbh);
113
114 var offsetw = aw - ow;
115 var offseth = ah + tbh - oh;
116
117 if (offsetw !== 0 || offseth !== 0) {
118 //console.log("try resize by " + offsetw + " " + offseth);
119 try { window.resizeBy(offsetw, offseth); } catch (e) {}
120 }
121
122 Ext.Function.defer(resize_window, 1000);
123 };
124
125 var resize_box = function() {
126 var applet = Ext.getDom(myid);
127
128 if ((applet && Ext.isFunction(applet.getPreferredSize))) {
129 var ps = applet.getPreferredSize();
130 Ext.fly(applet).setSize(ps.width, ps.height);
131 }
132
133 Ext.Function.defer(resize_box, 1000);
134 };
135
136 var start_vnc_viewer = function(param) {
137 var cert = param.cert;
138 cert = cert.replace(/\n/g, "|");
139
140 box.update({
141 id: myid,
142 border: false,
143 tag: 'applet',
144 code: 'com.tigervnc.vncviewer.VncViewer',
145 archive: '/vncterm/VncViewer.jar',
146 // NOTE: set size to '100%' - else resize does not work
147 width: "100%",
148 height: "100%",
149 cn: [
150 {tag: 'param', name: 'id', value: myid},
151 {tag: 'param', name: 'PORT', value: param.port},
152 {tag: 'param', name: 'PASSWORD', value: param.ticket},
153 {tag: 'param', name: 'USERNAME', value: param.user},
154 {tag: 'param', name: 'Show Controls', value: 'No'},
155 {tag: 'param', name: 'Offer Relogin', value: 'No'},
156 {tag: 'param', name: 'PVECert', value: cert}
157 ]
158 });
159 if (me.toplevel) {
160 Ext.Function.defer(resize_window, 1000);
161 } else {
162 Ext.Function.defer(resize_box, 1000);
163 }
164 };
165
166 Ext.apply(me, {
167 layout: 'fit',
168 border: false,
169 autoScroll: me.toplevel ? false : true,
170 items: box,
171 reloadApplet: function() {
172 PVE.Utils.API2Request({
173 url: me.url,
174 params: me.params,
175 method: me.method || 'POST',
176 failure: function(response, opts) {
177 box.update(gettext('Error') + ' ' + response.htmlStatus);
178 },
179 success: function(response, opts) {
180 start_vnc_viewer(response.result.data);
181 }
182 });
183 }
184 });
185
186 me.callParent();
187
188 if (me.toplevel) {
189 me.on("render", function() { me.reloadApplet();});
190 } else {
191 me.on("show", function() { me.reloadApplet();});
192 me.on("hide", function() { box.update(""); });
193 }
194 }
195 });
196
197 Ext.define('PVE.KVMConsole', {
198 extend: 'PVE.VNCConsole',
199 alias: ['widget.pveKVMConsole'],
200
201 initComponent : function() {
202 var me = this;
203
204 if (!me.nodename) {
205 throw "no node name specified";
206 }
207
208 if (!me.vmid) {
209 throw "no VM ID specified";
210 }
211
212 var vm_command = function(cmd, params, reload_applet) {
213 PVE.Utils.API2Request({
214 params: params,
215 url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + "/status/" + cmd,
216 method: 'POST',
217 waitMsgTarget: me,
218 failure: function(response, opts) {
219 Ext.Msg.alert('Error', response.htmlStatus);
220 },
221 success: function() {
222 if (reload_applet) {
223 Ext.Function.defer(me.reloadApplet, 1000, me);
224 }
225 }
226 });
227 };
228
229 var tbar = [
230 {
231 text: gettext('Start'),
232 handler: function() {
233 vm_command("start", {}, 1);
234 }
235 },
236 {
237 text: gettext('Shutdown'),
238 handler: function() {
239 var msg = Ext.String.format(gettext("Do you really want to shutdown VM {0}?"), me.vmid);
240 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
241 if (btn !== 'yes') {
242 return;
243 }
244 vm_command('shutdown', {timeout: 30});
245 });
246 }
247 },
248 {
249 text: gettext('Stop'),
250 handler: function() {
251 var msg = Ext.String.format(gettext("Do you really want to stop VM {0}?"), me.vmid);
252 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
253 if (btn !== 'yes') {
254 return;
255 }
256 vm_command("stop", { timeout: 30});
257 });
258 }
259 },
260 {
261 xtype: 'pveQemuSendKeyMenu',
262 nodename: me.nodename,
263 vmid: me.vmid
264 },
265 {
266 text: gettext('Reset'),
267 handler: function() {
268 var msg = Ext.String.format(gettext("Do you really want to reset VM {0}?"), me.vmid);
269 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
270 if (btn !== 'yes') {
271 return;
272 }
273 vm_command("reset");
274 });
275 }
276 },
277 {
278 text: gettext('Suspend'),
279 handler: function() {
280 var msg = Ext.String.format(gettext("Do you really want to suspend VM {0}?"), me.vmid);
281 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
282 if (btn !== 'yes') {
283 return;
284 }
285 vm_command("suspend");
286 });
287 }
288 },
289 {
290 text: gettext('Resume'),
291 handler: function() {
292 vm_command("resume");
293 }
294 },
295 // Note: no migrate here, because we can't display migrate log
296 {
297 text: gettext('Console'),
298 handler: function() {
299 PVE.Utils.openConoleWindow('kvm', me.vmid, me.nodename, me.vmname);
300 }
301 },
302 '->',
303 {
304 text: gettext('Refresh'),
305 handler: function() {
306 var applet = Ext.getDom(me.appletID);
307 applet.sendRefreshRequest();
308 }
309 },
310 {
311 text: gettext('Reload'),
312 handler: function () {
313 me.reloadApplet();
314 }
315 }
316 ];
317
318 Ext.apply(me, {
319 tbar: tbar,
320 url: "/nodes/" + me.nodename + "/qemu/" + me.vmid + "/vncproxy"
321 });
322
323 me.callParent();
324 }
325 });
326
327 Ext.define('PVE.OpenVZConsole', {
328 extend: 'PVE.VNCConsole',
329 alias: ['widget.pveOpenVZConsole'],
330
331 initComponent : function() {
332 var me = this;
333
334 if (!me.nodename) {
335 throw "no node name specified";
336 }
337
338 if (!me.vmid) {
339 throw "no VM ID specified";
340 }
341
342 var vm_command = function(cmd, params, reload_applet) {
343 PVE.Utils.API2Request({
344 params: params,
345 url: '/nodes/' + me.nodename + '/openvz/' + me.vmid + "/status/" + cmd,
346 waitMsgTarget: me,
347 method: 'POST',
348 failure: function(response, opts) {
349 Ext.Msg.alert('Error', response.htmlStatus);
350 },
351 success: function() {
352 if (reload_applet) {
353 Ext.Function.defer(me.reloadApplet, 1000, me);
354 }
355 }
356 });
357 };
358
359 var tbar = [
360 {
361 text: gettext('Start'),
362 handler: function() {
363 vm_command("start", {}, 1);
364 }
365 },
366 {
367 text: gettext('Shutdown'),
368 handler: function() {
369 var msg = Ext.String.format(gettext("Do you really want to shutdown VM {0}?"), me.vmid);
370 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
371 if (btn !== 'yes') {
372 return;
373 }
374 vm_command("shutdown");
375 });
376 }
377 },
378 {
379 text: gettext('Stop'),
380 handler: function() {
381 var msg = Ext.String.format(gettext("Do you really want to stop VM {0}?"), me.vmid);
382 Ext.Msg.confirm(gettext('Confirm'), msg, function(btn) {
383 if (btn !== 'yes') {
384 return;
385 }
386 vm_command("stop");
387 });
388 }
389 },
390 // Note: no migrate here, because we can't display migrate log
391 // and openvz migrate does not work if console is open
392 {
393 text: gettext('Console'),
394 handler: function() {
395 PVE.Utils.openConoleWindow('openvz', me.vmid, me.nodename, me.vmname);
396 }
397 },
398 '->',
399 {
400 text: gettext('Refresh'),
401 handler: function() {
402 var applet = Ext.getDom(me.appletID);
403 applet.sendRefreshRequest();
404 }
405 },
406 {
407 text: gettext('Reload'),
408 handler: function () {
409 me.reloadApplet();
410 }
411 }
412 ];
413
414 Ext.apply(me, {
415 tbar: tbar,
416 url: "/nodes/" + me.nodename + "/openvz/" + me.vmid + "/vncproxy"
417 });
418
419 me.callParent();
420 }
421 });
422
423 Ext.define('PVE.Shell', {
424 extend: 'PVE.VNCConsole',
425 alias: ['widget.pveShell'],
426
427 initComponent : function() {
428 var me = this;
429
430 if (!me.nodename) {
431 throw "no node name specified";
432 }
433
434 var tbar = [
435 '->',
436 {
437 text: gettext('Refresh'),
438 handler: function() {
439 var applet = Ext.getDom(me.appletID);
440 applet.sendRefreshRequest();
441 }
442 },
443 {
444 text: gettext('Reload'),
445 handler: function () { me.reloadApplet(); }
446 },
447 {
448 text: gettext('Shell'),
449 handler: function() {
450 PVE.Utils.openConoleWindow('shell', undefined, me.nodename);
451 }
452 }
453 ];
454
455 Ext.apply(me, {
456 tbar: tbar,
457 url: "/nodes/" + me.nodename + "/vncshell"
458 });
459
460 me.callParent();
461 }
462 });