Automatické prihlásenie do konferencií Lync v systéme Linux

Čau Habr!

Pre mňa je toto slovné spojenie ako ahoj svet, keďže som sa konečne dostal k svojej prvej publikácii. Tento nádherný moment som dlho odkladal, keďže nebolo o čom písať a tiež som nechcel nasávať niečo, čo už bolo veľakrát nasaté. Vo všeobecnosti som chcel pre svoju prvú publikáciu niečo originálne, užitočné pre ostatných a obsahujúce nejakú výzvu a riešenie problémov. A teraz to môžem zdieľať. Teraz poďme hovoriť o všetkom v poriadku.

Vstup

Všetko to začalo, keď som si pred časom stiahol Linux Mint do svojho pracovného počítača. Mnoho ľudí asi vie, že Pidgin s pluginom Sipe je úplne vhodnou náhradou za Microsoft Lync (teraz nazývaný Skype for business) pre systémy Linux. Kvôli špecifikám mojej práce sa často musím zúčastňovať SIP konferencií a keď som bol Windows pracovníkom, vstup do konferencií bol elementárny: dostaneme pozvánku poštou, klikneme na prihlasovací odkaz a môžeme ísť .

Pri prechode na temnú stránku Linuxu sa všetko trochu skomplikovalo: do konferencií sa samozrejme môžete prihlásiť aj v Pidgin, ale na to je potrebné vybrať možnosť pripojiť sa ku konferencii v menu vo vlastnostiach vášho SIP účtu a v okne, ktoré sa otvorí, vložte odkaz na konferenciu alebo zadajte meno organizátora a konf. A po nejakom čase som začal premýšľať: "Je možné to nejako zjednodušiť?" Áno, možno si poviete, prečo to do pekla potrebujete? Radšej by som sedel v systéme Windows a nerozhádzal sa.

Krok 1: Výskum

"Ak máte v hlave nejaký rozmar, nemôžete ho vyradiť kolíkom," povedal Nekrasov vo svojom diele "Kto žije dobre v Rusku."

Takže, keď sa mi myšlienka dostala do hlavy, po nejakom čase vznikol prvý nápad na realizáciu. Všetko sa zdalo jednoduché - musíte zachytiť prístup k odkazom meet.company.com/user/confid — nainštalujte si do auta proces lokálnej webovej aplikácie na 127.0.0.1 a do /etc/hosts pridajte statický záznam pre firemnú doménu, cez ktorú vstupujete na konferenciu, smerujúcu na localhost. Ďalej musí tento webový server spracovať odkaz, ktorý k nemu prišiel, a nejako ho preniesť do Pidginu (hneď poviem, že v tejto fáze som ešte netušil, ako mu ho dať vôbec). Riešenie, samozrejme, zaváňa barlami, ale my sme programátori, barle nás nedesia (do riti).

Potom som náhodou otvoril odkaz na pozvánku v prehliadači Google Chrome (a zvyčajne vždy používam Mozilla Firefox). A na moje prekvapenie webová stránka vyzerala úplne inak - chýbal formulár na zadávanie používateľských údajov a hneď po vstupe na stránku sa objavila výzva na otvorenie niečoho cez XDG-open. Len pre zaujímavosť kliknem na „áno“ a zobrazí sa chybové hlásenie – odkaz lync15:confjoin?url=https://meet.company.com/user/confid sa nedá otvoriť. Hmm. Čo je to za xdg-open a čo potrebuje na to, aby sa takéto odkazy otvárali? Posmrtné čítanie dokumentácie odhalilo, že ide o obsluhu GUI, ktorá pomáha spúšťať pridružené aplikácie buď s protokolmi pre schému uri, alebo so špecifickými typmi súborov. Priradenia sa konfigurujú pomocou mapovania typu mime. Vidíme teda, že spúšťame vyhľadávanie zhodnej aplikácie pre schému uri s názvom lync15 a odkaz je odovzdaný xdg-open, ktorý by ho potom teoreticky mal odovzdať nejakej aplikácii, ktorá je zodpovedná za tento typ odkazu. Čo, samozrejme, v našom systéme nemáme. Ak nie, čo potom robia vo svete open source? Presne tak, napíšeme si to sami.

Ďalšie ponorenie sa do sveta Linuxu a najmä štúdium toho, ako funguje grafický shell (desktopové prostredie, DE), mimochodom Xfce mám v Linux Mint, ukázalo, že aplikácie a s tým spojený mime-typ sa väčšinou píše priamo v súbory skratiek s príponou .desktop. Nuž, prečo nie, vytvorím jednoduchú skratku aplikácie, ktorá by mala jednoducho spustiť bash skript a odovzdať argument do konzoly, poskytujem iba samotný súbor skratky:

[Desktop Entry]
Name=Lync
Exec=/usr/local/bin/lync.sh %u
Type=Application
Terminal=false
Categories=Network;InstantMessaging;
MimeType=x-scheme-handler/lync15;

Spustím xdg-open z konzoly, prejdem rovnakým odkazom, ktorý prichádza z prehliadača a... bummer. Opäť hovorí, že nemôže spracovať odkaz.

Ako sa ukázalo, neaktualizoval som adresár asociovaných typov mime s mojou aplikáciou. To sa deje pomocou jednoduchého príkazu:

xdg-mime default lync.desktop x-scheme-handler/lync15

ktorý jednoducho upraví súbor ~/.config/mimeapps.list.

Pokus číslo 2 s výzvou xdg-open - a opäť zlyhanie. Nič, ťažkosti nás nedesia, ale len podnecujú náš záujem. A vyzbrojení všetkou silou bashu (t.j. trasovania) sa vrháme po hlave do ladenia. Tu je dôležité poznamenať, že xdg-open je len shell skript.

bash -x xdg-open $url

Analýzou výstupu po sledovaní je trochu jasné, že sa potom prenesie kontrola exo-otvorený. A toto je už binárny súbor a je ťažšie pochopiť, prečo vracia neúspešný návratový kód pri odovzdávaní odkazu naň v argumente.

Po prezretí vnútorných častí xdg-open som zistil, že analyzuje rôzne parametre prostredia a ďalej odovzdáva riadenie buď niektorým nástrojom na otváranie súborových odkazov špecifických pre konkrétne DE, alebo má záložnú funkciu open_generic

open_xfce()
{
if exo-open --help 2>/dev/null 1>&2; then
exo-open "$1"
elif gio help open 2>/dev/null 1>&2; then
gio open "$1"
elif gvfs-open --help 2>/dev/null 1>&2; then
gvfs-open "$1"
else
open_generic "$1"
fi

if [ $? -eq 0 ]; then
exit_success
else
exit_failure_operation_failed
fi
}

Rýchlo sem vložím malý hack s analýzou odovzdaného argumentu a či sa tam nachádza náš konkrétny podreťazec lync15:, potom okamžite prenesieme riadenie na funkciu open_generic.

Pokus číslo 3 a myslíte si, že vyšiel? Áno, teraz, samozrejme. Ale chybové hlásenie sa už zmenilo, toto je už pokrok - teraz mi písal, že súbor sa nenašiel a vo forme súboru mi napísal ten istý odkaz prešiel ako argument.

Tentoraz sa ukázalo, že ide o funkciu is_file_url_or_path, ktorý analyzuje odkaz na súbor odovzdaný na vstup: file:// alebo cestu k súboru alebo niečo iné. A kontrola nefungovala správne kvôli tomu, že naša predpona (url schéma) má čísla a regulárny výraz kontroluje iba znakovú sadu pozostávajúcu z :alpha: bodiek a pomlčiek. Po konzultácii so štandardom rfc3986 pre jednotný identifikátor zdroja Ukázalo sa, že tentoraz Microsoft nič neporušuje (hoci som mal takúto verziu). Len trieda znakov :alpha: obsahuje iba písmená latinskej abecedy. Bežnú kontrolu rýchlo mením na alfanumerickú. Hotovo, ste úžasní, všetko sa konečne rozbehne, ovládanie po všetkých kontrolách je odovzdané našej skriptovej aplikácii, náš odkaz sa zobrazuje na konzole, všetko je tak, ako má byť. Potom začínam mať podozrenie, že všetky problémy s exo-open sú tiež spôsobené validáciou formátu odkazu kvôli číslam v schéme. Na testovanie hypotézy mením registráciu aplikácie typu mime len na schému rys ostrovid a voila - všetko funguje bez prepísania funkcie open_xfce. To nám ale nijako nepomôže, pretože webová stránka pre vstup na konferenciu vytvára prepojenie s lync15.

Takže prvá časť cesty je za nami. Vieme, ako zachytiť hovor odkazu a potom ho treba nejako spracovať a odovzdať do Pidginu. Aby som pochopil, ako to interne funguje pri zadávaní údajov prostredníctvom odkazu v ponuke „pripojiť sa ku konferencii“, naklonoval som úložisko Git projektu Sipe a pripravil som sa znova sa ponoriť do kódu. Ale potom ma, našťastie, upútali scenáre v katalógu contrib/dbus/:

  • sipe-join-conference-with-uri.pl
  • sipe-join-conference-with-organiser-and-id.pl
  • sipe-call-phone-number.pl
  • SipeHelper.pm

Ukázalo sa, že plugin Sipe je k dispozícii na interakciu cez dbus (desktop bus) a vo vnútri skriptov sú príklady pripojenia sa ku konferencii pomocou odkazu, buď cez meno organizátora a conf-id, alebo môžete iniciovať hovor cez sip . Presne toto nám chýbalo.

Krok 2. Implementácia obslužného programu automatického spojenia

Keďže v Pearl sú hotové príklady, rozhodol som sa len použiť sipe-join-conference-with-uri.pl a trochu si ho upravte podľa seba. Viem písať perlou, takže to nespôsobilo žiadne zvláštne ťažkosti.

Po samostatnom otestovaní skriptu som jeho volanie zapísal do súboru lync.desktop. A bolo to víťazstvo! Keď vstúpite na stránku pripojenia ku konferencii a povolíte spustenie xdg-open, automaticky sa otvorí kontextové okno konferencie z Pidgin. Ako som sa tešil.
Povzbudený úspechom som sa rozhodol urobiť to isté pre môj hlavný prehliadač Mozilla Firefox. Keď sa prihlásite cez líšku, otvorí sa stránka na autorizáciu a úplne dole je tlačidlo pripojte sa pomocou kancelárskeho komunikátora. Bola to ona, ktorá upútala moju pozornosť. Keď naň kliknete v prehliadači, prejde na adresu:

conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}%3Frequired-media=audio

na čo mi láskavo povie, že nevie, ako to otvoriť, a možno nemám pridruženú aplikáciu pre takýto protokol. No toto sme si už prešli.

Rýchlo registrujem svoju skriptovú aplikáciu aj pre schému uri conf a... nič sa nedeje. Prehliadač sa stále sťažuje, že neexistuje žiadna aplikácia, ktorá by spracovávala moje odkazy. V tomto prípade volanie xdg-open z konzoly s parametrami funguje perfektne.

„Nastaviť obslužný program vlastného protokolu vo Firefoxe“ – s touto otázkou som sa pripojil k internetu. Po niekoľkých diskusiách o stackoverflow (a kde by sme bez neho boli) sa zdá, že odpoveď bola nájdená. Musíte vytvoriť špeciálny parameter v about: config (samozrejme nahradenie foo s conf):

network.protocol-handler.expose.foo = false

Vytvoríme ho, otvoríme odkaz a... žiadne také šťastie. Prehliadač, akoby sa nič nestalo, hovorí, že nepozná našu aplikáciu.

Čítam oficiálnu dokumentáciu o registrácii protokolu od Mozilly, existuje možnosť zaregistrovať asociácie v samotnej ploche gnome (samozrejme nahradením foo za conf):

gconftool-2 -s /desktop/gnome/url-handlers/foo/command '/path/to/app %s' --type String
gconftool-2 -s /desktop/gnome/url-handlers/foo/enabled --type Boolean true

Registrujem sa, otváram prehliadač... a opäť brada.

Tu ma upúta riadok z dokumentácie:

Keď nabudúce kliknete na odkaz typu protokolu foo, zobrazí sa otázka, pomocou ktorej aplikácie ho otvoriť.

— Semjon Semenych
- Ahh

Neklikáme na odkaz, ale webová stránka jednoducho zmení window.location pomocou javascriptu. Napíšem jednoduchý html súbor s odkazom na protokol conf, otvorím ho v prehliadači, kliknem na odkaz - Yos! Otvorí sa okno s otázkou, v ktorej aplikácii musíme otvoriť náš odkaz a tam už máme v zozname našu aplikáciu Lync – poctivo sme ju zaregistrovali všetkými možnými spôsobmi. V okne je začiarkavacie políčko „zapamätať si výber a vždy otvárať odkazy v našej aplikácii“, označte ho a kliknite na tlačidlo OK. A toto je druhé víťazstvo - otvára sa okno konferencie. Zároveň otváranie konferencií funguje nielen pri kliknutí na odkaz, ale aj pri prechode z pripájacej stránky, ktorú potrebujeme na konferenciu.

Potom som skontroloval a vymazal parametre network.protocol-handler.expose.conf žiadnym spôsobom neovplyvnilo fungovanie protokolu vo Foxe. Linky naďalej fungovali.

Záver

Nahral som všetku svoju prácu do úložiska GitHub; odkazy na všetky zdroje budú na konci článku.
Budem mať záujem dostávať spätnú väzbu od tých, ktorí chcú moju prácu použiť. Hneď by som mal poznamenať, že celý vývoj som robil iba pre svoj systém Linux Mint, takže niektoré iné distribúcie alebo desktopy nemusia v tejto verzii fungovať. Alebo skôr som si tým takmer istý, pretože som v xdg-open opravil iba 1 funkciu, ktorá sa týka iba môjho DE. Ak chcete pridať podporu pre iné systémy alebo desktopy, napíšte mi pull requesty na Github.

Dokončenie celého projektu trvalo 1 večer.

odkazy:

Zdroj: hab.com

Pridať komentár