Sonata — SIP-Provisioning-Server

Ich weiß nicht, womit ich die Bereitstellung vergleichen soll. Vielleicht mit einer Katze? Es geht auch ohne, aber mit ihr ist es doch etwas besser. Besonders, wenn sie funktioniert ) )

Problemstellung:

  1. Ich möchte SIP-Telefone schnell, einfach und sicher einrichten. Bei der Installation des Telefons und erst recht bei seiner Neukonfiguration.
  2. Viele Hersteller haben ihre eigenen Konfigurationsformate, ihre eigenen Tools zur Generierung von Konfigurationen, ihre eigenen Möglichkeiten zum Schutz von Konfigurationen. Und sich mit jedem einzelnen auseinanderzusetzen, möchte man nicht wirklich.
  3. Viele Provisioning-Lösungen a) sind auf einen bestimmten Anbieter oder ein bestimmtes Telefonsystem ausgerichtet, b) sind ziemlich umständlich umgesetzt, mit vielen Skripten, Parametern, brr...

Zu Punkt 3 möchte ich anmerken, dass es ausgezeichnete Provisioning-Systeme gibt für FreePBX, für FusionPBX, für Kazoo, wo im öffentlichen Zugang Vorlagen für Telefone verschiedener Anbieter verfügbar sind. Es gibt kommerzielle Lösungen, bei denen man auch im Provisioning-Modul die Geräte verschiedener Hersteller konfigurieren kann, zum Beispiel die Yeastar-Telefonanlage.

Auf Habr gibt es auch viele Rezepte, wie man Geräte verschiedener Anbieter einrichtet: eins, zwei. Aber wie das Sprichwort sagt, jedes System hat einen fatalen Mangel. Daher bauen wir unser eigenes Fahrrad.

ein eigenes Format

Wie in xkcd gesagt wird, wenn du dich nicht mit 14 Formaten auseinandersetzen möchtest, erfinde das 15.. Daher verwenden wir allgemeine Einstellungen für jedes Telefon und erstellen unser eigenes JSON-Konfigurationsformat.

Ungefähr 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"
      }
   ]
}

Also, in jedem Telefon müssen die lokale Zeit und die SIP-Linien eingestellt werden. Das ist ganz einfach. Weitere Beispiele kann man sich anschauen hier.

auf unserem Provisioning-Server

In den Handbüchern der Hersteller findet man normalerweise einen Punkt, der besagt: Nehmen Sie eine CSV, tragen Sie dort Login-Passwort-MAC-Adresse ein, generieren Sie mit unserem firmeneigenen Skript die Dateien, legen Sie sie unter den Apache-Webserver und es wird gut.

Im nächsten Punkt des Handbuchs wird normalerweise erklärt, dass man die generierte Konfigurationsdatei auch verschlüsseln kann.

Aber das ist alles klassisch. Der moderne Ansatz mit Smoothies und Twitter besagt, dass man einen einfachen Webserver erstellen sollte, der nicht so leistungsstark wie Apache ist, sondern nur eine kleine Aufgabe erledigt: Konfigurationen über einen Link zu generieren und bereitzustellen.

Hier halten wir kurz inne und erinnern uns daran, dass fast alle SIP-Telefone jetzt 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 dem Geräteschlüssel und einen allgemeinen, der über die Kombination aus einem gemeinsamen Token und der MAC-Adresse funktioniert.

Ich werde auch nicht auf die Zero-Configuration eingehen, d.h. die Einrichtung des Telefons „von null“, wenn Sie es einfach in das Netzwerk stecken und es sofort funktioniert. In meinem Szenario stecken Sie es in das Netzwerk, führen eine Vorabkonfiguration durch (stellen Sie es so ein, dass es die Konfiguration vom Bereitstellungsserver abruft) und genießen dann eine Piña Colada, während Sie das Telefon wie benötigt über die Bereitstellung umkonfigurieren. Das Vergeben von Option 66 ist die Aufgabe des DHCP-Servers.

Übrigens habe ich es wirklich leid, „Provisioning“ zu sagen, deshalb wurde das Wort auf „Provision“ verkürzt, bitte treten Sie mir nicht in den Hintern.

Und noch etwas: Unser Bereitstellungsserver hat keine Benutzeroberfläche, also kein UI. Vielleicht irgendwann, aber ich bin mir nicht sicher, da ich es nicht benötige. Stattdessen gibt es eine API zum Speichern/Löschen von Einstellungen, zum Abrufen von Listen unterstützter Anbieter und Modelle, alles beschrieben gemäß der Swagger-Spezifikation.

Warum API und nicht UI? Da ich bereits mein eigenes Telefonsystem habe, gibt es dort eine Quelle für Anmeldedaten, wo ich diese Daten einfach abrufen, das benötigte JSON zusammenstellen und auf dem Bereitstellungsserver veröffentlichen kann. Der Bereitstellungsserver gibt dann gemäß den Regeln, die in der JSON-Datei angegeben sind, dem entsprechenden Gerät seine Konfiguration zurück oder nicht, wenn das Gerät nicht passt oder nicht den Kriterien entspricht, die ebenfalls in diesem JSON angegeben sind.

Sonata — SIP-Provisioning-Server

So ist dieser Bereitstellungs-Microservice entstanden. Er heißt sonata, der Quellcode ist auf GitHub verfügbar, es gibt auch ein fertiges Docker-Image, ein Beispiel für die Verwendung von Docker. hier.

Wichtige Merkmale:

  • in jedem Fall eingeschränkter Zugang zur Konfiguration zeitlich, standardmäßig 10 Minuten. Wenn Sie die Konfiguration erneut verfügbar machen möchten, veröffentlichen Sie die Konfiguration erneut.

  • ein Format für alle Anbieter, alle Anpassungen wurden in sonata untergebracht, Sie senden ein standardisiertes JSON, konfigurieren jedes verfügbare Gerät.

  • 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 einem Token zu verwenden, wobei jedes Telefon seine eigene Konfiguration erhält, indem die MAC-Adresse angegeben wird. Alternativ kann ein personalisierter Link über einen Schlüssel angegeben werden.

  • API für das Management und die Ausgabe von Konfigurationen für Telefone sind portabhängig getrennt.

  • Tests. Es war mir sehr wichtig, das Format der ausgegebenen Konfiguration zu fixieren und alle normalen Situationen der Bereitstellung von Konfigurationen zu testen, damit alles klar funktioniert.

Nachteile:

Momentan wird in der Sonata kein Verschlüsselung verwendet. Das heißt, Sie können natürlich beginnen, HTTPS zu nutzen, indem Sie beispielsweise Nginx vor die Sonata setzen. Aber die proprietären Methoden sind bisher noch nicht implementiert. Warum? Das Projekt ist noch jung und hat bisher vielleicht gerade einmal die erste Hundert Geräte bereitgestellt. Und ich sammele selbstverständlich Ideen und Feedback. Um alles sicher zu machen, sodass die Konfigurationen nicht im Netzwerk abgehört werden können, wäre es wahrscheinlich sinnvoll, sich um Verschlüsselungsschlüssel, TLS und ähnliche Dinge zu kümmern, aber das wird zukünftig sein.

Fehlende UI. Das könnte ein wesentlicher Nachteil für den Endbenutzer sein, aber für den Systemadministrator ist in der Regel ein Konsolenprogramm wichtiger als eine vollständige Anwendung. Es war geplant, ein Konsolenprogramm zu erstellen, aber ich bin mir nicht sicher, ob es notwendig ist.

Was kommt dabei heraus?

Ein kleiner und einfacher Webserver zur Bereitstellung mehrerer Telefondmodelle mit einer API für das Management.

Nochmals, wie sollte das funktionieren?

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

In der weiteren Nutzung sind nur zwei Schritte notwendig:

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

Welche Telefone werden bereitgestellt?

Die Hersteller Grandstream, Fanvil, Yealink. Die Konfigurationen innerhalb des Herstellers sind mehr oder weniger gleich, können aber je nach Firmware unterschiedlich sein - möglicherweise muss zusätzlich getestet werden.

Welche Regeln können festgelegt werden?

Nach Zeit. Sie können die Zeit angeben, bis zu der die Konfiguration verfügbar sein wird.
Nach MAC-Adresse. Bei der Ausgabe der Konfiguration über den personalisierten Link wird die MAC-Adresse des Geräts ebenfalls ü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 nutzen eine Online-Utility für Testanfragen an die API.

Okay, großartig. Das ist cool, wie kann ich es ausprobieren?

Am einfachsten ist es, ein Docker-Image aus dem Repository bereitzustellen sonata-sample. Im Repository liegt eine Installationsanleitung.

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

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

Wird Sonata weiterentwickelt?

Teilweise habe ich meine Ziele erreicht. Die weitere Entwicklung ist eine Frage meiner Aufgaben zum Thema Automatisierung der Telefonkonfiguration. Es gibt noch die Möglichkeit, die Konfigurationen zur Tastenanpassung des Telefons zu erweitern, Adressbuch-Provisioning hinzuzufügen, möglicherweise noch etwas anderes, schreiben Sie in die Kommentare.

Zusammenfassung und Danksagungen

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

Ich danke auch allen Kollegen, die geholfen, beraten, getestet und Telefone für Tests bereitgestellt/geschenkt haben. Tatsächlich sind viele Menschen in unterschiedlichem Maße an dem Projekt beteiligt, mit denen ich beruflich, in AsterConf‘e, in Chats und E-Mails gesprochen habe. Danke für die Ideen und Gedanken.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster