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