|
| 1 | +''' |
| 2 | +Created on January 23, 2023 |
| 3 | +@author: christopher-mackle |
| 4 | +Delete the oldest project version (last created or last updated) when you've hit your max version limit |
| 5 | +''' |
| 6 | + |
| 7 | +from datetime import datetime |
| 8 | +from blackduck.Client import Client |
| 9 | +import argparse |
| 10 | + |
| 11 | +parser = argparse.ArgumentParser("Get a specific component and list its vulnerabilities") |
| 12 | +parser.add_argument("--url", dest='url', required=True, help="Hub server URL e.g. https://your.blackduck.url") |
| 13 | +parser.add_argument("--token", dest='token', required=True, help="Hub server access token") |
| 14 | +parser.add_argument("--project", dest='project_name', required=True, help="Name of project") |
| 15 | +parser.add_argument("--mode", dest='mode', required=False, default='createdAt', help="Use createdAt or updatedAt") |
| 16 | +parser.add_argument("--count", dest='count_total', required=False, default=9, help="Max versions - 1") |
| 17 | +args = parser.parse_args() |
| 18 | + |
| 19 | +TOKEN = args.token |
| 20 | +BASE_URL = args.url |
| 21 | +PROJECT_NAME = args.project_name |
| 22 | + |
| 23 | +try: |
| 24 | + bd = Client( |
| 25 | + token=TOKEN, |
| 26 | + base_url=BASE_URL, |
| 27 | + verify=False # TLS certificate verification |
| 28 | + ) |
| 29 | +except: |
| 30 | + print("Could not authenticate to your Black Duck server with the given URL and token.") |
| 31 | + |
| 32 | +def deleteVersion(mode): |
| 33 | + count = 0 |
| 34 | + time_format = '%Y-%m-%dT%H:%M:%S.%fZ' |
| 35 | + for version in bd.get_resource('versions', project): |
| 36 | + count = count + 1 |
| 37 | + if count == 1: |
| 38 | + oldest_version = version |
| 39 | + else: |
| 40 | + oldestVersionDate = datetime.strptime(oldest_version[mode], time_format) |
| 41 | + currentVersionDate = datetime.strptime(version[mode], time_format) |
| 42 | + if currentVersionDate < oldestVersionDate: |
| 43 | + oldest_version = version |
| 44 | + if count > int(args.count_total): |
| 45 | + print('Too many project versions. Deleting oldest project version before scanning.') |
| 46 | + projectVersionToDelete = oldest_version['_meta']['href'] |
| 47 | + r = bd.session.delete(projectVersionToDelete) |
| 48 | + r.raise_for_status() |
| 49 | + print("Project version " + oldest_version['versionName'] + ' has been deleted.') |
| 50 | + |
| 51 | +if __name__ == '__main__': |
| 52 | + found = False |
| 53 | + for project in bd.get_resource('projects'): |
| 54 | + if project['name'] == PROJECT_NAME: |
| 55 | + found = True |
| 56 | + if args.mode == 'createdAt': |
| 57 | + deleteVersion(args.mode) |
| 58 | + elif args.mode == 'updatedAt': |
| 59 | + deleteVersion('settingUpdatedAt') |
| 60 | + else: |
| 61 | + print("Invalid mode: " + args.mode) |
| 62 | + print("Valid modes: createdAt, updatedAt") |
| 63 | + if not found: |
| 64 | + print("Project " + PROJECT_NAME + " not found.") |
0 commit comments