---
# System prepended metadata

title: SIPOHTTPS proxy

---

# SIPOHTTPS proxy


[ToC]




> Huom! Sipserverien asetuksiin pitää lisätä määritys client_timeout="0" /koha/koha-dev/etc/SIPconfig/SIPconfig.xml-tiedostossa, jotta sipserveri, jonka kanssa proxyserveri juttelee, ei aikakatkaise yhteyttä proxyserveriin.
 
 ### Viestintä
 
Tcpserver.pl -proxyskripti ja REST-rajapinnan kutsuma SipOHttp.pm -moduli keskustelevat Socketeilla, joiden välinen yhteys luodaan SipOHttp.pm-modulissa aina uuden viestin saapuessa endpointiin (käynnistää SipOHttp.pm-modulin process-metodin). Kun viesti on käsitelty, socket-yhteys katkeaa. Itse sip-palvelimen kanssa socket-yhteyttä pidetään aina auki (client_timeout="0"), ellei sip-palvelin katkaise yhteyttä (Virheellinen lainausautomaatin/laitteen kirjautumisyritys tai sip-palvelimesta riippumaton ongelma).
 Sipserveriin muodostetaan socket-yhteys, kun proxyskripti käynnistetään. Jos sipserveriin ei saada yhteyttä skriptin käynnistyessä tai viestejä käsiteltäessä, proxyskriptin suoritus katkeaa. 
 
 (Kehitettävää: Mahdollista tarkkailla auki olevaa yhteyttä ulkoisen skriptin avulla? Tarkkailee, onko proxyskriptin prosessi käynnissä? Jos ei ole, sip-palvelin katkaissut yhteyden. Sipserverin on oltava käynnissä ennen kuin sen proxyserveri käynnistetään.)
 
```sequence
sipmessages endpoint->SipOHttp.pm: request_xml
Note right of SipOHttp.pm:Purettu sip-viesti
SipOHttp.pm->tcpserver.pl:
tcpserver.pl->SipServer.pm:
Note right of SipServer.pm: SIP-käsittely
SipServer.pm->tcpserver.pl:
Note left of SipServer.pm: SIP vastaus 
tcpserver.pl->SipOHttp.pm:
Note left of SipOHttp.pm: SIP vastaus xml:ksi
SipOHttp.pm->sipmessages endpoint:
```

### tcpserver.pl

Jokaista HTTPS:ää käyttävää lainausautomaattia varten käynnistetään oma instanssinsa proxyserveri tcpserver.pl:stä.
Sip-palvelimen on oltava käynnissä ennen kuin sen proxyserveri käynnistetään.
Kun skripti käynnistetään, se ottaa vastaan parametrina lainausautomaatin nimen, minkä avulla skripti hakee asetustiedostosta koha/Koha/koha-tmpl/sipdevices.xml socketien tarvitsemat osoitteet ja porttimääritykset käynnistettävälle proxyserveri-instanssille ja sipserverille, minkä kanssa proxyserveri tulee keskustelemaan. Näitä tietoja siis käytetään uusien socketien luontiin tiedonsiirtoa varten.

Jos proxypalvelin käynnistettäisiin systemd:n init-skriptin avulla, esimerkki voisi olla tämän näköinen:

sipdevice1.service

    [Unit]
    Description=systemd service file for the proxy server of sipdevice1

    [Service]
    ExecStart="/home/koha/Koha/C4/SIP/tcpserver.pl" sipdevice1

    User=koha
    Group=koha

Esimerkki määritystiedostosta:

sipdevices.xml:

    <?xml version='1.0' encoding='UTF-8' standalone="yes" ?>
    <sipdevices>
    	<sipdevice1>
                <host>10.0.3.217</host>
                <port>6009</port>
		    <proxyhost>0.0.0.0</proxyhost>
		    <proxyport>2899</proxyport>
	    </sipdevice1>
	    <sipdevice2>
		    <host>10.0.3.217</host>
		    <port>6010</port>
		    <proxyhost>0.0.0.0</proxyhost>
		    <proxyport>3899</proxyport>
	    </sipdevice2>
    </sipdevices>
    


### SipOHttp.pm

Kun REST endpoint sipmessages vastaanottaa POST-viestin, Swagger API tarkistaa, että pyynnön bodyssa kulkee json-muotoinen parametri "request_xml" jonka arvona on viesti. Tämä viesti sisältää SIP-viestin XML:ään käärittynä. Viestiä ei validoida vielä tässä vaiheessa. Swagger Api tarkistaa vain, että parametri "request_xml" löytyy.


Jos endpointin validointi onnistuu, käynnistyy SipOHttp.pm -modulin process-funktio. Funktio validoi xml-sisällön viestissä. Request_xml:n arvon on oltava XML-muotoinen viesti joka noutattaa seuraavaa xml-skeemaa: /koha/Koha/koha-tmpl/sipschema.xsd

    <?xml version="1.0" encoding="UTF-8"?>

    <!-- sip.xsd  $Revision: 1.7 $ sos@axiell.com -->

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"         xmlns:ns1="http://axiell.com/Schema/sip.xsd"     targetNamespace="http://axiell.com/Schema/sip.xsd" elementFormDefault="unqualified" attributeFormDefault="unqualified">

      <xs:element name="sip">

        <xs:complexType>

          <xs:choice>

            <xs:element name="request" type="xs:string"/>

            <xs:element name="response" type="xs:string"/>

            <xs:element name="error" type="xs:string"/>

          </xs:choice>

          <xs:attribute name="login" type="xs:string"/>

          <xs:attribute name="password" type="xs:string"/>

        </xs:complexType>

      </xs:element>

    </xs:schema>


XML-viestiä verrataan tähän skeematiedostoon, ja jos xml-rakenteessa on virheitä, skripti palauttaa endpointille virhekoodin.
Jos viesti on kunnossa, siitä puretaan SIP-viesti. Laite, jolle viesti on tarkoitettu puretaan "login:" tiedosta XML:n sisällä. Sen jälkeen SIP-viesti lähetetään laitetta vastaavalle proxyserverille ja vastaanotetaan sen kautta palautuva viesti sip-palvelimelta. Palautuneesta SIP-viestistä muodostetaan xml-muotoinen paluuviesti, jonka pohja löytyy sijainnista:

...Koha/koha-tmpl/sipresp.tmpl

SIP-viesti liitetään response-parametriin (<response>xxxxxxxx</response>). Viesti välitetään rajapintaan vastauksena POST-pyyntöön.







### Virhetilanteet ja loki

 SipOHttp-skripti palauttaa seuraavat virheilmoitukset POST-kyselyihin:

 - XML validointi epäonnistui skeematiedostoa vastaan: HTTP-virhe 400 viestillä "Validation failed. Invalid Request. "
 - Jos sip-serveriin tai proxyserveriin ei saada yhteyttä: HTTP 500 "Something went wrong, check the logs."
 - Jos XML-viestin "login:" parametria vastaavia proxy/sipserveriasetuksia ei löydy sipdevices.xml:stä tai ne ovat puutteelliset: HTTP 400 "No config found for login device."

Virhetilanteista kirjautuu yksityiskohtaisempia tietoja rest.log -tiedostoon
(home/koha/koha-dev/var/log/rest.log)
esim. Viimeiseksi mainitun virhetilanteen kohdalla: [WARN] Missing proxy server config parameters for sipdevice6 in sipdevices.xml

Voit määrittää tcpserver.pl:n informaatio- ja virheviestien näyttämisen DEBUG ympäristömuuttujalla.

 
