From dc93503625f4615cd8c6e3882f3810b8c4f9c51e Mon Sep 17 00:00:00 2001 From: Jay Lee Date: Wed, 22 Dec 2021 09:52:48 -0500 Subject: [PATCH] CrOS Telemetry API --- src/gam/__init__.py | 9 +++- src/gam/gapi/chromemanagement.py | 74 ++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/src/gam/__init__.py b/src/gam/__init__.py index 3d2ec7fa..98cad6e0 100755 --- a/src/gam/__init__.py +++ b/src/gam/__init__.py @@ -10479,9 +10479,10 @@ OAUTH2_SCOPES = [ 'scopes': 'https://www.googleapis.com/auth/admin.directory.device.chromebrowsers', }, { - 'name': 'Chrome Management API - read only', + 'name': 'Chrome Management API - read only (2 scopes)', 'subscope': [], - 'scopes': ['https://www.googleapis.com/auth/chrome.management.reports.readonly'], + 'scopes': ['https://www.googleapis.com/auth/chrome.management.reports.readonly', + 'https://www.googleapis.com/auth/chrome.management.telemetry.readonly'], }, { 'name': 'Chrome Policy API', @@ -11667,6 +11668,8 @@ def ProcessGAMCommand(args): gapi_cloudidentity_groups.print_() elif argument == 'devices': gapi_cloudidentity_devices.print_() + elif argument == 'crostelemetry': + gapi_chromemanagement.printShowCrosTelemetry() elif argument in ['groupmembers', 'groupsmembers']: gapi_directory_groups.print_members() elif argument in ['cigroupmembers', 'cigroupsmembers']: @@ -11775,6 +11778,8 @@ def ProcessGAMCommand(args): gapi_chromepolicy.printshow_schemas() elif argument in ['chromepolicy', 'chromepolicies']: gapi_chromepolicy.printshow_policies() + elif argument == 'crostelemetry': + gapi_chromemanagement.printShowCrosTelemetry(True) else: controlflow.invalid_argument_exit(argument, 'gam show') sys.exit(0) diff --git a/src/gam/gapi/chromemanagement.py b/src/gam/gapi/chromemanagement.py index e1537c59..59b79558 100644 --- a/src/gam/gapi/chromemanagement.py +++ b/src/gam/gapi/chromemanagement.py @@ -9,6 +9,7 @@ from gam.var import YYYYMMDD_FORMAT from gam import controlflow from gam import display from gam import gapi +from gam import utils from gam.gapi.directory import orgunits as gapi_directory_orgunits from gam.gapi.directory.cros import _getFilterDate @@ -201,6 +202,79 @@ def printAppDevices(): display.write_csv_file(csvRows, titles, 'Chrome Installed Application Devices', todrive) +def printShowCrosTelemetry(show=False): + cm = build() + parent = _get_customerid() + todrive = False + filter_ = None + readMask = [] + diskpercentonly = False + supported_readmask_values = list(cm._rootDesc['schemas']['GoogleChromeManagementV1TelemetryDevice']['properties'].keys()) + supported_readmask_values.sort() + supported_readmask_map = {item.lower():item for item in supported_readmask_values} + listLimit = 0 + i = 3 + while i < len(sys.argv): + myarg = sys.argv[i].lower().replace('_', '') + if myarg == 'fields': + field_list = sys.argv[i+1].lower().split(',') + for field_item in field_list: + if field_item not in supported_readmask_map: + controlflow.expected_argument_exit('fields', + ', '.join(supported_readmask_values), + field_item) + else: + readMask.append(supported_readmask_map[field_item]) + i += 2 + elif myarg == 'filter': + filter_ = sys.argv[i+1] + i += 2 + elif myarg == 'todrive': + todrive = True + i += 1 + elif myarg == 'storagepercentonly': + diskpercentonly = True + i += 1 + else: + msg = f'{myarg} is not a valid argument to "gam print crostelemetry"' + controlflow.system_error_exit(3, msg) + if not readMask: + readMask = ','.join(supported_readmask_values) + else: + if 'deviceId' not in readMask: + readMask.append('deviceId') + readMask = ','.join(readMask) + gam.printGettingAllItems('Chrome Device Telemetry...', filter_) + page_message = gapi.got_total_items_msg('Chrome Device Telemetry', '...\n') + devices = gapi.get_all_pages(cm.customers().telemetry().devices(), + 'list', + 'devices', + page_message=page_message, + parent=parent, + filter=filter_, + readMask=readMask) + for device in devices: + if 'totalDiskBytes' in device.get('storageInfo', {}) and 'availableDiskBytes' in device.get('storageInfo', {}): + disk_avail = int(device['storageInfo']['availableDiskBytes']) + disk_size = int(device['storageInfo']['totalDiskBytes']) + if diskpercentonly: + device['storageInfo'] = {} + device['storageInfo']['percentDiskFree'] = int((disk_avail / disk_size) * 100) + device['storageInfo']['percentDiskUsed'] = 100 - device['storageInfo']['percentDiskFree'] + if show: + for device in devices: + display.print_json(device) + print() + print() + else: + csvRows = [] + titles = [] + for device in devices: + display.add_row_titles_to_csv_file(utils.flatten_json(device), + csvRows, titles) + display.write_csv_file(csvRows, titles, 'Telemetry Devices', todrive) + + CHROME_VERSIONS_TITLES = [ 'version', 'count', 'channel', 'deviceOsVersion', 'system' ]