Não sei com o que comparar o provisionamento. Talvez com um gato? Parece possível sem ele, mas com ele um pouco melhor. Especialmente se funcionar))
Declaração do problema:
- Quero configurar os telefones SIP de maneira rápida, simples e segura. Ao instalar o telefone, e mais ainda ao reconfigurá-lo.
- Muitos fornecedores têm seus próprios formatos de configuração, seus utilitários para gerar configurações, suas próprias maneiras de protegê-las. Mas eu realmente não quero lidar com todo mundo.
- Muitas soluções de provisionamento, a) estão focadas em um fornecedor ou em um sistema telefônico, b) são bastante difíceis de implementar, um monte de scripts, parâmetros, br ...
No ponto 3, farei um comentário de que existem excelentes sistemas para FreePBX , FusionPBX , Kazoo , onde existem modelos publicamente disponíveis para telefones de vários fornecedores. Existem soluções comerciais em que também é possível configurar no módulo o desempenho de telefones de diferentes fabricantes, por exemplo, o PABX Yeastar.
No Habré também está cheio de receitas de como configurar dispositivos de vários fornecedores: um , dois . Mas como se costuma dizer, todos os sistemas têm uma falha fatal. Então faça sua bicicleta.
Como se costuma dizer no xkcd, não quero lidar com 14 formatos - pense no dia 15 . Portanto, usamos as configurações gerais de qualquer telefone e fazemos nossa própria configuração no formato json.
Algo assim:
{ "key": "sdgjdeu9443908", "token": "590sfdsf8u984", "model": "gxp1620", "vendor": "grandstream", "mac": "001565113af8", "timezone_offset": "GMT+03", "ntp_server": "pool.ntp.org", "status": true, "accounts": [ { "name": "", "line": 1, "sip_register": "sip.mobilonsip.ru", "sip_name": "sip102", "sip_user": "sip102", "sip_password": "4321", "sip_auth": "sip102" } ] }
Portanto, em qualquer telefone, você precisa configurar a hora local, sip lines. Tudo é simples aqui. Mais exemplos podem ser encontrados aqui .
servidor próprio
Nos manuais do fabricante, geralmente há um ponto em que diz: pegue csv, escreva o endereço-senha-senha-papoila-lá, gere arquivos com o script da empresa, coloque-os no servidor Apache e tudo ficará bem.
O próximo parágrafo do manual geralmente mostra o que mais você pode criptografar no arquivo de configuração gerado.
Mas isso tudo é um clássico. A abordagem moderna com smoothies e twitter diz que você precisa criar um servidor da Web pronto que não seja tão poderoso quanto o Apache, mas fará apenas uma pequena coisa. Forme e forneça configurações por referência.
Aqui paramos e lembramos que quase todos os telefones SIP agora podem receber configurações via http / https, portanto, não consideramos outras implementações (ftp, tftp, ftps). Então, cada telefone conhece seu próprio endereço de papoula. Portanto, criaremos dois links: um pessoal - na chave do dispositivo, o segundo geral, que funciona em um monte de token comum e endereço de papoula.
Além disso, não vou me debruçar sobre configuração zero, ou seja, configurar o telefone a partir do zero, ou seja, Você colocou na rede e ganhou um salto. Não, no meu cenário, você o colocou na rede, fez uma configuração preliminar (configurou-o para receber a configuração do servidor) e depois tomou um pouco de chocolate e reconfigurou o telefone conforme necessário através do serviço. A opção de distribuição 66 é a preocupação do servidor DHCP.
A propósito, sou completamente torturado para dizer "provisionamento", então a palavra foi reduzida para "provisionamento". Não chute, por favor, com os pés.
E mais uma coisa: nosso servidor não tem interface do usuário, ou seja, interface de usuário. Talvez por enquanto, mas não tenho certeza, porque Eu não preciso. Mas existe uma API para salvar / excluir configurações, obter uma lista de fornecedores, modelos suportados, tudo é descrito de acordo com os cânones da especificação do swagger.
Por que uma API, não uma interface do usuário? Porque Já tenho meu próprio sistema telefônico, então, tenho uma fonte de credenciais, onde só preciso coletar esses dados, compor o json necessário e publicá-lo no servidor. E o servidor já está seguro de acordo com as regras especificadas no arquivo json, distribuirá a configuração para o dispositivo necessário ou não se o dispositivo estiver errado ou não atende aos critérios especificados neste json.

Aqui está uma provisão de microsserviço. É chamado sonata , o código fonte está disponível no github, também há uma imagem do docker pronta , um exemplo de uso do docker aqui .
Principais recursos:
em qualquer caso, acesso limitado à configuração no prazo, por padrão 10 minutos. Se você deseja disponibilizar a configuração novamente, publique novamente a configuração.
um formato para todos os fornecedores, todo o ajuste é removido na sonata, você envia json padronizado, configura qualquer equipamento disponível.
todas as configurações emitidas para os dispositivos são registradas, todas as áreas problemáticas podem ser visualizadas no log e ver erros
é possível usar um link comum com token, cada telefone recebe sua própria configuração especificando o endereço mac. Ou um link pessoal na chave.
As APIs para gerenciamento e provisionamento são divididas entre portas
Testes. Foi muito importante para mim corrigir o formato da configuração emitida e cobrir todas as situações habituais de emitir a configuração com testes. Para fazer tudo funcionar claramente.
Contras:
Até agora, a criptografia de sonata não foi usada. I.e. Obviamente, você pode começar a usar https colocando nginx, por exemplo, antes da sonata. Mas aqui estão os métodos proprietários ainda não envolvidos. Porque O projeto ainda é jovem, quase derrubou seus primeiros cem dispositivos. E, é claro, coleciono idéias, feedback. Além disso, para tornar tudo seguro para que as configurações não possam ser detectadas na rede, provavelmente vale a pena se preocupar com chaves de criptografia, tls e um ouriço com elas, mas isso será uma continuação.
Falta de interface do usuário. Talvez esse seja um sinal negativo significativo para o usuário final, mas para o administrador do sistema, o utilitário do console é mais importante do que um aplicativo completo. Havia planos de criar um utilitário de console, mas não tinha certeza se é necessário?
Qual é o resultado?
Servidor web pequeno e simples para provisionar vários modelos de telefone com API para gerenciamento.
Mais uma vez, como isso deve funcionar?
- Instale a sonata.
- Formamos o json-config e o publicamos na sonata.
- Em seguida, obtemos um link da sonata para provisionamento.
- Em seguida, indicamos esse link no aparelho telefônico.
- O dispositivo aperta a configuração
existem apenas duas etapas na operação subseqüente:
- Formamos uma configuração json e publicamos em sonata
- O dispositivo aperta a configuração
Que tipo de telefone é carregado?
Fornecedores Grandstream, Fanvil, Yealink. As configurações no fornecedor são mais ou menos iguais, mas podem diferir dependendo do firmware - pode ser necessário testar adicionalmente.
Quais regras podem ser definidas?
Pelo tempo. Você pode especificar o tempo até o qual a configuração estará disponível.
Pelo endereço MAC. Quando você envia a configuração através do link pessoal do dispositivo, o endereço mac também será verificado.
Por ip. Por endereço IP, de onde a solicitação foi feita.
Como interagir com sonata?
Por meio da API, fazendo solicitações http. A API estará disponível em sua instalação. Porque Como a API suporta a especificação swagger, você pode usar o utilitário online para solicitações de teste para a API.
Ok, ótimo. Coisa legal, como tentar?
A maneira mais fácil é implantar uma imagem de janela de encaixe com base no repositório de amostras de sonata . O repositório contém instruções de instalação.
E se eu souber node.js?
Se você tiver experiência com JavaScript, poderá descobrir rapidamente como tudo funciona aqui.
A sonata se desenvolverá?
Eu parcialmente alcancei meus objetivos. Desenvolvimento adicional é uma questão de minhas tarefas no tópico de automação das configurações do telefone. Ainda há a oportunidade de expandir as configurações para personalizar os botões do telefone, adicionar os recursos do catálogo de endereços, talvez algo mais, escrever nos comentários.
Resumo e agradecimentos
Ficarei feliz em sugestões / objeções / comentários e perguntas construtivas, como pode muito bem ser algo incompreensivelmente descrito.
Agradeço também a todos os colegas que ajudaram, aconselharam, testaram, forneceram / doaram telefones para testes. Na verdade, muitas pessoas com quem conversei no trabalho, em salas de bate-papo e e-mails, estavam envolvidas no projeto em uma extensão diferente. Obrigado pelas idéias e pensamentos.