Samodejna prijava v konference Lync v sistemu Linux

Pozdravljeni, Habr!

Zame je ta stavek podoben pozdravljen svet, saj sem končno prišel do svoje prve objave. Dolgo sem odlašala s tem čudovitim trenutkom, saj ni bilo o čem pisati, pa tudi nisem hotela posesati nekaj, kar je bilo že velikokrat nasrkano. Na splošno sem za svojo prvo objavo želel nekaj izvirnega, uporabnega za druge in vseboval nekakšen izziv in reševanje problemov. In zdaj lahko to delim. Zdaj pa se pogovorimo o vsem po vrsti.

Začetek

Vse se je začelo, ko sem pred časom na svoj službeni računalnik prenesel Linux Mint. Marsikdo verjetno ve, da je Pidgin z vtičnikom Sipe povsem primerna zamenjava za Microsoft Lync (zdaj imenovan Skype za podjetja) za sisteme Linux. Zaradi specifike svojega dela se moram pogosto udeleževati SIP konferenc in ko sem bil Windows delavec, je bil vstop v konference elementaren: prejmemo vabilo po pošti, kliknemo na povezavo za prijavo in že smo pripravljeni .

Pri prehodu na temno stran Linuxa se je vse skupaj nekoliko zakompliciralo: seveda se lahko v konference prijavite tudi v Pidginu, a za to morate v meniju v lastnostih vašega računa SIP izbrati možnost pridruži se konferenci in v okno, ki se odpre, vstavite povezavo do konference ali vnesite ime organizatorja in konf. In čez nekaj časa sem začel razmišljati: "ali je to mogoče nekako poenostaviti?" Ja, morda boste rekli, zakaj za vraga potrebujete to? Raje bi sedel v sistemu Windows in se ne bi sekiral.

1. korak: Raziskovanje

»Če imaš v glavi kakšno kaprico, je ne moreš izbiti s kolcem,« je dejal Nekrasov v svojem delu »Kdo dobro živi v Rusiji«.

Ko mi je torej misel padla v glavo, se je čez nekaj časa porodila prva ideja za izvedbo. Vse se je zdelo preprosto - prestreči morate dostop do povezav meet.company.com/user/confid — namestite proces lokalne spletne aplikacije v vaš avto na 127.0.0.1 in v /etc/hosts dodajte statični vnos za domeno podjetja, prek katere vstopate na konferenco, ki kaže na localhost. Nato mora ta spletni strežnik obdelati povezavo, ki je prišla do njega, in jo nekako prenesti v Pidgin (takoj bom rekel, da na tej stopnji še nisem imel pojma, kako mu jo sploh dati). Rešitev seveda diši po berglah, a smo programerji, bergle nas ne strašijo (sranje).

Potem pa sem po naključju nekako odprl povezavo za povabilo v Google Chromu (in običajno vedno uporabljam Mozilla Firefox). In na moje presenečenje je bila spletna stran videti popolnoma drugače - obrazca za vnos uporabniških podatkov ni bilo in takoj po vstopu na stran je bila zahteva, da se nekaj odpre prek xdg-odprt. Samo za šalo kliknem »da« in prikaže se sporočilo o napaki - povezave lync15:confjoin?url=https://meet.company.com/user/confid ni mogoče odpreti. Hmm. Kakšen xdg-open je to in kaj potrebuje, da se takšne povezave odprejo? Posmrtno branje dokumentacije je razkrilo, da gre za upravljalnik GUI, ki pomaga zagnati povezane aplikacije s protokoli za shemo uri ali s posebnimi vrstami datotek. Povezave so konfigurirane s preslikavo tipa mime. Tako vidimo, da izvajamo iskanje ujemajoče se aplikacije za shemo uri z imenom lync15 in povezava se posreduje xdg-open, ki bi jo nato teoretično moral posredovati neki aplikaciji, ki je odgovorna za to vrsto povezave. Česar seveda nimamo v našem sistemu. Če ne, kaj potem počnejo v odprtokodnem svetu? Tako je, sami ga bomo napisali.

Nadaljnje potopitev v svet Linuxa in predvsem preučevanje delovanja grafične lupine (namiznega okolja, DE), mimogrede, imam Xfce v Linux Mintu, je pokazalo, da so aplikacije in mime-tip, povezan z njo, običajno napisani neposredno v datoteke bližnjic s pripono .desktop. No, zakaj pa ne, ustvarim preprosto bližnjico do aplikacije, ki bi morala preprosto zagnati skript bash in posredovati argument, ki mu je bil posredovan v konzolo, priskrbim samo datoteko bližnjice:

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

S konzole zaženem xdg-open, posredujem isto povezavo, ki prihaja iz brskalnika in ... huda napaka. Spet piše, da ne more obdelati povezave.

Izkazalo se je, da s svojo aplikacijo nisem posodobil imenika povezanih vrst mime. To naredite s preprostim ukazom:

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

ki preprosto ureja datoteko ~/.config/mimeapps.list.

Poskus številka 2 s klicem xdg-open - in spet neuspeh. Nič, težave nas ne prestrašijo, ampak le spodbujajo naše zanimanje. In oboroženi z vso močjo bash (tj. sledenja), se brezglavo potopimo v odpravljanje napak. Tukaj je pomembno opozoriti, da je xdg-open samo lupinski skript.

bash -x xdg-open $url

Pri analizi izhoda po sledenju postane malo jasno, da se nato nadzor prenese na exo-open. In to je že binarna datoteka in težje je razumeti, zakaj vrne neuspešno povratno kodo, ko posreduje povezavo do nje v argumentu.

Ko sem pregledal notranjost xdg-open, sem ugotovil, da analizira različne okoljske parametre in posreduje nadzor naprej bodisi nekaterim orodjem za odpiranje povezav datotek, značilnih za posamezen DE, ali pa ima nadomestno funkcijo 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
}

Tukaj bom hitro vdelal majhen kramp z analizo posredovanega argumenta in če se tam nahaja naš specifični podniz lync15:, potem takoj prenesemo nadzor na funkcijo open_generic.

Poskus št. 3 in mislite, da je uspelo? Ja, zdaj, seveda. Toda sporočilo o napaki se je že spremenilo, to je že napredek - zdaj mi je povedal, da datoteka ni bila najdena in v obliki datoteke mi je napisal isto povezavo, ki je bila podana kot argument.

Tokrat se je izkazalo, da je funkcija je_file_url_ali_path, ki analizira povezavo datoteke, posredovano na vhod: file:// ali pot do datoteke ali kaj drugega. In preverjanje ni delovalo pravilno zaradi dejstva, da ima naša predpona (shema URL-jev) številke, regularni izraz pa preverja samo nabor znakov, ki je sestavljen iz :alpha: pik in pomišljajev. Po posvetovanju s standardom rfc3986 za enotni identifikator vira Postalo je jasno, da tokrat Microsoft ne krši ničesar (čeprav sem imel takšno različico). Samo razred znakov :alpha: vsebuje samo črke latinske abecede. Redno preverjanje hitro spremenim v alfanumerično. Končano, neverjetni ste, vse se končno zažene, nadzor po vseh pregledih ima naša skriptna aplikacija, naša povezava je prikazana na konzoli, vse je tako, kot mora biti. Po tem začnem sumiti, da so vse težave z exo-open tudi posledica validacije formata povezave zaradi številk v shemi. Da bi preizkusil hipotezo, spremenim registracijo mime tipa aplikacije v samo shemo ris in voila - vse deluje brez preglasitve funkcije open_xfce. A to nam ne bo prav nič pomagalo, saj spletna stran za vstop na konferenco ustvari povezavo z lync15.

Tako je prvi del poti zaključen. Vemo, kako prestreči klic povezave, nato pa ga je treba nekako obdelati in posredovati v Pidgin. Da bi razumel, kako interno deluje pri vnašanju podatkov prek povezave v meniju »pridruži se konferenci«, sem kloniral repozitorij Git projekta Sipe in se pripravil, da se ponovno potopim v kodo. Potem pa so me na srečo pritegnili scenariji v katalogu prispevek/dbus/:

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

Izkazalo se je, da je vtičnik Sipe na voljo za interakcijo prek dbus (namizno vodilo) in znotraj skriptov so primeri pridružitve konferenci prek povezave, bodisi prek imena organizatorja in conf-id-ja ali pa lahko začnete klic prek sip . Točno to nam je manjkalo.

2. korak. Implementacija upravljalnika samodejnega združevanja

Ker so v Pearlu že pripravljeni primeri, sem se odločil, da jih kar uporabim sipe-join-conference-with-uri.pl in ga malo prilagodite sebi. Znam pisati v Pearlu, tako da mi ni povzročalo posebnih težav.

Po ločenem testiranju skripta sem njegov klic zapisal v datoteko lync.desktop. In to je bila zmaga! Ko vstopite na stran za pridružitev konferenci in dovolite zagon xdg-open, se samodejno odpre pojavno okno konference iz Pidgina. Kako sem se veselil.
Opogumljen zaradi uspeha sem se odločil, da bom naredil enako za svoj glavni brskalnik Mozilla Firefox. Ko se prijaviš preko lisice, se odpre stran za avtorizacijo in čisto na dnu je gumb pridružite se s pisarniškim komunikatorjem. Ona je bila tista, ki je pritegnila mojo pozornost. Ko ga kliknete v brskalniku, gre na naslov:

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

na kar mi prijazno odvrne, da ga ne zna odpreti in morda nimam povezane aplikacije za tak protokol. No, to smo že dali skozi.

Svojo skriptno aplikacijo hitro registriram tudi za uri shemo conf in ... nič se ne zgodi. Brskalnik se kar naprej pritožuje, da ni aplikacije, ki bi obravnavala moje povezave. V tem primeru klic xdg-open iz konzole s parametri deluje popolnoma.

»Nastavi obravnavo protokola po meri v firefoxu« - s tem vprašanjem sem šel na splet. Po nekaj razpravah o stackoverflowu (in kje bi bili brez njega), se zdi, da je bil odgovor najden. Ustvariti morate poseben parameter about: config (seveda zamenjava foo z conf):

network.protocol-handler.expose.foo = false

Ustvarimo ga, odpremo povezavo in ... ni te sreče. Brskalnik, kot da se ni nič zgodilo, pravi, da ne pozna naše aplikacije.

Berem uradno dokumentacijo o registraciji protokola iz Mozille, obstaja možnost registracije asociacij v samem namizju gnome (seveda foo zamenjam s 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

Registriram se, odprem brskalnik...in spet brada.

Tukaj mi pade v oči vrstica iz dokumentacije:

Ko boste naslednjič kliknili povezavo protokola foo, boste pozvani, s katero aplikacijo jo želite odpreti.

— Semjon Semenič
- Ahh

Ne kliknemo na povezavo, ampak spletna stran preprosto spremeni window.location prek javascripta. Napišem preprosto html datoteko s povezavo na conf protokol, jo odprem v brskalniku, kliknem na povezavo - Yos! Odpre se nam okno z vprašanjem, v kateri aplikaciji moramo odpreti našo povezavo in tam že imamo našo aplikacijo Lync na seznamu - pošteno smo jo registrirali na vse mogoče načine. V oknu je potrditveno polje »zapomni si izbiro in vedno odpri povezave v naši aplikaciji«, označite ga in kliknite v redu. In to je druga zmaga - odpre se konferenčno okno. Hkrati odpiranje konferenc ne deluje le, ko kliknete na povezavo, ampak tudi, ko se premaknete s strani za pridružitev, ki jo potrebujemo, na konferenco.

Nato sem preveril in izbrisal parametre network.protocol-handler.expose.conf na noben način ni vplival na delovanje protokola v Foxu. Povezave so delovale naprej.

Zaključek

Vse svoje delo sem naložil v repozitorij GitHub; povezave do vseh virov bodo na koncu članka.
Zanimalo me bo povratne informacije tistih, ki želijo uporabiti moje delo. Takoj moram opozoriti, da sem ves razvoj naredil samo za svoj sistem Linux Mint, zato nekatere druge distribucije ali namizja morda ne bodo delovale v tej različici. Oziroma v to sem celo skoraj prepričan, ker sem v xdg-open pokrpal samo 1 funkcijo, ki se nanaša samo na moj DE. Če želite dodati podporo za druge sisteme ali namizne računalnike, mi pišite zahteve za vleko na Github.

Celoten projekt je trajal 1 večer.

Reference:

Vir: www.habr.com

Dodaj komentar