Automatické přihlášení ke konferencím Lync v systému Linux

Čau Habr!

Pro mě je tato fráze podobná ahoj světe, protože jsem se konečně dostal ke své první publikaci. Dlouho jsem tento nádherný okamžik odkládal, protože nebylo o čem psát, a také se mi nechtělo nasávat něco, co už bylo vysáto mnohokrát. Obecně jsem pro svou první publikaci chtěl něco originálního, užitečného pro ostatní a obsahujícího nějakou výzvu a řešení problémů. A teď to můžu sdílet. Nyní pojďme mluvit o všem v pořádku.

Vstup

Všechno to začalo, když jsem si před časem stáhl Linux Mint na svůj pracovní počítač. Mnoho lidí asi ví, že Pidgin s pluginem Sipe je pro linuxové systémy zcela vhodná náhrada za Microsoft Lync (nyní Skype for business). Vzhledem ke specifikům mé práce se musím často účastnit SIP konferencí, a když jsem byl Windows pracovníkem, vstup do konferencí byl elementární: obdržíme pozvánku poštou, klikneme na přihlašovací odkaz a můžeme vyrazit .

Při přechodu na temnou stránku Linuxu se vše poněkud zkomplikovalo: do konferencí se samozřejmě můžete přihlásit i v Pidginu, ale k tomu je potřeba v menu ve vlastnostech vašeho SIP účtu vybrat možnost připojit se ke konferenci a v okně, které se otevře, vložte odkaz na konferenci nebo zadejte jméno organizátora a důvěrné údaje. A po nějaké době jsem začal přemýšlet: "Je možné to nějak zjednodušit?" Jo, možná si řeknete, proč to sakra potřebuješ? Raději bych seděl na Windows a nedělal si z toho hlavu.

Krok 1: Výzkum

"Pokud dostanete do hlavy nějaký rozmar, nemůžete ho vymlátit kůlem," řekl Nekrasov ve svém díle "Kdo žije dobře v Rusku."

Takže jakmile se mi myšlenka dostala do hlavy, po nějaké době vznikl první nápad na realizaci. Všechno se zdálo jednoduché - musíte zachytit přístup k odkazům meet.company.com/user/confid — nainstalujte do auta proces místní webové aplikace na 127.0.0.1 a do /etc/hosts přidejte statický záznam pro doménu společnosti, přes kterou vstupujete do konference, s odkazem na localhost. Dále tento webový server musí zpracovat odkaz, který k němu přišel, a nějak ho přenést do Pidginu (hned řeknu, že v této fázi jsem ještě neměl ponětí, jak mu ho dát vůbec). Řešení samozřejmě zavání berličkami, ale my jsme programátoři, berle nás neděsí (do prdele).

Pak jsem náhodou nějak otevřel odkaz na pozvánku v Google Chrome (a obvykle používám vždy Mozilla Firefox). A k mému překvapení webová stránka vypadala úplně jinak - nebyl tam formulář pro zadání uživatelských údajů a hned po vstupu na stránku se objevil požadavek na otevření něčeho přes xdg-open. Jen pro zajímavost kliknu na „ano“ a zobrazí se chybová zpráva – odkaz lync15:confjoin?url=https://meet.company.com/user/confid nelze otevřít. Hmm. Co je to za xdg-open a co potřebuje, aby se takové odkazy otevřely? Posmrtné čtení dokumentace odhalilo, že se jedná o obsluhu GUI, která pomáhá spouštět přidružené aplikace buď s protokoly pro schéma uri, nebo se specifickými typy souborů. Přidružení se konfigurují pomocí mapování typu mime. Vidíme tedy, že spouštíme hledání odpovídající aplikace pro schéma uri s názvem lync15 a odkaz je předán xdg-open, který by jej pak teoreticky měl předat nějaké aplikaci, která je za tento typ odkazu zodpovědná. Což samozřejmě v našem systému nemáme. Pokud ne, co pak dělají ve světě open source? Přesně tak, napíšeme si to sami.

Další ponoření do světa Linuxu a hlavně studium toho, jak funguje grafický shell (desktopové prostředí, DE), mimochodem Xfce mám v Linux Mintu, ukázalo, že aplikace a s tím spojený mime-typ se většinou píší přímo v soubory zástupců s příponou .desktop. No, proč ne, vytvořím jednoduchou zkratku aplikace, která by měla jednoduše spustit bash skript a odeslat argument, který mu byl předán do konzole, poskytuji pouze samotný soubor zástupce:

[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 konzole, předám stejný odkaz, který přichází z prohlížeče a... průšvih. Opět to říká, že nemůže zpracovat odkaz.

Jak se ukázalo, neaktualizoval jsem adresář přidružených typů mime se svou aplikací. To se provádí jednoduchým příkazem:

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

který jednoduše upraví soubor ~/.config/mimeapps.list.

Pokus číslo 2 s výzvou xdg-open - a opět neúspěšný. Nic, potíže nás neděsí, ale jen podněcují náš zájem. A vyzbrojeni veškerou silou bash (tj. sledování) se vrhneme po hlavě do ladění. Zde je důležité poznamenat, že xdg-open je pouze shell skript.

bash -x xdg-open $url

Analýzou výstupu po trasování je trochu jasné, že řízení je poté přeneseno na exo-otevřený. A toto je již binární soubor a je obtížnější pochopit, proč vrací neúspěšný návratový kód, když na něj předává odkaz v argumentu.

Když jsem si prohlédl vnitřnosti xdg-open, zjistil jsem, že analyzuje různé parametry prostředí a předává řízení dále buď některým nástrojům pro otevírání odkazů souborů specifických pro konkrétní DE, nebo má záložní funkci 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
}

Rychle sem vložím malý hack s analýzou předaného argumentu a jestli se tam nachází náš konkrétní podřetězec lync15:, pak ihned přeneseme řízení na funkci open_generic.

Pokus číslo 3 a myslíte, že se povedl? Jo, teď, samozřejmě. Ale chybová hláška se už změnila, to už je pokrok - teď mi hlásil, že soubor nebyl nalezen a ve formě souboru mi napsal stejný odkaz předaný jako argument.

Tentokrát se ukázalo, že jde o funkci is_file_url_or_path, který analyzuje odkaz na soubor předaný na vstup: file:// nebo cestu k souboru nebo něco jiného. A kontrola nefungovala správně kvůli tomu, že naše předpona (schéma URL) má čísla a regulární výraz kontroluje pouze znakovou sadu skládající se z :alpha: teček a pomlček. Po konzultaci se standardem rfc3986 pro jednotný identifikátor zdroje Ukázalo se, že tentokrát Microsoft nic neporušuje (ačkoli jsem takovou verzi měl). Právě třída znaků :alpha: obsahuje pouze písmena latinské abecedy. Rychle měním běžnou kontrolu na alfanumerickou. Hotovo, jste úžasní, vše konečně začíná, ovládání po všech kontrolách je předáno naší skriptovací aplikaci, náš odkaz se zobrazuje na konzoli, vše je jak má být. Poté začínám mít podezření, že všechny problémy s exo-open jsou také způsobeny validací formátu odkazu kvůli číslům ve schématu. Pro otestování hypotézy změním registraci typu mime aplikace na pouhé schéma rys a voila - vše funguje bez přepsání funkce open_xfce. To nám ale nijak nepomůže, protože webová stránka pro vstup do konference vytváří odkaz s lync15.

První část cesty je tedy za námi. Víme, jak zachytit volání odkazu a pak je potřeba ho nějak zpracovat a předat dovnitř Pidginu. Abych pochopil, jak to interně funguje při zadávání dat pomocí odkazu v nabídce „připojit se ke konferenci“, naklonoval jsem úložiště Git projektu Sipe a připravil jsem se znovu se ponořit do kódu. Ale pak mě naštěstí zaujaly scénáře v katalogu 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 se, že plugin Sipe je k dispozici pro interakci přes dbus (desktop sběrnici) a uvnitř skriptů jsou příklady připojení ke konferenci pomocí odkazu, buď přes jméno organizátora a conf-id, nebo můžete zahájit hovor přes sip . To je přesně to, co nám chybělo.

Krok 2. Implementace obslužné rutiny automatického připojení

Vzhledem k tomu, že v Pearl jsou hotové příklady, rozhodl jsem se prostě použít sipe-join-conference-with-uri.pl a trochu si ho upravit, aby vám vyhovoval. Umím psát perlou, takže to nezpůsobilo žádné zvláštní potíže.

Po samostatném testování skriptu jsem jeho volání zapsal do souboru lync.desktop. A bylo to vítězství! Když vstoupíte na stránku pro připojení ke konferenci a povolíte spuštění xdg-open, automaticky se otevře vyskakovací okno konference z Pidginu. Jak jsem se radoval.
Povzbuzen tímto úspěchem jsem se rozhodl udělat totéž pro svůj hlavní prohlížeč, Mozilla Firefox. Když se přihlásíte přes lišku, otevře se stránka pro autorizaci a úplně dole je tlačítko připojte se pomocí kancelářského komunikátoru. Byla to ona, kdo upoutal mou pozornost. Když na něj kliknete v prohlížeči, přejde na adresu:

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

na což mi laskavě sděluje, že neví, jak to otevřít, a možná, že nemám přidruženou aplikaci pro takový protokol. No, už jsme si tím prošli.

Rychle registruji svou skriptovou aplikaci také pro schéma uri conf a... nic se neděje. Prohlížeč si neustále stěžuje, že neexistuje žádná aplikace, která by zpracovávala moje odkazy. V tomto případě funguje volání xdg-open z konzole s parametry perfektně.

„Nastavit vlastní obslužný program protokolu ve firefoxu“ – s touto otázkou jsem šel online. Po několika diskuzích o stackoverflow (a kde bychom bez něj byli) se zdá, že odpověď byla nalezena. Musíte vytvořit speciální parametr v about: config (samozřejmě nahrazením foo conf):

network.protocol-handler.expose.foo = false

Vytvoříme to, otevřeme odkaz a... žádné takové štěstí. Prohlížeč, jako by se nic nestalo, říká, že naši aplikaci nezná.

Čtu oficiální dokumentaci k registraci protokolu od Mozilly, existuje možnost zaregistrovat asociace v samotné ploše gnome (samozřejmě nahrazením foo 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

Registruji se, otevřu prohlížeč... a zase vousy.

Zde mě zaujal řádek z dokumentace:

Až příště kliknete na odkaz typu protokolu foo, budete dotázáni, pomocí které aplikace jej otevřít.

— Semjon Semenych
- Ahh

Neklikáme na odkaz, ale webová stránka jednoduše změní umístění okna pomocí javascriptu. Napíšu jednoduchý html soubor s odkazem na conf protokol, otevřu ho v prohlížeči, kliknu na odkaz - Yos! Otevře se okno s dotazem, ve které aplikaci musíme otevřít náš odkaz a tam už máme v seznamu naši aplikaci Lync – poctivě jsme ji zaregistrovali všemi možnými způsoby. V okně je zaškrtávací políčko „zapamatovat si výběr a vždy otevírat odkazy v naší aplikaci“, označte jej a klikněte na OK. A to je druhé vítězství – otevírá se okno konference. Otevírání konferencí přitom funguje nejen při kliknutí na odkaz, ale i při přechodu z připojovací stránky, kterou potřebujeme na konferenci.

Pak jsem zkontroloval a vymazal parametry network.protocol-handler.expose.conf nijak neovlivnily fungování protokolu ve Foxu. Odkazy fungovaly dál.

Závěr

Veškerou svou práci jsem nahrál do úložiště GitHub; odkazy na všechny zdroje budou na konci článku.
Budu mít zájem o zpětnou vazbu od těch, kteří chtějí moji práci použít. Hned bych měl poznamenat, že veškerý vývoj jsem dělal pouze pro svůj systém Linux Mint, takže některé jiné distribuce nebo desktopy nemusí v této verzi fungovat. Nebo spíše, jsem si tím dokonce téměř jistý, protože jsem v xdg-open opravoval pouze 1 funkci, která se týká pouze mého DE. Pokud chcete přidat podporu pro jiné systémy nebo desktopy, napište mi pull requesty na Github.

Dokončení celého projektu trvalo 1 večer.

Odkazy:

Zdroj: www.habr.com

Přidat komentář