From e197367840a0cbe30b0d7f17f2ff294064b77018 Mon Sep 17 00:00:00 2001 From: Eduardo Santos Date: Wed, 16 Apr 2014 15:48:45 -0300 Subject: [PATCH] Refatoração das coletas para aumentar a eficiência. --- app/config/config.yml | 5 ++++- app/config/config_dev.yml | 5 +++-- app/config/config_prod.yml | 3 +++ composer.lock | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------- src/Cacic/WSBundle/Controller/ColetaController.php | 500 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- src/Cacic/WSBundle/Helper/OldCacicHelper.php | 10 ++++++++++ src/Cacic/WSBundle/Resources/views/Coleta/alteracaoMail.txt.twig | 18 ++++++++++++++++++ 7 files changed, 395 insertions(+), 292 deletions(-) create mode 100644 src/Cacic/WSBundle/Resources/views/Coleta/alteracaoMail.txt.twig diff --git a/app/config/config.yml b/app/config/config.yml index 46ea0f1..5faead9 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -116,7 +116,10 @@ swiftmailer: host: "%mailer_host%" username: "%mailer_user%" password: "%mailer_password%" - spool: { type: memory } + spool: + type: file + path: "%kernel.root_dir%/spool" + # KNP Paginator Configuration knp_paginator: diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml index 8dbf07b..250ae05 100644 --- a/app/config/config_dev.yml +++ b/app/config/config_dev.yml @@ -22,5 +22,6 @@ monolog: assetic: use_controller: true -#swiftmailer: -# delivery_address: me@example.com +swiftmailer: + delivery_address: www-data@localhost + sender_address: cacic@localhost diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml index 2e1e72b..060f76a 100644 --- a/app/config/config_prod.yml +++ b/app/config/config_prod.yml @@ -18,3 +18,6 @@ monolog: type: stream path: "%kernel.logs_dir%/%kernel.environment%.log" level: warning + +swiftmailer: + sender_address: www-data@localhost \ No newline at end of file diff --git a/composer.lock b/composer.lock index a50b144..7fb915d 100644 --- a/composer.lock +++ b/composer.lock @@ -219,8 +219,7 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" + "homepage": "http://www.jwage.com/" }, { "name": "Guilherme Blanco", @@ -434,8 +433,7 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" + "homepage": "http://www.jwage.com/" }, { "name": "Guilherme Blanco", @@ -530,12 +528,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "2a37b007dda8e21bdbb8fa445be8fa0064199e13" + "reference": "2.3.4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/2a37b007dda8e21bdbb8fa445be8fa0064199e13", - "reference": "2a37b007dda8e21bdbb8fa445be8fa0064199e13", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/2.3.4", + "reference": "2.3.4", "shasum": "" }, "require": { @@ -561,8 +559,7 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" + "homepage": "http://www.jwage.com/" }, { "name": "Guilherme Blanco", @@ -595,25 +592,25 @@ "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "765b0d87fcc3e839c74817b7211258cbef3a4fb9" + "reference": "v1.2.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/765b0d87fcc3e839c74817b7211258cbef3a4fb9", - "reference": "765b0d87fcc3e839c74817b7211258cbef3a4fb9", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/v1.2.0", + "reference": "v1.2.0", "shasum": "" }, "require": { "doctrine/dbal": ">=2.2,<2.5-dev", - "jdorn/sql-formatter": "~1.1", + "jdorn/sql-formatter": ">=1.1,<2.0", "php": ">=5.3.2", - "symfony/doctrine-bridge": "~2.2", - "symfony/framework-bundle": "~2.2" + "symfony/doctrine-bridge": ">=2.2,<3.0", + "symfony/framework-bundle": ">=2.2,<3.0" }, "require-dev": { "doctrine/orm": ">=2.2,<2.5-dev", - "symfony/validator": "~2.2", - "symfony/yaml": "~2.2" + "symfony/validator": ">=2.2,<3.0", + "symfony/yaml": ">=2.2,<3.0" }, "suggest": { "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", @@ -749,8 +746,7 @@ { "name": "Jonathan Wage", "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" + "homepage": "http://www.jwage.com/" }, { "name": "Guilherme Blanco", @@ -766,7 +762,7 @@ "email": "kontakt@beberlei.de" }, { - "name": "Johannes Schmitt", + "name": "Johannes M. Schmitt", "email": "schmittjoh@gmail.com", "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" @@ -1285,13 +1281,13 @@ "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/cg-library.git", - "reference": "ce8ef43dd6bfe6ce54e5e9844ab71be2343bf2fc" + "url": "git://github.com/schmittjoh/cg-library.git", + "reference": "1.0.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/cg-library/zipball/ce8ef43dd6bfe6ce54e5e9844ab71be2343bf2fc", - "reference": "ce8ef43dd6bfe6ce54e5e9844ab71be2343bf2fc", + "url": "https://github.com/schmittjoh/cg-library/zipball/1.0.0", + "reference": "1.0.0", "shasum": "" }, "require": { @@ -1319,7 +1315,7 @@ "keywords": [ "code generation" ], - "time": "2012-01-02 20:40:52" + "time": "2012-01-02 12:40:52" }, { "name": "jms/di-extra-bundle", @@ -1328,20 +1324,20 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/JMSDiExtraBundle.git", - "reference": "7fffdb6c96fb922a131af06d773e1e6c5301d070" + "reference": "1.4.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/7fffdb6c96fb922a131af06d773e1e6c5301d070", - "reference": "7fffdb6c96fb922a131af06d773e1e6c5301d070", + "url": "https://api.github.com/repos/schmittjoh/JMSDiExtraBundle/zipball/1.4.0", + "reference": "1.4.0", "shasum": "" }, "require": { "jms/aop-bundle": ">=1.0.0,<1.2-dev", "jms/metadata": "1.*", - "symfony/finder": "~2.1", - "symfony/framework-bundle": "~2.1", - "symfony/process": "~2.1" + "symfony/finder": ">=2.1,<3.0", + "symfony/framework-bundle": ">=2.1,<3.0", + "symfony/process": ">=2.1,<3.0" }, "require-dev": { "doctrine/doctrine-bundle": "*", @@ -1425,7 +1421,7 @@ ], "authors": [ { - "name": "Johannes M. Schmitt", + "name": "Johannes Schmitt", "email": "schmittjoh@gmail.com", "homepage": "http://jmsyst.com", "role": "Developer of wrapped JMSSerializerBundle" @@ -1445,13 +1441,13 @@ "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/schmittjoh/parser-lib.git", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d" + "url": "git://github.com/schmittjoh/parser-lib", + "reference": "1.0.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d", - "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d", + "url": "https://github.com/schmittjoh/parser-lib/archive/1.0.0.zip", + "reference": "1.0.0", "shasum": "" }, "require": { @@ -1482,20 +1478,20 @@ "source": { "type": "git", "url": "https://github.com/schmittjoh/JMSSecurityExtraBundle.git", - "reference": "f5f6c6df69ceae8b709e57b49fcc2a42d9280bcc" + "reference": "1.5.1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/JMSSecurityExtraBundle/zipball/f5f6c6df69ceae8b709e57b49fcc2a42d9280bcc", - "reference": "f5f6c6df69ceae8b709e57b49fcc2a42d9280bcc", + "url": "https://api.github.com/repos/schmittjoh/JMSSecurityExtraBundle/zipball/1.5.1", + "reference": "1.5.1", "shasum": "" }, "require": { - "jms/aop-bundle": "~1.0", - "jms/di-extra-bundle": "~1.3", - "jms/metadata": "~1.0", - "jms/parser-lib": "~1.0", - "symfony/framework-bundle": "~2.1", + "jms/aop-bundle": ">=1.0,<2.0", + "jms/di-extra-bundle": ">=1.3,<2.0", + "jms/metadata": ">=1.0,<2.0", + "jms/parser-lib": ">=1.0,<2.0", + "symfony/framework-bundle": ">=2.1,<3.0", "symfony/security-bundle": "*" }, "require-dev": { @@ -2055,17 +2051,17 @@ "source": { "type": "git", "url": "https://github.com/kriswallsmith/assetic.git", - "reference": "a826e4b96f5c607ff47ef61caf3826b2b1e840ec" + "reference": "v1.1.1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/a826e4b96f5c607ff47ef61caf3826b2b1e840ec", - "reference": "a826e4b96f5c607ff47ef61caf3826b2b1e840ec", + "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/v1.1.1", + "reference": "v1.1.1", "shasum": "" }, "require": { "php": ">=5.3.1", - "symfony/process": "~2.1" + "symfony/process": ">=2.1,<3.0" }, "require-dev": { "cssmin/cssmin": "*", @@ -2075,9 +2071,9 @@ "leafo/scssphp": "*", "leafo/scssphp-compass": "*", "mrclay/minify": "*", - "phpunit/phpunit": "~3.7", + "phpunit/phpunit": ">=3.7,<4.0", "ptachoire/cssembed": "*", - "twig/twig": "~1.6" + "twig/twig": ">=1.6,<2.0" }, "suggest": { "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", @@ -2422,13 +2418,13 @@ "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" + "url": "https://github.com/php-fig/log", + "reference": "1.0.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", - "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", + "url": "https://github.com/php-fig/log/archive/1.0.0.zip", + "reference": "1.0.0", "shasum": "" }, "type": "library", @@ -2654,27 +2650,27 @@ "source": { "type": "git", "url": "https://github.com/symfony/AsseticBundle.git", - "reference": "146dd3cb46b302bd471560471c6aaa930483dac1" + "reference": "v2.3.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/146dd3cb46b302bd471560471c6aaa930483dac1", - "reference": "146dd3cb46b302bd471560471c6aaa930483dac1", + "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/v2.3.0", + "reference": "v2.3.0", "shasum": "" }, "require": { - "kriswallsmith/assetic": "~1.1", + "kriswallsmith/assetic": ">=1.1,<2.0", "php": ">=5.3.0", - "symfony/framework-bundle": "~2.1" + "symfony/framework-bundle": ">=2.1,<3.0" }, "require-dev": { - "symfony/class-loader": "~2.1", - "symfony/console": "~2.1", - "symfony/css-selector": "~2.1", - "symfony/dom-crawler": "~2.1", - "symfony/form": "~2.1", - "symfony/twig-bundle": "~2.1", - "symfony/yaml": "~2.1" + "symfony/class-loader": ">=2.1,<3.0", + "symfony/console": ">=2.1,<3.0", + "symfony/css-selector": ">=2.1,<3.0", + "symfony/dom-crawler": ">=2.1,<3.0", + "symfony/form": ">=2.1,<3.0", + "symfony/twig-bundle": ">=2.1,<3.0", + "symfony/yaml": ">=2.1,<3.0" }, "suggest": { "symfony/twig-bundle": "~2.1" @@ -2817,23 +2813,23 @@ "source": { "type": "git", "url": "https://github.com/symfony/MonologBundle.git", - "reference": "03ed73bc11367b3156cc21f22ac37c7f70fcd10a" + "reference": "v2.3.0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/03ed73bc11367b3156cc21f22ac37c7f70fcd10a", - "reference": "03ed73bc11367b3156cc21f22ac37c7f70fcd10a", + "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/v2.3.0", + "reference": "v2.3.0", "shasum": "" }, "require": { - "monolog/monolog": "~1.3", + "monolog/monolog": ">=1.3,<2.0", "php": ">=5.3.2", - "symfony/config": "~2.2-beta2", - "symfony/dependency-injection": "~2.2-beta2", - "symfony/monolog-bridge": "~2.2-beta2" + "symfony/config": ">=2.2-beta2,<3.0", + "symfony/dependency-injection": ">=2.2-beta2,<3.0", + "symfony/monolog-bridge": ">=2.2-beta2,<3.0" }, "require-dev": { - "symfony/yaml": "~2.2-beta2" + "symfony/yaml": ">=2.2-beta2,<3.0" }, "type": "symfony-bundle", "extra": { @@ -3164,7 +3160,7 @@ "role": "Lead Developer" }, { - "name": "Armin Ronacher", + "name": "Armin Ronacher2", "email": "armin.ronacher@active-4.com", "role": "Project Founder" }, diff --git a/src/Cacic/WSBundle/Controller/ColetaController.php b/src/Cacic/WSBundle/Controller/ColetaController.php index cb1d2fd..d5036d7 100644 --- a/src/Cacic/WSBundle/Controller/ColetaController.php +++ b/src/Cacic/WSBundle/Controller/ColetaController.php @@ -49,6 +49,9 @@ class ColetaController extends Controller //$strComputerSystem = OldCacicHelper::deCrypt( $request, $request->get('ComputerSystem') ); //$strOperatingSystem = OldCacicHelper::deCrypt( $request, $request->request->get('OperatingSystem') ); $data = new \DateTime('NOW'); + $data_inicio = $data->format('d/m/Y H:i:s'); + $data = microtime(); + $logger->debug("%%% Início da operação de coleta: $data_inicio %%%"); $te_node_adress = TagValueHelper::getValueFromTags( 'MACAddress', $strNetworkAdapterConfiguration ); $te_so = $request->get( 'te_so' ); @@ -58,60 +61,38 @@ class ColetaController extends Controller //vefifica se existe SO coletado se não, insere novo SO $so = $this->getDoctrine()->getRepository('CacicCommonBundle:So')->findOneBy( array('teSo'=>$te_so) ); $computador = $this->getDoctrine()->getRepository('CacicCommonBundle:Computador')->findOneBy( array('idSo'=>$so, 'teNodeAddress'=>$te_node_adress) ); - $rede = $this->getDoctrine()->getRepository('CacicCommonBundle:Rede')->getDadosRedePreColeta( $request ); + $netmask = TagValueHelper::getValueFromTags( 'IPSubnet', $strNetworkAdapterConfiguration ); + $ip_computador = $request->get('te_ip_computador'); + $rede = $this->getDoctrine()->getRepository('CacicCommonBundle:Rede')->getDadosRedePreColeta( $ip_computador, $netmask ); //$local = $this->getDoctrine()->getRepository('CacicCommonBundle:Local')->findOneBy(array( 'idLocal' => $rede->getIdLocal() )); $strCollectType = OldCacicHelper::deCrypt($request, $request->get('CollectType')); // Defino os dois arrays que conterão as configurações para Coletas, Classes e Propriedades $arrClassesNames = array(); - $arrCollectsDefClasses[$strCollectType] = array(); $detalhesClasses = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->listaDetalhesClasseAcoes($strCollectType); + $output = $this->arrayClasses($detalhesClasses, $arrClassesNames); - foreach ($detalhesClasses as $detalhe) - { - // Adiciona classe no Array de classes que estão no banco - if (!in_array($detalhe['nmClassName'], $arrClassesNames)) { - array_push($arrClassesNames, $detalhe['nmClassName']); - } - // Primeiro cria array com as informações das propriedades - $property = array( - 'idClassProperty' => $detalhe['idClassProperty'], - 'nmFunctionPreDb' => $detalhe['nmFunctionPreDb'] - ); - - - $nmPropertyName = $detalhe['nmPropertyName']; - $logger->debug("Adicionando propriedade $nmPropertyName no array de propriedades"); - // Aqui o array já existe. Só substituo pelo novo valor - $arrCollectsDefClasses[$strCollectType][$detalhe['nmClassName']][$detalhe['nmPropertyName']] = $property; + if ($output) { + $arrCollectsDefClasses[$strCollectType] = &$output[0]; + $arrClassesNames = $output[1]; + } else { + $arrCollectsDefClasses[$strCollectType] = array(); } //$teste = print_r($arrCollectsDefClasses, true); //$teste = print_r($arrClassesNames, true); - //error_log("22222222222222222222222222222222222222222222222222222222222222 $teste"); + //$logger->debug("22222222222222222222222222222222222222222222222222222222222222 $teste"); if ($arrCollectsDefClasses[$strCollectType]) { - // Obtenho configuração para notificação de alterações - //$resConfigsLocais = $this->getDoctrine()->getRepository('CacicCommonBundle:ConfiguracaoLocal')->listarNotificacaoPropertyLocal($rede->getIdLocal(), 'te_notificar_mudancas_properties'); - //$resConfigsLocaisEmail = $this->getDoctrine()->getRepository('CacicCommonBundle:ConfiguracaoLocal')->listarNotificacaoEmailLocal($rede->getIdLocal()); - - //$arrClassesAndProperties = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->listaPorPropertyNotificacao( $resConfigsLocais->getVlConfiguracao() ) ; - - //foreach ($arrClassesAndProperties as $arrClassesAndProperty) - // $arrClassesPropertiesToNotificate[$arrClassesAndProperty['nmClassName'] . '.' . $arrClassesAndProperty['nmPropertyName']] = $arrClassesAndProperty['tePropertyDescription']; - - $strInsertedItems_Text = ''; - $strDeletedItems_Text = ''; - $strUpdatedItems_Text = ''; - //error_log("00000000000000000000000000000000000000000000000000000000: $strCollectType"); foreach( $request->request->all() as $strClassName => $strClassValues) { //$teste = OldCacicHelper::deCrypt($request, $strClassValues); //$logger->debug("444444444444444444444444444444444444444444444444444444444: $strClassName | \n $teste"); + //$logger->debug("444444444444444444444444444444444444444444444444444444444: $strClassName"); //error_log("444444444444444444444444444444444444444444444444444444: $strClassName"); @@ -124,192 +105,15 @@ class ColetaController extends Controller // A propriedade da coleta de software é multi valorada. Preciso tratar diferente if ($strClassName == "SoftwareList") { - // Primeiro preciso pegar todas as tags que forem software - $arrSoftware = TagValueHelper::getSoftwareTags($strNewClassValues); - - // Agora insere cada registro de software individualmente - foreach ($arrSoftware as $software) { - // Armazeno todas as propriedades dessa classe enviadas pela requisição - $arrTags = TagValueHelper::getTagsFromValues($software); - - // Crio um array multidimensional com as tags e os valores - foreach ($arrTags as $tagNames) { - // Essa função garante que só serão retornados caracteres com UTF8 Válido - $texto = TagValueHelper::UTF8Sanitize(TagValueHelper::getValueFromTags($tagNames, $software)); - $arrTagsNames[$tagNames] = $texto; - } - - // Para software, cada identificador será uma propriedade - $softwareName = $arrTagsNames['IDSoftware']; - - // Remove o IDSoftware do array - unset($arrTagsNames['IDSoftware']); - - // Armazeno o IDSoftware como Propriedade - $idClassProperty = $arrCollectsDefClasses[$strCollectType][$strClassName][$softwareName]['idClassProperty']; - - // Se o IDSoftware não existir, cria - if (empty($idClassProperty)) { - $logger->debug("Software $softwareName não encontrado. Adicionando um novo software"); - // Pega o Id da classe - $idClass = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->findOneBy( array('nmClassName'=>$strClassName) ); - - $property = new ClassProperty(); - $property->setNmPropertyName($softwareName); - $property->setTePropertyDescription($arrTagsNames['DisplayName']); - - // Referência à classe - $property->setIdClass($idClass); - - // Grava a propriedade nova - $this->getDoctrine()->getManager()->persist($property); - $this->getDoctrine()->getManager()->flush(); - - // Retorna o novo ID - $idClassProperty = $property->getIdClassProperty(); - } - - // Chama função que grava a propriedade - $this->gerColsSetProperty('IDSoftware', $software, $idClassProperty, $computador); - - // Agora gravo todas as propriedades para o software na tabela propriedade_software - $propriedadeSoftware = $this->getDoctrine()->getRepository('CacicCommonBundle:PropriedadeSoftware')->findOneBy( array('classProperty'=> $idClassProperty, 'computador' => $computador) ); - $classPropertyObject = $this->getDoctrine()->getRepository('CacicCommonBundle:ClassProperty')->findOneBy( array( 'idClassProperty'=> $idClassProperty ) ); - - if (empty($propriedadeSoftware)) { - - // Se não tiver nome coloco o ID Software no nome - if (empty($arrTagsNames['DisplayName'])) { - $nmSoftware = $softwareName; - } else { - $nmSoftware = $arrTagsNames['DisplayName']; - } - - - $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->findOneBy( array( 'nmSoftware' => $nmSoftware ) ); - if (empty($softwareObject)) { - $softwareObject = new Software(); - // Grava software recém inserido - $this->getDoctrine()->getManager()->persist($softwareObject); - $this->getDoctrine()->getManager()->flush(); - } - - // Depois adiciono as propriedades - $propriedadeSoftware = new PropriedadeSoftware(); - - $propriedadeSoftware->setClassProperty($classPropertyObject); - $propriedadeSoftware->setComputador($computador); - - // Ajusta valores coletados - $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); - $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); - $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); - $propriedadeSoftware->setSoftware($softwareObject); - - // Grava no banco de dados - $this->getDoctrine()->getManager()->persist($propriedadeSoftware); - $this->getDoctrine()->getManager()->flush(); - } else { - // Adiciona referência à tabela de softwares - $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->find( $propriedadeSoftware->getSoftware()->getIdSoftware() ); - - // Se não tiver nome coloco o ID Software no nome - if (empty($arrTagsNames['DisplayName'])) { - $softwareObject->setNmSoftware($softwareName); - } else { - $softwareObject->setNmSoftware($arrTagsNames['DisplayName']); - } - - // Grava software recém inserido - $this->getDoctrine()->getManager()->persist($softwareObject); - //$this->getDoctrine()->getManager()->flush(); - - // Ajusta valores coletados - $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); - $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); - $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); - $propriedadeSoftware->setSoftware($softwareObject); - - // Salva valor da coleta - $this->getDoctrine()->getManager()->persist($propriedadeSoftware); - $this->getDoctrine()->getManager()->flush(); - } - - } + $this->coletaSoftware($strNewClassValues, $arrCollectsDefClasses, $strCollectType, $strClassName, $computador); } elseif (!empty($strNewClassValues)) { - // Armazeno todas as propriedades dessa classe enviadas pela requisição - $arrTagsNames = TagValueHelper::getTagsFromValues($strNewClassValues); - - // Agora gravo todas as propriedades dessa classe na tabela de computadores - foreach ($arrTagsNames as $classPropertyName) { - $logger->debug("Processando a proriedade WMI $classPropertyName para a classe $strClassName"); - // Pega classe - $idClass = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->findOneBy( array('nmClassName'=>$strClassName) ); - - // Caso a propriedade ainda não esteja cadastrada no banco, crio na hora - if (array_key_exists($classPropertyName, $arrCollectsDefClasses[$strCollectType][$strClassName])) { - // Somente armazeno o valor que já existe - $idClassProperty = $arrCollectsDefClasses[$strCollectType][$strClassName][$classPropertyName]['idClassProperty']; - $logger->debug("Propriedade encontrada: $classPropertyName id_class_property = $idClassProperty. Apenas atualizar"); - } else { - // Se não existir cria a propriedade - $logger->info("Criando propriedade $classPropertyName para a classe $strClassName"); - - $classPropertyObject = new ClassProperty(); - $classPropertyObject->setIdClass($idClass); - $classPropertyObject->setNmPropertyName($classPropertyName); - $classPropertyObject->setTePropertyDescription('On the fly created Property'); - - $this->getDoctrine()->getManager()->persist($classPropertyObject); - $this->getDoctrine()->getManager()->flush(); - - // Finalmente adiciono no array de classes e propriedades - $idClassProperty = $classPropertyObject->getIdClassProperty(); - $property = array( - 'idClassProperty' => $idClassProperty, - 'nmFunctionPreDb' => null - ); - $arrCollectsDefClasses[$strCollectType][$className][$classPropertyName] = $property; - } - //error_log("888888888888888888888888888888888888888888888: $strClassName | $idClassProperty | $classPropertyName"); - - // Chama função que grava a propriedade - $this->gerColsSetProperty($classPropertyName, $strNewClassValues, $idClassProperty, $computador); - } + + $this->coletaGeral($strNewClassValues, $arrCollectsDefClasses, $strCollectType, $strClassName, $computador); + } } } - - // Caso a string acima não esteja vazia, monto o email para notificação - // FIXME: Detectar alteração de dispositivos de hardware e notificar o Administrador - if ($strDeletedItems_Text || $strInsertedItems_Text || $strUpdatedItems_Text ) - { - if ($strDeletedItems_Text) - $strDeletedItems_Text = chr(13) . 'Itens Removidos:' . chr(13) . $strDeletedItems_Text . chr(13); - - if ($strInsertedItems_Text) - $strInsertedItems_Text = chr(13) . 'Itens Inseridos:' . chr(13) . $strInsertedItems_Text . chr(13); - - if ($strUpdatedItems_Text) - $strUpdatedItems_Text = chr(13) . 'Itens Alterados:' . chr(13) . $strUpdatedItems_Text . chr(13); - - - $strCorpoMail = ''; - $strCorpoMail .= " Prezado Administrador,\n\n"; - $strCorpoMail .= " uma alteração foi identificada no computador cujos detalhes encontram-se abaixo discriminados:\n\n"; - $strCorpoMail .= " Nome do Host: ". $computador->getNmComputador() ."\n"; - $strCorpoMail .= " Endereço IP....: ".$computador->getTeIpComputador() . "\n"; - $strCorpoMail .= " Local...............: ". $rede['nmLocal']."\n"; - $strCorpoMail .= " Rede................: ". $rede['nmRede'] . ' (' . $rede['teIpRede'] .")\n\n"; - $strCorpoMail .= $strDeletedItems_Text . $strInsertedItems_Text . $strUpdatedItems_Text; - $strCorpoMail .= "\n\nPara visualizar mais informações sobre esse computador, acesse o endereço\nhttp://"; - $strCorpoMail .= CACIC_PATH . '/relatorios/computador/computador.php?id_computador=' . $computador->getIdComputador(); - $strCorpoMail .= "\n\n\n________________________________________________\n"; - $strCorpoMail .= "CACIC - e" . date('d/m/Y H:i') . "h \n"; -// Manda mail para os administradores. - //TODO mail($resConfigsLocais['te_notificar_mudancas_emails'], "[Sistema CACIC] Alteração Detectada - " . $arrCollectsDefClasses[$strCollectType], "$strCorpoMail", "From: cacic@{$_SERVER['SERVER_NAME']}"); - } } $teste_object = $this->gravaTESTES($grava_teste."\nFinal"); $em = $this->getDoctrine()->getManager(); @@ -319,6 +123,11 @@ class ColetaController extends Controller $em->flush(); //$this->getDoctrine()->getManager()->flush(); //persistencia dos dados no BD + $data_fim = new \DateTime('NOW'); + $tempo = (microtime() - $data); + $data_fim = $data_fim->format('d/m/Y H:i:s'); + $logger->debug("%%% Final da operação de coleta: $data_fim. Tempo de execução da coleta: $tempo %%%"); + $response = new Response(); $response->headers->set('Content-Type', 'xml'); $cacic_helper = new OldCacicHelper( $this->get('kernel') ); @@ -409,6 +218,7 @@ class ColetaController extends Controller } else { //error_log("444444444444444444444444444444444444444444444444: Criando histórico"); // Caso exista, registro um histórico e atualiza o valor atual + $coletaOld = "Classe WMI: ".$computadorColeta->getClassProperty()->getIdClass()->getNmClassName()." | "."Propriedade: ".$computadorColeta->getClassProperty()->getNmPropertyName()." | Valor: ".$computadorColeta->getTeClassPropertyValue(); $computadorColeta->setComputador( $computador ); // Pega o objeto para gravar $classPropertyObject = $this->getDoctrine()->getRepository('CacicCommonBundle:ClassProperty')->findOneBy( array( 'idClassProperty'=> $idClassProperty ) ); @@ -434,6 +244,10 @@ class ColetaController extends Controller // Commit $this->getDoctrine()->getManager()->flush(); + + // Notifica alteração + $coletaNew = "Classe WMI: ".$computadorColeta->getClassProperty()->getIdClass()->getNmClassName()." | "."Propriedade: ".$computadorColeta->getClassProperty()->getNmPropertyName()." | Valor: ".$computadorColeta->getTeClassPropertyValue(); + //$this->notificaAlteracao($coletaOld, $coletaNew, $computador); } } @@ -677,5 +491,263 @@ class ColetaController extends Controller } + /** + * Cria array de classes e propriedades para coletar + * + * @param $detalhesClasses + * @return array + */ + + public function arrayClasses($detalhesClasses, $arrClassesNames) { + $logger = $this->get('logger'); + $output = array(); + + foreach ($detalhesClasses as $detalhe) + { + // Adiciona classe no Array de classes que estão no banco + if (!in_array($detalhe['nmClassName'], $arrClassesNames)) { + array_push($arrClassesNames, $detalhe['nmClassName']); + } + // Primeiro cria array com as informações das propriedades + $property = array( + 'idClassProperty' => $detalhe['idClassProperty'], + 'nmFunctionPreDb' => $detalhe['nmFunctionPreDb'] + ); + + + $nmPropertyName = $detalhe['nmPropertyName']; + $logger->debug("Adicionando propriedade $nmPropertyName no array de propriedades"); + // Aqui o array já existe. Só substituo pelo novo valor + $output[0][$detalhe['nmClassName']][$detalhe['nmPropertyName']] = $property; + } + $output[1] = $arrClassesNames; + + return $output; + } + + /** + * Processa parâmetros da coleta de software + * + * @param $strNewClassValues + * @param $arrCollectsDefClasses + * @param $strCollectType + * @param $strClassName + */ + + public function coletaSoftware($strNewClassValues, $arrCollectsDefClasses, $strCollectType, $strClassName, $computador) { + $logger = $this->get('logger'); + + // Primeiro preciso pegar todas as tags que forem software + $arrSoftware = TagValueHelper::getSoftwareTags($strNewClassValues); + + // Agora insere cada registro de software individualmente + foreach ($arrSoftware as $software) { + // Armazeno todas as propriedades dessa classe enviadas pela requisição + $arrTags = TagValueHelper::getTagsFromValues($software); + + // Crio um array multidimensional com as tags e os valores + foreach ($arrTags as $tagNames) { + // Essa função garante que só serão retornados caracteres com UTF8 Válido + $texto = TagValueHelper::UTF8Sanitize(TagValueHelper::getValueFromTags($tagNames, $software)); + $arrTagsNames[$tagNames] = $texto; + } + + // Para software, cada identificador será uma propriedade + $softwareName = $arrTagsNames['IDSoftware']; + + // Remove o IDSoftware do array + unset($arrTagsNames['IDSoftware']); + + // Armazeno o IDSoftware como Propriedade + $idClassProperty = $arrCollectsDefClasses[$strCollectType][$strClassName][$softwareName]['idClassProperty']; + + // Se o IDSoftware não existir, cria + if (empty($idClassProperty)) { + $logger->debug("Software $softwareName não encontrado. Adicionando um novo software"); + // Pega o Id da classe + $idClass = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->findOneBy( array('nmClassName'=>$strClassName) ); + + $property = new ClassProperty(); + $property->setNmPropertyName($softwareName); + $property->setTePropertyDescription($arrTagsNames['DisplayName']); + + // Referência à classe + $property->setIdClass($idClass); + + // Grava a propriedade nova + $this->getDoctrine()->getManager()->persist($property); + $this->getDoctrine()->getManager()->flush(); + + // Retorna o novo ID + $idClassProperty = $property->getIdClassProperty(); + } + + // Chama função que grava a propriedade + $this->gerColsSetProperty('IDSoftware', $software, $idClassProperty, $computador); + + // Agora gravo todas as propriedades para o software na tabela propriedade_software + $propriedadeSoftware = $this->getDoctrine()->getRepository('CacicCommonBundle:PropriedadeSoftware')->findOneBy( array('classProperty'=> $idClassProperty, 'computador' => $computador) ); + $classPropertyObject = $this->getDoctrine()->getRepository('CacicCommonBundle:ClassProperty')->findOneBy( array( 'idClassProperty'=> $idClassProperty ) ); + + if (empty($propriedadeSoftware)) { + + // Se não tiver nome coloco o ID Software no nome + if (empty($arrTagsNames['DisplayName'])) { + $nmSoftware = $softwareName; + } else { + $nmSoftware = $arrTagsNames['DisplayName']; + } + + + $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->findOneBy( array( 'nmSoftware' => $nmSoftware ) ); + if (empty($softwareObject)) { + $softwareObject = new Software(); + // Grava software recém inserido + $this->getDoctrine()->getManager()->persist($softwareObject); + $this->getDoctrine()->getManager()->flush(); + } + + // Depois adiciono as propriedades + $propriedadeSoftware = new PropriedadeSoftware(); + + $propriedadeSoftware->setClassProperty($classPropertyObject); + $propriedadeSoftware->setComputador($computador); + + // Ajusta valores coletados + $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); + $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); + $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); + $propriedadeSoftware->setSoftware($softwareObject); + + // Grava no banco de dados + $this->getDoctrine()->getManager()->persist($propriedadeSoftware); + $this->getDoctrine()->getManager()->flush(); + } else { + // Adiciona referência à tabela de softwares + $softwareObject = $this->getDoctrine()->getRepository('CacicCommonBundle:Software')->find( $propriedadeSoftware->getSoftware()->getIdSoftware() ); + + // Se não tiver nome coloco o ID Software no nome + if (empty($arrTagsNames['DisplayName'])) { + $softwareObject->setNmSoftware($softwareName); + } else { + $softwareObject->setNmSoftware($arrTagsNames['DisplayName']); + } + + // Grava software recém inserido + $this->getDoctrine()->getManager()->persist($softwareObject); + //$this->getDoctrine()->getManager()->flush(); + + // Ajusta valores coletados + $propriedadeSoftware->setDisplayName($arrTagsNames['DisplayName']); + $propriedadeSoftware->setDisplayVersion($arrTagsNames['DisplayVersion']); + $propriedadeSoftware->setURLInfoAbout($arrTagsNames['URLInfoAbout']); + $propriedadeSoftware->setSoftware($softwareObject); + + // Salva valor da coleta + $this->getDoctrine()->getManager()->persist($propriedadeSoftware); + $this->getDoctrine()->getManager()->flush(); + } + + } + } + + /** + * Processa informações de coleta + * + * @param $strNewClassValues + * @param $arrCollectsDefClasses + * @param $strCollectType + * @param $strClassName + * @param $computador + */ + + public function coletaGeral($strNewClassValues, $arrCollectsDefClasses, $strCollectType, $strClassName, $computador) { + $logger = $this->get('logger'); + $logger->debug("Processando classe WMI: $strClassName"); + + // Armazeno todas as propriedades dessa classe enviadas pela requisição + $arrTagsNames = TagValueHelper::getTagsFromValues($strNewClassValues); + + // Agora gravo todas as propriedades dessa classe na tabela de computadores + foreach ($arrTagsNames as $classPropertyName) { + $logger->debug("Processando a proriedade WMI $classPropertyName para a classe $strClassName"); + // Pega classe + $idClass = $this->getDoctrine()->getRepository('CacicCommonBundle:Classe')->findOneBy( array('nmClassName'=>$strClassName) ); + + // Caso a propriedade ainda não esteja cadastrada no banco, crio na hora + if (array_key_exists($classPropertyName, $arrCollectsDefClasses[$strCollectType][$strClassName])) { + // Somente armazeno o valor que já existe + $idClassProperty = $arrCollectsDefClasses[$strCollectType][$strClassName][$classPropertyName]['idClassProperty']; + $logger->debug("Propriedade encontrada: $classPropertyName id_class_property = $idClassProperty. Apenas atualizar"); + } else { + // Se não existir cria a propriedade + $logger->info("Criando propriedade $classPropertyName para a classe $strClassName"); + + $classPropertyObject = new ClassProperty(); + $classPropertyObject->setIdClass($idClass); + $classPropertyObject->setNmPropertyName($classPropertyName); + $classPropertyObject->setTePropertyDescription('On the fly created Property'); + + $this->getDoctrine()->getManager()->persist($classPropertyObject); + $this->getDoctrine()->getManager()->flush(); + + // Finalmente adiciono no array de classes e propriedades + $idClassProperty = $classPropertyObject->getIdClassProperty(); + $property = array( + 'idClassProperty' => $idClassProperty, + 'nmFunctionPreDb' => null + ); + + $arrCollectsDefClasses[$strCollectType][$strClassName][$classPropertyName] = $property; + } + //error_log("888888888888888888888888888888888888888888888: $strClassName | $idClassProperty | $classPropertyName"); + + // Chama função que grava a propriedade + $this->gerColsSetProperty($classPropertyName, $strNewClassValues, $idClassProperty, $computador); + } + } + + /** + * Envia notificação de alteração para o administrador do sistema + * + * @param $coletaOld + * @param $coletaNew + * @param $computador + */ + + public function notificaAlteracao($coletaOld, $coletaNew, $computador) { + $configuracoes = $this->getDoctrine()->getRepository('CacicCommonBundle:ConfiguracaoLocal')->findBy( array('idLocal' => $computador->getIdRede()->getIdLocal()) ); + $emailNotificacao = $this->container->getParameter('swiftmailer.sender_address'); + $organizacao = 'Administradores Cacic'; + + foreach ($configuracoes as $detalhe) { + if ($detalhe->getIdConfiguracao() == 'te_notificar_mudanca_hardware') { + $emailNotificacao = $detalhe->getVlConfiguracao(); + } + + if ($detalhe->getIdConfiguracao() == 'nm_organizacao') { + $organizacao = $detalhe->getVlConfiguracao(); + } + } + + + $message = \Swift_Message::newInstance() + ->setSubject("Notificação de alteração de configurações: $organizacao") + ->setFrom($this->container->getParameter('swiftmailer.sender_address')) + ->setTo($emailNotificacao) + ->setBody( + $this->renderView( + 'CacicWSBundle:Coleta:alteracaoMail.txt.twig', + array( + 'coletaOld' => $coletaOld, + 'coletaNew' => $coletaNew, + 'computador' => $computador + ) + ) + ) + ; + + $this->get('mailer')->send($message); + } } diff --git a/src/Cacic/WSBundle/Helper/OldCacicHelper.php b/src/Cacic/WSBundle/Helper/OldCacicHelper.php index bade1cd..be27ee9 100644 --- a/src/Cacic/WSBundle/Helper/OldCacicHelper.php +++ b/src/Cacic/WSBundle/Helper/OldCacicHelper.php @@ -230,4 +230,14 @@ class OldCacicHelper return $intPos; } + public static function udate($format = 'u', $utimestamp = null) { + if (is_null($utimestamp)) + $utimestamp = microtime(true); + + $timestamp = floor($utimestamp); + $milliseconds = round(($utimestamp - $timestamp) * 1000000); + + return date(preg_replace('`(?