Hoje vou mostrar duas ferramentas para atualização do RPO a quente via AdvPL.
Há muito tempo atrás, nós criamos uma ferramenta para atualização do RPO a quente, via Java (veja clicando aqui).
Pois bem, recentemente o Serinhano me chamou no Skype, e pediu para eu compartilhar duas soluções que ele fez, via o próprio AdvPL.
Solução 1: Atualizar RPO a quente via AdvPL (aturpo.prw)
//-------------------------------------------------------------------------------------// // Alexandre Serinhano //-------------------------------------------------------------------------------------// User Function ATURPO() Local aPORTAS := {} //{6234,6235,6236,6237,6240,6241,6242,6243,6244,6245,6247,6280,8085} //SRV FULL Local cRpcServer := "localhost" Local aRetorno := {} Local cRPCEnv := '' Local nOpca := 0 Local oServer Local aARQ,cPORTAS,cTIPO,SourcePath Local aOrd := {"0=Desliga Update SmartClient","1=Liga Update SmartClient","3=Atualizar SourcePath do RPO"} /* Criar o arquivo _SourcePath.TXT com o conteudo abaixo dentro do PROTHEUS_DATA 3|{6235,6236,6240,6241,6242,6243,6244,6245,6247,8085}|E:\Totvs\producao\protheus\apo\20171126 */ //Vai verificar se existe o arquivo de configurações IF FILE("\_SourcePath.TXT") aARQ := SEPARA(MemoRead("\_SourcePath.TXT"),"|",.T.) cTIPO := aARQ[1] cPORTAS := PADR(aARQ[2],100) cRPCEnv := PADR(aARQ[3],25) //Ambiente SourcePath := PADR(aARQ[4],80) ELSE cTIPO := SPACE(1) cPORTAS := SPACE(100) cRPCEnv := SPACE(25) //Ambiente SourcePath := SPACE(80) ENDIF //Irá criar a janelas com os parâmetros DEFINE MSDIALOG oDlg FROM 000,000 TO 250,600 TITLE "Informe os Paramentros: " PIXEL STYLE DS_MODALFRAME DEFINE FONT oFont1 NAME "Ms Sans Serif" BOLD oDlg:lEscClose := .F. //DESABILITA ESC //Labels e variáveis @ 010,005 Say "Tipo: " OF oDlg PIXEL FONT oFont1 @ 010,050 COMBOBOX oCBX VAR cTIPO ITEMS aOrd VALID !EMPTY(cTIPO) SIZE 165,44 Pixel OF oDlg FONT oFont1 @ 030,005 Say "Portas SRV: " OF oDlg PIXEL FONT oFont1 @ 030,050 Get cPORTAS Picture "@!" VALID !EMPTY(cPORTAS) SIZE 200, 60 @ 050,005 Say "Ambiente: " OF oDlg PIXEL FONT oFont1 @ 050,050 Get cRPCEnv VALID !EMPTY(cRPCEnv) SIZE 080, 60 @ 050,135 Say "(ENVIRONMENT)" OF oDlg PIXEL FONT oFont1 @ 070,005 Say "SourcePath: " OF oDlg PIXEL FONT oFont1 @ 070,050 Get SourcePath VALID !EMPTY(SourcePath) SIZE 200, 60 //Botões DEFINE SBUTTON FROM 095,120 TYPE 1 ACTION (nOpca := 1,oDlg:End()) ENABLE OF oDlg DEFINE SBUTTON FROM 095,150 TYPE 2 ACTION oDlg:End() ENABLE OF oDlg ACTIVATE MSDIALOG oDlg CENTERED //Se a tela foi confirmada If nOpca != 0 //Atualiza o arquivo com configurações cTIPO := ALLTRIM(cTIPO) cPORTAS := ALLTRIM(cPORTAS) aPORTAS := &(cPORTAS) cRPCEnv := ALLTRIM(cRPCEnv) //Ambiente SourcePath := ALLTRIM(SourcePath) MemoWrite("\_SourcePath.TXT",cTIPO+"|"+cPORTAS+"|"+cRPCEnv+"|"+SourcePath) ConOut(REPL("#",62)) ConOut("#"+PADC("",60)+"#") ConOut("#"+PADC(aOrd[ASCAN(aOrd, cTIPO)],60)+"#") ConOut("#"+PADC("Inicio! ATURPO ["+TIME()+"]",60)+"#") ConOut(REPL("#",62)) //Percorre as portas For I:= 1 To Len(aPORTAS) nRPCPort := aPORTAS[I] ConOut("Tentando estabelecer comunicacao com o Server "+cRPCServer+"/"+cVALTOCHAR(nRPCPort)) //Tentando se conectar oServer := TRPC():New( GetEnvServer() ) If oServer:Connect( cRpcServer, nRPCPort ) ConOut("Conexao estabelecida com o servidor ") //Atualizando arquivos com novas referências cSERVICE := ALLTRIM(oServer:CallProc("GetPvProfString",'SERVICE','DISPLAYNAME','', GetADV97())) If cTIPO == '0' .OR. cTIPO == '1' oServer:CallProc("WritePProString",'UPDATE','PATHWINDOWS','E:\Totvs\producao\protheus\bin\upd_smartclient', GetADV97()) oServer:CallProc("WritePProString",'UPDATE','ENABLE',cTIPO, GetADV97()) ConOut("Atualizando ...") ElseIf cTIPO == '3' oServer:CallProc("WritePProString",cRPCEnv,'SourcePath',SourcePath, GetADV97()) ConOut("Atualizando ...") EndIf ConOut("Desconectando "+cSERVICE) oServer:Disconnect() Else ConOut("Nao foi possivel estabelecer conexao com o servidor") EndIf Next I ConOut(REPL("#",62)) ConOut("#"+PADC("",60)+"#") ConOut("#"+PADC(aOrd[ASCAN(aOrd,cTIPO)],60)+"#") ConOut("#"+PADC("Fim! ATURPO ["+TIME()+"]",60)+"#") ConOut(REPL("#",62)) EndIf Return
Solução 2: Atualizar RPO a quente via AdvPL em clientes Cloud (aturpo1.prw)
//-------------------------------------------------------------------------------------// // Alexandre Serinhano //-------------------------------------------------------------------------------------// User Function ATURPO1() Local aPORTAS := {} //{6234,6235,6236,6237,6240,6241,6242,6243,6244,6245,6247,6280,8085} //SRV FULL Local cRpcServer := "localhost" Local lContinua := .T. Local aRetorno := {} Local cRPCEnv := '' Local nOpca := 0 Local oServer Local aARQ,cPORTAS,cTIPO,SourcePath Local aOrd := {"0=Desliga Update SmartClient","1=Liga Update SmartClient","3=Atualizar SourcePath do RPO"} /* Criar o arquivo _SourcePath.TXT com o conteudo abaixo dentro do PROTHEUS_DATA 3|{6235,6236,6240,6241,6242,6243,6244,6245,6247,8085}|E:\Totvs\producao\protheus\apo\20171126 */ //Vai verificar se existe o arquivo de configurações IF FILE("\_SourcePath.TXT") aARQ := SEPARA(MemoRead("\_SourcePath.TXT"),"|",.T.) cTIPO := aARQ[1] cPORTAS := PADR(aARQ[2],100) cRPCEnv := PADR(aARQ[3],25) //Ambiente SourcePath := PADR(aARQ[4],80) //VarInfo("",cTIPO) ELSE cTIPO := SPACE(1) cPORTAS := SPACE(100) cRPCEnv := SPACE(25) //Ambiente SourcePath := SPACE(80) ENDIF //Irá criar a janelas com os parâmetros DEFINE MSDIALOG oDlg FROM 000,000 TO 250,600 TITLE "Informe os Paramentros: " PIXEL STYLE DS_MODALFRAME DEFINE FONT oFont1 NAME "Ms Sans Serif" BOLD oDlg:lEscClose := .F. //DESABILITA ESC @ 010,005 Say "Tipo: " OF oDlg PIXEL FONT oFont1 @ 010,050 COMBOBOX oCBX VAR cTIPO ITEMS aOrd VALID !EMPTY(cTIPO) SIZE 165,44 Pixel OF oDlg FONT oFont1 @ 030,005 Say "Portas SRV: " OF oDlg PIXEL FONT oFont1 @ 030,050 Get cPORTAS Picture "@!" VALID !EMPTY(cPORTAS) SIZE 200, 60 @ 050,005 Say "Ambiente: " OF oDlg PIXEL FONT oFont1 @ 050,050 Get cRPCEnv VALID !EMPTY(cRPCEnv) SIZE 080, 60 @ 050,135 Say "(ENVIRONMENT)" OF oDlg PIXEL FONT oFont1 @ 070,005 Say "SourcePath: " OF oDlg PIXEL FONT oFont1 @ 070,050 Get SourcePath /*VALID !EMPTY(SourcePath)*/ SIZE 200, 60 DEFINE SBUTTON FROM 095,120 TYPE 1 ACTION (nOpca := 1,oDlg:End()) ENABLE OF oDlg DEFINE SBUTTON FROM 095,150 TYPE 2 ACTION oDlg:End() ENABLE OF oDlg ACTIVATE MSDIALOG oDlg CENTERED //Se a tela foi confirmada If nOpca != 0 //Atualiza o arquivo com configurações cTIPO := ALLTRIM(cTIPO) cPORTAS := ALLTRIM(cPORTAS) aPORTAS := &(cPORTAS) cRPCEnv := ALLTRIM(cRPCEnv) //Ambiente SourcePath := ALLTRIM(SourcePath) MemoWrite("\_SourcePath.TXT",cTIPO+"|"+cPORTAS+"|"+cRPCEnv+"|"+SourcePath) ConOut(REPL("#",62)) ConOut("#"+PADC("",60)+"#") ConOut("#"+PADC(aOrd[ASCAN(aOrd, cTIPO)],60)+"#") ConOut("#"+PADC("Inicio! ATURPO ["+TIME()+"]",60)+"#") ConOut(REPL("#",62)) lContinua := .T. //Percorre as portas FOR I:= 1 TO LEN(aPORTAS) nRPCPort := aPORTAS[I] ConOut("Analisando a existencia do AMBIENTE "+cRPCEnv+"/"+cVALTOCHAR(nRPCPort)) //Tentando se conectar oServer := TRPC():New( GetEnvServer() ) If oServer:Connect( cRpcServer, nRPCPort ) //Verificando existência do ambiente nos arquivos cSERVICE := ALLTRIM(oServer:CallProc("GetPvProfString",'SERVICE','DISPLAYNAME','', GetADV97())) cRET := oServer:CallProc("GetPvProfString",cRPCEnv , "SourcePath" , "ERROR" , GetAdv97() ) IF cRET == "ERROR" lContinua := .F. Aviso( "Atenção:",; "Nao foi encontrado o ambiente "+cRPCEnv+" na Portal "+cVALTOCHAR(nRPCPort)+" no serviço "+cSERVICE,; { "&Fechar" },,"By Serinhano" ) ELSE ConOut("AMBIENTE "+cRPCEnv+" encontrado no "+cSERVICE) ENDIF oServer:Disconnect() Else lContinua := .F. Aviso( "Atenção",; "Nao foi possivel estabelecer conexao com o servidor na Portal "+cVALTOCHAR(nRPCPort)+" do serviço "+cSERVICE,; { "&Fechar" },,"By Serinhano" ) EndIf NEXT I IF lContinua //Se tiver em branco o parâmetro, cria as configurações IF EMPTY(SourcePath) I := 0 aDIR := {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"} cPATCH_D := 'E:\Totvs\producao\protheus\apo\desenv\' //RPO Padrão cPATCH_P := 'E:\Totvs\producao\protheus\apo\'+cRPCEnv+'\' cDATA := DTOS(DATE()) lDATA := .T. WHILE lDATA cPATCH_PF := cPATCH_P+DTOS(DATE())+IIF(I>0,aDIR[I],'')+'\' IF !ExistDir(cPATCH_PF) WFForceDir(cPATCH_PF) //Forca a criacao de diretorio e seus subdiretorios caso nao venham existir. lDATA := .F. ENDIF I++ ENDDO FWMsgRun(,{||lContinua := (_copyfile(cPATCH_D+'tttp120.rpo',cPATCH_PF+'tttp120.rpo'))},"Backup do Repositório de Dados.","Realizando Backup do RPO...") SourcePath := cPATCH_PF ENDIF //Se tudo tiver certo IF lContinua //Percorre as portas FOR I:= 1 TO LEN(aPORTAS) nRPCPort := aPORTAS[I] ConOut("Tentando estabelecer comunicacao com o Server "+cRPCServer+"/"+cVALTOCHAR(nRPCPort)) //Tenta realizar a conexão oServer := TRPC():New( GetEnvServer() ) If oServer:Connect( cRpcServer, nRPCPort ) ConOut("Conexao estabelecida com o servidor ") cSERVICE := ALLTRIM(oServer:CallProc("GetPvProfString",'SERVICE','DISPLAYNAME','', GetADV97())) //Atualiza os dados IF cTIPO == '0' .OR. cTIPO == '1' oServer:CallProc("WritePProString",'UPDATE','PATHWINDOWS','E:\Totvs\producao\protheus\bin\upd_smartclient', GetADV97()) oServer:CallProc("WritePProString",'UPDATE','ENABLE',cTIPO, GetADV97()) ConOut("Atualizando ...") ELSEIF cTIPO == '3' oServer:CallProc("WritePProString",cRPCEnv,'SourcePath',SourcePath, GetADV97()) ConOut("Atualizando ...") ENDIF ConOut("Desconectando "+cSERVICE) oServer:Disconnect() Else ConOut("Nao foi possivel estabelecer conexao com o servidor") EndIf NEXT I ELSE Aviso( "Atenção",; "Error ao copiar o RPO",; { "&Fechar" },,"By Serinhano" ) ENDIF ENDIF MemoWrite("\_SourcePath.TXT",cTIPO+"|"+cPORTAS+"|"+cRPCEnv+"|"+SourcePath) ConOut(REPL("#",62)) ConOut("#"+PADC("",60)+"#") ConOut("#"+PADC(aOrd[ASCAN(aOrd,cTIPO)],60)+"#") ConOut("#"+PADC("Fim! ATURPO ["+TIME()+"]",60)+"#") ConOut(REPL("#",62)) EndIf Return
Os códigos fontes e documentação foram enviados por Alexandre Serinhano.
Bom pessoal, por hoje é só.
Abraços e até a próxima.