Sonata — SIP Bereitstellungsserver

Ich weiß nicht, womit ich das Provisioning vergleichen soll. Vielleicht mit einer Katze? Es scheint, man könnte auch ohne sie auskommen, aber mit ihr ist es irgendwie besser. Besonders, wenn sie arbeitet))

Problemdarstellung:

  1. Ich möchte SIP-Telefone schnell, einfach und sicher konfigurieren. Sowohl bei der Installation des Telefons als auch bei einer Neukonfiguration.
  2. Viele Anbieter haben ihre eigenen Konfigurationsformate, ihre eigenen Tools zur Generierung von Konfigurationen und ihre eigenen Methoden zum Schutz dieser Konfigurationen. Es ist nicht sehr verlockend, sich mit jedem einzelnen auseinanderzusetzen.
  3. Viele Provisioning-Lösungen sind a) auf einen Anbieter oder ein Telefonsystem ausgelegt und b) sehr umständlich umgesetzt, mit vielen Skripten, Parametern, brrr ...

Zu Punkt 3 möchte ich anmerken, dass es großartige Provisioning-Systeme gibt für FreePBX, für FusionPBX, für Kazoo, bei denen im öffentlichen Bereich Vorlagen für Telefone verschiedener Anbieter verfügbar sind. Es gibt kommerzielle Lösungen, bei denen man auch im Provisionierungsmodul die Arbeit von Telefonen verschiedener Hersteller einrichten kann, beispielsweise die Telefonanlage Yeastar.

Auf Habr gibt es viele Rezepte, wie man Geräte verschiedener Anbieter einrichten kann: eins, zwei. Aber wie man so schön sagt, jede Lösung hat einen gravierenden Nachteil. Daher werden wir unser eigenes Rad erfinden.

unser eigenes Format

Wie xkcd sagt, willst du dich nicht mit 14 Formaten herumschlagen - erfinde das 15.. Deshalb verwenden wir allgemeine Einstellungen für jedes Telefon und erstellen unser eigenes JSON-Format für die Konfiguration.

Etwa so:

{
   "key": "sdgjdeu9443908",
   "token": "590sfdsf8u984",
   "model": "gxp1620",
   "vendor": "grandstream",
   "mac": "001565113af8",
   "timezone_offset": "GMT+03",
   "ntp_server": "pool.ntp.org",
   "status": true,
   "accounts": [
      {
         "name": "Mobilon",
         "line": 1,
         "sip_register": "sip.mobilonsip.ru",
         "sip_name": "sip102",
         "sip_user": "sip102",
         "sip_password": "4321",
         "sip_auth": "sip102"
      }
   ]
}

In jedem Telefon muss die lokale Zeit und die SIP-Linien konfiguriert werden. Das ist ganz einfach. Weitere Beispiele können angesehen werden. hier.

dein Provisionierungsserver

In den Handbüchern des Herstellers gibt es normalerweise einen Abschnitt, der besagt: Nimm eine CSV, schreibe dort Login-Passwort-MAC-Adresse hinein, generiere mit unserem speziellen Skript die Dateien und lege sie unter den Apache-Webserver, dann wird alles gut.

Im nächsten Abschnitt des Handbuchs wird normalerweise erklärt, dass die generierte Konfigurationsdatei auch verschlüsselt werden kann.

Das ist alles klassisch. Der moderne Ansatz mit Smoothies und Twitter besagt, dass man einen einfachen Webserver einrichten sollte, der nicht so leistungsstark wie Apache ist, sondern einfach eine kleine Aufgabe erfüllt: Konfigurationen bereitstellen und ausliefern.

Hier halten wir inne und erinnern uns daran, dass fast alle SIP-Telefone heutzutage Konfigurationen über http/https abrufen können, weshalb wir andere Implementierungen (ftp, tftp, ftps) nicht betrachten. Jedes Telefon kennt seine MAC-Adresse. Daher werden wir zwei Links erstellen: einen persönlichen – basierend auf der Gerätenummer und einen allgemeinen, der mit einem gemeinsamen Token und der MAC-Adresse funktioniert.

Ich werde auch nicht auf die Zero-Config eingehen, d.h. die Einrichtung eines Telefons "von Grund auf", das heißt, Sie stecken es ins Netzwerk und es funktioniert sofort. Nein, in meinem Szenario stecken Sie es ins Netzwerk, führen eine vorläufige Konfiguration durch (stellen es so ein, dass es die Konfiguration vom Provisioning-Server erhält), und dann genießen Sie Ihren Pina Colada und konfigurieren das Telefon nach Bedarf über das Provisioning. Die Bereitstellung von Option 66 ist die Aufgabe des DHCP-Servers.

Übrigens habe ich es völlig satt, "Provisioning" zu sagen, daher wurde das Wort auf "Provision" verkürzt. Seid bitte nicht böse.

Außerdem: Unser Provisionierungsserver hat keine Benutzeroberfläche (UI). Vielleicht wird es das irgendwann geben, ich bin mir aber nicht sicher, da ich es nicht benötige. Allerdings gibt es eine API zum Speichern/Löschen von Einstellungen und zum Abrufen einer Liste unterstützter Anbieter und Modelle, alles beschrieben gemäß der Swagger-Spezifikation.

Warum API und nicht UI? Da ich bereits ein eigenes Telefonsystem habe, habe ich eine Quelle für Anmeldedaten, aus der ich diese Informationen abrufen, das benötigte JSON erstellen und auf dem Provisionierungsserver veröffentlichen kann. Der Provisionierungsserver gibt dann gemäß den Regeln, die im JSON-Dokument angegeben sind, die entsprechende Konfiguration für das Gerät aus oder gibt sie nicht aus, wenn das Gerät nicht passt oder die in diesem JSON angegebenen Kriterien nicht erfüllt.

Sonata — SIP Bereitstellungsserver

So entstand dieser Provisionierungs-Mikroservice. Er heißt sonata, der Quellcode ist auf GitHub verfügbar, zudem gibt es ein fertiges Docker-Image, ein Beispiel für die Nutzung von Docker. hier.

Hauptmerkmale:

  • In jedem Fall ist der Zugriff auf die Konfiguration zeitlich begrenzt, standardmäßig auf 10 Minuten. Wenn Sie die Konfiguration erneut zugänglich machen möchten, veröffentlichen Sie die Konfiguration einfach erneut.

  • Ein Format für alle Anbieter, alle Anpassungen sind in Sonata integriert. Sie senden einen standardisierten JSON und konfigurieren jede verfügbare Hardware.

  • Alle ausgegebenen Konfigurationen für Geräte werden protokolliert. Alle problematischen Stellen können im Protokoll eingesehen und Fehler erkannt werden.

  • Es ist möglich, einen gemeinsamen Link mit Token zu verwenden. Jedes Telefon erhält seine eigene Konfiguration, wenn die MAC-Adresse angegeben wird. Alternativ kann auch ein persönlicher Link über den Schlüssel bereitgestellt werden.

  • Die API für das Management und die Bereitstellung von Konfigurationen für Telefone ist nach Ports getrennt.

  • Tests. Es war mir sehr wichtig, das Format der ausgegebenen Konfiguration festzuhalten und alle gängigen Szenarien der Konfigurationsausgabe durch Tests abzudecken, damit alles reibungslos funktioniert.

Nachteile:

Derzeit wird innerhalb von Sonata keine Verschlüsselung verwendet. Sie können natürlich HTTPS aktivieren, indem Sie beispielsweise Nginx vor Sonata schalten. Allerdings sind die proprietären Methoden noch nicht implementiert. Warum? Das Projekt ist noch jung und hat gerade einmal seine erste Hundertschaft an Geräten provisioniert. Natürlich sammele ich Ideen und Feedback. Um alles sicher zu gestalten, sodass die Konfigurationen nicht im Netz abgehört werden können, wäre es wahrscheinlich sinnvoll, sich um Verschlüsselungsschlüssel, TLS und ähnliche Technologien zu kümmern, aber das wird ein weiteres Kapitel sein.

Fehlende Benutzeroberfläche. Das mag ein erheblicher Nachteil für den Endbenutzer sein, aber für den Systemadministrator ist das Konsolen-Tool wichtiger als eine vollwertige Anwendung. Eine Konsolenanwendung war geplant, aber ich bin mir nicht sicher, ob sie benötigt wird.

Was ist das Ergebnis?

Ein kleiner und einfacher Webserver, um mehrere Telefonmodelle mit einer API zur Verwaltung zu provisionieren.

Nochmals, wie soll das funktionieren?

  1. Wir installieren Sonata.
  2. Wir erstellen die JSON-Konfiguration und veröffentlichen sie in Sonata.
  3. Dann erhalten wir von Sonata einen Link zur Provisionierung.
  4. Diesen Link geben wir im Telefonapparat an.
  5. Das Gerät zieht die Konfiguration.

In der anschließenden Nutzung sind nur zwei Schritte erforderlich:

  1. Wir erstellen die JSON-Konfiguration und veröffentlichen sie in Sonata
  2. Das Gerät zieht die Konfiguration.

Welche Telefone werden unterstützt?

Die Anbieter sind Grandstream, Fanvil, Yealink. Die Konfigurationen innerhalb eines Anbieters sind mehr oder weniger identisch, können jedoch je nach Firmware variieren – eventuell ist eine zusätzliche Testung erforderlich.

Welche Regeln können festgelegt werden?

Zeitlich. Sie können angeben, bis zu welchem Zeitpunkt die Konfiguration verfügbar ist.
Nach MAC-Adresse. Bei der Bereitstellung der Konfiguration über einen persönlichen Link wird auch die MAC-Adresse des Geräts überprüft.
Nach IP. Nach der IP-Adresse, von der die Anfrage gestellt wurde.

Wie interagiert man mit Sonata?

Über die API, indem HTTP-Anfragen gestellt werden. Die API wird in Ihrer Installation verfügbar sein. Da die API die Swagger-Spezifikation unterstützt, können Sie dies nutzen Online-Tool für Testanfragen an die API.

Gut, klasse. Wie kann ich es ausprobieren?

Am einfachsten ist es, ein Docker-Image basierend auf dem Repository sonata-sampleauszuführen. Im Repository finden Sie eine Installationsanleitung.

А если знаю node.js?

Wenn Sie Erfahrung mit JavaScript haben, werden Sie schnell verstehen, wie alles hier funktioniert.

Wird es eine Weiterentwicklung von Sonata geben?

Ein Teil meiner Ziele habe ich erreicht. Die weitere Entwicklung ist eine Frage meiner Aufgaben im Bereich der Automatisierung der Telefonkonfiguration. Es gibt auch die Möglichkeit, die Konfigurationen für die Tastenbelegung der Telefone zu erweitern, den Provisionierungsadressbuch hinzuzufügen und möglicherweise noch etwas anderes. Schreiben Sie Ihre Ideen in die Kommentare.

Lebenslauf und Danksagungen

Ich freue mich über konstruktive Vorschläge/Einsprüche/Kommentare und Fragen, da es durchaus sein kann, dass ich etwas unklar beschrieben habe.

Ich möchte auch allen Kollegen danken, die geholfen, beraten, getestet und Telefone für die Tests bereitgestellt oder gespendet haben. Tatsächlich sind viele Menschen, mit denen ich bei der Arbeit, in Chats und E-Mails zu tun hatte, unterschiedlich stark am Projekt beteiligt. Vielen Dank für die Ideen und Gedanken. AsterConfIn Chats und E-Mails. Vielen Dank für die Ideen und Gedanken.

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster