Automatizando relatórios GLPI usando PHP e Shell Script

Qualquer administrador de GLPI já passou certa dificuldade com relação aos relatórios da ferramenta. Este artigo mostrará uma forma de gerar e enviar relatórios automaticamente para seus clientes, ou simplesmente, para agilizar sua rotina de trabalho.

[ Hits: 9.628 ]

Por: Lucas Roberto Daldegan em 23/05/2017 | Blog: http://lucasroberto.com


Introdução



Quem nunca teve que dar uma "corridinha" pra arrumar o relatório semanal de chamados para algum cliente ou supervisor? Talvez, esse não seja o contexto da sua empresa, mas algumas se preocupam e controlam fortemente o fluxo de chamados.

Onde trabalho, temos a necessidade por contrato de envio de um relatório semanal de chamados para o cliente. Isso nos auxilia, por exemplo, saber quanto estamos recebendo de lucro por atendimento presencial ou remoto. Bom, sem mais delongas, vamos ao que interessa!

Diante da necessidade de enviar os relatórios semanalmente para o cliente, um amigo de trabalho - Fernando - solicitou que eu disponibilizasse um backup do banco de dados para que ele pudesse desenvolver uma query, a fim de me ajudar. Com a query em mãos, consegui realizar a consulta no banco e exportar isso pra um arquivo, no entanto, os dados vieram "sujos", com tags HTML. Foi então que outro amigo - Guilherme - se disponibilizou na confecção de um arquivo PHP que realizasse a limpeza dos dados e isso adiantou horas de trabalho.

Antes de colocarmos a mão na massa, partimos do princípio de que o GLPI já está instalado e funcionando. Você pode encontrar facilmente um how-to a cerca da instalação da ferramenta em uma pesquisa rápida na internet, mas caso encontre problemas, estou à disposição para ajudar.

O ambiente onde testei e realizei a configuração, foi este:
  • OS: Ubuntu 12 Server
  • Banco de dados: MySQL
  • Versão do PHP instalado: PHP 5
  • Versão do GLPI: GLPI 90
  • Ferramentas para envio de e-mail: Postfix / Sendemail

Configuração

Vamos lá, primeiro, precisamos realizar a query no banco de dados. Usando o parâmetro "-e", podemos inserir os comandos desejados direto no shell, informando os dados necessários para o login no MySQL. Então, usando somente a linha de comando:

# mysql -u user -pPASSWD -e "USE glpi; SELECT id AS ID_do_Chamado,name AS Titulo_do_Chamado,solution AS solucao,date AS Data_de_Abertura_do_Chamado,solvedate AS Data_da_Solucao, sec_to_time(solve_delay_stat) AS tempo_de_resolucao_do_chamado FROM glpi_tickets WHERE entities_id =0 AND DATE BETWEEN '2017-03-01 08:00:00' AND '2017-03-31 18:00:00' INTO OUTFILE '/tmp/teste.csv';"

Onde:
  • mysql -u user -pPASSWD :: informação para login no programa; user (usuário), PASSWD (senha do usuário).
  • -e :: opção para enviar comandos logo após o login.

Os demais termos entre parênteses são os comandos e parâmetros passados ao MySQL. Em outras palavras, é a nossa query.

Obs.: utilizaremos o comando assim, pois iremos acioná-lo via shell script.

Ao final dos parâmetros, utilizei a opção "INTO OUTFILE '/tmp/teste.csv"". Com isso, a consulta será registrada em um único arquivo, ao invés de imprimir os dados na tela. É importante notar que caso o diretório alvo não exista (/tmp), ou caso o arquivo alvo já exista ("testee.csv"), o MySQL não concluirá o comando, pois não subscreve os dados.

A parte mais complicada é esta. Com os dados em mão (ou no arquivo), basta criar um ".sh" e agendá-lo para realizar a consulta e enviar um e-mail com o relatório gerado. Não desista! Estamos quase lá! Eu criei o meu script, assim:

#!/bin/bash
#Variavel que traz a data correspondente a uma semana atrás (data inicial) com formatação

onewa="'"$(date --date "1 week ago" +%Y-%m-%d)

#Variável que me diz qual é  dia atual (data final) com formatação

today="'"$(date +%Y-%m-%d)

#Comando para gerar relatório

mysql -u user -pPASSWD -e "USE glpi; SELECT id AS ID_do_Chamado,name AS Titulo_do_Chamado,solution AS solucao,date AS Data_de_Abertura_do_Chamado,solvedate AS Data_da_Solucao, sec_to_time(solve_delay_stat) AS tempo_de_resolucao_do_chamado FROM glpi_tickets WHERE entities_id =0 AND DATE BETWEEN $onewa 08:00:00' AND $today 18:00:00' INTO OUTFILE '/tmp/relatoriosemanal.csv';"

#Comando para envio de e-mail (a mensagem foi escrita em html puro)

sendemail -f noreply@empresa -u "Chamados da ultima semana" -m "Segue anexo contendo os dados dos chamados da última semana.<br />Caso necessário, entre em contato conosco atravéz do e-mail suporte@empresa.com.br ou por telefone no número 041 3333-3333 -o message-content-type=html -o message-charset="UTF-8" -a /tmp/relatoriosemanal.csv -t destinatario@dominio

exit 0
#Fim do script

Isso deve bastar para o nosso objetivo, no entanto, caso o seu relatório contenha "sujeira" vinda da base de dados, podemos usar a segunda possível solução usando PHP descrita abaixo.

Usando o PHP

Se você está lendo isso, significa que teve o mesmo problema que eu, quanto à "sujeira" nos dados retornados do banco. Mas sem problemas, os próximos passos devem ajudar!

Tendo em vista a mesma query vista anteriormente, desenvolvi um script um pouco diferente, que aciona um arquivo PHP feito por mim que, por sua vez, chama o arquivo PHP desenvolvido pelo Guilherme (mencionado acima) O script ficou assim:

#!/bin/bash
#Variaveis que serao enviadas ao PHP

#Data inicial
onewa=$(date --date "1 week ago" +%Y-%m-%d)

#Data final
today=$(date +%Y-%m-%d)

#Variavel que define o nome final do csv que sera gerado (pelo PHP) e enviado
arquivocsv=Chamados_$(date --date "1 week ago" +%d%m%y)-$(date +%d%m%y).csv

#Arquivo com as variaveis em PHP
echo -e "<php""\n"'$ent="0";'"\n"'$datai='"'$onewa'"''";""\n"'$dataf='"'$today'"''";""\n"'require("reports.php")'";""\n"'?>' > gr.php

#Execucao do "gerador de relatorio"
php gr.php > $arquivocsv

#Envio do relatorio por email
sendemail -f noreply@empresa -u "Chamados da ultima semana" -m "Segue anexo contendo os dados dos chamados da última semana.<br />Caso necessário, entre em contato conosco atravéz do e-mail suporte@empresa.com.br ou por telefone no número 041 3333-3333 -o message-content-type=html -o message-charset="UTF-8" -a $(find . -name "Chamdos_*.csv") -t destinatario@dominio

Algumas observações:
  • As variáveis "$datai" e "$dataf" são variáveis que serão usadas no PHP. Elas contêm o mesmo conteúdo das variáveis "$today" e "$onewa", usadas no Shell script.
  • O arquivo "gr.php" chama o arquivo "reports.php" fornecendo a ele as variáveis de inicio e fim do relatório.

Ok, dito isso, um exemplo do "gr.php" ficaria assim:

<?php
$ent="0";
$datai='2017-04-20';
$dataf='2017-04-27';
require("reports.php");
?>

Obs.: a variável "$ent" se refere à entidade da qual vamos gerar os relatórios. Se for a entidade "root", geralmente a matriz, seu valor deverá ser 0. Isso tudo foi levantado mediante análise do banco de dados.

Por fim, o arquivo desenvolvido pelo Guilherme tratando os dados coletador, ficou dessa forma:

<?php
$servername = "localhost";
$username = "dbuser";
$password = "dbpassword";

try {
    $conn = new PDO("mysql:host=$servername;dbname=glpi", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$sql = "SELECT id, name, solution, date, solvedate, sec_to_time(solve_delay_stat) as sec FROM glpi_tickets WHERE entities_id =$ent AND date BETWEEN '$datai 08:00:00' AND '$dataf 18:00:00'";
	$now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");

    // force download
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");

    // disposition / encoding on response body
    header("Content-Disposition: attachment;filename=csv.csv");
    header("Content-Transfer-Encoding: binary");

	ob_start();
	$df = fopen("php://output", 'w');

	$array = $conn->query($sql);

	fwrite($df, 'Id_do_chamado;Titulo_do_chamado;Solucao;Data_de_abertura_do_chamado;Data_da_solucao;tempo_de_resolucao_do_chamado');
	fwrite($df, "\n");

    foreach ($array as $row) {
		fwrite($df, $row['id'].';');
		fwrite($df, $row['name'].';');
		$solution = html_entity_decode($row['solution']);
		$solution = strip_tags ( $solution );
		$solution = str_replace("\r\n",' ', $solution);
		fwrite($df, $solution.';');
		fwrite($df, $row['date'].';');
		fwrite($df, $row['solvedate'].';');
		fwrite($df, $row['sec']);
		fwrite($df, "\n");
    }

	fclose($df);

	echo ob_get_clean();
} catch(PDOException $e){
	echo "Connection failed: " . $e->getMessage();
}
?>

Ao executarmos o script mencionado acima, o relatório deverá ser gerado contendo as datas de período em seu nome. Vale lembrar que ele só funcionará com os softwares instalados e desde que o arquivo "reports.php" esteja no mesmo diretório que o script.

Feito isto, você pode agendar a execução do script via Crontab, editando o arquivo /etc/crontab ou usando crontab -e, para editar o arquivo Crontab referente ao seu usuário. Lembrando que os parâmetros do Contrab, funcionam da seguinte forma:

#m h  dom mon dow  user command

Ou seja → #minuto hora dia_do_mês mês dia_da_semana usuario comando

Sendo que o dia da semana deve ser informado em números, onde 0 e 7 corresponde a domingo. Esta informação está disponível em:
Por exemplo, agendando para toda sexta-feira, às 18:00 hs:

00 18 * * 5 root /var/www/glpi/reports/relatorio.sh

Espero que, com esses dados, o seu dia a dia possa ser melhor aproveitado e que essas alterações sejam somente o início de um melhor aproveitamento da ferramenta.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Apache - Compartilhamento de Recursos - VirtualHosts

PROXMOX Overview - Virtualização Leve e Eficiente

Leitura recomendada

Systemimager - O sistema de imagens do Linux

Mono - Por que usá-lo?

Funtoo Current - Instalação completa

Usando o Kommander para criar GUIs

Criando um pacote DEB manualmente

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts