1import os 2import sys 3import glob 4import shutil 5from pythonbrew.util import makedirs, rm_r 6from pythonbrew.define import PATH_BUILD, PATH_BIN, PATH_DISTS, PATH_PYTHONS,\ 7 PATH_ETC, PATH_SCRIPTS, PATH_SCRIPTS_PYTHONBREW,\ 8 PATH_SCRIPTS_PYTHONBREW_COMMANDS, PATH_BIN_PYTHONBREW,\ 9 PATH_LOG, PATH_PATCHES, PATH_ETC_CONFIG,\ 10 PATH_SCRIPTS_PYTHONBREW_INSTALLER, PATH_VENVS, PATH_HOME_ETC, ROOT 11import stat 12import time 13 14class PythonbrewInstaller(object): 15 """pythonbrew installer: 16 """ 17 18 @staticmethod 19 def install(installer_root): 20 # create directories 21 makedirs(PATH_PYTHONS) 22 makedirs(PATH_BUILD) 23 makedirs(PATH_DISTS) 24 makedirs(PATH_ETC) 25 makedirs(PATH_BIN) 26 makedirs(PATH_LOG) 27 makedirs(PATH_VENVS) 28 makedirs(PATH_HOME_ETC) 29 30 # create script directories 31 rm_r(PATH_SCRIPTS) 32 makedirs(PATH_SCRIPTS) 33 makedirs(PATH_SCRIPTS_PYTHONBREW) 34 makedirs(PATH_SCRIPTS_PYTHONBREW_COMMANDS) 35 makedirs(PATH_SCRIPTS_PYTHONBREW_INSTALLER) 36 37 # copy all .py files 38 for path in glob.glob(os.path.join(installer_root,"*.py")): 39 shutil.copy(path, PATH_SCRIPTS_PYTHONBREW) 40 for path in glob.glob(os.path.join(installer_root,"commands","*.py")): 41 shutil.copy(path, PATH_SCRIPTS_PYTHONBREW_COMMANDS) 42 for path in glob.glob(os.path.join(installer_root,"installer","*.py")): 43 shutil.copy(path, PATH_SCRIPTS_PYTHONBREW_INSTALLER) 44 45 # create patches direcotry 46 rm_r(PATH_PATCHES) 47 shutil.copytree(os.path.join(installer_root,"patches"), PATH_PATCHES) 48 49 # create a main file 50 fp = open("%s/pythonbrew_main.py" % PATH_SCRIPTS, "w") 51 fp.write("""import pythonbrew 52if __name__ == "__main__": 53 pythonbrew.main() 54""") 55 fp.close() 56 57 # create entry point file 58 fp = open(PATH_BIN_PYTHONBREW, "w") 59 fp.write("""#!/usr/bin/env bash 60%s "%s/pythonbrew_main.py" "$@" 61""" % (sys.executable, PATH_SCRIPTS)) 62 fp.close() 63 # mode 0755 64 os.chmod(PATH_BIN_PYTHONBREW, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR|stat.S_IRGRP|stat.S_IXGRP|stat.S_IROTH|stat.S_IXOTH) 65 66 # create a bashrc for pythonbrew 67 shutil.copy(os.path.join(installer_root,'etc','bashrc'), os.path.join(PATH_ETC,'bashrc')) 68 69 # copy config.cfg 70 shutil.copy(os.path.join(installer_root,'etc','config.cfg'), PATH_ETC_CONFIG) 71 72 @staticmethod 73 def systemwide_install(): 74 profile = """\ 75#begin-pythonbrew 76if [ -n "${BASH_VERSION:-}" -o -n "${ZSH_VERSION:-}" ] ; then 77 export PYTHONBREW_ROOT=%(root)s 78 source "${PYTHONBREW_ROOT}/etc/bashrc" 79fi 80#end-pythonbrew 81""" % {'root': ROOT} 82 83 if os.path.isdir('/etc/profile.d'): 84 fp = open('/etc/profile.d/pythonbrew.sh', 'w') 85 fp.write(profile) 86 fp.close() 87 elif os.path.isfile('/etc/profile'): 88 # create backup 89 shutil.copy('/etc/profile', '/tmp/profile.pythonbrew.%s' % int(time.time())) 90 91 output = [] 92 is_copy = True 93 fp = open('/etc/profile', 'r') 94 for line in fp: 95 if line.startswith('#begin-pythonbrew'): 96 is_copy = False 97 continue 98 elif line.startswith('#end-pythonbrew'): 99 is_copy = True 100 continue 101 if is_copy: 102 output.append(line) 103 fp.close() 104 output.append(profile) 105 106 fp = open('/etc/profile', 'w') 107 fp.write(''.join(output)) 108 fp.close() 109 110