Pular para o conteúdo principal

Postagem em destaque

BlackTDN :: Autenticação 2FA para Usuário Root no WSL

--- # naldodj-wsl-2FA ## Autenticação 2FA para Usuário Root no WSL ### Introdução O Windows Subsystem for Linux (WSL) é uma ferramenta poderosa que permite aos desenvolvedores executar um ambiente Linux diretamente no Windows. No entanto, a segurança é uma preocupação importante, especialmente quando se trata de acessar o usuário root. Neste post, vamos mostrar como configurar a autenticação de dois fatores (2FA) para o usuário root ao acessar o WSL, garantindo uma camada adicional de segurança. ### Objetivo Vamos configurar um script de login que valida a senha do root e usa autenticação 2FA baseada em Time-based One-Time Password (TOTP), usando ferramentas comuns como `openssl`, `oathtool`, e `perl`. ### Passo 1: Instalar as Ferramentas Necessárias Primeiro, precisamos garantir que temos todas as ferramentas necessárias instaladas. Isso inclui `openssl`, `oathtool`, e `perl`. ```bash sudo apt-get update sudo apt-get install openssl oathtool perl ``` Para os scripts em Lua.

Protheus :: Carregando o(s) Ícone(s) do(s) Módulo(s) Específico(s) no SIGAMDI

A mesma dúvida que me fez publicar o "post" Protheus :: Disponibilizando os módulos específicos no SIGAMDI , gerou esse novo "post". A nova dúvida é: Agora que disponibilizei a Descrição dos Módulos Específicos no menu de Módulos do SIGAMDI, como fazer para que os "Ícones" referentes a esses módulos apareçam antes da descrição?

Essa foi uma boa pergunta. A resposta para a disponibilização dos Módulos, foi até simples. Bastaria saber da existência dos "Pontos de Entrada" descritos no "post" anterior.
Mas e para os ícones? Existem "Pontos de Entrada"?

Procurei um bocado e não encontrei "Ponto de Entrada" para esse fim. E agora? Já que não tem "Ponto de Entrada" como carregar os "Ícones"?

A resposta vai depender do quanto conheçemos o sistema. Sua estrutrura semântica, a forma de tratamento de erro e, finalmente, como gerar o nosso próprio "Ponto de Entrada" à partir desse conhecimento.

Para chegar à resposta que publicarei nesse "post", além de "quebrar  a cabeça" tive que fazer uso de todo o meu conhecimento da linguagem e do método da  "Tentativa e Erro" e o das "Aproximações Sucessivas" .

Primeiro, teria que identificar, em que momento e em que lugar, o sistema definia os "Ìcones" que seriam apresentados junto à descrição dos Módulos no menu de Módulos do SIGAMDI. Para isso, fui "debugando" passo a passo o sistema, identificando as funções e variáveis que eram apresentadas até o ponto da geração do Menu de Módulos do SIGAMDI.

Tendo feito isso, identifiquei uma variável "Static" de nome aRetModName que continha todas as informações dos módulos. Identifiquei nessa variável as seguintes informações:


aRetModName -> ARRAY (   80) [...]
          aRetModName[1] -> ARRAY (    5) [...]
               aRetModName[1][1] -> N (   15) [         1.0000]

               aRetModName[1][2] -> C (    7) [SIGAATF]

               aRetModName[1][3] -> C (   11) [Ativo Fixo ]

               aRetModName[1][4] -> L (    3) [.T.]

               aRetModName[1][5] -> C (    6) [ATFIMG]

          aRetModName[2] -> ARRAY (    5) [...]
               aRetModName[2][1] -> N (   15) [         2.0000]

               aRetModName[2][2] -> C (    7) [SIGACOM]

               aRetModName[2][3] -> C (    8) [Compras ]

               aRetModName[2][4] -> L (    3) [.T.]

               aRetModName[2][5] -> C (    6) [COMIMG]

          aRetModName[3] -> ARRAY (    5) [...]
               aRetModName[3][1] -> N (   15) [         3.0000]

               aRetModName[3][2] -> C (    7) [SIGACON]

               aRetModName[3][3] -> C (   14) [Contabilidade ]

               aRetModName[3][4] -> L (    3) [.F.]

               aRetModName[3][5] -> C (    6) [CONIMG]

          aRetModName[4] -> ARRAY (    5) [...]
               aRetModName[4][1] -> N (   15) [         4.0000]

               aRetModName[4][2] -> C (    7) [SIGAEST]

               aRetModName[4][3] -> C (   14) [Estoque/Custos]

               aRetModName[4][4] -> L (    3) [.T.]

               aRetModName[4][5] -> C (    6) [ESTIMG]

          aRetModName[5] -> ARRAY (    5) [...]
               aRetModName[5][1] -> N (   15) [         5.0000]

               aRetModName[5][2] -> C (    7) [SIGAFAT]

               aRetModName[5][3] -> C (   11) [Faturamento]

               aRetModName[5][4] -> L (    3) [.T.]

               aRetModName[5][5] -> C (    6) [FATIMG]

          aRetModName[6] -> ARRAY (    5) [...]
               aRetModName[6][1] -> N (   15) [         6.0000]

               aRetModName[6][2] -> C (    7) [SIGAFIN]

               aRetModName[6][3] -> C (   10) [Financeiro]

               aRetModName[6][4] -> L (    3) [.T.]

               aRetModName[6][5] -> C (    6) [FINIMG]

          aRetModName[7] -> ARRAY (    5) [...]
               aRetModName[7][1] -> N (   15) [         7.0000]

               aRetModName[7][2] -> C (    7) [SIGAGPE]

               aRetModName[7][3] -> C (   17) [Gestão de Pessoal]

               aRetModName[7][4] -> L (    3) [.T.]

               aRetModName[7][5] -> C (    6) [GPEIMG]

          aRetModName[8] -> ARRAY (    5) [...]
               aRetModName[8][1] -> N (   15) [         8.0000]

               aRetModName[8][2] -> C (    7) [SIGAFAS]

               aRetModName[8][3] -> C (   19) [Faturamento Serviço]

               aRetModName[8][4] -> L (    3) [.F.]

               aRetModName[8][5] -> C (    6) [FASIMG]

          aRetModName[9] -> ARRAY (    5) [...]
               aRetModName[9][1] -> N (   15) [         9.0000]

               aRetModName[9][2] -> C (    7) [SIGAFIS]

               aRetModName[9][3] -> C (   14) [Livros Fiscais]

               aRetModName[9][4] -> L (    3) [.T.]

               aRetModName[9][5] -> C (    6) [FISIMG]

          aRetModName[10] -> ARRAY (    5) [...]
               aRetModName[10][1] -> N (   15) [        10.0000]

               aRetModName[10][2] -> C (    7) [SIGAPCP]

               aRetModName[10][3] -> C (   21) [Planej.Contr.Produção]

               aRetModName[10][4] -> L (    3) [.T.]

               aRetModName[10][5] -> C (    6) [PCPIMG]

          aRetModName[11] -> ARRAY (    5) [...]
               aRetModName[11][1] -> N (   15) [        11.0000]

               aRetModName[11][2] -> C (    7) [SIGAVEI]

               aRetModName[11][3] -> C (    8) [Veículos]

               aRetModName[11][4] -> L (    3) [.T.]

               aRetModName[11][5] -> C (    6) [VEIIMG]

          aRetModName[12] -> ARRAY (    5) [...]
               aRetModName[12][1] -> N (   15) [        12.0000]

               aRetModName[12][2] -> C (    8) [SIGALOJA]

               aRetModName[12][3] -> C (   17) [Controle de Lojas]

               aRetModName[12][4] -> L (    3) [.T.]

               aRetModName[12][5] -> C (    6) [LOJIMG]

          aRetModName[13] -> ARRAY (    5) [...]
               aRetModName[13][1] -> N (   15) [        13.0000]

               aRetModName[13][2] -> C (    7) [SIGATMK]

               aRetModName[13][3] -> C (   11) [Call Center]

               aRetModName[13][4] -> L (    3) [.T.]

               aRetModName[13][5] -> C (    6) [TMKIMG]

          aRetModName[14] -> ARRAY (    5) [...]
               aRetModName[14][1] -> N (   15) [        14.0000]

               aRetModName[14][2] -> C (    7) [SIGAOFI]

               aRetModName[14][3] -> C (    7) [Oficina]

               aRetModName[14][4] -> L (    3) [.T.]

               aRetModName[14][5] -> C (    6) [OFIIMG]

          aRetModName[15] -> ARRAY (    5) [...]
               aRetModName[15][1] -> N (   15) [        15.0000]

               aRetModName[15][2] -> C (    7) [SIGARPM]

               aRetModName[15][3] -> C (   25) [Protheus T Report Utility]

               aRetModName[15][4] -> L (    3) [.F.]

               aRetModName[15][5] -> C (    6) [RPMIMG]

          aRetModName[16] -> ARRAY (    5) [...]
               aRetModName[16][1] -> N (   15) [        16.0000]

               aRetModName[16][2] -> C (    7) [SIGAPON]

               aRetModName[16][3] -> C (   16) [Ponto Eletrônico]

               aRetModName[16][4] -> L (    3) [.T.]

               aRetModName[16][5] -> C (    6) [PONIMG]

          aRetModName[17] -> ARRAY (    5) [...]
               aRetModName[17][1] -> N (   15) [        17.0000]

               aRetModName[17][2] -> C (    7) [SIGAEIC]

               aRetModName[17][3] -> C (   19) [Easy Import Control]

               aRetModName[17][4] -> L (    3) [.T.]

               aRetModName[17][5] -> C (    6) [EICIMG]

          aRetModName[18] -> ARRAY (    5) [...]
               aRetModName[18][1] -> N (   15) [        18.0000]

               aRetModName[18][2] -> C (    7) [SIGATCF]

               aRetModName[18][3] -> C (   35) [Terminal de consulta do funcionário]

               aRetModName[18][4] -> L (    3) [.T.]

               aRetModName[18][5] -> C (    6) [TCFIMG]

          aRetModName[19] -> ARRAY (    5) [...]
               aRetModName[19][1] -> N (   15) [        19.0000]

               aRetModName[19][2] -> C (    7) [SIGAMNT]

               aRetModName[19][3] -> C (   20) [Manutenção de Ativos]

               aRetModName[19][4] -> L (    3) [.T.]

               aRetModName[19][5] -> C (    6) [MNTIMG]

          aRetModName[20] -> ARRAY (    5) [...]
               aRetModName[20][1] -> N (   15) [        20.0000]

               aRetModName[20][2] -> C (    7) [SIGARSP]

               aRetModName[20][3] -> C (   30) [Recrutamento e Seleção Pessoal]

               aRetModName[20][4] -> L (    3) [.T.]

               aRetModName[20][5] -> C (    6) [RSPIMG]

          aRetModName[21] -> ARRAY (    5) [...]
               aRetModName[21][1] -> N (   15) [        21.0000]

               aRetModName[21][2] -> C (    7) [SIGAQIE]

               aRetModName[21][3] -> C (   20) [Inspeção de Entradas]

               aRetModName[21][4] -> L (    3) [.T.]

               aRetModName[21][5] -> C (    6) [QIEIMG]

          aRetModName[22] -> ARRAY (    5) [...]
               aRetModName[22][1] -> N (   15) [        22.0000]

               aRetModName[22][2] -> C (    7) [SIGAQMT]

               aRetModName[22][3] -> C (   10) [Metrologia]

               aRetModName[22][4] -> L (    3) [.T.]

               aRetModName[22][5] -> C (    6) [QMTIMG]

          aRetModName[23] -> ARRAY (    5) [...]
               aRetModName[23][1] -> N (   15) [        23.0000]

               aRetModName[23][2] -> C (    7) [SIGAFRT]

               aRetModName[23][3] -> C (   10) [Front Loja]

               aRetModName[23][4] -> L (    3) [.T.]

               aRetModName[23][5] -> C (    6) [FRTIMG]

          aRetModName[24] -> ARRAY (    5) [...]
               aRetModName[24][1] -> N (   15) [        24.0000]

               aRetModName[24][2] -> C (    7) [SIGAQDO]

               aRetModName[24][3] -> C (   22) [Controle de Documentos]

               aRetModName[24][4] -> L (    3) [.T.]

               aRetModName[24][5] -> C (    6) [QDOIMG]

          aRetModName[25] -> ARRAY (    5) [...]
               aRetModName[25][1] -> N (   15) [        25.0000]

               aRetModName[25][2] -> C (    7) [SIGAQIP]

               aRetModName[25][3] -> C (   21) [Inspeção de Processos]

               aRetModName[25][4] -> L (    3) [.T.]

               aRetModName[25][5] -> C (    6) [QIPIMG]

          aRetModName[26] -> ARRAY (    5) [...]
               aRetModName[26][1] -> N (   15) [        26.0000]

               aRetModName[26][2] -> C (    7) [SIGATRM]

               aRetModName[26][3] -> C (   11) [Treinamento]

               aRetModName[26][4] -> L (    3) [.T.]

               aRetModName[26][5] -> C (    6) [TRMIMG]

          aRetModName[27] -> ARRAY (    5) [...]
               aRetModName[27][1] -> N (   15) [        27.0000]

               aRetModName[27][2] -> C (    7) [SIGAEIF]

               aRetModName[27][3] -> C (   23) [Importação - Financeiro]

               aRetModName[27][4] -> L (    3) [.F.]

               aRetModName[27][5] -> C (    6) [EIFIMG]

          aRetModName[28] -> ARRAY (    5) [...]
               aRetModName[28][1] -> N (   15) [        28.0000]

               aRetModName[28][2] -> C (    7) [SIGATEC]

               aRetModName[28][3] -> C (   13) [Field Service]

               aRetModName[28][4] -> L (    3) [.T.]

               aRetModName[28][5] -> C (    6) [TECIMG]

          aRetModName[29] -> ARRAY (    5) [...]
               aRetModName[29][1] -> N (   15) [        29.0000]

               aRetModName[29][2] -> C (    7) [SIGAEEC]

               aRetModName[29][3] -> C (   19) [Easy Export Control]

               aRetModName[29][4] -> L (    3) [.T.]

               aRetModName[29][5] -> C (    6) [EECIMG]

          aRetModName[30] -> ARRAY (    5) [...]
               aRetModName[30][1] -> N (   15) [        30.0000]

               aRetModName[30][2] -> C (    7) [SIGAEFF]

               aRetModName[30][3] -> C (   14) [Easy Financing]

               aRetModName[30][4] -> L (    3) [.T.]

               aRetModName[30][5] -> C (    6) [EFFIMG]

          aRetModName[31] -> ARRAY (    5) [...]
               aRetModName[31][1] -> N (   15) [        31.0000]

               aRetModName[31][2] -> C (    7) [SIGAECO]

               aRetModName[31][3] -> C (   15) [Easy Accounting]

               aRetModName[31][4] -> L (    3) [.T.]

               aRetModName[31][5] -> C (    6) [ECOIMG]

          aRetModName[32] -> ARRAY (    5) [...]
               aRetModName[32][1] -> N (   15) [        32.0000]

               aRetModName[32][2] -> C (    7) [SIGAAFV]

               aRetModName[32][3] -> C (   32) [Administração de Força de Vendas]

               aRetModName[32][4] -> L (    3) [.F.]

               aRetModName[32][5] -> C (    6) [AFVIMG]

          aRetModName[33] -> ARRAY (    5) [...]
               aRetModName[33][1] -> N (   15) [        33.0000]

               aRetModName[33][2] -> C (    7) [SIGAPLS]

               aRetModName[33][3] -> C (   14) [Plano de Saúde]

               aRetModName[33][4] -> L (    3) [.T.]

               aRetModName[33][5] -> C (    6) [PLSIMG]

          aRetModName[34] -> ARRAY (    5) [...]
               aRetModName[34][1] -> N (   15) [        34.0000]

               aRetModName[34][2] -> C (    7) [SIGACTB]

               aRetModName[34][3] -> C (   23) [Contabilidade Gerencial]

               aRetModName[34][4] -> L (    3) [.T.]

               aRetModName[34][5] -> C (    6) [CTBIMG]

          aRetModName[35] -> ARRAY (    5) [...]
               aRetModName[35][1] -> N (   15) [        35.0000]

               aRetModName[35][2] -> C (    7) [SIGAMDT]

               aRetModName[35][3] -> C (   32) [Medicina e Segurança do Trabalho]

               aRetModName[35][4] -> L (    3) [.T.]

               aRetModName[35][5] -> C (    6) [MDTIMG]

          aRetModName[36] -> ARRAY (    5) [...]
               aRetModName[36][1] -> N (   15) [        36.0000]

               aRetModName[36][2] -> C (    7) [SIGAQNC]

               aRetModName[36][3] -> C (   29) [Controle de Não-Conformidades]

               aRetModName[36][4] -> L (    3) [.T.]

               aRetModName[36][5] -> C (    6) [QNCIMG]

          aRetModName[37] -> ARRAY (    5) [...]
               aRetModName[37][1] -> N (   15) [        37.0000]

               aRetModName[37][2] -> C (    7) [SIGAQAD]

               aRetModName[37][3] -> C (   21) [Controle de Auditoria]

               aRetModName[37][4] -> L (    3) [.T.]

               aRetModName[37][5] -> C (    6) [QADIMG]

          aRetModName[38] -> ARRAY (    5) [...]
               aRetModName[38][1] -> N (   15) [        38.0000]

               aRetModName[38][2] -> C (    7) [SIGAQCP]

               aRetModName[38][3] -> C (   33) [Controle Estatístico de Processos]

               aRetModName[38][4] -> L (    3) [.F.]

               aRetModName[38][5] -> C (    6) [QCPIMG]

          aRetModName[39] -> ARRAY (    5) [...]
               aRetModName[39][1] -> N (   15) [        39.0000]

               aRetModName[39][2] -> C (    7) [SIGAOMS]

               aRetModName[39][3] -> C (   28) [OMS - Gestão de Distribuição]

               aRetModName[39][4] -> L (    3) [.T.]

               aRetModName[39][5] -> C (    6) [OMSIMG]

          aRetModName[40] -> ARRAY (    5) [...]
               aRetModName[40][1] -> N (   15) [        40.0000]

               aRetModName[40][2] -> C (    7) [SIGACSA]

               aRetModName[40][3] -> C (   18) [Cargos e Salários ]

               aRetModName[40][4] -> L (    3) [.T.]

               aRetModName[40][5] -> C (    6) [CSAIMG]

          aRetModName[41] -> ARRAY (    5) [...]
               aRetModName[41][1] -> N (   15) [        41.0000]

               aRetModName[41][2] -> C (    7) [SIGAPEC]

               aRetModName[41][3] -> C (   10) [Auto Peças]

               aRetModName[41][4] -> L (    3) [.T.]

               aRetModName[41][5] -> C (    6) [PECIMG]

          aRetModName[42] -> ARRAY (    5) [...]
               aRetModName[42][1] -> N (   15) [        42.0000]

               aRetModName[42][2] -> C (    7) [SIGAWMS]

               aRetModName[42][3] -> C (   27) [WMS - Gestão de Armazenagem]

               aRetModName[42][4] -> L (    3) [.T.]

               aRetModName[42][5] -> C (    6) [WMSIMG]

          aRetModName[43] -> ARRAY (    5) [...]
               aRetModName[43][1] -> N (   15) [        43.0000]

               aRetModName[43][2] -> C (    7) [SIGATMS]

               aRetModName[43][3] -> C (   26) [TMS - Gestão de Transporte]

               aRetModName[43][4] -> L (    3) [.T.]

               aRetModName[43][5] -> C (    6) [TMSIMG]

          aRetModName[44] -> ARRAY (    5) [...]
               aRetModName[44][1] -> N (   15) [        44.0000]

               aRetModName[44][2] -> C (    7) [SIGAPMS]

               aRetModName[44][3] -> C (   18) [Gestão de Projetos]

               aRetModName[44][4] -> L (    3) [.T.]

               aRetModName[44][5] -> C (    6) [PMSIMG]

          aRetModName[45] -> ARRAY (    5) [...]
               aRetModName[45][1] -> N (   15) [        45.0000]

               aRetModName[45][2] -> C (    7) [SIGACDA]

               aRetModName[45][3] -> C (   29) [Controle de Direitos Autorais]

               aRetModName[45][4] -> L (    3) [.T.]

               aRetModName[45][5] -> C (    6) [CDAIMG]

          aRetModName[46] -> ARRAY (    5) [...]
               aRetModName[46][1] -> N (   15) [        46.0000]

               aRetModName[46][2] -> C (    7) [SIGAACD]

               aRetModName[46][3] -> C (   25) [Automação Coleta de Dados]

               aRetModName[46][4] -> L (    3) [.F.]

               aRetModName[46][5] -> C (    6) [ACDIMG]

          aRetModName[47] -> ARRAY (    5) [...]
               aRetModName[47][1] -> N (   15) [        47.0000]

               aRetModName[47][2] -> C (    8) [SIGAPPAP]

               aRetModName[47][3] -> C (    4) [PPAP]

               aRetModName[47][4] -> L (    3) [.T.]

               aRetModName[47][5] -> C (    6) [PAPIMG]

          aRetModName[48] -> ARRAY (    5) [...]
               aRetModName[48][1] -> N (   15) [        48.0000]

               aRetModName[48][2] -> C (    7) [SIGAREP]

               aRetModName[48][3] -> C (    7) [Réplica]

               aRetModName[48][4] -> L (    3) [.T.]

               aRetModName[48][5] -> C (    6) [REPIMG]

          aRetModName[49] -> ARRAY (    5) [...]
               aRetModName[49][1] -> N (   15) [        49.0000]

               aRetModName[49][2] -> C (    6) [SIGAGE]

               aRetModName[49][3] -> C (   18) [Gestão Educacional]

               aRetModName[49][4] -> L (    3) [.T.]

               aRetModName[49][5] -> C (    6) [AGEIMG]

          aRetModName[50] -> ARRAY (    5) [...]
               aRetModName[50][1] -> N (   15) [        50.0000]

               aRetModName[50][2] -> C (    7) [SIGAEDC]

               aRetModName[50][3] -> C (   21) [Easy Drawback Control]

               aRetModName[50][4] -> L (    3) [.T.]

               aRetModName[50][5] -> C (    6) [EDCIMG]

          aRetModName[51] -> ARRAY (    5) [...]
               aRetModName[51][1] -> N (   15) [        51.0000]

               aRetModName[51][2] -> C (    7) [SIGAHSP]

               aRetModName[51][3] -> C (   17) [Gestão Hospitalar]

               aRetModName[51][4] -> L (    3) [.T.]

               aRetModName[51][5] -> C (    6) [HSPIMG]

          aRetModName[52] -> ARRAY (    5) [...]
               aRetModName[52][1] -> N (   15) [        52.0000]

               aRetModName[52][2] -> C (    8) [SIGAVDOC]

               aRetModName[52][3] -> C (    6) [Viewer]

               aRetModName[52][4] -> L (    3) [.F.]

               aRetModName[52][5] -> C (    0) []

          aRetModName[53] -> ARRAY (    5) [...]
               aRetModName[53][1] -> N (   15) [        53.0000]

               aRetModName[53][2] -> C (    7) [SIGAAPD]

               aRetModName[53][3] -> C (   34) [Avaliação e Pesquisa de Desempenho]

               aRetModName[53][4] -> L (    3) [.T.]

               aRetModName[53][5] -> C (    6) [APDIMG]

          aRetModName[54] -> ARRAY (    5) [...]
               aRetModName[54][1] -> N (   15) [        54.0000]

               aRetModName[54][2] -> C (    7) [SIGAGSP]

               aRetModName[54][3] -> C (   21) [Gestão de Prefeituras]

               aRetModName[54][4] -> L (    3) [.F.]

               aRetModName[54][5] -> C (    6) [GSPIMG]

          aRetModName[55] -> ARRAY (    5) [...]
               aRetModName[55][1] -> N (   15) [        55.0000]

               aRetModName[55][2] -> C (    7) [SIGACRD]

               aRetModName[55][3] -> C (   43) [Sistema de Fidelização e Análise de Crédito]

               aRetModName[55][4] -> L (    3) [.T.]

               aRetModName[55][5] -> C (    6) [CRDIMG]

          aRetModName[56] -> ARRAY (    5) [...]
               aRetModName[56][1] -> N (   15) [        56.0000]

               aRetModName[56][2] -> C (    7) [SIGASGA]

               aRetModName[56][3] -> C (   16) [Gestão Ambiental]

               aRetModName[56][4] -> L (    3) [.T.]

               aRetModName[56][5] -> C (    6) [SGAIMG]

          aRetModName[57] -> ARRAY (    5) [...]
               aRetModName[57][1] -> N (   15) [        57.0000]

               aRetModName[57][2] -> C (    7) [SIGAPCO]

               aRetModName[57][3] -> C (   36) [Planejamento e Controle Orçamentário]

               aRetModName[57][4] -> L (    3) [.T.]

               aRetModName[57][5] -> C (    6) [PCOIMG]

          aRetModName[58] -> ARRAY (    5) [...]
               aRetModName[58][1] -> N (   15) [        58.0000]

               aRetModName[58][2] -> C (    7) [SIGAGPR]

               aRetModName[58][3] -> C (   37) [Gerenciamento de Pesquisa e Resultado]

               aRetModName[58][4] -> L (    3) [.T.]

               aRetModName[58][5] -> C (    6) [GPRIMG]

          aRetModName[59] -> ARRAY (    5) [...]
               aRetModName[59][1] -> N (   15) [        59.0000]

               aRetModName[59][2] -> C (    7) [SIGAGAC]

               aRetModName[59][3] -> C (   17) [Gestão de Acervos]

               aRetModName[59][4] -> L (    3) [.T.]

               aRetModName[59][5] -> C (    6) [GACIMG]

          aRetModName[60] -> ARRAY (    5) [...]
               aRetModName[60][1] -> N (   15) [        60.0000]

               aRetModName[60][2] -> C (    7) [SIGAHEO]

               aRetModName[60][3] -> C (   28) [HRP Estrutura Organizacional]

               aRetModName[60][4] -> L (    3) [.F.]

               aRetModName[60][5] -> C (    6) [HEOIMG]

          aRetModName[61] -> ARRAY (    5) [...]
               aRetModName[61][1] -> N (   15) [        61.0000]

               aRetModName[61][2] -> C (    7) [SIGAHGP]

               aRetModName[61][3] -> C (   21) [HRP Gestão de Pessoal]

               aRetModName[61][4] -> L (    3) [.F.]

               aRetModName[61][5] -> C (    6) [HGPIMG]

          aRetModName[62] -> ARRAY (    5) [...]
               aRetModName[62][1] -> N (   15) [        62.0000]

               aRetModName[62][2] -> C (    7) [SIGAHHG]

               aRetModName[62][3] -> C (   29) [HRP Ferramentas de Informação]

               aRetModName[62][4] -> L (    3) [.F.]

               aRetModName[62][5] -> C (    6) [HHGIMG]

          aRetModName[63] -> ARRAY (    5) [...]
               aRetModName[63][1] -> N (   15) [        63.0000]

               aRetModName[63][2] -> C (    7) [SIGAHPL]

               aRetModName[63][3] -> C (   34) [HRP Planejamento e Desenvolvimento]

               aRetModName[63][4] -> L (    3) [.F.]

               aRetModName[63][5] -> C (    6) [HPLIMG]

          aRetModName[64] -> ARRAY (    5) [...]
               aRetModName[64][1] -> N (   15) [        64.0000]

               aRetModName[64][2] -> C (    7) [SIGAAPT]

               aRetModName[64][3] -> C (   22) [Processos Trabalhistas]

               aRetModName[64][4] -> L (    3) [.T.]

               aRetModName[64][5] -> C (    6) [APTIMG]

          aRetModName[65] -> ARRAY (    5) [...]
               aRetModName[65][1] -> N (   15) [        65.0000]

               aRetModName[65][2] -> C (    7) [SIGAGAV]

               aRetModName[65][3] -> C (   18) [Gestão Advocaticia]

               aRetModName[65][4] -> L (    3) [.F.]

               aRetModName[65][5] -> C (    6) [GAVIMG]

          aRetModName[66] -> ARRAY (    5) [...]
               aRetModName[66][1] -> N (   15) [        66.0000]

               aRetModName[66][2] -> C (    7) [SIGAICE]

               aRetModName[66][3] -> C (   16) [Gestão de Riscos]

               aRetModName[66][4] -> L (    3) [.T.]

               aRetModName[66][5] -> C (    6) [ICEIMG]

          aRetModName[67] -> ARRAY (    5) [...]
               aRetModName[67][1] -> N (   15) [        67.0000]

               aRetModName[67][2] -> C (    7) [SIGAAGR]

               aRetModName[67][3] -> C (   15) [Gestão Agrícola]

               aRetModName[67][4] -> L (    3) [.T.]

               aRetModName[67][5] -> C (    6) [AGRIMG]

          aRetModName[68] -> ARRAY (    5) [...]
               aRetModName[68][1] -> N (   15) [        68.0000]

               aRetModName[68][2] -> C (    7) [SIGAARM]

               aRetModName[68][3] -> C (   25) [Gestão de Armazens Gerais]

               aRetModName[68][4] -> L (    3) [.F.]

               aRetModName[68][5] -> C (    6) [ARMIMG]

          aRetModName[69] -> ARRAY (    5) [...]
               aRetModName[69][1] -> N (   15) [        69.0000]

               aRetModName[69][2] -> C (    7) [SIGAGCT]

               aRetModName[69][3] -> C (   19) [Gestão de Contratos]

               aRetModName[69][4] -> L (    3) [.T.]

               aRetModName[69][5] -> C (    6) [GCTIMG]

          aRetModName[70] -> ARRAY (    5) [...]
               aRetModName[70][1] -> N (   15) [        70.0000]

               aRetModName[70][2] -> C (    7) [SIGAORG]

               aRetModName[70][3] -> C (   26) [Arquitetura Organizacional]

               aRetModName[70][4] -> L (    3) [.T.]

               aRetModName[70][5] -> C (    6) [ORGIMG]

          aRetModName[71] -> ARRAY (    5) [...]
               aRetModName[71][1] -> N (   15) [        71.0000]

               aRetModName[71][2] -> C (    7) [SIGALVE]

               aRetModName[71][3] -> C (   19) [Locação de Veículos]

               aRetModName[71][4] -> L (    3) [.F.]

               aRetModName[71][5] -> C (    6) [LVEIMG]

          aRetModName[72] -> ARRAY (    5) [...]
               aRetModName[72][1] -> N (   15) [        72.0000]

               aRetModName[72][2] -> C (    9) [SIGAPHOTO]

               aRetModName[72][3] -> C (    5) [Photo]

               aRetModName[72][4] -> L (    3) [.F.]

               aRetModName[72][5] -> C (    6) [PHOIMG]

          aRetModName[73] -> ARRAY (    5) [...]
               aRetModName[73][1] -> N (   15) [        73.0000]

               aRetModName[73][2] -> C (    7) [SIGACRM]

               aRetModName[73][3] -> C (   32) [Customer Relationship Management]

               aRetModName[73][4] -> L (    3) [.F.]

               aRetModName[73][5] -> C (    6) [CRMIMG]

          aRetModName[74] -> ARRAY (    5) [...]
               aRetModName[74][1] -> N (   15) [        74.0000]

               aRetModName[74][2] -> C (    7) [SIGABPM]

               aRetModName[74][3] -> C (   27) [Business Process Management]

               aRetModName[74][4] -> L (    3) [.T.]

               aRetModName[74][5] -> C (    6) [BPMIMG]

          aRetModName[75] -> ARRAY (    5) [...]
               aRetModName[75][1] -> N (   15) [        97.0000]

               aRetModName[75][2] -> C (    7) [SIGAESP]

               aRetModName[75][3] -> C (    9) [U_ESPNOME]

               aRetModName[75][4] -> L (    3) [.T.]

               aRetModName[75][5] -> C (    0) []

          aRetModName[76] -> ARRAY (    5) [...]
               aRetModName[76][1] -> N (   15) [        98.0000]

               aRetModName[76][2] -> C (    8) [SIGAESP1]

               aRetModName[76][3] -> C (   10) [U_ESP1NOME]

               aRetModName[76][4] -> L (    3) [.T.]

               aRetModName[76][5] -> C (    0) []

          aRetModName[77] -> ARRAY (    5) [...]
               aRetModName[77][1] -> N (   15) [        96.0000]

               aRetModName[77][2] -> C (    8) [SIGAESP2]

               aRetModName[77][3] -> C (   10) [U_ESP2NOME]

               aRetModName[77][4] -> L (    3) [.T.]

               aRetModName[77][5] -> C (    0) []

          aRetModName[78] -> ARRAY (    5) [...]
               aRetModName[78][1] -> N (   15) [        75.0000]

               aRetModName[78][2] -> C (    8) [SIGAAPON]

               aRetModName[78][3] -> C (   28) [Apontamento/Ponto Eletrônico]

               aRetModName[78][4] -> L (    3) [.F.]

               aRetModName[78][5] -> C (    0) []

          aRetModName[79] -> ARRAY (    5) [...]
               aRetModName[79][1] -> N (   15) [        76.0000]

               aRetModName[79][2] -> C (    8) [SIGAJURI]

               aRetModName[79][3] -> C (    7) [Sisjuri]

               aRetModName[79][4] -> L (    3) [.F.]

               aRetModName[79][5] -> C (    0) []

          aRetModName[80] -> ARRAY (    5) [...]
               aRetModName[80][1] -> N (   15) [        99.0000]

               aRetModName[80][2] -> C (    7) [SIGACFG]

               aRetModName[80][3] -> C (   12) [Configurador]

               aRetModName[80][4] -> L (    3) [.F.]

               aRetModName[80][5] -> C (    6) [CFGIMG]




aRetModName, Retornado pela função RetModName() e no meu exemplo, é um array multidimensional, em que a primeira dimensão contém 80 elementos. Cada elemento dessa primira dimensão é um outro Array de 5 elementos. Nesses cinco elementos podemos identificar: O Primeiro é o número do Módulo, o Segundo o Nome do Módulo, o Terceiro a Descrição do Módulo, o quarto um valor Lógico (não sei para que serve) e, finalmente o 5 ( o que nos interessa ) é o nome do arquivo de imagem a ser exibido. Observe que todos os Módulos, exceto o SIGAESP, SIGAESP1 e SIGAESP2 possuem um conteúdo para esse quinto elemento. Nosso objetivo será carregar a descrição da imagem para esses módulos.

Lembrando que, as imagens só serão carregadas se estiverem "compiladas" no repositório do Protheus, ela deverá ser um "Resouce" armazenado no RPO (não confunda RPO com Repositório de Imagens: O repositórios de Imagens é um arquivo no qual você, também, pode armazenar imagens do tipo jpeg ou bitmap). Para adicionar uma imagem no RPO do Protheus ela deverá ser adicionada a um projeto e "compilada" como se estivesse compilando um código fonte. Nesse caso você estará adicionando o "Resource"/Recurso ao Repositório. Como sei que tem que ser um recurso existente no RPO? Abri o inspetor de Objetos através do IDE e procurei as Imagens definidas no Array aRetModName e descobri que elas são uma imagem do tipo png. Observe as imagens que são utilizadas para o módulo SIGAVEI:

No Array aRetModName a imagem definida para o módulo SIGAVEI é: LVEIMG, mas não existe essa imagem no Repositório, mas sim:

  • LVEIMG16.PNG
  • LVEIMG16_MDI.PNG
  • LVEIMG16_OCEAN.PNG
  • LVEIMG32.PNG
  • LVEIMG32_MDI.PNG
  • LVEIMG32_OCEAN.PNG
Sendo assim, acredito eu que, internamente, o sistema irá carregar a imagem de acordo com a Resolução de Tela e de acordo com o Tema do Protheus. Então, para que possamos carregar uma imagem para os módulos específicos, deveremos ter os seguintes recursos no RPO:

Para o Módulo SIGAESP:

  • ESPIMG16.PNG
  • ESPIMG16_MDI.PNG
  • ESPIMG16_OCEAN.PNG
  • ESPIMG32.PNG
  • ESPIMG32_MDI.PNG
  • ESPIMG32_OCEAN.PNG

Para o Módulo SIGAESP1:


  • ESP1IMG16.PNG
  • ESP1IMG16_MDI.PNG
  • ESP1IMG16_OCEAN.PNG
  • ESP1IMG32.PNG
  • ESP1IMG32_MDI.PNG
  • ESP1IMG32_OCEAN.PNG

Para o Módulo SIGAESP2:


  • ESP2IMG16.PNG
  • ESP2IMG16_MDI.PNG
  • ESP2IMG16_OCEAN.PNG 
  • ESP2IMG32.PNG
  • ESP2IMG32_MDI.PNG
  • ESP2IMG32_OCEAN.PNG

 Bem, agora já sabemos onde e como as imagens dos módulos padrões são carregadas. Mas e para os específicos? Como proceder?
Primeiro: Adicione as imagens com os nomes acima sugeridos ao Repositório de Objetos do Protheus;
Segundo, e mais importante: use as funções abaixo para Carregar no Array aRetModulo, e na posição referente a Imagem, o nome do recurso a ser utilizado.

As funções serão as mesmas utilizadas para carregar o nome dos módulos, ou seja, usaremos os "Pontos de Entrada" U_ESPNome(), U_Esp1Nome()  e U_Esp2Nome(). Os modificaremos de forma a permitir que tenham acesso ao Array aRetModName de forma a alterar o seu conteúdo.

O recurso da linguagem que utilizei para isso foi o "Desvio" através do Tratamento de Erro. Sabendo que o Array que armazena os módulos, suas descrições e suas imagens é um array do tipo "Static" e, depurando passo a passo a entrada no sistema, que esse array é declarado no programa APLIB100.PRW, forcei um erro chamando uma função qualquer, existente no mesmo programa, no exemplo a ValGroup() (obtida também através do Inspetor de Objetos) passando um parâmetro inválido para ela. Através de GetFuncArr() pude perceber que o parâmetro de Entrada, esperado pela função, é um array, ao invés disso, passei uma string de forma a forçar um erro. Assim, no "desvio" para o tratamento de erro, pude obter acesso à variável "Static" aRetModName e alterar o seu conteúdo.


Complicado? Agora não mais.


Vamos o código:




Função: U_EspNome()

/*/
 Funcao:  U_EspNome
 Autor:  Marinaldo de Jesus 
 Data:  06/09/2010
 Descricao: Retorna a Descricao para o Modulo SIGAESP
/*/
User Function EspNome()

 Local aRetMod
 
 Local bError   := { || aRetMod := &(cError) }
 Local bSysErrorBlock := SysErrorBlock( bError )
 Local nESP     := 0
 
 Local cError   := "aRetModName"
 
 TRYEXCEPTION USING bError
  ValGroup("")
 ENDEXCEPTION 

 IF ( ValType( aRetMod ) == "A" )
  nESP := aScan( aRetMod , { |aModName| ( aModName[2] == "SIGAESP" ) } )
  IF ( nESP > 0 )
   //Substitua o Recurso "LVEIMG" para o Recurso Definido para esse modulo
   //Ex.: aRetMod[nESP][05] := "ESPIMG"
   aRetMod[nESP][05] := "LVEIMG"
  EndIF
 EndIF 

 SysErrorBlock( bSysErrorBlock )

Return( ProcName() ) //Informe a Descricao Real no lugar de ProcName()
       

Função: U_ESP1Nome()

/*/
 Funcao:  U_Esp1Nome
 Autor:  Marinaldo de Jesus 
 Data:  06/09/2010
 Descricao: Retorna a Descricao para o Modulo SIGAESP1
/*/
User Function Esp1Nome()

 Local aRetMod
 
 Local bError   := { || aRetMod := &(cError) }
 Local bSysErrorBlock := SysErrorBlock( bError )
 Local nESP     := 0
 
 Local cError   := "aRetModName"
 
 TRYEXCEPTION USING bError
  ValGroup("")
 ENDEXCEPTION 

 IF ( ValType( aRetMod ) == "A" )
  nESP := aScan( aRetMod , { |aModName| ( aModName[2] == "SIGAESP1" ) } )
  IF ( nESP > 0 )
   //Substitua o Recurso "LVEIMG" para o Recurso Definido para esse modulo
   //Ex.: aRetMod[nESP][05] := "ESPIMG"
   aRetMod[nESP][05] := "LVEIMG"
  EndIF
 EndIF 

 SysErrorBlock( bSysErrorBlock )

Return( ProcName() )//Informe a Descricao Real no lugar de ProcName()

       
Função: U_Esp2Nome()

/*/
 Funcao:  U_Esp2Nome
 Autor:  Marinaldo de Jesus 
 Data:  06/09/2010
 Descricao: Retorna a Descricao para o Modulo SIGAESP2
/*/
User Function Esp2Nome()

 Local aRetMod
 
 Local bError   := { || aRetMod := &(cError) }
 Local bSysErrorBlock := SysErrorBlock( bError )
 Local nESP     := 0
 
 Local cError   := "aRetModName"
 
 TRYEXCEPTION USING bError
  ValGroup("")
 ENDEXCEPTION 

 IF ( ValType( aRetMod ) == "A" )
  nESP := aScan( aRetMod , { |aModName| ( aModName[2] == "SIGAESP2" ) } )
  IF ( nESP > 0 )
   //Substitua o Recurso "LVEIMG" para o Recurso Definido para esse modulo
   //Ex.: aRetMod[nESP][05] := "ESP2IMG"
   aRetMod[nESP][05] := "LVEIMG"
  EndIF
 EndIF 

 SysErrorBlock( bSysErrorBlock )

Return( ProcName() ) //Informe a Descricao Real no lugar de ProcName()

       

Bem, agora cada ponto de entrada será responsável por, além de retornar o nome do módulo específico, alterar o array aRetModulo de forma a definir a imagem que será mostrada junto ao nome quando o acesso for via SIGAMDI.

Para obter o código de exemplo, basta clicar aqui.

Obs.: Cuidado ao alterar variáveis de uso exclusivo do sistema. Poderá ocasionar efeitos "catastróficos" se não tomar o devido cuidado e a devida atenção.


Dica: Utilize a Função Resource2File(cResourceName,cFileDest) para obter as imagens usadas para um deterninado módulo do sistema, no exemplo as do SIGAVEI, para criar imagens no mesmo padrão e tamanho. Ex.:


Resource2File( "LVEIMG16.PNG" , "c:\temp\LVEIMG16.PNG" )
Resource2File( "LVEIMG16_MDI.PNG, "c:\temp\LVEIMG16_MDI.PNG" )
Resource2File( "LVEIMG16_OCEAN.PNG, "c:\temp\LVEIMG16_OCEAN.PNG" )
Resource2File( "LVEIMG32.PNG, "c:\temp\LVEIMG32.PNG" )
Resource2File( "LVEIMG32_MDI.PNG, "c:\temp\LVEIMG32_MDI.PNG" )
Resource2File( "LVEIMG32_OCEAN.PNG, "c:\temp\LVEIMG32_OCEAN.PNG" )
       


Bem, é isso.

[]s
иαldσ dj


...

Comentários

  1. Cara,

    vou deixar de estudar pelo TDN e passar a vir mais aqui.

    Parabéns aí pelo site, seu conhecimento tem que ser compartilhado.

    Quero propor um tópico.
    Explicar minuciosamente a estrutura e como criar um arquivo [*.CH] usado nos includes "xCommand".

    ResponderExcluir
  2. Sérgio,

    O Conhecimento é um bem coletivo, e deve ser difundido.

    Sua sugestão está anotada e, em breve, publicarei todas as regras para a criação de um arquivo [*.CH] onde abordarei as diretivas #command, #xcommand, #translate, #xtranslate, ..., dentre outras que são usadas para pesquisa e substituições complexas pelo pré-processador.

    []s
    иαldσ dj

    ResponderExcluir
  3. anizio.cunha@totvs.com.br16 de maio de 2024 às 16:29

    Olá Naldo DJ.
    Estou aprendendo muito com seus posts. E queria, também, sugerir um: É possível alterar o Theme do Protheus para Dark?
    Obrigado por compartilhar seus conhecimentos.

    At.te

    ResponderExcluir

Postar um comentário

Postagens mais visitadas