Compare commits

...

2 Commits

Author SHA1 Message Date
ralphlee
91c1b854c5 Remove some unused APC logic 2022-01-13 23:20:11 -05:00
ralphlee
434aa5c557 [WIFI-6721] Add support for manual radproxy, radproxy secret 2022-01-13 23:03:47 -05:00
4 changed files with 135 additions and 88 deletions

View File

@@ -96,6 +96,7 @@ public class OvsdbDao extends OvsdbDaoBase {
processBlinkRequest(ovsdbClient, opensyncAPConfig.getCustomerEquipment().getInventoryId(),
((ApElementConfiguration) opensyncAPConfig.getCustomerEquipment().getDetails()).isBlinkAllLEDs());
ovsdbNodeConfig.processLedControlEnabled(ovsdbClient, opensyncAPConfig);
processApcConfig(ovsdbClient, opensyncAPConfig);
}
void configureNtpServer(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
@@ -253,5 +254,9 @@ public class OvsdbDao extends OvsdbDaoBase {
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
return ovsdbNodeConfig.processBlinkRequest(ovsdbClient, apId, blinkAllLEDs);
}
public void processApcConfig(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ovsdbNodeConfig.configureDynamicRadiusProxyToAPC(ovsdbClient, opensyncAPConfig);
}
}

View File

@@ -2,6 +2,7 @@
package com.telecominfraproject.wlan.opensync.ovsdb.dao;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -14,6 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.telecominfraproject.wlan.opensync.external.integration.models.OpensyncAPConfig;
import com.telecominfraproject.wlan.opensync.ovsdb.dao.models.WifiVifConfigInfo;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
@@ -25,6 +27,7 @@ import com.vmware.ovsdb.protocol.operation.notation.Condition;
import com.vmware.ovsdb.protocol.operation.notation.Function;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Value;
import com.vmware.ovsdb.protocol.operation.result.ErrorResult;
import com.vmware.ovsdb.protocol.operation.result.InsertResult;
import com.vmware.ovsdb.protocol.operation.result.OperationResult;
import com.vmware.ovsdb.protocol.operation.result.UpdateResult;
@@ -167,51 +170,78 @@ public class OvsdbNodeConfig extends OvsdbDaoBase {
throw new RuntimeException(e);
}
}
public String processBlinkRequest(OvsdbClient ovsdbClient, String apId, boolean blinkAllLEDs) {
String ret = null;
try {
String ret = null;
try {
LOG.debug("processLEDRequest set LEDs status to {}", blinkAllLEDs ? "led_blink" : "led_state");
Map<String, Value> columns = new HashMap<>();
if (blinkAllLEDs) {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_blink"));
} else {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_state"));
}
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable,
List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
long numUpdates = 0;
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
numUpdates += ((UpdateResult) res).getCount();
LOG.debug("processBlinkRequest update result {}", res);
ret = "processBlinkRequest update result " + res;
}
}
if (numUpdates == 0) {
// no records existed, insert the row instead
operations.clear();
operations.add(new Insert(nodeConfigTable, new Row(columns)));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.debug("processBlinkRequest insert result {}", res);
ret = "processBlinkRequest insert result " + res;
}
}
}
LOG.debug("processLEDRequest set LEDs status to {}", blinkAllLEDs ? "led_blink" : "led_state");
Map<String, Value> columns = new HashMap<>();
if (blinkAllLEDs) {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_blink"));
} else {
columns.put("module", new Atom<>("led"));
columns.put("key", new Atom<>("led_state"));
}
List<Operation> operations = new ArrayList<>();
operations.add(new Update(nodeConfigTable,
List.of(new Condition("module", Function.EQUALS, new Atom<>("led"))), new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
long numUpdates = 0;
for (OperationResult res : result) {
if (res instanceof UpdateResult) {
numUpdates += ((UpdateResult) res).getCount();
LOG.debug("processBlinkRequest update result {}", res);
ret = "processBlinkRequest update result " + res;
}
}
if (numUpdates == 0) {
// no records existed, insert the row instead
operations.clear();
operations.add(new Insert(nodeConfigTable, new Row(columns)));
fResult = ovsdbClient.transact(ovsdbName, operations);
result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
for (OperationResult res : result) {
if (res instanceof InsertResult) {
LOG.debug("processBlinkRequest insert result {}", res);
ret = "processBlinkRequest insert result " + res;
}
}
}
return ret;
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
return ret;
} catch (OvsdbClientException | InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
}
public void configureDynamicRadiusProxyToAPC(OvsdbClient ovsdbClient, OpensyncAPConfig opensyncAPConfig) {
ApNetworkConfiguration apNetworkConfig = (ApNetworkConfiguration) opensyncAPConfig.getApProfile()
.getDetails();
if (apNetworkConfig.isDynamicRadiusProxyEnabled() == null) {
LOG.info("Cannot configure isDynamicRadiusProxyEnabled to null value. {}", apNetworkConfig);
return;
}
Boolean isApcEnabled = apNetworkConfig.isDynamicRadiusProxyEnabled();
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
Map<String, Value> columns = new HashMap<>();
columns.put("enabled", new Atom<>(isApcEnabled));
List<Operation> operations = new ArrayList<>();
operations.add(new Update(apcConfigDbTable, new Row(columns)));
CompletableFuture<OperationResult[]> fResult = ovsdbClient.transact(ovsdbName, operations);
OperationResult[] result = fResult.get(ovsdbTimeoutSec, TimeUnit.SECONDS);
LOG.debug("configureDynamicRadiusProxyToAPC result {} ", Arrays.toString(result));
}
} catch (InterruptedException | ExecutionException | OvsdbClientException | TimeoutException e) {
LOG.error("Unable to configureDynamicRadiusProxyToAPC on AP.", e);
throw new RuntimeException(e);
}
}
}

View File

@@ -20,7 +20,6 @@ import com.vmware.ovsdb.exception.OvsdbClientException;
import com.vmware.ovsdb.protocol.operation.Delete;
import com.vmware.ovsdb.protocol.operation.Insert;
import com.vmware.ovsdb.protocol.operation.Operation;
import com.vmware.ovsdb.protocol.operation.Update;
import com.vmware.ovsdb.protocol.operation.notation.Atom;
import com.vmware.ovsdb.protocol.operation.notation.Row;
import com.vmware.ovsdb.protocol.operation.notation.Set;
@@ -37,24 +36,6 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
@Autowired
OvsdbGet getProvisionedData;
void configureApc(OvsdbClient ovsdbClient, Boolean enable, List<Operation> operations) {
try {
if (ovsdbClient.getSchema(ovsdbName).get().getTables().containsKey(apcConfigDbTable)) {
Map<String, Value> updateColumns = new HashMap<>();
updateColumns.put("enabled", new Atom<>(enable));
Row row = new Row(updateColumns);
Update update = new Update(apcConfigDbTable, row);
if (!operations.contains(update)) {
// only need to do 1 update of this kind
operations.add(new Update(apcConfigDbTable, row));
}
}
} catch (InterruptedException | ExecutionException | OvsdbClientException e) {
LOG.error("Exception getting schema for ovsdb.", e);
throw new RuntimeException(e);
}
}
void configureRadius(OvsdbClient ovsdbClient, OpensyncAPConfig apConfig) {
List<Operation> operations = new ArrayList<>();
try {
@@ -118,11 +99,14 @@ public class OvsdbRadiusProxyConfig extends OvsdbDaoBase {
updateColumns.put("acct_server", new Atom<>(rsc.getAcctServer().getHostAddress()));
}
if (rsc.getSharedSecret() != null) {
updateColumns.put("acct_secret", new Atom<>(rsc.getSharedSecret()));
updateColumns.put("acct_secret", new Atom<>(rsc.getAcctSharedSecret()));
}
if (rsc.getAcctPort() != null) {
updateColumns.put("acct_port", new Atom<>(rsc.getAcctPort()));
}
if (rsc.getRadiusProxySecret() != null) {
updateColumns.put("proxy_secret", new Atom<>(rsc.getRadiusProxySecret()));
}
if (databaseSchema.getTables().get(radiusConfigDbTable).getColumns().containsKey("auto_discover")) {
if (rsc.getUseRadSec() != null && rsc.getUseRadSec() && rsc.getDynamicDiscovery() != null && rsc.getDynamicDiscovery()) {
// if useRadSec && dynamicDiscovery enabled, do not send server information

View File

@@ -19,6 +19,7 @@ import com.telecominfraproject.wlan.profile.models.common.FileType;
import com.telecominfraproject.wlan.profile.models.common.ManagedFileInfo;
import com.telecominfraproject.wlan.profile.network.models.ApNetworkConfiguration;
import com.telecominfraproject.wlan.profile.network.models.GreTunnelConfiguration;
import com.telecominfraproject.wlan.profile.network.models.RadiusProxyConfiguration;
import com.telecominfraproject.wlan.profile.radius.models.RadiusProfile;
import com.telecominfraproject.wlan.profile.radius.models.RadiusServer;
import com.telecominfraproject.wlan.profile.rf.models.RfConfiguration;
@@ -59,8 +60,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
OvsdbNetworkConfig networkConfig;
@Autowired
OvsdbNode ovsdbNode;
@Autowired
OvsdbRadiusProxyConfig radsecConfig;
protected void getEnabledRadios(OvsdbClient ovsdbClient, List<RadioType> radios) {
try {
@@ -490,6 +489,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
enable80211k = ssidConfig.getRadioBasedConfigs().get(radioType).getEnable80211k();
}
}
boolean useRadiusProxy = false;
if (ssidConfig.getUseRadiusProxy() != null) {
useRadiusProxy = ssidConfig.getUseRadiusProxy();
}
Map<String, String> security = new HashMap<>();
String ssidSecurityMode = ssidConfig.getSecureMode().name();
@@ -500,7 +504,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
String radiusOperName = null;
opensyncSecurityMode = getOpensyncSecurityMode(ssidSecurityMode, opensyncSecurityMode);
populateSecurityMap(opensyncApConfig, ssidConfig, security, ssidSecurityMode, opensyncSecurityMode);
populateSecurityMap(opensyncApConfig, ssidConfig, useRadiusProxy, security, ssidSecurityMode, opensyncSecurityMode);
int dynamicVlan = 0;
if (opensyncSecurityMode.endsWith("EAP")) {
@@ -548,10 +552,16 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
interfacesPerFreqBand.put(freqBand, 1);
}
boolean useRadiusProxy = false;
if (ssidConfig.getUseRadiusProxy() != null) {
useRadiusProxy = ssidConfig.getUseRadiusProxy();
if (useRadiusProxy) {
// AP requires proxy secret in security during auto radius proxy
for (RadiusProxyConfiguration rsc : ((ApNetworkConfiguration) opensyncApConfig.getApProfile().getDetails()).getRadiusProxyConfigurations()) {
if (rsc.getRadiusProxySecret() != null) {
security.put("radius_server_secret", rsc.getRadiusProxySecret());
security.put("radius_acct_secret", rsc.getRadiusProxySecret());
}
}
}
boolean enableProxyArpForHotspot = false;
if (ssidConfig.getEnableProxyArpForHotspot() != null) {
enableProxyArpForHotspot = ssidConfig.getEnableProxyArpForHotspot();
@@ -564,11 +574,6 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
networkConfig.configureInetVifInterface(ovsdbClient, ifName, enabled, ssidConfig.getForwardMode(), operations);
if (useRadiusProxy) {
// make sure it's enabled if we are going to use it
radsecConfig.configureApc(ovsdbClient, useRadiusProxy, operations);
}
} catch (IllegalStateException e) {
// could not provision this SSID, but still can go on
LOG.warn("could not provision SSID {} on {}", ssidConfig.getSsid(), freqBand);
@@ -780,11 +785,11 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
if (radiusProfileList.size() > 0) {
Profile profileRadius = radiusProfileList.get(0);
RadiusProfile profileDetails = ((RadiusProfile) profileRadius.getDetails());
RadiusServer rServer = profileDetails.getPrimaryRadiusAccountingServer();
if (rServer != null) {
security.put("radius_acct_ip", rServer.getIpAddress() != null ? rServer.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port", rServer.getPort() != null ? String.valueOf(rServer.getPort()) : null);
security.put("radius_acct_secret", rServer.getSecret());
RadiusServer radiusAcctServerPrimary = profileDetails.getPrimaryRadiusAccountingServer();
if (radiusAcctServerPrimary != null) {
security.put("radius_acct_ip", radiusAcctServerPrimary.getIpAddress() != null ? radiusAcctServerPrimary.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port", radiusAcctServerPrimary.getPort() != null ? String.valueOf(radiusAcctServerPrimary.getPort()) : null);
security.put("radius_acct_secret", radiusAcctServerPrimary.getSecret());
if (ssidConfig.getRadiusAcountingServiceInterval() != null && ssidConfig.getRadiusAcountingServiceInterval() > 0) {
// if the value is present, use the
@@ -792,11 +797,23 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
security.put("radius_acct_interval", ssidConfig.getRadiusAcountingServiceInterval().toString());
}
LOG.info("set Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
LOG.info("Set Primary Radius Accounting server attributes radius_acct_ip {} radius_acct_port {} radius_acct_secret {} radius_acct_interval {}",
security.get("radius_acct_ip"), security.get("radius_acct_port"), security.get("radius_acct_secret"),
security.get("radius_acct_interval"));
} else {
LOG.info("No Radius Accounting Server defined in Radius Profile");
LOG.info("No Primary Radius Accounting Server defined in Radius Profile");
}
RadiusServer radiusAcctServerSecondary = profileDetails.getSecondaryRadiusAccountingServer();
if (radiusAcctServerSecondary != null) {
security.put("radius_acct_ip_secondary", radiusAcctServerSecondary.getIpAddress() != null ? radiusAcctServerSecondary.getIpAddress().getHostAddress() : null);
security.put("radius_acct_port_secondary", radiusAcctServerSecondary.getPort() != null ? String.valueOf(radiusAcctServerSecondary.getPort()) : null);
security.put("radius_acct_secret_secondary", radiusAcctServerSecondary.getSecret());
LOG.info("Set Secondary Radius Accounting server attributes radius_acct_ip_secondary {} radius_acct_port_secondary {} radius_acct_secret_secondary {}",
security.get("radius_acct_ip_secondary"), security.get("radius_acct_port_secondary"), security.get("radius_acct_secret_secondary"));
} else {
LOG.info("No Secondary Radius Accounting Server defined in Radius Profile");
}
} else {
@@ -821,8 +838,19 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
security.put("radius_server_ip", radiusServer.getIpAddress() != null ? radiusServer.getIpAddress().getHostAddress() : null);
security.put("radius_server_port", radiusServer.getPort() != null ? String.valueOf(radiusServer.getPort()) : null);
security.put("radius_server_secret", radiusServer.getSecret());
LOG.info("set Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}", security.get("radius_server_ip"),
LOG.info("Set Primary Radius server attributes radius_server_ip {} radius_server_port {} radius_server_secret {}", security.get("radius_server_ip"),
security.get("radius_server_port"), security.get("radius_server_secret"));
RadiusServer radiusServerSecondary = profileDetails.getSecondaryRadiusAuthServer();
if (radiusServerSecondary != null) {
security.put("radius_server_ip_secondary", radiusServerSecondary.getIpAddress() != null ? radiusServerSecondary.getIpAddress().getHostAddress() : null);
security.put("radius_server_port_secondary", radiusServerSecondary.getPort() != null ? String.valueOf(radiusServerSecondary.getPort()) : null);
security.put("radius_server_secret_secondary", radiusServerSecondary.getSecret());
LOG.info("Set Secondary Radius server attributes radius_server_ip_secondary {} radius_server_port_secondary {} radius_server_secret_secondary {}",
security.get("radius_server_ip_secondary"), security.get("radius_server_port_secondary"), security.get("radius_server_secret_secondary"));
} else {
LOG.info("No Secondary Radius Authentication Server defined in Radius Profile");
}
} else {
LOG.warn("Could not find radius profile {} in {}", ssidConfig.getRadiusServiceId(), opensyncApConfig.getRadiusProfiles());
}
@@ -838,7 +866,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
* @param ssidSecurityMode
* @param opensyncSecurityMode
*/
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Map<String, String> security, String ssidSecurityMode,
void populateSecurityMap(OpensyncAPConfig opensyncApConfig, SsidConfiguration ssidConfig, Boolean useRadiusProxy, Map<String, String> security, String ssidSecurityMode,
String opensyncSecurityMode) {
security.put("encryption", opensyncSecurityMode);
// key and mode is N/A for OPEN security
@@ -865,21 +893,21 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa2OnlyEAP":
case "wpa2OnlyRadius":
security.put("mode", "2");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP":
security.put("mode", "3");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
break;
case "wpa3OnlyEAP192":
security.put("mode", "3");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
@@ -888,7 +916,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpa2Radius":
case "wpa3MixedEAP":
security.put("mode", "mixed");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}
@@ -896,7 +924,7 @@ public class OvsdbSsidConfig extends OvsdbDaoBase {
case "wpaEAP":
case "wpaRadius":
security.put("mode", "1");
if (!ssidConfig.getUseRadiusProxy()) {
if (!useRadiusProxy) {
getRadiusConfiguration(opensyncApConfig, ssidConfig, security);
getRadiusAccountingConfiguration(opensyncApConfig, ssidConfig, security);
}