From ee18582880ce5061dae71a4ebf7e456784a86bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Tue, 28 Feb 2023 10:42:00 -0300 Subject: [PATCH] =?UTF-8?q?Sincroniza=C3=A7=C3=A3o=20do=20SIGI=20com=20o?= =?UTF-8?q?=20DNS=20server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/servicos/admin.py | 7 +- .../servicos/jobs/daily/sincroniza_dns.py | 167 +++++++++--------- 2 files changed, 89 insertions(+), 85 deletions(-) diff --git a/sigi/apps/servicos/admin.py b/sigi/apps/servicos/admin.py index 9347e1a..9644af3 100644 --- a/sigi/apps/servicos/admin.py +++ b/sigi/apps/servicos/admin.py @@ -122,7 +122,10 @@ class ServicoAdmin(ReturnMixin, CartExportMixin, admin.ModelAdmin): get_uf.admin_order_field = "casa_legislativa__municipio__uf" def getUrl(self, obj): - return mark_safe(f'{obj.url}') + url = obj.url + if "//" not in url: + url = "//" + url + return mark_safe(f'{obj.url}') getUrl.short_description = _("Url") @@ -136,6 +139,8 @@ class ServicoAdmin(ReturnMixin, CartExportMixin, admin.ModelAdmin): url += obj.tipo_servico.string_pesquisa.splitlines()[0].split(" ")[ 0 ] + elif obj.tipo_servico.modo == "R": + url = f"https://toolbox.googleapps.com/apps/dig/#SOA/{obj.url}" return mark_safe( f'{obj.erro_atualizacao}' ) diff --git a/sigi/apps/servicos/jobs/daily/sincroniza_dns.py b/sigi/apps/servicos/jobs/daily/sincroniza_dns.py index ab4fddb..9331392 100644 --- a/sigi/apps/servicos/jobs/daily/sincroniza_dns.py +++ b/sigi/apps/servicos/jobs/daily/sincroniza_dns.py @@ -1,21 +1,18 @@ -import datetime -import docutils.core import json import shutil from django.conf import settings -from django.core.mail import mail_admins -from django.template.loader import render_to_string +from django.db.models import Q from django.utils import timezone from django.utils.translation import gettext as _ from django_extensions.management.jobs import DailyJob -from sigi.apps.servicos import generate_instance_name +from sigi.apps.servicos import generate_instance_name, nomeia_instancias from sigi.apps.servicos.models import Servico, TipoServico from sigi.apps.casas.models import Orgao from sigi.apps.contatos.models import UnidadeFederativa from sigi.apps.utils.mixins import JobReportMixin LOG_GERAL = _("Mensagens gerais") -IGNORES = ["_psl", "k8s", "www.", "sapl."] +IGNORES = ["_psl", "k8s", "www.", "sapl.", "addr.arpa"] get_iname = lambda d: "-".join(d.split(".")[:-2]) get_sigla_serv = lambda d: "".join(d.split(".")[-2:]).upper() @@ -43,14 +40,9 @@ class Job(JobReportMixin, DailyJob): report_data = {} def do_job(self): - # TODO: Resolver - raise Exception( - "Este CRON está desativado até resolvermos questões internas" - ) - self.report_data[LOG_GERAL] = get_log_entry() self.report_data["reativados"] = get_log_entry() # TODO: Remover - self.info("id,nome do orgao,instancia,tipo,url", "reativados") + self.info("id,nome do orgao,instancia,tipo,url,motivo", "reativados") if ( not settings.REGISTRO_PATH.exists() @@ -68,6 +60,13 @@ class Job(JobReportMixin, DailyJob): tipo_servico__modo="R", data_desativacao=None ).update(flag_confirmado=False) + nomeia_instancias( + servicos=Servico.objects.filter( + tipo_servico__modo="R", data_desativacao=None, instancia="" + ), + user=self.sys_user, + ) + for uf in UnidadeFederativa.objects.all(): self.report_data[uf] = get_log_entry() self.processa_uf(uf) @@ -86,37 +85,10 @@ class Job(JobReportMixin, DailyJob): iname = get_iname(dominio) sigla_srv = get_sigla_serv(dominio) - if log_entry == LOG_GERAL: - try: - log_entry = UnidadeFederativa.objects.get( - sigla=get_sigla_uf(dominio) - ) - except: - pass - if any([i in dominio for i in IGNORES]): # Ignorar esses registros sem fazer log # return - apps = [] - if "rrsets" in dns_rec: - apps = [ - r["name"].split(".")[0] - for r in dns_rec["rrsets"] - if r["type"] != "TXT" and r["name"][:-1].count(".") + 1 > nivel - ] - else: - detail_file = settings.REGISTRO_PATH / f"{dominio}." - if detail_file.exists() and detail_file.is_file(): - detail_data = json.loads(detail_file.read_text()) - if "rrsets" in detail_data: - apps = [ - r["name"].split(".")[0] - for r in detail_data["rrsets"] - if r["type"] != "TXT" - and r["name"][:-1].count(".") + 1 > nivel - ] - try: tipo = TipoServico.objects.get(sigla=sigla_srv, modo="R") except TipoServico.DoesNotExist: @@ -127,17 +99,37 @@ class Job(JobReportMixin, DailyJob): ) return + if log_entry == LOG_GERAL: + try: + log_entry = UnidadeFederativa.objects.get( + sigla=get_sigla_uf(dominio) + ) + except: + pass + + detail_file = settings.REGISTRO_PATH / f"{dominio}." + hospedado_interlegis = detail_file.exists() and detail_file.is_file() + + filtro_base = Q(instancia=iname) | Q(url=dominio) + if iname in self.nomes_gerados: + filtro_base = filtro_base | Q( + casa_legislativa=self.nomes_gerados[iname] + ) + filtro_base = filtro_base & Q(tipo_servico=tipo) + + servico = None + novo = False + try: servico = Servico.objects.get( - tipo_servico=tipo, instancia=iname, data_desativacao=None + filtro_base & Q(data_desativacao=None) ) - self.log_update(servico) except Servico.MultipleObjectsReturned: self.log_ignore( dominio, _( "existe mais de um registro no SIGI para a instância " - f"{iname}" + f"{iname}, domínio {dominio}" ), log_entry, ) @@ -145,33 +137,16 @@ class Job(JobReportMixin, DailyJob): except Servico.DoesNotExist: # Tenta encontrar um registro desativado para esta instância # servico = Servico.objects.filter( - tipo_servico=tipo, instancia=iname + filtro_base & ~Q(data_desativacao=None) ).first() if servico is not None: # Reativa o servico # + self.log_reativa(servico) servico.data_desativacao = None + servico.motivo_desativacao = "" servico.instancia = iname - self.log_reativa(servico) + self.admin_log_change(servico, _("Reativado pelo DNS Rancher")) else: - servico = None - # Tenta encontrar um registro ativo com mesmo domínio # - servico = Servico.objects.filter( - tipo_servico=tipo, url=dominio, data_desativacao=None - ).first() - if servico is not None: - servico.instancia = iname - self.log_update(servico) - else: - # Tenta encontrar um registro desativado com mesmo domínio # - servico = Servico.objects.filter( - tipo_servico=tipo, url=dominio - ).first() - if servico is not None: - servico.data_desativacao = None - servico.instancia = iname - self.log_reativa(servico) - - if servico is None: # Tenta criar o registro # if iname in self.nomes_gerados: orgao = self.nomes_gerados[iname] @@ -179,30 +154,52 @@ class Job(JobReportMixin, DailyJob): servico = Servico( casa_legislativa=orgao, tipo_servico=tipo, + url=dominio, instancia=iname, + hospedagem_interlegis=hospedado_interlegis, data_ativacao=timezone.localdate(), flag_confirmado=True, + resultado_verificacao="N", # Não verificado ) + servico.save() + novo = True self.log_novo(servico) - - if servico is None: - if nivel > 3: - # Loga registro não encontrado apenas para 4º+ nível # - self.log_ignore( - dominio, - _("não parece pertencer a nenhum órgão"), - log_entry, - ) - else: - # atualiza o serviço no SIGI - servico.url = dominio - servico.instancia = iname - servico.apps = "\n".join(apps) - servico.hospedagem_interlegis = True - servico.data_verificacao = timezone.localtime() - servico.resultado_verificacao = "F" # Funcionando - servico.flag_confirmado = True - servico.save() + self.admin_log_addition(servico, "Criado pelo DNS Rancher") + + if servico is None: + if nivel > 3: + # Loga registro não encontrado apenas para 4º+ nível # + self.log_ignore( + dominio, + _("não parece pertencer a nenhum órgão"), + log_entry, + ) + elif not novo: + # atualiza o serviço no SIGI + updates = [] + if servico.url != dominio: + updates.append(_(f"Url de '{servico.url}' para '{dominio}'")) + if servico.instancia != iname: + updates.append( + _(f"Instância de '{servico.instancia}' para '{iname}'") + ) + if servico.hospedagem_interlegis != hospedado_interlegis: + updates.append( + "Veio para hospedagem no Interlegis" + if hospedado_interlegis + else "Passou a ser delegado" + ) + servico.url = dominio + servico.instancia = iname + servico.hospedagem_interlegis = hospedado_interlegis + servico.flag_confirmado = True + servico.save() + if updates: + self.log_update(servico) + self.admin_log_change( + servico, + "Atualizado pelo DNS Rancher: " + ", ".join(updates), + ) def processa_uf(self, uf): file_path = settings.REGISTRO_PATH / f"{uf.sigla.lower()}.leg.br." @@ -269,13 +266,15 @@ class Job(JobReportMixin, DailyJob): for servico in Servico.objects.filter( tipo_servico__modo="R", data_desativacao=None, - hospedagem_interlegis=True, flag_confirmado=False, ): servico.data_desativacao = timezone.localdate() servico.motivo_desativacao = _("Não encontrado no DNS") servico.save() self.log_remove(servico) + self.admin_log_change( + servico, _("Desativado: não encontrado no DNS Rancher") + ) def error(self, message, log_entry=LOG_GERAL): self.report_data[log_entry]["erros"].append(message) @@ -310,7 +309,7 @@ class Job(JobReportMixin, DailyJob): ) self.report_data[uf]["sumario"]["atualizados"] += 1 self.info(msg, uf) - msg = f"{srv.id},{orgao.nome},{srv.instancia},{srv.tipo_servico.nome},{srv.url}" + msg = f"{srv.id},{orgao.nome},{srv.instancia},{srv.tipo_servico.nome},{srv.url},{srv.motivo_desativacao}" self.info(msg, "reativados") def log_remove(self, srv):