# 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.