#!/usr/bin/env python # Copyright 2014 Red Hat Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. import argparse import json import os import sys def eprint(msg): sys.stderr.write(msg) sys.stderr.write("\n") def os_family(distro): family = None if distro in ['fedora', 'rhel', 'rhel7', 'centos7']: family = 'redhat' elif distro in ['debian', 'ubuntu']: family = 'debian' elif distro == 'opensuse': family = 'suse' return family def main(): parser = argparse.ArgumentParser( description="Translate package name to distro specific name." " Exits with 1 if error is encountered, 2 if no pkg-map" " file is found. Otherwise exits with 0.") parser.add_argument('--element', default='', help='The element (namespace) to use for translation.') parser.add_argument('--distro', default=os.environ.get('DISTRO_NAME'), help='The distro name to use for translation.' ' Defaults to DISTRO_NAME') parser.add_argument('--missing-ok', action="store_true", help='Do not consider missing mappings an error.' ' Causes packages where no mapping is set to be' ' printed.') args, extra = parser.parse_known_args() if not args.element: eprint('Please specify an --element argument.') sys.exit(1) if not args.distro: eprint('Please specify a --distro argument or set DISTRO_NAME.') sys.exit(1) map_file = '/usr/share/pkg-map/%s' % args.element if not os.path.exists(map_file): eprint('Map file for %s element does not exist.' % args.element) if args.missing_ok: for name in extra: print(name) sys.exit(0) sys.exit(2) with open(map_file) as fd: package_names = json.loads(fd.read()) # Parse mapping data in this form using distro/family/default # Most specific takes priority (distro is most specific). # An empty package list can be provided. # Example for Nova and Glance (using fictitious name for Fedora and SUSE # and package mapping for SUSE family) # { # "distro": { # "fedora": { # "nova_package": "openstack-compute", # "glance_package": "openstack-image" # } # }, # "family": { # "redhat": { # "nova_package": "openstack-nova", # "glance_package": "openstack-glance" # }, # "suse": { # "nova_package": "" # } # }, # "default": { # "nova_package": "nova", # "glance_package": "glance" # } # } name_map = package_names.get('default', {}) if 'family' in package_names: family_map = package_names['family'].get(os_family(args.distro)) if family_map: name_map.update(family_map) if 'distro' in package_names: distro_map = package_names['distro'].get(args.distro) if distro_map: name_map.update(distro_map) for name in extra: pkg_name = name_map.get(name) if pkg_name: print(pkg_name) elif name in name_map: continue else: err_msg = 'Missing package name for distro/element: %s/%s' eprint(err_msg % (args.distro, args.element)) if args.missing_ok: print(name) else: sys.exit(1) sys.exit(0) if __name__ == '__main__': main()