Linux ISDN
Installation und Konfiguration


Der Kernel

Es war einmal der Kernel 1.2.13, der den meisten Distributionen als Standardkernel begegeben war. Dieser lief nur schlecht in Zusammenhang mit i4l, als noch keine ISDN-Kerneltreiber existierten. I4l-Benutzer wichen daher in der Regel schnell auf die sogenannten "Hackerkernel" 1.3.x aus.

Derzeit empfiehlt sich ein Kernel ab 1.3.97 (erst seit Kernel 1.3.69 ist der Einsatz von Kernel-internen ISDN-Treibern überhaupt möglich, und erst ab 1.3.97 laufen die Treiber hinreichend stabil). Nachdem nun der Kernel 2.0 herausgekommen ist, werden wir ihn hier auch besprechen. Man besorgt sich den Kernel z.B. unter

  ftp.leo.org/pub/comp/os/linux/Linus/v2.0/linux-2.0.7.tar.gz
und sollte auch gleich das neue modules-Paket mit holen:
  ftp.leo.org/pub/comp/os/linux/Linus/v2.0/modules-2.0.0.tar.gz
Mit dem Kernel geht man wie gewohnt um - siehe dazu auch das Kernel-HOWTO, zu finden beim nächsten SunSite, beispielsweise unter
  ftp.leo.org/pub/comp/os/linux/sunsite/docs/HOWTO/Kernel-HOWTO.gz
Die Modules sollte man vorher noch entpacken und entsprechend der Anweisungen im Kernel-HOWTO einbauen.

Man muß keinerlei Patches mehr einspielen (das war nur beim Kernel 2.0.0 erforderlich - dort mußte man noch die zwei Patches isdn4kernel-2.0-patch1+2 einbauen).

Beim Compilieren muß man nun folgendes bei "make config" (bzw. seinen graphischen Verwandten "make menuconfig" oder "make xconfig") eingestellt werden:

Sektion "Code maturity level options":
  Prompt for development and/or incomplete code/drivers: Yes
Sektion "General Setup":
  Networking support: Yes
Sektion "Networking options":
  TCP/IP networking: Yes
  alle anderen je nach Bedarf.
Sektion "Network device support":
  Network device support: Yes
  PPP (point-to-point) support: Yes  
  alle anderen je nach Bedarf
Sektion "ISDN subsystem":
  ISDN support: Yes
  Support synchronous PPP: Yes
  Use VJ compression with synchronous PPP: Yes
  Support audio via ISDN: Yes
  Support generic MP (RFC 1717): Yes
  Verwendete Karte eintragen.
Wenn später der Kernel ohne Probleme läuft, kann man daran denken, einige dieser Bausteine auch als Module statt als feste Kernelbestandteile zu definieren.

Die ISDN-Treibersoftware

Ferner muß man sich noch die aktuelle Version von Fritz Elferts "isdn4kernel-Utilities" holen:
  ftp.franken.de/pub/isdn4linux/v2.0/isdn4k-utils-2.0.tar.gz
Man setzt sich diese ins Verzeichnis /usr/src und entpackt sie per "tar zxfv isdn4k-utils-2.0.tar.gz". Im Verzeichnis
  /usr/src/isdn4k-utils-2.0
findet man jetzt alle zum Betrieb notwendigen Dateien. Zunächst müssen die Programme erzeugt werden. Man übersetzt sie mit "make", erzeugt anschließend die neuen ISDN-Gerätedateien mit "make devices" und installiert zum Schluß die ausführbaren Programme mit "make install" im Verzeichnis /sbin sowie die man-Seiten dort, wo sie hingehören.

Die Kartenparameter müssen auch noch eingestellt werden - hierzu ist die ISDN4Linux-Anleitung

  /usr/src/linux/Documentation/isdn/README
zu Rate zu ziehen. Die Parameter werden beim Booten als Kernelparameter oder beim Laden des entprechenden Modules übergeben.

Damit sind die grundlegenden Installationen abgeschlossen.

Die Konfiguration

Tip:
Jetzt kommen etliche große Scriptdateien. Sie liegen diesem Anleitungspaket bei - am Script ist nur die Überschrift anzuklicken!

Konfigurationsdateien

Damit die Konfiguration möglichst einfach wird, werden hier zwei zentrale Dateien zur Konfiguration verwendet: /etc/i4l.config enthält die Daten des Providers, /etc/i4l.param enthält persönliche Daten (diese Datei muß deshalb mit chmod 700 /etc/i4l.param geschützt werden!!!). /etc/i4l.config kann allgemein lesbar bleiben, muß aber für root ausführbar sein: chmod 744 /etc/i4l.config

Eine Datenbank mit fertigen Dateien für einige Unis und andere Provider kann man sich herunterladen. Es ist recht einfach, auch selber die Datei /etc/i4l.config herzustellen - dazu kann man sich eine Vorlage laden oder den entsprechenden Abschnitt aus der Datenbank schnipseln.

Diese Datei definiert etliche Umgebungsvariable, die in den hier verwendeten Scripten teilweise eingebunden werden. Wenn ich mal viel Elan aufbringe, werde ich ein Script machen, das automatisch alle erforderlichen Dateien aus i4l.config und i4l.param erstellt - das ist allerdings ein recht ehrgeiziges Projekt. Bisher muß man sich noch alle Dateien, die in /etc stehen, selber anpassen.

Ich wäre übrigens nicht undankbar, wenn man mir funktionierende Dateien mailen würde!

Beispieldatei (hier für meinen Provider, das Leibniz-Rechenzentrum in München):

/etc/i4l.config
  #!/bin/sh
  # i4l.config 
  # (c) 1996 Bernhard Hailer (GNU GPL V.2)

  # Please send your completed file to Bernhard.Hailer@lrz.uni-muenchen.de.
  # Thank you!

  # Provider: Leibniz-Rechenzentrum Muenchen
  # Hotline: (089) 289-28800
  # Data collected: Bernhard Hailer <dl4mhk@lrz.uni-muenchen.de>

  # Telephone numbers for raw terminal programs: 
  # 08928057421, 0892805601

  # Add here data of first provider
  PROV1_PHONE=0892881010              # phone number of provider
  PROV1_NAME=ppp.lrz-muenchen.de      # name of provider
  PROV1_IP=129.187.24.253             # IP address of provider

  # Add here data of second provider
  # (leave empty, if there is none)
  PROV2_PHONE=0892881190              # phone number of provider
  PROV2_NAME=ppp.lrz-muenchen.de      # name of provider
  PROV2_IP=129.187.24.126             # IP address of provider

  # Name servers (add manually to /etc/resolv.conf): 
  #  search lrz-muenchen.de 
  #  nameserver 129.187.10.25, 129.187.16.1

  # Mail server (add manually to /etc/hosts): 
  #  129.187.13.48	sunmailhost.lrz-muenchen.de	getmail

  # News server (add manually to /etc/hosts): 
  #  129.187.13.48	news.lrz-muenchen.de		getnews
Die Datei i4l.param ist so aufgebaut (Beispiel):
/etc/i4l.param
  #!/bin/sh
  # /etc/i4l.param Bernhard Hailer 1996

  # ATTENTION! This file contains PASSWORDS and other security belonging data.
  # It MUST be hidden using "chmod 700 /etc/i4l.param"!!!!!

  # used in /sbin/init.d/rc.isdn
  MY_PHONE=8178*****                     # no leading zero!
  MY_DOMAIN=dl4mhk.ampr.org              # my fully qualified domain name

  PROV1_LOGIN=                           # not used currently
  PROV1_PASSWD=                          # not used currently

  PROV2_LOGIN=                           # not used currently
  PROV2_PASSWD=                          # not used currently

  # used in /sbin/transmail
  MAIL_LOGIN=********
  MAIL_PASSWD=********
  MAIL_PATH=/var/spool/mail/dl4mhk       # dl4mhk is my user name at home

  NEWS_LOGIN=                            # not used currently
  NEWS_PASSWD=                           # not used currently

Vorgänge beim Booten

Linux kann nach zwei Möglichkeiten gestartet werden. Die eine ist simpleinit (z.B. Slackware), die andere, etwas kompliziertere, aber auch viel flexiblere ist sysvinit (S.u.S.E. 4.2, Debian, Caldera, Red Hat...). Diese beiden Varianten erfordern eine voneinander verschiedene Einbindung des ISDN-Startups.

simpleinit

Bei simpleinit sind die Startdateien in /etc/rc.d/ untergebracht; man findet etliche Einzelscripte, von denen die Dateien rc.M (Aufruf etlicher Startscripte) und rc.6 (Reboot-Script) für uns von Bedeutung sind. In's selbe Verzeichnis setzen wir eine neue Datei rc.isdn, die das ISDN-System starten soll.

Diese Datei muß neu angelegt werden. Damit sie beim Booten als Startdatei erkannt wird, muß man vorher folgenden Eintrag in die Datei /etc/rc.d/rc.M vornehmen:

/etc/rc.d/rc.M; Sektion "# Initialize the NET subsystem."
  . /etc/rc.d/rc.inet1
  . /etc/rc.d/rc.isdn       # <-- diese Zeile einfügen!
  . /etc/rc.d/rc.inet2
Jetzt kreiert man eine neue Datei namens /etc/rc.d/rc.isdn. Das besprechen wir gleich nach dem folgenden Kapitel, in dem kurz auf die Arbeitsweise von sysvinit eingegangen wird.

sysvinit

Bei sysvinit funktioniert der Start ganz anders. Hier werden die Initialisierungsscripten beispielsweise unter /sbin/init.d/, /etc/init.d oder /etc/rc.d/ abgelegt. Hier haben die Scripten Doppelfunktion: werden sie mit dem Argument "start" aufgerufen, wird etwas gestartet, mit dem Argument "stop" wird das System auf den Shutdown vorbereitet. Das Ganze funktioniert mit sogenannten "run levels": Level 0 bedeutet "Systemhalt", Level 1 "single user mode", Level 2 "multiuser mode ohne Netzwerk, Level 3 "network level" und schließlich Level 6 "rebooting". Level 1-3 werden nacheinander beim Rechnerstart aufgerufen, und in deren Verlauf werden etliche der Scripten mit dem Argument "start" aufgerufen. Im Runlevel 6 werden diese Scripten in umgekehrter Reihenfolge mit dem Argument "stop" gerufen.

Das mit der Reihenfolge ist "tricky": ein "Masterscript" sieht in den Runleveln zugeordneten Verzeichnissen (./rc0.d, ./rc1.d, ./rc2.d) nach, was zu tun ist. Darin befinden sich eine Reihe von Soft-Links auf die gerade beschriebenen Scripten. Alle Links heißen entweder

  SnnScriptname
oder
  KnnScriptname
mit einer Zahl nn, die bestimmt, wann diese Datei aufgerufen wird. Wenn also eine neue Datei - nennen wir sie auch hier wieder rc.isdn (Achtung: bei SuSE heist diese Datei i4l!), unterzubringen im Scriptenverzeichnis - eingebunden werden soll, die das ISDN-System integriert, dann ist das zugehörige Runlevelverzeichnis ./rc2.d, und man muß dort zwei Softlinks unterbringen:
  root:# cd /sbin/init.d/rc2.d  # (Pfad anpassen!)
  root:# ln -s ../rc.isdn K20rc.isdn
  root:# ln -s ../rc.isdn S20rc.isdn
  root:# _

System-Start und -Stop

Hier nun die Datei(en), die man sowohl bei simpleinit als auch bei sysvinit braucht. Beschrieben wird die Datei für sysvinit, aber man kann leicht daraus auch die Einträge isolieren, die für simpleinit erforderlich sind (als Kommentar enthalten).
/sbin/init.d/rc.isdn
  #!/bin/sh
  # rc.isdn   This shell script boots up the ISDN subsystem.
  # Version:  @(#)/sbin/init.d/rc.isdn  3.0   01-Sep-96
  # Author:   Bernhard Hailer <Bernhard.Hailer@lrz.uni-muenchen.de>

  . /etc/i4l.config
  . /etc/i4l.param

  case "$1" in
    start)

# === The following is /etc/rc.d/rc.isdn for "simpleinit"! =================
      # turn on isdn
      echo "Starting isdn4linux"
      echo "0" >/etc/lines.active          # makes it more comfortable.

      # global
      /sbin/isdnctrl verbose 0             # For debugging set to 2 (max. 4)

      # ISDN device drivers ippp0 (PPP)
      /sbin/isdnctrl addif      ippp0
      /sbin/isdnctrl addphone   ippp0 out $PROV1_PHONE  # 1st provider
      /sbin/isdnctrl addphone   ippp0 in $MY_PHONE  # my telephone no
      /sbin/isdnctrl eaz        ippp0 $MY_EAZ       # my MSN / EAZ
      /sbin/isdnctrl huptimeout ippp0 300           # 5 min
      /sbin/isdnctrl secure     ippp0 on            # nobody may entry

      /sbin/isdnctrl l2_prot    ippp0 hdlc
      /sbin/isdnctrl l3_prot    ippp0 trans
      /sbin/isdnctrl encap      ippp0 syncppp

      /sbin/ifconfig ippp0 $MY_DOMAIN pointopoint prvdr0 metric 1
      /sbin/route add default ippp0                 # interface definitions
      /sbin/ipppd remotename prvdr0 /dev/ippp0 &

      # Now delete Route again to prevent unwanted connections - see chapter
      # "Running". The route must be set at the beginning!
      /sbin/route del default


      # ISDN device drivers ippp1 (PPP)
      # Same again for 2nd provider (not necessary if no 2nd server!)
      /sbin/isdnctrl addif      ippp1
      /sbin/isdnctrl addphone   ippp1 out $PROV2_PHONE
      /sbin/isdnctrl addphone   ippp1 in $MY_PHONE
      /sbin/isdnctrl eaz        ippp1 $MY_EAZ
      /sbin/isdnctrl huptimeout ippp1 300
      /sbin/isdnctrl secure     ippp1 on

      /sbin/isdnctrl l2_prot    ippp1 hdlc
      /sbin/isdnctrl l3_prot    ippp1 trans
      /sbin/isdnctrl encap      ippp1 syncppp

      /sbin/ifconfig ippp1 $MY_DOMAIN pointopoint prvdr1 metric 1
      /sbin/route add default   ippp1
      /sbin/ipppd remotename prvdr1 /dev/ippp1 &

      /sbin/route del default


      # ISDN device driver isdn0 (no PPP)    #  Option: VT100 connection
      /sbin/isdnctrl addif isdn0             #  with terminal program
      /sbin/isdnctrl huptimeout isdn0 300    #  via /dev/ttyI0
# === Until here /etc/rc.d/rc.isdn for "simpleinit"! ======================

      ;;
    stop)
      ## turn off isdn

# === Put this to the beginning of the "rc.6" file for "simpleinit": ======
      echo "Shutting down isdn4linux..."
      /sbin/ifconfig ippp0 down
      /sbin/isdnctrl delif ippp0
      /sbin/ifconfig ippp1 down
      /sbin/isdnctrl delif ippp1
      /sbin/ifconfig isdn0 down
      /sbin/isdnctrl delif isdn0
# === Until here! =========================================================

      ;;
    *)
      echo "Usage: $0 {start|stop}"
              exit 1
      ;;
  esac
Hier wird übrigens nicht der Standard-PPP-Dämon pppd 2.2.0f aufgerufen, sondern eine speziell gepatchte Version namens "ipppd". Diese liegt dem ISDN4Linux-Paket bei und wurde beim Installieren nach /sbin befördert. Trotzdem gelten die man-Seite zum pppd sowie das "PPP-HOWTO". Die Geräte ippp0 und ippp1 werden nicht gleichzeitig eingesetzt. Falls die Verbindung über ippp0 nicht zustande kommt, klappt es vielleicht über ippp1.

Eine Anmerkung noch zu den letzten Zeilen: mit isdn0 wird ein Gerät definiert, welches einfachen Terminalbetrieb ohne PPP erlaubt. Man kann mit einem Terminalprogramm wie minicom oder seyon via /dev/cui0 mit wenigen AT-Befehlen eine solche Verbindung aufbauen:

  at&eyyyyy                     (yyyyy: eigene MSN bzw. EAZ)
  atdNummer für normale Terminalprogramme
Jetzt kann man die Rechenleistung des Providers in Anspruch nehmen und z.B. ein "telnet" zu anderen Rechnern machen. Natürlich kann man sich hierzu auch ein Script basteln.

Weitere wichtige Dateien

Damit PPP funktioniert, muß man als root noch folgende Dateien editieren:
/etc/ppp/options (Optionen-Datei für den ipppd)
  user <Login-Name>    #  eigener User-Name beim Provider
  ipcp-accept-local    #  Akzeptiere Vorgabe der eigenen IP vom Provider
  ipcp-accept-remote   #  Akzeptiere Vorgabe der IP des Providers
  noipdefault          #  Wir setzen keine IP-Adresse voraus
  useifip              #  IP-Adresse vom Netzwerkinterface übernehmen
  -vjccomp             #  Abschalten der VJ-Kompression der Connection-ID
  -ac                  #  Abschaltung der Adreß/Kontrollfeld-Kompression
  -pc                  #  Abschalten der Protokollfeld-Kompression
  -bsdcomp             #  BSD-Kompression aus (ipppd kann das nicht!)
  -vj                  #  Keine Komprimierung nach Van Jacobson - s.u.!
  mru 1024             #  Maximum Receive Unit
  debug                #  ACHTUNG! Damit werden auch übermittelte Paßwörter
                       #    geloggt - entsprechende Dateien müssen unbedingt
                       #    mit "chmod 600 <datei>" geschützt werden!
  -detach              #  Prozeß soll nicht selbständig werden
Anmerkung zur Option "-vj": Wird dieser Parameter nicht gesetzt, so kann das System sehr ungehalten reagieren. Während es bei einer laufenden X-Sitzung schlicht und einfach hängenbleiben kann, so kommt es bei einer einfachen Sitzung zur Anzeige von "Kernel-Oopses". Speziell die Zeile "Aiee, killing interrupt handler" deutet auf eine eingeschaltete VJ-Kompression hin.
/etc/resolv.conf: (siehe /etc/i4l.config-Datenbank!)
  domain <eigener.domain.name>
  nameserver <1st nameserver>
  nameserver <2nd nameserver>
  nameserver <3rd nameserver>

/etc/hosts:
  # For loopbacking.
  127.0.0.1       localhost
  # My own IP address
  192.168.1.1     maschinen.name              alias    # oder eigene IP-Adresse
  # (192.168.x.x ist frei verfügbar und kann immer verwendet werden.) 
  # Rest of the World 
  IP.1.Provider   name.des.1.provider         prvdr0   # 1. Provider
  IP.2.Provider   name.des.2.provider         prvdr1   # 2. Provider

  129.187.10.22   sun3.lrz-muenchen.de        sun3     # (als Beispiel)
  129.187.13.48   sunmailhost.lrz-muenchen.de sunmail  # für email
  129.187.13.3    mailhost.lrz-muenchen.de    lrzmail  # (s.u. 6.1.!)

/etc/networks (muß nicht geändert werden)
  loopback        127.0.0.0
  localnet        127.0.0.0                   #  oder eigenes Netz

Authentifizierung

Unter PPP muß man sich beim Provider ausweisen. Dazu gibt es zwei Methoden, die je nach Provider verwendet werden: PAP (Password Authentification Protocol) und CHAP (Challenge Authentification Protocol). PAP ist weit verbreitet, aber CHAP bietet dem Provider mehr Sicherheit. Je nachdem, welches Verfahren verwendet wird, ist die Datei /etc/ppp/pap-secrets oder /etc/ppp/chap-secrets zu editieren (nur eine der beiden sollte vorhanden sein). Achtung! Diese Dateien enthalten Paßwörter und müssen unter allen Umständen vor unbefugtem Zugriff geschützt werden!
  root:# chmod 600 /etc/ppp/pap-secrets (bzw. /etc/ppp/chap-secrets)
  root:# _

PAP

/etc/ppp/pap-secrets
  # Secrets for authentification using PAP
  # client          server          secret          IP addresses
  <provider_login>  <1. Provider>   <password>      -
  <provider_login>  <2. Provider>   <password>      -

CHAP

Die Provider kennen im allgemeinen nicht den "fully qualified hostname" des Kundenrechners - die IP im Zweifel auch nicht. Daher wird stattdessen als Kundenrechnername einfach dessen Login-Name benutzt. Das hat zur Folge, daß man seinen Rechner auf den Login-Namen (ohne Domain!) beim Provider umbenennen müßte - was man aber durch die Angabe von "name <provider_login>" als Option beim Aufruf vom ipppd (bzw. in der Datei /etc/ppp/options) umgehen kann. Statt der Datei /etc/ppp/pap-secrets schreibt man nun eine Datei /etc/ppp/chap-secrets, die folgendermaßen aussehen muß (man beachte: es sind zwei Zeilen pro Eintrag erforderlich!):
/etc/ppp/chap-secrets
  # Secrets for authentification using CHAP
  # client          server             secret       IP addresses
  <provider_login>  <1. Provider>      <password>
  <1. Provider>     <provider_login>   ""
  <provider_login>  <2. Provider>      <password>
  <2. Provider>     <provider_login>   ""

Ein wenig Schliff

Nun sollte man noch das PPP-Log auf eine Extra-Datei umlenken, damit man leichter eventuelle Fehler suchen kann. Dazu editiert man die Datei /etc/syslog.conf und fügt folgende Zeile an (Anmerkung: KEINE Leerzeichen, nur Tabulatoren benutzen!):
  daemon.*                      /var/log/ppp-log
Damit wird alles, was der PPP-Dämon an Informationen abgibt, in der Datei /var/log/ppp-log abgelegt.

Damit hat man alle erforderlichen Dateien angepaßt, und das System sollte laufen.

Der Betrieb

Leider neigt das Linux-System nun dazu, mehr oder weniger unmotiviert Verbindungen zum Provider aufzubauen. Dies liegt in der Natur des Systems: wann immer ein IP-Paket anliegt, will das System es auch loswerden (z.B. Zugriff auf Nameserver etc.). Da das Kosten verursacht, muß man es abstellen. Das macht man, indem man die Default-Route zum Interface ippp0 löscht - das Linux-System kennt dann den Weg nach draußen nicht mehr.

Die neuen Kernels ab 1.3.100 haben eine etwas unangenehme Eigenschaft: sie greifen intensiv in die Routenlegung ein. Damit es keine Kollisionen gibt, muß man erst wählen, dann warten, bis die Verbindung steht und darf erst dann die Defaultroute legen. Das folgende Script erledigt das "An-" und das "Abschalten" der Route. Es ist so abgefaßt, daß es auch mehrmal aufgerufen werden kann, so daß die erste Anwendung (beispielsweise Post holen) die Verbindung herstellt, und weitere Verbindungen nicht neue Leitungen aufmachen müssen. Die letzte Anwendung räumt auf: es wird aufgelegt und die Defaultroute wieder gelöscht. Aufruf: /sbin/isdn on und /sbin/isdn off.

/sbin/isdn
  #!/bin/sh
  # isdn:    connects to / disconnects from provider
  # Author:  Bernhard Hailer <Bernhard.Hailer@lrz.uni-muenchen.de>
  # Version: 3.0 (01-Sep-96)

  . /etc/i4l.config
  . /etc/i4l.param

  case $1 in
    on)
      declare -i con_apps                 #  line already active?
      read con_apps </etc/lines.active
      let con_apps+=1
      echo $con_apps >/etc/lines.active

      line="0"

      while [ $line!="finished" ]
      do

        if [ $con_apps -lt 2 ]
        then
          echo "Calling ippp$line"
          /sbin/isdnctrl dial ippp$line
          echo "Sleeping 8 sec for PPP handshaking..."
          sleep 8s
          /sbin/route add default ippp$line
          echo "Line open - checking..."
        else
          let con_apps-=1
          echo "Line seems to be open already $con_apps time(s) - checking..."
          let con_apps+=1
        fi

        set `ping -qc5 -i1 prvdr$line | grep transmitted`
        if [ $4 -gt 0 ];
        then
          echo "8-) Line is ok - have fun!"
          line="finished"                                   # paranoia setting
          break
        else
          /sbin/isdnctrl hangup ippp$line
          route del default
          read con_apps </etc/lines.active
          echo "0" >/etc/lines.active
          if [ $con_apps -gt 0 ]
          then
            echo ":-| Hmm, no. Trying to rebuild..."
            let con_apps=1
            echo $con_apps >/etc/lines.active
            line="0"                                        # paranoia setting
            continue
          else
            case $line in
            0)
              if [ $PROV_NAME_2 = "" ]
              then
                echo ":-[ Sorry, Line is down. Bad luck... Try later!"
                line="finished"
                echo "0" >/etc/lines.active
                con_apps=1
                break
              else
                echo ":-( Sorry, Line 0 is down. Trying second line."
                line="1"
                continue
              fi
              ;;
            1)
              echo "0" >/etc/lines.active
              con_apps=1
              echo ":-[ Sorry, Line 1 is also down. Bad luck... Try later!"
              line="finished"
              break
              ;;
            *) 
              echo "=:-0 THIS CANNOT HAPPEN. Fatal Error in script /sbin/isdn!"
              break
              ;;
            esac
          fi
        fi
      done
      ;;
    off)
      declare -i con_apps
      read con_apps </etc/lines.active

      if [ $con_apps -gt 0 ]             #  line active, indeed?
      then
        let con_apps-=1
        echo $con_apps >/etc/lines.active
        if [ $con_apps -eq 0 ]
        then
          echo "Last application stopped - closing line."
          /sbin/isdnctrl hangup ippp0
          /sbin/isdnctrl hangup ippp1
          /sbin/route del default         #  and delete route.
        else
          echo "There are $con_apps more applications running - keeping line."
        fi
      else
        echo "Hey boss, there had no line been active!"
      fi
      ;;
    *)
      echo -e "\aUsage:"
      echo "isdn on:  opens line to the provider,"
      echo "isdn off: closes line."
      ;;
  esac
Dieses Script setzt man in das Verzeichnis /sbin und macht es ausführbar (der route-Befehl ist nur für "root" ausführbar!):
  root:# chmod 744 /sbin/isdn
  root:# _
Hinweise für eigene Experimente:

Test:

  root:# isdn on
  Calling ippp0
  Dialing of ippp0 triggered
  Sleeping 8 sec for PPP handshaking...
  Line open - checking...
  :-) Line is ok - have fun!
  root:# telnet sun3
  [...]
(nun wie gewohnt einloggen; später zum Abschluß "exit" eingeben)
  root:# isdn off
  Last application stopped - closing line.
  ippp0 hung up
  ippp1 not connected
  root:# _

Weitere Utilities

Dem ISDN4Linux-Paket liegen noch etliche sehr brauchbare Werkzeuge bei. Eines ist zum Beispiel der unter X laufende "isdnmon" von Andreas Kool, mit dem der momentane Zustand des S0-Busses angezeigt wird (frei oder bestehende Verbindung). Sehr interessant ist auch "isdnlog" vom gleichen Autor, der den Verkehrsablauf auf dem S0-Bus mitprotokolliert.

Man sehe sich dazu das README von Fritz Elfert an.


Copyright © (GPL V 2) 1996 Bernhard Hailer
Letzte Änderung: 02-Sep-96 BeH