Openstage ldap provisioning / File provisioning

158 views
Skip to first unread message

Bernd Kast

unread,
Apr 16, 2014, 12:35:59 PM4/16/14
to gs5-...@googlegroups.com
Hallo,

ich kenne mich mit Telefonanlagen nicht sonderlich gut aus, und habe zuvor nie Ruby programmiert.Mein Ziel war es über Autoprovisioning ein LDAP Telefonbuch auf Openstage 40 zu konfigurieren.
Das funktioniert zwar, allerdings musste ich dafür einiges im Code ändern, unter anderem den Ablauf der Kommunikation zwischen Provisioningservice und Openstages.
Vor allem das Überspielen des Ldap-Templates war knifflig.

Deshalb jetzt die Fragen:
  1. was haltet ihr von meinen Änderungen bzw. gibt es eventuell doch eine einfache, saubere Lösung (ich hatte weder hier noch im Code etwas gefunden)?
  2. in der Datei "app/controllers/config_siemens_controller.rb" sind praktisch alle Variablen aufgelistet, die man an den Openstage einstellen kann, muss man deren Werte (wie ich es gemacht habe) im Code ändern, oder kann man sie über die GUI setzen? Beispiele sind "ldap-server-address" "ldap-user" oder auch "sntp-addr" (die auf "NULL" gesetzt wird s.u)
  3. kann jemand abschätzen ob ich durch das einschieben des Fileprovisionings irgend eine Funktion zerstöre? Die Netzwerkkommunikation, die ich mitgeschnitten habe sieht zwar gut aus (wird erst abgebrochen, wenn der Provisioningserver "CleanUp" sendet) dadurch dass ich keinen Überblick habe bin ich mir trotzdem unsicher, ob nicht etwas schief läuft, oder ich nur gerade Glück habe. V.a.habe ich in der Provisionierungsdoku von Siemens nicht gefunden, ob man Dateien und Einstellungen in einem Schritt provisionieren darf.
Dass ich das ganze durch Autoprovisioning machen möchte liegt daran, dass bei mir sobald ich Autoprovisioning benutzte alle manuellen Änderungen an den Telefonen überschrieben werden. Es war bei mir deshalb nicht mehr möglich LDAP manuell zu konfigurieren. Sogar die Uhrzeit war falsch, da die IP des sntp Servers auf "NULL" gesetzt und nicht die vom DHCP-Server gemeldete Adresse benutzt wurde.

Damit das Template von den Telefonen geholt wird habe ich Folgendes geändert:

  1. eine Datei angelegt, die als Template für das Fileprovisioning dient: "app/views/config_siemens/send-files.xml.erb"
    <DlsMessage xsi:schemaLocation="http://www.siemens.com/DLS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.siemens.com/DLS">
     <Message nonce="
    <%=@my_nonce%>">
     
    <Action>FileDeployment</Action>
       
    <ItemList>
         
    <% @new_settings.each do |setting| %>
            <Item name="
    <%=setting[0]%>" <% if ! setting[1].nil? %>index="<%=setting[1]%>"<%end%>><%=setting[2]%></Item>
         
    <% end %>
       
    </ItemList>
     
    </Message>
    </DlsMessage>
  2. in "app/controllers/config_siemens_controller.rb"
        elsif ["reply-to"].include? contact_reason
          respond_to
    { |format|
            format
    .xml { render :action => "clean-up" }
         
    }
       
    elsif (contact_reason == 'status')
          respond_to
    { |format|
            format
    .xml { render :action => "index" }
         
    }
       
    else
           
    @new_settings = Array.new
           
    @new_settings << ['file-server', nil,  '192.168.3.1' ]
           
    @new_settings << ['file-account', nil,  'gsmaster' ]
           
    @new_settings << ['file-username', nil,  'gsmaster' ]
           
    @new_settings << ['file-pwd', nil,  'Gerlinde' ]
           
    @new_settings << ['file-path', nil,  '/home/gsmaster' ]
           
    @new_settings << ['file-name', nil,  'ldap_templet_openstage.txt' ]
           
    @new_settings << ['file-port', nil,  '21' ]
           
    @new_settings << ['file-type', nil,  'LDAP' ]
            respond_to
    { |format|
            format
    .xml { render :action => "send-files" }
         
    }
    Der Unterschied ist, dass als Standard, wenn kein "if" greift das "send-files"-template gefüllt wird. Als Antwort darauf erhält man immer (auch, wenn das Telefon die Datei nicht holen kann) eine Nachricht mit contact_reason "status" => erst dann wird "index" gesendet (frägt den aktuellen Status aller Parameter ab um sie dann zu setzen). Nicht getestet habe ich, ob man mehrere Dateien auf einmal Provisionieren kann, wenn man anstatt "nil" einen Index benutzt. 


Gruß

Bernd

Sascha Daniels

unread,
Apr 17, 2014, 2:55:03 AM4/17/14
to gs5-...@googlegroups.com
Hi.

Am 16.04.14 18:35, schrieb Bernd Kast:
> Hallo,
>
> ich kenne mich mit Telefonanlagen nicht sonderlich gut aus, und habe
> zuvor nie Ruby programmiert.Mein Ziel war es über Autoprovisioning ein
> LDAP Telefonbuch auf Openstage 40 zu konfigurieren.
> Das funktioniert zwar, allerdings musste ich dafür einiges im Code
> ändern, unter anderem den Ablauf der Kommunikation zwischen
> Provisioningservice und Openstages.
> Vor allem das Überspielen des Ldap-Templates war knifflig.
>
> Deshalb jetzt die Fragen:
>
> 1. was haltet ihr von meinen Änderungen bzw. gibt es eventuell doch
> eine einfache, saubere Lösung (ich hatte weder hier noch im Code
> etwas gefunden)?

Wenn Du Parameter setzen willst, die für alle Telefone gleich sind, bist
Du im Controller genau richtig.

> 2. in der Datei "app/controllers/config_siemens_controller.rb" sind
> praktisch alle Variablen aufgelistet, die man an den Openstage
> einstellen kann, muss man deren Werte (wie ich es gemacht habe) im
> Code ändern, oder kann man sie über die GUI setzen? Beispiele sind
> "ldap-server-address" "ldap-user" oder auch "sntp-addr" (die auf
> "NULL" gesetzt wird s.u)

Eine GUI gibt es dafür nicht. Nur die Tasten können per GUI belegt werden.

> 3. kann jemand abschätzen ob ich durch das einschieben des
> Fileprovisionings irgend eine Funktion zerstöre? Die
> Netzwerkkommunikation, die ich mitgeschnitten habe sieht zwar gut
> aus (wird erst abgebrochen, wenn der Provisioningserver "CleanUp"
> sendet) dadurch dass ich keinen Überblick habe bin ich mir trotzdem
> unsicher, ob nicht etwas schief läuft, oder ich nur gerade Glück
> habe. V.a.habe ich in der Provisionierungsdoku von Siemens nicht
> gefunden, ob man Dateien und Einstellungen in einem Schritt
> provisionieren darf.
>
> Dass ich das ganze durch Autoprovisioning machen möchte liegt daran,
> dass bei mir sobald ich Autoprovisioning benutzte alle manuellen
> Änderungen an den Telefonen überschrieben werden. Es war bei mir deshalb
> nicht mehr möglich LDAP manuell zu konfigurieren. Sogar die Uhrzeit war
> falsch, da die IP des sntp Servers auf "NULL" gesetzt und nicht die vom
> DHCP-Server gemeldete Adresse benutzt wurde.

Es werden natürlich mit Absicht alle Parameter vom Provisioning gesetzt.
Wenn Du einzelne PArameter dem User überlassen willst, kannst Du die
einfach aus dem Controller raus nehmen.

Das mit dem ntp Server ist eigentlich Absicht, damit auch Telefone
provisioniert werden können, die sich nicht im Netz der Telefonanlage
befinden. Es ist nur seltsam, dass der Zeitserver nicht vom DHCP bezogen
wird. Das Problem hatte ich noch nicht.

Da Du eh am Testen bist, wäre es interessant zu wissen, ob er vom DHCP
bezogen wird, wenn Du den Parameter aus dem Controller nimmst, einen
falschen Wert auf dem Telefon von Hand einträgst und dann das Telefon
neu startest.


>
> Damit das Template von den Telefonen geholt wird habe ich Folgendes
> geändert:
>
> 1. eine Datei angelegt, die als Template für das Fileprovisioning
> dient: "app/views/config_siemens/send-files.xml.erb"
> |
> <DlsMessagexsi:schemaLocation="http://www.siemens.com/DLS"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.siemens.com/DLS">
> <Message nonce="<%=@my_nonce%>">
> <Action>FileDeployment</Action>
> <ItemList>
> <%@new_settings.each do|setting|%>
> <Item name="<%=setting[0]%>"
> <%if!setting[1].nil?%>index="<%=setting[1]%>"<%end%>><%=setting[2]%></Item>
> <%end%>
> </ItemList>
> </Message>
> </DlsMessage>
> |
> 2. in "app/controllers/config_siemens_controller.rb"
> |
> elsif["reply-to"].include?contact_reason
> respond_to {|format|
> format.xml {render :action =>"clean-up"}
> }
> elsif(contact_reason =='status')
> respond_to {|format|
> format.xml {render :action =>"index"}
> }
> else
> @new_settings=Array.new
> @new_settings<<['file-server',nil, '192.168.3.1']
> @new_settings<<['file-account',nil, 'gsmaster']
> @new_settings<<['file-username',nil, 'gsmaster']
> @new_settings<<['file-pwd',nil, 'Gerlinde']
> @new_settings<<['file-path',nil, '/home/gsmaster']
> @new_settings<<['file-name',nil, 'ldap_templet_openstage.txt']
> @new_settings<<['file-port',nil, '21']
> @new_settings<<['file-type',nil, 'LDAP']
> respond_to {|format|
> format.xml {render :action =>"send-files"}
> }
> |
> Der Unterschied ist, dass als Standard, wenn kein "if" greift das
> "send-files"-template gefüllt wird. Als Antwort darauf erhält man
> immer (auch, wenn das Telefon die Datei nicht holen kann) eine
> Nachricht mit contact_reason "status" => erst dann wird "index"
> gesendet (frägt den aktuellen Status aller Parameter ab um sie dann
> zu setzen). Nicht getestet habe ich, ob man mehrere Dateien auf
> einmal Provisionieren kann, wenn man anstatt "nil" einen Index benutzt.
>

Das mit den mehreren Dateien kann funktionieren, ist aber beim Openstage
zickig, weil der Response Body eine gewisse Grösse nicht übersteigen
darf. Das musst Du aber ausprobieren. Allgemein hält sich das
Provisioning auch nicht ganz an den Siemens Standard. Es werden immer
alle Parameter gesendet. Egal was das Telefon will. Im Zweifelsfall holt
es sich dann mehrmals hintereinander alle Parameter, falls der Body zu
gross wird.

Gruss

Sascha



--
Sascha Daniels
s...@alternative-solution.de
www.alternative-solution.de

Bernd Kast

unread,
Apr 17, 2014, 8:30:27 AM4/17/14
to gs5-...@googlegroups.com
Hallo,

danke für die Antwort.

Zum NTP-Server:
Beim Start wird zunächst die Zeit korrekt vom NTP-Server abgefragt. Das sieht man daran, dass die richtige Zeit, allerdings in UTC angezeigt wird.
Nachdem Provisioniert wurde wird zunächst die komplett richtige, von gs5 gesetzte Zeit angezeigt (UTC+2h) danach allerdings 0:00 1970 und im Webinterface steht als NTP-Server "NULL"
Ich vermute, dass das Telefon den Parameter mit dem NTP-Server nicht benutzt, wenn er nie gesetz wurde, allerdings nicht verträgt, wenn man ihn von einem validen Wert zurücksetzt sondern dann trotzdem versucht eine Zeit abzufragen.

Zum Provisioning:
Die Größenbeschränkung sollte nicht so dramatisch sein, da meine Nachrichten deutlich kleiner sind, als die vom Ursprünglichen Code generierten.Die Dateien werden ja auch selbständig auf einem anderen Weg bezogen und nicht mit der Nachricht mitgeschickt. Danke trotzdem für den Hinweiß mit dem Splitting.

Gibt es eigentlich eine Doku, wo man welche Änderungen vornehmen kann und soll? Selbst im Code sind Kommentare relativ rar, weshalb ich mir unsicher war ob Änderungen an der Stelle angedacht sind.
Hier in der Gruppe bekommt man recht schnell und kompetet Antworten - ist das der normale Weg oder gibt es noch Entwickler-Wiki?

Gruß
Bernd

Bernd Kast

unread,
Apr 17, 2014, 11:44:31 AM4/17/14
to gs5-...@googlegroups.com
Hallo,

mir ist noch etwas aufgefallen, eventuell ein Bug, allerdings wird kaum jemand davon betroffen sein:
Beim letzten Kommando, das der Provisioningserver an das Telefon schickt (clean-up) wird der Parameter "nonce" nicht gesetzt.
Das macht normalerweise nichts, nur wenn ich jetzt mehrere Dateien auf einmal provisioniere, dann wird nach der ersten Datei, die sich das Telefon läd an den Server "local-changes" gesendet. Der Server antwortet darauf mit "clean-up" und bricht, dadurch, dass "nonce" nicht gesetzt ist, zumindest bei mir, alle Verbindungen ab, inklusive der noch nicht vollständigen Provisionings.
Behoben habe ich das Problem, indem ich
      @my_nonce = params[:WorkpointMessage][:Message][:nonce]

vor jedem
      respond_to { |format|
        format
.xml { render :action => "clean-up" }
eingefügt habe. Es funktioniert, ist aber bestimmt nicht die beste Lösung.
Das Problem dürfte daran liegen, dass "nonce" sonst nur gesetzt wird, wenn diese Bedingung erfüllt ist:
    if ! @phone.nil? && ! @sip_account.blank?
und das ist nicht immer der Fall. Weiß jemand, weshalb "nonce" nicht immer gefüllt wird, sondern nur falls diese Bedingung erfüllt ist?
Kann es auch jemand anders nachvollziehen?
Soll ich einen Bug melden?

Gruß Bernd



Reply all
Reply to author
Forward
0 new messages