예제 #1
0
    def upload(metadata):
        """
        Uploads a given set of packages
        """
        product, release, version_string, revision_date, package_name = metadata

        settings = SourceCollector.json_loads('{0}/{1}'.format(os.path.dirname(os.path.realpath(__file__)), 'settings.json'))
        working_directory = settings['base_path'].format(product)
        package_path = SourceCollector.package_path.format(working_directory)
        redhat_folder = '{0}/redhat'.format(package_path)

        package_info = settings['repositories']['packages']['redhat']
        for destination in package_info:
            server = destination['ip']
            user = destination['user']
            base_path = destination['base_path']

            packages = [p for p in os.listdir(redhat_folder) if p.endswith('.rpm')]
            for package in packages:
                package_source_path = os.path.join(redhat_folder, package)

                command = 'scp {0} {1}@{2}:{3}/pool/{4}'.format(package_source_path, user, server, base_path, release)
                print('Uploading package {0}'.format(package))
                SourceCollector.run(command,
                                    working_directory=redhat_folder)
            if len(packages) > 0:
                # Cleanup existing files
                command = 'ssh {0}@{1} {2}/cleanup_repo.py {2}/pool/{3}/'.format(user, server, base_path, release)
                print(SourceCollector.run(command,
                                          working_directory=redhat_folder))
                command = 'ssh {0}@{1} createrepo --update {2}/dists/{3}'.format(user, server, base_path, release)
                SourceCollector.run(command,
                                    working_directory=redhat_folder)
예제 #2
0
    def package(metadata):
        """
        Packages a given package.
        """

        product, release, version_string, revision_date, package_name = metadata

        settings = SourceCollector.json_loads('{0}/{1}'.format(os.path.dirname(os.path.realpath(__file__)), 'settings.json'))
        working_directory = settings['base_path'].format(product)
        repo_path_code = SourceCollector.repo_path_code.format(working_directory)
        package_path = SourceCollector.package_path.format(working_directory)

        # Prepare
        # /<pp>/debian
        debian_folder = '{0}/debian'.format(package_path)
        if os.path.exists(debian_folder):
            shutil.rmtree(debian_folder)
        # /<rp>/packaging/debian -> /<pp>/debian
        shutil.copytree('{0}/packaging/debian'.format(repo_path_code), debian_folder)

        # Rename tgz
        # /<pp>/<packagename>_1.2.3.tar.gz -> /<pp>/debian/<packagename>_1.2.3.orig.tar.gz
        shutil.copyfile('{0}/{1}_{2}.tar.gz'.format(package_path, package_name, version_string),
                        '{0}/{1}_{2}.orig.tar.gz'.format(debian_folder, package_name, version_string))
        # /<pp>/debian/<packagename>-1.2.3/...
        SourceCollector.run(command='tar -xzf {0}_{1}.orig.tar.gz'.format(package_name, version_string),
                            working_directory=debian_folder)

        # Move the debian package metadata into the extracted source
        # /<pp>/debian/debian -> /<pp>/debian/<packagename>-1.2.3/
        SourceCollector.run(command='mv {0}/debian {0}/{1}-{2}/'.format(debian_folder, package_name, version_string),
                            working_directory=package_path)

        # Build changelog entry
        with open('{0}/{1}-{2}/debian/changelog'.format(debian_folder, package_name, version_string), 'w') as changelog_file:
            changelog_file.write("""{0} ({1}-1) {2}; urgency=low

  * For changes, see individual changelogs

 -- Packaging System <*****@*****.**>  {3}
""".format(package_name, version_string, release, revision_date.strftime('%a, %d %b %Y %H:%M:%S +0000')))

        # Some more tweaks
        SourceCollector.run(command='chmod 770 {0}/{1}-{2}/debian/rules'.format(debian_folder, package_name, version_string),
                            working_directory=package_path)
        SourceCollector.run(command="sed -i -e 's/__NEW_VERSION__/{0}/' *.*".format(version_string),
                            working_directory='{0}/{1}-{2}/debian'.format(debian_folder, package_name, version_string))

        # Build the package
        SourceCollector.run(command='dpkg-buildpackage',
                            working_directory='{0}/{1}-{2}'.format(debian_folder, package_name, version_string))
예제 #3
0
    def upload(metadata):
        """
        Uploads a given set of packages
        """

        product, release, version_string, revision_date, package_name = metadata

        settings = SourceCollector.json_loads('{0}/{1}'.format(os.path.dirname(os.path.realpath(__file__)), 'settings.json'))
        working_directory = settings['base_path'].format(product)
        package_path = SourceCollector.package_path.format(working_directory)

        package_info = settings['repositories']['packages']['debian']
        for destination in package_info:
            server = destination['ip']
            user = destination['user']
            base_path = destination['base_path']
            upload_path = os.path.join(base_path, release)

            print("Uploading {0} {1}".format(package_name, version_string))
            debs_path = os.path.join(package_path, 'debian')
            deb_packages = [filename for filename in os.listdir(debs_path) if filename.endswith('.deb')]

            create_releasename_command = "ssh {0}@{1} mkdir -p {2}".format(user, server, upload_path)
            SourceCollector.run(command=create_releasename_command,
                                working_directory=debs_path)

            for deb_package in deb_packages:
                source_path = os.path.join(debs_path, deb_package)
                destination_path = os.path.join(upload_path, deb_package)

                check_package_command = "ssh {0}@{1} ls {2}".format(user, server, upload_path)
                existing_packages = SourceCollector.run(command=check_package_command,
                                                        working_directory=debs_path).split()
                upload = deb_package not in existing_packages
                if upload is False:
                    print("Package already uploaded, done...")
                else:
                    scp_command = "scp {0} {1}@{2}:{3}".format(source_path, user, server, destination_path)
                    SourceCollector.run(command=scp_command,
                                        working_directory=debs_path)
                    remote_command = "ssh {0}@{1} reprepro -Vb {2}/debian includedeb {3} {4}".format(user, server, base_path, release, destination_path)
                    SourceCollector.run(command=remote_command,
                                        working_directory=debs_path)
예제 #4
0
    def package(metadata):
        """
        Packages a given package.
        """
        product, release, version_string, revision_date, package_name = metadata

        settings = SourceCollector.json_loads('{0}/{1}'.format(os.path.dirname(os.path.realpath(__file__)), 'settings.json'))
        working_directory = settings['base_path'].format(product)
        repo_path_code = SourceCollector.repo_path_code.format(working_directory)
        package_path = SourceCollector.package_path.format(working_directory)

        # Prepare
        redhat_folder = '{0}/redhat'.format(package_path)
        if os.path.exists(redhat_folder):
            shutil.rmtree(redhat_folder)
        os.mkdir(redhat_folder)

        # extract tar.gz to redhat_folder
        shutil.copyfile('{0}/{1}_{2}.tar.gz'.format(package_path, package_name, version_string),
                        '{0}/{1}_{2}.orig.tar.gz'.format(redhat_folder, package_name, version_string))
        # /<pp>/debian/<packagename>-1.2.3/...
        SourceCollector.run(command='tar -xzf {0}_{1}.orig.tar.gz'.format(package_name, version_string),
                            working_directory=redhat_folder)
        code_source_path = '{0}/{1}-{2}'.format(redhat_folder, package_name, version_string)

        # copy packaging
        source_packaging_path = os.path.join(repo_path_code, 'packaging')
        dest_packaging_path = os.path.join(code_source_path, 'packaging')
        if os.path.exists(source_packaging_path):
            shutil.copytree(source_packaging_path, dest_packaging_path)

        # load config
        config_dir = '{0}/packaging/redhat/cfgs'.format(repo_path_code)
        packages = os.listdir(config_dir)
        for package in packages:
            package_filename = '{0}/{1}'.format(config_dir, package)
            package_cfg = RawConfigParser()
            package_cfg.read(package_filename)

            package_name = package_cfg.get('main', 'name')
            dirs = package_cfg.get('main', 'dirs')
            files = package_cfg.get('main', 'files')
            depends_packages = package_cfg.get('main', 'depends').replace('$Version', version_string.replace('-', '_'))

            depends = ""
            if depends_packages != '':
                depends = []
                for depends_package in depends_packages.split(','):
                    depends.append('-d "{0}"'.format(depends_package.strip()))
                depends = ' '.join(depends)

            package_root_path = os.path.join(package_path, package_name)
            if os.path.exists(package_root_path):
                shutil.rmtree(package_root_path)
            os.mkdir(package_root_path)

            for dir_ in dirs.split(','):
                dir_ = dir_.strip()
                if dir_ != "''":
                    source_dir, dest_location = dir_.split('=')
                    # source_dir = dir to copy - from repo root
                    # dest_location = dir under which to copy the source_dir
                    source_full_path = os.path.join(code_source_path, source_dir.strip())
                    dest_full_path = os.path.join(package_root_path, dest_location.strip())
                    shutil.copytree(source_full_path, dest_full_path)
            for file_ in files.split(','):
                file_ = file_.strip()
                if file_ != "''" and file_ != '':
                    source_file, dest_location = file_.split('=')
                    source_full_path = os.path.join(code_source_path, source_file.strip())
                    dest_full_path = os.path.join(package_root_path, dest_location.strip())

                    if not os.path.exists(dest_full_path):
                        os.makedirs(dest_full_path)
                    shutil.copy(source_full_path, dest_full_path)
            before_install, after_install = ' ', ' '
            script_root = '{0}/packaging/redhat/scripts'.format(code_source_path)
            before_install_script = '{0}.before-install.sh'.format(package_name)
            before_install_script_path = os.path.join(script_root, before_install_script)
            if os.path.exists(before_install_script_path):
                before_install = ' --before-install {0} '.format(before_install_script_path)
            after_install_script = '{0}.after-install.sh'.format(package_name)
            after_install_script_path = os.path.join(script_root, after_install_script)
            if os.path.exists(after_install_script_path):
                after_install = ' --after-install {0} '.format(after_install_script_path)
                SourceCollector.run(command="sed -i -e 's/$Version/{0}/g' {1}".format(version_string,
                                                                                      after_install_script_path),
                                    working_directory='{0}'.format(script_root))

            params = {'version': version_string,
                      'package_name': package_cfg.get('main', 'name'),
                      'summary': package_cfg.get('main', 'summary'),
                      'license': package_cfg.get('main', 'license'),
                      'URL': package_cfg.get('main', 'URL'),
                      'source': package_cfg.get('main', 'source'),
                      'arch': package_cfg.get('main', 'arch'),
                      'description': package_cfg.get('main', 'description'),
                      'maintainer': package_cfg.get('main', 'maintainer'),
                      'depends': depends,
                      'package_root': package_root_path,
                      'before_install': before_install,
                      'after_install': after_install,
            }

            command = """fpm -s dir -t rpm -n {package_name} -v {version} --description "{description}" --maintainer "{maintainer}" --license "{license}" --url {URL} -a {arch} --vendor "Open vStorage" {depends}{before_install}{after_install} --prefix=/ -C {package_root}""".format(**params)

            SourceCollector.run(command,
                                working_directory=redhat_folder)
            print(os.listdir(redhat_folder))
if __name__ == '__main__':
    parser = OptionParser(description='Open vStorage repo maintenance')
    parser.add_option('-f', '--from-release', dest='from_release')
    parser.add_option('-t', '--to-release', dest='to_release')
    parser.add_option('-s', '--skip', dest='skip')
    parser.add_option('-d',
                      '--dry-run',
                      dest='dry_run',
                      action='store_true',
                      default=False)

    options, args = parser.parse_args()

    dry_run = options.dry_run
    skips = tuple(options.skip.split(',')) if options.skip is not None else ()
    settings = SourceCollector.json_loads('{0}/{1}'.format(
        os.path.dirname(os.path.realpath(__file__)), 'settings.json'))

    package_info = settings['repositories']['packages'].get('debian', [])
    for destination in package_info:
        server = destination['ip']
        user = destination['user']
        base_path = destination['base_path']

        print 'Processing {0}@{1}'.format(user, server)

        print '  Reading releases'

        source_package_map = {}
        destination_package_map = {}
        for release, package_map in {
                options.from_release: source_package_map,