]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/Network.js
1 Ext
.define('PVE.lxc.NetworkInputPanel', {
2 extend
: 'Proxmox.panel.InputPanel',
3 alias
: 'widget.pveLxcNetworkInputPanel',
7 onlineHelp
: 'pct_container_network',
9 setNodename: function(nodename
) {
12 if (!nodename
|| me
.nodename
=== nodename
) {
15 me
.nodename
= nodename
;
17 let bridgeSelector
= me
.query("[isFormField][name=bridge]")[0];
18 bridgeSelector
.setNodename(nodename
);
21 onGetValues: function(values
) {
33 if (values
.ipv6mode
!== 'static') {
34 values
.ip6
= values
.ipv6mode
;
36 if (values
.ipv4mode
!== 'static') {
37 values
.ip
= values
.ipv4mode
;
39 newdata
[id
] = PVE
.Parser
.printLxcNetwork(values
);
44 initComponent: function() {
48 if (me
.insideWizard
) {
53 cdata
.firewall
= me
.insideWizard
|| me
.isCreate
;
56 throw "no dataCache specified";
61 throw "no interface name specified";
63 if (!me
.dataCache
[me
.ifname
]) {
64 throw "no such interface '" + me
.ifname
+ "'";
66 cdata
= PVE
.Parser
.parseLxcNetwork(me
.dataCache
[me
.ifname
]);
69 for (let i
= 0; i
< 32; i
++) {
70 let ifname
= 'net' + i
.toString();
71 if (me
.isCreate
&& !me
.dataCache
[ifname
]) {
86 fieldLabel
: gettext('Name'),
87 emptyText
: '(e.g., eth0)',
90 validator: function(value
) {
91 for (const [key
, netRaw
] of Object
.entries(me
.dataCache
)) {
92 if (!key
.match(/^net\d+/) || key
=== me
.ifname
) {
95 let net
= PVE
.Parser
.parseLxcNetwork(netRaw
);
96 if (net
.name
=== value
) {
97 return "interface name already in use";
106 fieldLabel
: gettext('MAC address'),
113 xtype
: 'PVE.form.BridgeSelector',
115 nodename
: me
.nodename
,
116 fieldLabel
: gettext('Bridge'),
121 xtype
: 'pveVlanField',
126 xtype
: 'numberfield',
128 fieldLabel
: gettext('Rate limit') + ' (MB/s)',
132 emptyText
: 'unlimited',
136 xtype
: 'proxmoxcheckbox',
137 fieldLabel
: gettext('Firewall'),
139 value
: cdata
.firewall
,
143 let dhcp4
= cdata
.ip
=== 'dhcp';
149 let auto6
= cdata
.ip6
=== 'auto';
150 let dhcp6
= cdata
.ip6
=== 'dhcp';
151 if (auto6
|| dhcp6
) {
167 text
: 'IPv4:', // do not localize
171 boxLabel
: gettext('Static'),
173 inputValue
: 'static',
177 change: function(cb
, value
) {
178 me
.down('field[name=ip]').setEmptyText(
179 value
? Proxmox
.Utils
.NoneText
: "",
181 me
.down('field[name=ip]').setDisabled(!value
);
182 me
.down('field[name=gw]').setDisabled(!value
);
188 boxLabel
: 'DHCP', // do not localize
199 vtype
: 'IPCIDRAddress',
201 emptyText
: dhcp4
? '' : Proxmox
.Utils
.NoneText
,
203 fieldLabel
: 'IPv4/CIDR', // do not localize
211 fieldLabel
: gettext('Gateway') + ' (IPv4)',
212 margin
: '0 0 3 0', // override bottom margin to account for the menuseparator
215 xtype
: 'menuseparator',
229 text
: 'IPv6:', // do not localize
233 boxLabel
: gettext('Static'),
235 inputValue
: 'static',
236 checked
: !(auto6
|| dhcp6
),
239 change: function(cb
, value
) {
240 me
.down('field[name=ip6]').setEmptyText(
241 value
? Proxmox
.Utils
.NoneText
: "",
243 me
.down('field[name=ip6]').setDisabled(!value
);
244 me
.down('field[name=gw6]').setDisabled(!value
);
250 boxLabel
: 'DHCP', // do not localize
258 boxLabel
: 'SLAAC', // do not localize
270 emptyText
: dhcp6
|| auto6
? '' : Proxmox
.Utils
.NoneText
,
271 vtype
: 'IP6CIDRAddress',
272 disabled
: dhcp6
|| auto6
,
273 fieldLabel
: 'IPv6/CIDR', // do not localize
280 disabled
: dhcp6
|| auto6
,
281 fieldLabel
: gettext('Gateway') + ' (IPv6)',
285 me
.advancedColumn1
= [
287 xtype
: 'proxmoxintegerfield',
289 emptyText
: gettext('Same as bridge'),
301 Ext
.define('PVE.lxc.NetworkEdit', {
302 extend
: 'Proxmox.window.Edit',
306 initComponent: function() {
310 throw "no dataCache specified";
313 throw "no node name specified";
317 subject
: gettext('Network Device') + ' (veth)',
318 digest
: me
.dataCache
.digest
,
321 xtype
: 'pveLxcNetworkInputPanel',
323 nodename
: me
.nodename
,
324 dataCache
: me
.dataCache
,
325 isCreate
: me
.isCreate
,
334 Ext
.define('PVE.lxc.NetworkView', {
335 extend
: 'Ext.grid.GridPanel',
336 alias
: 'widget.pveLxcNetworkView',
338 onlineHelp
: 'pct_container_network',
340 dataCache
: {}, // used to store result of last load
343 stateId
: 'grid-lxc-network',
348 Proxmox
.Utils
.setErrorMask(me
, true);
350 Proxmox
.Utils
.API2Request({
352 failure: function(response
, opts
) {
353 Proxmox
.Utils
.setErrorMask(me
, gettext('Error') + ': ' + response
.htmlStatus
);
355 success: function(response
, opts
) {
356 Proxmox
.Utils
.setErrorMask(me
, false);
357 let result
= Ext
.decode(response
.responseText
);
358 me
.dataCache
= result
.data
|| {};
360 for (const [key
, value
] of Object
.entries(me
.dataCache
)) {
361 if (key
.match(/^net\d+/)) {
362 let net
= PVE
.Parser
.parseLxcNetwork(value
);
367 me
.store
.loadData(records
);
368 me
.down('button[name=addButton]').setDisabled(records
.length
>= 32);
373 initComponent: function() {
376 let nodename
= me
.pveSelNode
.data
.node
;
378 throw "no node name specified";
381 let vmid
= me
.pveSelNode
.data
.vmid
;
383 throw "no VM ID specified";
386 let caps
= Ext
.state
.Manager
.get('GuiCap');
388 me
.url
= `/nodes/${nodename}/lxc/${vmid}/config`;
390 let store
= new Ext
.data
.Store({
391 model
: 'pve-lxc-network',
400 let sm
= Ext
.create('Ext.selection.RowModel', {});
402 let run_editor = function() {
403 let rec
= sm
.getSelection()[0];
404 if (!rec
|| !caps
.vms
['VM.Config.Network']) {
405 return false; // disable default-propagation when triggered by grid dblclick
407 Ext
.create('PVE.lxc.NetworkEdit', {
410 dataCache
: me
.dataCache
,
413 destroy
: () => me
.load(),
417 return undefined; // make eslint happier
425 text
: gettext('Add'),
427 disabled
: !caps
.vms
['VM.Config.Network'],
428 handler: function() {
429 Ext
.create('PVE.lxc.NetworkEdit', {
433 dataCache
: me
.dataCache
,
435 destroy
: () => me
.load(),
442 xtype
: 'proxmoxButton',
443 text
: gettext('Remove'),
446 enableFn: function(rec
) {
447 return !!caps
.vms
['VM.Config.Network'];
449 confirmMsg
: ({ data
}) =>
450 Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'), `'${data.id}'`),
451 handler: function(btn
, e
, rec
) {
452 Proxmox
.Utils
.API2Request({
457 'delete': rec
.data
.id
,
458 digest
: me
.dataCache
.digest
,
460 callback
: () => me
.load(),
461 failure
: (response
, opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
466 xtype
: 'proxmoxButton',
467 text
: gettext('Edit'),
470 enableFn
: rec
=> !!caps
.vms
['VM.Config.Network'],
481 header
: gettext('Name'),
486 header
: gettext('Bridge'),
491 header
: gettext('Firewall'),
493 dataIndex
: 'firewall',
494 renderer
: Proxmox
.Utils
.format_boolean
,
497 header
: gettext('VLAN Tag'),
502 header
: gettext('MAC address'),
507 header
: gettext('IP address'),
510 renderer: function(value
, metaData
, rec
) {
511 if (rec
.data
.ip
&& rec
.data
.ip6
) {
512 return rec
.data
.ip
+ "<br>" + rec
.data
.ip6
;
513 } else if (rec
.data
.ip6
) {
521 header
: gettext('Gateway'),
524 renderer: function(value
, metaData
, rec
) {
525 if (rec
.data
.gw
&& rec
.data
.gw6
) {
526 return rec
.data
.gw
+ "<br>" + rec
.data
.gw6
;
527 } else if (rec
.data
.gw6
) {
535 header
: gettext('MTU'),
542 itemdblclick
: run_editor
,
549 Ext
.define('pve-lxc-network', {
550 extend
: "Ext.data.Model",
551 proxy
: { type
: 'memory' },