- předchozí článek - následující článek - obsah - úvodní stránka -

Linuxové noviny 07/98

Fax na trojaký spôsob

Ing. Róbert Dobozy, 9. júla 1998

V tejto kuchárke si povieme niečo o tom, ako pripraviť pre našich používateľov server, ktorý im umožní posielať, prijímať a prezerať faxy. Krok po kroku si povieme ako skompilovať, nainštalovať a nakonfigurovať príslušný softvér. Táto kuchárka je určená hlavne pre tých, ktorí ešte nemajú faxový server nainštalovaný, ale niektoré perličky tu hádam nájdu aj ostrieľaní "faxisti".

Takže čo potrebujeme na prípravu faxového servera? Je to samozrejme linuxový (unixový) server, class 2 alebo 2.0 (veľmi dôležité, viď. ďalej) faxmodem, balíky mgetty+sendfax ftp://alpha.greenie.net/pub/mgetty/source/1.1/, samba http://samba.anu.edu.au/samba/, respond+printfax.pl http://www.boerde.de/~horstf/ a ghostscript http://www.cs.wisc.edu/~ghost/. Keď sa nám podarí všetky tieto veci spolu nainštalovať a nakonfigurovať, tak dostaneme plnohodnotný faxový server, ktorý nám umožní posielať faxy priamo z Unixu ale aj z prostredia MS Windows alebo MacOS. Ďalej budeme môcť faxy prijímať, tlačiť, prezerať, opakovane posielať, archivovať a ďalej spracovávať. Pozn.: Všetky príklady (napr. cesty k súborom) sú robené na RedHat Linuxe 4.2 a 5.0. Preto je možné, že vo vašom Debiane alebo Slackware to bude mierne inak, ale princíp zostáva zachovaný.

Ako to vlastne funguje? Prijímanie faxov je vcelku jednoduché a prebieha nasledovne. Keď k nám niekto zavolá a na druhej strane telefónnej linky je fax, náš faxmodem to rozpozná (toto je jeden z kameňov úrazu) a povie to programu mgetty. Ten zabezpečí, aby sa dané faxové dáta prijali, skontrolovali a po stranách uložili na určené miesto v podobe unixových súborov. Potom mgetty spustí vopred určený program (defaultne /usr/local/bin/new_fax), ktorý zabezpečí ďalšie spracovanie (napr. vytlačenie, založenie do archívu) prijatého faxu. Posielanie faxov je trochu zložitejšie, pretože tu je viacero možností ako to urobiť. Najprv si samozrejme musíme pripraviť stránky, ktoré chceme odfaxovať. Tieto musia byť v niektorom z podporovaných formátov (ps, ascii text, dvi, pbm, pgm, ppm, g3, lj - HP LJ PCL 4 alebo xwd). Keď ich máme, tak ich prostredníctvom príkazu faxspool zaradíme do spoolu, kde si počkajú na odoslanie. Toto bolo na úrovni unixu. Ak chceme faxovať z Windows, tak sa nám to začína komplikovať. Môžme na to využiť SAMBU, kde urobíme tlačiareň na ktorú môžu tlačiť všetky programy, alebo pokiaľ máme Win NT alebo iný systém s podporou unixových tlačiarní (lpd) môžme tlačiť priamo na unixovú tlačiareň, ktorá sa tvári ako fax. My sa budeme zaoberať prvým prípadom, pretože je viac používaný a vcelku ľahko implementovateľný. Takže z nejakého windovsového programu vytlačíme stránky na sambovú tlačiareň, samba to predá príslušnému konverznému programu a potom sa to príkazom faxspool naspooluje a pripraví na odoslanie. Potom sa používateľovi pošle prostredníctvom winpopu správa o tom, že fax bol daný do spoolu. To je všetko pekné, ale niečo tu chýba, nie? Ano, je to telefónne/faxové číslo prijímateľa. V unixe to je jednoduché, dáme ho ako parameter príkazu faxspool. Ale čo Windows? Tu máme zasa dve možnosti. Buď zakomponujeme tel. č. prijímateľa do textu faxu tak, aby nebolo viditeľné (čo napr. v MS Worde nie je problém) a v konverznom programe toto číslo vyextrahujeme. Alebo použijeme špeciálny program s názvom respond, ktorý beží na pracovnej stanici a ktorý si na príkaz konverzného programu vypýta meno a telef. číslo prijímateľa a tieto doplní do volania príkazu faxspool. Nás zaujíma druhá varianta, pretože je systémovejšia a transparentnejšia ako prvá. V prvom prípade predanie tel. č. silne závisí od použitej aplikácie. Predstavte si, že chcete odfaxovať obrázok napr. z programu PaintBrush alebo Corel. Neviem si predstaviť, kam by ste vložili tel.č. tak, aby bolo parsovateľné konverzným programom a zároveň neviditeľné v obrázku. Teraz to zhrniem. Máme tlačiareň v sambe, na ktorú tlačíme faxy, samba spustí konverzný program, ktorý si prostredníctvom démona respond na vašej pracovnej stanici vypýta tel. číslo a identifikáciu prijímateľa a s týmito údajmi potom zavolá príkaz faxspool, ktorý - ako som už napísal - zaradí stránky do spoolu, kde počkajú, kým ich niekto odošle. Ale kto? Tak na to je tu program faxrunq alebo jeho prefíkanejší brat faxrunqd. Faxrunqd beží ako démon a raz za stanovené obdobie prezrie spool a prostredníctvom programu sendfax sa pokúsi odoslať všetky pripravené faxy (preto sa balík volá mgetty+sendfax, to aby ste si nemysleli, že sendfax tam je len na parádu a že nič nerobí). Keď je všetko dokonané, tak faxrunqd môže spustiť success alebo fail program (podľa toho, či fax úspešne odišiel alebo neodišiel vôbec), v ktorom si môžeme nadefinovať vlastné činnosti. My to používame na archiváciu odoslaných faxov. O neúspešnom odoslaní resp. neodoslaní faxu je informovaný fax administrátor, prípadne aj odosielateľ faxu (viď. poslednú časť článku).

Inštalácia a konfigurácia mgetty+sendfax

Poviete si: načo by som to inštaloval a kompiloval, keď mám rpm-ko? Je na to viacero dôvodov. Po prvé, je možné, že novšia verzia podporuje aj váš nový modem. Po druhé, máte tam kompletnú dokumentáciu v rôznych formátoch. Po tretie, máte tam rôzne pekné alebo menej pekné nástroje, príklady a pomocné balíky. No a nakoniec, niektoré parametre sa dajú nastaviť len v čase kompilácie. Našťastie to zvyčajne nie sú kritické parametre a minimálne RedHati (iné, napr. deb balíky som nemal možnosť vyskúšať) ich nastavujú na celkom rozumné hodnoty. Pokiaľ som vás presvedčil o potrebe stiahnutia balíku urobte tak (nemusíte ho kompilovať, stačí keď si pozriete dokumentáciu a pomocné utility a potom si nainštalujete rpm-ko). Pokiaľ som vás nepresvedčil, tak kľudne skočte na časť s názvom konfigurácia. Predtým si ešte pozrite aspoň online nápovedu na http://alpha.greenie.net/mgetty/index.html alebo na http://www.leo.org/~doering/mgetty/index.html.

Inštalácia

Ako prvé balík samozrejme rozbalíme do vhodného adresára (príkazom tar -xvzf). Ako druhý krok si pozrieme súbor README.1st (vždy čítate readme, že :-). Tam sa hneď na začiatku dozvieme odkazy na online nápovedu, ktoré som spomenul o odstavec vyššie. Postup uvedený v tomto súbore si však mierne upravíme. Ako tretí krok si skopírujeme súbor policy.h-dist do súboru policy.h. Zatiaľ nič nemeníme. Potom vojdeme do adresára doc (cd doc) a urobíme make doc_all, čo nám vygeneruje kompletnú dokumentáciu. Pokiaľ chceme len HTML verziu, nahliadnutím do Makefile zistíme, že stačí urobiť len make mgetty.html. Na to, aby sme zo súboru mgetty.texi dostali napr. HTML verziu musíme mať nainštalovaný balík tetex-*.rpm. Pokiaľ ho nemáme a ani nemienime inštalovať, tak si pozrieme online verziu. Teraz doporučujem skopírovať si zaujímavé súbory do iného adresára a urobiť make fullclean. Toto nám zmaže vygenerovanú dokumentáciu (máme ju skopírovanú v inom adresári) a uvedie adresár doc do pôvodného stavu. Veľmi doporučujem, aby ste si dôkladne prečítali v tej skopírovanej dokumentácii v časti "Common problems and solutions" sekciu pre váš modem a použitý operačný systém. Ďalej doporučujem prezrieť si modem.db a veľmi zaujímavé čítanie je aj ttyS-cua.txt. Keď sme všetko pochopili, môžeme pristúpiť k editácii súboru policy.h a podľa nadobudnutých vedomostí nastaviť parametre pre váš modem. Okrem parametrov pre modem sú zaujímavé aj nasledovné premenné:

  • DEVICE_GROUP - defaultne je skupina "modem", ktorá v RedHate neexistuje, preto som tam dal "uucp"

  • SYSLOG - či sa má použiť syslog na zaznamenávanie prevádzky mgetty (doporučujem odpoznámkovať),

  • MGETTY_PID_FILE - v popise parametra je až do verzie 1.1.15 chyba, má tam byť %s a nie %d t.j. napr. pre Red Hat má tento parameter vyzerať takto: /var/run/mgetty.%s

  • FAX_STATION_ID - tel. č. faxu, z ktorého chcete odosielať faxy (bude uvedené v záhlaví stránok)

  • FAX_DIAL_PREFIX - kód, ktorý sa má poslať modemu pri vytáčaní tel. č. pred samotným číslom. Potrebné napr. keď musíte vytočiť nulku pred tým ako dostanete normálny oznamovací signál alebo vtedy keď ste pripojený ešte na starú analógovú tel. ústredňu, ktorá vie len pulznú voľbu (použite ATDP)

  • FAX_MODEM_TTYS - názvy zariadení, na ktorých máte faxmodemy (dúfam, že ste čítali ttyS-cua.txt :-)

Toto boli najdôležitejšie parametre, ktoré je potrebné zmeniť. Ďalej už len v krátkosti vymenujem tie, ktoré som musel meniť alebo aspoň poznať, aby mi to chodilo:

  • MODEM_INIT_STRING (podľa vedomostí nadobudnutých štúdiom dokumentácie),

  • MODEM_CMD_SUFFIX, MAIL_TO (nechajte default a vytvorte si v /etc/aliases alias na vás),

  • FAX_NOTIFY_PROGRAM (tento default je použitý aj v skompilovanom RPM balíku od RedHatu).

Keď si myslíme, že sme úspešne dokonfigurovali, tak skúsme obligátne make. Malo by to vcelku rýchlo a bezbolestne skompilovať celý balík aj s dokumentáciou. Príkaz make testdisk slúži na otestovanie toho, či vie mgetty správne zistiť voľné miesto v súborovom systéme. Pokiaľ sa vám nechce, tak ho nemusíte skúšať, lebo na Linuxe to funguje. Na dve nasledovné činnosti budeme potrebovať rootovské oprávnenia. Sú to make install, ktoré nainštaluje potrebné súbory do /usr/local/[bin,sbin,etc,lib] a editácia /etc/inittab tak, aby sa mgetty spúšťalo po štarte systému. Ja som vo svojom inittabe použil nasledovný záznam :

f1:3:respawn:/usr/local/sbin/mgetty -x 3 ttyS1

Mgetty sa nemôže púšťať z príkazového riadku, ale len z inittabu, pretože sa počas svojej činnosti reštartuje (a na to potrebuje vlastnosť initu - respawn). Zatiaľ však init nereštartujeme ani mgetty nijako nespúšťame, ale pristúpime k dokonfigurovaniu a až následne k otestovaniu balíka mgetty+sendfax.

Konfigurácia a testovanie

Konfiguračné súbory vzniknú po inštalácii v adresári /usr/local/etc/mgetty+sendfax (keď ste si ho kompilovali sami), alebo v /etc/mgetty+sendfax (keď ste použili RedHaťácke RPM-ko). Nachádzajú sa tam súbory *.config a faxheader. Mgetty, ako ste si určite všimli, vie viac, ako prijímať a posielať faxy. Je primárne určený ako lepší ekvivalent k programom getty alebo uugetty na pripojenie sa k počítaču modemom. Umožňuje tiež urobiť callback (niekedy v nejakom inom článku) a keď sú správne ponastavované spôsoby zamykania a použité rovnaké znakové zariadenia, vie spolupracovať s minicomom a pppd (my máme vo firme dial-in, dial-out, callback, ppp a fax a to všetko na jednom modeme a dokonca to aj funguje). A vie to ešte jednu peknú vec. V spolupráci s vgetty (je to súčasťou balíka) umožňuje urobiť z Vášho Linuxu hlasový záznamník s odkazovačom. Ako vidno celý balík je vcelku komplikovaný, a preto sa budeme zaoberať len konfiguráciou jeho faxovej časti. Sú to všetky súbory obsahujúce v názve slovo fax (:-) a mgetty.config. Pre všetky platí to, že pokiaľ ste celý balík kompilovali sami, tak sa tam použili ako default hodnoty zo súboru policy.h, a teda potrebné zmeny budú minimálne. Pokiaľ nie, pozrite si ešte raz online dokumentáciu, kde nájdete správne nastavenia potrebných parametrov. No a teraz si ich (tie súbory a parametre) pekne zaradom preberme. Ako prvý skúsme mgetty.config. Tu je dôležité mať správne nastavené fax-id a speed. Potom pre konkrétne zariadenie a konkrétny modem je potrebné nastaviť jednotlivé sekcie napr. port ttyS1 a v nej hlavne init-chat.

Druhý dôležitý súbor je sendfax.config. Svojou štruktúrou je veľmi podobný predchádzajúcemu súboru. Zaujímavé parametre sú tieto: fax-devices (jeden alebo viac faxmodemov, cez ktoré sa môžu posielať faxy, oddelené dvojbodkou [:] ), zasa fax-id, dial-prefix (ATDP pre analógové ústredne t.j. pulznú voľbu) a pre každý port (modem) osobitne jeho špecifické vlastnosti, napr. modem-handshake.

Teraz je na rade faxrunq.config. Tento súbor je konfiguračný pre program faxrunq ale aj pre faxrunqd (ktorý kedy použiť, viď nižšie). Tu sa nastavuje napr. či sa má faxadminovi posielať mail s informáciou o úspešnom/neúspešnom odoslaní faxu (pokiaľ na to chcete použiť sambu a nie unixový mail, pozrite si poslednú časť článku) a čo je asi najzaujímavejšie success-call-program a failure-call-program. Tieto, ako z ich názvu vyplýva, sa spustia po úspešnom odoslaní alebo po neodoslaní faxu. Návod na to, ako ich použiť na archiváciu odoslaných faxov je zasa v poslednej časti článku. Takže v tomto súbore zatiaľ nič nemeníme. Zatiaľ posledný súbor je faxheader. Toto je záhlavie faxu, ktoré sa doplní na každú odoslanú stranu. Je tam vhodné napísať FROM: <názov_vašej_organizácie> a správne faxové číslo (ak ste balík kompilovali sami, tak by tam malo byť). Prichádza hodina h minúta m a sekunda s, kedy si otestujeme, čo sme doteraz spáchali. Skúsme spraviť init q, čo spôsobí, že si init prečíta inittab a spustí nám mgetty. V adresári /var/log by mal vzniknúť súbor mgetty.<názov_tty>. Pokiaľ tento súbor nevznikol alebo je prázdny, tak vám mgetty nemá čo povedať a teda všetko je v poriadku. Ešte sme však nevyhrali! Ak máte minicom alebo používate PPP, skúste ich. S popísanou konfiguráciou by to malo chodiť. Ak máte ešte jeden modem, skúste z neho zavolať (cez minicom) na váš fax. Mgetty by mal normálne hodiť login a umožniť vám prihlásenie. Teraz otestujeme prijímanie faxov. Nechajte si od niekoho poslať krátky fax na váš faxmodem. Ako som už napísal, mal by v adresári /var/spool/fax/incoming vzniknúť súbor začínajúci písmenom f. Po prijatí faxu sa mgetty pokúsi spustiť program FAX_NOTIFY_PROGRAM (definovaný v policy.h, čo je štandardne /usr/local/bin/new_fax), s nasledovnými parametrami:

<návratový_kód> '<identifikácia_odosielateľa>'\
<počet_strán>\
<meno_prvého_súboru> <meno_druhého_súboru> ..

V inštalačnom adresári mgetty nájdete adresár samples a v ňom množstvo súborov s názvom new_fax.*. Napr. new_fax.lj vytlačí prijatý fax na definovanej tlačiarni (typu HP LJ). Ja však odporúčam pozrieť si adresár new_fax.all, kde je pekný balík modulov, ktoré vedia robiť s prijatými faxmi rôzne zaujímave veci (napr. vytlačiť, odfaxovať ho ďalej, poslať informáciu o prijatom faxe mailom, zápisom do logu). Je to veľmi pekne konfigurovateľné (pozrite súbor faxlist). Inštalácia je veľmi jednoduchá. Nahrajte všetky súbory do samostatného adresára a urobte link z /usr/local/bin na new_fax (alebo to všetko nahrajte priamo do /usr/local/bin). V new_fax sú nejaké konfiguračné cesty a vo faxlist si nastavíte, ako sa má new_fax správať. Keď chcete používať new_fax aj na archivovanie faxov, prekúšte sa až k poslednej časti tohto článku. Dajte si ešte raz poslať nejaký fax a už by sa mal spustiť new_fax, ktorý by mal vykonať požadovanú činnosť. Všetko chodí? Výborne. Polovičku testovania (mgetty) máme za sebou. Skúsme druhú polovičku - sendfax. Na to potrebujeme nejakú obeť v podobe iného faxu a niečo, čo tej obeti pošleme. To niečo môže byť hocijaký krátky (!) súbor vo formáte, ktorý ovláda príkaz faxspool (viď. časť s názvom Ako to vlastne funguje?). Pokiaľ nemáte poruke vhodný súbor, môžete si ho vyrobiť spôsobom podľa výpisu:

pbmtext -font\
    /usr/local/lib/mgetty+sendfax/cour25.pbm \
   >/tmp/fax.pbm

Na štandardný vstup napíšeme nejaký text (napr. AHOJ toto je môj prvý fax) a stlačením Ctrl-D pbmtext vygeneruje súbor /tmp/fax.pbm. Čo ste vyplodili, si môžete pozrieť napr. programom zgv alebo xv. Tento pbm súbor skonvertujeme do formátu g3 (štandardizovaný formát, ktorý sa používa na prenos faxov) programom pbm2g3 (nie pbmtog3 !!!), ktorý vznikol pri inštalácii balíku mgetty+sendfax. Urobte teda

pbm2g3 /tmp/fax.pbm > /tmp/fax.g3.

Program pbmtext ako aj iné konverzné programy (ppmto*, pgmto*, pbmto*, pnm*), ktoré používa faxspool sa nachádzajú v balíku libgr-progs (RH5.0) resp. netpbm (RH4.2). Tento pripravený súbor teraz programom faxspool pripravíme na odoslanie:

faxspool -F <vaše_meno> -f <váš_email> \
   <faxové_číslo_obete> /tmp/fax.g3

Keď sa faxspool začne rozčuľovať, že nie ste root Faxspool security, tak je potrebné vytvoriť prázdny súbor /usr/local/etc/mgetty+sendfax/fax.deny. Tento súbor slúži na to, aby sa dalo obmedziť, kto môže a kto nemôže posielať faxy. Podrobnejšie viď poslednú časť článku. Keď je faxspool spokojný, mal by povedať niečo o tom, že fax bol naspoolovaný a že faxrunq nebol spúšťaný počas posledných 24 hodín (čo nie je problém, lebo sme ešte neskončili konfiguráciu). Ako to vyzerá vidieť na výpise Ukážka spoolovania faxu. Ak všetko prebehlo v poriadku, tak v adresári /var/spool/fax/outgoing vznikol adresár F<XXXXXX>, kde <XXXXXX> je nejaké číslo. V tomto adresári sa nachádza súbor JOB s informáciami o danom faxe a jeden alebo viac súborov fX.g3, ktoré obsahujú jednotlivé stránky faxu. Na prezeranie obsahu faxového spoolu slúži príkaz faxq a na vymazanie zákazky zasa faxrm.


unicorn/tmp.56 >faxspool -F robo -f robo 07273053
/tmp/fax.g3 Neither /usr/local/etc/mgetty+sendfax/fax.allow nor
/usr/local/etc/mgetty+sendfax/fax.deny exist, so only root may use the
fax service. Sorry.

Výpis č. 1: Faxspool security


unicorn/tmp.57 >faxspool -F robo -f robo 07273053 /tmp/fax.g3
spooling to /var/spool/fax/outgoing/F000017...
spooling /tmp/fax.g3...
/tmp/fax.g3 is format: g3

Putting Header lines on top of pages...

Fax queued successfully.

WARNING: faxrunq hasn't been run in the last 24 hours.
         Faxes only get sent out when faxrunq runs! Contact Fax
administrator.

Výpis č. 2: Ukážka spoolovania faxu

Pozrime sa teraz na to, ako odoslať pripravené faxy. Máme dve možnosti. Buď použijeme program faxrunq, ktorý sa bude v pravidelných intervaloch spúšťať z cronu, alebo pri štarte systému spustíte program faxrunqd ako démon a ten v pravidelných intervaloch (60 s) prezrie spool a rovnako ako faxrunq pomocou programu sendfax pošle pripravené faxy prijímateľom. Ktorý z nich použiť? Faxrunq je napísaný v shelli a spúšťa sa raz za čas, zaberá teda menej systémových zdrojov. Faxrunqd beží stále, je napísaný v Perle, má ale viac možností (napr. vie obsluhovať viac modemov, vie spracovávať faxy podľa priority), je flexibilnejší a má rýchlejšiu odozvu. Z tohto dôvodu doporučujem použiť faxrunqd. Urobte si rc skript (napr. /etc/rc.d/rc3.d/S96fax - RH alebo do /etc/rc.d/rc.local - Slackware), v ktorom sa bude spúšťať faxrunqd s parametrom -l tty<n>, kde <n> je príslušné zariadenie s modemom. Pokiaľ chcete použiť viac zariadení, tak ich oddeľte dvojbodkou (:). Na otestovanie toho či nám faxrunqd a sendfax správne fungujú s naším modemom (zatiaľ máme otestovanú len polovičku, pamätáte?), spustíme faxrunqd (ako root) z príkazového riadku: faxrunqd -l ttyS1. V adresári /var/spool/fax vzniknú dva súbory - acct.log a faxrunqd.log. V týchto súboroch sa nachádzajú informácie o tom, ako dopadlo posielanie faxov. Keď fax úspešne odišiel a je dokonca v mieste prijatia čitateľný, máme unixovú časť odosielania vybavenú.

Ako som už spomenul v časti Konfigurácia a testovanie, pri spoolovaní faxu vznikne súbor JOB, v ktorom sú uložené rôzne informácie o faxe. Program faxrunqd si ich pred odoslaním prečíta a na súbor JOB vytvorí hardlink s názvom JOB.locked, čo je vlastne veľmi jednochuchý spôsob zamykania a ochrany. Ak sa mu poslanie podarilo, tak súbor JOB premenuje na JOB.done. Ak nastala nejaká závažná chyba, tak vznikne JOB.error, a keď sa mu nepodari fax odoslať (obsadená linka, na druhej strane nie je fax), tak JOB.suspended. Keď faxrunqd ukončí svoj beh, tak samozrejme JOB.locked unlinkuje (zruší). Ani jeden fax so statusom .suspended, .error alebo .done už naďalej nie je spracovávaný. Preto je pri statusoch .suspended a .error potrebné zistiť príčinu chyby. S týmto súvisí aj správanie programu faxq. Tento štandartne zobrazuje len faxy pripravené na odoslanie. Preto je potrebné z času na čas skontrolovať stavy faxov príkazom faxq -a (čo zobrazí všetky, aj suspendnuté faxy). Zistiť príčinu chyby je možne použitím faxq -a -v. Pokiaľ bol fax len suspendnutý, je možné ho znova zaradiť do spracovania pomocou faxq -r (môžte na to urobiť napr. cron job). Faxy so statusom .error je potrebné dať do poriadku ručne (opravením údajov v súbore JOB.error a jeho premenovaním alebo zmazaním a opätovným poslaním apod.).

Čo v prípade, že niečo nefunguje? Je ťažké dať nejakú všeobecnú radu. Musíte skúmať logy, zvýšiť debug level (parameter -x pre mgetty a debug v sendfax.config pre sendfax), prečítať si ešte raz online dokumentáciu a skúsiť nejakú inú variantu inicializácie príp. ovládania modemu. Presvedčte sa, že váš faxmodem je naozaj triedy 2.0 alebo aspoň 2 (to nie je to isté). Bohužiaľ mgetty zatiaľ nepodporuje faxmodemy triedy 1 (ja som vás na začiatku varoval). Doering (autor mgetty) vraj na tom priebežne pracuje, ale je to dosť komplikované a trvá to dlho (pretože mnoho vecí, ktoré pri class 2/2.0 urobí modem je potrebné urobiť v programe). Ďalej sa presvedčte, či máte v modeme správnu verziu firmware, ktorá naozaj podporuje class 2/2.0 faxy. Ako som sa presvedčil na vlastnej koži, to že to je napísané na krabici alebo v reklamných materiáloch neznamená, že je to pravda. Keď niektorí výrobcovia modemov zaviedli podporu pre voice, tak vyhodili podporu pre faxy. Je to bohužiaľ niekedy tak trochu čierna mágia a je to asi najväčšie úskalie, aké vás čaká. Preto som toľko opakoval, že si máte dôkladne prečítať dokumentáciu. Keď si už naozaj nebudete vedieť poradiť, tak napíšte buď priamo Doeringovi (jeho adresa je v README.1st), ale pred tým si však prečítajte BUGS. Alebo skúste mailing list, ktorého archív je na adrese http://www.elilabs.com/mgarc/index.html.

Ak to nakoniec funguje, tak máme vyriešenú a sfunkčnenú unixovú časť problému. Pozrime sa na to, ako to vyzerá s naviazaním na MS Windows.

Inštalácia a konfigurácia respond a printfax.pl

Stiahnite si binárku programu respond.exe, súbor printfax-1.3.5.pl (alebo vyššiu verziu, ak medzitým vznikla), readme.txt (prečítať) a voliteľne aj faxlpq a faxlprm. Začnime od konfigurácie unixu. Predpokladá sa, že máte nainštalovanú a funkčnú sambu a perl 5.x. Skopírujte súbor prinfax-*.pl do /usr/local/bin/printfax.pl a do smb.conf (zvyčajne v /etc) pridajte definíciu tlačiarne s názvom fax tak, ako to je na výpise Definícia faxu v sambe.


;
; Add to your smb.conf
; for use with printfax.pl V1.3
;
[fax]
   comment       = Fax
   postscript    = yes
   print command = ( /usr/bin/printfax.pl %I %s\
                     %U %m; rm %s ) &
   printable     = yes
   writable      = no
   path          = /your/samba/print/dir
;
; Add your own security options!!!
;

Výpis č. 3: Definícia faxu v sambe

V printfax.pl je pre Linux ešte nutné zmeniť premennú $smbclient tak, aby ukazovala na plnú cestu k programu smbclient (/usr/bin/smbclient), a ak ste na inštaláciu mgetty+sendfax použili RedHaťácke RPMko tak aj premennú $faxspool na /usr/bin/faxspool. Tým by mala byť unixová časť hotová a poďme sa pozrieť na zúbok Windowsom. Tam nastavte, aby sa pri štarte spúšťal winpopup (na prijímanie správ od faxového systému) a respond.exe, ktorý sme pred tým nakopírovali do nejakého inteligentného adresára (ja to mám v c:/utils/fax). Teraz sa pozrime do Network Neighbourhood (Síť, či ako to je v českých Windowsoch), alebo skúsme Start/Run a tam napíšte

\\smb_meno_servera_s_faxom
a mali by sme tam vidieť tlačiareň s názvom fax (definované v smb.conf). Dvojklikom na ňu Windowsy zistia, že ju nemáme nainštalovanú a opýtajú sa, či ju chceme nainštalovať. Áno chceme. V ďalšom okne si musíme vybrať vhodnú tlačiareň. Ide o postScriptovú tlačiareň, tak si vyberte napr. HP LaserJet 5P/5MP PostScript alebo IBM 4019 LaserPrinter PS17 a nainštalujte ju. Potom tlačiareň premenujte na fax a pozrite si jej vlastnosti. Dôležitá je záložka Fonts, kde musí byť zakliknuté, že Send TrueType fonts to printer, ostatné položky by mohli zostať na svojich default hodnotách. Ubezpečte sa, že beží winpopup a respond a skúste vytlačiť nejakú stranu na fax. Keďže fax je postscriptová tlačiareň, tak ovládač tlačiarne zabezpečí, že sa daná stránka prekonvertuje na viac či menej kompatibilný a prenositeľný Postscript (závisí od ovládača tlačiarne) a pošle sa na sambovskú tlačiareň. Tam sa toho ujme printfax.pl, ktorý otvorí spojenie na program respond. Tento sa maximalizuje a vypýta si od používateľa meno a faxové č. prijímateľa ako aj meno používateľa. Tieto údaje sú potom poslané naspäť printfaxu, ktorý na ich základe pomocou faxspool vygeneruje požiadavku na fax. Faxspool použitím ghostscriptu prekonvertuje Postscript na g3 a vyrobí spoolovú požiadavku. Toto je už prípad, ktorý sme prebrali v predchádzajúcej časti a ktorý nám už chodí. Jediný problém vidím v tom, že odoslaný fax bude zle sformátovaný alebo ghostscript nebude vedieť správne vygenerovať g3 súbor (napr. chýbajúce fonty). Potom pomôže už len skúšať rôzne typy postscriptových ovládačov (tlačiarní) a ich rôzne nastavenia. Voliteľne môžte ešte pre fax v smb.conf zadefinovať lpq command (cesta k faxlpq) a lprm command (cesta k faxrm).

Teraz sme v situácii keď faxy prichádzajú, odchádzajú, Windowsy spolupracujú, no proste znie to neuveriteľne, ale je to hotové a funkčné. Pokiaľ ste spokojní, môžete kľudne prejsť k ďalšiemu (iste zaujímavému) článku Linuxových novín. Ak vás však zaujímajú podrobnosti, prípadne chcete funkcionalitu faxového servera ešte vylepšiť, tak sa so mnou v treťom kole ponorte do problému ešte hlbšie.

A poďme ešte hlbšie. Tu už budú informácie kusejšie a nebudú na seba tak nadväzovať, pretože sa budeme venovať rôznym perličkám v rôznych častiach faxového systému. Najprv si povedzme nejaké všeobecnejšie informácie: g3 (group 3) je všeobecne uznávaná a používaná norma (CCITT) na prenos dát medzi faxmi. Existujú dva druhy g3 súborov. S vysokým rozlíšením 204x196 dpi a s nízkym (normálnym) rozlíšením 204x98 dpi. Keď sa tieto rozlíšenia pomiešajú, tak stránky faxu budú buď o polovičku kratšie alebo 2 krát dlhšie. Mgetty+sendfax vie spracovávať obidva typy rozlíšení. Jedna strana faxu má zvyčajne šírku 1728 pixelov a dĺžku (A4) 2100 pixelov. Ak máte v systéme nainštalované pbm utility, tak sú medzi nimi aj pbmtog3 a g3topbm. Niekde v časti Inštalácia a konfigurácia mgetty+sendfax som spomínal, že na konverziu medzi pbm a g3 máte používať pbm2g3 (je to v balíku mgetty) a nie pbmtog3. Že prečo? Jednak pbm2g3 a g32pbm sú rýchlejšie ako pôvodné programy a jednak pbm2g3 produkuje g3 dáta, ktoré spĺňajú štandard T.4, čo nám umožní bezproblémové posielanie faxov.

Určite ste si počas konfigurácie inicializácie modemu všimli, že modem musí mať vypnutý autoanswer (ATS0=0). Linku zdvíha priamo mgetty (parameter rings). Príčinou tohto správania okrem iného je, že je to vlastne jediná možnosť, ako rozlíšiť, či prichádzajúce volanie je fax alebo dáta (čo môže byť súčasťou čiernej mágie konfigurovania modemu). Keď to modem nevie správne povedať, je jediná možnosť nastaviť modem a mgetty natvrdo do dátového alebo faxového módu. Slúži na to parameter modem-type. Sendfax (aj faxspool) vedia s niektorými faxmodemami robiť tzv. fax polling. Je to, keď vy niekomu zavoláte a príjmete dokument. Je to popísané v online dokumentácii v časti Fax Operations.

Ďalšou zaujímavou vlastnosťou je možnosť použiť externý fax ako skener. Je to popísané v online dokumentácii v časti Fax Operations a v súbore doc/scanner.txt.

Niektoré telefónne spoločnosti (slovenský a ani český telekom rozhodne nie :-), možno až budeme mať všetci ISDN) ponúkajú službu caller-id. Je to služba, keď je k nám po prvom zazvonení prenesená identifikácia volajúceho účastníka. Mgetty vie túto informáciu využiť a na základe caller-id prijať alebo neprijať fax.

Pokiaľ je modem vypnutý, tak sa mgetty ukončí (pretože kontroluje funkčnosť modemu a loguje to). Keďže máme v inittabe respawn, tak init po chvíli zahlási:

INIT Id "f1" respawning too fast:\
        disabled for 5 minutes.

Nie je to vážna chyba, ale znamená to, že máte niečo s modemom a asi nijaké faxy nepošlete ani nepríjmete.

Preberme si niektoré zaujímavé vlastnosti a možnosti programu faxspool. Ako bolo na začiatku spomenuté faxspool vie podľa prípony zistiť typ súboru a potom ho skonvertovať do g3 formátu. Pokiaľ sa mu to nepodarí, pokúsi sa uhádnuť (použitím magic numbers) tento typ.

Faxspool umožňuje použiť telefónny adresár. Buď globálny (/usr/local/etc/mgetty+senfax/faxaliases) alebo individuálny ($HOME/.faxnrs). Formát súborov je rovnaký: <alias> <faxové_číslo>. Faxspool najprv pozrie individuálny a potom globálny tel. adresár.

Ďalej nám umožňuje povoliť/zakázať kto môže alebo nemôže posielať faxy. Slúžia na to súbory /usr/local/etc/mgetty+sendfax/fax.allow a /usr/local/etc/mgetty+sendfax/fax.deny. Pokiaľ ani jeden neexistuje, tak posielať faxy môže len root. Ak existuje len fax.deny, tak môžu všetci okrem tých čo sú tam vymenovaní. Ak existuje len fax.allow, tak môžu (myslím posielať faxy) len tí, čo sú tam vymenovaní. Tento bezpečnostný model je implementovaný len v programe faxspool, ktorý samozrejme nie je setuid root a /var/spool/fax/outgoing je zapisovateľný pre všetkých. Preto je veľmi jednoduché tento model obísť napríklad tým, že si tento program niekto skopíruje a kontroly odtiaľ vyhodí. Toto zabezpečenie sa samozrejme týka len unixových používateľov. Keď chcete povoliť/zakázať windowsových používateľov, tak musíte použiť nastavenia v sambe.

V súbore etc/mgetty+sendfax/faxheader je uložené záhlavie každej strany. Faxspool toto záhlavie preparsuje a nahradí niektoré preddefinované znaky inými. Sú to napr.: @T@ - tel. č. prijímateľa, @P@ - aktuálna strana, @M@ - celkový počet strán, @U@ - meno odosielateľa, @DATE@ - dátum odoslania. Úplný popis týchto znakov (tokenov) nájdete v manovej stránke programu faxspool.

Je dobrým zvykom pred každý fax vložiť tzv. cover page (titulnú stranu), kde sú napísané informácie o odosielateľovi, prijímateľovi a prípadne nejaká krátka správa. Faxspool toto umožňuje (prepínač -C). Skúste man coverpg. Popisy spôsobu implementácie príslušného programu (make.coverpg) sa nachádzajú v adresári samples. Tento program nie je defaultne nainštalovaný a treba to urobiť ručne podľa manovej stránky.

V niektorých verziách faxspoolu je zle definovaný príkaz echo. Spôsobí to potom škaredý výpis niektorých textov napr. helpu (neinterpretujú sa escape príkazy ako \t). V mojom faxspoole (verzia 1.1.15) to je na riadku 80. Skúste si vyhľadať prvý výskyt slova echo. Malo by tam byť echo="echo -e".

Balíky respond+printfax.pl tiež umožňujú používať telefónne zoznamy a aliasy. Keď namiesto tel. č. vložíte @<niečo>, tak sa to <niečo> použije ako meno súboru vo vašom domovskom adresári (samozrejme v unixe, ale máme sambu tak ho môžeme zdieľať s Windowsami) a jeho obsah sa použije ako zoznam tel. č. prijímateľov. Jednotlivé položky zoznamu môžu byť oddelené čiarkou alebo medzerou. Ak <niečo> začína lomítkom (/), tak sa to berie ako absolútna cesta. Podrobnosti a iné vlastnosti nájdete v readme.txt, ktoré by ste mali mať už stiahnuté. Na tom istom mieste sa nachádza aj súbor fprintfax, ktorý môže slúžiť na faxovanie cez unixovú tlačiareň. Dá sa ako filter do tlačiarne a potom funguje ako printfax.pl.

Iné zaujímavé nástroje nájdete v adresároch contrib a frontends. V contribe sú napríklad nástroje na lepšiu integráciu TeXdvi a faxspoolu. Vo frontends sú rôzne prezerače a pomocné vstupné (na vytváranie dokumentov) a výstupné (na spracovanie poslaných faxov) programy. Je tam napr. nástroj na integrovanie faxovania do Emacsu, mail to fax gateway, X-Window prezerač faxov (viewfax - ak posielate faxy len z unixu, odporúčam), WWW prezerač a posielač faxov (adresár WWW), iné rozhrania ako respond do Windowsov a v adresároch winword a winword2 dva spôsoby (ktoré som na začiatku článku zavrhol ako netransparentné a neuniverzálne), ako faxovať z MS Wordu.

Nakoniec spomeniem ešte niečo z vlastnej tvorby. Môj kolega Pišta porobil nejaké úpravy a skripty, ktoré by mohli byť užitočné aj Vám. Prvá úprava sa týka toho, že printfax.pl štandardne cez winpopup pošle informáciu o tom, či bol daný fax daný do spoolu. To je v poriadku. Potom však faxrunqd pošle faxadminovi mail (v unixe) o úspechu alebo neúspechu odoslania. Ale používateľ o tom nič nevie a musí sa stále pýtať faxadmina na stav faxu. Preto sme urobili drobné zmeny (týkajú sa programov printfax.pl, faxpool a faxrunqd), ktoré spôsobia to, že sa winpopom pošle na pracovnú stanicu, odkiaľ prišla požiadavka, správa o stave faxu. Druhý nástroj, ktorý sme vytvorili, je WWW archív a prezerač faxov. Umožňuje prezerať, tlačiť a opakovane posielať prijaté a odoslané faxy, ako aj prezerať stav spoolu. Keďže sa mi nepodarilo (zatiaľ) Doeringa presvedčiť, aby tú informáciu o stave faxu (cez winpopup) dal do distribúcie mgetty, tak si môžete patche stiahnúť z adresyftp://ftp.idata.sk/pub/unix/fax/. Na tom istom mieste nájdete aj WWW archív. Tento text bude možné v čase vyjdenia tohto článku (dúfam) nájsť na adrese http://www.idata.sk/~robo/fax/.

Záverom

Podľa môjho názoru je toto riešenie plnohodnotná a finančne nenáročná (ale napriek tomu dokonale funkčná) alternatíva k akémukoľvek komerčnému riešeniu pre rôzne platformy. *


- předchozí článek - následující článek - obsah - úvodní stránka -