Αυτόματη σύνδεση σε συνέδρια Lync στο Linux

Γεια σου Χαμπρ!

Για μένα, αυτή η φράση μοιάζει με το hello world, αφού τελικά έφτασα στην πρώτη μου δημοσίευση. Ανέβαλα αυτή την υπέροχη στιγμή για πολύ καιρό, αφού δεν υπήρχε τίποτα για να γράψω, και επίσης δεν ήθελα να ρουφήξω κάτι που είχε ήδη ρουφήξει πολλές φορές. Γενικά, για την πρώτη μου δημοσίευση ήθελα κάτι πρωτότυπο, χρήσιμο για άλλους και να περιέχει κάποιο είδος πρόκλησης και επίλυσης προβλημάτων. Και τώρα μπορώ να το μοιραστώ αυτό. Τώρα ας μιλήσουμε για όλα με τη σειρά.

Είσοδος

Όλα ξεκίνησαν όταν πριν από λίγο καιρό κατέβασα το Linux Mint στον υπολογιστή εργασίας μου. Πολλοί άνθρωποι πιθανότατα γνωρίζουν ότι το Pidgin με την προσθήκη Sipe είναι μια απολύτως κατάλληλη αντικατάσταση του Microsoft Lync (τώρα ονομάζεται Skype για επιχειρήσεις) για συστήματα Linux. Λόγω των ιδιαιτεροτήτων της δουλειάς μου, πρέπει συχνά να συμμετέχω σε συνέδρια SIP και όταν ήμουν εργαζόμενος στα Windows, η συμμετοχή σε συνέδρια ήταν στοιχειώδης: λαμβάνουμε μια πρόσκληση μέσω ταχυδρομείου, κάνουμε κλικ στον σύνδεσμο σύνδεσης και είμαστε έτοιμοι να πάμε .

Κατά τη μετάβαση στη σκοτεινή πλευρά του Linux, όλα έγιναν κάπως πιο περίπλοκα: φυσικά, μπορείτε επίσης να συνδεθείτε σε συνέδρια στο Pidgin, αλλά για να το κάνετε αυτό πρέπει να επιλέξετε την επιλογή συμμετοχής στη διάσκεψη στο μενού στις ιδιότητες του λογαριασμού σας SIP και στο παράθυρο που ανοίγει, εισαγάγετε έναν σύνδεσμο προς το συνέδριο ή πληκτρολογήστε το όνομα του διοργανωτή και το αναγνωριστικό conf. Και μετά από κάποιο χρονικό διάστημα άρχισα να σκέφτομαι: "είναι δυνατόν να απλοποιηθεί κάπως αυτό;" Ναι, μπορείς να πεις, γιατί στο διάολο το χρειάζεσαι αυτό; Προτιμώ να κάθομαι στα Windows και να μην σκέφτομαι.

Βήμα 1: Έρευνα

«Αν έχεις κάποια ιδιοτροπία στο κεφάλι σου, δεν μπορείς να το χτυπήσεις με ποντάρισμα», είπε ο Νεκράσοφ στο έργο του «Ποιος ζει καλά στη Ρωσία».

Έτσι, μόλις μπήκε η σκέψη στο κεφάλι μου, μετά από λίγο προέκυψε η πρώτη ιδέα για υλοποίηση. Όλα φαίνονταν απλά - πρέπει να παρεμποδίσετε την πρόσβαση σε συνδέσμους meet.company.com/user/confid — εγκαταστήστε μια διαδικασία τοπικής εφαρμογής web στο αυτοκίνητό σας στην 127.0.0.1 και στο /etc/hosts προσθέστε μια στατική καταχώρηση για τον εταιρικό τομέα μέσω του οποίου εισέρχεστε στη διάσκεψη, δείχνοντας τον localhost. Στη συνέχεια, αυτός ο διακομιστής ιστού πρέπει να επεξεργαστεί τον σύνδεσμο που του ήρθε και να τον μεταφέρει με κάποιο τρόπο στο Pidgin (θα πω αμέσως ότι σε αυτό το στάδιο δεν είχα ιδέα πώς να του το δώσω καθόλου). Η λύση, φυσικά, μυρίζει σαν δεκανίκια, αλλά είμαστε προγραμματιστές, τα δεκανίκια δεν μας τρομάζουν (σκατ).

Στη συνέχεια, κατά τύχη, άνοιξα με κάποιο τρόπο τον σύνδεσμο πρόσκλησης στο Google Chrome (και συνήθως χρησιμοποιώ πάντα τον Mozilla Firefox). Και προς έκπληξή μου, η ιστοσελίδα φαινόταν τελείως διαφορετική - δεν υπήρχε φόρμα για την εισαγωγή δεδομένων χρήστη και αμέσως μετά την είσοδο στη σελίδα υπήρχε αίτημα να ανοίξει κάτι μέσω xdg-open. Για πλάκα, κάνω κλικ στο "ναι" και εμφανίζεται ένα μήνυμα σφάλματος - ο σύνδεσμος lync15:confjoin?url=https://meet.company.com/user/confid δεν μπορεί να ανοίξει. Χμμ. Τι είδους xdg-open είναι αυτό και τι χρειάζεται για να ανοίξουν τέτοιοι σύνδεσμοι; Μια μεταθανάτια ανάγνωση της τεκμηρίωσης αποκάλυψε ότι είναι ένας χειριστής GUI που βοηθά στην εκτέλεση σχετικών εφαρμογών είτε με πρωτόκολλα για το σχήμα uri είτε με συγκεκριμένους τύπους αρχείων. Οι συσχετίσεις διαμορφώνονται μέσω αντιστοίχισης τύπου mime. Βλέπουμε λοιπόν ότι εκτελούμε μια αναζήτηση για μια αντιστοιχισμένη εφαρμογή για ένα σχήμα uri με όνομα Λίνκ15 και ο σύνδεσμος περνά στο xdg-open, το οποίο στη συνέχεια, θεωρητικά, θα πρέπει να το περάσει σε κάποια εφαρμογή που είναι υπεύθυνη για αυτόν τον τύπο συνδέσμου. Κάτι που, φυσικά, δεν το έχουμε στο σύστημά μας. Αν όχι, τότε τι κάνουν στον κόσμο του ανοιχτού κώδικα; Σωστά, θα το γράψουμε μόνοι μας.

Περαιτέρω εμβάπτιση στον κόσμο του Linux και ειδικά στη μελέτη του τρόπου λειτουργίας του γραφικού κελύφους (επιτραπέζιο περιβάλλον, DE), παρεμπιπτόντως, έχω το Xfce στο Linux Mint, έδειξε ότι οι εφαρμογές και ο τύπος mime που σχετίζεται με αυτό συνήθως γράφονται απευθείας σε αρχεία συντόμευσης με την επέκταση .desktop. Λοιπόν, γιατί όχι, δημιουργώ μια απλή συντόμευση εφαρμογής, η οποία θα πρέπει απλώς να εκκινήσει ένα σενάριο bash και να εξάγει το όρισμα που του μεταβιβάστηκε στην κονσόλα, παρέχω μόνο το ίδιο το αρχείο συντόμευσης:

[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 από την κονσόλα, περνώντας το ίδιο link που προέρχεται από τον browser και... bummer. Και πάλι λέει ότι δεν μπορεί να επεξεργαστεί τον σύνδεσμο.

Όπως αποδεικνύεται, δεν ενημέρωσα τον κατάλογο των συσχετισμένων τύπων mime με την εφαρμογή μου. Αυτό γίνεται με μια απλή εντολή:

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

που απλώς επεξεργάζεται το αρχείο ~/.config/mimeapps.list.

Προσπάθεια νούμερο 2 με την κλήση xdg-open - και πάλι αποτυχία. Τίποτα, οι δυσκολίες δεν μας τρομάζουν, παρά μόνο τροφοδοτούν το ενδιαφέρον μας. Και οπλισμένοι με όλη τη δύναμη του bash (δηλαδή τον εντοπισμό), βουτάμε με το κεφάλι στην αποσφαλμάτωση. Είναι σημαντικό να σημειωθεί εδώ ότι το 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
}

Θα ενσωματώσω γρήγορα εδώ ένα μικρό hack με ανάλυση του επιχειρήματος που πέρασε και εάν η συγκεκριμένη υποσυμβολοσειρά μας βρίσκεται εκεί lync15:, τότε μεταφέρουμε αμέσως τον έλεγχο στη λειτουργία open_generic.

Προσπάθεια νούμερο 3 και πιστεύεις ότι πέτυχε; Ναι, τώρα, φυσικά. Αλλά το μήνυμα σφάλματος έχει ήδη αλλάξει, αυτό είναι ήδη πρόοδος - τώρα μου έλεγε ότι το αρχείο δεν βρέθηκε και σε μορφή αρχείου μου έγραψε τον ίδιο σύνδεσμο που πέρασε ως επιχείρημα.

Αυτή τη φορά αποδείχθηκε ότι ήταν συνάρτηση is_file_url_or_path, το οποίο αναλύει τη σύνδεση του αρχείου που έχει περάσει στην είσοδο: file:// ή τη διαδρομή προς το αρχείο ή κάτι άλλο. Και ο έλεγχος δεν λειτούργησε σωστά λόγω του γεγονότος ότι το πρόθεμά μας (σχήμα url) έχει αριθμούς και η τυπική έκφραση ελέγχει μόνο το σύνολο χαρακτήρων που αποτελείται από :alpha: τελείες και παύλες. Αφού συμβουλευτείτε το πρότυπο rfc3986 για ενιαίο αναγνωριστικό πόρου Έγινε σαφές ότι αυτή τη φορά η Microsoft δεν παραβιάζει τίποτα (αν και είχα τέτοια έκδοση). Απλώς η κλάση χαρακτήρων :alpha: περιέχει μόνο γράμματα του λατινικού αλφαβήτου. Αλλάζω γρήγορα τον κανονικό έλεγχο σε αλφαριθμητικό. Ολοκληρώθηκε, είστε καταπληκτικοί, όλα επιτέλους ξεκινούν, ο έλεγχος μετά από όλους τους ελέγχους δίνεται στην εφαρμογή σεναρίου μας, ο σύνδεσμός μας εμφανίζεται στην κονσόλα, όλα είναι όπως θα έπρεπε. Μετά από αυτό, αρχίζω να υποψιάζομαι ότι όλα τα προβλήματα με το exo-open οφείλονται επίσης στην επικύρωση της μορφής συνδέσμου λόγω των αριθμών στο σχήμα. Για να ελέγξω την υπόθεση, αλλάζω την εγγραφή τύπου mime της εφαρμογής σε απλώς ένα σχήμα lync και 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 (δίαυλος επιτραπέζιου υπολογιστή) και μέσα στα σενάρια υπάρχουν παραδείγματα συμμετοχής σε μια διάσκεψη μέσω συνδέσμου, είτε μέσω του ονόματος του διοργανωτή και του conf-id, είτε μπορείτε να ξεκινήσετε μια κλήση μέσω sip . Αυτό ακριβώς μας έλειπε.

Βήμα 2. Εφαρμογή ενός χειριστή αυτόματης σύνδεσης

Επειδή υπάρχουν έτοιμα παραδείγματα στο Pearl, αποφάσισα να χρησιμοποιήσω απλώς sipe-join-conference-with-uri.pl και τροποποιήστε το λίγο για να ταιριάζει στον εαυτό σας. Μπορώ να γράψω στο Pearl, οπότε δεν προκάλεσε ιδιαίτερες δυσκολίες.

Αφού δοκίμασα το σενάριο ξεχωριστά, έγραψα την κλήση του στο αρχείο lync.desktop. Και ήταν μια νίκη! Όταν εισέρχεστε στη σελίδα συμμετοχής στη διάσκεψη και επιτρέπετε την εκτέλεση του xdg-open, το αναδυόμενο παράθυρο της διάσκεψης από το Pidgin θα ανοίξει αυτόματα. Πόσο χάρηκα.
Ενθαρρυμένος από την επιτυχία, αποφάσισα να κάνω το ίδιο για το κύριο πρόγραμμα περιήγησής μου, το Mozilla Firefox. Όταν συνδέεστε μέσω του fox, ανοίγει μια σελίδα για εξουσιοδότηση και στο κάτω μέρος υπάρχει ένα κουμπί εγγραφείτε χρησιμοποιώντας το γραφείο επικοινωνίας. Ήταν αυτή που τράβηξε την προσοχή μου. Όταν κάνετε κλικ σε αυτό στο πρόγραμμα περιήγησης, πηγαίνει στη διεύθυνση:

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

στο οποίο ευγενικά μου λέει ότι δεν ξέρει πώς να το ανοίξει και, ίσως, δεν έχω σχετική εφαρμογή για ένα τέτοιο πρωτόκολλο. Λοιπόν, το έχουμε ήδη περάσει αυτό.

Δηλώνω γρήγορα την αίτησή μου σεναρίου και για το σχήμα uri conf και... δεν γίνεται τίποτα. Το πρόγραμμα περιήγησης συνεχίζει να παραπονιέται ότι δεν υπάρχει εφαρμογή που χειρίζεται τους συνδέσμους μου. Σε αυτήν την περίπτωση, η κλήση του xdg-open από την κονσόλα με παραμέτρους λειτουργεί τέλεια.

"Ρύθμιση προσαρμοσμένου χειριστή πρωτοκόλλου στο firefox" - Μπήκα στο διαδίκτυο με αυτήν την ερώτηση. Αφού περάσαμε από πολλές συζητήσεις για το stackoverflow (και πού θα ήμασταν χωρίς αυτό), φαίνεται ότι βρέθηκε η απάντηση. Πρέπει να δημιουργήσετε μια ειδική παράμετρο στο about: config (φυσικά αντικαθιστώντας το 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

Εγγραφώ, ανοίγω τον browser... και πάλι το μούσι.

Εδώ μια γραμμή από την τεκμηρίωση τραβάει το μάτι μου:

Την επόμενη φορά που θα κάνετε κλικ σε έναν σύνδεσμο foo τύπου πρωτοκόλλου θα ερωτηθείτε με ποια εφαρμογή να τον ανοίξετε.

— Semyon Semenych
- Αχ

Δεν κάνουμε κλικ στον σύνδεσμο, αλλά η ιστοσελίδα αλλάζει απλώς το window.location μέσω javascript. Γράφω ένα απλό αρχείο html με σύνδεσμο προς το πρωτόκολλο conf, το ανοίγω στο πρόγραμμα περιήγησης, κάνω κλικ στον σύνδεσμο - Yos! Ανοίγει ένα παράθυρο που ρωτά σε ποια εφαρμογή πρέπει να ανοίξουμε τον σύνδεσμό μας και εκεί έχουμε ήδη την εφαρμογή μας Lync στη λίστα - ειλικρινά την καταχωρήσαμε με όλους τους δυνατούς τρόπους. Εκεί στο παράθυρο υπάρχει ένα πλαίσιο ελέγχου "να θυμάστε την επιλογή και να ανοίγετε πάντα συνδέσμους στην εφαρμογή μας", σημειώστε το, κάντε κλικ στο ok. Και αυτή είναι η δεύτερη νίκη - ανοίγει το παράθυρο του συνεδρίου. Ταυτόχρονα, το άνοιγμα συνεδρίων λειτουργεί όχι μόνο όταν κάνετε κλικ σε έναν σύνδεσμο, αλλά και όταν μετακινηθείτε από τη σελίδα συμμετοχής που χρειαζόμαστε στη διάσκεψη.

Μετά έλεγξα, διαγράφοντας παραμέτρους network.protocol-handler.expose.conf δεν επηρέασε σε καμία περίπτωση τη λειτουργία του πρωτοκόλλου στο Fox. Οι σύνδεσμοι συνέχισαν να λειτουργούν.

Συμπέρασμα

Έχω ανεβάσει όλη την εργασία μου στο αποθετήριο GitHub· σύνδεσμοι προς όλους τους πόρους θα υπάρχουν στο τέλος του άρθρου.
Θα με ενδιαφέρει να λαμβάνω σχόλια από όσους θέλουν να χρησιμοποιήσουν τη δουλειά μου. Θα πρέπει αμέσως να σημειώσω ότι έκανα όλη την ανάπτυξη μόνο για το σύστημά μου Linux Mint, επομένως ορισμένες άλλες διανομές ή επιτραπέζιοι υπολογιστές ενδέχεται να μην λειτουργούν σε αυτήν την έκδοση. Ή μάλλον, είμαι σχεδόν σίγουρος γι' αυτό, γιατί επιδιορθώσα μόνο 1 συνάρτηση στο xdg-open που σχετίζεται μόνο με το DE μου. Εάν θέλετε να προσθέσετε υποστήριξη για άλλα συστήματα ή επιτραπέζιους υπολογιστές, γράψτε μου αιτήματα έλξης στο Github.

Ολόκληρο το έργο χρειάστηκε 1 βράδυ για να ολοκληρωθεί.

Βιβλιογραφικές αναφορές:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο