Jak ustawić drukarkę używającą AppleTalk Autor: Werner Eugster, eugster@giub.unibe.ch WWeerrssjjaa ppoollsskkaa:: BBaarrttoosszz MMaarruusszzeewwsskkii BB..MMaarruusszzeewwsskkii@@zzssmmeeiiee..ttoorruunn..ppll v1.01, 26 Lipca 1997 Jako użytkownik Linux-a chcesz mieć dostęp do drukarek Mac-a takich jak LaserWriter siedzących na sieci z kontrolerem EtherTalk. Jako użytkownik Mac-a chcesz mieć dostęp do wszystkich drukarek na Linux- ie. Aby ustawić taki serwis na Linux-ie musisz postępować według tej samej procedury w obu przypadkach. Po skompilowaniu i zainstalowaniu oprogramowania AppleTalk nneettaattaallkk (jeśli tego nie zrobiłeś, to przeczytaj najpierw Podręcznik instalacji atalk napisany przez AAnnddeerrssaa BBrroowwnnwwoorrtthhaa) pewnie już uruchomiłeś wszystkie demony poprzez rc.atalk w swoim katalogu /etc. Ale najpierw upewnij się, że serwis AppleTalk rzeczywiście działa zanim zaczniesz konfigurować drukarki. Ja używam netatalk w wersji 1.3.3 z łatami opisanymi w Przewodniku instalacyjnym Andersa Brownwortha. Powiedziano mi, że ścieżka do filtrów netatalk zmieniła się w nowszych wersjach. 11.. MMoojjaa ssttrreeffaa AApppplleeTTaallkk.. Napisz /usr/local/atalk/bin/getzones, aby sprawdzić czy wszystkie strefy AppleTalk są widziane przez Linux-a. Powinieneś widzieć przynajmniej jedną nazwę, która jest twoją strefą lokalną, w innym przypadku bardzo prawdopodobne jest, że twój serwis AppleTalk nie działa poprawnie. Ja dostaję coś takiego (tylko kilka pierwszych linii): Pingo$ /usr/local/atalk/bin/getzones | more VLSB LSB-Integrative Biology LSB-Biology Library LSB-Herbaria LSB-UCMP LSB-MVZ Vanishing Packets MIP Barker Hall Przy pomocy opcji dowiesz się która jest twoją strefą: Pingo$ /usr/local/atalk/bin/getzones -m VLSB Pingo$ Tak więc moją strefą lokalną jest VLSB, kompletną listę wszystkich lokalnych stref można uzyskać przy pomocy opcji -l (w razie gdy twoja drukarka nie jest w twojej strefie musisz znać dokładną nazwę strefy). 22.. DDoowwiieeddzz ssiięę jjaakkaa jjeesstt nnaazzwwaa ddrruukkaarrkkii.. Jeśli chcesz tylko, aby lokalna drukarka UNIX-owa była dostępna dla klientów AppleShare, to przeskocz tę sekcję i idź do ``sekcji nr 3''. Najpierw musimy się dowiedzieć jak są zdefiniowane nazwy Internetowe w AppleTalk. Jest to bardzo podobne do tego co znasz ze swojego Linux-a. Nazwy występują w formie: objekt:typ@strefa. Jeśli nie zależy ci na nazwie strefy lokalnej to użyj @*. Tak więc, aby znaleźć wszystkie objekty w twojej strefie, napisz /usr/local/atalk/bin/nbplkup, co wypluje wielką listę, z elementami jak ten: Pingo$ /usr/local/atalk/bin/nbplkup |more Sun ValleyUs Macintosh:Macintosh IIsi 12398.245:253 Sun ValleyUs Macintosh:Workstation 12398.245:4 IB Instructional Support: Power Macintosh 12398.196:253 IB Instructional Support:Workstation 12398.196:4 centris 660AV: Macintosh 12398.51:253 centris 660AV:Workstation 12398.51:4 Chapin Lab vx - JoeC:Macintosh IIvx 12398.101:253 Chapin Lab vx - JoeC:Workstation 12398.101:4 Pingo Mac Printer:LaserWriter 12398.164:129 Pingo Default Printer:LaserWriter 12398.164:128 Pingo:AFPServer 12398.164:130 Pingo:netatalk 12398.164:4 Pingo:Workstation 12398.164:4 Lucicutia:AFPServer 12398.123:248 Theobald Chapin, III:LaserWriter 12398.73:191 Jeśli chcesz znać tylko objekty konkretnego typu jak LaserWriter, musisz użyć /usr/local/atalk/bin/nbplkup :LaserWriter. Upewnij się, że wstawiłeś dwukropek, który oznacza, że chcesz znać tylko objekty typu LaserWriter. Słowo nie może zawierać dużych liter, ale nie możesz ominąć spacji. Tak więc, żeby zobaczyć Macintosh IIvx musisz wstawić nazwę typu w cudzysłowia: Pingo$ /usr/local/atalk/bin/nbplkup :"Macintosh IIvx" Chapin Lab vx - JoeC:Macintosh IIvx 12398.101:253 Pingo$ Dobra. Krótko: Chcę móc drukować z mojego Linux-a na LaserWriter o nazwie Theobald Chapin, III. Zanim spróbujesz ustawić printcap dla kolejki tej drukarki, upewnij się czy masz dostęp do tej drukarki. Napisz /usr/local/atalk/bin/papstatus -p "Theobald Chapin, III" (zauważ, że cudzysłowia służą tylko temu, aby poinformować twoją powłokę, iż Theobald Chaplin, III to jeden argument a nie trzy) i powinieneś otrzymać coś takiego: status: idle Jeśli nie, to sprawdź czy AppleTalk rzeczywiście działa (może demon nie jest uruchomiony ? Sprawdź tak: ps -xa | grep atalkd i ps -xa | grep afpd). Ponieważ LaserWriter spodziewa się PostScriptu, powinieneś mieć pod ręką krótki plik testowy w PostScripcie. Nazwa mojego pliku to: test.eps i mogę go wysłać bezpośrednio do Theobald Chaplin, III uruchamiając klienta drukowania AppleShare: /usr/local/atalk/bin/pap -p "Theobald Chapin, III":LaserWriter@VLSB test.eps Zauważ, że dołaczyłem nazwę strefy tylko po to, żeby się upewnić, że wszystko działa dobrze. Jeśli twoje zadanie drukowania się pojawi (co sekundę - czy jakoś tak - otrzymasz komunikat jeśli ktoś inny używa drukarki w tym samym momencie. Obserwuj odpowiedź twojej drukarki i co robi kiedy zacznie drukować twój plik). Jeśli będziesz miał jakieś kłopoty, użyj aecho, aby sprawdzić objekty AppleTalk w ten sam sposób jakbyś używał ping-a przez TCP/IP (Ctrl-C zatrzymuje aecho): /usr/local/atalk/bin/aecho "Theobald Chapin, III":LaserWriter@VLSB 14 bytes from 12398.73: aep_seq=0. time=15. ms 14 bytes from 12398.73: aep_seq=1. time=14. ms 14 bytes from 12398.73: aep_seq=2. time=14. ms 14 bytes from 12398.73: aep_seq=3. time=14. ms ----12398.73 AEP Statistics---- 5 packets sent, 4 packets received, 20% packet loss round-trip (ms) min/avg/max = 14/14/15 Pingo$ Powinieneś stracić tylko ostatni pakiet przy przerwaniu Ctrl-C, w innym wypadku coś jest nie talk z twoim połączeniem. 33.. UUssttaawwiiaanniiee sseerrwwiissuu ddrruukkoowwaanniiaa nnaa LLiinnuuxx--iiee.. Będą dwa kroki. Najpierw upewnisz się, że możesz drukować na Linux-ie potem upewnisz się, że ta drukarka jest dostępna dla klientów AppleShare. Mówiąc jaśniej: najpierw ustawisz swoją drukarkę, żeby była dostępna dla UNIX-a (lpd - demona drukowania) (sekcja 3.1 do 3.2), a potem udostępnisz ją innym użytkownikom w strefie AppleTalk (sekcja 3.3) co jest oczywiście opcjonalne. Wielu ludzi nie lubi ustawiania z dwóch powodów: drukarka AppleTalk jest już dostepna w strefie AppleTalk, to użytkownicy Mac-ów mogą się do niej bezpośrednio dołączyć. Więc nie ma potrzeby istnienia kolejki na Linux-ie. Jednak ja jestem użytkownikiem Linux-a i chcę mieć dostęp do tej drukarki i dlatego mój poniższy opis robi dokładnie to: pozwala użytkownikowi Linux-a na drukowanie na drukarce AplleTalk. jest drukarką lokalną podłączoną do równoległego portu Linux-a (np. /dev/lp1), to jest kilka zmian w pliku /etc/printcap. Ja pokażę przykład ustawienia z drukarką lokalną, którego nie testowałem, ale dostałem od innego użytkownika. Przeczytaj ``sekcję 3.4'' na ten temat i sprawdź szczegółowe informacje na temat używania Ghostscript-u razem z Netatalk napisane przez Mike'a Pearsona i Billa McGonigle'a. 33..11.. KKoonnffiigguurraaccjjaa ttwwoojjeeggoo //eettcc//pprriinnttccaapp.. Jeśli twoja drukarka może już drukować przy pomocy polecenia Pingo$ lpr -P lp test.eps to możesz przeskoczyć ten pierwszy krok. W innym przypadku stań się "root-em" i idź do katalogu /etc, żeby wyedytować plik printcap. Szczegóły znajdziesz na stronie podręcznika systemowego "man". Ja opiszę tylko jak ustawić LaseWriter, tak żeby działał z poleceniem lpr z Linux-a. Dodaj pozycję dla swojej drukarki do pliku printcap. Ja mam zdefiniowaną tylko LaserWriter i mój plik wygląda tak: lp|Pingo LaserWriter|Theobald Chapin, III:\ :sd=/usr/spool/theobald:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/usr/adm/lpd-errs:\ :if=/usr/local/bin/myif:\ :of=/usr/local/atalk/etc/ofpap: 33..11..11.. nnaazzwwaa ddrruukkaarrkkii ddllaa uużżyyttkkoowwnniikkóóww LLiinnuuxx--aa Pierwsza linia definiuje trzy logiczne nazwy, które nie muszą mieć żadnego podobieństwa do nazw, jakie chcesz nadać tej drukarce w kliencie AppleShare. Dlatego nazwałem ją lp, ponieważ jest to nazwa stosowana w większości UNIX-ów. Inne nazwy stosuję tylko po to, żeby wiedzieć co to właściwie za drukarka. 33..11..22.. kkaattaalloogg zzaaddaańń Potem musisz mieć katalog zadań, gdzie demon będzie składował zadania. Ja nazwałem swój katalog zadań /usr/spool/theobald w tej samej hierarchii co katalog poczty. Pingo$ ls -l drwxrwxr-x 2 root mail 1024 Feb 8 08:46 mail drwxr-xr-x 2 root mail 2048 Feb 8 17:23 mqueue drwxrwxr-x 5 news news 1024 Sep 1 1994 news drwxrwxr-x 2 root lp 1024 Feb 9 13:15 theobald Stwórz go używając mkdir a potem ustaw właściciela (root), grupę (lp) Pingo$ chown root.lp theobald i prawa dostępu Pingo$ chmod 775 theobald Potem stworzyłem dwa pliki: lock i status w tym katalogu: Pingo$ cd theobald Pingo$ touch lock; chown root.root lock; chmod 004 lock Pingo$ touch status; chown root.root status; chmod 664 status teraz możesz zdefiniować ten katalog jako katalog zadań jak ja to zrobiłem w linii 2. 33..11..33.. uurrzząąddzzeenniiee ddrruukkaarrkkii Jeśli twoja drukarka jest lokalną drukarką dołączoną do urządzenia takiego jak/dev/lp1, to to jest urządzenie, którego potrzebujesz. Użyjesz mknod, aby utworzyć to urządzenie jeśli go jeszcze nie ma. Dla drukarki w AppleTalk nie chcesz właściwie drukować do żadnego urządzenia, ale wysłać zadanie do tej drukarki używając programu pap z katalogu /usr/local/atalk/bin. Zrobi się to przy pomocy filtra psf, który uruchomi program pap, aby mieć dostęp do drukarki. Dlatego, po tym jak zadanie zostało wysłane do LaserWriter, jest ono ciągle w Linux-ie, ponieważ demon drukowania lpd ma na samym końcu wysłać to zadania na urządzenie. Dlatego zdefiniujemy urządzenie /dev/null jako urządzenie drukarki, które wyśle twoje zadanie w próżnię (bo chcesz mieć tylko to co się pojawiło na drukarce AppleTalk, prawda?). Dlatego w trzeciej linii wpiszemy :lp=/dev/null:\. Przeczytaj stronę podręcznika systemowego na temat psf, jeśli masz więcej niż jedną drukarkę AppleTalk i jeśli masz problemy z używaniem urządzenia /dev/null jako urządzenia drukarki. 33..11..44.. rroozzmmiiaarr ssttrroonnyy,, mmaakkssyymmaallnnyy rroozzmmiiaarr pplliikkuu ii nnaaggłłóówweekk Użyj pól pl i pw dla określenia długości strony (linie) i szerokości (znaki). Polem mx możesz zdefiniować maksymalny rozmiar pliku drukowanego. Jeśli plik jest większy, demon drukarki obetnie go, albo odmówi drukowania. Jeśli ustawisz tę wartość na 0 (mx#0), oznacza to, iż można drukować pliki o nieograniczonych rozmiarach. Uważaj, bo przypadkowo papier może się skończyć jeśli nikt się nie będzie o to troszczyć. A twoja głodna drukarka będzie wołać o papier ! Tak więc radzę nie ustawiać pola mx na 0 jeśli skończyłeś już testować i wszystko jest w porządku. Polem sh możemy zabronić drukowania strony początkowej (z identyfikatorem właściciela itp.) Polem sf możemy zabronić drukowania feed forms. 33..11..55.. zzaappiissyywwaanniiee bbłłęęddóóww Ja zdefiniowałem do tego celu plik /usr/adm/lpd-errs. Będziesz musiał stworzyć ten plik samemu (np. poleceniem touch /usr/adm/lpd-errs) 33..11..66.. ffiillttrryy TToo jjeesstt wwaażżnnee !! Jak już to opisałem, twoje zadanie zostanie wysłane do drukarki AppleTalk tylko jeśli zainstalujesz odpowiedni filtr, który uruchomi program, pap. Pakiet netatalk używa konceptu hackerskiego, używając filtru psf, ale z różnymi dołączeniami do niego. psf analizuje nazwę tego dołączenia, aby dowiedzieć się, czy ma uruchomić pap jeśli podłańcuch jest w nazwie dołączenia, i odwrócić kolejność drukowania jeśli w nazwie jest rev. Spójrz na to wydając polecenie: Pingo$ ls -l /usr/local/atalk/etc lrwxrwxrwx 1 root root 3 Feb 8 14:44 ifpap -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 ifpaprev -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 ofpap -> psf -rwxr-xr-x 1 root root 49299 Feb 8 14:44 papd -rw-r--r-- 1 root root 35 Feb 9 13:48 papd.conf -rwxr-xr-x 1 root root 11395 Feb 8 14:44 psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 tfpap -> psf lrwxrwxrwx 1 root root 3 Feb 8 14:44 tfpaprev -> psf Pingo$ Tak więc filtr o nazwie ifpap uruchomi pap, ifpaprev odwróci kolejność stron i uruchomi pap. Zamienia on zwykły tekst na PostScript, tak żebyś nie skończył na komunikacie z błędem. Jedyny filtr jaki musisz zainstalować to of: :of=/usr/local/atalk/etc/ofpap: gdzie /usr/local/bin/myif jest prostym skryptem powłoki, który pozwala mi na przerywanie linii w tekście, które zostały zapisane programem, który automatycznie łamie linie (bp. textedit). Niestety filtr psf nie robi nic takiego i ignoruje ustawienia szerokości papieru. Ja napisałem swój własny filtr linebreak.c , który robi to dla mnie i umieść następujące linie w "myif": #!/bin/sh /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $* Jeśli w ten sposób ustawisz filtr tekstowy, to linbreak będzie uważał tylko na szerokość strony (ustawioną pw), podczas gdy ifpap (psf) sprawdza tylko długość. Wygląda na to, że psf zakłada, że pierwsza linia to 0, tak więc ustaw pl#63 jeśli chcesz mieć 64 linii na stronie. Jeśli nie chcesz łamania linii, to po prostu umieść linię: :if=/usr/local/atalk/etc/ifpap:\ Teraz zapisz swój nowy printcap. Jeśli spróbujesz teraz coś wydrukować, dowiesz się, że jeszcze nie działa, więc czytaj następny paragraf. Jak wspomniałem wcześniej, UNIX-owa nazwa drukarki w printcapie nie ma odpowiednika dla nazwy drukarki w AppleTalk. Musisz stworzyć plik .paprc w swoim katalogu zadań, który będzie zawierał adres drukarki w AppleTalk. Jest to tylko jedna linia. Zauważ, że nie musiałem umieszczać nazwy drukarki w cudzysłowia w tym pliku, ale inni piszą mi, że u nich to działało tylko z cydzysłowami. To spróbuj najpierw bez cydzysłowów: Pingo$ cat /usr/spool/theobald/.paprc Theobald Chapin, III:LaserWriter@VLSB To teraz możesz zaczynać. Jeśli dostaniesz komunikat o błędzie jak np. "Turing:LaserWriter@Tech Support": NBP wtedy spróbuj z cudzysłowami. Może być też tak, że musisz wstawić tylko nazwe przed dwukropkiem w cudzysłowa, tak: "Theobald Chapin, III":LaserWriter@VLSB. Jeśli masz jeszcze jakieś problemy, to myśl i kombinuj ;) NIe znam żadnego uniwersalnego sposobu na rozwiązanie tego problemu. Więcej na temat hackowania i różnych obejść z filtrami znajdziesz w sekcji ``Znane problemy''. 33..22.. PPrrzzeetteessttuujj ddrruukkaarrkkęę.. Najpierw sprawdź czy demon drukarki jest rzeczywiście uruchomiony: Pingo$ ps -xa | grep lpd 45 ? SW 0:00 (lpd) 346 pp0 D 0:00 grep lpd Pingo$ Spróbuj wydrukować plik w PostScripcie i plik tekstowy, żeby się przekonać, że wszystko działa. Przypuszczalnie musisz zrestartować demona poleceniem lpc. Uruchom lpc i napisz restart lp, down lp i up lp. Potem sprawdź status: lpc> status lp: queuing is enabled printing is enabled no entries no daemon present lpc> lpc> quit Teraz wydrukuj swój plik poleceniem Pingo$ lpr -P lp filename Jeśli wszystko jest w porządku, to plik status w katalogu zadań powienien teraz zawierać najświeższe informacje na temat twojej drukarki: Pingo$ cat /usr/spool/theobald/status job: Paul; status: busy; source: LocalTalk Pingo$ 33..33.. SSkkoojjaarrzz ttęę ddrruukkaarrkkęę zz jjaakkąąśś nnaazzwwąą ddllaa AApppplleeTTaallkk.. Jeśli teraz pójdziesz do Mac-a i spróbujesz wybrac swoją nową drukarkę dowiesz się, że pokaże się ona z nazwą twojego serwera Linux-owego. To może nie być zbyt zadowalające, dlatego musisz stworzyć, albo wyedytować plik papd.conf w katalogu etc AppleTalk, /usr/local/atalk/etc/papd.conf (przeczytaj "man papd" jeśli chcesz znać więcej szczegółów). Minimum tego co musisz zrobić to umieszczenie w tym pliku nazwy jaką chcesz nadać drukarce, a na końcu dopisz :\ tak jak w printcap-ie. W drugiej linii podajesz nazwę jaką ta drukarka ma w Linux-ie opcją pr. Mój plik wygląda tak: Pingo$ cat /usr/local/atalk/etc/papd.conf Pingo Mac LaserWriter:\ :pr=lp: Pingo$ Oznacza to, że (domyślna) zmienna lp zawiera nazwę: Pingo Mac LaserWriter dla klienta AppleShare. Dowiesz się również, że teraz użytkownik na Mac-u może drukować bezpośrednio na drukarce Theobald Chaplin III jak i poprzez Linux-a, gdzie nazwa drukarki to Pingo Mac LaserWriter. Dla mnie jest ważne, aby móc drukować bezpośrenio na tej drukarce, a podczas pracy na Mac-u drukowanie poprzez Linux-a wydaje się o wiele szybsze, ponieważ Linux zkolejkuje zadanie i zniknie ono natychmiast z mojego desktopu. Jeśli chcesz zarejestrować swoją drukarkę w jakiejś strefie AppleTalk (nie w domyślnej strefie), po prostu podajesz tę strefę wraz z rozszerzeniem @nazwa_strefy w pliku papd.conf: MotorsLab@EEAP:\ :pr=ee3rd: 33..44.. JJaakkaa jjeesstt rróóżżnniiccaa mmiięęddzzyy llookkaallnnąą ddrruukkaarrkkąą ppooddłłąącczzoonnąą ddoo kkoommppuutt­­ eerraa LLiinnuuxx--oowweeggoo?? Ta sekcja nie jest jeszcze całkiem gotowa !!! /etc/princap: lp:lp=/dev/lp1:sd=/usr/spool/lp1:sh /usr/local/atalk/etc/papd.conf: HP LJIIIp:\ :pr=lp:\ :pd=/usr/local/atalk/etc/HP_LaserJet_IIIP.ppd: Sprawdź szczegóły na stronie Używanie ghostscript-a wraz z Netatalk . 44.. RRoozzwwiiąązzyywwaanniiee pprroobblleemmóóww.. 44..11.. OOggóóllnnaa ssttrraatteeggiiaa.. Jeśli masz jakieś problemy podczas drukowania, nawet jeśli działało kiedy wszystko ustawiałeś tak jak opisałem, to spójrz do /usr/adm/mesaages (albo do /usr/log/messages albo /var/log/messages - przyp. tłum.) oraz do /usr/adm/syslog (patrz poprzednia uwaga). Jeśli tylko spróbujesz coś wydrukować używając filtru psf, to znajdziesz podobne linie w wymienionych wyżej plikach: Feb 12 17:47:52 Pingo ofpap[1443]: starting for ? Feb 12 17:47:52 Pingo ofpap[1443]: sending to pap[1444] Feb 12 17:47:52 Pingo ofpap[1443]: straight text Feb 12 17:47:59 Pingo ofpap[1443]: 1444 done Feb 12 17:47:59 Pingo ofpap[1443]: pausing Feb 12 17:48:01 Pingo ifpap[1447]: starting for ? Feb 12 17:48:01 Pingo ifpap[1447]: sending to pap[1448] Feb 12 17:48:01 Pingo ifpap[1447]: straight text Feb 12 17:48:09 Pingo ifpap[1447]: 1448 done Feb 12 17:48:09 Pingo ofpap[1443]: restarting Feb 12 17:48:09 Pingo ifpap[1447]: done Feb 12 17:48:09 Pingo ofpap[1443]: done Feb 12 18:00:46 Pingo ofpap[1481]: starting for ? Feb 12 18:00:46 Pingo ofpap[1481]: sending to pap[1482] Feb 12 18:00:46 Pingo ofpap[1481]: straight text Feb 12 18:00:51 Pingo ofpap[1481]: 1482 done Feb 12 18:00:51 Pingo ofpap[1481]: pausing Feb 12 18:00:52 Pingo ifpap[1485]: starting for ? Feb 12 18:00:52 Pingo ifpap[1485]: sending to pap[1486] Feb 12 18:00:52 Pingo ifpap[1485]: straight text Feb 12 18:00:57 Pingo ifpap[1485]: 1486 done Feb 12 18:00:57 Pingo ofpap[1481]: restarting Feb 12 18:00:57 Pingo ofpap[1481]: done Feb 12 18:00:57 Pingo ifpap[1485]: done Jeśli coś nie działa, otrzymasz komunikat w /usr/adm/syslog jak ten: Feb 12 10:04:59 Pingo papd[70]: No such printer: "lp" Feb 12 10:04:59 Pingo papd[70]: printcap problem: "lp" (twoja domyślna zmienna lp nie jest zdefiniowana) Feb 12 17:02:21 Pingo ofpap[1149]: 1150 died with 1 Feb 12 17:02:21 Pingo lpd[1148]: lp: output filter died (1) Feb 12 17:02:26 Pingo lpd[1148]: lp: Daemon filter 'f' terminated (11) Feb 12 17:04:48 Pingo lpd[1195]: lp: Daemon filter 'f' terminated (11) Feb 12 17:08:03 Pingo lpd[1216]: lp: Daemon filter 'f' terminated (11) Feb 12 17:10:00 Pingo lpd[1228]: cannot execv /usr/local/bin/linebreak|/usr/local/atalk/ifpap Feb 12 17:11:51 Pingo lpd[1244]: /usr/adm/lpd-errs: No such file or directory (/etc/printcap nie akceptuje strumieni w definicji if; oto dlaczego używałem skryptu /usr/local/bin/myif. Zapomniałem także stworzyć pliku /usr/adm/lpd-errs, który zdefiniowałem w /etc/printcap) 44..22.. NNiieezznnaannee pprroobblleemmyy Najpierw przeczytaj sekcję o ``Znanych problemach''. Jeśli nie będzie tam nic pomocnego dla ciebie, to wyślij do mnie list i dołącz do niego pliki /etc/printcap oraz /usr/local/atalk/etc/papd.conf. nnbbppllkkuupp ppookkaazzuujjee nnaazzwwęę ddrruukkaarrkkii ii jjeejj aaddrreess,, aallee jjaa nniiee ddoossttaajjęę żżaaddnneejj ooddppoowwiieeddzzii zz pprrooggrraammuu ppaappssttaattuuss oodd tteejj ddrruukkaarrkkii.. 44..33.. ZZnnaannee pprroobblleemmyy.. Dostaję dużo listów od ludzi, którzy mają problemy, więc umieszczę tutaj rozwiązania dla wszystkich. Będzie to rosnąca, nieposortowana lista. Po prostu sprawdź czy twój problem jest tu opisany. 44..33..11.. nniiee mmaa wwyyddrruukkuu zzwwyykkłłeeggoo pplliikkuu tteekkssttoowweeggoo Sprawdź czy nie masz w pliku /usr/adm/lpd-errs czegoś takiego: unprintable character (0x9a)! Jest to problem dotyczący psf, filtru użytego do drukowania. Zlokalizuj plik psf.c w swojej dystrybucji netatalk i uczyń go zapisywalnym chmod 644 psf.c Zlokalizuj drugą linię, w której jest łańcuch unprintable character. Pierwsze wystapienie (z dwóch) powino być w linii 402 a drugie - w 496 lub podobnie. Druga linia to jest przypuszczalnie ta, która ci sprawia kłopoty. Zamień if ( !isascii( *p ) || !isprint( *p )) { if ( !literal ) { fprintf( stderr, "unprintable character (0x%x)!\n", (unsigned char)*p ); return( 2 ); /* Toss job */ } printf( "\\%o", (unsigned)*p ); na if ( !isascii( *p ) || !isprint( *p )) { if ( !literal ) { fprintf( stderr, "unprintable character (0x%x) converted to ?!\n", (unsigned char)*p ); /* return( 2 );*/ /* Toss job */ putchar( '?' ); /* Don't toss job! */ } else{ printf( "\\%o", (unsigned)*p ); } Teraz napisz "make" w wierszu poleceń w katalogu netatalk (nie w tym, w którym jest psf.c, bo make nie będzie w tym przypadku znało ścieżki do pap !). Potem skopiuj nowe psf do odpowiedniego katalogu (/usr/local/atalk/etc). To co się dzieje to: program zamienia niedrukowalny znak na znak "?" i nie przerywa pracy. Może ktoś ma lepszy pomysł na to jak przekonwertować niedrukowalny znak na jego odpowiednik w PostScripcie ? Ale jeśli to będziesz robił, to uważaj na prawa autorskie w psf ! 44..33..22.. nniiee mmaa uummllaauuttóóww,, aannii zznnaakkóóww nnaarrooddoowwyycchh Jak właśnie wyżej wspomniałem, psf nie obsługuje rozszerzonych zbiorów znaków. Ale nenscript to potrafi. Ale ponieważ nie jest to filtr, który mógłby zostać użyty bezpośrednio w printcap-ie, będziesz musiał to obejść. Ja mam zdefiniowaną dodatkową drukarkę, która obsługuje zwykły tekst używając nenscriptu. /etc/printcap wygląda tak: # # Apple LaserPrinter Select 360 on AppleTalk: # lp|Pingo LaserWriter|Theobald Chapin, III:\ :sd=/usr/spool/theobald:\ :lp=/dev/null:\ :pl#61:\ :pw#80:\ :mx#0:\ :sh:\ :sf:\ :lf=/var/adm/lpd-errs:\ :if=/usr/local/bin/myif:\ :of=/usr/local/atalk/etc/ofpap: # # Special setup for plain text files, to convert to PostScript using nenscript # instead of psf (which doesn't process the whole ISO characterset) # text:\ :sd=/usr/spool/textprinter:\ :lp=/dev/null:\ :mx#0:\ :sh:\ :sf:\ :lf=/var/adm/lpd-errs:\ :of=/usr/local/bin/textfilter: /usr/local/bin/textfilter jest skryptem w powłoce: #!/bin/sh /usr/bin/nenscript -P lp -2 -r -T US -i "Werner Eugster" Niestety nie znalazłem sposobu na zachowanie nazwy pliku do drukowania i dlatego używam opcji -i z moim nazwiskiem, żeby oznaczyć wydruk. Może znajdziesz jakiś lepszy sposób używając np. Unix-owej zmiennej środowiskowej z loginem. W tym ustawieniu otrzymuję tekst na papierze w układzie poziomym (opcja -r) w dwóch kolumnach (-2) wysłany na standardową drukarkę lp. Aby wydrukować zwykły plik tekstowy używam polecenia lpr -P text plain.txt Tak więc przede wszystkim, drukarka zdefiniowana jako text zamienia zwykły tekstowy plik na PostScript używając nenscript (który obsługuje pełen zestaw znaków ISO), ktory przekazuje go dalej do drukarki zdefiniowanej jako lp. Przez to, używając polecenia lpq zobaczysz, że zadanie drukowania pojawi się przy drukarce lp i przychodzącego ze standardowego wejścia, co jest poprawne. Jeśli ktoś zna jakiś sposób, żeby umieścić na wydruku nazwę pliku, to będę bardzo wdzięczny za tę informację ! 44..33..33.. mmoojjee uussttaawwiieenniiaa ddłłuuggoośśccii ii sszzeerrookkoośśccii ssttrroonnyy ssaa iiggnnoorroowwaannee To był mój błąd. Sprawdź część powyżej, gdzie opisuję myif. Musisz dodać $* dwa razy w drugiej linii w pliku, która teraz wygląda tak: #!/bin/sh /usr/local/bin/linebreak $* | /usr/local/atalk/etc/ifpap $* 44..33..44.. zzaaddaanniiee jjeesstt wwyyssłłaannee ddoo ddrruukkaarrkkii,, aallee nniiee zzoossttaajjee wwyyddrruukkoowwaannee Jest wiele takich problemów. Jeden, o którym dowiedziałem się od Paolo Supino to ten: _"_P_o_d_c_z_a_s _k_r_ó_t_k_i_e_j _i_n_s_p_e_k_c_j_i _w_y_d_r_u_k_u _z _n_b_p_l_k_u_p _(_ż_e_b_y _z_o_b_a_c_z_y_ć _c_z_y _s_ą _t_a_k _j_a_k_i_e_ś _d_z_i_w_n_e _r_z_e_c_z_y_)_, _z_o_b_a_c_z_y_ł_e_m_, _ż_e _n_a_s_z_a _d_r_u_k_a_r_k_a _n_a _s_i_e_c_i _m_a _t_e_n _s_a_m _n_u_m_e_r _c_o _s_e_r_w_e_r _N_T _(_k_t_ó_r_y _k_o_l_e_j_k_u_j_e _z_a_d_a_n_i_a _z _P_C_-_t_ó_w_)_. _T_o _b_y_ł_o źźllee. 1. Serwer NT jest bbaarrddzzoo złym spoolerem. 2. Powinien on kolejkować tylko maszyny Windows-owe. 3. Pomimo tego, iż nie miał on przechwytywać wszystkiego co przez niego przeszło - on to robił. _R_o_z_w_i_ą_z_a_n_i_e_: _W_y_ł_ą_c_z_y_ć _z_u_p_e_ł_n_i_e _s_e_r_w_e_r _d_r_u_k_o_w_a_n_i_a _d_l_a _M_a_c_-_ó_w _n_a _N_T_. _W_y_e_d_y_t_o_w_a_ć _p_l_i_k .paprc _w _k_a_t_a_l_o_g_u _z_a_d_a_ń _t_a_k_, _ż_e_b_y _w_s_k_a_z_y_w_a_ł _o_n _b_e_z_p_o_ś_r_e_d_n_i_o _n_a _d_r_u_k_a_r_k_ę_. _Z_r_e_s_t_a_r_t_o_w_a_ć _k_o_m_p_u_t_e_r_, _ż_e_b_y _m_u _s_i_ę _p_a_m_i_ę_c _o_d_ś_w_i_e_ż_y_ł_a_. 44..33..55.. mmoojjaa ddrruukkaarrkkaa nniiee bbiieerrzzee ppaappiieerruu zz tteeggoo zzaassoobbnniikkaa,, zz kkttóórreeggoo jjaa cchhccęę Domyślnie wszystko jest drukowane na papierze ze standardowego zasobnika. Jeśli chcesz tak ustawić drukarkę, aby brała papier z innego zasobnika niż ze standardowego, to spróbuj tego: Zmodyfikuj swój plik /usr/local/bin/myif i przepuść wszystko przez program awk, czy jakiś inny, który potrafi zapisać dodatkową linię do strumienia po nagłówku. Np. Ja spróbowałem tak: #!/bin/sh /usr/local/bin/linebreak $* | awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $* (upewnij się, że nie ma fizycznych łamań linii w linii drugiej). papier z podajnika ręcznego. Dla innych podajników zamień tekst w cuszysłowach ("statusdict begin /manualfeed true store end\n") na odpowiednie polecenie z tej listy: Podajnik | Polecenie PostScriptu ------------------+--------------------------------------------------- przedni | "statusdict begin 0 setpapertray end" | tylny | "statusdict begin 1 setpapertray end" | automatyczny | "statusdict begin /manualfeed true store end" Polecenia PostScriptu do zdefiniowania wyjściowych "szufladek": Szufladka | Polecenie PostScriptu ------------------+--------------------------------------------------- górna | "0 statusdict /setoutputtray get exec" | dolna | "1 statusdict /setoutputtray get exec" Oczywiście jeśli chcesz zdefiniować podajnik wejściowy ii szufladkę wyjściową, to musisz wstawić dwie linie do pliku PostScriptowego. Chociaż to działa dla wejścia, które już jest PostScriptem. Jeśli chcesz to osiągnąć dla tekstu, który jest dopiero zamieniany na PostScript, to musisz zmodyfikować plik psf.c i skompilować nowy filtr psf. (nie zapomnij zainstalować go w katalogu /usr/local/atalk/etc !). Wszystko co musisz zrobić, to znaleźć linię %%!PS-Adobe-2.0 (ok. linii 379, musi to być funkcja textps(). Dodaj nową linię: printf( "statusdict begin /manualfeed true store end\n" ); (i znowu - możesz zamienić tekst w cudzysłowach na ten, który ci odpowiada). Potem skompiluj ponownie psf i zainstaluj go. Davis Goodman skończył na takim skrypcie myif, który sprawdza czy chcesz drukować w rozmiarach listowych czy normalnych. Jeśli jest to normalny, to wykonywane jest polecenie PostScriptu powodujące wybór tylnego podajnika, w innym przypadku papier pobierany jest z podajnika standardowego. #!/bin/sh bounding=`grep BoundingBox $8 | cut -d" " -f5 ` if [ "$bounding" = "" ]; then /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin 1 setpapertray end\n";}else{print}}' | /usr/local/atalk/etc/ifpap $* else /usr/local/atalk/etc/ifpap $* fi To działa z Netscape a twoje własne oprogramowanie może przyjmować inne wartości. Załączyłem ten przykład tylko po to, żeby ci wskazać, gdzie należy zacząć jeśli chcesz robić podobne sztuczki. Jeszcze jeden przykład jest od Tomasa Pospiska, który zdefiniował nazwy drukarek dla różnych podajników w tej samej drukarce w /etc/printcap. Żeby wydrukować na papierze z konkretnego podajnika wysyłasz zadanie na odpowiednią drukarkę. Jego printcap wygląda tak: # LaserWriter Pro 630 (Default Tray) lp:\ :sd=/usr/spool/lp1:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/var/log/lp-errs:\ :if=/usr/lib/atalk/filters/myif:\ :of=/usr/lib/atalk/filters/ofpap: # # LaserWriter Pro 630 (Manual Tray) lpm:\ :sd=/usr/spool/lpm:\ :lp=/dev/null:\ :pl#63:pw#85:\ :mx#0:\ :sh:sf:\ :lf=/var/log/lp-errs:\ :if=/usr/lib/atalk/filters/myif_manual:\ :of=/usr/lib/atalk/filters/ofpap: a filtr myif wygląda tak: #!/bin/sh /usr/bin/awk '{if(NR==1&&$1~"%!"){print;print "statusdict begin /manualfeed true store end\n";}else{print}}' | /usr/lib/atalk/filters/ifpap $* Jak dotąd dostałem konstruktywne komentarze i pytania od ludzi z COM domena 11 EDU (USA) 12 US domena (USA) 1 GOV domena USA 2 NET domena 1 Australia 1 Austria 2 Belgia 1 Francja 2 Niemcy 5 Islandia 1 Włochy 3 Japonia 1 Holandia 1 Portugalia 2 Wileka Brytania 1 Szwajcaria 1 Š 13 Marca 1997 Werner Eugster (eugster@giub.unibe.ch) 55.. OOdd ttłłuummaacczzaa.. Tłumaczenie to jest chronione prawami autorskimi Š Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny. Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne, składniowe, techniczne to pisz do mnie: B.Maruszewski@zsmeie.torun.pl Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/ Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże stronie. Dostępne są także poprzez anonimowe ftp pod adresem ftp.ippt.gov.pl w katalogu /pub/Linux/JTZ/. Przetłumaczone przeze mnie dokumenty znajdują się także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej. Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz sie na nią zapisać, to wyślij list o treści subscribe jtz Imię Nazwisko na adres listproc@ippt.gov.pl