pve-manager/www/manager6/qemu/AgentIPView.js
Dominik Csapak 5fa6f3205a check for VM.Montior privileges on qemu AgentIPView
so that the user does not get the useless 'no information' or
'not running' message, but the real cause

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
2018-05-25 10:43:47 +02:00

221 lines
4.7 KiB
JavaScript

Ext.define('PVE.window.IPInfo', {
extend: 'Ext.window.Window',
width: 600,
title: gettext('Guest Agent Network Information'),
height: 300,
layout: {
type: 'fit'
},
modal: true,
items: [
{
xtype: 'grid',
emptyText: gettext('No network information'),
columns: [
{
dataIndex: 'name',
text: gettext('Name'),
flex: 3
},
{
dataIndex: 'hardware-address',
text: gettext('MAC address'),
width: 140
},
{
dataIndex: 'ip-addresses',
text: gettext('IP address'),
align: 'right',
flex: 4,
renderer: function(val) {
if (!Ext.isArray(val)) {
return '';
}
var ips = [];
val.forEach(function(ip) {
var addr = ip['ip-address'];
var pref = ip.prefix;
if (addr && pref) {
ips.push(addr + '/' + pref);
}
});
return ips.join('<br>');
}
}
]
}
]
});
Ext.define('PVE.qemu.AgentIPView', {
extend: 'Ext.container.Container',
xtype: 'pveAgentIPView',
layout: {
type: 'hbox',
align: 'top'
},
nics: [],
items: [
{
xtype: 'box',
html: '<i class="fa fa-exchange"></i> IPs'
},
{
xtype: 'container',
flex: 1,
layout: {
type: 'vbox',
align: 'right',
pack: 'end'
},
items: [
{
xtype: 'label',
flex: 1,
itemId: 'ipBox',
style: {
'text-align': 'right'
}
},
{
xtype: 'button',
itemId: 'moreBtn',
hidden: true,
ui: 'default-toolbar',
handler: function(btn) {
var me = this.up('pveAgentIPView');
var win = Ext.create('PVE.window.IPInfo');
win.down('grid').getStore().setData(me.nics);
win.show();
},
text: gettext('More')
}
]
}
],
getDefaultIps: function(nics) {
var me = this;
var ips = [];
nics.forEach(function(nic) {
if (nic['hardware-address'] &&
nic['hardware-address'] != '00:00:00:00:00:00') {
var nic_ips = nic['ip-addresses'] || [];
nic_ips.forEach(function(ip) {
var p = ip['ip-address'];
// show 2 ips at maximum
if (ips.length < 2) {
ips.push(p);
}
});
}
});
return ips;
},
startIPStore: function(store, records, success) {
var me = this;
var agentRec = store.getById('agent');
/*jslint confusion: true*/
/* value is number and string */
me.agent = (agentRec && agentRec.data.value === 1);
me.running = (store.getById('status').data.value === 'running');
/*jslint confusion: false*/
var caps = Ext.state.Manager.get('GuiCap');
if (!caps.vms['VM.Monitor']) {
var errorText = gettext("Requires '{0}' Privileges");
me.updateStatus(false, Ext.String.format(errorText, 'VM.Monitor'));
return;
}
if (me.agent && me.running && me.ipStore.isStopped) {
me.ipStore.startUpdate();
}
me.updateStatus();
},
updateStatus: function(unsuccessful, defaulttext) {
var me = this;
var text = defaulttext || gettext('No network information');
var more = false;
if (unsuccessful) {
text = gettext('Guest Agent not running');
} else if (me.agent && me.running) {
if (Ext.isArray(me.nics)) {
more = true;
var ips = me.getDefaultIps(me.nics);
if (ips.length !== 0) {
text = ips.join('<br>');
}
} else if (me.nics && me.nics.error) {
var msg = gettext('Cannot get info from Guest Agent<br>Error: {0}');
text = Ext.String.format(text, me.nics.error.desc);
}
} else if (me.agent) {
text = gettext('Guest Agent not running');
} else {
text = gettext('No Guest Agent configured');
}
var ipBox = me.down('#ipBox');
ipBox.update(text);
var moreBtn = me.down('#moreBtn');
moreBtn.setVisible(more);
},
initComponent: function() {
var me = this;
if (!me.rstore) {
throw 'rstore not given';
}
if (!me.pveSelNode) {
throw 'pveSelNode not given';
}
var nodename = me.pveSelNode.data.node;
var vmid = me.pveSelNode.data.vmid;
me.ipStore = Ext.create('Proxmox.data.UpdateStore', {
interval: 10000,
storeid: 'pve-qemu-agent-' + vmid,
method: 'POST',
proxy: {
type: 'proxmox',
url: '/api2/json/nodes/' + nodename + '/qemu/' + vmid + '/agent/network-get-interfaces'
}
});
me.callParent();
me.mon(me.ipStore, 'load', function(store, records, success) {
if (records && records.length) {
me.nics = records[0].data.result;
} else {
me.nics = undefined;
}
me.updateStatus(!success);
});
me.on('destroy', me.ipStore.stopUpdate);
// if we already have info about the vm, use it immediately
if (me.rstore.getCount()) {
me.startIPStore(me.rstore, me.rstore.getData(), false);
}
// check if the guest agent is there on every statusstore load
me.mon(me.rstore, 'load', me.startIPStore, me);
}
});