Automatysk oanmelde by Lync-konferinsjes op Linux

Hoi Habr!

Foar my is dizze sin besibbe oan hallo wrâld, om't ik einlings by myn earste publikaasje kaam. Ik haw dit prachtige momint lang útsteld, om't der neat wie om oer te skriuwen, en ik woe ek net oan eat sûgje dat al in bulte kearen sûge wie. Yn 't algemien woe ik foar myn earste publikaasje wat orizjineel, nuttich foar oaren en mei in soarte fan útdaging en probleemoplossing. En no kin ik dit diele. No litte wy prate oer alles yn oarder.

Ynlieding

It begon allegear doe't ik in skoft lyn Linux Mint downloade op myn wurkkomputer. In protte minsken witte wierskynlik dat Pidgin mei de Sipe-plugin in folslein geskikte ferfanging is foar Microsoft Lync (no Skype foar bedriuw neamd) foar Linux-systemen. Fanwegen de spesifisiteit fan myn wurk moat ik faak meidwaan oan SIP-konferinsjes, en doe't ik in Windows-arbeider wie, wie it yngean fan konferinsjes elemintêr: wy krije in útnoeging per post, klikje op de ynloglink, en wy binne klear om te gean .

By it wikseljen nei de tsjustere kant fan Linux waard alles wat komplisearre: fansels kinne jo ek ynlogge by konferinsjes yn Pidgin, mar om dit te dwaan moatte jo de opsje meidwaan oan konferinsje selektearje yn it menu yn 'e eigenskippen fan jo SIP-akkount en yn it finster dat iepenet, ynfoegje in keppeling nei de konferinsje of fier de namme fan de organisator en conf id yn. En nei in skoft begon ik te tinken: "is it mooglik dit ien of oare manier te ferienfâldigjen?" Ja, jo kinne sizze, wêrom hawwe jo dit nedich? Ik soe leaver op Windows sitte en myn geast net blaze.

Stap 1: Undersyk

"As jo ​​​​wat wille yn jo holle krije, kinne jo it net mei in stek útslaan," sei Nekrasov yn syn wurk "Who Lives Well in Rus".

Dus, doe't de gedachte yn 'e holle kaam, kaam nei ferrin fan tiid it earste idee foar ymplemintaasje op. Alles like ienfâldich - jo moatte tagong ta keppelings ûnderskeppe meet.company.com/user/confid - ynstallearje in lokaal webapplikaasjeproses op jo auto by 127.0.0.1 en yn /etc/hosts foegje in statyske yngong ta foar it bedriuwsdomein wêrmei jo de konferinsje ynfiere, en wiist op localhost. Dêrnei moat dizze webserver de kepling ferwurkje dy't derop kaam en it op ien of oare manier oerdrage binnen Pidgin (ik sil fuort sizze dat ik op dit stadium noch gjin idee hie hoe't ik it der oan jaan moast). De oplossing rûkt fansels nei krukken, mar wy binne programmeurs, krukken meitsje ús net bang (shit).

Doe haw ik tafallich de útnoegingskeppeling yn Google Chrome iepene (en normaal brûk ik altyd Mozilla Firefox). En ta myn ferrassing seach de webside der folslein oars út - d'r wie gjin formulier foar it ynfieren fan brûkersgegevens en fuort nei it ynfieren fan 'e side wie der in fersyk om wat te iepenjen fia xdg-iepen. Krekt foar de wille klik ik op "ja" en in flaterberjocht ferskynt - de keppeling lync15:confjoin?url=https://meet.company.com/user/confid kin net iepene wurde. Hmm. Wat foar xdg-iepen is dit en wat hat it nedich om sokke keppelings te iepenjen? In post-mortem lêzing fan 'e dokumintaasje die bliken dat it in GUI-handler is dy't helpt by it útfieren fan assosjearre applikaasjes, itsij mei protokollen foar it uri-skema as mei spesifike bestânstypen. Ferienings wurde konfigurearre fia mime-type mapping. Sa sjogge wy dat wy in syktocht útfiere foar in oerienkommende applikaasje foar in uri-skema neamd lyn 15 en de keppeling wurdt trochjûn oan xdg-open, dy't dan, yn teory, it moat trochjaan oan ien of oare applikaasje dy't ferantwurdlik is foar dit type keppeling. Wat wy fansels net yn ús systeem hawwe. As net, wat dogge se dan yn 'e iepen boarne wrâld? Dat kloppet, wy skriuwe it sels.

Fierdere ûnderdompeling yn 'e wrâld fan Linux en foaral yn it bestudearjen fan hoe't de grafyske shell (buroblêdomjouwing, DE) wurket, trouwens, ik haw Xfce yn Linux Mint, liet sjen dat applikaasjes en it mime-type dat dêrmei ferbûn is, meast direkt skreaun wurde yn fluchtoetsbestannen mei de tafoeging .desktop. No, wêrom net, ik meitsje in ienfâldige applikaasje-fluchtoets, dy't gewoan in bash-skript moat starte en it argumint dat oan 'e konsole trochjûn wurdt útfiere, ik leverje allinich it fluchtoetsbestân sels:

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

Ik lansearje xdg-iepen fan 'e konsole, troch deselde keppeling troch te jaan dy't út' e browser komt en ... bummer. Nochris seit it dat it de keppeling net kin ferwurkje.

As it docht bliken, haw ik de map fan assosjearre mime-typen net bywurke mei myn applikaasje. Dit wurdt dien mei in ienfâldich kommando:

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

dy't de triem gewoan bewurket ~/.config/mimeapps.list.

Poging nûmer 2 mei de xdg-iepen oprop - en wer mislearring. Neat, swierrichheden meitsje ús net bang, mar bringe allinich ús ynteresse oan. En bewapene mei alle krêft fan bash (dat wol sizze tracing), dûke wy earst nei debuggen. It is hjir wichtich om te notearjen dat xdg-open gewoan in shellskript is.

bash -x xdg-open $url

Analyse fan de útfier nei tracing it wurdt in bytsje dúdlik dat kontrôle wurdt dan oerdroegen oan exo-iepen. En dit is al in binêre triem en it is dreger om te begripen wêrom't it in mislearre weromkoade werombringt by it trochjaan fan in keppeling nei it yn in argumint.

Nei't ik de ynterne fan xdg-open seach, fûn ik út dat it ferskate miljeuparameters analysearret en kontrôle fierder trochjaan oan guon ark foar it iepenjen fan bestânskeppelings spesifyk foar in bepaalde DE, of it hat in fallbackfunksje iepen_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
}

Ik sil hjir fluch in lytse hack ynbêde mei analyze fan it trochjûne argumint en as ús spesifike substring dêr leit lync15:, dan drage wy daliks kontrôle oer nei de funksje iepen_generic.

Poging nûmer 3 en tinke jo dat it wurke? Ja, no, fansels. Mar it flaterberjocht is al feroare, dit is al foarútgong - no fertelde hy my dat it bestân net fûn waard en yn 'e foarm fan in bestân skreau hy my deselde keppeling trochjûn as argumint.

Dizze kear bliek it in funksje te wêzen is_file_url_or_path, dy't analysearret de triem keppeling trochjûn oan de ynfier: file:// of it paad nei de triem of wat oars. En de kontrôle wurke net goed fanwege it feit dat ús prefix (url-skema) sifers hat, en de reguliere ekspresje kontrolearret allinich de tekenset dy't bestiet út :alpha: punten en streepkes. Nei rieplachtsjen fan de rfc3986 standert foar unifoarme boarne identifier It waard dúdlik dat Microsoft dizze kear neat skeint (hoewol't ik sa'n ferzje hie). Allinne de karakterklasse :alpha: befettet allinnich letters fan it Latynske alfabet. Ik feroarje gau de reguliere kontrôle yn alfanumerike. Dien, jo binne geweldich, alles begjint einlings, kontrôle nei alle kontrôles wurdt jûn oan ús skriptapplikaasje, ús keppeling wurdt werjûn op 'e konsole, alles is sa't it moat wêze. Hjirnei begjin ik te fermoedzjen dat alle problemen mei exo-iepen ek binne troch de falidaasje fan it keppelingformaat troch de nûmers yn it skema. Om de hypoteze te testen, feroarje ik de mime-type registraasje fan 'e applikaasje nei gewoan in skema lync en voila - alles wurket sûnder de funksje open_xfce te oerskriuwen. Mar dit sil ús op gjin inkelde manier helpe, om't de webside foar it yngean fan 'e konferinsje in keppeling makket mei lync15.

Sa, it earste diel fan 'e reis is klear. Wy witte hoe't jo in keppeloprop kinne ûnderskeppe en dan moat it op ien of oare manier wurde ferwurke en trochjûn binnen Pidgin. Om te begripen hoe't it yntern wurket by it ynfieren fan gegevens fia in keppeling yn it menu "meidwaan oan in konferinsje", klone ik it Git-repository fan it Sipe-projekt en makke my klear om wer yn 'e koade te dûken. Mar doe, gelokkich, waard ik oanlutsen troch de skripts yn 'e katalogus bydrage/dbus/:

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

It docht bliken dat de Sipe-plugin beskikber is foar ynteraksje fia dbus (buroblêdbus) en binnen de skripts binne der foarbylden fan meidwaan oan in konferinsje fia in keppeling, itsij fia de namme fan de organisator en conf-id, of jo kinne in oprop begjinne fia sip . Dit is krekt wat wy misten.

Stap 2. It útfieren fan in autojoin handler

Sûnt d'r binne klearmakke foarbylden yn Pearl, besleat ik gewoan te brûken sipe-join-conference-with-uri.pl en feroarje it in bytsje om josels te passen. Ik kin skriuwe yn Pearl, dus it joech gjin bysûndere swierrichheden.

Nei it testen fan it skript apart, skreau ik syn oprop yn it bestân lync.desktop. En it wie in oerwinning! By it ynfieren fan de konferinsje join side en it tastean fan xdg-open te rinnen, soe it konferinsje popup finster fan Pidgin automatysk iepenje. Wat bin ik bliid.
Oanmoedige troch it sukses besleat ik itselde te dwaan foar myn haadbrowser, Mozilla Firefox. As jo ​​ynlogge fia de foks, iepenet in side foar autorisaasje en hiel ûnder is in knop meidwaan mei help fan kantoar communicator. Sy wie dejinge dy't myn oandacht luts. As jo ​​​​derop klikke yn 'e browser, giet it nei it adres:

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

dêr't er my freonlik oan fertelt dat er net wit hoe't er it iepenje moat en miskien haw ik gjin assosjearre applikaasje foar sa'n protokol. No, wy hawwe dit al meimakke.

Ik registrearje gau myn skriptapplikaasje ek foar it uri-skema conf en ... neat bart. De browser bliuwt klage dat d'r gjin applikaasje is dy't myn keppelings behannelet. Yn dit gefal wurket it oproppen fan xdg-open fan 'e konsole mei parameters perfekt.

"Set oanpaste protokol handler yn firefox" - Ik gong online mei dizze fraach. Neidat troch ferskate diskusjes oer stackoverflow (en wêr soe wy wêze sûnder it), liket it derop dat it antwurd waard fûn. Jo moatte in spesjale parameter oanmeitsje yn oer: config (fansels foo ferfange troch conf):

network.protocol-handler.expose.foo = false

Wy meitsje it, iepenje de keppeling en ... gjin gelok. De browser, as wie der neat bard, seit dat it ús applikaasje net ken.

Ik lês de offisjele dokumintaasje oer it registrearjen fan in protokol fan Mozilla, d'r is in opsje om assosjaasjes te registrearjen yn it gnome-buroblêd sels (foo ferfange troch conf, fansels):

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

Ik registrearje, iepenje de browser... en wer it burd.

Hjir falt in rigel út 'e dokumintaasje myn each op:

Folgjende kear as jo op in kepling fan protokol-type foo klikke, wurdt jo frege mei hokker applikaasje jo it iepenje moatte.

— Semyon Semenych
- Ahh

Wy klikke net op de keppeling, mar de webside feroaret gewoanwei window.location fia javascript. Ik skriuw in ienfâldich html-bestân mei in keppeling nei it conf-protokol, iepenje it yn 'e browser, klikje op de keppeling - Yos! In finster iepenet dat freget yn hokker applikaasje wy ús keppeling moatte iepenje, en dêr hawwe wy ús Lync-applikaasje al yn 'e list - wy hawwe it earlik registrearre op alle mooglike manieren. D'r yn it finster is d'r in karfakje "ûnthâld de kar en iepenje altyd keppelings yn ús applikaasje", markearje it, klikje op ok. En dit is de twadde oerwinning - it konferinsjefinster iepent. Tagelyk wurket it iepenjen fan konferinsjes net allinich as jo op in keppeling klikke, mar ek by it ferpleatsen fan 'e meidwaande side dy't wy nedich binne nei de konferinsje.

Dan ik kontrolearre, wiskjen parameters network.protocol-handler.expose.conf hat gjin ynfloed op de wurking fan it protokol yn Fox. De keppelings bleaunen wurkje.

konklúzje

Ik haw al myn wurk opladen nei it GitHub-repository; keppelings nei alle boarnen sille oan 'e ein fan it artikel wêze.
Ik sil ynteressearre wêze yn it ûntfangen fan feedback fan dyjingen dy't myn wurk wolle brûke. Ik moat fuortendaliks opmerke dat ik de hiele ûntwikkeling allinich dien foar myn Linux Mint-systeem, sadat guon oare distribúsjes of buroblêden miskien net wurkje yn dy ferzje. Of leaver, ik bin der sels hast wis fan, om't ik mar 1 funksje yn xdg-open patched dy't allinich relatearret oan myn DE. As jo ​​​​stipe taheakje wolle foar oare systemen of buroblêden, skriuw my pull-oanfragen op Github.

It hiele projekt duorre 1 jûn om te foltôgjen.

Ferwizings:

Boarne: www.habr.com

Add a comment