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.