Secara otomatis masuk ke konferensi Lync di Linux

Halo, Habr!

Bagi saya, frasa ini mirip dengan halo dunia, karena saya akhirnya sampai pada publikasi pertama saya. Saya menunda momen indah ini untuk waktu yang lama, karena tidak ada yang perlu ditulis, tetapi saya juga tidak ingin menyedot apa yang sudah tersedot berkali-kali. Secara umum, untuk publikasi pertama saya, saya menginginkan sesuatu yang orisinal, berguna bagi orang lain dan mengandung semacam tantangan dan penyelesaian masalah. Dan sekarang saya bisa membagikan ini. Sekarang, hal pertama yang pertama.

Entri


Semuanya berawal dari kenyataan bahwa beberapa waktu yang lalu saya memutar sendiri Linux Mint pada komputer yang berfungsi. Banyak yang mungkin tahu bahwa Pidgin dengan plugin Sipe adalah pengganti yang sepenuhnya cocok untuk Microsoft Lync (sekarang disebut Skype for business) untuk sistem Linux. Karena spesifik pekerjaan, saya sering harus berpartisipasi dalam konferensi sip, dan ketika tukang roti berada di, pintu masuk ke konferensi adalah dasar: kami menerima undangan melalui surat, klik pada tautan masuk, kami siap masuk.

Ketika beralih ke sisi gelap Linux, segalanya menjadi sedikit rumit: tentu saja ada entri Pidgin ke konferensi, tetapi untuk ini Anda harus memilih opsi untuk bergabung dengan konferensi dari menu di properti-properti akun sip Anda dan menyisipkan tautan ke konferensi di jendela yang membuka atau memasukkan nama penyelenggara dan conf id. Dan setelah beberapa waktu saya mulai berpikir: "Apakah mungkin untuk menyederhanakan ini entah bagaimana?" Ya, Anda berkata, mengapa Anda membutuhkannya, akan duduk di Windows dan tidak akan meniup kumis.

Langkah 1. Penelitian


"Apa yang akan terjadi - Anda tidak akan mengalahkannya," - kata Nekrasov dalam karyanya "Siapa yang bisa hidup dengan baik di Rusia".

Jadi, sejak pemikiran itu menghantam kepala, setelah beberapa waktu ide pertama muncul untuk implementasi. Segalanya tampak sederhana - Anda perlu mencegat panggilan untuk bertemu.company.com/user/confid links - letakkan proses lokal aplikasi web di 127.0.0.1 di gerobak dorong Anda dan masukkan entri statis untuk domain perusahaan yang dilaluinya di / etc / hosts dalam konferensi yang menunjuk ke localhost. Lebih lanjut, server web ini harus memproses tautan yang datang kepadanya dan entah bagaimana mentransfernya ke Pidgin (saya akan segera mengatakan bahwa pada tahap ini saya sama sekali tidak tahu bagaimana memberikannya kepadanya). Solusinya, tentu saja, berbau seperti kruk, tetapi kita adalah programmer, kruk tidak membuat kita takut (mencicit).

Kemudian secara kebetulan saya entah bagaimana membuka tautan ke undangan ke Google Chrome (dan biasanya saya selalu menggunakan Mozilla Firefox). Dan yang mengejutkan saya, halaman web tampak sangat berbeda - tidak ada formulir input data pengguna dan segera setelah memasuki halaman ada permintaan untuk membuka sesuatu melalui xdg-open . Untuk bersenang-senang, saya klik "ya" dan pesan kesalahan muncul - tautan lync15: confjoin? Url = https: //meet.company.com/user/confid tidak dapat dibuka. Hmm Jenis xdg-open apa ini dan apa yang dibutuhkan agar tautan seperti itu bisa dibuka? Otopsi yang membaca dokumentasi menunjukkan bahwa itu adalah penangan shell grafis yang membantu meluncurkan aplikasi terkait dengan protokol untuk skema uri atau jenis file tertentu. Asosiasi dikonfigurasikan melalui pemetaan tipe-mime. Jadi, kita melihat bahwa kita mulai mencari aplikasi yang dipetakan untuk skema uri dengan nama lync15 dan tautan dilewatkan ke xdg-open, yang secara teori harus meneruskannya ke beberapa aplikasi yang bertanggung jawab untuk jenis tautan ini. Yang kita, tentu saja, tidak miliki dalam sistem. Dan jika tidak, bagaimana mereka melakukannya di dunia open source? Itu benar, kami akan menulisnya sendiri.

Perendaman lebih lanjut di dunia Linux dan terutama dalam studi tentang bagaimana shell grafis (lingkungan desktop, DE) bekerja, dengan cara saya memilikinya Xfce di Linux Mint, menunjukkan bahwa aplikasi dan tipe mime yang terkait dengannya biasanya ditulis langsung dalam file shortcut dengan ekstensi. .desktop. Nah, mengapa tidak, saya membuat pintasan aplikasi sederhana, yang seharusnya menjalankan skrip bash dan menampilkan argumen yang diteruskan ke konsol, saya hanya akan memberikan file pintasan itu sendiri:

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

Saya meluncurkan xdg-open dari konsol dengan tautan yang sama yang berasal dari browser dan ... gelandangan. Sekali lagi dia mengatakan bahwa dia tidak dapat memproses tautan.

Ternyata, saya tidak memperbarui direktori tipe mime terkait dengan aplikasi saya. Ini dilakukan dengan perintah sederhana:

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

yang hanya mengedit file ~ / .config / mimeapps.list .

Coba nomor 2 dengan panggilan terbuka xdg - dan gagal lagi. Tidak ada, kesulitan tidak membuat kita takut, tetapi hanya bunga. Dan dipersenjatai dengan semua kekuatan bash (mis., Tracing), kami terjun cepat ke debugging. Penting untuk dicatat di sini bahwa xdg-open hanyalah skrip shell.

 bash -x xdg-open $url 

Menganalisis output setelah penelusuran, menjadi sedikit jelas bahwa kontrol lebih lanjut ditransfer ke exo-open . Dan ini sudah merupakan file biner dan memahami mengapa ia mengembalikan kode pengembalian yang gagal ketika melewati tautan ke sana dalam suatu argumen sudah lebih sulit.

Setelah menjalankan melalui interior xdg-open, saya menemukan bahwa ia menganalisis berbagai parameter lingkungan dan melewati kontrol ke beberapa alat untuk membuka file / tautan khusus ke DE tertentu, atau memiliki cadangan dalam bentuk fungsi 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 } 

Saya dengan cepat memotong hack kecil di sini dengan analisis argumen yang diteruskan, dan jika lync15 substring khusus kami ada di sana , maka kami segera memberikan kontrol ke fungsi open_generic .

Coba nomor 3 dan Anda pikir itu berhasil? Ya, sekarang bagaimana. Tetapi pesan kesalahan sudah berubah, ini sudah berlangsung - sekarang dia mengatakan kepada saya bahwa file tersebut tidak ditemukan dan dalam bentuk file dia menulis kepada saya tautan yang dilewati sebagai argumen.

Kali ini ternyata adalah fungsi is_file_url_or_path , yang menganalisis tautan ke file: // file atau path ke file atau sesuatu yang lain. Dan cek tidak berfungsi dengan benar karena fakta bahwa awalan kami (skema url) memiliki angka, dan ekspresi reguler hanya memeriksa rangkaian karakter yang terdiri dari: alpha: dots dan strip. Setelah berkonsultasi dengan standar rfc3986 untuk pengidentifikasi sumber daya yang seragam, menjadi jelas bahwa kali ini Microsoft tidak melanggar apa pun (walaupun saya memiliki versi seperti itu). Hanya kelas karakter: alpha: hanya berisi huruf-huruf alfabet Latin. Saya dengan cepat mengubah cek reguler ke alfanumerik. Selesai, Anda senang, semuanya akhirnya dimulai, kontrol setelah semua pemeriksaan diberikan ke aplikasi skrip kami, tautan kami ditampilkan di konsol, semuanya seperti yang seharusnya. Setelah itu, saya mulai curiga bahwa semua masalah dengan exo-open juga karena validasi format tautan karena angka-angka dalam diagram. Untuk menguji hipotesis, saya mengubah registrasi aplikasi tipe mime menjadi skema lync dan voila - semuanya berfungsi tanpa mendefinisikan ulang fungsi open_xfce. Tetapi ini tidak akan membantu kami dengan cara apa pun, karena halaman web untuk memasuki konferensi membuat tautan dengan lync15 dengan tepat.

Jadi, bagian pertama dari jalan telah selesai. Kita dapat mencegat panggilan tautan dan kemudian kita perlu memprosesnya dan mengirimkannya ke dalam Pidgin. Untuk memahami cara kerjanya secara internal ketika memasukkan data melalui tautan di menu "join the conference", saya mengkloning repositori proyek Sipe dan bersiap untuk menyelami kode lagi. Tapi di sini, untungnya, saya tertarik pada skrip di direktori contrib / dbus / :

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

Ternyata plugin Sipe tersedia untuk interaksi melalui dbus (bus desktop) dan di dalam skrip terdapat langsung contoh bergabung dengan konferensi melalui tautan, baik melalui nama penyelenggara dan conf-id, atau Anda dapat melakukan panggilan melalui sip. Inilah tepatnya kekurangan kita.

Langkah 2. Menerapkan handler untuk gabung-otomatis


Karena ada contoh siap pakai untuk mutiara, saya memutuskan untuk hanya menggunakan sipe-join-conference-with-uri.pl dan memodifikasinya sedikit untuk saya sendiri. Saya dapat menulis dengan mutiara, jadi ini tidak menyebabkan kesulitan khusus.

Setelah menguji skrip secara terpisah, saya memasukkan panggilannya ke file lync.desktop . Dan itu adalah kemenangan! Ketika Anda memasuki halaman bergabung dengan konferensi dan memungkinkan peluncuran xdg-open, jendela pop-up konferensi dari Pidgin dibuka secara otomatis. Bagaimana saya bersukacita.
Terdorong oleh kesuksesan, saya memutuskan untuk melakukan hal yang sama untuk browser utama saya, Mozilla Firefox. Saat masuk melalui rubah, halaman untuk otorisasi terbuka dan di bagian paling bawah ada tombol bergabung menggunakan komunikator kantor . Dia juga menarik perhatian saya. Ketika Anda mengkliknya di browser, tautan menuju ke:

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

di mana dia dengan ramah memberi tahu saya bahwa dia tidak tahu cara membukanya dan, mungkin, saya tidak memiliki aplikasi terkait untuk protokol semacam itu. Yah kita sudah melewatinya.

Mendaftarkan aplikasi skrip saya dengan cepat juga untuk conf uri-skema dan ... tidak ada yang terjadi. Peramban terus mengeluh bahwa tidak ada aplikasi yang memproses tautan saya. Pada saat yang sama, panggilan dari konsol xdg-open dengan parameter berfungsi dengan baik.

“Tetapkan handler protokol khusus di firefox” - dengan pertanyaan ini saya online. Setelah beberapa diskusi tentang stackoverflow (dan di mana tanpa itu), sepertinya jawabannya ditemukan. Anda perlu membuat parameter khusus di about: config (tentu saja mengganti foo dengan conf):

 network.protocol-handler.expose.foo = false 

Kami membuat, membuka tautan dan ... itu tidak ada. Peramban, seolah-olah tidak ada yang terjadi, mengatakan bahwa ia tidak mengetahui aplikasi kami.

Saya membaca dokumentasi resmi tentang mendaftarkan protokol dengan Mozilla, ada opsi untuk mendaftarkan asosiasi di desktop gnome itu sendiri (mengganti tentu saja foo dengan 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 

Saya mendaftar, buka browser ... dan lagi janggut.

Di sini satu baris dari dokumentasi menarik perhatian Anda:
Lain kali Anda mengklik tautan jenis protokol, Anda akan ditanya aplikasi mana yang akan dibuka.

- Semen Semenych
- Ahh

Kami tidak mengklik tautannya, tetapi cukup halaman web yang melakukan perubahan window.lokasi melalui javascript. Saya menulis file html sederhana dengan tautan ke protokol conf, buka di browser, klik tautan - Yos! Sebuah jendela terbuka dengan pertanyaan di mana aplikasi yang Anda butuhkan untuk membuka tautan kami dan di sana kami sudah memiliki aplikasi Lync kami dalam daftar - kami dengan jujur ​​mendaftarkannya dalam semua cara yang mungkin. Ada tanda centang di jendela "ingat pilihan dan selalu buka tautan di aplikasi kita", perhatikan, klik ok. Dan ini adalah kemenangan kedua - jendela konferensi terbuka. Pada saat yang sama, pembukaan konferensi sudah berfungsi tidak hanya ketika Anda mengklik tautan, tetapi juga ketika beralih dari halaman yang diinginkan untuk bergabung dengan konferensi.

Kemudian saya memeriksa bahwa menghapus parameter network.protocol-handler.expose.conf tidak mempengaruhi operasi protokol dalam rubah dengan cara apa pun. Tautan terus bekerja.

Kesimpulan


Saya mengunggah semua pencapaian saya ke repositori github, tautan ke semua sumber akan ada di akhir artikel.
Akan menarik bagi saya untuk mendapatkan umpan balik dari mereka yang ingin menggunakan praktik terbaik saya. Saya harus segera mengatakan bahwa saya melakukan segalanya hanya untuk sistem Linux Mint saya, sehingga beberapa distribusi atau desktop lain mungkin tidak berfungsi dalam versi itu. Sebaliknya, saya bahkan hampir yakin akan hal ini, karena saya menambal di xdg-open hanya 1 fungsi yang terkait hanya dengan DE saya. Jika Anda ingin menambahkan dukungan untuk sistem lain atau dekstopov, tuliskan saya permintaan kumpulan di github.

Pelaksanaan seluruh proyek memakan waktu 1 malam.

Referensi:

Source: https://habr.com/ru/post/id471434/


All Articles