mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-28 18:01:36 +00:00
One large, four small fixes (#813)
* One large, three small fixes Gam update group update backwards compatibility 8551/8552 Handle cpuStatusReports, diskVolumeReports, systemRamFreeReports for CrOS devices 9451/10291, 11417/11622 Cod cleanup writeCSVfile 10360.10375 Fix indentation 12678 * Make cell_count computation explicit
This commit is contained in:
@@ -246,8 +246,10 @@ If an item contains spaces, it should be surrounded by ".
|
||||
annotatedlocation|location|
|
||||
annotateduser|user|
|
||||
bootmode|
|
||||
cpustatusreports|
|
||||
devicefiles|
|
||||
deviceid|
|
||||
diskvolumereports|
|
||||
ethernetmacaddress|
|
||||
firmwareversion|
|
||||
lastenrollmenttime|
|
||||
@@ -265,8 +267,18 @@ If an item contains spaces, it should be surrounded by ".
|
||||
status|
|
||||
supportenddate|
|
||||
tpmversioninfo|
|
||||
systemramtotal|
|
||||
systemramfreereports|
|
||||
willautorenew
|
||||
|
||||
<CrOSListFieldName> ::=
|
||||
activetimeranges|timeranges|
|
||||
cpustatusreports|
|
||||
devicefiles|
|
||||
diskvolumereports|
|
||||
recentusers|
|
||||
systemramfreereports
|
||||
|
||||
<CrOSOrderByFieldName> ::=
|
||||
lastsync|location|notes|serialnumber|status|supportenddate|user
|
||||
|
||||
@@ -903,8 +915,8 @@ gam info cros <CrOSEntity> [nolists] [listlimit <Number>] [start <Date>] [end <D
|
||||
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>] [downloadfile latest|<Time>] [targetfolder <FilePath>]
|
||||
|
||||
gam print cros [todrive] [(query <QueryCrOS>)|(queries <QueryCrOSList>)] [limittoou <OrgUnitItem>]
|
||||
[orderby <CrOSOrderByFieldName> [ascending|descending]] [nolists|recentusers|timeranges|devicefiles] [listlimit <Number>] [start <Date>] [end <Date>]
|
||||
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>]
|
||||
[orderby <CrOSOrderByFieldName> [ascending|descending]] [nolists|<CrOSListFieldName>*] [listlimit <Number>] [start <Date>] [end <Date>]
|
||||
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>] [sortheaders]
|
||||
gam <CrOSTypeEntity> print
|
||||
|
||||
Summary of printing:
|
||||
@@ -915,22 +927,14 @@ Prints no header row and deviceId for specified CrOS devices.
|
||||
gam print cros ... basic|full
|
||||
Prints a header row and selected fields for specified CrOS devices.
|
||||
|
||||
The basic argument outputs these column headers: deviceId,annotatedAssetId,annotatedLocation,annotatedUser,lastSync,notes,serialNumber,status
|
||||
The allfields/full arguments output all column headers including three headers, recentUsers, activeTimeRanges and deviceFiles,
|
||||
that repeat with two/four/two subvalues each, yielding a large number of columns that make the output hard to process.
|
||||
The nolists argument suppresses these three headers; if you want these headers in a more manageable form use the following arguments.
|
||||
|
||||
If recentusers is specified, for each recent user, the columns recentUsers.email and recentUsers.type are output on a separate row
|
||||
with all of the other headers.
|
||||
|
||||
If timeranges is specified, for each time range entry, the columns activeTimeRanges.date, activeTimeRange.activeTime,
|
||||
activeTimeRanges.duration and activeTimeRanges.minutes are output on a separate row with all of the other headers.
|
||||
|
||||
If devicefiles is specified, for each deviceFile, the columns deviceFiles.type and deviceFiles.createTime are output on a separate row
|
||||
with all of the other headers.
|
||||
The basic argument outputs these column headers: deviceId,annotatedAssetId,annotatedLocation,annotatedUser,lastSync,notes,serialNumber,status.
|
||||
The allfields/full arguments output all column headers including six headers: activeTimeRanges, cpuStatusReports, deviceFiles, diskVolumeReports, recentUsers and systemRamFreeReports
|
||||
that repeat with multiple subvalues each, yielding a large number of columns that make the output hard to process.
|
||||
The nolists argument suppresses these six headers; if you want these headers in a more manageable form specify <CrOSListFieldName> values as desired.
|
||||
One set of values for all <CrOSListFieldName> fields specified will be output on a separate row with all of the other headers.
|
||||
|
||||
The listlimit <Number> argument limits the number of repetitions to <Number>; if not specified or <Number> equals zero, there is no limit.
|
||||
The start <Date> and end <Date> arguments filter the time ranges.
|
||||
The start <Date> and end <Date> arguments constrain activeTimeRanges, cpuStatusReports, deviceFiles and systemRamFreeReports to fall within the specified <Dates>.
|
||||
|
||||
gam print crosactivity [todrive] [(query <QueryCrOS>)|(queries <QueryCrOSList>)] [limittoou <OrgUnitItem>]
|
||||
[recentusers] [timeranges] [both] [devicefiles] [all] [listlimit <Number>] [start <Date>] [end <Date>] [delimiter <Character>]
|
||||
@@ -962,10 +966,10 @@ gam print mobile [todrive] [(query <QueryMobile>)|(queries <QueryMobileList>)] [
|
||||
|
||||
gam create group <EmailAddress> <GroupAttributes>*
|
||||
gam update group <GroupItem> [admincreated <Boolean>] [email <EmailAddress>] <GroupAttributes>*
|
||||
gam update group <GroupItem> add [owner|manager|member] [notsuspended|suspended] <UserTypeEntity>
|
||||
gam update group <GroupItem> add [owner|manager|member] [notsuspended|suspended] [delivery allmail|daily|digest|none|nomail] <UserTypeEntity>
|
||||
gam update group <GroupItem> delete|remove [owner|manager|member] <UserTypeEntity>
|
||||
gam update group <GroupItem> sync [owner|manager|member] [notsuspended|suspended] <UserTypeEntity>
|
||||
gam update group <GroupItem> update [owner|manager|member] <UserTypeEntity>
|
||||
gam update group <GroupItem> sync [owner|manager|member] [notsuspended|suspended] [delivery allmail|daily|digest|none|nomail] <UserTypeEntity>
|
||||
gam update group <GroupItem> update [owner|manager|member] [notsuspended|suspended] [delivery allmail|daily|digest|none|nomail] <UserTypeEntity>
|
||||
gam update group <GroupItem> clear [member] [manager] [owner] [notsuspended|suspended]
|
||||
gam delete group <GroupItem>
|
||||
gam info group <GroupItem> [nousers] [noaliases] [groups]
|
||||
@@ -975,6 +979,7 @@ gam print groups [todrive] ([domain <DomainName>] ([member <UserItem>]|[query <Q
|
||||
[members|memberscount] [managers|managerscount] [owners|ownerscount]
|
||||
[delimiter <Character>] [sortheaders]
|
||||
|
||||
gam info member <UserItem> <GroupItem>
|
||||
gam print group-members|groups-members [todrive]
|
||||
([domain <DomainName>] ([member <UserItem>]|[query <QueryGroup>]))|[group|group_ns|group_susp <GroupItem>] [notsuspended|suspended]
|
||||
[roles <GroupRoleList>] [membernames] [fields <MembersFieldNameList>]
|
||||
@@ -1027,10 +1032,6 @@ gam print users [todrive]
|
||||
[allfields|basic|full | ((<UserFieldName>* | fields <UserFieldNameList>) [schemas|custom all|<SchemaNameList>])]
|
||||
[delimiter <Character>] [sortheaders]
|
||||
|
||||
Print no header row and primaryEmail for specified users.
|
||||
|
||||
gam <UserTypeEntity> print
|
||||
|
||||
gam create verify|verification <DomainName>
|
||||
gam update verify|verification <DomainName> cname|txt|text|site|file
|
||||
gam info verify|verification
|
||||
|
||||
251
src/gam.py
251
src/gam.py
@@ -8548,6 +8548,8 @@ def doUpdateGroup():
|
||||
role, users_email, delivery = _getRoleAndUsers()
|
||||
group = checkGroupExists(cd, group)
|
||||
if group:
|
||||
if not role and not delivery:
|
||||
role = ROLE_MEMBER
|
||||
if len(users_email) > 1:
|
||||
sys.stderr.write(u'Group: {0}, Will update {1} {2}s.\n'.format(group, len(users_email), role))
|
||||
for user_email in users_email:
|
||||
@@ -8557,7 +8559,6 @@ def doUpdateGroup():
|
||||
if delivery:
|
||||
item.append(delivery)
|
||||
item.append(user_email)
|
||||
print item
|
||||
items.append(item)
|
||||
else:
|
||||
body = {}
|
||||
@@ -9447,15 +9448,15 @@ def _filterTimeRanges(activeTimeRanges, startDate, endDate):
|
||||
filteredTimeRanges.append(timeRange)
|
||||
return filteredTimeRanges
|
||||
|
||||
def _filterDeviceFiles(deviceFiles, startTime, endTime):
|
||||
def _filterCreateReportTime(items, timeField, startTime, endTime):
|
||||
if startTime is None and endTime is None:
|
||||
return deviceFiles
|
||||
filteredDeviceFiles = []
|
||||
for deviceFile in deviceFiles:
|
||||
createTime = datetime.datetime.strptime(deviceFile[u'createTime'], u'%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
if ((startTime is None) or (createTime >= startTime)) and ((endTime is None) or (createTime <= endTime)):
|
||||
filteredDeviceFiles.append(deviceFile)
|
||||
return filteredDeviceFiles
|
||||
return items
|
||||
filteredItems = []
|
||||
for item in items:
|
||||
timeValue = datetime.datetime.strptime(item[timeField], u'%Y-%m-%dT%H:%M:%S.%fZ')
|
||||
if ((startTime is None) or (timeValue >= startTime)) and ((endTime is None) or (timeValue <= endTime)):
|
||||
filteredItems.append(item)
|
||||
return filteredItems
|
||||
|
||||
def _getFilterDate(dateStr):
|
||||
return datetime.datetime.strptime(dateStr, YYYYMMDD_FORMAT)
|
||||
@@ -9563,7 +9564,7 @@ def doGetCrosInfo():
|
||||
for recentUser in recentUsers[:min(lenRU, listLimit or lenRU)]:
|
||||
print u' type: {0}'.format(recentUser[u'type'])
|
||||
print u' email: {0}'.format(recentUser.get(u'email', [u'Unknown', u'UnmanagedUser'][recentUser[u'type'] == u'USER_TYPE_UNMANAGED']))
|
||||
deviceFiles = _filterDeviceFiles(cros.get(u'deviceFiles', []), startDate, endDate)
|
||||
deviceFiles = _filterCreateReportTime(cros.get(u'deviceFiles', []), u'createTime', startDate, endDate)
|
||||
lenDF = len(deviceFiles)
|
||||
if lenDF:
|
||||
print u' deviceFiles'
|
||||
@@ -9589,6 +9590,34 @@ def doGetCrosInfo():
|
||||
print u'Downloaded: {0}'.format(downloadfilename)
|
||||
elif downloadfile:
|
||||
print u'ERROR: no files to download.'
|
||||
cpuStatusReports = _filterCreateReportTime(cros.get(u'cpuStatusReports', []), u'reportTime', startDate, endDate)
|
||||
lenCSR = len(cpuStatusReports)
|
||||
if lenCSR:
|
||||
print u' cpuStatusReports'
|
||||
for cpuStatusReport in cpuStatusReports[:min(lenCSR, listLimit or lenCSR)]:
|
||||
print u' reportTime: {0}'.format(cpuStatusReport[u'reportTime'])
|
||||
print u' cpuTemperatureInfo'
|
||||
for tempInfo in cpuStatusReport.get(u'cpuTemperatureInfo', []):
|
||||
print u' {0}: {1}'.format(tempInfo[u'label'].strip(), tempInfo[u'temperature'])
|
||||
print u' cpuUtilizationPercentageInfo: {0}'.format(u','.join([str(x) for x in cpuStatusReport[u'cpuUtilizationPercentageInfo']]))
|
||||
diskVolumeReports = cros.get(u'diskVolumeReports', [])
|
||||
lenDVR = len(diskVolumeReports)
|
||||
if lenDVR:
|
||||
print u' diskVolumeReports'
|
||||
print u' volumeInfo'
|
||||
for diskVolumeReport in diskVolumeReports[:min(lenDVR, listLimit or lenDVR)]:
|
||||
volumeInfo = diskVolumeReport[u'volumeInfo']
|
||||
for volume in volumeInfo:
|
||||
print u' volumeId: {0}'.format(volume[u'volumeId'])
|
||||
print u' storageFree: {0}'.format(volume[u'storageFree'])
|
||||
print u' storageTotal: {0}'.format(volume[u'storageTotal'])
|
||||
systemRamFreeReports = _filterCreateReportTime(cros.get(u'systemRamFreeReports', []), u'reportTime', startDate, endDate)
|
||||
lenSRFR = len(systemRamFreeReports)
|
||||
if lenSRFR:
|
||||
print u' systemRamFreeReports'
|
||||
for systemRamFreeReport in systemRamFreeReports[:min(lenSRFR, listLimit or lenSRFR)]:
|
||||
print u' reportTime: {0}'.format(systemRamFreeReport[u'reportTime'])
|
||||
print u' systemRamFreeInfo: {0}'.format(u','.join(systemRamFreeReport[u'systemRamFreeInfo']))
|
||||
|
||||
def doGetMobileInfo():
|
||||
cd = buildGAPIObject(u'directory')
|
||||
@@ -10253,6 +10282,13 @@ def send_email(msg_subj, msg_txt, msg_rcpt=None):
|
||||
callGAPI(gmail.users().messages(), u'send',
|
||||
userId=userId, body={u'raw': base64.urlsafe_b64encode(msg.as_string())})
|
||||
|
||||
def addFieldToFieldsList(fieldName, fieldsChoiceMap, fieldsList):
|
||||
fields = fieldsChoiceMap[fieldName.lower()]
|
||||
if isinstance(fields, list):
|
||||
fieldsList.extend(fields)
|
||||
else:
|
||||
fieldsList.append(fields)
|
||||
|
||||
# Write a CSV file
|
||||
def addTitleToCSVfile(title, titles):
|
||||
titles.append(title)
|
||||
@@ -10322,11 +10358,6 @@ def writeCSVfile(csvRows, titles, list_type, todrive):
|
||||
except IOError as e:
|
||||
systemErrorExit(6, e)
|
||||
if todrive:
|
||||
data_size = string_file.len
|
||||
columns = len(titles)
|
||||
rows = len(csvRows)
|
||||
cell_count = rows * columns
|
||||
mimeType = u'application/vnd.google-apps.spreadsheet'
|
||||
admin_email = _getValueFromOAuth(u'email')
|
||||
_, drive = buildDrive3GAPIObject(admin_email)
|
||||
if not drive:
|
||||
@@ -10337,10 +10368,14 @@ gam user %s check serviceaccount
|
||||
and follow recommend steps to authorize GAM for Drive access.''' % (admin_email)
|
||||
sys.exit(5)
|
||||
result = callGAPI(drive.about(), u'get', fields=u'maxImportSizes')
|
||||
max_sheet_bytes = int(result[u'maxImportSizes'][u'application/vnd.google-apps.spreadsheet'])
|
||||
if cell_count > 2000000 or columns > 256 or data_size > max_sheet_bytes:
|
||||
columns = len(titles)
|
||||
rows = len(csvRows)
|
||||
cell_count = rows * columns
|
||||
if cell_count > 2000000 or string_file.len > int(result[u'maxImportSizes'][MIMETYPE_GA_SPREADSHEET]):
|
||||
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
||||
mimeType = u'text/csv'
|
||||
else:
|
||||
mimeType = MIMETYPE_GA_SPREADSHEET
|
||||
body = {u'description': u' '.join(sys.argv),
|
||||
u'name': u'%s - %s' % (GC_Values[GC_DOMAIN], list_type),
|
||||
u'mimeType': mimeType}
|
||||
@@ -11382,7 +11417,7 @@ def doPrintCrosActivity():
|
||||
row[u'recentUsers.email'] = delimiter.join([recent_user.get(u'email', [u'Unknown', u'UnmanagedUser'][recent_user[u'type'] == u'USER_TYPE_UNMANAGED']) for recent_user in recentUsers[:min(lenRU, listLimit or lenRU)]])
|
||||
csvRows.append(row)
|
||||
if selectDeviceFiles:
|
||||
deviceFiles = _filterDeviceFiles(cros.get(u'deviceFiles', []), startDate, endDate)
|
||||
deviceFiles = _filterCreateReportTime(cros.get(u'deviceFiles', []), u'createTime', startDate, endDate)
|
||||
lenDF = len(deviceFiles)
|
||||
for deviceFile in deviceFiles[:min(lenDF, listLimit or lenDF)]:
|
||||
new_row = row.copy()
|
||||
@@ -11402,6 +11437,20 @@ def _checkTPMVulnerability(cros):
|
||||
return cros
|
||||
|
||||
def doPrintCrosDevices():
|
||||
def _getSelectedLists(myarg):
|
||||
if myarg in CROS_ACTIVE_TIME_RANGES_ARGUMENTS:
|
||||
selectedLists[u'activeTimeRanges'] = True
|
||||
elif myarg in CROS_RECENT_USERS_ARGUMENTS:
|
||||
selectedLists[u'recentUsers'] = True
|
||||
elif myarg in CROS_DEVICE_FILES_ARGUMENTS:
|
||||
selectedLists[u'deviceFiles'] = True
|
||||
elif myarg in CROS_CPU_STATUS_REPORTS_ARGUMENTS:
|
||||
selectedLists[u'cpuStatusReports'] = True
|
||||
elif myarg in CROS_DISK_VOLUME_REPORTS_ARGUMENTS:
|
||||
selectedLists[u'diskVolumeReports'] = True
|
||||
elif myarg in CROS_SYSTEM_RAM_FREE_REPORTS_ARGUMENTS:
|
||||
selectedLists[u'systemRamFreeReports'] = True
|
||||
|
||||
cd = buildGAPIObject(u'directory')
|
||||
todrive = False
|
||||
fieldsList = []
|
||||
@@ -11409,11 +11458,10 @@ def doPrintCrosDevices():
|
||||
titles = []
|
||||
csvRows = []
|
||||
addFieldToCSVfile(u'deviceid', CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
||||
sortHeaders = False
|
||||
projection = orderBy = sortOrder = orgUnitPath = None
|
||||
queries = [None]
|
||||
noLists = False
|
||||
selectActiveTimeRanges = selectDeviceFiles = selectRecentUsers = False
|
||||
noLists = sortHeaders = False
|
||||
selectedLists = {}
|
||||
startDate = endDate = None
|
||||
listLimit = 0
|
||||
i = 3
|
||||
@@ -11430,28 +11478,7 @@ def doPrintCrosDevices():
|
||||
i += 1
|
||||
elif myarg == u'nolists':
|
||||
noLists = True
|
||||
selectActiveTimeRanges = selectDeviceFiles = selectRecentUsers = False
|
||||
i += 1
|
||||
elif myarg in CROS_ACTIVE_TIME_RANGES_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectActiveTimeRanges = True
|
||||
noLists = False
|
||||
if fieldsList:
|
||||
fieldsList.append(u'activeTimeRanges')
|
||||
i += 1
|
||||
elif myarg in CROS_DEVICE_FILES_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectDeviceFiles = True
|
||||
noLists = False
|
||||
if fieldsList:
|
||||
fieldsList.append(u'deviceFiles')
|
||||
i += 1
|
||||
elif myarg in CROS_RECENT_USERS_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectRecentUsers = True
|
||||
noLists = False
|
||||
if fieldsList:
|
||||
fieldsList.append(u'recentUsers')
|
||||
selectedLists = {}
|
||||
i += 1
|
||||
elif myarg in CROS_START_ARGUMENTS:
|
||||
startDate = _getFilterDate(sys.argv[i+1])
|
||||
@@ -11494,36 +11521,34 @@ def doPrintCrosDevices():
|
||||
sortHeaders = True
|
||||
fieldsList = []
|
||||
i += 1
|
||||
elif myarg == u'sortheaders':
|
||||
sortHeaders = True
|
||||
i += 1
|
||||
elif myarg in CROS_LISTS_ARGUMENTS:
|
||||
_getSelectedLists(myarg)
|
||||
i += 1
|
||||
elif myarg in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
||||
if not fieldsList:
|
||||
fieldsList = [u'deviceId',]
|
||||
addFieldToCSVfile(myarg, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
||||
addFieldToFieldsList(myarg, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList)
|
||||
i += 1
|
||||
elif myarg == u'fields':
|
||||
if not fieldsList:
|
||||
fieldsList = [u'deviceId',]
|
||||
fieldNameList = sys.argv[i+1]
|
||||
for field in fieldNameList.lower().replace(u',', u' ').split():
|
||||
if field in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
||||
addFieldToCSVfile(field, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
||||
if field in CROS_ACTIVE_TIME_RANGES_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectActiveTimeRanges = True
|
||||
noLists = False
|
||||
elif field in CROS_DEVICE_FILES_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectDeviceFiles = True
|
||||
noLists = False
|
||||
elif field in CROS_RECENT_USERS_ARGUMENTS:
|
||||
projection = u'FULL'
|
||||
selectRecentUsers = True
|
||||
noLists = False
|
||||
if field in CROS_LISTS_ARGUMENTS:
|
||||
_getSelectedLists(field)
|
||||
elif field in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
||||
addFieldToFieldsList(field, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList)
|
||||
else:
|
||||
systemErrorExit(2, '%s is not a valid argument for "gam print cros fields"' % field)
|
||||
i += 2
|
||||
else:
|
||||
systemErrorExit(2, '%s is not a valid argument for "gam print cros"' % sys.argv[i])
|
||||
if selectedLists:
|
||||
noLists = False
|
||||
projection = u'FULL'
|
||||
for selectList in selectedLists:
|
||||
addFieldToFieldsList(selectList, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList)
|
||||
if fieldsList:
|
||||
fieldsList.append(u'deviceId')
|
||||
fields = u'nextPageToken,chromeosdevices({0})'.format(u','.join(set(fieldsList))).replace(u'.', u'/')
|
||||
else:
|
||||
fields = None
|
||||
@@ -11535,51 +11560,69 @@ def doPrintCrosDevices():
|
||||
orderBy=orderBy, sortOrder=sortOrder, fields=fields, maxResults=GC_Values[GC_DEVICE_MAX_RESULTS])
|
||||
for cros in all_cros:
|
||||
cros = _checkTPMVulnerability(cros)
|
||||
if (not noLists) and (not selectActiveTimeRanges) and (not selectRecentUsers) and (not selectDeviceFiles):
|
||||
if not noLists and not selectedLists:
|
||||
for cros in all_cros:
|
||||
if u'notes' in cros:
|
||||
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
||||
for cpuStatusReport in cros.get(u'cpuStatusReports', []):
|
||||
for tempInfo in cpuStatusReport.get(u'cpuTemperatureInfo', []):
|
||||
tempInfo[u'label'] = tempInfo[u'label'].strip()
|
||||
addRowTitlesToCSVfile(flatten_json(cros, listLimit=listLimit), csvRows, titles)
|
||||
else:
|
||||
if not noLists:
|
||||
if selectActiveTimeRanges:
|
||||
titles.extend([u'activeTimeRanges.date', u'activeTimeRanges.activeTime', u'activeTimeRanges.duration', u'activeTimeRanges.minutes'])
|
||||
if selectRecentUsers:
|
||||
titles.extend([u'recentUsers.email', u'recentUsers.type'])
|
||||
if selectDeviceFiles:
|
||||
titles.extend([u'deviceFiles.type', u'deviceFiles.createTime'])
|
||||
for cros in all_cros:
|
||||
if u'notes' in cros:
|
||||
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
||||
row = {}
|
||||
for attrib in cros:
|
||||
if attrib not in [u'kind', u'etag', u'recentUsers', u'activeTimeRanges', u'deviceFiles']:
|
||||
if attrib not in titles:
|
||||
titles.append(attrib)
|
||||
row[attrib] = cros[attrib]
|
||||
activeTimeRanges = _filterTimeRanges(cros.get(u'activeTimeRanges', []), startDate, endDate) if selectActiveTimeRanges else []
|
||||
recentUsers = cros.get(u'recentUsers', []) if selectRecentUsers else []
|
||||
deviceFiles = _filterDeviceFiles(cros.get(u'deviceFiles', []), startDate, endDate) if selectDeviceFiles else []
|
||||
if noLists or (not activeTimeRanges and not recentUsers and not deviceFiles):
|
||||
csvRows.append(row)
|
||||
else:
|
||||
lenATR = len(activeTimeRanges)
|
||||
lenRU = len(recentUsers)
|
||||
lenDF = len(deviceFiles)
|
||||
for i in xrange(min(listLimit, max(lenATR, lenRU)) if listLimit else max(lenATR, lenRU, lenDF)):
|
||||
new_row = row.copy()
|
||||
if i < lenATR:
|
||||
new_row[u'activeTimeRanges.date'] = activeTimeRanges[i][u'date']
|
||||
new_row[u'activeTimeRanges.activeTime'] = str(activeTimeRanges[i][u'activeTime'])
|
||||
new_row[u'activeTimeRanges.duration'] = utils.formatMilliSeconds(activeTimeRanges[i][u'activeTime'])
|
||||
new_row[u'activeTimeRanges.minutes'] = activeTimeRanges[i][u'activeTime']/60000
|
||||
if i < lenRU:
|
||||
new_row[u'recentUsers.email'] = recentUsers[i].get(u'email', [u'Unknown', u'UnmanagedUser'][recentUsers[i][u'type'] == u'USER_TYPE_UNMANAGED'])
|
||||
new_row[u'recentUsers.type'] = recentUsers[i][u'type']
|
||||
if i < lenDF:
|
||||
new_row[u'deviceFiles.type'] = deviceFiles[i][u'type']
|
||||
new_row[u'deviceFiles.createTime'] = deviceFiles[i][u'createTime']
|
||||
csvRows.append(new_row)
|
||||
continue
|
||||
for cros in all_cros:
|
||||
if u'notes' in cros:
|
||||
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
||||
row = {}
|
||||
for attrib in cros:
|
||||
if attrib not in set([u'kind', u'etag', u'tpmVersionInfo', u'recentUsers', u'activeTimeRanges',
|
||||
u'deviceFiles', u'cpuStatusReports', u'diskVolumeReports', u'systemRamFreeReports']):
|
||||
row[attrib] = cros[attrib]
|
||||
activeTimeRanges = _filterTimeRanges(cros.get(u'activeTimeRanges', []) if selectedLists.get(u'activeTimeRanges') else [], startDate, endDate)
|
||||
recentUsers = cros.get(u'recentUsers', []) if selectedLists.get(u'recentUsers') else []
|
||||
deviceFiles = _filterCreateReportTime(cros.get(u'deviceFiles', []) if selectedLists.get(u'deviceFiles') else [], u'createTime', startDate, endDate)
|
||||
cpuStatusReports = _filterCreateReportTime(cros.get(u'cpuStatusReports', []) if selectedLists.get(u'cpuStatusReports') else [], u'reportTime', startDate, endDate)
|
||||
diskVolumeReports = cros.get(u'diskVolumeReports', []) if selectedLists.get(u'diskVolumeReports') else []
|
||||
systemRamFreeReports = _filterCreateReportTime(cros.get(u'systemRamFreeReports', []) if selectedLists.get(u'systemRamFreeReports') else [], u'reportTime', startDate, endDate)
|
||||
if noLists or (not activeTimeRanges and not recentUsers and not deviceFiles and
|
||||
not cpuStatusReports and not diskVolumeReports and not systemRamFreeReports):
|
||||
addRowTitlesToCSVfile(row, csvRows, titles)
|
||||
continue
|
||||
lenATR = len(activeTimeRanges)
|
||||
lenRU = len(recentUsers)
|
||||
lenDF = len(deviceFiles)
|
||||
lenCSR = len(cpuStatusReports)
|
||||
lenDVR = len(diskVolumeReports)
|
||||
lenSRFR = len(systemRamFreeReports)
|
||||
for i in range(min(max(lenATR, lenRU, lenDF, lenCSR, lenDVR, lenSRFR), listLimit or max(lenATR, lenRU, lenDF, lenCSR, lenDVR, lenSRFR))):
|
||||
new_row = row.copy()
|
||||
if i < lenATR:
|
||||
new_row[u'activeTimeRanges.date'] = activeTimeRanges[i][u'date']
|
||||
new_row[u'activeTimeRanges.activeTime'] = str(activeTimeRanges[i][u'activeTime'])
|
||||
new_row[u'activeTimeRanges.duration'] = utils.formatMilliSeconds(activeTimeRanges[i][u'activeTime'])
|
||||
new_row[u'activeTimeRanges.minutes'] = activeTimeRanges[i][u'activeTime']/60000
|
||||
if i < lenRU:
|
||||
new_row[u'recentUsers.email'] = recentUsers[i].get(u'email', [u'Unknown', u'UnmanagedUser'][recentUsers[i][u'type'] == u'USER_TYPE_UNMANAGED'])
|
||||
new_row[u'recentUsers.type'] = recentUsers[i][u'type']
|
||||
if i < lenDF:
|
||||
new_row[u'deviceFiles.type'] = deviceFiles[i][u'type']
|
||||
new_row[u'deviceFiles.createTime'] = deviceFiles[i][u'createTime']
|
||||
if i < lenCSR:
|
||||
new_row[u'cpuStatusReports.reportTime'] = cpuStatusReports[i][u'reportTime']
|
||||
for tempInfo in cpuStatusReports[i].get(u'cpuTemperatureInfo', []):
|
||||
new_row[u'cpuStatusReports.cpuTemperatureInfo.{0}'.format(tempInfo[u'label'].strip())] = tempInfo[u'temperature']
|
||||
new_row[u'cpuStatusReports.cpuUtilizationPercentageInfo'] = u','.join([str(x) for x in cpuStatusReports[i][u'cpuUtilizationPercentageInfo']])
|
||||
if i < lenDVR:
|
||||
volumeInfo = diskVolumeReports[i][u'volumeInfo']
|
||||
j = 0
|
||||
for volume in volumeInfo:
|
||||
new_row[u'diskVolumeReports.volumeInfo.{0}.volumeId'.format(j)] = volume[u'volumeId']
|
||||
new_row[u'diskVolumeReports.volumeInfo.{0}.storageFree'.format(j)] = volume[u'storageFree']
|
||||
new_row[u'diskVolumeReports.volumeInfo.{0}.storageTotal'.format(j)] = volume[u'storageTotal']
|
||||
j += 1
|
||||
if i < lenSRFR:
|
||||
new_row[u'systemRamFreeReports.reportTime'] = systemRamFreeReports[i][u'reportTime']
|
||||
new_row[u'systenRamFreeReports.systemRamFreeInfo'] = u','.join([str(x) for x in systemRamFreeReports[i][u'systemRamFreeInfo']])
|
||||
addRowTitlesToCSVfile(new_row, csvRows, titles)
|
||||
if sortHeaders:
|
||||
sortCSVTitles([u'deviceId',], titles)
|
||||
writeCSVfile(csvRows, titles, u'CrOS', todrive)
|
||||
@@ -12635,7 +12678,7 @@ def ProcessGAMCommand(args):
|
||||
elif argument == u'group':
|
||||
doGetGroupInfo()
|
||||
elif argument == u'member':
|
||||
doGetMemberInfo()
|
||||
doGetMemberInfo()
|
||||
elif argument in [u'nickname', u'alias']:
|
||||
doGetAliasInfo()
|
||||
elif argument == u'instance':
|
||||
|
||||
@@ -482,8 +482,10 @@ CROS_ARGUMENT_TO_PROPERTY_MAP = {
|
||||
u'asset': [u'annotatedAssetId',],
|
||||
u'assetid': [u'annotatedAssetId',],
|
||||
u'bootmode': [u'bootMode',],
|
||||
u'cpustatusreports': [u'cpuStatusReports',],
|
||||
u'devicefiles': [u'deviceFiles',],
|
||||
u'deviceid': [u'deviceId',],
|
||||
u'diskvolumereports': [u'diskVolumeReports',],
|
||||
u'ethernetmacaddress': [u'ethernetMacAddress',],
|
||||
u'firmwareversion': [u'firmwareVersion',],
|
||||
u'lastenrollmenttime': [u'lastEnrollmentTime',],
|
||||
@@ -503,6 +505,8 @@ CROS_ARGUMENT_TO_PROPERTY_MAP = {
|
||||
u'serialnumber': [u'serialNumber',],
|
||||
u'status': [u'status',],
|
||||
u'supportenddate': [u'supportEndDate',],
|
||||
u'systemramtotal': [u'systemRamTotal',],
|
||||
u'systemramfreereports': [u'systemRamFreeReports',],
|
||||
u'tag': [u'annotatedAssetId',],
|
||||
u'timeranges': [u'activeTimeRanges.activeTime', u'activeTimeRanges.date'],
|
||||
u'times': [u'activeTimeRanges.activeTime', u'activeTimeRanges.date'],
|
||||
@@ -531,6 +535,7 @@ CROS_SCALAR_PROPERTY_PRINT_ORDER = [
|
||||
u'meid',
|
||||
u'ethernetMacAddress',
|
||||
u'macAddress',
|
||||
u'systemRamTotal',
|
||||
u'lastEnrollmentTime',
|
||||
u'orderNumber',
|
||||
u'supportEndDate',
|
||||
@@ -541,6 +546,10 @@ CROS_SCALAR_PROPERTY_PRINT_ORDER = [
|
||||
CROS_RECENT_USERS_ARGUMENTS = [u'recentusers', u'users']
|
||||
CROS_ACTIVE_TIME_RANGES_ARGUMENTS = [u'timeranges', u'activetimeranges', u'times']
|
||||
CROS_DEVICE_FILES_ARGUMENTS = [u'devicefiles', u'files']
|
||||
CROS_CPU_STATUS_REPORTS_ARGUMENTS = [u'cpustatusreports',]
|
||||
CROS_DISK_VOLUME_REPORTS_ARGUMENTS = [u'diskvolumereports',]
|
||||
CROS_SYSTEM_RAM_FREE_REPORTS_ARGUMENTS = [u'systemramfreereports',]
|
||||
CROS_LISTS_ARGUMENTS = CROS_ACTIVE_TIME_RANGES_ARGUMENTS+CROS_RECENT_USERS_ARGUMENTS+CROS_DEVICE_FILES_ARGUMENTS+CROS_CPU_STATUS_REPORTS_ARGUMENTS+CROS_DISK_VOLUME_REPORTS_ARGUMENTS+CROS_SYSTEM_RAM_FREE_REPORTS_ARGUMENTS
|
||||
CROS_START_ARGUMENTS = [u'start', u'startdate', u'oldestdate']
|
||||
CROS_END_ARGUMENTS = [u'end', u'enddate']
|
||||
|
||||
|
||||
Reference in New Issue
Block a user