]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/lxc/Network.js
1 Ext
.define('PVE.lxc.NetworkInputPanel', {
2 extend
: 'PVE.panel.InputPanel',
3 alias
: 'widget.pveLxcNetworkInputPanel',
7 onlineHelp
: 'chapter-pct.html#_container_network',
9 setNodename: function(nodename
) {
12 if (!nodename
|| (me
.nodename
=== nodename
)) {
16 me
.nodename
= nodename
;
18 var bridgesel
= me
.query("[isFormField][name=bridge]")[0];
19 bridgesel
.setNodename(nodename
);
22 onGetValues: function(values
) {
39 if (values
.ipv6mode
!== 'static') {
40 values
.ip6
= values
.ipv6mode
;
42 if (values
.ipv4mode
!== 'static') {
43 values
.ip
= values
.ipv4mode
;
45 newdata
[id
] = PVE
.Parser
.printLxcNetwork(values
);
49 initComponent : function() {
53 throw "no dataCache specified";
58 if (me
.insideWizard
) {
65 throw "no interface name specified";
67 if (!me
.dataCache
[me
.ifname
]) {
68 throw "no such interface '" + me
.ifname
+ "'";
71 cdata
= PVE
.Parser
.parseLxcNetwork(me
.dataCache
[me
.ifname
]);
75 for (i
= 0; i
< 10; i
++) {
76 if (me
.create
&& !me
.dataCache
['net'+i
.toString()]) {
77 me
.ifname
= 'net' + i
.toString();
93 fieldLabel
: gettext('Name') + ' (i.e. eth0)',
96 validator: function(value
) {
98 Ext
.Object
.each(me
.dataCache
, function(key
, netstr
) {
99 if (!key
.match(/^net\d+/) || key
=== me
.ifname
) {
102 var net
= PVE
.Parser
.parseLxcNetwork(netstr
);
103 if (net
.name
=== value
) {
104 result
= "interface name already in use";
111 // validator can return bool/string
112 /*jslint confusion:true*/
119 fieldLabel
: gettext('MAC address'),
126 xtype
: 'PVE.form.BridgeSelector',
128 nodename
: me
.nodename
,
129 fieldLabel
: gettext('Bridge'),
134 xtype
: 'pveVlanField',
139 xtype
: 'numberfield',
141 fieldLabel
: gettext('Rate limit') + ' (MB/s)',
145 emptyText
: 'unlimited',
149 xtype
: 'pvecheckbox',
150 fieldLabel
: gettext('Firewall'),
152 checked
: cdata
.firewall
156 var dhcp4
= (cdata
.ip
=== 'dhcp');
162 var auto6
= (cdata
.ip6
=== 'auto');
163 var dhcp6
= (cdata
.ip6
=== 'dhcp');
164 if (auto6
|| dhcp6
) {
180 text
: gettext('IPv4') + ':'
184 boxLabel
: gettext('Static'),
186 inputValue
: 'static',
190 change: function(cb
, value
) {
191 me
.down('field[name=ip]').setDisabled(!value
);
192 me
.down('field[name=gw]').setDisabled(!value
);
198 boxLabel
: gettext('DHCP'),
209 vtype
: 'IPCIDRAddress',
212 fieldLabel
: gettext('IPv4/CIDR')
220 fieldLabel
: gettext('Gateway') + ' (' + gettext('IPv4') +')',
221 margin
: '0 0 3 0' // override bottom margin to account for the menuseparator
224 xtype
: 'menuseparator',
238 text
: gettext('IPv6') + ':'
242 boxLabel
: gettext('Static'),
244 inputValue
: 'static',
245 checked
: !(auto6
|| dhcp6
),
248 change: function(cb
, value
) {
249 me
.down('field[name=ip6]').setDisabled(!value
);
250 me
.down('field[name=gw6]').setDisabled(!value
);
256 boxLabel
: gettext('DHCP'),
264 boxLabel
: gettext('SLAAC'),
276 vtype
: 'IP6CIDRAddress',
277 disabled
: (dhcp6
|| auto6
),
278 fieldLabel
: gettext('IPv6/CIDR')
285 disabled
: (dhcp6
|| auto6
),
286 fieldLabel
: gettext('Gateway') + ' (' + gettext('IPv6') +')'
294 /*jslint confusion: true */
295 Ext
.define('PVE.lxc.NetworkEdit', {
296 extend
: 'PVE.window.Edit',
300 initComponent : function() {
304 throw "no dataCache specified";
308 throw "no node name specified";
311 var ipanel
= Ext
.create('PVE.lxc.NetworkInputPanel', {
313 nodename
: me
.nodename
,
314 dataCache
: me
.dataCache
,
319 subject
: gettext('Network Device') + ' (veth)',
320 digest
: me
.dataCache
.digest
,
328 Ext
.define('PVE.lxc.NetworkView', {
329 extend
: 'Ext.grid.GridPanel',
330 alias
: ['widget.pveLxcNetworkView'],
332 dataCache
: {}, // used to store result of last load
337 PVE
.Utils
.setErrorMask(me
, true);
339 PVE
.Utils
.API2Request({
341 failure: function(response
, opts
) {
342 PVE
.Utils
.setErrorMask(me
, gettext('Error') + ': ' + response
.htmlStatus
);
344 success: function(response
, opts
) {
345 PVE
.Utils
.setErrorMask(me
, false);
346 var result
= Ext
.decode(response
.responseText
);
347 var data
= result
.data
|| {};
350 Ext
.Object
.each(data
, function(key
, value
) {
351 if (!key
.match(/^net\d+/)) {
354 var net
= PVE
.Parser
.parseLxcNetwork(value
);
358 me
.store
.loadData(records
);
359 me
.down('button[name=addButton]').setDisabled((records
.length
>= 10));
364 initComponent : function() {
367 var nodename
= me
.pveSelNode
.data
.node
;
369 throw "no node name specified";
372 var vmid
= me
.pveSelNode
.data
.vmid
;
374 throw "no VM ID specified";
377 var caps
= Ext
.state
.Manager
.get('GuiCap');
379 me
.url
= '/nodes/' + nodename
+ '/lxc/' + vmid
+ '/config';
381 var store
= new Ext
.data
.Store({
382 model
: 'pve-lxc-network',
391 var sm
= Ext
.create('Ext.selection.RowModel', {});
393 var remove_btn
= new PVE
.button
.Button({
394 text
: gettext('Remove'),
397 enableFn: function(rec
) {
398 return !!caps
.vms
['VM.Config.Network'];
400 confirmMsg: function (rec
) {
401 return Ext
.String
.format(gettext('Are you sure you want to remove entry {0}'),
402 "'" + rec
.data
.id
+ "'");
404 handler: function(btn
, event
, rec
) {
405 PVE
.Utils
.API2Request({
409 params
: { 'delete': rec
.data
.id
, digest
: me
.dataCache
.digest
},
410 callback: function() {
413 failure: function (response
, opts
) {
414 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
420 var run_editor = function() {
421 var rec
= sm
.getSelection()[0];
426 if (!caps
.vms
['VM.Config.Network']) {
430 var win
= Ext
.create('PVE.lxc.NetworkEdit', {
433 dataCache
: me
.dataCache
,
436 win
.on('destroy', me
.load
, me
);
440 var edit_btn
= new PVE
.button
.Button({
441 text
: gettext('Edit'),
444 enableFn: function(rec
) {
445 if (!caps
.vms
['VM.Config.Network']) {
459 text
: gettext('Add'),
461 disabled
: !caps
.vms
['VM.Config.Network'],
462 handler: function() {
463 var win
= Ext
.create('PVE.lxc.NetworkEdit', {
467 dataCache
: me
.dataCache
469 win
.on('destroy', me
.load
, me
);
478 header
: gettext('ID'),
483 header
: gettext('Name'),
488 header
: gettext('Bridge'),
493 header
: gettext('Firewall'),
495 dataIndex
: 'firewall',
496 renderer
: PVE
.Utils
.format_boolean
499 header
: gettext('VLAN Tag'),
504 header
: gettext('MAC address'),
509 header
: gettext('IP address'),
512 renderer: function(value
, metaData
, rec
) {
513 if (rec
.data
.ip
&& rec
.data
.ip6
) {
514 return rec
.data
.ip
+ "<br>" + rec
.data
.ip6
;
515 } else if (rec
.data
.ip6
) {
523 header
: gettext('Gateway'),
526 renderer: function(value
, metaData
, rec
) {
527 if (rec
.data
.gw
&& rec
.data
.gw6
) {
528 return rec
.data
.gw
+ "<br>" + rec
.data
.gw6
;
529 } else if (rec
.data
.gw6
) {
539 itemdblclick
: run_editor
547 Ext
.define('pve-lxc-network', {
548 extend
: "Ext.data.Model",
549 proxy
: { type
: 'memory' },
550 fields
: [ 'id', 'name', 'hwaddr', 'bridge',
551 'ip', 'gw', 'ip6', 'gw6', 'tag', 'firewall' ]