PHP Coder

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

[ Hits: 7.107 ]

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

Tabuadas

Veja a versão das principais distrubuições.

Jogo labirinto

Gerador de referência cruzada de texto

Desenha poligonos


  

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