import os
import logging
import shutil
import subprocess
import pkgutil
from invirtualenv.plugin_base import InvirtualenvPlugin
from invirtualenv.utility import find_executable
logger = logging.getLogger(__name__)
SPEC_TEMPLATE = """Summary: {{global['description']|default('No summary available')}}
Name: {{global['name']}}
Version: {{global['version']|default('0.0.0')}}
Release: {{rpm_package['release']|default('1')}}
License: {{rpm_package['license']|default('Closed Source')}}
Group: {{rpm_package['group']|default('Development')}}
{% if rpm_package['deps'] %}Requires: {% for package in rpm_package['deps'] %}{{package}}{{ ", " if not loop.last }}{% endfor %}{% endif %}
Packager: {{rpm_package['packager']|default('Oath')}}
URL: {{global['url']|default('https://github.com/yahoo/invirtualenv')}}
AutoReqProv: no
%description
{{rpm_package['description']|default('No description')}}
%install
mkdir -p %{buildroot}/usr/share/%{name}-%{version}/
mkdir -p %{buildroot}/usr/share/%{name}-%{version}/package_scripts/
cp -r {{rpm_package['cwd']}}/wheels %{buildroot}/usr/share/%{name}-%{version}
cp {{rpm_package['cwd']}}/deploy.conf %{buildroot}/usr/share/%{name}-%{version}/deploy.conf
cp {{rpm_package['cwd']}}/post_install.py %{buildroot}/usr/share/%{name}-%{version}/package_scripts/post_install.py
cp {{rpm_package['cwd']}}/pre_uninstall.py %{buildroot}/usr/share/%{name}-%{version}/package_scripts/pre_uninstall.py
chmod 755 %{buildroot}/usr/share/%{name}-%{version}/package_scripts/post_install.py
chmod 755 %{buildroot}/usr/share/%{name}-%{version}/package_scripts/pre_uninstall.py
%post
export PATH=$PATH:/opt/python/bin:/usr/local/bin
python3 -m venv /usr/share/%{name}-%{version}/invirtualenv_deployer
/usr/share/%{name}-%{version}/invirtualenv_deployer/bin/pip install -q --no-index --find-links=/usr/share/%{name}-%{version}/wheels invirtualenv configparser
cd /usr/share/%{name}-%{version}
#/usr/share/%{name}-%{version}/invirtualenv_deployer/bin/deploy_virtualenv
/usr/share/%{name}-%{version}/invirtualenv_deployer/bin/python /usr/share/%{name}-%{version}/package_scripts/post_install.py
%preun
/usr/share/%{name}-%{version}/invirtualenv_deployer/bin/python /usr/share/%{name}-%{version}/package_scripts/pre_uninstall.py
%postun
rm -rf /usr/share/%{name}-%{version}
%files
%defattr(0755, root, root)
/usr/share/%{name}-%{version}/*
{% if rpm_package['files'] %}
{% endif %}
"""
RPM_CONFIG_DEFAULT = """[rpm_package]
deps:
"""
[docs]class InvirtualenvRPM(InvirtualenvPlugin):
package_formats = ['rpm']
package_template = SPEC_TEMPLATE
config_default = RPM_CONFIG_DEFAULT
config_types = {
'rpm_package': {
'deps': list
}
}
default_config_filename = 'invirtualenv.spec'
[docs] def system_requirements_ok(self):
if find_executable('rpmbuild'):
return True
logger.debug('The rpmbuild command is not present, disabling the rpm plugin')
return False
[docs] def run_package_command(self, package_hashes, wheel_dir='wheels'):
# Make sure the configuration is sane
# self.config['rpm_package']['deps'].append('invirtualenv')
self.config['rpm_package']['cwd'] = os.getcwd()
description = self.config['global'].get('description', '').strip()
if not description:
self.config['global']['description'] = 'No description available'
# Get the packaging script
for script in ['rpm_scripts/post_install.py', 'rpm_scripts/pre_uninstall.py']:
with open(os.path.basename(script), 'wb') as script_handle:
script_handle.write(pkgutil.get_data('invirtualenv_plugins', script))
logger.debug('Config')
logger.debug(self.config)
logger.debug('Spec')
logger.debug(self.render_template_with_config())
logger.debug('Deploy.conf')
logger.debug(open('deploy.conf').read())
with open('package.spec', 'w') as spec_handle:
spec_handle.write(self.render_template_with_config())
os.system('ls -lR')
command = [find_executable('rpmbuild'), '-ba', 'package.spec']
logger.debug('Running command %r', ' '.join(command))
output = subprocess.check_output(command)
output = output.decode(errors='ignore')
packages = []
for line in output.split('\n'):
line = line.strip()
if line.startswith('Wrote: '):
packages.append(line.split()[-1])
logger.debug('found packages %r', packages)
if packages:
return packages[-1]