vgetty-minioffice-mini-HOWTO Norbert Preining, preining@logic.at v0.2, 6 Juni 1998 Dieses Dokument beschreibt, wie man mgetty+sendfax+vgetty aufsetzen kann, so dass man Voicemails, Faxe, einkommende Daten bearbeiten kann und über ein Telephon die neuen Voicemails abrufen und den Rechner zur Verbindung (einwählen) bringt. Dadurch kann man von seinem Arbeitplatz ohne Modem via Telephon den Rechner zu Hause auffordern, sich beim Provider einzuloggen und eine Mail zu schicken, an welcher IP Adresse man hängt. Dabei wird speziell auf die Probleme bei Verwendung eines USRobotics Sportster (Message) Modem eingegangen. Das Dokument beschreibt meine Konfiguration und wie ich es geschafft habe, alle Dinge unter einen Hut zu bekommen. Nichts von dem hier stehenden muss für irgendjemand anderen funktionieren und ich lehne daher jede Haftung ab ;-) ======= Inhalt: ======= 1. Einleitung 2. Kompilieren 3. Die Configfiles 4. Greeting ,essages aufnehmen 5. new_fax und new_voice scripts in /usr/lib/mgetty+sendfax/ 6. Remote Steuerung 7. PPP/Login Server 8. Listings der files, die man bei diesem Setup braucht ============= 1. Einleitung ============= mgetty+sendfax (http://www...) ist bekannt. USR Sportster/Message sind sehr häufige Modems, die in manchen Ausführungen das unabhängige empfangen von Faxen/Voicemails beherrschen (2Mb Speicher). ============== 2. Kompilieren ============== Man lese das README.1st des Paketes! Man konfiguriert policy.h wie üblich, folgende Einträge habe ich speziell eingetragen: #define DEFAULT_PORTSPEED 115200 #define MODEM_INIT_STRING "ATS0=0Q0&D3&C1" #define DATA_FLOW FLOW_HARD #define FAXREC_FLOW FLOW_HARD | FLOW_SOFT #define FAXSEND_FLOW FLOW_HARD | FLOW_SOFT /* #define FAX_USRobotics */ Wichtig: Nicht definieren! #define FAX_MODEM_HANDSHAKE "AT&H3&I2&R2S7=30" #define FAX_NOTIFY_PROGRAM "/usr/lib/mgetty+sendfax/new_fax" Dabei sind einige natürlich schon Standard. Für USRobotics mit neuerer Firmware empfiehlt sich folgender patch: --- faxlib.c.orig Tue Dec 1 08:50:27 1998 +++ faxlib.c Fri Nov 27 08:09:43 1998 @@ -354,7 +354,7 @@ } else /* standard case, working modem */ { - sprintf( buf, "AT%s=%d,%d,0,2,0,0,0,0", + sprintf( buf, "AT%s=%d,%d,0,2,0,0,0,5", (modem_type == Mt_class2_0) ? "+FCC" : "+FDCC", fine, (max/2400) -1 ); } Dann kompiliert man mgetty und vgetty, installiert. Im inittab dann noch vgetty eintragen: S1:123:respawn:/usr/sbin/vgetty modem ================== 3. Die Configfiles ================== Ausschnitte aus meinen config-files sehen so aus: /etc/mgetty+sendfax/mgetty.config: ========================================================================= # # mgetty configuration file debug 4 fax-id speed 115200 fax-owner root fax-group root fax-mode 0660 port ttyS1 init-chat "" AT+MCS=0 OK port modem init-chat "" AT+MCS=0 OK ---------------------------------------------------------------------- /etc/mgetty+sendfax/sendfax.config: ---------------------------------------------------------------------- verbose y fax-devices /dev/modem fax-id ---------------------------------------------------------------------- voice.conf ---------------------------------------------------------------------- part generic voice_log_level 1 voice_dir /var/spool/voice backup_message greeting.gsm port_speed 115200 ignore_fax_dle false #!!!!!!!!!!!! WICHTIG !!!!!!!!!!!!!!!!!!!! # neu USR Sportster (Message) schicken GSM data, daher als RAW DATA # akzeptieren, sonst kann man es sich nicht anhören!!! raw_data true program vgetty rings 4 answer_mode voice:fax:data dtmf_program /usr/lib/mgetty+sendfax/dtmf.sh message_program /usr/lib/mgetty+sendfax/new_voice program vm voice_devices modem ---------------------------------------------------------------------- Wichtige Punkte bei der Konfigurierung: *) raw_data true Die neuen USR Message (Sportster) schicken kein raw data mehr, sondern GSM, daher soll `vm' keine Veränderungen vornehmen! *) backup_message greeting.gsm Deshalb heissen bei mir auch die messages ....gsm, und nicht .rmd, da ich sie so gleich mit sox abspielen kann. *) in mgetty.config für die MessagePlus Modems mit SelfMode (empfangen von Faxe/Voice mit abgeschaltenem Computer - tool zur Steuerung siehe http://www.logic.at/people/preining/software/smmgr-X.Y.tgz) Der SelfMode muss abgedreht werden!! Daher init-chat mit +MCS=0 : port ttyS1 init-chat "" AT+MCS=0 OK port modem init-chat "" AT+MCS=0 OK Jetzt können noch login.config, fax.allow, faxheader, faxrunq.config, dialin.config konfiguriert werden login.config: /AutoPPP/ - @ /usr/sbin/pppd file /etc/ppp/ppp-server-options norbert - - /bin/login @ * - - /bin/false @ ------------------------------------------------------------------------- fax.allow: root norbert # ... other users ... ------------------------------------------------------------------------- faxheader: FAX FROM: +43 1 4852209 TO: @T@ PAGE: @P@ OF @M@ ------------------------------------------------------------------------- faxrunq.config: success-send-mail Y failure-send-mail Y maxfail-costly 3 fax-devices modem faxrunqd-log /var/log/faxrunqd.log ============================== 4. Greeting messages aufnehmen ============================== Siehe die Kommentare in mgetty-../voice/doc/Readme.Beginners vm record -i greeting.gsm nimmt über modem-mikrophon auf Dieses file nach /var/spool/voice/messages/ verschieben und in /var/spool/voice/Index eintragen (siehe Readme.Beginners) ============================================================ 5. new_fax und new_voice scripts in /usr/lib/mgetty+sendfax/ ============================================================ #!/bin/sh # # new_fax # # ich Verwende mutt, der schickt die fax-seiten als mime-attachments, # so dass ich sie gleich anschauen kann # MAILTO="root" PATH=$PATH:/usr/local/bin G3TOPBM=g32pbm # # HUP="$1" SENDER="$2" PAGES="$3" shift 3 P=1 while [ $P -le $PAGES ] do FAX=$1 mutt -F /dev/null \ -s "New fax from $SENDER, page $P of $PAGES, on `date`" \ -a $FAX $MAILTO <&$VOICE_OUTPUT; kill -PIPE $VOICE_PID } # # Define the function send a beep # function beep { send "BEEP $1 $2" ANSWER=`receive` if [ "$ANSWER" != "BEEPING" ]; then logger -t "dtmf.sh[$$]" "Could not start beeping" kill -KILL $$ fi ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Something went wrong on beeping" kill -KILL $$ fi } # # Define the function to play a file # function play { send "PLAY $1" ANSWER=`receive` if [ "$ANSWER" != "PLAYING" ]; then logger -t "dtmf.sh[$$]" "Could not start playing" kill -KILL $$ fi ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Something went wrong on playing" kill -KILL $$ fi } # # Define the function to play the new messages # function messages { if [ ! -f $TIMESTAMP ]; then MSGS=`find $VOICE_DIR/incoming/ -type f -name 'v*.rmd' -print` else MSGS=`find $VOICE_DIR/incoming/ -type f -name 'v*.rmd' -newer $TIMESTAMP -print` if [ -z "$MSGS" ]; then BASENAME=`basename $TIMESTAMP` NEWSTAMP=`find $VOICE_DIR -name $BASENAME -cmin -10 -print` if [ "$NEWSTAMP" = "$TIMESTAMP" ]; then MSGS=`find $VOICE_DIR/incoming/ -type f -name 'v*.rmd' -print` fi fi fi touch $TIMESTAMP-n if [ -x $VOICE_DIR/speakdate.sh ]; then TIME=yes else TIME=no fi TMP=/tmp/time.rmd.$$ LOCK=/tmp/time-lock.$$ for i in $MSGS do # # The sample speed, modem type and compression is hardcoded # here for the moment. Will be automatically set to correct # values in a later version. # # For ISDN4Linux use: # ...speakdate.sh $i 9600 ISDN4Linux 4 >$TMP ;\ # For Rockwell modems use: # ...speakdate.sh $i 7200 Rockwell 4 >$TMP ;\ # For the ZyXEL Elite 2864 use: # ...speakdate.sh $i 9600 ZyXEL_2864 4 >$TMP ;\ # if [ $TIME = yes ]; then (touch $LOCK ;\ $VOICE_DIR/speakdate.sh $i 9600 ZyXEL_1496 4 >$TMP ;\ rm $LOCK) & fi beep 1320 100 play $i beep 1320 100 if [ $TIME = yes ]; then while [ -f $LOCK ] do sleep 1 done play $TMP rm $TMP fi done if [ -z "$MSGS" ]; then play "$NO_NEW_MESSAGES" fi beep 880 1000 rm -f $FLAG $TIMESTAMP mv $TIMESTAMP-n $TIMESTAMP } # # Define the function to read one dtmf code string # function getcode { RECEIVED="" send "ENABLE EVENTS" ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Could not enable events" kill -KILL $$ fi send "WAIT 30" ANSWER=`receive` if [ "$ANSWER" != "WAITING" ]; then logger -t "dtmf.sh[$$]" "Could not start waiting" kill -KILL $$ fi ANSWER="" while [ "$ANSWER" != "READY" ] do ANSWER=`receive` if [ "$ANSWER" = "RECEIVED_DTMF" ]; then ANSWER=`receive` if [ "$ANSWER" = "*" ]; then RECEIVED="" else case $ANSWER in "#") send "STOP" ;; 0|1|2|3|4|5|6|7|8|9) RECEIVED=$RECEIVED$ANSWER ;; *) logger -t "dtmf.sh[$$]" "Ignoring DTMF $ANSWER" ;; esac fi else if [ "$ANSWER" = "SILENCE_DETECTED" ]; then send "STOP" else if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Ignoring $ANSWER" fi fi fi done send "DISABLE EVENTS" ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Could not disable events" kill -KILL $$ fi echo "$RECEIVED" } # # exitvm # function exitvm { play "$GOODBYE" send "GOODBYE" ANSWER=`receive` if [ "$ANSWER" != "GOODBYE SHELL" ]; then logger -t "dtmf.sh[$$]" "Could not say goodbye to voice library" kill -KILL $$ fi } # # getone # function getone { RECEIVED="" send "ENABLE EVENTS" ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Could not enable events" kill -KILL $$ fi send "WAIT 30" ANSWER=`receive` if [ "$ANSWER" != "WAITING" ]; then logger -t "dtmf.sh[$$]" "Could not start waiting" kill -KILL $$ fi ANSWER="" while [ "$ANSWER" != "READY" ] do ANSWER=`receive` if [ "$ANSWER" = "RECEIVED_DTMF" ]; then ANSWER=`receive` send "STOP" RECEIVED=$ANSWER else if [ "$ANSWER" = "SILENCE_DETECTED" ]; then send "STOP" else if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Ignoring $ANSWER" fi fi fi done send "DISABLE EVENTS" ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Could not disable events" kill -KILL $$ fi echo "$RECEIVED" } # # connectppp # function connectppp { play "$MAXIMUM_CONNECT_TIME" MAXTIME=`getcode` if expr 15 '<' "$MAXTIME" > /dev/null 2>&1 ; then MAXTIME=15 fi $CONNECT_SCRIPT $MAXTIME } # # Let's see if the voice library is talking to us # ANSWER=`receive` if [ "$ANSWER" != "HELLO SHELL" ]; then logger -t "dtmf.sh[$$]" "Voice library not answering" kill -KILL $$ fi # # Let's answer the message # send "HELLO VOICE PROGRAM" # # Let's see if it worked # ANSWER=`receive` if [ "$ANSWER" != "READY" ]; then logger -t "dtmf.sh[$$]" "Initialization failed" kill -KILL $$ fi # # Let's check the code # TRIES=1 DTMF=$1 GOT_CORRECT_CODE=no while [ $TRIES -le $MAXTRIES ] do if [ "$DTMF" = "$CODE" ]; then if [ -f $2 ]; then rm -f $2 fi GOT_CORRECT_CODE=yes break else logger -t "dtmf.sh[$$]" "Incorrect DTMF ($DTMF) code on try $TRIES" beep 1320 100 play "$INCORRECT" fi if [ $TRIES -lt $MAXTRIES ]; then play "$GET_CODE" beep 1320 100 DTMF=`getcode` else /usr/local/bin/mutt -F /dev/null -s "Remote Telephon System" </dev/null 2>&1 & exit 0 Und connect-nohup.sh: #!/bin/bash # sleep 1m touch /var/run/auto-kill-ppp /usr/local/bin/connect if [ ! "$1" = "" ] ; then echo "`date`: pppd will be killed in $1m!" > /var/run/auto-kill-ppp sleep $1m if [ -r /var/run/auto-kill-ppp ] ; then /usr/local/bin/disconnect rm -f /var/run/auto-kill-ppp fi fi exit 0 ####### Dabei muss /usr/local/bin/connect ein script sein, dass den link hochbringt, und /usr/local/bin/disconnect das inverse. Eine Möglichkeit wäre /etc/ppp/ppp-{up,down}. ACHTUNG: SuSE: Das SuSE script /etc/ppp/ppp-up hat den Befehl TERMINAL=`tty`. In diesem Fall is TERMNAL="not a tty", was chat killed. Daher muss folgendes geänder werden in /etc/ppp/scripts/redialer: # Terminal to echo output, exported from "ppp-on" # # folgende 3 Zeilen einfügen!!! if [ "$TERMINAL" = "not a tty" ] ; then TERMINAL=/dev/console fi if [ "w$TERMINAL" = "w" ]; then TERMINAL=/dev/console fi Jetzt bleibt nur noch die Frage, wie erfährt man auf der am Arbeitsplatz, was die IPADDR ist? Da ist das script /etc/ppp/ip-up sehr nützlich. ICh habe darin folgendes (unter anderem) stehen: # # .... # INTERFACE=$1 TTYDEV=$2 SPEED=$3 LOCALIP=$4 REMOTEIP=$5 IPPARAM=$6 # ... # Firewall hochziehen # ... # # sending mail where we sit! # if [ -r /var/run/auto-kill-ppp ] ; then IPHOST=`host $LOCALIP | head -n 1 | awk '{print $2}'` /usr/local/bin/mutt -F /dev/null -s "Connected to home!" \ preining@logic.at < # # server # secret is empty, but server has option `login' to look into the # passwd-database norbert mandala "" 192.168.0.2 # damit darf nur user `norbert' beim ppp-dialin angegeben werden # oder für alle user in der shadow/passwd Datenbank #* mandala "" 192.168.0.2 ---------------8<---------------- Damit ist jetzt eine einfach Einwahlmöglichkeit von anderen Rechern (Win, Linux, NT) gegeben. Dabei sollte man darauf achten, in den jeweiligen hosts-files folgende Einträge anzuführen: 192.168.0.1 mandala.priv.at mandala Damit man leicht `telnet mandala' eingeben kann ;-) ======================================================= 8. Listings der files, die man bei diesem Setup braucht ======================================================= -rw------- root root /etc/mgetty+sendfax/dialin.config -rw-r--r-- root root /etc/mgetty+sendfax/fax.allow -rw-r--r-- root root /etc/mgetty+sendfax/faxheader -rw------- root root /etc/mgetty+sendfax/faxrunq.config -rw------- root root /etc/mgetty+sendfax/login.config -rw-r--r-- root root /etc/mgetty+sendfax/mgetty.config -rw-r--r-- root root /etc/mgetty+sendfax/sendfax.config -rw-r--r-- root root /etc/mgetty+sendfax/voice.conf -rw------- root root /etc/ppp/chap-secrets -rw------- root root /etc/ppp/pap-secrets -rw-r--r-- root root /etc/ppp/ppp-server-options drwxr-xr-x root root /var/spool/fax/ drwxr-xr-x root root /var/spool/fax/incoming/ drwxrwxrwt root root /var/spool/fax/outgoing/ drwxrwxrwx root root /var/spool/fax/outgoing/locks/ drwxr-xr-x root root /var/spool/voice/ drwxr-xr-x root root /var/spool/voice/incoming/ drwxr-xr-x root root /var/spool/voice/messages/ -rw-r--r-- root root /var/spool/voice/messages/1.gsm -rw-r--r-- root root /var/spool/voice/messages/2.gsm -rw-r--r-- root root /var/spool/voice/messages/3.gsm -rw-r--r-- root root /var/spool/voice/messages/4.gsm -rw-r--r-- root root /var/spool/voice/messages/5.gsm -rw-r--r-- root root /var/spool/voice/messages/6.gsm -rw-r--r-- root root /var/spool/voice/messages/Index -rw-r--r-- root root /var/spool/voice/messages/get-code.gsm -rw-r--r-- root root /var/spool/voice/messages/gimme_comm.gsm -rw-r--r-- root root /var/spool/voice/messages/goodbye.gsm -rw-r--r-- root root /var/spool/voice/messages/greeting.gsm -rw-r--r-- root root /var/spool/voice/messages/harald.gsm -rw-r--r-- root root /var/spool/voice/messages/ignored.gsm -rw-r--r-- root root /var/spool/voice/messages/incorrect.gsm -rw-r--r-- root root /var/spool/voice/messages/maximum.gsm -rw-r--r-- root root /var/spool/voice/messages/new_runlevel.gsm -rw-r--r-- root root /var/spool/voice/messages/no_new_messages.gsm -rw-r--r-- root root /var/spool/voice/messages/not_a_runlevel.gsm -rwxr-xr-x root root /usr/lib/mgetty+sendfax/connect-nohup.sh -rwxr-xr-x root root /usr/lib/mgetty+sendfax/connect.sh -rw-r--r-- root root /usr/lib/mgetty+sendfax/cour25.pbm -rw-r--r-- root root /usr/lib/mgetty+sendfax/cour25n.pbm -rwxr-xr-x root root /usr/lib/mgetty+sendfax/dtmf.sh -rwxr-xr-x root root /usr/lib/mgetty+sendfax/make.coverpg -rwxr-xr-x root root /usr/lib/mgetty+sendfax/new_fax -rwxr-xr-x root root /usr/lib/mgetty+sendfax/new_voice