/** * @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; }
/** * 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(); }