Aiemmassa artikkelissa
Ajatus näiden kahden järjestelmän "ystävystymisestä" syntyi kauan sitten ilman lisäohjelmistojen tai komentosarjojen asentamista. Nopea googlaus tuotti monia mahdollisia ratkaisuja, kaikki kiteytyi siihen, että lataa skriptit (Pyha, Bash, Python jne.) palvelimelle, niin olet onnellinen. Halusin toteuttaa valvonnan "pakkauksesta" - ilman ulkoisia skriptejä ja lisäohjelmistojen asentamista palvelimelle valvonnan ja PBX:n kanssa.
Vietin tämän kanssa yhteensä 4 työpäivää, mutta tulos oli sen arvoinen. AMI-liitännän, matalan tason havaitsemisen, liipaisujen ja mikä tärkeintä, PBX:n ja kaikkien muiden asetusten yhdistäminen vie nyt noin 15 minuuttia.
Zabbix 4.4 on saatavilla, noin 100 kappaletta Asterisk-versiota 13. Joissakin vaihteissa on FreePBX-verkkoliittymä, joissakin paljas konsoli, joukko temppuja ja integrointi soittosuunnitelman kautta.
Tietojen vastaanotto PBX:stä
Ensimmäinen ja tärkein asia, joka on ratkaistava, on tietojen hankkiminen vertaisista ja SIP-rekisteröinneistä. Tätä tarkoitusta varten PBX:ssä on AGI-, AMI-, ARI- ja SSH-konsoliliitännät. Ilmeisistä syistä en ajatellut lisämoduuleja.
Ensin täytyy selvittää, mitä nämä agi, ami, ari ovat...
- AGI - skriptien käyttö soittosuunnitelmassa. Käytetään pääasiassa puheluiden hallintaan.
- AMI - voi tarjota kaikki tarvittavat tiedot, toimii portin 5038 kautta, kuten Telnet. Sopii meille!
- ARI - moderni, muodikas, JSON. Mahdollisuuksia on monia, tietomuoto on Zabbixille ymmärrettävä, mutta minulle ei ole pääasia: et voi hallita sip-rekisteröintiä. Toinen haittapuoli on se, että vertaisilla on vain kaksi tilaa online/offline, vaikka tiloja on enemmän ja ne on hyödyllistä ottaa huomioon diagnosoitaessa.
- SSH voi tehdä kaiken, mutta joskus se ei ole sallittua "turvallisuussyistä". Pohdinnat voivat olla erilaisia, en mene niihin.
ARI kattaa kuitenkin kaikkine puutteineen 90 % kaikista seurantatarpeista.
Zabbix ja Telnet - pettymykseni
Tunnen AMI:n hyvin; aikoinaan toteutin menetysten seurantaa keskusteluissa etätoimistojen jaon kanssa, puheluiden hallintaa jne. Telnetissä kaikki on myös hyvin selvää: avaa yhteys, lähetä komennot ja lue vastaus. Näin tein, mutta tulos pettyi.
Telnet Zabbixissa ei ole sama kuin Linux-konsolissa, se on hieman yksinkertaisempi ja räätälöity tavalliseen valtuutukseen, kuten sisäänkirjautumiseen/salasanaan. Jos valtuutuslogiikka on erilainen eikä sisäänkirjautumis-/salasana-paria pyydetä, tapahtuu virhe. Sen jälkeen, kun turhia yrityksiä oli ohittaa valtuutusvaatimus, oli hyödyllistä tarkastella Telnet-moduulin lähdekoodia.
Tajusin, että ennen kuin on olemassa perinteinen kirjautumis- ja salasanapyyntö, en siirry eteenpäin. Ihan huvikseni poistin koodista kaiken valtuutukseen liittyvän ja kokosin kaiken uudelleen. Toimii! Mutta se ei täytä vaatimuksia. Mene eteenpäin…
Palataan hakuun
Luin uudelleen ARI-dokumentaation, tein lisätestejä - täällä ei ole sip-rekisteröintiä. On juhlia, on keskusteluja, on polvihousuja, mutta ei ilmoittautumisia. Jossain vaiheessa jopa ajattelin, että tarvitsemmeko todella korppikotkan rekisteröintiä?
Hauskan sattuman seurauksena tällä hetkellä käyttäjältä saapuu toinen pyyntö, jossa on ongelma lähtevien puhelujen kanssa. Ongelmana oli, että sip-rekisteröinti jäätyi ja se ratkesi yksinkertaisesti käynnistämällä moduuli uudelleen.
asterisk -rx "sip reload"
Olisi hienoa päästä AMI:hen verkon kautta: se ratkaisisi kaikki ongelmat, ajattelin. Aloitan kaivamisen tähän suuntaan, ja kirjaimellisesti ensimmäinen hakurivi johtaa viralliseen Asterisk-dokumentaatioon, joka sanoo, että tehtävilleni on vaihtoehto web-kelpoinen tiedostossa /etc/asterisk/manager.conf, jonka arvoksi on asetettava KYLLÄ, osiossa [yleistä]
Tämän jälkeen lomakkeen tavallisen verkkopyynnön kautta
FreePBX-käyttöliittymää käytettäessä tätä vaihtoehtoa ei voi ottaa käyttöön verkon kautta, vaan se on otettava käyttöön konsolin kautta tekemällä muutoksia manager.conf-tiedostoon. FreePBX ei poista sitä, kun kokoonpanomuutoksia tehdään verkon kautta.
Olen työskennellyt erilaisten Asterisk-integraatioiden kanssa pitkään, mutta en ole koskaan nähnyt tätä ominaisuutta mainittavan missään. Olin yllättynyt siitä, että kukaan ei kuvaile tätä tapaa olla vuorovaikutuksessa PBX:n kanssa. Tästä aiheesta oli jopa erityisen hyödyllistä etsiä tietoa: ei käytännössä mitään tai sitä käytettiin täysin eri tehtäviin.
WEB AMI - millainen peto?
Lisätään vaihtoehto web-kelpoinen arkistoida manager.conf tarjosi täyden pääsyn ATS-hallintaan verkon kautta. Kaikki tavallisen AMI:n kautta saatavilla olevat komennot ovat nyt verkossa, voit kuunnella tapahtumia PBX:stä pistorasian kautta. Toimintaperiaate ei eroa konsolin AMI:stä. Kun olet aktivoinut tämän vaihtoehdon, voit ottaa yhteyttä PBX:ään seuraavissa osoitteissa:
Sitten ajattelin: "Tämä on ratkaisu! Nyt kaikki on valmista! Helppopisistä sitruunapuristettua”, mutta oli liian aikaista iloita. Saadaksemme tarvitsemamme tiedot, riittää, että käytämme GET-pyyntöä tarvittavin toimin toiminta, joka vastauksena palauttaa xml-tiedoston luettelon kaikista rekisteröinneistä ja niiden tilasta. Tämä kaikki on hienoa, mutta tarvitset luvan muistaaksesi istunnon evästeestä. Kun testaat selaimessa, et ajattele tätä prosessia.
Valtuutusprosessi
Ensin käsitellään osoite
https://ats:8089/mxml?action=login&username=zabbix&secret=zabbix
Host: ats:8089
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Vastaus:
GET: HTTP/1.1 200 OK
Server: Asterisk/13.29.2
Date: Thu, 18 Jun 2020 17:41:19 GMT
Cache-Control: no-cache, no-store
Content-type: text/xml
Set-Cookie: mansession_id="6f5de42c"; Version=1; Max-Age=600
Pragma: SuppressEvents
Content-Length: 146
<ajax-response>
<response type="object" id="unknown">
<generic response="Success" message="Authentication accepted"/>
</response>
</ajax-response>
Siellä töihin tarvitset talon_tunnus="6f5de42c", eli itse valtuutuseväste.
Sisältö, jonka tarvitset vain tarkistaaksesi vastauksen "Todennus hyväksytty" Seuraavaksi meidän on lisättävä pyyntöön valtuutuseväste kaikille PBX-palvelimelle soitetuille puheluille.
https://ats:8089/mxml?action=SIPpeers
Host: ats:8089
Connection: close
Cookie: mansession_id="6f5de42c"
Lue valtuutusevästeen hankkimisesta ja sen käyttämisestä muissa pyynnöissä täältä: "
Seurantaelementtien luomiseen Zabbixissa käytän automaattista tunnistusta.
Automaattinen tunnistus
Voit automaattisesti tunnistaa rekisteröinnit ja seurata vertaistiloja ottamalla yhteyttä seuraavaan osoitteeseen:
Vastauksena PBX palauttaa meille XML-vastauksen:
<ajax-response>
<response type="object" id="unknown">
<generic response="Success" eventlist="start" message="Registrations will follow"/>
</response>
...
<response type="object" id="unknown">
<generic event="RegistryEntry" host="login.mtt.ru" port="5060" username="111111" domain="login.mtt.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="222222" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
<response type="object" id="unknown">
<generic event="RegistryEntry" host="voip.uiscom.ru" port="5060" username="333333" domain="voip.uiscom.ru" domainport="5060" refresh="105" state="Registered" registrationtime="1592502142"/>
</response>
...
</ajax-response>
Vastauksessa on paljon roskaa, joten esikäsittelyssä suodatamme sen mallin mukaan XPath: //response/generic[@host]
Sitten alkaa hauskuus. Jotta voit työskennellä tunnistuksen kanssa ja luoda elementtejä dynaamisesti, vastauksen on oltava JSON-muodossa. XML:ää ei tueta automaattisessa tunnistuksessa.
Muuntaakseni XML:n JSON-muotoon minun piti pelata hieman automaattisella korvauksella, jota varten tein skriptin JS:ssä
Mielenkiintoinen kohta: ATS-vastauksessa kaikki parametrit on ympäröity yksittäisillä lainausmerkeillä ja mallin soveltamisen jälkeen //response/generic[@host] ne korvataan kaksinkertaisilla.
Elementtien luomiseen käytämme muuttujia XML-vastauksesta (nyt JSON).
SIP-rekisteri
Sip-rekisteröinnissä käytämme kolmea muuttujaa: käyttäjätunnus, isäntä, portti. Olin tyytyväinen elementin nimeen [sähköposti suojattu]: 5060, En ole löytänyt tilanteita, joissa sinun pitäisi käyttää kaikkia viittä muuttujaa.
Pääelementti, joka saa tiedot kaikista rekisteröinneistä, Asterisk - AMI SIPshowregistry. Kerran minuutissa se lähettää GET-pyynnön
Kun testasin jopa 100 riippuvaa elementtiä, en huomannut kuormitusta, mutta 1700 elementillä tämä antoi huomattavan 15 sekunnin kuormituksen prosessorille. Pidä tämä mielessä, jos sinulla on suuri määrä riippuvia elementtejä.
Vaihtoehtona "hajauttaa" kuormaa tai asettaa eri kyselytaajuudet elementille, voit siirtää käsittelylogiikan jokaiseen elementtiin erikseen.
En tallenna vastaanotettuja tietoja pääelementtiin. Ensinnäkin en näe tarvetta tälle, ja toiseksi, jos vastaus on yli 64K, Zabbix katkaisee sen.
Koska käytämme täyttä XML-vastausta riippuvaiselle elementille, meidän on saatava tämän elementin arvo esikäsittelyssä. Kautta XPath se on tehty näin:
string(//response/generic[@event="RegistryEntry"][@username="{#SIP_REGISTRY_USERNAME}"][@host="{#SIP_REGISTRY_HOST}"][@port="{#SIP_REGISTRY_PORT}"]/@ osavaltio)
Rekisteröintitiloissa en käyttänyt tekstitiloja, vaan muunsin ne numeeriseen muotoon JavaScriptin avulla:
switch(value) {
case 'Registered':
return 1;
case 'Unregistered':
return 0;
default:
return -1;
}
SIP Peers
Analogisesti SIP-rekisteröintien kanssa, Asterisk - AMI SIPshowregistry -rekisterissä on pääelementti, johon lisätään riippuvaisia.
Tämä luo kaksi riippuvaista elementtiä:
- Vertaistila tekstimuodossa
- Laitteen vasteaika - jos tila on OK, kirjoitetaan laitteen vasteaika, muuten "-1"
Polku itse elementtiin on hieman yksinkertaisempi XPath:
string(//response/generic[@objectname="{#SIP_PEER_OBEJECTNAME}"]/@status)
Toisen elementin erottamiseen käytin JavaScriptiä vasteaika vertaistilasta, koska ne on tallennettu yhdessä:
if(value.substring(0,2) == 'OK'){
return value.match(/(d+)/gm);
}
else {
return -1;
}
Johtopäätös
Valmis ratkaisu voi olla monimutkainen eikä heti selkeä. Lisää joustavuutta ja siirrettävyyttä eri järjestelmien välillä
Hyvää ja helppoa integraatiota kaikille! Malli ja asennusohjeet
Lähde: will.com