mirror of
https://github.com/GAM-team/GAM.git
synced 2026-07-04 21: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|
|
annotatedlocation|location|
|
||||||
annotateduser|user|
|
annotateduser|user|
|
||||||
bootmode|
|
bootmode|
|
||||||
|
cpustatusreports|
|
||||||
devicefiles|
|
devicefiles|
|
||||||
deviceid|
|
deviceid|
|
||||||
|
diskvolumereports|
|
||||||
ethernetmacaddress|
|
ethernetmacaddress|
|
||||||
firmwareversion|
|
firmwareversion|
|
||||||
lastenrollmenttime|
|
lastenrollmenttime|
|
||||||
@@ -265,8 +267,18 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
status|
|
status|
|
||||||
supportenddate|
|
supportenddate|
|
||||||
tpmversioninfo|
|
tpmversioninfo|
|
||||||
|
systemramtotal|
|
||||||
|
systemramfreereports|
|
||||||
willautorenew
|
willautorenew
|
||||||
|
|
||||||
|
<CrOSListFieldName> ::=
|
||||||
|
activetimeranges|timeranges|
|
||||||
|
cpustatusreports|
|
||||||
|
devicefiles|
|
||||||
|
diskvolumereports|
|
||||||
|
recentusers|
|
||||||
|
systemramfreereports
|
||||||
|
|
||||||
<CrOSOrderByFieldName> ::=
|
<CrOSOrderByFieldName> ::=
|
||||||
lastsync|location|notes|serialnumber|status|supportenddate|user
|
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>]
|
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>] [downloadfile latest|<Time>] [targetfolder <FilePath>]
|
||||||
|
|
||||||
gam print cros [todrive] [(query <QueryCrOS>)|(queries <QueryCrOSList>)] [limittoou <OrgUnitItem>]
|
gam print cros [todrive] [(query <QueryCrOS>)|(queries <QueryCrOSList>)] [limittoou <OrgUnitItem>]
|
||||||
[orderby <CrOSOrderByFieldName> [ascending|descending]] [nolists|recentusers|timeranges|devicefiles] [listlimit <Number>] [start <Date>] [end <Date>]
|
[orderby <CrOSOrderByFieldName> [ascending|descending]] [nolists|<CrOSListFieldName>*] [listlimit <Number>] [start <Date>] [end <Date>]
|
||||||
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>]
|
[basic|full|allfields] <CrOSFieldName>* [fields <CrOSFieldNameList>] [sortheaders]
|
||||||
gam <CrOSTypeEntity> print
|
gam <CrOSTypeEntity> print
|
||||||
|
|
||||||
Summary of printing:
|
Summary of printing:
|
||||||
@@ -915,22 +927,14 @@ Prints no header row and deviceId for specified CrOS devices.
|
|||||||
gam print cros ... basic|full
|
gam print cros ... basic|full
|
||||||
Prints a header row and selected fields for specified CrOS devices.
|
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 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,
|
The allfields/full arguments output all column headers including six headers: activeTimeRanges, cpuStatusReports, deviceFiles, diskVolumeReports, recentUsers and systemRamFreeReports
|
||||||
that repeat with two/four/two subvalues each, yielding a large number of columns that make the output hard to process.
|
that repeat with multiple 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.
|
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.
|
||||||
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 listlimit <Number> argument limits the number of repetitions to <Number>; if not specified or <Number> equals zero, there is no limit.
|
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>]
|
gam print crosactivity [todrive] [(query <QueryCrOS>)|(queries <QueryCrOSList>)] [limittoou <OrgUnitItem>]
|
||||||
[recentusers] [timeranges] [both] [devicefiles] [all] [listlimit <Number>] [start <Date>] [end <Date>] [delimiter <Character>]
|
[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 create group <EmailAddress> <GroupAttributes>*
|
||||||
gam update group <GroupItem> [admincreated <Boolean>] [email <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> delete|remove [owner|manager|member] <UserTypeEntity>
|
||||||
gam update group <GroupItem> sync [owner|manager|member] [notsuspended|suspended] <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] <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 update group <GroupItem> clear [member] [manager] [owner] [notsuspended|suspended]
|
||||||
gam delete group <GroupItem>
|
gam delete group <GroupItem>
|
||||||
gam info group <GroupItem> [nousers] [noaliases] [groups]
|
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]
|
[members|memberscount] [managers|managerscount] [owners|ownerscount]
|
||||||
[delimiter <Character>] [sortheaders]
|
[delimiter <Character>] [sortheaders]
|
||||||
|
|
||||||
|
gam info member <UserItem> <GroupItem>
|
||||||
gam print group-members|groups-members [todrive]
|
gam print group-members|groups-members [todrive]
|
||||||
([domain <DomainName>] ([member <UserItem>]|[query <QueryGroup>]))|[group|group_ns|group_susp <GroupItem>] [notsuspended|suspended]
|
([domain <DomainName>] ([member <UserItem>]|[query <QueryGroup>]))|[group|group_ns|group_susp <GroupItem>] [notsuspended|suspended]
|
||||||
[roles <GroupRoleList>] [membernames] [fields <MembersFieldNameList>]
|
[roles <GroupRoleList>] [membernames] [fields <MembersFieldNameList>]
|
||||||
@@ -1027,10 +1032,6 @@ gam print users [todrive]
|
|||||||
[allfields|basic|full | ((<UserFieldName>* | fields <UserFieldNameList>) [schemas|custom all|<SchemaNameList>])]
|
[allfields|basic|full | ((<UserFieldName>* | fields <UserFieldNameList>) [schemas|custom all|<SchemaNameList>])]
|
||||||
[delimiter <Character>] [sortheaders]
|
[delimiter <Character>] [sortheaders]
|
||||||
|
|
||||||
Print no header row and primaryEmail for specified users.
|
|
||||||
|
|
||||||
gam <UserTypeEntity> print
|
|
||||||
|
|
||||||
gam create verify|verification <DomainName>
|
gam create verify|verification <DomainName>
|
||||||
gam update verify|verification <DomainName> cname|txt|text|site|file
|
gam update verify|verification <DomainName> cname|txt|text|site|file
|
||||||
gam info verify|verification
|
gam info verify|verification
|
||||||
|
|||||||
207
src/gam.py
207
src/gam.py
@@ -8548,6 +8548,8 @@ def doUpdateGroup():
|
|||||||
role, users_email, delivery = _getRoleAndUsers()
|
role, users_email, delivery = _getRoleAndUsers()
|
||||||
group = checkGroupExists(cd, group)
|
group = checkGroupExists(cd, group)
|
||||||
if group:
|
if group:
|
||||||
|
if not role and not delivery:
|
||||||
|
role = ROLE_MEMBER
|
||||||
if len(users_email) > 1:
|
if len(users_email) > 1:
|
||||||
sys.stderr.write(u'Group: {0}, Will update {1} {2}s.\n'.format(group, len(users_email), role))
|
sys.stderr.write(u'Group: {0}, Will update {1} {2}s.\n'.format(group, len(users_email), role))
|
||||||
for user_email in users_email:
|
for user_email in users_email:
|
||||||
@@ -8557,7 +8559,6 @@ def doUpdateGroup():
|
|||||||
if delivery:
|
if delivery:
|
||||||
item.append(delivery)
|
item.append(delivery)
|
||||||
item.append(user_email)
|
item.append(user_email)
|
||||||
print item
|
|
||||||
items.append(item)
|
items.append(item)
|
||||||
else:
|
else:
|
||||||
body = {}
|
body = {}
|
||||||
@@ -9447,15 +9448,15 @@ def _filterTimeRanges(activeTimeRanges, startDate, endDate):
|
|||||||
filteredTimeRanges.append(timeRange)
|
filteredTimeRanges.append(timeRange)
|
||||||
return filteredTimeRanges
|
return filteredTimeRanges
|
||||||
|
|
||||||
def _filterDeviceFiles(deviceFiles, startTime, endTime):
|
def _filterCreateReportTime(items, timeField, startTime, endTime):
|
||||||
if startTime is None and endTime is None:
|
if startTime is None and endTime is None:
|
||||||
return deviceFiles
|
return items
|
||||||
filteredDeviceFiles = []
|
filteredItems = []
|
||||||
for deviceFile in deviceFiles:
|
for item in items:
|
||||||
createTime = datetime.datetime.strptime(deviceFile[u'createTime'], u'%Y-%m-%dT%H:%M:%S.%fZ')
|
timeValue = datetime.datetime.strptime(item[timeField], u'%Y-%m-%dT%H:%M:%S.%fZ')
|
||||||
if ((startTime is None) or (createTime >= startTime)) and ((endTime is None) or (createTime <= endTime)):
|
if ((startTime is None) or (timeValue >= startTime)) and ((endTime is None) or (timeValue <= endTime)):
|
||||||
filteredDeviceFiles.append(deviceFile)
|
filteredItems.append(item)
|
||||||
return filteredDeviceFiles
|
return filteredItems
|
||||||
|
|
||||||
def _getFilterDate(dateStr):
|
def _getFilterDate(dateStr):
|
||||||
return datetime.datetime.strptime(dateStr, YYYYMMDD_FORMAT)
|
return datetime.datetime.strptime(dateStr, YYYYMMDD_FORMAT)
|
||||||
@@ -9563,7 +9564,7 @@ def doGetCrosInfo():
|
|||||||
for recentUser in recentUsers[:min(lenRU, listLimit or lenRU)]:
|
for recentUser in recentUsers[:min(lenRU, listLimit or lenRU)]:
|
||||||
print u' type: {0}'.format(recentUser[u'type'])
|
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']))
|
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)
|
lenDF = len(deviceFiles)
|
||||||
if lenDF:
|
if lenDF:
|
||||||
print u' deviceFiles'
|
print u' deviceFiles'
|
||||||
@@ -9589,6 +9590,34 @@ def doGetCrosInfo():
|
|||||||
print u'Downloaded: {0}'.format(downloadfilename)
|
print u'Downloaded: {0}'.format(downloadfilename)
|
||||||
elif downloadfile:
|
elif downloadfile:
|
||||||
print u'ERROR: no files to download.'
|
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():
|
def doGetMobileInfo():
|
||||||
cd = buildGAPIObject(u'directory')
|
cd = buildGAPIObject(u'directory')
|
||||||
@@ -10253,6 +10282,13 @@ def send_email(msg_subj, msg_txt, msg_rcpt=None):
|
|||||||
callGAPI(gmail.users().messages(), u'send',
|
callGAPI(gmail.users().messages(), u'send',
|
||||||
userId=userId, body={u'raw': base64.urlsafe_b64encode(msg.as_string())})
|
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
|
# Write a CSV file
|
||||||
def addTitleToCSVfile(title, titles):
|
def addTitleToCSVfile(title, titles):
|
||||||
titles.append(title)
|
titles.append(title)
|
||||||
@@ -10322,11 +10358,6 @@ def writeCSVfile(csvRows, titles, list_type, todrive):
|
|||||||
except IOError as e:
|
except IOError as e:
|
||||||
systemErrorExit(6, e)
|
systemErrorExit(6, e)
|
||||||
if todrive:
|
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')
|
admin_email = _getValueFromOAuth(u'email')
|
||||||
_, drive = buildDrive3GAPIObject(admin_email)
|
_, drive = buildDrive3GAPIObject(admin_email)
|
||||||
if not drive:
|
if not drive:
|
||||||
@@ -10337,10 +10368,14 @@ gam user %s check serviceaccount
|
|||||||
and follow recommend steps to authorize GAM for Drive access.''' % (admin_email)
|
and follow recommend steps to authorize GAM for Drive access.''' % (admin_email)
|
||||||
sys.exit(5)
|
sys.exit(5)
|
||||||
result = callGAPI(drive.about(), u'get', fields=u'maxImportSizes')
|
result = callGAPI(drive.about(), u'get', fields=u'maxImportSizes')
|
||||||
max_sheet_bytes = int(result[u'maxImportSizes'][u'application/vnd.google-apps.spreadsheet'])
|
columns = len(titles)
|
||||||
if cell_count > 2000000 or columns > 256 or data_size > max_sheet_bytes:
|
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)
|
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
||||||
mimeType = u'text/csv'
|
mimeType = u'text/csv'
|
||||||
|
else:
|
||||||
|
mimeType = MIMETYPE_GA_SPREADSHEET
|
||||||
body = {u'description': u' '.join(sys.argv),
|
body = {u'description': u' '.join(sys.argv),
|
||||||
u'name': u'%s - %s' % (GC_Values[GC_DOMAIN], list_type),
|
u'name': u'%s - %s' % (GC_Values[GC_DOMAIN], list_type),
|
||||||
u'mimeType': mimeType}
|
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)]])
|
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)
|
csvRows.append(row)
|
||||||
if selectDeviceFiles:
|
if selectDeviceFiles:
|
||||||
deviceFiles = _filterDeviceFiles(cros.get(u'deviceFiles', []), startDate, endDate)
|
deviceFiles = _filterCreateReportTime(cros.get(u'deviceFiles', []), u'createTime', startDate, endDate)
|
||||||
lenDF = len(deviceFiles)
|
lenDF = len(deviceFiles)
|
||||||
for deviceFile in deviceFiles[:min(lenDF, listLimit or lenDF)]:
|
for deviceFile in deviceFiles[:min(lenDF, listLimit or lenDF)]:
|
||||||
new_row = row.copy()
|
new_row = row.copy()
|
||||||
@@ -11402,6 +11437,20 @@ def _checkTPMVulnerability(cros):
|
|||||||
return cros
|
return cros
|
||||||
|
|
||||||
def doPrintCrosDevices():
|
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')
|
cd = buildGAPIObject(u'directory')
|
||||||
todrive = False
|
todrive = False
|
||||||
fieldsList = []
|
fieldsList = []
|
||||||
@@ -11409,11 +11458,10 @@ def doPrintCrosDevices():
|
|||||||
titles = []
|
titles = []
|
||||||
csvRows = []
|
csvRows = []
|
||||||
addFieldToCSVfile(u'deviceid', CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
addFieldToCSVfile(u'deviceid', CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
||||||
sortHeaders = False
|
|
||||||
projection = orderBy = sortOrder = orgUnitPath = None
|
projection = orderBy = sortOrder = orgUnitPath = None
|
||||||
queries = [None]
|
queries = [None]
|
||||||
noLists = False
|
noLists = sortHeaders = False
|
||||||
selectActiveTimeRanges = selectDeviceFiles = selectRecentUsers = False
|
selectedLists = {}
|
||||||
startDate = endDate = None
|
startDate = endDate = None
|
||||||
listLimit = 0
|
listLimit = 0
|
||||||
i = 3
|
i = 3
|
||||||
@@ -11430,28 +11478,7 @@ def doPrintCrosDevices():
|
|||||||
i += 1
|
i += 1
|
||||||
elif myarg == u'nolists':
|
elif myarg == u'nolists':
|
||||||
noLists = True
|
noLists = True
|
||||||
selectActiveTimeRanges = selectDeviceFiles = selectRecentUsers = False
|
selectedLists = {}
|
||||||
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')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif myarg in CROS_START_ARGUMENTS:
|
elif myarg in CROS_START_ARGUMENTS:
|
||||||
startDate = _getFilterDate(sys.argv[i+1])
|
startDate = _getFilterDate(sys.argv[i+1])
|
||||||
@@ -11494,36 +11521,34 @@ def doPrintCrosDevices():
|
|||||||
sortHeaders = True
|
sortHeaders = True
|
||||||
fieldsList = []
|
fieldsList = []
|
||||||
i += 1
|
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:
|
elif myarg in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
||||||
if not fieldsList:
|
addFieldToFieldsList(myarg, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList)
|
||||||
fieldsList = [u'deviceId',]
|
|
||||||
addFieldToCSVfile(myarg, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
|
||||||
i += 1
|
i += 1
|
||||||
elif myarg == u'fields':
|
elif myarg == u'fields':
|
||||||
if not fieldsList:
|
|
||||||
fieldsList = [u'deviceId',]
|
|
||||||
fieldNameList = sys.argv[i+1]
|
fieldNameList = sys.argv[i+1]
|
||||||
for field in fieldNameList.lower().replace(u',', u' ').split():
|
for field in fieldNameList.lower().replace(u',', u' ').split():
|
||||||
if field in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
if field in CROS_LISTS_ARGUMENTS:
|
||||||
addFieldToCSVfile(field, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList, fieldsTitles, titles)
|
_getSelectedLists(field)
|
||||||
if field in CROS_ACTIVE_TIME_RANGES_ARGUMENTS:
|
elif field in CROS_ARGUMENT_TO_PROPERTY_MAP:
|
||||||
projection = u'FULL'
|
addFieldToFieldsList(field, CROS_ARGUMENT_TO_PROPERTY_MAP, fieldsList)
|
||||||
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
|
|
||||||
else:
|
else:
|
||||||
systemErrorExit(2, '%s is not a valid argument for "gam print cros fields"' % field)
|
systemErrorExit(2, '%s is not a valid argument for "gam print cros fields"' % field)
|
||||||
i += 2
|
i += 2
|
||||||
else:
|
else:
|
||||||
systemErrorExit(2, '%s is not a valid argument for "gam print cros"' % sys.argv[i])
|
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:
|
if fieldsList:
|
||||||
|
fieldsList.append(u'deviceId')
|
||||||
fields = u'nextPageToken,chromeosdevices({0})'.format(u','.join(set(fieldsList))).replace(u'.', u'/')
|
fields = u'nextPageToken,chromeosdevices({0})'.format(u','.join(set(fieldsList))).replace(u'.', u'/')
|
||||||
else:
|
else:
|
||||||
fields = None
|
fields = None
|
||||||
@@ -11535,38 +11560,40 @@ def doPrintCrosDevices():
|
|||||||
orderBy=orderBy, sortOrder=sortOrder, fields=fields, maxResults=GC_Values[GC_DEVICE_MAX_RESULTS])
|
orderBy=orderBy, sortOrder=sortOrder, fields=fields, maxResults=GC_Values[GC_DEVICE_MAX_RESULTS])
|
||||||
for cros in all_cros:
|
for cros in all_cros:
|
||||||
cros = _checkTPMVulnerability(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:
|
for cros in all_cros:
|
||||||
if u'notes' in cros:
|
if u'notes' in cros:
|
||||||
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
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)
|
addRowTitlesToCSVfile(flatten_json(cros, listLimit=listLimit), csvRows, titles)
|
||||||
else:
|
continue
|
||||||
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:
|
for cros in all_cros:
|
||||||
if u'notes' in cros:
|
if u'notes' in cros:
|
||||||
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
cros[u'notes'] = cros[u'notes'].replace(u'\n', u'\\n')
|
||||||
row = {}
|
row = {}
|
||||||
for attrib in cros:
|
for attrib in cros:
|
||||||
if attrib not in [u'kind', u'etag', u'recentUsers', u'activeTimeRanges', u'deviceFiles']:
|
if attrib not in set([u'kind', u'etag', u'tpmVersionInfo', u'recentUsers', u'activeTimeRanges',
|
||||||
if attrib not in titles:
|
u'deviceFiles', u'cpuStatusReports', u'diskVolumeReports', u'systemRamFreeReports']):
|
||||||
titles.append(attrib)
|
|
||||||
row[attrib] = cros[attrib]
|
row[attrib] = cros[attrib]
|
||||||
activeTimeRanges = _filterTimeRanges(cros.get(u'activeTimeRanges', []), startDate, endDate) if selectActiveTimeRanges else []
|
activeTimeRanges = _filterTimeRanges(cros.get(u'activeTimeRanges', []) if selectedLists.get(u'activeTimeRanges') else [], startDate, endDate)
|
||||||
recentUsers = cros.get(u'recentUsers', []) if selectRecentUsers else []
|
recentUsers = cros.get(u'recentUsers', []) if selectedLists.get(u'recentUsers') else []
|
||||||
deviceFiles = _filterDeviceFiles(cros.get(u'deviceFiles', []), startDate, endDate) if selectDeviceFiles else []
|
deviceFiles = _filterCreateReportTime(cros.get(u'deviceFiles', []) if selectedLists.get(u'deviceFiles') else [], u'createTime', startDate, endDate)
|
||||||
if noLists or (not activeTimeRanges and not recentUsers and not deviceFiles):
|
cpuStatusReports = _filterCreateReportTime(cros.get(u'cpuStatusReports', []) if selectedLists.get(u'cpuStatusReports') else [], u'reportTime', startDate, endDate)
|
||||||
csvRows.append(row)
|
diskVolumeReports = cros.get(u'diskVolumeReports', []) if selectedLists.get(u'diskVolumeReports') else []
|
||||||
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)
|
lenATR = len(activeTimeRanges)
|
||||||
lenRU = len(recentUsers)
|
lenRU = len(recentUsers)
|
||||||
lenDF = len(deviceFiles)
|
lenDF = len(deviceFiles)
|
||||||
for i in xrange(min(listLimit, max(lenATR, lenRU)) if listLimit else max(lenATR, lenRU, lenDF)):
|
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()
|
new_row = row.copy()
|
||||||
if i < lenATR:
|
if i < lenATR:
|
||||||
new_row[u'activeTimeRanges.date'] = activeTimeRanges[i][u'date']
|
new_row[u'activeTimeRanges.date'] = activeTimeRanges[i][u'date']
|
||||||
@@ -11579,7 +11606,23 @@ def doPrintCrosDevices():
|
|||||||
if i < lenDF:
|
if i < lenDF:
|
||||||
new_row[u'deviceFiles.type'] = deviceFiles[i][u'type']
|
new_row[u'deviceFiles.type'] = deviceFiles[i][u'type']
|
||||||
new_row[u'deviceFiles.createTime'] = deviceFiles[i][u'createTime']
|
new_row[u'deviceFiles.createTime'] = deviceFiles[i][u'createTime']
|
||||||
csvRows.append(new_row)
|
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:
|
if sortHeaders:
|
||||||
sortCSVTitles([u'deviceId',], titles)
|
sortCSVTitles([u'deviceId',], titles)
|
||||||
writeCSVfile(csvRows, titles, u'CrOS', todrive)
|
writeCSVfile(csvRows, titles, u'CrOS', todrive)
|
||||||
|
|||||||
@@ -482,8 +482,10 @@ CROS_ARGUMENT_TO_PROPERTY_MAP = {
|
|||||||
u'asset': [u'annotatedAssetId',],
|
u'asset': [u'annotatedAssetId',],
|
||||||
u'assetid': [u'annotatedAssetId',],
|
u'assetid': [u'annotatedAssetId',],
|
||||||
u'bootmode': [u'bootMode',],
|
u'bootmode': [u'bootMode',],
|
||||||
|
u'cpustatusreports': [u'cpuStatusReports',],
|
||||||
u'devicefiles': [u'deviceFiles',],
|
u'devicefiles': [u'deviceFiles',],
|
||||||
u'deviceid': [u'deviceId',],
|
u'deviceid': [u'deviceId',],
|
||||||
|
u'diskvolumereports': [u'diskVolumeReports',],
|
||||||
u'ethernetmacaddress': [u'ethernetMacAddress',],
|
u'ethernetmacaddress': [u'ethernetMacAddress',],
|
||||||
u'firmwareversion': [u'firmwareVersion',],
|
u'firmwareversion': [u'firmwareVersion',],
|
||||||
u'lastenrollmenttime': [u'lastEnrollmentTime',],
|
u'lastenrollmenttime': [u'lastEnrollmentTime',],
|
||||||
@@ -503,6 +505,8 @@ CROS_ARGUMENT_TO_PROPERTY_MAP = {
|
|||||||
u'serialnumber': [u'serialNumber',],
|
u'serialnumber': [u'serialNumber',],
|
||||||
u'status': [u'status',],
|
u'status': [u'status',],
|
||||||
u'supportenddate': [u'supportEndDate',],
|
u'supportenddate': [u'supportEndDate',],
|
||||||
|
u'systemramtotal': [u'systemRamTotal',],
|
||||||
|
u'systemramfreereports': [u'systemRamFreeReports',],
|
||||||
u'tag': [u'annotatedAssetId',],
|
u'tag': [u'annotatedAssetId',],
|
||||||
u'timeranges': [u'activeTimeRanges.activeTime', u'activeTimeRanges.date'],
|
u'timeranges': [u'activeTimeRanges.activeTime', u'activeTimeRanges.date'],
|
||||||
u'times': [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'meid',
|
||||||
u'ethernetMacAddress',
|
u'ethernetMacAddress',
|
||||||
u'macAddress',
|
u'macAddress',
|
||||||
|
u'systemRamTotal',
|
||||||
u'lastEnrollmentTime',
|
u'lastEnrollmentTime',
|
||||||
u'orderNumber',
|
u'orderNumber',
|
||||||
u'supportEndDate',
|
u'supportEndDate',
|
||||||
@@ -541,6 +546,10 @@ CROS_SCALAR_PROPERTY_PRINT_ORDER = [
|
|||||||
CROS_RECENT_USERS_ARGUMENTS = [u'recentusers', u'users']
|
CROS_RECENT_USERS_ARGUMENTS = [u'recentusers', u'users']
|
||||||
CROS_ACTIVE_TIME_RANGES_ARGUMENTS = [u'timeranges', u'activetimeranges', u'times']
|
CROS_ACTIVE_TIME_RANGES_ARGUMENTS = [u'timeranges', u'activetimeranges', u'times']
|
||||||
CROS_DEVICE_FILES_ARGUMENTS = [u'devicefiles', u'files']
|
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_START_ARGUMENTS = [u'start', u'startdate', u'oldestdate']
|
||||||
CROS_END_ARGUMENTS = [u'end', u'enddate']
|
CROS_END_ARGUMENTS = [u'end', u'enddate']
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user