Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
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"]}')
Ejemplo n.º 4
0
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) 
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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')
Ejemplo n.º 14
0
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"]}')
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
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')
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
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)
Ejemplo n.º 20
0
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)
Ejemplo n.º 21
0
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)
Ejemplo n.º 22
0
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)
Ejemplo n.º 23
0
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)
Ejemplo n.º 24
0
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)
Ejemplo n.º 25
0
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
Ejemplo n.º 26
0
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)
Ejemplo n.º 27
0
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)
Ejemplo n.º 28
0
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)
Ejemplo n.º 29
0
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)
Ejemplo n.º 30
0
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.')