[HowTo] Erweiterter USB-Printserver, insbesondere Drucker ein und aus schalten

Sorry Ralf. Für mich ging aus den letzten Zeilen nicht hervor, dass die Datei schon ein Shell-Skript ist.

@caldir65
Webinterfaces sind toll. Aber es muss sie jemand machen...

Gruß
Oliver
 
Jetzt will ich diese interessante Diskussion noch etwas verallgemeinern bzw. ausweiten. Ich würde gerne das Ganze nicht für einen USB-Drucker, sondern für einen Netzwerkdrucker verwenden. Die Idee dabei ist Port 9100 der Box als so eine Art "intelligente Proxy" zu verwenden, die Daten allerdings nicht zum lokalen USB-Port wie hier im Beispiel weiterschicken, sondern zum Port 9100 vom richtigen Drucker.
Verstehe ich es richtig, dass ich dafür lediglich das C-Programm von Ralf an einigen wenigen Stellen abändern muss? Denn die restlichen Ideen von euch mit dem Shell-Skript, Lauschen auf Port 9100, daemonize usw. kann man doch einfach übernehmen?

MfG
 
Ja, Du kannst statt der Ausgabe auf den USB-Port auch eine Verbindung zum Netzwerk-Drucker öffnen.

Eleganter wäre es auch, die Timeouts im C-Programm zu behandeln statt mit Dateien im Shell Skript.
 
Hi,
ich habe ein kleines WebIF erstellt und in Ticket 1766 als Patch angehängt.
 
Kannst du bitte ein Screenshot hier oder im Trac posten? Nicht jeder will es gleich testen, sondern will sich oft nur ein Bild darüber verschaffen, wie es aussieht.

MfG
 
Screenshot vom WebIF? Das ist ziemlich unspektakulär :)

Nicht wundern, ich habe einen anderen Skin im freetz WebIF.
printserv-webif.PNG
Das Untermenü printserv-jobs ist nur ein großes Eingabefeld zur Bearbeitung eben jenes Shellskripts.
 
Ich denke auch, dass man sich das Paket nicht wegen des Aussehens vom Web-Interface installiert.

Kannst Du im Trac noch erläutern, warum die Änderung an /etc/hotplug/udev-printer-lp gemacht wird?
 
Wie im Trac schon beschrieben, startete /etc/hotplug/udev-printer-lp den AVM-printserv, nachdem ein USB-Drucker erkannt wurde. Da dein printserv immer läuft, aber das binary den gleichen Namen trägt, sollte das Skript nichts mehr tun, außer vielleicht die ominöse /var/log/printer_status zu aktualisieren oder ins Syslog zu schreiben.
 
Das ist ein Argument. Schließlich soll dieser Printserver ja dauernd laufen, damit er den Drucker bei Bedarf einschalten kann.

Was kommt denn derzeit im Syslog, wenn der Drucker verbunden oder getrennt wird? Kommt auch ein Eintrag, wenn man etwas druckt?
 
Im Syslog steht nichts vom AVM printserv oder allgemein vom Drucker.
 
Ralf, ich glaube der fork in den Hintergrund funktioniert nur, wenn man /etc/init.d/rc.printserv von Hand aufruft, aber nicht vom WebIF und nicht beim Booten. Dann bleibt es nämlich endlos hängen.
Weißt du woran das liegen könnte oder wie ich da weiter nachforschen könnte?
 
Normalerweise liegt das daran, dass nicht alle FDs korrekt geschlossen werden.

Gruß
Oliver
 
Wenn ich den Teil von fork() bis setsid() direkt nach die getopt()-Struktur schreibe, ist der Effekt der gleiche.
 
Die Ausgabe von lsof printserv könnte auch weiter helfen. Hier sollten die offenen FDs zu sehen sein.

Gruß
Oliver

edit: Forks lassen sich auch mit 2.6.32 nur mit "replace kernel" tracen!?
 
Ich bin mir nicht sicher. Aber das Thema hatten wir schon mal. Zum Einen haben wir auch für 2.6.32 noch den scall-32 Kernel Patch. Zum anderen wurde in der letzten Version von strace folgendes verbessert:
* Implemented a new method of following clone, fork, and vfork
syscalls using the Linux kernel's explicit facilities for tracing
creation of threads and child processes.
Gruß
Oliver
 
Ich hatte auch in Erinnerung, dass sich am strace Programm selbst etwas geändert hat, daher die Frage.

Falls das System von stan23 den original Kernel verwendet, werden wir wohl erfahren, ob es funktioniert.
 
Also hier ist die Ausgabe von lsof:
Code:
root@fritz:/var/mod/root# killall printserv
root@fritz:/var/mod/root# lsof | grep "print"
smbd       3743   root  mem-r     REG       0,12    12288   6496 /var/lock/printer_list.tdb
smbd       3743   root   17ur     REG       0,12    12288   6496 /var/lock/printer_list.tdb
root@fritz:/var/mod/root# /etc/init.d/rc.printserv start
Starting Printserv...done.
root@fritz:/var/mod/root# lsof | grep "print"
smbd       3743   root  mem-r     REG       0,12    12288   6496 /var/lock/printer_list.tdb
smbd       3743   root   17ur     REG       0,12    12288   6496 /var/lock/printer_list.tdb
printserv 12697   root  cwd       DIR       0,12        0     47 /var/mod/root
printserv 12697   root  rtd       DIR       31,0      207    232 /
printserv 12697   root  txt       REG       31,0     4956   1884 /usr/bin/printserv
printserv 12697   root  mem       REG       31,0    21528   1124 /lib/ld-uClibc-0.9.31.1.so
printserv 12697   root  mem       REG       31,0    56384   1052 /lib/libgcc_s.so.1
printserv 12697   root  mem       REG       31,0   418588   1285 /lib/libuClibc-0.9.31.1.so
printserv 12697   root    0u      CHR      136,0      0t0      3 /dev/pts/0
printserv 12697   root    1u      CHR      136,0      0t0      3 /dev/pts/0
printserv 12697   root    2u      CHR      136,0      0t0      3 /dev/pts/0
printserv 12697   root    3u     IPv4     565402      0t0    TCP *:9100 (LISTEN)
root@fritz:/var/mod/root# killall printserv
root@fritz:/var/mod/root# echo "now starting from webIF"
now starting from webIF
root@fritz:/var/mod/root# lsof | grep "print"
smbd       3743   root  mem-r     REG       0,12    12288   6496 /var/lock/printer_list.tdb
smbd       3743   root   17ur     REG       0,12    12288   6496 /var/lock/printer_list.tdb
printserv 13004   root  cwd       DIR       31,0      304    141 /usr/mww/cgi-bin
printserv 13004   root  rtd       DIR       31,0      207    232 /
printserv 13004   root  txt       REG       31,0     4956   1884 /usr/bin/printserv
printserv 13004   root  mem       REG       31,0    21528   1124 /lib/ld-uClibc-0.9.31.1.so
printserv 13004   root  mem       REG       31,0    56384   1052 /lib/libgcc_s.so.1
printserv 13004   root  mem       REG       31,0   418588   1285 /lib/libuClibc-0.9.31.1.so
printserv 13004   root    0r     FIFO        0,6      0t0 569175 pipe
printserv 13004   root    1w     FIFO        0,6      0t0 569190 pipe
printserv 13004   root    2w     FIFO        0,6      0t0 569174 pipe
printserv 13004   root    3u     IPv4     569192      0t0    TCP *:9100 (LISTEN)

Sind die offenen pipes das Problem?


Die Ausgabe von strace ist in allen Fällen gleich, egal ob ich printserv direkt starte, rc.printserv aufrufe oder über's WebIF:
Code:
root@fritz:/var/mod/root# cat /tmp/printserv.txt
13935 execve("/usr/bin/printserv", ["printserv", "-p", "9100", "-d", "/dev/usblp0"], [/* 228 vars */]) = 0
13935 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x2aaad000
13935 open("/usr/lib/freetz/libgcc_s.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
13935 open("/mod/lib/libgcc_s.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
13935 open("/lib/libgcc_s.so.1", O_RDONLY) = 3
13935 fstat(3, {st_mode=S_IFREG|0755, st_size=56384, ...}) = 0
13935 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x2aaae000
13935 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0\200\32\0\0004\0\0\0000\330\0\0\7\20\0P4\0 \0\7\0(\0\32\0\31\0\0\0\0p\24\1\0\0\24\1\0\0\24\1\0\0\30\0\0\0\30\0\0\0\4\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\300\325\0\0\300\325\0\0\5\0\0\0\0\0\1\0\1\0\0\0\300\325\0\0\300\325\1\0\300\325\1\0\200\1\0\0\220\3\0\0\6\0\0\0\0\0\1\0\2\0\0\0,\1\0\0,\1\0\0,\1\0\0\360\0\0\0\360\0\0\0\7\0\0\0\4\0\0\0P\345tdp\311\0\0p\311\0\0p\311\0\0\254\2\0\0\254"..., 4096) = 4096
13935 old_mmap(NULL, 122880, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aabe000
13935 old_mmap(0x2aabe000, 54720, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2aabe000
13935 old_mmap(0x2aadb000, 1856, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd000) = 0x2aadb000
13935 close(3)                          = 0
13935 munmap(0x2aaae000, 4096)          = 0
13935 open("/usr/lib/freetz/libc.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
13935 open("/mod/lib/libc.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
13935 open("/lib/libc.so.0", O_RDONLY)  = 3
13935 fstat(3, {st_mode=S_IFREG|0755, st_size=418588, ...}) = 0
13935 old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x2aaae000
13935 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\10\0\1\0\0\0000\257\0\0004\0\0\0\324_\6\0\7\20\0P4\0 \0\n\0(\0\25\0\24\0\6\0\0\0004\0\0\0004\0\0\0004\0\0\0@\1\0\0@\1\0\0\5\0\0\0\4\0\0\0\3\0\0\0\260K\6\0\260K\6\0\260K\6\0\30\0\0\0\30\0\0\0\4\0\0\0\4\0\0\0\0\0\0pt\1\0\0t\1\0\0t\1\0\0\30\0\0\0\30\0\0\0\4\0\0\0\4\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 L\6\0 L\6\0\5\0\0\0\0\0\1\0\1\0\0\0\224M\6\0\224M\7\0\224M\7\0x\21\0\0\354"..., 4096) = 4096
13935 old_mmap(NULL, 507904, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aadc000
13935 old_mmap(0x2aadc000, 412704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x2aadc000
13935 old_mmap(0x2ab50000, 7948, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x64000) = 0x2ab50000
13935 old_mmap(0x2ab52000, 21888, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ab52000
13935 close(3)                          = 0
13935 munmap(0x2aaae000, 4096)          = 0
13935 open("/mod/lib/libc.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
13935 open("/lib/libc.so.0", O_RDONLY)  = 3
13935 fstat(3, {st_mode=S_IFREG|0755, st_size=418588, ...}) = 0
13935 close(3)                          = 0
13935 stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=21528, ...}) = 0
13935 mprotect(0x2ab50000, 4096, PROT_READ) = 0
13935 mprotect(0x2aabc000, 4096, PROT_READ) = 0
13935 ioctl(0, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
13935 ioctl(1, TIOCNXCL, {B38400 opost isig icanon echo ...}) = 0
13935 fork()                            = 13936
13935 exit(0)                           = ?
root@fritz:/var/mod/root#

Es ist der originale Kernel, ich baue bis morgen mal mit dem scall-32 Kernel Patch. Das war übrigens das AVM-strace, ich versuche es auch noch mit dem freetz-strace.
 
Zuletzt bearbeitet:
So wie es aussieht, läuft printserv, aber das Web-Interface beendet sich nicht. Es kann gut sein, dass es an den offenen Dateien liegt.
Schau mal, ob das hilft:
Code:
close (0);
close (1);
close (2);
open ("/dev/null", O_RDWR);
dup (0);
dup (0);

Wenn Du strace mit Option -f aufgerufen hast, dann ist schon mal die Frage geklärt, ob die Option -f mit dem original Kernel funktioniert.

Noch ein Tipp zu lsof:
Code:
lsof -c print
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.