1+ '''
2+ Purpose: Deactivates Deep Licenses that were detected by Deep License search
3+
4+ Usage:
5+ deactivate_deep_licenses.py --base-url https://your.blackduck.url] [--token-file token.txt]
6+
7+ required arguments:
8+ --base-url BASE_URL Hub server URL e.g. https://your.blackduck.url
9+ --token-file TOKEN_FILE containing access token
10+ --project PROJECT NAME
11+ --version VERSION NAME
12+
13+ optional arguments:
14+ --match-type list of match types for which DL should be deactivated
15+
16+ '''
17+
18+ from blackduck import Client
19+ import logging
20+ import argparse
21+ import sys
22+
23+ from pprint import pprint
24+
25+ logging .basicConfig (
26+ level = logging .DEBUG ,
27+ format = "[%(asctime)s] {%(module)s:%(lineno)d} %(levelname)s - %(message)s"
28+ )
29+
30+ def set_active (bd , licenses , status = False ):
31+ for license in licenses :
32+ license ['active' ] = status
33+ headers = {'Content-Type' : 'application/vnd.blackducksoftware.internal-1+json' }
34+ url = license ['_meta' ]['href' ]
35+ dld_url = url [:url .index ('deep-license-data' )+ len ('deep-license-data' )]
36+ response = bd .session .put (dld_url , headers = headers , json = licenses )
37+ return response
38+
39+ def parse_command_args ():
40+
41+ parser = argparse .ArgumentParser ("Generate and download reports for projets in a spreadsheet" )
42+ parser .add_argument ("-u" , "--base-url" , required = True , help = "Hub server URL e.g. https://your.blackduck.url" )
43+ parser .add_argument ("-t" , "--token-file" , required = True , help = "File containing access token" )
44+ parser .add_argument ("-p" , "--project-name" , required = True , help = "Project Name" )
45+ parser .add_argument ("-pv" , "--version-name" , required = True , help = "Project Version Name" )
46+ parser .add_argument ("-mt" , "--match-type" , required = False , help = "Match Type" )
47+ parser .add_argument ("-nv" , "--no-verify" , action = 'store_false' , help = "Disable TLS certificate verification" )
48+ parser .add_argument ("--active" , action = 'store_true' , help = 'Dtatus to set deep license to' )
49+ return parser .parse_args ()
50+
51+ def main ():
52+ args = parse_command_args ()
53+ with open (args .token_file , 'r' ) as tf :
54+ access_token = tf .readline ().strip ()
55+ global bd
56+ bd = Client (base_url = args .base_url , token = access_token , verify = args .no_verify , timeout = 60.0 , retries = 4 )
57+
58+ params = {
59+ 'q' : [f"name:{ args .project_name } " ]
60+ }
61+ projects = [p for p in bd .get_resource ('projects' , params = params ) if p ['name' ] == args .project_name ]
62+ assert len (projects ) == 1 , f"There should be one, and only one project named { args .project_name } . We found { len (projects )} "
63+ project = projects [0 ]
64+
65+ params = {
66+ 'q' : [f"versionName:{ args .version_name } " ]
67+ }
68+ versions = [v for v in bd .get_resource ('versions' , project , params = params ) if v ['versionName' ] == args .version_name ]
69+ assert len (versions ) == 1 , f"There should be one, and only one version named { args .version_name } . We found { len (versions )} "
70+ version = versions [0 ]
71+
72+ headers = {'Accept' : 'application/vnd.blackducksoftware.internal-1+json' }
73+ components = bd .get_resource ('components' ,version , headers = headers )
74+ for component in components :
75+ pprint (component ['matchTypes' ])
76+ if not args .match_type :
77+ pass
78+ elif args .match_type not in component ['matchTypes' ]:
79+ continue
80+ try :
81+ deep_licenses = bd .get_resource ('deep-license-data-list' ,component , headers = headers )
82+ set = []
83+ for deep_license in deep_licenses :
84+ set .append (deep_license )
85+ pprint (set_active (bd , set , status = args .active ))
86+ except KeyError as err :
87+ pprint (err )
88+
89+ logging .debug (f"Found { project ['name' ]} :{ version ['versionName' ]} " )
90+
91+
92+ if __name__ == "__main__" :
93+ sys .exit (main ())
0 commit comments