Project

General

Profile

Download (4.68 KB) Statistics
| Branch: | Tag: | Revision:
a0c50279 david.sorber
#!/usr/bin/python3
982d29ac david.sorber
import argparse
4dfbe68a David Sorber
import os
import subprocess
a0c50279 david.sorber
import sys

import apt

982d29ac david.sorber
# Virtual package mapping
31c4557a David Sorber
virtual_mapping = {'awk': 'gawk',
'perlapi-5.18.1': 'perl-base',
'perlapi-5.18.2': 'perl-base',
'upstart-job': 'upstart',
'python:any': 'python2.7',
'python3:any': 'python3.4',
4dfbe68a David Sorber
'whiptail-provider': 'whiptail',
'libselinux-dev': 'libselinux1-dev',
'systemd': 'systemd-shim'}
a0c50279 david.sorber
def main():
982d29ac david.sorber
parser = argparse.ArgumentParser(description='Process some integers.')
31c4557a David Sorber
parser.add_argument('-v', '--verbose', action='store_true',
help='write additional information to stderr')
4dfbe68a David Sorber
parser.add_argument('-d', '--download', action='store_true',
help='do not print package list, instead download '
'packages to the specified directory')
parser.add_argument('--directory', type=str,
help='download directory')
31c4557a David Sorber
parser.add_argument('input_package_files', action='store',
help='a comma separated list of files containing '
'package names, one per line')
982d29ac david.sorber
args = parser.parse_args()
4dfbe68a David Sorber
#~ print(args)
#~ return 0
982d29ac david.sorber
# Input packages
in_packages = []
# Parse input package files
for filename in args.input_package_files.split(','):
with open(filename) as in_file:
for line in in_file:
line = line.strip()
if line:
in_packages.append(line)
# Open APT cache
cache = apt.Cache(memonly=True)
cache.open()
a0c50279 david.sorber
31c4557a David Sorber
# Create a set to hold the names of all packages and their dependencies
a0c50279 david.sorber
packages = set()

while True:
try:
# Grab next package
31c4557a David Sorber
pkg_name = in_packages.pop()
if args.verbose:
sys.stderr.write('Package: {:s}\n'.format(pkg_name))
sys.stderr.flush()
982d29ac david.sorber
31c4557a David Sorber
# Check if the package is in the cache, if not check if it is in
# our list of known virtual packages
982d29ac david.sorber
if pkg_name not in cache:
if pkg_name in virtual_mapping:
pkg_name = virtual_mapping[pkg_name]
else:
31c4557a David Sorber
sys.stderr.write('ERROR: unkown package "{:s}"; if this is '
'a virtual package please add it to the '
'virtual package mapping\n'.format(pkg_name))
982d29ac david.sorber
continue
a0c50279 david.sorber
# Add this package (with version) to the list of packages
31c4557a David Sorber
packages.add(pkg_name)
982d29ac david.sorber
# Get package dependencies
for pdep in cache[pkg_name].versions[0].dependencies:
a0c50279 david.sorber
dep_name = pdep[0].name
31c4557a David Sorber
if args.verbose:
sys.stderr.write('\tDependency: {:s}\n'.format(dep_name))
sys.stderr.flush()
a0c50279 david.sorber
if dep_name not in packages:
982d29ac david.sorber
if dep_name in virtual_mapping:
dep_name = virtual_mapping[dep_name]
a0c50279 david.sorber
packages.add(dep_name)
in_packages.insert(0, dep_name)
except IndexError:
break

4dfbe68a David Sorber
if not args.download:
# Print out the gathered package names
for package in sorted(packages):
print(package)
else:
# Download packages
if args.directory is not None:
if not os.path.exists(args.directory):
# Ask the user if they'd like to create the directory
answer = input('The path "{:s}" does not exist, would you '
'like to create it? (Y/n) '.format(args.directory))
if answer.lower().strip() not in ['y', 'yes']:
print('Directory not created, exiting')
return 0
# Try to create the directory
try:
os.makedirs(args.directory)
except OSError as e:
if e.errno != errno.EEXIST:
raise e
print('ERROR: unable to create directory, exiting')
return -1
else:
args.directory = os.getcwd()
# Download all of the packages
package_list = ' '.join(sorted(packages))
cmd = 'cd {:s}; apt-get download {:s}'
cmd = cmd.format(args.directory, package_list)
subprocess.call(cmd, shell=True)
return 0
a0c50279 david.sorber
if __name__ == '__main__':
sys.exit(main())