root/software/apt-tools/apt-get-pkgs.py @ 2d763e11
| 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())
|