Funções para atualizar RPO a quente via AdvPL

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.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

Deixe uma resposta