Univention Bugzilla – Attachment 4784 Details for
Bug 28389
Unterstützung für Bridges, VLANs, Bonding / Flexibilität via UMC
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch Stand 2012-11-12
system-setup-network.patch (text/plain), 85.20 KB, created by
Dirk Wiesenthal
on 2012-11-12 19:38:31 CET
(
hide
)
Description:
Patch Stand 2012-11-12
Filename:
MIME Type:
Creator:
Dirk Wiesenthal
Created:
2012-11-12 19:38:31 CET
Size:
85.20 KB
patch
obsolete
>Index: umc/js/setup/types.js >=================================================================== >--- umc/js/setup/types.js (Revision 0) >+++ umc/js/setup/types.js (Revision 37168) >@@ -0,0 +1,107 @@ >+/* >+ * Copyright 2012 Univention GmbH >+ * >+ * http://www.univention.de/ >+ * >+ * All rights reserved. >+ * >+ * The source code of this program is made available >+ * under the terms of the GNU Affero General Public License version 3 >+ * (GNU AGPL V3) as published by the Free Software Foundation. >+ * >+ * Binary versions of this program provided by Univention to you as >+ * well as other copyrighted, protected or trademarked materials like >+ * Logos, graphics, fonts, specific documentations and configurations, >+ * cryptographic keys etc. are subject to a license agreement between >+ * you and Univention and not subject to the GNU AGPL V3. >+ * >+ * In the case you use this program under the terms of the GNU AGPL V3, >+ * the program is provided in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+ * GNU Affero General Public License for more details. >+ * >+ * You should have received a copy of the GNU Affero General Public >+ * License with the Debian GNU/Linux or Univention distribution in file >+ * /usr/share/common-licenses/AGPL-3; if not, see >+ * <http://www.gnu.org/licenses/>. >+ */ >+/*global define*/ >+ >+define([ >+ "dojo/_base/array", >+ "umc/tools", >+ "umc/i18n!umc/modules/setup" >+], function(array, tools, _) { >+ var self = { >+ convertNetmask: function(nm) { >+ if (/^[0-9]+$/.test(nm)) { >+ return parseInt(nm, 10); >+ } >+ // TODO: IE8 does not have .reduce >+ return array.map(nm.split('.'), function(i) { return parseInt((parseInt(i, 10) + 1) / 32, 10); }).reduce(function(x,y) { return x + y; }); >+ }, >+ interfaceTypes: { >+ 'eth': _('Ethernet'), >+ 'vlan': _('Virtual LAN'), >+ 'bond': _('Bonding'), >+ 'br': _('Bridge') >+ }, >+ getTypeByDevice: function(device) { // TODO: rename >+ var key = /^([^\d]+)\d$/.exec(device); >+ return key ? key[1] : device; >+ }, >+ getNumberByDevice: function(device) { >+ var num = /^[^\d]+(\d+)$/.exec(device); >+ return num ? num[1] : device; >+ }, >+ interfaceValues: function() { >+ var arr = []; >+ tools.forIn(self.interfaceTypes, function(id, label) { >+ arr.push({ >+ id: id, >+ label: label >+ }); >+ }); >+ return arr; >+ }, >+ interfaceValuesDict: function() { >+ var d = {}; >+ tools.forIn(self.interfaceTypes, function(id, label) { >+ d[id] = { >+ id: id, >+ label: label >+ }; >+ }); >+ return d; >+ }, >+ filterInterfaces: function(/*String[]*/ interfaces, /*Object[]*/ available_interfaces) { >+ // filter interfaces, which are available for use (because no interface already uses one of the interface) >+ return array.filter(array.map(interfaces, function(/*String*/iface) { >+ if (available_interfaces.length && !array.every(available_interfaces, function(/*Object*/item) { >+ >+ if (item.interfaceType === 'br' || item.interfaceType === 'bond') { >+ // the interface is a bridge or bonding so it can contain subinterfaces >+ var key = item.interfaceType === 'br' ? 'bridge_ports' : 'bond_slaves'; >+ if(item[key] && item[key].length) { >+ return array.every(item[key], function(/*String*/_iface) { >+ return _iface !== item['interface']; >+ }); >+ } >+ return true; // no subtypes (bridge) >+ } >+ >+ return true; // interface without subinterfaces >+ })) { >+ return null; >+ } >+ return { >+ id: iface, >+ label: iface >+ }; >+ }), function(v) { return v !== null; }); >+ } >+ }; >+ >+ return self; >+}); >Index: umc/js/setup/InterfaceGrid.js >=================================================================== >--- umc/js/setup/InterfaceGrid.js (Revision 0) >+++ umc/js/setup/InterfaceGrid.js (Revision 37168) >@@ -0,0 +1,396 @@ >+/* >+ * Copyright 2012 Univention GmbH >+ * >+ * http://www.univention.de/ >+ * >+ * All rights reserved. >+ * >+ * The source code of this program is made available >+ * under the terms of the GNU Affero General Public License version 3 >+ * (GNU AGPL V3) as published by the Free Software Foundation. >+ * >+ * Binary versions of this program provided by Univention to you as >+ * well as other copyrighted, protected or trademarked materials like >+ * Logos, graphics, fonts, specific documentations and configurations, >+ * cryptographic keys etc. are subject to a license agreement between >+ * you and Univention and not subject to the GNU AGPL V3. >+ * >+ * In the case you use this program under the terms of the GNU AGPL V3, >+ * the program is provided in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+ * GNU Affero General Public License for more details. >+ * >+ * You should have received a copy of the GNU Affero General Public >+ * License with the Debian GNU/Linux or Univention distribution in file >+ * /usr/share/common-licenses/AGPL-3; if not, see >+ * <http://www.gnu.org/licenses/>. >+ */ >+/*global define*/ >+ >+define([ >+ "dojo/_base/declare", >+ "dojo/_base/lang", >+ "dojo/_base/array", >+ "dojo/aspect", >+ "dijit/Dialog", >+ "umc/dialog", >+ "umc/tools", >+ "umc/widgets/Grid", >+ "umc/widgets/Form", >+ "umc/widgets/ComboBox", >+ "umc/widgets/TextBox", >+ "umc/modules/setup/InterfaceWizard", >+ "umc/modules/setup/types", >+ "umc/i18n!umc/modules/setup" >+], function(declare, lang, array, aspect, Dialog, dialog, tools, Grid, Form, ComboBox, TextBox, InterfaceWizard, types, _) { >+ return declare("umc.modules.setup.InterfaceGrid", [ Grid ], { >+ moduleStore: null, >+ >+ style: 'width: 100%; height: 200px;', >+ query: {}, >+ sortIndex: null, >+ >+ physical_interfaces: [], >+ >+ gateway: "", >+ nameserver: [], >+ >+ constructor: function() { >+ lang.mixin(this, { >+ columns: [{ >+ name: 'interface', >+ label: _('Interface'), >+ width: '15%' >+ }, { >+ name: 'interfaceType', >+ label: _('Type'), >+ width: '15%', >+ formatter: function(value) { >+ return types.interfaceTypes[value] || value; >+ } >+ }, { >+ name: 'information', >+ label: _('Information'), >+ formatter: function(iface) { >+ // This value 'iface' is a hack. We do not know about which identifier this row has so we added the whole information into iface.information >+ var back = ''; >+ if (((iface.interfaceType === 'eth' || iface.interfaceType === 'vlan') && iface.type !== 'manual') || (iface.interfaceType === 'bond' || iface.interfaceType === 'br')) { >+ var formatIp = function(ips) { >+ return array.map(ips, function(i) { return i[0] + '/' + types.convertNetmask(i[1]);}).join(', '); >+ }; >+ back = _('IP addresses') + ': '; >+ if (iface.ip4dynamic) { >+ back += 'DHCP'; >+ } else if (iface.ip4.length){ >+ back += formatIp(iface.ip4); >+ } >+ if (iface.ip6dynamic) { >+ back += ', <br>SLAAC'; >+ } else if (iface.ip6.length) { >+ back += ', <br>' + formatIp(iface.ip6); >+ } >+ } >+ if (iface.interfaceType === 'br' || iface.interfaceType === 'bond') { >+ back += '<br>' + _('Interfaces') + ': ' + iface[iface.interfaceType === 'br' ? 'bridge_ports' : 'bond-slaves'].join(', '); >+ } >+ return back; >+ }, >+ width: '70%' >+ }], >+ actions: [{ >+ // TODO: decide if we show a DHCP query action for every row?! >+// name: 'dhcp_query', >+// label: 'DHCP query', >+// callback: lang.hitch(this, function() { >+// // TODO: interface name >+// // this._dhcpQuery(); >+// }), >+// isMultiAction: false, >+// isStandardAction: true, >+// isContextAction: true >+// }, { >+ name: 'edit', >+ label: _('Edit'), >+ iconClass: 'umcIconEdit', >+ isMultiAction: false, >+ isStandardAction: true, >+ isContextAction: true, >+ callback: lang.hitch(this, '_editInterface') >+ }, { >+ name: 'add', >+ label: _('Add interface'), >+ iconClass: 'umcIconAdd', >+ isMultiAction: false, >+ isStandardAction: false, >+ isContextAction: false, >+ callback: lang.hitch(this, '_addInterface') >+ }, { >+ name: 'delete', >+ label: _('Delete'), >+ iconClass: 'umcIconDelete', >+ isMultiAction: true, >+ isStandardAction: true, >+ callback: lang.hitch(this, function(ids) { >+ dialog.confirm(_('Please confirm the removal of the %d selected interfaces!', ids.length), [{ >+ label: _('Delete'), >+ callback: lang.hitch(this, '_removeInterface', ids) >+ }, { >+ label: _('Cancel'), >+ 'default': true >+ }]); >+ }) >+ }] >+ }); >+ }, >+ >+ _getValueAttr: function() { return this.getAllItems(); }, >+ >+ _setValueAttr: function(values) { >+ // TODO: this method should delete the whole grid items and add the items from values >+ }, >+ >+ setInitialValue: function(values) { >+ tools.forIn(values, function(id, value) { >+ try { >+ this.moduleStore.add(lang.mixin({'interface': id}, value)); >+ } catch(e) {} >+ }, this); >+ }, >+ >+ onChanged: function() { >+ // event stub >+ }, >+ >+ updateValues: function(values, create) { >+ // if a DHCP query was done the values for gateway and nameserver are set >+ // so we trigger on change event >+ if (values.gateway !== '') { >+ this.set('gateway', values.gateway); >+ } >+ if (values.nameserver.length) { >+ // TODO: decide if the DHCP query can delete all nameservers by sending an empty nameserver? >+ this.set('nameserver', values.nameserver); >+ } >+ >+ if (values.interfaceType === 'eth') { >+ >+ } else if (values.interfaceType === 'vlan') { >+ // The interface is build from interface.vlan_id >+ values['interface'] = values['interface'] + '.' + String(values.vlan_id); >+ >+ } else if (values.interfaceType === 'bond' || values.interfaceType === 'br') { >+ values.start = true; >+ // disable the interfaces which are used by this interface >+ var key = values.interfaceType === 'bond' ? 'bond-slaves' : 'bridge_ports'; >+ this.setDisabledItem(values[key], true); >+ // set original values >+ array.forEach(values[key], lang.hitch(this, function(ikey) { >+ var item = this.moduleStore.get(ikey); >+// item.original = lang.clone(item); // FIXME: RangeError: Maximum call stack size exceeded >+ item.original = item; >+ >+ // set values to deactivate the interface values >+ item.ip4 = []; >+ item.ip6 = []; >+ item.ip4dynamic = false; >+ item.ip6dynamic = false; >+ item.type = 'manual'; >+ item.start = false; >+ >+ // FIXME: put does not overwrite >+ this.moduleStore.put(item); >+ this.moduleStore.remove(item['interface']); >+ this.moduleStore.add(item); >+ })); >+ } >+ >+ values.information = values; >+ >+ if (!create) { >+ this.moduleStore.put( values ); // FIXME: why does put not work? we have to manually remove and add it... >+ this.moduleStore.remove(values['interface']); >+ this.moduleStore.add( values ); >+ } else { >+ try { >+ this.moduleStore.add( values ); >+ } catch(error) { >+ dialog.alert(_('Interface "%s" already exists', values['interface'])); >+ return; >+ } >+ } >+ this.onChanged(); >+ }, >+ >+ _addInterface: function() { >+ this._modifyInterface({}); >+ }, >+ >+ _editInterface: function(name, props) { >+ return this._modifyInterface(props[0]); >+ }, >+ >+ _modifyInterface: function(props) { >+ // Add or modify an interface >+ if (props.interfaceType) { >+ // only edit the existing interace >+ props.create = false; >+ this._showWizard(props); >+ return; >+ } >+ >+ var form = null; >+ var dynamicInterfaceTypeValues = lang.hitch(this, function() { >+ // TODO: lookup if interfaces are already in use >+ var d = types.interfaceValuesDict(); >+ if (this.physical_interfaces.length < 2) { >+ // We can not use a bonding interface if we don't have two physical interfaces >+ delete d.bond; >+ } >+ if (array.every(this.physical_interfaces, lang.hitch(this, function(iface) { >+ var ifaces = this.get('value'); >+ return ifaces.length !== 0 ? array.some(ifaces, function(val) { return iface === val['interface']; }) : false; >+ }))) { >+ // if all physical interfaces are configured we can not configure another >+ delete d.eth; >+ } >+ var arr = []; >+ tools.forIn(d, function(k, v) { >+ arr.push(v); >+ }); >+ return arr; >+ }); >+ >+ var hack = {foo: dynamicInterfaceTypeValues}; >+ aspect.after(hack, 'foo', function(ret) { >+ if (array.every(ret, function(item) { return item.id !== 'eth'; })) { >+ form._widgets.interfaceType.set('value', 'vlan'); >+ } >+ }); >+ >+ form = new Form({ >+ widgets: [{ >+ name: 'interfaceType', >+ label: _('Interface type'), >+ type: ComboBox, >+ value: 'eth', // FIXME: if eth is not possible use vlan >+ onChange: lang.hitch(this, function(interfaceType) { >+ if (interfaceType) { >+ var name = (interfaceType !== 'vlan' ? interfaceType : 'eth'); >+ var num = 0; >+ while(array.some(array.map(this.get('value'), function(item) { return item['interface']; }), function(iface) { return iface == name + String(num); })) { >+ num++; >+ } >+ form.getWidget('interface').set('interface', name + String(num)); >+ } >+ }), >+ dynamicValues: hack.foo >+ }, { >+ name: 'interface', >+ label: _('Interface'), >+ type: ComboBox, >+ depends: ['interfaceType'], >+ dynamicValues: lang.hitch(this, function() { >+ var interfaceType = form.getWidget('interfaceType').get('value'); >+ if (interfaceType === 'eth') { >+ var available = this.get('value'); >+ return array.filter(this.physical_interfaces, function(_iface) { return array.every(available, function(item) { return item['interface'] !== _iface; }); }); >+ } else if (interfaceType === 'vlan') { >+ return this.physical_interfaces; >+ } else if(interfaceType === 'br' || interfaceType === 'bond' ) { >+ var num = 0; >+ while(array.some(array.map(this.get('value'), function(item) { return item['interface']; }), function(_iface) { return _iface == interfaceType + String(num); })) { >+ num++; >+ } >+ return [ interfaceType + String(num) ]; >+ } >+ }) >+// type: TextBox, >+/* validator: lang.hitch(this, function(value) { >+ if(!form) { return true; } >+ var interfaceType = form.getWidget('interfaceType').get('value'); >+ var name = (interfaceType !== 'vlan' ? interfaceType : 'eth'); >+ if (interfaceType === 'eth' && !array.some(this.physical_interfaces, function(iface) { return iface === value; })) { >+ dialog.alert(_('The interface must be one of the physical interfaces: ') + this.physical_interfaces.join(', ')); >+ return false; >+ } else if(interfaceType === 'bond' && 2 > this.physical_interfaces.length) { >+ dialog.alert(_('There must be at least two physical interfaces to use a bonding interface')); >+ return false; >+ } >+ return new RegExp('^' + name + '[0-9]+$').test(value); >+ }) >+*/ }], >+// layout: [{ >+// label: _('Select an interface type'), >+// layout: ['interfaceType', 'interface'] >+// }], >+ layout: ['interfaceType', 'interface'] >+ }); >+ >+ dialog.confirmForm({ >+ form: form, >+ title: _('Select an interface type'), >+ submit: _('Add interface') >+ }).then(lang.hitch(this, function(formvals) { >+ props = lang.mixin({create: true}, props, formvals); >+ this._showWizard(props); >+ })); >+ }, >+ >+ _showWizard: function(props) { >+ var _dialog = null, wizard = null; >+ >+ var _cleanup = function() { >+ _dialog.hide(); >+ _dialog.destroyRecursive(); >+ }; >+ >+ var _finished = lang.hitch(this, function(values) { >+ this.updateValues(values, props.create); >+ _cleanup(); >+ }); >+ >+ var propvals = { >+ values: props, >+ 'interface': props['interface'], >+ interfaceType: props.interfaceType, >+ physical_interfaces: this.physical_interfaces, >+ available_interfaces: this.get('value'), >+ create: props.create, >+ onCancel: _cleanup, >+ onFinished: _finished >+ }; >+ wizard = new InterfaceWizard(propvals); >+ >+ _dialog = new Dialog({ >+ title: props.create ? _('Add a network interface') : _('Edit a network interface'), >+ content: wizard >+ }); >+ _dialog.own(wizard); >+ this.own(_dialog); >+ _dialog.show(); >+ }, >+ >+ _removeInterface: function(ids) { >+ array.forEach(ids, function(iid) { >+ var item = this.moduleStore.get(iid); >+ if (item.interfaceType === 'bond' || item.interfaceType === 'br') { >+ // enable the interfaces which were blocked by this interface >+ var key = item.interfaceType === 'bond' ? 'bond-slaves' : 'bridge_ports'; >+ this.setDisabledItem(item[key], false); >+ // re set original values >+ array.forEach(item[key], lang.hitch(this, function(key) { >+ var item = this.moduleStore.get(key); >+ if (item.original) { >+ this.moduleStore.put(item.original); >+ } >+ })); >+ } >+ >+ this.moduleStore.remove(iid); >+ }, this); >+ this.onChanged(); >+ } >+ >+ }); >+}); >Index: umc/js/setup/InterfaceWizard.js >=================================================================== >--- umc/js/setup/InterfaceWizard.js (Revision 0) >+++ umc/js/setup/InterfaceWizard.js (Revision 37168) >@@ -0,0 +1,469 @@ >+/* >+ * Copyright 2012 Univention GmbH >+ * >+ * http://www.univention.de/ >+ * >+ * All rights reserved. >+ * >+ * The source code of this program is made available >+ * under the terms of the GNU Affero General Public License version 3 >+ * (GNU AGPL V3) as published by the Free Software Foundation. >+ * >+ * Binary versions of this program provided by Univention to you as >+ * well as other copyrighted, protected or trademarked materials like >+ * Logos, graphics, fonts, specific documentations and configurations, >+ * cryptographic keys etc. are subject to a license agreement between >+ * you and Univention and not subject to the GNU AGPL V3. >+ * >+ * In the case you use this program under the terms of the GNU AGPL V3, >+ * the program is provided in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+ * GNU Affero General Public License for more details. >+ * >+ * You should have received a copy of the GNU Affero General Public >+ * License with the Debian GNU/Linux or Univention distribution in file >+ * /usr/share/common-licenses/AGPL-3; if not, see >+ * <http://www.gnu.org/licenses/>. >+ */ >+/*global define*/ >+ >+define([ >+ "dojo/_base/declare", >+ "dojo/_base/lang", >+ "dojo/_base/array", >+ "dojo/when", >+ "umc/tools", >+ "umc/dialog", >+ "umc/widgets/Wizard", >+ 'umc/widgets/Form', >+ 'umc/widgets/MultiInput', >+ 'umc/widgets/ComboBox', >+ 'umc/widgets/TextBox', >+ 'umc/widgets/MultiSelect', >+ 'umc/widgets/CheckBox', >+ 'umc/widgets/NumberSpinner', >+ "umc/modules/setup/types", >+ "umc/i18n!umc/modules/uvmm" >+], function(declare, lang, array, when, tools, dialog, Wizard, Form, MultiInput, ComboBox, TextBox, MultiSelect, CheckBox, NumberSpinner, types, _) { >+ >+ return declare("umc.modules.setup.InterfaceWizard", [ Wizard ], { >+ >+ 'interface': null, >+ >+ interfaceType: null, // pre-defined interfaceType will cause a start on configuration page >+ >+ values: {}, >+ >+ umcpCommand: tools.umcpCommand, >+ >+ style: 'width: 650px; height: 650px;', >+ physical_interfaces: [], // String[] physical interfaces >+ available_interfaces: [], // object[] the grid items >+ >+// // do we modify or create an interface >+// _create: false, >+ >+ constructor: function(props) { >+ props = props || {}; >+ this.values = props.values || {}; >+ >+// this._create = props.create; >+ >+ this['interface'] = props['interface']; >+ this.interfaceType = props.interfaceType; >+ this.physical_interfaces = props.physical_interfaces || []; >+ this.available_interfaces = props.available_interfaces || []; >+ >+// var name = (this.interfaceType !== 'vlan' ? this.interfaceType : 'eth'); >+// if (!name || !this['interface'] || this['interface'].substr(0, name.length) !== name ) { >+// // name is illegal >+// // TODO: error handling >+// dialog.alert('illegal name'); >+// } >+ >+ var ethlayout = [{ >+ label: _('IPv4 network devices'), >+ layout: [ 'ip4dynamic', 'dhcpquery', 'ip4' ] >+ }, { >+ label: _('IPv6 network devices'), >+ layout: ['ip6dynamic', 'ip6'] >+ }]; >+ >+ if (this.interfaceType === 'vlan') { >+ ethlayout.push({ >+ label: _('Global network settings'), >+ layout: [ 'vlan_id' ] >+ }); >+ } >+ >+ lang.mixin(this, { >+ pages: [{ >+ // A "normal" ethernet interface >+ name: 'eth', >+ headerText: _('Interface configuration'), >+ helpText: _('Configure the %s network interface %s', types.interfaceTypes[this.interfaceType], this['interface']), >+ widgets: [{ >+ name: 'interfaceType', >+ type: TextBox, >+ disabled: true, >+ visible: false, >+ value: props.interfaceType >+ }, { >+ name: 'interface', >+ type: TextBox, >+ disabled: true, >+ visible: false, >+ value: props['interface'], >+ size: 'Half', >+ label: _('Interface') >+ }, { >+ name: 'type', >+ type: ComboBox, >+ visible: false, >+ value: '', >+ staticValues: [{ >+ id: '', >+ label: '' >+ }, { >+ id: 'manual', >+ label: 'manual' >+ }] >+ }, { >+ name: 'start', // Autostart the interface? >+ type: CheckBox, >+ value: true, >+ visible: false >+ }, { >+ type: MultiInput, >+ name: 'ip4', >+ label: '', >+ umcpCommand: this.umcpCommand, >+ min: 3, >+ subtypes: [{ >+ type: TextBox, >+ label: _('IPv4 address'), >+ sizeClass: 'Half' >+ }, { >+ type: TextBox, >+ label: _('Netmask'), >+ value: '255.255.255.0', >+ sizeClass: 'Half' >+ }] >+ }, { >+ name: 'ip4dynamic', >+ type: CheckBox, >+ onChange: lang.hitch(this, function(value) { >+ this._pages.eth._form._widgets.ip4.set('disabled', value); >+ }), >+ label: _('Dynamic (DHCP)') >+ }, { >+ type: MultiInput, >+ name: 'ip6', >+ label: '', >+ umcpCommand: this.umcpCommand, >+ subtypes: [{ >+ type: TextBox, >+ label: _('IPv6 address'), >+ sizeClass: 'One' >+ }, { >+ type: TextBox, >+ label: _('IPv6 prefix'), >+ sizeClass: 'OneThird' >+ }, { >+ type: TextBox, >+ label: _('Identifier'), >+ sizeClass: 'OneThird' >+ >+ }] >+ }, { >+ type: CheckBox, >+ name: 'ip6dynamic', >+ onChange: lang.hitch(this, function(value) { >+ this._pages.eth._form._widgets.ip6.set('disabled', value); >+ }), >+ label: _('Autoconfiguration (SLAAC)') >+ }, { >+ type: CheckBox, >+ name: 'eth_vlan', >+ value: false, >+ label: _('enable Virtual LAN') >+ }, { >+ type: NumberSpinner, >+ name: 'vlan_id', >+ size: 'Half', >+ value: 2, // some machines does not support 1 // TODO: count up if exists >+ constraints: { min: 1, max: 4096 }, >+ label: _('Virtual interface ID') >+ }, { >+ // required for DHCP query >+ name: 'gateway', >+ type: TextBox, >+ visible: false >+ }, { >+ // required for DHCP query >+ name: 'nameserver', >+ type: MultiInput, >+ subtypes: [{ type: TextBox }], >+ max: 3, >+ visible: false >+ }], >+ buttons: [{ >+ name: 'dhcpquery', >+ label: 'DHCP-Query', >+ callback: lang.hitch(this, function() { this._dhcpQuery(this['interface']); }) >+ }], >+ layout: ethlayout >+ }, { >+ // A network bridge (software side switch) >+ name: 'br', >+ headerText: _('Bridge configuration'), >+ helpText: _('Configure the %s network interface %s', types.interfaceTypes[this.interfaceType], this['interface']), >+ widgets: [{ >+ // defines which interfaces should be "bridged" together. >+ // This can also be 0 to create an interface which does not have an connection to "the outside" (e.g. wanted in virtualisation) >+ // There can exists an unlimited amount of interfaces >+ name: 'bridge_ports', >+ label: _('bridge ports'), >+ type: MultiSelect, >+ dynamicValues: lang.hitch(this, function() { >+ // mixin of physical interfaces and non physical which are not used by other interfaces yet >+ return this.filterInterfaces(this.getPhysicalInterfaces(false).concat(this.getAvailableInterfaces(false))); >+ }) >+ }, { >+ name: 'bridge_fd', >+ label: _('forwarding delay'), >+ type: NumberSpinner, >+ value: 0 >+ }], >+ layout: [{ >+ label: _('configure the bridge interface'), >+ layout: ['bridge_ports', 'bridge_fd'] >+ }] >+ }, { >+ // A bonding interface (fallback if one interface falls out) >+ // bond multiple interfaces into one. The used interfaces are not configurable anymore >+ name: 'bond', >+ headerText: _('Bonding configuration'), >+ helpText: _('Configure the %s network interface %s', types.interfaceTypes[this.interfaceType], this['interface']), >+ widgets: [{ >+ name: 'bond-slaves', >+ label: _('physical interfaces used for the bonding interface'), >+ type: MultiSelect, >+ dynamicValues: lang.hitch(this, function() { >+ // We can only use physical interfaces for this >+ return this.filterInterfaces(this.getPhysicalInterfaces(false)); >+ }) >+ }, { >+ name: 'primary', >+ label: 'primary interface', >+ type: ComboBox, >+ depends: ['bond-slaves'], >+ dynamicValues: lang.hitch(this, function() { >+ return this._pages.bond._form._widgets['bond-slaves'].get('value'); >+ }) >+ }, { >+ name: 'bond-mode', >+ label: _('Mode'), >+ type: ComboBox, >+ staticValues: [{ >+ id: 0, >+ label: 'balance-rr (0)' >+ }, { >+ id: 1, >+ label: 'active-backup (1)' >+ }, { >+ id: 2, >+ label: 'balance-xor (2)' >+ }, { >+ id: 3, >+ label: 'broadcast (3)' >+ }, { >+ id: 4, >+ label: '802.3ad (4)' >+ }, { >+ id: 5, >+ label: 'balance-tlb (5)' >+ }, { >+ id: 6, >+ label: 'balance-alb (6)' >+ }] >+ }, { >+ name: 'miimon', >+ label: _('MII link monitoring frequency'), >+ type: NumberSpinner, >+ constraints: { min: 0 }, >+ value: 100 >+ }], >+ layout: [{ >+ label: _('configure the bonding interface'), >+ layout: ['bond-slaves', 'primary'] >+ }, { >+ label: _('advanced configuration'), >+ layout: ['bond-mode', 'miimon'] >+ }] >+ }] >+ }); >+ >+ return this.inherited(arguments); >+ }, >+ >+ buildRendering: function() { >+ this.inherited(arguments); >+ >+ // update visibility of widgets >+ tools.forIn(this._pages, function(iname, ipage) { >+ tools.forIn(ipage._form._widgets, function(iname, iwidget) { >+ tools.forIn(types.interfaceTypes, function(typename) { >+ // hide every widget which startswith one of the interface types but is not the setted interface type >+ if (iname.indexOf(typename + '_') === 0) { >+ iwidget.set('visible', typename === this.interfaceType); >+ } >+ }, this); >+ }, this); >+ }, this); >+ }, >+ >+ getAvailableInterfaces: function(format) { >+ return array.map(this.available_interfaces, function(item) { >+ var iface = item['interface']; >+ if (format) { >+ return { >+ id: iface, >+ label: iface >+ }; >+ } >+ return iface; >+ }); >+ }, >+ >+ getPhysicalInterfaces: function(format) { >+ if (format) { >+ return array.map(this.physical_interfaces, function(idev) { >+ return {id: idev, label: idev}; >+ }); >+ } >+ return lang.clone(this.physical_interfaces); >+ }, >+ >+ filterInterfaces: function(/*String[]*/ interfaces) { >+ // filter interfaces, which are available for use (because no interface already uses one of the interface) >+ return types.filterInterfaces(interfaces, this.available_interfaces); >+ }, >+ >+ setValues: function(values) { >+ // set values and trigger onChange event >+ tools.forIn(this._pages, function(pagename, page) { >+ tools.forIn(values, function(iname, ivalue) { >+ if (page._form._widgets[iname]) { >+ page._form._widgets[iname].set('value', ivalue); >+ page._form._widgets[iname]._set('value', ivalue); // FIXME: how to trigger onChange events // required? >+ } >+ }, this); >+ }, this); >+ }, >+ >+ postCreate: function() { >+ this.inherited(arguments); >+ this.setValues(this.values); >+ }, >+ >+ startup: function() { >+ this.inherited(arguments); >+ // FIXME: remove this when the bug is fixed >+ this._pages.br._form._widgets.bridge_ports.startup(); >+ this._pages.bond._form._widgets['bond-slaves'].startup(); >+ }, >+ >+ canFinish: function(values) { >+ // TODO: conflict if two bonds wants to use the same interface >+ var valid = this.interfaceType && this['interface']; // both must be set >+ if (!valid) { >+ dialog.alert(_('You have to specify a valid interface and interfaceType. Please correct your input.')); >+ } >+ >+ var interfaceType = this.interfaceType === 'vlan' ? 'eth' : this.interfaceType; // The pagename for vlan interfaces is eth >+ >+ if (!(values.ip4.length || values.ip4dynamic || values.ip6.length || values.ip6dynamic)) { >+ dialog.alert(_('You have to specify at least one ip address or enable DHCP or SLACC.')); >+ return false; >+ } >+ if (interfaceType === 'bond' && values['bond-slaves'].length < 2) { >+ dialog.alert(_('You have to specify at least two interfaces to use for this bond device')); >+ return false; >+ } >+ >+ tools.forIn(this._pages[interfaceType]._form._widgets, function(iname, iwidget) { >+ valid = valid && (!iwidget.get('visible') || (!iwidget.isValid || false !== iwidget.isValid())); >+ return valid; >+ }, this); >+ >+ if (!valid) { >+ dialog.alert(_('The entered data is not valid. Please correct your input.')); >+ } >+ return valid; >+ }, >+ >+ next: function(pageName) { >+ if (pageName === null) { >+ if (this.interfaceType === 'vlan') { >+ // The page for vlan interfaces is the same as normal eth interfaces >+ return 'eth'; >+ } >+ return this.interfaceType; >+ } else if(pageName === 'br' || pageName === 'bond') { >+ return 'eth'; >+ } >+ }, >+ >+ previous: function(pageName) { >+ return this.interfaceType; >+ }, >+ >+ hasPrevious: function(currentPage) { >+ return currentPage === 'eth' && (this.interfaceType === 'br' || this.interfaceType === 'bond'); >+ }, >+ >+ hasNext: function(currentPage) { >+ if (currentPage === null) { >+ return true; >+ } >+ return (currentPage === 'br' || currentPage === 'bond'); >+ }, >+ >+ _dhcpQuery: function(interfaceName) { >+ // TODO: show a notice that this will change gateway and nameserver >+ // TODO: show a progressbar and success message? >+ >+ // make sure we have an interface selected >+ if (!interfaceName) { >+ dialog.alert(_('Please choose a network device before querying a DHCP address.')); >+ return; >+ } >+ this.standby(true); >+ tools.umcpCommand('setup/net/dhclient', { >+ 'interface': interfaceName >+ }).then(lang.hitch(this, function(data) { >+ this.standby(false); >+ >+ var result = data.result; >+ var netmask = result[interfaceName + '_netmask']; >+ var address = result[interfaceName + '_ip']; >+ if (!address && !netmask) { >+ dialog.alert(_('DHCP query failed.')); >+ return; >+ } >+ >+ this.setValues({ >+ ip4dynamic: false, // set "Dynamic (DHCP)" to be false if it was not set >+ ip4: [[address, netmask]], >+ gateway: result.gateway, >+ nameserver: [[result.nameserver_1], [result.nameserver_2], [result.nameserver_3]] >+ }); >+ }), lang.hitch(this, function(error) { >+ this.standby(false); >+ dialog.alert(_('DHCP query failed.')); >+ })); >+ } >+ }); >+}); >Index: umc/js/setup/NetworkPage.js >=================================================================== >--- umc/js/setup/NetworkPage.js (Revision 36940) >+++ umc/js/setup/NetworkPage.js (Arbeitskopie) >@@ -32,22 +32,29 @@ > "dojo/_base/declare", > "dojo/_base/lang", > "dojo/_base/array", >+ "dojo/on", >+ "dojo/aspect", >+ "dojo/store/Memory", >+ "dojo/store/Observable", >+ "dijit/Dialog", > "umc/tools", > "umc/dialog", >+ "umc/store", > "umc/widgets/Page", > "umc/widgets/StandbyMixin", > "umc/widgets/TextBox", > "umc/widgets/ComboBox", > "umc/widgets/MultiInput", >- "umc/widgets/MultiSelect", > "umc/widgets/Form", >- "umc/widgets/Button", >+ "umc/modules/setup/InterfaceWizard", >+ "umc/modules/setup/InterfaceGrid", >+ "umc/modules/setup/types", > "umc/i18n!umc/modules/setup" >-], function(declare, lang, array, tools, dialog, Page, StandbyMixin, TextBox, ComboBox, MultiInput, MultiSelect, Form, Button, _) { >+], function(declare, lang, array, on, aspect, Memory, Observable, Dialog, tools, dialog, store, Page, StandbyMixin, TextBox, ComboBox, MultiInput, Form, InterfaceWizard, InterfaceGrid, types, _) { > return declare("umc.modules.setup.NetworkPage", [ Page, StandbyMixin ], { > // summary: > // This class renderes a detail page containing subtabs and form elements >- // in order to edit UDM objects. >+ // in order to edit network interfaces. > > // system-setup-boot > wizard_mode: false, >@@ -56,6 +63,7 @@ > local_mode: false, > > umcpCommand: tools.umcpCommand, >+ moduleStore: null, > > // internal reference to the formular containing all form widgets of an UDM object > _form: null, >@@ -63,98 +71,41 @@ > // dicts of the original IPv4/v6 values > _orgValues: null, > >- _noteShowed: false, >- > _currentRole: null, > >- postMixInProperties: function() { >- this.inherited(arguments); >+ physical_interfaces: [], > >+ postMixInProperties: function() { > this.title = _('Network'); > this.headerText = _('Network settings'); > this.helpText = _('In the <i>network settings</i>, IP addresses (IPv4 and IPv6) as well as name servers, gateways, and HTTP proxies may be specified.'); >+ >+ this.moduleStore = new Observable(new Memory({idProperty: 'interface'})); >+ >+ this.inherited(arguments); > }, > > buildRendering: function() { > this.inherited(arguments); > > var widgets = [{ >- type: MultiInput, >- name: 'interfaces_ipv4', >- label: '', //_('Interfaces'), >- umcpCommand: this.umcpCommand, >- subtypes: [{ >- type: ComboBox, >- label: _('Interface'), >- dynamicValues: lang.hitch(this, function() { >- return this.umcpCommand('setup/net/interfaces').then(lang.hitch(this, function(data) { >- // for ipv4 interfaces, we can have a virtual one, as well >- var list = []; >- array.forEach(data.result, function(idev) { >- var idev2 = { >- id: idev + '_virtual', >- label: idev + ' (' + _('virtual') + ')' >- }; >- list.push(idev, idev2); >- }, this); >- return list; >- })); >- }), >- sizeClass: 'OneThird' >- }, { >- type: TextBox, >- label: _('IPv4 address'), >- sizeClass: 'Half' >- }, { >- type: TextBox, >- label: _('Netmask'), >- sizeClass: 'Half' >- }, { >- type: ComboBox, >- label: _('Dynamic (DHCP)'), >- staticValues: [ >- { id: 'false', label: _('Deactivated') }, >- { id: 'true', label: _('Activated') } >- ], >- sizeClass: 'OneThird' >- }, { >- type: Button, >- label: 'DHCP query', >- callback: lang.hitch(this, '_dhcpQuery') >- }] >+ type: InterfaceGrid, >+ name: 'interfaces', >+ label: '', >+ moduleStore: this.moduleStore > }, { >- type: MultiInput, >- name: 'interfaces_ipv6', >- label: '', //_('Interfaces'), >- umcpCommand: this.umcpCommand, >- subtypes: [{ >- type: ComboBox, >- label: _('Interface'), >- dynamicValues: 'setup/net/interfaces', >- sizeClass: 'OneThird' >- }, { >- type: TextBox, >- label: _('IPv6 address'), >- sizeClass: 'One' >- }, { >- type: TextBox, >- label: _('IPv6 prefix'), >- sizeClass: 'OneThird' >- }, { >- type: TextBox, >- label: _('Identifier'), >- sizeClass: 'OneThird' >- >- }] >+ type: ComboBox, >+ name: 'interfaces/primary', >+ label: _('primary network interface'), >+ depends: ['interfaces', 'gateway'], >+ dynamicValues: lang.hitch(this, function() { >+ // FIXME: howto trigger dynamicValues update >+ // The primary interface can be of any type >+ return array.map(this._form._widgets.interfaces.get('value'), function(item) { >+ return {id: item['interface'], label: item['interface']}; >+ }); >+ }) > }, { >- type: MultiSelect, >- name: 'dynamic_interfaces_ipv6', >- label: _('Autoconfiguration (SLAAC)'), >- umcpCommand: this.umcpCommand, >- dynamicValues: 'setup/net/interfaces', >- autoHeight: true, >- sizeClass: 'OneThird' >- }, { > type: TextBox, > name: 'gateway', > label: _('Gateway (IPv4)') >@@ -181,14 +132,11 @@ > }]; > > var layout = [{ >- label: _('IPv4 network devices'), >- layout: ['interfaces_ipv4'] >+ label: _('IP network devices'), >+ layout: ['interfaces'] > }, { >- label: _('IPv6 network devices'), >- layout: ['interfaces_ipv6', 'dynamic_interfaces_ipv6'] >- }, { > label: _('Global network settings'), >- layout: [ ['gateway', 'ipv6/gateway'], 'nameserver', 'dns/forwarder', 'proxy/http'] >+ layout: [ ['gateway', 'ipv6/gateway'], 'interfaces/primary', 'nameserver', 'dns/forwarder', 'proxy/http'] > }]; > > this._form = new Form({ >@@ -198,102 +146,56 @@ > }); > this._form.on('submit', lang.hitch(this, 'onSave')); > >- // add onChange handlers that show the note >- array.forEach(['interfaces_ipv4', 'interfaces_ipv6'], function(iname) { >- var iwidget = this._form.getWidget(iname); >- this.own(iwidget.watch('value', lang.hitch(this, function() { >- if (iwidget.focused) { >- this._showNote(); >- } >+ // only show notes in an joined system in productive mode >+ if (!this.wizard_mode) { >+ // show a note if interfaces changes >+ this.own(on.once(this._form._widgets.interfaces, 'changed', lang.hitch(this, function() { >+ // TODO: only show it when IP changes?? >+ this.addNote(_('Changing IP address configurations may result in restarting or stopping services. This can have severe side-effects when the system is in productive use at the moment.')); > }))); >- }, this); >- >- this.addChild(this._form); >- }, >- >- _showNote: function() { >- if (!this._noteShowed) { >- this._noteShowed = true; >- this.addNote(_('Changing IP address configurations may result in restarting or stopping services. This can have severe side-effects when the system is in productive use at the moment.')); > } >- }, > >- _dhcpQuery: function(item, idx) { >- // switch on standby animation >- this.standby(true); >+ // update interfaces/primary when there are changes on the interfaces >+ this._form._widgets.interfaces.on('changed', lang.hitch(this, function() { >+ this._form._widgets['interfaces/primary'].reloadDynamicValues(); >+ })); > >- // make sure we have an interface selected >- if (!item || !item[0] || typeof item[0] != "string") { >- dialog.alert(_('Please choose a network device before querying a DHCP address.')); >- this.standby(false); >- return; >- } >- if (item[0].indexOf('_virtual') >= 0) { >- dialog.alert(_('A virtual network device cannot be used for DHCP.')); >- this.standby(false); >- return; >- } >- this.umcpCommand('setup/net/dhclient', { >- 'interface': item[0] >- }).then(lang.hitch(this, function(data) { >- // switch off standby animation >- this.standby(false); >+ // FIXME: grid does not have .ready >+ // reload interfaces/primary when interfaces is ready >+// this._form._widgets.interfaces.ready().then(lang.hitch(this, function() { >+// this._form._widgets['interfaces/primary'].reloadDynamicValues(); >+// })); > >- var result = data.result; >- var netmask = result[item[0] + '_netmask']; >- var address = result[item[0] + '_ip']; >- if (!address && !netmask) { >- dialog.alert(_('DHCP query failed.')); >- return; >- } >+ this.addChild(this._form); > >- // set the queried IP and netmask >- var devicesWidget = this._form.getWidget('interfaces_ipv4'); >- var val = devicesWidget.get('value'); >- if (address) { >- val[idx][1] = address; >- } >- if (netmask) { >- val[idx][2] = netmask; >- } >- // set "Dynamic (DHCP)" to be false if it was not set >- if ( val[idx][3] === '') { >- val[idx][3] = 'false'; >- } >+ // FIXME: as the grid is a border container it has to be resized manually >+ this.own(aspect.after(this, 'resize', lang.hitch(this, function() { >+ this._form._widgets.interfaces.resize(); >+ }))); >+ }, > >- // set gateway >- devicesWidget.set('value', val); >- if (result.gateway) { >- var gatewayWidget = this._form.getWidget('gateway'); >- gatewayWidget.set('value', result.gateway); >- } >- >+ postCreate: function() { >+ this.inherited(arguments); >+ // The grid contains changes if a DHCP request was made >+ this._form._widgets.interfaces.watch('gateway', lang.hitch(this, function(name, old, value) { >+ // set gateway from dhcp request >+ this._form._widgets.gateway.set('value', value); >+ })); >+ this._form._widgets.interfaces.watch('nameserver', lang.hitch(this, function(name, old, value) { > // read nameserver or dns/forwarder > var nameserverWidget; > if (this._form.getWidget('nameserver').get('visible')) { > nameserverWidget = this._form.getWidget('nameserver'); > } else { >- // if nameserver is not visable, set dns/forwarder >+ // if nameserver is not visible, set dns/forwarder > nameserverWidget = this._form.getWidget('dns/forwarder'); > } >- val = nameserverWidget.get('value'); >- if (result.nameserver_1) { >- val[0] = result.nameserver_1; >- } >- if (result.nameserver_2) { >- val[1] = result.nameserver_2; >- } >- if (result.nameserver_3) { >- val[2] = result.nameserver_3; >- } >- nameserverWidget.set('value', val); >- >- }), lang.hitch(this, function() { >- // switch off standby animation >- this.standby(false); >+ // set nameserver from dhcp request >+ nameserverWidget.set('value', value); > })); > }, > >+ // TODO: reimplement > sortInterfaces: function(x, y) { > if (x.id != y.id) { > // this is for ipv6 types, the id 'default' should be listed as first device >@@ -317,10 +219,10 @@ > } > return 0; > }, >- >+ > setValues: function(_vals) { > // save a copy of all original values that may be lists >- var r = /^(interfaces\/[^\/]+\/|nameserver[1-3]|dns\/forwarder[1-3])$/; >+ var r = /^(interfaces\/.*|nameserver[1-3]|dns\/forwarder[1-3])$/; > this._orgValues = {}; > tools.forIn(_vals, function(ikey, ival) { > if (r.test(ikey)) { >@@ -328,9 +230,12 @@ > } > }, this); > >+ // set all available interfaces >+ this.physical_interfaces = _vals.interfaces; >+ > // copy values that do not change in their name > var vals = {}; >- array.forEach(['gateway', 'ipv6/gateway', 'proxy/http'], function(ikey) { >+ array.forEach(['gateway', 'ipv6/gateway', 'proxy/http', 'interfaces/primary'], function(ikey) { > vals[ikey] = _vals[ikey]; > }); > >@@ -375,17 +280,6 @@ > sortedIpv4.push(ival); > }); > >- // translate to our datastructure >- vals.interfaces_ipv4 = []; >- array.forEach(sortedIpv4, function(idev) { >- vals.interfaces_ipv4.push([ >- idev.virtual ? idev.device + '_virtual' : idev.device, >- idev.address || '', >- idev.netmask || '', >- idev.type == 'dynamic' || idev.type == 'dhcp' ? 'true' : 'false' >- ]); >- }); >- > // copy ipv6 interfaces > r = /interfaces\/([^\/]+)\/ipv6\/([^\/]+)\/(.+)/; > var ipv6 = {}; >@@ -408,13 +302,29 @@ > tools.forIn(ipv6, function(ikey, ival) { > sortedIpv6.push(ival); > }); >- sortedIpv6.sort(this.sortInterfaces); >+// sortedIpv6.sort(this.sortInterfaces); > > // translate to our datastructure >- vals.interfaces_ipv6 = []; >+ var interfaces = {}; >+ vals.ip4dynamic = false; >+ array.forEach(sortedIpv4, function(idev) { >+ interfaces[idev.device] = interfaces[idev.device] || { 'interface': idev.device, interfaceType: types.getTypeByDevice(idev.device) }; >+ if (!idev.virtual) { >+ interfaces[idev.device].ip4dynamic = (idev.type == 'dynamic' || idev.type == 'dhcp'); >+ } >+ interfaces[idev.device].ip4 = interfaces[idev.device].ip4 || []; >+ interfaces[idev.device].ip4.push([ >+ idev.address || '', >+ idev.netmask || '' >+ ]); >+ interfaces[idev.device].ip6 = []; >+ }); >+ >+ // translate to our datastructure > array.forEach(sortedIpv6, function(idev) { >- vals.interfaces_ipv6.push([ >- idev.device, >+ interfaces[idev.device] = interfaces[idev.device] || {}; >+ interfaces[idev.device].ip6 = interfaces[idev.device].ip6 || []; >+ interfaces[idev.device].ip6.push([ > idev.address || '', > idev.prefix || '', > idev.id || '' >@@ -423,14 +333,22 @@ > > // dynamic ipv6 interfaces > r = /interfaces\/([^\/]+)\/ipv6\/acceptRA/; >- vals.dynamic_interfaces_ipv6 = []; > array.forEach(sortedKeys, function(ikey) { > var match = ikey.match(r); >- if (tools.isTrue(_vals[ikey]) && match) { >- vals.dynamic_interfaces_ipv6.push(match[1]); >+ if (match) { >+ interfaces[match[1]].ip6dynamic = tools.isTrue(_vals[ikey]); > } > }); > >+ tools.forIn(interfaces, function(device) { >+ // hack it! the formatter does not know about itself >+ interfaces[device].information = interfaces[device]; >+ }); >+ >+ vals.interfaces = interfaces; >+ // set all physical interfaces for the grid here, the info does not exists on grid creation >+ this._form._widgets.interfaces.set('physical_interfaces', this.physical_interfaces); >+ > // only show forwarder for master, backup, and slave > this._currentRole = _vals['server/role']; > var showForwarder = this._currentRole == 'domaincontroller_master' || this._currentRole == 'domaincontroller_backup' || this._currentRole == 'domaincontroller_slave'; >@@ -440,18 +358,17 @@ > this._form.getWidget('nameserver').set('visible', ! ( this.wizard_mode && this._currentRole == 'domaincontroller_master' ) ); > // set values > this._form.setFormValues(vals); >+ this._form._widgets.interfaces.setInitialValue(vals.interfaces); > >- // only show notes in an joined system in productive mode >- this._noteShowed = this.wizard_mode; > this.clearNotes(); > }, > > getValues: function() { >- var _vals = this._form.gatherFormValues(); >+ var _vals = this._form.get('value'); > var vals = {}; > > // copy values that do not change in their name >- array.forEach(['gateway', 'ipv6/gateway', 'proxy/http'], function(ikey) { >+ array.forEach(['gateway', 'ipv6/gateway', 'proxy/http', 'interfaces/primary'], function(ikey) { > vals[ikey] = _vals[ikey]; > }); > >@@ -462,46 +379,68 @@ > }); > }); > >- // copy ipv4 interfaces >- var iipv4Virtual = {}; // counter for the virtual interfaces >- array.forEach(_vals.interfaces_ipv4, function(ival) { >- var idev = ival[0]; >- var iaddress = ival[1]; >- var imask = ival[2]; >- var idynamic = ival[3] == 'true'; >- var iname = idev; >- if (iname.indexOf('_virtual') >= 0) { >- if (!(idev in iipv4Virtual)) { >- // first virtual interfaces for this device >- iipv4Virtual[idev] = 0; >+ array.forEach(_vals.interfaces, function(iface) { >+ var iname = iface['interface']; >+ if ((iface.interfaceType === 'eth' || iface.interfaceType === 'vlan') && iface.type === 'manual') { >+ // The device is used in a bridge or bonding >+ vals['interfaces/' + iname + '/type'] = iface.type; //assert type == manual >+ vals['interfaces/' + iname + '/start'] = iface.start; // assert start == false >+ // TODO: do we have to remove ip, etc. here? >+ vals['interfaces/' + iname + '/address'] = ''; >+ vals['interfaces/' + iname + '/netmask'] = ''; >+ >+ } else { >+ if (iface.interfaceType === 'br' || iface.interfaceType === 'bond') { >+ // for bonding and bridging this must/should be set >+ // for eth and vlan we don't want to overwrite existing settings >+ vals['interfaces/' + iname + '/start'] = iface.start; >+ if (iface.interfaceType === 'br') { >+ var bp = iface.bridge_ports.length ? iface.bridge_ports.join(' ') : 'none'; >+ vals['interfaces/' + iname + '/options/1'] = 'bridge_ports ' + bp; >+ vals['interfaces/' + iname + '/options/2'] = 'bridge_fd ' + iface.bridge_fd; >+ } else if(iface.interfaceType === 'bond') { >+ vals['interfaces/' + iname + '/options/1'] = 'bond-slaves ' + iface['bond-slaves'].join(' '); >+ // FIXME TODO bond-primary ?? >+ vals['interfaces/' + iname + '/options/2'] = 'bond-mode ' + iface['bond-mode']; >+ vals['interfaces/' + iname + '/options/3'] = 'miimon ' + iface.miimon; >+ vals['interfaces/' + iname + '/options/4'] = 'primary ' + iface.primary; >+ } >+ > } >- iname = iname.replace('virtual', iipv4Virtual[idev]); >- ++iipv4Virtual[idev]; // count up the number of virtual interfaces for this device >- } >- else { >- // only real interfaces may use DHCP >- if (idynamic) { >+ if (iface.ip4.length) { >+ // IPv4 >+ array.forEach(iface.ip4, function(virtval, i) { >+ var iaddress = virtval[0]; >+ var imask = virtval[1]; >+ if (i === 0) { >+ // IP address >+ vals['interfaces/' + iname + '/address'] = iaddress; >+ vals['interfaces/' + iname + '/netmask'] = imask; >+ } else { >+ // virtual ip adresses >+ vals['interfaces/' + iname + '_' + (i-1) + '/address'] = iaddress; >+ vals['interfaces/' + iname + '_' + (i-1) + '/netmask'] = imask; >+ } >+ }); >+ } else if (iface.ip4dynamic) { >+ // DHCP > vals['interfaces/' + iname + '/type'] = 'dynamic'; > } >- } >- vals['interfaces/' + iname + '/address'] = iaddress; >- vals['interfaces/' + iname + '/netmask'] = imask; >- }); > >- // copy ipv6 interfaces >- array.forEach(_vals.interfaces_ipv6, function(ival) { >- var idev = ival[0]; >- var iaddress = ival[1]; >- var iprefix = ival[2]; >- var iid = ival[3]; >- vals['interfaces/' + idev + '/ipv6/' + iid + '/address'] = iaddress; >- vals['interfaces/' + idev + '/ipv6/' + iid + '/prefix'] = iprefix; >- }); >+ // IPv6 SLAAC >+ vals['interfaces/' + iname + '/ipv6/acceptRA'] = iface.ip6dynamic ? 'true' : 'false'; > >- // dynamic ipv6 interfaces >- //array.forEach(_vals.dynamic_interfaces_ipv6, function(idev) { >- array.forEach(this._form.getWidget('dynamic_interfaces_ipv6').getAllItems(), function(iitem) { >- vals['interfaces/' + iitem.id + '/ipv6/acceptRA'] = (array.indexOf(_vals.dynamic_interfaces_ipv6, iitem.id) >= 0) ? 'true' : 'false'; >+ if (!iface.ip6dynamic) { >+ // IPv6 >+ array.forEach(iface.ip6, function(ip6val) { >+ var iaddress = ip6val[0]; >+ var iprefix = ip6val[1]; >+ var iidentifier = ip6val[2]; >+ vals['interfaces/' + iname + '/ipv6/' + iidentifier + '/address'] = iaddress; >+ vals['interfaces/' + iname + '/ipv6/' + iidentifier + '/prefix'] = iprefix; >+ }); >+ } >+ } > }); > > // add empty entries for all original entries that are not used anymore >@@ -517,41 +456,41 @@ > getSummary: function() { > // a list of all components with their labels > var allInterfaces = {}; >- array.forEach(this._form.getWidget('dynamic_interfaces_ipv6').getAllItems(), function(iitem) { >- allInterfaces[iitem.id] = iitem.label; >- allInterfaces[iitem.id + '_virtual'] = iitem.label + ' [' + _('virtual') + ']'; >- }, this); > >+ allInterfaces = array.map(this._form._widgets.interfaces.get('value'), function(item) { >+ return item['interface']; >+ }); >+ > // list of all IPv4 network devices >- var vals = this._form.gatherFormValues(); >- var ipv4Str = '<ul>'; >- array.forEach(vals.interfaces_ipv4, function(idev) { >- if (idev[1]) { >- // address is given >- ipv4Str += '<li>' + >- idev[1] + '/' + idev[2] + >- ' (' + >- allInterfaces[idev[0]] + >- (idev[3] == 'true' ? ', DHCP' : '') + >- ')</li>'; >- } else { >- // address is not given: must be DHCP >- ipv4Str += '<li>' + >- allInterfaces[idev[0]] + ': DHCP' + >- '</li>'; >+ var vals = this._form.get('value'); >+ var ipv4Str = array.map(array.filter(vals.interfaces, function(idev) { >+ return idev.ip4.length; >+ }), function(idev) { >+ if (idev.ip4dynamic) { >+ return idev['interface'] + ': DHCP'; > } >+ return idev['interface'] + ': ' + array.map(idev.ip4, function(ip4) { >+ // address/netmask >+ return ip4[0] + '/' + ip4[1]; >+ }).join(', '); > }); >- ipv4Str += '</ul>'; > >- // list of all IPv6 network devices >- var ipv6Str = '<ul>'; >- array.forEach(vals.interfaces_ipv6, function(idev) { >- ipv6Str += '<li>' + >- idev[1] + ' - ' + idev[2] + '/' + idev[3] + >- ' (' + idev[0] + ')</li>'; >+ ipv4Str = ipv4Str.length ? '<ul><li>' + ipv4Str.join('</li><li>') + '</li></ul>' : ''; >+ >+ var ipv6Str = array.map(array.filter(vals.interfaces, function(idev) { >+ return idev.ip6 && idev.ip6.length; >+ }), function(idev) { >+ if (idev.ip6dynamic) { >+ return idev['interface'] + ': DHCP'; >+ } >+ return idev['interface'] + ': ' + array.map(idev.ip6, function(ip6) { >+ // adress - prefix/identifier >+ return ip6[0] + ' - ' + ip6[1] + '/' + ip6[2]; >+ }).join(', '); // TODO: <br> or <li> > }); >- ipv6Str += '</ul>'; > >+ ipv6Str = ipv6Str.length ? '<ul><li>' + ipv6Str.join('</li><li>') + '</li></ul>' : ''; >+ > // create a verbose list of all settings > return [{ > variables: ['gateway'], >@@ -562,11 +501,11 @@ > description: _('Gateway (IPv6)'), > values: vals['ipv6/gateway'] > }, { >- variables: [/nameserver.*/], >+ variables: [(/nameserver.*/)], > description: _('Domain name server'), > values: vals['nameserver'].join(', ') > }, { >- variables: [/dns\/forwarder.*/], >+ variables: [(/dns\/forwarder.*/)], > description: _('External name server'), > values: vals['dns/forwarder'].join(', ') > }, { >@@ -574,17 +513,22 @@ > description: _('HTTP proxy'), > values: vals['proxy/http'] > }, { >- variables: [/^interfaces\/[^_\/]+(_[0-9]+)?\/(?!ipv6).*/], >+ variables: [(/^interfaces\/[^_\/]+(_[0-9]+)?\/(?!ipv6).*/)], > description: _('IPv4 network devices'), > values: ipv4Str > }, { >- variables: [/^interfaces\/[^\/]+\/ipv6\/.*\/(prefix|address)$/], >+ variables: [(/^interfaces\/[^\/]+\/ipv6\/.*\/(prefix|address)$/)], > description: _('IPv6 network devices'), > values: ipv6Str > }, { >- variables: [/^interfaces\/[^\/]+\/ipv6\/acceptRA/], >- description: _('IPv6 interfaces with autoconfiguration (SLAAC)'), >- values: vals['dynamic_interfaces_ipv6'].length ? vals['dynamic_interfaces_ipv6'].join(', ') : _('No device') >+ variables: ['interfaces/primary'], >+ description: _('primary network interface'), >+ values: vals['interfaces/primary'] >+// }, { >+ // FIXME >+// variables: [/^interfaces\/[^\/]+\/ipv6\/acceptRA/], >+// description: _('IPv6 interfaces with autoconfiguration (SLAAC)'), >+// values: vals['dynamic_interfaces_ipv6'].length ? vals['dynamic_interfaces_ipv6'].join(', ') : _('No device') > }]; > }, > >Index: umc/js/de.po >=================================================================== >--- umc/js/de.po (Revision 36940) >+++ umc/js/de.po (Arbeitskopie) >@@ -3,7 +3,7 @@ > msgstr "" > "Project-Id-Version: univention-management-console-module-setup\n" > "Report-Msgid-Bugs-To: packages@univention.de\n" >-"POT-Creation-Date: 2012-08-27 15:39+0200\n" >+"POT-Creation-Date: 2012-11-09 13:20+0100\n" > "PO-Revision-Date: 2012-02-20 11:34+0100\n" > "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" > "Language-Team: LANGUAGE <LL@li.org>\n" >@@ -12,7 +12,7 @@ > "Content-Type: text/plain; charset=UTF-8\n" > "Content-Transfer-Encoding: 8bit\n" > >-#: umc/js/_setup/SystemRolePage.js:88 >+#: umc/js/setup/SystemRolePage.js:88 > msgid "" > "<h2>Backup domain controller</h2>All the domain data and SSL security " > "certificates are saved as read-only copies on servers with the backup domain " >@@ -26,7 +26,7 @@ > "als Fallback-System des DC Master. Sollte dieser ausfallen, kann ein DC " > "Backup die Rolle des DC Master dauerhaft übernehmen." > >-#: umc/js/_setup/SystemRolePage.js:103 >+#: umc/js/setup/SystemRolePage.js:103 > msgid "" > "<h2>Base system</h2>A base system is an autonomous system which is not a " > "member of the domain.A base system is thus suitable for services which are " >@@ -38,7 +38,7 @@ > "an, die auÃerhalb des Vertrauenskontextes der Domäne betrieben werden, etwa " > "als Web-Server oder Firewall." > >-#: umc/js/_setup/SystemRolePage.js:83 >+#: umc/js/setup/SystemRolePage.js:83 > msgid "" > "<h2>Master domain controller</h2>A system with the master domain controller " > "role (DC master for short) is the primary domain controller of a UCS domain " >@@ -54,7 +54,7 @@ > "Sicherheitszertifikategespeichert. Kopien dieser Daten werden automatisch " > "auf Server mit der Rolle Domänencontroller Backup übertragen." > >-#: umc/js/_setup/SystemRolePage.js:98 >+#: umc/js/setup/SystemRolePage.js:98 > msgid "" > "<h2>Member server</h2>Member servers are server systems without a local LDAP " > "server. Access to domain data here is performed via other servers in the " >@@ -64,7 +64,7 @@ > "Server. Der Zugriff auf Domänendaten erfolgt hierbei über andere Server der " > "Domäne." > >-#: umc/js/_setup/SystemRolePage.js:93 >+#: umc/js/setup/SystemRolePage.js:93 > msgid "" > "<h2>Slave domain controller</h2>All the domain data are saved as read-only " > "copies on servers with the slave domain controller role (slave DC for " >@@ -83,7 +83,7 @@ > "lastintensiver Dienste an. Ein DC Slave-System kann nicht zum DC Master " > "hochgestuft werden." > >-#: umc/js/_setup/LanguagePage.js:67 >+#: umc/js/setup/LanguagePage.js:69 > msgid "" > "<i>Language settings</i> incorporate all language relevant configurations, " > "such as time zone, keyboard layout, and system locales." >@@ -91,64 +91,85 @@ > "Die <i>Spracheinstellungen</i> beinhalten alle sprachrelevanten " > "Einstellungsmöglichkeiten wie Zeitzone, Tastaturlayout und Systemsprache." > >-#: umc/js/_setup/NetworkPage.js:226 >-msgid "A virtual network device cannot be used for DHCP." >-msgstr "Ein virtuelles Netzwerkgerät kann nicht für DHCP benutzt werden." >- >-#: umc/js/_setup/BasisPage.js:101 >+#: umc/js/setup/BasisPage.js:101 > msgid "Access settings" > msgstr "Zugriffseinstellungen" > >-#: umc/js/setup.js:628 >+#: umc/js/setup.js:656 > msgid "Account data" > msgstr "Kontodaten" > >-#: umc/js/setup.js:266 umc/js/setup.js:572 umc/js/setup.js:652 >+#: umc/js/setup/InterfaceGrid.js:356 >+msgid "Add a network interface" >+msgstr "" >+ >+#: umc/js/setup/InterfaceGrid.js:121 umc/js/setup/InterfaceGrid.js:323 >+msgid "Add interface" >+msgstr "Netzwerkgerät hinzufügen" >+ >+#: umc/js/setup.js:281 umc/js/setup.js:600 umc/js/setup.js:680 > msgid "Apply changes" > msgstr "Ãnderungen anwenden" > >-#: umc/js/setup.js:199 >+#: umc/js/setup.js:215 > msgid "Apply settings" > msgstr "Einstellungen anwenden" > >-#: umc/js/_setup/NetworkPage.js:146 >+#: umc/js/setup/InterfaceWizard.js:169 > msgid "Autoconfiguration (SLAAC)" > msgstr "Automatische Konfiguration (SLAAC)" > >-#: umc/js/setup.js:184 >+#: umc/js/setup.js:200 > msgid "Back" > msgstr "Zurück" > >-#: umc/js/_setup/SystemRolePage.js:77 >+#: umc/js/setup/SystemRolePage.js:77 > msgid "Base system" > msgstr "Basissystem" > >-#: umc/js/_setup/BasisPage.js:67 >+#: umc/js/setup/BasisPage.js:67 > msgid "Basic settings" > msgstr "Basis-Einstellungen" > >-#: umc/js/_setup/CertificatePage.js:105 >+#: umc/js/setup/types.js:47 >+msgid "Bonding" >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:238 >+msgid "Bonding configuration" >+msgstr "Bonding konfiguration" >+ >+#: umc/js/setup/types.js:48 >+msgid "Bridge" >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:213 >+msgid "Bridge configuration" >+msgstr "Bridge konfiguration" >+ >+#: umc/js/setup/CertificatePage.js:104 > msgid "Business unit" > msgstr "Abteilung" > >-#: umc/js/setup.js:260 umc/js/setup.js:374 umc/js/setup.js:569 >-#: umc/js/setup.js:616 umc/js/setup.js:648 umc/js/_setup/BasisPage.js:255 >+#: umc/js/setup.js:275 umc/js/setup.js:388 umc/js/setup.js:597 >+#: umc/js/setup.js:644 umc/js/setup.js:676 umc/js/setup/InterfaceGrid.js:138 >+#: umc/js/setup/BasisPage.js:256 > msgid "Cancel" > msgstr "Abbrechen" > >-#: umc/js/_setup/LanguagePage.js:102 >+#: umc/js/setup/LanguagePage.js:111 > msgid "Category" > msgstr "Kategorie" > >-#: umc/js/_setup/CertificatePage.js:69 >+#: umc/js/setup/CertificatePage.js:68 > msgid "Certificate" > msgstr "Zertifikat" > >-#: umc/js/_setup/CertificatePage.js:70 >+#: umc/js/setup/CertificatePage.js:69 > msgid "Certificate settings" > msgstr "Zertifikateinstellungen" > >-#: umc/js/_setup/CertificatePage.js:149 >+#: umc/js/setup/CertificatePage.js:148 > msgid "" > "Changes in the SSL certificate settings will result in generating new root " > "SSL certificates. Note that this will require an update of all host " >@@ -163,7 +184,7 @@ > "univention.de/1000\" target=\"_blank\">Univention Support Database</a> " > "gefunden werden." > >-#: umc/js/_setup/NetworkPage.js:211 >+#: umc/js/setup/NetworkPage.js:153 > msgid "" > "Changing IP address configurations may result in restarting or stopping " > "services. This can have severe side-effects when the system is in productive " >@@ -173,87 +194,109 @@ > "zur Folge haben. Dies kann ernsthafte Auswirkungen haben, sollte sich das " > "System im Produktiveinsatz befinden." > >-#: umc/js/setup.js:251 umc/js/setup.js:255 >+#: umc/js/setup.js:266 umc/js/setup.js:270 > msgid "Close" > msgstr "SchlieÃen" > >-#: umc/js/_setup/CertificatePage.js:81 >+#: umc/js/setup/CertificatePage.js:80 > msgid "Common name for the root SSL certificate" > msgstr "Allgemeiner Name (common name) für das Root-SSL-Zertifikat" > >-#: umc/js/setup.js:697 >+#: umc/js/setup.js:725 > msgid "Configuration finished" > msgstr "Konfiguration abgeschlossen" > >-#: umc/js/_setup/SystemRolePage.js:107 >+#: umc/js/setup/SystemRolePage.js:107 > msgid "Configuration of the UCS system role" > msgstr "Konfiguration der UCS-Systemrolle" > >-#: umc/js/setup.js:377 umc/js/_setup/BasisPage.js:259 >+#: umc/js/setup/InterfaceWizard.js:90 umc/js/setup/InterfaceWizard.js:214 >+#: umc/js/setup/InterfaceWizard.js:239 >+#, python-format >+msgid "Configure the %s network interface %s" >+msgstr "" >+ >+#: umc/js/setup.js:391 umc/js/setup/BasisPage.js:260 > msgid "Continue" > msgstr "Fortfahren" > >-#: umc/js/setup.js:764 >+#: umc/js/setup.js:792 > msgid "Continue unjoined" > msgstr "Ungejoint fortfahren" > >-#: umc/js/_setup/CertificatePage.js:87 >+#: umc/js/setup/CertificatePage.js:86 > msgid "Country" > msgstr "Land" > >-#: umc/js/_setup/LanguagePage.js:108 >+#: umc/js/setup/LanguagePage.js:117 > msgid "Country code" > msgstr "Ländercode" > >-#: umc/js/_setup/SystemRolePage.js:71 >+#: umc/js/setup/SystemRolePage.js:71 > msgid "Currently selected system role" > msgstr "Aktuell ausgewählte Systemrolle" > >-#: umc/js/_setup/NetworkPage.js:238 >+#: umc/js/setup/InterfaceWizard.js:438 umc/js/setup/InterfaceWizard.js:450 > msgid "DHCP query failed." > msgstr "DHCP-Anfrage schlug fehl." > >-#: umc/js/_setup/LanguagePage.js:121 umc/js/_setup/LanguagePage.js:208 >+#: umc/js/setup/LanguagePage.js:140 umc/js/setup/LanguagePage.js:235 > msgid "Default system locale" > msgstr "Standard-System-Sprachdefinition" > >-#: umc/js/_setup/SystemRolePage.js:74 >+#: umc/js/setup/InterfaceGrid.js:129 umc/js/setup/InterfaceGrid.js:135 >+msgid "Delete" >+msgstr "" >+ >+#: umc/js/setup/SystemRolePage.js:74 > msgid "Domain controller backup" > msgstr "Domänencontroller Backup" > >-#: umc/js/_setup/SystemRolePage.js:73 >+#: umc/js/setup/SystemRolePage.js:73 > msgid "Domain controller master" > msgstr "Domänencontroller Master" > >-#: umc/js/_setup/SystemRolePage.js:75 >+#: umc/js/setup/SystemRolePage.js:75 > msgid "Domain controller slave" > msgstr "Domänencontroller Slave" > >-#: umc/js/_setup/NetworkPage.js:550 >+#: umc/js/setup/NetworkPage.js:489 > msgid "Domain name server" > msgstr "Domänen-DNS-Server" > >-#: umc/js/_setup/NetworkPage.js:163 >+#: umc/js/setup/NetworkPage.js:119 > msgid "Domain name server (max. 3)" > msgstr "Domänen-DNS-Server (max. 3)" > >-#: umc/js/_setup/NetworkPage.js:112 >+#: umc/js/setup/InterfaceWizard.js:143 > msgid "Dynamic (DHCP)" > msgstr "Dynamisch (DHCP)" > >-#: umc/js/_setup/CertificatePage.js:109 >+#: umc/js/setup/InterfaceGrid.js:113 >+msgid "Edit" >+msgstr "" >+ >+#: umc/js/setup/InterfaceGrid.js:356 >+msgid "Edit a network interface" >+msgstr "" >+ >+#: umc/js/setup/CertificatePage.js:108 > msgid "Email address" > msgstr "E-Mailadresse" > >-#: umc/js/_setup/NetworkPage.js:554 >+#: umc/js/setup/types.js:45 >+msgid "Ethernet" >+msgstr "" >+ >+#: umc/js/setup/NetworkPage.js:493 > msgid "External name server" > msgstr "Externer DNS-Server " > >-#: umc/js/_setup/NetworkPage.js:169 >+#: umc/js/setup/NetworkPage.js:125 > msgid "External name server (max. 3)" > msgstr "Externer DNS-Server " > >-#: umc/js/_setup/CertificatePage.js:71 >+#: umc/js/setup/CertificatePage.js:70 > msgid "" > "Following the <i>certificate settings</i>, a new root certificate will be " > "created for the domain. Note that this step only applies to systems with the " >@@ -263,7 +306,7 @@ > "Zertifikat für die Domäne erstellt. Hinweis: Dieser Schritt ist nur auf " > "Domänencontroller Master-Systemen notwendig." > >-#: umc/js/_setup/BasisPage.js:125 >+#: umc/js/setup/BasisPage.js:125 > msgid "" > "For Active Directory domains the fully qualified domain name must have at " > "least two dots (e.g. host.example.com). This warning is shown only once, the " >@@ -274,87 +317,95 @@ > "Warnung, die Einstellungen können mit dem aktuell gewählten Namen " > "gespeichert werden." > >-#: umc/js/_setup/BasisPage.js:211 >+#: umc/js/setup/BasisPage.js:212 > msgid "Fully qualified domain name" > msgstr "Vollständiger Rechnername" > >-#: umc/js/_setup/BasisPage.js:77 >+#: umc/js/setup/BasisPage.js:77 > msgid "Fully qualified domain name (e.g. master.example.com)" > msgstr "Vollständiger Rechnername (z.B. master.example.com)" > >-#: umc/js/_setup/NetworkPage.js:154 umc/js/_setup/NetworkPage.js:542 >+#: umc/js/setup/NetworkPage.js:110 umc/js/setup/NetworkPage.js:481 > msgid "Gateway (IPv4)" > msgstr "Gateway (IPv4)" > >-#: umc/js/_setup/NetworkPage.js:158 umc/js/_setup/NetworkPage.js:546 >+#: umc/js/setup/NetworkPage.js:114 umc/js/setup/NetworkPage.js:485 > msgid "Gateway (IPv6)" > msgstr "Gateway (IPv6)" > >-#: umc/js/_setup/BasisPage.js:66 >+#: umc/js/setup/BasisPage.js:66 > msgid "General" > msgstr "Allgemein" > >-#: umc/js/_setup/CertificatePage.js:113 >+#: umc/js/setup/CertificatePage.js:112 > msgid "General settings" > msgstr "Allgemeine Einstellungen" > >-#: umc/js/_setup/NetworkPage.js:184 >+#: umc/js/setup/InterfaceWizard.js:207 umc/js/setup/NetworkPage.js:137 > msgid "Global network settings" > msgstr "Globale Netzwerk-Einstellungen" > >-#: umc/js/_setup/NetworkPage.js:174 umc/js/_setup/NetworkPage.js:558 >+#: umc/js/setup/NetworkPage.js:130 umc/js/setup/NetworkPage.js:497 > msgid "HTTP proxy" > msgstr "HTTP-Proxy" > >-#: umc/js/_setup/HelpPage.js:58 >+#: umc/js/setup/HelpPage.js:60 > msgid "Help" > msgstr "Hilfe" > >-#: umc/js/_setup/BasisPage.js:98 >+#: umc/js/setup/BasisPage.js:98 > msgid "Host and domain settings" > msgstr "Rechner- und Domänen-Einstellungen" > >-#: umc/js/_setup/BasisPage.js:239 >+#: umc/js/setup/BasisPage.js:240 > msgid "Hostname and windows domain may not be equal." > msgstr "Hostname und Windows-Domäne dürfen nicht gleich sein." > >-#: umc/js/_setup/NetworkPage.js:104 >+#: umc/js/setup/InterfaceGrid.js:81 >+msgid "IP addresses" >+msgstr "IP-Adressen" >+ >+#: umc/js/setup/NetworkPage.js:134 >+msgid "IP network devices" >+msgstr "IP Netzwerkgeräte" >+ >+#: umc/js/setup/InterfaceWizard.js:130 > msgid "IPv4 address" > msgstr "IPv4-Adresse" > >-#: umc/js/_setup/NetworkPage.js:178 umc/js/_setup/NetworkPage.js:562 >+#: umc/js/setup/InterfaceWizard.js:201 umc/js/setup/NetworkPage.js:501 > msgid "IPv4 network devices" > msgstr "IPv4-Netzwerkgeräte" > >-#: umc/js/_setup/NetworkPage.js:131 >+#: umc/js/setup/InterfaceWizard.js:151 > msgid "IPv6 address" > msgstr "IPv6-Adresse" > >-#: umc/js/_setup/NetworkPage.js:570 >+#: umc/js/setup/NetworkPage.js:514 > msgid "IPv6 interfaces with autoconfiguration (SLAAC)" > msgstr "IPv6-Netzwerkgeräte mit automatische Konfiguration (SLAAC)" > >-#: umc/js/_setup/NetworkPage.js:181 umc/js/_setup/NetworkPage.js:566 >+#: umc/js/setup/InterfaceWizard.js:204 umc/js/setup/NetworkPage.js:505 > msgid "IPv6 network devices" > msgstr "IPv6-Netzwerkgeräte" > >-#: umc/js/_setup/NetworkPage.js:135 >+#: umc/js/setup/InterfaceWizard.js:155 > msgid "IPv6 prefix" > msgstr "IPv6-Präfix" > >-#: umc/js/_setup/NetworkPage.js:139 >+#: umc/js/setup/InterfaceWizard.js:159 > msgid "Identifier" > msgstr "Bezeichner" > >-#: umc/js/_setup/BasisPage.js:244 >+#: umc/js/setup/BasisPage.js:245 > msgid "" > "If Samba is used on this system, the length of the hostname may be at most " > "13 characters." > msgstr "" >-"Falls Samba auf diesem System verwendet wird, darf der Hostname maximal " >-"13 Zeichen lang sein." >+"Falls Samba auf diesem System verwendet wird, darf der Hostname maximal 13 " >+"Zeichen lang sein." > >-#: umc/js/_setup/SystemRolePage.js:62 >+#: umc/js/setup/SystemRolePage.js:62 > msgid "" > "If the system is not part of a domain yet, the <i>system role</i> may be " > "changed." >@@ -362,7 +413,7 @@ > "Die <i>Systemrolle</i> des Systems kann geändert werden, solange es noch " > "nicht der UCS-Domäne beigetreten ist." > >-#: umc/js/_setup/NetworkPage.js:73 >+#: umc/js/setup/NetworkPage.js:80 > msgid "" > "In the <i>network settings</i>, IP addresses (IPv4 and IPv6) as well as name " > "servers, gateways, and HTTP proxies may be specified." >@@ -370,27 +421,31 @@ > "In den <i>Netzwerkeinstellungen</i> können IP-Adressen (IPv4 und IPv6) sowie " > "DNS-Server, Gateways und HTTP-Proxy festgelegt werden." > >-#: umc/js/_setup/HelpPage.js:80 >+#: umc/js/setup/InterfaceGrid.js:73 >+msgid "Information" >+msgstr "Informationen" >+ >+#: umc/js/setup/HelpPage.js:82 > msgid "Information about the initial configuration" > msgstr "Informationen über die Erstkonfiguration" > >-#: umc/js/setup.js:672 >+#: umc/js/setup.js:700 > msgid "Initialize the configuration process ..." > msgstr "Initialisiere den Konfigurationsvorgang ..." > >-#: umc/js/_setup/SoftwarePage.js:87 >+#: umc/js/setup/SoftwarePage.js:86 > msgid "Installation of software components" > msgstr "Installation von Softwarekomponenten" > >-#: umc/js/_setup/SoftwarePage.js:77 >+#: umc/js/setup/SoftwarePage.js:76 > msgid "Installed software components" > msgstr "Installierte Softwarekomponenten" > >-#: umc/js/_setup/LanguagePage.js:93 umc/js/_setup/LanguagePage.js:204 >+#: umc/js/setup/LanguagePage.js:102 umc/js/setup/LanguagePage.js:231 > msgid "Installed system locales" > msgstr "Verfügbare System-Lokalisierungen" > >-#: umc/js/_setup/SoftwarePage.js:123 >+#: umc/js/setup/SoftwarePage.js:119 > msgid "" > "Installing or removing software components may result in restarting or " > "stopping services. This can have severe side-effects when the system is in " >@@ -400,19 +455,33 @@ > "oder Anhalten von diversen Diensten zur Folge haben. Dies kann ernsthafte " > "Auswirkungen haben, sollte sich das System im Produktiveinsatz befinden." > >-#: umc/js/_setup/SoftwarePage.js:227 >+#: umc/js/setup/SoftwarePage.js:223 > msgid "Installing software components" > msgstr "Installation von Softwarekomponenten" > >-#: umc/js/_setup/NetworkPage.js:86 umc/js/_setup/NetworkPage.js:126 >+#: umc/js/setup/InterfaceGrid.js:62 umc/js/setup/InterfaceGrid.js:280 >+#: umc/js/setup/InterfaceWizard.js:104 > msgid "Interface" > msgstr "Netzwerkgerät" > >-#: umc/js/_setup/NetworkPage.js:82 umc/js/_setup/NetworkPage.js:122 >+#: umc/js/setup/InterfaceGrid.js:217 >+#, python-format >+msgid "Interface \"%s\" already exists" >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:89 >+msgid "Interface configuration" >+msgstr "Netzwerkgerätekonfiguration" >+ >+#: umc/js/setup/InterfaceGrid.js:245 >+msgid "Interface type" >+msgstr "Netzwerkgerätetyp" >+ >+#: umc/js/setup/InterfaceGrid.js:94 > msgid "Interfaces" > msgstr "Netzwerkgeräte" > >-#: umc/js/_setup/SoftwarePage.js:122 >+#: umc/js/setup/SoftwarePage.js:118 > msgid "" > "It is not possible to mix NT and Active Directory compatible " > "domaincontroller. Make sure the existing UCS domain is Active Directory-" >@@ -422,7 +491,7 @@ > "gleichzeitig zu verwenden. Stellen sie sicher, dass die existierende UCS-" > "Domäne kompatibel zu Active-Directory (Samba 4) ist." > >-#: umc/js/_setup/SoftwarePage.js:121 >+#: umc/js/setup/SoftwarePage.js:117 > msgid "" > "It is not possible to mix NT and Active Directory compatible " > "domaincontroller. Make sure the existing UCS domain is NT-compatible (Samba " >@@ -432,158 +501,171 @@ > "gleichzeitig zu verwenden. Stellen sie sicher, dass die existierende UCS-" > "Domäne NT-kompatibel (Samba 3) ist." > >-#: umc/js/setup.js:603 >+#: umc/js/setup.js:631 > msgid "Join" > msgstr "Join" > >-#: umc/js/_setup/LanguagePage.js:82 umc/js/_setup/LanguagePage.js:200 >+#: umc/js/setup/LanguagePage.js:91 umc/js/setup/LanguagePage.js:227 > msgid "Keyboard layout" > msgstr "Tastaturlayout" > >-#: umc/js/_setup/BasisPage.js:82 umc/js/_setup/BasisPage.js:215 >+#: umc/js/setup/BasisPage.js:82 umc/js/setup/BasisPage.js:216 > msgid "LDAP base" > msgstr "LDAP-Basis" > >-#: umc/js/_setup/LanguagePage.js:65 umc/js/_setup/LanguagePage.js:106 >+#: umc/js/setup/LanguagePage.js:67 umc/js/setup/LanguagePage.js:115 > msgid "Language" > msgstr "Sprache" > >-#: umc/js/_setup/LanguagePage.js:105 >+#: umc/js/setup/LanguagePage.js:114 > msgid "Language (english)" > msgstr "Sprache (englisch)" > >-#: umc/js/_setup/LanguagePage.js:107 >+#: umc/js/setup/LanguagePage.js:116 > msgid "Language code" > msgstr "Sprachcode" > >-#: umc/js/_setup/LanguagePage.js:66 umc/js/_setup/LanguagePage.js:133 >+#: umc/js/setup/LanguagePage.js:68 umc/js/setup/LanguagePage.js:152 > msgid "Language settings" > msgstr "Spracheinstellungen" > >-#: umc/js/_setup/CertificatePage.js:97 >+#: umc/js/setup/CertificatePage.js:96 > msgid "Location" > msgstr "Ort" > >-#: umc/js/_setup/CertificatePage.js:116 >+#: umc/js/setup/CertificatePage.js:115 > msgid "Location settings" > msgstr "Standorteinstellungen" > >-#: umc/js/_setup/SystemRolePage.js:76 >+#: umc/js/setup/SystemRolePage.js:76 > msgid "Member server" > msgstr "Member-Server" > >-#: umc/js/_setup/LanguagePage.js:114 >+#: umc/js/setup/InterfaceWizard.js:258 >+msgid "Mode" >+msgstr "" >+ >+#: umc/js/setup/LanguagePage.js:123 > msgid "Name" > msgstr "Name" > >-#: umc/js/_setup/NetworkPage.js:108 >+#: umc/js/setup/InterfaceWizard.js:134 > msgid "Netmask" > msgstr "Netzmaske" > >-#: umc/js/_setup/NetworkPage.js:71 >+#: umc/js/setup/NetworkPage.js:78 > msgid "Network" > msgstr "Netzwerk" > >-#: umc/js/_setup/NetworkPage.js:72 >+#: umc/js/setup/NetworkPage.js:79 > msgid "Network settings" > msgstr "Netzwerk-Einstellungen" > >-#: umc/js/_setup/BasisPage.js:223 >+#: umc/js/setup/BasisPage.js:224 > msgid "New root password" > msgstr "Neues Root-Passwort" > >-#: umc/js/setup.js:164 >+#: umc/js/setup.js:182 > msgid "Next" > msgstr "Vor" > >-#: umc/js/setup.js:485 >+#: umc/js/setup.js:513 > msgid "No changes have been made." > msgstr "Es wurden keine Ãnderungen vorgenommen." > >-#: umc/js/_setup/NetworkPage.js:571 >+#: umc/js/setup/NetworkPage.js:515 > msgid "No device" > msgstr "Kein Gerät" > >-#: umc/js/setup.js:719 >+#: umc/js/setup.js:747 > msgid "Not all changes could be applied successfully:" > msgstr "Nicht alle Ãnderungen konnten erfolgreich übernommen werden." > >-#: umc/js/setup.js:723 >+#: umc/js/setup.js:751 > msgid "Ok" > msgstr "Ok" > >-#: umc/js/_setup/CertificatePage.js:101 >+#: umc/js/setup/CertificatePage.js:100 > msgid "Organization" > msgstr "Organisation" > >-#: umc/js/_setup/CertificatePage.js:119 >+#: umc/js/setup/CertificatePage.js:118 > msgid "Organization settings" > msgstr "Einstellungen über die Organisation" > >-#: umc/js/setup.js:599 >+#: umc/js/setup.js:627 > msgid "Password" > msgstr "Passwort" > >-#: umc/js/_setup/NetworkPage.js:221 >+#: umc/js/setup/InterfaceWizard.js:425 > msgid "Please choose a network device before querying a DHCP address." > msgstr "" > "Bitte wählen Sie ein Netzwerkgerät bevor Sie eine DHCP-Adresse anfragen." > >-#: umc/js/setup.js:564 >+#: umc/js/setup/InterfaceGrid.js:134 >+#, python-format >+msgid "Please confirm the removal of the %d selected interfaces!" >+msgstr "" >+ >+#: umc/js/setup.js:592 > msgid "" > "Please confirm to apply these changes to the system. This may take some time." > msgstr "" > "Bitte bestätigen Sie, dass diese Ãnderungen auf das System übertragen " > "werden. Dies kann einige Zeit in Anspruch nehmen." > >-#: umc/js/setup.js:764 >+#: umc/js/setup.js:792 > msgid "Reconfigure, retry" > msgstr "Ãndern, wiederholen" > >-#: umc/js/_setup/SoftwarePage.js:237 >+#: umc/js/setup/SoftwarePage.js:233 > msgid "Removing software components" > msgstr "Entfernen von Softwarekomponenten" > >-#: umc/js/setup.js:272 >+#: umc/js/setup.js:287 > msgid "Reset" > msgstr "Zurücksetzen" > >-#: umc/js/_setup/BasisPage.js:94 >+#: umc/js/setup/BasisPage.js:94 > msgid "Root password" > msgstr "Root-Passwort" > >-#: umc/js/_setup/BasisPage.js:249 >+#: umc/js/setup/BasisPage.js:250 > msgid "Root password empty. Continue?" > msgstr "Root-Passwort ist leer. Möchten Sie fortfahren?" > >-#: umc/js/_setup/CertificatePage.js:191 >+#: umc/js/setup/CertificatePage.js:190 > msgid "SSL root certificate" > msgstr "SSL-Root-Zertifikat" > >-#: umc/js/setup.js:254 >+#: umc/js/setup/InterfaceGrid.js:314 umc/js/setup/InterfaceGrid.js:322 >+msgid "Select an interface type" >+msgstr "Auswahl des Netzwerkgerätetyp" >+ >+#: umc/js/setup.js:269 > msgid "Should the UMC module be closed? All unsaved modification will be lost." > msgstr "" > "Soll das UMC-Modul geschlossen werden? Alle nicht gespeicherten Ãnderungen " > "gehen verloren" > >-#: umc/js/_setup/SoftwarePage.js:66 >+#: umc/js/setup/SoftwarePage.js:65 > msgid "Software" > msgstr "Software" > >-#: umc/js/_setup/SoftwarePage.js:67 >+#: umc/js/setup/SoftwarePage.js:66 > msgid "Software settings" > msgstr "Software-Einstellungen" > >-#: umc/js/_setup/CertificatePage.js:93 >+#: umc/js/setup/CertificatePage.js:92 > msgid "State" > msgstr "Bundesland" > >-#: umc/js/_setup/SystemRolePage.js:60 umc/js/_setup/SystemRolePage.js:61 >-#: umc/js/_setup/SystemRolePage.js:169 >+#: umc/js/setup/SystemRolePage.js:60 umc/js/setup/SystemRolePage.js:61 >+#: umc/js/setup/SystemRolePage.js:170 > msgid "System role" > msgstr "Systemrolle" > >-#: umc/js/_setup/BasisPage.js:68 >+#: umc/js/setup/BasisPage.js:68 > msgid "" > "The <i>basic settings</i> define essential properties, such as host and " > "domain name, LDAP base, Windows domain name as well as the system " >@@ -593,18 +675,18 @@ > "und Domänenname, LDAP-Basis, Windows-Domänename und das Passwort für die " > "Systemadministration (root) fest. " > >-#: umc/js/setup.js:707 umc/js/setup.js:713 >+#: umc/js/setup.js:735 umc/js/setup.js:741 > msgid "The changes have been applied successfully." > msgstr "Die Ãnderungen wurden erfolgreich übernommen." > >-#: umc/js/setup.js:758 >+#: umc/js/setup.js:786 > msgid "" > "The configuration was successful. Please confirm to complete the process." > msgstr "" > "Die Konfiguration war erfolgreich. Bitte bestätigen Sie, um den Vorgang " > "abzuschlieÃen." > >-#: umc/js/setup.js:692 >+#: umc/js/setup.js:720 > msgid "" > "The connection to the server could not be established after {time} seconds. " > "This problem can occur due to a change of the IP address. In this case, " >@@ -616,15 +698,23 @@ > "führen sein. Loggen Sie sich in diesem Fall erneut auf Univention Management " > "Console unter der {linkStart}neuen Adresse{linkEnd} ein." > >-#: umc/js/setup.js:558 >+#: umc/js/setup/InterfaceWizard.js:387 >+msgid "The entered data is not valid. Please correct your input." >+msgstr "" >+ >+#: umc/js/setup.js:586 > msgid "The following changes will be applied to the system:" > msgstr "Die folgenden Ãnderungen werden auf das System übertragen:" > >-#: umc/js/setup.js:495 >+#: umc/js/setup.js:523 > msgid "The following entries could not be validated:" > msgstr "Die folgenden Einträge konnte nicht validiert werden:" > >-#: umc/js/setup.js:769 >+#: umc/js/setup/InterfaceGrid.js:304 >+msgid "The interface must be one of the physical interfaces: " >+msgstr "" >+ >+#: umc/js/setup.js:797 > msgid "" > "The settings can be changed in the UMC module \"Basic settings\" after the " > "join process has been completed. Please confirm now to complete the process." >@@ -633,7 +723,7 @@ > "\"Basis-Einstellungen\" geändert werden. Bitte bestätigen Sie, um den " > "Vorgang abzuschlieÃen." > >-#: umc/js/setup.js:584 >+#: umc/js/setup.js:612 > msgid "" > "The specified settings will be applied to the system and the system will be " > "joined into the domain. Please enter username and password of a domain " >@@ -643,7 +733,7 @@ > "das System der Domäne beitreten. Bitte geben Sie dafür Benutzernamen und " > "Password eines Administrator-Kontos der Domäne an." > >-#: umc/js/setup.js:645 >+#: umc/js/setup.js:673 > msgid "" > "The specified settings will be applied to the system. This may take some " > "time. Please confirm to proceed." >@@ -651,11 +741,11 @@ > "Die angegebenen Einstellungen werden auf das System übertragen, dies kann " > "einen Moment dauern. Bitte bestätigen Sie um fortzufahren." > >-#: umc/js/setup.js:761 >+#: umc/js/setup.js:789 > msgid "The system join was not successful." > msgstr "Der Domänenbeitritt war nicht erfolgreich." > >-#: umc/js/setup.js:767 >+#: umc/js/setup.js:795 > msgid "" > "The system join was successful, however, errors occurred while applying the " > "configuration settings:" >@@ -663,23 +753,32 @@ > "Der Domänenbeitritt war erfolgreich, allerdings sind Fehler beim Setzen der " > "Konfigurationseinstellungen aufgetreten:" > >-#: umc/js/_setup/LanguagePage.js:76 umc/js/_setup/LanguagePage.js:196 >+#: umc/js/setup/InterfaceGrid.js:307 >+msgid "" >+"There must be at least two physical interfaces to use a bonding interface" >+msgstr "" >+ >+#: umc/js/setup/LanguagePage.js:85 umc/js/setup/LanguagePage.js:223 > msgid "Time zone" > msgstr "Zeitzone" > >-#: umc/js/_setup/LanguagePage.js:130 >+#: umc/js/setup/LanguagePage.js:149 > msgid "Time zone and keyboard settings" > msgstr "Zeitzonen- und Tastatureinstellungen" > >-#: umc/js/_setup/HelpPage.js:59 >+#: umc/js/setup/InterfaceGrid.js:66 >+msgid "Type" >+msgstr "" >+ >+#: umc/js/setup/HelpPage.js:61 > msgid "UCS initial configuration" > msgstr "UCS Erstkonfiguration" > >-#: umc/js/setup.js:595 >+#: umc/js/setup.js:623 > msgid "Username" > msgstr "Benutzername" > >-#: umc/js/_setup/SoftwarePage.js:68 >+#: umc/js/setup/SoftwarePage.js:67 > msgid "" > "Via the <i>software settings</i>, particular software components may be " > "installed or removed." >@@ -687,12 +786,34 @@ > "Ãber die <i>Software-Einstellungen</i> können bestimmte Software-Komponenten " > "installiert und deinstalliert werden." > >-#: umc/js/_setup/BasisPage.js:88 umc/js/_setup/BasisPage.js:219 >+#: umc/js/setup/types.js:46 >+msgid "Virtual LAN" >+msgstr "virtuelles LAN" >+ >+#: umc/js/setup/InterfaceWizard.js:181 >+msgid "Virtual interface ID" >+msgstr "virtuelle Geräte ID" >+ >+#: umc/js/setup/BasisPage.js:88 umc/js/setup/BasisPage.js:220 > msgid "Windows domain" > msgstr "Windows-Domäne" > >-#: umc/js/setup.js:763 >+#: umc/js/setup/InterfaceWizard.js:367 > msgid "" >+"You have to specify a valid interface and interfaceType. Please correct your " >+"input." >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:373 >+msgid "You have to specify at least one ip address or enable DHCP or SLACC." >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:377 >+msgid "You have to specify at least two interfaces to use for this bond device" >+msgstr "" >+ >+#: umc/js/setup.js:791 >+msgid "" > "You may return, reconfigure the settings, and retry the join process. You " > "may also continue and end the wizard leaving the system unjoined. The system " > "can be joined later via the UMC module \"Domain join\"." >@@ -702,10 +823,30 @@ > "System ist dann nicht Teil der Domäne. Sie können es zu einem späteren " > "Zeitpunkt mit dem UMC-Modul \"Domänenbeitritt\" hinzufügen." > >-#: umc/js/_setup/NetworkPage.js:94 umc/js/_setup/NetworkPage.js:514 >-msgid "virtual" >-msgstr "virtuell" >+#: umc/js/setup/InterfaceWizard.js:287 >+msgid "advanced configuration" >+msgstr "erweiterte Konfiguration" > >+#: umc/js/setup/InterfaceWizard.js:284 >+msgid "configure the bonding interface" >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:231 >+msgid "configure the bridge interface" >+msgstr "" >+ >+#: umc/js/setup/InterfaceWizard.js:174 >+msgid "enable Virtual LAN" >+msgstr "virtuelles LAN aktivieren" >+ >+#: umc/js/setup/InterfaceWizard.js:242 >+msgid "physical interfaces used for the bonding interface" >+msgstr "" >+ >+#: umc/js/setup/NetworkPage.js:98 umc/js/setup/NetworkPage.js:509 >+msgid "primary network interface" >+msgstr "" >+ > #~ msgid "" > #~ "<h2>Base system</h2>A base system is an independent system. It is not a " > #~ "member of a domain and does not maintain trust relationships with other " >@@ -799,6 +940,9 @@ > #~ "wird nur das eigene und das öffentliche SSL-Zertifikat der Root-CA " > #~ "vorgehalten." > >+#~ msgid "A virtual network device cannot be used for DHCP." >+#~ msgstr "Ein virtuelles Netzwerkgerät kann nicht für DHCP benutzt werden." >+ > #~ msgid "Activated" > #~ msgstr "Aktiviert" > >@@ -907,3 +1051,9 @@ > #~ msgstr "" > #~ "Ihre Session sollte automatisch beendet werden. Ist dies nicht der Fall, " > #~ "kann das Beenden mittels der Tastenkombination Ctrl+Q forciert werden." >+ >+#~ msgid "advanced configuration" >+#~ msgstr "Erweiterte Konfiguration" >+ >+#~ msgid "virtual" >+#~ msgstr "virtuell" >Index: umc/js/setup.js >=================================================================== >--- umc/js/setup.js (Revision 36940) >+++ umc/js/setup.js (Arbeitskopie) >@@ -340,7 +340,7 @@ > > setValues: function(values) { > // update all pages with the given values >- this._orgValues = lang.clone(values); >+ this._orgValues = lang.clone(values); //FIXME: wrong place > array.forEach(this._pages, function(ipage) { > ipage.setValues(this._orgValues); > }, this); >Index: umc/python/setup/util.py >=================================================================== >--- umc/python/setup/util.py (Revision 36940) >+++ umc/python/setup/util.py (Arbeitskopie) >@@ -45,6 +45,7 @@ > import apt > import psutil > import csv >+import imp > > from univention.lib.i18n import Translation > from univention.management.console.log import MODULE >@@ -54,7 +55,6 @@ > if not '/lib/univention-installer/' in sys.path: > sys.path.append('/lib/univention-installer/') > import package_list >-import imp > > ucr=univention.config_registry.ConfigRegistry() > ucr.load() >@@ -91,6 +91,7 @@ > 'proxy/http', > # net: ipv6 > 'ipv6/gateway', >+ 'interfaces/primary', > # ssl > 'ssl/common', 'ssl/locality', 'ssl/country', 'ssl/state', > 'ssl/organization', 'ssl/organizationalunit', 'ssl/email', >@@ -121,6 +122,7 @@ > for link_local in link_locals: > net_values['interfaces/%s/type' % link_local] = 'dhcp' > values.update(net_values) >+ values['interfaces'] = [idev['name'] for idev in detect_interfaces()] > > # see whether the system has been joined or not > values['joined'] = os.path.exists('/var/univention-join/joined')
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 28389
:
4635
| 4784