Rotina de sincronismo de chamados entre ServiceNow e GLPI
|
|
||
|---|---|---|
| config | ||
| src | ||
| .env.development | ||
| .env.example | ||
| .gitignore | ||
| cron.js | ||
| ecosystem.config.js | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
Sistema de Sincronizacao ServiceNow <> GLPI
Middleware em Node.js para sincronizacao bidirecional de tickets, comentarios e status entre ServiceNow e GLPI, com banco intermediario PostgreSQL e acesso direto ao banco MySQL/MariaDB do GLPI.
O que o projeto faz hoje
- Busca incidentes e requisicoes no ServiceNow por watermark (
sync_control). - Salva/atualiza tickets no banco intermediario (
tickets_sn). - Cria tickets no GLPI para registros pendentes (
ticket_sync.glpi_sync_status = 'pending_check'). - Sincroniza comentarios em duas direcoes:
- ServiceNow -> GLPI
- GLPI -> ServiceNow
- Sincroniza status em duas direcoes com controle de origem (
source_last:SNOW/GLPI). - Trata regras de negocio especificas de fechamento/reabertura.
- Reprocessa tickets em estado de erro no inicio de cada ciclo.
- Executa em job agendado (
node-cron) com protecao contra concorrencia local (isCronRunning).
Arquitetura
Componentes
cron.js: agenda e dispara o ciclo de sincronizacao.src/app.js: orquestra o ciclo principal.src/controllers/*: fluxo de tickets, comentarios, status e recuperacao de erro.src/services/*: integracoes com ServiceNow e GLPI.src/models/*: acesso a dados (PostgreSQL e GLPI MySQL).src/data/*: pools de conexao (pgemysql2).src/scripts/python/update_location_mapping.py: atualiza tabelalocation_mappinga partir de CSV.
Bancos envolvidos
- PostgreSQL (
snglpi): estado da integracao. - MySQL/MariaDB (GLPI): criacao/consulta/atualizacao de tickets e followups.
Fluxo do ciclo
Executado em ordem pelo main():
processErrorControllerprocessTicketsControllerprocessCommentsControllerprocessStatusAndClosureController
Regras de negocio importantes
- Controle de precedencia por
source_lastpara reduzir conflito de atualizacao. - Ticket resolvido no GLPI com
solutiontypes_id = 27(fora do escopo):- Nao resolve no SN.
- Adiciona
work_noteno SN. - Marca sincronizacao como encerrada/ignorada.
- Se GLPI resolver e SN estiver em
Em EsperaouAguardando Atendimento, integracao forcaEm Atendimentoantes de resolver no SN. - Comentarios GLPI sao sanitizados (HTML/imagens/metadados) antes de envio ao SN.
- Watermark de coleta no ServiceNow usa margem de seguranca de 6 horas para tras (
newWatermark - 6h).- Motivo: reduzir risco de perda de eventos em casos de atraso de replicacao, diferenca de timezone e clock skew entre sistemas.
- Efeito colateral esperado: releitura de uma janela recente e maior chance de reprocessamento controlado (idempotencia pelo banco local).
Regras de negocio detalhadas
- Controle de origem (
source_last)
SNOWouGLPIdefine quem teve a ultima escrita valida para o ticket.- Evita corrida de atualizacao de status/comentario entre os dois sistemas.
- Status GLPI -> ServiceNow
- Solucao no GLPI dispara tentativa de resolucao no SN.
- Se SN estiver em status bloqueante (
Em EsperaouAguardando Atendimento), a integracao setaEm Atendimentoantes da resolucao. - Regra fora do escopo (
solutiontypes_id = 27) fecha fluxo local sem resolver no SN e registrawork_note.
- Status ServiceNow -> GLPI
- Mudancas de estado no SN sao refletidas no GLPI respeitando o estado final de fechado.
- Fechamento permanente no GLPI bloqueia reabertura automatica por sincronizacao.
- Comentarios GLPI -> SN
- Fluxo com verificacao de existencia local/remota para evitar duplicatas.
- Conteudo passa por sanitizacao para remover HTML, normalizar texto e tratar imagens.
- Comentarios SN -> GLPI
- Comentarios novos detectados no SN sao persistidos no banco intermediario e enviados ao GLPI.
- IDs de origem/destino ficam registrados em
ticket_updatespara rastreabilidade.
- Reprocessamento de erro
- Inicio de cada ciclo tenta resetar estados de erro para recolocar tickets no fluxo automatico.
Pre-requisitos
- Node.js 18+
- NPM
- PostgreSQL
- MySQL/MariaDB com base do GLPI acessivel
- Python 3.10+ (para o mapeador de localidades)
Instalacao
npm install
Dependencias Python
cd src/scripts/python
pip install -r requirements.txt
Configuracao de ambiente
Crie .env.development e .env.production com base em .env.example e inclua tambem as variaveis usadas no codigo:
ServiceNow
SERVICENOW_USERNAMESERVICENOW_PASSWORDSERVICENOW_ASSIGNMENT_GROUPSERVICENOW_TABLE_INCIDENT_URLSERVICENOW_TABLE_REQUEST_URLSERVICENOW_TABLE_JOURNAL_URLSERVICENOW_SC_ITEM_OPTION_URL
GLPI (MySQL/MariaDB)
GLPI_DB_HOSTGLPI_DB_PORTGLPI_DB_USERGLPI_DB_PASSWORDGLPI_DB_NAMEGLPI_DB_CHARSETGLPI_DEFAULT_USER_ID
Banco intermediario (PostgreSQL)
SNGLPI_DB_HOSTSNGLPI_DB_PORTSNGLPI_DB_NAMESNGLPI_DB_USERSNGLPI_DB_PASSWORD
Agendamento e mapeamento
CRON_SCHEDULE(ex.:*/5 * * * *)LOCATION_MAPPING_CSV_PATH(arquivo CSV para mapeamento SN -> GLPI)
Execucao
Desenvolvimento
npm run dev
Producao
npm run start:prod
Execucao com PM2
Subir os dois processos (sync + mapeador):
pm2 start ecosystem.config.js --env production
Comandos uteis:
pm2 list
pm2 logs sn-glpi-sync-cron
pm2 logs sn-glpi-location-mapper
pm2 restart sn-glpi-sync-cron
Script de mapeamento de localidades
Arquivo: src/scripts/python/update_location_mapping.py
- Carrega
NODE_ENVe respectivo.env.*. - Monitora alteracoes recentes no CSV (
LOCATION_MAPPING_CSV_PATH). - Recria os dados da tabela
location_mappingcom base no CSV e IDs validos em ambos os bancos. - Roda em loop continuo (ideal via PM2 como processo separado).
Estrutura do banco intermediario
Definicao base em src/scripts/database/scriptBD.sql:
tickets_snticket_syncticket_updateslocation_mappingsync_control
Limitacoes conhecidas (estado atual)
- Nao ha suite de testes automatizados (
npm teste placeholder). - Ha regras hardcoded que deveriam vir de configuracao (ex.:
resolved_byem fechamento no SN). - Parte do fluxo depende de acesso direto ao banco do GLPI (acoplamento operacional alto).
- Existe logica sensivel de timezone/watermark que merece revisao para evitar reprocesso/perda de evento.
Proximas melhorias recomendadas
- Cobertura de testes (unitario e integracao com mocks de API/DB).
- Externalizar IDs e regras hardcoded para variaveis de ambiente.
- Revisar estrategia de watermark/timezone e idempotencia.
- Criar healthcheck/observabilidade (metricas de ciclo, falhas por etapa, tickets processados).
- Adicionar validacoes de configuracao na inicializacao (falha rapida quando faltar env obrigatoria).
Arquivos principais
cron.jssrc/app.jssrc/controllers/processTicketsController.jssrc/controllers/processCommentsController.jssrc/controllers/processStatusController.jssrc/controllers/processErrorController.jssrc/services/servicenowService.jssrc/services/glpiTicketService.jssrc/services/glpiCommentService.jssrc/scripts/python/update_location_mapping.py