Inhalt

9. Poll-Skript und Entpacken

Zum Pollen verwende ich das Skript ifmail/misc/contrib/ifpoll in leicht abgewandelter Form:


#!/bin/sh
# ver 0.7r
# ifpoll, poll my boss node or the node given as argument 1
#
# i start this shell script every day by crond, but you can
# start it also by hand :) start it as the owner of ifcico.
# rasca, berlin 1993 (Rasca Gmelch, 2:2410/305.4)
#
# Erweiterte Fassung von Roland Rosenfeld

# where "ifcico" and "ifpack" reside
FIDOPATH=/usr/local/lib/fnet

# logfile of ifcico
IFLOG=/var/log/fnet/ifmail
IFDEBUG=/var/log/fnet/ifdebug

# owner of "ifcico"
IFCICO_OWNER=uucp

# sysop of fido stuff
IFCICO_SYSOP=postmaster

# my boss node (default address to poll)
NODE="f111.n2450.z2"

# how often should i try to call NODE?
MaxTry=20

# delay between outgoing calls in seconds
DELAY=60

# where to log processing - file or tty/console
INFO_TTY=/dev/tty11

function GetConnectMessage () {
   grep 'chat got "CONNECT.*", continue' $IFLOG \
      | tail -n1 \
      | sed 's/.*chat got //;s/, continue//'
}

function GetNoConnectMessage () {
   grep 'chat got .*, aborting' $IFLOG \
      | tail -n1 \
      | sed 's/.*chat got //;s/, aborting//'
}

mv -f $IFDEBUG $IFDEBUG.old
touch $IFDEBUG

echo "`date \"+%b %d %T\"` ifpoll[$$]: starting" >> $INFO_TTY

# remember me, not to run as root..
#
if [ `whoami` != "$IFCICO_OWNER" ]; then
        echo "*** run $0 as the owner of ifcico ***"
        echo "`date \"+%b %d %T\"` ifpoll[$$]: wrong uid (rc 2)" >> $INFO_TTY
        exit 2
fi

# argv[1] is the optional node to call
#
if [ "$1" != "" ]; then
        if [ "$1" = "-?" ] || [ "$1" = "-h" ]; then
                echo "usage: ifpoll [node]"
                exit 3
        else
                NODE=$1
        fi
fi

# let's pack the fido stuff..
#

$FIDOPATH/fgpack

# loop until ifcico could connect the node or MaxTry is encountered
#
i=1; errlv=1
while let 'i <= MaxTry' && let 'errlv != 0'
do
        echo -n "`date \"+%b %d %T\"` ifpoll[$$]: $i. try ($NODE) " \
                >> $INFO_TTY
        #
        # start ifcico in master mode ..
        #
        $FIDOPATH/ifcico -r 1 $NODE
        errlv=$?
        if [ $errlv != "0" ]; then
                GetNoConnectMessage >> $INFO_TTY
                if [ $i != $MaxTry ]; then
                        sleep $DELAY
                fi
                let i=i+1
        else
                GetConnectMessage >> $INFO_TTY
        fi
done

# if the poll was fine, unpacking..
#
if [ $errlv = "0" ]; then
        echo "`date \"+%b %d %T\"` ifpoll[$$]: unpacking.. " >> $INFO_TTY
        $FIDOPATH/fgunpack $INFO_TTY
        # add here some additional lines for processing tic files or
        # incoming file-lists or simular..
        grep 'chat got .*, aborting' $IFLOG | \
                tail -n20 | \
                elm -s "ifpoll: failed" $IFCICO_SYSOP >/dev/null
fi

echo "`date \"+%b %d %T\"` ifpoll[$$]: finished (rc $errlv)" >> $INFO_TTY

# return the errorlevel of ifcico
exit $errlv

Dieses Skript kann ohne Parameter gestartet werden und ruft dann automatisch meinen Boß an, oder aber man gibt den gewünschten Node an (in pfnz-Notation, also z.B. ifpoll f111.n2450.z2). Natürlich muß das Skript an den eigenen Bedarf angepaßt werden (so hat nicht jeder 12 Consolen etc.).

Dieses Skript ruft zunächst das Pack-Skript auf:


#!/bin/sh 
# /usr/local/lib/fnet/fgpack 
# pack-script for FidoGate (together with ifcico)
#
# written by Roland Rosenfeld   19.08.94
#       roland@p13.flokiste.fido.de     (2:2450/111.13)
#

FNET=/var/spool/fnet
FTNPACK=/usr/local/lib/fidogate/ftnpack

PATH=/bin:/usr/bin:/usr/local/bin

topack=

for pkt in $FNET/*/????????.out $FNET/*/????????.pnt/????????.out
do
        if [ -s $pkt ] 
        then
                topack="$topack $pkt"
        fi
done
$FTNPACK $topack

Damit werden die .out-Files in ARCmail-Files zusammengepackt, damit sie effizienter verschickt werden können.

Damit ftnpack korrekt arbeitet, muß man in /usr/local/lib/fidogate/packing noch den Packer definieren:


# /usr/local/lib/fidogate/packing
#
# FIDOGATE ftnpack config file
#
# Commands:
#
#     arc    NAME  "/PATH/PROG %s %s"
#     prog   NAME  "/PATH/PROG %s"
#
#     pack   NAME  NODES
#     rpack  NAME  TARGET NODES
#     fpack  NAME  TARGET NODES
#

arc     zip     "/usr/bin/zip -gkjq %s %s"
arc     arc     "/usr/local/bin/arc an %s %s"

prog    gate    "/usr/local/lib/fidogate/ftn2rfc %s"

######## P A C K I N G #######################################################

pack    zip     *

Natürlich sollte man die Pfade der Packer auf die eigenen Bedürfnisse anpassen. Nach erfolgreichem Anruf von ifcico wird dann das folgende Entpack-Skript aufgerufen:


#!/bin/bash 
# usr/local/lib/fnet/fgunpack 
#
# unpack-script for FidoGate (together with ifcico)
#
# written by Roland Rosenfeld   12.06.94
#       roland@p13.flokiste.fido.de     (2:2450/111.13)
#
# corrected paths, usage of syslog, more packer, clean up, restructured
#       martin@erde.GUN.de (Martin Seine) <2:2448/413.100>
#

FNET=/usr/local/lib/fnet
FGATE=/usr/local/lib/fidogate
IFCFG=$FNET/config
IN=/var/spool/fnet/in

# Facility is the log-file facility, where syslog stores the messages
# if you're not using syslog, no need to change it
FACILITY=local0

# System-manager who receives notices, if there are unpacking errors
MANAGER=postmaster

PATH=/bin:/usr/bin:/usr/local/bin:$FGATE

if [ $1 ]
then
        INFO_TTY=$1
else
        INFO_TTY=/dev/console
fi

WEARE=`basename $0`

#
# get directory-names from $IFCFG
#
INBOUND=`grep -i "^[    ]*inbound" $IFCFG | awk '{ print $2 }'`
LOGFILE=`grep -i "^[    ]*logfile" $IFCFG | awk '{ print $2 }'`

if [ ! -d $INBOUND/bad ] ; then
   if [ -e $INBOUND/bad ] ; then
        rm -Rf $INBOUND/bad
   fi
   mkdir $INBOUND/bad
fi

CORRECT=true

function iflog() {
   if [ -S /dev/log ] ; then
        logger -i -p $FACILITY.info -t $WEARE $@
   else
        echo "`date \"+%y/%m/%d %T\"` $$ $WEARE:" $@ >> $LOGFILE
   fi
   echo "`date \"+%b %d %T\"` $WEARE [$$]:" $@ >> $INFO_TTY
}


function unpack_mail() {
   pushd $INBOUND >/dev/null
   EMPTY=true
   for f in *.mo? *.tu? *.we? *.th? *.fr? *.sa? *.su? *.pkt \
            *.MO? *.TU? *.WE? *.TH? *.FR? *.SA? *.SU? *.PKT
   do
        if [ -f $f ] ; then
                if [ $EMPTY = true ] ; then
                        rm -rf bak.oo
                        mv -f  bak.o  bak.oo >/dev/null
                        mv -f  bak    bak.o  >/dev/null
                        mkdir  bak
                fi
                mv -f  $f bak/
                ln -s -f $INBOUND/bak/$f $IN/$f
                EMPTY=false
        fi
   done

   # now all new packets lay in $INBOUND/bak

   if [ $EMPTY = true ]
   then
        iflog No new mail found in $INBOUND
        exit
   fi

   popd >/dev/null

   pushd $IN >/dev/null
   #
   # Analyze packer with file(1) and unpack them if possible
   #
   for f in *.mo? *.tu? *.we? *.th? *.fr? *.sa? *.su?
   do
       if [ -f $f ] ; then
          arc=`file -L $f | awk '{ print $2 }'`
          case $arc in
            ARJ) unarj e $f ;;
            ARC) arc e $f ;;
            ZIP) unzip -x $f < /dev/null ;;
            LHA) lha e $f ;;
            ZOO) zoo eq $f ;;
            RAR) unrar e $f ;;
              *) iflog unknown packer \'$arc\' for $f
                 false ;;
          esac
          if [ $? -gt 0 ] ; then
              iflog couldn\'t unpack $f \(moved to $INBOUND/bad\)
              cp -f $f $INBOUND/bad
              CORRECT=false
          else
              iflog unpacked $f \($arc\)-archive
              rm -f $f
          fi
       fi
   done
   popd >/dev/null
}

#
#
# main unpack-program
#
#

export FNET
cd $FNET
unpack_mail

iflog starting ftn2rfc
ftn2rfc -x ftninpost -l

if [ $CORRECT = false ] ; then
/usr/lib/sendmail $MANAGER <<END
Subject: Fido-packet errors
There occured errors while processing Fido-Packets.

Please check the logfiles

Your Gateway
END
fi

#iflog starting Linux-TIC-Processor
#/usr/local/lib/tic/process_tics.pl < /dev/null
#/usr/local/lib/tic/poster.pl Daily < /dev/null
#/usr/local/lib/tic/lister.pl < /dev/null

Dieses Skript schiebt alle in /var/spool/fnet/inbound angekommenen Mails nach /var/spool/fnet/inbound/bak, wobei dieses Verzeichnis vorher in bak.o und bak.oo verschoben wird, so daß man immer die letzten drei Poll-Resultate vorliegen hat um mögliche Probleme auch nachträglich noch beheben zu können. Anschließend werden alle .pkt-Files nach /var/spool/fnet/in kopiert und die Archive werden dorthin entpackt (das Skript erkennt automatisch ZIP, ARJ, ARC und LHA). Hierzu müssen folgende Zeilen in /etc/magic enthalten sein (möglichst ganz oben, denn die Datei wird von oben nach unten durchsucht):


# Einige Eintraege fuer das ifcico-Shell-Script
#
0       byte            0x1a            ARC Archive (maybe)
0       string          PK              ZIP Archive
2       string          -lh             LHA Archive
0       string          ZOO             ZOO Archive
0       short           0xea60          ARJ Archive

Ist das geschehen, wird ftn2rfc aufgerufen, welches die Pakete nach Mail/News konvertiert und dann seinerseits mittels ftninpost sendmail und rnews startet.

Im Anschluß daran können noch weitere Tools, wie z.B. ein TIC-Prozessor oder ein Programm, das News für User des eigenen Systems sucht, aufgerufen werden.


Inhalt