Hola Habr!
Para mí, esta frase es similar a hola mundo, ya que finalmente llegué a mi primera publicación. Pospuse este maravilloso momento durante mucho tiempo, ya que no había nada sobre lo que escribir, pero tampoco quería chupar lo que ya había sido absorbido en un montón de veces. En general, para mi primera publicación quería algo original, útil para los demás y que contuviera algún tipo de desafío y resolución de problemas. Y ahora puedo compartir esto. Ahora, lo primero es lo primero.
Entrada
Todo comenzó con el hecho de que hace algún tiempo hice rodar Linux Mint en una computadora que funcionaba. Muchos probablemente saben que Pidgin con el complemento Sipe es un reemplazo completamente adecuado para Microsoft Lync (ahora llamado Skype for business) para sistemas Linux. Debido a los detalles específicos del trabajo, a menudo tengo que participar en conferencias de sorbos, y cuando el panadero estaba, la entrada a la conferencia era primaria: recibimos una invitación por correo, haga clic en el enlace de inicio de sesión, estamos listos adentro.
Al cambiar al
lado oscuro de Linux, las cosas se complicaron un poco: hay, por supuesto, una entrada Pidgin a la conferencia, pero para esto debe seleccionar la opción para unirse a la conferencia desde el menú en las propiedades de su cuenta sip e insertar un enlace a la conferencia en la ventana que se abre o ingrese el nombre del organizador y conf id. Y después de un tiempo comencé a pensar: "¿Es posible de alguna manera simplificar esto?" Sí, dices, por qué demonios lo necesitabas, se sentaba en Windows y no se soplaba el bigote.
Paso 1. Investigación
"Qué capricho entrará en la cabeza, no la golpearás", dijo Nekrasov en su trabajo "Quién puede vivir bien en Rusia".
Entonces, dado que el pensamiento golpeó la cabeza, después de algún tiempo surgió la primera idea para su implementación. Todo parecía simple: debe interceptar la llamada a
meet.company.com/user/confid links; coloque el proceso local de la aplicación web en 127.0.0.1 en su carretilla e ingrese la entrada estática para el dominio de la compañía a través del cual / etc / hosts en una conferencia apuntando a localhost. Además, este servidor web debería procesar el enlace que llegó a él y de alguna manera transferirlo a Pidgin (diré de inmediato que en este momento no tenía idea de cómo dárselo). La solución, por supuesto, huele a muletas, pero somos programadores, las muletas no nos asustan.
Luego, por casualidad, de alguna manera abrí un enlace a una invitación a Google Chrome (y generalmente siempre uso Mozilla Firefox). Y para mi sorpresa, la página web se veía completamente diferente: no había un formulario de ingreso de datos del usuario e inmediatamente después de ingresar a la página había una solicitud para abrir algo a través de
xdg-open . Por diversión, hago clic en "sí" y aparece un mensaje de error: el enlace lync15: confjoin? Url = https: //meet.company.com/user/confid no se puede abrir. Hmm ¿Qué tipo de xdg-open es este y qué se necesita para que se abran dichos enlaces?
Una autopsia que leyó la documentación mostró que se trata de un controlador de shell gráfico que ayuda a iniciar aplicaciones asociadas con los protocolos para el esquema uri o ciertos tipos de archivos. Las asociaciones se configuran a través de una asignación de tipo mime. Entonces, vemos que estamos comenzando la búsqueda de una aplicación mapeada para el esquema uri con el nombre
lync15 y el enlace se pasa a xdg-open, que en teoría debería pasarlo a alguna aplicación que sea responsable de este tipo de enlaces. Lo cual, por supuesto, no tenemos en el sistema. Y si no, ¿cómo les va en el mundo del código abierto? Así es, lo escribiremos nosotros mismos.
Una mayor inmersión en el mundo de Linux y especialmente en el estudio de cómo funciona el shell gráfico (entorno de escritorio, DE), por la forma en que lo tengo Xfce en Linux Mint, mostró que las aplicaciones y el tipo mime asociado con él generalmente se escriben directamente en archivos de acceso directo con la extensión .desktop. Bueno, por qué no, creo un acceso directo de aplicación simple, que simplemente debe ejecutar el script bash y generar el argumento pasado a la consola, solo le daré el archivo de acceso directo en sí:
[Desktop Entry] Name=Lync Exec=/usr/local/bin/lync.sh %u Type=Application Terminal=false Categories=Network;InstantMessaging; MimeType=x-scheme-handler/lync15;
Lanzo xdg-open desde la consola con el mismo enlace que viene del navegador y ... bummer. Nuevamente dice que no puede procesar el enlace.
Resultó que no actualicé el directorio del tipo mime asociado con mi aplicación. Esto se hace con un comando simple:
xdg-mime default lync.desktop x-scheme-handler/lync15
que simplemente edita el
archivo ~ / .config / mimeapps.list .
Intento número 2 con llamada xdg-open - y falla nuevamente. Nada, las dificultades no nos asustan, sino que solo alimentan el interés. Y armados con todo el poder de la fiesta (es decir, el rastreo), nos sumergimos de lleno en la depuración. Es importante tener en cuenta aquí que xdg-open es solo un script de shell.
bash -x xdg-open $url
Al analizar la salida después del rastreo, queda un poco claro que el control adicional se transfiere a
exo-open . Y esto ya es un archivo binario y entender por qué devuelve un código de retorno fallido cuando le pasa un enlace en un argumento ya es más difícil.
Después de ejecutar los aspectos internos de xdg-open, descubrí que analiza varios parámetros ambientales y pasa el control a algunas herramientas para abrir archivos / enlaces específicos a un DE particular, o tiene un respaldo en forma de función
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 }
Rápidamente corté un pequeño truco aquí con el análisis del argumento pasado, y si nuestra subcadena específica
lync15 está allí , inmediatamente pasamos el control a la función
open_generic .
Prueba el número 3 y crees que funcionó? Sí, ahora cómo. Pero el mensaje de error ya ha cambiado, esto ya es un progreso; ahora me dijo que no se encontró el archivo y, en forma de archivo, me escribió el enlace que pasó como argumento.
Esta vez resultó ser la función
is_file_url_or_path , que analiza el enlace al archivo: // archivo o la ruta al archivo u otra cosa. Y la verificación no funcionó correctamente debido al hecho de que nuestro prefijo (esquema de URL) tiene números, y la expresión regular solo verifica el conjunto de caracteres que consiste en: alfa: puntos y guiones. Después de consultar el estándar rfc3986 para un
identificador uniforme de recursos, quedó claro que esta vez Microsoft no violó nada (aunque tenía una versión de este tipo). Solo una clase de caracteres: alfa: contiene solo letras del alfabeto latino. Rápidamente cambio el cheque regular a alfanumérico. Listo, eres encantador, todo finalmente se inicia, el control después de todas las verificaciones se da a nuestra aplicación de script, nuestro enlace se muestra en la consola, todo está como debería. Después de eso, empiezo a sospechar que todos los problemas con exo-open también se deben a la validación del formato del enlace debido a los números en el diagrama. Para probar la hipótesis, cambio el registro tipo mime de la aplicación solo al esquema
lync y listo, todo funciona sin redefinir la función open_xfce. Pero esto no nos ayudará de ninguna manera, porque la página web para ingresar a la conferencia crea el enlace con lync15 exactamente.
Entonces, la primera parte del camino se ha completado. Podemos interceptar la llamada de enlace y luego tenemos que procesarla de alguna manera y pasarla dentro de Pidgin. Para comprender cómo funciona internamente al ingresar datos usando el enlace en el menú "unirse a la conferencia", cloné el repositorio del proyecto Sipe y me preparé para sumergirme en el código nuevamente. Pero aquí, afortunadamente, me atrajeron los scripts en el directorio
contrib / dbus / :
- sipe-join-conference-with-uri.pl
- sipe-join-conference-with-organizer-and-id.pl
- sipe-call-phone-number.pl
- Sipehelp.pm
Resulta que el complemento Sipe está disponible para la interacción a través del dbus (bus de escritorio) y dentro de los scripts hay ejemplos directos de unirse a la conferencia por referencia, ya sea a través del nombre y la identificación del organizador, o puede iniciar una llamada a través de sorbo. Esto es exactamente lo que nos faltaba.
Paso 2. Implementar un controlador para la unión automática
Como hay ejemplos listos para la perla, decidí usar
sipe-join-conference-with-uri.pl y modificarlo un poco para mí. Puedo escribir en perla, por lo que esto no causó ninguna dificultad en particular.
Después de probar el script por separado,
ingresé su llamada en el archivo
lync.desktop . ¡Y fue una victoria! Cuando ingresa a la página de unirse a la conferencia y permite el lanzamiento de xdg-open, la ventana emergente de la conferencia desde Pidgin se abrió automáticamente. Cómo me regocijé.
Animado por el éxito, decidí hacer lo mismo con mi navegador principal, Mozilla Firefox. Al ingresar a través del zorro, se abre una página de autorización y en la parte inferior hay un botón de
unión que usa el comunicador de oficina . Ella también atrajo mi atención. Cuando haces clic en él en el navegador, el enlace va a:
conf:sip:{user};gruu;opaque=app:conf:focus:id:{conf-id}%3Frequired-media=audio
a lo que amablemente me dice que no sabe cómo abrirlo y, tal vez, no tengo una aplicación asociada para dicho protocolo. Bueno, ya lo pasamos.
Registrando rápidamente mi aplicación de script también para la configuración del esquema uri y ... no pasa nada. El navegador continúa quejándose de que no hay ninguna aplicación que procese mis enlaces. Al mismo tiempo, una llamada desde la consola xdg-open con parámetros funciona bien.
"Establecer controlador de protocolo personalizado en Firefox" - con esta pregunta me conecté en línea. Después de algunas discusiones sobre stackoverflow (y sin él), parece que se encontró la respuesta. Debe crear un parámetro especial en
about: config (por supuesto, reemplazar foo con conf):
network.protocol-handler.expose.foo = false
Creamos, abrimos el enlace y ... no estaba allí. El navegador, como si nada hubiera pasado, dice que no conoce nuestra aplicación.
Leí la documentación oficial sobre el registro del protocolo con Mozilla, hay una opción para registrar asociaciones en el escritorio de gnome (reemplazando, por supuesto, foo con 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
Me registro, abro el navegador ... y nuevamente la barba.
Aquí una línea de la documentación llama tu atención:
La próxima vez que haga clic en un enlace de protocolo de tipo foo, se le preguntará con qué aplicación abrirlo.
- Semen Semenych
- Ahh
No hacemos clic en el enlace, sino que simplemente la página web cambia la ubicación de la ventana a través de JavaScript. Estoy escribiendo un archivo html simple con un enlace al protocolo conf, ábralo en un navegador, haga clic en el enlace - ¡Yos! Se abre una ventana con una pregunta en qué aplicación necesita abrir nuestro enlace y allí ya tenemos nuestra aplicación Lync en la lista; sinceramente, la registramos de todas las formas posibles. Hay una marca de verificación en la ventana "recuerde la elección y siempre abra los enlaces en nuestra aplicación", tenga en cuenta, haga clic en Aceptar. Y esta es la segunda victoria: se abre la ventana de la conferencia. Al mismo tiempo, la apertura de conferencias ya funciona no solo cuando hace clic en el enlace, sino también cuando cambia de la página deseada para unirse a la conferencia.
Luego verifiqué que eliminar los
parámetros network.protocol-handler.expose.conf no afectaba la operación del protocolo en el zorro de ninguna manera. Los enlaces continuaron funcionando.
Conclusión
Subí todos mis logros al repositorio de github, los enlaces a todos los recursos estarán al final del artículo.
Será interesante para mí recibir comentarios de aquellos que desean utilizar mis mejores prácticas. Debo decir de inmediato que hice todo solo para mi sistema Linux Mint, por lo que algunas otras distribuciones o escritorios pueden no funcionar en esa versión. Más bien, estoy casi seguro de esto, porque parcheé en xdg-open solo 1 función relacionada solo con mi DE. Si desea agregar soporte para otros sistemas o dekstopov, escríbame una solicitud de grupo en github.
La implementación de todo el proyecto tomó 1 noche.
Referencias