Abfrage Drucker-Tintenstand über ein PHP-Skript

Status
Für weitere Antworten geschlossen.

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
und schon wieder ein update...

hallo an die moderatoren! ich habe mich entschlossen, es etwas einfacher zu machen. werde das prog auf meinem nas uppen, dann kann ich, wenn mir fehler auffallen schnell ne aktualisierte version uppen, ohne dass ich dafür jedes mal nen neuen post machen muss.

ich bitte darum, dass meine bisherigen posts zum beta-programm gelöscht werden, weiterhin bitte ich darum, dass im post zur finalen version der downloadlink auf den folgenden pfad geändert wird:

welle1983.homeftp.net/Syno/DruckerMonitor.rar

wenn dies alles passiert ist, dann kann auch dieser post hier bitte gelöscht werden. sorry, dass ich euch da arbeit mit mache, aber wenn jemand neu hier ist, der wird mit diversen versionen überflutet, was nicht so schön ist.

vielen dank für eure hilfe!

gruß
stephan
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Jetzt noch einmal zur Lizenz. Das Programm läuft unter der Open Source Lizenz GPL3 und ist somit frei verfügbar. Die genauen Bedingungen findet ihr hier:

Das komplette Material zum Programm bekommt ihr hier:

Sicherlich ist es nicht der beste Programmierstil, aber ich bin auch nur Laie und habe mich hauptsächlich aus Spaß an der Freude mit der Entwicklung des Programms beschäftigt.
Aber hier liegt ja auch teilweise der Sinn der GPL Lizenz, dass jeder nach eigenen Wünschen das Programm verbessern darf.

Das wars von meiner Seite!

Gruß, Stephan
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Da ich nirgends gefunden habe, dass "Jonas" sein Skript auch unter GPL zur verfügung gestellt hat, habe ich es aus meinem Download-Paket zum Programm entfernt und stelle hier den Code online, wie man das Skript anpassen muss, damit es mit meinem Programm kompatibel ist:

Rich (BBCode):
<?php
echo "<h2>Tintenstand</h2>";
$ret = exec("/opt/bin/ink -p usb",$a);

foreach ($a as $row){
echo $row . "<br> ";
};
 echo "end"
?> 

So, wer das Programm nutzen möchte, der möge sich bitte eine php Datei mit diesem Inhalt erstellen, da das Programm ansonsten nicht läuft.

Gruß, Stephan
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
hallo zusammen.

es gibt ein kleines update hinsichtlich des skriptes. dieses muss für die aktuelle version "DruckerMonitor V1.3" wie folgt aussehen:

Code:
<?php
echo "<h2>Tintenstand</h2>";
$ret = exec("/opt/bin/ink -p usb",$a);
foreach ($a as $row){
echo str_replace(' ','',$row . "<br> ");
};
 echo "end"
 ?>


vielen dank für die anregung an Christian Grohnberg!

das programm ist an dieses aktuelle skript angepasst und unter http://welle1983.homeftp.net/Syno/ downloadbar.
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Könnte man nicht einmal diese Druckerabfrage-Geschichte in unser Wiki bringen? Da wäre es sicherlich gut aufgehoben.

Itari
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
von mir aus gern. sollten uns dann aber ein konzept überlegen, was reinsoll, wie es aufgebaut sein soll und so. hab sowas noch nie gemacht, wäre also über ne kleine hilfestellung erfreut.

gruß,
stephan
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
von mir aus gern. sollten uns dann aber ein konzept überlegen, was reinsoll, wie es aufgebaut sein soll und so. hab sowas noch nie gemacht, wäre also über ne kleine hilfestellung erfreut.

Hey, es muss da nichts Großes stehen.

1] Kurzbeschreibung, wurum es geht (1-2 Sätze)
2] ob und was man bei der Installation machen muss
3] Download-link zu deiner Seite.

Und fertig.

Dann wäre das Thema im Wiki verankert und man muss nicht immer im Forum danach suchen ;)

Itari

PS. Jeder kann sich im Wiki anmelden - einfach Benutzer anlegen und schon geht es los. Ich mach grad mal eine Seite rein, damit du nur den Inhalt erfassen musst. Hilfe gibt es hier.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Sieht auf den ersten Blick gut aus.

Danke :)

Itari
 

dewoob

Benutzer
Mitglied seit
16. Jan 2010
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
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. :eek:

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!
 
Zuletzt bearbeitet:

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Hallo und willkommen im Forum!

vielen Dank für Deine Erweiterung.

Du schreibst:

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.

Ich bin da nicht so bewandert, aber was für Sicherheitsmängel sind denn genau vorhanden, bzw. was für Konsequenzen können daraus entstehen? Ich mein immerhin liest das Skript ja bloß den Füllstand aus, was soll da denn für ein Sicherheitsrisiko von ausgehen??

Bitte hier um Aufklärung.

Weiterhin würde mich interessieren, ob Deine Änderungen dann trotzdem einen normalen Betrieb des DruckerMonitor zulassen, weil das Programm ja direkt die tinte.php ausliest und du sie verändert hast.

Gruß,
Stephan
 

dewoob

Benutzer
Mitglied seit
16. Jan 2010
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Hallo Stephan,

die veränderte tinte.php erzeugt eine mit dem Druckmonitor kompatible Ausgabe, so dass dieser wie gewohnt weiterverwendet werden kann. Der wichtigste Unterschied ist, dass die Daten jetzt um max. 10 Minuten zeitversetzt ermittelt werden.

Das Risiko lautet: Wenn deine DS von außen erreichbar ist und ein Angreifer es schafft, seinen eigenen PHP-Code auf deiner Kiste zum Laufen zu bringen, dann könnte er exec() nutzen, um beliebige Prozesse zu starten (soweit diese als nobody ausführbar sind).

Grüße
Olli
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
hmmm....

das heißt umgekehrt aber auch, dass sich der Drucker eigentlich nie längerfristig abschaltet, da er ja spätestens nach 10 min wieder "geweckt" wird durch die Tintenabfrage. Ich weiß nun nicht genau, nach welcher Zeit der Drucker sich automatisch wieder ausschaltet, aber sollte er sich nach 5 min ausschalten und 5 min später wird er wieder geweckt, dann rappelt der ja alle 10 min los und macht ne kleine Reinigungsfahrt der Düsen, die er standardmäßig bei jedem "Aufwachen" durchführt.
Denke, dass dadurch auf Dauer der Patronen- und auch Druckkopfverschleiß extrem hoch sein wird.

Wie stehst Du dazu? Ansonsten finde ich deine Idee super. Nur wie gesagt, möchte ich ungern den Drucker dauernd wecken, noch die Abfrage so häufig durchführen, dass er sich nicht mehr aussschaltet und somit unnötig Strom frisst.


Gruß
Stephan
 

dewoob

Benutzer
Mitglied seit
16. Jan 2010
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Hi Stephan!

Das Verfahren ist extra so konzipiert, dass der Drucker eben nicht alle 10 Minuten geweckt wird, sonst hätte man ja direkt den Aufruf von /opt/bin/ink in die crontab schreiben können. Das Shell-Skript ink.sh ermittelt den Tintenstand nur dann, wenn die Datei ink.request existiert - und löscht diese Datei anschließend. Wenn hingegen ink.request nicht existiert, dann beendet sich das Skript sofort wieder, ohne irgendwas zu tun, und lässt den Drucker ggfs. weiterschlafen.

Mit anderen Worten: Jeder Aufruf von tinte.php verursacht einen einzigen Aufruf von /opt/bin/ink - genau wie es in der Version mit exec() auch gewesen ist.

Gruß Olli
 
Zuletzt bearbeitet:

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Ah, verstehe. Da werden meine rudimentären Kenntnisse deutlich :D

Aber dann kann man ja ohne Bedenken zugreifen ;)

Finde es super, dass hier öfter mal neue Anregungen kommen. Somit wächst das kleine Projekt doch zu etwas richtig Ausgereiftem heran.

Werde dann gleich mal ein "Security Update" machen und morgen den Wiki Eintrag um die neue Sicherheitsfunktion ergänzen, wenn du nichts dagegen hast, Olli.

Schönen Abend und schönes Wochenende!

Gruß
Stephan
 

dewoob

Benutzer
Mitglied seit
16. Jan 2010
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Jo, kannst du gerne machen. Aber bitte zuerst gegenchecken, ob es auch bei dir so funzt - nicht, dass ich was übersehen habe und dann Müll im Wiki steht! ;)

Ich freu mich, dass dir die Idee gefällt!

Gruß und dir auch ein schönes WE!
Olli
 

Welle1983

Benutzer
Mitglied seit
14. Jul 2008
Beiträge
38
Punkte für Reaktionen
0
Punkte
0
Hallo, Olli!

Einen Kumpel ist noch aufgefallen, dass durch den cronjob nun der ruhezustand des NAS verloren geht, wenn der alle 10 min checkt. das find ich persönlich eher nicht so toll. Gibts vielleicht irgendne Lösung dafür?

Gruß,
Stephan
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Anmerkung zu der Änderung von PHP-Variablen.

Es laufen 2 Apache-Webserver auf der DS standardmäßig: user und sys. Für beide Apaches wird eine gemeinsame php.ini benutzt: /usr/syno/etc/php.ini. Das bedeutet, dass wenn man dort etwas ändert, dann gilt es für beide Apaches. Normalerweise (und so sollten man es auch wirklich handhaben!), darf man vom Web aus nur mit dem user-Apache spielen. Den sys-Apache sollte man so zunageln wie es nur irgend geht, d. h. auch die Fernsteuerung der DS aus dem Web sollte man unterlassen, wenn man Sicherheit liebt!

Um nun zu vermeiden, dass man durch eine Änderung der php.ini die PHP-Module der beiden Apaches öffnet, ist es geschickter, die PHP-Direktiven nicht in der php.ini, sondern direkt in der http.conf-sys vorzunehmen:

Rich (BBCode):
php_admin_flag  safe_mode off
php_admin_value safe_mode_exec_dir none
php_admin_value safe_mode_include_dir none
php_admin_value open_basedir none
php_admin_value doc_root none
php_admin_flag  allow_url_fopen on
php_admin_flag  magic_quotes_gpc off

Damit würde man nur den vom Web aus nicht erreichbaren sys-Apache hinsichtlich des PHPs öffnen ... also nur im LAN geht es dann!

Genauso wird es in meinem Init_3rdparty.spk gemacht!

Itari
 

dewoob

Benutzer
Mitglied seit
16. Jan 2010
Beiträge
8
Punkte für Reaktionen
0
Punkte
0
Hallo zusammen!

Einen Kumpel ist noch aufgefallen, dass durch den cronjob nun der ruhezustand des NAS verloren geht, wenn der alle 10 min checkt. das find ich persönlich eher nicht so toll. Gibts vielleicht irgendne Lösung dafür?

Guter Punkt, das ist mir gestern kurz vor dem Einschlafen auch noch eingefallen! :rolleyes: Bis jetzt war's aber nur eine Befürchtung, ich habe es noch nicht verifiziert. Da die Skript-Datei alle 10 Minuten gelesen wird, hätte sie ja theoretisch im Read-Cache der Platte einen schönen Platz verdient, so dass diese gar nicht anlaufen müsste. Ob das in der Praxis so funzt, habe ich aber, wie gesagt, noch nicht getestet...

Was soll ich sagen ... ich hab die DS neu und wollte so wenig wie möglich daran verändern, insbesondere keine Security-relevanten Settings. Ich wollte einfach nur den Tintenstand meines Druckers erfahren können. Deshalb habe ich nach einer Lösung gesucht, wie man das erreichen kann, ohne groß nach rechts und links zu schauen. Von der Init_3rdparty.spk weiß ich deshalb noch gar nichts - das werd ich mir mal ansehen. Vielen Dank für die erhellenden Tipps zur Apache-Konfiguration!

Grüße, Olli
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
Ein Programm, welches sich für 10 Minuten schlafen legt ist besser als eines, welches alle 10 Minuten vom crond von der Platte geladen wird. Der Plattencache ist leider nicht resident; bedeutet, was nicht sofort abgeholt wird, verfällt. Es gibt also nichts im Plattencache, was längere Zeit übersteht. Denke immer daran, dass die Größe des Plattencaches eigentlich bescheiden ist, denn die kleinste Einheit, die von der Platte gelesen wird, ist nicht der Block (meist 512 Byte), sondern Einheiten, die meist sehr viel größer sind (Blockgruppen - Spur - read ahead), sonst würde ja ein Daten-Streaming gar nicht funktionieren

Itari
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat