3.3 DESENVOLVIMENTO DO PLUGIN
3.3.4 Informações adicionais capturadas
• Linha 4 até 11 – Testes realizados com o host informado verificando se ele está comunicável pela rede de computadores. Caso sim retorna exit code 0 caso não, retorna exit code 1.
Figura 22. Imagem inicial do webserver da câmera Axis P1343.
Os módulos utilizados para conexão no webserver da câmera foram HTTP:Request e também LWP::UserAgent.
O arquivo check_http-axis.pl é um arquivo desenvolvido com o objetivo de realizar capturas de informações referentes a configuração de vídeo, audio, data e hora configurados, e firmware utilizado pelo equipamento.
Segue ilustração do código para conexão ao webserver e retorno da variável onde se encontram as informações da conexão. Segue ilustração do código no Quadro 8.
1 2 3 4 5 6 7 8 9 10
sub getres {
$objectStatus = 0;
my ($url, $host, $username, $password) = @_;
$host = $host . ":80";
my $req = HTTP::Request->new(GET => $url);
$req->authorization_basic($username, $password);
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
my $resposta = $ua->request($req);
Quadro 8. Rotina de conexão via http no webserver.
• Linha 3 – Criação de uma variável $objectStatus para retorno no final da execução do plugin ao Nagios.
• Linha 4 – Informações como host, URL, usuário e senha recebidos via parâmetro para utilização.
• Linha 6 – A requisição da conexão HTTP é iniciada.
• Linha 7 – Autenticação no host com usuário e senha.
• Linha 10 – Variável $resposta recebe o resultado da conexão através da função request.
O código desenvolvido nas subrotinas para busca de informação via webserver utiliza a variável $resposta que recebe seu conteúdo da execução da rotina getres, explicada anteriormente. Segue ilustração do código no Quadro 9.
1 2 3
my ($host, $username, $password) = @_;
my $site = "http://".$host."/operator/basic.shtml";
my $resposta = getres($site,$host,$username,$password);
Quadro 9. Código para chamada da rotina de conexão ao webserver.
• Linha 1 – Recebimento das informações via parâmetro.
• Linha 2 – Recebe a URL responsável pelas informações que precisaremos do webserver.
• Linha 3 – Chamada para a subrotina getres com o objetivo de conexão no webserver.
Para que estas informações fossem capturadas foi necessário utilizar o conhecimento em expressões regulares para encontrar a informação necessária.
No código abaixo segue a rotina que foi desenvolvida para a busca de configurações de audio. As informações capturadas são configurações de comunicação de audio e origem de audio. Segue ilustração do código no Quadro 10.
1 2 3 4 5 6 7 8 9 10 11
if ($resposta == 1) { $objectStatus = 1;
exit (objectStatus);
}
elsif ($resposta =~ m/" selected>([a-zA-Z\-\s]*)<\/option>/g) { $audioConfig = $1;
}
if ($resposta =~ m/" selected>([a-zA-Z\-\s]*)<\/option>/g) { $audioSource = $1;
}
printf "[OK] - See detailed status.\n";
Quadro 10. Rotina para busca de informações de audio.
• Linha 1 até 4 – Realização do teste para certificar-se que a conexão foi realizada com sucesso.
• Linha 5 até 7 –Busca pela informação na variável $resposta pelos caracteres desejados da configuração de comunicação de audio, caso encontre armazena na variável
$audioConfig.
• Linha 8 até 10 – Busca pela informação na variável $resposta pelos caracteres desejados de origem de audio, caso encontre armazena na variável $audioSource.
•
• Linha 11 – Impressão de mensagem para verificar os resultados da captura.
O código abaixo tem como objetivo realizar a busca do firmware instalado no dispositivo e mostrar ao operador de redes. Conforme Quadro 11.
1 2 3 4 5 6 7 8 9 10 11 12
if ($resposta == 1) { $objectStatus = 1;
exit ($objectStatus);
}
elsif ($resposta =~ m/<\/b>(.*)<br>/g) { my $var_teste = $1;
$var_teste =~ s/\s//g;
$var_teste =~ s/&.58;/:/g;
$var_teste =~ s/<br>//g;
printf " [OK] - Current firmware: ".$var_teste . "\n";
}
exit ($objectStatus);
Quadro 11. Rotina para busca de informações de firmware.
• Linha 1 até 4 – Realização do teste para certificar-se que a conexão foi realizada com sucesso.
• Linha 5 até 10 – Realização da busca pela informação na variável $resposta pelos caracteres desejados e o tratamento destas informações.
• Linha 12 – O plugin retorna a variável $objectStatus.
O código abaixo se refere à busca de informações de vídeo da câmera. A maneira de encontrar a informação desejada segue a mesma estratégia fazendo a busca por expressão regular recebendo o texto da variável $resposta. As informações desejadas são resolução de vídeo, compressão de vídeo, e rotação de vídeo. Conforme Quadro 12.
1 2 3 4 5 6 7 8 9
elsif ($resposta =~ m/\" selected>(.{13,16})<\/option>/g) { $videoResolution = $1;
}
if ($resposta=~ m/Appearance_Comp\" value=\"([0-9]*)\"onchange/g) { $videoCompression = $1;
}
if ($resposta =~ m/\" selected>([0-9]*)<\/option>/g) { $videoRotation = $1;
}
Quadro 12. Rotina para busca de informações de vídeo.
• Linha 1 até 3 – Realização da busca pela informação na variável $resposta pelos caracteres desejados da resolução de vídeo, caso encontre armazena na variável
$videoResolution.
• Linha 4 até 6 – Realização da busca pela informação na variável $resposta pelos caracteres desejados da compressão de vídeo, caso encontre armazena na variável
$videoCompression.
• Linha 7 até 9 – Realização da busca pela informação na variável $resposta pelos caracteres desejados de rotação de vídeo, caso encontre armazena na variável
$videoRotation.
No código abaixo é mostrado o teste para certificar-se que a informação encontrada pelo plugin é igual à informação de vídeo disponível no webserver.
Segue ilustração conforme o Quadro 13.
1 2 3 4 5 6 7 8 9 10 11 12
if (($videoRotation == 0) || ($videoRotation == 90) ||
($videoRotation == 180) || ($videoRotation == 270)) { printf " Rotation: ".$videoRotation."\n\n";
}else {
$objectStatus = 1;
printf "\n *** Rotation: ".$videoRotation."\n\n";
}
if ($objectStatus == 1) {
printf "[WARNING] - Please make a double check in the information marked with asterisks (***)";
}
Quadro 13. Rotina de testes para confirmar as informações de vídeo.
• Linha 1 até 4 – Realização do teste se o conteúdo da variável $videoRotation é igual a
‘0’ que é um dos valores disponíveis no webserver da câmera. Caso o valor seja igual é impresso na saída principal a mensagem de sucesso, senão a mensagem de saída é modificada e a variável $objectStatus é modificada para ‘1’, marcando o objeto gerenciado como warning no Nagios.
• Linha 9 até 12 – Caso a variável $objectStatus tenha sido modificada para ‘1’ é impresso uma mensagem no final da execução do plugin para verificar se as informações capturadas estão coerentes com o webserver.
Para a rotina que busca informações sobre a data e hora na câmera é utilizado uma estratégia semelhante fazendo a busca de informações via comando m/ e utilizando expressões regulares. Conforme Quadro 14.
1 2 3 4 5 6 7 8 9 10 11
if ($resposta =~ m/CurrentServerDate\" size=\"12\" maxlength=\"10\"
value=\"([0-9-]{10})\"/g) { my $var_teste = $1;
printf "[OK] - See detailed status.\n\n Date: ".$var_teste . "
(AA-mm-dd)\n";
}
if ($resposta =~ m/CurrentServerTime\" size=\"12\" maxlength=\"8\"
value=\"([0-9:]{8})\"/g) { my $var_teste = $1;
printf " Time: ".$var_teste . " (hh:mm:ss)\n";
}
Quadro 14. Rotina de testes para certificar-se a veracidade das informações de vídeo.
• Linha 1 até 6 – Busca pela informação na variável $resposta pelos caracteres desejados da data e impressão do resultado.
• Linha 7 até 10 – Busca pela informação na variável $resposta pelos caracteres desejados da hora e impressão do resultado.
Com esta abordagem de captura de informações via conexão HTTP foi possível buscar informações adicionais para o Nagios através do plugin desenvolvido para a câmera Axis e aumentar sua utilidade.