Crianças pedem Solicitação à Prefeitura de São Paulo – Reforma da Quadra de Esportes – Praça Sylvio Altapini – Jardim Castelo – Zona Leste de São Paulo

Eu, Victor Hugo Jabur Passavaz, solicito, em nome dos moradores do bairro Jardim Castelo à Prefeitura de São Paulo, uma reforma na quadra de esportes localizada na Praça Sylvio Altapini.

Utilizarei esta postagem para a comunicação entre moradores e responsáveis da prefeitura, mídias televisivas e demais órgãos interessados.

Seguem as principais solicitações feitas pelos moradores:

  • Troca do material do piso (hoje feito em asfalto), para um material mais apropriado às crianças, evitando assim os constantes acidentes que hoje acontecem.
  • Colocação de grades de proteção ao redor da quadra, impedindo as crianças de correrem à rua para buscar a bola, correndo risco de serem atropeladas.
  • Colocação de iluminação apropriada (hoje não possui nenhuma)
  • Troca dos gols enferrujados por gols novos, com a devida rede.
  • Podagem e retirada de entulhos ao redor da quadra.

Endereço da Quadra de Esportes:
Praça Sylvio Altapini, Jardim Castelo, Zona Leste de São Paulo

Ponto de Referência:
R. Basílio Basily, 300
Zona Leste, Bairro Jardim Castelo
São Paulo, 03728-200

.
.
.

Endereço no Google Maps:

.

View Larger Map
.

Segue a solicitação à Prefeitura de São Paulo, efetuada em: 08/01/2011 às 20:15. Irei postando aqui toda a comunicação com a prefeitura para reportar à comunidade tudo o que está acontecendo neste processo.

Prefeitura do Município de São Paulo
Secretaria Municipal de Comunicação e Informação Social
Sistema de Atendimento ao Cidadão
Ficha de Solicitação
SOLICITAÇÃO COM PRIORIDADE Solicitação com Prioridade
Nº do SAC: 10465564 Data de Cadastro no SAC: 08/01/2012 20:09
Canal de Entrada: SAC Internet

LOCAL DA SOLICITAÇÃO


Endereço:   R  BASILIO BASILY, 300
Ref.:   Praça Sylvio Altapini
Bairro:   JARDIM CASTELO
CEP:   03728200
Pag. Guia:   075-30-P
Setor e Quadra:   130367

DADOS DA SOLICITAÇÃO


Subprefeitura:   PE
Assunto:   Desportos
Especificação:   Instalacao/

manutencao de campo de futebol
Orgão Responsável:   Subprefeitura Penha – NAPProvidências:
.

Abaixo Assinado – Participe e nos ajude nesta Causa – COLABOREClique na imagem abaixo para visualizar o Abaixo Assinado

Abaixo Assinado Eletrônico hospedado no site Petição Pública

———————————————————————————————————————-
Atualização 25/01/2012

Vereador Carlos Neder

O acessor do vereador Carlos Neder, realizou uma visita à quadra para conhecer o lugar e prometeu que ia fazer o máximo possível para ajudar nesta causa.

———————————————————————————————————————-
Atualização 07/02/2012

Vereador Toninho Paiva

Segue e-mail do vereador Toninho Paiva:

Prezado Victor, a respeito da manutenção da quadra de esportes da Praça Sylvio Altapini, o orçamento para reforma já está no orçamento da Sub Prefeitura da Penha, porém ainda aguarda licitação.
Tão logo chegue os alambrados, será feita a reforma na quadra.
Para mais esclarecimentos, permaneço a disposição na Câmara Municipal de São Paulo.
Atenciosamente
Toninho Paiva
  Vereador
2º Secretário

———————————————————————————————————————-

Atualização: 29/02/2012

Vereador Netinho de Paula

Victor, boa tarde.

Segue anexo cópia do oficio que encaminhamos a subprefeitura da Penha.
Assim que obtivermos resposta sobre a questão da quadra repassaremos a você.
Sem mais para o momento,

Marco Antonio da Silva
Assessor Parlamentar

Clique Aqui e veja o Ofício gerado pelo Vereador Netinho de Paula

———————————————————————————————————————-
Atualização: 01/02/2012

Vereador Goulart

Caro Victor, conforme contato, encaminhamos copia do Oficio 023/2012-AG, enviado a Subprefeitura da Penha para reurbanização e reforma da praça.
Assim que tivermos outras informações, entraremos em contato.

Atenciosamente,

Adriana Pedrozo
Assessora Parlamentar
Gabinete do Vereador Antonio Goulart
Tel.: 11 3396 4866 : : Fax.: 11 3396 3969
www.vereadorgoulart.com.br
Siga o Vereador Goulart no Twitter!
www.twitter.com/vereadorgoulart

Clique Aqui e veja o Ofício gerado pelo Vereador Goulart

———————————————————————————————————————-
Atualização: 05/03/2012

Vereador Cláudio da Fonseca

Olá Victor Jabur,

 Nesta data encaminhamos o Ofício nº 600/12 para a Secretaria Municipal de Esportes com a solicitação de manutenção da quadra de esportes.

Atentos ao andamento desta solicitação, este Gabinete se compromete a repassar-lhe todas as informações até trâmite final do processo via correio e / ou email.

Atenciosamente,

Roberta Rosa

Assessora Parlamentar – CMSP

Gabinete Ver. Claudio Fonseca

Viaduto Jacarei, 100 – 4º andar  sl 420

Centro – SP – CEP: 01319 – 010

Tel: 3396 46 48 / 3396 4649

Clique Aqui e veja o Ofício gerado pelo Vereador Claudio Fonseca Pagina 1

Clique Aqui e veja o Ofício gerado pelo Vereador Claudio Fonseca Pagina 2

———————————————————————————————————————-

Atualização 06/03/2012

Vereador Donato

Olá Victor,

Encaminhamos anexo, para seu conhecimento, cópia do Ofício do Vereador Donato enviado a Subprefeitura da Penha.

Assim que obtivermos retorno o informaremos.

Um abraço,

Angelita

Secretária do Vereador Donato

Gabinete do Vereador Donato

Câmara Municipal de São Paulo

Viaduto Jacareí, 100 – 11º andar – sala 1109

Telefone:             (11) 3396-4840       / 3396-4681

E-mail: donatopt.terra.com.br

Site: donatopt.com.br

Clique Aqui e veja o Ofício gerado pelo Vereador Donato

 ———————————————————————————————————————-

Software de Tradução de Idiomas no Linux – GoldenDict Babylon

Olá,

Se você está procurando algum software parecido com o Babylon do Windows e, assim como eu, utiliza o Linux Ubuntu ou qualquer outra distro. Você achou, o nome dele é: GoldenDict.

É possível instalá-lo a partir do “Ubuntu Software Center” ou sudo apt-get install goldendict

Existem inúmeros dicionários gratuitos fornecidos pela própria Babylon, aqui:

http://www.babylon.com/free-dictionaries/

Todos os dicionários babylon possuem a extensão .BGL

O que atualmente está complicando usuários Linux de baixar estes dicionários, é que a Babylon está oferecendo arquivos executáveis (.exe) que baixam o dicionário assim que o executável roda. Para facilitar, estou disponibilizando três principais dicionários aqui:

Se você precisar de outros dicionários, baixe o executável do Windows no site acima (free dictionaries). O Windows irá baixar o arquivo com a extensão .BGL para a pasta C:\Users\seuusuario\AppData\Local\Babylon

Espero ter ajudado !

Até a próxima.
Victor Jabur

Compiling MySQLdb 1.2.3 on Windows 32 and 64 – Without need the MySQL Database 5.5 installed

Hi,

If you wish the module already compiled, access here: http://blog.victorjabur.com/2011/06/08/modules-python-library-compiled-for-windows-32-and-64-unofficial-windows-binaries-for-python/

First Thing: Follow this main steps to prepare the pre-requirements for compile this module:

http://blog.victorjabur.com/2011/06/05/compiling-python-2-7-modules-on-windows-32-and-64-using-msvc-2008-express/

1 – Compiling MySQLdb 1.2.3 for Mysql 5.5 database

1.1 - You will need to download the latest version of MySQL Connector C here: http://dev.mysql.com/downloads/connector/c/

* Important: Make the download properly for your platform (32 or 64 bits).

1.2 - Make the download of MySQLdb plugin here and extract to any folder: http://sourceforge.net/projects/mysql-python/

1.3 - Edit this file (MySQL-python-1.2.3/setup_windows.py) inside of folder extracted:

At Line 7 of the file, comment the two follow lines and add another, like this:

    #serverKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, options['registry_key'])
    #mysql_root, dummy = _winreg.QueryValueEx(serverKey,'Location')
    mysql_root = ''

At Line 19, put the path to your Connector C installed:

    library_dirs = [ os.path.join(mysql_root, r'lib\opt'), 'C:\Program Files\MySQL\MySQL Connector C 6.0.2\lib\opt' ]
    libraries = [ 'kernel32', 'advapi32', 'wsock32', client ]
    include_dirs = [ os.path.join(mysql_root, r'include'), 'C:\Program Files\MySQL\MySQL Connector C 6.0.2\include' ]
    extra_compile_args = [ '/Zl' ]

Important: Specify the correct path for your platform (32 or 64 bits). Above the platform is 64 bits, to 32 bits use this path: “C:\Program Files (x86)\MySQL\MySQL Connector C 6.0.2″.

1.4 - Make the build:

python setup.py build --compiler msvc
python setup.py bdist_wininst

It’s finish.

The advantage os this technique an a comparison with others posts is:

1 – The MySQL Database is not required on machine (only the connector c)
2 – Not is necessary make the update on the windows registry:

# The Windows registry key for MySQL.
# This has to be set for Windows builds to work.
# Only change this if you have a different version.
registry_key = SOFTWARE\MySQL AB\MySQL Server 5.0

Credits and References to this post:

http://chaos.weblogs.us/archives/327
http://www.fuyun.org/2009/12/install-mysql-for-python-on-windows/

Bye,
Victor Jabur

Modules Python Library Compiled for Windows 32 and 64 – Unofficial Windows Binaries for Python

Unofficial Windows Binaries for Python Extension Packages

This is a list of python modules compiled for me, the intention is to create a complete list of windows modules for python, this post is always updated to extend this list. I will need your help with suggestions about wich modules will be available here and links about already existents modules on the web. The files are provided “as is” without warranty or support of any kind. The entire risk as to the quality and performance is with you. The files are unofficial (meaning: informal, unrecognized, personal, unsupported) and made available for testing and evaluation purposes only.

Do you need another module that isn’t available at this list ? Send an e-mail and request your module.
victorjabur@gmail.com

Links with more plugins on Web:

http://www.lfd.uci.edu/~gohlke/pythonlibs/

—————————————————————————————————————–
Django – Framework Webhttps://www.djangoproject.com/ -
Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

Django-1.3.1.win32-py2.7.exe [6.4 Mb] [Python 2.7] [32 bit] [JUN 08, 2011]
Django-1.3.1.win-amd64-py2.7.exe [6.5 Mb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–
mpi4py – Plugin MPI for Pythonhttp://mpi4py.scipy.org/http://en.wikipedia.org/wiki/Message_Passing_Interface
Message Passing Interface (MPI) is an API specification that allows processes to communicate with one another by sending and receiving messages. Besides many other applications, it is a de facto standard for parallel programs running on computer clusters and supercomputers, where the cost of accessing non-local memory is high. MPI was created since 1992 by William Gropp, Ewing Lusk and others, a first standard appeared in 1994.

mpi4py-1.2.2.win32-py2.7.exe [445 Kb] [Python 2.7] [32 bit] [JUN 08, 2011]
mpi4py-1.2.2.win-amd64-py2.7.exe [522 Kb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–
MySQLdb – Plugin Connector of Database MySQL to Pythonhttp://sourceforge.net/projects/mysql-python/
Message Passing Interface (MPI) is an API specification that allows processes to communicate with one another by sending and receiving messages. Besides many other applications, it is a de facto standard for parallel programs running on computer clusters and supercomputers, where the cost of accessing non-local memory is high. MPI was created since 1992 by William Gropp, Ewing Lusk and others, a first standard appeared in 1994.

MySQL-python-1.2.3.win32-py2.7.exe [1 Mb] [Python 2.7] [32 bit] [JUN 08, 2011]
MySQL-python-1.2.3.win-amd64-py2.7.exe [1.1 Mb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–
Paramiko – SSH2 for Pythonhttp://www.lag.net/paramiko/
Paramiko is a module for python 2.2 (or higher) that implements the SSH2 protocol for secure (encrypted and authenticated) connections to remote machines. unlike SSL (aka TLS), SSH2 protocol does not require heirarchical certificates signed by a powerful central authority. you may know SSH2 as the protocol that replaced telnet and rsh for secure access to remote shells, but the protocol also includes the ability to open arbitrary channels to remote services across the encrypted tunnel — this is how sftp works, for example. It is written entirely in python (no C or platform-dependent code) and is released under the GNU LGPL (lesser GPL).

paramiko-1.7.7.1.win32-py2.7.exe [331 Kb] [Python 2.7] [32 bit] [JUN 08, 2011]
paramiko-1.7.7.1.win-amd64-py2.7.exe [356 Kb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–
PyAMF – AMF for Pythonhttp://www.pyamf.org -
PyAMF provides Action Message Format (AMF) support for Python that is compatible with the Adobe Flash Player. It includes integration with Python web frameworks like Django, Pylons, Twisted, SQLAlchemy, web2py and more.

PyAMF-0.6.1.win32-py2.7.exe [508 Kb] [Python 2.7] [32 bit] [JUN 08, 2011]
PyAMF-0.6.1.win-amd64-py2.7.exe [551 Kb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–
PyCrypto – Python Cryptography Toolkithttps://www.dlitz.net/software/pycrypto/http://sourceforge.net/projects/pycrypto/http://www.amk.ca/python/code/crypto.html
This is a collection of cryptographic algorithms and protocols, implemented for use from Python.

pycrypto-2.3.win32-py2.7.exe [545 Kb] [Python 2.7] [32 bit] [JUN 08, 2011]
pycrypto-2.3.win-amd64-py2.7.exe [572 Kb] [Python 2.7] [64 bit] [JUN 08, 2011]

—————————————————————————————————————–

Do you need another module that isn’t available at this list ? Send an e-mail and request your module.
victorjabur@gmail.com

Compiling Python 2.7 Modules on Windows 32 and 64 using MSVC++ 2008 Express

Hello,

On this post i will explain how to build, compile, install and distribute python modules on Windows using Microsoft Visual C++ Express Edition.
This post will be constantly updated to cover future updates of python, windows and msvc++ versions.

For this example i will use the PyCrypto – http://pycrypto.org because this is an example that don’t have packages for windows x64 on the web.

Observation: Don’t use Microsoft Visual C++ Express Edition 2010 to build python modules, because this will not work due to Python 2.7 was built using the 2008 version. This is an error that occurs when you try to build PyCrypto and Paramiko using the 2010 version and execute the import module:

>>> import paramiko
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\paramiko\__init__.py", line 69, in <module>
    from transport import SecurityOptions, Transport
  File "C:\Python27\lib\site-packages\paramiko\transport.py", line 32, in <module>
    from paramiko import util
  File "C:\Python27\lib\site-packages\paramiko\util.py", line 32, in <module>
    from paramiko.common import *
  File "C:\Python27\lib\site-packages\paramiko\common.py", line 98, in <module>
    from Crypto import Random
  File "C:\Python27\lib\site-packages\Crypto\Random\__init__.py", line 28, in <module>
    import OSRNG
  File "C:\Python27\lib\site-packages\Crypto\Random\OSRNG\__init__.py", line 34, in <module>
    from Crypto.Random.OSRNG.nt import new
  File "C:\Python27\lib\site-packages\Crypto\Random\OSRNG\nt.py", line 28, in <module>
    import winrandom
ImportError: DLL load failed: The specified module could not be found.

1 – Building and Installing PyCrypto Module for Windows 7 64 bits:

1.1 - You must have installed the Python 64 bits version: http://www.python.org/ftp/python/2.7.1/python-2.7.1.amd64.msi

1.2 - You should install the C Compiler for Windows – Microsoft Visual C++ Express Edition 2008: available here:http://www.microsoft.com/express/Downloads/#Visual_Studio_2008_Express_Downloads

ISO File to Download: http://www.microsoft.com/express/Downloads/#2008-All

1.3 - You should install the Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1: available here: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505

ISO File To Download (64 bits): http://download.microsoft.com/download/2/E/9/2E911956-F90F-4BFB-8231-E292A7B6F287/GRMSDKX_EN_DVD.iso

This is required because the Express Edition 2008 C++ don’t contains the 64 bits compiler. This is required only for Windows 7 64 bits version.

Important: Don’t use the “Microsoft Windows SDK for Windows 7 and .NET Framework 4″ because it’s not compatible with msvc++ express 2008 edition.

1.4 - Install the Python Setup Tools available here: http://pypi.python.org/pypi/setuptools#downloads

1.5 - Include in your Advanced Variables Environment the binaries of Python. Right click at “My Computer” icon -> Properties -> Advanced Environment and edit your Path Variable including this two directories there:
Path = C:\Python27\Scripts;C:\Python27; + Path

1) C:\Python27\Scripts
2) C:\Python27

1.6 - Copy this file:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat

To this follow folder and rename the file (vcvars64.bat to vcvarsamd64.bat):

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\amd64\vcvarsamd64.bat

1.7 - Edit the file msvc9compiler.py inside of directory C:\Python27\Lib\distutils\msvc9compiler.py

After the line 651 approximately, find this line: – ld_args.append(‘/MANIFESTFILE:’ + temp_manifest)
Add the following line after the above line:

ld_args.append('/MANIFEST')

1.8 - Edit the file msvccompiler.py inside of directory C:\Python27\Lib\distutils\msvccompiler.py

At line 153 approximately, insert this line: return 9.0, as following, in this piece of code:

def get_build_version():
    """Return the version of MSVC that was used to build Python.

    For Python 2.3 and up, the version number is included in
    sys.version.  For earlier versions, assume the compiler is MSVC 6.
    """
    return 9.0
    prefix = "MSC v."
    i = string.find(sys.version, prefix)
    if i == -1:
        return 6

1.9 - Certify that exists the follow environment variable in your system, if don’t exist create a new one:

Name: VS90COMNTOOLS
Value: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\

1.10 - Extract the file pycrypto-2.3.tar.gz that you downloaded before, open a dos command and access the pycrypto-2.3 folder

1.11 - Execute this command to compile, build and install the module:

python setup.py build --compiler msvc
python setup.py install

1.12 - Test if the package was generated successfully executing an import Crypto at Python shell.

1.13 - It’s finish. Optionally, you can distribute your compiled modules as an windows executable (.exe) file, executing this simple command on folder of your module, this case is pycrypto-2.3:

python setup.py bdist_wininst

As a result you will get a executable file with graphical interface created inside of folder “dist” and other people can install this executable file without to prepare a complex environment for build your own module. This is my result file of this process. http://arquivos.victorjabur.com/python/modules/pycrypto-2.3.win-amd64-py2.7.exe

2 – Building and Installing PyCrypto Module for Windows All Versions 32 bits:

2.1 - You must have installed the Python 32 bits version: http://www.python.org/ftp/python/2.7.1/python-2.7.1.msi

2.2 - You should install the C Compiler for Windows – Microsoft Visual C++ Express Edition 2008: available here:http://www.microsoft.com/express/Downloads/#Visual_Studio_2008_Express_Downloads

ISO File to Download: http://www.microsoft.com/express/Downloads/#2008-All

2.3 - Install the Python Setup Tools available here: http://pypi.python.org/pypi/setuptools#downloads

2.4 - Include in your Advanced Variables Environment the binaries of Python. Right click at “My Computer” icon -> Properties -> Advanced Environment and edit your Path Variable including this two directories there:
Path = C:\Python27\Scripts;C:\Python27; + Path

1) C:\Python27\Scripts
2) C:\Python27

2.5 - Edit the file msvc9compiler.py inside of directory C:\Python27\Lib\distutils\msvc9compiler.py

After the line 651 approximately, find this line: – ld_args.append(‘/MANIFESTFILE:’ + temp_manifest)
Add the following line after the above line:

ld_args.append('/MANIFEST')

2.6 - Edit the file msvccompiler.py inside of directory C:\Python27\Lib\distutils\msvccompiler.py

At line 153 approximately, insert this line: return 9.0, as following, in this piece of code:

def get_build_version():
    """Return the version of MSVC that was used to build Python.

    For Python 2.3 and up, the version number is included in
    sys.version.  For earlier versions, assume the compiler is MSVC 6.
    """
    return 9.0
    prefix = "MSC v."
    i = string.find(sys.version, prefix)
    if i == -1:
        return 6

2.7 - Certify that exists the follow environment variable in your system, if don’t exist create a new one:

Name: VS90COMNTOOLS
Value: C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\

2.8 - Extract the file pycrypto-2.3.tar.gz that you downloaded before, open a dos command and access the pycrypto-2.3 folder

2.9 - Execute this command to compile, build and install the module:

python setup.py build --compiler msvc
python setup.py install

2.10 - Test if the package was generated successfully executing an import Crypto at Python shell.

2.11 - It’s finish. Optionally, you can distribute your compiled modules as an windows executable (.exe) file, executing this simple command on folder of your module, this case is pycrypto-2.3:

python setup.py bdist_wininst

As a result you will get a executable file with graphical interface created inside of folder “dist” and other people can install this executable file without to prepare a complex environment for build your own module. This is my result file of this process. http://arquivos.victorjabur.com/python/modules/pycrypto-2.3.win32-py2.7.exe

Credits and References to this post:

http://nukeit.org/compile-python-2-7-packages-with-visual-studio-2010-express/
http://yorickdowne.wordpress.com/2010/12/22/compiling-pycrypto-on-win7-64/
http://www.lfd.uci.edu/~gohlke/pythonlibs/
http://www.fuyun.org/2009/12/install-mysql-for-python-on-windows/
http://mattptr.net/2010/07/28/building-python-extensions-in-a-modern-windows-environment/

Good Bye.
Victor Jabur

Utilitário para geração de TrustStore (JKS) – Java

Olá Pessoal,

Desenvolvi um utilitário que transforma um arquivo zip, contendo “n” certificados de Autoridades Certificadoras para um arquivo JKS.

Para referência segue um link que contém todas as CA’s brasileiras:

http://acraiz.icpbrasil.gov.br/credenciadas/CertificadosAC-ICP-Brasil/ACcompactado.zip

Como seria o processo normal ?

1 – Java Keytool – http://download.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
É um software que acompanha a máquina virtual Java (jdk), utilizado para diversas finalidades com relação à segurança de aplicações e pode ser usado para gerar o pacote JKS.
Seguem dois comandos exemplo para se trabalhar com arquivos JKS de truststore:

1. Listando todos os certificados contidos em um arquivo JKS:

keytool –list –v –keystore C:\meukeystore.jks

2. Importando um certificado de uma AC para dentro de um JKS pré-existente

keytool –import –trustcacerts –file C:\certificadoAC.cer –alias apelidoentrada –keystore C:\meutruststore.jks

Observação: Caso não exista um jks no diretório especificado em -keystore, será criado um automaticamente.
O arquivo ACcompactado.zip especificado na URL anteriormente, possui atualmente 84 certificados, portanto, deve-se executar o comando (2), 84 vezes, alterando o -alias e o –file. Por ser esta uma forma muito trabalhosa de se gerar um arquivo Trusted JKS, foi criado um utilitário que auxiliará nesta etapa, apresentado no próximo capítulo.

2 – Usando o utilitário – utilitarioTrustJKS.jar
O utilitário desenvolvido basicamente recebe como entrada um arquivo zip com todos os certificados desejados e gera um arquivo trust.jks.
Parâmetros de Entrada:
1 – caminhoZip – Diretório do arquivo zip que contém todos os certificados das AC’s
2 – caminhoSaida – Diretório de saída, onde será gerado o truststore.jks
3 – senhaKestore – Senha do arquivo TrustStore JKS
4 – incluirExpirados (opcional) – valor default => false) – Possui os valores true ou false. Informa se certificados expirados ou não válidos ainda deverão ser incluídos no arquivo JKS gerado.

Exemplo de utilização:

java -jar utilitarioTrustJKS.jar C:\ACcompactado.zip C:\truststore.jks 123456789 true

Link para Download do arquivo Jar:
http://arquivos.victorjabur.com/java/seguranca/utilitarioTrustJKS.jar

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
import java.util.LinkedList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;

public class Main {

	private String caminhoZIP = "C:\\ACcompactado.zip";
	private String caminhoSaida = "C:\\truststore.jks";
	private String senhaKeystore = "123456789";
	private Boolean incluirExpirados = false;

	public static void main(String[] args) throws Exception {
		Main main = new Main();
		main.validarParametrosEntrada(args);
		List<X509Certificate> listaCertificadosValidos = main.getListaCertificadosValidos();
		main.gerarJKS(listaCertificadosValidos);
		System.out.println("Arquivo JKS gerado com sucesso - " + listaCertificadosValidos.size() + " certificados incluidos");
	}

	public void validarParametrosEntrada(String[] args){
		if(args.length < 3){
			throw new RuntimeException("O numero minimo de parametros = 3. caminhoZip caminhoSaida senhaKeystore e incluirExpirados (Opcional) ");
		}else{
			String caminhoZip = args[0];
			validacaoLeituraArquivo(new File(caminhoZip));
			this.caminhoZIP = caminhoZip;
			String caminhoSaida = args[1];
			this.caminhoSaida = caminhoSaida;
			String senhaKeystore = args[2];
			this.senhaKeystore = senhaKeystore;
			if(args.length >= 4){
				String incluirExpirados = args[3];
				if(incluirExpirados.equals("true") || incluirExpirados.equals("false")){
					this.incluirExpirados = Boolean.valueOf(incluirExpirados);
				}else{
					throw new RuntimeException("O parametro incluirExpirados (4) deve ser true ou false");
				}
			}
		}
	}
	
	public List<X509Certificate> getListaCertificadosValidos() {
		File arquivoZipEntrada = new File(this.caminhoZIP);
		validacaoLeituraArquivo(arquivoZipEntrada);
		List<X509Certificate> x509CertificateList = new LinkedList<X509Certificate>();
		try {
			InputStream in = new FileInputStream(arquivoZipEntrada);
			ZipInputStream zipInputStream = new ZipInputStream(in);

			ZipEntry zipentry = zipInputStream.getNextEntry();
			while (zipentry != null) {
				byte[] buffer = new byte[(int) zipentry.getSize()];
				int offset = 0;
				int numRead = 0;
				while (offset < buffer.length && (numRead = zipInputStream.read(buffer, offset, buffer.length - offset)) >= 0) {
					offset += numRead;
				}
				InputStream bis = new ByteInputStream(buffer, 0, buffer.length);
				CertificateFactory cf = CertificateFactory.getInstance("X.509");
				X509Certificate cert = (X509Certificate) cf.generateCertificate(bis);
				try {
					cert.checkValidity();
					x509CertificateList.add(cert);
				} catch (CertificateExpiredException e) {
					if(this.incluirExpirados){
						x509CertificateList.add(cert);
						System.out.println("Certificado Expirado - " + zipentry.getName());
					}else{
						System.out.println("Certificado Expirado - " + zipentry.getName() + " - nao sera adicionado no JKS");
					}
				} catch (CertificateNotYetValidException e) {
					if(this.incluirExpirados){
						x509CertificateList.add(cert);
						System.out.println("Certificado não válido ainda - " + zipentry.getName());
					}else{
						System.out.println("Certificado não válido ainda - " + zipentry.getName() + " - nao sera adicionado no JKS");
					}
				}
				zipInputStream.closeEntry();
				zipentry = zipInputStream.getNextEntry();
			}
			zipInputStream.close();
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return x509CertificateList;
	}

	public OutputStream gerarJKS(List<X509Certificate> listaCertificados){
		OutputStream out = null;
		try {
			KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
			keystore.load(null, null);
			int indice = 0;
			for (X509Certificate cert : listaCertificados) {
				keystore.setCertificateEntry("ac_" + indice, cert);
				indice++;
			}
			File jks = new File(this.caminhoSaida);
			String diretorioDestino = jks.getParent();
			new File(diretorioDestino).mkdirs();
			out = new FileOutputStream(this.caminhoSaida);
			keystore.store(out, this.senhaKeystore.toCharArray());
			out.close();
			out.flush();
		} catch (Exception e) {
			throw new RuntimeException("Erro ao gerar o arquivo de Keystore - " + e.getCause() + " - " + e.getMessage());
		}
		return out;
	}
	
	public void validacaoLeituraArquivo(File arquivo) {
		if (!arquivo.exists()) {
			throw new RuntimeException("Arquivo Inexistente - " + arquivo.getAbsolutePath());
		}
		if (!arquivo.canRead()) {
			throw new RuntimeException("Sem permissão de Leitura do Arquivo - " + arquivo.getAbsolutePath());
		}
	}
}

Abraços,
Victor Jabur

How to access server MBean properties at weblogic 11g using Java – JMX

Hi,

If you want to get any property of Admin or Managed Server (Weblogic) using Java, then this post will help you.

The Oracle Enterprise Manager have a useful tool for explore MBean (System MBean Browser).

As you can see in the picture bellow:

Do you can to capture any server property desired with these java code:

1 – Reading a property if the application is deployed at server (local connection)

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.InitialContext;

String serverName = System.getProperty("weblogic.Name");
InitialContext ctx = new InitialContext();
MBeanServer server = (MBeanServer)ctx.lookup("java:comp/env/jmx/runtime");
ObjectName objName = new ObjectName("com.bea:Name=" + serverName + ",Type=Server");
String pathJKS = (String) server.getAttribute(objName, "CustomTrustKeyStoreFileName");

2 – Reading a property if the application is remote (remote connection)

import java.util.Hashtable;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

  public static void main(String [] args) throws Exception{
    String serverName = "AdminServer";
    String hostName = "192.168.1.192";
    String username = "weblogic";
    String password = "welcome1";
    int port = 10000;
    String protocol = "t3";
    String jndiroot = "/jndi/";
    String mserver = "weblogic.management.mbeanservers.domainruntime";
    JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostName, port, jndiroot + mserver);
    Hashtable h = new Hashtable();
    h.put(Context.SECURITY_PRINCIPAL, username);
    h.put(Context.SECURITY_CREDENTIALS, password);
    h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL, h);
    ObjectName objName = new ObjectName("com.bea:Name=" + serverName + ",Type=Server");
    String pathJKS = (String) connector.getMBeanServerConnection().getAttribute(objName, "CustomTrustKeyStoreFileName");
    System.out.println(pathJKS);
  }

In the cases above, i’m reading a property that is called “CustomTrustKeyStoreFileName”, that’s a string path of the Trusted Keystore. But many and many properties could be read, for example:

  • CustomIdentityKeyStoreFileName
  • ListenPort
  • UploadDirectoryName

That’s it.

Victor Jabur

Working with Expiration Human Task on Oracle Soa Suite 11g

Hello,

I had that to implement an expiration process and go to leave the main steps here:

1- Creating a new Application: File -> New -> Generic Application -> ApplicationExpirationHT
2- Adding a project to application: Project Name: ProjectExpirationHT Project Type: SOA
3- Select: Empty Composite and click at Finish
4- Make a drag and drop of BPEL Process to your composite.xml screen PS: Choose One Way BPEL Process on template combobox
5- Go to file BPELProcess1.bpel in design mode and drag and drop a Human Task Component
6-Double Click in the green human task icon, click at the green plus button
7-Add a Task parameter, for this example i will make the default input parameter (string), that i will use to set the time of expiration (on duration format)
8-Here goes the magic point; Add the custom outcome action called “EXPIRED”
9-This is the final configuration screen. Your screen should like this:
10-Edit your Humantask1.task file and add an user assignment (weblogic is the default user)
11-This is the main configuration for the task expiration (Deadlines): Check “Expire After” and select the task parameter that exists in your payload variable, for this example is inputstring (/task:task/task:payload/task:Parameter1)
12-This is the final step, when your task expires, will be enter on Expired branch and you could make other things when the task expires
Important Tips-

  1. Your payload parameter should be in a DURATION Format, here is an example (P0Y0M0DT0H0M0S). Here is more details about this default type: http://www.w3.org/TR/xmlschema-2/#duration
  2. When you set the Deadlines on your .task file, the expression for duration should be a parameter of your payload, because the rest of task parameters is READ-ONLY
  3. If your bpel is already created and you want to add the expiration validation, don’t worry, you cannot to recreate all flow, it is enough to add a new branch, copy of the others outcomes expressions and change the status task to EXPIRED, it works !
That is it people, if have any question, invite a email for me or better, add commentary for this post and i can help you !

Script Python para Deploy Automatizado usando MD5 e SFTP

Boa Noite pessoal,

Contratei uma hospedagem na Locaweb recentemente para meus sites em Django / Python e eu como sempre querendo automatizar tudo o tempo todo, criei um script em Python que realiza o deploy da minha aplicação lá no servidor remoto.

Objetivo: Copiar uma pasta e todo o seu conteúdo recursivamente para o servidor usando Secure File Transfer Protocol (SFTP), sincronizando as duas pastas (local e remota), isto é, identificar quais arquivos modificaram (usando md5) e copiar apenas eles para o servidor, removendo todos os arquivos e pastas remotas que foram deletados localmente desde a última sincronização. Tudo isto de um jeito super rápido, ocupando o mínimo de banda possível e feito com apenas 1 clique. Semelhante ao deploy do Google App Engine, para quem já utilizou.

Características:

  1. Biblioteca Paramiko – Estou utilizando uma biblioteca poderosa que implementa a parte de comunicação remota (SSH e SFTP e muito mais), chamada Paramiko.
  2. Índice MD5 – Para comparar arquivos locais e remotos, utilizo MD5, isto é, uma espécie de checksum / hashcode, que lê os bytes de um arquivo e me gera uma string única, sobre a qual eu relizo a comparação. Para não ter que fazer download do arquivo remoto apenas para calcular o md5, criei um índice, que nada mais é do que um dicionário em python que contém como chave o caminho completo do arquivo remoto e como valor o seu md5. Atualizo esse índice durante a sincronização.
  3. Arquivo de Configuração (Properties) – Estou utilizando um arquivo properties para isolar os dados de conexão ao servidor, tais como usuário e senha e mantê-los em uma pasta em separado.
  4. Barra de Progresso – Tentei implementar uma espécie de barra de progresso em modo texto, que imprime 100 caracteres “ponto”, e cada caractere representa 1% do upload do arquivo durante a cópia para o servidor.

Não se esqueçam de instalar a biblioteca paramiko, tem informações aqui no site do autor: http://www.lag.net/paramiko/

Aqui estão os pacotes necessários para as pessoas que utilizam o windows:

- Windows 64 bits (Python 2.7)

paramiko-1.7.7.1.win-amd64-py2.7.exe
pycrypto-2.3.win-amd64-py2.7.exe

- Windows 32 bits (Python 2.7)

paramiko-1.7.7.1.win32-py2.7.exe
pycrypto-2.3.win32-py2.7.exe

Para instalar em linux basta fazer o download do .tar.gz, acessar o diretório expandido e digitar o comando easy_install .

Vou postar agora o código fonte, são 2 arquivos, um para a configuração (properties – .ini) e o outro realmente que realiza o deploy (.py).

Arquivo de Configuração: settings.ini

[deploy]
HOSTNAME: meuservidor.com ou 187.200.123.12
PORT: 22
USERNAME: usuario
PASSWORD: senha
DIR_LOCAL_RAIZ: /app/pythonProjects
DIR_REMOTO_RAIZ: /home/storage/abc/julianajabur
WSGI: /home/storage/abc/julianajabur/public_html/julianajabur/index.wsgi
INDICE_MD5: /home/storage/abc/julianajabur/python_conf/julianajabur/indexmd5

Explicando os parâmetros acima:

  1. HOSTNAME = Endereço do servidor, pode ser um ip ou um nome DNS
  2. PORT = Porta de comunicação, 22 é a porta padrão para ftp
  3. USERNAME = usuário
  4. PASSWORD = senha
  5. DIR_LOCAL_RAIZ = caminho raiz da pasta que eu quero copiar, importante: aqui NÃO É a pasta a ser copiada, e sim apenas o caminho inicial dela, utilizo isso para fazer o de/para da estrutura de arquivos local versus a remota.
  6. DIR_REMOTO_RAIZ = idem ao de cima, só que aplicado à pasta remota.
  7. WSGI – aqui é o caminho até o seu arquivo WSGI, pois eu realizo uma cópia dele por último, para ter o mesmo efeito de touch arquivo.wsgi, indicando ao apache que sua aplicação foi mudada e deve ser atualizada.
  8. INDICE_WSGI = Caminho remoto onde vai ser gravado o arquivo de índice md5, observação, deve ser um diretório fora da pasta do seu projeto, para não atrapalhar no processo de sincronização de pastas.

Arquivo SFTPLocaweb.py

#! /usr/bin/python
# -*- coding: iso-8859-1 -*-

import os, paramiko, hashlib, sys, pickle
from stat import S_ISREG, S_ISDIR
from ConfigParser import RawConfigParser

class SFTPLocaweb:

    def __init__(self):
        self.caminhoArquivoConfiguracao = '../../../../python_conf/julianajabur/settings.ini'
        config = self.getConfigurationFile()
        self.hostname = config.get('deploy', 'HOSTNAME')
        self.port = config.getint('deploy', 'PORT')
        self.username = config.get('deploy', 'USERNAME')
        self.password = config.get('deploy', 'PASSWORD')
        self.dirLocalRaiz = config.get('deploy', 'DIR_LOCAL_RAIZ')
        self.dirRemotoRaiz = config.get('deploy', 'DIR_REMOTO_RAIZ')
        self.wsgi = config.get('deploy', 'WSGI')
        self.indice_md5 = config.get('deploy', 'INDICE_MD5')
        self.pastaOrigem = ''
        self.pastaDestino = ''
        self.sftp = None
        self.dicionario_md5 = {}
        self.statusTransferencia = 0    
        self.totais = {}    
        self.transport = None
  
    def getConfigurationFile(self):
        BASE_DIR = os.path.dirname(os.path.abspath(__file__))
        PYTHON_CONF = os.path.abspath(self.pathJoin(BASE_DIR, self.caminhoArquivoConfiguracao))
        config = RawConfigParser()
        config.read(PYTHON_CONF)
        return config        
    
    def getConexaoSSH(self):
        try:
            print 'Estabelecendo conexão com: ', self.hostname, self.port, '...'
            self.transport = paramiko.Transport((self.hostname, self.port))
            self.transport.connect(username=self.username, password=self.password, hostkey=None)
            self.sftp = paramiko.SFTPClient.from_transport(self.transport)
        except Exception, e:
            print '*** Erro ao se conectar com o servidor: %s: %s' % (e.__class__, e)
            sys.exit()
            try:
                self.transport.close()
            except:
                pass
  
    def pathJoin(self, raiz, diretorio):
        return os.path.join(raiz, diretorio).replace('\\', '/')
    
    def criarDiretorioRemoto(self, diretorio):
        try:
            self.sftp.mkdir(diretorio)
            print '    (diretório criado) ', diretorio
            return 1
        except IOError:
            print '    (diretório já existe) ', diretorio
            return 0
  
    def getDiretorioRemotoFromLocal(self, diretorioLocal):
        return diretorioLocal.replace(self.dirLocalRaiz, self.dirRemotoRaiz)

    def getDiretorioLocalFromRemoto(self, diretorioRemoto):
        return diretorioRemoto.replace(self.dirRemotoRaiz, self.dirLocalRaiz)
  
    def existeArquivoIndice(self):
        try:
            if self.sftp.stat(self.indice_md5):
                return True
        except:
            return False
  
    def recuperaMd5(self, entrada):
        try:
            md5 = self.dicionario_md5[entrada]
            return md5
        except KeyError:
            return None
  
    def atualizarIndice(self):
        for key in self.dicionario_md5.keys():
            if not os.path.exists(self.getDiretorioLocalFromRemoto(key)):
                self.dicionario_md5.pop(key)
  
    def carregarDicionarioMd5(self):
        if self.existeArquivoIndice():
            indice_local = self.getDiretorioLocalFromRemoto(self.indice_md5)
            self.sftp.get(self.indice_md5, indice_local)
            indice = open(indice_local, 'rb')
            self.dicionario_md5 = pickle.load(indice)
            indice.close()
  
    def salvarDicionarioMd5(self):
        indice_local = self.getDiretorioLocalFromRemoto(self.indice_md5)
        indice = open(indice_local, 'wb')
        pickle.dump(self.dicionario_md5, indice)
        indice.close()  
        self.copiarArquivoParaServidor(indice_local, self.indice_md5)
    
    def isArquivosIguaisMD5(self, local_file, remote_file):
        m_local = hashlib.md5()
        m_local.update(open(local_file, "rb").read())
        md5Local = m_local.digest()
        md5Remoto = self.recuperaMd5(remote_file)
        if md5Local == md5Remoto:
            return True
        else:
            return md5Local
  
    def calcularMd5(self, local_file):
        m_local = hashlib.md5()
        m_local.update(open(local_file, "rb").read())
        return m_local.digest()        
  
    def acompanharTransferenciaArquivo(self, tamanhoTransferido, tamanhoTotal):
        try:
            porcentagem = int((float(tamanhoTransferido) / float(tamanhoTotal)) * 100)
            pontos = porcentagem - self.statusTransferencia
            if pontos > 0:
                self.statusTransferencia = self.statusTransferencia + pontos
                sys.stdout.write(pontos * '.')
        except Exception, e:
            print '*** Exceção Lançada: %s: %s' % (e.__class__, e)
  
    def copiarArquivoParaServidor(self, local_file, remote_file):
        tentativas = 0
        try:
            self.statusTransferencia = 0
            self.sftp.put(local_file, remote_file, self.acompanharTransferenciaArquivo)
            print ''
        except:
            tentativas += 1     
            print 'ERRO ao enviar o arquivo ', local_file
            self.copiarArquivoParaServidor(self, local_file, remote_file)
        return tentativas
  
    def sincronizarPastas(self, dirLocal, dirRemoto):
        self.totais = {}
        self.pastaOrigem = dirLocal
        self.pastaDestino = dirRemoto
        self.getConexaoSSH()
        self.carregarDicionarioMd5()
        self.executarCopia()
        self.atualizarIndice()
        print 'Copiando o indice md5: ', 
        self.salvarDicionarioMd5()
        print 'Copiando o index.wsgi: ', 
        self.copiarArquivoParaServidor(self.getDiretorioLocalFromRemoto(self.wsgi), self.wsgi)
        self.transport.close()
    
    def deletarRecursosRemotos(self, dirRemoto):
        try:
            print 'PROCESSANDO A PASTA REMOTA - ', dirRemoto
            for entrada in  self.sftp.listdir(dirRemoto):
                remote_entry = self.pathJoin(dirRemoto, entrada)
                remote_entry = remote_entry.replace('\\','/')
                if self.isRemoteDir(remote_entry):
                    self.deletarRecursosRemotos(remote_entry)
                elif self.isRemoteFile(remote_entry):
                    local_file = self.getDiretorioLocalFromRemoto(remote_entry)
                    if not os.path.exists(local_file):
                        print "    (arquivo removido):", remote_entry, " (" + self.formataTamanhoArquivo(self.sftp.stat(remote_entry).st_size) + ") "
                        self.sftp.remove(remote_entry)
                        self.contabilizarTotais('arquivos_removidos', 1)
            if self.sftp.listdir != '' and not os.path.exists(self.getDiretorioLocalFromRemoto(dirRemoto)):
                print '    (diretório removido): ', dirRemoto
                self.sftp.rmdir(dirRemoto)
                self.contabilizarTotais('diretorios_removidos', 1)
        except Exception, e:
            print '*** Exceção Lançada ao deletar Recursos Remotos: %s: %s' % (e.__class__, e)
            sys.exit()
  
    def isRemoteDir (self, remote_path):
        try:
            st = self.sftp.stat( remote_path )
            return S_ISDIR(st.st_mode)
        except Exception:
            return False

    def isRemoteFile (self, remote_path):
        try:
            st = self.sftp.stat( remote_path )
            return S_ISREG(st.st_mode)
        except Exception:
            return False
  
    def formataTamanhoArquivo(self, tamanho):
        tipo = 1
        while(tamanho > 1024):
            tamanho = float(tamanho) / 1024.0
            tipo += 1
        if(tipo == 1):
            tamanho = "%.2f bytes" % (tamanho)
        elif(tipo == 2):
            tamanho = "%.2f Kb" % (tamanho)
        elif(tipo == 3):
            tamanho = "%.2f Mb" % (tamanho)
        elif(tipo == 4):
            tamanho = "%.2f Gb" % (tamanho)
        return tamanho.replace(".00", "")
          
    def contabilizarTotais(self, tipo, valor):
        self.totais[tipo] = self.getResultadoTotal(tipo) + valor
    
    def getResultadoTotal(self, chave):
        try:
            return self.totais[chave]
        except:
            return 0
  
    def executarCopia(self):
        print '=' * 60
        print 'Local = ' + self.pastaOrigem
        print 'Remoto = ' + self.pastaDestino
        print '=' * 60

        try:
            diretorioRemoto = self.pastaDestino
            self.contabilizarTotais('diretorios_criados', self.criarDiretorioRemoto(diretorioRemoto))
            for raiz, diretorios, arquivos in os.walk(self.pastaOrigem):
                raiz = raiz.replace('\\', '/')
                print 'PROCESSANDO A PASTA LOCAL - ', self.pathJoin(self.pastaOrigem, raiz)
                for diretorio in diretorios:
                    self.contabilizarTotais('diretorios', 1)
                    diretorioRemoto = self.getDiretorioRemotoFromLocal(self.pathJoin(raiz, diretorio))
                    self.contabilizarTotais('diretorios_criados', self.criarDiretorioRemoto(diretorioRemoto))
                for arquivo in arquivos:
                    self.contabilizarTotais('arquivos', 1)
                    local_file = self.pathJoin(raiz, arquivo)
                    remote_file = self.getDiretorioRemotoFromLocal(local_file)
                    is_up_to_date = False
                    try:
                        # verifica se o arquivo remoto existe
                        if self.sftp.stat(remote_file):
                            md5 = self.isArquivosIguaisMD5(local_file, remote_file)
                            if md5 == True:
                                print "    (não modificado):", arquivo + " (" + self.formataTamanhoArquivo(os.path.getsize(local_file)) + ")"
                                self.contabilizarTotais('arquivos_naomodificados', 1)
                                is_up_to_date = True
                            else:
                                print "    (modificado):", arquivo + " (" + self.formataTamanhoArquivo(os.path.getsize(local_file)) + ") ",
                                self.dicionario_md5[remote_file] = md5
                                self.contabilizarTotais('arquivos_modificados', 1)
                    except:
                        print "    (novo):", arquivo + " (" + self.formataTamanhoArquivo(os.path.getsize(local_file)) + ") ",
                        self.contabilizarTotais('arquivos_novos', 1)
                        md5 = self.calcularMd5(local_file)
                        self.dicionario_md5[remote_file] = md5
                    if not is_up_to_date:
                        self.contabilizarTotais('tentativas', self.copiarArquivoParaServidor(local_file, remote_file))
                        
            self.deletarRecursosRemotos(self.pastaDestino)
            
        except Exception, e:
            print '*** Exceção Lançada ao copiar arquivo: %s: %s' % (e.__class__, e)
            sys.exit()
        print '=' * 60
        print 'Número de tentativas para erro (retry):', self.getResultadoTotal('tentativas')
        print 'Total de diretórios criados:', self.getResultadoTotal('diretorios_criados')
        print 'Total de arquivos novos:', self.getResultadoTotal('arquivos_novos')
        print 'Total de arquivos modificados:', self.getResultadoTotal('arquivos_modificados')
        print 'Total de arquivos não modificados:', self.getResultadoTotal('arquivos_naomodificados')
        print 'Total de diretórios remotos removidos:', self.getResultadoTotal('diretorios_removidos')
        print 'Total de arquivos remotos removidos:', self.getResultadoTotal('arquivos_removidos')
        print 'Total de diretórios:', self.getResultadoTotal('diretorios')
        print 'Total de arquivos:', self.getResultadoTotal('arquivos')
        print 'Completo!'
        print '=' * 60

Preste atenção ao parâmetro self.caminhoArquivoConfiguracao, setando para o diretório onde se encontra o seu arquivo de configuração (settings.ini)

Exemplo de utilização (Chamada do Deploy):

#! /usr/bin/python
# -*- coding: iso-8859-1 -*-

from julianajabur.deploy import ajustarFlex, SFTPLocaweb

sftpLocaweb = SFTPLocaweb.SFTPLocaweb()

dir_local_wsgi='/app/pythonProjects/wsgi_apps/julianajabur'
dir_remote_wsgi = "/home/storage/abc/julianajabur/wsgi_apps/julianajabur"
sftpLocaweb.sincronizarPastas(dir_local_wsgi, dir_remote_wsgi)

print '\n\n\n\n'

dir_local_public='/app/pythonProjects/public_html/julianajabur'
dir_remote_public = "/home/storage/abc/julianajabur/public_html/julianajabur"
sftpLocaweb.sincronizarPastas(dir_local_public, dir_remote_public)

E por último segue o resultado da execução do script (SysOut), impresso na linha de comando:

Estabelecendo conexão com:  servidor.com 22 ...
============================================================
Local = /app/pythonProjects/wsgi_apps/julianajabur
Remoto = /home/storage/abc/julianajabur/wsgi_apps/julianajabur
============================================================
    (diretório já existe)  /home/storage/abc/julianajabur/wsgi_apps/julianajabur
PROCESSANDO A PASTA LOCAL -  /app/pythonProjects/wsgi_apps/julianajabur
    (diretório já existe)  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/.settings
    (diretório já existe)  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur
    (não modificado): SFTPLocaweb.py (11.93 Kb)
    (não modificado): .project (422 bytes)
    (não modificado): .pydevproject (670 bytes)
PROCESSANDO A PASTA LOCAL -  /app/pythonProjects/wsgi_apps/julianajabur/.settings
    (não modificado): org.eclipse.ltk.core.refactoring.prefs (134 bytes)
    (não modificado): org.eclipse.core.resources.prefs (276 bytes)
PROCESSANDO A PASTA LOCAL -  /app/pythonProjects/wsgi_apps/julianajabur/julianajabur
    (diretório já existe)  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur/julianajaburapp
    (diretório já existe)  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur/deploy
    (não modificado): urls.py (650 bytes)
    (não modificado): urls.pyc (1004 bytes)
    (não modificado): __init__.pyc (141 bytes)
    (não modificado): __init__.py (0 bytes)
    (não modificado): settings.pyc (3.04 Kb)
    (não modificado): manage.py (654 bytes)
    (não modificado): amfgateway.pyc (1.46 Kb)
    (não modificado): amfgateway.py (855 bytes)
    (não modificado): settings.py (3.57 Kb)
PROCESSANDO A PASTA LOCAL -  /app/pythonProjects/wsgi_apps/julianajabur/julianajabur/julianajaburapp
    (não modificado): models.pyc (751 bytes)
    (não modificado): __init__.pyc (157 bytes)
    (não modificado): views.py (538 bytes)
    (não modificado): models.py (212 bytes)
    (não modificado): __init__.py (0 bytes)
    (não modificado): views.pyc (1.11 Kb)
    (não modificado): tests.py (539 bytes)
    (não modificado): admin.pyc (336 bytes)
    (não modificado): admin.py (122 bytes)
PROCESSANDO A PASTA LOCAL -  /app/pythonProjects/wsgi_apps/julianajabur/julianajabur/deploy
    (não modificado): __init__.pyc (160 bytes)
    (não modificado): __init__.py (0 bytes)
    (não modificado): SFTPLocaweb.py (11.07 Kb)
    (não modificado): deployLocaweb.py (600 bytes)
    (não modificado): SFTPLocaweb.pyc (11.45 Kb)
    (não modificado): ajustarFlex.py (1.19 Kb)
    (não modificado): ajustarFlex.pyc (1.90 Kb)
PROCESSANDO A PASTA REMOTA -  /home/storage/abc/julianajabur/wsgi_apps/julianajabur
PROCESSANDO A PASTA REMOTA -  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/.settings
PROCESSANDO A PASTA REMOTA -  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur
PROCESSANDO A PASTA REMOTA -  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur/julianajaburapp
PROCESSANDO A PASTA REMOTA -  /home/storage/abc/julianajabur/wsgi_apps/julianajabur/julianajabur/deploy
============================================================
Número de tentativas para erro (retry): 0
Total de diretórios criados: 0
Total de arquivos novos: 0
Total de arquivos modificados: 0
Total de arquivos não modificados: 30
Total de diretórios remotos removidos: 0
Total de arquivos remotos removidos: 0
Total de diretórios: 4
Total de arquivos: 30
Completo!
============================================================
Copiando o indice md5: ....................................................................................................
Copiando o index.wsgi: ....................................................................................................

Até a próxima pessoal, espero que este script ajude muitas pessoas, qualquer dúvida, basta deixar um comentário aqui no blog e eu respondo.

Sintam-se à vontade para manipular o script como vocês bem entenderem, e se melhorarem ele, me enviem uma cópia com as melhorias para eu postar aqui no blog, …

Abraços,
Victor Jabur

Testador Completo online para Códigos em Python – MIT Tutor

Olá pessoal,

Segue o link para um testador completo para códigos em python, incluindo debug linha a linha, com possibilidade de avançar, retroceder e visualização completa das variáveis globais e locais, software desenvolvido por Philip J. Guo e hospedado no MIT.

http://people.csail.mit.edu/pgbovine/python/

Como exemplo, já foram desenvolvidos alguns exemplos de código, bastando clicar nos links em baixo, tais como fatorial, fibonacci, dentre outros algoritmos clássicos.

Segue uma imagem do debug, mostrando as variáveis do programa e outros dados:

Aproveitando a oportunidade, gostaria de informar também que a linguagem de programação Python está sendo utilizada como linguagem padrão em várias das disciplinas do MIT, seguem alguns links:

A Gentle Introduction to Programming Using Python

Introduction to Electrical Engineering and Computer Science I

A Gentle Introduction to Programming Using Python

Abraços pessoal,

Espero que tenham gostado desta ferramenta.

Victor Jabur.

Follow

Get every new post delivered to your Inbox.

Join 78 other followers