IPS webserver

Ich habe folgendes Problem.

[ul]
[li]Ich habe eine kleine „index.html“-Seite auf einen IPS-Webserver gebracht.
[/li][li]Der root des-IPS Webservers ist in einem Directory namens „\IP-Symcon\ZugangWeb“.
[/li][li]Die Form Action von index.html übergibt ein Haufen Parameter an „48745.ips.php“, welche eine Latte IPS-spezifische Aktionen triggert, Schalter schaltet, etc. etc.
[/li][/ul]

Das Problem ist folgendes:

[ol]
[li]Wenn ich „48745.ips.php“ vom Directory „\IP-Symcon\ZugangWeb“ auf „\IP-Symcon\scripts“ kopiere, funktioniert alles prima.
[/li][li]Wenn ich dann im Directory „\IP-Symcon\ZugangWeb“ die Datei „48745.ips.php“ umbenenne in „ProcessForm.php“, und die Form Action von Index.html entsprechend anpasse, dann geschehen die normalen PHP-Befehle (echo etc.) aber IPS wird nicht getriggert.
[/li][li]Wenn ich die Kopie von „48745.ips.php“ vom Directory „\IP-Symcon\ZugangWeb“ lösche und nur noch auf „\IP-Symcon\scripts“ behalte, dann läuft nichts mehr.
[/li][/ol]

Meine Frage ist: wie kann ich vom Webserver „\IP-Symcon\ZugangWeb“ auf Scripte zugreifen, welche in „\IP-Symcon\scripts“ enthalten sind? Das ganze hat auch eine Sicherheitskomponente: ich möchte nicht unbedingt die ganze PHP-Scripte dem grossen weiten Web offenlegen.

der IPS-Webserver sollte untouchable sein! Für uns User quasi eine Black-Box! Alles Andere ist weder wartbar noch trobleshooting-fähig. Hast Du eigentlich geplant, keine IPS-Updates mehr zu machen?

Der root des-IPS Webservers ist in einem Directory namens „\IP-Symcon\ZugangWeb“.

Nein, der Root ist webfront/user. Dort gehören deine eigenen Seiten rein. Wenn Du von dort scripts aufrufen willst, musst Du IPS-RunScript… verwenden.

Hmmm… IPS kann ja mehrere Webserver installieren. Müssen die wirklich alle in webfront/user installiert werden? Die Instanz erlaubt im Prinzip, die root in einem beliebigen neuen Unterverzeichnis von \IP-Symcon\ zu installieren. Die Installation in /ZugangWeb/ funktionierte übrigens auch (wenn auch mit gewissen Idiosynchrasien).

Wirklich? Ich meine aber die installierbaren Webserver-Instanzen, nicht die Webfront.

Ich möchte dazu übergehen, meine „eigene Webfront“ mit Dreamweaver zu basteln. Die IPS-Webfront ist fantastisch für Visualisierungen - aber die Flexibilität ist doch etwas begrenzt, und die Performance ist mit jener von schlichtem HTML nicht vergleichbar.

Dafür ist die IPS-Umgebung nicht vorgesehen. Aber ok, wenn Du unseren Rat nich annehmen willst, musst Du halt Deine eigenen Erfahrungen machen…

ich will den Rat annehmen und meine eigenen Erfahrungen machen! Die Wahrscheinlichkeit, dass ich nicht zum Ziel komme, ist 99.8% :wink:

Ein Beispiel zum schalten eines Aktors über eine eigene Seite:

  1. Eigene Webserver Instanz anlegen (siehe Anlage), habe mal irgendein Port genommen
  2. index.php im Ordner User anlegen

Beispielcode zum Schalten eines Xcomfort Aktors (45279 ist hier die Status ID des Aktors):


<?php
    if(isset($_GET['action']) && $_GET['action'] == "toggleMXC" && isset($_GET['id']))
    {
        $id = IPS_GetParent((int)$_GET['id']);
        MXC_SwitchMode($id , !GetValue((int)$_GET['id']));
    }
?>
<html><body>
  
<a href="?action=toggleMXC&id=45279">
<font size="7">
Funktion: Licht ==> <?php echo (GetValue(45279)) ? "einschalten" : "ausschalten"; ?>!</a>
</body></html>

Unbenannt.PNG

Danke nagus. Das scheint bei mir auch zu funktionieren! Ich komme aber sicher nochmals auf Euch zu, sobald ich in die nächste Sackgasse mit meinem Projekt lande…
Tschüss, AAG

Komme langsam, aber stetig vorwärts. Die PHP-Einschübe in meine Eigenbau-Webseite scheinen zu funktionieren.

Insgesamt scheint mir diese Lösung flexibler zu sein, als die Webfront. Meine ursprüngliche Motivation war, dass ich keine „blinden“ Passwörter in die Webfront schreiben konnte, und dass die Onscreen-Tastatur auf Android nicht wirklich funktionsfähig ist.

Die entsprechenden HTML und PHP snippets werden zur Verfügung gestellt, sobald sie in einem präsentablen Zustand sind (dauert noch ein Weilchen).

Diese Dinge sind nun gelöst. Aber ich bin sicher, dass ich noch in irgendeine unvorhergesehene Falle tappen werde. Fortsetzung folgt!

jetzt habe ich doch ein Problem. Folgendes PHP-Snippet funktioniert wunderbar, um eine Graphik im Browser darzustellen:


<?php
$filename = 'C:\IP-Symcon\media\DailyOutsideTemperature.png';
$image=imagecreatefrompng($filename);
$mimetype = 'image/png';
header('Content-Type: '.$mimetype);
imagepng($image);
?>

Wenn ich habe den selben snippet in eine vollständige Webseite einbinde (Code unten, eingebettet ab line 34), bekomme ich den Fehler „Warning: Cannot modify header information - headers already sent by (output started at C:\IP-Symcon\webfront\user\page3.php:34) in C:\IP-Symcon\webfront\user\page3.php on line 38“.

Weiss jemand, wo der Haken liegt? Ich werde bald wahnsinnig dabei…


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<meta name="description" content="your description goes here" />
	<meta name="keywords" content="your,keywords,goes,here" />
	<meta name="author" content="Your Name" />
	<link type="text/css" rel="stylesheet" href="andreas04.css" media="screen,projection" />
	<title>Weather</title>
<link href="/CSS/Bell.css" rel="stylesheet" type="text/css" />
</head>

<body>
<div id="container"> <!-- use id="container800" or id="container1024" to make layout fixed-width -->
	<div id="sitetitle">
		<h1><a href="index.php">Bell 15</a></h1>
		<h2>by AA</h2>
	</div>

	<div id="menu">
    	<a href="index.php">Home</a>
		<a href="page2.php">Agendas</a>
		<a href="page3.php">Weather</a>
		<a href="page4.php">Lift/Alarm</a>
		<a href="page5.php">Codes</a>
		<a href="page6.php">Reserve</a>
</div>

	<div id="content">
		<div id="left">
			<div class="entry">
				<h2><a href="index.php">Weather</a>
			  </h2>
				<p>
				<?php
                $filename = 'C:\IP-Symcon\media\DailyOutsideTemperature.png';
    			$image=imagecreatefrompng($filename);
				$mimetype = 'image/png';
			    header('Content-Type: '.$mimetype);
		    	imagepng($image);
				?>
                
                 </p>
			</div>

			<div class="entry">
				<h2> </h2>
				<p> </p>
			  <p> </p>
			</div>
			<p class="pagenav">« <a href="#">Sample back link</a> | <a href="#">Sample forward link</a> »</p>
		</div>

		<div id="right">
			<h2>Current weather info (Bellaria)</h2><p class="intro">
            <?php 
            $outsidetemp = getvalue(53428  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\OutsideTemp]*/);
			$Barometer = getvalue(29183  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\Barometer]*/);
			$currWindspeed = getvalue(58383  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\currWindspeed]*/);
			$InsideHumidity = getvalue(13794  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\InsideHumidity]*/);
			$InsideTemperature = getvalue(34430  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\InsideTemperature]*/);
			$OutsideHumidity = getvalue(29232  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\OutsideHumidity]*/);
			$WindAlarm = getvalue(40165  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\WindAlarm]*/);
			$WindDirection = getvalue(26714  /*[Wetterstation Dach\RegVarDavisTalkPacket\DavisTalkParsePacket\WindDirection]*/);
			$WindSpeedTenMinAverage = getvalue(18841  /*[\RegVarDavisTalkPacket\DavisTalkParsePacket\WindSpeedTenMinAverage]*/);
			?>
			
			<?php echo "Outside temperature: " . $outsidetemp. " °C". chr(10); ?>
            <br /><?php echo "Pressure: " . $Barometer. chr(10) ; ?>
            <br /><?php echo "Current wind speed: " . $currWindspeed. chr(10) ; ?>
			<br /><?php echo "Humidity inside: " . $InsideHumidity. chr(10) ; ?>
			<br /><?php echo "Temperature inside: " . $InsideTemperature. chr(10) ; ?>
			<br /><?php echo "Humidity outside: " . $OutsideHumidity. chr(13) ; ?>
			<br /><?php echo "Storm alarm: " . $WindAlarm. chr(13) ; ?>
			<br /><?php echo "Wind direction: " . $WindDirection. chr(13) ; ?>
			<br /><?php echo "Wind 10' average: " . $WindSpeedTenMinAverage ;  ?>
             </p>

			<h2>Sample photos</h2>
			<p class="thumbs"> </p>

			<div class="subcontainer">
			  <div class="rightsub2"><br class="hide" />
				</div>
			</div>
		</div>

		<div id="footer">
			<h2> </h2>
</div>
	</div>
</div>
</body>
</html>

header(…

kannst du an der Stelle im Code nicht mehr nutzen.

Dadurch wird der „<head>…</head>“ Teil beim Laden manipuliert. Der ist aber schon da, wenn dein Code in der Webseite kommt.

Versuch es mal ohne

$mimetype = ‚image/png‘;
header('Content-Type: '.$mimetype);

danke Ralf, für die Erste Hilfe, die ich sehr schätze! Den Header wegzulassen, hatte ich eigentlich auch schon probiert. Allerdings kommt dann ein riesiger Zeichensalat: „�PNG IHDR ^�� etc. etc.“, d.h. der Browser erkennt nicht, dass er ein Bild dekodieren soll…

Ich schalte, indem ich einen Link auf eine Folgeseite setze, die nur zum ausführen von befehlen angelegt ist und automatisch wieder zur Ausgangsseite schaltet:

Link zum ausführen von Befehlen:

<a href="beispiel_schalten.php?id=1">Beispielbefehl 1</a><br>
<a href="beispiel_schalten.php?id=2">Beispielbefehl 2</a>

Die Seie beispiel_schalten.php sieht so aus:

<?
if ($_SERVER['QUERY_STRING'] != '') {
  $daten = $_GET['id']; 
  switch ($daten) {
   case 1 : //
	// hier wird beispiel 1 geschaltet....
	break;
   case 2 : //
	// hier wird dann beispiel 2 geschaltet....
	break;	
   }
}
<head>
<? echo '<meta http-equiv="refresh" content="0; URL=http://'.$HTTP_HOST.'/index.php">'; ?>
<!-- ... andere Angaben im Dateikopf ... -->
</head>
</body></html>

Gruß Rolf

Lieber Rolf

vielen Dank für diesen interessanten Beispiel. Ich sollte vorweg nehmen, dass diese meine ersten Schritte sind in der HTML-Programmierung - und deswegen bitte ich vorsorglich um Nachsicht mit meiner Naïvität!

Mir scheint, dass Deine Lösung einen Link anbietet, welcher gewisse PHP-Skripte aufruft wenn geklickt.

Ich will aber etwas viel Simpleres tun! Ich will lediglich eine PNG-Graphik auf der Webpage darstellen, wobei sich die Graphik in einem Directory ausserhalb der Root (und ihrer Kinder-Directories) befindet. Deswegen dachte ich, dass ein Client-seitiges tag diese File nicht holen kann. Aus diesem Grunde wollte ich mit einem (Server-seitigen) PHP-snippet die Imagefile holen. Leider scheitere ich an mein Unwissen, wie ich das bewerkstelligen soll!

Warum, holst Du dein Bild nicht mit <img src=adresse…>

Dein PHP Script zum Einbinden eines Bild sollte funktionieren.
Allerdings musst du es in eine seperate php Datei schreiben und diese dann über <img src=„img.php“ /> einbinden.

@Rolf-L: Das Redirect würde ich per PHP header(„Location: xxxx“); gestalten. Das geht schneller und transparent.

Meine Lieben:
Ihr habt mein Wochenende gerettet! Mit dem separaten Script klappt alles!
vielen herzlichen dank für Eure Mühe!
AAG

habe den script ein bisschen getweak, um ihn zu verallgemeinern:

Web page:


<img src="BringImage.php?pic=DailyOutsideTemperature.png" />

BringImage.php:


<?php
   if(isset($_GET['pic'])) 
    { 
	$pictureName = $_GET['pic'];
	$filename = "C:\IP-Symcon\media".chr(92).$pictureName;
	$image=imagecreatefrompng($filename);
	$mimetype = 'image/png';
	header('Content-Type: '.$mimetype );
	imagepng($image);
    } 
?>
      

Der entscheidende Vorteil dieser Anordnung ist für mich, dass die abzubildenden Files in einem geschützten, vom Webserver getrennten Bereich liegen können.

Pass bitte mit sowas auf. Es ist durch ähnliche Konstruktionen schon möglich gewesen Systempasswortdateien auszulesen. Also unbedingt eine Abfrage machen:

  1. Keine \ oder / bzw. …\ erlauben.
  2. Die Datei auch existiert.