1*9c5db199SXin Li#!/usr/bin/python3 -u 2*9c5db199SXin Li 3*9c5db199SXin Li""" 4*9c5db199SXin LiUtility to upload or remove the packages from the packages repository. 5*9c5db199SXin Li""" 6*9c5db199SXin Li 7*9c5db199SXin Lifrom __future__ import absolute_import 8*9c5db199SXin Lifrom __future__ import division 9*9c5db199SXin Lifrom __future__ import print_function 10*9c5db199SXin Liimport logging, optparse, os, shutil, sys, tempfile 11*9c5db199SXin Liimport common 12*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils as client_utils 13*9c5db199SXin Lifrom autotest_lib.client.common_lib import global_config, error 14*9c5db199SXin Lifrom autotest_lib.client.common_lib import packages 15*9c5db199SXin Lifrom autotest_lib.server import utils as server_utils 16*9c5db199SXin Li 17*9c5db199SXin Lic = global_config.global_config 18*9c5db199SXin Lilogging.basicConfig(level=logging.DEBUG) 19*9c5db199SXin Li 20*9c5db199SXin LiACTION_REMOVE = 'remove' 21*9c5db199SXin LiACTION_UPLOAD = 'upload' 22*9c5db199SXin LiACTION_TAR_ONLY = 'tar_only' 23*9c5db199SXin Li 24*9c5db199SXin Lidef get_exclude_string(client_dir): 25*9c5db199SXin Li ''' 26*9c5db199SXin Li Get the exclude string for the tar command to exclude specific 27*9c5db199SXin Li subdirectories inside client_dir. 28*9c5db199SXin Li For profilers we need to exclude everything except the __init__.py 29*9c5db199SXin Li file so that the profilers can be imported. 30*9c5db199SXin Li ''' 31*9c5db199SXin Li exclude_string = ('--exclude="deps/*" --exclude="tests/*" --exclude=.git ' 32*9c5db199SXin Li '--exclude="site_tests/*" --exclude="**.pyc"') 33*9c5db199SXin Li 34*9c5db199SXin Li # Get the profilers directory 35*9c5db199SXin Li prof_dir = os.path.join(client_dir, 'profilers') 36*9c5db199SXin Li 37*9c5db199SXin Li # Include the __init__.py file for the profilers and exclude all its 38*9c5db199SXin Li # subdirectories 39*9c5db199SXin Li for f in os.listdir(prof_dir): 40*9c5db199SXin Li if os.path.isdir(os.path.join(prof_dir, f)): 41*9c5db199SXin Li exclude_string += ' --exclude="profilers/%s"' % f 42*9c5db199SXin Li 43*9c5db199SXin Li # The '.' here is needed to zip the files in the current 44*9c5db199SXin Li # directory. We use '-C' for tar to change to the required 45*9c5db199SXin Li # directory i.e. src_dir and then zip up the files in that 46*9c5db199SXin Li # directory(which is '.') excluding the ones in the exclude_dirs 47*9c5db199SXin Li exclude_string += " ." 48*9c5db199SXin Li 49*9c5db199SXin Li # TODO(milleral): This is sad and ugly. http://crbug.com/258161 50*9c5db199SXin Li # Surprisingly, |exclude_string| actually means argument list, and 51*9c5db199SXin Li # we'd like to package up the current global_config.ini also, so let's 52*9c5db199SXin Li # just tack it on here. 53*9c5db199SXin Li # Also note that this only works because tar prevents us from un-tarring 54*9c5db199SXin Li # files into parent directories. 55*9c5db199SXin Li exclude_string += " ../global_config.ini" 56*9c5db199SXin Li 57*9c5db199SXin Li return exclude_string 58*9c5db199SXin Li 59*9c5db199SXin Li 60*9c5db199SXin Lidef parse_args(): 61*9c5db199SXin Li parser = optparse.OptionParser() 62*9c5db199SXin Li parser.add_option("-d", "--dependency", help="package the dependency" 63*9c5db199SXin Li " from client/deps directory and upload to the repo", 64*9c5db199SXin Li dest="dep") 65*9c5db199SXin Li parser.add_option("-p", "--profiler", help="package the profiler " 66*9c5db199SXin Li "from client/profilers directory and upload to the repo", 67*9c5db199SXin Li dest="prof") 68*9c5db199SXin Li parser.add_option("-t", "--test", help="package the test from client/tests" 69*9c5db199SXin Li " or client/site_tests and upload to the repo.", 70*9c5db199SXin Li dest="test") 71*9c5db199SXin Li parser.add_option("-c", "--client", help="package the client " 72*9c5db199SXin Li "directory alone without the tests, deps and profilers", 73*9c5db199SXin Li dest="client", action="store_true", default=False) 74*9c5db199SXin Li parser.add_option("-f", "--file", help="simply uploads the specified" 75*9c5db199SXin Li "file on to the repo", dest="file") 76*9c5db199SXin Li parser.add_option("-r", "--repository", help="the URL of the packages" 77*9c5db199SXin Li "repository location to upload the packages to.", 78*9c5db199SXin Li dest="repo", default=None) 79*9c5db199SXin Li parser.add_option("-o", "--output_dir", help="the output directory" 80*9c5db199SXin Li "to place tarballs and md5sum files in.", 81*9c5db199SXin Li dest="output_dir", default=None) 82*9c5db199SXin Li parser.add_option("-a", "--action", help="the action to perform", 83*9c5db199SXin Li dest="action", choices=(ACTION_UPLOAD, ACTION_REMOVE, 84*9c5db199SXin Li ACTION_TAR_ONLY), default=None) 85*9c5db199SXin Li parser.add_option("--all", help="Upload all the files locally " 86*9c5db199SXin Li "to all the repos specified in global_config.ini. " 87*9c5db199SXin Li "(includes the client, tests, deps and profilers)", 88*9c5db199SXin Li dest="all", action="store_true", default=False) 89*9c5db199SXin Li 90*9c5db199SXin Li options, args = parser.parse_args() 91*9c5db199SXin Li return options, args 92*9c5db199SXin Li 93*9c5db199SXin Lidef get_build_dir(name, dest_dir, pkg_type): 94*9c5db199SXin Li """Method to generate the build directory where the tarball and checksum 95*9c5db199SXin Li is stored. The following package types are handled: test, dep, profiler. 96*9c5db199SXin Li Package type 'client' is not handled. 97*9c5db199SXin Li """ 98*9c5db199SXin Li if pkg_type == 'client': 99*9c5db199SXin Li # NOTE: The "tar_only" action for pkg_type "client" has no use 100*9c5db199SXin Li # case yet. No known invocations of packager.py with 101*9c5db199SXin Li # --action=tar_only send in clients in the command line. Please 102*9c5db199SXin Li # confirm the behaviour is expected before this type is enabled for 103*9c5db199SXin Li # "tar_only" actions. 104*9c5db199SXin Li print('Tar action not supported for pkg_type= %s, name = %s' % 105*9c5db199SXin Li pkg_type, name) 106*9c5db199SXin Li return None 107*9c5db199SXin Li # For all packages, the work-dir should have 'client' appended to it. 108*9c5db199SXin Li base_build_dir = os.path.join(dest_dir, 'client') 109*9c5db199SXin Li if pkg_type == 'test': 110*9c5db199SXin Li build_dir = os.path.join(get_test_dir(name, base_build_dir), name) 111*9c5db199SXin Li else: 112*9c5db199SXin Li # For profiler and dep, we append 's', and then append the name. 113*9c5db199SXin Li # TODO(pmalani): Make this less fiddly? 114*9c5db199SXin Li build_dir = os.path.join(base_build_dir, pkg_type + 's', name) 115*9c5db199SXin Li return build_dir 116*9c5db199SXin Li 117*9c5db199SXin Lidef process_packages(pkgmgr, pkg_type, pkg_names, src_dir, 118*9c5db199SXin Li action, dest_dir=None): 119*9c5db199SXin Li """Method to upload or remove package depending on the flag passed to it. 120*9c5db199SXin Li 121*9c5db199SXin Li If tar_only is set to True, this routine is solely used to generate a 122*9c5db199SXin Li tarball and compute the md5sum from that tarball. 123*9c5db199SXin Li If the tar_only flag is True, then the remove flag is ignored. 124*9c5db199SXin Li """ 125*9c5db199SXin Li exclude_string = ' .' 126*9c5db199SXin Li names = [p.strip() for p in pkg_names.split(',')] 127*9c5db199SXin Li for name in names: 128*9c5db199SXin Li print("process_packages: Processing %s ... " % name) 129*9c5db199SXin Li if pkg_type == 'client': 130*9c5db199SXin Li pkg_dir = src_dir 131*9c5db199SXin Li exclude_string = get_exclude_string(pkg_dir) 132*9c5db199SXin Li elif pkg_type == 'test': 133*9c5db199SXin Li # if the package is a test then look whether it is in client/tests 134*9c5db199SXin Li # or client/site_tests 135*9c5db199SXin Li pkg_dir = os.path.join(get_test_dir(name, src_dir), name) 136*9c5db199SXin Li else: 137*9c5db199SXin Li # for the profilers and deps 138*9c5db199SXin Li pkg_dir = os.path.join(src_dir, name) 139*9c5db199SXin Li 140*9c5db199SXin Li pkg_name = pkgmgr.get_tarball_name(name, pkg_type) 141*9c5db199SXin Li 142*9c5db199SXin Li exclude_string_tar = (( 143*9c5db199SXin Li ' --exclude="**%s" --exclude="**%s.checksum" ' % 144*9c5db199SXin Li (pkg_name, pkg_name)) + exclude_string) 145*9c5db199SXin Li if action == ACTION_TAR_ONLY: 146*9c5db199SXin Li # We don't want any pre-existing tarballs and checksums to 147*9c5db199SXin Li # be repackaged, so we should purge these. 148*9c5db199SXin Li build_dir = get_build_dir(name, dest_dir, pkg_type) 149*9c5db199SXin Li try: 150*9c5db199SXin Li packages.check_diskspace(build_dir) 151*9c5db199SXin Li except error.RepoDiskFullError as e: 152*9c5db199SXin Li msg = ("Work_dir directory for packages %s does not have " 153*9c5db199SXin Li "enough space available: %s" % (build_dir, e)) 154*9c5db199SXin Li raise error.RepoDiskFullError(msg) 155*9c5db199SXin Li tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir, 156*9c5db199SXin Li build_dir, exclude_string_tar) 157*9c5db199SXin Li 158*9c5db199SXin Li # Create the md5 hash too. 159*9c5db199SXin Li md5sum = pkgmgr.compute_checksum(tarball_path) 160*9c5db199SXin Li md5sum_filepath = os.path.join(build_dir, pkg_name + '.checksum') 161*9c5db199SXin Li with open(md5sum_filepath, "w") as f: 162*9c5db199SXin Li f.write(md5sum) 163*9c5db199SXin Li 164*9c5db199SXin Li elif action == ACTION_UPLOAD: 165*9c5db199SXin Li # Tar the source and upload 166*9c5db199SXin Li temp_dir = tempfile.mkdtemp() 167*9c5db199SXin Li try: 168*9c5db199SXin Li try: 169*9c5db199SXin Li packages.check_diskspace(temp_dir) 170*9c5db199SXin Li except error.RepoDiskFullError as e: 171*9c5db199SXin Li msg = ("Temporary directory for packages %s does not have " 172*9c5db199SXin Li "enough space available: %s" % (temp_dir, e)) 173*9c5db199SXin Li raise error.RepoDiskFullError(msg) 174*9c5db199SXin Li 175*9c5db199SXin Li # Check if tarball already exists. If it does, then don't 176*9c5db199SXin Li # create a tarball again. 177*9c5db199SXin Li tarball_path = os.path.join(pkg_dir, pkg_name); 178*9c5db199SXin Li if os.path.exists(tarball_path): 179*9c5db199SXin Li print("process_packages: Tarball %s already exists" % 180*9c5db199SXin Li tarball_path) 181*9c5db199SXin Li else: 182*9c5db199SXin Li tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir, 183*9c5db199SXin Li temp_dir, 184*9c5db199SXin Li exclude_string_tar) 185*9c5db199SXin Li # Compare the checksum with what packages.checksum has. If they 186*9c5db199SXin Li # match then we don't need to perform the upload. 187*9c5db199SXin Li if not pkgmgr.compare_checksum(tarball_path): 188*9c5db199SXin Li pkgmgr.upload_pkg(tarball_path, update_checksum=True) 189*9c5db199SXin Li else: 190*9c5db199SXin Li logging.warning('Checksum not changed for %s, not copied ' 191*9c5db199SXin Li 'in packages/ directory.', tarball_path) 192*9c5db199SXin Li finally: 193*9c5db199SXin Li # remove the temporary directory 194*9c5db199SXin Li shutil.rmtree(temp_dir) 195*9c5db199SXin Li elif action == ACTION_REMOVE: 196*9c5db199SXin Li pkgmgr.remove_pkg(pkg_name, remove_checksum=True) 197*9c5db199SXin Li print("Done.") 198*9c5db199SXin Li 199*9c5db199SXin Li 200*9c5db199SXin Lidef tar_packages(pkgmgr, pkg_type, pkg_names, src_dir, temp_dir): 201*9c5db199SXin Li """Tar all packages up and return a list of each tar created""" 202*9c5db199SXin Li tarballs = [] 203*9c5db199SXin Li exclude_string = ' .' 204*9c5db199SXin Li names = [p.strip() for p in pkg_names.split(',')] 205*9c5db199SXin Li for name in names: 206*9c5db199SXin Li print("tar_packages: Processing %s ... " % name) 207*9c5db199SXin Li if pkg_type == 'client': 208*9c5db199SXin Li pkg_dir = src_dir 209*9c5db199SXin Li exclude_string = get_exclude_string(pkg_dir) 210*9c5db199SXin Li elif pkg_type == 'test': 211*9c5db199SXin Li # if the package is a test then look whether it is in client/tests 212*9c5db199SXin Li # or client/site_tests 213*9c5db199SXin Li pkg_dir = os.path.join(get_test_dir(name, src_dir), name) 214*9c5db199SXin Li else: 215*9c5db199SXin Li # for the profilers and deps 216*9c5db199SXin Li pkg_dir = os.path.join(src_dir, name) 217*9c5db199SXin Li 218*9c5db199SXin Li pkg_name = pkgmgr.get_tarball_name(name, pkg_type) 219*9c5db199SXin Li 220*9c5db199SXin Li # We don't want any pre-existing tarballs and checksums to 221*9c5db199SXin Li # be repackaged, so we should purge these. 222*9c5db199SXin Li exclude_string_tar = (( 223*9c5db199SXin Li ' --exclude="**%s" --exclude="**%s.checksum" ' % 224*9c5db199SXin Li (pkg_name, pkg_name)) + exclude_string) 225*9c5db199SXin Li # Check if tarball already exists. If it does, don't duplicate 226*9c5db199SXin Li # the effort. 227*9c5db199SXin Li tarball_path = os.path.join(pkg_dir, pkg_name) 228*9c5db199SXin Li if os.path.exists(tarball_path): 229*9c5db199SXin Li print("tar_packages: Tarball %s already exists" % tarball_path) 230*9c5db199SXin Li else: 231*9c5db199SXin Li tarball_path = pkgmgr.tar_package(pkg_name, pkg_dir, 232*9c5db199SXin Li temp_dir, exclude_string_tar) 233*9c5db199SXin Li tarballs.append(tarball_path) 234*9c5db199SXin Li return tarballs 235*9c5db199SXin Li 236*9c5db199SXin Li 237*9c5db199SXin Lidef process_all_packages(pkgmgr, client_dir, action): 238*9c5db199SXin Li """Process a full upload of packages as a directory upload.""" 239*9c5db199SXin Li dep_dir = os.path.join(client_dir, "deps") 240*9c5db199SXin Li prof_dir = os.path.join(client_dir, "profilers") 241*9c5db199SXin Li # Directory where all are kept 242*9c5db199SXin Li temp_dir = tempfile.mkdtemp() 243*9c5db199SXin Li try: 244*9c5db199SXin Li packages.check_diskspace(temp_dir) 245*9c5db199SXin Li except error.RepoDiskFullError as e: 246*9c5db199SXin Li print("Temp destination for packages is full %s, aborting upload: %s" 247*9c5db199SXin Li % (temp_dir, e)) 248*9c5db199SXin Li os.rmdir(temp_dir) 249*9c5db199SXin Li sys.exit(1) 250*9c5db199SXin Li 251*9c5db199SXin Li # process tests 252*9c5db199SXin Li tests_list = get_subdir_list('tests', client_dir) 253*9c5db199SXin Li tests = ','.join(tests_list) 254*9c5db199SXin Li 255*9c5db199SXin Li # process site_tests 256*9c5db199SXin Li site_tests_list = get_subdir_list('site_tests', client_dir) 257*9c5db199SXin Li site_tests = ','.join(site_tests_list) 258*9c5db199SXin Li 259*9c5db199SXin Li # process deps 260*9c5db199SXin Li deps_list = get_subdir_list('deps', client_dir) 261*9c5db199SXin Li deps = ','.join(deps_list) 262*9c5db199SXin Li 263*9c5db199SXin Li # process profilers 264*9c5db199SXin Li profilers_list = get_subdir_list('profilers', client_dir) 265*9c5db199SXin Li profilers = ','.join(profilers_list) 266*9c5db199SXin Li 267*9c5db199SXin Li # Update md5sum 268*9c5db199SXin Li if action == ACTION_UPLOAD: 269*9c5db199SXin Li all_packages = [] 270*9c5db199SXin Li all_packages.extend(tar_packages(pkgmgr, 'profiler', profilers, 271*9c5db199SXin Li prof_dir, temp_dir)) 272*9c5db199SXin Li all_packages.extend(tar_packages(pkgmgr, 'dep', deps, dep_dir, 273*9c5db199SXin Li temp_dir)) 274*9c5db199SXin Li all_packages.extend(tar_packages(pkgmgr, 'test', site_tests, 275*9c5db199SXin Li client_dir, temp_dir)) 276*9c5db199SXin Li all_packages.extend(tar_packages(pkgmgr, 'test', tests, client_dir, 277*9c5db199SXin Li temp_dir)) 278*9c5db199SXin Li all_packages.extend(tar_packages(pkgmgr, 'client', 'autotest', 279*9c5db199SXin Li client_dir, temp_dir)) 280*9c5db199SXin Li for package in all_packages: 281*9c5db199SXin Li pkgmgr.upload_pkg(package, update_checksum=True) 282*9c5db199SXin Li client_utils.run('rm -rf ' + temp_dir) 283*9c5db199SXin Li elif action == ACTION_REMOVE: 284*9c5db199SXin Li process_packages(pkgmgr, 'test', tests, client_dir, action=action) 285*9c5db199SXin Li process_packages(pkgmgr, 'test', site_tests, client_dir, action=action) 286*9c5db199SXin Li process_packages(pkgmgr, 'client', 'autotest', client_dir, 287*9c5db199SXin Li action=action) 288*9c5db199SXin Li process_packages(pkgmgr, 'dep', deps, dep_dir, action=action) 289*9c5db199SXin Li process_packages(pkgmgr, 'profiler', profilers, prof_dir, 290*9c5db199SXin Li action=action) 291*9c5db199SXin Li 292*9c5db199SXin Li 293*9c5db199SXin Li# Get the list of sub directories present in a directory 294*9c5db199SXin Lidef get_subdir_list(name, client_dir): 295*9c5db199SXin Li dir_name = os.path.join(client_dir, name) 296*9c5db199SXin Li return [f for f in 297*9c5db199SXin Li os.listdir(dir_name) 298*9c5db199SXin Li if os.path.isdir(os.path.join(dir_name, f)) ] 299*9c5db199SXin Li 300*9c5db199SXin Li 301*9c5db199SXin Li# Look whether the test is present in client/tests and client/site_tests dirs 302*9c5db199SXin Lidef get_test_dir(name, client_dir): 303*9c5db199SXin Li names_test = os.listdir(os.path.join(client_dir, 'tests')) 304*9c5db199SXin Li names_site_test = os.listdir(os.path.join(client_dir, 'site_tests')) 305*9c5db199SXin Li if name in names_test: 306*9c5db199SXin Li src_dir = os.path.join(client_dir, 'tests') 307*9c5db199SXin Li elif name in names_site_test: 308*9c5db199SXin Li src_dir = os.path.join(client_dir, 'site_tests') 309*9c5db199SXin Li else: 310*9c5db199SXin Li print("Test %s not found" % name) 311*9c5db199SXin Li sys.exit(0) 312*9c5db199SXin Li return src_dir 313*9c5db199SXin Li 314*9c5db199SXin Li 315*9c5db199SXin Lidef main(): 316*9c5db199SXin Li # get options and args 317*9c5db199SXin Li options, args = parse_args() 318*9c5db199SXin Li 319*9c5db199SXin Li server_dir = server_utils.get_server_dir() 320*9c5db199SXin Li autotest_dir = os.path.abspath(os.path.join(server_dir, '..')) 321*9c5db199SXin Li 322*9c5db199SXin Li # extract the pkg locations from global config 323*9c5db199SXin Li repo_urls = c.get_config_value('PACKAGES', 'fetch_location', 324*9c5db199SXin Li type=list, default=[]) 325*9c5db199SXin Li upload_paths = c.get_config_value('PACKAGES', 'upload_location', 326*9c5db199SXin Li type=list, default=[]) 327*9c5db199SXin Li 328*9c5db199SXin Li if options.repo: 329*9c5db199SXin Li upload_paths.append(options.repo) 330*9c5db199SXin Li 331*9c5db199SXin Li # Having no upload paths basically means you're not using packaging. 332*9c5db199SXin Li if not upload_paths: 333*9c5db199SXin Li print("No upload locations found. Please set upload_location under" 334*9c5db199SXin Li " PACKAGES in the global_config.ini or provide a location using" 335*9c5db199SXin Li " the --repository option.") 336*9c5db199SXin Li return 337*9c5db199SXin Li 338*9c5db199SXin Li client_dir = os.path.join(autotest_dir, "client") 339*9c5db199SXin Li 340*9c5db199SXin Li # Bail out if the client directory does not exist 341*9c5db199SXin Li if not os.path.exists(client_dir): 342*9c5db199SXin Li sys.exit(0) 343*9c5db199SXin Li 344*9c5db199SXin Li dep_dir = os.path.join(client_dir, "deps") 345*9c5db199SXin Li prof_dir = os.path.join(client_dir, "profilers") 346*9c5db199SXin Li 347*9c5db199SXin Li # Due to the delayed uprev-ing of certain ebuilds, we need to support 348*9c5db199SXin Li # both the legacy command line and the new one. 349*9c5db199SXin Li # So, if the new "action" option isn't specified, try looking for the 350*9c5db199SXin Li # old style remove/upload argument 351*9c5db199SXin Li if options.action is None: 352*9c5db199SXin Li if len(args) == 0 or args[0] not in ['upload', 'remove']: 353*9c5db199SXin Li print("Either 'upload' or 'remove' needs to be specified " 354*9c5db199SXin Li "for the package") 355*9c5db199SXin Li sys.exit(0) 356*9c5db199SXin Li cur_action = args[0] 357*9c5db199SXin Li else: 358*9c5db199SXin Li cur_action = options.action 359*9c5db199SXin Li 360*9c5db199SXin Li if cur_action == ACTION_TAR_ONLY and options.output_dir is None: 361*9c5db199SXin Li print("An output dir has to be specified") 362*9c5db199SXin Li sys.exit(0) 363*9c5db199SXin Li 364*9c5db199SXin Li pkgmgr = packages.PackageManager(autotest_dir, repo_urls=repo_urls, 365*9c5db199SXin Li upload_paths=upload_paths, 366*9c5db199SXin Li run_function_dargs={'timeout':600}) 367*9c5db199SXin Li 368*9c5db199SXin Li if options.all: 369*9c5db199SXin Li process_all_packages(pkgmgr, client_dir, action=cur_action) 370*9c5db199SXin Li 371*9c5db199SXin Li if options.client: 372*9c5db199SXin Li process_packages(pkgmgr, 'client', 'autotest', client_dir, 373*9c5db199SXin Li action=cur_action) 374*9c5db199SXin Li 375*9c5db199SXin Li if options.dep: 376*9c5db199SXin Li process_packages(pkgmgr, 'dep', options.dep, dep_dir, 377*9c5db199SXin Li action=cur_action, dest_dir=options.output_dir) 378*9c5db199SXin Li 379*9c5db199SXin Li if options.test: 380*9c5db199SXin Li process_packages(pkgmgr, 'test', options.test, client_dir, 381*9c5db199SXin Li action=cur_action, dest_dir=options.output_dir) 382*9c5db199SXin Li 383*9c5db199SXin Li if options.prof: 384*9c5db199SXin Li process_packages(pkgmgr, 'profiler', options.prof, prof_dir, 385*9c5db199SXin Li action=cur_action, dest_dir=options.output_dir) 386*9c5db199SXin Li 387*9c5db199SXin Li if options.file: 388*9c5db199SXin Li if cur_action == ACTION_REMOVE: 389*9c5db199SXin Li pkgmgr.remove_pkg(options.file, remove_checksum=True) 390*9c5db199SXin Li elif cur_action == ACTION_UPLOAD: 391*9c5db199SXin Li pkgmgr.upload_pkg(options.file, update_checksum=True) 392*9c5db199SXin Li 393*9c5db199SXin Li 394*9c5db199SXin Liif __name__ == "__main__": 395*9c5db199SXin Li main() 396