Vous êtes sur la page 1sur 11

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

Atualizao de RPO on the fly


Escrito por Marcus Sullivan Sex, 04 de Maro de 2011 02:04

Sumrio

O objetivo desse artigo documentar a soluo de sincronismo de RPOs que facilita a compilao shares dos Fontes do Protheus 10 no ambiente de Homologao e se estende ao ambiente de Produo Share pondo as alteraes disponveis aos usurios sem ter que parar o Protheus 10 ou solicitar que os usurios saiam do sistema. Observao: Sempre que houver alguma atualizao de patch, UPD, ou compilao de Share programas, essa deve ser executada no ambiente de homologao e somente depois de homologado pelo usurio, conforme fluxo descrito nesse documento, a alterao do ambiente de homologao deve ser replicada para o ambiente de produo - PROD Essa soluo foi originalmente criada pelo analista Marinaldo de Jesus (Empresa parceira da Totvs, IT) e, posteriormente, adaptada e documentada para utilizao num dos clientes TOTVS.

Pr-requisito para rodar scripts em PowerShell nos servidores Windows 2008

Por padro, para rodar scripts em Powershell necessrio que esse seja certificado. Mas, para facilitar o trabalho, iremos desabilitar essa necessidade abrindo o console do Powershell e executando o seguinte comando: Set-ExecutionPolicy Unrestricted Para verificar se o comando foi bem sucedido, basta executar, tambm no prompt do Powershell, o comando: get-executionpolicy

Configurando tarefa para rodar automticamente no servidor de Produo Para que o servidor de produo cheque se h RPO recente j homologado, necessrio configurar uma task no servidor de produo agendando para 12:30h e 18:30h (por serem horrios onde, normalmente, no h usurios acessando o Protheus, embora o acesso no seja impeditivo para essa operao). Executando a seguinte linha de comando: Powershell C:\Protheus10_PROD\bin\Scripts\syncApos.ps1 No servidor de teste foi feito o mesmo, mas no houve agendamento para que o analista de fbrica possa fazer manualmente, uma vez que no h uma regularidade de criao de RPOs de homologao para serem avaliados pelos usurios. A linha de comando similar de produo: Powershell C:\Protheus10_HLG\bin\Scripts\syncApos.ps1

1 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

Fluxo operacional da soluo de sincronismo de RPOs


Share

2 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

Ambiente HLG Servidor de Homologao


Share

Estrutura de diretrio que deve haver no servidor. Preparao do ambiente para utilizao dos Scripts

Diretrio do Protheus 10: C:\Protheus10_HLG\ Diretrio de desenvolvimento dos RPOs: C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_01, C:\Protheus10_HLG \apo\RPOsDesenv\Desenv_02, C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_03, C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_04 e C:\Protheus10_HLG \apo\RPOsDesenv\Desenv_05 Aps compilao dos fontes em ambiente COMPILACAO, o RPO disponibilizado no diretrio: C:\Protheus10_HLG\apo\CompHLG Aps a execuo do script de sincronismo dos RPOs o RPO compilado disponibilizado aos usurios para homologao atravs dos diretrios: C:\Protheus10_HLG\apo\RPOsHomolog\rpo00, C:\Protheus10_HLG \apo\RPOsHomolog\rpo01, C:\Protheus10_HLG\apo\RPOsHomolog\rpo02, C:\Protheus10_HLG\apo\RPOsHomolog\rpo03 e C:\Protheus10_HLG \apo\RPOsHomolog\rpo04 Uma vez homologado pelos usurios, o RPO deve ser copiado manualmente para o diretrio: C:\Protheus10_HLG\apo\CompPROD, para que, no prximo ciclo, o script copie este RPO para o servidor de produo e, em fim, chegue aos usurios finais. Ou, em caso de urgncia, o analista poder rodar o script manualmente no servidor de produo, atualizando, de imediato, o RPO de produo. Diretrio onde esto localizados os Scripts em PowerShell que faze o sincronismo dos RPOs: C:\Protheus10_HLG\bin\Scripts SaveCopyIni.ps1 Contedo: #Declara o diretrio de binrios do protheus 10 $PathBin $NameIniFile $CopyIniFile $CopyIniFiles = "C:\Protheus10_HLG\bin\" = "totvsappserver.ini" = "totvsappserver.copyini" = get-childitem -path $PathBin -include $NameIniFile -recurse seu contedo para o #Nome do arquivo de configurao do protheus 10 original #Nome do arquivo de configurao do protheus 10 que manipulamos #Comando para listar todos os arquivos totvsappserver.copyini #A cada totvsappserver.ini encontrado, copia totvsappserver.copyini original o sobrescrevendo foreach( $iniFile in $CopyIniFiles ) { $NewName = $iniFile.Name $NewName = $NewName.Replace($NameIniFile,$CopyIniFile) $IniDirectory = $iniFile.DirectoryName if ( !$IniDirectory.endsWith("\") ) { $IniDirectory+="\" } $NewPathFileIni = ( $IniDirectory + $NewName ) copy-item $iniFile.FullName $NewPathFileIni -force

3 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

syncApos.ps1 Contedo: Share #OBS: muito importante que a entrada SourcePath dos arquivos de configurao do protheus 10 tenham o ltimo caracter como sendo "\", indicando que um diretrio. Pois se no estiver dessa forma podem ser apresentadas mensagens de erro na execuo do Script. #Diretrio de origem do RPO compilado para Homologao $comphlg = "C:\Protheus10_HLG\apo\CompHLG" #Declara variveis a utilizar no tratamento do totvsappserver.copyini $find $pathbin $copyIniFile $rpospath $rposmatch $rpoName = "" = "C:\Protheus10_HLG\bin" = "totvsappserver.copyini" = "C:\Protheus10_HLG\apo\RPOsHomolog\" = get-childitem -path $rposPath = "tttp101.rpo" #Diretrio de binrios do Protheus 10 #Arquivo INI que ser trabalhado para alterao do RPO #Diretorio dos RPOs de destino, ou seja, o que se quer atualizar. Destino. #String de busca do sourcepath do arquivo INI #Arquivo RPO que ser copiado

#Chama o script que copia o totvsappserver.ini para totvsappserver.copyini Invoke-Expression -Command "$pathbin\Scripts\SaveCopyIni.ps1" #strings que vo ser utilizadas para verificar qual RPO o INI est apontando $find00 \\rpo00\\" $find01 \\rpo01\\" $find02 \\rpo02\\" $find03 \\rpo03\\" $find04 \\rpo04\\" = "sourcepath=C:\\Protheus10_HLG\\apo\\RPOsHomolog = "sourcepath=C:\\Protheus10_HLG\\apo\\RPOsHomolog = "sourcepath=C:\\Protheus10_HLG\\apo\\RPOsHomolog = "sourcepath=C:\\Protheus10_HLG\\apo\\RPOsHomolog = "sourcepath=C:\\Protheus10_HLG\\apo\\RPOsHomolog

$match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find00 -list #Cadeia de SE que checa se a string procurada est contida no INI e armazena na varivel $find que ser utilizada para alterar o sourcepath do arquivo totvsappserver.copyini if ( $match -match $find00 ) { $find \rpo01\" } else = $find00 $TargetFilePathRpoSync = "C:\Protheus10_HLG\apo\RPOsHomolog

4 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

{ $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find01 -list if ( $match -match $find01 )
Share

{ $find = $find01 $TargetFilePathRpoSync = "C:\Protheus10_HLG\apo\RPOsHomolog

\rpo02\" } else { $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find02 -list if ( $match -match $find02 ) { $find \apo\RPOsHomolog\rpo03\" } else { $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find03 -list if ( $match -match $find03 ) { $find \apo\RPOsHomolog\rpo04\" } else { $find \apo\RPOsHomolog\rpo00\" } } } } #Uma que no exista o caracter "\" no final do caminho de destino do RPO, inclui esse caracter if( !$TargetFilePathRpoSync.endsWith("\")) { $TargetFilePathRpoSync+="\" } #Adiciona a string SourcePath no incio do caminho de destino do RPO $replace = "SourcePath=" $replace += $TargetFilePathRpoSync $TargetFilePathRpoSync += $rpoName #Compe o caminho do RPO source, que ser utilizado para atualizar o diretrio destino $SourceFilePathRpoSync = $comphlg = $find04 $TargetFilePathRpoSync = "C:\Protheus10_HLG = $find03 $TargetFilePathRpoSync = "C:\Protheus10_HLG = $find02 $TargetFilePathRpoSync = "C:\Protheus10_HLG

5 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

if( !$SourceFilePathRpoSync.endsWith("\")) { $SourceFilePathRpoSync+="\"


Share

$SourceFilePathRpoSync += $rpoName #Testa se o RPO de destino no existe ou tem data de modificao inferior ao de origem. Nesse caso ento remove o RPO de destino, copia o RPO de origem no destino e altera o caminho no totvsappserver.copyini if(!(Test-Path $TargetFilePathRpoSync) $SourceFilePathRpoSync).lastWriteTime $TargetFilePathRpoSync).lastWriteTime)) { if(Test-Path $TargetFilePathRpoSync) { Remove-Item -Force $TargetFilePathRpoSync } #Esse o comando que copia efetivamente o RPO de origem para o caminho de destino copy-item $SourceFilePathRpoSync $TargetFilePathRpoSync -force #Essa a linha de comando que, utilizando as variveis trabalhadas anteriormente, substitui efetivamente o sourcepath nos arquivos totvsappserver.copyini get-childitem -path $pathbin -include $copyIniFile -recurse | % { (get-content $_) |% { $_ -replace $find,$replace } | set-content $_ -force } } #Chama o script que copia o totvsappserver.copyini para totvsappserver.ini Invoke-Expression -Command "$pathbin\Scripts\RestoreCopyIni.ps1" -or -gt ((get-item (get-item

RestoreCopyIni.ps1 Contedo: #Declara o diretrio de binrios do protheus 10 $PathBin $NameIniFile $CopyIniFile $CopyIniFiles = "C:\Protheus10_HLG\bin\" = "totvsappserver.ini" = "totvsappserver.copyini" = get-childitem -path $PathBin -include $CopyIniFile -recurse copia seu contedo para o #Nome do arquivo de configurao do protheus 10 original #Nome do arquivo de configurao do protheus 10 que manipulamos #Comando para listar todos os arquivos totvsappserver.copyini #A cada totvsappserver.copyini encontrado, totvsappserver.ini original o sobrescrevendo foreach( $iniFile in $CopyIniFiles ) { $NewName = $iniFile.Name $NewName = $NewName.Replace($CopyIniFile,$NameIniFile) $IniDirectory = $iniFile.DirectoryName if ( !$IniDirectory.endsWith("\") ) { $IniDirectory+="\" } $NewPathFileIni = ( $IniDirectory + $NewName )

6 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

copy-item $iniFile.FullName $NewPathFileIni -force }

Share

Ambiente PROD Servidor de Produo

Estrutura de diretrio que deve haver no servidor. Preparao do ambiente para utilizao dos Scripts

Diretrio do Protheus 10: C:\Protheus10_HLG\ Diretrio de desenvolvimento dos RPOs: C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_01, C:\Protheus10_HLG \apo\RPOsDesenv\Desenv_02, C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_03, C:\Protheus10_HLG\apo\RPOsDesenv\Desenv_04 e C:\Protheus10_HLG \apo\RPOsDesenv\Desenv_05 Aps a homologao dos usurios no ambiente de homologao, o novo RPO disponibilizado no caminho de rede (Que corresponde ao caminho C:\Protheus10_HLG\apo\CompPROD do servidor de HOMOLOGAO): \\SRVHOMOLOGACAO\compprod Aps a execuo do script de sincronismo dos RPOs o RPO compilado e homologado disponibilizado aos usurios no ambiente de produo do protheus atravs dos diretrios: C:\Protheus10_PROD\apo\RPOsProd\rpo00 C:\Protheus10_PROD\apo\RPOsProd\rpo01 C:\Protheus10_PROD\apo\RPOsProd\rpo02 C:\Protheus10_PROD\apo\RPOsProd\rpo03 e C:\Protheus10_PROD\apo\RPOsProd\rpo04 Diretrio onde esto localizados os Scripts em PowerShell que faze o sincronismo dos RPOs: C:\Protheus10_PROD\bin\Scripts SaveCopyIni.ps1 Contedo: #Declara o diretrio de binrios do protheus 10 $PathBin $NameIniFile $CopyIniFile $CopyIniFiles = "C:\Protheus10_PROD\bin\" = "totvsappserver.ini" = "totvsappserver.copyini" = get-childitem -path $PathBin -include $NameIniFile -recurse seu contedo para o #Nome do arquivo de configurao do protheus 10 original #Nome do arquivo de configurao do protheus 10 que manipulamos #Comando para listar todos os arquivos totvsappserver.copyini #A cada totvsappserver.ini encontrado, copia totvsappserver.copyini original o sobrescrevendo foreach( $iniFile in $CopyIniFiles ) { $NewName = $iniFile.Name $NewName = $NewName.Replace($NameIniFile,$CopyIniFile) $IniDirectory = $iniFile.DirectoryName if ( !$IniDirectory.endsWith("\") ) { $IniDirectory+="\"

7 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

} $NewPathFileIni = ( $IniDirectory + $NewName ) copy-item $iniFile.FullName $NewPathFileIni -force


Share

syncApos.ps1 Contedo: #OBS: muito importante que a entrada SourcePath dos arquivos de configurao do protheus 10 tenham o ltimo caracter como sendo "\", indicando que um diretrio. Pois se no estiver dessa forma podem ser apresentadas mensagens de erro na execuo do Script. #Mapeia unidade de rede que ser utilizada para cpia do RPO #Declara variveis a utilizar no mapeamento da unidade de rede $unidade = "x:" $compprod = "\\SRVHOMOLOCACAO\compprod" $netuser = "administrador" $netpass = "SENHAUSUARIOADMINISTRADOR" #Instancia o objeto $net = new-object -ComObject WScript.Network #Checa se j existe alguma unidade X mapeada e remove if (Get-PSDrive -PSProvider filesystem| Select-String -SimpleMatch "x") { write-host "Incio do script. Removendo unidade mapaeada X:" $net.removenetworkdrive($unidade) } $net.MapNetworkDrive($unidade, $compprod, $false, $netuser, $netpass) #Declara variveis a utilizar no tratamento do totvsappserver.copyini $find = "" #Diretrio de binrios do Protheus 10 $pathbin = "C:\Protheus10_PROD\bin" #Arquivo INI que ser trabalhado para alterao do RPO $copyIniFile = "totvsappserver.copyini" #Diretorio dos RPOs de destino, ou seja, o que se quer atualizar. Destino. $rpospath = "C:\Protheus10_PROD\apo\RPOsProd\" #String de busca do sourcepath do arquivo INI $rposmatch = get-childitem -path $rposPath #Arquivo RPO que ser copiado $rpoName = "tttp101.rpo" #Chama o script que copia o totvsappserver.ini para totvsappserver.copyini Invoke-Expression -Command "$pathbin\Scripts\SaveCopyIni.ps1" #strings que vo ser utilizadas para verificar qual RPO o INI est apontando $find00 = "sourcepath=C:\\Protheus10_PROD\\apo\\RPOsProd\\rpo00\\" $find01 = "sourcepath=C:\\Protheus10_PROD\\apo\\RPOsProd\\rpo01\\" $find02 = "sourcepath=C:\\Protheus10_PROD\\apo\\RPOsProd\\rpo02\\" $find03 = "sourcepath=C:\\Protheus10_PROD\\apo\\RPOsProd\\rpo03\\"

8 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

$find04 = "sourcepath=C:\\Protheus10_PROD\\apo\\RPOsProd\\rpo04\\" $match = get-childitem -path $pathbin -include $copyIniFile -recurse | selectstring $find00 -list
Share

#Cadeia de SE que checa se a string procurada est contida no INI e armazena na varivel $find que ser utilizada para alterar o sourcepath do arquivo totvsappserver.copyini if ( $match -match $find00 ) $find = $find00 $TargetFilePathRpoSync = "C:\Protheus10_PROD\apo\RPOsProd\rpo01\" } else { $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find01 -list if ( $match -match $find01 ) { $find = $find01 $TargetFilePathRpoSync = "C:\Protheus10_PROD\apo\RPOsProd \rpo02\" } else { $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find02 -list if ( $match -match $find02 ) { $find = $find02 $TargetFilePathRpoSync = "C:\Protheus10_PROD \apo\RPOsProd\rpo03\" } else { $match = get-childitem -path $pathbin -include $copyIniFile -recurse | select-string $find03 -list if ( $match -match $find03 ) { $find = $find03 $TargetFilePathRpoSync = "C:\Protheus10_PROD \apo\RPOsProd\rpo04\" } else { $find = $find04 $TargetFilePathRpoSync = "C:\Protheus10_PROD \apo\RPOsProd\rpo00\" } } } }

9 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

#Uma que no exista o caracter "\" no final do caminho de destino do RPO, inclui esse caracter if( !$TargetFilePathRpoSync.endsWith("\"))
Share

$TargetFilePathRpoSync+="\"

#Adiciona a string SourcePath no incio do caminho de destino do RPO $replace = "SourcePath=" $replace += $TargetFilePathRpoSync $TargetFilePathRpoSync += $rpoName #Compe o caminho do RPO source, que ser utilizado para atualizar o diretrio destino $SourceFilePathRpoSync = $compprod if( !$SourceFilePathRpoSync.endsWith("\")) { $SourceFilePathRpoSync+="\" } $SourceFilePathRpoSync += $rpoName #Testa se o RPO de destino no existe ou tem data de modificao inferior ao de origem. Nesse caso ento remove o RPO de destino, copia o RPO de origem no destino e altera o caminho no totvsappserver.copyini if(!(Test-Path $TargetFilePathRpoSync) $SourceFilePathRpoSync).lastWriteTime $TargetFilePathRpoSync).lastWriteTime)) { if(Test-Path $TargetFilePathRpoSync) { Remove-Item -Force $TargetFilePathRpoSync } #Esse o comando que copia efetivamente o RPO de origem para o caminho de destino copy-item $SourceFilePathRpoSync $TargetFilePathRpoSync -force #Essa a linha de comando que, utilizando as variveis trabalhadas anteriormente, substitui efetivamente o sourcepath nos arquivos totvsappserver.copyini get-childitem -path $pathbin -include $copyIniFile -recurse | % { (get-content $_) |% { $_ -replace $find,$replace } | set-content $_ -force } } #Chama o script que copia o totvsappserver.copyini para totvsappserver.ini Invoke-Expression -Command "$pathbin\Scripts\RestoreCopyIni.ps1" -or -gt ((get-item (get-item

#Checa se a unidade j esta mapeada e remove if (Get-PSDrive -PSProvider filesystem| Select-String -SimpleMatch "x") { write-host "Fim do Script. Removendo unidade mapaeada" $net.removenetworkdrive($unidade) }

10 de 11

31/03/2011 22:13

Atualizao de RPO on the fly

http://marcussoft.com.br/site/index.php?view=article&catid=3:artigos...

RestoreCopyIni.ps1 Contedo: #Declara o diretrio de binrios do protheus 10


Share

$PathBin $NameIniFile $CopyIniFile $CopyIniFiles

= "C:\Protheus10_PROD\bin\" = "totvsappserver.ini" = "totvsappserver.copyini" = get-childitem -path $PathBin -include $CopyIniFile -recurse copia seu contedo para o

#Nome do arquivo de configurao do protheus 10 original #Nome do arquivo de configurao do protheus 10 que manipulamos #Comando para listar todos os arquivos totvsappserver.copyini #A cada totvsappserver.copyini encontrado, totvsappserver.ini original o sobrescrevendo foreach( $iniFile in $CopyIniFiles ) { $NewName = $iniFile.Name $NewName = $NewName.Replace($CopyIniFile,$NameIniFile) $IniDirectory = $iniFile.DirectoryName if ( !$IniDirectory.endsWith("\") ) { $IniDirectory+="\" } $NewPathFileIni = ( $IniDirectory + $NewName ) copy-item $iniFile.FullName $NewPathFileIni -force }
ltima atualizao em Sex, 04 de Maro de 2011 03:00

11 de 11

31/03/2011 22:13

Vous aimerez peut-être aussi