domingo, 23 de outubro de 2016

Executando um determinado arquivo com python 3 no Windows

Lembrando que só para Windows:

if 'win' in sys.platform:
    os.startfile('ex' + os.sep + 'sons' + os.sep + 'sons_testes.wav')

Biblioteca OS.PATH do python 3

Vamos registrar algumas funções da biblioteca os.path do python 3:

os.path.isdir('diretorio') = True => Verifica se é diretório;

os.path.isfile('file.py') = True => Verifica se é arquivo;

os.path.exists('algum') = True => Verifica se existe alguma coisa, ex: arquivo, diretório e etc;

os.path.getsize('arquivo.py') = 2015 => Verifica o tamanho.

os.path.split("/diretorio/diretorio/arquivo.py") = ("/diretorio/diretorio","arquivo.py") => Separa o que é diretório e o que é arquivo;

os.path.join("diretorio","arquivo.py") = diretorio/arquivo.py => Junta os parâmetros passados;

os.path.dirname("/diretorio/arquivo.py") = /diretorio => Obtém o nome do diretório;

os.path.basename("/diretorio/arquivo.py") = arquivo.py => Obtém o nome do diretório;

os.path.splitext("arquivo.py") = ('arquivo','.py') => Separa o que é arquivo e o que é extensão;

os.path.normpath("diretorio\diretorio/diretorio/arquivo.py") = ('diretorio/diretorio/diretorio/arquivo.py') => corrige alguns detalhes de diretório, como exemplo a barra e contrabarra;

os.curdir => equivalente ao "."

os.pardir => equivalente ao ".."

os.path.abspath("diretorio") = ('c:\diretorio\diretorio') => Indica o caminho absoluto.




sábado, 22 de outubro de 2016

PARA IMPLANTAR O WYSIWYG-REDACTOR

Precisa do Pillow mas para instalá-lo precisamos das bibliotecas:

libjpeg-dev
zlib1g-dev

https://github.com/douglasmiranda/django-wysiwyg-redactor

sábado, 15 de outubro de 2016

CONEXÃO POSTGRES COM DJANGO

INSTALAR POSTGRESQL

# apt-get install postgresql

ACESSAR O POSTGRESQL E CRIAR UMA SENHA

# sudo su - postgres
# psql -d postgres -U postgres
# alter user postgres with password 'senha';
# \q


FAZER A CONEXÃO ENTRE O POSTGRES DE O PYTHON - PSYCOPG2

# apt-get install libpq-dev
# apt-get install pyscopg2



DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydb',
        'USER': 'myuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

sexta-feira, 7 de outubro de 2016

Enviando emails com o Python

Vale ressaltar que o exemplo é indicado para envio de e-mail mais simples, para enviar e-mail com formatações especiais e anexos é recomendado o uso do módulo email.


O módulo smtplib define um cliente SMTP que pode ser usado para enviar emails tanto via SMTP quanto ESMTP. O smtplib segue os padrões da RFC 821 (SMTP), RFC 1869 (ESMTP), RFC 2554 (Autenticação SMTP) e RFC 2487 (SMTP Seguro via TLS).


Como este módulo já está incluso nas bibliotecas do Python você não precisará instalar nenhuma biblioteca adicional.
Agora que já demos uma boa introdução sobre o módulo smtplib vamos ao que interessa.
Inicialmente vamos importar o módulo:

Inicialmente vamos importar o módulo:

import smtplib

Vamos criar a instância do SMTP de acordo com a forma de autenticação:
 
TLS
smtp = smtplib.SMTP('localhost', 587)
smtp.starttls()
 
SSL
smtp = smtplib.SMTP_SSL('localhost', 465)
 
Sem autenticação
smtp = smtplib.SMTP('localhost', 25)
 
Se escolhemos TLS ou SSL devemos fazer a autenticação:
 
smtp.login('usuário', 'senha')
 
Caso seja sem autenticação devemos nos identificar enviando o comando EHLO ou HELO:
 
# EHLO
smtp.ehlo()
 
# HELO
smtp.helo()
 
# De forma genérica. Tenta EHLO primeiro.
smtp.ehlo_or_helo_if_needed()
 Não há necessidade de chamar os métodos ehlo ou helo quando se utiliza SSL ou TLS, pois o método login faz a chamada desses métodos caso seja necessário.
Enviando um email:

msg = """From: Seu Nome <seuemail@seudominio.com.br>
To: outroemail@seudominio.com.br
Subject: Buteco Open Source
 
Email de teste do Buteco Open Source"""
 
smtp.sendmail('seuemail@seudominio.com.br', ['outroemail@seudominio.com.br'], msg)
-----------------------------------------------------------------------------------------
Abaixo você pode verificar como enviar usando TLS:
 
import smtplib

smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.starttls()

smtp.login('seuemail@gmail.com', 'suasenha')

de = 'seuemail@gmail.com'
para = ['seuemail@gmail.com']
msg = """From: %s
To: %s
Subject: Buteco Open Source

Email de teste do Buteco Open Source.""" % (de, ', '.join(para))

smtp.sendmail(de, para, msg)

smtp.quit()
--------------------------------------------------------------------------------------------
 Já neste outro exemplo você pode verificar como enviar via SSL:
 
 
import smtplib

smtp = smtplib.SMTP_SSL('smtp.gmail.com', 465)

smtp.login('seuemail@gmail.com', 'suasenha')

de = 'seuemail@gmail.com'
para = ['seuemail@gmail.com']
msg = """From: %s
To: %s
Subject: Buteco Open Source

Email de teste do Buteco Open Source.""" % (de, ', '.join(para))

smtp.sendmail(de, para, msg)

smtp.quit()
 
 
 Confira abaixo uma lista dos servidores de email mais comuns e suas configurações.
Nome Servidor Autenticação Porta
Gmail smtp.gmail.com SSL 465
Gmail smtp.gmail.com StartTLS 587
Hotmail smtp.live.com SSL 465
Mail.com smtp.mail.com SSL 465
Outlook.com smtp.live.com StartTLS 587
Office365.com smtp.office365.com StartTLS 587
Yahoo Mail smtp.mail.yahoo.com SSL 465

Espero que você tenha gostado desta publicação. Continue acompanhando que faremos uma continuação falando sobre o módulo email.
 
 
 
 
 
 
 
 
 
 

Python 3 – Servindo arquivos via HTTP Server



Tendo Python 3 instalado, basta ir ao terminal. No diretório que deseja servir arquivos HTML, digite:

python -m http.server 8000


terça-feira, 26 de abril de 2016

CONEXÃO PYTHON COM POSTGRESQL

Devido a uma dificuldade em achar tutorial preciso para conexão da versão python3.4 e POSTGRESQL9.4 resolvi registrar:

Antes de mais nada precisamos instalar o PSYCOPG2:
http://initd.org/psycopg/

Agora vamos aos passos:

import psycopg2

conn = psycopg2.connect(host = 'localhost', database = 'teste', user = 'postgres', password = 'postgres')

cursor = conn.cursor()

cursos.execute("INSERT INTO teste (nome,idade) VALUES (%s,%s)", ('almir',35))

conn.commit()

cursor.close()
conn.close()


- O meu problema estava no fato de não colocar o HOST='LOCALHOST' no connect.



CÓDIGO EM PYTHON PARA POPULAR O BANCO:

===================================================
import psycopg2
conn = psycopg2.connect(host = 'localhost',database = 'teste', user = 'postgres', password = 'postgres')
cursor = conn.cursor()

for a in range(0, 202):
    print(nome)
    nome = 'almirjr-' + str(a)
    cursor.execute("INSERT INTO teste (nome,idade) VALUES (%s,%s)",(nome,a))
conn.commit()
cursor.close()

conn.close()
===================================================

segunda-feira, 26 de outubro de 2015

INTEGRAÇÃO ZABBIX E GLPI



Essa atualização é em consequência de pedidos vindo dos gringos e também a pedido da Zabbix SIA por ser o 4.º conteúdo mais popular no recém criado https://share.zabbix.com/ e o 1.º entre os brasileiros. Para conferir a lista dos mais populares, acesse https://share.zabbix.com/popula

Há um tempo que eu queria desenvolver algo para integrar o Zabbix a algum outro sistema. Esse ano surgiu uma oportunidade de implementação de alguns sistemas de inventário e gerenciamento de chamados. Logo pensei em fazer uma integração para abertura e fechamento automático dostickets quando ocorresse algum problema que o Zabbix identificasse.


Porém, o meu entusiasmo foi logo caindo quando eu percebi que não era uma coisa tão trivial de se fazer. Pesquisei várias fontes em busca de informações a respeito dessa integração, porém não passavam de tutoriais ensinando como abrir tickets no GLPI enviando um e-mail. Estudando mais um pouco o GLPI, percebi que não era possível fazer o fechamento do ticket por outro e-mail. Num dos fóruns que eu participo, surgiu a idéia de tentar fazer essa integração atráves do plugin Webservicesque tem disponível para o GLPI. Em outra mensagem, uma pessoa enviou um link onde foi feito a integração do GLPI com a ferramenta Nagios utilizando esse plugin. Foi aí que eu ressolvi atacar e comecei a estudar como essa integração foi feita para que eu pudesse desenvolver para integrar com o Zabbix.



A partir desse momento surgiram várias dúvidas e também a necessidade de utilização de outros recursos, como a API do Zabbix. Pois, além da abertura do ticket, eu queria reconhecer o evento gerado pelo Zabbix de forma automática. Sendo assim, esse projeto iniciou com os seguintes propósitos:

  • Identificar uma trigger com status PROBLEM no Zabbix e executar uma ação.
  • Disparar a execução de um script PHP para abrir o ticket no GLPI usando o plugin Webservices.
  • Enviar o número de evento gerado pela ação juntamente com o identificador da trigger e o nome do host onde o problema aconteceu. Essas informações serão gravadas no ticket criado no GLPI.
  • Reconhecer o evento no Zabbix executando um script Python que faz uso da API do próprio Zabbix.
  • Identificar uma trigger com status OK no Zabbix e disparar a execução de um script PHP para fechar o ticket no GLPI, além de incluir um followup no ticket informando que o problema foi resolvido.
  • Utilizar o recurso de notificação de chamados disponível no GLPI.

Para seguir este tutorial, você deverá ter o Zabbix e o GLPI instalados. Não vou comentar sobre a instalação desses dois sistemas. Existem muitos tutoriais de instalação na web. Porém, os que eu recomendo são:


As seguintes versões de software foram usadas nesta integração:

  • Zabbix 2.2
  • GLPI 0.84.3
  • Python 2.6.6
  • MySQL 5.1.69
  • PHP 5.3.3
  • Plugin Webservices 1.4

Creio não ter problemas de funcionar com a versão do Zabbix 2.x, pois a biblioteca Python API foi desenvolvida para funcionar a partir da versão 1.8. Mas quem vai querer usar versão anterior depois do lançamento da 2.2? A única dependência para o zabbix-glpi funcionar é a versão do GLPI e do plugin Webservices, que devem ser no mínimo as versões listadas acima.

Instalando o plugin Webservices no GLPI.


Antes de instalarmos o plugins, devemos suprir as dependências instalando os seguintes pacotes:

  • php-soap
  • php5-xmlrpc

Obs.: Se o Zabbix estiver instalado em servidor separado do GLPI, você deverá instalar o pacote php5-xmlrpc também no servidor do Zabbix.

  • apt-get install php-soap php-xmlrpc -y
  • service apache2 reload
Baixar e descompactar o plugin webservices dentro do diretório plugins do GLPI.

  • cd /var/www/html/glpi/plugins
  • wget https://forge.indepnet.net/attachments/download/1623/glpi_webservices-1.4.0.tar.gz
  • tar xf glpi_webservices-1.4.0.tar.gz
Ajustar as permissões do diretório que foi descompactado.

  • chown -R apache.apache webservices

Acessar o menu Configurar > Plugins na interface web do GLPI, aparecerá a tela conforme figura abaixo:



Após, clique no botão Instalar e em seguida no botão Habilitar.

O próximo passo é realizar a configuração do plugin, no qual fazemos acessando o menu Plugins > Web Services.

Será exibida apenas uma configuração com o nome Local. Clique no link para abrir a configuração, conforme tela abaixo:




Aqui, só precisamos informar o IP ou faixa de IP que terá acesso ao Webservice. No campo IPv4 address range, informe o IP do servidor Zabbix. Altere o campo Nome para Zabbix, apenas para ficar mais organizado.

Observando a imagem acima, você verá que eu coloquei a range 192.168.0.169-192.168.0.170. Isto porque eu utilizo servidores separados para o Zabbix e o GLPI. Se você utiliza apenas um único servidor, informe apenas o IP desse servidor nos dois campos.

O restante dos campos pode ficar sem alteração.


zabbix-glpi - Instalação e configuração

Baixe os scripts de intregração disponíveis em https://github.com/janssenlima/zabbix-glpi
Recomendo a instalação do pacote git para clonar o repositório.

# apt-get install git

Após, clone o repositório:

# cd /tmp/

# git clone https://github.com/janssenlima/zabbix-glpi.git

Mova os scripts para o diretório externalscripts da instalação do Zabbix (ou um diretório de sua preferência).

# mv *zabbix* /opt/zabbix/externalscripts/

Ajuste a permissão para o usuário zabbix e dê permissão de execução para os scripts.
chown zabbix.zabbix /opt/zabbix/externalscripts/*

# chmod +x /opt/zabbix/externalscripts/*

O conteúdo do diretório ficará assim:

# tree /opt/zabbix/externalscripts/

/opt/zabbix/externalscripts/
├── ack_zabbix_glpi.py
└── tickets_zabbix_glpi.php


Onde:

ack_zabbix_glpi.py é o script que faz o reconhecimento do evento no Zabbix via API.
tickets_zabbix_glpi.php é o script que faz abertura e fechamento de tickets no GLPI utilizando o plugin Webservices.

Instale a API Zabbix com o seguinte comando:
pip install zabbix-api



Agora, está faltando criarmos as ações para disparar a abertura e fechamento dos tickets.
Acesse o menu Configuração > Ações na interface web do Zabbix.

Criaremos duas ações. A primeira para abrir o ticket. Clique no botão Criar ação. Na tela seguinte dê o nome da ação. Vou chamá-la "Abrir Chamado". Na aba Ação não é preciso alterar os demais campos. Na aba Condições, podemos deixar como está, pois já vai satisfazer o que precisamos. Vale lembrar que a condição Valor da trigger = PROBLEMA é obrigatória. Na aba Ações criaremos uma nova operação com os seguintes dados:

  • Duração padrão do passo da operação: 60
  • Tipo da opração: Comando remoto
  • Lista alvo: Host: Zabbix server 
  • Tipo: Script personalizado
  • Executar em: Agent Zabbix
  • Comandos: php /opt/zabbix/externalscripts/tickets_zabbix_glpi.php eventhost="{HOSTNAME}" event="DOWN" state="{TRIGGER.STATUS}" hostproblemid=0 lasthostproblemid=0 servico="{TRIGGER.NAME}" triggerid="{TRIGGER.ID}" eventzabbix="{EVENT.ID}"

Algumas observações das configurações acima: A lista alvo deverá ser o host onde os scripts de integração se encontram; Não altere os parâmetros do campo comando, com exceção do caminho onde você gravou o script.
Crie outra ação com o nome "Fechar chamado". As únicas configurações que você precisa fazer são:

  • Na aba Condições, remova a condição de problema da trigger e inclua Valor da trigger = OK.
  • Altere o comando na aba Ações para: php /opt/zabbix/externalscripts/tickets_zabbix_glpi.php eventhost="{HOSTNAME}" event="UP" state="{TRIGGER.STATUS}" hostproblemid=1 lasthostproblemid=1 servico="{TRIGGER.NAME}" triggerid="{TRIGGER.ID}" eventzabbix="{EVENT.ID}"Novamente. Não altere os parâmetros do comando, apenas o caminho do script no seu servidor, caso for diferente do que está.
Dica: Clone a ação para não precisar fazer tudo novamente, já que são apenas duas alterações a fazer, além de trocar o nome da ação.

Neste primeiro momento não se preocupe com as condições. Vá testanto aos poucos. Uma dica é você filtrar por grupo de hosts. Por exemplo, você deseja abrir chamados automaticamente apenas dos servidores, impressoras e roteadores, deixando fora equipamentos como desktop.

O parâmetro EnableRemoteCommands do arquivo zabbix_agentd.conf deve estar com o valor 1, que habilita a execução de comandos remotos.

Toda a configuração para fazer a integração entre o Zabbix e o GLPI foi realizada. 

Isso funciona mesmo?


O teste que eu vou fazer é forçar a parada do serviço SSH do próprio servidor do Zabbix. A imagem foi tirada da tela de Dashboard após o Zabbix identificar a que o serviço parou.



Observe na figura que após o incidente ser reconhecido, ele já executou uma ação e foi reconhecido. Isso significa que o ticket foi aberto. Temos outras formas de verificar o evento através do menu Monitoramento > Eventos. Clicando na data e horário do evento, obtemos informações detalhadas sobre o mesmo, conforme pode ser visualizado na figura abaixo:




Agora, vamos verificar o ticket criado no GLPI.





A figura acima exibe o ticket de ID 5 aberto e com status de novo e a descrição do problema com o número do evento gerado no Zabbix. É através desse número que o script ack_zabbix_glpi.py faz o reconhecimento do evento no Zabbix via API.


Ao abrirmos o ticket, podemos verificar outros campos, tais como a descrição do problema que exibe informações como nome do host, ID da trigger e seu status. Outra informação importante é a Origem da requisição, onde informa que este ticket foi criado por Webservices. Observe na figura abaixo:




Agora vamos iniciar o serviço SSH para o ticket ser fechado automaticamente. Acesse o menuMonitoramento > Eventos no Zabbix e verifique que o serviço já está OK.



Voltamos para o GLPI e verificamos que o ticket foi fechado.



Observe na coluna Status que mudou para Solucionado.

Clicando no ticket, veremos que o Followup foi inserido no registro após o seu fechamento automático. Observe a figura abaixo:


E assim a integração está realizada. Você poderá verificar os tickets abertos automaticamente quando uma trigger for disparada e ser fechado quando a trigger voltar ao normal. Existe um pluginde relatórios que podemos ver de forma gráfica a quantidade de registros que foram abertos e solucionados via Webservices. Mas isso é um assunto para outro post.

A respeito do recurso de notificação por e-mail, já está incluído e funcionando. Se você utiliza esse recurso do GLPI mas não quer receber os e-mails dos tickets abertos via Webservice, deverá comentar a linha no código do arquivo tickets_zabbix_glpi.php. Quando eu automatizar a instalação essa opção poderá ser escolhida no momento da instalação.

O próximo passo será empacotar o zabbix-glpi nos formatos RPM e DEB e automatizar a instalação. Atualizações e correções de erros serão informadas em posts neste blog.

Eu gostaria muito da opinião de vocês para que possamos manter esse projeto sempre atualizado, buscando melhorias de qualidade e performance, alterando opções que são geradas automaticamente etc. Para isso, preciso do feedback, tanto de crítica como de sugestões.

FONTE:

http://blog.janssenlima.com/2013/11/integracao-zabbix-glpi.html

https://github.com/janssenlima/zabbix-glpi

http://blog.janssenlima.com/2014/08/atualizacao-zabbix-glpi.html




terça-feira, 29 de setembro de 2015

GERENCIANDO LAN (LAN HOUSE OU CYBER-CAFÉ) COM SOFTWARE LIVRE (OPENASB)



Uma funcionária responsável por uma biblioteca pediu-me uma solução para seu problema:


Dentro de uma biblioteca, existem 6 máquinas disponíveis para acesso a internet, sendo assim, estudantes que necessitam fazer pesquisas podem usá-los, desde que, utilizem por apenas 30 minutos e; não possuam permissões dentro do sistema operacional para alterar qualquer item do mesmo. As máquinas funcionam com Ubuntu para não ter problemas com "vírus".


Com o intuito de descascar esse abacaxi, pesquisei diversas forma de criação de script (em ShellScript) que encerrasse a sessão do usuário. Mas, deparei-me com a possibilidade de atrapalhar algum cadastro de algum visitante, pois encerrando a sessão, todos aplicativos iram fechar automaticamente. Em outra tentativa, fiz um script que bloqueasse a sessão do usuário. Contudo, outro problema surgiu: como estabelecer o tempo de acesso, corretamente para cada estudante.


Foi então que conheci o OpenASB, um aplicativo para Lan House, de código livre, desenvolvido em Gambas3 (linguagem de programação). Desta forma, conseguimos suprir nossas principais necessidades, estabelecendo o tempo de acesso, apresentando uma página de bloqueio que pode ser personalizada, possui ainda, diversas formas de bloqueio para usuário comum. Contudo, outras opções de segurança tivemos que fazer manualmente, como: bloquear acesso terminal (usermod -s /bin/false usuário); retirar a permissão de sudoers do usuário corrente (gpasswd -d  usuário sudo); bloquear papel de parede para manter o mesmo padronizado para todas as máquinas, até porque usuário comum adora modificar (chmod 555 -R ~/.config/dconf).


OpenASB Servidor:




O OpenASB precisa de um servidor para controlar as demais máquinas, esse mesmo servidor precisa estar configura com as seguintes características:

- IP fixo;

- Ubuntu 15.04 (no 14.10 não funcionou direito);

- Gambas3 (o OpenASB só funciona com o Gambas3 instalado);

- Xvnc (para acesso remoto).


OpenASB Client:



O módulo cliente terá que ser configurado com as seguintes características:

- OpenASB apontar para o Servidor;

- Ubuntu 15.04;

- Gambas3;

- Xvnc;


- O cliente precisa de dois usuários, um para permissão de "sudo" e outro com permissão padrão ou remover do grupo de sudoers (gpasswd -d usuário sudo);

- Bloquear acesso terminal (usermod -s /bin/false usuário);

- Para manter um trabalho com um bom acabamento, foi padronizado os papeis de paredes das máquinas dos clientes, e em seguida bloqueado (chmod 555 -R ~/.config/dconf). 



Referências:


CORRIGIR "ERRO DE SISTEMA 85" - NÃO CARREGA CORRETAMENTE PERFIL DO USUÁRIO DO DOMÍNIO

Ao logar com meu usuário do AD, não consegui as permissões liberada para mim por exemplo: todos os usuários do meu setor estão com permissões para acessar o youtube. Contudo, no perfil não foi possível.

Para resolução deste problema foi executado os seguintes procedimento:

1º - Corrigir o "o erro de sistema 85"


Esse comportamento é causado por uma configuração de 1 na seguinte valor do registro:

HKLM\System\CurrentControlSet\Control\SessionManager\ProtectionMode

Se a configuração for 1, o problema ocorre. Se você alterar a configuração para 0 e reinicie o servidor, o problema desaparece.

2º - Forçar a atualização do perfil do usuário:


Abra o CMD e digite:

gpupdate /force


Quem é Almir JR