Sacix 2.0 (Jaguatirica)
Transcrição
Sacix 2.0 (Jaguatirica)
Sacix 2.0 (Jaguatirica) Guia de Implementação Autores: Eduardo Costa Lisboa [email protected] Kung te Yang [email protected] Setembro / 2005 Introdução Esta documentação tem por fim explicar, passo a passo, como transformar um Debian Sarge em um Sacix 2.0. O Sacix é uma personalização do Debian GNU/Linux 3.0r0a (Sarge), feita pela Equipe de Desenvolvimento de Soluções Livres da Prefeitura de São Paulo, hoje composta por Eduardo Costa Lisboa – [email protected] e Kung te Yang – [email protected]. Para acompanhar este guia é necessário ter conhecimentos básicos de Linux, em especial, da distribuição Debian. Recomendase também noções de estruturas redes, compilação do kernel e hardware. Este guia é direcionado para pessoas que queiram aprender a desenvolver um ambiente de servidor de aplicações com thin clients. Apesar de ser baseado em Debian, pode ser facilmente aplicado a qualquer distribuição Linux, desde que se tenha o conhecimento adequado na configuração dos softwares envolvidos. Os tópicos abordados são: 1. Criação de uma raiz para o thin client 11. Criando os usuários 2. Configuração da raiz do thin client 12. Utilizando autenticação automática através de chaves RSA 3. Compilação do kernel do thin client 4. Preparação do ambiente de boot PXE 13. Configuração do X Window System do thin client 5. Instalação e configuração dos serviços 14. Configurando a sessão gráfica do usuário básicas de rede: 15. Instalando programas gráficos 5.1 Configuração do servidor DHCP 16. Configurações globais via Gconf 5.2 Configuração do servidor TFTP 17. Acesso a dispositivos remotos 5.3 Configuração do servidor NFS 18. Suporte a som nos thin clients 5.4 Editando o arquivo hosts 19. Bootsplash 6. Primeiro boot 20. Scripts desenvolvidos e personalizações 7. Compilação do kernel do servidor 21. Agradecimentos 8. Serviços do thin client 22. Apêndice 9. Reconfigurando os compartilhamentos 10. Login automático com o programa agetty 1. Criação de uma raiz para o thin client A raiz do thin client nada mais é que um sistema básico, com o mínimo necessário para o thin client iniciar o boot e montar os diretórios via NFS no servidor. No caso do Sacix, o thin client monta os diretórios /bin, /sbin, /lib e /usr logo após montar a raiz, especificados no arquivo fstab. Os diretórios /tmp e /var são criados antes usando o sistema de arquivos ramfs. Diretórios pertencentes à raiz do diretório /var também são criados durante a inicialização, bem como alguns arquivos no diretório /tmp. Para criar o sistema inicial, será utilizado o comando debootstrap, disponível no pacote também chamado debootstrap. Para instalar o pacote debootstrap, basta o comando : # aptitude install debootstrap Após a instalação, devese digitar o comando: # debootstrap sarge /opt/sacix/root http://ftp.us.debian.org/debian A instalação do debootstrap demora um pouco para terminar, pois instala todos os pacotes necessários para se criar uma raiz básica do Debian, baixandoos do repositório especificado. Para uma instalação mais rápida, é recomendado ter um mirror local que contenha pelo menos os pacotes que serão usados para a a instalação do sistema básico. Também podese excluir alguns pacotes da lista de instalação com o parâmetro exclude=pacote1,pacote2. 2. Configuração da raiz do thin client Com o sistema básico já instalado, o sistema deve ser configurado para que se torne inicializável. Para isso, devese usar o comando chroot para entrar na raiz deste: # cp /etc/apt/sources.list /opt/sacix/root/etc/apt/sources.list # mount t proc chrootproc /opt/sacix/root/proc # chroot /opt/sacix/root Dentro do ambiente de chroot podese fazer (quase) tudo, como se fosse um sistema comum. Podese instalar e remover programas através do comando aptitude, instalar e iniciar serviços e até mudar algumas configurações, como o endereço IP da rede. Será criado agora o arquivo fstab, que será usado para montar o sistema de arquivos raiz via NFS e o sistema de arquivos virtual procfs; este pertimirá às aplicações locais do thin client se comunicarem com seu kernel. É importante notar que, já na configuração do ambiente PXE, existe um parâmetro passado para o kernel informandoo para montar a raiz via NFS. Mas, especificando a no arquivo fstab, é possível adicionar diversas opções de montagem, a fim de otimizar o desempenho ou aumentar a segurança da mesma. O arquivo que deverá ser criado é bem simples. Basta inserir as seguintes linhas: /opt/sacix/root/etc/fstab 192.168.0.1:/opt/sacix/root / proc /proc EOF nfs proc rw,sync,rsize=8192,wsize=8192 0 0 defaults 0 0 Devese definir uma senha para o usuário root com o comando # passwd root 3. Compilação do kernel do thin client Para compilar o kernel do thin client, é necessário fazer o download do arquivo http://http://ck.kolivas.org/patches/2.6/2.6.11/2.6.11ck10/patches.tar.bz2 e extrair o patch supermountng2082611.diff. Este patch é utilizado no thin client para que não seja necessário montar os volumes dos dispositivos como é feito normalmente no Linux. O acesso torna se direto e instantâneo e o volume é desmontado logo após seu uso. A seguir, instruções de como aplicar o patch no kernel: # tar xjvfp patches.tar.bz2 patches/supermountng2082611.diff –strippath=1 # tar xjvfp linux2.6.11.12.tar.bz2 # cd linux2.6.11.12 # patch p1 < ../supermountng2082611.diff # make menuconfig Na configuração do kernel, as seguintes opções devem ser habilitadas: Code maturity level option > [*] Prompt for development and/or incomplete code/drivers Device Drivers > [*] Networking support > Networking options > <*> Packet socket <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting [*] IP: kernel level autoconfiguration [*] IP: DHCP support File systems > Pseudo filesystems > <*> Supermount removable media support Network File Systems > <*> file system support [*] Provide NFSv3 client support [*] Root file system on NFS Se o os thin clients forem compostos de equipamentos de hardware distintos entre si, recomendase compilar um kernel mais modular, como drivers de som, USB, etc. Entretanto, se o hardware for homogêneo, um kernel compilado com suporte builtin ao hardware funcionará sem problemas. Após a configuração, a seguinte seqüência de comandos deve ser executada: # make all # make modules_install Posteriormente, será explicado como deverá ser instalada a imagem do kernel na raiz do thin client. 4. Preparação do ambiente de boot PXE O Sacix usa o sistema de boot PXE, um padrão definido pela Intel e Microsoft na especificação PC99. PXE signfica “Pre boot eXecution Environment”, e na prática determina como deve funcionar um boot via rede: o servidor DHCP oferece para o thin client um endereço de rede IP e mais dois parâmetros: o endereço do servidor TFTP e o nome do arquivo contendo a imagem inicial de boot, o bootloader. Este bootloader, por sua vez, pode carregar o kernel ou fazer uma nova consulta ao servidor DHCP. No caso do bootloader etherboot, uma nova consulta pelo parâmetro filename é feita, mas o bootloader oferece uma seqüência de caracteres chamada “Etherboot”. Esta seqüência de caracteres usada pelo thin client para identificação junto ao servidor DHCP é chamada “vendorclassidentifier”. Quando a primeira consulta é feita e o bootloader é oferecido, seu conteúdo é “PXEClient”. Exemplos de bootloader que funcionam com o padrão de boot PXE: GRUB, etherboot, pxelinux, NILO. No Sacix, o pxelinux é o bootloader padrão. Este é baseado no syslinux, utilizado para carregar sistemas Linux a partir de disquetes formatados como FAT12 e que contenham um cabeçalho de boot compatível com o sistema operacional MSDOS. Mais informações sobre o pxelinux podem ser encontradas em http://syslinux.zytor.com/pxe.php. A seguinte árvore deve ser criada para o ambiente de boot do pxelinux: # mkdir p /opt/sacix/boot/pxelinux.cfg O ambiente PXE é composto pelos seguintes ítens: ● arquivo de configuração padrão: default ● kernel compilado do thin client ● arquivo pxelinux.0 Após a criação da árvore, devese criar o arquivo default dentro do diretório pxelinux.cfg com o seguinte conteúdo: /opt/sacix/boot/pxelinux.cfg/default prompt=0 label linux kernel vmlinuz2.6.8client append ip=dhcp root=/dev/nfs nfsroot=192.168.0.1:/opt/sacix/root rw EOF Após ter sido criado o arquivo, é preciso copiar o kernel para o ambiente de boot PXE: # cp /usr/src/linux2.6.11.12/arch/i386/boot/bzImage /opt/sacix/boot/vmlinuz 2.6.11.12client O último item necessário é o arquivo pxelinux.0, disponível no pacote syslinux do Debian. Podese extrailo da seguinte maneira: # aptitude d install syslinux # cd /var/cache/apt/archives/ # ar x syslinux_2.110.1_i386.deb data.tar.gz # tar xzf data.tar.gz –strippath=4 ./usr/lib/syslinux/pxelinux.0 # mv pxelinux.0 /opt/sacix/boot/ Este arquivo é o responsável pelo bootstrap do cliente PXE, que irá ler o arquivo default e carregar o kernel especificado. Caso o dispositivo de rede do thin client não seja compatível com o padrão de boot PXE 2.0, é possível usar o etherboot como bootloader. Para isso, é necessário seguir os passos abaixo: ● instalar no kernel do thin client o bootloader etherboot ● editar o arquivo dhcpd.conf para referenciar o novo kernel Para instalar o etherboot no kernel, é necessário instalar o pacote mknbi, que contém o programa necessário para tal tarefa: # aptitude install mknbi Após instalar o pacote, o seguinte comando deverá ser executado: # mkelflinux root=/opt/sacix/root ip=rom /usr/src/linux 2.6.11.12/arch/i386/boot/bzImage > /opt/sacix/boot/2.6.11.12cliente.etb O último passo é alterar a linha “filename” do arquivo dhcpd.conf para usar o novo kernel: /etc/dhcp3/dhcpd.conf ... filename "/2.6.11.12cliente.etb"; ... EOF 5. Instalação e configuração dos serviços básicos de rede 5.1 Configurando o servidor DHCP O servidor DHCP é o primeiro serviço necessário para oferecer o ambiente PXE (ou o etherboot) para o thin client. Além de oferecer um endereço IP, também é responsável por apontar o endereço do servidor TFTP e também o arquivo a ser baixado de lá; além de também especificar o caminho da raiz a ser montada pelo thin client. Instale o pacote para o servidor com o comando abaixo: # aptitude install dhcp3server Além da configuração padrão do servidor DHCP, algumas linhas precisam ser inseridas para que ele possa oferecer ao thin client as informações necessárias. Segue abaixo um exemplo do arquivo dhcpd.conf: /etc/dhcp3/dhcpd.conf ... option rootpath filename ... EOF “192.168.0.1:/opt/sacix/root”; “/pxelinux.0” A seguir, uma breve explicação sobre as linhas necessárias ao boot do thin client: ● a linha rootpath indicará o caminho da raiz e deve ser o mesmo que será exportado via NFS mais tarde; ● A linha filename deve apontar para o arquivo pxelinux.0 exatamente abaixo da raiz do servidor TFTP, que será configurado a seguir; ● o range deve conter um intervalo de vinte máquinas de maneira que o script shell que irá verificar o IP possa calculálo para definir qual usuário será utilizado para o login via SSH. O Sacix, entretanto, está configurado para atribuir um endereço de IP fixo para cada um dos vinte thin clients. Segue abaixo um exemplo da configuração necessária: /etc/dhcp3/dhcpd.conf ... ignore unknown clients; ... group { host ecidadania1 { hardware ethernet 00:01:02:03:04:05; fixedaddress 192.168.0.11; option hostname "ecidadania1"; } } ... EOF Nota: caso o ambiente contenha tanto máquinas compatíveis com a versão 2.0 do PXE quanto máquinas mais antigas, incompatíveis com esta versão e que precisem do kernel etherboot, é possível permitir que ambos os tipos inicializem, inserindo a linha filename adequada em cada seção "host ecidadaniaX", mencionando o kernel adequado a ser transferido. 5.2 Configurando o servidor TFTP O servidor TFTP (Trivial File Transfer Protocol) é o que irá transferir ao thin clients os arquivos pxelinux.0 e o kernel. Existem diversos servidores TFTP disponíveis no repositório Debian e optamos por utilizar o contido no pacote atftpd: # aptitude install atftpd O arquivo de configuração do ATFTPD pode ser encontrado no apêndice da documentação. A seguir, uma descrição mais detalhada das configurações do servidor: ● Optamos por não utilizar o inetd; ● definimos 5 segundos (valor padrão) para o tempo máximo de espera da conexão; ● definimos também o modo “verbose” como “0”; ● por último, utilizamos a opção “logfile” para que o atftpd salve seus logs em um arquivo separado para não poluir o arquivo syslog. 5.3 Servidor NFS O servidor NFS exportará a raiz e posteriormente alguns diretórios do servidor com programas e bibliotecas que serão utilizados pelos thin clients. # aptitude install nfskernelserver Após a instalação, deve ser criado o arquivo exports com o seguinte conteúdo inicial: /etc/exports /opt/sacix/root 192.168.0.0/24(rw,no_root_squash,sync) EOF Este conteúdo é suficiente para fazer o primeiro teste de boot do thin client. Entretanto, um exemplo mais complexo estará disponível mais à frente. Depois de configurados todos os serviços, já é possível ligar o thin client pela primeira vez. Os serviços dhcpd, atftpd, portmap e nfskernelserver devem estar ativos para que o thin client possa iniciar com sucesso. # for service in dhcp3server atftpd portmap nfskernelserver > do > /etc/init.d/$service start > done 5.4 Editando o arquivo hosts No telecentro, utilizamos um padrão para nomear os thin clients, que é o de utilizar como hostname o nome do usuário que efetuará o login automático. Portanto, o thin client que tiver o IP 192.168.0.11 será chamado de ecidadania1 e assim por diante. É possível definir todos os vinte nomes através do seguinte comando no servidor: # for i in $(seq 1 20) > do > echo 192.168.0.$(($i+10)) ecidadania$i >> /etc/hosts > done 6. Primeiro boot O primeiro boot serve apenas para testar os serviços já configurados e a conectividade inicial entre o servidor e os thin clients. Entretanto, pode servir também para executar tarefas em modo texto que não são possíveis no modo chroot, como verificar a memória, qual o endereço IP da máquina e o tempo de resposta do servidor através de comandos como ping e ssh. Também é possível fazer um diagnóstico do comportamento do sistema através do estudo das mensagens geradas pelo sistema, disponíveis no diretório log: # cd /var/log/ # more dmesg # more messages # more syslog 7. Compilação do kernel do servidor O kernel do servidor é o 2.4.31. Escolhemos um kernel da já antiga série 2.4 por conter um patch chamado fairsched. Este patch muda o agendamento dos processos do kernel, de maneira que a distribuição do processamento seja mais justa entre os usuários; assim, um único usuário com muitos processos em execução não monopoliza o tempo de processamento do servidor, evitando assim prejudicar todos os outros. O patch mais recente disponível na Internet para download é para a versão 2.4.27 do kernel. Mais informações sobre este patch podem ser encontradas em: http://fairsched.sourceforge.net/. O patch para a versão 2.4.31 do kernel pode ser encontrado no apêndice da documentação. Para aplicálo, devese proceder da seguinte maneira: # tar xjfp linux2.4.31.tar.bz2 # cd linux2.4.31 # gzip d < ../2.4.31.fairsched.diff.gz | patch p1 Ao compilar o kernel algumas opções mínimas devem ser selecionadas para que o servidor funcione corretamente em rede: Code maturity level options [*] Prompt for development and/or incomplete code/drivers General setup [*] Fair scheduler Networking options <*> Packet socket <*> Unix domain sockets [*] TCP/IP networking [*] IP: multicasting File systems Network File Systems <*> NFS server support [*] Provide NFSv3 server support Poderemos agora utilizar o pacote kernelpackage para compilar e criar um pacote do kernel que iremos utilizar: # aptitude install kernelpackage # makekpkg revision <numero_da_revisao> modules_image kernel_image # cd .. # dpkg i kernelimage2.4.31fairsched_<numero_da_revisao>_i386.deb Instalado o pacote, recomendase por precaução revisar as linhas relacionadas ao novo kernel no arquivo de configuração do bootloader utilizado, seja GRUB ou LILO. Em seguida, um boot com o novo kernel para testálo servindo o sistema a um thin client. 8. Serviços do thin client No Sacix, o processo de boot do thin client executa as seguintes tarefas: • monta os sistemas de arquivos remotos e virtuais; • ativa a detecção de hardware (hotplug); • inicia o servidor SSH; • inicia o servidor de som ESD; • gera um pequeno relatório do hardware; • inicia o processo de login automático Durante o login automático, algumas tarefas são executadas, que serão descritas mais tarde. A montagem dos sistemas de arquivos e a detecção de hardware são executados antes do processo init iniciar o runlevel padrão. O servidor SSH, o ESD e o relatório de hardware são executados no runlevel padrão, e por fim temos o processo de login automático. A montagem dos sistemas de arquivos remotos e virtuais já deverá estar funcionando, como testado antes. A raiz criada via debootstrap já nos fornece, por padrão, este recurso. Há um script que criamos para poder utilizar os diretórios /tmp e /var montados em um sistema de arquivos ramfs. Isto porque todos os compartilhamentos remotos são montados como somenteleitura. Este script chamase mkvar e é iniciado durante o boot, antes de o sistema iniciar o runlevel padrão. O script pode ser encontrado no apêndice da documentação. O diretório /var da raiz do thin client é um link para o diretório /tmp. Como não será necessário mais utilizar o ambiente de chroot para fazer manutenção na raiz do thin client, podese apagálo: # rm rf /opt/sacix/root/var # ln s /tmp /opt/sacix/root/var O serviço hotplug deverá ser habilitado. No Sacix, utilizamos a configuração padrão, portanto basta copiar a configuração do servidor para a raiz do thin client, bem como seu próprio script: # cp /etc/init.d/hotplug /opt/sacix/root/etc/init.d # cp a /etc/hotplug* /opt/sacix/root/etc O mesmo feito anteriormente com o script do hotplug pode ser feito com o do SSH: # cp /etc/init.d/ssh /opt/sacix/root/etc/init.d # cp a /etc/ssh /opt/sacix/root/etc O próximo passo é criar os links nos diretórios rcS.d e rc2.d da raiz do thin client: # cd /opt/sacix/root/etc/rcS.d # rm * # ln s ../init.d/mountvirtfs S02mountvirtfs # ln s ../init.d/mountall.sh S03mountall.sh # ln s ../init.d/mkvar S04mkvar # ln s ../init.d/ifupdownclean S07ifupdownclean # ln s ../init.d/ifupdown S08ifupdown # ln s ../init.d/networking S09networking # ln s ../init.d/mountnfs.sh S10mountnfs.sh # ln s ../init.d/hotplug S11hotplug # cd /opt/sacix/root/etc/rc2.d # rm * # ln s ../init.d/ssh S01ssh # rm /opt/sacix/root/etc/{mtab,host{s,name}} # ln s /tmp/hosts /opt/sacix/root/etc/hosts # ln s /tmp/mtab /opt/sacix/root/etc/mtab # ln s /tmp/hostname /opt/sacix/root/etc/hostname 9. Reconfigurando os compartilhamentos Com o boot do thin client funcional, já é possível testar o compartilhamento dos programas e das bibliotecas da raiz do servidor. No arquivo fstab do thin client, as seguintes linhas devem ser adicionadas: /opt/sacix/root/etc/fstab ... 192.168.0.1:/bin /bin nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/sbin /sbin nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/usr /usr nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/lib /lib nfs nolock,exec,rsize=8192,ro 0 0 ... EOF Por segurança, todos os compartilhamentos remotos devem ser montados como somente leitura. Os únicos lugares onde o thin client poderá gravar serão os diretórios /tmp e /var, sendo que /var é um link para /tmp. No arquivo exports, as seguintes linhas devem ser adicionadas: /etc/exports ... /opt/sacix/root 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) /bin 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) /sbin 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) /lib 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) /usr 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) ... EOF Ao reiniciar o thin client, os novos compartilhamentos devem estar funcionando. Isto pode ser verificado com o comando mount e também ao tentar utilizar algum comando não existente na raiz do thin client, como o ssh. 10. Login automático com o programa agetty A raiz do thin client precisará ser configurada para efetuar o login automático do usuário root. Para isso, é necessário fazer três coisas: ● compilar e instalar o programa agetty ● compilar e instalar o programa autologin ● alterar o arquivo fstab do thin client Compilação e instalação do programa agetty Para compilar o agetty, é preciso copiar os arquivos agetty.c e Makefile do site http://cvs.uclinux.org/cgibin/cvsweb/uClinuxdist/user/agetty/. Uma vez copiados, basta compilar o programa com o comando make e copiar o binário gerado para o diretório /usr/local/sbin do servidor, como no exemplo abaixo: # make # cp agetty /usr/local/sbin Compilação e instalação do programa autologin É necessário também compilar um programa binário que será executado pelo comando agetty. No Sacix, utilizamos o nome genérico de autologin. Este programa pode ser encontrado em vários lugares na Internet e, talvez por ser muito pequeno, não tem nenhum dono conhecido. Seu código fonte está disponível no apêndice da documentação. Para compilar, utilizase o comando gcc: # gcc o /usr/local/sbin/autologin autoclogin.c Feito isto, é necessário editar o arquivo inittab do thin client para que utilize o agetty em vez do getty: /opt/sacix/root/etc/inittab ... 1:23:respawn:/usr/local/sbin/agetty n l /usr/local/sbin/autologin 38400 tty1 ... EOF Nota: o arquivo inittab completo poderá ser encontrado no apêndice da documentação. 11. Criando os usuários Os usuários criados não têm senha definida e seu grupo padrão é o users. Os seguintes comandos devem ser executados para criar todos os vinte usuários com este padrão: # rm rf /etc/skel/* /etc/skel/.[^.]* # for i in $(seq 1 20) > do > adduser quiet gecos "" ingroup users disabledpassword ecidadania$i > done 12. Utilizando autenticação automática através de chaves RSA A autenticação de chaves via SSH permite que um usuário se conecte ou execute comandos em outras máquinas sem a necessidade de digitar a senha. São utilizadas duas chaves: a pública, que será distribuida às máquinas que se deseja conectar e a privada, que ficará no diretório pessoal do usuário. As chaves são relacionadas da seguinte maneira: a chave pública contém o algoritmo de encriptação da sessão SSH. Já a chave privada contém o algoritmo de desencriptação desta sessão. Somente o detentor da chave privada poderá desencriptar a sessão e se comunicar com o servidor. Para gerar o par de chaves RSA pública e privada, usase o seguinte comando: $ sshkeygen t rsa N "" f ~/.ssh/id_rsa Com este comando, são gerados no diretório .ssh, dentro do diretório pessoal do usuário, os arquivos id_rsa e id_rsa.pub que são, respectivamente, as chaves privada e pública. Uma vez geradas as chaves, é necessário copiálas para os usuários que deverão aceitar a autenticação automática. No Sacix, utilizamos dois tipos de autenticação automática: do usuário root do thin client para os usuários ecidadania1 até ecidadania20 e dos usuários ecidadania para o usuário root de cada thin client. Na autenticação automática do usuário root para os usuários ecidadania, nós automatizamos o processo de executar a sessão gráfica do GNOME, dispensando assim o uso de um autenticador gráfico, como o GDM, utilizado nas versões anteriores do Sacix. Quanto à autenticação automática dos usuários ecidadania para os usuários root de cada thin client, o fizemos para ter acesso ssh/sftp aos mesmos. Utilizamos este acesso para duas funções: copiar, durante o início da sessão, os arquivos de relatório de hardware do thin client e para acessar, via SFTP, a unidade de disquete. Estes detalhes serão abordados mais adiante. Para automatizar a criação e a cópia das chaves desenvolvemos uma ferramenta chamada sshkeys, que está disponível no apêndice da nossa documentação. Também estão lá os arquivos de configuração dos servidores SSH do thin client e do servidor, bem como as configurações dos clientes SSH também. Para testar o funcionamento das chaves, a seguinte seqüência de comandos pode ser executada no console do thin client: # for i in $(seq 1 20) > do > ssh o StrictHostKeyChecking=no [email protected] ls &&\ > echo ecidadania$i ok > done 2> /dev/null Os seguintes arquivos devem ser alterados para o acesso do usuário root do thin client aos usuários ecidadania do servidor: ● /opt/sacix/root/etc/ssh/ssh_config contém configurações do cliente SSH do thin client ● /etc/ssh/sshd_config contém as configurações do serviço SSH do servidor Para as alterações necessárias ao acesso dos usuários ecidadania aos usuários root dos thin clients, os seguintes arquivos devem ser personalizados: ● /etc/ssh/ssh_config contém configurações do cliente SSH do servidor ● /opt/sacix/root/etc/ssh/sshd_config contém configurações do servidor SSH do thin client Como de praxe, estes arquivos também estão incluídos no apêndice da documentação. 13. Configuração do X Window System do thin client Para que seja possível iniciar o X Window System, é necessário instalar os pacotes xserverxfree86, xfontsbase, xlibse xbaseclients no servidor: # aptitude install xserverxfree86 xfontsbase xbaseclients xlibs Instalados os pacotes, é necessário seguir alguns passos: criar um link para o programa XFree86 em X11; criar o arquivo Xwrapper.config; criar o arquivo base XFree86Config4; O comando abaixo cria o link para o programa XFree86: # ln s /usr/bin/X11/XFree86 /opt/sacix/root/etc/X11/X Nota: Ambos os arquivos Xwrapper.config e XFree86Config4 estão disponíveis no apêndice desta documentação. É necessário também editar o arquivo profile, localizado em / opt/sacix/root/etc/, que está disponível no apêndice. Este arquivo é responsável por executar o programa xdebconfigurator, que irá detectar qual o driver da placa de vídeo do thin client e também iniciar o servidor X do mesmo. O pacote xdebconfigurator precisa ser instalado para que o script funcione corretamnete: # aptitude install xdebconfigurator O arquivo profile executa, no final, o comando xinit é executado. Este é um script que lê alguns comandos do arquivo xinitrc, localizado em / opt/sacix/root/etc/X11/xinit. Este arquivo detecta qual o IP do thin client, calcula o nome do usuário a partir deste e, por fim, inicia o servidor X, chamando o script session já autenticado com o usuário correto. Entretanto, para que este script funcione, é preciso criar um link no diretório pessoal do usuário root do thin client: # ln s /etc/X11/xinit/xinitrc /opt/sacix/root/root/.xinitrc O arquivo xinitrc contendo todos os comandos utilizados por nós está disponível no apêndice da documentação. Os arquivos de configuração do XKB (X Keyboard Extension), contidas no pacote xlibs, também são necessários ao thin client. Como este pacote já está instalado no servidor, basta copiar seu diretório contendo os arquivos de configuração para a raiz do thin client: # cp a /etc/X11/xkb /opt/sacix/root/etc/X11 Nota: o diretório compiled é um link para o diretório /var/lib/xkb, que deve ser criado pelo script mkvar mencionado na seção “Serviços do thin client”. 14. Configurando a sessão gráfica do usuário Durante a execução do script session (que pode ser encontrado no final da documentação), algumas tarefas de limpeza do ambiente do usuário são feitas, como remoção de possíveis arquivos antigos deixados no diretório /tmp. As configurações pessoais também são redefinidas, e a área de trabalho é limpa. Neste script também são detectados leitores de CDROM no thin client e dispositivos SCSI, como máquinas digitais ou chaveiros USB. Caso estes dispositivos sejam encontrados, atalhos são criados para o usuário. Quando o ambiente já está pronto para ser iniciado, dois programas são chamados: o xloadimage e o gnomesession. O xloadimage apenas exibe como papel de parede uma imagem informando que a sessão do GNOME está sendo carrega e que o usuário deverá esperar alguns instantes. Enquanto isso, o gerenciador de janelas GNOME é iniciado através do comando gnomesession. Ao final, sua configuração padrão carrega um papel de parede semelhante ao carregado pelo comando xloadimage, mas sem as mensagens de aviso do mesmo. 15. Instalando programas gráficos Em todas as versões do Sacix, tentamos disponibilizar os mais variados programas existentes aos usuários de maneira que tenham à mão sempre alguma ferramenta útil que os ajude ou algo que os entretenha. Porém, devido à escassez de recursos dos nossos servidores, diminuímos parte desta variedade, removendo muitos programas não tão utilizados e também instalando apenas um tipo de programa por funcionalidade. Desta forma, temos apenas um programa de mensagens instantâneas (GAIM), apenas um navegador* (Epiphany), e assim por diante. Em contrapartida, instalamos diversos jogos para que as crianças possam se divertir sem acessar sites de jogos em flash, que consomem muitos recursos do servidor. Todos eles estão disponibilizados em uma pasta criada na área de trabalho de nome “JOGOS”, tornando o acesso simples e intuitivo. Além dos programas mais comuns, o Sacix contém programas de editoração gráfica, de criação de desenhos simples e até de desenvolvimento web. É possível também o usuário criar aplicações web, escritas na linguagem PHP, em seu diretório pessoal, armazenandoos na pasta public_html. O servidor de banco de dados MySQL também está disponível para aulas de programação web com acesso a bancos de dados. Nota: Optamos, por padrão, não deixar ativos os serviços apache e mysql, pois nem todos os telecentros se utilizam destes serviços. No diretório /etc/rc2.d do servidor, é possível encontrar os scripts destes serviços. Para ativálos automaticamente durante o boot do servidor, basta mudar a primeira letra “K” para “S”. E, para desativálos, devese fazer o contrário: mudar a letra “S” do início do nome para “K”. A lista completa dos pacotes instalados no Sacix está no apêndice da documentação. 16. Configurações globais via Gconf O GConf é o sistema de configurações globais utilizado no ambiente GNOME atual. Ele é capaz de centralizar todas as configurações e ajustes dos programas. Suas configurações são salvas em repositórios de configurações utilizando o formato XML. Estes repositórios são disponibilizados pelo serviço gconfd2. Para tratar as configurações (salvar, alterar, ler, copiar para um outro arquivo XML ou mesmo gerenciar o servidor gconfd2), o programa gconftool2 é utilizado. Além do programa gconftool2 existe também o gconfeditor, uma ferramenta gráfica que permite editar as configurações e preferências dos programas do GNOME de maneira mais amigável. Com o GConf é possível especificar diversas configurações e propriedades dos programas; estas configurações também podem ser inalteráveis, caso haja tal necessidade. É possível, por exemplo, não permitir que o papel de parede seja trocado. Também é possível especificar valores padrões para as preferências dos programas. Assim, caso nenhuma preferência seja encontrada no diretório pessoal do usuário, uma preferência padrão definida é aplicada, podendo ser alterada pelo usuário posteriormente. O GConf tem duas principais árvores de diretórios de configuração principais, além da árvore de configurações presente no diretório pessoal de cada usuário. São eles: gconf.xml.mandatory gconf.xml.defaults A árvore gconf.xml.mandatory determina como valores obrigatórios e inalteráveis todas as configurações ali contidas. O diretório gconf.xml.defaults contém valores padrões que são alteráveis pelos usuários. Entretanto, se no diretório pessoal do usuário já houver uma configuração salva, a presente neste diretório não fará efeito. No Sacix, a cada login as opções pessoais são removidas para que as contidas neste diretório sejam automaticamente aplicadas. No apêndice desta documentação é possível encontrar, em formato XML, as definições que fizemos no Sacix, tanto as obrigatórias quanto as padrões. Para importálas, devem ser executados os seguintes comandos: # gconftool2 load=gconf.mandatory direct configsource\ > xml:readwrite:/etc/gconf/gconf.xml.mandatory # gconftool2 load=gconf.defaults direct configsource\ > xml:readwrite:/etc/gconf/gconf.xml.defaults Nota 1: Se o arquivo tiver sido gerado usando uma codificação diferente de UTF8, será necessário convertêlo para este formato. O exemplo abaixo demonstra como converter um arquivo XML criado em formato ISO88591 utilizando o programa iconv: # iconv f iso88591 t utf8 gconf.defaults > gconf.defaults.utf8 Nota 2: para fazer a operação inversa (exportar as configurações), é preciso executar o comando gconftool2 usando o parâmetro dump, como no exemplo abaixo: # gconftool2 dump configsource\ > xml:readonly:/etc/gconf/gconf.xml / > gconf.mandatory 17. Acesso a dispositivos remotos No Sacix, utilizamos o protocolo SFTP para acessar os dispositivos de armazenamento do thin client, como o leitor de disquetes. Para que este acesso seja possível, é necessário que o servidor SSH do thin client esteja configurado para autenticar sessões SSH automaticamente através de chaves RSA públicas autorizadas. Os arquivos de configuração necessários estão disponíveis no apêndice da documentação. Também é necessário que o thin client tenha o suporte a supermount habilitado no kernel. Com este recurso, não é necessário montar os disquetes antes de acessálos, nem desmontar após seu uso. O arquivo fstab do thin client também precisa estar configurado para utilizar o supermount, como pode ser conferido no apêndice da documentação. Nesta versão, habilitamos suporte a leitores de CDROM e dispositivos USB, como câmeras digitas que utilizem o padrão USB Storage e chaveiros USB. Estes dispositivos são detectados durante o carregamento da sessão gráfica através de comandos inseridos no script session. Um detalhe que deve ser ressaltado é que não é possível alterar diretamente os arquivos contidos no dispositivo remoto. É necessário copiálos para a área de trabalho antes. Após todas as alterações terem sido feitas, basta arrastálos para uma janela aberta na pasta do dispositivo. 18. Suporte a som nos thin clients O suporte a som nos thin clients está disponível no Sacix. Para isto, é preciso que o kernel do thin client seja compilado com suporte à placa de som a ser utilizada no mesmo e que o hotplug esteja habilitado para carregar o módulo durante o boot. Além disto, um serviço de som é necessário no thin client. No Sacix, utilizamos o ESD, Enlightenment Sound Daemon. Criamos um script chamado esd no diretório init.d, da raiz do thin client, com as funções de iniciar e de parar o servidor de som, como pode ser visto no arquivo anexo, disponível no apêndice da documentação. Além deste script, também é necessário que se crie um link para o mesmo no diretório rc2.d, como no exemplo abaixo: # ln s /etc/init.d/esd /opt/sacix/root/etc/rc2.d/S02esd Os pacotes esd e aumix precisam ser instalados no servidor para que o script funcione: # aptitude install esd aumix No servidor, algumas alterações também devem ser feitas para que o usuário utilize o servidor de som presente no thin client. Uma delas é a inserção da linha export ESPEAKER=$USER:16001 no arquivo de script session. Outra é a presença de um arquivo no diretório /tmp, necessária para o funcionamento adequado do som em sites que utilizem o plugin flash no navegador: # mkdir /tmp/.esd # touch /tmp/.esd/socket # chmod a+r /tmp/.esd/socket No apêndice da documentação, incluímos um script chamado mkesd que pode ser adicionado ao diretório init.d do servidor para garantir a criação deste arquivo e diretório durante o boot do servidor. Para definir o ESOUND como plugin de saída padrão do Beep Media Player, movemos as bibliotecas libALSA.so e libOSS.so para um diretório chamado tmp dentro do diretório padrão das mesmas: # cd /usr/lib/bmp/Output # mkdir tmp # mv libALSA.so tmp # mv libOSS.so tmp Com o som configurado no thin client, é possível: navegar na Internet com som em sites que utilizem o plugin flash, ouvir músicas no programa Beep Media Player e assistir a vídeos no programa MPlayer. 19. Bootsplash O bootsplash habilita a inicialização em modo gráfico no thin client. É exibida uma imagem de fundo com boas vindas em vez das mensagens de inicialização do kernel. O patch do bootsplash para o kernel 2.6.11.12 pode ser encontrado em http://www.bootsplash.de/files/bootsplash3.1.62.6.11.diff Para aplicar o patch, é necessário executar o seguinte comando, dentro do diretório do kernel: # cd /usr/src/linux2.6.11.12 # patch p1 < bootsplash3.1.62.6.11.diff Após a aplicação do patch, selecione as opções abaixo para habilitar o bootsplash: Code maturity level options > [*] Prompt for development and/or incomplete code/drivers Processor type and features > [*] MTRR (Memory Type Range Register) support Device Drivers > Block devices > <*> Loopback device support <*> RAM disk support (4096) Default RAM disk size [*]Initial RAM disk (initrd) support Graphics support > [*] Support for frame buffer devices [*] VESA VGA graphics support Console display driver support > [*] Video mode selection support <*> Framebuffer Console support Bootsplash configuration > [*] Bootup splash screen Após compilado, devese copiar o kernel para o diretório /opt/sacix/boot e alterar o arquivo default para que utilize as opções do bootsplash durante o boot. Este arquivo pode ser encontrado no apêndice desta documentação. Para que a imagem seja utilizada no bootsplash, é necessário obter o binário splash, contido no pacote bootsplash, que pode ser obtido do repositório http://www.bootsplash.de/files/debian unstable main Após a atualização da lista de repositórios, basta executar os seguintes comandos: # aptitude d install bootsplash # cd /var/cache/apt/archives/ # ar x bootsplash_3.111_i386.deb data.tar.gz # tar xzf data.tar.gz –strippath=3 ./usr/sbin/splash C \ > /usr/local/sbin O bootsplash utiliza duas imagens: uma para o modo “silencioso” e outra para o modo “verbose”, como é possível constatar nos exemplos abaixo: Modo silent (silencioso): Modo verbose: O modo “verbose” pode ser acessado pressionando a tecla F2. Por padrão, defnimos no arquivo default que o modo utilizado no início será o silent. Após as imagens terem sido criadas, é preciso criar um arquivo com as configurações necessárias ao bootsplash. No apêndice, disponibilizamos um exemplo sob o nome de bootsplash.cfg, configurado para funcionar de acordo com as imagens aqui apresentadas, que são as mesmas utilizadas nos telecentros nesta versão. O comando splash deve ser executado da seguinte maneira: # splash s f bootsplash.cfg > bootsplash.img Devese então copiar a imagem gerada para o diretório boot do thin client: # cp bootsplash.img /opt/sacix/boot Nota: o bootsplash só funciona em dispositivos de vídeo compatível com o padrão VESA 2.0. Geralmente, pode se encontrar placas compatíveis com este padrão fabricadas a partir de 1996. 20. Scripts desenvolvidos e personalizações Durante o desenvolvimento do Sacix, desenvolvemos alguns scripts para facilitar algumas tarefas, tanto do administrador quanto do usuário. São elas: • ip.sh • hwserverclients.sh / hw.sh • sshkeys • nat • runonce • formatardisquete.sh • Variável TMOUT ip.sh O ip.sh é um script feito para mudar o IP do servidor e da rede que ele vai usar. Por padrão, temos configurado o IP 192.168.0.1 na rede 192.168.0.0/255.255.255.0. Com este script, podemos mudar todos os arquivos de configuração do servidor e do thin client que mencionem endereços IP ou de rede e que dependam dos mesmos para funcionar. Para utilizar o script, usase o o endereço de rede anterior como primeiro parâmetro e o novo como segundo parâmetro: # ip.sh 192.168.0. 192.168.1. hw-server-clients.sh / hw.sh Desenvolvemos um conjunto de scripts, disponíveis no apêndice da documentação, para que seja gerado um relatório de hardware do servidor e dos thin clients. Os scripts desenvolvidos são os seguintes: ● hw.sh ● session ● hwserverclients.sh O script hw.sh é um serviço do thin client. Ele é executado durante o boot, no runlevel padrão e salva os dados extraídos dos comandos cat /proc/cpuinfo, cat / proc/meminfo e lspci v em arquivos de texto dentro do diretório /tmp do thin client. Durante o início da sessão gráfica, alguns comandos são executados no script session para copiar estas informações para um diretório oculto chamado .hw dentro da pasta pessoal do usuário. Após a criação do script, é preciso criar um link para o diretório do runlevel padrão do thin client, o 2: # ln s /etc/init.d/hw.sh /opt/sacix/root/etc/rc2.d/S03hw.sh Para que as informações do hardware do thin client se tornem disponíveis no servidor, algumas linhas são necessárias no arquivo de script session, que prepara a sessão gráfica: /usr/local/bin/session ... mkdir $HOME/.hw 2>&1 > /dev/null &&\ for file in cpuinfo.txt meminfo.txt pci.txt do scp root@$USER:/tmp/$file $HOME/.hw done ... EOF O arquivo session, disponível no apêndice, já contém estas linhas inseridas. Em /usr/local/sbin, no servidor, temos o script hwserverclients.sh, que executa as seguintes tarefas: • obtém informações sobre o hardware do servidor • armazena informações sobre o hardware dos thin clients salvas nos diretórios pessoais dos usuários • une todas as informações de hardware, tanto do servidor quanto dos thin clients, em um único arquivo Este script é o único que não é executado automaticamente. Deve ser executado por algum técnico quando o mesmo precisar ter disponíveis estas informações rápida e facilmente. ssh-keys Para automatizar as operações de criação e cópia das chaves RSA dos usuários, criamos o script sshkeys. Com este script, tornase mais prático resolver problemas de autenticação de sessões SSH, tanto do servidor para os thin clients quanto destes para o servidor. Por executar alterações na raiz do thin client e nos diretórios pessoais de todos os usuários, este script deve ser executado como o usuário root. As tarefas executadas por este script são as seguintes: • cria as chaves RSA públicas e privadas dos usuários ecidadania do servidor • cria as chaves RSA pública e privada do usuário root do thin client • copia a chave pública do usuário root do thin client para o arquivo authorized_keys de cada usuário ecidadania • apaga todas as chaves RSA dos usuários do servidor e do usuário root do thin client As chaves RSA geradas se encontram disponíveis dentro do diretório especificado pela variável $KEYS_DIR, que por padrão definimos como /usr/share/sshkey. O script tem os seguintes parâmetros de funcionamento: create; copy e remove. Exemplo: # sshkeys create O parâmetro create primeiro remove as chaves RSA dos usuários para depois gerálas novamente. Por último, as copia para o diretório especificado em $KEYS_DIR. Ao utilizar o parâmetro copy, as chaves, se já tiverem sido copiadas para / usr/share/sshkey, são copiadas para os diretórios pessoais dos usuários. Assim, não é necessário gerar sempre uma nova chave se esta tiver sido apagada do diretório pessoal do usuário ou do arquivo authorized_keys do usuário a ser autenticado. O último parâmetro, remove, apenas remove as chaves, tanto dos diretórios pessoais quanto do diretório /usr/share/sshkey. nat Este pequeno script serve para habilitar o encaminhamento de conexões vindas de computadores dentro da mesma rede do telecentro que necessitem de uma conexão com a Internet. Geralmente as entidades que hospedam os telecentros precisam deste acesso; por isso, este script torna o servidor um gateway de acesso da rede local à Internet. Este script vem habilitado por padrão no servidor. Para instalálo, devese copiar o arquivo existente no apêndice da documentação e criar um link para ele no diretório /etc/rc2.d do servidor, para que seja ativado automaticamente a cada boot: # ln s /etc/init.d/nat /etc/rcS.d/S42nat Os parâmetros que o script aceita são start e stop. runonce Para controlar o número de instâncias de um programa sendo executadas pelo mesmo usuário, instalamos o runonce. É um programa feito em C disponível no apêndice da documentação que é chamado usando o programa a ser controlado como parâmetro, como no exemplo: # runonce epiphany epiphany O primeiro parâmetro é o nome da janela registrada no servidor X pelo programa; já o segundo é o próprio nome do programa. Este programa controla o número de instâncias de programas cujo nome da janela é o mesmo. No caso, utilizamos o runonce para permitir que apenas uma instância de certos programas seja permitida. Assim, quando um usuário clica para abrir mais vezes um programa que já se encontra aberto, não terá duas janelas deste abertas. Decidimos utilizar o runonce porque, como temos recursos escassos, muitas vezes os programas demoram para abrir, até mesmo para exibir a tela de inicialização do mesmo (splash screen); o usuário, portanto, acaba clicando novamente no ícone várias vezes por achar que o programa não abriu, quando na verdade está sendo carregado. Entretanto, é importante notar que programas modulares cujas instâncias utilizam um mesmo nome de janela podem não funcionar muito bem, como o Mozilla Browser e o Open Office. O que acontece é que, se uma instância do Open Writer for aberta, por exemplo, será impossível abrir qualquer instância da suíte, como o Calc, ou o Impress. O mesmo acontece com o Mozilla. Se o Mozilla Browser estiver aberto, não será possível abrir o Composer. Existe um timeout padrão de cinco minutos para o runonce, mas o modificamos para dez minutos. O códigofonte deste programa encontrase disponível no apêndice da nossa documentação. formatar-disquete.sh Para formatar os disquetes usando o leitor presente nos thin clients, foi criada uma ferramenta chamada formatardisquete.sh. Este programa utiliza o zenity disponível no pacote homônimo para exibir mensagens gráficas ao usuário, mas que executa por baixo um script shell para processar as opções do usuário. Este programa permite ao usuário formatar disquetes em dois sistemas de arquivos diferentes: vfat ou ext2. Após o usuário escolher seu sistema de arquivos, o disquete será formatado em alguns segundos. O script chama o comando ssh, que executa, no thin client, os comandos fdformat e mkfs.ext ou mkfs.vfat para, respectivamente, formatar o disquete criar o sistema de arquivos desejado. O script está disponível no apêndice da documentação. O script fica armazenado no diretório /usr/local/bin. Um ícone criado no diretório Desktop de cada usuário foi criado e foi criado para ser o mais simples possível para os usuários. A seguir, algumas fotos do programa em funcionamento: 21. Agradecimentos Agradecemos todas as pessoas que acreditam no projeto dos Telecentros, em especial todos os desenvolvedores que já trabalharam neste projeto: Caio Begotti Francisco Edilton Frederico Souza Camara Lucas de Souza Santos Luiz Fernando Nogueira Capitulino Marcos Taschelmayer Yuri Robinson de Souza e um agradecimento especial a Ronaldo Ferreira Marques, por ter criado os exercícios em português para o programa Ktouch. 22. Apêndice /opt/sacix/root/etc/inittab id:2:initdefault: si::sysinit:/etc/init.d/rcS ~~:S:wait:/sbin/sulogin l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 z6:6:respawn:/sbin/sulogin ca:12345:ctrlaltdel:/sbin/shutdown t1 a h now pf::powerwait:/etc/init.d/powerfail start pn::powerfailnow:/etc/init.d/powerfail now po::powerokwait:/etc/init.d/powerfail stop 1:23:respawn:/usr/local/sbin/agetty n l /usr/local/sbin/autologin 38400 tty1 /opt/sacix/root/etc/fstab none /proc proc defaults 0 0 none /proc/bus/usb usbfs defaults 0 0 none /tmp ramfs defaults,rw 0 0 192.168.0.1:/bin /bin nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/sbin /sbin nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/usr /usr nfs nolock,exec,rsize=8192,ro 0 0 192.168.0.1:/lib /lib nfs nolock,exec,rsize=8192,ro 0 0 none /floppy supermount dev=/dev/fd0,fs=auto,,sync,iocharset=iso8859 1,codepage=850,umask=0 0 0 none /cdrom supermount dev=/tmp/cdrom,fs=auto,,sync,iocharset=iso8859 1,codepage=850,umask=0 0 0 none /usb supermount dev=/tmp/camera,fs=auto,,sync,iocharset=iso8859 1,codepage=850,umask=0 0 0 /opt/sacix/root/etc/ssh/ssh_config StrictHostKeyChecking no /opt/sacix/root/etc/ssh/sshd_config Port 22 Protocol 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key UsePrivilegeSeparation no KeyRegenerationInterval 3600 ServerKeyBits 768 SyslogFacility AUTH LogLevel INFO LoginGraceTime 600 PermitRootLogin yes StrictModes no RSAAuthentication yes PubkeyAuthentication yes IgnoreRhosts yes RhostsRSAAuthentication no HostbasedAuthentication no PermitEmptyPasswords yes PasswordAuthentication yes X11Forwarding no X11DisplayOffset 10 PrintMotd no KeepAlive yes Subsystem sftp /usr/lib/sftpserver /opt/sacix/root/etc/init.d/hw.sh #! /bin/sh # # hw.sh Relatório básico de hardware # Este arquivo salva informações básicas sobre o hardware do thin # client e os armazena no /tmp. Um script do servidor deverá pegar # estes logs posteriormente. # (baseado no scritp skeleton, do Debian GNU/Linux) # # Autor: Eduardo Costa Lisboa <[email protected]> . # # Version: @(#)20050725 25Jul2005 # set e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="Relatório de Hardware" NAME=hw.sh SCRIPTNAME=/etc/init.d/$NAME # Gracefully exit if the package has been removed. test x $SCRIPTNAME || exit 0 # # Function that starts the daemon/service. # d_start() { for file in cpuinfo meminfo do cat /proc/$file > /tmp/$file.txt done lspci v > /tmp/pci.txt } # # Function that stops the daemon/service. # d_stop() { for file in cpuinfo meminfo do rm f /tmp/$file.txt done rm f /tmp/pci.txt } case "$1" in start) echo n "Starting $DESC: $NAME" d_start echo "." ;; stop) echo n "Stopping $DESC: $NAME" d_stop echo "." ;; restart) echo n "Restarting $DESC: $NAME" d_stop echo "." sleep 1 d_start echo "." ;; *) echo "Usage: $0 {start|stop|restart}" >&2 exit 1 ;; esac exit 0 /opt/sacix/root/etc/init.d/esd #!/bin/bash case "$1" in 'start') echo "Starting esound: esd." aumix v90 w90 p90 m90 c90 l90 i90 190 > /dev/null 2> / dev/null esd tcp public nobeeps > /dev/null 2> /dev/null & ;; 'stop') echo "Stoping esound: esd." killall 9 esd > /dev/null 2> /dev/null ;; 'restart') #echo "Restarting esound: esd." killall HUP esd > /dev/null 2> /dev/null ;; *) echo "Usage: esd {start|stop|restart}" esac /opt/sacix/root/etc/init.d/mkvar #!/bin/bash LIST="/tmp/var /var/log/ksymoops /var/lib /var/log /var/opt /var/run /var/tmp / var/local /var/lock /var/lib/xkb /var/run/sshd /var/lib/usbutils" case "$1" in 'start') echo "Creating var's tree ..." for DIR in $LIST do mkdir p "$DIR" done touch /tmp/{mtab,nologin.conf,hostname} touch /var/lib/usbutils/usb.ids ;; 'stop') echo "Removing var's tree ..." rm rf /tmp/var ;; *) echo "Usage: $0 {start|stop}" esac /opt/sacix/root/etc/profile if [ "`id u`" eq 0 ]; then PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X1 1" else PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games" fi if [ "$PS1" ]; then if [ "$BASH" ]; then PS1='\u@\h:\w\$ ' else if [ "`id u`" eq 0 ]; then PS1='# ' else PS1='$ ' fi fi fi export PATH umask 022 echo e "Aguarde... detectando a placa de vídeo." cp /etc/X11/XF86Config4 /tmp DEVS=$(xdebconfigurator 2>&1 | egrep 'VIDEO DRIVER:|MONITOR DEFAULT DEPTH:') VIDEO=$(echo $DEVS | sed 's/[^az]//g') DEPTH=$(echo $DEVS | sed 's/[^09]//g') if [ ! z $VIDEO ]; then sed i "s/vga/$VIDEO/" /tmp/XF86Config4 fi if [ ! z $DEPTH ]; then sed i "s/DefaultDepth \+8/DefaultDepth $DEPTH/" /tmp/XF86Config4 fi while [ true ] do /etc/init.d/esd restart xinit /usr/bin/X11/X xf86config /tmp/XF86Config4 > /dev/null 2> / dev/null done /opt/sacix/root/etc/X11/xinit/xinitrc for ETH in eth{0,1} do TMP=$(LC_ALL=C /sbin/ifconfig $ETH | grep inet | sed 's/^\ \+//g;s/Bcast.*//;s/[az :]//g') if [ ! z "$TMP" ] then IP=$TMP fi done NID=$(($(echo $IP | cut d. f4)10)) HOSTNAME="ecidadania$NID" echo "127.0.0.1 localhost.local localhost" > /etc/hosts echo "$IP ecidadania$NID.local ecidadania$NID" >> /etc/hosts hostname ecidadania$NID # Kill all user's process ssh [email protected] 'kill 9 $(ps x o pid)' xhost +192.168.0.1 ssh [email protected] /usr/local/bin/session /opt/sacix/root/etc/X11/XF86Config4 Section "Files" FontPath FontPath FontPath FontPath FontPath FontPath FontPath FontPath FontPath EndSection "/usr/lib/X11/fonts/misc" "/usr/lib/X11/fonts/cyrillic" "/usr/lib/X11/fonts/100dpi/:unscaled" "/usr/lib/X11/fonts/75dpi/:unscaled" "/usr/lib/X11/fonts/Type1" "/usr/lib/X11/fonts/CID" "/usr/lib/X11/fonts/Speedo" "/usr/lib/X11/fonts/100dpi" "/usr/lib/X11/fonts/75dpi" Section "Module" Load "GLcore" Load "bitmap" Load "dbe" Load "ddc" Load "dri" Load Load Load Load Load Load Load Load EndSection "extmod" "freetype" "glx" "int10" "record" "speedo" "type1" "vbe" Section "InputDevice" Identifier "Generic Keyboard" Driver "keyboard" Option "CoreKeyboard" Option "XkbRules" "xfree86" Option "XkbModel" "abnt2" Option "XkbLayout" "br" EndSection Section "InputDevice" Identifier "Configured Mouse" Driver "mouse" Option "CorePointer" Option "Device" Option "Protocol" Option "Emulate3Buttons" Option "ZAxisMapping" EndSection Section "InputDevice" Identifier "Generic Mouse" Driver "mouse" Option "SendCoreEvents" Option "Device" Option "Protocol" Option "Emulate3Buttons" Option "ZAxisMapping" EndSection Section "Device" Identifier Driver EndSection "/dev/psaux" "ImPS/2" "true" "4 5" "true" "/dev/input/mice" "ImPS/2" "true" "4 5" "Placa de Vídeo Genérica" "vga" Section "Monitor" Identifier "Monitor Genérico" HorizSync 31.548.5 VertRefresh 5070 Option "DPMS" EndSection Section "Screen" Identifier "Default Screen" Device "Placa de Vídeo Genérica" Monitor "Monitor Genérico" DefaultDepth 16 SubSection "Display" Depth 1 Modes "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 4 Modes "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 8 Modes "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 15 Modes "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 16 Modes "1024x768" "800x600" "640x480" EndSubSection SubSection "Display" Depth 24 Modes "1024x768" "800x600" "640x480" EndSubSection EndSection Section "ServerLayout" Identifier "Default Layout" Screen "Default Screen" InputDevice "Generic Keyboard" InputDevice "Configured Mouse" InputDevice "Generic Mouse" EndSection /etc/exports /opt/sacix/root 192.168.0.0/255.255.255.0 (ro,no_root_squash,sync,no_all_squash) /bin /sbin /lib /usr 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash) /etc/default/atftpd USE_INETD=false OPTIONS="daemon port 69 retrytimeout 5 mcastport 17581788 mcast addr 255.255.255.0255 mcastttl 1 maxthread 30 verbose=0 / opt/sacix/boot" /etc/dhcp3/dhcpd.config Serveridentifier 192.168.0.1; ignore unknownclients; ddnsupdatestyle adhoc; defaultleasetime 600; maxleasetime 1600; option subnetmask 255.255.255.0; option broadcastaddress 192.168.0.255; option routers 192.168.0.1; option domainname "telecentrosp.local"; option domainnameservers 192.168.0.1; option rootpath "192.168.0.1:/opt/sacix/root"; filename "/pxelinux.0"; #filename "/2.6.11.12cliente.etb"; # para PXE < 2.0 option option128 code 128 = string; option option129 code 129 = text; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.11 192.168.0.30; } group { host ecidadania2 { hardware ethernet 00:0A:5E:44:93:D7; fixedaddress 192.168.0.12; option hostname "ecidadania2"; } } # # host ecidadania2 { hardware ethernet 00:0A:5E:44:93:D7; } #} /etc/ssh/sshd_config # Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 22 # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes # Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 768 # Logging SyslogFacility AUTH LogLevel INFO # Authentication: LoginGraceTime 600 PermitRootLogin yes StrictModes no RSAAuthentication yes PubkeyAuthentication yes #AuthorizedKeysFile %h/.ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication #IgnoreUserKnownHosts yes # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to no to disable s/key passwords #ChallengeResponseAuthentication yes # Change to yes to enable tunnelled clear text passwords PasswordAuthentication no # To change Kerberos options #KerberosAuthentication no #KerberosOrLocalPasswd yes #AFSTokenPassing no #KerberosTicketCleanup no # Kerberos TGT Passing does only work with the AFS kaserver #KerberosTgtPassing yes X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog yes KeepAlive yes #UseLogin no #MaxStartups 10:30:60 #Banner /etc/issue.net Subsystem sftp /usr/lib/sftpserver UsePAM yes /etc/ssh/ssh_config # $OpenBSD: ssh_config,v 1.15 2002/06/20 20:03:34 stevesk Exp $ # This is the ssh client systemwide configuration file. See # ssh_config(5) for more information. This file provides defaults for # users, and the values can be changed in peruser configuration files # or on the command line. # Configuration data is parsed as follows: # 1. command line options # 2. userspecific file # 3. systemwide file # Any configuration value is only changed the first time it is set. # Thus, hostspecific definitions should be at the beginning of the # configuration file, and defaults at the end. # Sitewide defaults for various options # Host * # ForwardAgent no # ForwardX11 no # RhostsAuthentication no # RhostsRSAAuthentication no # RSAAuthentication yes # PasswordAuthentication yes # BatchMode no # CheckHostIP yes StrictHostKeyChecking no # IdentityFile ~/.ssh/identity # IdentityFile ~/.ssh/id_rsa # IdentityFile ~/.ssh/id_dsa # Port 22 # Protocol 2,1 # Cipher 3des # Ciphers aes128cbc,3descbc,blowfishcbc,cast128cbc,arcfour,aes192 cbc,aes256cbc # EscapeChar ~ /etc/squid/squid.conf http_port 3128 #cache_peer 192.168.14.11 parent 80 3130 noquery hierarchy_stoplist cgibin ? acl QUERY urlpath_regex cgibin \? no_cache deny QUERY cache_mem 16 MB maximum_object_size 1000 KB cache_dir ufs /var/cache/squid 64 16 256 cache_access_log /dev/null cache_log /dev/null cache_store_log /dev/null client_netmask 255.255.255.0 ftp_passive on acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl proxy src 192.168.0.0/255.255.255.0 acl porn dstdomain "/etc/squid/porn" acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 102565535 # unregistered ports acl Safe_ports port 280 # httpmgmt acl Safe_ports port 488 # gsshttp acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl Safe_ports port 901 # SWAT acl Safe_ports port 1863 # MSN acl Safe_ports port 5190 # ICQ acl Safe_ports port 22 # SSH acl purge method PURGE acl CONNECT method CONNECT http_access allow manager localhost http_access allow manager proxy http_access deny manager http_access allow purge localhost http_access deny purge http_access deny porn all http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access allow proxy http_access deny all icp_access allow all #never_direct allow all icon_directory /usr/lib/squid/errors/Portuguese error_directory /usr/lib/squid/errors/Portuguese /etc/cups/cupsd.conf ServerAdmin [email protected] DefaultCharset notused LogLevel info Printcap /var/run/cups/printcap Port 631 <Location /> Order Deny,Allow Deny From All Allow From 127.0.0.1 </Location> <Location /jobs> AuthType Basic AuthClass Group AuthGroupName adm Order Deny,Allow Deny From All Allow From 127.0.0.1 </Location> Order Deny, Allow Deny From All <Location /admin> AuthType Basic AuthClass Group AuthGroupName adm Order Deny,Allow Deny From All Allow From 127.0.0.1 </Location> /etc/init.d/nat #!/bin/bash case "$1" in 'start') iptables t nat A POSTROUTING s 192.168.0.0/24 o eth0 j MASQUERADE echo 1 > /proc/sys/net/ipv4/ip_forward ;; 'stop') echo 0 > /proc/sys/net/ipv4/ip_forward iptables t nat F ;; esac /etc/init.d/mkesdfile #!/bin/bash case "$1" in 'start') echo "Creating esound file for client ..." mkdir /tmp/.esd 2> /dev/null touch /tmp/.esd/socket 2> /dev/null ;; 'stop') echo "Removing esound file for client ..." rm rf /tmp/.esd ;; *) echo "Usage: $0 {start|stop}" ;; esac /etc/init.d/monitor #!/bin/bash # # Script de monitoramento de desempenho dos servidores dos Telecentros # # Autor: Kung te Yang ([email protected]) # Data: 14/07/2004 # Versão: 1.0 # MONITORDIR="/var/log/monitor" function data { DATE=$(date +%e" "%b" "%Y) TIME=$(date +%R) } function mem_file { if [ ! e "$MONITORDIR/mem.log" ] then echo e "\t\t\t Memory\t Swap\t Cache" >> $MONITORDIR/mem.log echo e " Data\t\tHorario\t used\t free\tused\tfree\tused\tfree" >> $MONITORDIR/mem.log echo e "" >> $MONITORDIR/mem.log fi echo e $DATE"\t"$TIME"\t "$MEMUSED"M\t" $MEMFREE"M\t"$SWAPUSED"M\t"$SWAPFREE"M\t"$CACHEUSED"M\t"$CACHEFREE"M" >> $MONITORDIR/mem.log } function memory { MEM=$(free m | sed 1d | cut c 2540 | sed 's/ \+/ /g') MEMUSED=$(echo $MEM | cut d" " f1) MEMFREE=$(echo $MEM | cut d" " f2) CACHEUSED=$(echo $MEM | cut d" " f3) CACHEFREE=$(echo $MEM | cut d" " f4) SWAPUSED=$(echo $MEM | cut d" " f5) SWAPFREE=$(echo $MEM | cut d" " f6) mem_file } function hard_disk { SIZES=$(df m | egrep '(/|/boot|/usr|/var|/var/cache|/tmp|/home|/opt)$' | cut c 2550 | sed 's/ \+/ /g') ROOTTOTAL=$(echo $SIZES | cut d" " f1) ROOTUSED=$(echo $SIZES | cut d" " f2) ROOTFREE=$(echo $SIZES | cut d" " f3) BOOTTOTAL=$(echo $SIZES | cut d" " f4) BOOTUSED=$(echo $SIZES | cut d" " f5) BOOTFREE=$(echo $SIZES | cut d" " f16) USRTOTAL=$(echo $SIZES | cut d" " f7) USRUSED=$(echo $SIZES | cut d" " f8) USRFREE=$(echo $SIZES | cut d" " f9) VARTOTAL=$(echo $SIZES | cut d" " f10) VARUSED=$(echo $SIZES | cut d" " f11) VARFREE=$(echo $SIZES | cut d" " f12) CACHETOTAL=$(echo $SIZES | cut d" " f13) CACHEUSED=$(echo $SIZES | cut d" " f14) CACHEFREE=$(echo $SIZES | cut d" " f15) TMPTOTAL=$(echo $SIZES | cut d" " f16) TMPUSED=$(echo $SIZES | cut d" " f17) TMPFREE=$(echo $SIZES | cut d" " f18) HOMETOTAL=$(echo $SIZES | cut d" " f19) HOMEUSED=$(echo $SIZES | cut d" " f20) HOMEFREE=$(echo $SIZES | cut d" " f21) OPTTOTAL=$(echo $SIZES | cut d" " f22) OPTUSED=$(echo $SIZES | cut d" " f23) OPTFREE=$(echo $SIZES | cut d" " f24) TOTALTAM=0 for TOTAL in $ROOTTOTAL $BOOTTOTAL $USRTOTAL $VARTOTAL $CACHETOTAL $TMPTOTAL $OPTTOTAL $HOMETOTAL do TOTALTAM=$(expr $TOTALTAM + $TOTAL) done TOTALUSED=0 for USED in $ROOTUSED $BOOTUSED $USRUSED $VARUSED $CACHEUSED $TMPUSED $OPTUSED $HOMEUSED do TOTALUSED=$(expr $TOTALUSED + $USED) done TOTALFREE=0 for FREE in $ROOTFREE $BOOTFREE $USRFREE $VARFREE $CACHEFREE $TMPFREE $OPTFREE $HOMEFREE do TOTALFREE=$(expr $TOTALFREE + $FREE) done hd_file } function hd_file { echo e "Data: "$DATE"\tHorario: "$TIME >> $MONITORDIR/disk.log echo e "" >> $MONITORDIR/disk.log echo e "Particao\tTam\tUsado\tDisp" >> $MONITORDIR/disk.log echo e root"\t\t"$ROOTTOTAL"M\t"$ROOTUSED"M\t"$ROOTFREE"M" >> $MONITORDIR/disk.log echo e boot"\t\t"$BOOTTOTAL"M\t"$BOOTUSED"M\t"$BOOTFREE"M" >> $MONITORDIR/disk.log echo e usr"\t\t"$USRTOTAL"M\t"$USRUSED"M\t"$USRFREE"M" >> $MONITORDIR/disk.log echo e var"\t\t"$VARTOTAL"M\t"$VARUSED"M\t"$VARFREE"M" >> $MONITORDIR/disk.log echo e cache"\t\t"$CACHETOTAL"M\t"$CACHEUSED"M\t"$CACHEFREE"M" >> $MONITORDIR/disk.log echo e tmp"\t\t"$TMPTOTAL"M\t"$TMPUSED"M\t"$TMPFREE"M" >> $MONITORDIR/disk.log echo e home"\t\t"$HOMETOTAL"M\t"$HOMEUSED"M\t"$HOMEFREE"M" >> $MONITORDIR/disk.log echo e opt"\t\t"$OPTTOTAL"M\t"$OPTUSED"M\t"$OPTFREE"M" >> $MONITORDIR/disk.log echo e "Total\t\t"$TOTALTAM"M\t"$TOTALUSED"M\t"$TOTALFREE"M\n" >> $MONITORDIR/disk.log } function desempenho { NPROC=$(ps A | wc l) NUSER=$(users | wc w) LOADAVERAGE=$(cat /proc/loadavg | cut d" " f1,2,3) CPU=$(ps ax o %cpu,comm | grep v %CPU | sort nr | uniq | head n 10) MEM=$(ps ax o %mem,comm | grep v %MEM | sort nr | uniq | head n 10) perf_file } function perf_file { echo e "Data: $DATE\tHorario: $TIME\n" >> $MONITORDIR/perf.log echo e "N. Processos: $NPROC" >> $MONITORDIR/perf.log echo e "N. Usuarios : $NUSER" >> $MONITORDIR/perf.log echo e "Load Average: $LOADAVERAGE" >> $MONITORDIR/perf.log echo e "" >> $MONITORDIR/perf.log echo e "%CPU Command" >> $MONITORDIR/perf.log echo e "$CPU" >> $MONITORDIR/perf.log echo e "" >> $MONITORDIR/perf.log echo e "%Mem Command" >> $MONITORDIR/perf.log echo e "$MEM\n\n" >> $MONITORDIR/perf.log } case "$1" in 'start') if [ ! e "/tmp/monitor.lock" ] then echo e "Starting monitor script: monitor" touch /tmp/monitor.lock if [ ! d $MONITORDIR ] then mkdir $MONITORDIR 2> /dev/null fi while [ true ] do data memory #hard_disk desempenho sleep 300 done & else echo e "Monitor script is already running ..." exit 1 fi ;; 'stop') if [ e "/tmp/monitor.lock" ] then echo "Stoping monitor script: monitor" rm rf /tmp/monitor.lock kill $(ps ax o pid,comm | grep monitor | sed 's/ /\n/g' | grep '^[09]') else echo e "Monitor script is not running ..." exit 1 fi ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac /usr/local/sbin/ip.sh #!/bin/bash # # ip.sh Altera o endereço IP # # O processo de alteração do endereço IP da rede dos thinclient é # necessário alter diversos arquivos de configuração da rede. E muitas # vezes perdemos muito tempo tentando lembrar quais arquivos deverão # ser modificados. Portanto, esse script tratará desse problema. # # Autor: Kung te Yang <[email protected]> # # Version: @(#) 20050812 12Ago2005 # IP filter test IP1=$(echo $1 | egrep '\b(25[05]|2[04][09]|[01]?[09][09]?)\.(25[05]|2[04] [09]|[01]?[09][09]?)\.(25[05]|2[04][09]|[01]?[09][09]?)\.$') IP2=$(echo $2 | egrep '\b(25[05]|2[04][09]|[01]?[09][09]?)\.(25[05]|2[04] [09]|[01]?[09][09]?)\.(25[05]|2[04][09]|[01]?[09][09]?)\.$') if [ z $IP1 ] || [ z $IP2 ] then echo "Usage: ip.sh [OLD_IP] [NEW_IP]" echo "Example: ip.sh 192.168.0. 192.168.1." exit 1 fi OLD_IP=$IP1 NEW_IP=$IP2 # List of file configuration LIST="/etc/network/interfaces /etc/exports /etc/hosts /etc/dhcp3/dhcpd.conf / opt/sacix/root/etc/fstab /opt/sacix/boot/pxelinux.cfg/default / opt/sacix/root/etc/X11/xinit/xinitrc / etc/gconf/gconf.xml.defaults/system/http_proxy/%gconf.xml / etc/gconf/gconf.xml.defaults/system/proxy/%gconf.xml /etc/hosts.deny / etc/init.d/nat /etc/init.d/nat /etc/squid/squid.conf" for FILE in $LIST do sed i 's/'$OLD_IP'/'$NEW_IP'/g' $FILE done echo "IP ${OLD_IP}1 to ${NEW_IP}1 changed." echo "" read p "Do you want restart all network service? [y|N]" ASK if [ "$ASK" = "y" ] then for SRV in networking dhcp3server atftpd nfskernelserver nat squid do /etc/init.d/$SRV restart done fi /usr/local/sbin/sshkeys #!/bin/bash # # sshkeys Gera chaves RSA # # Este script gera chaves RSA de cada usuário, # permitindo o autologin via SSH # # Autor: Kung te Yang <[email protected]> # # Version: @(#) 20050701 01July2005 # KEYS_DIR="/usr/share/sshkey" CLIENT_ROOTDIR="/opt/sacix/root/root" create_key () { remove_key echo e "Creating users keys ..." for i in $(seq 1 20) do mkdir p $KEYS_DIR/ecidadania$i 2> /dev/null su ecidadania$i c ' \ mkdir p .ssh 2> /dev/null sshkeygen t rsa f ~/.ssh/id_rsa N ""' > /dev/null mkdir $KEYS_DIR/ecidadania$i 2> /dev/null cp /home/ecidadania$i/.ssh/* $KEYS_DIR/ecidadania$i/ done echo e "Creating client's root key ..." mkdir $CLIENT_ROOTDIR/.ssh 2> /dev/null sshkeygen t rsa f $CLIENT_ROOTDIR/.ssh/id_rsa N "" > /dev/null mkdir p $KEYS_DIR/client 2> /dev/null cp $CLIENT_ROOTDIR/.ssh/* $KEYS_DIR/client/ copy_key } copy_key () { rm rf $KEYS_DIR/client/authorized_keys echo e "Coping users keys ..." for i in $(seq 1 20) do rm rf /home/ecidadania$i/.ssh/authorized_keys mkdir /home/ecidadania$i/.ssh 2> /dev/null chmod 500 /home/ecidadania$i/.ssh cp $KEYS_DIR/client/id_rsa.pub / home/ecidadania$i/.ssh/authorized_keys chown R ecidadania$i.users /home/ecidadania$i/.ssh cat $KEYS_DIR/ecidadania$i/id_rsa.pub >> $KEYS_DIR/client/authorized_keys done find /home name authorized_keys exec chmod 400 {} \; echo e "Coping client's root key" mkdir $CLIENT_ROOTDIR/.ssh 2> /dev/null cp $KEYS_DIR/client/authorized_keys $CLIENT_ROOTDIR/.ssh/ chmod 400 $CLIENT_ROOTDIR/.ssh/authorized_keys } remove_key () { echo e "Removing users key ..." for i in $(seq 1 20) do rm rf /home/ecidadania$i/.ssh rm rf $KEYS_DIR/ecidadania$i/* done echo e "Removing client's root key ..." rm rf $KEYS_DIR/client/* rm rf $CLIENT_ROOTDIR/.ssh } if [ $UID ne 0 ] then echo "*** WARNING!!! Run as root only to execute sshkeys command at server ***" exit 1 fi case "$1" in 'create') create_key ;; 'copy') copy_key ;; 'remove') remove_key ;; *) echo e "Usage: sshkeys {create|copy|remove}" ;; esac /usr/local/sbin/hwserverclients.sh #! /bin/sh # # /etc/init.d/hwserverclients.sh # Relatório básico de hardware # # Este arquivo salva informações básicas sobre o hardware do servidor # e os armazena em "/root/hwserver.tar.bz2". # # Este script também gera um arquivo chamado # "/root/hwclients.tar.bz2" # contendo o conteúdo dos diretórios .hw de cada usuário. # Estes diretórios contém arquivos com informações sobre o hardware # dos thin clients. # # Por último, as informações dos thin clients são armazenadas # junto com as informações do hardware do servidor em um único arquivo # (baseado no scritp skeleton, do Debian GNU/Linux) # # Autor: Eduardo Costa Lisboa <[email protected]> . # # Version: @(#)20050726 26Jul2005 # set e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Gracefully exit if the package has been removed. test x $SCRIPTNAME || exit 0 go_server() { SERVDIR="/root/hwserver" if [ ! d "$SERVDIR" ] then rm f "$SERVDIR" 2>&1 > /dev/null mkdir "$SERVDIR" fi for file in cpuinfo meminfo do cat /proc/"$file" > "$SERVDIR"/"$file"server.txt done lspci v > "$SERVDIR"/pcidevserver.txt fdisk l > "$SERVDIR"/parttsserver.txt 2> /dev/null df h > "$SERVDIR"/mountsserver.txt uname a > "$SERVDIR"/kernelserver.txt arp n > "$SERVDIR"/arptblserver.txt date +%Y%m%d%H%M%S > "$SERVDIR"/datalgserver.txt if [ z "$ALL" ] then echo "Compactando o diretório $SERVDIR, aguarde..." tar cvf "$SERVDIR".tar "$SERVDIR" 2> /dev/null bzip2 f v 9 "$SERVDIR".tar 2> /dev/null fi } go_client() { CLIDIR="/root/hwclients" if [ ! d "$CLIDIR" ] then rm f "$CLIDIR" 2>&1 > /dev/null mkdir "$CLIDIR" else rm rf $CLIDIR/* fi echo "Copiando arquivos de relatório dos thin clients, aguarde..." for n in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 do host=$(($n+10)) if [ d /home/ecidadania$n/.hw ] then mkdir "$CLIDIR"/tc$host 2>&1 > /dev/null cp /home/ecidadania$n/.hw/{{cpu,mem}info,pci}.txt "$CLIDIR"/tc$host else echo "Diretório .hw de ecidadania$n não encontrado" | tee $CLIDIR/tc$host fi done if [ z "$ALL" ] then echo "Compactando relatórios dos thin clients, aguarde..." tar cvf "$CLIDIR".tar "$CLIDIR" 2> /dev/null bzip2 f v 9 "$CLIDIR".tar 2> /dev/null fi } go_all() { ALL="true" go_server go_client echo "Compactando relatórios do hardware do servidor e dos thin clients" tar cfv hwserverclients.tar /root/hw{server,clients} 2> /dev/null &&\ bzip2 f v 9 hwserverclients.tar 2> /dev/null } go_clean() { rm rf /root/hw{server,clients} 2>&1 > /dev/null } case "$1" in server) echo "Gerando relatórios do hardware do servidor" go_server echo "." ;; clients) echo "Gerando relatórios do hardware dos thin clients" go_client echo "." ;; all) echo "Gerando relatórios do hardware do servidor e dos thin clients" go_all echo "." ;; clean) echo "Limpando tudo até a última ponta" go_clean echo "." ;; *) echo "Uso: $0 {server|clients|all|clean}" >&2 exit 1 ;; esac exit 0 /usr/loca/bin/session #!/bin/bash # Global variables DISPLAY=$USER:0.0 ESPEAKER=$USER:16001 LANGUAGE="pt_BR" LANG="pt_BR" export DISPLAY ESPEAKER LANGUAGE LANG TELE_SHARE="/usr/share/gnometelecentro" # Remove old files from user find /tmp user $USER maxdepth 1 exec rm rf {} \; find $HOME maxdepth 1 \( name '.*' a ! \( name '.evolution' o \ name '.gconf' \) \) exec rm rf {} \; find $HOME/.gconf maxdepth 2 type d ! \( name '.gconf' o name 'apps' o \ name 'evolution' \) exec rm rf {} \; rm rf $HOME/Desktop # Copy default Desktop mkdir $HOME/Desktop cp a $TELE_SHARE/gnomedesktop/* $HOME/Desktop # Copy ktouch configuration mkdir p $HOME/.kde/share/config cp a $TELE_SHARE/ktouchrc $HOME/.kde/share/config/ # Create public_html at $HOME mkdir $HOME/public_html # Create Floppy icon on Desktop echo e " [Desktop Entry] Name=Acessar Disquete Name[pt_BR]=Acessar Disquete Type=Application Icon=/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png Exec=nautilus sftp://root@$USER/floppy" > $HOME/Desktop/Acessar\ Disquete.desktop # Create CDROM icon on Desktop CDROM=$(ssh root@$USER 'hwinfo cdrom | grep "Device File" | cut d: f2 | sed s/\ //g') [ ! z "$CDROM" ] &&\ ssh root@$USER "ln sf $CDROM /tmp/cdrom" &&\ cat <<EOF > $HOME/Desktop/Acessar\ CDROM.desktop [Desktop Entry] Name=Acessar CDROM Name[pt_BR]=Acessar CDROM Type=Application Icon=/usr/share/icons/telecentro/48x48/devices/cdrom_mount.png Exec=nautilus sfp://root@$USER/cdrom EOF # Create USBSTORAGE icon on Desktop USB=$(ssh root@$USER 'hwinfo scsi | grep "Device File" | cut d: f2 | sed s/\ //g') [ ! z "$USB" ] &&\ USB=${USB}1 ssh root@$USER "ln sf $USB /tmp/camera" &&\ cat <<EOF > $HOME/Desktop/Acessar\ Dispositivo\ USB.dekstop [Desktop Entry] Name=Acessar Dispositivo USB Name[pt_BR]=Acessar Dispositivo USB Type=Application Icon=/usr/share/icons/telecentro/48x48/devices/camera.png Exec=nautilus sftp://root@$USER/usb EOF # Copy report files to $HOME mkdir $HOME/.hw 2>&1 > /dev/null &&\ for file in cpuinfo.txt meminfo.txt pci.txt do scp root@$USER:/tmp/$file $HOME/.hw done # Start session /usr/bin/xloadimage fullscreen onroot /usr/share/wallpapers/wallpaper loading.jpg gnomesession /usr/local/bin/formatardisquete.sh #!/bin/bash # # formatardisquete.sh # # Este script permite a formatação de disquete # localmente no thinclient # # Author: Kung te Yang <[email protected]> # # Version: @(#) 20050818 18Ago2005 # FS=$(zenity \ title="Formatar Disquete" \ width=410 height=183 \ windowicon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \ list \ radiolist \ text="Selecione o sistema de arquivo:" \ column="" \ column="Sistema de Arquivo" \ column="Descricao" \ TRUE "vfat" "Compativel no Windows" \ FALSE "ext2" "Compativel no Linux") check_floppy() { ssh q root@$USER 'umount /floppy; dd if=/dev/zero of=/dev/fd0 bs=1 count=1' } format_floppy() { ssh q root@$USER 'fdformat n /dev/fd0' | \ zenity title "Formatar Disquete" \ window icon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \ progress text="Formatando o disquete ..." pulsate autoclose } createfs() { COMMAND="mkfs.$1 /dev/fd0; mount /floppy" echo $COMMAND ssh q root@$USER $COMMAND | \ zenity title "Formatar Disquete" \ window icon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \ progress pulsate text="Criando o sistema de arquivo ..." } # main check_floppy if [ $? ne 0 ] then zenity \ title="Formatar Disquete" \ error text="O disquete nao foi encontrado ou esta corrompido!" exit 1 fi format_floppy sleep 1 createfs $FS Lista de pacotes instalados aalib1 adduser airstrike airstrikecommon anjuta anjutacommon apache apachecommon apache2utils apt aptutils arj aspell aspellbin aspellen aspellptbr aspellptcommon atspi atftpd atlas3base aumix baseconfig basefiles basepasswd bash bc beepmediaplayer binutils blt bluefish brazilianconjugate bsdmainutils bsdutils bzip2 cabextract capplets cappletsdata cdrecord consolecommon consoledata consoletools coreutils cpio cpp cpp3.3 cramfsprogs cron cupsomaticppd cupsys cupsysbsd cupsysclient cupsysdrivergimpprint cupsysdrivergimpprint data dash dbus1 dbusglib1 debconf debconfi18n debconfutils debianutils deborphan debsums defoma desktopbase desktopfileutils dhcpclient dhcp3common dhcp3server dia diacommon diagnome dialibs dialog dict dictfreedictdeupor dictfreedictengpor dictfreedictpordeu dictfreedictporeng dictgcide dictjargon dictmobythesaurus dictvera dictwn dictd dictionariescommon dictzip diff discover1 discover1data djview djvulibreplugin dlocate docbookdsssl docbookxml dosfstools dpkg dpkgdev dselect e2fslibs e2fsprogs ed eject enigma enigmadata epiphanybrowser epiphanyextensions esound esoundclients esoundcommon evolution evolutiondataserver exim4 exim4base exim4config exim4daemonlight fbmusiclow fdutils festival festlexcmu festlexposlex festvoxkallpc16k file fileroller fileutils findutils flashplayermozilla fontconfig foomaticdb foomaticdbengine foomaticdbgimpprint foomaticfilters foomaticfiltersppds frozenbubble frozenbubbledata gaim gaimdata gawk gcalctool gcc gcc3.3 gcc3.3base gcompris gcomprisdata gcomprissoundpt gconfeditor gconf2 gdb gedit geditcommon gettext gettextbase gftpcommon gftpgtk ghex gimp gimpdata gimpdataextras gimppython gimpsvg gksu gmemusage gnomeabout gnomeapplets gnomeappletsdata gnomecontrolcenter gnomecupsmanager gnomedesktopdata gnomedoctools gnomeextraicons gnomegames gnomegamesdata gnomegamesextradata gnomegv gnomeicontheme gnomekeyring gnomemag gnomemedia gnomemimedata gnomepanel gnomepaneldata gnomephotoprinter gnomepilot gnomepilotconduits gnomesession gnomespell gnometerminal gnomeutils gnome2userguide gnopernicus gnucap gnupg gok gpaint gpdf gphoto2 gpm gramps grep grepdctrl groffbase grub gs gscommon gsgpl gsfonts gsfontsx11 gstreamer0.8misc gstreamer0.8oss gtans gtetrinet gthumb gtk2enginesmist gtkhtml3.2 guile1.6libs gweled gzip hdparm hicoloricontheme hostname hotplug hwdata hwinfo ibrazilian ifupdown ijsgimpprint imagemagick indent info initscripts inkscape ipchains iptables iputilsping isocodes ispell kdei18nptbr kdelibsbin kdelibsdata kdelibs4 kernelimage2.4.31 fairsched ktouch kudzu lbreakout2 lbreakout2data less lesstif2 libacl1 libao2 libapachemodphp4 libapm1 libapr0 libaptpkgperl libart2.02 libarts1 libartsc0 libasound2 libaspell15 libatk1.00 libatspi1.00 libattr1 libaudio2 libaudiofile0 libavcodeccvs libbio2jack0 libblkid1 libbonobo20 libbonobo2common libbonoboui20 libbonoboui2common libbrlapi libbz21.0 libc6 libc6dev libcap1 libcdk4 libcdparanoia0 libcomerr2 libcompfaceg1 libconfiginifilesperl libconsole libcroco3 libcupsimage2 libcupsys2gnutls10 libcurl3 libdb1compat libdb3 libdb4.1 libdb4.2 libdb4.2++ libdbdmysqlperl libdbiperl libdirectfb0.920 libdiscover1 libdivxdecore0 libdjvulibre1 libdps1 libdv4 libdvdread3 libebook8 libecal6 libedatabook1 libedatacal5 libedataserver3 libeel22 libeel2data libegroupwise6 libelfg0 libesd0 libestools1.2c102 libexif10 libexpat1 libfaac0 libfaad20 libfam0c102 libflac6 libfontconfig1 libfreetype6 libfribidi0 libg2c0 libgailcommon libgailgnomemodule libgail17 libgal2.21 libgal2.2common libgc1 libgcc1 libgcompris10 libgconf24 libgcrypt11 libgda23 libgda2common libgdbm3 libggi2 libgii0 libgii0targetx libgimp2.0 libgimpprint1 libgksu1.20 libgksuui1.00 libglade20 libglib1.2 libglib2.00 libglibmm2.41 libgnomedesktop2 libgnomekeyring0 libgnomemag2 libgnomepilot2 libgnomespeech3 libgnome20 libgnome2common libgnomecanvas20 libgnomecanvas2common libgnomecups1.01 libgnomecupsui1.01 libgnomedb24 libgnomedb2common libgnomeprint2.20 libgnomeprint2.2data libgnomeprintui2.20 libgnomeprintui2.2 common libgnomeui0 libgnomeuicommon libgnomevfs20 libgnomevfs2common libgnutls11 libgpgerror0 libgphoto22 libgphoto2port0 libgpmg1 libgsf1 libgstreamergconf0.80 libgstreamerplugins0.8 0 libgstreamer0.80 libgtk1.2 libgtk1.2common libgtk2.00 libgtk2.0bin libgtk2.0common libgtkhex0 libgtkhtml20 libgtkhtml3.211 libgtkmm2.41 libgtksourceviewcommon libgtksourceview1.00 libgtkspell0 libgtop22 libguileltdl1 libhal0 libice6 libid33.8.3 libid3tag0 libidl0 libidn11 libijs0.35 libimlib2 libjack0.80.00 libjasper1.7011 libjpeg62 libkrb53 liblame0 liblcms1 libldap2 liblircclient0 liblocalegettextperl liblockfile1 liblua40 liblualib40 liblzo1 libmad0 libmagic1 libmagick++6 libmagick6 libmetacity0 libmng1 libmodplug0 libmp40 libmyspell3 libmysqlclient12 libnautilusburn0 libnautilus22 libncurses5 libncurses5dev libncursesw5 libneon23 libnetdaemonperl libnetpbm10 libnewt0.51 libnspr4 libnss3 libogg0 liboggflac1 liboil0.2 libopencdk8 libopenexr2 liborbit2 libosp4 libostyle1 libpammodules libpamruntime libpam0g libpanelapplet20 libpango1.00 libpango1.0common libpaper1 libpcap0.7 libpcre3 libperl5.8 libpisock8 libpisync0 libplot2 libplrpcperl libpng100 libpng120 libpopt0 libpostproc0 libpstoedit0 libqt3c102mt libqthreads12 libreadline4 libreadline5 librecode0 librsvg22 librsvg2bin librsvg2common libsasl2 libscrollkeeper0 libsdlconsole libsdlgfx1.2 libsdlimage1.2 libsdlmixer1.2 libsdlnet1.2 libsdlperl libsdlttf2.00 libsdl1.2debian libsdl1.2debianoss libselinux1 libshout3 libsigc++2.00 libslp1 libsm6 libsmbclient libsmpeg0 libsoup2.27 libspeex1 libss2 libssl0.9.7 libstartupnotification0 libstdc++5 libstlport4.6 libsvga1 libsysfs1 libt15 libtasn12 libtextcharwidthperl libtexticonvperl libtextwrapi18nperl libtextwrap1 libtheora0 libtiff4 libtolua0 libungif4g libusb0.14 libuuid1 libvorbis0a libvorbisenc2 libvorbisfile3 libvtecommon libvte4 libwmfbin libwmf0.27 libwnckcommon libwnck4 libwrap0 libx116 libxaw7 libxcursor1 libxext6 libxft1 libxft2 libxi6 libxine1 libxklavier8 libxml2 libxmu6 libxmuu1 libxp6 libxpm4 libxrandr2 libxrender1 libxslt1.1 libxt6 libxtrap6 libxtst6 libxv1 libxvidcore4 libzipios++0c102 libzzip012 linuxkernelheaders localeconf localepurge locales localizationconfig login logrotate lsof luola luoladata luolalevels lynx lzop m4 mailx make makedev mandb manpages manpagesdev manpagespt mawk mdadm meld menu menuxdg metacity mimesupport mkisofs moduleinittools modutils mount mozillabrowser mozillalocaleptbr mozillamplayer mozillapsm mpg321 mplayer586 mplayer686 msttcorefonts myspellptbr mysqlclient mysqlcommon mysqlserver nano nautilus nautilusdata ncursesbase ncursesbin nettools netbase netkitinetd netpbm nfscommon nfskernelserver nvi openjade openoffice.org openoffice.orgbin openoffice.orgdebian files openoffice.orggtkgnome openoffice.orghelppt br openoffice.orgl10nen openoffice.orgl10npt br openoffice.orgmimelnk passwd patch pciutils perl perlbase perlmodules php4 php4common php4mysql phpmyadmin planner pmount portmap powermgmtbase ppp pppconfig pppoe pppoeconf prelink procps psmisc pstoedit python pythonglade2 pythongnome2 pythongtk2 pythonimaging pythonreportlab pythontk pythonxml python2.3 python2.3dbus python2.3glade2 python2.3gnome2 python2.3gtk2 python2.3imaging python2.3numeric python2.3numericext python2.3pygame python2.3pyorbit python2.3reportlab python2.3tk python2.3xml rcconf readedid recode reiserfsprogs rsync scribus scrollkeeper sed sgmlbase sgmldata sharedmimeinfo sketch slang1 slang1autf8 sox squid squidcommon ssh starfighter starfighterdata sudo supertux supertuxdata syslogng sysvrc sysvinit tar tcl8.4 tcpd telnet tk8.4 totemxine tree ttfbitstreamvera ttffreefont ttfopensymbol tuxpaint tuxpaintconfig tuxpaintdata tuxpaintstampsdefault tuxpuck tuxtype ucf unzip usbutils utillinux vim vimcommon vimgnome vino vorbistools w32codecs w3cdtdxhtml wget whiptail xbaseclients xchat xchatcommon xdebconfigurator xfontsbase xfree86common xinv3d xlibmesagl xlibmesaglu xlibs xlibsdata xloadimage xmlcore xmms xnest xpdf xpdfcommon xpdfreader xpdfutils xresprobe xrestop xservercommon xserverxfree86 xterm xutils yelp zenity zip zlib1g