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