PHP Coder

Publicado por Isaque Vieira de Sousa Alves (última atualização em 12/12/2010)

[ Hits: 7.242 ]

Homepage: www.isaquealves.com

Download phpcoder-0.1.0-alpha.tar.gz




Script desenvolvido em python para facilitar e agilizar a criação de um ambiente de desenvolvimento LAMP + Zend Framework + doctrine ORM.

O script é simples, foi criado especificamente para uma oficina que trabalhei no Enucomp 2010, sobre desenvolvimento rápido usando ZF + Doctrine ORM.

O que ele faz:

- Verifica se o usuário possui os pacotes do apache webserver, mysql, php  e curl instalados. Se não, instala.
- Cria os containers (diretórios) /home/user/Library e /home/user/Sites para armazenar as bibliotecas e os projetos.
- Faz o download de versões estáveis das bibliotecas e as instala em /home/user/Library.

TODO :

- Verificar atualizações do ZF, DOCTRINE e PHP Unit.
- Automatizar a criação dos projetos usando o ZF (com o zendtool).

Status de desenvolvimento:

- Ativo

Em breve divulgo o endereço do repositório no site bitbucket.com (uso o mercurial para controle de versões)

  



Esconder código-fonte

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""Base.py: Todos os pacotes instalados por este programa estão disponíveis sob licença GPL ou compatível,
Os pacotes apache2, php5, mysql-server-5.1 e todas as dependências relacionadas podem ser instalados também por meio
dos utilitários 'apt-get' ou 'synaptic' em uma instalação padrão do GNU/Linux Ubuntu.
Este programa faz uso do utilitário curl para realizar o download dos pacotes do ZendFramework, do Doctrine ORM e do PHP Unit.
O pacote Zend Framework pode ser obtido gratuitamente em <http://framework.zend.com/>
O pacote Doctrine ORM pode ser obtido em <http://www.doctrine-project.org/>
O pacote PHP Unit pode ser obtido em <http://github.com/sebastianbergmann/phpunit>

"""
#
#
# PHP CODER Environment Builder v0.01.1alpha
#     Constrói um ambiente básico para desenvolvimento de aplicativos em PHP utilizando Zend Framework/
#     Doctrine e PHP Unit.
# Developer: Isaque Alves<isaquealves@gmail.com>
# website  : http://www.isaquealves.com
# Estudante de Sistemas de Informação pela FAP - Parnaíba
# O Presente script é distribuido sob os termos da licença GPLv2
#
#

import os
import sys
from subprocess import Popen, PIPE
import time
import platform


CURRENT_DIR  = os.path.realpath(os.path.dirname(__file__))
DPKGQUERY    ='/usr/bin/dpkg-query'
DPKG         ='/usr/bin/dpkg'  #Define a localização padrão do utilitário dpkg
APT_INSTALL  ='/usr/bin/apt-get install -y'
USERNAME     = os.getenv('USERNAME')  #Obtém o nome de usuário do usuário atual
ZF_PKG       = 'ZendFramework-1.10.8' #TODO
Doctrine_PKG = 'Doctrine-1.2.3' #TODO
ZF_EXEC      = '~/Library/' + ZF_PKG + '/bin/zf.sh'
BAR          = CURRENT_DIR + "bar"
APP_VERSION  = '0.01.0-alpha'
#If you need, add more packages to this one
PACKAGELIST  = ['apache2','php5','mysql-server-5.1','curl']


#Do it by this way:     PACKAGELIST = ['apache2','php5','mysql-server-5.1','otherpackage']
# or this :                        PACKAGELIST.append('otherpackage')


def execWithRootPrivileges(executable):
    '''Get Root acces to the system by asking administrator password'''
    os.system('gksudo ' + executable)



def checkResourcesInstalation():
    ''' Check if a package is installed or not by searching the dpkg database'''
    is_not_installed = []
    for resourceName in PACKAGELIST:
       DPKG_QUERY = os.system(DPKGQUERY + ' -l | grep ' + resourceName +' > /dev/null')
       if(DPKG_QUERY):
          is_not_installed.append(True)
       else:
          is_not_installed.append(False)
    return is_not_installed


################################################################################
#from Envy source code
def cmdoutput(command, verbose=None):
        '''
        USAGE:
        * the command must be a string
        * you can pass 'noverbose' in order to make sure that stderr > /dev/null
        '''
        if verbose == 'noverbose':
            NULL = open('/dev/null', 'w')
            comnd = Popen(command, shell=True, stdout=PIPE, stderr=NULL)
            sts = os.waitpid(comnd.pid, 0)
            NULL.close()
        else:
            comnd = Popen(command, shell=True)# stdout=PIPE)
            sts = os.waitpid(comnd.pid, 0)


################################################################################

def buildPackageList():
    toinstall = []
    checked = checkResourcesInstalation()
    index = 0
    for installedPackage in checked:
        if(not installedPackage):
            index += 1
        else:
            toinstall.append(PACKAGELIST.pop(index))
    return toinstall



def installPackages(installList):
        installstring = APT_INSTALL + " ".join(installList)
        cmdoutput('sudo apt-get update')
        cmdoutput('sudo ' + installstring)



def createContainers():
    CMDSTR = 'mkdir -p /home/'+ USERNAME +'/Library/bin'
    cmdoutput(CMDSTR)
    CMDSTR = 'echo "PATH=$PATH:/home/'+ USERNAME +'/Library/bin" >> /home/'+ USERNAME +'/.bashrc'
    cmdoutput(CMDSTR)
    CMDSTR = 'mkdir -p /home/'+ USERNAME +'/Sites/public_html'
    cmdoutput(CMDSTR)
    cmdoutput('source /home/'+ USERNAME +'/.bashrc')




def getSourcePackage(url,destination):
    '''
        @TODO Verificar a existência de versões mais recentes do pacote a ser baixado e apresentar uma lista das 3 últimas versões ao desenvolvedor.
    '''
    filename = destination.split("/")
    cmdoutput('curl -# ' + url + ' -o ' + destination + ' 2>&1 | zenity --text="Obtendo '+ filename[2] + ' de '+ url +'" --title=" Obtendo'+ filename[2] +' a partir de '+ url +'" --progress --pulsate --auto-kill')



def getZendFramework():
    '''
        @TODO Melhorar esta função
    '''
    print"testando se há algum pacote anteriormente baixado..."
    filename = '/tmp/'+ ZF_PKG + '.zip'
    if (os.path.isfile(filename)):
        size = os.path.getsize(filename)
        if((size == 25221796L)):
            print "O pacote já foi obtido. Prosseguindo..."
            return
        else:
            print "O pacote foi parcialmente obtido. Reiniciando o download"
            getSourcePackage('http://framework.zend.com/releases/' + ZF_PKG + '/' + ZF_PKG + '.zip' ,filename)
    else:
        print "Obtendo o Zend Framework:"
        getSourcePackage('http://framework.zend.com/releases/' + ZF_PKG + '/' + ZF_PKG + '.zip' ,filename)



def installZendFramework():
     cmdoutput('unzip -o /tmp/' + ZF_PKG + '.zip -d /home/'+ USERNAME +'/Library/ 2>&1 | zenity --progress --pulsate')
     if(file('/home/'+ USERNAME +'/Library/ZendFramework-1.10.8/bin/zf.sh')):
         cmdoutput('ln -s /home/'+ USERNAME +'/Library/ZendFramework-1.10.8/bin/zf.sh /home/'+ USERNAME +'/Library/bin/zf')
     else:
         print "Há algo errado. Verifique a instalação do Zend Framework em /home/"+ USERNAME +"/Library/" + ZF_PKG



def getDoctrineORM():
    print"testando se há algum pacote anteriormente baixado..."
    filename = '/tmp/'+ Doctrine_PKG +'.tgz'
    if (os.path.isfile(filename)):
        size = os.path.getsize(filename)
        if(file(filename) and (size == 377480L)):
            print "O pacote já foi obtido. Prosseguindo..."
            return
        else:
            print "O pacote foi parcialmente obtido. Reiniciando o download"
            getSourcePackage('http://www.doctrine-project.org/downloads/'+ Doctrine_PKG +'.tgz',filename)
    else:
        print "Obtendo o Doctrine ORM"
        getSourcePackage('http://www.doctrine-project.org/downloads/'+ Doctrine_PKG +'.tgz',filename)



def installDoctrine():
    cmdoutput('cd /home/'+ USERNAME +'/Library/ && tar -xzpf /tmp/' + Doctrine_PKG + '.tgz 2>&1 | zenity --progress --pulsate')
    cmdoutput('cd -')



#PHP Unit GIT Repo: http://github.com/sebastianbergmann/phpunit
def getPHPUnit():
    print"testando se há algum pacote anteriormente baixado..."
    filename = '/tmp/PHP_Unit-3.5.tar.gz'
    if (os.path.isfile(filename)):
        size = os.path.getsize(filename)
        if (file(filename) and (size == 130L)):
            print "O pacote já foi obtido. Prosseguindo..."
            return
        else:
            print "O pacote foi parcialmente obtido. Reiniciando o download"
            getSourcePackage('http://nodeload.github.com/sebastianbergmann/phpunit/tarball/3.5',filename)
    else:
        print "Obtendo o PHP Unit"
        getSourcePackage('http://nodeload.github.com/sebastianbergmann/phpunit/tarball/3.5',filename)



def installPHPUnit():
    cmdoutput('cd /home/'+ USERNAME +'/Library/ && tar -xzpf /tmp/PHP_Unit-3.5.tar.gz && mv /home/'+ USERNAME +'/Library/sebastianbergmann* /home/'+ USERNAME +'/Library/PHP_Unit 2>&1 | zenity --progress --pulsate')
    cmdoutput('cd -')



def editPHPConf():
    pass



def createVHost():
    os.system("sed 's/USERNAME/"+USERNAME+"/g' "+ CURRENT_DIR +"/zfsite.example > "+ CURRENT_DIR +"/zfsite")
    execWithRootPrivileges("cp "+ CURRENT_DIR +"/zfsite /etc/apache2/sites-available/zfsite")
    cmdoutput('sudo a2ensite zfsite')
    #execWithRootPrivileges('gnome-terminal --command="nano -w /etc/apache2/sites-available/zfsite"')


def editHostsFile():
    print "Adicione ao final da primeira linha do arquivo /etc/hosts, após localhost, a palavra zendserver"
    print "Vamos abrir o arquivo para que você faça isso, ok?!!"
    time.sleep(3)
    cmdoutput("sudo nano -w /etc/hosts")

def enableModRewrite():
    cmdoutput('sudo a2enmod rewrite')

def restartApacheServer():
    cmdoutput('sudo service apache2 restart')


def main():
    from TerminalController import TerminalController
    t = TerminalController()
    print t.RED + t.BOLD +"PHP Coder Environment Builder" + APP_VERSION + t.NORMAL
    print __doc__
    print t.GREEN + "Vamos preparar o ambiente para desenvolvimento"
    print "Verificando se o ambiente já possui o webserver apache2, o sgdb mysql 5.1 e o php versão 5" + t.NORMAL
    toinstall = buildPackageList()
    if(len(toinstall) == 0):
        print t.BOLD + "Todos os pacotes estão instalados. Vamos adiante!" + t.NORMAL
    else:
        installPackages(toinstall)
    os.system('reset')
    print "Vamos obter agora, os pacotes do Zend Framework, Doctrine ORM e PHP Unit"
    print "Depois, será criado um novo container (Folder) em seu diretório pessoal chamado 'Library'"
    print "onde serão instalados o Zend Framework, o Doctrine ORM e o PHP Unit"
    getZendFramework()
    getDoctrineORM()
    getPHPUnit()
    print "Criando os containers 'Library' e 'Library/bin' em /home/"+ USERNAME + " e adicionando 'Library/bin' ao PATH do usuário " + USERNAME
    createContainers()
    print "Instalando os componentes"
    print "Zend framework"
    installZendFramework()
    print "Doctrine"
    installDoctrine()
    print "PHP Unit"
    installPHPUnit()
    print "Ativando o módulo 'mod_rewrite' do Apache Web Server"
    enableModRewrite()
    print "Criando um Virtual Host no Apache"
    createVHost()
    editHostsFile()
    print "Reiniciando o apache web server"
    restartApacheServer()
    print "Pronto. Para acessar o seu container de websites utilizando qualquer browser, acesse o endereço abaixo:"
    cmdoutput('echo http://zendserver/')









if __name__ == "__main__":
    if(platform.system() == "Linux"):
        if((platform.dist()[0] == "Ubuntu") or (platform.dist()[0]=="Debian")):
            main()
        else:
            print "Você está usando GNU/Linux %s mas este programa ainda não foi portado para outras distribuições além do Ubuntu. Sinta-se à vontade para fazê-lo!!" %(platform.dist()[0],)
    else:
        print "Você está usando %s - %s mas este programa não foi portado para outras plataformas" % (platform.system(),platform.release())




Scripts recomendados

Simulador de Empréstimos

Fatorial de um número

Script para screen shot

Máquina de Turing em Python 3

Sudoku


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts