From c987c66d148a692c20191fb8b0b7a881d513c60b Mon Sep 17 00:00:00 2001 From: Eduardo Santos Date: Sun, 19 Oct 2014 23:37:17 -0200 Subject: [PATCH] Nova operação de atualização de subredes --- src/Cacic/CommonBundle/Controller/RedeController.php | 328 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/Cacic/CommonBundle/Resources/config/routing.yml | 6 +++++- src/Cacic/CommonBundle/Resources/views/Rede/manutencaoNeo.html.twig | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 527 insertions(+), 2 deletions(-) create mode 100644 src/Cacic/CommonBundle/Resources/views/Rede/manutencaoNeo.html.twig diff --git a/src/Cacic/CommonBundle/Controller/RedeController.php b/src/Cacic/CommonBundle/Controller/RedeController.php index e8f076b..bdea698 100644 --- a/src/Cacic/CommonBundle/Controller/RedeController.php +++ b/src/Cacic/CommonBundle/Controller/RedeController.php @@ -13,6 +13,7 @@ use Cacic\WSBundle\Helper; use Cacic\CommonBundle\Helper as CacicHelper; use Ijanki\Bundle\FtpBundle\Exception\FtpException; use Symfony\Component\Validator\Constraints\Null; +use Symfony\Component\Finder\Finder; /** * @@ -490,6 +491,8 @@ class RedeController extends Controller $em->persist($redeVersaoModulo); $em->flush(); + } else { + $logger->error("Erro no envio do módulo via FTP \n".$arrResult[1]); } //echo $_GET['pIntIdRede'] . '_=_' . $_GET['pStrNmItem'] . '_=_' . $strResult; @@ -540,7 +543,7 @@ class RedeController extends Controller $logger->debug("Enviando módulo $pStrFullItemName para o servidor $pStrTeServer na pasta $pStrTePathServer"); - $conn = $ftp->connect($pStrTeServer); + $conn = $ftp->connect($pStrTeServer, $pStrNuPortaServer); // Retorno esperado....: 230 => FTP_USER_LOGGED_IN // Retorno NÃO esperado: 530 => FTP_USER_NOT_LOGGED_IN @@ -669,4 +672,327 @@ class RedeController extends Controller ) ); } + + /** + * Função nova para atualização das subredes + * + * @param Request $request + * @return Response + */ + public function manutencaoNeoAction(Request $request) + { + $logger = $this->get('logger'); + + // Primeiro carrega lista dos módulos + $modulos = $this->modulosNeoArray($request); + + + if ( $request->isMethod('POST') ) + { + if ( count( $request->get('subrede') ) ) + { + $retorno = true; + foreach ( $request->get('subrede') as $resultado ) + { + $logger->debug("Atualizando a subrede {$resultado} ..."); + + // Junta os módulos windows e linux para enviar para o update de subredes + $atualizaWindows = $request->get('windows'); + $atualizaLinux = $request->get('linux'); + + // FIXME: Na requisição só vem o nome dos módulos. Precisa carregar as outras informações. + + // Evita Warning do array merge se um dos dois for vazio + if (empty($atualizaLinux)) { + $atualiza = $atualizaWindows; + } elseif (empty($atualizaWindows)) { + $atualiza = $atualizaLinux; + } else { + $atualiza = array_merge($atualizaWindows, $atualizaLinux); + } + + // Passa a rede como parâmetro + $redeAtualizar = $this->getDoctrine()->getManager()->find('CacicCommonBundle:Rede', $resultado); + + + // Executa a atualização de todos os módulos marcados para a subrede marcada + $result = $this->updateSubredesNeo($request, $redeAtualizar, $atualiza); + if (!$result) { + $retorno = $result; + } + } + if ($retorno) { + $this->get('session')->getFlashBag()->add('success', 'Dados salvos com sucesso!'); + } else { + $this->get('session')->getFlashBag()->add('error', 'Erro na atualização das subredes'); + } + + } + } + + // Lista de subredes e módulos + $subredesOrig = $this->getDoctrine()->getRepository('CacicCommonBundle:Rede')->comLocal(); + + // Varro todas as subredes para cada módulo + $subredes = array(); + $windows = array(); + $linux = array(); + foreach ($subredesOrig as $redeItem) { + // Busca o módulo em cada uma das redes + $codigos = array(); + foreach ($modulos as $key => $value) { + $idRede = $redeItem['idRede']; + // Verifico se o módulo existe na subrede + $rede = $this->getDoctrine()->getRepository('CacicCommonBundle:RedeVersaoModulo')->subrede($idRede, $key); + + if (empty($rede)) { + // O módulo não foi encontrado. Adiciona o código 1 + array_push($codigos, 0); + //$rede = $redeItem[0]; + } else { + if ($value['hash'] == $rede[0]['teHash']) { + // Se o hash for igual, adiciona o código 2 + array_push($codigos, 2); + + } else { + // Se o hash for diferente, adiciona o código 1 + array_push($codigos, 1); + } + } + + // Cria um array para Windows e outro para Linux + if ($value['tipoSo'] == 'windows') { + $windows[$key] = $value; + } else { + $linux[$key] = $value; + } + + } + + // Define o elemento HTML para os módulos + if (in_array(0, $codigos)) { + // Se o código 0 for encontrato, marcamos o módulo como inexistente + if (empty($rede)) { + $rede[0] = $redeItem; + } + $subredes["$idRede"]['teIpRede'] = $rede[0]['teIpRede']; + $subredes["$idRede"]['nmRede'] = $rede[0]['nmRede']; + $subredes["$idRede"]['teServUpdates'] = $rede[0]['teServUpdates']; + $subredes["$idRede"]['tePathServUpdates'] = $rede[0]['tePathServUpdates']; + $subredes["$idRede"]['nmLocal'] = $rede[0]['nmLocal']; + $subredes["$idRede"]['codigo'] = "Módulos inexistentes"; + } elseif (in_array(1, $codigos)) { + // Se o código 1 for encontrado, alguns módulos estão desatualizados + $subredes["$idRede"]['teIpRede'] = $rede[0]['teIpRede']; + $subredes["$idRede"]['nmRede'] = $rede[0]['nmRede']; + $subredes["$idRede"]['teServUpdates'] = $rede[0]['teServUpdates']; + $subredes["$idRede"]['tePathServUpdates'] = $rede[0]['tePathServUpdates']; + $subredes["$idRede"]['nmLocal'] = $rede[0]['nmLocal']; + $subredes["$idRede"]['codigo'] = "Módulos desatualizados"; + } else { + // Se não existe nenhum módulo inexistente ou desatualizado, está tudo 100% atualizado + $subredes["$idRede"]['teIpRede'] = $rede[0]['teIpRede']; + $subredes["$idRede"]['nmRede'] = $rede[0]['nmRede']; + $subredes["$idRede"]['teServUpdates'] = $rede[0]['teServUpdates']; + $subredes["$idRede"]['tePathServUpdates'] = $rede[0]['tePathServUpdates']; + $subredes["$idRede"]['nmLocal'] = $rede[0]['nmLocal']; + $subredes["$idRede"]['codigo'] = "Módulos atualizados"; + } + } + + return $this->render( 'CacicCommonBundle:Rede:manutencaoNeo.html.twig', + array( + 'windows'=> $windows, + 'linux' => $linux, + 'subredes' => $subredes + ) + ); + + } + + /* + * Função que retorna um array multidimensional com o nome dos executáveis, + * o hash e versão constantes do arquivo versions_and_hashes.ini + * + * @param nmModulo Nome do módulo para trazer informações + * + * @return Array multidimensional com os dados + */ + + public function modulosNeoArray(Request $request, $nmModulos = null) + { + $logger = $this->get('logger'); + // Abre e faz o parsing do arquivo + $cacic_helper = new Helper\OldCacicHelper($this->container->get('kernel')); + $iniFile = $cacic_helper->iniFile(); + $itemArray = parse_ini_file($iniFile); + $teste = parse_ini_file($iniFile, true); + + // Varre o diretório em busca dos módulos + $rootDir = $this->container->get('kernel')->getRootDir(); + $webDir = $rootDir . "/../web/"; + $downloadsDir = $webDir . "downloads/"; + $cacicDir = $downloadsDir . "cacic/"; + $linuxDir = $cacicDir . "linux/"; + $windowsDir = $cacicDir . "windows/"; + $outrosDir = $downloadsDir . "outros/"; + + // Constrói array de arquivos e hashes + $finder = new Finder(); + $agentes = new Finder(); + $saida = array(); + $base_url = $request->getBaseUrl(); + $base_url = preg_replace('/\/app.*.php/', "/", $base_url); + + // Primeiro tratamos agentes Linux + // A regra é que o agente mais atual estará na pasta current + $current = basename(readlink($linuxDir."current")); + $finder->directories()->in($linuxDir); + foreach($finder as $version) { + if ($version->getFileName() == 'current') { + // Aqui considera somente a última versão + $agentes->files()->in($version->getRealPath()); + foreach ($agentes as $file) { + if (!empty($nmModulos)) { + // Filtra por nome de módulo + if (!in_array($file->getFileName(), $nmModulos)) { + continue; + } + } + $saida[$file->getFileName()] = array( + 'name' => $file->getFileName(), + 'versao' => $current, + 'download_url' => $base_url . 'downloads/cacic/linux/' . $version->getFileName() . '/' . $file->getFileName(), + 'hash' => md5_file($file->getRealPath()), + 'size' => $file->getSize(), + 'filename' => 'cacic/linux/' . $version->getFileName() . '/' . $file->getFileName(), + 'tipoSo' => 'linux' + ); + } + } else { + continue; + } + + } + // Get latest version + //$current = basename(readlink($cacicDir."current")); + //$saida['linux']['live_version'] = $current; + + // Aí tratamos Windows + $finder->directories()->in($windowsDir); + $current = basename(readlink($windowsDir."current")); + foreach($finder as $version) { + if ($version->getFileName() == 'current') { + // Aqui considera somente a última versão + $agentes->files()->in($version->getRealPath()); + foreach ($agentes as $file) { + if (!empty($nmModulos)) { + // Filtra por nome de módulo + if (!in_array($file->getFileName(), $nmModulos)) { + continue; + } + } + $saida[$file->getFileName()] = array( + 'name' => $file->getFileName(), + 'versao' => $current, + 'download_url' => $base_url . 'downloads/cacic/windows/' . $version->getFileName() . '/' . $file->getFileName(), + 'hash' => md5_file($file->getRealPath()), + 'size' => $file->getSize(), + 'filename' => 'cacic/windows/' . $version->getFileName() . '/' . $file->getFileName(), + 'tipoSo' => 'windows' + ); + } + } else { + continue; + } + + } + // Get latest version + //$current = basename(readlink($windowsDir."current")); + //$saida['windows']['live_version'] = $current; + + // Retorna o array com todos os resultados + return $saida; + } + + public function updateSubredesNeo(Request $request, $rede, $modulos = null) + { + $logger = $this->get('logger'); + $pIntIdRede = $rede->getIdRede(); + + // Varre o diretório em busca dos módulos + $rootDir = $this->container->get('kernel')->getRootDir(); + $webDir = $rootDir . "/../web/"; + $downloadsDir = $webDir . "downloads/"; + $cacicDir = $downloadsDir . "cacic/"; + $linuxDir = $cacicDir . "linux/"; + $windowsDir = $cacicDir . "windows/"; + $outrosDir = $downloadsDir . "outros/"; + + // Carrega todos os metadados dos módulos fornecidos ou de todos os módulos + $modulos = $this->modulosNeoArray($request, $modulos); + $logger->debug("6666666666666666666666666666666666666 ".print_r($modulos, true)); + + foreach ($modulos as $key => $value) + { + $logger->debug("Nome do módulo: $key"); + + // Carrega dados da rede + $em = $this->getDoctrine()->getManager(); + //$arrDadosRede = array( 'rede' => $em->getRepository( 'CacicCommonBundle:Rede' )->listar() ); + //Debug::dump($arrDadosRede['rede'][0][0]); + //$arrDadosRede = $arrDadosRede['rede'][0]; + $arrDadosRede = array( + 'teServUpdates' => $rede->getTeServUpdates(), + 'tePathServUpdates' => $rede->getTePathServUpdates(), + 'nmUsuarioLoginServUpdatesGerente' => $rede->getNmUsuarioLoginServUpdatesGerente(), + 'teSenhaLoginServUpdatesGerente' => $rede->getTeSenhaLoginServUpdatesGerente(), + 'nuPortaServUpdates' => $rede->getNuPortaServUpdates(), + ); + + $strResult = $this->checkAndSend( + $value['name'], + $downloadsDir . $value['filename'], + $arrDadosRede['teServUpdates'], + $arrDadosRede['tePathServUpdates'], + $arrDadosRede['nmUsuarioLoginServUpdatesGerente'], + $arrDadosRede['teSenhaLoginServUpdatesGerente'], + $arrDadosRede['nuPortaServUpdates'] + ); + + $arrResult = explode('_=_',$strResult); + + if ($arrResult[1] == 'Ok!') + { + // Consertar CRUD no Symfony + $redeVersaoModulo = $em->getRepository('CacicCommonBundle:RedeVersaoModulo')->findOneBy( + array( + 'idRede' => $pIntIdRede, + 'nmModulo' => $value['name'] + ) + ); + + // Se não existir, instancia o objeto + if (empty($redeVersaoModulo)) { + $redeVersaoModulo = new RedeVersaoModulo(null, null, null, null, null, $rede); + } + + // Adicione o restante dos atributos + $redeVersaoModulo->setNmModulo($value['name']); + $redeVersaoModulo->setTeVersaoModulo($value['versao']); + $redeVersaoModulo->setDtAtualizacao(new \DateTime('NOW')); + $redeVersaoModulo->setCsTipoSo( $value['tipoSo'] ); + $redeVersaoModulo->setTeHash($value['hash']); + + $em->persist($redeVersaoModulo); + $em->flush(); + } else { + $logger->error("Erro no envio dos módulos via FTP!\n".$arrResult[1]); + return false; + } + } + + return true; + } + } \ No newline at end of file diff --git a/src/Cacic/CommonBundle/Resources/config/routing.yml b/src/Cacic/CommonBundle/Resources/config/routing.yml index ecac2fd..2dd15d9 100644 --- a/src/Cacic/CommonBundle/Resources/config/routing.yml +++ b/src/Cacic/CommonBundle/Resources/config/routing.yml @@ -549,4 +549,8 @@ cacic_agente_excluir: cacic_deploy: pattern: /admin/deploy/ - defaults: { _controller: CacicCommonBundle:Agente:deploy } \ No newline at end of file + defaults: { _controller: CacicCommonBundle:Agente:deploy } + +cacic_atualizacao_subredes: + pattern: /admin/subrede/manutencaoneo + defaults: { _controller: CacicCommonBundle:Rede:manutencaoNeo } \ No newline at end of file diff --git a/src/Cacic/CommonBundle/Resources/views/Rede/manutencaoNeo.html.twig b/src/Cacic/CommonBundle/Resources/views/Rede/manutencaoNeo.html.twig new file mode 100644 index 0000000..f8eebae --- /dev/null +++ b/src/Cacic/CommonBundle/Resources/views/Rede/manutencaoNeo.html.twig @@ -0,0 +1,195 @@ +{% extends 'CacicCommonBundle::base.html.twig' %} + +{% block breadcrumb %} +
  • {{ 'Atualizacoes de subredes'|trans }}
  • +{% endblock %} + +{% block body %} + +
    +
    + +
    + +

    {{ 'Atualizações de subredes'|trans }}

    + +
    + +

    {{ 'Conteúdo do repositório'|trans }}

    +

    {{ 'As informações referem-se aos objetos constantes do repositório, os quais poderão ser assinalados para verificação de existência e/ou versões nas SubRedes cadastradas'|trans }}.

    +
    + +
    +

    {{ "Agentes para MS-Windows"|trans }}

    + + + + + + + + + + + + {% for key, modulo in windows %} + + + + + + + + {% else %} + + + + {% endfor %} + +
    {{ 'Arquivo'|trans }}{{ 'Versão'|trans }}{{ 'Hash'|trans }} + +
    {{ key }}{{ modulo['versao'] }}{{ modulo['hash'] }} + +
    {{ 'NENHUM REGISTRO ENCONTRADO!'|trans }}
    +
    + +

    {{ "Agentes para GNU/LINUX"|trans }}

    + + + + + + + + + + {% for key, modulo in linux %} + + + + + + + + {% else %} + + + + {% endfor %} + + +
    {{ 'Arquivo'|trans }}{{ 'Versão'|trans }}{{ 'Hash'|trans }} + +
    {{ key }}{{ modulo['versao'] }}{{ modulo['hash'] }} + +
    {{ 'NENHUM REGISTRO ENCONTRADO!'|trans }}
    +
    + +
    +

    {{ 'Subredes cadastradas'|trans }}

    +

    {{ 'Subredes onde a operação de atualização deve ser executada '|trans }}.

    +
    + +

    {{ "Legenda"|trans }}

    + + + + + + + + + + + + + + + + + + + + + +
    {{ "Mensagem"|trans }}{{ "Significado"|trans }}
    {{ "Módulos inexistentes"|trans }}{{ "Um ou mais dos módulos obrigatórios não está presente na subrede"|trans }}
    {{ "Módulos desatualizados"|trans }}{{ "Um ou mais dos módulos obrigatórios está desatualizado na subrede"|trans }}
    {{ "Módulos atualizados"|trans }}{{ "Todos os módulos obrigatórios estão atualizados na subrede"|trans }}
    + +

    {{ subredes|length }} {{ "SubRedes Cadastradas"|trans }}

    + + + + + + + + + + + + + + + {% for key, rede in subredes %} + + + + + + + + + {% else %} + + + + {% endfor %} + + +
    {{ 'Endereço IP'|trans }}{{ 'Nome da Subrede'|trans }}{{ 'Servidor de atualizacoes'|trans }}{{ 'Localizacao'|trans }}{{ 'Status'|trans }} + +
    {{ rede['teIpRede'] }}{{ rede['nmRede'] }}{{ rede['teServUpdates'] }}{{ rede['nmLocal'] }}{{ rede['codigo']|raw }} + +
    {{ 'NENHUM REGISTRO ENCONTRADO!'|trans }}
    +
    +
    + + +
    +
    + +
    + +
    +
    + +
    +
    +{% endblock %} + +{% block javascripts %} + +{{ parent() }} + + + +{% endblock %} \ No newline at end of file -- libgit2 0.21.2