mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-05-17 14:31:17 +00:00
385 lines
8.6 KiB
JavaScript
385 lines
8.6 KiB
JavaScript
PVE_vnc_console_event = function(appletid, action, err) {
|
|
//console.log("TESTINIT param1 " + appletid + " action " + action);
|
|
|
|
if (action === "error") {
|
|
var compid = appletid.replace("-vncapp", "");
|
|
var comp = Ext.getCmp(compid);
|
|
|
|
if (!comp || !comp.vmid || !comp.toplevel) {
|
|
return;
|
|
}
|
|
|
|
// try to detect migrated VM
|
|
PVE.Utils.API2Request({
|
|
url: '/cluster/resources',
|
|
method: 'GET',
|
|
success: function(response) {
|
|
var list = response.result.data;
|
|
Ext.Array.each(list, function(item) {
|
|
if (item.type === 'qemu' && item.vmid == comp.vmid) {
|
|
if (item.node !== comp.nodename) {
|
|
//console.log("MOVED VM to node " + item.node);
|
|
comp.nodename = item.node;
|
|
comp.url = "/nodes/" + comp.nodename + "/" + item.type + "/" + comp.vmid + "/vncproxy";
|
|
//console.log("NEW URL " + comp.url);
|
|
comp.reloadApplet();
|
|
}
|
|
return false; // break
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
return;
|
|
/*
|
|
var el = Ext.get(appletid);
|
|
if (!el)
|
|
return;
|
|
|
|
if (action === "close") {
|
|
// el.remove();
|
|
} else if (action === "error") {
|
|
// console.log("TESTERROR: " + err);
|
|
// var compid = appletid.replace("-vncapp", "");
|
|
// var comp = Ext.getCmp(compid);
|
|
}
|
|
|
|
//Ext.get('mytestid').remove();
|
|
*/
|
|
|
|
};
|
|
|
|
Ext.define('PVE.VNCConsole', {
|
|
extend: 'Ext.panel.Panel',
|
|
alias: ['widget.pveVNCConsole'],
|
|
|
|
initComponent : function() {
|
|
var me = this;
|
|
|
|
if (!me.url) {
|
|
throw "no url specified";
|
|
}
|
|
|
|
var myid = me.id + "-vncapp";
|
|
|
|
me.appletID = myid;
|
|
|
|
var box = Ext.create('Ext.Component', {
|
|
border: false,
|
|
html: ""
|
|
});
|
|
|
|
var resize_window = function() {
|
|
//console.log("resize");
|
|
|
|
var applet = Ext.getDom(myid);
|
|
//console.log("resize " + myid + " " + applet);
|
|
|
|
// try again when dom element is available
|
|
if (!(applet && Ext.isFunction(applet.getPreferredSize))) {
|
|
return Ext.Function.defer(resize_window, 1000);
|
|
}
|
|
|
|
var tbar = me.getDockedItems("[dock=top]")[0];
|
|
var tbh = tbar ? tbar.getHeight() : 0;
|
|
var ps = applet.getPreferredSize();
|
|
var aw = ps.width;
|
|
var ah = ps.height;
|
|
|
|
if (aw < 640) { aw = 640; }
|
|
if (ah < 400) { ah = 400; }
|
|
|
|
var oh;
|
|
var ow;
|
|
|
|
//console.log("size0 " + aw + " " + ah + " tbh " + tbh);
|
|
|
|
if (window.innerHeight) {
|
|
oh = window.innerHeight;
|
|
ow = window.innerWidth;
|
|
} else if (document.documentElement &&
|
|
document.documentElement.clientHeight) {
|
|
oh = document.documentElement.clientHeight;
|
|
ow = document.documentElement.clientWidth;
|
|
} else if (document.body) {
|
|
oh = document.body.clientHeight;
|
|
ow = document.body.clientWidth;
|
|
} else {
|
|
throw "can't get window size";
|
|
}
|
|
|
|
Ext.fly(applet).setSize(aw, ah + tbh);
|
|
|
|
var offsetw = aw - ow;
|
|
var offseth = ah + tbh - oh;
|
|
|
|
if (offsetw !== 0 || offseth !== 0) {
|
|
//console.log("try resize by " + offsetw + " " + offseth);
|
|
try { window.resizeBy(offsetw, offseth); } catch (e) {}
|
|
}
|
|
|
|
Ext.Function.defer(resize_window, 1000);
|
|
};
|
|
|
|
var resize_box = function() {
|
|
var applet = Ext.getDom(myid);
|
|
|
|
if ((applet && Ext.isFunction(applet.getPreferredSize))) {
|
|
var ps = applet.getPreferredSize();
|
|
Ext.fly(applet).setSize(ps.width, ps.height);
|
|
}
|
|
|
|
Ext.Function.defer(resize_box, 1000);
|
|
};
|
|
|
|
var start_vnc_viewer = function(param) {
|
|
var cert = param.cert;
|
|
cert = cert.replace(/\n/g, "|");
|
|
|
|
box.update({
|
|
id: myid,
|
|
border: false,
|
|
tag: 'applet',
|
|
code: 'com.tigervnc.vncviewer.VncViewer',
|
|
archive: '/vncterm/VncViewer.jar',
|
|
// NOTE: set size to '100%' - else resize does not work
|
|
width: "100%",
|
|
height: "100%",
|
|
cn: [
|
|
{tag: 'param', name: 'id', value: myid},
|
|
{tag: 'param', name: 'PORT', value: param.port},
|
|
{tag: 'param', name: 'PASSWORD', value: param.ticket},
|
|
{tag: 'param', name: 'USERNAME', value: param.user},
|
|
{tag: 'param', name: 'Show Controls', value: 'No'},
|
|
{tag: 'param', name: 'Offer Relogin', value: 'No'},
|
|
{tag: 'param', name: 'PVECert', value: cert}
|
|
]
|
|
});
|
|
if (me.toplevel) {
|
|
Ext.Function.defer(resize_window, 1000);
|
|
} else {
|
|
Ext.Function.defer(resize_box, 1000);
|
|
}
|
|
};
|
|
|
|
Ext.apply(me, {
|
|
layout: 'fit',
|
|
border: false,
|
|
autoScroll: me.toplevel ? false : true,
|
|
items: box,
|
|
reloadApplet: function() {
|
|
PVE.Utils.API2Request({
|
|
url: me.url,
|
|
params: me.params,
|
|
method: me.method || 'POST',
|
|
failure: function(response, opts) {
|
|
box.update("Error " + response.htmlStatus);
|
|
},
|
|
success: function(response, opts) {
|
|
start_vnc_viewer(response.result.data);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
me.callParent();
|
|
|
|
if (me.toplevel) {
|
|
me.on("render", function() { me.reloadApplet();});
|
|
} else {
|
|
me.on("show", function() { me.reloadApplet();});
|
|
me.on("hide", function() { box.update(""); });
|
|
}
|
|
}
|
|
});
|
|
|
|
Ext.define('PVE.KVMConsole', {
|
|
extend: 'PVE.VNCConsole',
|
|
alias: ['widget.pveKVMConsole'],
|
|
|
|
initComponent : function() {
|
|
var me = this;
|
|
|
|
if (!me.nodename) {
|
|
throw "no node name specified";
|
|
}
|
|
|
|
if (!me.vmid) {
|
|
throw "no VM ID specified";
|
|
}
|
|
|
|
var vm_command = function(cmd, reload_applet) {
|
|
PVE.Utils.API2Request({
|
|
params: { command: cmd },
|
|
url: '/nodes/' + me.nodename + '/qemu/' + me.vmid + "/status",
|
|
method: 'PUT',
|
|
waitMsgTarget: me,
|
|
failure: function(response, opts) {
|
|
Ext.Msg.alert('Error', response.htmlStatus);
|
|
},
|
|
success: function() {
|
|
if (reload_applet) {
|
|
Ext.Function.defer(me.reloadApplet, 1000, me);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
var tbar = [
|
|
{
|
|
text: 'Start',
|
|
handler: function() {
|
|
vm_command("start", 1);
|
|
}
|
|
},
|
|
{
|
|
text: 'Stop',
|
|
handler: function() {
|
|
var msg = "Do you really want to stop the VM?";
|
|
Ext.Msg.confirm('Confirm', msg, function(btn) {
|
|
if (btn !== 'yes') {
|
|
return;
|
|
}
|
|
vm_command("stop");
|
|
});
|
|
}
|
|
},
|
|
{
|
|
text: 'CAD',
|
|
handler: function() {
|
|
var msg = "Send CAD (Ctrl-Alt-Delete) to the VM?";
|
|
Ext.Msg.confirm('Confirm', msg, function(btn) {
|
|
if (btn !== 'yes') {
|
|
return;
|
|
}
|
|
vm_command("cad");
|
|
});
|
|
}
|
|
},
|
|
{
|
|
text: 'Reset',
|
|
handler: function() {
|
|
var msg = "Do you really want to reset the VM?";
|
|
Ext.Msg.confirm('Confirm', msg, function(btn) {
|
|
if (btn !== 'yes') {
|
|
return;
|
|
}
|
|
vm_command("reset");
|
|
});
|
|
}
|
|
},
|
|
{
|
|
text: 'Shutdown',
|
|
handler: function() {
|
|
var msg = "Do you really want to shutdown the VM?";
|
|
Ext.Msg.confirm('Confirm', msg, function(btn) {
|
|
if (btn !== 'yes') {
|
|
return;
|
|
}
|
|
vm_command('shutdown');
|
|
});
|
|
}
|
|
},
|
|
{
|
|
text: 'Suspend',
|
|
handler: function() {
|
|
var msg = "Do you really want to suspend the VM?";
|
|
Ext.Msg.confirm('Confirm', msg, function(btn) {
|
|
if (btn !== 'yes') {
|
|
return;
|
|
}
|
|
vm_command("suspend");
|
|
});
|
|
}
|
|
},
|
|
{
|
|
text: 'Resume',
|
|
handler: function() {
|
|
vm_command("resume");
|
|
}
|
|
},
|
|
'->',
|
|
{
|
|
text: 'Refresh',
|
|
handler: function() {
|
|
var applet = Ext.getDom(me.appletID);
|
|
applet.sendRefreshRequest();
|
|
}
|
|
},
|
|
{
|
|
text: 'Reload',
|
|
handler: function () {
|
|
me.reloadApplet();
|
|
}
|
|
},
|
|
{
|
|
text: 'Console',
|
|
handler: function() {
|
|
var url = Ext.urlEncode({
|
|
console: 'kvm',
|
|
vmid: me.vmid,
|
|
node: me.nodename
|
|
});
|
|
var nw = window.open("?" + url, '_blank',
|
|
"innerWidth=745,innerheight=427");
|
|
nw.focus();
|
|
}
|
|
}
|
|
];
|
|
|
|
Ext.apply(me, {
|
|
tbar: tbar,
|
|
url: "/nodes/" + me.nodename + "/qemu/" + me.vmid + "/vncproxy"
|
|
});
|
|
|
|
me.callParent();
|
|
}
|
|
});
|
|
|
|
Ext.define('PVE.Shell', {
|
|
extend: 'PVE.VNCConsole',
|
|
alias: ['widget.pveShell'],
|
|
|
|
initComponent : function() {
|
|
var me = this;
|
|
|
|
if (!me.nodename) {
|
|
throw "no node name specified";
|
|
}
|
|
|
|
var tbar = [
|
|
'->',
|
|
{
|
|
text: 'Refresh',
|
|
handler: function() {
|
|
var applet = Ext.getDom(me.appletID);
|
|
applet.sendRefreshRequest();
|
|
}
|
|
},
|
|
{
|
|
text: 'Reload',
|
|
handler: function () { me.reloadApplet(); }
|
|
},
|
|
{
|
|
text: 'Shell',
|
|
handler: function() {
|
|
var url = Ext.urlEncode({
|
|
console: 'shell',
|
|
node: me.nodename
|
|
});
|
|
var nw = window.open("?" + url, '_blank',
|
|
"innerWidth=745,innerheight=427");
|
|
nw.focus();
|
|
}
|
|
}
|
|
];
|
|
|
|
Ext.apply(me, {
|
|
tbar: tbar,
|
|
url: "/nodes/" + me.nodename + "/vncshell"
|
|
});
|
|
|
|
me.callParent();
|
|
}
|
|
}); |