def print_models(): '''gam print printermodels''' cdapi = gapi_directory.build() parent = _get_customerid() filter_ = None todrive = False titles = [] rows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'filter': filter_ = sys.argv[i+1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print printermodels') models = gapi.get_all_pages(cdapi.customers().chrome().printers(), 'listPrinterModels', items='printerModels', parent=parent, pageSize=10000, filter=filter_) for model in models: row = {} for key, val in model.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'Printer Models', todrive)
def _getRoleAndUsers(): checkSuspended = None role = ROLE_MEMBER expireTime = None i = 5 if sys.argv[i].lower() in GROUP_ROLES_MAP: role = GROUP_ROLES_MAP[sys.argv[i].lower()] i += 1 if sys.argv[i].lower() in ['suspended', 'notsuspended']: checkSuspended = sys.argv[i].lower() == 'suspended' i += 1 if sys.argv[i].lower() in ['expire', 'expires']: if role != ROLE_MEMBER: controlflow.invalid_argument_exit(sys.argv[i], f'role {role}') expireTime = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 if sys.argv[i].lower() in usergroup_types: users_email = gam.getUsersToModify(entity_type=sys.argv[i].lower(), entity=sys.argv[i + 1], checkSuspended=checkSuspended, groupUserMembersOnly=False) else: users_email = [ gam.normalizeEmailAddressOrUID(sys.argv[i], checkForCustomerId=True) ] return (role, expireTime, users_email)
def create(): ci = gapi_cloudidentity.build_dwd() customer = _get_device_customerid() device_types = gapi.get_enum_values_minus_unspecified( ci._rootDesc['schemas']['GoogleAppsCloudidentityDevicesV1Device'] ['properties']['deviceType']['enum']) body = {'deviceType': '', 'serialNumber': ''} i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'serialnumber': body['serialNumber'] = sys.argv[i + 1] i += 2 elif myarg == 'devicetype': body['deviceType'] = sys.argv[i + 1].upper() if body['deviceType'] not in device_types: controlflow.expected_argument_exit('device_type', ', '.join(device_types), sys.argv[i + 1]) i += 2 elif myarg in {'assettag', 'assetid'}: body['assetTag'] = sys.argv[i + 1] i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam create device') if not body['serialNumber'] or not body['deviceType']: controlflow.system_error_exit( 3, 'serial_number and device_type are required arguments for "gam create device".' ) result = gapi.call(ci.devices(), 'create', customer=customer, body=body) print(f'Created device {result["response"]["name"]}')
def _generic_action(action, device_user=False): ci = gapi_cloudidentity.build_dwd() customer = f'customers/{GC_Values[GC_CUSTOMER_ID]}' # bah, inconsistencies in API if action == 'delete': kwargs = {'customer': customer} else: kwargs = {'body': {'customer': customer}} if device_user: endpoint = ci.devices().deviceUsers() else: endpoint = ci.devices() name = None i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') # The API calls it "name" but GAM will expose as "id" to avoid admin confusion. if myarg == 'id': name = sys.argv[i+1] if not name.startswith('devices/'): name = f'devices/{name}' i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], f'gam {action} device') if not name: controlflow.system_error_exit(3, f'id is a required argument for "gam {action} device".') op = gapi.call(endpoint, action, name=name, **kwargs) print(op)
def print_(): cd = gapi_directory.build() todrive = False titles = [ 'domainAliasName', ] csvRows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print domainaliases') results = gapi.call(cd.domainAliases(), 'list', customer=GC_Values[GC_CUSTOMER_ID]) for domainAlias in results['domainAliases']: domainAlias_attributes = {} for attr in domainAlias: if attr in ['kind', 'etag']: continue if attr == 'creationTime': domainAlias[attr] = utils.formatTimestampYMDHMSF( domainAlias[attr]) if attr not in titles: titles.append(attr) domainAlias_attributes[attr] = domainAlias[attr] csvRows.append(domainAlias_attributes) display.write_csv_file(csvRows, titles, 'Domains', todrive)
def print_members(): chat = build() space = None todrive = False i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'space': space = sys.argv[i + 1] if space[:7] != 'spaces/': space = f'spaces/{space}' i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(myarg, 'gam print chatmembers') if not space: controlflow.system_error_exit(2, 'space <ChatSpace> is required.') try: results = gapi.get_all_pages(chat.spaces().members(), 'list', 'memberships', parent=space) except googleapiclient.errors.HttpError as err: _chat_error_handler(chat, err) members = [] titles = [] for result in results: member = utils.flatten_json(result) for key in member: if key not in titles: titles.append(key) members.append(utils.flatten_json(result)) display.write_csv_file(members, titles, 'Chat Members', todrive)
def update(): cd = gapi_directory.build() body = {} roleId = gam.getRoleId(sys.argv[3]) i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'privileges': getPrivileges(body, sys.argv[i + 1].upper(), 'update') i += 2 elif myarg == 'description': body['roleDescription'] = sys.argv[i + 1] i += 2 elif myarg == 'name': body['roleName'] = sys.argv[i + 1] i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam update adminrole') print(f'Updating role {roleId}') gapi.call(cd.roles(), 'patch', customer=GC_Values[GC_CUSTOMER_ID], roleId=roleId, body=body)
def addACL(function): calendarId, cal = buildCalendarDataGAPIObject(sys.argv[2]) if not cal: return myarg = sys.argv[4].lower().replace('_', '') if myarg not in CALENDAR_ACL_ROLES_MAP: controlflow.expected_argument_exit('Role', ', '.join(CALENDAR_ACL_ROLES_MAP), myarg) body = {'role': CALENDAR_ACL_ROLES_MAP[myarg]} i = _getCalendarACLScope(5, body) sendNotifications = True while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'sendnotifications': sendNotifications = gam.getBoolean(sys.argv[i + 1], myarg) i += 2 else: controlflow.invalid_argument_exit( sys.argv[i], f'gam calendar <email> {function.lower()}') print(f'Calendar: {calendarId}, {function} ACL: {formatACLRule(body)}') gapi.call(cal.acl(), 'insert', calendarId=calendarId, body=body, sendNotifications=sendNotifications)
def _getBuildingAttributes(args, body={}): i = 0 while i < len(args): myarg = args[i].lower().replace('_', '') if myarg == 'id': body['buildingId'] = args[i + 1] i += 2 elif myarg == 'name': body['buildingName'] = args[i + 1] i += 2 elif myarg in ['lat', 'latitude']: if 'coordinates' not in body: body['coordinates'] = {} body['coordinates']['latitude'] = args[i + 1] i += 2 elif myarg in ['long', 'lng', 'longitude']: if 'coordinates' not in body: body['coordinates'] = {} body['coordinates']['longitude'] = args[i + 1] i += 2 elif myarg == 'description': body['description'] = args[i + 1] i += 2 elif myarg == 'floors': body['floorNames'] = args[i + 1].split(',') i += 2 else: controlflow.invalid_argument_exit(myarg, 'gam create|update building') return body
def print_(): '''gam print userinvitations''' svc = gapi_cloudidentity.build('cloudidentity_beta') customer = _get_customerid() todrive = False titles = [] rows = [] filter_ = None i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'filter': filter_ = sys.argv[i + 1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print userinvitations') invitations = gapi.get_all_pages(svc.customers().userinvitations(), 'list', 'userInvitations', parent=customer, filter=filter_) for invitation in invitations: invitation['name'] = _reduce_name(invitation['name']) row = {} for key, val in invitation.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'User Invitations', todrive)
def print_(): '''gam print printers''' cdapi = gapi_directory.build() parent = _get_customerid() filter_ = None todrive = False titles = [] rows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'filter': filter_ = sys.argv[i+1] i += 2 elif myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print printermodels') printers = gapi.get_all_pages(cdapi.customers().chrome().printers(), 'list', items='printers', parent=parent, filter=filter_) for printer in printers: if 'orgUnitId' in printer: printer['orgUnitPath'] = gapi_directory_orgunits.orgunit_from_orgunitid( printer['orgUnitId'], cdapi) row = {} for key, val in printer.items(): if key not in titles: titles.append(key) row[key] = val rows.append(row) display.write_csv_file(rows, titles, 'Printers', todrive)
def print_(): cd = gapi_directory.build() todrive = False titles = [ 'roleId', 'roleName', 'roleDescription', 'isSuperAdminRole', 'isSystemRole' ] fields = f'nextPageToken,items({",".join(titles)})' csvRows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print adminroles') roles = gapi.get_all_pages(cd.roles(), 'list', 'items', customer=GC_Values[GC_CUSTOMER_ID], fields=fields) for role in roles: role_attrib = {} for key, value in list(role.items()): role_attrib[key] = value csvRows.append(role_attrib) display.write_csv_file(csvRows, titles, 'Admin Roles', todrive)
def doUpdateCustomer(): cd = gapi_directory.build() body = {} customer_id = _get_customerid() i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg in ADDRESS_FIELDS_ARGUMENT_MAP: body.setdefault('postalAddress', {}) arg = ADDRESS_FIELDS_ARGUMENT_MAP[myarg] body['postalAddress'][arg] = sys.argv[i + 1] i += 2 elif myarg in ['adminsecondaryemail', 'alternateemail']: body['alternateEmail'] = sys.argv[i + 1] i += 2 elif myarg in ['phone', 'phonenumber']: body['phoneNumber'] = sys.argv[i + 1] i += 2 elif myarg == 'language': body['language'] = sys.argv[i + 1] i += 2 else: controlflow.invalid_argument_exit(myarg, 'gam update customer') if not body: controlflow.system_error_exit( 2, 'no arguments specified for "gam ' 'update customer"') gapi.call(cd.customers(), 'patch', customerKey=customer_id, body=body) print('Updated customer')
def update(): cbcm = build() device_id = sys.argv[3] body = {'deviceId': device_id} i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg in attributes: body[attributes[myarg]] = sys.argv[i + 1] i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam update browser') browser = gapi.call(cbcm.chromebrowsers(), 'get', deviceId=device_id, customer=GC_Values[GC_CUSTOMER_ID], projection='BASIC', fields=attribute_fields) browser.update(body) result = gapi.call(cbcm.chromebrowsers(), 'update', deviceId=device_id, customer=GC_Values[GC_CUSTOMER_ID], body=browser, projection='BASIC', fields="deviceId") print(f'Updated browser {result["deviceId"]}')
def getHoldInfo(): v = buildGAPIObject() hold = sys.argv[3] matterId = None i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'matter': matterId = getMatterItem(v, sys.argv[i + 1]) holdId = convertHoldNameToID(v, hold, matterId) i += 2 else: controlflow.invalid_argument_exit(myarg, 'gam info hold') if not matterId: controlflow.system_error_exit( 3, 'you must specify a matter for the hold.') results = gapi.call(v.matters().holds(), 'get', matterId=matterId, holdId=holdId) cd = gam.buildGAPIObject('directory') if 'accounts' in results: account_type = 'group' if results['corpus'] == 'GROUPS' else 'user' for i in range(0, len(results['accounts'])): uid = f'uid:{results["accounts"][i]["accountId"]}' acct_email = gam.convertUIDtoEmailAddress(uid, cd, [account_type]) results['accounts'][i]['email'] = acct_email if 'orgUnit' in results: results['orgUnit']['orgUnitPath'] = gapi_directory_orgunits.info( results['orgUnit']['orgUnitId'], return_attrib='orgUnitPath') display.print_json(results)
def createMatter(): v = buildGAPIObject() matter_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') body = {'name': f'New Matter - {matter_time}'} collaborators = [] cd = None i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'name': body['name'] = sys.argv[i + 1] i += 2 elif myarg == 'description': body['description'] = sys.argv[i + 1] i += 2 elif myarg in ['collaborator', 'collaborators']: if not cd: cd = gam.buildGAPIObject('directory') collaborators.extend(validateCollaborators(sys.argv[i + 1], cd)) i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam create matter') matterId = gapi.call(v.matters(), 'create', body=body, fields='matterId')['matterId'] print(f'Created matter {matterId}') for collaborator in collaborators: print(f' adding collaborator {collaborator["email"]}') body = { 'matterPermission': { 'role': 'COLLABORATOR', 'accountId': collaborator['id'] } } gapi.call(v.matters(), 'addPermissions', matterId=matterId, body=body)
def getPrivileges(body, privs, action): all_privileges = gapi_directory_privileges.print_(return_only=True) if privs == 'ALL': body['rolePrivileges'] = [{ 'privilegeName': p['privilegeName'], 'serviceId': p['serviceId'] } for p in all_privileges] elif privs == 'ALL_OU': body['rolePrivileges'] = [{ 'privilegeName': p['privilegeName'], 'serviceId': p['serviceId'] } for p in all_privileges if p.get('isOuScopable')] else: body.setdefault('rolePrivileges', []) for priv in privs.split(','): for p in all_privileges: if priv == p['privilegeName']: body['rolePrivileges'].append({ 'privilegeName': p['privilegeName'], 'serviceId': p['serviceId'] }) break else: controlflow.invalid_argument_exit( priv, f'gam {action} adminrole privileges')
def _parse_action(action): kwargs = {} i = 3 name = sys.argv[i] if name == 'id': i += 1 name = sys.argv[i] i += 1 if not name.startswith('devices/'): name = f'devices/{name}' customer = _get_device_customerid() # bah, inconsistencies in API if action == 'delete': kwargs['customer'] = customer else: kwargs['body'] = {'customer': customer} while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if action == 'wipe' and myarg == 'removeresetlock': kwargs['body']['removeResetLock'] = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], f'gam {action} device') return name, kwargs
def print_(): cbcm = build() customer_id = _get_customerid() projection = 'BASIC' orgUnitPath = query = None fields = None titles = [] csv_rows = [] todrive = False sort_headers = False i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'query': query = sys.argv[i + 1] i += 2 elif myarg in ['ou', 'org', 'orgunit']: orgUnitPath = gapi_directory_orgunits.getOrgUnitItem( sys.argv[i + 1], pathOnly=True, absolutePath=True) i += 2 elif myarg == 'projection': projection = sys.argv[i + 1].upper() i += 2 elif myarg == 'todrive': todrive = True i += 1 elif myarg == 'sortheaders': sort_headers = True i += 1 elif myarg == 'fields': fields = sys.argv[i + 1].replace(',', ' ').split() i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print browsers') if fields: fields.append('deviceId') fields = f'browsers({",".join(set(fields))}),nextPageToken' page_message = gapi.got_total_items_msg('Browsers', '...\n') browsers = gapi.get_all_pages(cbcm.chromebrowsers(), 'list', 'browsers', page_message=page_message, customer=customer_id, orgUnitPath=orgUnitPath, query=query, projection=projection, fields=fields) for browser in browsers: browser = utils.flatten_json(browser) for a_key in browser: if a_key not in titles: titles.append(a_key) csv_rows.append(browser) if sort_headers: display.sort_csv_titles([ 'deviceId', ], titles) display.write_csv_file(csv_rows, titles, 'Browsers', todrive)
def issue_command(): cd = gapi_directory.build() i, devices = getCrOSDeviceEntity(3, cd) body = {} valid_commands = gapi.get_enum_values_minus_unspecified( cd._rootDesc['schemas']['DirectoryChromeosdevicesIssueCommandRequest'] ['properties']['commandType']['enum']) command_map = {} for valid_command in valid_commands: v = valid_command.lower().replace('_', '') command_map[v] = valid_command times_to_check_status = 1 doit = False while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'command': command = sys.argv[i + 1].lower().replace('_', '') if command not in command_map: controlflow.system_error_exit(2, f'expected command of ' \ f'{", ".join(valid_commands)} got {command}') body['commandType'] = command_map[command] i += 2 if command == 'setvolume': body['payload'] = json.dumps({'volume': sys.argv[i]}) i += 1 elif myarg == 'timestocheckstatus': times_to_check_status = int(sys.argv[i + 1]) i += 2 elif myarg == 'doit': doit = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam issuecommand cros') if body['commandType'] == 'WIPE_USERS' and not doit: controlflow.system_error_exit(2, 'wipe_users command requires admin ' \ 'acknowledge user data will be destroyed with the ' \ 'doit argument') if body['commandType'] == 'REMOTE_POWERWASH' and not doit: controlflow.system_error_exit(2, 'remote_powerwash command requires ' \ 'admin acknowledge user data will be destroyed, device will need' \ ' to be reconnected to WiFi and re-enrolled with the doit argument') for device_id in devices: try: result = gapi.call( cd.customer().devices().chromeos(), 'issueCommand', customerId=GC_Values[GC_CUSTOMER_ID], deviceId=device_id, throw_reasons=[gapi_errors.ErrorReason.FOUR_O_O], body=body) except googleapiclient.errors.HttpError: controlflow.system_error_exit(4, '400 response from Google. This ' \ 'usually indicates the devices was not in a state where it will' \ ' accept the command. For example, reboot, set_volume and take_a_screenshot' \ ' require the device to be in auto-start kiosk app mode.') command_id = result.get('commandId') _display_cros_command_result(cd, device_id, command_id, times_to_check_status)
def info(): ci = gapi_cloudidentity.build('cloudidentity_beta') group = gam.normalizeEmailAddressOrUID(sys.argv[3]) getUsers = True showJoinDate = True showUpdateDate = False showMemberTree = False i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'nousers': getUsers = False i += 1 elif myarg == 'nojoindate': showJoinDate = False i += 1 elif myarg == 'showupdatedate': showUpdateDate = True i += 1 elif myarg == 'membertree': showMemberTree = True i += 1 else: controlflow.invalid_argument_exit(myarg, 'gam info cigroup') name = group_email_to_id(ci, group) basic_info = gapi.call(ci.groups(), 'get', name=name) display.print_json(basic_info) if getUsers and not showMemberTree: if not showJoinDate and not showUpdateDate: view = 'BASIC' pageSize = 1000 else: view = 'FULL' pageSize = 500 members = gapi.get_all_pages(ci.groups().memberships(), 'list', 'memberships', parent=name, fields='*', pageSize=pageSize, view=view) print(' Members:') for member in members: role = get_single_role(member.get('roles', [])).lower() email = member.get('memberKey', {}).get('id') member_type = member.get('type', 'USER').lower() jc_string = '' if showJoinDate: joined = member.get('createTime', 'Unknown') jc_string += f' joined {joined}' if showUpdateDate: updated = member.get('updateTime', 'Unknown') jc_string += f' updated {updated}' print(f' {role}: {email} ({member_type}){jc_string}') print(f'Total {len(members)} users in group') elif showMemberTree: print(' Membership Tree:') cached_group_members = {} print_member_tree(ci, name, cached_group_members, 2, True)
def transferSecCals(users): target_user = sys.argv[5] remove_source_user = sendNotifications = True i = 6 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'keepuser': remove_source_user = False i += 1 elif myarg == 'sendnotifications': sendNotifications = gam.getBoolean(sys.argv[i + 1], myarg) i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam <users> transfer seccals') if remove_source_user: target_user, target_cal = buildCalendarGAPIObject(target_user) if not target_cal: return for user in users: user, source_cal = buildCalendarGAPIObject(user) if not source_cal: continue calendars = gapi.get_all_pages(source_cal.calendarList(), 'list', 'items', soft_errors=True, minAccessRole='owner', showHidden=True, fields='items(id),nextPageToken') for calendar in calendars: calendarId = calendar['id'] if calendarId.find('@group.calendar.google.com') != -1: body = { 'role': 'owner', 'scope': { 'type': 'user', 'value': target_user } } gapi.call(source_cal.acl(), 'insert', calendarId=calendarId, body=body, sendNotifications=sendNotifications) if remove_source_user: body = { 'role': 'none', 'scope': { 'type': 'user', 'value': user } } gapi.call(target_cal.acl(), 'insert', calendarId=calendarId, body=body, sendNotifications=sendNotifications)
def printEvents(): calendarId, cal = buildCalendarDataGAPIObject(sys.argv[2]) if not cal: return q = showDeleted = showHiddenInvitations = timeMin = \ timeMax = timeZone = updatedMin = None toDrive = False titles = [] csvRows = [] i = 4 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'query': q = sys.argv[i + 1] i += 2 elif myarg == 'includedeleted': showDeleted = True i += 1 elif myarg == 'includehidden': showHiddenInvitations = True i += 1 elif myarg == 'after': timeMin = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'before': timeMax = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'timezone': timeZone = sys.argv[i + 1] i += 2 elif myarg == 'updated': updatedMin = utils.get_time_or_delta_from_now(sys.argv[i + 1]) i += 2 elif myarg == 'todrive': toDrive = True i += 1 else: controlflow.invalid_argument_exit( sys.argv[i], 'gam calendar <email> printevents') page_message = gapi.got_total_items_msg(f'Events for {calendarId}', '') results = gapi.get_all_pages(cal.events(), 'list', 'items', page_message=page_message, calendarId=calendarId, q=q, showDeleted=showDeleted, showHiddenInvitations=showHiddenInvitations, timeMin=timeMin, timeMax=timeMax, timeZone=timeZone, updatedMin=updatedMin) for result in results: row = {'calendarId': calendarId} display.add_row_titles_to_csv_file( utils.flatten_json(result, flattened=row), csvRows, titles) display.sort_csv_titles(['calendarId', 'id', 'summary', 'status'], titles) display.write_csv_file(csvRows, titles, 'Calendar Events', toDrive)
def printBuildings(): to_drive = False cd = gapi_directory.build() titles = [] csvRows = [] fieldsList = ['buildingId'] # buildings.list() currently doesn't support paging # but should soon, attempt to use it now so we # won't break when it's turned on. fields = 'nextPageToken,buildings(%s)' possible_fields = {} for pfield in cd._rootDesc['schemas']['Building']['properties']: possible_fields[pfield.lower()] = pfield i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': to_drive = True i += 1 elif myarg == 'allfields': fields = None i += 1 elif myarg in possible_fields: fieldsList.append(possible_fields[myarg]) i += 1 # Allows shorter arguments like "name" instead of "buildingname" elif 'building' + myarg in possible_fields: fieldsList.append(possible_fields['building' + myarg]) i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print buildings') if fields: fields = fields % ','.join(fieldsList) buildings = gapi.get_all_pages(cd.resources().buildings(), 'list', 'buildings', customer=GC_Values[GC_CUSTOMER_ID], fields=fields) for building in buildings: building.pop('etags', None) building.pop('etag', None) building.pop('kind', None) if 'buildingId' in building: building['buildingId'] = f'id:{building["buildingId"]}' if 'floorNames' in building: building['floorNames'] = ','.join(building['floorNames']) building = utils.flatten_json(building) for item in building: if item not in titles: titles.append(item) csvRows.append(building) display.sort_csv_titles('buildingId', titles) display.write_csv_file(csvRows, titles, 'Buildings', to_drive)
def _getFeatureAttributes(args, body={}): i = 0 while i < len(args): myarg = args[i].lower().replace('_', '') if myarg == 'name': body['name'] = args[i + 1] i += 2 else: controlflow.invalid_argument_exit(myarg, 'gam create|update feature') return body
def downloadExport(): verifyFiles = True extractFiles = True v = buildGAPIObject() s = gapi_storage.build_gapi() matterId = getMatterItem(v, sys.argv[3]) exportId = convertExportNameToID(v, sys.argv[4], matterId) targetFolder = GC_Values[GC_DRIVE_DIR] i = 5 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'targetfolder': targetFolder = os.path.expanduser(sys.argv[i + 1]) if not os.path.isdir(targetFolder): os.makedirs(targetFolder) i += 2 elif myarg == 'noverify': verifyFiles = False i += 1 elif myarg == 'noextract': extractFiles = False i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam download export') export = gapi.call(v.matters().exports(), 'get', matterId=matterId, exportId=exportId) for s_file in export['cloudStorageSink']['files']: bucket = s_file['bucketName'] s_object = s_file['objectName'] filename = os.path.join(targetFolder, s_object.replace('/', '-')) print(f'saving to {filename}') request = s.objects().get_media(bucket=bucket, object=s_object) f = fileutils.open_file(filename, 'wb') downloader = googleapiclient.http.MediaIoBaseDownload(f, request) done = False while not done: status, done = downloader.next_chunk() sys.stdout.write(' Downloaded: {0:>7.2%}\r'.format( status.progress())) sys.stdout.flush() sys.stdout.write('\n Download complete. Flushing to disk...\n') fileutils.close_file(f, True) if verifyFiles: expected_hash = s_file['md5Hash'] sys.stdout.write(f' Verifying file hash is {expected_hash}...') sys.stdout.flush() utils.md5_matches_file(filename, expected_hash, True) print('VERIFIED') if extractFiles and re.search(r'\.zip$', filename): gam.extract_nested_zip(filename, targetFolder)
def print_(): cd = gapi_directory.build() todrive = False titles = [ 'domainName', ] csvRows = [] i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'todrive': todrive = True i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print domains') results = gapi.call(cd.domains(), 'list', customer=GC_Values[GC_CUSTOMER_ID]) for domain in results.get('domains', []): domain_attributes = {} domain['type'] = ['secondary', 'primary'][domain['isPrimary']] for attr in domain: if attr in ['kind', 'etag', 'domainAliases', 'isPrimary']: continue if attr in [ 'creationTime', ]: domain[attr] = utils.formatTimestampYMDHMSF(domain[attr]) if attr not in titles: titles.append(attr) domain_attributes[attr] = domain[attr] csvRows.append(domain_attributes) if 'domainAliases' in domain: for aliasdomain in domain['domainAliases']: aliasdomain['domainName'] = aliasdomain['domainAliasName'] del aliasdomain['domainAliasName'] aliasdomain['type'] = 'alias' aliasdomain_attributes = {} for attr in aliasdomain: if attr in ['kind', 'etag']: continue if attr in [ 'creationTime', ]: aliasdomain[attr] = utils.formatTimestampYMDHMSF( aliasdomain[attr]) if attr not in titles: titles.append(attr) aliasdomain_attributes[attr] = aliasdomain[attr] csvRows.append(aliasdomain_attributes) display.write_csv_file(csvRows, titles, 'Domains', todrive)
def get_command(): cd = gapi_directory.build() i, devices = getCrOSDeviceEntity(3, cd) command_id = None while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'commandid': command_id = sys.argv[i+1] i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam getcommand cros') for device_id in devices: result = gapi.call(cd.customer().devices().chromeos().commands(), 'get', customerId=GC_Values[GC_CUSTOMER_ID], deviceId=device_id, commandId=command_id) display.print_json(result)
def print_(): cbcm = build() projection = 'BASIC' query = None fields = None titles = [] csv_rows = [] todrive = False sort_headers = False i = 3 while i < len(sys.argv): myarg = sys.argv[i].lower().replace('_', '') if myarg == 'query': query = sys.argv[i+1] i += 2 elif myarg == 'projection': projection = sys.argv[i + 1].upper() i += 2 elif myarg == 'todrive': todrive = True i += 1 elif myarg == 'sortheaders': sort_headers = True i += 1 elif myarg == 'fields': fields = sys.argv[i + 1] i += 2 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam print browsers') if fields: fields = f'browsers({fields}),nextPageToken' page_message = gapi.got_total_items_msg('Browsers', '...\n') browsers = gapi.get_all_pages(cbcm.chromebrowsers(), 'list', 'browsers', page_message=page_message, customer=GC_Values[GC_CUSTOMER_ID], query=query, projection=projection, fields=fields) for browser in browsers: browser = utils.flatten_json(browser) for a_key in browser: if a_key not in titles: titles.append(a_key) csv_rows.append(browser) if sort_headers: display.sort_csv_titles(['name',], titles) display.write_csv_file(csv_rows, titles, 'Browsers', todrive)
def update(): cd = gapi_directory.build() domain_name = sys.argv[3] i = 4 body = {} while i < len(sys.argv): myarg = sys.argv[i].lower() if myarg == 'primary': body['customerDomain'] = domain_name i += 1 else: controlflow.invalid_argument_exit(sys.argv[i], 'gam update domain') gapi.call(cd.customers(), 'update', customerKey=GC_Values[GC_CUSTOMER_ID], body=body) print(f'{domain_name} is now the primary domain.')