Skip to content

Commit

Permalink
fix(networkadvertisement): Attempt to watch for network state changes…
Browse files Browse the repository at this point in the history
… to fix advertisement after initial provisioning
  • Loading branch information
Hypfer committed Dec 19, 2021
1 parent 322efcc commit 7a2c3d1
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
30 changes: 30 additions & 0 deletions backend/lib/NetworkAdvertisementManager.js
Expand Up @@ -4,6 +4,8 @@ const Tools = require("./Tools");
const Bonjour = require("bonjour-service");
const nodessdp = require("node-ssdp");

const NETWORK_STATE_CHECK_INTERVAL = 30 * 1000;

class NetworkAdvertisementManager {
/**
* This class handles advertisement via both SSDP (UPnP) as well as zeroconf/mdns/bonjour
Expand All @@ -18,6 +20,9 @@ class NetworkAdvertisementManager {

this.webserverPort = this.config.get("webserver")?.port ?? 80;

this.networkStateCheckTimeout = undefined;
this.ipAddresses = "";

this.setUp();
}

Expand All @@ -30,6 +35,11 @@ class NetworkAdvertisementManager {
if (networkAdvertisementConfig.enabled === true && this.config.get("embedded") === true) {
this.setUpSSDP();
this.setUpBonjour();

this.ipAddresses = Tools.GET_CURRENT_HOST_IP_ADDRESSES().sort().join();
this.networkStateCheckTimeout = setTimeout(() => {
this.checkNetworkStateAndReschedule();
}, NETWORK_STATE_CHECK_INTERVAL);
}
}

Expand Down Expand Up @@ -116,6 +126,7 @@ class NetworkAdvertisementManager {
shutdown() {
return new Promise((resolve, reject) => {
Logger.debug("NetworkAdvertisementManager shutdown in progress...");
clearTimeout(this.networkStateCheckTimeout);

if (this.ssdpServer) {
try {
Expand Down Expand Up @@ -158,6 +169,25 @@ class NetworkAdvertisementManager {
throw err;
}
}

/**
* @private
*/
checkNetworkStateAndReschedule() {
const ipAddresses = Tools.GET_CURRENT_HOST_IP_ADDRESSES().sort().join();

if (this.ipAddresses !== ipAddresses) {
Logger.info("Network state changed");

this.restart().catch((err) => {
Logger.warn("Error while restarting NetworkAdvertisementManager due to network state change", err);
});
} else {
this.networkStateCheckTimeout = setTimeout(() => {
this.checkNetworkStateAndReschedule();
}, NETWORK_STATE_CHECK_INTERVAL);
}
}
}

module.exports = NetworkAdvertisementManager;
16 changes: 16 additions & 0 deletions backend/lib/Tools.js
Expand Up @@ -228,6 +228,22 @@ class Tools {
static CAPITALIZE(string) {
return `${string[0].toUpperCase()}${string.slice(1)}`;
}

static GET_CURRENT_HOST_IP_ADDRESSES() {
const IPs = new Set();

Object.values(os.networkInterfaces())
.flat()
.filter(i => {
return !i.mac.startsWith("00:00");
})
.forEach(i => {
IPs.add(i.address);
}
);

return Array.from(IPs.values());
}
}

const VALETUDO_NAMESPACE = "be5f1ffc-c150-4785-9ebb-08fcfe90c933";
Expand Down

0 comments on commit 7a2c3d1

Please sign in to comment.