Conectando-se automaticamente a uma conferência do Lync no Linux

Olá Habr!

Para mim, esta frase é semelhante ao hello world, desde que finalmente cheguei à minha primeira publicação. Adiei esse momento maravilhoso por um longo tempo, já que não havia nada para escrever, mas também não queria sugar o que já havia sido sugado várias vezes. Em geral, na minha primeira publicação, eu queria algo original, útil para os outros e contendo algum tipo de desafio e solução de problemas. E agora eu posso compartilhar isso. Agora, as primeiras coisas primeiro.

Entrada


Tudo começou com o fato de que, há algum tempo, eu me instalei no Linux Mint em um computador em funcionamento. Muitos provavelmente sabem que o Pidgin com o plug-in Sipe é um substituto completamente adequado para o Microsoft Lync (agora chamado Skype for business) para sistemas Linux. Devido às especificidades do trabalho, muitas vezes tenho que participar de conferências sip, e quando o padeiro entrou, a entrada para a conferência era elementar: recebemos um convite por correio, clique no link de login, estamos prontos para entrar.

Ao mudar para o lado sombrio do Linux, as coisas ficaram um pouco complicadas: existe, é claro, uma entrada do Pidgin na conferência, mas para isso você precisa selecionar a opção de ingressar na conferência no menu nas propriedades da sua conta sip e inserir um link para a conferência na janela que abre ou digite o nome do organizador e conf id. Depois de algum tempo, comecei a pensar: "É possível simplificar isso de alguma forma?" Sim, você diz, por que diabos você precisava, ficava no Windows e não soprava no bigode.

Etapa 1. Pesquisa


"Que capricho - vai dar errado - você não vai derrotá-la" - disse Nekrasov em seu trabalho "Quem pode viver bem na Rússia".

Assim, desde que o pensamento atingiu a cabeça, depois de algum tempo, a primeira idéia surgiu para a implementação. Tudo parecia simples - você precisa interceptar a chamada para meet.company.com/user/confid links - coloque o processo local do aplicativo Web em 127.0.0.1 no seu carrinho de mão e insira a entrada estática do domínio da empresa através do qual / etc / hosts em uma conferência apontando para localhost. Além disso, esse servidor da Web deve processar o link fornecido e, de alguma forma, transferi-lo para o Pidgin (direi imediatamente que, nesta fase, não tinha idéia de como fornecer a ele). A solução, claro, cheira a muletas, mas somos programadores, muletas não nos assustam (uma escova).

Então, por acaso, de alguma forma, abri um link para um convite para o Google Chrome (e geralmente eu sempre uso o Mozilla Firefox). E para minha surpresa, a página da Web parecia completamente diferente - não havia formulário de entrada de dados do usuário e, imediatamente após entrar na página, houve uma solicitação para abrir algo através do xdg-open . Por diversão, clico em "sim" e uma mensagem de erro aparece - o link lync15: confjoin? Url = https: //meet.company.com/user/confid não pode ser aberto. Hmm Que tipo de xdg-open é esse e o que é necessário para que esses links sejam abertos? Uma autópsia que lê a documentação mostrou que é um manipulador de shell gráfico que ajuda a iniciar aplicativos associados aos protocolos para o esquema uri ou a certos tipos de arquivos. As associações são configuradas por meio de um mapeamento do tipo MIME. Portanto, vemos que estamos iniciando a pesquisa de um aplicativo mapeado para o esquema de uri com o nome lync15 e o link é passado para o xdg-open, que em teoria deve passá-lo para algum aplicativo responsável por esse tipo de link. O que, é claro, não temos no sistema. E se não, como eles se saem no mundo do código aberto? É isso mesmo, vamos escrever nós mesmos.

Uma imersão adicional no mundo Linux e, especialmente, no estudo de como o shell gráfico (ambiente de desktop, DE) funciona, pelo modo como o Xfce no Linux Mint, mostrou que os aplicativos e o tipo mime associado a ele geralmente são escritos diretamente em arquivos de atalho com a extensão .desktop. Bem, por que não, eu crio um atalho de aplicativo simples, que deve simplesmente executar o script bash e gerar o argumento passado para ele no console, apenas fornecerei o arquivo de atalho:

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

Eu inicio o xdg-open a partir do console com o mesmo link que vem do navegador e ... chatice. Mais uma vez, ele diz que não pode processar o link.

Como se viu, não atualizei o diretório do tipo MIME associado ao meu aplicativo. Isso é feito com um comando simples:

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

que simplesmente edita o arquivo ~ / .config / mimeapps.list .

Tentativa número 2 com chamada xdg-open - e falha novamente. Nada, as dificuldades não nos assustam, mas apenas alimentam o interesse. E armados com todo o poder do bash (ou seja, rastreamento), mergulhamos de cabeça na depuração. É importante notar aqui que o xdg-open é apenas um script de shell.

 bash -x xdg-open $url 

Analisando a saída após o rastreamento, fica um pouco claro que mais controle é transferido para o exo-aberto . E esse já é um arquivo binário e entender por que ele retorna um código de retorno malsucedido ao passar um link para ele em um argumento já é mais difícil.

Tendo percorrido os interiores do xdg-open, descobri que ele analisa vários parâmetros ambientais e passa o controle para algumas ferramentas para abrir arquivos / links específicos para um DE em particular ou tem um fallback na forma da função 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 } 

Eu rapidamente cortei um pequeno hack aqui com a análise do argumento passado, e se nosso substring específico lync15 estiver lá , passamos imediatamente o controle para a função open_generic .

Tente o número 3 e você acha que funcionou? Sim, agora como. Mas a mensagem de erro já foi alterada, isso já está em andamento - agora ele me disse que o arquivo não foi encontrado e, na forma de um arquivo, me escreveu o próprio link passado como argumento.

Dessa vez, acabou sendo a função is_file_url_or_path , que analisa o link para o arquivo file: // ou o caminho para o arquivo ou qualquer outra coisa. E a verificação não funcionou corretamente devido ao fato de que nosso prefixo (esquema de url) possui números e a expressão regular é verificada apenas para um conjunto de caracteres que consiste em: alpha: pontos e traços. Após consultar o padrão rfc3986 para um identificador uniforme de recursos, ficou claro que desta vez a Microsoft não violou nada (embora eu tivesse essa versão). Apenas uma classe de caracteres: alfa: contém apenas letras do alfabeto latino. Eu mudo rapidamente a verificação regular para alfanumérica. Pronto, você está encantado, tudo finalmente inicia, controle após todas as verificações serem feitas em nosso aplicativo de script, nosso link é exibido no console, tudo está como deveria. Depois disso, começo a suspeitar que todos os problemas com o exo-open também se devam à validação do formato do link devido aos números no diagrama. Para testar a hipótese, altero o registro do tipo mime do aplicativo para apenas o esquema lync e voila - tudo funciona sem redefinir a função open_xfce. Mas isso não nos ajudará de forma alguma, porque a página da Web para entrar na conferência cria exatamente o link com o lync15.

Portanto, a primeira parte do caminho foi concluída. Podemos interceptar a chamada de link e, em seguida, precisamos processá-la e passá-la para dentro do Pidgin. Para entender como funciona internamente ao inserir dados por meio de um link no menu "ingressar na conferência", clonei o repositório do projeto Sipe e preparei-me para mergulhar no código novamente. Mas aqui, felizmente, fui atraído pelos scripts no diretório contrib / dbus / :

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

Acontece que o plug-in Sipe está disponível para interação por meio do dbus (desktop bus) e, dentro dos scripts, existem exemplos diretos de participação na conferência por meio de um link, através do nome do organizador e do conf-id, ou você pode iniciar uma chamada por sip. Isso é exatamente o que nos faltava.

Etapa 2. Implementando um manipulador para a associação automática


Como existem exemplos prontos para a pérola, decidi usar sipe-join-conference-with-uri.pl e modificá-la um pouco para mim. Eu posso escrever em pérola, então isso não causou nenhuma dificuldade em particular.

Após testar o script separadamente, digitei sua chamada no arquivo lync.desktop . E foi uma vitória! Quando você entra na página de ingresso na conferência e permite o lançamento do xdg-open, a janela pop-up da conferência do Pidgin é aberta automaticamente. Como eu me alegrei.
Encorajado pelo sucesso, decidi fazer o mesmo pelo meu navegador principal, o Mozilla Firefox. Ao entrar pela fox, uma página de autorização é aberta e, na parte inferior, há um botão de associação usando o Office Communicator . Ela também atraiu minha atenção. Quando você clica no navegador, o link vai para:

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

ao qual ele gentilmente me diz que não sabe como abri-lo e, talvez, não possua um aplicativo associado a esse protocolo. Bem, nós já passamos por isso.

Registrando rapidamente meu aplicativo de script também para o esquema de uri conf e ... nada acontece. O navegador continua reclamando que não há aplicativo que processe meus links. Ao mesmo tempo, uma chamada do console xdg-open com parâmetros funciona bem.

“Definir manipulador de protocolo personalizado no firefox” - com esta pergunta, entrei online. Após algumas discussões sobre o stackoverflow (e onde sem ele), parece que a resposta foi encontrada. Você precisa criar um parâmetro especial em about: config (é claro, substituindo foo por conf):

 network.protocol-handler.expose.foo = false 

Criamos, abrimos o link e ... ele não estava lá. O navegador, como se nada tivesse acontecido, diz que não conhece nosso aplicativo.

Eu li a documentação oficial sobre o registro do protocolo no Mozilla, existe uma opção para registrar associações no próprio desktop gnome (substituindo, é claro, foo por 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 

Eu me registro, abro o navegador ... e novamente a barba.

Aqui uma linha da documentação chama sua atenção:
Da próxima vez que você clicar em um link do tipo protocolo, será perguntado com qual aplicativo abri-lo.

- Sêmen Semenych
- Ahh

Nós não clicamos no link, mas simplesmente a página da Web muda a janela. O local é alterado por javascript. Estou escrevendo um arquivo html simples com um link para o protocolo conf, abra-o em um navegador, clique no link - Yos! Uma janela é aberta com uma pergunta em qual aplicativo você precisa abrir nosso link e já temos nosso aplicativo Lync na lista - nós o registramos honestamente de todas as maneiras possíveis. Há uma marca de seleção na janela "lembre-se da escolha e sempre abra os links em nosso aplicativo", observe, clique em ok. E esta é a segunda vitória - a janela da conferência se abre. Ao mesmo tempo, a abertura de conferências já funciona não apenas quando você clica no link, mas também ao alternar da página desejada para ingressar na conferência.

Depois, verifiquei que a exclusão dos parâmetros network.protocol-handler.expose.conf não afetou a operação do protocolo no fox de forma alguma. Os links continuaram funcionando.

Conclusão


Carreguei todas as minhas conquistas no repositório do github; os links para todos os recursos estarão no final do artigo.
Será interessante para mim receber feedback daqueles que desejam usar minhas melhores práticas. Devo dizer imediatamente que fiz tudo apenas para o meu sistema Linux Mint, portanto, outras distribuições ou desktops podem não funcionar nessa versão. Em vez disso, tenho quase certeza disso, porque eu corrigi a função xdg-open only 1 relacionada apenas ao meu DE. Se você deseja adicionar suporte para outros sistemas ou dekstopov, escreva-me uma solicitação de pool no github.

A implementação de todo o projeto levou 1 noite.

Referências:

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


All Articles