diff --git a/emhttp/plugins/dynamix.docker.manager/nchan/docker_load b/emhttp/plugins/dynamix.docker.manager/nchan/docker_load
index 6cc8be993..e9ebe1984 100755
--- a/emhttp/plugins/dynamix.docker.manager/nchan/docker_load
+++ b/emhttp/plugins/dynamix.docker.manager/nchan/docker_load
@@ -20,7 +20,7 @@ require_once "$docroot/webGui/include/publish.php";
while (true) {
$output = shell_exec("docker stats --no-stream --format='{{.ID}};{{.CPUPerc}};{{.MemUsage}}' 2>&1");
- publish("dockerload", $output,true);
+ publish_md5("dockerload", $output,true);
if ( $output === null ) {
// slow down publishing if no containers are running
sleep(10);
diff --git a/emhttp/plugins/dynamix.vm.manager/nchan/vm_usage b/emhttp/plugins/dynamix.vm.manager/nchan/vm_usage
index 751a0445a..6af185358 100755
--- a/emhttp/plugins/dynamix.vm.manager/nchan/vm_usage
+++ b/emhttp/plugins/dynamix.vm.manager/nchan/vm_usage
@@ -88,10 +88,7 @@ while (true) {
if ($running < 1) $echo = "
| "._('No VMs running')." |
";
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('vm_usage',$echo,true)!==false ? $md5_new : -1;
- }
+ publish_md5('vm_usage',$echo,true);
sleep($timer);
}
diff --git a/emhttp/plugins/dynamix/include/publish.php b/emhttp/plugins/dynamix/include/publish.php
index 390b784c4..a8dfd52f1 100644
--- a/emhttp/plugins/dynamix/include/publish.php
+++ b/emhttp/plugins/dynamix/include/publish.php
@@ -34,7 +34,7 @@ function curl_socket($socket, $url, $message='') {
// $opt3: if $opt1 is not numeric, it's a value for $abortTime.
function publish($endpoint, $message, $opt1=1, $opt2=false, $opt3=120) {
static $abortStart = [], $com = [], $lens = [];
-
+
if ( is_file("/tmp/publishPaused") )
return false;
@@ -107,6 +107,36 @@ function publish($endpoint, $message, $opt1=1, $opt2=false, $opt3=120) {
return $reply;
}
+// Function to not continually republish the same message if it hasn't changed since the last publish
+function publish_md5($endpoint, $message, $opt1=1, $opt2=false, $opt3=120) {
+ static $md5_old = [];
+ static $md5_time = [];
+
+ if ( is_numeric($opt1) ) {
+ $timeout = $opt3;
+ $abort = $opt2;
+ } else {
+ $abort = $opt1;
+ $timeout = $opt2 ?: $opt3;
+ }
+
+ // if abort is set, republish the message even if it hasn't changed after $timeout seconds to check for subscribers and exit accordingly
+ if ( $abort ) {
+ if ( (time() - ($md5_time[$endpoint]??0)) > $timeout ) {
+ $md5_old[$endpoint] = null;
+ }
+ }
+
+ $md5_new = $message ? md5($message,true) : -1 ;
+ if ($md5_new !== ($md5_old[$endpoint]??null)) {
+ $md5_old[$endpoint] = $md5_new;
+ $md5_time[$endpoint] = time();
+
+ return publish($endpoint, $message, $opt1, $opt2, $opt3);
+ }
+}
+
+
// Removes the script calling this function from nchan.pid
function removeNChanScript() {
global $docroot, $argv;
diff --git a/emhttp/plugins/dynamix/nchan/update_1 b/emhttp/plugins/dynamix/nchan/update_1
index 143846994..f43f425b5 100755
--- a/emhttp/plugins/dynamix/nchan/update_1
+++ b/emhttp/plugins/dynamix/nchan/update_1
@@ -123,10 +123,8 @@ while (true) {
$count = array_count_values($lsof ?? array());
foreach ($share as $name) $echo['stream'][] = $count[$name]??0;
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('update1',$echo,true)!==false ? $md5_new : -1;
- }
+ publish_md5('update1',$echo,true);
+
sleep(5);
}
?>
diff --git a/emhttp/plugins/dynamix/nchan/update_2 b/emhttp/plugins/dynamix/nchan/update_2
index bf68b72c2..9706262d1 100755
--- a/emhttp/plugins/dynamix/nchan/update_2
+++ b/emhttp/plugins/dynamix/nchan/update_2
@@ -500,10 +500,7 @@ while (true) {
}
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('update2',$echo,true)!==false ? $md5_new : -1;
- }
+ publish_md5('update2',$echo,true);
sleep(2);
}
?>
diff --git a/emhttp/plugins/dynamix/nchan/update_3 b/emhttp/plugins/dynamix/nchan/update_3
index 5d670cf75..d81b9bd34 100755
--- a/emhttp/plugins/dynamix/nchan/update_3
+++ b/emhttp/plugins/dynamix/nchan/update_3
@@ -160,11 +160,8 @@ while (true) {
$echo['time'] = [$clock,_($date,0)];
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('update3',$echo,true)!==false ? $md5_new : -1;
- $time0 = $time1;
- }
+ publish_md5('update3',$echo,true);
+
sleep(1);
$time1 = microtime(true);
}
diff --git a/emhttp/plugins/dynamix/nchan/ups_status b/emhttp/plugins/dynamix/nchan/ups_status
index ca25805e0..b201d424c 100755
--- a/emhttp/plugins/dynamix/nchan/ups_status
+++ b/emhttp/plugins/dynamix/nchan/ups_status
@@ -132,10 +132,9 @@ while (true) {
$echo[6] = isset($output) ? ((empty($volt) || ($minv<$output && $output<$maxv) ? "" : "").$echo[6].(isset($freq) ? " ~ $freq Hz" : "")."") : $echo[6];
}
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('apcups',$echo,true)!==false ? $md5_new : -1;
- }
+
+ publish_md5('apcups',$echo,true);
+
sleep(3);
}
?>
diff --git a/emhttp/plugins/dynamix/nchan/wg_poller b/emhttp/plugins/dynamix/nchan/wg_poller
index 875519448..786e8f00a 100755
--- a/emhttp/plugins/dynamix/nchan/wg_poller
+++ b/emhttp/plugins/dynamix/nchan/wg_poller
@@ -38,10 +38,7 @@ while (true) {
if (count($row)>5) $echo[] = [$row[0], $row[5]?$now-$row[5]:0, my_scale($row[6],$unit)." $unit", my_scale($row[7],$unit)." $unit"];
}
$echo = json_encode($echo);
- $md5_new = md5($echo,true);
- if ($md5_new !== $md5_old) {
- $md5_old = publish('wireguard',$echo,true)!==false ? $md5_new : -1;
- }
+ publish_md5('wireguard',$echo,true);
sleep(1);
}
?>
diff --git a/emhttp/plugins/dynamix/nchan/wlan0 b/emhttp/plugins/dynamix/nchan/wlan0
index 34e2b5c6e..dba908aa1 100755
--- a/emhttp/plugins/dynamix/nchan/wlan0
+++ b/emhttp/plugins/dynamix/nchan/wlan0
@@ -66,7 +66,7 @@ while (true) {
}
}
// Short of closing all web pages, the timeout should only happen if wifi is enabled and then disabled
- publish('wlan0',json_encode($echo),1,true);
+ publish_md5('wlan0',json_encode($echo),true);
sleep(3);
}
?>