Skip to content

Commit 67439c3

Browse files
author
Glenn Snyder
committed
2 parents cde6ad0 + 05dc97c commit 67439c3

File tree

2 files changed

+168
-9
lines changed

2 files changed

+168
-9
lines changed

blackduck/HubRestApi.py

100644100755
Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ def _get_role_url(self):
243243
def get_roles(self, parameters={}):
244244
url = self._get_role_url() + self._get_parameter_string(parameters)
245245
response = self.execute_get(url)
246-
return response.json()
247-
246+
return response.json()
247+
248248
def get_roles_url_from_user_or_group(self, user_or_group):
249249
# Given a user or user group object, return the 'roles' url
250250
roles_url = None
@@ -358,6 +358,14 @@ def reset_user_password(self, user_id, new_password):
358358
headers = {'Content-Type':'application/vnd.blackducksoftware.user-1+json', 'Accept': 'application/json'}
359359
data = {'password': new_password}
360360
return self.execute_put(url, data, headers)
361+
362+
def get_last_login(self,sinceDays=60):
363+
url = self.config['baseurl'] + "/api/dormant-users"
364+
param_string = self._get_parameter_string({'sinceDays': sinceDays})
365+
url = "{}{}".format(url, param_string)
366+
headers = {'Accept': 'application/vnd.blackducksoftware.user-4+json'}
367+
response = self.execute_get(url, custom_headers=headers)
368+
return response.json()
361369

362370
###
363371
#
@@ -374,8 +382,8 @@ def get_user_groups(self, parameters={}):
374382
return response.json()
375383

376384
def get_user_group_by_name(self, group_name):
377-
groups = self.get_user_groups()
378-
for group in groups['items']:
385+
group_list = self.get_user_groups({"q": f"name:{group_name}"})
386+
for group in group_list['items']:
379387
if group['name'] == group_name:
380388
return group
381389

@@ -535,8 +543,8 @@ def find_component_info_for_protex_component(self, protex_component_id, protex_c
535543
#
536544
##
537545

538-
valid_categories = ['VERSION','CODE_LOCATIONS','COMPONENTS','SECURITY','FILES']
539-
valid_report_formats = ["CSV"]
546+
valid_categories = ['VERSION','CODE_LOCATIONS','COMPONENTS','SECURITY','FILES', 'ATTACHMENTS', 'CRYPTO_ALGORITHMS', 'PROJECT_VERSION_CUSTOM_FIELDS', 'BOM_COMPONENT_CUSTOM_FIELDS', 'LICENSE_TERM_FULFILLMENT']
547+
valid_report_formats = ["CSV", "JSON"]
540548
def create_version_reports(self, version, report_list, format="CSV"):
541549
assert all(list(map(lambda k: k in HubInstance.valid_categories, report_list))), "One or more selected report categories in {} are not valid ({})".format(
542550
report_list, HubInstance.valid_categories)
@@ -810,7 +818,7 @@ def get_version_components(self, projectversion, limit=1000):
810818
paramstring = self.get_limit_paramstring(limit)
811819
url = projectversion['_meta']['href'] + "/components" + paramstring
812820
headers = self.get_headers()
813-
headers['Accept'] = 'application/vnd.blackducksoftware.bill-of-materials-4+json'
821+
headers['Accept'] = 'application/vnd.blackducksoftware.bill-of-materials-6+json'
814822
response = requests.get(url, headers=headers, verify = not self.config['insecure'])
815823
jsondata = response.json()
816824
return jsondata
@@ -854,7 +862,7 @@ def update_project_version_settings(self, project_name, version_name, new_settin
854862
def get_version_by_id(self, project_id, version_id, limit=100):
855863
headers = self.get_headers()
856864
paramstring = self.get_limit_paramstring(limit)
857-
url = self._get_projects_url() + project_id + "/versions/" + version_id
865+
url = self._get_projects_url() + "/" + project_id + "/versions/" + version_id
858866
headers['Accept'] = 'application/vnd.blackducksoftware.project-detail-4+json'
859867
response = requests.get(url, headers=headers, verify = not self.config['insecure'])
860868
jsondata = response.json()
@@ -1028,7 +1036,7 @@ def assign_user_group_to_project(self, project_name, user_group_name, project_ro
10281036
project_url = project['_meta']['href']
10291037
assignable_user_groups_link = self.get_link(project, 'assignable-usergroups')
10301038
if assignable_user_groups_link:
1031-
assignable_user_groups_response = self.execute_get(assignable_user_groups_link)
1039+
assignable_user_groups_response = self.execute_get(f"{assignable_user_groups_link}?q=name:{user_group_name}")
10321040
assignable_user_groups = assignable_user_groups_response.json()
10331041

10341042
# TODO: What to do if the user group is already assigned to the project, and therefore
@@ -1072,6 +1080,20 @@ def assign_user_group_to_project(self, project_name, user_group_name, project_ro
10721080
else:
10731081
logger.warning("Did not find a project by the name {}".format(project_name))
10741082

1083+
def delete_user_group_from_project(self, project_name, user_group_name):
1084+
project = self.get_project_by_name(project_name)
1085+
1086+
if project:
1087+
project_url = project['_meta']['href']
1088+
1089+
user_group = self.get_user_group_by_name(user_group_name)
1090+
if user_group:
1091+
user_group_url = user_group['_meta']['href']
1092+
user_group_id = user_group_url.rsplit('/', 1)[-1]
1093+
1094+
project_user_group_url = f"{project_url}/usergroups/{user_group_id}"
1095+
self.execute_delete(project_user_group_url)
1096+
10751097
def assign_user_to_project(self, user_name, project_name, project_roles, limit=1000):
10761098
# Assign users to projects
10771099
project = self.get_project_by_name(project_name)

examples/deactivateUser.py

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
from blackduck.HubRestApi import HubInstance
2+
import json
3+
import csv
4+
import argparse
5+
6+
username = "sysadmin"
7+
password = "blackduck"
8+
urlbase = "https://blackduck.local"
9+
inactiveLog = r"c:\temp\inactive.csv" #add a location to your CSV log file
10+
11+
parser = argparse.ArgumentParser("Enter a number of days since last logged?")
12+
parser.add_argument("-d", "--days", dest="days", type=int, default=30,
13+
help="Specify the number of days that a user has not logged in the console.")
14+
15+
args = parser.parse_args()
16+
17+
hub = HubInstance(urlbase, username, password, insecure=True)
18+
19+
last_login = hub.get_last_login(sinceDays=args.days)
20+
21+
print("********************************************")
22+
print("Print every user who should be inactive.")
23+
print("********************************************")
24+
print("")
25+
print(last_login)
26+
print("")
27+
print("")
28+
29+
##################################################################################################################################
30+
# 1) - If System Users (anonymous, sysadmin, blackduck_system, default-authenticated user) are in this list, remove them from it #
31+
# 2) - Remove users who have never logged in before
32+
##################################################################################################################################
33+
34+
last_login['items'] = [x for x in last_login['items'] if x['username'] not in ('sysadmin', 'anonymous', 'blackduck_system', 'default-authenticated-user')] #1
35+
last_login['items'] = [x for x in last_login['items'] if 'lastLogin' in x] #2
36+
37+
print("********************************************")
38+
print("Filter List: Users never logged in and system users: anonymous, sysadmin, blackduck_system, default-authenticated user")
39+
print("********************************************")
40+
print("")
41+
print(last_login['items'])
42+
print("")
43+
print("")
44+
45+
#############################################################
46+
# Create a new last-login list based on the remaining users #
47+
#############################################################
48+
49+
new_last_login = last_login['items']
50+
51+
###############################################
52+
# Move (href:) key/value pair outside of meta #
53+
###############################################
54+
55+
for index in range(len(new_last_login)):
56+
d = new_last_login[index] # Fetch the Dictionary element
57+
_meta = d['_meta'] # Fetch _Meta Key
58+
href = _meta['href'] # Fetch href
59+
d['href'] = href # Add to Main List
60+
del _meta['href'] # Delete from _Meta
61+
62+
63+
print("********************************************")
64+
print("Print updated list ")
65+
print("********************************************")
66+
print("")
67+
print(new_last_login)
68+
print("")
69+
print("")
70+
71+
#######################################################
72+
# 1) deletes (lastLogin) and *(_meta) keypairs #
73+
# 2) remove the '/last-login' from the HREF URL value #
74+
# 3) grab the user data from current user in loop #
75+
# 4) create json data set with updated info for user #
76+
# 5) deactivate user #
77+
# 6) print user update status #
78+
#######################################################
79+
80+
header = ['username','first name', 'last name', 'last login']
81+
82+
with open(inactiveLog, "w+", newline='') as f:
83+
writer = csv.writer(f, delimiter=',')
84+
writer.writerow(header) # write the header
85+
86+
for i in range(len(new_last_login)):
87+
88+
del new_last_login[i]['_meta'] #1
89+
#del new_last_login[i]['lastLogin'] #1
90+
new_last_login[i]['lastLogin'] #1
91+
new_last_login[i]['href'] = new_last_login[i]['href'].replace("/last-login", "") #2
92+
93+
user_url = new_last_login[i]['href'] #3
94+
user_info = hub.get_user_by_url(user_url) #3
95+
96+
#print ("")
97+
#print(user_info)
98+
#print ("")
99+
100+
print ("***getting user data***")
101+
print ("")
102+
103+
104+
data_set = {"active" : False, "userName" :new_last_login[i]['username'],"firstName" :user_info['firstName'], "lastName" :user_info['lastName']} #4
105+
json_dump = json.dumps(data_set) #4
106+
update_json=json_dump #4
107+
108+
#print(user_url)
109+
#print(json_dump)
110+
111+
print ("***deactivating user***")
112+
print ("")
113+
114+
updateuser = hub.update_user_by_url(user_url,update_json) #5
115+
116+
print("Result for user:" + new_last_login[i]['username'])
117+
print(updateuser) #6
118+
119+
log = [new_last_login[i]['username'], user_info['firstName'], user_info['lastName'], new_last_login[i]['lastLogin']]
120+
121+
with open(inactiveLog, mode='a', newline='') as f:
122+
writer = csv.writer(f, delimiter=',')
123+
writer.writerow(log) #write the inactive user data
124+
125+
i=i+1
126+
127+
128+
129+
130+
131+
132+
133+
134+
135+
136+
137+

0 commit comments

Comments
 (0)