diff --git a/Dockerfile b/Dockerfile index 015357a40..9c33fcd0f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,6 +39,7 @@ RUN rm -rf /var/interlegis/sapl/sapl/.env && \ rm -rf /var/interlegis/sapl/sapl.db RUN chmod +x /var/interlegis/sapl/start.sh && \ + chmod +x /var/interlegis/sapl/check_solr.sh && \ ln -sf /dev/stdout /var/log/nginx/access.log && \ ln -sf /dev/stderr /var/log/nginx/error.log && \ mkdir /var/log/sapl/ && touch /var/interlegis/sapl/sapl.log && \ diff --git a/check_solr.sh b/check_solr.sh index b3c4760c4..c600466bb 100644 --- a/check_solr.sh +++ b/check_solr.sh @@ -4,15 +4,22 @@ SOLR_URL=$1 +RETRY_COUNT=1 +RETRY_LIMIT=4 + echo "Waiting for solr connection at $SOLR_URL ..." -while true; do +while [[ $RETRY_COUNT < $RETRY_LIMIT ]]; do + echo "Attempt to connect to solr: $RETRY_COUNT of $RETRY_LIMIT" + let RETRY_COUNT=RETRY_COUNT+1; echo "$SOLR_URL/solr/admin/collections?action=LIST" RESULT=$(curl -s -o /dev/null -I "$SOLR_URL/solr/admin/collections?action=LIST" -w '%{http_code}') echo $RESULT - if [ "$RESULT" -eq '200' ]; then + if [ $RESULT == 200 ]; then echo "Solr server is up!" - break + exit 1 else sleep 3 fi done +echo "Solr connection failed." +exit 2 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index e2dfb6824..5fe0b554b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ sapldb: - "5432:5432" sapl: image: interlegis/sapl:3.1.153 +# build: . restart: always environment: ADMIN_PASSWORD: interlegis @@ -23,11 +24,27 @@ sapl: EMAIL_HOST_USER: usuariosmtp EMAIL_SEND_USER: usuariosmtp EMAIL_HOST_PASSWORD: senhasmtp +# USE_SOLR: 'True' +# SOLR_COLLECTION: sapl +# SOLR_URL: http://saplsolr:8983 TZ: America/Sao_Paulo volumes: - sapl_data:/var/interlegis/sapl/data - sapl_media:/var/interlegis/sapl/media links: - sapldb +# - saplsolr ports: - "80:80" + +#saplsolr: +# image: solr:7.4-alpine +# restart: always +# command: bin/solr start -c -f +# volumes: +# - solr_data:/opt/solr/server/solr +# - solr_configsets:/opt/solr/server/solr/configsets +# ports: +# - "8983:8983" + + diff --git a/sapl/lexml/OAIServer.py b/sapl/lexml/OAIServer.py index 4c1d85c19..9783f2fa6 100644 --- a/sapl/lexml/OAIServer.py +++ b/sapl/lexml/OAIServer.py @@ -1,3 +1,4 @@ +import unicodedata from datetime import datetime import oaipmh @@ -11,6 +12,7 @@ from lxml.builder import ElementMaker from sapl.base.models import AppConfig, CasaLegislativa from sapl.lexml.models import LexmlPublicador, LexmlProvedor from sapl.norma.models import NormaJuridica +from sapl.utils import LISTA_DE_UFS class OAILEXML: @@ -122,22 +124,33 @@ class OAIServer: else: return None + @staticmethod + def remove_acentos(linha): + res = unicodedata.normalize('NFKD', linha).encode('ASCII', 'ignore') + res = res.decode("UTF-8") + remove_list = ["\'", "\"", "-"] + for i in remove_list: + res = res.replace(i, "") + return res + def monta_urn(self, norma, esfera): if norma: urn = 'urn:lex:br;' esferas = {'M': 'municipal', 'E': 'estadual'} - municipio = casa.municipio.lower() - uf = casa.uf.lower() + municipio = self.remove_acentos(casa.municipio.lower()) + uf_map = dict(LISTA_DE_UFS) + uf_desc = uf_map.get(casa.uf.upper(), '').lower() + uf_desc = self.remove_acentos(uf_desc) for x in [' ', '.de.', '.da.', '.das.', '.do.', '.dos.']: municipio = municipio.replace(x, '.') - uf = uf.replace(x, '.') + uf_desc = uf_desc.replace(x, '.') if esfera == 'M': - urn += '{};{}:'.format(uf, municipio) + urn += '{};{}:'.format(uf_desc, municipio) if norma.tipo.equivalente_lexml == 'regimento.interno' or norma.tipo.equivalente_lexml == 'resolucao': urn += 'camara.' urn += esferas[esfera] + ':' elif esfera == 'E': - urn += '{}:{}:'.format(uf, esferas[esfera]) + urn += '{}:{}:'.format(uf_desc, esferas[esfera]) else: urn += ':' if norma.tipo.equivalente_lexml: @@ -166,11 +179,14 @@ class OAIServer: return '' def monta_xml(self, urn, norma): + BASE_URL_SAPL = self.config['base_url'] + BASE_URL_SAPL = BASE_URL_SAPL[:BASE_URL_SAPL.find('/', 8)] + publicador = LexmlPublicador.objects.first() if norma and publicador: LEXML = ElementMaker(namespace=self.ns['lexml'], nsmap=self.ns) oai_lexml = LEXML.LexML() - oai_lexml.attrib['{{}}schemaLocation'.format(self.XSI_NS)] = '{} {}'.format( + oai_lexml.attrib['{{{pre}}}schemaLocation'.format(pre=self.XSI_NS)] = '{} {}'.format( 'http://www.lexml.gov.br/oai_lexml', 'http://projeto.lexml.gov.br/esquemas/oai_lexml.xsd') texto_integral = norma.texto_integral mime_types = {'doc': 'application/msword', @@ -178,20 +194,21 @@ class OAIServer: 'odt': 'application/vnd.oasis.opendocument.text', 'pdf': 'application/pdf', 'rtf': 'application/rtf'} + if texto_integral: - url_conteudo = self.config['base_url'] + texto_integral.url + url_conteudo = BASE_URL_SAPL + texto_integral.url extensao = texto_integral.url.split('.')[-1] formato = mime_types.get(extensao, 'application/octet-stream') else: formato = 'text/html' - url_conteudo = self.config['base_url'] + reverse('sapl.norma:normajuridica_detail', - kwargs={'pk': norma.numero}) + url_conteudo = BASE_URL_SAPL + reverse('sapl.norma:normajuridica_detail', + kwargs={'pk': norma.pk}) element_maker = ElementMaker() id_publicador = str(publicador.id_publicador) item_conteudo = element_maker.Item(url_conteudo, formato=formato, idPublicador=id_publicador, tipo='conteudo') oai_lexml.append(item_conteudo) - url = self.config['base_url'] + reverse('sapl.norma:normajuridica_detail', kwargs={'pk': norma.numero}) + url = BASE_URL_SAPL + reverse('sapl.norma:normajuridica_detail', kwargs={'pk': norma.pk}) item_metadado = element_maker.Item(url, formato='text/html', idPublicador=id_publicador, tipo='metadado') oai_lexml.append(item_metadado) documento_individual = element_maker.DocumentoIndividual(urn) diff --git a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py index 4c388e59a..4bbe31bed 100644 --- a/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py +++ b/sapl/relatorios/templates/pdf_sessao_plenaria_gerar.py @@ -128,6 +128,24 @@ def inf_basicas(inf_basicas_dic): return tmp +def multimidia(cont_mult_dic): + """ + """ + tmp = "" + + mul_audio = cont_mult_dic['multimidia_audio'] + mul_video = cont_mult_dic['multimidia_video'] + + tmp += '\t\tConteúdo Multimídia\n' + tmp += '\t\t\n' + tmp += '\t\t\t
\n' + tmp += '\t\t
\n' + tmp += '\t\tAudio: ' + mul_audio + '\n' + tmp += '\t\tVideo: ' + mul_video + '\n' + + return tmp + + def mesa(lst_mesa): """ @@ -392,7 +410,7 @@ def ocorrencias(lst_ocorrencias): return tmp -def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, lst_ocorrencias): +def principal(rodape_dic, imagem, inf_basicas_dic, cont_mult_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, lst_expedientes, lst_expediente_materia, lst_expediente_materia_vot_nom, lst_oradores_expediente, lst_presenca_ordem_dia, lst_votacao, lst_votacao_vot_nom, lst_oradores_ordemdia, lst_oradores, lst_ocorrencias): """ """ arquivoPdf = str(int(time.time() * 100)) + ".pdf" @@ -416,7 +434,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao ordenacao = ResumoOrdenacao.objects.first() dict_ord_template = { - 'cont_mult': '', + 'cont_mult': multimidia(cont_mult_dic), 'exp': expedientes(lst_expedientes), 'id_basica': inf_basicas(inf_basicas_dic), 'lista_p': presenca(lst_presenca_sessao, lst_ausencia_sessao), @@ -452,6 +470,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao logger.error("KeyError: " + str(e) + ". Erro ao tentar utilizar " "configuração de ordenação. Utilizando ordenação padrão.") tmp += inf_basicas(inf_basicas_dic) + tmp += multimidia(cont_mult_dic) tmp += mesa(lst_mesa) tmp += presenca(lst_presenca_sessao, lst_ausencia_sessao) tmp += expedientes(lst_expedientes) @@ -467,6 +486,7 @@ def principal(rodape_dic, imagem, inf_basicas_dic, lst_mesa, lst_presenca_sessao else: tmp += inf_basicas(inf_basicas_dic) + tmp += multimidia(cont_mult_dic) tmp += mesa(lst_mesa) tmp += presenca(lst_presenca_sessao, lst_ausencia_sessao) tmp += expedientes(lst_expedientes) diff --git a/sapl/relatorios/views.py b/sapl/relatorios/views.py index 5bd3fe6f7..72595b239 100755 --- a/sapl/relatorios/views.py +++ b/sapl/relatorios/views.py @@ -519,6 +519,18 @@ def get_sessao_plenaria(sessao, casa): inf_basicas_dic["dat_fim_sessao"] = '' inf_basicas_dic["hr_fim_sessao"] = sessao.hora_fim inf_basicas_dic["nom_camara"] = casa.nome + + # Conteudo multimidia + cont_mult_dic = {} + if sessao.url_audio: + cont_mult_dic['multimidia_audio'] = str(sessao.url_audio) + else: + cont_mult_dic['multimidia_audio'] = 'Indisponível' + + if sessao.url_video: + cont_mult_dic['multimidia_video'] = str(sessao.url_video) + else: + cont_mult_dic['multimidia_video'] = 'Indisponível' # Lista da composicao da mesa diretora lst_mesa = [] @@ -852,6 +864,7 @@ def get_sessao_plenaria(sessao, casa): lst_ocorrencias.append(o) return (inf_basicas_dic, + cont_mult_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, @@ -910,6 +923,7 @@ def relatorio_sessao_plenaria(request, pk): raise Http404('Essa página não existe') (inf_basicas_dic, + cont_mult_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, @@ -934,6 +948,7 @@ def relatorio_sessao_plenaria(request, pk): rodape, imagem, inf_basicas_dic, + cont_mult_dic, lst_mesa, lst_presenca_sessao, lst_ausencia_sessao, diff --git a/sapl/templates/base/layouts.yaml b/sapl/templates/base/layouts.yaml index 91f0cd67e..3d248c313 100644 --- a/sapl/templates/base/layouts.yaml +++ b/sapl/templates/base/layouts.yaml @@ -31,7 +31,8 @@ AppConfig: - assinatura_ata {% trans 'Cronômetros do Painel' %}: - - cronometro_discurso cronometro_aparte cronometro_ordem cronometro_consideracoes + - cronometro_discurso cronometro_aparte + - cronometro_ordem cronometro_consideracoes {% trans 'Configurações do Painel' %}: - mostrar_brasao_painel diff --git a/sapl/templates/relatorios/relatorio_ata.html b/sapl/templates/relatorios/relatorio_ata.html index 05c5355c4..11e3ce428 100644 --- a/sapl/templates/relatorios/relatorio_ata.html +++ b/sapl/templates/relatorios/relatorio_ata.html @@ -65,12 +65,12 @@
____________________
-

{{p.cargo}}: {{p.parlamentar.nome_completo}} / {{ p.parlamentar|filiacao_data_filter:object.data_inicio }}

+

{{p.cargo}}: {{p.parlamentar.nome_completo}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}




{% else %}
____________________
-

{{p.cargo}}: {{p.parlamentar.nome_completo}} / {{ p.parlamentar|filiacao_data_filter:object.data_inicio }}

+

{{p.cargo}}: {{p.parlamentar.nome_completo}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}




@@ -84,12 +84,12 @@
_____________________

- {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }}

+ {{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}




{% else %}
_____________________
-

{{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }}

+

{{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}




diff --git a/sapl/templates/sessao/blocos_ata/assinaturas.html b/sapl/templates/sessao/blocos_ata/assinaturas.html index 9eba4ce9b..520215fe1 100644 --- a/sapl/templates/sessao/blocos_ata/assinaturas.html +++ b/sapl/templates/sessao/blocos_ata/assinaturas.html @@ -5,13 +5,13 @@

{% for p in assinatura_mesa %}
___________________________________________
- {{p.cargo}}: {{p.parlamentar.nome_completo}} / {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} + {{p.cargo}}: {{p.parlamentar.nome_completo}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ p.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}


{% endfor %} {% for p in assinatura_presentes %}
___________________________________________
- {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }} + {{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}


{% endfor %} diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca.html b/sapl/templates/sessao/blocos_ata/lista_presenca.html index 1efc2c8ea..f2a4df4c5 100644 --- a/sapl/templates/sessao/blocos_ata/lista_presenca.html +++ b/sapl/templates/sessao/blocos_ata/lista_presenca.html @@ -5,7 +5,7 @@ {% if presenca_sessao %} Lista de Presença na Sessão: {% for p in presenca_sessao %} - {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }} + {{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} {% if not forloop.last %} ; {% endif %} {% endfor %} {% endif %} diff --git a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html index 855d1be6f..58729609c 100644 --- a/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html +++ b/sapl/templates/sessao/blocos_ata/lista_presenca_ordem_dia.html @@ -5,7 +5,7 @@ {% if presenca_ordem %} Lista de Presença na Ordem do Dia: {% for p in presenca_ordem %} - {{p.nome_completo}} / {{ p|filiacao_data_filter:object.data_inicio }} + {{p.nome_completo}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} {% if not forloop.last %} ; {% endif %} {% endfor %} {% endif %} diff --git a/sapl/templates/sessao/blocos_ata/mesa_diretora.html b/sapl/templates/sessao/blocos_ata/mesa_diretora.html index 2d2de86d7..e0f0d4b8b 100644 --- a/sapl/templates/sessao/blocos_ata/mesa_diretora.html +++ b/sapl/templates/sessao/blocos_ata/mesa_diretora.html @@ -1,13 +1,15 @@ +{% load common_tags %} +

{% if mesa %} Mesa Diretora: {% for m in mesa %} {{m.cargo}}: - {{m.parlamentar.nome_completo}} / {{ m.parlamentar.filiacao_atual }} + {{m.parlamentar.nome_completo}} / {% if m.parlamentar|filiacao_data_filter:object.data_inicio %} {{ m.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} {% if not forloop.last %} ; {% endif %} {% endfor %} {% endif %}

-
\ No newline at end of file + diff --git a/sapl/templates/sessao/blocos_ata/oradores_expediente.html b/sapl/templates/sessao/blocos_ata/oradores_expediente.html index f85b27895..1b355c128 100644 --- a/sapl/templates/sessao/blocos_ata/oradores_expediente.html +++ b/sapl/templates/sessao/blocos_ata/oradores_expediente.html @@ -1,9 +1,12 @@ +{% load common_tags %} + +

{% if oradores %} Oradores do Expediente: {% for o in oradores %} - {{o.numero_ordem}} - {{o.parlamentar.nome_completo}} / {{ o.parlamentar.filiacao_atual }} + {{o.numero_ordem}} - {{o.parlamentar.nome_completo}} / {% if o.parlamentar|filiacao_data_filter:object.data_inicio %} {{ o.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} {% if o.observacao %} - {{o.observacao}} {% endif %} {% if not forloop.last %} ; {% endif %} {% endfor %} diff --git a/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html b/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html index 98a454d78..70d4d65b2 100644 --- a/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html +++ b/sapl/templates/sessao/blocos_ata/oradores_explicacoes.html @@ -1,9 +1,11 @@ +{% load common_tags %} +

{% if oradores_explicacoes %} Oradores das Explicações Pessoais: {% for o in oradores_explicacoes %} - {{o.numero_ordem}} - {{o.parlamentar.nome_completo}} / {{ o.parlamentar.filiacao_atual }} + {{o.numero_ordem}} - {{o.parlamentar.nome_completo}} / {% if o.parlamentar|filiacao_data_filter:object.data_inicio %} {{ o.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %} {% if o.observacao %} - {{o.observacao}} {% endif %} {% if not forloop.last %} ; {% endif %} {% endfor %} diff --git a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html index b3074c0ea..672d28063 100644 --- a/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html +++ b/sapl/templates/sessao/blocos_resumo/lista_presenca_ordem_dia.html @@ -4,7 +4,7 @@ Lista de Presença na Ordem do Dia

{% for p in presenca_ordem %} -
{{p.nome_parlamentar}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
+
{{p.nome_parlamentar}} / {% if p|filiacao_data_filter:object.data_inicio %} {{ p|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
{% endfor %}
\ No newline at end of file diff --git a/sapl/templates/sessao/blocos_resumo/mesa_diretora.html b/sapl/templates/sessao/blocos_resumo/mesa_diretora.html index d8340c477..ed7bfc318 100644 --- a/sapl/templates/sessao/blocos_resumo/mesa_diretora.html +++ b/sapl/templates/sessao/blocos_resumo/mesa_diretora.html @@ -1,9 +1,11 @@ +{% load common_tags %} +
Mesa Diretora
{% for m in mesa %}
{{m.cargo}}: - {{m.parlamentar.nome_parlamentar}} / {% if m.parlamentar.filiacao_atual %} {{ m.parlamentar.filiacao_atual }} {% else %} Sem partido {% endif %} + {{m.parlamentar.nome_parlamentar}} / {% if p.parlamentar|filiacao_data_filter:object.data_inicio %} {{ m.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
{% endfor %}
diff --git a/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html index e97ac5aea..e1a835cbc 100644 --- a/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html +++ b/sapl/templates/sessao/blocos_resumo/oradores_explicacoes.html @@ -1,3 +1,5 @@ +{% load common_tags %} +
Oradores das Explicações Pessoais
@@ -6,7 +8,7 @@
{% for o in oradores_explicacoes %} -
{{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {{ o.parlamentar.filiacao_atual }}
+
{{o.numero_ordem}} - {{o.parlamentar.nome_parlamentar}} / {% if o.parlamentar|filiacao_data_filter:object.data_inicio %} {{ o.parlamentar|filiacao_data_filter:object.data_inicio }} {% else %} Sem partido {% endif %}
{{o.url_discurso}}

{% endfor %} diff --git a/start.sh b/start.sh index 0790c2c24..bea1eb959 100755 --- a/start.sh +++ b/start.sh @@ -70,11 +70,19 @@ if [ "${USE_SOLR-False}" == "True" ] || [ "${USE_SOLR-False}" == "true" ]; then echo "REPLICATION FACTOR: $RF" echo "MAX SHARDS PER NODE: $MAX_SHARDS_PER_NODE" echo "=========================================" - + + echo "running solr script" /bin/bash check_solr.sh $SOLR_URL + CHECK_SOLR_RETURN=$? + + if [ $CHECK_SOLR_RETURN == 1 ]; then + echo "Connecting to solr..." + python3 solr_api.py -u $SOLR_URL -c $SOLR_COLLECTION -s $NUM_SHARDS -rf $RF -ms $MAX_SHARDS_PER_NODE & + # python3 manage.py rebuild_index --noinput & + else + echo "Solr is offline, not possible to connect." + fi - python3 solr_api.py -u $SOLR_URL -c $SOLR_COLLECTION -s $NUM_SHARDS -rf $RF -ms $MAX_SHARDS_PER_NODE & - # python3 manage.py rebuild_index --noinput & else echo "Suporte a SOLR não inicializado." fi