Lösung ohne Einschränkung der PHP-Security
Hallo zusammen,
mit diesem kleinen Beitrag möchte ich als neues Forenmitglied meine Aufwartung machen.
Die Arbeit, die diesem Thema gewidmet wurde, finde ich großartig und ich danke euch für die Möglichkeit, den Tintenstand abzufragen. Möge dies dem Druckkopf meines guten alten iP5000 noch ein langes Leben bescheren... ;-)
Was mich allerdings am bisherigen Ansatz gestört hat ist die Tatsache, dass man safe_mode_exec_dir in der php.ini verändern und somit Kompromisse mit der Sicherheit machen muss. Es geht auch anders, wenn auch etwas umständlicher. Dem Linux-Guru meines Vertrauens würde bestimmt noch etwas Eleganteres einfallen, aber es funktioniert.
Idee:
- tinte.php soll ink nicht selbst aufrufen müssen, sondern lediglich den Bedarf zur Ermittlung des Tintenstands "registrieren". Der Tintenstand soll in gleicher Weise ausgegeben werden, allerdings durch Einlesen einer Textdatei, in welcher der Tintenstand (d.h., die Ausgabe von ink) hinterlegt ist.
- Ein Cronjob soll alle paar Minuten mal nachsehen, ob die Ermittlung des Tintenstands angefordert wurde, und ggfs. dann ink aufrufen, wobei dessen Ausgabe in besagte Textdatei umgeleitet wird.
So habe ich das gemacht:
tinte.php
Code:
<h2>Tintenstand</h2>
<?php
touch( "/tmp/ink.request" );
$content = file_get_contents( "/tmp/ink.txt" );
echo nl2br( $content );
?>
tinte.php legt eine leere Datei /tmp/ink.request an, um zu signalisieren, dass der Tintenstand ermittelt werden soll. Dann wird die Textdatei ink.txt ausgelesen, sie enthält das Ergebnis der letzten Abfrage des Tintenstands. Die Zeilenumbrüche werden durch br-Tags ersetzt und das Ergebnis wird ausgegeben.
Neues Skript /home/admin/bin/ink.sh
Code:
if [ -f /tmp/ink.request ]
then
rm -f /tmp/ink.request
/path/to/ink -p usb > /tmp/ink.txt
date >> /tmp/ink.txt
chmod a+r /tmp/ink.txt
fi
Eventuell muss dieses Skript erst ausführbar gemacht werden (chmod a+x /home/admin/bin/ink.sh). Das Directory /home/admin/bin/ hatte noch nicht existiert, ich hatte es selbst angelegt (mkdir). Es spielt allerdings keine Rolle, in welchem Verzeichnis das Skript liegt, so lange der Eintrag in crontab entsprechend ist.
Die Existenz der Datei /tmp/ink.request bedeutet für ink.sh, dass der Tintenstand abgefragt werden soll. Wenn das der Fall ist, wird ink.request gelöscht, so dass beim nächsten Lauf von ink.sh der Tintenstand nicht wieder ermittelt wird. Erst bei einem erneuten Aufruf von tinte.php wird die Datei ink.request wieder erzeugt. Auf diese Weise wird nicht bei jedem Aufruf von ink.sh der Tintenstand neu abgefragt (was ja jedes Mal mit einem "Wakeup" des Druckers verbunden sein könnte). Schließlich soll das Skript ja regelmäßig laufen und nicht jedesmal der Drucker anspringen, obwohl der Druckmonitor gar nicht läuft.
Die Zeile mit "date" in ink.sh schreibt noch das aktuelle Datum und die Uhrzeit ans Ende der Textdatei. Man kann diese Zeile weglassen ("is nich original"), aber sie ist ganz hilfreich, wenn man überwachen möchte, ob der Cronjob funktioniert. Stephans Druckmonitor scheint sich daran nicht zu stören.
WICHTIG: /path/to/ink ist durch die Ausgabe von "which ink" zu ersetzen!!!
Neuer Eintrag in /etc/crontab
Code:
*/10 * * * * root /home/admin/bin/ink.sh
Der Eintrag in der crontab sorgt dafür, dass ink.sh alle 10 Minuten aufgerufen wird. Die Häufigkeit kann nach Belieben angepasst werden (siehe crontab-Dokumentation). Bitte beachten: der Cronjob wird erst nach einem Neustart der Disc Station aktiv!
Beim allerersten Aufruf von tinte.php existiert die Datei ink.txt noch nicht, es kommt deshalb zu einer php-Warnung, an der man sich nicht weiter stören muss.
DISCLAIMER:
- Alles ohne Gewähr
- Um sicherzustellen, dass der gemeldete Tintenstand aktuell ist, empfiehlt sich folgende Vorgehensweise:
1. Es sollte zuerst der Drucker eingeschaltet und danach der Druckmonitor gestartet werden. Der Druckmonitor ruft beim Start tinte.php auf und triggert damit eine Aktualisierung an.
2. Nach 10 Minuten kann man den Druckmonitor erneut aufrufen, was dann zum Auslesen und Anzeigen des aktualisierten Tintenstands führt.
Viel Spaß damit!