Struktureller überblick über die Standard-Skripte

incoming.py

Das Incoming-Skript behandelt alle eingehenden Verbindungen. Es liest zwei Konfigurationsdateien, die alle benötigten Daten enthalten, die detailliert im „Skript-Konfiguration“ beschrieben wurden. Die Gesamtstruktur wird hier beschrieben und gibt Ihnen einen überblick, wie es implementiert ist.

Zuerst (nachdem einige benötigte Module importiert wurden) wird die benötigte Funktion callIncomingdefiniert, die bei Bedarf andere Funktionen aufruft.

Funktion callIncoming

Diese Funktion beginnt mit einem Aufruf von cs_helpers.readConfig, um die Konfiguration zu lesen. Sie iteriert dann über alle Abschnitte, die die konfigurierten Benutzer repräsentieren (außer GLOBAL), um zu prüfen, ob die angerufene Nummer zu irgendeinem Benutzer gehört. Wenn eine übereinstimmumg gefunden wurde, wird der Benutzer und der definierte Service unter curr_user und curr_service gespeichert.

Wenn keine übereinstimmumg gefunden wurde (curr_user ist leer), wird der Anruf abgewiesen und die Funktion verlassen. Andernfalls wird das Verzeichnis für eingehende Faxe oder Sprach-Daten ermittelt und erzeugt, falls es noch nicht existiert.

Zuletzt wird noch ein Log-Eintrag erzeugt, der Anruf mit dem richtigen Service (Fax oder Sprache) angenommen und entweder faxIncoming oder voiceIncoming aufgerufen. Die Funktion definiert außerdem einen Exception-Handler für capisuite.CallGoneError.

Funktion faxIncoming

faxIncoming ist ziemlich einfach: sie erzeugt einen eindeutigen Dateinamen, ruft capisuite.fax_receive auf, baut die Verbindung ab und protokolliert den Grund des Verbindungsabbaus. Danach prüft sie, ob wirklich ein Fax erfolgreich empfangen wurde (d.h. ob die Datei existiert). Wenn ja, erzeugt sie eine Beschreibungsdatei dafür, ändert den Eigentümer der Datei auf den richtigen Benutzer und verschickt die Datei als Mail.

Funktion voiceIncoming

voiceIncoming hat viel mehr Aufgaben zu erledigen, wie Fax-Erkennung und Wechsel in den Fax-Modus, die Fernabfrage starten usw.

Sie fängt mit dem Bestimmen des zu verwendenden Verzeichnisses und dem Erzeugen eines eindeutigen Dateinamens an. Außerdem wird die PIN für die Fernabfrage in einer privaten Variable gespeichert. Es gibt jetzt zwei Möglichkeiten: der Benutzer hat bereits eine eigene Ansage - in diesem Fall wird sie jetzt abgespielt. Andernfalls wird eine vordefinierte Ansage, die einen allgemeinen Text und die angerufene Nummer enthält, abgespielt. Wenn das Aufnehmen einer Nachricht nicht deaktivert wurde (indem voice_action auf None gesetzt wurde), start die Aufnahme jetzt nach dem Piep.

Alle bisher benutzten Aufrufe von audio_send und audio_receive hatten DTMF-Abbruch aktiviert, sodass das Skript alle Anrufe "überspringt", nachdem ein DTMF-Signal erkannt wurde. Danach wird read_DTMF verwendet, um zu prüfen, ob so ein Signal erkannt wurde. "X" steht für den Fax-Ton und schaltet auf das Fax-Protokoll um und ruft faxIncoming auf. Alle anderen empfangenen Signale werden als Teil der PIN für die Fernabfrage interpretiert. Deshalb wird eine Schleife durchlaufen, die 3 Sekunden nach jedem Ton auf den nächsten wartet. Wenn eine gültige PIN eingegeben wird, startet sie remoteInquiry. Nach drei falschen Versuchern bricht sie die Verbindung ab.

Nach dem Verbindungsabbau und dem Protokollieren wird ein eine Beschreibungsdatei geschrieben (wenn die aufgenommene Datei existiert), bei beiden Dateien wird der Eigentümer auf den richtigen Benutzer geändert und die aufgenommene Nachricht wird an ihn/sie gemailt.

Funktion remoteInquiry

remoteInquiry startet mit dem Erzeugen einer Lock-Datei und dem Anfordern einer exklusiven Sperre darauf, um zu verhindern, dass zwei Fernabfragen für den selben Benutzer parallel laufen. Wenn die Sperre nicht angefordert werden kann, wird eine Fehlermeldung abgespielt und die Funktion wird verlassen. Wenn das Sperren erfolgreich war, wird eine Liste der aufgenommenen Sprachanrufe erstellt, indem das Benutzerverzeichnis aufgelistet, gefiltert und sortiert wird. Jetzt wird eine Datei namens last_inquiry gelesen, wenn sie existiert. Sie enthält die Nummer der zuletzt angehörten Nachricht. Mit dieser Information können die alten Nachrichten in eine separate Liste heraus gefiltert werden, sodass sich der Anrufer zuerst die Nachrichten anhören kann, die er noch nicht kennt.

Die Anzahl neuer Nachrichten wird angesagt, gefolgt von einem kleinen Menü, in dem der Anrufer auswählen kann, ob er entweder eine Ansage aufnehmen oder eine aufgezeichnete Nachricht anhören möchte. Wenn er die Aufnahme einer Ansage auswählt, wird die Funktion newAnnouncement aufgerufen, andernfalls wird mit remoteInquiry weiter gemacht.

Jetzt läuft eine Schleife zuerst über alle neuen und dann über alle alten Nachrichten. Sie beginnt, indem sie dem Anrufer mitteilt, wieviele Nachrichten gefunden wurden. Dann werden alle Nachrichten abgespielt, indem die folgenden Schritte für jede wiederholt werden:

  • Lesen der Beschreibungsdatei der aktuellen Nachricht

  • Abspielen eines Informationsblocks, der die aktuelle Nummer der Nachricht, den Absender, den Empfänger sowie Datum und Uhrzeit des Anrufs enthält.

  • Abspielen der Nachricht

  • Anbieten eines Menüs, in dem der Anrufer zur nächsten oder vorigen Nachricht gehen kann, die aktuelle Nachricht wiederholen oder löschen kann.

Am Ende wird der Anrufer informiert, dass keine weiteren Nachrichten vorhanden sind und dass die Verbindung beendet wird. Danach wird die Lock-Datei wieder freigegeben und gelöscht.

Funktion newAnnouncement

newAnnouncement präsentiert dem Anrufer zuerst einige Instruktionen. Danach wird die neue Ansage in eine temporäre Datei aufgezeichnet. Um dem Benutzer die Möglichkeit zu geben, die Ansage zu überprüfen, wird sie nun noch einmal abgespielt, gefolgt von einem Menü, das es dem Benutzer erlaubt, die Ansage zu speichern oder die Aufnahme zu wiederholen. Wenn der Benutzer sie speichern will, wird sie von der temporären Datei nach announcement.la im Sprach-Verzeichnis des Benutzers verschoben und der Eigentümer auf ihn geändert. Der Anruf wird abgeschlossen mit einer Bestätigung an den Anrufer, dass die Ansage erfolgreich gespeichert wurde.

idle.py

Das Idle-Skript ist verantwortlich für das Einsammeln der Jobs aus den Send-Queues (wo sie von capisuitefax gespeichert werden) und deren Versendung an die angegebenen Empfänger. Es liest seine Konfiguration ebenfalls aus den Dateien, die im „Skript-Konfiguration“ beschrieben wurden.

Funktion idle

Nach dem Lesen der Konfiguration durch den Aufruf von cs_helpers.readConfig und dem Prüfen der Existenz der benötigten Archiv-Verzeichnisse wird die Benutzerliste aus der Liste der vorhandenen Abschnitte erstellt.

Für jeden Benuzter, der ein gültiges Fax-Setup besitzt (andernfalls wird dieser Benutzer übersprungen), wird die Send-Queue überprüft. Wenn die benötigten Queue-Verzeichnisse nicht existieren, werden sie erzeugt. Danach wird eine Liste namens files mit den Namen aller Dateien in der Send-Queue erstellt und gefiltert, damit sie nur Fax-Aufträge enthält.

Für jeden gefundenen Auftrag wird ein Sicherheits-Check gemacht, um zu prüfen, ob er vom richtigen Benutzer erzeugt wurde. Wenn dieser Check erfolgreich war, wird eine Lock-Datei erzeugt und eine Sperre darauf angefordert. Dies verhindert, das der capisuitefax-Befehl einen Auftrag abbricht, während er übertragen wird. Danach wird die Existenz der Datei überprüft (vielleicht wurde der Auftrag abgebrochen, bevor wir eine Sperre bekommen konnten?).

Jetzt wird die Beschreibungsdatei für diesen Auftrag gelesen und die Startzeit wird überprüft. Wenn sich noch nicht erreicht ist, macht das Skript mit dem nächsten Auftrag weiter. Andernfalls werden einige Parameter aus der Konfiguration genommen und ein Log-Eintrag erzeugt. Die Datei wird durch den Aufruf von sendfax übertragen. Das Ergebnis wird gespeichert und protokolliert. Wenn der Auftrag erfolgreich war, wird er ins Done-Verzeichnis verschoben und eine Bestätigung an den Benutzer gemailt. Wenn er nicht erfolgreich war, wird die Verzögerungszeit aus der Konfiguration bestimmt und die neue Startzeit wird berechnet, indem die alte Startzeit um das Intervall erhöht wird. Ein Zähler für die Versuche wird erhöht und die Beschreibungsdatei wird mit den neuen Werten neu geschrieben. Wenn die Anzahl der Versuche das konfigurierte Maximum überschreitet, wird der Auftrag in das Failed-Verzeichnis verschoben und der Fehler wird dem Benutzer per Mail berichtet.

Zuletzt wird die Lock-Datei entsperrt und gelöscht.

Funktion sendfax

Diese Funktion realisiert den Sendeprozess. Nachdem die zu verwendende MSN entweder aus der outgoing_MSN-Einstellung oder aus der fax_numbers-Liste bestimmt wurde, wird ein Anruf zum Ziel initiiert. Wenn dies schief geht, wird die Funktion verlassen; andernfalls wird die Datei gesendet und die Verbindung beendet.

Funktion movejob

Dies ist eine kleine Hilfsfunktion, die zum Verschieben eines Auftrags und der zugehörigen Beschreibungsdatei in ein anderes Verzeichnis verwendet wird.

capisuitefax

capisuitefax erlaubt das Einreihen von Fax-Aufträgen, das Auflisten der aktuellen Queue und das Abbrechen von Aufträgen. Es wird nicht direkt vom CapiSuite-System benutzt - es ist ein Frontend für das Send-Queue-Verzeichnis des Benutzers. Es hat verschiedene Kommandozeilenoptionen - eine Beschreibung finden Sie im „Faxe Versenden“.

Es werden zunächst drei Hilfsfunktionen definiert. usage gibt einen kleinen Hilfetext aus, wenn "--help" oder "-h" als Parameter angegeben wurde oder wenn ein unbekannter Parameter übergeben wurde. showlist erstellt ein Listing des Send-Queue-Verzeichnisses des Benutzers und gibt es schön formatiert als Tabelle aus. abortjob entfernt einen Auftrag aus der Queue. Sie macht dies sicher, indem eine Lock-Datei verwendet wird, damit es keine Konflikte mit dem Sendeprozess gibt.

Der Haupt-Code dieses Skripts prüft zuerst die angegebenen Kommandozeilenoptionen. Es setzt verschiedene Variablen auf die übergebenen Werte. Nach einigen Gültigkeitprüfungen der Optionen, der Benutzerrechte für das Versenden von Faxen und der Existenz der erforderlichen Verzeichnisse, erfüllt es die gewünschte Aufgabe. Entweder wird listqueue aufgerufen, um ein Listing der aktiven Aufträge anzuzeigen, abortjob, um einen Job abzubrechen oder die angegebenen Dateien werden verarbeitet und in die Queue geschrieben.

Um einen Auftrag zu verarbeiten, wird seine Existenz und sein Format geprüft. Momentan ist nur PostScript erlaubt. Der CapiSuite-Kern selbst unterstützt nur das SFF-Format. Deshalb werden die Dateien mit ghostscript von PostScript nach SFF konvertiert. Zuletzt wird die Beschreibungsdatei für den Auftrag erstellt, die die angegebenen Parameter wie die Empfängernummer enthält.

cs_helpers.py

Das cs_helpers.py-Skript enthält viele kleine Hilfsfunktionen, die in anderen Skripten verwendet werden. Diese sind:

readConfig

Liest entweder die Konfigurationsdateien, die im „Skript-Konfiguration“ beschrieben sind oder eine beliebige Konfigurationsdatei wie die Beschreibungsdateien, die zu jeder empfangenen Datei oder zu jedem ausgehenden Auftrag gehören.

getOption

Liest eine Option aus dem angegebenen Benutzerabschnitt oder nimmt den globalen Abschnitt, wenn keiner gefunden wurde.

getAudio

Liest eine Audio-Datei aus dem Benutzerverzeichnis oder dem globalen CapiSuite-Verzeichnis.

uniqueName

Konstruiert einen neuen Dateinamen im angegebenen Verzeichnis aus einem gegebenen Präfix & Suffix und fügt einen Zähler hinzu. Siehe auch „Verwendung vernünftiger Dateinamen“.

sendMIMEMail

Sendet eine E-Mail mit Attachment an den angegebenen Benutzer. Sie unterstützt auch automatische Format-Konvertierung SFF -> PDF und invertiert A-Law -> WAV.

sendSimpleMail

Sendet eine normale E-Mail ohne Attachment an den angegebenen Benutzer.

writeDescription

Erzeugt eine Beschreibungsdatei, die später von readConfig gelesen werden kann.

sayNumber

Unterstützt die Ansage einer Nummer, indem verschiedene Wave-Fragmente verwendet werden. Funktioniert momentan nur für deutsche Ausgabe.

Eine detaillierte Beschreibung aller Funktionen und ihrer Verwendung finden Sie in den Skripten selbst. Dort gibt es Kommentare, die jede Funktion im Detail beschreiben.