Esempio n. 1
0
 /**
  * @param $serie
  * @Route("/printer/{serie}", name="printer_counter_update")
  * @Method("POST")
  */
 public function printerAction($serie, Request $request)
 {
     $em = $this->getDoctrine()->getManager();
     $logger = $this->get('logger');
     $status = $request->getContent();
     $dados = json_decode($status, true);
     if (empty($dados)) {
         $logger->error("JSON INVÁLIDO!!!!!!!!!!!!!!!!!!! Erro no envio das informações da impressora {$serie}");
         // Retorna erro se o JSON for inválido
         $error_msg = '{
             "message": "JSON Inválido",
             "codigo": 1
         }';
         $response = new JsonResponse();
         $response->setStatusCode('500');
         $response->setContent($error_msg);
         return $response;
     }
     $logger->debug("Atualizando informações para a impressora com IP = {$serie}\n" . $status);
     $printer = $em->getRepository('CocarBundle:Printer')->findOneBy(array('serie' => $serie));
     $ip_addr = $dados['ip_address'];
     if (empty($printer)) {
         $logger->error("COLETA: Impressora não cadastrada: {$serie}. Inserindo....");
         // Insere impressora que não estiver cadastrada
         $printer = new Printer();
         // FIXME: Deve ser retornado pelo Cocar
         $data = new \DateTime();
         $printer->setCommunitySnmpPrinter('public');
         $printer->setHost($ip_addr);
         $printer->setSerie($serie);
         $printer->setDescription('Impressora detectada automaticamente em ' . $data->format('d/m/Y'));
         $printer->setName("Impressora {$serie}");
     }
     $counter = new PrinterCounter();
     // Atualiza impressora sempre que alterar o serial
     $printer->setSerieSimpress(substr($serie, 0, 14));
     if (!empty($dados['model'])) {
         $printer->setName($dados['model']);
     }
     if (!empty($dados['description'])) {
         $printer->setDescription($dados['description']);
     }
     if (!empty($dados['local'])) {
         $printer->setLocal($dados['local']);
     }
     if (!empty($dados['netmask'])) {
         $printer->setNetmask($dados['netmask']);
     }
     // Grava o contador
     $counter->setPrinter($printer);
     $counter->setPrints($dados['counter']);
     $counter->setDate($dados['counter_time']);
     try {
         $em->persist($printer);
         $em->flush();
         $em->persist($counter);
         $em->flush();
     } catch (\Exception $e) {
         // Ainda assim retorna como sucesso
         $logger->error("Entrada repetida para impressora " . $serie . "na data " . $dados['counter_time']);
     }
     $response = new JsonResponse();
     $response->setStatusCode('200');
     return $response;
 }
Esempio n. 2
0
 /**
  * Select printers by offset and limit
  */
 private function selectPrinters($limit, $offset)
 {
     ini_set('memory_limit', '1024M');
     gc_enable();
     $printers = $this->em->createQuery('SELECT p FROM CocarBundle:Printer p ORDER BY p.id')->setMaxResults($limit)->setFirstResult($offset)->getResult();
     //$printers = $this->em->getRepository('CocarBundle:Printer')->findAll();
     echo "Executando coleta de {$limit} impressoras começando no número {$offset}\n";
     $memory_start = memory_get_usage();
     foreach ($printers as $printer) {
         try {
             $community = $printer->getCommunitySnmpPrinter();
             $host = $printer->getHost();
             $this->get('logger')->info("Coletando impressora {$host} | ID " . $printer->getId());
             $arrBundle = $this->get('kernel')->getBundles();
             $rootDir = $arrBundle['CocarBundle']->getPath();
             $script = $rootDir . "/Resources/scripts/timeout3";
             // Primeiro adiciona número de série
             foreach ($this->serial as $serie) {
                 $com = "{$script} snmpwalk -O qv -v 1 -c {$community} {$host} {$serie}";
                 if ($outPut = shell_exec($com)) {
                     // Só preciso do primeiro número de série
                     $printer = $this->em->getRepository('CocarBundle:Printer')->findOneBy(array('serie' => $outPut));
                     if (empty($printer)) {
                         // Se o número de série não existir trata-se de uma nova impressora
                         $data = new \DateTime();
                         $printer = new Printer();
                         $printer->setSerie($outPut);
                         $printer->setCommunitySnmpPrinter('public');
                         $printer->setDescription('Impressora detectada automaticamente em ' . $data->format('d/m/Y'));
                         $printer->setName("Impressora {$serie}");
                     }
                     $printer->setHost($host);
                     $this->em->persist($printer);
                     break;
                 }
             }
             $serie = $printer->getSerie();
             if (empty($serie)) {
                 $this->get('logger')->error("Serial não encontrado para o Host {$host}. Ignorando...");
                 continue;
             }
             $com = "{$script} snmpwalk -O qv -v 1 -c {$community} {$host} 1.3.6.1.2.1.43.10.2.1.4.1.1";
             if ($outPut = shell_exec($com)) {
                 $this->updateCounter($printer, $outPut);
                 #$this->createOrUpdateGraph($printer, $outPut);
             }
         } catch (Exception $e) {
             #return new Response($e->getMessage());
             $this->get('logger')->error("Erro na coleta da impressora {$host} \n" . $e->getMessage());
         }
     }
     echo "{$limit} impressoras lidas iniciando em {$offset} \t -- Memory: " . round((memory_get_usage() - $memory_start) / 1024 / 1024, 2) . " mb\n";
     $this->em->flush();
 }