• Nenhum resultado encontrado

2.4 Python

2.4.3 PyGTK

De acordo com (FINLAY,2005), PyGTK é um conjunto de módulos que proveem uma interface Python para o GTK+ 28.

Basicamente, um programa que utiliza o GTK+, implementa chamadas para widgets, que são elementos que compõem a interface gráfica, como caixas de texto, botões e barras de progresso. Então cabe ao programador gerenciar as interações do usuário com estes widgets através dos signals e dos callbacks, cujos conceitos serão apresentados na sequência.

Todo widget tem, associado a si mesmo, um ou mais signals que acusam quando um determinado evento ocorrer nele, como um clique do mouse ou o pres- sionar de uma tecla. Ao detectar a ocorrência de um signal, o programador pode determinar como o programa responderá a ele e é normalmente assim que se dá funcionalidade às interfaces. Esta resposta é feita por meio de funções que são associadas a um ou mais signals de um ou mais widgets e recebem o nome de callbacks.

Na listagem da figura2.15, pode-se observar um exemplo de código em Python que utiliza o PyGTK. Nas linhas 13, 14 e 15 são feitas as importações dos módu-

8GTK+ é, segundo o site oficial do projeto (www.gtk.org), um toolkit para construção de inter-

los necessários para criação da interface gráfica. Na linha 17 é declarada a classe HelloWorld, que possuirá como atributos, todos os widgets usados na interface, as funções de callback e outras que dão funcionalidade à interface, como métodos. Na linha 18 é declarado o método inicializador da classe e na linha 19, o atributo window recebe um widget Window do GTK+, responsável por criar uma janela padrão. Nas linhas 20 e 21 os signals delete_event e destroy, que são gerados quando o usuário tenta fechar a janela, são conectados, respectivamente, às funções de callback delete_event e destroy. Na linha 22 as bordas da janela têm seus valores alterados para 10 pixels.

Nas linhas 23 a 26, um widget do tipo button (botão) é criado, e ao signal clicked, que ele possui, são associados os calbacks hello (que imprime uma string na tela) e gtk.Widget.destroy (que o conecta ao callback destroy da janela). Finalmente, na linha 27 o botão é adicionado à janela e nas linhas 28 e 29 as funções de exibição da janela e do botão são executadas, garantindo que eles serão exibidos quando o programa for interpretado. Na linha 43, um peculiaridade da linguagem: um código pode ser executado, tanto como um programa, quanto como um módulo para outro programa.

Caso o mesmo seja executado como um programa, a variável __name__, ine- rente a qualquer código Python, tem seu valor igual a __main__. Nesse caso, a linha 44 será executada, com uma chamada para a classe HelloWorld e seu método run, responsável por inicializar o loop principal do GTK+, iniciando a interface gráfica.

Ao se executar este código, uma janela similar à da figura2.16será exibida. Nesta janela o usuário tem todas as funcionalidades básicas da maioria dos pro- gramas, como redimensionamento, minimização/maximização, movimentação e fechamento. No caso deste último é gerado um signal delete_event, que, por estar conectado ao callback delete_event, fecha a janela. O usuário também pode clicar no botão Hello World, que imprimirá na tela a string definida no método hello e fechará a janela, pelo fato do signal clicked do botão também estar associado ao callback destroy da janela (linhas 25 e 26).

1 #!/usr/bin/env python 2 # -*- coding: utf8 -*- 3

4 """Implements simple operations on PyGTK.

5 Hello World is a simple Python program which

6 uses PyGTK to show a window with a Hello World

7 button. This window closes when button is clicked.

8 It’s an adaptation of the original code in 9 PyGTK tutorial 10 11 """ 12 13 import pygtk 14 pygtk . r e q u i r e ("2.0") 15 import gtk 16 17 class H e l l o W o r l d ( o bject ): 18 def _ _ i n i t _ _ ( self ):

19 self . win dow = gtk . Wi ndow ( gtk . W I N D O W _ T O P L E V E L )

20 self . win dow . c o n n e c t ("delete_event", self . d e l e t e _ e v e n t )

21 self . win dow . c o n n e c t ("destroy", self . d e s t r o y )

22 self . win dow . s e t _ b o r d e r _ w i d t h (10)

23 self . but ton = gtk . Bu tton ("Hello World")

24 self . but ton . c o n n e c t ("clicked", self . hello , None ) 25 self . but ton . c o n n e c t _ o b j e c t ("clicked",

26 gtk . Widget . destroy ,

27 self . win dow )

28 self . win dow . add ( self . bu tton ) 29 self . but ton . show ()

30 self . win dow . show ()

31

32 def run ( self ): gtk . main ()

33

34 def d e s t r o y ( self , widget , data = None ): gtk . m a i n _ q u i t ()

35

36 def d e l e t e _ e v e n t ( self , widget , event , data = None ):

37 return False

38

39 def hello ( self , widget , data = None ): print "Hello World"

40 41 # 42 # Main 43 # 44 if _ _ n a m e _ _ == "__main__": 45 H e l l o W o r l d (). run ()

Capítulo 3

Desenvolvimento

Neste capítulo será mostrado como todas as ferramentas apresentadas no capítulo 2 foram combinadas para a realização do trabalho. Primeiramente será mostrado como o autor automatizou a criação dos scripts de configuração dos clientes Win- dows. Por último, serão descritas as etapas de configuração do servidor, de modo com que toda máquina logada no domínio fosse configurada de acordo com o grupo do usuário que se logou.

3.1

Criação dos Scripts

(SILVA, 2004) propôs uma solução semelhante à apresentada neste texto, mas como o enfoque dele era a configuração do servidor Samba para executar os ar- quivos de configuração do Regedit, pouca atenção foi dada à etapa de criação destes (sendo este o enfoque deste trabalho). Segundo a fonte, uma das princi- pais referências sobre entradas para o Regedit era o site Winguides, que possuia várias destas entradas, todas bem descritas. Atualmente o Winguides chama-se PC-Tools (http://www.pctools.com/guides/registry) e possui, além de um vasto acervo de entradas para o Regedit, todas separadas por categorias, um guia bastante prático para iniciantes no assunto.

Assim como mostrado em (SILVA,2004), a criação do arquivo para configu- ração das máquinas Windows é crucial para obtenção dos resultados esperados. Por isso, este foi o ponto de partida para realização do trabalho. A partir do PC- Tools, foram retiradas todas as entradas para o Regedit que o autor julgou perti- nentes à aplicação. Uma vez selecionadas, as entradas foram transcritas para um

arquivo texto onde receberam, cada qual, um cabeçalho padrão para identificação, conforme o exemplo da figura3.1.

1 ; C o n t r o l e da Fu ncao de Auto - E x e c u c a o do CD - ROM

2 ;

3 ; D E S C R I P T I O N

4 ; N o r m a l m e n t e qu ando voce in sere um disco no drive de CD - ROM ,

5 ; o c o n t e u d o e e x e c u t a d o a u t o m a t i c a m e n t e . Esta f uncao lhe

6 ; p e r m i t e d e s a b i l i t a r este c o m p o r t a m e n t o . 7 ; 8 ; C O M P A T I B I L I T Y 9 ; W i n d o w s NT /2 000/ XP 10 ; 11 ; M O D I F I E D VA LUES 12 ; A u t o r u n : dword : 0 0 0 0 0 0 0 0 = D e s a b i l i t a a Auto - E x e c u c a o ; 13 ; 0 0 0 0 0 0 0 1 = H a b i l i t a a Auto - E x e c u c a o . 14 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 15 [ H K E Y _ L O C A L _ M A C H I N E \ SY STEM \ C u r r e n t C o n t r o l S e t \ S e r v i c e s \ CDRom ] 16 "Autorun"= dword : 0 0 0 0 0 0 0 0

Figura 3.1: Exemplo de entrada para o Regedit.

No exemplo da figura3.1 pode-se observar que cada entrada cadastrada foi catalogada com uma descrição sucinta da mesma (linha 1), uma descrição deta- lhada explicando as implicações daquela entrada (linhas 3 a 6), as versões do Win- dows com as quais aquela entrada é compatível (linhas 8 e 9) e os valores alterados por aquela entrada (linhas 11 a 13). Em seguida é declarada a entrada em si (linhas 15 e 16), que são as linhas importadas pelo Regedit.

Na listagem da figura 3.2 pode-se observar outro exemplo de uma entrada catalogada pelo autor. Pode-se perceber que os campos de descrição sucinta (linhas 1 e 2), descrição detalhada (linhas 4 a 8), compatibilidade (linhas 10 e 11) e de valores modificados (linhas 13 a 15), estão todos presentes. Neste exemplo ainda há um campo extra contendo observações (linhas 17 a 19) sobre aquela entrada específica, tudo para facilitar a utilização destas entradas pelo usuário.

O autor percebeu que todo o trabalho de criação do script poderia ser pas- sado para uma linguagem de programação, o que facilitaria futuras mudanças de parâmetros do script, como alteração de um valor, de ativado para desativado. Desta forma, a linguagem Python foi escolhida, primeiramente devido às exce- lentes referências que o autor tinha dela e também pela vontade que o mesmo tinha em aprendê-la. Por isso todo o script foi portado para a referida linguagem, fazendo com que cada entrada, como a da figura 3.1, se transformasse em uma função, como a da figura3.3.

1 ; E s c o n d e r as C o n f i g u r a c o e s Pa inel de Controle , I m p r e s s o r a s e 2 ; C o n e x o e s de Rede

3 ;

4 ; D E S C R I P T I O N

5 ; Esta r e s t r i c a o re move as c o n f i g u r a c o e s P ainel de Controle , 6 ; I m p r e s s o r a s e C o n e x o e s de Rede do menu I n i c i a r . Se as

7 ; c o n f i g u r a c o e s da Barra de T a r e f a s t ambem e s t i v e r e m escondidas ,

8 ; a c a r r e t a r a na c o m p l e t a r e m o c a o das c o n f i g u r a c o e s . 9 ; 10 ; C O M P A T I B I L I T Y 11 ; Todos . 12 ; 13 ; M O D I F I E D VA LUES 14 ; N o S e t F o l d e r s : dword : 0 0 0 0 0 0 0 0 = D e s a b i l i t a r e s t r i c a o ; 15 ; 0 0 0 0 0 0 0 1 = H a b i l i t a r e s t r i c a o . 16 ; 17 ; O B S E R V A T I O N

18 ; Esta r e s t r i c a o deve d e s a b i l i t a r t ambem a h otkey do W i n d o w s

19 ; E x p l o r e r ( SUPER + E ).

20 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

21 [ H K E Y _ C U R R E N T _ U S E R \ S o f t w a r e \ M i c r o s o f t \ W i n d o w s \ C u r r e n t V e r s i o n \ 22 P o l i c i e s \ E x p l o r e r ]

23 "NoSetFolders"= dword : 0 0 0 0 0 0 0 1

Figura 3.2: Outro exemplo de entrada para o Regedit.

A vantagem desta implementação é que as chamadas para cada função pode- riam ser inseridas em qualquer programa Python, tornando o trabalho do adminis- trador mais flexível, pois, se este quisesse alterar o retorno de uma função, bastaria alterar o parâmetro passado.

Ao criar esta solução, o autor percebeu que havia desenvolvido uma camada de abstração em Python para o Registro do Windows. Assim surgiu a ideia de reunir todas as funções criadas em um único módulo Python, módulo este que recebeu o nome de Windows Registry Fixer (WRF). O WRF foi liberado como software livre (sob a licença GPLv3) pelo autor e o site oficial do projeto foi hospedado no Google Code1, podendo ser acessado pelo endereçohttp://code. google.com/p/windowsregistryfixer/. Neste site, o WRF poderá ser copi- ado como um arquivo compactado. Ao descompactá-lo, será criado um diretório chamado wrf-VERSÃO (e.g.,wrg-0.1.0). Dentro deste diretório haverá alguns ar- quivos, sendo que o principal é o wrf.py, que corresponde ao módulo WRF.

1Google Code (http://code.google.com/) é um serviço gratuito de hospedagem de projetos,

1 def a u t o r u n ( on =0): 2

3 """Controle da Funcao de Auto-Execucao do CD-ROM 4

5 DESCRIPTION

6 Normalmente quando voce insere um disco no drive de CD-

7 ROM, o conteudo e executado automaticamente. Esta funcao

8 lhe permite desabilitar este comportamento.

9

10 COMPATIBILITY

11 Windows NT/2000/XP

12

13 MODIFIED VALUES

14 Autorun : dword : 00000000 = Desabilita a Auto-Execucao;

15 00000001 = Habilita a Auto-Execucao. 16 17 """ 18 19 if on : 20 return ’’’[HKEY_LOCAL_MACHINE\\SYSTEM\\ 21 CurrentControlSet\\\Services\\CDRom] 22 "Autorun"=dword:00000001’’’ 23 24 else: 25 return ’’’[HKEY_LOCAL_MACHINE\\SYSTEM\\ 26 CurrentControlSet\\\Services\\CDRom] 27 "Autorun"=dword:00000000’’’

Figura 3.3: Função em Python correspondente a uma entrada para o Regedit.

No exemplo da figura3.3, pode-se perceber que o cabeçalho da entrada des- crita na figura 3.1 foi transcrito para uma docstring em Python (linhas 3 a 17), de forma a documentar a função criada. O leitor pode perceber que a função autorun recebe um valor para indicar se a autoexecução do CD-ROM será habilitada ou não e um if (linhas 19 a 27) determina a string que esta função retornará. Esta string de retorno corresponde a uma entrada para o Regedit e pode ser gravada em um arquivo que contém outras entradas para o Regedit, como forma de ativar ou de- sativar este comportamento específico do Windows.

Todas as outras entradas catalogadas receberam tratamento semelhante ao da figura3.3, tornando-se funções Python com um valor de entrada (o parâmetro para a função), a docstring e o processamento da função. A listagem da figura 3.4 traz outro exemplo, similiar ao da figura3.3. O leitor pode perceber que todos os elementos da figura3.3estão presentes, sendo as funções semelhantes. As únicas

diferenças ficam por conta do conteúdo da docstring e dos possíveis valores de retorno da função.

1 def n o _ s e t _ f o l d e r s ( on =0):

2

3 """Esconder as Configuracoes Painel de Controle,

4 Impressoras e Conexoes de Rede 5

6 DESCRIPTION

7 Esta restricao remove as configuracoes Painel de

8 Controle, Impressoras e Conexoes de Rede do menu Iniciar.

9 Se as configuracoes da Barra de Tarefas tambem estiverem 10 escondidas, acarretara na completa remocao das

11 configuracoes. 12 13 COMPATIBILITY 14 Todos. 15 16 MODIFIED VALUES

17 NoSetFolders : dword : 00000000 = Desabilita restricao;

18 00000001 = Habilita restricao. 19

20 OBSERVATION

21 Esta restricao deve desabilitar tambem a hotkey do

22 Windows Explorer (SUPER + E).

23 24 """ 25 26 if on : 27 return ’’’[HKEY_CURRENT_USER\\Software\\Microsoft\\\ 28 Windows\\CurrentVersion\\Policies\\Explorer] 29 "NoSetFolders"=dword:00000001’’’ 30 31 else: 32 return ’’’[HKEY_CURRENT_USER\\Software\\Microsoft\\\ 33 Windows\\CurrentVersion\\Policies\\Explorer] 34 "NoSetFolders"=dword:00000000’’’

Figura 3.4: Outra função em Python correspondente a uma entrada para o Regedit.

Pode-se perceber que o usuário do WRF teria que consultar a implementação do próprio módulo para saber quais as funções disponíveis e o que cada uma faria, para então inseri-la no seu programa gerador de scripts para o Regedit. A van- tagem é que o usuário teria que saber apenas o nome e a descrição da cada função, sem ter que se preocupar com quais chaves ou valores do Registro seriam alterados.

Já a desvantagem é que ainda assim o administrador seria obrigado a conhecer uma linguagem (Python), além de ter que criar um programa para usar o WRF.

Na figura3.5 pode-se observar como o WRF pode ser utilizado diretamente pelo administrador. Nas linhas 1 e 2 desta listagem são definidas, respectivamente, o interpretador e a codificação do arquivo Python. Na linha 4 é importado o mó- dulo wrf e uma função responsável por gravar uma string em um arquivo é definida nas linhas 7 a 10. A principal função do programa é definida entre as linhas 12 e 28.

Na linha 15 é aberto um arquivo de texto para escrita, chamado wrf.reg, sendo o mesmo associado à variável file. Na linha 17, a versão do Regedit que será responsável por interpretar o código que será gerado, é escrita no arquivo. A linha 19 faz uma chamada à função autorun, descrita na figura3.3, do WRF, habilitando a autoexecução do CD-ROM. As linhas 21 a 23 executam a função do WRF, disallow_run, que inibe a execução dos arquivos passados à ela na lista (Virus.exe, Worm.exe e Trojan.exe).

A linha 24 roda a função no_set_folders, descrita na figura3.4, removendo os itens Painel de Controle, Impressoras e Conexões de Rede do menu Ini- ciar. As linhas 25 e 26 utilizam a função wallpaper_image_and_style para definir novas configurações de papel de parede. Na linha 28, o arquivo é fechado. Na linha 33 verifica-se se o código está sendo executado como um módulo ou como um programa e somente neste último caso, as linhas 34 e 35 são interpre- tadas, para, respectivamente, executar a função principal do código e indicar o término com sucesso do mesmo.

Ao ser executado o código da figura 3.5, um arquivo com conteúdo seme- lhante ao da figura3.6seria gerado. É interessante notar a correspondência entre as listagens da figura3.6 e da figura3.5. A linha 1 da figura3.6foi gerada pela linha 17 da figura 3.5. Nos mesmos moldes, as linhas 3 a 5 da figura 3.6 foram geradas pela linha 19 da figura3.5. As linhas 6 a 14 e 16 a 18 da figura3.6foram geradas pelas linhas 21 a 23 e pela linha 24 da figura3.5. Finalmente, as linhas 19 a 22 da figura3.6foram geradas pelas linhas 26 e 27 da figura3.5.

Exemplos como o apresentado nas figuras 3.5e3.6 evidenciaram a necessi- dade de se criar uma interface para o WRF, que possibilitasse criar scripts de forma intuitiva, sem que fosse preciso conhecer a sintaxe do Regedit ou de qualquer outra linguagem.

Neste contexto foi criado o GTK Windows Registry Fixer (GWRF), uma in- terface para o WRF escrita em GTK+. Um exemplo do GWRF pode ser visto na

1 #!/usr/bin/env python 2 # -*- coding: utf8 -*- 3 4 import wrf 5 6

7 def s a v e _ i n t o _ f i l e ( file , st ring ):

8 """Saves string into file."""

9

10 file . write ( str ing + ’\n’) 11

12 def main ():

13 """Program’s main function."""

14

15 file = open ("wrf.reg", "w+t")

16

17 s a v e _ i n t o _ f i l e ( file , "REGEDIT4\n") # Header 18 19 s a v e _ i n t o _ f i l e ( file , wrf . a u t o r u n (1)) 20 21 s a v e _ i n t o _ f i l e ( file , wrf . d i s a l l o w _ r u n (1 , ["Virus.exe", 22 "Worm.exe", 23 "Trojan.exe"])) 24 s a v e _ i n t o _ f i l e ( file , wrf . n o _ s e t _ f o l d e r s (1)) 25 s a v e _ i n t o _ f i l e ( file , wrf . w a l l p a p e r _ i m a g e _ a n d _ s t y l e (1 , 26 "C:\\\\Windows\\\\\Wallpaper-Logon.bmp", 2)) 27 28 file . close () 29 30 31 # Main 32 if _ _ n a m e _ _ == "__main__": 33 main () 34 exit (0)

Figura 3.5: Exemplo de utilização direta do WRF.

figura3.7. O leitor pode observar na figura que o GWRF possui opções para ati- var/desativar/configurar os 65 itens que compõem o WRF. O GWRF faz parte do projeto WRF desde sua versão 0.1.0, portanto ao baixar o WRF o GWRF já será copiado, bastando que se execute o arquivo gwrf.py, presente no mesmo diretório do WRF, para iniciá-lo.

1 R E G E D I T 4 2 3 [ H K E Y _ C U R R E N T _ U S E R \ S o f t w a r e \ M i c r o s o f t \ W i n d o w s \ C u r r e n t V e r s i o n \ 4 P o l i c i e s \ E x p l o r e r ] 5 "NoRun"= dword : 0 0 0 0 0 0 0 1 6 [ H K E Y _ C U R R E N T _ U S E R \ S o f t w a r e \ M i c r o s o f t \ W i n d o w s \ C u r r e n t V e r s i o n \ 7 P o l i c i e s \ E x p l o r e r ] 8 "DisallowRun"= dword : 0 0 0 0 0 0 0 1 9 10 [ H K E Y _ C U R R E N T _ U S E R \ S o f t w a r e \ M i c r o s o f t \ W i n d o w s \ C u r r e n t V e r s i o n \ 11 P o l i c i e s \ E x p l o r e r \ D i s a l l o w R u n ] 12 "1"="Virus.exe" 13 "2"="Worm.exe" 14 "3"="Trojan.exe" 15 16 [ H K E Y _ C U R R E N T _ U S E R \ S o f t w a r e \ M i c r o s o f t \ W i n d o w s \ C u r r e n t V e r s i o n \ 17 P o l i c i e s \ Sys tem ] 18 "NoDispSettingsPage"= dword : 0 0 0 0 0 0 0 1 19 [ H K E Y _ C U R R E N T _ U S E R \ C o n t r o l Panel \ D e s k t o p ] 20 "TileWallpaper"="1" 21 "Wallpaper"="C:\\Windows\\Wallpaper-Logon.bmp" 22 "WallpaperStyle"="2"

Figura 3.6: Saída da listagem3.5.

Figura 3.7: Captura de tela do GWRF.

Na listagem da figura3.7, pode-se perceber que o GWRF é composto basi- camente por um conjunto de checkboxes2, que determinam as opções do usuário

para a criação dos scripts. No rodapé da janela há três botões: o botão Sobre, que abre a janela de créditos do programa; o botão Ajuda que abre o navegador padrão do sistema, no site do projeto WRF e o botão Aplicar, que gera o script a partir das opções selecionadas.

O uso do GWRF é bastante simples: o usuário seleciona quais opções de- vem ser ativadas, marcando cada caixa de seleção e configurando a opção quando for o caso e clica no botão Aplicar, que criará um arquivo chamado wrf.reg no diretório do próprio programa. Este arquivo possuirá todas as configurações selecionadas pelo usuário e prontas para serem importadas pelo Regedit.

Algumas mudanças feitas no Registro do Windows requerem reinicialização do sistema, outras não e mesmo o site PC-Tools não informa com exatidão este detalhe. Por isso o autor recomenda que, sempre que um script do Regedit for importado no sistema, que o mesmo seja reiniciado, para garantir que todas as mudanças surtam efeito.

Com o desenvolvimento do WRF e do GWRF, o autor chegou a um ponto onde a criação dos scripts para o Regedit foram limitadas à seleção de opções na tela, de forma gráfica, intuitiva para o usuário. Isto deve facilitar o trabalho dos administradores que fizerem uso da solução apresentada neste trabalho e em qualquer outra que necessite que scripts para o Regedit sejam criados, desde que as mesmas já estejam previstas nos softwares criados.

Documentos relacionados