Jak ustawiæ drukarkê używającą AppleTalk

Autor: Werner Eugster, eugster@giub.unibe.ch
Wersja polska: Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl
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 netatalk (jeśli tego nie zrobiłeś, to przeczytaj najpierw Podrêcznik instalacji atalk napisany przez Andersa Brownwortha) 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.

1. Moja strefa AppleTalk.

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).

2. Dowiedz siê jaka jest nazwa drukarki.

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.

3. Ustawianie serwisu drukowania na Linux-ie.

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:
(1) Jeśli 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.
(2) Jeśli twoja drukarka 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.

3.1 Konfiguracja twojego /etc/printcap.

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:

nazwa drukarki dla użytkowników Linux-a

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.

katalog zadañ

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.

urządzenie drukarki

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.

rozmiar strony, maksymalny rozmiar pliku i nagłówek

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.

zapisywanie błêdów

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)

filtry

To jest ważne ! 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.

3.2 Przetestuj drukarkê.

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$ 

3.3 Skojarz tê drukarkê z jakąś nazwą dla AppleTalk.

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:

3.4 Jaka jest różnica miêdzy lokalną drukarką podłączoną do komputera Linux-owego?

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.

4. Rozwiązywanie problemów.

4.1 Ogólna strategia.

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)

4.2 Nieznane problemy

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.

nbplkup pokazuje nazwê drukarki i jej adres, ale ja nie dostajê żadnej odpowiedzi z programu papstatus od tej drukarki.

4.3 Znane problemy.

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.

nie ma wydruku zwykłego pliku tekstowego

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 !

nie ma umlautów, ani znaków narodowych

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ê !

moje ustawienia długości i szerokości strony sa ignorowane

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 $*

zadanie jest wysłane do drukarki, ale nie zostaje wydrukowane

Jest wiele takich problemów. Jeden, o którym dowiedziałem siê od Paolo Supino to ten:

"Podczas krótkiej inspekcji wydruku z nbplkup (żeby zobaczyæ czy są tak jakieś dziwne rzeczy), zobaczyłem, że nasza drukarka na sieci ma ten sam numer co serwer NT (który kolejkuje zadania z PC-tów). To było źle.
1. Serwer NT jest bardzo 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ł.

Rozwiązanie: Wyłączyæ zupełnie serwer drukowania dla Mac-ów na NT. Wyedytowaæ plik .paprc w katalogu zadañ tak, żeby wskazywał on bezpośrednio na drukarkê. Zrestartowaæ komputer, żeby mu siê pamiêc odświeżyła.

moja drukarka nie bierze papieru z tego zasobnika, z którego ja chcê

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).
A informuje to drukarkê o tym, że ma wziąæ 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 i 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)

5. Od tłumacza.

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