Ejemplo n.º 1
0
    def run(self):
        # generate .dsc source pkg
        self.run_command("sdist_dsc")

        # get relevant options passed to sdist_dsc
        sdist_dsc = self.get_finalized_command("sdist_dsc")
        dsc_tree = sdist_dsc.dist_dir

        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree, entry)
            if os.path.isdir(fulldir):
                if entry == "tmp_py2dsc":
                    continue
                target_dirs.append(fulldir)

        if len(target_dirs) > 1:
            raise ValueError(
                "More than one directory in deb_dist. " "Unsure which is source directory. All: %r" % (target_dirs,)
            )

        if len(target_dirs) == 0:
            raise ValueError("could not find debian source directory")

        # define system command to execute (gen .deb binary pkg)
        syscmd = ["dpkg-buildpackage", "-rfakeroot", "-b"]

        if not self.sign_results:
            syscmd.append("-uc")

        util.process_command(syscmd, cwd=target_dirs[0])
Ejemplo n.º 2
0
    def run(self):
        # generate .dsc source pkg
        self.run_command('sdist_dsc')

        # get relevant options passed to sdist_dsc
        sdist_dsc = self.get_finalized_command('sdist_dsc')
        dsc_tree = sdist_dsc.dist_dir

        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree, entry)
            if os.path.isdir(fulldir):
                if entry == 'tmp_py2dsc':
                    continue
                target_dirs.append(fulldir)

        if len(target_dirs) > 1:
            raise ValueError('More than one directory in deb_dist. '
                             'Unsure which is source directory. All: %r' %
                             (target_dirs, ))

        if len(target_dirs) == 0:
            raise ValueError('could not find debian source directory')

        # define system command to execute (gen .deb binary pkg)
        syscmd = ['dpkg-buildpackage', '-rfakeroot', '-b']

        if not self.sign_results:
            syscmd.append('-uc')

        if self.ignore_source_changes:
            syscmd.append('-i.*')

        util.process_command(syscmd, cwd=target_dirs[0])
Ejemplo n.º 3
0
    def run(self):
        # generate .deb file
        self.run_command('bdist_deb')

        # get relevant options passed to sdist_dsc
        sdist_dsc = self.get_finalized_command('sdist_dsc')

        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        target_debs = glob.glob( os.path.join( sdist_dsc.dist_dir, '*.deb' ) )

        if len(target_debs)==0:
            raise ValueError('could not find .deb file')

        for target_deb in target_debs:
            # define system command to execute (install .deb binary pkg)
            syscmd = ['dpkg','--install',target_deb]
            util.process_command(syscmd)
Ejemplo n.º 4
0
    def run(self):
        # generate .dsc source pkg
        self.run_command('sdist_dsc')

        # execute system command and read output (execute and read output of find cmd)
        dsc_tree = 'deb_dist'
        target_dir = None
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree,entry)
            if os.path.isdir(fulldir):
                if target_dir is not None:
                    raise ValueError('more than one directory in deb_dist. '
                                     'Unsure which is source directory')
                else:
                    target_dir = fulldir
        if target_dir is None:
            raise ValueError('could not find debian source directory')

        # define system command to execute (gen .deb binary pkg)
        syscmd = ['dpkg-buildpackage','-rfakeroot','-uc','-b']

        util.process_command(syscmd,cwd=target_dir)
Ejemplo n.º 5
0
    def run(self):
        
        # generate .dsc source pkg
        self.run_command('sdist_dsc')

        # execute system command and read output (execute and read output of find cmd)
        dsc_tree = 'deb_dist'
        target_dir = None
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree,entry)
            if os.path.isdir(fulldir):
                if target_dir is not None:
                    raise ValueError('more than one directory in deb_dist. '
                                     'Unsure which is source directory')
                else:
                    target_dir = fulldir
        if target_dir is None:
            raise ValueError('could not find debian source directory')        
        
        # inject custom logic to dh_builddeb (build digsigsums before and add aegis manifest after)
        DEBNAME = self.distribution.get_name()+'_'+self.distribution.get_version()+'*_all.deb'
        rules = open(target_dir+'/debian/rules', 'a')
        rules.write('override_dh_builddeb:\n\tpython ../../digsigsums.py '+self.distribution.get_name()+\
        '\n\tdh_builddeb')
        if self.aegis_manifest is not None:
            rules.write('\n\tar q ../'+DEBNAME+' _aegis')
        
        rules.write('\n\n')
        rules.close()

        # make aegies manifest avaiable to debian/rules
        if self.aegis_manifest is not None:
            copy(self.aegis_manifest, target_dir+'/_aegis')
        
        # define system command to execute (gen .deb binary pkg)
        syscmd = ['dpkg-buildpackage','-rfakeroot','-uc','-b']

        util.process_command(syscmd,cwd=target_dir)   
Ejemplo n.º 6
0
    def run(self):
        # generate .deb file
        self.run_command('bdist_deb')

        # get relevant options passed to sdist_dsc
        sdist_dsc = self.get_finalized_command('sdist_dsc')

        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        target_debs = glob.glob( os.path.join( sdist_dsc.dist_dir, '*.deb' ) )

        if len(target_debs)>1:
            raise ValueError('More than one .deb file in deb_dist. '
                             'Unsure which is desired. All: %r'%(
                target_debs,))

        if len(target_debs)==0:
            raise ValueError('could not find .deb file')

        # define system command to execute (gen .deb binary pkg)
        syscmd = ['dpkg','--install',target_debs[0]]

        util.process_command(syscmd)
Ejemplo n.º 7
0
    def run(self):
        """Order of operations:

            * create the source package with `sdist_dsc`
            * update the Python dependencies
            * run specific DjangoFloor command for extra Debian files (systemd, static files, …)
            * add postinstall files
            * build  a .deb package from the modified `sdist_dsc`
        """
        # generate .dsc source pkg
        sdist_dsc.run(self)
        project_name = self.distribution.metadata.name
        # get relevant options passed to sdist_dsc
        # sdist_dsc = self.get_finalized_command('sdist_dsc')
        dsc_tree = self.dist_dir
        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree, entry)
            if os.path.isdir(fulldir):
                if entry == 'tmp_py2dsc':
                    continue
                target_dirs.append(fulldir)
        if len(target_dirs) > 1:
            raise ValueError('More than one directory in deb_dist. '
                             'Unsure which is source directory. All: %r' % (target_dirs,))
        elif len(target_dirs) == 0:
            raise ValueError('could not find debian source directory')
        target_dir = target_dirs[0]

        # noinspection PyAttributeOutsideInit
        self.config_parser = ConfigParser.ConfigParser()
        self.config_parser.read(self.get_config_files())

        extra_processes = []
        for process_line in self.get_option(project_name, 'processes', fallback='').splitlines():
            process_line = process_line.strip()
            process_name, sep, process_cmd = process_line.partition(':')
            if process_line and sep != ':':
                print('Extra processes must be of the form "process_name:command_line"')
                raise ValueError
            elif process_line:
                extra_processes.append(process_line)
        frontend = self.get_option(project_name, 'frontend', fallback=None)
        process_manager = self.get_option(project_name, 'process_manager', fallback=None)
        username = self.get_option(project_name, 'username', fallback=project_name)
        extra_depends = ''

        # prepare the use of the gen_install command
        os.environ['DJANGOFLOOR_PROJECT_NAME'] = project_name
        set_env()
        collect_static_dir = os.path.join(target_dir, 'gen_install', 'var', project_name, 'static')
        etc_dir = os.path.join(target_dir, 'gen_install', 'etc')
        gen_install_command = [sys.argv[0], 'gen_install', '--collectstatic', collect_static_dir]
        gen_install_command += ['--user', username]
        for extra_process in extra_processes:
            gen_install_command += ['--extra-process', extra_process]
        if frontend == 'nginx':
            gen_install_command += ['--nginx', os.path.join(etc_dir, 'nginx', 'sites-available', '%s.conf' % project_name)]
            extra_depends += ', nginx'
        elif frontend == 'apache2.2':
            gen_install_command += ['--apache22', os.path.join(etc_dir, 'apache2', 'sites-available', '%s.conf' % project_name)]
            extra_depends += ', apache2 (>= 2.2)'
        elif frontend == 'apache2.4':
            gen_install_command += ['--apache24', os.path.join(etc_dir, 'apache2', 'sites-available', '%s.conf' % project_name)]
            extra_depends += ', apache2 (>= 2.4)'
        elif frontend is not None:
            print('Invalid value for frontend: %s' % frontend)
            raise ValueError
        gen_install_command += ['--conf', os.path.join(etc_dir, project_name)]
        if process_manager == 'supervisor':
            gen_install_command += ['--supervisor', os.path.join(etc_dir, 'supervisor', 'conf.d', '%s.conf' % project_name)]
            extra_depends += ', supervisor'
        elif process_manager == 'systemd':
            gen_install_command += ['--systemd', os.path.join(etc_dir, 'systemd', 'system')]
            extra_depends += ', systemd'
        elif process_manager is not None:
            print('Invalid value for process manager: %s' % process_manager)
            raise ValueError
        execute_from_command_line(gen_install_command)
        # add the copy of these new files to the Makefile
        extra_lines = ['\trsync -av gen_install/ %(root)s/']

        # patch dependencies in control file
        with codecs.open(os.path.join(target_dir, 'debian/control'), 'r', encoding='utf-8') as control_fd:
            control = control_fd.read()
        old_depends2 = '${misc:Depends}, ${python:Depends}'
        old_depends3 = '${misc:Depends}, ${python3:Depends}'
        new_depends2 = self.get_option(project_name, 'depends', fallback=old_depends2)
        new_depends3 = self.get_option(project_name, 'depends3', fallback=old_depends3)
        control = control.replace(old_depends2, new_depends2 + extra_depends)
        control = control.replace(old_depends3, new_depends3 + extra_depends)
        with codecs.open(os.path.join(target_dir, 'debian/control'), 'w', encoding='utf-8') as control_fd:
            control_fd.write(control)

        # rewrite rules file to append djangofloor extra info
        rules_filename = os.path.join(target_dir, 'debian', 'rules')
        new_rules_content = ''
        python2_re = re.compile(r'^\s*python setup.py install --force --root=debian/([^/\s]+) .*$')
        python3_re = re.compile(r'^\s*python3 setup.py install --force --root=debian/([^/\s]+) .*$')
        debian_names = {}
        # debian_names[2] = 'python-my_project', debian_names[3] = 'python3-my_project'
        with codecs.open(rules_filename, 'r', encoding='utf-8') as rules_fd:
            for line in rules_fd:
                new_rules_content += line
                for python_version, python_re in ((2, python2_re), (3, python3_re)):
                    matcher = python_re.match(line)
                    if matcher:
                        debian_name = matcher.group(1)
                        debian_names[python_version] = debian_name
                        values = {'root': 'debian/%s' % debian_name, 'project_name': project_name, }
                        for extra_line in extra_lines:
                            new_rules_content += (extra_line % values) + '\n'
        with codecs.open(rules_filename, 'w', encoding='utf-8') as rules_fd:
            rules_fd.write(new_rules_content)

        values = {'project_name': project_name, 'process_manager': process_manager,
                  'frontend': frontend, }
        # get options for installation/remove scripts
        extra_postinst = {2: self.get_option(project_name, 'extra_postinst', fallback=None),
                          3: self.get_option(project_name, 'extra_postinst3', fallback=None), }
        scripts = {action: {2: self.get_option(project_name, action, fallback=None),
                            3: self.get_option(project_name, '%s3' % action, fallback=None), }
                   for action in ('postinst', 'preinst', 'postrm', 'prerm')}
        # write the default postinst script and custom scripts
        for python_version in (2, 3):
            if python_version not in debian_names:
                continue
            values['extra_postinst'] = ''
            if extra_postinst[python_version]:
                with codecs.open(extra_postinst[python_version], 'r', encoding='utf-8') as fd:
                    values['extra_postinst'] = fd.read()
            values.update({'python_version': python_version, 'debian_name': debian_names[python_version]})
            content = render_to_string('djangofloor/commands/deb_postinst.sh', values)
            python_postinst = os.path.join(target_dir, 'debian', debian_names[python_version] + '.postinst')
            with codecs.open(python_postinst, 'w', encoding='utf-8') as postinst_fd:
                postinst_fd.write(content)
            for action, scripts_per_version in scripts.items():
                if not scripts_per_version[python_version]:
                    continue
                with codecs.open(scripts_per_version[python_version], 'r', encoding='utf-8') as fd:
                    content = fd.read()
                path = os.path.join(target_dir, 'debian', '%s.%s' % (debian_names[python_version], action))
                with codecs.open(path, 'w', encoding='utf-8') as fd:
                    fd.write(content)

        # build the package!
        syscmd = ['dpkg-buildpackage', '-rfakeroot', '-uc', '-b']
        util.process_command(syscmd, cwd=target_dir)
Ejemplo n.º 8
0
    def run(self):
        """Order of operations:

            * create the source package with `sdist_dsc`
            * update the Python dependencies
            * run specific EasyDjango command for extra Debian files (systemd, static files, …)
            * add postinstall files
            * build  a .deb package from the modified `sdist_dsc`
        """
        if sdist_dsc is None or util is None:
            self.stderr.write('Unable to load bdist_deb')
            return 1
        # generate .dsc source pkg
        sdist_dsc.run(self)
        project_name = self.distribution.metadata.name
        # get relevant options passed to sdist_dsc
        # sdist_dsc = self.get_finalized_command('sdist_dsc')
        dsc_tree = self.dist_dir
        # execute system command and read output (execute and read output of find cmd)
        target_dirs = []
        for entry in os.listdir(dsc_tree):
            fulldir = os.path.join(dsc_tree, entry)
            if os.path.isdir(fulldir):
                if entry == 'tmp_py2dsc':
                    continue
                target_dirs.append(fulldir)
        if len(target_dirs) > 1:
            raise ValueError('More than one directory in deb_dist. '
                             'Unsure which is source directory. All: %r' % (target_dirs,))
        elif len(target_dirs) == 0:
            raise ValueError('could not find debian source directory')
        target_dir = target_dirs[0]

        # noinspection PyAttributeOutsideInit
        self.config_parser = ConfigParser.ConfigParser()
        self.config_parser.read(self.get_config_files())

        extra_processes = []
        for process_line in self.get_option(project_name, 'processes', fallback='').splitlines():
            process_line = process_line.strip()
            process_name, sep, process_cmd = process_line.partition(':')
            if process_line and sep != ':':
                print('Extra processes must be of the form "process_name:command_line"')
                raise ValueError
            elif process_line:
                extra_processes.append(process_line)
        frontend = self.get_option(project_name, 'frontend', fallback=None)
        process_manager = self.get_option(project_name, 'process_manager', fallback=None)
        username = self.get_option(project_name, 'username', fallback=project_name)
        extra_depends = ''

        debian_project_name = project_name.replace('-', '_')
        conf_name = '%s.conf' % debian_project_name
        # prepare the use of the gen_install command
        os.environ['EASYDJANGO_CONF_NAME'] = project_name
        set_env()
        collect_static_dir = os.path.join(target_dir, 'gen_install', 'var', project_name, 'static')
        etc_dir = os.path.join(target_dir, 'gen_install', 'etc')
        gen_install_command = [sys.argv[0], 'gen_install', '--collectstatic', collect_static_dir]
        gen_install_command += ['--user', username]
        for extra_process in extra_processes:
            gen_install_command += ['--extra-process', extra_process]
        if frontend == 'nginx':
            gen_install_command += ['--nginx', os.path.join(etc_dir, 'nginx', 'sites-available', conf_name)]
            extra_depends += ', nginx'
        elif frontend == 'apache2.2':
            gen_install_command += ['--apache22', os.path.join(etc_dir, 'apache2', 'sites-available', conf_name)]
            extra_depends += ', apache2 (>= 2.2)'
        elif frontend == 'apache2.4':
            gen_install_command += ['--apache24', os.path.join(etc_dir, 'apache2', 'sites-available', conf_name)]
            extra_depends += ', apache2 (>= 2.4)'
        elif frontend is not None:
            print('Invalid value for frontend: %s' % frontend)
            raise ValueError
        gen_install_command += ['--conf', os.path.join(etc_dir, debian_project_name)]
        if process_manager == 'supervisor':
            gen_install_command += ['--supervisor', os.path.join(etc_dir, 'supervisor', 'conf.d', conf_name)]
            extra_depends += ', supervisor'
        elif process_manager == 'systemd':
            gen_install_command += ['--systemd', os.path.join(etc_dir, 'systemd', 'system')]
            extra_depends += ', systemd'
        elif process_manager is not None:
            print('Invalid value for process manager: %s' % process_manager)
            raise ValueError
        execute_from_command_line(gen_install_command)
        # add the copy of these new files to the Makefile
        extra_lines = ['\trsync -av gen_install/ %(root)s/']

        # patch dependencies in control file
        with codecs.open(os.path.join(target_dir, 'debian/control'), 'r', encoding='utf-8') as control_fd:
            control = control_fd.read()
        old_depends2 = '${misc:Depends}, ${python:Depends}'
        old_depends3 = '${misc:Depends}, ${python3:Depends}'
        new_depends2 = self.get_option(project_name, 'depends', fallback=old_depends2)
        new_depends3 = self.get_option(project_name, 'depends3', fallback=old_depends3)
        control = control.replace(old_depends2, new_depends2 + extra_depends)
        control = control.replace(old_depends3, new_depends3 + extra_depends)
        with codecs.open(os.path.join(target_dir, 'debian/control'), 'w', encoding='utf-8') as control_fd:
            control_fd.write(control)

        # rewrite rules file to append easydjango extra info
        rules_filename = os.path.join(target_dir, 'debian', 'rules')
        new_rules_content = ''
        python2_re = re.compile(r'^\s*python setup.py install --force --root=debian/([^/\s]+) .*$')
        python3_re = re.compile(r'^\s*python3 setup.py install --force --root=debian/([^/\s]+) .*$')
        debian_names = {}
        # debian_names[2] = 'python-my_project', debian_names[3] = 'python3-my_project'
        with codecs.open(rules_filename, 'r', encoding='utf-8') as rules_fd:
            for line in rules_fd:
                new_rules_content += line
                for python_version, python_re in ((2, python2_re), (3, python3_re)):
                    matcher = python_re.match(line)
                    if matcher:
                        debian_name = matcher.group(1)
                        debian_names[python_version] = debian_name
                        values = {'root': 'debian/%s' % debian_name, 'project_name': project_name, }
                        for extra_line in extra_lines:
                            new_rules_content += (extra_line % values) + '\n'
        with codecs.open(rules_filename, 'w', encoding='utf-8') as rules_fd:
            rules_fd.write(new_rules_content)

        values = {'project_name': project_name, 'process_manager': process_manager,
                  'frontend': frontend, 'debian_project_name': debian_project_name, }
        # get options for installation/remove scripts
        extra_postinst = {2: self.get_option(project_name, 'extra_postinst', fallback=None),
                          3: self.get_option(project_name, 'extra_postinst3', fallback=None), }
        scripts = {action: {2: self.get_option(project_name, action, fallback=None),
                            3: self.get_option(project_name, '%s3' % action, fallback=None), }
                   for action in ('postinst', 'preinst', 'postrm', 'prerm')}
        # write the default postinst script and custom scripts
        for python_version in (2, 3):
            if python_version not in debian_names:
                continue
            values['extra_postinst'] = ''
            if extra_postinst[python_version]:
                with codecs.open(extra_postinst[python_version], 'r', encoding='utf-8') as fd:
                    values['extra_postinst'] = fd.read()
            values.update({'python_version': python_version, 'debian_name': debian_names[python_version]})
            content = render_to_string('easydjango/commands/deb_postinst.sh', values)
            python_postinst = os.path.join(target_dir, 'debian', debian_names[python_version] + '.postinst')
            with codecs.open(python_postinst, 'w', encoding='utf-8') as postinst_fd:
                postinst_fd.write(content)
            for action, scripts_per_version in scripts.items():
                if not scripts_per_version[python_version]:
                    continue
                with codecs.open(scripts_per_version[python_version], 'r', encoding='utf-8') as fd:
                    content = fd.read()
                path = os.path.join(target_dir, 'debian', '%s.%s' % (debian_names[python_version], action))
                with codecs.open(path, 'w', encoding='utf-8') as fd:
                    fd.write(content)

        # build the package!
        syscmd = ['dpkg-buildpackage', '-rfakeroot', '-uc', '-b']
        util.process_command(syscmd, cwd=target_dir)