#!/usr/bin/env python import sys import os import re import commands import random MIRROR_SERVER = "ftp://mirror.math.ualberta.ca" def parse_pkg_info(filename): pkg_list = [] regex = re.compile(r'([a-z|A-Z|0-9|-]+)-((?:[0-9]+|.[0-9]+|[0-9]+.)*)\s+(.*)\n') pi_file = open(filename) for line in pi_file.readlines(): match = regex.search(line) if match: pkg_list.append(match.groups()) else: print "No Match", line pi_file.close() return pkg_list def try_install_pkg(pkg_name): command_string = "/bin/tcsh -c 'setenv PACKAGEROOT %s && \ /usr/sbin/pkg_add -r %s'" % (MIRROR_SERVER, pkg_name) output = commands.getoutput(command_string) return success(output, pkg_name) def get_installed_pkgs(): filename = "pkg_info.%s" % random.randint(100000,999999) command_string = "/bin/tcsh -c '/usr/sbin/pkg_info >/tmp/%s'" \ % (filename) commands.getoutput(command_string) installed_pkg_list = parse_pkg_info("/tmp/%s" % (filename)) os.unlink("/tmp/%s" % (filename)) return installed_pkg_list def check_installed_pkgs(pkg_name): for ipkg_name, ipkg_ver, ipkg_desc in get_installed_pkgs(): if ipkg_name == pkg_name: return True return False def success(output, pkg_name): regex = re.compile(r'(?:unable to fetch|File unavail|Permission denied|Unable to get)') match = regex.search(output) if match: print "Could not find pkg, port maybe?" return False regex = re.compile(r'Done.') match = regex.search(output) if match: if check_installed_pkgs(pkg_name): print "Installed successfully." return True else: print "pkg_add returned no error I can see, but pkg is not in pkg_info!" return False print "success(): No match for output" print output return False def make_todo_list(pkg_list, failed): installed_pkg_list = get_installed_pkgs() ipkg_names = failed[:] todo_list = [] for pkg_name, pkg_ver, pkg_desc in installed_pkg_list: ipkg_names.append(pkg_name) for pkg_name, pkg_ver, pkg_desc in pkg_list: try: ipkg_names.index(pkg_name) except(ValueError): todo_list.append([pkg_name, pkg_ver, pkg_desc]) return todo_list def main(): installed = [] failed = [] if(len(sys.argv) < 2): print "Usage: %s " % (sys.argv[0]) sys.exit() pkg_list = parse_pkg_info(sys.argv[1]) pkg_list_todo = make_todo_list(pkg_list, failed) while len(pkg_list_todo) > 0: pkg_name, pkg_ver, pkg_desc = pkg_list_todo.pop(0) print "Attempting to install", pkg_name result = try_install_pkg(pkg_name) if result == True: installed.append(pkg_name) else: failed.append(pkg_name) pkg_list_todo = make_todo_list(pkg_list, failed) print "" print "****************************************************" print "Packages Successfully Installed:" print "****************************************************" for pkg_name in installed: print pkg_name print "" print "****************************************************" print "Packages That Failed to Install:" print "****************************************************" for pkg_name in failed: print pkg_name main()