Multiple updates (#1273)

* Multiple updates

Add member to print cigroups|cigroup-members to select groups to display
Drop Google-Coordinate product ID
Update print|show driveactivity to Drive Activity API v2
Check for more parents than 1 in create|update drivefile
Update documentation
Allow times_to_check_status with gam getcommand cros
Display deviceId and commandId when issuing/getting commands

* Fix orgunit references in vault

* Rename member to enterprisemember in print cigroups|cigroup-members

Give error message indication the Enterprise license is required

* Add lastKnownNetwork to CrOS fields

* Soft fail when deleting user photo

* Fix bug in PR #1273
This commit is contained in:
Ross Scroggs
2020-12-05 18:54:26 -08:00
committed by GitHub
parent 6a879927a7
commit 8ce18960fe
7 changed files with 328 additions and 185 deletions

View File

@@ -1093,7 +1093,7 @@ def buildAlertCenterGAPIObject(user):
def buildActivityGAPIObject(user):
userEmail = convertUIDtoEmailAddress(user)
return (userEmail, buildGAPIServiceObject('appsactivity', userEmail))
return (userEmail, buildGAPIServiceObject('driveactivity', userEmail))
def buildDriveGAPIObject(user):
@@ -2720,7 +2720,7 @@ def deletePhoto(users):
for user in users:
i += 1
print(f'Deleting photo for {user}{currentCount(i, count)}')
gapi.call(cd.users().photos(), 'delete', userKey=user)
gapi.call(cd.users().photos(), 'delete', userKey=user, soft_errors=True)
def printDriveSettings(users):
@@ -2788,23 +2788,58 @@ def getTeamDriveThemes(users):
def printDriveActivity(users):
drive_ancestorId = 'root'
drive_fileId = None
def _get_user_info(user_id):
if user_id.startswith('people/'):
user_id = user_id[7:]
entry = user_info.get(user_id)
if entry is None:
result = gapi.call(cd.users(), 'get',
soft_errors=True,
userKey=user_id, fields='primaryEmail,name.fullName')
if result:
entry = (result['primaryEmail'], result['name']['fullName'])
else:
entry = (f'uid:{user_id}', 'Unknown')
user_info[user_id] = entry
return entry
def _update_known_users(structure):
if isinstance(structure, list):
for v in structure:
if isinstance(v, (dict, list)):
_update_known_users(v)
elif isinstance(structure, dict):
for k, v in sorted(iter(structure.items())):
if k != 'knownUser':
if isinstance(v, (dict, list)):
_update_known_users(v)
else:
entry = _get_user_info(v['personName'])
v['emailAddress'] = entry[0]
v['personName'] = entry[1]
break
cd = buildGAPIObject('directory')
drive_key = 'ancestorName'
drive_fileId = 'root'
user_info = {}
todrive = False
titles = [
'user.name', 'user.permissionId', 'target.id', 'target.name',
'target.mimeType'
'user.name', 'user.emailAddress', 'target.id', 'target.name',
'target.mimeType', 'eventTime'
]
sort_titles = titles[:]
csvRows = []
i = 5
while i < len(sys.argv):
activity_object = sys.argv[i].lower().replace('_', '')
if activity_object == 'fileid':
drive_fileId = sys.argv[i + 1]
drive_ancestorId = None
drive_key = 'itemName'
i += 2
elif activity_object == 'folderid':
drive_ancestorId = sys.argv[i + 1]
drive_fileId = sys.argv[i + 1]
drive_key = 'ancestorName'
i += 2
elif activity_object == 'todrive':
todrive = True
@@ -2812,23 +2847,57 @@ def printDriveActivity(users):
else:
controlflow.invalid_argument_exit(sys.argv[i],
'gam <users> show driveactivity')
for user in users:
user, activity = buildActivityGAPIObject(user)
if not activity:
continue
page_token = None
total_items = 0
kwargs = {drive_key: f'items/{drive_fileId}',
'pageToken': page_token}
page_message = gapi.got_total_items_msg(f'Activities for {user}', '')
feed = gapi.get_all_pages(activity.activities(),
'list',
'activities',
page_message=page_message,
source='drive.google.com',
userId='me',
drive_ancestorId=drive_ancestorId,
groupingStrategy='none',
drive_fileId=drive_fileId)
for item in feed:
display.add_row_titles_to_csv_file(
utils.flatten_json(item['combinedEvent']), csvRows, titles)
while True:
feed = gapi.call(activity.activity(), 'query', body=kwargs)
page_token, total_items = gapi.process_page(feed, 'activities', None, total_items, page_message, None)
kwargs['pageToken'] = page_token
if feed:
for activity_event in feed.get('activities', []):
event_row = {}
actors = activity_event.get('actors', [])
if actors:
userId = actors[0].get('user', {}).get('knownUser', {}).get('personName', '')
if not userId:
userId = actors[0].get('impersonation', {}).get('impersonatedUser', {}).get('knownUser', {}).get('personName', '')
if userId:
entry = _get_user_info(userId)
event_row['user.name'] = entry[1]
event_row['user.emailAddress'] = entry[0]
targets = activity_event.get('targets', [])
if targets:
driveItem = targets[0].get('driveItem')
if driveItem:
event_row['target.id'] = driveItem['name'][6:]
event_row['target.name'] = driveItem['title']
event_row['target.mimeType'] = driveItem['mimeType']
else:
teamDrive = targets[0].get('teamDrive')
if teamDrive:
event_row['target.id'] = teamDrive['name'][11:]
event_row['target.name'] = teamDrive['title']
if 'timestamp' in activity_event:
event_row['eventTime'] = activity_event.pop('timestamp')
elif 'timeRange' in activity_event:
timeRange = activity_event.pop('timeRange')
event_row['eventTime'] = f'{timeRange["startTime"]}-{timeRange["endTime"]}'
_update_known_users(activity_event)
display.add_row_titles_to_csv_file(
utils.flatten_json(activity_event, flattened=event_row), csvRows, titles)
del feed
if not page_token:
gapi.finalize_page_message(page_message)
break
display.sort_csv_titles(sort_titles, titles)
display.write_csv_file(csvRows, titles, 'Drive Activity', todrive)
@@ -3570,6 +3639,10 @@ def getDriveFileAttribute(i, body, parameters, myarg, update=False):
return i
def has_multiple_parents(body):
return len(body.get('parents', [])) > 1
def doUpdateDriveFile(users):
fileIdSelection = {'fileIds': [], 'query': None}
media_body = None
@@ -3618,6 +3691,9 @@ def doUpdateDriveFile(users):
body.setdefault('parents', [])
for a_parent in more_parents:
body['parents'].append({'id': a_parent})
if has_multiple_parents(body):
sys.stderr.write(f"Multiple parents ({len(body['parents'])}) specified for {user}, only one is allowed.\n")
continue
if fileIdSelection['query']:
fileIdSelection['fileIds'] = doDriveSearch(
drive, query=fileIdSelection['query'])
@@ -3705,6 +3781,9 @@ def createDriveFile(users):
body.setdefault('parents', [])
for a_parent in more_parents:
body['parents'].append({'id': a_parent})
if has_multiple_parents(body):
sys.stderr.write(f"Multiple parents ({len(body['parents'])}) specified for {user}, only one is allowed.\n")
continue
if parameters[DFA_LOCALFILEPATH]:
media_body = googleapiclient.http.MediaFileUpload(
parameters[DFA_LOCALFILEPATH],