diff --git a/www/manager/Makefile b/www/manager/Makefile index 46c8a328..61f6e410 100644 --- a/www/manager/Makefile +++ b/www/manager/Makefile @@ -5,6 +5,7 @@ JSSRC= \ Parser.js \ StateProvider.js \ button/Button.js \ + button/ConsoleButton.js \ qemu/SendKeyMenu.js \ qemu/CmdMenu.js \ qemu/TemplateMenu.js \ diff --git a/www/manager/button/ConsoleButton.js b/www/manager/button/ConsoleButton.js new file mode 100644 index 00000000..9a5e520d --- /dev/null +++ b/www/manager/button/ConsoleButton.js @@ -0,0 +1,116 @@ +Ext.define('PVE.button.ConsoleButton', { + extend: 'Ext.button.Split', + alias: 'widget.pveConsoleButton', + + consoleType: 'shell', // one of 'shell', 'kvm', 'openvz', 'upgrade' + + consoleName: undefined, + + enableSpice: undefined, + + nodename: undefined, + + vmid: 0, + + setEnableSpice: function(enable){ + var me = this; + + me.enableSpice = enable; + me.spiceMenu.setDisabled(!enable); + }, + + getEnableSpice: function() { + var me = this; + + if (me.enableSpice === undefined) { + if (PVE.VersionInfo.console && PVE.VersionInfo.console === 'vv') { + return true; + } else { + return false; + } + } else { + return me.enableSpice; + } + }, + + initComponent: function() { + var me = this; + + if (!me.nodename) { + throw "no node name specified"; + } + + if (!me.consoleName) { + if (me.consoleType === 'kvm') { + me.consoleName = "VM " + me.vmid.toString(); + } else if (me.consoleType === 'openvz') { + me.consoleName = "CT " + me.vmid.toString(); + } else { + me.consoleName = "Shell"; + } + } + + var create_spice_console = function() { + var url; + var params = { proxy: window.location.hostname }; + if (me.consoleType === 'kvm') { + url = '/nodes/' + me.nodename + '/qemu/' + + me.vmid.toString() + '/spiceproxy'; + PVE.Utils.openSpiceViewer(url, params); + } else if (me.consoleType === 'openvz') { + url = '/nodes/' + me.nodename + '/openvz/' + + me.vmid.toString() + '/spiceproxy'; + PVE.Utils.openSpiceViewer(url, params); + } else if (me.consoleType === 'shell') { + url = '/nodes/' + me.nodename + '/spiceshell'; + PVE.Utils.openSpiceViewer(url, params); + } else if (me.consoleType === 'upgrade') { + url = '/nodes/' + me.nodename + '/spiceshell'; + params.upgrade = 1; + PVE.Utils.openSpiceViewer(url, params); + } + }; + + var create_vnc_console = function() { + if (me.consoleType === 'kvm') { + PVE.Utils.openConsoleWindow('kvm', me.vmid, me.nodename, me.consoleName); + } else if (me.consoleType === 'openvz') { + PVE.Utils.openConsoleWindow('openvz', me.vmid, me.nodename, me.consoleName); + } else if (me.consoleType === 'shell') { + PVE.Utils.openConsoleWindow('shell', undefined, me.nodename); + } else if (me.consoleType === 'upgrade') { + var url = Ext.urlEncode({ console: 'upgrade', node: me.nodename }); + var nw = window.open("?" + url, '_blank', "innerWidth=745,innerheight=427"); + nw.focus(); + } + }; + + me.spiceMenu = Ext.create('Ext.menu.Item', { + text: 'SPICE', + handler: create_spice_console + }); + + var vncMenu = Ext.create('Ext.menu.Item', { + text: 'VNC', + handler: create_vnc_console + }); + + Ext.applyIf(me, { text: gettext('Console') }); + + Ext.apply(me, { + handler: function() { + if (!me.getEnableSpice() || + (PVE.VersionInfo.console && PVE.VersionInfo.console === 'applet')) { + create_vnc_console(); + } else { + create_spice_console(); + } + }, + menu: new Ext.menu.Menu({ + items: [ vncMenu, me.spiceMenu ] + }) + }); + + me.callParent(); + } +}); diff --git a/www/manager/node/APT.js b/www/manager/node/APT.js index 72ab364c..aabd341d 100644 --- a/www/manager/node/APT.js +++ b/www/manager/node/APT.js @@ -78,30 +78,12 @@ Ext.define('PVE.node.APT', { } }); - var upgrade_btn = new PVE.button.Button({ - text: gettext('Upgrade'), + var upgrade_btn = Ext.create('PVE.button.ConsoleButton', { disabled: !(PVE.UserName && PVE.UserName === 'root@pam'), - handler: function() { - PVE.Utils.checked_command(function() { - var url; - var params; - if (PVE.Utils.defaultViewer() === 'vv') { - url = '/nodes/' + nodename + '/spiceshell'; - params = { upgrade: 1, proxy: window.location.hostname }; - PVE.Utils.openSpiceViewer(url, params); - } else { - url = Ext.urlEncode({ - console: 'upgrade', - node: nodename - }); - var nw = window.open("?" + url, '_blank', - "innerWidth=745,innerheight=427"); - nw.focus(); - } - }); - } - }); - + text: gettext('Upgrade'), + consoleType: 'upgrade', + nodename: nodename + }); var show_changelog = function(rec) { if (!rec || !rec.data || !(rec.data.ChangeLogUrl && rec.data.Package)) { diff --git a/www/manager/node/Config.js b/www/manager/node/Config.js index 983f4a0c..e8501e32 100644 --- a/www/manager/node/Config.js +++ b/www/manager/node/Config.js @@ -47,18 +47,12 @@ Ext.define('PVE.node.Config', { } }); - var shellBtn = Ext.create('Ext.Button', { - text: gettext('Shell'), + var shellBtn = Ext.create('PVE.button.ConsoleButton', { disabled: !caps.nodes['Sys.Console'], - handler: function() { - if (PVE.Utils.defaultViewer() === 'vv') { - var params = { proxy: window.location.hostname }; - PVE.Utils.openSpiceViewer('/nodes/' + nodename + '/spiceshell', params); - } else { - PVE.Utils.openConsoleWindow('shell', undefined, nodename); - } - } - }); + text: gettext('Shell'), + consoleType: 'shell', + nodename: nodename + }); me.items = []; diff --git a/www/manager/openvz/Config.js b/www/manager/openvz/Config.js index 48d0b6b3..576dd77c 100644 --- a/www/manager/openvz/Config.js +++ b/www/manager/openvz/Config.js @@ -101,18 +101,12 @@ Ext.define('PVE.openvz.Config', { var vmname = me.pveSelNode.data.name; - var consoleBtn = Ext.create('Ext.Button', { - text: gettext('Console'), + var consoleBtn = Ext.create('PVE.button.ConsoleButton', { disabled: !caps.vms['VM.Console'], - handler: function() { - if (PVE.Utils.defaultViewer() === 'vv') { - var params = { proxy: window.location.hostname }; - PVE.Utils.openSpiceViewer('/nodes/' + nodename + '/openvz/' + vmid + - '/spiceproxy', params); - } else { - PVE.Utils.openConsoleWindow('openvz', vmid, nodename, vmname); - } - } + consoleType: 'openvz', + consoleName: vmname, + nodename: nodename, + vmid: vmid }); var descr = vmid + " (" + (vmname ? "'" + vmname + "' " : "'CT " + vmid + "'") + ")"; diff --git a/www/manager/qemu/Config.js b/www/manager/qemu/Config.js index 5257bb70..91db06ac 100644 --- a/www/manager/qemu/Config.js +++ b/www/manager/qemu/Config.js @@ -110,40 +110,12 @@ Ext.define('PVE.qemu.Config', { var vmname = me.pveSelNode.data.name; - var spice = false; - - var spiceMenu = Ext.create('Ext.menu.Item', { - text: 'SPICE', - handler: function(){ - var url = '/nodes/' + nodename + '/qemu/' + vmid + '/spiceproxy'; - var params = { proxy: window.location.hostname }; - PVE.Utils.openSpiceViewer(url, params); - } - }); - - var consoleBtn = Ext.create('Ext.button.Split', { - text: gettext('Console'), + var consoleBtn = Ext.create('PVE.button.ConsoleButton', { disabled: !caps.vms['VM.Console'], - handler: function() { - if (PVE.VersionInfo.console === 'applet' || !spice) { - PVE.Utils.openConsoleWindow('kvm', vmid, nodename, vmname); - } else { - var url = '/nodes/' + nodename + '/qemu/' + vmid + '/spiceproxy'; - var params = { proxy: window.location.hostname }; - PVE.Utils.openSpiceViewer(url, params); - } - }, - menu: new Ext.menu.Menu({ - items: [ - { - text: 'VNC', - handler: function(){ - PVE.Utils.openConsoleWindow('kvm', vmid, nodename, vmname); - } - }, - spiceMenu - ] - }) + consoleType: 'kvm', + consoleName: vmname, + nodename: nodename, + vmid: vmid }); var descr = vmid + " (" + (vmname ? "'" + vmname + "' " : "'VM " + vmid + "'") + ")"; @@ -218,6 +190,7 @@ Ext.define('PVE.qemu.Config', { var status; var qmpstatus; var template; + var spice = false; if (!success) { me.workspace.checkVmMigration(me.pveSelNode); @@ -242,9 +215,8 @@ Ext.define('PVE.qemu.Config', { startBtn.setVisible(true); resumeBtn.setVisible(false); } - - spiceMenu.setVisible(spice); - spiceMenu.setDisabled(!caps.vms['VM.Console'] || status !== 'running'); + + consoleBtn.setEnableSpice(spice); startBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status === 'running' || template); resetBtn.setDisabled(!caps.vms['VM.PowerMgmt'] || status !== 'running' || template);