Corbammims
Dialup-Manager
Zweck
Ein schwäbischer Unternehmer möchte nicht, daß ungewollt Verbindungen ins Internet aufgebaut werden. Man möchte auch nicht, daß jeder als Superuser auf dem Gateway das wählen steuert. Zudem soll das ganze ohne Kenntnisse bedienbar sein.
Modern ist die Steuerung per WWW-Interface. Besser und universeller ist unser
Dialupmanager
mit der universellen
CORBA-Schnittstelle
Ein weiteres Problem ist das Versenden und Abholen von Mails. Dazu haben gibt es den
Queuemanager
Bis der CORBA-Sicherheitsdienst erforscht ist, soll das ganze nur für kleine Netze (Kleine Firmen und Privatnutzung)
sein, wo jeder im Netz die Dienste nutzen kann.
Interface
#include"mico/CosEventChannelAdmin.idl"
#pragma prefix ""
module DialupManager
{
exception Syserr
{
long errnr;
string errmsg;
};
interface Device
{
string name(); // liefert Name
string desc(); // liefert Beschreibung
};
typedef string ipstring;
// Für isdn und ähnliches
interface DialDevice : Device
{
enum DialMode {off,manual,automatic,permanent };
enum Status {offline,incoming,outgoing};
void dial()
raises(Syserr);
void hangup()
raises(Syserr);
void setdialmode(in DialMode d)
raises(Syserr);
void activate()
raises(Syserr);
void deactivate()
raises(Syserr);
DialMode getdialmode()
raises(Syserr);
Status getstatus()
raises(Syserr);
ipstring get_our_ip()
raises(Syserr);
ipstring get_peer_ip()
raises(Syserr);
long activechannels() //Aktive ISDN-Kanäle
raises(Syserr);
CosEventChannelAdmin::EventChannel geteventchannel()
raises(Syserr);
};
struct dmstate
{
DialDevice::DialMode dm;
DialDevice::Status status;
};
/* fuer CTI */
typedef string Telefonnumber;
struct call
{
Telefonnumber remote;
Telefonnumber local;
};
// Für Mail, UUCP, und dergleichen
typedef string Entrydesc; // Beschreibung
typedef sequence EntrydescList;
interface QueueentryIterator;
interface Queuemanager
{
string name(); // liefert Name
string desc(); // liefert Beschreibung
void fetchandsend()
raises(Syserr);
long howmanyentries()
raises(Syserr);
void listentries(in unsigned long howmany,
out EntrydescList list,
out QueueentryIterator queit)
raises(Syserr);
};
interface QueueentryIterator
{
boolean next_one(out Entrydesc entry);
boolean next_n(in unsigned long how_many,
out EntrydescList bl);
void destroy();
};
};
Dokumentation
- DialDevice::aktiviert: dial und dialmode auto
DialDevice::deaktiviert: dialmode manual und hangup
- Dialmode
- off
- Keine Verbindungen sind erlaubt (vgl. isdn4linux)
- manual
- Verbindungen müssen mit dial aktiviert werden.
Dies entspricht isdnctrl dial bei isdn4linux
- automatic
- Wenn ein IP-Paket hinaus möchte, wird automatisch gewählt.
Dies entspricht isdnctrl dialmode ippp0 auto.
- permanent
- hier wird die Verbindung durch ein ping -i3 partnerip
offengehalten. Die IP-Adresse des Partners wird aus dem Interface
bestimmt.
Wird der Dialmode gewechselt, wird der ping-Prozeß terminiert.
Dieser Dialmode ist dann gut, wenn man für eine gewisse Zeit
die Internetverbindung nicht abbrechen will, weil man z.B
über ein slogin oder telnet auf einem anderen Rechner arbeitet
oder eine langsame FTP-Verbindung hat, die nicht abreißen soll.
Die Netzwerkinterfaces werden durch das Lesen von /proc/net/dev
erkannt und als Objektid in einem POA behandelt. Im Nameserver werden sie
in einem Namingkontext bekanntgegeben.
Eventchannel-Anbindung:
- Jedes Dialdevice hat einen verbundenen Eventchannel, der alle seine
Beobachter über Zustandsveränderungen informiert.
- Der Eventchannel selbst wird vom eventd realisiert und ist persistent.
- Beim aktivieren eines Dialdevice-Exemplars wir falls vorhanden der alte
Eventchannel wiederverwendet. Dazu speichert er sich beim Deaktivieren
die IOR-Adresse in seiner Beschreibungsdatei.
Ist der Eventchannel nicht vorhanden, so wird ein neuer geschaffen.
- Mit Hilfe des Tie-Mechanismus hat ein Dialdevice die PushSuppier-Schnittstelle. Beim Deaktivieren wird der Ereigniskanal abgehängt. Deswegen muß der
Pushsuppier nicht persistent sein.
Nun kann man auch die Netzwerkseitige IP-Adresse des überwachten Interfaces
mit get_our_ip bekommen.
A C H T U N G: bei PPP-Verbindungen dauert das eine Weile, bis die Verbindung
aufgebaut ist und die IP-Adresse ausgehandelt wurde. In der Zwischenzeit
ist noch die alte IP-Adresse gesetzt und wird zurückgeliefert. Clients
sollten daher eine kleine Zeit nochmals die Adresse erfragen.
Da der Dialupmanager auf Devices im Betreibssystem aufpassen muß, wird er als persistenter Server d.h. eigenständig und nicht von einem POA oder BOA Mediator aus gestartet. Damit kann er auch gleich
Einfaches CTI
Mit unserem speziellen CTI-Device bekommt unser
Dialupmanager mit, wenn ein Telefonanruf eingeht.
Daraus erzeugt er ein Ereignis über einen speziellen Eventchannel.
Damit können dann beliebige Clients auf das Ereignis reagieren.
Mittels filternden Eventchannels ergeben sich weitere Möglichkeiten.
Sonstiges
Konfiguration
Zur Compilezeit
Pfade in config.h eintragen:
- DATAPATH : Verzeichnis an dem die Device-Beschreibungsdateien sind.
- RUNPATH: Hier wird eine Datei mit der IOR des Control-Objektes abgelegt. Datei heißt programmname.ctl
Die Pfade sollten mit /-abgeschlossen sein, wenn man sie leer läßt,
werden die Dateien im aktuellen Verzeichnis gesucht.
Device-Beschreibungsdatei
Jedem Device ist eine Beschreibungsdatei, die genau so heißt wie das Device, zugeordnet.
In der ersten Zeile steht die Beschreibung, die bei desc zurückgeliefert wird. Während dem Betrieb wird an der zweiten Zeile die IOR
des verbundenen Eventchannels dort hinterlegt.
Nameservice
Der Dialupmanager richtet in dem CORBA-Nameserver, den er via ORB::resolve_initial_references findet, einen Namingcontext namens DialupManager, ein, wo er seine Interfaces und das Consumeradmininterface (IDL:omg.org/CosEventChannelAdmin/ConsumerAdmin:1.0) des cti-Eventchannel mit dem Namen cti ein.
Er erwartet einen Eintrag syslog, wo der Syslog-Eventchannel mit dem Typ IDL:omg.org/CosEventChannelAdmin/ConsumerAdmin:1.0 sich dahinter verbirgt.
weitere Ideen
- Bei getstatus: telefon-nummer zurückliefern.
- Beim Wählen wird mit angegeben, wer und warum eine Verbindung braucht
(kaufmännische Gründe).
Die Liste der Verbindungen kann abgefragt werden. ("Wer hat noch eine Verbindung offen ?) und als Logbuch gesammelt werden (und später kaufmännisch Ausgewertet werden).
- Statt "wählen" kann man auch einen "Verbindungsantrag" denken.
Nach Erforschung des Corba-Sicherheitsdienstes kann man dann Nutzer
(->MMIMS) mit verschiedener Priorität ausstatten, z.B. Administrationserlabnis, Verbindungsaufbauerlaubnis und dergl.
- Verbinden mit isdnlog
- Wie bei isdnlog könnte im Falle des Leerlaufs vor dem Beenden der
Verbindung ein Event an die Clients gesendet werden. Diese
können dann z.B. durch Änderung der Farbe anzeigen, daß das Ende
der Verbindung bevorsteht.
- hisaxctrl ist hauptsächlich ein ioctl. Logging könnte auch
beim initialisieren als auch via Interface exportiert werden.
Graphische Oberfläche
- qtdialmonitor url
- überwacht ein Dialdevice. Url ist die iiopname oder iioploc-URL oder die IOR
Zu tun
- Verschönerung
- KDE-Einbindung: icon,controlpannel ...
- Objektbrowser ...
- Verbinden mit kisdnlog
Andere Arbeiten
- isdnlog bei Isdn4Linux
- Neben der Gebürenauswertung können auch bei verschiedenen
Isdn-Ereignissen Programme gestartet werden. Daneben gibt es
über Sockets angebunden Monitorclients
Vielleicht wäre es vernünftig, einen ORB mit C-Mapping zu nehmen
und über das isdnlog die dialupmanager-Sachen einzubauen.
Allerdings hat isdnlog wohl ein echter Programmierer geschrieben,
man braucht wirklich Talent um durchzublicken.
Die Überlegung war, Isdnlog in C++/CORBA zu reengineeren (z.B. sollten
die Tarifabhängigen Sachen vom Monitoring getrennt werden).
Ideen:
- ISDN-Protocoll-Tracer
- Tarifinformation (Least-Cost-Router mit CORBA-Traderdienst ?)
Nach tagelangen Plagen habe ich mich dann doch zu einem eigenen Device entschlossen und habe damit mal Kern-Programmierung gemacht.
- Dld-Winclients (entdeckt von Stefan Hanser)
- können betriebssystemübergreifend
Isdn-Devices auf Linux kontrollieren
- Dialcontrol (entdeckt von Walter Jäger)
-
- unterstützt auch Modem und andere (prinzipiell wäre das auch bei uns möglich, nur
ist es sehr wahrscheinlich, daß wenn mehrere Nutzer vorhanden sind, auch ISDN vorhanden
ist)
- Protocol setzt direkt auf UDP auf (hat Vorteile, aber die Implementierung ist aufwendiger,
weil CORBA für uns die Arbeit macht.)
- schon mehrere Clients (die könnten wir umbauen :-)
- DialMon (entdeckt von Walter Jäger)
-
Rudolf Weber
Informatik- und Netzwerkverein Ravensburg e.V