Mój system faksowy rozrasta się, aktualnie obsługuje 5 numerów a w planach są kolejne dwa. Jak na razie w dwa miesiące odebrał ponad 1500 faksów i działa bez zarzutu.
Dokładając modemy oczywiście modyfikacji uległ plik z konfiguracjami FaxDispatch i skrypty konstruujące maile z faksami w formacie png.
Skrypt z tego wpisu teraz jest w osobnych plikach, każdy dla innego numeru. Każdy z tych skryptów wykorzystuje też osobny katalog tymczasowy (/tmp/faxX) aby w przypadku odbierania faksów jednocześnie pliki z obrazkami nie pomieszały się, lub nie zostały nadpisane. Eksportowanie zmiennych $SENDER i $FILE jest także uzupełnione o kolejny numer aby nie było niejasności i błędów w dostarczeniu.
Teraz najciekawsza zmiana – instrukcja CASE w pliku FaxDispatch. FILETYPE=pdf;
SENDTO=fax_pdf@***.pl;
TEMPLATE=pl;
case "$DEVICE" in
tty00) echo $FILE > /tmp/FILE; echo $SENDER > /tmp/SENDER; /tmp/convertmime.sh; SENDTO=fax_pdf@***.pl;;
ttyU0) echo $FILE > /tmp/FILE2; echo $SENDER > /tmp/SENDER2; /tmp/convertmime2.sh; SENDTO=;;
ttyU1) echo $FILE > /tmp/FILE3; echo $SENDER > /tmp/SENDER3; /tmp/convertmime3.sh; SENDTO=;;
ttyU2) echo $FILE > /tmp/FILE4; echo $SENDER > /tmp/SENDER4; /tmp/convertmime4.sh; SENDTO=;;
ttyU3) echo $FILE > /tmp/FILE5; echo $SENDER > /tmp/SENDER5; /tmp/convertmime5.sh; SENDTO=;;
esac
Pierwsze 3 linijki to standardowa konfiguracja jeśli nie zachodzi żaden CASE, co właściwie nie powinno się zdarzyć, ale w razie jakby co (np nieoczekiwana zmiana nazwy portu) fax zostanie dostarczony na mail fax_pdf@**.pl jako pdf.
Następnie CASE działający na zmiennej $DEVICE, która odpowiada portowi RS232 w NetBSD. Każdy CASE wyrzuca nazwe pliku oraz nadawce do właściwego pliku, z którego później korzysta convertmimeX.sh do skonstruowania maila. Dodatkowo modem na tty00 oprócz dostarczenia faksu w formie obrazka wysyła ten sam faks w formacie pdf.
System działa bardzo stabilnie, duże znaczenie ma zapewne jakość modemów oraz użytych przejściówek USB-RS232. W moim przypadku kable USB wpięte obok siebie, blokowały losowo któryś modem. Kiedy wpięte są co drugi port USB wolny – wszystko działa bez zakłóceń.
Na razie półka modemowa wygląda jak na zdjęciu poniżej, ale kiedy dojdą dodatkowe dwa modemy trzeba będzie pomyśleć o ładniejszej organizacji :)
Skrypt w FaxDispatch co prawda działał bardzo dobrze ale był dość brzydki i toporny (tworzenie headerów przez echo >> do plików itp).
Pozatym okazało się że miał jedną zasadniczą wadę. Nie dało się przekazać wiadomości z załącznikami inline. Po naciśnięciu FORWARD wiadomość wyglądała mniej więcej tak:
Dlatego zrezygnowałem z sendmaila i uuencode na rzecz mime-construct
Poprzedni skrypt wygląda teraz tak:
convert /var/spool/hylafax/`cat /tmp/FILE` /tmp/fax/fax.png
for D in /tmp/fax/*png
do
echo -n "--file-attach " >> /tmp/fax/faxy
echo $D >> /tmp/fax/faxy
done
mime-construct --header 'From: Serwer faxów ' --to fax@***.pl --subject "Odebrano fax od $SENDER" `cat /tmp/fax/faxy`
rm -rf /tmp/fax/*
Teraz pętla for tworzy listę plików które mime-construct ma załączyć do wiadomości.
Po zmianie skryptu dostarczanie faksów działa jak dotychczas, natomiast po przekazaniu mamy eleganckie załączniki tam gdzie powinny być :)
Na początku była euforia. Będziemy mieli firmowy wirtualny faks z pięcioma numerami! Notabene „paczkę” dziesięciu kolejnych numerów od Netii dostaliśmy za darmo, a myślałem, że za darmo nikt już nic nie daje. Zatem, serwer faksów stanął na nogi dość szybko i co również ważne, pierwszy numer udało się uruchomić bez większych problemów. Serwer to hylafax 4.4.7.
$ faxstat
HylaFAX scheduler on nidhog.***.pl: Running
Modem tty00 (+48616******): Running and idle
Po początkowym (moim) zachwycie jak to dobrze działa i jak stabilnie, zaczęły napływać pytania i prośby o zmianę formatu dostarczania faksów. Tutaj małe wtrącenie jak wygląda u nas dostarczanie faksów. Na jeden numer do księgowości kontrahenci wysyłają faks, który następnie jest dystrybuowany do wszystkich osób którym może być to przydatne. Te kilkadziesiąt osób patrzy sobie w swoje Thunderbirdy a niektóre wybitnie oporne jednostki w Outlooki i im szybciej po łypnięciu okiem można stwierdzić, że ten faks jest potrzebny lub nie tym lepiej.
I tu właśnie zaczynają się schody bowiem hylafax po odebraniu faksu umie go dostarczyć jako postscript (domyślnie) lub wielostronicowy tiff lub pdf. Niby mamy wszystko co potrzeba, oryginał, obrazek, pdf. Niestety problem tkwi poniekąd w klientach pocztowych, które bez zagłębiania się w szczegóły nie mogą wyświetlić podglądu załącznika w pdf lub tiff.
Domyślnie hylafax nie ma także opcji dla png, jpg czy gif ponieważ w/g twórców hylafax’a formaty te nie nadają się do odwzorowywania czarno-białych faksów oraz mają problem z wielostronicowymi faksami.
Po kilkudniowych (naprawdę) poszukiwaniach jakichś pluginów i patchy okazało się, że są co prawda jakieś patche na /var/spool/hylafax/bin/faxrcvd , który jest odpowiedzialny za przyjmowanie faksów istnieją na forum hylafax ale posty są datowane między 1999 a 2004 i teraz ten plik wygląda zupełnie inaczej. Oczywiście przy każdym poście akademicka dyskusja dlaczego nie używać png czy jpg…
Jak już pisałem, w modelu odbioru faksów, który u nas z powodzeniem funkcjonuje liczy się szybkość – dostajemy kilkanaście/kilkadziesiąt faksów dziennie, który to faks może dotyczyć jednej lub kilku osób z kiludziesięciu. Musi być obrazek dostępny w podglądzie dla programów pocztowych, koniec, kropka.
Zamiast próbować zaimplementować obsługę png do faxrcvd, który dla mnie jest zbyt pokręcony, poszedłem inną drogą. Hylafax używa pliku /var/spool/hylafax/etc/FaxDispatch do dostosowywania dostarczania faksów. Można tam oprócz predefiniowanych pól dokonywać modyfikacji np przy pomocy CASE (gdy numer taki, dostarcz gdzieś) itp. Mi natomiast rzucił się w oczy przedostatni przykład z jakiegoś FaxDispatcha w cvsie hylafaxa:
## To make each received fax saved outside hylafax
## ( Don't forget to chown uucp /some/place )
/bin/cp $FILE /some/place
Czysty skrypt shellowy w pliku konfiguracyjnym :)
Po kilkunastu wysłanych faksach testowych i poprawieniu kilku błędów oraz praw urodziło się coś takiego:
- pierwsze trzy linijki to najbardziej podstawowa konfiguracja, odbiorca, format i szablon wiadomości. Zostawiłem podczas testowania jak przychodził faks aby przez wadliwy skrypt poniżej nie zostać pozbawionym faksów :)
- następnie konwertujemy plik tiff który tworzy hylafax w /var/spool/hylafax/recvq na png. Konkretny plik hylafax przechowuje w zmiennej $FILE więc nie musimy nawet szukać tego o którego nam chodzi. Wielostronicowy tiff konwertowany jest na wiele plików png w/g schematu - jeśli dajemy nazwę fax.png jako pliku wyjściowego dostajemy fax-1.png, fax-2.png itd.
- kolejne 6 linijek tworzy nagłówek maila, bez tego też zadziała, ale odbiorca dostanie fax bez tematu od UNIX-to-UNIX Copy (uucp@domena), założę się, że to się nie spodoba ludziom z poza IT :) Mamy zatem ładnie od kogo dla kogo, z numerem telefonu który do nas wysyłał w temacie.
- następne 4 linijki to pętla działająca na katalogu gdzie są nasze skonwertowane pliki png. Każdy plik png trzeba zakodować do ascii i dokleić do wcześniej stworzonego pliku z nagłówkiem.
- ostatecznie wysyłamy mail sendmailem dołączając nagłówki i załączniki z pliku.
- ostatnie dwie linijki - sprzątamy oczekując następnego faksu :)
Trzeba pamiętać, aby wszystkie polecenia i katalogi użyte w tym skrypcie mogły być wykonane przez użytkownika uucp.
Jeśli wszystko gra, adresat maila powinien otrzymać mniej więcej taką wiadomość: