Dies ist die Online-Dokumentation von Softwarepaket mgetty + sendfax.

Copyright © 1993-1997 Gert Doering

mgetty + sendfax
****************

Dies ist die Online-Dokumetation fuer das Softwarepaket mgetty+sendfax, geschrieben von Gert Doering.

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

Einfuehrung
***********

mgetty erlaubt die optimale Ausnutzung eines Modems oder Fax-Modems in einer UNIX-Umgebung. mgetty bearbeitet ankommende Anrufe, ohne dabei nach Aussen gehende Rufe zu stoeren. Falls das Modem Faxstandard Class-2 oder 2.0 beherrscht, kann mgetty Faxe empfangen.

sendfax ist ein unabhaengiges Backend-Programm zum Faxe verschicken.

Dieses Manual erklaert, wie das Programm auf verschiedenen Betriebssystemen und mit verschiedenen Modemtypen zu installieren, zu konfigurieren und zu benutzen ist.

Copyright und (Nicht-)Haftung
=============================

WARNUNG: Dieses Programm ist immernoch BETA-Software. Verwendung ist auf eigenes Risiko, es existieren keinerlei Haftungsansprueche. Sollte das Programm alle Daten auf der Festplatte loeschen, Hardware zerstoeren oder Ihren Hund umbringen, ist das einzig und allein Ihr Risiko. Jedenfalls funktioniert es bei mir und einer ganzen Reihe anderer Menschen.

Das mgetty+sendfax Paket ist Copyright © 1993-1997 Gert Doering.

Es ist erlaubt mgetty+sendfax frei zu verbreiten, zu modifizieren, in anderen Paketen zu inegrieren, ..., solange aus dem Verkauf von mgetty kein direkter Gewinn gemacht wird (siehe unten), der komplette mgetty Source-Code eingefuegt wird und mein Name nicht entfernt wird. Falls eine modifizierte Version vertrieben werden soll, oder mgetty-Code in anderen Projekten verwendet werden sollte, ist er klar als solcher zu markieren (``... derived from mgetty+sendfax by Gert Doering'')!

Sollte das Programm zu Ihrer Zufriedenheit funktionieren und Sie moechten meine Bemuehungen honorieren, geben Sie so viel, wie Sie fuer richtig halten...

Was ich mit ``solange aus dem Verkauf von mgetty kein direkter Gewinn gemacht wird'' meine, ist: es ist voellig in Ordnung, wenn Sie fuer mgetty-Support bezahlt werden, oder wenn Sie mgetty in Verbindung mit anderen Tools zusammen auf einer CD-ROM oder was auch immer verkaufen, aber wenn Sie mgetty im Bundle mit einem faxmodem anbieten als ``UNIX FAX Packet'' oder ``...mit UNIX Software!'', oder mgetty mit minimalen Veraenderungen fuer Geld verkaufen, will ich beteiligt werden. Im Zweifelsfalle fragen Sie einfach bei mir nach.

Falls Sie die Bedingungen dieser Lizenz aus irgendwelchen Gruenden nicht akzeptieren koennen, kontaktieren sie mich und wir koennen versuchen einen Kompromiss auszuarbeiten.

Diese Lizenz laeuft zwei Jahre nach dem Veroeffentlichungsdatum ab, jede veroeffentlichte Release von mgetty+sendfax faellt unter Public Domain, und jedermann ist absolut frei mit dem Code zu tun, was er will.

Features von mgetty und sendfax
===============================

Dieses Paket beinhaltet zwei Hauptprogramme: mgetty und sendfax.

Dies ist mit sendfax moeglich, falls Sie ein Class 2 Faxmodem besitzen:

  * Faxe direkt versenden oder Shell-Scripte dazu verwenden

  * ``Fax-Polling'', d.h. Sie koennen die Wetterstation anrufen und sich von dort ein Fax mit der aktuellen Wetterkarte abrufen. (Nicht alle Modemhersteller implementieren dieses Feature in Ihren Produkten!)

  * eine ``Fax-Queue'' generieren, ausgehende Faxe werden automatisch gesendet, der Benutzer wird per EMail ueber den Erfolg informiert.

mgetty erlaubt eine einzelne Modemleitung fuer ausgehende und ankommende Anrufe zu nutzen.

  * mgetty sind ``smart'' Modems bekannt, und stellt sicher, dass sich das Modem immer in einem definierten Zustand befindet (spezielle Initialisierung des Modems ist moeglich).

  * Einkommende Anrufe werden manuell beantwortet (RING -> ATA -> CONNECT) statt auto-answer zu verwenden (ATS0=1), dadurch wird das Modem nicht abheben, wenn die Maschine ausgeschalten oder kein Einloggen erlaubt ist.

  * mgetty verwendet alle Features von uugetty: es reagiert auf LCK.* Files, die von uucico und anderen Programmen generiert wurden. Dadurch werden Dial-Outs waehrend jemand die Leitung nutzt unterbunden und es stoert es nicht, wenn andere Programme die Leitung nutzen.

  * mgetty kann Faxe empfangen (wenn Ihr Modem Fax-Standard Class 2 oder 2.0 unterstuetzt).

  * mgetty hat weitreichende logging / debugging Funktionen

  * mgetty beherrscht ``fax poll sending'', d.h. Sie koennen Ihre Maschine als Fax-Poll-Server konfigurieren, um Faxe an ``Fax-Poll''-Anrufer zu senden. (Informationen ueber die Maschine verschicken, die aktuellen Wetterdaten, ...). Seien Sie gewarnt, nur sehr wenige Modems unterstuetzen diese Funktionen.

  * mgetty kann selektiv ankommende Anrufe aufgrund ihrer CallerID ablehnen, falls das Modem dies unterstuetzt, und Sie den Service in anspruch nehmen. CallerID wird ebenfalls gelogged.

  * mgetty bietet die Moeglichkeit ankommende Faxe abzulehnen, wenn nicht genug Plattenplatz zur Verfuegung steht.

Falls Sie Bugreports oder Vorschlaege haben, bitte wenden sie sich an gert@greenie.muc.de (oder, wenn [und nur wenn!] das nichts nutzt an gert@space.net).

Ausserdem habe ich eine mgetty Mailingliste zur Diskussion von Problemen und Vorschlaegen gegruendet. Sie koennen sich subscriben, indem Sie eine Anfrage an mgetty-request@muc.de (forwarded an Crynwr.com zur Verarbeitung) senden und Sie koennen Beitraege an die Liste schicken, indem Sie sie an mgetty@muc.de senden. Bitte stellen Sie sicher, dass Ihre Emailadresse, die Sie mir angeben korrekt ist - ich bin es leid, dass alle Beitraege der Liste zu mir bouncen, nur weil eine falsche Adresse dabei war.

Die Mailingliste wird derzeit bidirektional in die Newsgruppe de.alt.comm.mgetty gegated. Obwohl die Gruppe in der deutschsprachigen Hierarchie ist, ist die offizielle Sprache innerhalb der Gruppe Englisch. Beitraege auf Deutsch sollten ignoriert werden.

Die Mailing liste wird auf einer WWW-Site archiviert: http://eli.wariat.org/mgarc/index.html (many thanks to Robert J. Brown, rj@eli.wariat.org)

Unterstuetzte Systeme und Modems
================================

Mgetty wurde bereits erfolgreich uf folgenden Systemen installiert und getestet:

              SCO Unix 3.2.1 (ODT 1.0)                   (gut getestet)
              SCO Unix 3.2.4 (ODT 2.0 + 3.0)             (sehr gut getestet)
              SCO Open Server 5.0                        (gut getestet)
              Linux (everything from 0.99pl1 up)         (sehr gut getestet)
              ISC Unix 3.0                               (getestet)
              SVR4 Unix                                  (gut getestet)
              SVR4.2 Unix                                (benoetigt mehr Tests)
              AT&T 3B1 3.51m                             (gut getestet)
              HP-UX 8.x and 9.x                          (gut getestet)
              AIX 3.2.5 and 4.2                          (gut getestet)
              SunOS 4                                    (gut getestet)
              Solaris 2.x                                (gut getestet)
              NetBSD / FreeBSD                           (gut getestet)

     Es sollte moeglich sein mgetty auf jedem anderen UNIX mit termio.h
     or termios.h zum Laufen zu bringen. Um beste Ergebnisse zu
     erziehlen, empfehle ich die Verwendung der Library-Funktionen
     select(S) oder poll(S), es existiert aber auch ein
     Workaround, falls auf dem System keine von Beiden existiert. (Warnung:
     unter Unix SVR3.1 oder frueher, kein poll() verwenden, es wird
     nicht fuer tty-devices funkltionieren.)

     Bisher wurde es erfolgreich mit folgenden Modems (unvollstaendige Liste)
     im Fax-Mode verwendet:

              ZyXEL U1496 (verschiedene ROM releases)
                  (sehr gut getestet, einige Probleme bestehen, abhaengig von der
                   ROM release)

              MultiTech (verschiedene Modelle)
                  (getestet, funktioniert sehr gut, sehr gute Fax-Implementierung)

              SupraFAX v32bis
                  (getestet, funktioniert gut, kein Faxpolling verfuegbar)

              GVC FM144/+
                  (getestet, funktioniert gut, kein Faxpolling verfuegbnar)

              TKR DM-24VF+ (Deltafax)
                  (getestet, funktioniert zufriedenstellend)

              Zoom V.FAST 24K/28K
                  (getestet, funktioniert, einige Probleme mit fax/data Erkennung)

     Es sollte mit allen Class 2 Faxmodems funktionieren. Moeglicher
     Weise muss fuer alte Class-2 Modems das DC2-Zeichen, welches am Anfang
     einer Seite von faxrec.c gesendet wird, zu XON abgeaendert werden
     (sehr alte Versionen des Standards sind implementiert). See Modems.

     Im Data-Modus arbeitet es mit allen Hayes-kompatiblem Modems.

Konfiguration und Installation
==============================

Das Kompilieren des Paketes sollte problemlos vor sich gehen. Copieren Sie filepolicy.h-dist nach policy.h und editieren Sie es, um einige lokale Policy-Optionen zu setzen, lesen Sie dazu die Kommentare im File.

Danach editieren Sie das Makefile um Installatioons-Pfade, einige System-Einstellungen und einige systemabhaengige Libraries anzugeben (an den entsprechenden Stellen erklaert).

Danach sollte ein make die Programm erstellen und make install sollte sie installieren.

Falls Ihr Compiler die #ident-Zeilen, die ich fuer SCCS benoetige, nicht annehmen sollte, verwenden Sie bitte make noident, das wird auf diese Zeilen Ruecksicht nehmen.

Sollten Sie beim Linken die Fehlermeldung ``unresolved symbols'' erhalten, muessen sie dem Paket mitteilen, ob Sie select(S) oder poll(S) System-Aufrufe benoetigen. Dies geschieht, indem Sie -DUSE_SELECT oder -DUSE_POLL Flags im Makefile setzen. (Falls Sie nicht wissen, was Ihr System verwendet, versuchen Sie beides, bis die Fehlermeldung verschwindet). Ruehrt die Fehlermeldung nicht von select oder poll her, lesen Sie bitte in den System-Man-Pages nach, welche Libraries Sie hinzulinken muessen und fuegen Sie passende -l<library> Statements zu LIBS hinzu.

Verfuegt Ihr System weder ueber den select(S)-, noch den poll(S)-Aufruf, kann mgetty nicht vollstaendig genutzt werden---diese Funktionen sind die einzige Moeglichkeit mgetty daran zu hindern einzelne Characters zu verschlucken, waehrend andere Prozesse versuchen nach Draussen zu waehlen.

Sie koennen mgetty deswegen trotzdem benutzen, indem Sie -DUSE_READ im Makefile angeben, aber denken Sie daran: damit wird mgetty mindestens ein Zeichen der Antwort des Modems verschlucken, wenn ein anderes Programm versucht Rauszuwaehlen. Dies kann zu katastrophalen Fehlern fuehren, wenn z.B. der CONNECT String kaputt ist. Aber meistens ist der Buchstabe, den mgetty verschluckt ein cr oder nl oder Teil eines vom Modem geechoten Kommandos.

Sollten Sie irgendwelche Schwierigkeiten haben, mgetty und sendfax zu kompilieren (auf einem UNIX-aehnlichen System---Ich unterstuetze kein MS-DOS und Windows!), nehmen Sie Kontakt mit mir auf. Aber stellen Sie sicher, dass Sie vorher die Dokumentation gelesen haben!.

Laufzeit-Konfiguration: Ueberblick
==================================

Wenn mgetty oder sendfax "so wie sie sind" gestartet werden, verwenden sie ihre Defaults aus policy.h.

Existieren die Konfigurationsfiles mgetty.config (see runtime-mgetty) und sendfax.config (see runtime-sendfax) (und sind sie lesbar), nehmen beide Programme ihre Laufzeitkonfigurationen von dort. Dort nicht angegebene Einstellungen werden dann aus der voreingestellten Standard-Konfiguratin geholt. Kommandozeilen-Angaben ueberschreiben in jedem Fall diese Einstellungen. Die Konfigurationsfiles befinden sich normaler Weise in  /usr/local/etc/mgetty+sendfax/.

Wenn Sie Commando-Zeilen-Argumente verwenden (siehe dazu auch die mgetty(1) und sendfax(8) man Pages), werden beide, die compiled-in und Konfig-File-Defaults ueberschrieben.

ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

Benutzung von mgetty
********************

Sie koennen mgetty nicht einfach aus einem Shell-Script (wie /etc/rc) oder interaktiv aufrufen, da sonst kein logging moeglich ist, ausser mgetty wird direkt vom init-Prozess aus aufgerufen. Der naechste Abschnitt erklaert, wie man das macht.

Wie mgetty funktioniert
=======================

Um Ihnen naeherzubringen, wie mgetty funktioniert, ist hier ein Beispiel mit was unter verschiedenen Umstaenden passiert, wenn man mgetty verwendet um ein Modem an einer Seriellen Leitung zu kontrollieren, z.B. file/dev/tty2a.

Wenn der Computer gebootet ist, startet das Betriebssystem den init-Prozess, der dafuer zustaendig ist sicherzustellen, dass gettys am fuer sie vorgesehenen I/O-Device laufen, z.B. virtuelle Terminals, Sereille Leitungen und Modems. init liest sein Konfigurations-File, /etc/inittab (unter System V), welches mitteilt, dass die Leitung /dev/tty2a von mgetty kontrolliert werden soll. Dann macht das System einen Eintrag in /etc/utmp (login benoetigt diesen, deshalb kann man nicht einloggen, wenn man versucht mgetty per Hand zu starten), und forkt einen neuen mgetty-Prozess, indem es die angegebene Kommandozeile ausfuehrt.

Wenn mgetty gestartet ist, ueberprueft es als aller erstes, ob ein gueltiges Lockfile von einem anderen Prozess existiert. Wenn dem so ist, bedeutet das, dass der Port gerade benutzt wird und mgetty wartet so lange, bis das Lockfile verschwunden ist. Ungueltige Lockfiles von z.B. nicht existierenen Prozessen (``state'' locks), werden ignoriert.

Wenn der Port einmal frei ist, erstellt mgetty sein eigenes Lockfile, initialisiert das Modem und loescht sein Lockfile wieder. Dann wartet es, bis etwas auf dem Port passiert. Beachten Sie, dass mgetty keinerlei Zeichen read, es ueberprueft lediglich, ob welche vorhanedn waeren, indem es poll() oder select() verwendet.

Es gibt zeri Moeglichkeiten, dass einmal Zeichen ankommen. entweder hat ein anderes Programm (z.B.  uucico) angefangen nach aussen zu waehlen oder das Modem hat ein RING geschickt. Im ersten Fall sollte mgetty den Port unbeachtet lassen. Dies ist einfach wenn das nach Aussen waehlende Programm ein gueltiges Lockfile angelegt hat: mgetty wird es finden, darauf warten, dass es wieder verschwindet, und sich beenden (was init dazu veranlassen wird einen neuen codemgetty-Prozess zu starten, der dann auf den naechsten Anruf warten wird).

Im zweiten Fall existiert kein Lockfile, mgetty schliesst daraus, dass das Telephone klingelt, erstellt ein Lockfile und liest die ankommenden Zeichen. Wenn es ein RING findet, hebt es das Telephone ab, indem es ein ATA sendet und wartet auf die CONNECT-Meldung. Ist der Anrufer eine Faxmaschine, speichert es das Fax im directory FAX_SPOOL_IN (normaler Weise /usr/spool/fax/incoming) und beendet sich. Handelt es sich um ein Modem, sendet es /etc/issue und gibt einen login-Prompt aus. Hat es einen Login-Strin erhalten, ruft es /bin/login auf und laesst es Dinge von dort bearbeiten. login wird das Passwort lesen und dann des Users login Shell starten, uucico, eine Dialup SLIP Verbindung oder was auch immer, aber mgetty kuemmert sich nicht darum. Das Lockfile bleibt, damit kein anderes Programm versucht auf das Modem zuzugreifen, waehrend noch jemand eingeloggt ist.

(Wenn die login.config-Konfiguration verwendet wird, kann mgetty auch andere Login-Programme als /bin/login aufrufen. Siehe unten fuer naehere Detaills).

Wenn mgetty, aus welchen Gruenden auch immer, terminiert, wird init den Port wieder initialisieren (deshalb wartet mgetty darauf, dass Lockfiles weggehen anstatt sich sofort zu beenden) und startet dann einen neuen mgetty-Prozess, der uebriggebliebene Lockfiles vom letzten login entfernt.

Die Lock-File-Handhabung ist trickreich, aber sehr interessant. Es ist zwingende Voraussetzung, dass alle Programme, die das Modem verwenden, sich an ein und das Selbe Lockong-Protokoll halten, andernfalls merrkt ein Programm nicht, dass das Modem benutzt wird und versucht trotzdem rauszuwaehlen. Ein typisches Lockfile ist ein File namens /usr/spool/uucp/LCK..ttyxx, welches die Prozess-ID (PID) des Prozesses, der das modem gerade verwendet, enthaelt. Andere Prozesse koennen es lesen und bekanntgeben, ob das Lockfile zu einem existierenden Prozess gehoert, oder ob es ``stale'' ist und geloescht werden kann. Dies funktioniert offensichtlich nicht, wenn die Prozesse an verschiedenen Stellen nach ihren Lockfiles suchen oder wenn eines von ihnen seine PID in ASCII hineinschreibt und ein anderes es als Binaerzahl zu lesen (aehrend mgetty und sendfax sich nicht daran stoeren, ob Lockfiles in ASCII oder Binaercode geschrieben sind, stoert es andere Programme durchaus! mgetty kann manchmal dieses Problem erkennen und logt dann eine Warnung).

Der /etc/inittab-Eintrag
========================

Ein typischer inittab-Eintrag fuer mgetty sieht wie folgt aus (auf System-V-artigen Systemen):

     <tt>:rlevel:<respawn|off>:/usr/local/sbin/mgetty [options] <device>

tt ist eine Kurzform des device-Namens, der von init und who fuer interne Zwecke verwendet wird. Normaler Weise ist dies etwas der Art  S0 oder 2A oder so.

rlevel gibt den Runlevel an mit dem das Kommando im vierten Feld laeuft, das kann zum Beispiel 23 oder 56 oder so sein. Lesen Sie dazu man init und die vorhandene /etc/inittab auf Ihrem System durch!

Das naechste Feld teilt init mit, ob der Eintrag aktiv (respawn) ist, oder nicht (off) und das vierte Feld gibt den kompletten Pfad des zu startenden Programmes an.

Die folgenden Optionen sind verfuegbar fuer mgetty:

-x <LEVEL> setzt das Debugging-Level. Dies ist sehr wichtig um Probleme zu diagnostizieren, da mit hoeheren Leveln mgetty sehr detaillierte Informationen ueber seinen internen Ablauf in sein Logfile schreibt.

-s <SPEED> setzt die Port-Geschwindigkeit. Ist nichts angegeben, werden die Defaultwerte aus policy.h (definiert DEFAULT_PORTSPEED) verwendet.

-k <SPACE> setzt die minimale Menge benoetigter KiloBytes im incoming Fax Spool directory. Ist dort nicht mehr so viel Platz wird die Verrbindung beendet. Voreingestellt ist 1 Megabyte.

-m 'EXPECT SEND ...' setzt die Modem-Initialisierungs-Sequenze.

-r fuer direct lines (keinerlei Kommunikation mit dem modem wird betireben)

-p <LOGIN PROMPT> setzt den Login Prompt (verschiedene Escape-Sequenzen sind erlaubt)

-n <RINGS> setzt die Anzahl der RINGs, die gesendet werden muessen, bevor ATA gesendet wird um den Anruf entgegen zu nehmen. Voreinstellung ist ein RING.

-R <SEC> bringt mgetty dazu ``ring-back'' oder ``ring-twice'' Modus zu aktivieren. Dies bedeutet, dass mgetty einen Anruf nicht sofort annimt, aber der Anrufer muss nach dem ersten Klingeln wieder auflegen und innerhalb der naechsten <SEC> Sekunden zurueckrufen.

-i /etc/issue gibt das File an, dessen Inhalt vor dem Login-Prompt ausgegeben werden soll.

-S <fax_document> gibt an, welche(s) Dokument(e) an pollende Faxmaschinen zu senden sind (volle Pfadangabe noetig), <fax_document> muss im G3-Format vorliegen (fuer sendfax), oder als Textfile, in dem G3 Fax-Files aufgelistet sind (eines pro Zeile).

Ein beispiel-Eintrag in /etc/inittab koennte wie folgt aussehen:

     F1a:23:respawn:/usr/local/sbin/mgetty -x 3 tty2a

Fuer detailliertere Erklaerungen der Optionen lesen Sie bitte in der mgetty(1) man page nach.

Das richtige Device waehlen
===========================

Manche Betriebssysteme bieten fuer jede serielle Leitung zwei gesonderte Devices an, eines davon ist speziell fuer getties gedacht. Dies ist KEINE gute Idee, weil das nicht mit mgetty funktioniert. Es ist fuer Modems im Auto-Answer-Modus gedacht.

mgetty hebt das Telephone perr Hand ab, was nur dann funktioniert, wenn man das selbe Device wie fuer Dialouts verwendet. (Einige
Leute legen einen Symlink  /dev/modem dann dafuer an, aber dann muss
man konsistent bleiben und das fuer alle comm-Programme tun -
ansonsten bekommt man Probleme mit den Lock-Files).

Hier sind einige Beispiele fuer verschiedene Systeme:

  * SV Unix Systeme, die den FAS-Treiber verwenden:

     Verwenden Sie ttyF01 etc., (minor number 80+(port number). Verwenden Sie emphnichtttyFMxxx---mgetty wird das Device trotzdem oeffnen, aber dann wird ein Oeffnen des ``normalen'' Ports (ohne Carrier detect) blockieren.

  * SCO Unix System ,mit dem Hauseigenen seriellen Treiber:

     Verwenden Sie den Modem-Controll Port (tty2A), nicht tty2a, weil Hardware Flow Control und Carrier Detection nicht auf ``lowercase''tty Devices funktionieren.

     Das Gleiche gilt fuer ``smart'' Serielle Boards, wie Specialix, Digiboard, ..., da diese das Verhalten des SCO-Treibers immitieren.

  * Linux:

     Verwenden Sie /dev/ttyS*, nicht /dev/cua*. See Linux

  * SunOS, FreeBSD, NetBSD:

     Verwenden Sie /dev/cua*, nicht /dev/ttyS*. Fragen Sie mich nicht warum es so ist, anders herum finktioniert es einfach nicht. (Auf SunOS oder Solaris koennen Sie einige Details dazu in der man zs Manpage finden)

Logfiles
========

mgetty schreibt normaler Weise alle Aktionen ein Logfile: LOG_PATH.<DEVICE> (LOG_PATH ist definiert in policy.h), z.B. /var/log/mgetty.ttyxx, so koennen Sie einfach sehen, was in Ihrem System passiert. (Wenn ein fatal error passiert, wird die Fehlermeldung zusatzlich auf die Konsole geschrieben und wenn dies nicht moglich ist, an ADMIN gemailt). Der Name des Logfiles can in policy.h geaendert werden.

Wenn mgetty mit -DSYSLOG kompiliert wurde, gehen auditing und error Logmeldungen auch nach syslog (falls Ihr System dies unterstuetzt).

Verweigern von Logins (und Scheduling)
======================================

.