mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-11 18:29:05 +01:00
Merge branch 'check-network-status-periodically' into 'master'
Check network status periodically See merge request briar/briar!1797
This commit is contained in:
@@ -2,6 +2,7 @@ package org.briarproject.bramble.api.network;
|
|||||||
|
|
||||||
import org.briarproject.nullsafety.NotNullByDefault;
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import javax.annotation.concurrent.Immutable;
|
import javax.annotation.concurrent.Immutable;
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
@@ -27,4 +28,20 @@ public class NetworkStatus {
|
|||||||
public boolean isIpv6Only() {
|
public boolean isIpv6Only() {
|
||||||
return ipv6Only;
|
return ipv6Only;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return (connected ? 1 : 0) | (wifi ? 2 : 0) | (ipv6Only ? 4 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(@Nullable Object o) {
|
||||||
|
if (o instanceof NetworkStatus) {
|
||||||
|
NetworkStatus s = (NetworkStatus) o;
|
||||||
|
return connected == s.connected
|
||||||
|
&& wifi == s.wifi
|
||||||
|
&& ipv6Only == s.ipv6Only;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package org.briarproject.bramble;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.network.JavaNetworkModule;
|
||||||
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
|
@NotNullByDefault
|
||||||
|
public interface BrambleJavaEagerSingletons {
|
||||||
|
|
||||||
|
void inject(JavaNetworkModule.EagerSingletons init);
|
||||||
|
|
||||||
|
class Helper {
|
||||||
|
|
||||||
|
public static void injectEagerSingletons(BrambleJavaEagerSingletons c) {
|
||||||
|
c.inject(new JavaNetworkModule.EagerSingletons());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +1,51 @@
|
|||||||
package org.briarproject.bramble.network;
|
package org.briarproject.bramble.network;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.event.EventBus;
|
||||||
|
import org.briarproject.bramble.api.lifecycle.IoExecutor;
|
||||||
|
import org.briarproject.bramble.api.lifecycle.Service;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
import org.briarproject.bramble.api.network.NetworkStatus;
|
import org.briarproject.bramble.api.network.NetworkStatus;
|
||||||
import org.briarproject.nullsafety.MethodsNotNullByDefault;
|
import org.briarproject.bramble.api.network.event.NetworkStatusEvent;
|
||||||
import org.briarproject.nullsafety.ParametersNotNullByDefault;
|
import org.briarproject.bramble.api.system.TaskScheduler;
|
||||||
|
import org.briarproject.nullsafety.NotNullByDefault;
|
||||||
|
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.NetworkInterface;
|
import java.net.NetworkInterface;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import static java.util.Collections.list;
|
import static java.util.Collections.list;
|
||||||
|
import static java.util.concurrent.TimeUnit.SECONDS;
|
||||||
|
import static java.util.logging.Level.INFO;
|
||||||
import static java.util.logging.Level.WARNING;
|
import static java.util.logging.Level.WARNING;
|
||||||
import static java.util.logging.Logger.getLogger;
|
import static java.util.logging.Logger.getLogger;
|
||||||
import static org.briarproject.bramble.util.LogUtils.logException;
|
import static org.briarproject.bramble.util.LogUtils.logException;
|
||||||
import static org.briarproject.bramble.util.NetworkUtils.getNetworkInterfaces;
|
import static org.briarproject.bramble.util.NetworkUtils.getNetworkInterfaces;
|
||||||
|
|
||||||
@MethodsNotNullByDefault
|
@NotNullByDefault
|
||||||
@ParametersNotNullByDefault
|
class JavaNetworkManager implements NetworkManager, Service {
|
||||||
class JavaNetworkManager implements NetworkManager {
|
|
||||||
|
|
||||||
private static final Logger LOG =
|
private static final Logger LOG =
|
||||||
getLogger(JavaNetworkManager.class.getName());
|
getLogger(JavaNetworkManager.class.getName());
|
||||||
|
|
||||||
|
private final TaskScheduler scheduler;
|
||||||
|
private final Executor ioExecutor;
|
||||||
|
private final EventBus eventBus;
|
||||||
|
private final AtomicReference<NetworkStatus> lastStatus =
|
||||||
|
new AtomicReference<>();
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
JavaNetworkManager() {
|
JavaNetworkManager(TaskScheduler scheduler,
|
||||||
|
@IoExecutor Executor ioExecutor,
|
||||||
|
EventBus eventBus) {
|
||||||
|
this.scheduler = scheduler;
|
||||||
|
this.ioExecutor = ioExecutor;
|
||||||
|
this.eventBus = eventBus;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -48,7 +66,29 @@ class JavaNetworkManager implements NetworkManager {
|
|||||||
} catch (SocketException e) {
|
} catch (SocketException e) {
|
||||||
logException(LOG, WARNING, e);
|
logException(LOG, WARNING, e);
|
||||||
}
|
}
|
||||||
|
if (LOG.isLoggable(INFO)) {
|
||||||
|
LOG.info("Connected: " + connected
|
||||||
|
+ ", has IPv4 address: " + hasIpv4
|
||||||
|
+ ", has IPv6 unicast address: " + hasIpv6Unicast);
|
||||||
|
}
|
||||||
return new NetworkStatus(connected, false, !hasIpv4 && hasIpv6Unicast);
|
return new NetworkStatus(connected, false, !hasIpv4 && hasIpv6Unicast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void broadcastNetworkStatusIfChanged() {
|
||||||
|
NetworkStatus status = getNetworkStatus();
|
||||||
|
NetworkStatus old = lastStatus.getAndSet(status);
|
||||||
|
if (!status.equals(old)) {
|
||||||
|
eventBus.broadcast(new NetworkStatusEvent(status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startService() {
|
||||||
|
scheduler.scheduleWithFixedDelay(this::broadcastNetworkStatusIfChanged,
|
||||||
|
ioExecutor, 0, 10, SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stopService() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package org.briarproject.bramble.network;
|
package org.briarproject.bramble.network;
|
||||||
|
|
||||||
|
import org.briarproject.bramble.api.lifecycle.LifecycleManager;
|
||||||
import org.briarproject.bramble.api.network.NetworkManager;
|
import org.briarproject.bramble.api.network.NetworkManager;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
@@ -10,9 +12,16 @@ import dagger.Provides;
|
|||||||
@Module
|
@Module
|
||||||
public class JavaNetworkModule {
|
public class JavaNetworkModule {
|
||||||
|
|
||||||
|
public static class EagerSingletons {
|
||||||
|
@Inject
|
||||||
|
NetworkManager networkManager;
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
NetworkManager provideNetworkManager(JavaNetworkManager networkManager) {
|
NetworkManager provideNetworkManager(LifecycleManager lifecycleManager,
|
||||||
|
JavaNetworkManager networkManager) {
|
||||||
|
lifecycleManager.registerService(networkManager);
|
||||||
return networkManager;
|
return networkManager;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.briarproject.briar.headless
|
|||||||
import dagger.Component
|
import dagger.Component
|
||||||
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
||||||
import org.briarproject.bramble.BrambleCoreModule
|
import org.briarproject.bramble.BrambleCoreModule
|
||||||
|
import org.briarproject.bramble.BrambleJavaEagerSingletons
|
||||||
import org.briarproject.bramble.BrambleJavaModule
|
import org.briarproject.bramble.BrambleJavaModule
|
||||||
import org.briarproject.briar.BriarCoreEagerSingletons
|
import org.briarproject.briar.BriarCoreEagerSingletons
|
||||||
import org.briarproject.briar.BriarCoreModule
|
import org.briarproject.briar.BriarCoreModule
|
||||||
@@ -19,7 +20,7 @@ import javax.inject.Singleton
|
|||||||
)
|
)
|
||||||
@Singleton
|
@Singleton
|
||||||
internal interface BriarHeadlessApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons,
|
internal interface BriarHeadlessApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons,
|
||||||
HeadlessEagerSingletons {
|
BrambleJavaEagerSingletons, HeadlessEagerSingletons {
|
||||||
|
|
||||||
fun getRouter(): Router
|
fun getRouter(): Router
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.github.ajalt.clikt.parameters.options.option
|
|||||||
import com.github.ajalt.clikt.parameters.types.int
|
import com.github.ajalt.clikt.parameters.types.int
|
||||||
import org.bouncycastle.util.encoders.Base64.toBase64String
|
import org.bouncycastle.util.encoders.Base64.toBase64String
|
||||||
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
||||||
|
import org.briarproject.bramble.BrambleJavaEagerSingletons
|
||||||
import org.briarproject.bramble.util.OsUtils.isLinux
|
import org.briarproject.bramble.util.OsUtils.isLinux
|
||||||
import org.briarproject.bramble.util.OsUtils.isMac
|
import org.briarproject.bramble.util.OsUtils.isMac
|
||||||
import org.briarproject.briar.BriarCoreEagerSingletons
|
import org.briarproject.briar.BriarCoreEagerSingletons
|
||||||
@@ -77,6 +78,7 @@ private class Main : CliktCommand(
|
|||||||
// We need to load the eager singletons directly after making the
|
// We need to load the eager singletons directly after making the
|
||||||
// dependency graphs
|
// dependency graphs
|
||||||
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
|
BrambleJavaEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
HeadlessEagerSingletons.Helper.injectEagerSingletons(app)
|
HeadlessEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package org.briarproject.briar.headless
|
|||||||
import dagger.Component
|
import dagger.Component
|
||||||
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
||||||
import org.briarproject.bramble.BrambleCoreModule
|
import org.briarproject.bramble.BrambleCoreModule
|
||||||
|
import org.briarproject.bramble.BrambleJavaEagerSingletons
|
||||||
import org.briarproject.bramble.BrambleJavaModule
|
import org.briarproject.bramble.BrambleJavaModule
|
||||||
import org.briarproject.bramble.api.crypto.CryptoComponent
|
import org.briarproject.bramble.api.crypto.CryptoComponent
|
||||||
import org.briarproject.briar.BriarCoreEagerSingletons
|
import org.briarproject.briar.BriarCoreEagerSingletons
|
||||||
@@ -20,7 +21,7 @@ import javax.inject.Singleton
|
|||||||
)
|
)
|
||||||
@Singleton
|
@Singleton
|
||||||
internal interface BriarHeadlessTestApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons,
|
internal interface BriarHeadlessTestApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons,
|
||||||
HeadlessEagerSingletons {
|
BrambleJavaEagerSingletons, HeadlessEagerSingletons {
|
||||||
|
|
||||||
fun getRouter(): Router
|
fun getRouter(): Router
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import okhttp3.Request
|
|||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
import okhttp3.RequestBody.Companion.toRequestBody
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
import org.briarproject.bramble.BrambleCoreEagerSingletons
|
||||||
|
import org.briarproject.bramble.BrambleJavaEagerSingletons
|
||||||
import org.briarproject.bramble.api.crypto.CryptoComponent
|
import org.briarproject.bramble.api.crypto.CryptoComponent
|
||||||
import org.briarproject.briar.BriarCoreEagerSingletons
|
import org.briarproject.briar.BriarCoreEagerSingletons
|
||||||
import org.briarproject.briar.api.test.TestDataCreator
|
import org.briarproject.briar.api.test.TestDataCreator
|
||||||
@@ -38,6 +39,7 @@ abstract class IntegrationTest {
|
|||||||
.headlessTestModule(HeadlessTestModule(dataDir))
|
.headlessTestModule(HeadlessTestModule(dataDir))
|
||||||
.build()
|
.build()
|
||||||
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
BrambleCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
|
BrambleJavaEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
BriarCoreEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
HeadlessEagerSingletons.Helper.injectEagerSingletons(app)
|
HeadlessEagerSingletons.Helper.injectEagerSingletons(app)
|
||||||
router = app.getRouter()
|
router = app.getRouter()
|
||||||
|
|||||||
Reference in New Issue
Block a user