Ext.define('PVE.node.Config', { extend: 'PVE.panel.Config', alias: 'widget.PVE.node.Config', onlineHelp: 'chapter_system_administration', initComponent: function() { var me = this; var nodename = me.pveSelNode.data.node; if (!nodename) { throw "no node name specified"; } var caps = Ext.state.Manager.get('GuiCap'); me.statusStore = Ext.create('Proxmox.data.ObjectStore', { url: "/api2/json/nodes/" + nodename + "/status", interval: 5000, }); var node_command = function(cmd) { Proxmox.Utils.API2Request({ params: { command: cmd }, url: '/nodes/' + nodename + '/status', method: 'POST', waitMsgTarget: me, failure: function(response, opts) { Ext.Msg.alert(gettext('Error'), response.htmlStatus); }, }); }; var actionBtn = Ext.create('Ext.Button', { text: gettext('Bulk Actions'), iconCls: 'fa fa-fw fa-ellipsis-v', disabled: !caps.nodes['Sys.PowerMgmt'], menu: new Ext.menu.Menu({ items: [ { text: gettext('Bulk Start'), iconCls: 'fa fa-fw fa-play', handler: function() { var win = Ext.create('PVE.window.BulkAction', { nodename: nodename, title: gettext('Bulk Start'), btnText: gettext('Start'), action: 'startall', }); win.show(); }, }, { text: gettext('Bulk Stop'), iconCls: 'fa fa-fw fa-stop', handler: function() { var win = Ext.create('PVE.window.BulkAction', { nodename: nodename, title: gettext('Bulk Stop'), btnText: gettext('Stop'), action: 'stopall', }); win.show(); }, }, { text: gettext('Bulk Migrate'), iconCls: 'fa fa-fw fa-send-o', handler: function() { var win = Ext.create('PVE.window.BulkAction', { nodename: nodename, title: gettext('Bulk Migrate'), btnText: gettext('Migrate'), action: 'migrateall', }); win.show(); }, }, ], }), }); let restartBtn = Ext.create('Proxmox.button.Button', { text: gettext('Reboot'), disabled: !caps.nodes['Sys.PowerMgmt'], dangerous: true, confirmMsg: Ext.String.format(gettext("Reboot node '{0}'?"), nodename), handler: function() { node_command('reboot'); }, iconCls: 'fa fa-undo', }); var shutdownBtn = Ext.create('Proxmox.button.Button', { text: gettext('Shutdown'), disabled: !caps.nodes['Sys.PowerMgmt'], dangerous: true, confirmMsg: Ext.String.format(gettext("Shutdown node '{0}'?"), nodename), handler: function() { node_command('shutdown'); }, iconCls: 'fa fa-power-off', }); var shellBtn = Ext.create('PVE.button.ConsoleButton', { disabled: !caps.nodes['Sys.Console'], text: gettext('Shell'), consoleType: 'shell', nodename: nodename, }); me.items = []; Ext.apply(me, { title: gettext('Node') + " '" + nodename + "'", hstateid: 'nodetab', defaults: { statusStore: me.statusStore, }, tbar: [restartBtn, shutdownBtn, shellBtn, actionBtn], }); if (caps.nodes['Sys.Audit']) { me.items.push( { xtype: 'pveNodeSummary', title: gettext('Summary'), iconCls: 'fa fa-book', itemId: 'summary', }, { xtype: 'pveNotesView', title: gettext('Notes'), iconCls: 'fa fa-sticky-note-o', itemId: 'notes', }, ); } if (caps.nodes['Sys.Console']) { me.items.push( { xtype: 'pveNoVncConsole', title: gettext('Shell'), iconCls: 'fa fa-terminal', itemId: 'jsconsole', consoleType: 'shell', xtermjs: true, nodename: nodename, }, ); } if (caps.nodes['Sys.Audit']) { me.items.push( { xtype: 'proxmoxNodeServiceView', title: gettext('System'), iconCls: 'fa fa-cogs', itemId: 'services', expandedOnInit: true, restartCommand: 'reload', // avoid disruptions startOnlyServices: { 'pveproxy': true, 'pvedaemon': true, 'pve-cluster': true, }, nodename: nodename, onlineHelp: 'pve_service_daemons', }, { xtype: 'proxmoxNodeNetworkView', title: gettext('Network'), iconCls: 'fa fa-exchange', itemId: 'network', showApplyBtn: true, groups: ['services'], nodename: nodename, onlineHelp: 'sysadmin_network_configuration', }, { xtype: 'pveCertificatesView', title: gettext('Certificates'), iconCls: 'fa fa-certificate', itemId: 'certificates', groups: ['services'], nodename: nodename, }, { xtype: 'proxmoxNodeDNSView', title: gettext('DNS'), iconCls: 'fa fa-globe', groups: ['services'], itemId: 'dns', nodename: nodename, onlineHelp: 'sysadmin_network_configuration', }, { xtype: 'proxmoxNodeHostsView', title: gettext('Hosts'), iconCls: 'fa fa-globe', groups: ['services'], itemId: 'hosts', nodename: nodename, onlineHelp: 'sysadmin_network_configuration', }, { xtype: 'proxmoxNodeTimeView', title: gettext('Time'), itemId: 'time', groups: ['services'], nodename: nodename, iconCls: 'fa fa-clock-o', }); } if (caps.nodes['Sys.Syslog']) { me.items.push({ xtype: 'proxmoxJournalView', title: 'Syslog', iconCls: 'fa fa-list', groups: ['services'], disabled: !caps.nodes['Sys.Syslog'], itemId: 'syslog', url: "/api2/extjs/nodes/" + nodename + "/journal", }); if (caps.nodes['Sys.Modify']) { me.items.push({ xtype: 'proxmoxNodeAPT', title: gettext('Updates'), iconCls: 'fa fa-refresh', disabled: !caps.nodes['Sys.Console'], // do we want to link to system updates instead? itemId: 'apt', upgradeBtn: { xtype: 'pveConsoleButton', disabled: Proxmox.UserName !== 'root@pam', text: gettext('Upgrade'), consoleType: 'upgrade', nodename: nodename, }, nodename: nodename, }); } } if (caps.nodes['Sys.Audit']) { me.items.push( { xtype: 'pveFirewallRules', iconCls: 'fa fa-shield', title: gettext('Firewall'), allow_iface: true, base_url: '/nodes/' + nodename + '/firewall/rules', list_refs_url: '/cluster/firewall/refs', itemId: 'firewall', }, { xtype: 'pveFirewallOptions', title: gettext('Options'), iconCls: 'fa fa-gear', onlineHelp: 'pve_firewall_host_specific_configuration', groups: ['firewall'], base_url: '/nodes/' + nodename + '/firewall/options', fwtype: 'node', itemId: 'firewall-options', }); } if (caps.nodes['Sys.Audit']) { me.items.push( { xtype: 'pmxDiskList', title: gettext('Disks'), itemId: 'storage', expandedOnInit: true, iconCls: 'fa fa-hdd-o', nodename: nodename, includePartitions: true, supportsWipeDisk: true, }, { xtype: 'pveLVMList', title: 'LVM', itemId: 'lvm', onlineHelp: 'chapter_lvm', iconCls: 'fa fa-square', groups: ['storage'], }, { xtype: 'pveLVMThinList', title: 'LVM-Thin', itemId: 'lvmthin', onlineHelp: 'chapter_lvm', iconCls: 'fa fa-square-o', groups: ['storage'], }, { xtype: 'pveDirectoryList', title: Proxmox.Utils.directoryText, itemId: 'directory', onlineHelp: 'chapter_storage', iconCls: 'fa fa-folder', groups: ['storage'], }, { title: 'ZFS', itemId: 'zfs', onlineHelp: 'chapter_zfs', iconCls: 'fa fa-th-large', groups: ['storage'], xtype: 'pveZFSList', }, { xtype: 'pveNodeCephStatus', title: 'Ceph', itemId: 'ceph', iconCls: 'fa fa-ceph', }, { xtype: 'pveNodeCephConfigCrush', title: gettext('Configuration'), iconCls: 'fa fa-gear', groups: ['ceph'], itemId: 'ceph-config', }, { xtype: 'pveNodeCephMonMgr', title: gettext('Monitor'), iconCls: 'fa fa-tv', groups: ['ceph'], itemId: 'ceph-monlist', }, { xtype: 'pveNodeCephOsdTree', title: 'OSD', iconCls: 'fa fa-hdd-o', groups: ['ceph'], itemId: 'ceph-osdtree', }, { xtype: 'pveNodeCephFSPanel', title: 'CephFS', iconCls: 'fa fa-folder', groups: ['ceph'], nodename: nodename, itemId: 'ceph-cephfspanel', }, { xtype: 'pveNodeCephPoolList', title: 'Pools', iconCls: 'fa fa-sitemap', groups: ['ceph'], itemId: 'ceph-pools', }, { xtype: 'pveReplicaView', iconCls: 'fa fa-retweet', title: gettext('Replication'), itemId: 'replication', }, ); } if (caps.nodes['Sys.Syslog']) { me.items.push( { xtype: 'proxmoxLogView', title: gettext('Log'), iconCls: 'fa fa-list', groups: ['firewall'], onlineHelp: 'chapter_pve_firewall', url: '/api2/extjs/nodes/' + nodename + '/firewall/log', itemId: 'firewall-fwlog', }, { xtype: 'cephLogView', title: gettext('Log'), itemId: 'ceph-log', iconCls: 'fa fa-list', groups: ['ceph'], onlineHelp: 'chapter_pveceph', url: "/api2/extjs/nodes/" + nodename + "/ceph/log", nodename: nodename, }); } me.items.push( { title: gettext('Task History'), iconCls: 'fa fa-list', itemId: 'tasks', nodename: nodename, xtype: 'proxmoxNodeTasks', }, { title: gettext('Subscription'), iconCls: 'fa fa-support', itemId: 'support', xtype: 'pveNodeSubscription', nodename: nodename, }, ); me.callParent(); me.mon(me.statusStore, 'load', function(store, records, success) { let uptimerec = store.data.get('uptime'); let powermgmt = caps.nodes['Sys.PowerMgmt'] && uptimerec && uptimerec.data.value; restartBtn.setDisabled(!powermgmt); shutdownBtn.setDisabled(!powermgmt); shellBtn.setDisabled(!powermgmt); }); me.on('afterrender', function() { me.statusStore.startUpdate(); }); me.on('destroy', function() { me.statusStore.stopUpdate(); }); }, });