Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added some logging and refactor #36

Merged
merged 1 commit into from
Jun 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/main/java/com/wireguard/external/network/IpResolver.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public void takeSubnet(Subnet subnet){
availableRanges.addAll(currRangeIndex, insertSubnetIntoIpRange(subnet, availableRange));
availableIpsCount -= subnet.getIpCount();
} else {
throw new NoFreeIpException("Subnet " + subnet + " is is already taken");
throw new NoFreeIpException("Subnet " + subnet + " is is already used");
}
}

Expand Down Expand Up @@ -126,7 +126,7 @@ public void freeSubnet(Subnet subnet){
}
availableIpsCount += subnet.getIpCount();
} else {
throw new UncheckedIOException(new IOException("This subnet is not taken"));
throw new UncheckedIOException(new IOException("This subnet is not used"));
}
}

Expand Down Expand Up @@ -164,7 +164,7 @@ private List<IpRange> insertSubnetIntoIpRange(Subnet subnet, IpRange ipRange){
}
}

public long getTakenIpsCount(){
public long getUsedIpsCount(){
return totalIpsCount - availableIpsCount;
}

Expand Down
16 changes: 14 additions & 2 deletions src/main/java/com/wireguard/external/wireguard/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,24 +28,36 @@ public Config(WgTool wgTool) {

@Bean
public IpResolver ipResolver(NetworkInterfaceDTO wgInterface) {

logger.info("Configuring IpResolver...");
Subnet interfaceSubnet = wgInterface.getCidrV4Address().stream().findFirst().orElseThrow(
() -> new RuntimeException("Interface " + wgInterface.getName() + " has no IPv4 address")
);
logger.info("Using interface: %s, address: %s, mask: %d".formatted(
wgInterface.getName(),
interfaceSubnet.toString(),
interfaceSubnet.getNumericMask()
));
IpResolver ipResolver = new IpResolver(interfaceSubnet);

if (interfaceSubnet.getNumericMask()<=30) {
ipResolver.takeIp(interfaceSubnet.getFirstIpString());
ipResolver.takeIp(interfaceSubnet.getLastIpString());
wgInterface.getIpv4Addresses().forEach(iNet4Address -> ipResolver.takeIp(iNet4Address.getHostAddress()));
}
consumeBusyIps(ipResolver::takeIp, wgInterface.getName());
consumeUsedIps(ipResolver::takeIp, wgInterface.getName());

logger.info("IpResolver configured, available IPs: %d, used IPs: %d, Total: %d".formatted(
ipResolver.getAvailableIpsCount(),
ipResolver.getUsedIpsCount(),
ipResolver.getTotalIpsCount()-2
));
return ipResolver;
}



private void consumeBusyIps(Consumer<String> consumer, String interfaceName) {
private void consumeUsedIps(Consumer<String> consumer, String interfaceName) {
wgTool.showDump(interfaceName).peers().forEach(
peer -> peer.getAllowedIps().getIPv4IPs().forEach(consumer)
);
Expand Down
17 changes: 13 additions & 4 deletions src/main/java/com/wireguard/external/wireguard/WgManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public WgInterfaceDTO getInterface() {


private WgShowDump getDump() {
logger.debug("Dump requested for interface %s".formatted(wgInterface.getName()));
return wgTool.showDump(wgInterface.getName());
}

Expand All @@ -69,21 +70,29 @@ public Set<WgPeerDTO> getPeers(){
}

public CreatedPeer createPeer(){
String privateKey = wgTool.generatePrivateKey().strip();
String publicKey = wgTool.generatePublicKey(privateKey.strip()).strip();
String presharedKey = wgTool.generatePresharedKey().strip();
String privateKey = wgTool.generatePrivateKey();
String publicKey = wgTool.generatePublicKey(privateKey);
String presharedKey = wgTool.generatePresharedKey();
Subnet address = wgIpResolver.takeFreeSubnet(defaultMaskForNewClients);
CreatedPeer createdPeer = new CreatedPeer(
publicKey,
presharedKey,
privateKey,
Set.of(address.toString()),
0);
wgTool.addPeer(wgInterface.getName(), createdPeer);
try {
wgTool.addPeer(wgInterface.getName(), createdPeer);
logger.info("Created peer, public key: %s".formatted(publicKey.substring(0, 6)));
} catch (Exception e){
wgIpResolver.freeSubnet(address);
throw e;
}
return createdPeer;
}

public void deletePeer(String publicKey) {

wgTool.deletePeer(wgInterface.getName(), publicKey);
logger.info("Deleted peer, public key: %s".formatted(publicKey));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void setUp() {
void testTake() {
ipResolver.takeSubnet(Subnet.valueOf("0.0.128.1/32"));
assertEquals(65535L, ipResolver.getAvailableIpsCount(), ".getAvailableIpCount()");
assertEquals(1L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(1L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
assertEquals(32768L, ipResolver.getAvailableRanges().get(0).getBiggest(), ".get(0).getBiggest()");
assertEquals(0L, ipResolver.getAvailableRanges().get(0).getLeast(), ".get(0).getSmallest()");
}
Expand All @@ -48,7 +48,7 @@ void testCountWhenNoFreeIp() {
IpResolver ipResolver = new IpResolver(Subnet.valueOf("0.0.0.0/32"));
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.0/32"));
assertEquals(0L, ipResolver.getAvailableIpsCount(), ".getAvailableIpCount()");
assertEquals(1L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(1L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
}

@Test
Expand All @@ -62,7 +62,7 @@ void testTakeWhenNoFreeIp() {
@Test
void testTakeWith17Mask(){
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.0/17"));
assertEquals(32768L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(32768L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
assertEquals(32768L, ipResolver.getAvailableRanges().get(0).getLeast());
}

Expand Down Expand Up @@ -100,7 +100,7 @@ void testFreeWhenNoIpLeftAndOutOfRange(){
@Test
void testTakeFreeSubnet(){
Subnet subnet = ipResolver.takeFreeSubnet(32);
assertEquals(1L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(1L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
assertEquals(Subnet.valueOf("0.0.0.0/32"), subnet);
}

Expand All @@ -109,7 +109,7 @@ void testTakeFreeWhenFirstAndThirdAlreadyTaken() {
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.0/32"));
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.2/32"));
Subnet subnet = ipResolver.takeFreeSubnet(32);
assertEquals(3L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(3L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
assertEquals(Subnet.valueOf("0.0.0.1/32"), subnet);
}

Expand All @@ -118,7 +118,7 @@ void testTakeFreeWhenMaskIs31AndFirstAndThirdAlreadyTaken() {
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.0/32"));
ipResolver.takeSubnet(Subnet.valueOf("0.0.0.2/32"));
Subnet subnet = ipResolver.takeFreeSubnet(31);
assertEquals(4L, ipResolver.getTakenIpsCount(), ".getTakenIpCount()");
assertEquals(4L, ipResolver.getUsedIpsCount(), ".getTakenIpCount()");
assertEquals(Subnet.valueOf("0.0.0.4/31"), subnet);
}

Expand Down