]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/Network.js
7b6437c5a414a0e36f995c0f327e9c2f4da249e3
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)',
289 Ext
.define('PVE.lxc.NetworkEdit', {
290 extend
: 'Proxmox.window.Edit',
294 initComponent: function() {
298 throw "no dataCache specified";
301 throw "no node name specified";
305 subject
: gettext('Network Device') + ' (veth)',
306 digest
: me
.dataCache
.digest
,
309 xtype
: 'pveLxcNetworkInputPanel',
311 nodename
: me
.nodename
,
312 dataCache
: me
.dataCache
,
313 isCreate
: me
.isCreate
,
322 Ext
.define('PVE.lxc.NetworkView', {
323 extend
: 'Ext.grid.GridPanel',
324 alias
: 'widget.pveLxcNetworkView',
326 onlineHelp
: 'pct_container_network',
328 dataCache
: {}, // used to store result of last load
331 stateId
: 'grid-lxc-network',
336 Proxmox
.Utils
.setErrorMask(me
, true);
338 Proxmox
.Utils
.API2Request({
340 failure: function(response
, opts
) {
341 Proxmox
.Utils
.setErrorMask(me
, gettext('Error') + ': ' + response
.htmlStatus
);
343 success: function(response
, opts
) {
344 Proxmox
.Utils
.setErrorMask(me
, false);
345 let result
= Ext
.decode(response
.responseText
);
346 me
.dataCache
= result
.data
|| {};
348 for (const [key
, value
] of Object
.entries(me
.dataCache
)) {
349 if (key
.match(/^net\d+/)) {
350 let net
= PVE
.Parser
.parseLxcNetwork(value
);
355 me
.store
.loadData(records
);
356 me
.down('button[name=addButton]').setDisabled(records
.length
>= 32);
361 initComponent: function() {
364 let nodename
= me
.pveSelNode
.data
.node
;
366 throw "no node name specified";
369 let vmid
= me
.pveSelNode
.data
.vmid
;
371 throw "no VM ID specified";
374 let caps
= Ext
.state
.Manager
.get('GuiCap');
376 me
.url
= `/nodes/${nodename}/lxc/${vmid}/config`;
378 let store
= new Ext
.data
.Store({
379 model
: 'pve-lxc-network',
388 let sm
= Ext
.create('Ext.selection.RowModel', {});
390 let run_editor = function() {
391 let rec
= sm
.getSelection()[0];
392 if (!rec
|| !caps
.vms
['VM.Config.Network']) {
393 return false; // disable default-propagation when triggered by grid dblclick
395 Ext
.create('PVE.lxc.NetworkEdit', {
398 dataCache
: me
.dataCache
,
401 destroy
: () => me
.load(),
405 return undefined; // make eslint happier
413 text
: gettext('Add'),
415 disabled
: !caps
.vms
['VM.Config.Network'],
416 handler: function() {
417 Ext
.create('PVE.lxc.NetworkEdit', {
421 dataCache
: me
.dataCache
,
423 destroy
: () => me
.load(),
430 xtype
: 'proxmoxButton',
431 text
: gettext('Remove'),
434 enableFn: function(rec
) {
435 return !!caps
.vms
['VM.Config.Network'];
437 confirmMsg
: ({ data
}) =>
438 Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'), `'${data.id}'`),
439 handler: function(btn
, e
, rec
) {
440 Proxmox
.Utils
.API2Request({
445 'delete': rec
.data
.id
,
446 digest
: me
.dataCache
.digest
,
448 callback
: () => me
.load(),
449 failure
: (response
, opts
) => Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
),
454 xtype
: 'proxmoxButton',
455 text
: gettext('Edit'),
458 enableFn
: rec
=> !!caps
.vms
['VM.Config.Network'],
469 header
: gettext('Name'),
474 header
: gettext('Bridge'),
479 header
: gettext('Firewall'),
481 dataIndex
: 'firewall',
482 renderer
: Proxmox
.Utils
.format_boolean
,
485 header
: gettext('VLAN Tag'),
490 header
: gettext('MAC address'),
495 header
: gettext('IP address'),
498 renderer: function(value
, metaData
, rec
) {
499 if (rec
.data
.ip
&& rec
.data
.ip6
) {
500 return rec
.data
.ip
+ "<br>" + rec
.data
.ip6
;
501 } else if (rec
.data
.ip6
) {
509 header
: gettext('Gateway'),
512 renderer: function(value
, metaData
, rec
) {
513 if (rec
.data
.gw
&& rec
.data
.gw6
) {
514 return rec
.data
.gw
+ "<br>" + rec
.data
.gw6
;
515 } else if (rec
.data
.gw6
) {
525 itemdblclick
: run_editor
,
532 Ext
.define('pve-lxc-network', {
533 extend
: "Ext.data.Model",
534 proxy
: { type
: 'memory' },