Inno Setup (Parte 5): Configurando o PostgreSQL

Categoria: Tutoriais
Categoria Pai: Addicted 2 Delphi!
Acessos: 9621
Página anterior do tutorial atual Primeira página do tutoria altual Próxima página do tutorial atual
Imagem meramente ilustrativa

Nesta parte do tutorial eu pretendo automatizar aquilo que eu expliquei no artigo Instalação e configuração manual do PostgreSQL no Windows. Se você não leu este artigo ainda, eu recomendo fortemente que você o faça agora. Isso vai ajudar no entendimento desta parte do tutorial pois eu não vou explicar detalhes que eu expliquei naquele artigo. Se você já o leu, sinta-se à vontade para continuar. Esta parte do tutorial vai automatizar os passos 4, 5 e 6 do referido artigo, pois os passos de 1 a 3 já foram cobertos na parte 3 deste tutorial.

Não se assuste com o tamanho desta parte do tutorial, ela é maior mesmo por conta da quantidade maior de detalhes e explicações que eu terei de dar, mas no fim das contas tudo é bem simples. É extenso porque é didático.

RemObjects Pascal Script

O Inno Setup possui integrado em si mesmo a engine de scripts conhecida como Pascal Script, da RemObjects (http://www.remobjects.com/ps.aspx). Com esta engine é possível estender as possibilidades do Inno Setup tornando-o muito mais flexível. Como o próprio nome sugere, o Pascal Script é uma engine que usa o Pascal como linguagem de programação. Em suma, se você está habituado com o Delphi (e eu vou considerar que sim) não terá qualquer problema para utilizar o Pascal Script, por isso não vou me aprofundar ou explicar nada da sintaxe básica, me limitando a apenas escrever código e explicar o mínimo necessário para seu entendimento. O Pascal Script começará a ser usado mais adiante nesta parte do tutorial para flexibilizar e estender o Inno Setup.

Arquivos adicionais necessários

Quero pedir desculpas àqueles que leram, tentaram executar os passos do artigo sobre a instalação manual do PostgreSQL, mas receberam um erro sobre a falta de bibliotecas MSVC*.dll. Eu esqueci de mencionar no artigo a respeito das bibliotecas de runtime da Microsoft necessárias para a execução do PostgreSQL e só me dei conta da falta de menção a elas quando testei o instalador durante a elaboração deste tutorial. Antes tarde do que nunca, eu incluí nos fontes (anexados a este artigo), as DLLs necessárias. O script do Inno Setup (ZOISE.iss) também já foi atualizado para incluir e instalar estas duas DLLs dentro da pasta bin do PostgreSQL. Recomendo fortemente que você abra o script, vá até a seção files e veja como estão configuradas as DLLs msvcr120.dll e msvcp120.dll.

Você já tem conhecimento suficiente para entender como incluir arquivos na instalação do Inno Setup. A única diferença destes dois arquivos para os demais arquivos do PostgreSQL é que eles não são externos, isto é, eles serão comprimidos junto ao executável do instalador, serão extraídos durante a instalação e copiados para a máquina de destino, justamente como é feito com o executável principal (InstaladoPeloInnoSetup.exe). Tal como os demais arquivos do PostgreSQL, estes dois estão associados ao componente PostgreSQL (aba Components da janela File Properties. Execute um duplo clique em cima de cada arquivo para ver a janela File Properties.

Gostaria de ressaltar também que, dependendo de qual versão de PostgreSQL você vá instalar, estas bibliotecas mudam, seja a versão (o número que existem em seus nomes), seja a "bitagem" (32 ou 64 bits). As versões que eu incluí nos fontes do instalador são para o PostgreSQL 10.1.3 (32 bits).


Algumas pastas necessárias

Precisamos alterar nosso script, instruindo-o para que ele crie duas pastas. Isso será um ótimo motivo para explicar rapidamente como criar pastas vazias no Inno Setup. As pastas são, a pasta data e a pasta log. Para criar uma pasta vazia, clique no item Directories do TreeView Sections e clique em New Item:

Na tela Directory Properties, na aba Details, certifique-se de que os campos Name e Destination Dir estejam definidos exatamente como na tela acima. Clique na aba Components e marque apenas o item PostgreSQL. Isso fará com que a pasta só seja criada caso tenhamos escolhido instalar o PostgreSQL. Clique na aba Tasks e marque apenas o item PGConfig. Isso fará com que a pasta só seja criada caso tenhamos escolhido a tarefa de configurar o PostgreSQL.

Recapitulando partes passadas desse tutorial, pense nos componentes e nas tarefas como condições de um IF. O objetivo da tela é criar uma pasta vazia, mas isso só será feito se o componente especificado tiver sido selecionado E SE a tarefa especificada tiver sido selecionada, ambos, durante a instalação, pelo usuário.

Realize o mesmo procedimento acima para a pasta log, claro, substituindo apenas o campo Name, pois ambas as pastas, log e data, estão dentro da mesma pasta ({app}\pg). Ao final, você verá a tela do Inno Script Studio da seguinte forma:

Após instruir o Inno Setup a criar as duas pastas, precisamos definir as permissões que estas pastas precisam ter na máquina de destino. Isso não é um passo necessário normalmente, mas como vamos executar comandos que manipulam estas duas pastas a partir do instalador, precisaremos dar permissões irrestritas aos usuários autenticados. Eu confesso que não entendo bem como esse sistema de permissões funciona. O fato é que a configuração do PostgreSQL só será bem sucedida se ao menos a pasta data tiver permissões mais relaxadas. A pasta log não precisaria de tais permissões, mas por garantia aplicaremos as mesmas permissões às duas pastas. Sem mais delongas, selecione as duas pastas criadas, clique com o botão direito do mouse em qualquer uma delas e clique em Item properties. Na tela Directory Properties vá diretamente a aba Advanced e selecione no combobox Permissions a opção Bult-in Users group - Full, tal como é visto na imagem abaixo:

Certifique-se de que não alterou nenhuma outra propriedade e clique o botão OK para confirmar a aplicação da opção de permissões em ambas as pastas que serão criadas. Se você quiser, após clicar OK, você pode dar duplo clique em cada uma das pastas e comprovar que a opção que selecionamos para o combobox Permissions foi configurada em cada uma delas.


Comandos para configurar o PostgreSQL

A primeira coisa a ser feita para configurar o PostgreSQL é a inicialização da sua pasta data com a estrutura interna de pastas e arquivos usados por ele. Para isso, precisamos instruir o Inno Setup a executar o seguinte comando:

initdb -U postgres -A password -E utf8 -W -D "X:\caminho\da\pasta\data"

Este comando foi executado com sucesso no artigo Instalação e configuração manual do PostgreSQL no WindowsX:\caminho\da\pasta\data é o local da pasta data, claro, e isso será facilmente conseguido como veremos mais adiante. O problema desse comando é que ele solicita a senha do superusuário de forma interativa no prompt de comando (após executar o comando a senha é solicitada) e como agora precisamos executar um comando completo, incluindo a senha do superusuário e sem interação, este comando precisa ser alterado. Após algumas consultas eu descobri o comando que permite isso:

initdb -U postgres -A password -E utf8 -D "X:\caminho\da\pasta\data" --pwfile="x:\caminho\do\arquivo\senha.xyz"

Este comando é praticamente o mesmo comando anterior. A diferença é que eu removi o parâmetro -W, que era responsável pela solicitação interativa da senha e incluí o parâmetro --pwdfile que é o responsável por indicar um arquivo que conterá a senha pretendida para o superusuário. Este novo comando então tem duas "variáveis" distintas. A primeira é o caminho da pasta data na máquina de destino e a segunda é o caminho do arquivo que conterá a senha do superusuário, também na maquina de destino, já que esse arquivo de senha será criado pelo nosso instalador em tempo de execução do mesmo.

A pasta data fica dentro da pasta pg, a qual já é instalada pelo nosso instalador (vide parte 3 deste tutorial). A pasta pg, por sua vez, está sendo criada dentro da pasta de instalação do nosso programa principal, a qual é, por definição, sempre a constante {app}, a qual será expandida no momento da instalação de forma a representar de fato o diretório onde os arquivos estão sendo instalados. Sendo assim, a primeira "variável" do comando deverá ser {app}\pg\data.

O arquivo que conterá a senha do superusuário não será de fato instalado na máquina de destino. Ele será usado (criado e modificado) durante a instalação apenas para configurar o PostgreSQL e precisa ser descartado ao final da mesma. Arquivos que são usados durante a instalação apenas, são considerados arquivos temporários da instalação.

Quando o instalador do Inno Setup é iniciado ele coloca alguns arquivos temporários no sistema do cliente, dentro de uma subpasta da pasta de arquivos temporários e existe uma constante específica para isso, trata-se da constante {tmp}. Arquivos criados dentro do diretório representado por {tmp} serão excluídos quando a instalação acabar, logo, ele é o local perfeito para incluir arquivos temporários da nossa instalação. Sendo assim, a segunda "variável" do comando deverá ser {tmp}\senha.xyz. O nome do arquivo (senha.xyz) pode ser qualquer um, pois nós o iremos criar. Para manter o tutorial simples, eu vou criar uma arquivo de nome senha.xyz mesmo.

Por fim, o nosso comando de inicialização do PostgreSQL será o seguinte:

initdb -U postgres -A password -E utf8 -D "{app}\pg\data" --pwfile="{tmp}\senha.xyz"

O segundo comando a ser executado é aquele que, de fato, instala o serviço do PostgreSQL, o qual pode ser visto abaixo:

pg_ctl register -N "InnoSetupPG" -U "NT AUTHORITY\NetworkService" -D "X:\caminho\da\pasta\data" -w -o "-p 5400"

Neste comando há apenas uma "variável" a ser manipulada por enquanto[1], trata-se do caminho para a pasta data e tal como no comando anterior, o caminho da pasta data será {app}\pg\data, logo, o comando final, pronto para ser executado pelo instalador será:

pg_ctl register -N "InnoSetupPG" -U "NT AUTHORITY\NetworkService" -D "{app}\pg\data" -w -o "-p 5400"

No comando acima, o parâmetro -o "-p 5400" define em qual porta o PostgreSQL vai escutar as requisições. A porta padrão do PostgreSQL é a 5432. Eu utilizei uma porta não padrão de forma que a configuração do PostgreSQL usando o instalador deste tutorial seja bem sucedida na maioria dos sistemas, pois dificilmente alguém utilizou a porta 5400. Caso já haja algum serviço escutando nesta porta, considere trocar este número por outro, do contrário a inicialização do serviço do PostgreSQL falhará, e por falar em inicialização do serviço, abaixo nós podemos ver a terceira coisa a ser feita para finalizar a configuração do PostgreSQL. Trata-se da inicialização do seu serviço:

net start InnoSetupPG

Este é um comando net do Windows com o qual se pode manipular serviços instalados. Caso o PostgreSQL tenha sido configurado corretamente, a execução desse serviço será bem sucedida e o PostgreSQL estará apto a receber conexões. Neste comando, InnoSetupPG é o nome do serviço, o qual foi definido no parâmetro -N do comando anterior (pg_ctl).


Um simples script pascal

O primeiro comando mostrado na seção anterior necessita de um arquivo que contém a senha do superusuário do PostgreSQL, portanto, precisamos criar este arquivo com a senha pretendida. Este arquivo precisa estar disponível antes do início da configuração do PostgreSQL, logo, ele precisa existir antes da execução do primeiro comando da seção anterior.

Dois problemas precisam ser resolvidos. O primeiro é como criar um arquivo a partir do Inno Setup. O segundo seria como como fazer isso ANTES que o primeiro comando de configuração seja executado. A resposta a estas duas perguntas é: usando o Pascal Script.

O Pascal Script que iremos utilizar é muito simples e para escrevê-lo, clique na seção Pascal Code, do treeview Sections no Inno Script Studio. Um editor em branco bem simples aparecerá. É nesta área onde você deve escrever todo o código pascal que o Inno Setup vai executar. Para resolver nossos dois problemas mencionados anteriormente, escreva um script como na figura abaixo:

No código acima, ExpandConstant (Linha 9), é uma função disponibilizada pelo Inno Setup que converte uma string contento constantes no formato {constante} em uma string com estas constantes substituídas pelos seus valores reais. A constante {tmp} indica o local de armazenamento temporário de arquivos usados pelo instalador. O arquivo senha.xyz será criado dentro da pasta temporária do Inno Setup a qual será completamente excluída ao final da instalação.

A função PrepareToInstall (Linha 18) é uma função de evento do Inno Setup. Uma função de evento é uma função que é executada em momentos específicos durante o tempo de vida do instalador.

Como eu falei no início deste artigo eu não vou falar a respeito da sintaxe do Pascal. Isso você precisa saber. Leia os comentários dentro da imagem acima para maiores informações e leia o arquivo de ajuda do Inno Setup para entender um pouco mais sobre as funções de evento e sobre o Script Pascal em geral, incluindo as funções auxiliares como ExpandConstant e outras de grande utilidade.


A seção Run

O script do Inno Setup possui uma seção chamada Run (executar) na qual podemos especificar qualquer número de programas que precisam ser executados após o término da instalação, mas antes da tela final do instalador ser apresentada. Cada programa listado nesta seção, será executado na ordem em que ele aparecer. Após ler esta descrição, fica claro que é nesta seção onde nós vamos colocar nossos comandos para configurar o PostgreSQL. Clique na seção Install Run do treeview Sections do Inno Script Studio e clique o botão New Item:

Na janela Install Run Action preencha os dados exatamente como na imagem acima para incluir o primeiro comando a ser executado. Como o campo Parameters não está aparecendo completo, eis abaixo o que precisa ser colocado nele: 

-U postgres -A password -E utf8 -D "{app}\pg\data" --pwfile="{tmp}\senha.xyz"

Observe que não podem existir espaços nem antes e nem após a linha escrita em Parameters. Observe também o uso de constantes substituíveis {app} as quais flexibilizam o uso destes comandos. Ao preencher estes 3 campos, clique na aba Components e marque o componente PostgreSQL, em seguida, clique na aba Tasks e marque a tarefa PGConfig. Pressione OK para confirmar a inclusão do comando e prossiga para o próximo comando, realizando os mesmos passos:

Na tela acima, o campo Parameters tem o seguinte valor:

register -N "InnoSetupPG" -U "NT AUTHORITY\NetworkService" -D "{app}\pg\data" -w -o "-p 5400"

Novamente vemos aqui a presença da constante {app}. Não esqueça de selecionar o componente PostgreSQL e a tarefa PGConfig para este comando também. Por fim, vamos configurar o último comando, o qual inicializa o serviço do PostgreSQL:

Novamente, não esqueça de configurar o componente PostgreSQL e a tarefa PGConfig para este comando. Aqui vemos uma constante diferente: {sys}. Esta constante é substituída pela pasta de sistema do Windows que é normalmente C:\Windows\System32. O comando Net é um executável que está na pasta de sistema do Windows, logo, é natural usar a constante {sys}. A regra é que se houver uma constante para indicar o diretório que se quer acessar, devemos usar esta constante e jamais o caminho real. No final, a lista da seção Install Run deverá ser igual ao que se vê na imagem abaixo:


A seção UninstallRun

Assim como a seção Run existe sua contraparte UninstallRun. A função desta seção é tão óbvia que vou me abster de dar maiores detalhes sobre ela. Apenas vou frisar que, nesta seção, caso o intuito seja desinstalar aquilo que foi instalado na seção Run, os comandos a serem executados precisam ser em ordem invertida, por exemplo, a seção UninstallRun do nosso script ficou assim:

Como se pode observar, para desinstalar o PostgreSQL precisamos primeiro parar o seu serviço, e em seguida remover esse serviço da lista de serviços do Windows. Observe também que durante a instalação também é necessário informar corretamente o componente e a tarefa associada a cada comando.

A seção UninstallDelete

Nesta seção nós podemos indicar quaisquer arquivos ou diretórios que precisam ser excluídos durante a desinstalação. É comum que alguns arquivos gerados por nossos programas sejam pessoais e não devem ser excluídos, pois pertencem ao usuário. Contudo, arquivos temporários e outros arquivos que são automaticamente criados sem qualquer decisão do usuário podem ser excluídos sem problema algum.

No nosso instalador, durante a instalação, a pasta data do PostgreSQL foi populada com arquivos e pastas pelo programa initdb, por este motivo, durante a desinstalação o Inno Setup não tocará nestes arquivos porque ele "não os conhece" e sendo assim, ao desinstalarmos, a pasta ZOISE não vai ser apagada porque ela não está vazia. Ela contém a pasta pg\data, que está cheia de arquivos e pastas que o Inno Setup não tocará por padrão.

Caso você queira limpar qualquer rastro do PostgreSQL que foi instalado com nosso instalador, você precisa instruir o Inno Setup a excluir arquivos e pastas específicos e é justamente na seção UninstallDelete onde isso pode ser feito. Clique na seção Uninstall Delete do treeview Sections do Inno Script Script Studio e clique o botão New Item:

Na tela Uninstall Delete Action, no campo Type, informe Files and/or directories. No campo Filename, neste caso, informe o nome da pasta que precisa ser excluída de forma recursiva. Na imagem acima, vemos {app}\pg\data. Nas abas Components e Tasks, selecione, respectivamente PostgreSQL e PGConfig. Realize o mesmo procedimento para a pasta {app}\pg\log.

O procedimento de exclusão utilizado aqui é, como se pode observar, forçado. Isso significa que utilizar de forma errada a seção UninstallDelete pode causar problemas ao usuário. Por exemplo, a pasta data que nós estamos excluindo manualmente contém os dados de todos os esquemas registrados na instância do PostgreSQL que foi instalada pelo nosso instalador. Em uma situação real, o conteúdo da pasta data não deve ser excluído pois ele certamente contém dados que o usuário criou (por meio de manipulação do banco de dados). Aqui nós estamos apagando completamente a pasta data apenas como exemplo de utilização da seção UninstallDelete, mas isso é errado! Nunca se deve apagar arquivos que o Inno Setup não instalou, a menos que você saiba exatamente o que está fazendo. Ignorar este aviso pode deixar seus usuários bem chateados.

Conclusão

Apesar de termos usado o Pascal Script muito pouco nesta parte do tutorial, ficou claro que ele é um recurso poderoso do Inno Setup. Em partes posteriores deste tutorial mais scripts pascal serão utilizados e você poderá comprovar isso que eu estou dizendo.

Se você testou o instalador que foi criado até agora deve ter notado que são apresentadas janelas de comando (console) durante a instalação. Estas telas são decorrentes dos programas que são executados para configurar o PostgreSQL e é algo absolutamente normal. Também seria possível ocultar estas telas simplesmente usando o flag runhidden de cada comando que se quer ocultar. Eu optei por deixar à mostra os comandos apenas para que tenhamos certeza do que está ocorrendo.

Caso você use o desinstalador, notará que o serviço do PostgreSQL será parado e removido, bem como os arquivos da pasta ZOISE, mesmo aqueles que não foram criados diretamente pelo instalador, por conta de termos usado a seção UninstallDelete.


  Arquivos anexados  
Arquivo Descrição Tamanho Modificado em
Access this URL (https://sourceforge.net/projects/addicted2delphi/files/inno.rar) inno.rar Arquivos necessários para criação do instalador e do programa de exemplo (que será instalado). Este arquivo será atualizado à medida que o tutorial for sendo feito e ao final conterá a solução completa 0.1 KB 06/03/2018 às 21:52

1 Em partes posteriores deste tutorial eu vou falar a respeito de uma tela personalizada do instalador, onde poderemos definir opções de configuração do PostgreSQL, e neste momento eu pretendo permitir a alteração de outros elementos deste comando. Por ora, apenas a pasta data será manipulada
Página anterior do tutorial atual Primeira página do tutoria altual Próxima página do tutorial atual