Автоматско најавување на конференциите на Lync на Linux

Еј Хабр!

За мене, оваа фраза е слична на здрав свет, бидејќи конечно стигнав до мојата прва публикација. Го одложив овој прекрасен момент долго време, бидејќи немаше за што да пишувам, а исто така не сакав да цицам нешто што веќе беше цицано многу пати. Во принцип, за мојата прва публикација сакав нешто оригинално, корисно за другите и да содржи некаков предизвик и решавање на проблеми. И сега можам да го споделам ова. Сега да разговараме за сè по ред.

Влегување

Се започна кога пред некое време го симнав Linux Mint на мојот работен компјутер. Многу луѓе веројатно знаат дека Pidgin со додатокот Sipe е целосно соодветна замена за Microsoft Lync (сега наречен Skype за бизнис) за Linux системи. Поради спецификите на мојата работа, често морам да учествувам на SIP конференции, а кога бев работник на Windows, влегувањето во конференции беше елементарно: добиваме покана по пошта, кликнуваме на врската за најава и подготвени сме да одиме .

Кога се префрлате на темната страна на Linux, сè стана малку покомплицирано: се разбира, можете да се најавите и на конференции во Pidgin, но за да го направите ова, треба да ја изберете опцијата за придружување конференции во менито во својствата на вашата SIP сметка и во прозорецот што се отвора, вметнете врска до конференцијата или внесете го името на организаторот и конфигурацијата. И по некое време почнав да размислувам: „дали е можно некако да се поедностави ова? Да, може да речете, зошто ви треба ова?

Чекор 1: Истражување

„Ако ви се појави некој каприц во главата, не можете да го исфрлите со клада“, рече Некрасов во своето дело „Кој добро живее во Русија“.

Така, штом ми влезе во главата мисла, по некое време се појави првата идеја за имплементација. Сè изгледаше едноставно - треба да го пресретнете пристапот до врски meet.company.com/user/confid — инсталирајте процес на локална веб-апликација на вашиот автомобил на 127.0.0.1 и во /etc/hosts додадете статичен запис за доменот на компанијата преку кој влегувате во конференцијата, покажувајќи на localhost. Следно, овој веб-сервер мора да ја обработи врската што дошла до него и некако да ја пренесе во Pidgin (веднаш ќе кажам дека во оваа фаза сè уште немав идеја како да му ја дадам). Решението, се разбира, мириса на патерици, но ние сме програмери, патериците не не плашат (срање).

Потоа, случајно, некако го отворив линкот за покана во Google Chrome (и обично секогаш користам Mozilla Firefox). И на мое изненадување, веб-страницата изгледаше сосема поинаку - немаше формулар за внесување кориснички податоци и веднаш по влегувањето на страницата имаше барање да се отвори нешто преку xdg-отворен. Само за забава, кликнам „да“ и се појавува порака за грешка - врската lync15:confjoin?url=https://meet.company.com/user/confid не може да се отвори. Хмм. Каков xdg-open е ова и што му треба за да се отворат такви врски? Постмортално читање на документацијата откри дека се работи за управувач со GUI кој помага да се стартуваат поврзаните апликации или со протоколи за шемата uri или со специфични типови на датотеки. Асоцијациите се конфигурираат преку мапирање од типот на мимика. Така, гледаме дека бараме соодветна апликација за шемата на uri именувана lync15 а врската се пренесува на xdg-open, која потоа, теоретски, треба да ја пренесе на некоја апликација која е одговорна за овој тип на врска. Што, се разбира, го немаме во нашиот систем. Ако не, тогаш што прават тие во светот со отворен код? Така е, сами ќе го напишеме.

Понатамошното потопување во светот на Линукс и особено во проучувањето како функционира графичката обвивка (околина на работната површина, DE), патем, имам Xfce во Linux Mint, покажа дека апликациите и мимичкиот тип поврзани со него обично се напишани директно во датотеки со кратенки со наставката .desktop. Па, зошто да не, создавам едноставна кратенка за апликација, која едноставно треба да започне баш скрипта и да го изнесе аргументот што му е предаден на конзолата, ја обезбедувам само самата датотека со кратенки:

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

Го стартувам xdg-open од конзолата, поминувајќи ја истата врска што доаѓа од прелистувачот и... bummer. Повторно пишува дека не може да ја обработи врската.

Како што се испостави, не го ажурирав директориумот на поврзаните мими-типови со мојата апликација. Ова се прави со едноставна команда:

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

кој едноставно ја уредува датотеката ~/.config/mimeapps.list.

Обид број 2 со повикот xdg-open - и повторно неуспех. Ништо, тешкотиите не не плашат, туку само го разгоруваат нашиот интерес. И вооружени со сета моќ на баш (т.е. следење), ние се нурнуваме со глава во дебагирање. Важно е да се забележи дека xdg-open е само скрипта на школка.

bash -x xdg-open $url

Анализирајќи го излезот по следењето, станува малку јасно дека контролата потоа се пренесува на егзо-отворено. И ова е веќе бинарна датотека и потешко е да се разбере зошто враќа неуспешен повратен код кога пренесува врска до неа во аргумент.

Откако ги разгледав внатрешните делови на xdg-open, дознав дека тој анализира различни параметри на животната средина и ја пренесува контролата понатаму или на некои алатки за отворање врски со датотеки специфични за одредена DE, или има резервна функција 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
}

Брзо ќе вградам овде мал хакер со анализа на положениот аргумент и ако нашата специфична подниза се наоѓа таму lync15:, тогаш веднаш ја пренесуваме контролата на функцијата open_generic.

Обид број 3 и дали мислите дека успеа? Да, сега, се разбира. Но пораката за грешка е веќе сменета, ова е веќе напредок - сега ми кажуваше дека датотеката не е пронајдена и во форма на датотека ми го напиша истиот линк поминат како аргумент.

Овој пат се покажа дека е функција is_file_url_or_path, кој ја анализира врската со датотеката предадена на влезот: file:// или патеката до датотеката или нешто друго. И проверката не функционираше правилно поради фактот што нашиот префикс (шема на url) има броеви, а регуларниот израз само го проверува множеството знаци што се состои од :alpha: точки и цртички. По консултација со стандардот rfc3986 за единствен идентификатор на ресурси Стана јасно дека овој пат Мајкрософт не прекршува ништо (иако имав таква верзија). Само класата на знаци :alpha: содржи само букви од латиницата. Брзо ја менувам редовната проверка во алфанумеричка. Готово, неверојатни сте, сè конечно започнува, контролата по сите проверки е дадена на нашата апликација за скрипта, нашата врска е прикажана на конзолата, сè е како што треба. После ова, почнувам да се сомневам дека сите проблеми со exo-open се должат и на валидацијата на форматот на врската поради бројките во шемата. За да ја тестирам хипотезата, ја менувам регистрацијата на апликацијата од типот на мимика во само шема рисот и Voila - сè работи без да се замени функцијата open_xfce. Но, тоа никако нема да ни помогне, бидејќи веб-страницата за влез на конференцијата создава врска со lync15.

Значи, првиот дел од патувањето е завршен. Знаеме како да пресретнеме повик за врска и потоа треба некако да се обработи и да се пренесе во Pidgin. Со цел да разберам како функционира внатрешно при внесување податоци преку врска во менито „приклучи се на конференција“, го клонирав складиштето Git на проектот Sipe и се подготвив повторно да нурнам во кодот. Но, тогаш, за среќа, ме привлекоа сценаријата во каталогот придонес/dbus/:

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

Излегува дека приклучокот Sipe е достапен за интеракција преку dbus (desktop bus) и внатре во скриптите има примери за приклучување на конференција преку врска, или преку името на организаторот и conf-id, или можете да иницирате повик преку sip . Токму тоа ни недостасуваше.

Чекор 2. Имплементирање на управувач за автоматско приклучување

Бидејќи има готови примери во Pearl, решив само да користам sipe-join-conference-with-uri.pl и изменете го малку за да одговарате на себе. Можам да пишувам во Перл, така што тоа не предизвика некои посебни тешкотии.

Откако ја тестирав скриптата одделно, го напишав нејзиниот повик во датотеката lync.десктоп. И тоа беше победа! Кога ќе влезете во страницата за приклучување на конференцијата и ќе дозволите xdg-open да работи, скокачкиот прозорец на конференцијата од Pidgin ќе се отвори автоматски. Колку се израдував.
Охрабрен од успехот, решив да го направам истото за мојот главен прелистувач, Mozilla Firefox. Кога ќе се најавите преку лисицата, се отвора страница за овластување и најдолу има копче придружете се со помош на канцелариски комуникатор. Таа беше таа што ми го привлече вниманието. Кога ќе кликнете на него во прелистувачот, тој оди на адресата:

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

на што љубезно ми вели дека не знае како да го отвори и, можеби, немам поврзана апликација за таков протокол. Па, ние веќе го поминавме ова.

Брзо ја регистрирам мојата апликација за скрипта и за шемата uri conf и... ништо не се случува. Прелистувачот постојано се жали дека нема апликација што се справува со моите врски. Во овој случај, повикувањето xdg-open од конзолата со параметри функционира совршено.

„Поставете прилагоден управувач за протоколи во Firefox“ - отидов на интернет со ова прашање. Откако поминавме низ неколку дискусии за stackoverflow (и каде ќе бевме без него), се чини дека одговорот е пронајден. Треба да креирате посебен параметар во за: конфиг (се разбира заменувајќи го foo со conf):

network.protocol-handler.expose.foo = false

Ние го создаваме, ја отвораме врската и... нема таква среќа. Прелистувачот, како ништо да не се случило, вели дека не ја познава нашата апликација.

Ја читам официјалната документација за регистрирање протокол од Mozilla, постои опција за регистрирање асоцијации во самата работна површина на gnome (се разбира, се заменува 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

Се регистрирам, го отворам прелистувачот... и пак брадата.

Еве еден ред од документацијата ми привлекува внимание:

Следниот пат кога ќе кликнете на врска од протоколски тип foo ќе бидете прашани со која апликација да ја отворите.

- Семјон Семених
- Ахх

Ние не кликнуваме на врската, туку веб-страницата едноставно ја менува window.location преку Javascript. Пишувам едноставна html-датотека со врска до протоколот conf, отворете ја во прелистувачот, кликнете на врската - Yos! Се отвора прозорец кој прашува во која апликација треба да ја отвориме нашата врска, а таму веќе ја имаме нашата апликација Lync во списокот - искрено ја регистриравме на сите можни начини. Таму во прозорецот има поле за избор „запомнете го изборот и секогаш отворајте врски во нашата апликација“, означете го, кликнете OK. И ова е втора победа - се отвора прозорецот на конференцијата. Во исто време, отворањето конференции функционира не само кога ќе кликнете на врската, туку и кога се движите од страницата за придружување што ни треба на конференцијата.

Потоа проверив, бришејќи параметри мрежа.protocol-handler.expose.conf на никаков начин не влијаеше на работата на протоколот во Фокс. Врските продолжија да работат.

Заклучок

Ја подигнав целата моја работа во складиштето на GitHub; врските до сите ресурси ќе бидат на крајот од статијата.
Ќе бидам заинтересиран да добијам повратни информации од оние кои сакаат да ја користат мојата работа. Веднаш треба да забележам дека го направив целиот развој само за мојот Linux Mint систем, така што некои други дистрибуции или десктоп компјутери може да не работат во таа верзија. Или подобро кажано, дури сум речиси сигурен во ова, бидејќи закрпив само 1 функција во xdg-open што се однесува само на мојот DE. Ако сакате да додадете поддршка за други системи или десктоп компјутери, пишете ми барања за повлекување на Github.

Целиот проект траеше 1 вечер за да се заврши.

Референци:

Извор: www.habr.com

Додадете коментар