Skip to content

Commit

Permalink
Möglichkeit mehrere MQTT-Brücken einzurichten (snaptec#1177)
Browse files Browse the repository at this point in the history
* Update savemqtt.php

* Update mqtt.php
  • Loading branch information
jscmidt authored Mar 18, 2021
1 parent 9590c1b commit 35cfa43
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 25 deletions.
16 changes: 8 additions & 8 deletions web/settings/mqtt.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,14 +48,13 @@
?>
<div id="nav"></div> <!-- placeholder for navbar -->
<div role="main" class="container" style="margin-top:20px">
<h1>MQTT-Brücke</h1>
<?php
$files = glob('/etc/mosquitto/conf.d/99-bridge-*.conf*');
if (count($files) == 0) {
array_push($files, "");
}
$filesCount = count($files);
// give the user the option to configure more than one bridge
array_push($files, "");

$firstLoopDone = false;
$loopCount = 0;
foreach($files as $currentFile)
{
$currentBridge = preg_replace('/^99-bridge-(.+)\.conf/', '${1}', $currentFile);
Expand Down Expand Up @@ -129,8 +128,9 @@
}
}

if ($firstLoopDone) echo "<hr>";
if ($loopCount != 0) echo "<hr>";
?>
<h1> <?php if($loopCount != $filesCount) echo "MQTT-Brücke \"$connectionName\""; else echo "Neue MQTT-Brücke"; ?></h1>
<form action="./tools/savemqtt.php" method="POST">
<!-- previous bridge name, needed for renaming a bridge -->
<input type="hidden" readonly="readonly" name="bridge" value="<?php echo($connectionName); ?>">
Expand Down Expand Up @@ -168,7 +168,7 @@
<div class="col">
<input class="form-control" type="text" size="35" name="ConnectionName" id="ConnectionName" pattern="^[a-zA-Z0-9]+$" value="<?php echo $connectionName; ?>">
<span class="form-text small">Der Name darf nur aus Buchstaben und Zahlen bestehen, keine Sonderzeichen oder Umlaute.</span>
<?php if($debugold >= 1) echo "<small>in Datei '$currentFile'</small>"; ?>
<?php if($debugold >= 1) echo "<small>Config-File befindet sich in Datei '$currentFile'</small>"; ?>
</div>
</div>
<div class="form-row mb-1">
Expand Down Expand Up @@ -325,7 +325,7 @@

</form>
<?php
$firstLoopDone = true;
$loopCount++;
}
?>

Expand Down
43 changes: 26 additions & 17 deletions web/tools/savemqtt.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,16 @@ function debugPrint($message){
}
}

function cleanAndExit($message){
// delete bridges-to-delete file, so that a bridge can't be deleted accidentally
$fileToClean = "/var/www/html/openWB/ramdisk/99-bridgesToDelete";
if(is_writable($fileToClean)){
debugPrint("deleting $fileToClean");
unlink($fileToClean);
}
exit($message);
}

if( $debug ){ ?>
<h3>Request parameters:</h3>
<pre>
Expand All @@ -36,20 +46,19 @@ function debugPrint($message){
// validate bridge name and check if it had already been configured and
// if it has already been configured, whether it has been enabled or disabled
//
parse_str($_SERVER['QUERY_STRING'], $queryArray);
$previousBridgeName = $queryArray['bridge'];
$previousBridgeName = $_POST['bridge'];

debugPrint("Previous bridge name: '$previousBridgeName'");

$bridgeToConfig = $_POST['ConnectionName'];

if ($bridgeToConfig == "eindeutiger-verbindungs-bezeichner")
{
exit("Bitte eine eindeutige Bezeichnung f&uuml;r die Verbindung vergeben.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Bitte eine eindeutige Bezeichnung f&uuml;r die Verbindung vergeben.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

if(!preg_match('/^[a-zA-Z0-9]+$/', $bridgeToConfig)) {
exit("Der Bezeichener f&uuml;r die Bridge ('" . htmlentities($bridgeToConfig) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9 sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Der Bezeichener f&uuml;r die Bridge ('" . htmlentities($bridgeToConfig) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9 sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

debugPrint("Bridge to configure: '$bridgeToConfig'");
Expand All @@ -67,7 +76,7 @@ function debugPrint($message){
foreach($files as $currentFile) {
if (strpos($currentFile, $previousBridgeName) !== false) {
//// print "Renaming bridge: Adding '$currentFile' to delete list<br/>";
file_put_contents("/var/www/html/openWB/ramdisk/99-bridgesToDelete", $currentFile, FILE_APPEND);
file_put_contents("/var/www/html/openWB/ramdisk/99-bridgesToDelete", "$currentFile\n", FILE_APPEND);
}
}
}
Expand All @@ -88,7 +97,7 @@ function debugPrint($message){
foreach($files as $currentFile) {
if (strpos($currentFile, $bridgeFileName) !== false) {
debugPrint("Deleting: $currentFile");
file_put_contents("/var/www/html/openWB/ramdisk/99-bridgesToDelete", $currentFile, FILE_APPEND);
file_put_contents("/var/www/html/openWB/ramdisk/99-bridgesToDelete", "$currentFile\n", FILE_APPEND);
}
}

Expand Down Expand Up @@ -117,16 +126,16 @@ function debugPrint($message){

$remoteHost = $_POST['RemoteAddress'];
if ($remoteHost == "entfernter.mqtt.host:8883") {
exit("Bitte die Adresse und den Port des entfernten MQTT-Servers setzen.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Bitte die Adresse und den Port des entfernten MQTT-Servers setzen.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}
if(!preg_match('/^([a-zA-Z0-9][a-zA-Z0-9.-]+):([1-9][0-9]*)$/', $remoteHost, $matches)) {
exit("Der Bezeichener f&uuml;r den Namen oder die IP Adresse des entfernten MQTT-Servers ('" . htmlentities($remoteHost) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9 und Punkt sind vor dem Doppelpunkt erlaubt. Nach dem Doppelpunkt sind nur noch Ziffern 0-9 erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Der Bezeichener f&uuml;r den Namen oder die IP Adresse des entfernten MQTT-Servers ('" . htmlentities($remoteHost) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9 und Punkt sind vor dem Doppelpunkt erlaubt. Nach dem Doppelpunkt sind nur noch Ziffern 0-9 erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

$hostOrAddress = $matches[1];
$port = $matches[2];
if (!isset($hostOrAddress) || empty($hostOrAddress)) {
exit ("Die Address oder der Namen des entfernten MQTT-Servers ('" . htmlentities($hostOrAddress) . "') ist ung&uuml;tig oder nicht vorhanden.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit ("Die Address oder der Namen des entfernten MQTT-Servers ('" . htmlentities($hostOrAddress) . "') ist ung&uuml;tig oder nicht vorhanden.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

if (!isset($port) || empty($port)) {
Expand All @@ -137,54 +146,54 @@ function debugPrint($message){

$remoteUser = $_POST['RemoteUser'];
if ($remoteUser == "nutzername-auf-dem-entfernten-host") {
exit("Bitte einen Benutzernamen f&uuml;r den entfernten MQTT-Servers setzen.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Bitte einen Benutzernamen f&uuml;r den entfernten MQTT-Servers setzen.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}
if(!preg_match('/^([a-zA-Z0-9_\-+.]+)$/', $remoteUser)) {
exit("Der Bezeichener f&uuml;r den Benutzer auf dem entfernten MQTT-Servers ('" . htmlentities($remoteUser) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9, Punkt, Unterstrich, Minus und Plus sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Der Bezeichener f&uuml;r den Benutzer auf dem entfernten MQTT-Servers ('" . htmlentities($remoteUser) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9, Punkt, Unterstrich, Minus und Plus sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

debugPrint("RemoteUser: '$remoteUser'");

$remotePass = $_POST['RemotePass'];
if(!isset($remotePass) || empty($remotePass)) {
exit("Ung&uuml;tiges Pa&szlig;wort: Nicht vorhanden oder leer.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Ung&uuml;tiges Pa&szlig;wort: Nicht vorhanden oder leer.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

debugPrint("RemotePass: <em>&gt;vorhanden&lt;</em>");

$remotePrefix = $_POST['RemotePrefix'];
if(!preg_match('/^[a-zA-Z0-9_\-\/]+$/', $remotePrefix)) {
exit("Der Bezeichener f&uuml;r den Topic-Pr&auml;fix auf dem entfernten MQTT-Server ('" . htmlentities($remotePrefix) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9, Unterstrich, Schr&auml;gstrich und Minus sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Der Bezeichener f&uuml;r den Topic-Pr&auml;fix auf dem entfernten MQTT-Server ('" . htmlentities($remotePrefix) . "') enth&auml;t ung&uuml;tige Zeichen. Nur a-z, A-Z, 0-9, Unterstrich, Schr&auml;gstrich und Minus sind erlaubt.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

debugPrint("RemotePrefix: $remotePrefix");

$mqttProtocol = $_POST['mqttProtocol'];
if(!preg_match('/^(mqttv31|mqttv311)$/', $mqttProtocol)) {
exit("Interner Fehler: Ung&uuml;tiges MQTT Protokoll '" . htmlentities($mqttProtocol) . "'");
cleanAndExit("Interner Fehler: Ung&uuml;tiges MQTT Protokoll '" . htmlentities($mqttProtocol) . "'");
}

debugPrint("MQTT protocol: '$mqttProtocol'");

$tlsProtocol = $_POST['tlsProtocol'];
if(!preg_match('/^(tlsv1.2|tlsv1.3)$/', $tlsProtocol)) {
exit("Interner Fehler: Ung&uuml;tiges TLS Protokoll '" . htmlentities($tlsProtocol) . "'");
cleanAndExit("Interner Fehler: Ung&uuml;tiges TLS Protokoll '" . htmlentities($tlsProtocol) . "'");
}

$exportStatus = isset($_POST['exportStatus']) && ($_POST['exportStatus'] == 1);
$exportGraph = isset($_POST['exportGraph']) && ($_POST['exportGraph'] == 1);
$subscribeConfigs = isset($_POST['subscribeConfigs']) && ($_POST['subscribeConfigs'] == 1);

if (!$exportStatus && !$exportGraph && !$subscribeConfigs) {
exit("Es macht keinen Sinn eine MQTT-Br&uuml;cke zu konfigurieren welche weder Daten publiziert noch Konfigurationen empf&auml;ngt.<br/>Bitte mindestens eine Checkbox bei 'Zum entfernten Server weiterleiten' oder 'Konfiguration der openWB durch entfernten Server erm&ouml;glichen' aktivieren.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
cleanAndExit("Es macht keinen Sinn eine MQTT-Br&uuml;cke zu konfigurieren welche weder Daten publiziert noch Konfigurationen empf&auml;ngt.<br/>Bitte mindestens eine Checkbox bei 'Zum entfernten Server weiterleiten' oder 'Konfiguration der openWB durch entfernten Server erm&ouml;glichen' aktivieren.<br/>Verwende die &quot;Zur&uuml;ck&quot;-Funktion des Webbrowsers um zur&uuml;ck zum Formular zu kommen.");
}

//
// create the new config file
//
$configFile = fopen($fileToUseForNewConfig, 'w');
if (!$configFile) {
exit("Interner Fehler: Kann die Konfigurationsdatei f&uuml;r die Br&uuml;cke nicht erzeugen.");
cleanAndExit("Interner Fehler: Kann die Konfigurationsdatei f&uuml;r die Br&uuml;cke nicht erzeugen.");
}

debugPrint("Openend '$fileToUseForNewConfig' and now writing configuration to it");
Expand Down

0 comments on commit 35cfa43

Please sign in to comment.