Awtomatikong pag-log in sa mga kumperensya ng Lync sa Linux

Hoy Habr!

Para sa akin, ang pariralang ito ay katulad ng hello world, dahil sa wakas ay nakarating na ako sa aking unang publikasyon. Itinigil ko ang kahanga-hangang sandali na ito sa loob ng mahabang panahon, dahil walang maisulat, at ayaw ko ring sumipsip ng isang bagay na sinipsip na ng ilang beses. Sa pangkalahatan, para sa aking unang publikasyon gusto ko ang isang bagay na orihinal, kapaki-pakinabang sa iba at naglalaman ng ilang uri ng hamon at paglutas ng problema. At ngayon ay maibabahagi ko ito. Ngayon pag-usapan natin ang lahat sa pagkakasunud-sunod.

Pagpasok

Nagsimula ang lahat noong nag-download ako ng Linux Mint sa aking computer sa trabaho. Alam ng maraming tao na ang Pidgin na may Sipe plugin ay isang ganap na angkop na kapalit para sa Microsoft Lync (tinatawag na ngayon na Skype para sa negosyo) para sa mga sistema ng Linux. Dahil sa mga detalye ng aking trabaho, madalas akong kailangang lumahok sa mga kumperensya ng SIP, at noong ako ay isang manggagawa sa Windows, elementarya ang pagpasok sa mga kumperensya: nakatanggap kami ng imbitasyon sa pamamagitan ng koreo, mag-click sa link sa pag-login, at handa na kaming pumunta .

Kapag lumipat sa madilim na bahagi ng Linux, ang lahat ay naging mas kumplikado: siyempre, maaari ka ring mag-log in sa mga kumperensya sa Pidgin, ngunit upang gawin ito kailangan mong piliin ang opsyon na sumali sa kumperensya sa menu sa mga katangian ng iyong SIP account at sa window na bubukas, maglagay ng link sa conference o ilagay ang pangalan ng organizer at conf id. At pagkaraan ng ilang oras nagsimula akong mag-isip: "posible bang gawing simple ito?" Oo, maaari mong sabihin, bakit kailangan mo ito? Mas gugustuhin kong maupo sa Windows at huwag mag-isip.

Hakbang 1: Pananaliksik

"Kung mayroon kang ilang kapritso sa iyong ulo, hindi mo ito maaaring patumbahin sa isang taya," sabi ni Nekrasov sa kanyang trabaho na "Who Lives Well in Rus'."

Kaya, sa sandaling ang pag-iisip ay pumasok sa aking ulo, pagkaraan ng ilang oras ay lumitaw ang unang ideya para sa pagpapatupad. Ang lahat ay tila simple - kailangan mong harangin ang pag-access sa mga link meet.company.com/user/confid β€” mag-install ng lokal na proseso ng web application sa iyong sasakyan sa 127.0.0.1 at sa /etc/hosts magdagdag ng static na entry para sa domain ng kumpanya kung saan ka papasok sa conference, na tumuturo sa localhost. Susunod, dapat iproseso ng web server na ito ang link na dumating dito at kahit papaano ay ilipat ito sa loob ng Pidgin (Sasabihin ko kaagad na sa yugtong ito ay wala pa akong ideya kung paano ito ibibigay sa lahat). Ang solusyon, siyempre, amoy saklay, ngunit kami ay mga programmer, ang mga saklay ay hindi nakakatakot sa amin (shit).

Pagkatapos, kung nagkataon, kahit papaano ay nabuksan ko ang link ng imbitasyon sa Google Chrome (at kadalasan ay palaging gumagamit ako ng Mozilla Firefox). At sa aking sorpresa, ang web page ay mukhang ganap na naiiba - walang form para sa pagpasok ng data ng gumagamit at kaagad pagkatapos na ipasok ang pahina ay may isang kahilingan na magbukas ng isang bagay sa pamamagitan ng xdg-open. Para lang masaya, nag-click ako ng β€œyes” at may lalabas na mensahe ng error - hindi mabubuksan ang link na lync15:confjoin?url=https://meet.company.com/user/confid. Hmm. Anong uri ng xdg-open ito at ano ang kailangan nito para mabuksan ang mga naturang link? Ang isang post-mortem na pagbabasa ng dokumentasyon ay nagsiwalat na ito ay isang GUI handler na tumutulong sa pagpapatakbo ng mga nauugnay na application alinman sa mga protocol para sa uri scheme o sa mga partikular na uri ng file. Ang mga asosasyon ay na-configure sa pamamagitan ng mime-type na pagmamapa. Kaya't nakita namin na nagpapatakbo kami ng paghahanap para sa isang katugmang aplikasyon para sa uri ng scheme na pinangalanan lync15 at ang link ay ipinasa sa xdg-open, na kung gayon, sa teorya, ay dapat ipasa ito sa ilang aplikasyon na responsable para sa ganitong uri ng link. Na, siyempre, wala sa ating sistema. Kung hindi, ano ang ginagawa nila sa open source na mundo? Tama, kami na mismo ang magsusulat.

Ang karagdagang pagsasawsaw sa mundo ng Linux at lalo na sa pag-aaral kung paano gumagana ang graphical na shell (desktop environment, DE), nga pala, mayroon akong Xfce sa Linux Mint, ay nagpakita na ang mga application at ang uri ng mime na nauugnay dito ay karaniwang nakasulat sa mga shortcut na file na may extension na .desktop. Kaya, bakit hindi, lumikha ako ng isang simpleng shortcut ng application, na dapat lamang maglunsad ng isang bash script at i-output ang argumento na ipinasa dito sa console, nagbibigay lamang ako ng shortcut na file mismo:

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

Inilunsad ko ang xdg-open mula sa console, na ipinapasa ang parehong link na nagmumula sa browser at... bummer. Muli ay sinasabi nito na hindi nito maproseso ang link.

Sa lumalabas, hindi ko na-update ang direktoryo ng mga nauugnay na uri ng mime sa aking aplikasyon. Ginagawa ito sa isang simpleng utos:

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

na nag-e-edit lamang ng file ~/.config/mimeapps.list.

Subukan ang numero 2 gamit ang xdg-open na tawag - at muli ay nabigo. Wala, ang mga paghihirap ay hindi nakakatakot sa amin, ngunit nagpapasigla lamang sa aming interes. At armado ng lahat ng kapangyarihan ng bash (i.e. pagsubaybay), sumisid muna kami sa pag-debug. Mahalagang tandaan dito na ang xdg-open ay isang shell script lamang.

bash -x xdg-open $url

Ang pagsusuri sa output pagkatapos ng pagsubaybay ay nagiging medyo malinaw na ang kontrol ay ililipat sa exo-open. At isa na itong binary file at mas mahirap maunawaan kung bakit nagbabalik ito ng hindi matagumpay na return code kapag nagpapasa ng link dito sa isang argumento.

Ang pagkakaroon ng pagtingin sa mga internals ng xdg-open, nalaman kong sinusuri nito ang iba't ibang mga parameter ng kapaligiran at ipinapasa ang kontrol sa alinman sa ilang mga tool para sa pagbubukas ng mga link ng file na tiyak sa isang partikular na DE, o mayroon itong fallback function 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
}

Mabilis kong i-embed dito ang isang maliit na hack na may pagsusuri sa naipasa na argumento at kung ang aming partikular na substring ay matatagpuan doon lync15:, pagkatapos ay agad naming inililipat ang kontrol sa function open_generic.

Subukan ang numero 3 at sa tingin mo ito ay gumana? Oo, ngayon, siyempre. Ngunit ang mensahe ng error ay nagbago na, ito ay umuunlad na - ngayon ay sinasabi niya sa akin na ang file ay hindi natagpuan at sa anyo ng isang file ay isinulat niya sa akin ang parehong link na ipinasa bilang isang argumento.

Sa pagkakataong ito ito ay naging isang function is_file_url_or_path, na sinusuri ang link ng file na ipinasa sa input: file:// o ang path sa file o iba pa. At ang pagsusuri ay hindi gumana nang tama dahil sa katotohanan na ang aming prefix (url scheme) ay may mga numero, at ang regular na expression ay tumitingin lamang sa set ng character na binubuo ng :alpha: tuldok at gitling. Pagkatapos kumonsulta sa pamantayan ng rfc3986 para sa pare-parehong tagatukoy ng mapagkukunan Naging malinaw na sa pagkakataong ito ang Microsoft ay hindi lumalabag sa anumang bagay (bagaman mayroon akong ganoong bersyon). Ang klase ng character lang :alpha: ay naglalaman lamang ng mga titik ng alpabetong Latin. Mabilis kong binago ang regular na tseke sa alphanumeric. Tapos na, kamangha-mangha ka, sa wakas ay magsisimula na ang lahat, kontrolin pagkatapos maibigay ang lahat ng mga tseke sa aming application ng script, ang aming link ay ipinapakita sa console, ang lahat ay tulad ng nararapat. Pagkatapos nito, nagsisimula akong maghinala na ang lahat ng mga problema sa exo-open ay dahil din sa pagpapatunay ng format ng link dahil sa mga numero sa scheme. Upang subukan ang hypothesis, binago ko ang mime-type na pagpaparehistro ng application sa isang scheme lamang lync at voila - lahat ay gumagana nang hindi na-override ang open_xfce function. Ngunit hindi ito makakatulong sa amin sa anumang paraan, dahil ang web page para sa pagpasok sa kumperensya ay lumilikha ng isang link na may lync15.

Kaya, ang unang bahagi ng paglalakbay ay nakumpleto na. Alam namin kung paano maharang ang isang link na tawag at pagkatapos ay kailangan itong maproseso at maipasa sa loob ng Pidgin. Upang maunawaan kung paano ito gumagana sa loob kapag naglalagay ng data sa pamamagitan ng isang link sa menu na "sumali sa isang kumperensya", na-clone ko ang Git repository ng proyektong Sipe at naghanda na sumisid muli sa code. But then, buti na lang, naakit ako sa mga script sa catalog kontribusyon/dbus/:

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

Lumalabas na ang Sipe plugin ay magagamit para sa pakikipag-ugnayan sa pamamagitan ng dbus (desktop bus) at sa loob ng mga script ay may mga halimbawa ng pagsali sa isang kumperensya sa pamamagitan ng isang link, alinman sa pamamagitan ng pangalan ng organizer at conf-id, o maaari kang magsimula ng isang tawag sa pamamagitan ng paghigop . Ito talaga ang kulang sa amin.

Hakbang 2. Pagpapatupad ng autojoin handler

Dahil may mga ready-made na halimbawa sa Pearl, nagpasya akong gamitin na lang sipe-join-conference-with-uri.pl at baguhin ito nang kaunti upang umangkop sa iyong sarili. Maaari akong sumulat sa Pearl, kaya hindi ito nagdulot ng anumang partikular na paghihirap.

Matapos subukan ang script nang hiwalay, isinulat ko ang tawag nito sa file lync.desktop. At ito ay isang tagumpay! Kapag pumapasok sa pahina ng pagsali sa kumperensya at pinapayagan ang xdg-open na tumakbo, awtomatikong magbubukas ang window ng popup ng kumperensya mula sa Pidgin. Kung paano ako natuwa.
Hinikayat ng tagumpay, nagpasya akong gawin ang parehong para sa aking pangunahing browser, Mozilla Firefox. Kapag nag-log in ka sa pamamagitan ng fox, magbubukas ang isang pahina para sa awtorisasyon at sa pinakailalim ay mayroong isang pindutan sumali gamit ang office communicator. Siya ang nakakuha ng atensyon ko. Kapag nag-click ka dito sa browser, pupunta ito sa address:

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

kung saan magiliw niyang sinabi sa akin na hindi niya alam kung paano ito buksan at, marahil, wala akong nauugnay na aplikasyon para sa naturang protocol. Well, napagdaanan na natin ito.

Mabilis kong inirehistro ang aking script application din para sa uri scheme conf at... walang nangyayari. Ang browser ay patuloy na nagrereklamo na walang application na humahawak sa aking mga link. Sa kasong ito, ang pagtawag sa xdg-open mula sa console na may mga parameter ay gumagana nang perpekto.

"Itakda ang custom na protocol handler sa firefox" - Nag-online ako sa tanong na ito. Pagkatapos dumaan sa ilang mga talakayan sa stackoverflow (at kung saan kami ay wala ito), tila ang sagot ay natagpuan. Kailangan mong lumikha ng isang espesyal na parameter sa tungkol sa: config (syempre pinapalitan ang foo ng conf):

network.protocol-handler.expose.foo = false

Ginagawa namin ito, buksan ang link at... walang ganoong swerte. Ang browser, na parang walang nangyari, ay nagsabi na hindi nito alam ang aming aplikasyon.

Binabasa ko ang opisyal na dokumentasyon sa pagrehistro ng isang protocol mula sa Mozilla, mayroong isang pagpipilian upang magrehistro ng mga asosasyon sa gnome desktop mismo (pinapalitan ang foo ng conf, siyempre):

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

Nagrehistro ako, binuksan ang browser ... at muli ang balbas.

Narito ang isang linya mula sa dokumentasyon na nakakuha ng aking mata:

Sa susunod na mag-click ka sa isang link ng protocol-type foo tatanungin ka kung aling application ang buksan ito.

β€” Semyon Semenych
- Ahh

Hindi kami nagki-click sa link, ngunit binabago lang ng web page ang window.location sa pamamagitan ng javascript. Sumulat ako ng isang simpleng html file na may isang link sa conf protocol, buksan ito sa browser, mag-click sa link - Yos! Bubukas ang isang window na nagtatanong kung saang application kailangan naming buksan ang aming link, at doon na namin ang aming Lync application sa listahan - tapat naming inirehistro ito sa lahat ng posibleng paraan. Doon sa window ay may isang checkbox na "tandaan ang pagpipilian at palaging buksan ang mga link sa aming aplikasyon", markahan ito, i-click ang ok. At ito ang pangalawang tagumpay - bubukas ang window ng kumperensya. Kasabay nito, gumagana ang pagbubukas ng mga kumperensya hindi lamang kapag nag-click ka sa isang link, kundi pati na rin kapag lumipat mula sa pahina ng pagsali na kailangan namin sa kumperensya.

Pagkatapos ay sinuri ko, tinatanggal ang mga parameter network.protocol-handler.expose.conf ay hindi nakakaapekto sa anumang paraan sa pagpapatakbo ng protocol sa Fox. Patuloy na gumana ang mga link.

Konklusyon

Na-upload ko ang lahat ng aking trabaho sa imbakan ng GitHub; ang mga link sa lahat ng mga mapagkukunan ay nasa dulo ng artikulo.
Magiging interesado akong makatanggap ng feedback mula sa mga gustong gumamit ng aking gawa. Dapat kong tandaan kaagad na ginawa ko ang lahat ng pag-unlad para lamang sa aking Linux Mint system, kaya maaaring hindi gumana ang ilang iba pang mga distribusyon o desktop sa bersyong iyon. O sa halip, halos sigurado ako dito, dahil nag-patch lang ako ng 1 function sa xdg-open na nauugnay lamang sa aking DE. Kung gusto mong magdagdag ng suporta para sa iba pang mga system o desktop, sumulat sa akin ng mga pull request sa Github.

Ang buong proyekto ay tumagal ng 1 gabi upang makumpleto.

Link:

Pinagmulan: www.habr.com

Magdagdag ng komento