mirror of
https://github.com/GAM-team/GAM.git
synced 2025-05-12 12:17:20 +00:00
Major updates to gam report and gam print users
This commit is contained in:
parent
5c6415ccc2
commit
c913ef1105
467
gam.py
467
gam.py
@ -23,8 +23,8 @@ For more information, see http://code.google.com/p/google-apps-manager
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
__author__ = u'Jay Lee <jay@ditoweb.com>'
|
__author__ = u'Jay Lee <jay0lee@gmail.com>'
|
||||||
__version__ = u'3.21'
|
__version__ = u'3.3'
|
||||||
__license__ = u'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
__license__ = u'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
||||||
|
|
||||||
import sys, os, time, datetime, random, socket, csv, platform, re, calendar, base64, hashlib
|
import sys, os, time, datetime, random, socket, csv, platform, re, calendar, base64, hashlib
|
||||||
@ -151,7 +151,7 @@ def getGamPath():
|
|||||||
|
|
||||||
def doGAMVersion():
|
def doGAMVersion():
|
||||||
import struct
|
import struct
|
||||||
print u'Dito GAM %s\n%s\nPython %s.%s.%s %s-bit %s\ngoogle-api-python-client %s\n%s %s\nPath: %s' % (__version__, __author__,
|
print u'Dito GAM %s - http://git.io/gam\n%s\nPython %s.%s.%s %s-bit %s\ngoogle-api-python-client %s\n%s %s\nPath: %s' % (__version__, __author__,
|
||||||
sys.version_info[0], sys.version_info[1], sys.version_info[2], struct.calcsize('P')*8, sys.version_info[3], apiclient.__version__,
|
sys.version_info[0], sys.version_info[1], sys.version_info[2], struct.calcsize('P')*8, sys.version_info[3], apiclient.__version__,
|
||||||
platform.platform(), platform.machine(), getGamPath())
|
platform.platform(), platform.machine(), getGamPath())
|
||||||
|
|
||||||
@ -514,7 +514,7 @@ def buildGAPIObject(api):
|
|||||||
if credentials is None or credentials.invalid:
|
if credentials is None or credentials.invalid:
|
||||||
doRequestOAuth()
|
doRequestOAuth()
|
||||||
credentials = storage.get()
|
credentials = storage.get()
|
||||||
credentials.user_agent = u'Dito GAM %s / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
credentials.user_agent = u'Dito GAM %s - http://git.io/gam / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
||||||
sys.version_info[0], sys.version_info[1], sys.version_info[2], sys.version_info[3],
|
sys.version_info[0], sys.version_info[1], sys.version_info[2], sys.version_info[3],
|
||||||
platform.platform(), platform.machine())
|
platform.platform(), platform.machine())
|
||||||
disable_ssl_certificate_validation = False
|
disable_ssl_certificate_validation = False
|
||||||
@ -587,7 +587,7 @@ def buildGAPIServiceObject(api, act_as=None):
|
|||||||
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope)
|
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope)
|
||||||
else:
|
else:
|
||||||
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope, sub=act_as)
|
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope, sub=act_as)
|
||||||
credentials.user_agent = u'Dito GAM %s / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
credentials.user_agent = u'Dito GAM %s - http://git.io/gam / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
||||||
sys.version_info[0], sys.version_info[1], sys.version_info[2], sys.version_info[3],
|
sys.version_info[0], sys.version_info[1], sys.version_info[2], sys.version_info[3],
|
||||||
platform.platform(), platform.machine())
|
platform.platform(), platform.machine())
|
||||||
disable_ssl_certificate_validation = False
|
disable_ssl_certificate_validation = False
|
||||||
@ -819,128 +819,33 @@ def showReport():
|
|||||||
for app in auth_apps: # put apps at bottom
|
for app in auth_apps: # put apps at bottom
|
||||||
cust_attributes.append(app)
|
cust_attributes.append(app)
|
||||||
output_csv(csv_list=cust_attributes, titles=titles, list_type=u'Customer Report - %s' % try_date, todrive=to_drive)
|
output_csv(csv_list=cust_attributes, titles=titles, list_type=u'Customer Report - %s' % try_date, todrive=to_drive)
|
||||||
elif report in [u'doc', u'docs']:
|
elif report in [u'doc', u'docs', u'login', u'admin', u'drive']:
|
||||||
|
if report == u'doc':
|
||||||
|
report = u'docs'
|
||||||
page_message = u'Got %%num_items%% items\n'
|
page_message = u'Got %%num_items%% items\n'
|
||||||
doc_activities = callGAPIpages(service=rep.activities(), function=u'list', page_message=page_message, applicationName=u'docs', userKey=userKey, customerId=customerId, actorIpAddress=actorIpAddress, startTime=startTime, endTime=endTime, eventName=eventName, filters=filters)
|
activities = callGAPIpages(service=rep.activities(), function=u'list', page_message=page_message, applicationName=report, userKey=userKey, customerId=customerId, actorIpAddress=actorIpAddress, startTime=startTime, endTime=endTime, eventName=eventName, filters=filters)
|
||||||
doc_attr = [{u'user': u'user', u'event': u'event', u'doc_id': u'doc_id', u'time': u'time', u'ip': u'ip'}]
|
attrs = []
|
||||||
titles = [u'user', u'event', u'doc_id', u'time', u'ip']
|
|
||||||
for doc_activity in doc_activities:
|
|
||||||
for event in doc_activity[u'events']:
|
|
||||||
for parameter in event[u'parameters']:
|
|
||||||
row = {u'user': doc_activity[u'actor'][u'email'],
|
|
||||||
'event': event[u'name'],
|
|
||||||
'doc_id': parameter[u'value'],
|
|
||||||
'time': doc_activity[u'id'][u'time']}
|
|
||||||
try:
|
|
||||||
row[u'ip'] = doc_activity[u'ipAddress']
|
|
||||||
except KeyError:
|
|
||||||
row[u'ip'] = u'unknown'
|
|
||||||
doc_attr.append(row)
|
|
||||||
output_csv(doc_attr, titles, u'Docs Activity Report', to_drive)
|
|
||||||
elif report == u'drive':
|
|
||||||
page_message = u'Got %%num_items%% items'
|
|
||||||
drive_activities = callGAPIpages(service=rep.activities(), function=u'list', page_message=page_message, applicationName=u'drive', userKey=userKey, customerId=customerId, actorIpAddress=actorIpAddress, startTime=startTime, endTime=endTime, eventName=eventName, filters=filters)
|
|
||||||
drive_attributes = []
|
|
||||||
titles = []
|
titles = []
|
||||||
for drive_report in drive_activities:
|
for activity in activities:
|
||||||
try:
|
events = activity[u'events']
|
||||||
for report_item in drive_report[u'parameters']:
|
del activity[u'events']
|
||||||
items = report_item.values()
|
activity_row = flatten_json(activity)
|
||||||
name = items[1]
|
for event in events:
|
||||||
value = items[0]
|
row = flatten_json(event)
|
||||||
if not name in titles:
|
row.update(activity_row)
|
||||||
titles.append(name)
|
for item in row.keys():
|
||||||
row[name] = value
|
if item not in titles:
|
||||||
except KeyError:
|
titles.append(item)
|
||||||
pass
|
attrs.append(row)
|
||||||
drive_attributes.append(row)
|
|
||||||
header = {}
|
header = {}
|
||||||
|
titles.remove(u'name')
|
||||||
|
titles = sorted(titles)
|
||||||
|
titles.insert(0, u'name')
|
||||||
for title in titles:
|
for title in titles:
|
||||||
header[title] = title
|
header[title] = title
|
||||||
drive_attributes.insert(0, header)
|
attrs.insert(0, header)
|
||||||
output_csv(drive_attributes, titles, u'Drive Activity Report', to_drive)
|
cap_report = u'%s%s' % (report[0].upper(), report[1:])
|
||||||
elif report == u'admin':
|
output_csv(attrs, titles, u'%s Activity Report' % cap_report, to_drive)
|
||||||
admin_activity = callGAPIpages(service=rep.activities(), function=u'list', applicationName=u'admin', userKey=userKey, customerId=customerId, actorIpAddress=actorIpAddress, startTime=startTime, endTime=endTime, eventName=eventName, filters=filters)
|
|
||||||
admin_attr = []
|
|
||||||
titles = [u'time', u'user', u'event', u'ip']
|
|
||||||
for activity in admin_activity:
|
|
||||||
for event in activity[u'events']:
|
|
||||||
row = {}
|
|
||||||
try:
|
|
||||||
row[u'event'] = event[u'name']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'time'] = activity[u'id'][u'time']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'user'] = activity[u'actor'][u'email']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'ip'] = activity[u'ipAddress']
|
|
||||||
except KeyError:
|
|
||||||
row[u'ip'] = u'unknown'
|
|
||||||
try:
|
|
||||||
for parameter in event[u'parameters']:
|
|
||||||
try:
|
|
||||||
if not parameter[u'name'].lower() in titles:
|
|
||||||
titles.append(parameter[u'name'].lower())
|
|
||||||
row[parameter[u'name'].lower()] = parameter[u'value']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
admin_attr.append(row)
|
|
||||||
header = {}
|
|
||||||
for title in titles:
|
|
||||||
header[title] = title
|
|
||||||
admin_attr.insert(0, header)
|
|
||||||
output_csv(admin_attr, titles, u'Admin Audit Report', to_drive)
|
|
||||||
elif report in [u'login', u'logins']:
|
|
||||||
page_message = u'Got %%num_items%% logins\n'
|
|
||||||
login_activity = callGAPIpages(service=rep.activities(), function=u'list', page_message=page_message, applicationName=u'login', userKey=userKey, customerId=customerId, actorIpAddress=actorIpAddress, startTime=startTime, endTime=endTime, eventName=eventName, filters=filters)
|
|
||||||
login_attr = []
|
|
||||||
titles = [u'time', u'user', u'event', u'ip']
|
|
||||||
for activity in login_activity:
|
|
||||||
for event in activity[u'events']:
|
|
||||||
row = {}
|
|
||||||
try:
|
|
||||||
row[u'event'] = event[u'name']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'time'] = activity[u'id'][u'time']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'user'] = activity[u'actor'][u'email']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
row[u'ip'] = activity[u'ipAddress']
|
|
||||||
except KeyError:
|
|
||||||
row[u'ip'] = u'unknown'
|
|
||||||
try:
|
|
||||||
for parameter in event[u'parameters']:
|
|
||||||
try:
|
|
||||||
if not parameter[u'name'].lower() in titles:
|
|
||||||
titles.append(parameter[u'name'].lower())
|
|
||||||
if u'value' in parameter:
|
|
||||||
row[parameter[u'name'].lower()] = parameter[u'value']
|
|
||||||
elif u'boolValue' in parameter:
|
|
||||||
row[parameter[u'name'].lower()] = parameter[u'boolValue']
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
login_attr.append(row)
|
|
||||||
header = {}
|
|
||||||
for title in titles:
|
|
||||||
header[title] = title
|
|
||||||
login_attr.insert(0, header)
|
|
||||||
output_csv(login_attr, titles, u'Login Audit Report', to_drive)
|
|
||||||
|
|
||||||
def doDelegates(users):
|
def doDelegates(users):
|
||||||
emailsettings = getEmailSettingsObject()
|
emailsettings = getEmailSettingsObject()
|
||||||
@ -3506,8 +3411,6 @@ def doCreateUser():
|
|||||||
if need_password:
|
if need_password:
|
||||||
body[u'password'] = u''.join(random.sample(u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-=_+:;"\'{}[]\\|', 25))
|
body[u'password'] = u''.join(random.sample(u'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-=_+:;"\'{}[]\\|', 25))
|
||||||
if need_to_hash_password:
|
if need_to_hash_password:
|
||||||
#newhash = hashlib.sha1()
|
|
||||||
#newhash.update(body[u'password'])
|
|
||||||
body[u'password'] = gen_sha512_hash(body[u'password'])
|
body[u'password'] = gen_sha512_hash(body[u'password'])
|
||||||
body[u'hashFunction'] = u'crypt'
|
body[u'hashFunction'] = u'crypt'
|
||||||
print u"Creating account for %s" % body[u'primaryEmail']
|
print u"Creating account for %s" % body[u'primaryEmail']
|
||||||
@ -3962,8 +3865,6 @@ def doUpdateUser(users):
|
|||||||
print u'Error: didn\'t expect %s command at position %s' % (sys.argv[i], i)
|
print u'Error: didn\'t expect %s command at position %s' % (sys.argv[i], i)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
if gotPassword and not (isSHA1 or isMD5 or isCrypt or nohash):
|
if gotPassword and not (isSHA1 or isMD5 or isCrypt or nohash):
|
||||||
#newhash = hashlib.sha1()
|
|
||||||
#newhash.update(body[u'password'])
|
|
||||||
body[u'password'] = gen_sha512_hash(body[u'password'])
|
body[u'password'] = gen_sha512_hash(body[u'password'])
|
||||||
body[u'hashFunction'] = u'crypt'
|
body[u'hashFunction'] = u'crypt'
|
||||||
for user in users:
|
for user in users:
|
||||||
@ -4371,7 +4272,7 @@ def doGetUserInfo(user_email=None):
|
|||||||
user_email = user_email[4:]
|
user_email = user_email[4:]
|
||||||
elif user_email.find(u'@') == -1:
|
elif user_email.find(u'@') == -1:
|
||||||
user_email = u'%s@%s' % (user_email, domain)
|
user_email = u'%s@%s' % (user_email, domain)
|
||||||
getAliases = getGroups = True
|
getAliases = getGroups = getLicenses = True
|
||||||
i = 4
|
i = 4
|
||||||
while i < len(sys.argv):
|
while i < len(sys.argv):
|
||||||
if sys.argv[i].lower() == u'noaliases':
|
if sys.argv[i].lower() == u'noaliases':
|
||||||
@ -4380,6 +4281,9 @@ def doGetUserInfo(user_email=None):
|
|||||||
elif sys.argv[i].lower() == u'nogroups':
|
elif sys.argv[i].lower() == u'nogroups':
|
||||||
getGroups = False
|
getGroups = False
|
||||||
i += 1
|
i += 1
|
||||||
|
elif sys.argv[i].lower() == u'nolicenses':
|
||||||
|
getLicenses = False
|
||||||
|
i += 1
|
||||||
else:
|
else:
|
||||||
print u'%s is not a valid argument for gam info user' % sys.argv[i]
|
print u'%s is not a valid argument for gam info user' % sys.argv[i]
|
||||||
sys.exit(3)
|
sys.exit(3)
|
||||||
@ -4499,6 +4403,21 @@ def doGetUserInfo(user_email=None):
|
|||||||
print u' %s <%s>' % (group[u'name'], group[u'email'])
|
print u' %s <%s>' % (group[u'name'], group[u'email'])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
if getLicenses:
|
||||||
|
print
|
||||||
|
print u'Licenses:'
|
||||||
|
lic = buildGAPIObject(api='licensing')
|
||||||
|
for sku in [u'Google-Apps', u'Google-Apps-For-Business', u'Google-Apps-Unlimited', u'Google-Apps-For-Postini',
|
||||||
|
u'Google-Coordinate', u'Google-Drive-storage-20GB', u'Google-Drive-storage-50GB', u'Google-Drive-storage-200GB',
|
||||||
|
u'Google-Drive-storage-400GB', u'Google-Drive-storage-1TB', u'Google-Drive-storage-2TB',
|
||||||
|
u'Google-Drive-storage-4TB', u'Google-Drive-storage-8TB', u'Google-Drive-storage-16TB', u'Google-Vault',
|
||||||
|
u'Google-Vault-Former-Employee']:
|
||||||
|
productId, skuId = getProductAndSKU(sku)
|
||||||
|
try:
|
||||||
|
result = callGAPI(service=lic.licenseAssignments(), function=u'get', throw_reasons=['notFound'], userId=user_email, productId=productId, skuId=skuId)
|
||||||
|
except apiclient.errors.HttpError:
|
||||||
|
continue
|
||||||
|
print u' %s' % result[u'skuId']
|
||||||
|
|
||||||
def doGetGroupInfo(group_name=None):
|
def doGetGroupInfo(group_name=None):
|
||||||
if group_name == None:
|
if group_name == None:
|
||||||
@ -5366,7 +5285,7 @@ def output_csv(csv_list, titles, list_type, todrive):
|
|||||||
rows = len(csv_list)
|
rows = len(csv_list)
|
||||||
cell_count = rows * columns
|
cell_count = rows * columns
|
||||||
convert = True
|
convert = True
|
||||||
if cell_count > 400000 or columns > 256:
|
if cell_count > 500000 or columns > 256:
|
||||||
print u'Warning: results are to large for Google Spreadsheets. Uploading as a regular CSV file.'
|
print u'Warning: results are to large for Google Spreadsheets. Uploading as a regular CSV file.'
|
||||||
convert = False
|
convert = False
|
||||||
drive = buildGAPIObject(u'drive')
|
drive = buildGAPIObject(u'drive')
|
||||||
@ -5378,32 +5297,42 @@ def output_csv(csv_list, titles, list_type, todrive):
|
|||||||
msg_txt = u'Drive file uploaded to:\n %s' % file_url
|
msg_txt = u'Drive file uploaded to:\n %s' % file_url
|
||||||
msg_subj = u'%s - %s' % (domain, list_type)
|
msg_subj = u'%s - %s' % (domain, list_type)
|
||||||
send_email(msg_subj, msg_txt)
|
send_email(msg_subj, msg_txt)
|
||||||
|
print file_url
|
||||||
else:
|
else:
|
||||||
import webbrowser
|
import webbrowser
|
||||||
webbrowser.open(file_url)
|
webbrowser.open(file_url)
|
||||||
|
|
||||||
|
def flatten_json(structure, key="", path="", flattened=None):
|
||||||
|
if flattened == None:
|
||||||
|
flattened = {}
|
||||||
|
if type(structure) not in(dict, list):
|
||||||
|
flattened[((path + ".") if path else "") + key] = structure
|
||||||
|
elif isinstance(structure, list):
|
||||||
|
for i, item in enumerate(structure):
|
||||||
|
flatten_json(item, "%d" % i, ".".join(filter(None,[path,key])), flattened)
|
||||||
|
else:
|
||||||
|
for new_key, value in structure.items():
|
||||||
|
if new_key in [u'kind', u'etag']:
|
||||||
|
continue
|
||||||
|
if value == u'1970-01-01T00:00:00.000Z':
|
||||||
|
value = u'Never'
|
||||||
|
flatten_json(value, new_key, ".".join(filter(None,[path,key])), flattened)
|
||||||
|
return flattened
|
||||||
|
|
||||||
def doPrintUsers():
|
def doPrintUsers():
|
||||||
cd = buildGAPIObject(u'directory')
|
cd = buildGAPIObject(u'directory')
|
||||||
fields = u'nextPageToken,users(primaryEmail'
|
user_fields = [u'primaryEmail',]
|
||||||
|
fields = u''
|
||||||
customer = customerId
|
customer = customerId
|
||||||
domain = None
|
domain = None
|
||||||
query = None
|
query = None
|
||||||
getGroupFeed = getLicenseFeed = False
|
getGroupFeed = getLicenseFeed = False
|
||||||
firstname = lastname = username = ou = suspended = changepassword = agreed2terms = admin = aliases = groups = id = creationtime = lastlogintime = fullname = gal = todrive = photo = phone = False
|
todrive = False
|
||||||
deleted_only = orderBy = sortOrder = None
|
deleted_only = orderBy = sortOrder = None
|
||||||
user_attributes = []
|
|
||||||
# the titles list ensures the CSV output has its parameters in the specified order.
|
|
||||||
# Python's dicts can be listed in any order, and the order often changes between the
|
|
||||||
# header (user_attributes[0]) and the actual data rows.
|
|
||||||
titles = [u'Email']
|
|
||||||
user_attributes.append({u'Email': u'Email'})
|
|
||||||
i = 3
|
i = 3
|
||||||
while i < len(sys.argv):
|
while i < len(sys.argv):
|
||||||
if sys.argv[i].lower() == u'allfields':
|
if sys.argv[i].lower() == u'allfields':
|
||||||
fields = u'*'
|
fields = None
|
||||||
firstname = lastname = username = ou = suspended = changepassword = agreed2terms = admin = aliases = id = creationtime = lastlogintime = fullname = gal = photo = phone = True
|
|
||||||
user_attributes[0].update(Firstname=u'Firstname', Lastname=u'Lastname', Fullname=u'Fullname', Username=u'Username', OU=u'OU', Suspended=u'Suspended', SuspensionReason=u'SuspensionReason', ChangePassword=u'ChangePassword', AgreedToTerms=u'AgreedToTerms', DelegatedAdmin=u'DelegatedAdmin', Admin=u'Admin', CreationTime=u'CreationTime', LastLoginTime=u'LastLoginTime', Aliases=u'Aliases', NonEditableAliases=u'NonEditableAliases', ID=u'ID', IncludeInGlobalAddressList=u'IncludeInGlobalAddressList', thumbnailPhotoUrl=u'thumbnailPhotoUrl')
|
|
||||||
titles += [u'Firstname', u'Lastname', u'Fullname', u'Username', u'OU', u'Suspended', u'SuspensionReason', u'ChangePassword', u'AgreedToTerms', u'DelegatedAdmin', u'Admin', u'CreationTime', u'LastLoginTime', u'Aliases', u'NonEditableAliases', u'ID', u'IncludeInGlobalAddressList', u'thumbnailPhotoUrl']
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'todrive':
|
elif sys.argv[i].lower() == u'todrive':
|
||||||
todrive = True
|
todrive = True
|
||||||
@ -5431,230 +5360,102 @@ def doPrintUsers():
|
|||||||
elif sys.argv[i].lower() == u'query':
|
elif sys.argv[i].lower() == u'query':
|
||||||
query = sys.argv[i+1]
|
query = sys.argv[i+1]
|
||||||
i += 2
|
i += 2
|
||||||
elif sys.argv[i].lower() in [u'firstname', u'givenname']:
|
elif sys.argv[i].lower() in [u'firstname', u'givenname', u'lastname', u'familyName', u'fullname']:
|
||||||
fields += u',name'
|
user_fields.append(u'name')
|
||||||
firstname = True
|
|
||||||
user_attributes[0].update(Firstname=u'Firstname')
|
|
||||||
titles.append(u'Firstname')
|
|
||||||
i += 1
|
|
||||||
elif sys.argv[i].lower() in [u'lastname', u'familyname']:
|
|
||||||
if fields[-5:] != u',name':
|
|
||||||
fields += u',name'
|
|
||||||
lastname = True
|
|
||||||
user_attributes[0].update(Lastname=u'Lastname')
|
|
||||||
titles.append(u'Lastname')
|
|
||||||
i += 1
|
|
||||||
elif sys.argv[i].lower() == u'fullname':
|
|
||||||
if fields[-5:] != u',name':
|
|
||||||
fields += u',name'
|
|
||||||
fullname = True
|
|
||||||
user_attributes[0].update(Fullname=u'Fullname')
|
|
||||||
titles.append(u'Fullname')
|
|
||||||
i += 1
|
|
||||||
elif sys.argv[i].lower() == u'username':
|
|
||||||
username = True
|
|
||||||
user_attributes[0].update(Username=u'Username')
|
|
||||||
titles.append(u'Username')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'ou':
|
elif sys.argv[i].lower() == u'ou':
|
||||||
fields += u',orgUnitPath'
|
user_fields.append(u'orgUnitPath')
|
||||||
ou = True
|
|
||||||
user_attributes[0].update(OU=u'OU')
|
|
||||||
titles.append(u'OU')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'suspended':
|
elif sys.argv[i].lower() == u'suspended':
|
||||||
fields += u',suspended,suspensionReason'
|
user_fields.append(u'suspended')
|
||||||
suspended = True
|
user_fields.append(u'suspensionReason')
|
||||||
user_attributes[0].update(Suspended=u'Suspended')
|
|
||||||
titles.append(u'Suspended')
|
|
||||||
user_attributes[0].update(SuspensionReason=u'SuspensionReason')
|
|
||||||
titles.append(u'SuspensionReason')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'changepassword':
|
elif sys.argv[i].lower() == u'changepassword':
|
||||||
fields += u',changePasswordAtNextLogin'
|
user_fields.append(u'changePasswordAtNextLogin')
|
||||||
changepassword = True
|
|
||||||
user_attributes[0].update(ChangePassword=u'ChangePassword')
|
|
||||||
titles.append(u'ChangePassword')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'agreed2terms':
|
elif sys.argv[i].lower() == u'agreed2terms':
|
||||||
fields += u',agreedToTerms'
|
user_fields.append(u'agreedToTerms')
|
||||||
agreed2terms = True
|
|
||||||
user_attributes[0].update(AgreedToTerms=u'AgreedToTerms')
|
|
||||||
titles.append(u'AgreedToTerms')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'admin':
|
elif sys.argv[i].lower() == u'admin':
|
||||||
fields += u',isAdmin,isDelegatedAdmin'
|
user_fields.append(u'isAdmin')
|
||||||
admin = True
|
user_fields.append(u'isDelegatedAdmin')
|
||||||
user_attributes[0].update(Admin=u'Admin')
|
|
||||||
titles.append(u'Admin')
|
|
||||||
user_attributes[0].update(DelegatedAdmin=u'DelegatedAdmin')
|
|
||||||
titles.append(u'DelegatedAdmin')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'gal':
|
elif sys.argv[i].lower() == u'gal':
|
||||||
fields += u',includeInGlobalAddressList'
|
user_fields.append(u'includeInGlobalAddressList')
|
||||||
gal = True
|
|
||||||
user_attributes[0].update(IncludeInGlobalAddressList=u'IncludeInGlobalAddressList')
|
|
||||||
titles.append(u'IncludeInGlobalAddressList')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() in ['photo', 'photourl']:
|
elif sys.argv[i].lower() in ['photo', 'photourl']:
|
||||||
fields += u',thumbnailPhotoUrl'
|
user_fields.append(u'thumbnailPhotoUrl')
|
||||||
photo = True
|
|
||||||
user_attributes[0].update(thumbnailPhotoUrl=u'thumbnailPhotoUrl')
|
|
||||||
titles.append(u'thumbnailPhotoUrl')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'id':
|
elif sys.argv[i].lower() == u'id':
|
||||||
fields += u',id'
|
user_fields.append(u',id')
|
||||||
id = True
|
|
||||||
user_attributes[0].update(ID=u'ID')
|
|
||||||
titles.append(u'ID')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'creationtime':
|
elif sys.argv[i].lower() == u'creationtime':
|
||||||
fields += u',creationTime'
|
user_fields.append(u'creationTime')
|
||||||
creationtime = True
|
|
||||||
user_attributes[0].update(CreationTime=u'CreationTime')
|
|
||||||
titles.append(u'CreationTime')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'lastlogintime':
|
elif sys.argv[i].lower() == u'lastlogintime':
|
||||||
fields += u',lastLoginTime'
|
user_fields.append(u'lastLoginTime')
|
||||||
lastlogintime = True
|
|
||||||
user_attributes[0].update(LastLoginTime=u'LastLoginTime')
|
|
||||||
titles.append(u'LastLoginTime')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'nicknames' or sys.argv[i].lower() == u'aliases':
|
elif sys.argv[i].lower() in [u'nicknames', u'aliases']:
|
||||||
fields += u',aliases,nonEditableAliases'
|
user_fields.append(u'aliases')
|
||||||
aliases = True
|
user_fields.append(u'nonEditableAliases')
|
||||||
user_attributes[0].update(Aliases=u'Aliases')
|
i += 1
|
||||||
titles.append(u'Aliases')
|
elif sys.argv[i].lower() in [u'im', u'ims']:
|
||||||
user_attributes[0].update(NonEditableAliases=u'NonEditableAliases')
|
user_fields.append(u'ims')
|
||||||
titles.append(u'NonEditableAliases')
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'emails', u'email']:
|
||||||
|
user_fields.append(u'emails')
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower().replace(u'_', u'') in [u'externalids', u'externalid']:
|
||||||
|
user_fields.append(u'externalIds')
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'relation', u'relations']:
|
||||||
|
user_fields.append(u'relations')
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'address', u'addresses']:
|
||||||
|
user_fields.append(u'addresses')
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'organization', u'organizations']:
|
||||||
|
user_fields.append(u'organizations')
|
||||||
|
i += 1
|
||||||
|
elif sys.argv[i].lower() in [u'phone', u'phones']:
|
||||||
|
user_fields.append(u'phones')
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() == u'groups':
|
elif sys.argv[i].lower() == u'groups':
|
||||||
getGroupFeed = True
|
getGroupFeed = True
|
||||||
groups = True
|
|
||||||
user_attributes[0].update(Groups=u'Groups')
|
|
||||||
titles.append(u'Groups')
|
|
||||||
i += 1
|
i += 1
|
||||||
elif sys.argv[i].lower() in [u'license', u'licenses']:
|
elif sys.argv[i].lower() in [u'license', u'licenses']:
|
||||||
getLicenseFeed = True
|
getLicenseFeed = True
|
||||||
user_attributes[0].update(Licenses=u'Licenses')
|
|
||||||
titles.append(u'Licenses')
|
|
||||||
i += 1
|
i += 1
|
||||||
else:
|
else:
|
||||||
showUsage()
|
showUsage()
|
||||||
exit(5)
|
exit(5)
|
||||||
if fields != u'*':
|
if fields != None:
|
||||||
fields += u')'
|
user_fields = set(user_fields)
|
||||||
|
fields = u'nextPageToken,users(%s)' % u','.join(user_fields)
|
||||||
sys.stderr.write(u"Getting all users in Google Apps account (may take some time on a large account)...\n")
|
sys.stderr.write(u"Getting all users in Google Apps account (may take some time on a large account)...\n")
|
||||||
page_message = u'Got %%total_items%% users: %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%total_items%% users: %%first_item%% - %%last_item%%\n'
|
||||||
all_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, message_attribute=u'primaryEmail', customer=customer, domain=domain, fields=fields, showDeleted=deleted_only, maxResults=500, orderBy=orderBy, sortOrder=sortOrder, query=query)
|
all_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, message_attribute=u'primaryEmail', customer=customer, domain=domain, fields=fields, showDeleted=deleted_only, maxResults=500, orderBy=orderBy, sortOrder=sortOrder, query=query)
|
||||||
|
titles = []
|
||||||
|
attributes = []
|
||||||
for user in all_users:
|
for user in all_users:
|
||||||
email = user[u'primaryEmail'].lower()
|
attributes.append(flatten_json(user))
|
||||||
domain = email[email.find(u'@')+1:]
|
for item in attributes[-1].keys():
|
||||||
if domain == u'gtempaccount.com':
|
if item not in titles:
|
||||||
continue
|
titles.append(item)
|
||||||
if email[:2] == u'.@' or email[:11] == u'gcc_websvc@' or email[:27] == u'secure-data-connector-user@': # not real users, skip em
|
titles.remove(u'primaryEmail')
|
||||||
continue
|
titles = sorted(titles)
|
||||||
user_attributes.append({u'Email': email})
|
titles = [u'primaryEmail'] + titles
|
||||||
location = 0
|
header = {}
|
||||||
try:
|
for title in titles:
|
||||||
location = user_attributes.index({u'Email': email})
|
header[title] = title
|
||||||
if username:
|
attributes.insert(0, header)
|
||||||
user_attributes[location].update(Username=email[:email.find(u'@')])
|
|
||||||
if ou:
|
|
||||||
user_attributes[location].update(OU=user[u'orgUnitPath'])
|
|
||||||
if firstname:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(Firstname=user[u'name'][u'givenName'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if lastname:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(Lastname=user[u'name'][u'familyName'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if fullname:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(Fullname=user[u'name'][u'fullName'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if suspended:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(Suspended=user[u'suspended'])
|
|
||||||
user_attributes[location].update(SuspensionReason=user[u'suspensionReason'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if gal:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(IncludeInGlobalAddressList=user[u'includeInGlobalAddressList'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if photo:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(thumbnailPhotoUrl=user[u'thumbnailPhotoUrl'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if agreed2terms:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(AgreedToTerms=user[u'agreedToTerms'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if changepassword:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(ChangePassword=user[u'changePasswordAtNextLogin'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if admin:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(Admin=user[u'isAdmin'])
|
|
||||||
user_attributes[location].update(DelegatedAdmin=user[u'isDelegatedAdmin'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if id:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(ID=user[u'id'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if creationtime:
|
|
||||||
try:
|
|
||||||
user_attributes[location].update(CreationTime=user[u'creationTime'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if lastlogintime:
|
|
||||||
try:
|
|
||||||
if user[u'lastLoginTime'] == u'1970-01-01T00:00:00.000Z':
|
|
||||||
user_attributes[location].update(LastLoginTime=u'Never')
|
|
||||||
else:
|
|
||||||
user_attributes[location].update(LastLoginTime=user[u'lastLoginTime'])
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if aliases:
|
|
||||||
try:
|
|
||||||
user_aliases = u''
|
|
||||||
for alias in user[u'aliases']:
|
|
||||||
user_aliases += u' %s' % alias
|
|
||||||
if len(user_aliases) > 0:
|
|
||||||
user_aliases = user_aliases[1:]
|
|
||||||
user_attributes[location].update(Aliases=user_aliases)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
try:
|
|
||||||
ne_aliases = ''
|
|
||||||
for alias in user[u'nonEditableAliases']:
|
|
||||||
ne_aliases += u' %s' % alias
|
|
||||||
if len(ne_aliases) > 0:
|
|
||||||
ne_aliases = ne_aliases[1:]
|
|
||||||
user_attributes[location].update(NonEditableAliases=ne_aliases)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
except ValueError:
|
|
||||||
raise
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
if getGroupFeed:
|
if getGroupFeed:
|
||||||
total_users = len(user_attributes) - 1
|
total_users = len(attributes) - 1
|
||||||
user_count = 1
|
user_count = 1
|
||||||
for user in user_attributes[1:]:
|
titles.append(u'Groups')
|
||||||
user_email = user[u'Email']
|
attributes[0].update(Groups=u'Groups')
|
||||||
|
for user in attributes[1:]:
|
||||||
|
user_email = user[u'primaryEmail']
|
||||||
sys.stderr.write(u"Getting Group Membership for %s (%s/%s)\r\n" % (user_email, user_count, total_users))
|
sys.stderr.write(u"Getting Group Membership for %s (%s/%s)\r\n" % (user_email, user_count, total_users))
|
||||||
groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', userKey=user_email)
|
groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', userKey=user_email)
|
||||||
grouplist = u''
|
grouplist = u''
|
||||||
@ -5665,15 +5466,17 @@ def doPrintUsers():
|
|||||||
user.update(Groups=grouplist)
|
user.update(Groups=grouplist)
|
||||||
user_count += 1
|
user_count += 1
|
||||||
if getLicenseFeed:
|
if getLicenseFeed:
|
||||||
|
titles.append(u'Licenses')
|
||||||
|
attributes[0].update(Licenses=u'Licenses')
|
||||||
licenses = doPrintLicenses(return_list=True)
|
licenses = doPrintLicenses(return_list=True)
|
||||||
if len(licenses) > 1:
|
if len(licenses) > 1:
|
||||||
for user in user_attributes[1:]:
|
for user in attributes[1:]:
|
||||||
user_licenses = []
|
user_licenses = []
|
||||||
for license in licenses:
|
for license in licenses:
|
||||||
if license[u'userId'].lower() == user[u'Email'].lower():
|
if license[u'userId'].lower() == user[u'primaryEmail'].lower():
|
||||||
user_licenses.append(license[u'skuId'])
|
user_licenses.append(license[u'skuId'])
|
||||||
user.update(Licenses=u' '.join(user_licenses))
|
user.update(Licenses=u' '.join(user_licenses))
|
||||||
output_csv(user_attributes, titles, u'Users', todrive)
|
output_csv(attributes, titles, u'Users', todrive)
|
||||||
|
|
||||||
def doPrintGroups():
|
def doPrintGroups():
|
||||||
i = 3
|
i = 3
|
||||||
@ -6118,7 +5921,7 @@ def doPrintLicenses(return_list=False):
|
|||||||
for productId in products:
|
for productId in products:
|
||||||
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % productId
|
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % productId
|
||||||
try:
|
try:
|
||||||
licenses = callGAPIpages(service=lic.licenseAssignments(), function=u'listForProduct', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message, customerId=domain, productId=productId, maxResults=1000)
|
licenses = callGAPIpages(service=lic.licenseAssignments(), function=u'listForProduct', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message, customerId=domain, productId=productId, fields=u'items(productId,skuId,userId),nextPageToken')
|
||||||
except apiclient.errors.HttpError:
|
except apiclient.errors.HttpError:
|
||||||
licenses = []
|
licenses = []
|
||||||
for license in licenses:
|
for license in licenses:
|
||||||
@ -6732,7 +6535,7 @@ def OAuthInfo():
|
|||||||
domain = credentials.id_token[u'hd']
|
domain = credentials.id_token[u'hd']
|
||||||
except TypeError:
|
except TypeError:
|
||||||
domain = u'Unknown'
|
domain = u'Unknown'
|
||||||
credentials.user_agent = u'Dito GAM %s / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
credentials.user_agent = u'Dito GAM %s - http://git.io/gam / %s / Python %s.%s.%s %s / %s %s /' % (__version__, __author__,
|
||||||
sys.version_info[0], sys.version_info[1], sys.version_info[2],
|
sys.version_info[0], sys.version_info[1], sys.version_info[2],
|
||||||
sys.version_info[3], platform.platform(), platform.machine())
|
sys.version_info[3], platform.platform(), platform.machine())
|
||||||
disable_ssl_certificate_validation = False
|
disable_ssl_certificate_validation = False
|
||||||
|
Loading…
x
Reference in New Issue
Block a user