disabled: true,
dangerous: true,
confirmMsg: function(rec) {
- var me = this.up('grid');
+ let view = this.up('grid');
var warn = gettext('Are you sure you want to remove entry {0}');
var entry = rec.data.key;
var msg = Ext.String.format(warn, "'"
- + me.renderKey(entry, {}, rec) + "'");
+ + view.renderKey(entry, {}, rec) + "'");
return msg;
},
enableFn: function(record) {
- var me = this.up('grid');
+ let view = this.up('grid');
var caps = Ext.state.Manager.get('GuiCap');
- if (me.rows[record.data.key].never_delete ||
- !caps.vms['VM.Config.Network']) {
+ let caps_ci = caps.vms['VM.Config.Network'] || caps.vms['VM.Config.Cloudinit'];
+ if (view.rows[record.data.key].never_delete || !caps_ci) {
return false;
}
return true;
},
handler: function() {
- var me = this.up('grid');
- var records = me.getSelection();
- if (!records || !records.length) {
+ let view = this.up('grid');
+ let records = view.getSelection();
+ if (!records || !records.length) {
return;
}
}
var params = {};
- params['delete'] = id;
+ params.delete = id;
Proxmox.Utils.API2Request({
- url: me.baseurl + '/config',
- waitMsgTarget: me,
+ url: view.baseurl + '/config',
+ waitMsgTarget: view,
method: 'PUT',
params: params,
failure: function(response, opts) {
Ext.Msg.alert('Error', response.htmlStatus);
},
callback: function() {
- me.reload();
- }
+ view.reload();
+ },
});
},
- text: gettext('Remove')
+ text: gettext('Remove'),
},
{
xtype: 'proxmoxButton',
disabled: true,
enableFn: function(rec) {
- let me = this.up('pveCiPanel');
- return !!me.rows[rec.data.key].editor;
+ let view = this.up('pveCiPanel');
+ return !!view.rows[rec.data.key].editor;
},
handler: function() {
- var me = this.up('grid');
- me.run_editor();
+ let view = this.up('grid');
+ view.run_editor();
},
- text: gettext('Edit')
+ text: gettext('Edit'),
},
'-',
{
itemId: 'savebtn',
text: gettext('Regenerate Image'),
handler: function() {
- var me = this.up('grid');
+ let view = this.up('grid');
var eject_params = {};
var insert_params = {};
- var disk = PVE.Parser.parseQemuDrive(me.ciDriveId, me.ciDrive);
+ let disk = PVE.Parser.parseQemuDrive(view.ciDriveId, view.ciDrive);
var storage = '';
- var stormatch = disk.file.match(/^([^\:]+)\:/);
+ var stormatch = disk.file.match(/^([^:]+):/);
if (stormatch) {
storage = stormatch[1];
}
- eject_params[me.ciDriveId] = 'none,media=cdrom';
- insert_params[me.ciDriveId] = storage + ':cloudinit';
+ eject_params[view.ciDriveId] = 'none,media=cdrom';
+ insert_params[view.ciDriveId] = storage + ':cloudinit';
var failure = function(response, opts) {
Ext.Msg.alert('Error', response.htmlStatus);
};
Proxmox.Utils.API2Request({
- url: me.baseurl + '/config',
- waitMsgTarget: me,
+ url: view.baseurl + '/config',
+ waitMsgTarget: view,
method: 'PUT',
params: eject_params,
failure: failure,
callback: function() {
Proxmox.Utils.API2Request({
- url: me.baseurl + '/config',
- waitMsgTarget: me,
+ url: view.baseurl + '/config',
+ waitMsgTarget: view,
method: 'PUT',
params: insert_params,
failure: failure,
callback: function() {
- me.reload();
- }
+ view.reload();
+ },
});
- }
+ },
});
- }
- }
+ },
+ },
],
border: false,
},
listeners: {
- activate: function () {
+ activate: function() {
var me = this;
me.rstore.startUpdate();
},
itemdblclick: function() {
var me = this;
me.run_editor();
- }
+ },
},
initComponent: function() {
}
var caps = Ext.state.Manager.get('GuiCap');
me.baseurl = '/api2/extjs/nodes/' + nodename + '/qemu/' + vmid;
- me.url = me.baseurl + '/pending';
+ me.url = me.baseurl + '/pending';
me.editorConfig.url = me.baseurl + '/config';
me.editorConfig.pveSelNode = me.pveSelNode;
+ let caps_ci = caps.vms['VM.Config.Cloudinit'] || caps.vms['VM.Config.Network'];
/* editor is string and object */
me.rows = {
ciuser: {
iconCls: 'fa fa-user',
never_delete: true,
defaultValue: '',
- editor: caps.vms['VM.Config.Options'] ? {
+ editor: caps_ci ? {
xtype: 'proxmoxWindowEdit',
subject: gettext('User'),
items: [
deleteEmpty: true,
emptyText: Proxmox.Utils.defaultText,
fieldLabel: gettext('User'),
- name: 'ciuser'
- }
- ]
+ name: 'ciuser',
+ },
+ ],
} : undefined,
renderer: function(value) {
- return value || Proxmox.Utils.defaultText;
- }
+ return Ext.String.htmlEncode(value || Proxmox.Utils.defaultText);
+ },
},
cipassword: {
header: gettext('Password'),
iconCls: 'fa fa-unlock',
defaultValue: '',
- editor: caps.vms['VM.Config.Options'] ? {
+ editor: caps_ci ? {
xtype: 'proxmoxWindowEdit',
subject: gettext('Password'),
items: [
deleteEmpty: true,
emptyText: Proxmox.Utils.noneText,
fieldLabel: gettext('Password'),
- name: 'cipassword'
- }
- ]
+ name: 'cipassword',
+ },
+ ],
} : undefined,
renderer: function(value) {
- return value || Proxmox.Utils.noneText;
- }
+ return Ext.String.htmlEncode(value || Proxmox.Utils.noneText);
+ },
},
searchdomain: {
header: gettext('DNS domain'),
iconCls: 'fa fa-globe',
- editor: caps.vms['VM.Config.Network'] ? 'PVE.lxc.DNSEdit' : undefined,
+ editor: caps_ci ? 'PVE.lxc.DNSEdit' : undefined,
never_delete: true,
- defaultValue: gettext('use host settings')
+ defaultValue: gettext('use host settings'),
},
nameserver: {
header: gettext('DNS servers'),
iconCls: 'fa fa-globe',
- editor: caps.vms['VM.Config.Network'] ? 'PVE.lxc.DNSEdit' : undefined,
+ editor: caps_ci ? 'PVE.lxc.DNSEdit' : undefined,
never_delete: true,
- defaultValue: gettext('use host settings')
+ defaultValue: gettext('use host settings'),
},
sshkeys: {
header: gettext('SSH public key'),
iconCls: 'fa fa-key',
- editor: caps.vms['VM.Config.Network'] ? 'PVE.qemu.SSHKeyEdit' : undefined,
+ editor: caps_ci ? 'PVE.qemu.SSHKeyEdit' : undefined,
never_delete: true,
renderer: function(value) {
value = decodeURIComponent(value);
var text = [];
keys.forEach(function(key) {
if (key.length) {
- // First erase all quoted strings (eg. command="foo"
- var v = key.replace(/"(?:\\.|[^"\\])*"/g, '');
- // Now try to detect the comment:
- var res = v.match(/^\s*(\S+\s+)?(?:ssh-(?:dss|rsa|ed25519)|ecdsa-sha2-nistp\d+)\s+\S+\s+(.*?)\s*$/, '');
+ let res = PVE.Parser.parseSSHKey(key);
if (res) {
- key = Ext.String.htmlEncode(res[2]);
- if (res[1]) {
+ key = Ext.String.htmlEncode(res.comment);
+ if (res.options) {
key += ' <span style="color:gray">(' + gettext('with options') + ')</span>';
}
text.push(key);
return Proxmox.Utils.noneText;
}
},
- defaultValue: ''
- }
+ defaultValue: '',
+ },
+ ciupgrade: {
+ header: gettext('Upgrade packages'),
+ iconCls: 'fa fa-archive',
+ renderer: Proxmox.Utils.format_boolean,
+ defaultValue: 1,
+ editor: {
+ xtype: 'proxmoxWindowEdit',
+ subject: gettext('Upgrade packages on boot'),
+ items: {
+ xtype: 'proxmoxcheckbox',
+ name: 'ciupgrade',
+ uncheckedValue: 0,
+ value: 1, // serves as default value, using defaultValue is not enough
+ fieldLabel: gettext('Upgrade packages'),
+ labelWidth: 140,
+ },
+ },
+ },
};
var i;
var ipconfig_renderer = function(value, md, record, ri, ci, store, pending) {
me.rows['net' + i.toString()] = {
multiKey: ['ipconfig' + i.toString(), 'net' + i.toString()],
header: gettext('IP Config') + ' (net' + i.toString() +')',
- editor: caps.vms['VM.Config.Network'] ? 'PVE.qemu.IPConfigEdit' : undefined,
+ editor: caps_ci ? 'PVE.qemu.IPConfigEdit' : undefined,
iconCls: 'fa fa-exchange',
- renderer: ipconfig_renderer
+ renderer: ipconfig_renderer,
};
me.rows['ipconfig' + i.toString()] = {
- visible: false
+ visible: false,
};
}
PVE.Utils.forEachBus(['ide', 'scsi', 'sata'], function(type, id) {
me.rows[type+id] = {
- visible: false
+ visible: false,
};
});
me.callParent();
me.mon(me.rstore, 'load', me.set_button_status, me);
- }
+ },
});