mirror of
https://github.com/GAM-team/GAM.git
synced 2025-05-12 20:27:20 +00:00
More cleanup
Handle debug.gam, extra_args.txt in one place Clean up coding for callGAPIpages Simplify coding for disable_ssl_certificate_validation Break up long arg lists into multiple lines for callGData, callGAPI, callGAPIpages Handle missing client_secrets.json inline in doRequestOauth
This commit is contained in:
parent
21f01757a3
commit
2bc0dd5fbe
347
src/gam.py
347
src/gam.py
@ -105,9 +105,9 @@ def convertUTF8(data):
|
|||||||
if isinstance(data, str):
|
if isinstance(data, str):
|
||||||
return data
|
return data
|
||||||
if isinstance(data, unicode):
|
if isinstance(data, unicode):
|
||||||
if os.name != u'nt':
|
if os.name == u'nt':
|
||||||
return data.encode('utf-8')
|
|
||||||
return data
|
return data
|
||||||
|
return data.encode('utf-8')
|
||||||
if isinstance(data, collections.Mapping):
|
if isinstance(data, collections.Mapping):
|
||||||
return dict(map(convertUTF8, data.iteritems()))
|
return dict(map(convertUTF8, data.iteritems()))
|
||||||
if isinstance(data, collections.Iterable):
|
if isinstance(data, collections.Iterable):
|
||||||
@ -191,7 +191,6 @@ gam.exe update group announcements add member jsmith
|
|||||||
...
|
...
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
#
|
#
|
||||||
# Error handling
|
# Error handling
|
||||||
#
|
#
|
||||||
@ -205,7 +204,6 @@ def noPythonSSLExit():
|
|||||||
|
|
||||||
def printLine(message):
|
def printLine(message):
|
||||||
sys.stdout.write(message+u'\n')
|
sys.stdout.write(message+u'\n')
|
||||||
|
|
||||||
#
|
#
|
||||||
# Open a file
|
# Open a file
|
||||||
#
|
#
|
||||||
@ -259,7 +257,7 @@ def writeFile(filename, data, mode=u'wb', continueOnError=False, displayError=Tr
|
|||||||
return False
|
return False
|
||||||
systemErrorExit(6, e)
|
systemErrorExit(6, e)
|
||||||
|
|
||||||
def setGamDirs():
|
def SetGlobalVariables():
|
||||||
global gamPath, gamSiteConfigDir, gamUserConfigDir, gamDriveDir, gamCacheDir
|
global gamPath, gamSiteConfigDir, gamUserConfigDir, gamDriveDir, gamCacheDir
|
||||||
gamPath = os.path.dirname(os.path.realpath(__file__))
|
gamPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
gamSiteConfigDir = os.environ.get(u'GAMSITECONFIGDIR', gamPath)
|
gamSiteConfigDir = os.environ.get(u'GAMSITECONFIGDIR', gamPath)
|
||||||
@ -271,16 +269,15 @@ def setGamDirs():
|
|||||||
gamDriveDir = os.environ.get(u'GAMDRIVEDIR', gamPath)
|
gamDriveDir = os.environ.get(u'GAMDRIVEDIR', gamPath)
|
||||||
if not os.path.isfile(os.path.join(gamUserConfigDir, u'noupdatecheck.txt')):
|
if not os.path.isfile(os.path.join(gamUserConfigDir, u'noupdatecheck.txt')):
|
||||||
doGAMCheckForUpdates()
|
doGAMCheckForUpdates()
|
||||||
|
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
||||||
def doGAMVersion():
|
httplib2.debuglevel = 4
|
||||||
import struct
|
extra_args[u'prettyPrint'] = True
|
||||||
print u'GAM {0} - {1}\n{2}\nPython {3}.{4}.{5} {6}-bit {7}\ngoogle-api-python-client {8}\n{9} {10}\nPath: {11}'.format(__version__, GAM_URL,
|
if os.path.isfile(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT)):
|
||||||
__author__,
|
import ConfigParser
|
||||||
sys.version_info[0], sys.version_info[1], sys.version_info[2],
|
config = ConfigParser.ConfigParser()
|
||||||
struct.calcsize('P')*8, sys.version_info[3],
|
config.optionxform = str
|
||||||
googleapiclient.__version__,
|
config.read(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT))
|
||||||
platform.platform(), platform.machine(),
|
extra_args.update(dict(config.items(u'extra-args')))
|
||||||
gamPath)
|
|
||||||
|
|
||||||
def doGAMCheckForUpdates(forceCheck=False):
|
def doGAMCheckForUpdates(forceCheck=False):
|
||||||
import urllib2
|
import urllib2
|
||||||
@ -318,9 +315,36 @@ def doGAMCheckForUpdates(forceCheck=False):
|
|||||||
printLine(MESSAGE_GAM_EXITING_FOR_UPDATE)
|
printLine(MESSAGE_GAM_EXITING_FOR_UPDATE)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
writeFile(os.path.join(gamUserConfigDir, FN_LAST_UPDATE_CHECK_TXT), str(now_time), continueOnError=True, displayError=forceCheck)
|
writeFile(os.path.join(gamUserConfigDir, FN_LAST_UPDATE_CHECK_TXT), str(now_time), continueOnError=True, displayError=forceCheck)
|
||||||
|
return
|
||||||
except (urllib2.HTTPError, urllib2.URLError):
|
except (urllib2.HTTPError, urllib2.URLError):
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def doGAMVersion():
|
||||||
|
import struct
|
||||||
|
print u'GAM {0} - {1}\n{2}\nPython {3}.{4}.{5} {6}-bit {7}\ngoogle-api-python-client {8}\n{9} {10}\nPath: {11}'.format(__version__, GAM_URL,
|
||||||
|
__author__,
|
||||||
|
sys.version_info[0], sys.version_info[1], sys.version_info[2],
|
||||||
|
struct.calcsize('P')*8, sys.version_info[3],
|
||||||
|
googleapiclient.__version__,
|
||||||
|
platform.platform(), platform.machine(),
|
||||||
|
gamPath)
|
||||||
|
|
||||||
|
def tryOAuth(gdataObject):
|
||||||
|
global domain
|
||||||
|
global customerId
|
||||||
|
storage = oauth2client.file.Storage(os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE', FN_OAUTH2_TXT)))
|
||||||
|
credentials = storage.get()
|
||||||
|
if credentials is None or credentials.invalid:
|
||||||
|
doRequestOAuth()
|
||||||
|
credentials = storage.get()
|
||||||
|
if credentials.access_token_expired:
|
||||||
|
credentials.refresh(httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt'))))
|
||||||
|
gdataObject.additional_headers = {u'Authorization': u'Bearer %s' % credentials.access_token}
|
||||||
|
domain = os.environ.get(u'GA_DOMAIN', credentials.id_token[u'hd']).lower()
|
||||||
|
customerId = os.environ.get(u'CUSTOMER_ID', 'my_customer')
|
||||||
|
gdataObject.domain = domain
|
||||||
|
return True
|
||||||
|
|
||||||
def checkGDataError(e, service):
|
def checkGDataError(e, service):
|
||||||
# First check for errors that need special handling
|
# First check for errors that need special handling
|
||||||
if e[0].get(u'reason', u'') in [u'Token invalid - Invalid token: Stateless token expired', u'Token invalid - Invalid token: Token not found']:
|
if e[0].get(u'reason', u'') in [u'Token invalid - Invalid token: Stateless token expired', u'Token invalid - Invalid token: Token not found']:
|
||||||
@ -372,26 +396,6 @@ def checkGDataError(e, service):
|
|||||||
}
|
}
|
||||||
return u'{0} - {1}'.format(e.error_code, error_code_map.get(e.error_code, u'Unknown Error: {0}'.format(str(e))))
|
return u'{0} - {1}'.format(e.error_code, error_code_map.get(e.error_code, u'Unknown Error: {0}'.format(str(e))))
|
||||||
|
|
||||||
def tryOAuth(gdataObject):
|
|
||||||
global domain
|
|
||||||
global customerId
|
|
||||||
oauth2file = os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE', FN_OAUTH2_TXT))
|
|
||||||
storage = oauth2client.file.Storage(oauth2file)
|
|
||||||
credentials = storage.get()
|
|
||||||
if credentials is None or credentials.invalid:
|
|
||||||
doRequestOAuth()
|
|
||||||
credentials = storage.get()
|
|
||||||
if credentials.access_token_expired:
|
|
||||||
disable_ssl_certificate_validation = False
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
credentials.refresh(httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation))
|
|
||||||
gdataObject.additional_headers = {u'Authorization': u'Bearer %s' % credentials.access_token}
|
|
||||||
domain = os.environ.get(u'GA_DOMAIN', credentials.id_token[u'hd']).lower()
|
|
||||||
customerId = os.environ.get(u'CUSTOMER_ID', 'my_customer')
|
|
||||||
gdataObject.domain = domain
|
|
||||||
return True
|
|
||||||
|
|
||||||
def callGData(service, function, soft_errors=False, throw_errors=[], **kwargs):
|
def callGData(service, function, soft_errors=False, throw_errors=[], **kwargs):
|
||||||
import gdata.apps.service
|
import gdata.apps.service
|
||||||
method = getattr(service, function)
|
method = getattr(service, function)
|
||||||
@ -432,10 +436,7 @@ def callGAPI(service, function, silent_errors=False, soft_errors=False, throw_re
|
|||||||
error = json.loads(e.content)
|
error = json.loads(e.content)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
if n < 3:
|
if n < 3:
|
||||||
disable_ssl_certificate_validation = False
|
service._http.request.credentials.refresh(httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt'))))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
service._http.request.credentials.refresh(httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation))
|
|
||||||
continue
|
continue
|
||||||
if (e.resp[u'status'] == u'503') and (e.content == u'Quota exceeded for the current request'):
|
if (e.resp[u'status'] == u'503') and (e.content == u'Quota exceeded for the current request'):
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
@ -477,33 +478,28 @@ def callGAPI(service, function, silent_errors=False, soft_errors=False, throw_re
|
|||||||
except TypeError, e:
|
except TypeError, e:
|
||||||
systemErrorExit(4, e)
|
systemErrorExit(4, e)
|
||||||
|
|
||||||
def restart_line():
|
|
||||||
sys.stderr.write('\r')
|
|
||||||
sys.stderr.flush()
|
|
||||||
|
|
||||||
def callGAPIpages(service, function, items=u'items', nextPageToken=u'nextPageToken', page_message=None, message_attribute=None, **kwargs):
|
def callGAPIpages(service, function, items=u'items', nextPageToken=u'nextPageToken', page_message=None, message_attribute=None, **kwargs):
|
||||||
pageToken = None
|
pageToken = None
|
||||||
all_pages = list()
|
all_pages = list()
|
||||||
total_items = 0
|
total_items = 0
|
||||||
while True:
|
while True:
|
||||||
this_page = callGAPI(service=service, function=function, pageToken=pageToken, **kwargs)
|
this_page = callGAPI(service=service, function=function, pageToken=pageToken, **kwargs)
|
||||||
if not this_page:
|
if this_page:
|
||||||
this_page = {items: []}
|
pageToken = this_page.get(nextPageToken)
|
||||||
try:
|
if items in this_page:
|
||||||
page_items = len(this_page[items])
|
page_items = len(this_page[items])
|
||||||
except KeyError:
|
|
||||||
page_items = 0
|
|
||||||
total_items += page_items
|
total_items += page_items
|
||||||
|
all_pages.extend(this_page[items])
|
||||||
|
else:
|
||||||
|
this_page = {items: []}
|
||||||
|
page_items = 0
|
||||||
|
else:
|
||||||
|
pageToken = None
|
||||||
|
this_page = {items: []}
|
||||||
|
page_items = 0
|
||||||
if page_message:
|
if page_message:
|
||||||
show_message = page_message
|
show_message = page_message.replace(u'%%num_items%%', str(page_items))
|
||||||
try:
|
|
||||||
show_message = show_message.replace(u'%%num_items%%', str(page_items))
|
|
||||||
except (IndexError, KeyError):
|
|
||||||
show_message = show_message.replace(u'%%num_items%%', '0')
|
|
||||||
try:
|
|
||||||
show_message = show_message.replace(u'%%total_items%%', str(total_items))
|
show_message = show_message.replace(u'%%total_items%%', str(total_items))
|
||||||
except (IndexError, KeyError):
|
|
||||||
show_message = show_message.replace(u'%%total_items%%', '0')
|
|
||||||
if message_attribute:
|
if message_attribute:
|
||||||
try:
|
try:
|
||||||
show_message = show_message.replace(u'%%first_item%%', str(this_page[items][0][message_attribute]))
|
show_message = show_message.replace(u'%%first_item%%', str(this_page[items][0][message_attribute]))
|
||||||
@ -511,16 +507,13 @@ def callGAPIpages(service, function, items=u'items', nextPageToken=u'nextPageTok
|
|||||||
except (IndexError, KeyError):
|
except (IndexError, KeyError):
|
||||||
show_message = show_message.replace(u'%%first_item%%', '')
|
show_message = show_message.replace(u'%%first_item%%', '')
|
||||||
show_message = show_message.replace(u'%%last_item%%', '')
|
show_message = show_message.replace(u'%%last_item%%', '')
|
||||||
restart_line()
|
sys.stderr.write('\r')
|
||||||
|
sys.stderr.flush()
|
||||||
sys.stderr.write(show_message)
|
sys.stderr.write(show_message)
|
||||||
try:
|
if not pageToken:
|
||||||
all_pages += this_page[items]
|
if page_message and (page_message[-1] != u'\n'):
|
||||||
pageToken = this_page[nextPageToken]
|
sys.stderr.write(u'\r\n')
|
||||||
if pageToken == '':
|
sys.stderr.flush()
|
||||||
return all_pages
|
|
||||||
except (IndexError, KeyError):
|
|
||||||
if page_message:
|
|
||||||
sys.stderr.write(u'\n')
|
|
||||||
return all_pages
|
return all_pages
|
||||||
|
|
||||||
API_VER_MAPPING = {
|
API_VER_MAPPING = {
|
||||||
@ -583,20 +576,7 @@ def buildGAPIObject(api):
|
|||||||
doRequestOAuth()
|
doRequestOAuth()
|
||||||
credentials = storage.get()
|
credentials = storage.get()
|
||||||
credentials.user_agent = GAM_INFO
|
credentials.user_agent = GAM_INFO
|
||||||
disable_ssl_certificate_validation = False
|
http = credentials.authorize(httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')), cache=gamCacheDir))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation, cache=gamCacheDir)
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
|
||||||
httplib2.debuglevel = 4
|
|
||||||
extra_args[u'prettyPrint'] = True
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT)):
|
|
||||||
import ConfigParser
|
|
||||||
config = ConfigParser.ConfigParser()
|
|
||||||
config.optionxform = str
|
|
||||||
config.read(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT))
|
|
||||||
extra_args.update(dict(config.items(u'extra-args')))
|
|
||||||
http = credentials.authorize(http)
|
|
||||||
version = getAPIVer(api)
|
version = getAPIVer(api)
|
||||||
if api in [u'directory', u'reports', u'datatransfer']:
|
if api in [u'directory', u'reports', u'datatransfer']:
|
||||||
api = u'admin'
|
api = u'admin'
|
||||||
@ -604,6 +584,9 @@ def buildGAPIObject(api):
|
|||||||
service = googleapiclient.discovery.build(api, version, http=http)
|
service = googleapiclient.discovery.build(api, version, http=http)
|
||||||
except googleapiclient.errors.UnknownApiNameOrVersion:
|
except googleapiclient.errors.UnknownApiNameOrVersion:
|
||||||
service = getServiceFromDiscoveryDocument(api, version, http)
|
service = getServiceFromDiscoveryDocument(api, version, http)
|
||||||
|
except httplib2.ServerNotFoundError as e:
|
||||||
|
sys.stderr.write(u'{0}{1}\n'.format(ERROR_PREFIX, e))
|
||||||
|
sys.exit(8)
|
||||||
except httplib2.CertificateValidationUnsupported:
|
except httplib2.CertificateValidationUnsupported:
|
||||||
noPythonSSLExit()
|
noPythonSSLExit()
|
||||||
try:
|
try:
|
||||||
@ -640,29 +623,17 @@ def buildGAPIServiceObject(api, act_as=None, soft_errors=False):
|
|||||||
key = json_data[u'private_key']
|
key = json_data[u'private_key']
|
||||||
scope = getAPIScope(api)
|
scope = getAPIScope(api)
|
||||||
if act_as == None:
|
if act_as == None:
|
||||||
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope)
|
credentials = oauth2client.client.SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=scope, user_agent=GAM_INFO)
|
||||||
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, user_agent=GAM_INFO, sub=act_as)
|
||||||
credentials.user_agent = GAM_INFO
|
http = credentials.authorize(httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')), cache=gamCacheDir))
|
||||||
disable_ssl_certificate_validation = False
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation, cache=gamCacheDir)
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
|
||||||
httplib2.debuglevel = 4
|
|
||||||
extra_args[u'prettyPrint'] = True
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT)):
|
|
||||||
import ConfigParser
|
|
||||||
config = ConfigParser.ConfigParser()
|
|
||||||
config.optionxform = str
|
|
||||||
config.read(os.path.join(gamUserConfigDir, FN_EXTRA_ARGS_TXT))
|
|
||||||
extra_args.update(dict(config.items(u'extra-args')))
|
|
||||||
http = credentials.authorize(http)
|
|
||||||
version = getAPIVer(api)
|
version = getAPIVer(api)
|
||||||
try:
|
try:
|
||||||
return googleapiclient.discovery.build(api, version, http=http)
|
return googleapiclient.discovery.build(api, version, http=http)
|
||||||
except googleapiclient.errors.UnknownApiNameOrVersion:
|
except googleapiclient.errors.UnknownApiNameOrVersion:
|
||||||
return getServiceFromDiscoveryDocument(api, version, http)
|
return getServiceFromDiscoveryDocument(api, version, http)
|
||||||
|
except httplib2.ServerNotFoundError as e:
|
||||||
|
systemErrorExit(4, e)
|
||||||
except oauth2client.client.AccessTokenRefreshError, e:
|
except oauth2client.client.AccessTokenRefreshError, e:
|
||||||
if e.message in [u'access_denied', u'unauthorized_client: Unauthorized client or scope in request.']:
|
if e.message in [u'access_denied', u'unauthorized_client: Unauthorized client or scope in request.']:
|
||||||
systemErrorExit(5, MESSAGE_CLIENT_API_ACCESS_DENIED.format(SERVICE_ACCOUNT_CLIENT_ID, u','.join(scope)))
|
systemErrorExit(5, MESSAGE_CLIENT_API_ACCESS_DENIED.format(SERVICE_ACCOUNT_CLIENT_ID, u','.join(scope)))
|
||||||
@ -677,10 +648,7 @@ def buildDiscoveryObject(api):
|
|||||||
if api in [u'directory', u'reports']:
|
if api in [u'directory', u'reports']:
|
||||||
api = u'admin'
|
api = u'admin'
|
||||||
params = {'api': api, 'apiVersion': version}
|
params = {'api': api, 'apiVersion': version}
|
||||||
disable_ssl_certificate_validation = False
|
http = httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')), cache=gamCacheDir)
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation, cache=gamCacheDir)
|
|
||||||
requested_url = uritemplate.expand(googleapiclient.discovery.DISCOVERY_URI, params)
|
requested_url = uritemplate.expand(googleapiclient.discovery.DISCOVERY_URI, params)
|
||||||
resp, content = http.request(requested_url)
|
resp, content = http.request(requested_url)
|
||||||
if resp.status == 404:
|
if resp.status == 404:
|
||||||
@ -793,7 +761,8 @@ def showReport():
|
|||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
page_message = u'Got %%num_items%% users\n'
|
page_message = u'Got %%num_items%% users\n'
|
||||||
usage = callGAPIpages(service=rep.userUsageReport(), function=u'get', items=u'usageReports', page_message=page_message, throw_reasons=[u'invalid'], date=str(try_date), userKey=userKey, customerId=customerId, filters=filters, parameters=parameters)
|
usage = callGAPIpages(service=rep.userUsageReport(), function=u'get', items=u'usageReports', page_message=page_message, throw_reasons=[u'invalid'],
|
||||||
|
date=str(try_date), userKey=userKey, customerId=customerId, filters=filters, parameters=parameters)
|
||||||
break
|
break
|
||||||
except googleapiclient.errors.HttpError, e:
|
except googleapiclient.errors.HttpError, e:
|
||||||
error = json.loads(e.content)
|
error = json.loads(e.content)
|
||||||
@ -830,7 +799,8 @@ def showReport():
|
|||||||
elif report in [u'customer', u'customers', u'domain']:
|
elif report in [u'customer', u'customers', u'domain']:
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
usage = callGAPIpages(service=rep.customerUsageReports(), function=u'get', items=u'usageReports', throw_reasons=[u'invalid'], customerId=customerId, date=str(try_date), parameters=parameters)
|
usage = callGAPIpages(service=rep.customerUsageReports(), function=u'get', items=u'usageReports', throw_reasons=[u'invalid'],
|
||||||
|
customerId=customerId, date=str(try_date), parameters=parameters)
|
||||||
break
|
break
|
||||||
except googleapiclient.errors.HttpError, e:
|
except googleapiclient.errors.HttpError, e:
|
||||||
error = json.loads(e.content)
|
error = json.loads(e.content)
|
||||||
@ -878,7 +848,9 @@ def showReport():
|
|||||||
elif report == u'tokens':
|
elif report == u'tokens':
|
||||||
report = u'token'
|
report = u'token'
|
||||||
page_message = u'Got %%num_items%% items\n'
|
page_message = u'Got %%num_items%% items\n'
|
||||||
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)
|
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)
|
||||||
if len(activities) > 0:
|
if len(activities) > 0:
|
||||||
attrs = []
|
attrs = []
|
||||||
titles = []
|
titles = []
|
||||||
@ -3040,7 +3012,9 @@ def showDriveFiles(users):
|
|||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
sys.stderr.write(u'Getting files for %s...\n' % user)
|
sys.stderr.write(u'Getting files for %s...\n' % user)
|
||||||
page_message = u' got %%%%total_items%%%% files for %s...\n' % user
|
page_message = u' got %%%%total_items%%%% files for %s...\n' % user
|
||||||
feed = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message, soft_errors=True, q=query, maxResults=1000, fields=fields)
|
feed = callGAPIpages(service=drive.files(), function=u'list',
|
||||||
|
page_message=page_message, soft_errors=True,
|
||||||
|
q=query, fields=fields, maxResults=1000)
|
||||||
for f_file in feed:
|
for f_file in feed:
|
||||||
a_file = {u'Owner': user}
|
a_file = {u'Owner': user}
|
||||||
for attrib in f_file:
|
for attrib in f_file:
|
||||||
@ -3073,12 +3047,14 @@ def showDriveFiles(users):
|
|||||||
else:
|
else:
|
||||||
print attrib_type
|
print attrib_type
|
||||||
files_attr.append(a_file)
|
files_attr.append(a_file)
|
||||||
output_csv(files_attr, titles, u'%s %s %s Drive Files' % (domain, sys.argv[1], sys.argv[2]), todrive)
|
output_csv(files_attr, titles, u'%s %s Drive Files' % (sys.argv[1], sys.argv[2]), todrive)
|
||||||
|
|
||||||
def doDriveSearch(drive, query=None):
|
def doDriveSearch(drive, query=None):
|
||||||
print u'Searching for files with query: "%s"...' % query
|
print u'Searching for files with query: "%s"...' % query
|
||||||
page_message = u' got %%total_items%% files...\n'
|
page_message = u' got %%total_items%% files...\n'
|
||||||
files = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message, q=query, fields=u'nextPageToken,items(id)', maxResults=1000)
|
files = callGAPIpages(service=drive.files(), function=u'list',
|
||||||
|
page_message=page_message,
|
||||||
|
q=query, fields=u'nextPageToken,items(id)', maxResults=1000)
|
||||||
ids = list()
|
ids = list()
|
||||||
for f_file in files:
|
for f_file in files:
|
||||||
ids.append(f_file[u'id'])
|
ids.append(f_file[u'id'])
|
||||||
@ -3130,7 +3106,8 @@ def showDriveFileTree(users):
|
|||||||
root_folder = callGAPI(service=drive.about(), function=u'get', fields=u'rootFolderId')[u'rootFolderId']
|
root_folder = callGAPI(service=drive.about(), function=u'get', fields=u'rootFolderId')[u'rootFolderId']
|
||||||
sys.stderr.write(u'Getting all files for %s...\n' % user)
|
sys.stderr.write(u'Getting all files for %s...\n' % user)
|
||||||
page_message = u' got %%%%total_items%%%% files for %s...\n' % user
|
page_message = u' got %%%%total_items%%%% files for %s...\n' % user
|
||||||
feed = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message, maxResults=1000, fields=u'items(id,title,parents(id),mimeType),nextPageToken')
|
feed = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message,
|
||||||
|
fields=u'items(id,title,parents(id),mimeType),nextPageToken', maxResults=1000)
|
||||||
printDriveFolderContents(feed, root_folder, 0)
|
printDriveFolderContents(feed, root_folder, 0)
|
||||||
|
|
||||||
def deleteEmptyDriveFolders(users):
|
def deleteEmptyDriveFolders(users):
|
||||||
@ -3144,10 +3121,12 @@ def deleteEmptyDriveFolders(users):
|
|||||||
while deleted_empty:
|
while deleted_empty:
|
||||||
sys.stderr.write(u'Getting folders for %s...\n' % user)
|
sys.stderr.write(u'Getting folders for %s...\n' % user)
|
||||||
page_message = u' got %%%%total_items%%%% folders for %s...\n' % user
|
page_message = u' got %%%%total_items%%%% folders for %s...\n' % user
|
||||||
feed = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message, q=query, maxResults=1000, fields=u'items(title,id),nextPageToken')
|
feed = callGAPIpages(service=drive.files(), function=u'list', page_message=page_message,
|
||||||
|
q=query, fields=u'items(title,id),nextPageToken', maxResults=1000)
|
||||||
deleted_empty = False
|
deleted_empty = False
|
||||||
for folder in feed:
|
for folder in feed:
|
||||||
children = callGAPI(service=drive.children(), function=u'list', folderId=folder[u'id'], maxResults=1, fields=u'items(id)')
|
children = callGAPI(service=drive.children(), function=u'list',
|
||||||
|
folderId=folder[u'id'], fields=u'items(id)', maxResults=1)
|
||||||
if not u'items' in children or len(children[u'items']) == 0:
|
if not u'items' in children or len(children[u'items']) == 0:
|
||||||
print convertUTF8(u' deleting empty folder %s...' % folder[u'title'])
|
print convertUTF8(u' deleting empty folder %s...' % folder[u'title'])
|
||||||
callGAPI(service=drive.files(), function=u'delete', fileId=folder[u'id'])
|
callGAPI(service=drive.files(), function=u'delete', fileId=folder[u'id'])
|
||||||
@ -3602,14 +3581,16 @@ def transferDriveFiles(users):
|
|||||||
source_permissionid = source_about[u'permissionId']
|
source_permissionid = source_about[u'permissionId']
|
||||||
print u"Getting file list for source user: %s..." % user
|
print u"Getting file list for source user: %s..." % user
|
||||||
page_message = u' got %%total_items%% files\n'
|
page_message = u' got %%total_items%% files\n'
|
||||||
source_drive_files = callGAPIpages(service=source_drive.files(), function=u'list', page_message=page_message, q=u"'me' in owners and trashed = false", fields=u'items(id,parents,mimeType),nextPageToken')
|
source_drive_files = callGAPIpages(service=source_drive.files(), function=u'list', page_message=page_message,
|
||||||
|
q=u"'me' in owners and trashed = false", fields=u'items(id,parents,mimeType),nextPageToken')
|
||||||
all_source_file_ids = []
|
all_source_file_ids = []
|
||||||
for source_drive_file in source_drive_files:
|
for source_drive_file in source_drive_files:
|
||||||
all_source_file_ids.append(source_drive_file[u'id'])
|
all_source_file_ids.append(source_drive_file[u'id'])
|
||||||
total_count = len(source_drive_files)
|
total_count = len(source_drive_files)
|
||||||
print u"Getting folder list for target user: %s..." % target_user
|
print u"Getting folder list for target user: %s..." % target_user
|
||||||
page_message = u' got %%total_items%% folders\n'
|
page_message = u' got %%total_items%% folders\n'
|
||||||
target_folders = callGAPIpages(service=target_drive.files(), function=u'list', page_message=page_message, q=u"'me' in owners and mimeType = 'application/vnd.google-apps.folder'", fields=u'items(id,title),nextPageToken')
|
target_folders = callGAPIpages(service=target_drive.files(), function=u'list', page_message=page_message,
|
||||||
|
q=u"'me' in owners and mimeType = 'application/vnd.google-apps.folder'", fields=u'items(id,title),nextPageToken')
|
||||||
got_top_folder = False
|
got_top_folder = False
|
||||||
all_target_folder_ids = []
|
all_target_folder_ids = []
|
||||||
for target_folder in target_folders:
|
for target_folder in target_folders:
|
||||||
@ -4366,7 +4347,10 @@ def doFilter(users):
|
|||||||
emailsettings.domain = domain #make sure it's back at default domain
|
emailsettings.domain = domain #make sure it's back at default domain
|
||||||
print u"Creating filter for %s (%s of %s)" % (user+'@'+emailsettings.domain, i, count)
|
print u"Creating filter for %s (%s of %s)" % (user+'@'+emailsettings.domain, i, count)
|
||||||
i += 1
|
i += 1
|
||||||
callGData(service=emailsettings, function=u'CreateFilter', soft_errors=True, username=user, from_=from_, to=to, subject=subject, has_the_word=has_the_word, does_not_have_the_word=does_not_have_the_word, has_attachment=has_attachment, label=label, should_mark_as_read=should_mark_as_read, should_archive=should_archive, should_star=should_star, forward_to=forward_to, should_trash=should_trash, should_not_spam=should_not_spam)
|
callGData(service=emailsettings, function=u'CreateFilter', soft_errors=True,
|
||||||
|
username=user, from_=from_, to=to, subject=subject, has_the_word=has_the_word, does_not_have_the_word=does_not_have_the_word,
|
||||||
|
has_attachment=has_attachment, label=label, should_mark_as_read=should_mark_as_read, should_archive=should_archive,
|
||||||
|
should_star=should_star, forward_to=forward_to, should_trash=should_trash, should_not_spam=should_not_spam)
|
||||||
|
|
||||||
def doForward(users):
|
def doForward(users):
|
||||||
action = forward_to = None
|
action = forward_to = None
|
||||||
@ -4458,7 +4442,7 @@ def getSignature(users):
|
|||||||
signature = callGData(service=emailsettings, function=u'GetSignature', soft_errors=True, username=user)
|
signature = callGData(service=emailsettings, function=u'GetSignature', soft_errors=True, username=user)
|
||||||
try:
|
try:
|
||||||
sys.stderr.write(u"User %s signature:\n " % (user+u'@'+emailsettings.domain))
|
sys.stderr.write(u"User %s signature:\n " % (user+u'@'+emailsettings.domain))
|
||||||
print u" %s" % signature[u'signature']
|
print convertUTF8(u" %s" % signature[u'signature'])
|
||||||
except TypeError:
|
except TypeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -4534,7 +4518,7 @@ def doVacation(users):
|
|||||||
i += 1
|
i += 1
|
||||||
callGData(service=emailsettings, function=u'UpdateVacation',
|
callGData(service=emailsettings, function=u'UpdateVacation',
|
||||||
soft_errors=True,
|
soft_errors=True,
|
||||||
username=userName, enable=enable, subject=subject, message=message,
|
username=user, enable=enable, subject=subject, message=message,
|
||||||
contacts_only=contacts_only, domain_only=domain_only, start_date=start_date, end_date=end_date)
|
contacts_only=contacts_only, domain_only=domain_only, start_date=start_date, end_date=end_date)
|
||||||
|
|
||||||
def getVacation(users):
|
def getVacation(users):
|
||||||
@ -5737,7 +5721,8 @@ def doUpdateCros():
|
|||||||
cd = buildGAPIObject(u'directory')
|
cd = buildGAPIObject(u'directory')
|
||||||
if deviceId[:6].lower() == u'query:':
|
if deviceId[:6].lower() == u'query:':
|
||||||
query = deviceId[6:]
|
query = deviceId[6:]
|
||||||
devices_result = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices', query=query, customerId=customerId, fields=u'chromeosdevices/deviceId,nextPageToken')
|
devices_result = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices',
|
||||||
|
query=query, customerId=customerId, fields=u'chromeosdevices/deviceId,nextPageToken')
|
||||||
devices = list()
|
devices = list()
|
||||||
for a_device in devices_result:
|
for a_device in devices_result:
|
||||||
devices.append(a_device[u'deviceId'])
|
devices.append(a_device[u'deviceId'])
|
||||||
@ -5836,7 +5821,8 @@ def doUpdateOrg():
|
|||||||
current_cros = 1
|
current_cros = 1
|
||||||
for cros in users:
|
for cros in users:
|
||||||
sys.stderr.write(u' moving %s to %s (%s/%s)\n' % (cros, orgUnitPath, current_cros, cros_count))
|
sys.stderr.write(u' moving %s to %s (%s/%s)\n' % (cros, orgUnitPath, current_cros, cros_count))
|
||||||
callGAPI(service=cd.chromeosdevices(), function=u'patch', soft_errors=True, customerId=customerId, deviceId=cros, body={u'orgUnitPath': '//%s' % orgUnitPath})
|
callGAPI(service=cd.chromeosdevices(), function=u'patch', soft_errors=True,
|
||||||
|
customerId=customerId, deviceId=cros, body={u'orgUnitPath': '//%s' % orgUnitPath})
|
||||||
current_cros += 1
|
current_cros += 1
|
||||||
else:
|
else:
|
||||||
user_count = len(users)
|
user_count = len(users)
|
||||||
@ -5914,8 +5900,7 @@ def doGetUserInfo(user_email=None):
|
|||||||
try:
|
try:
|
||||||
user_email = sys.argv[3]
|
user_email = sys.argv[3]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
oauth2file = os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE'), FN_OAUTH2_TXT)
|
storage = oauth2client.file.Storage(os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE'), FN_OAUTH2_TXT))
|
||||||
storage = oauth2client.file.Storage(oauth2file)
|
|
||||||
credentials = storage.get()
|
credentials = storage.get()
|
||||||
if credentials is None or credentials.invalid:
|
if credentials is None or credentials.invalid:
|
||||||
doRequestOAuth()
|
doRequestOAuth()
|
||||||
@ -6116,7 +6101,8 @@ def doGetGroupInfo(group_name=None):
|
|||||||
group_name = group_name+u'@'+domain
|
group_name = group_name+u'@'+domain
|
||||||
basic_info = callGAPI(service=cd.groups(), function=u'get', groupKey=group_name)
|
basic_info = callGAPI(service=cd.groups(), function=u'get', groupKey=group_name)
|
||||||
try:
|
try:
|
||||||
settings = callGAPI(service=gs.groups(), function=u'get', retry_reasons=[u'serviceLimit'], groupUniqueId=basic_info[u'email'], throw_reasons=u'authError') # Use email address retrieved from cd since GS API doesn't support uid
|
settings = callGAPI(service=gs.groups(), function=u'get', retry_reasons=[u'serviceLimit'], throw_reasons=u'authError',
|
||||||
|
groupUniqueId=basic_info[u'email']) # Use email address retrieved from cd since GS API doesn't support uid
|
||||||
except googleapiclient.errors.HttpError:
|
except googleapiclient.errors.HttpError:
|
||||||
pass
|
pass
|
||||||
print u''
|
print u''
|
||||||
@ -6180,7 +6166,7 @@ def doGetResourceCalendarInfo():
|
|||||||
rescal = getResCalObject()
|
rescal = getResCalObject()
|
||||||
result = callGData(service=rescal, function=u'RetrieveResourceCalendar', id=resId)
|
result = callGData(service=rescal, function=u'RetrieveResourceCalendar', id=resId)
|
||||||
print u' Resource ID: '+result[u'resourceId']
|
print u' Resource ID: '+result[u'resourceId']
|
||||||
print u' Common Name: '+result[u'resourceCommonName']
|
print u' Name: '+result[u'resourceCommonName']
|
||||||
print u' Email: '+result[u'resourceEmail']
|
print u' Email: '+result[u'resourceEmail']
|
||||||
try:
|
try:
|
||||||
print u' Type: '+result[u'resourceType']
|
print u' Type: '+result[u'resourceType']
|
||||||
@ -6450,7 +6436,9 @@ def doGetOrgInfo():
|
|||||||
name = result[u'orgUnitPath']
|
name = result[u'orgUnitPath']
|
||||||
print u'Users: '
|
print u'Users: '
|
||||||
page_message = u'Got %%total_items%% users: %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%total_items%% users: %%first_item%% - %%last_item%%\n'
|
||||||
users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, message_attribute=u'primaryEmail', customer=customerId, query=u"orgUnitPath='%s'" % name, maxResults=500, fields=u'users(primaryEmail,orgUnitPath),nextPageToken')
|
users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
message_attribute=u'primaryEmail', customer=customerId, query=u"orgUnitPath='%s'" % name,
|
||||||
|
fields=u'users(primaryEmail,orgUnitPath),nextPageToken', maxResults=500)
|
||||||
for user in users:
|
for user in users:
|
||||||
if show_children or (name.lower() == user[u'orgUnitPath'].lower()):
|
if show_children or (name.lower() == user[u'orgUnitPath'].lower()):
|
||||||
sys.stdout.write(u' %s' % user[u'primaryEmail'])
|
sys.stdout.write(u' %s' % user[u'primaryEmail'])
|
||||||
@ -6677,7 +6665,10 @@ def doUpdateInstance():
|
|||||||
else:
|
else:
|
||||||
print u'ERROR: unknown option for "gam update domain sso_settings...": %s' % sys.argv[i]
|
print u'ERROR: unknown option for "gam update domain sso_settings...": %s' % sys.argv[i]
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
callGData(service=adminObj, function=u'UpdateSSOSettings', enableSSO=enableSSO, samlSignonUri=samlSignonUri, samlLogoutUri=samlLogoutUri, changePasswordUri=changePasswordUri, ssoWhitelist=ssoWhitelist, useDomainSpecificIssuer=useDomainSpecificIssuer)
|
callGData(service=adminObj, function=u'UpdateSSOSettings', enableSSO=enableSSO,
|
||||||
|
samlSignonUri=samlSignonUri, samlLogoutUri=samlLogoutUri,
|
||||||
|
changePasswordUri=changePasswordUri, ssoWhitelist=ssoWhitelist,
|
||||||
|
useDomainSpecificIssuer=useDomainSpecificIssuer)
|
||||||
elif command == u'sso_key':
|
elif command == u'sso_key':
|
||||||
keyFile = sys.argv[4]
|
keyFile = sys.argv[4]
|
||||||
keyData = readFile(keyFile)
|
keyData = readFile(keyFile)
|
||||||
@ -6746,7 +6737,8 @@ def doUpdateInstance():
|
|||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam update instance email_route"' % sys.argv[i]
|
print u'ERROR: %s is not a valid argument for "gam update instance email_route"' % sys.argv[i]
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
callGData(service=adminObj, function=u'AddEmailRoute', routeDestination=destination, routeRewriteTo=rewrite_to, routeEnabled=enabled, bounceNotifications=bounce_notifications, accountHandling=account_handling)
|
callGData(service=adminObj, function=u'AddEmailRoute', routeDestination=destination, routeRewriteTo=rewrite_to, routeEnabled=enabled,
|
||||||
|
bounceNotifications=bounce_notifications, accountHandling=account_handling)
|
||||||
else:
|
else:
|
||||||
print u'ERROR: %s is not a valid argument for "gam update instance"' % command
|
print u'ERROR: %s is not a valid argument for "gam update instance"' % command
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
@ -6867,7 +6859,8 @@ def doUndeleteUser():
|
|||||||
user = u'%s@%s' % (user, domain)
|
user = u'%s@%s' % (user, domain)
|
||||||
if not user_uid:
|
if not user_uid:
|
||||||
print u'Looking up UID for %s...' % user
|
print u'Looking up UID for %s...' % user
|
||||||
deleted_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', customer=customerId, showDeleted=True, maxResults=500)
|
deleted_users = callGAPIpages(service=cd.users(), function=u'list',
|
||||||
|
items=u'users', customer=customerId, showDeleted=True, maxResults=500)
|
||||||
matching_users = list()
|
matching_users = list()
|
||||||
for deleted_user in deleted_users:
|
for deleted_user in deleted_users:
|
||||||
if str(deleted_user[u'primaryEmail']).lower() == user:
|
if str(deleted_user[u'primaryEmail']).lower() == user:
|
||||||
@ -6962,9 +6955,9 @@ def output_csv(csv_list, titles, list_type, todrive):
|
|||||||
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
print u'{0}{1}'.format(WARNING_PREFIX, MESSAGE_RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET)
|
||||||
convert = False
|
convert = False
|
||||||
drive = buildGAPIObject(u'drive')
|
drive = buildGAPIObject(u'drive')
|
||||||
string_data = string_file.getvalue()
|
result = callGAPI(service=drive.files(), function=u'insert', convert=convert,
|
||||||
media = googleapiclient.http.MediaInMemoryUpload(string_data, mimetype=u'text/csv')
|
body={u'description': u' '.join(sys.argv), u'title': u'%s - %s' % (domain, list_type), u'mimeType': u'text/csv'},
|
||||||
result = callGAPI(service=drive.files(), function=u'insert', convert=convert, body={u'description': u' '.join(sys.argv), u'title': u'%s - %s' % (domain, list_type), u'mimeType': u'text/csv'}, media_body=media)
|
media_body=googleapiclient.http.MediaInMemoryUpload(string_file.getvalue(), mimetype=u'text/csv'))
|
||||||
file_url = result[u'alternateLink']
|
file_url = result[u'alternateLink']
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'nobrowser.txt')):
|
if os.path.isfile(os.path.join(gamUserConfigDir, u'nobrowser.txt')):
|
||||||
msg_txt = u'Drive file uploaded to:\n %s' % file_url
|
msg_txt = u'Drive file uploaded to:\n %s' % file_url
|
||||||
@ -7126,7 +7119,10 @@ def doPrintUsers():
|
|||||||
fields = u'nextPageToken,users(%s)' % u','.join(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, viewType=viewType, query=query, projection=projection, customFieldMask=customFieldMask)
|
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, orderBy=orderBy, sortOrder=sortOrder, viewType=viewType,
|
||||||
|
query=query, projection=projection, customFieldMask=customFieldMask, maxResults=500)
|
||||||
titles = [u'primaryEmail',]
|
titles = [u'primaryEmail',]
|
||||||
attributes = []
|
attributes = []
|
||||||
for user in all_users:
|
for user in all_users:
|
||||||
@ -7258,7 +7254,8 @@ def doPrintGroups():
|
|||||||
customerId = None
|
customerId = None
|
||||||
sys.stderr.write(u"Retrieving All Groups for Google Apps account (may take some time on a large account)...\n")
|
sys.stderr.write(u"Retrieving All Groups for Google Apps account (may take some time on a large account)...\n")
|
||||||
page_message = u'Got %%num_items%% groups: %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%num_items%% groups: %%first_item%% - %%last_item%%\n'
|
||||||
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message, message_attribute=u'email', customer=customerId, domain=usedomain, userKey=usemember, fields=fields)
|
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message,
|
||||||
|
message_attribute=u'email', customer=customerId, domain=usedomain, userKey=usemember, fields=fields)
|
||||||
total_groups = len(all_groups)
|
total_groups = len(all_groups)
|
||||||
count = 0
|
count = 0
|
||||||
for group_vals in all_groups:
|
for group_vals in all_groups:
|
||||||
@ -7305,7 +7302,8 @@ def doPrintGroups():
|
|||||||
roles = u','.join(roles)
|
roles = u','.join(roles)
|
||||||
sys.stderr.write(u' Getting %s for %s (%s of %s)\n' % (roles, group_vals[u'email'], count, total_groups))
|
sys.stderr.write(u' Getting %s for %s (%s of %s)\n' % (roles, group_vals[u'email'], count, total_groups))
|
||||||
page_message = u'Got %%num_items%% members: %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%num_items%% members: %%first_item%% - %%last_item%%\n'
|
||||||
all_group_members = callGAPIpages(service=cd.members(), function=u'list', items=u'members', page_message=page_message, message_attribute=u'email', groupKey=group_vals[u'email'], roles=roles, fields=u'nextPageToken,members(email,role)')
|
all_group_members = callGAPIpages(service=cd.members(), function=u'list', items=u'members', page_message=page_message,
|
||||||
|
message_attribute=u'email', groupKey=group_vals[u'email'], roles=roles, fields=u'nextPageToken,members(email,role)')
|
||||||
if members:
|
if members:
|
||||||
all_true_members = list()
|
all_true_members = list()
|
||||||
if managers:
|
if managers:
|
||||||
@ -7462,7 +7460,9 @@ def doPrintAliases():
|
|||||||
titles = [u'Alias', u'Target', u'TargetType']
|
titles = [u'Alias', u'Target', u'TargetType']
|
||||||
sys.stderr.write(u"Retrieving All User Aliases for %s organization (may take some time on large domain)...\n" % domain)
|
sys.stderr.write(u"Retrieving All User Aliases for %s organization (may take some time on large domain)...\n" % domain)
|
||||||
page_message = u'Got %%num_items%% users %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%num_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=customerId, fields=u'users(primaryEmail,aliases),nextPageToken', maxResults=500)
|
all_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
message_attribute=u'primaryEmail', customer=customerId,
|
||||||
|
fields=u'users(primaryEmail,aliases),nextPageToken', maxResults=500)
|
||||||
for user in all_users:
|
for user in all_users:
|
||||||
try:
|
try:
|
||||||
for alias in user[u'aliases']:
|
for alias in user[u'aliases']:
|
||||||
@ -7471,7 +7471,9 @@ def doPrintAliases():
|
|||||||
continue
|
continue
|
||||||
sys.stderr.write(u"Retrieving All User Aliases for %s organization (may take some time on large domain)...\n" % domain)
|
sys.stderr.write(u"Retrieving All User Aliases for %s organization (may take some time on large domain)...\n" % domain)
|
||||||
page_message = u'Got %%num_items%% groups %%first_item%% - %%last_item%%\n'
|
page_message = u'Got %%num_items%% groups %%first_item%% - %%last_item%%\n'
|
||||||
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message, message_attribute=u'email', customer=customerId, fields=u'groups(email,aliases),nextPageToken')
|
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', page_message=page_message,
|
||||||
|
message_attribute=u'email', customer=customerId,
|
||||||
|
fields=u'groups(email,aliases),nextPageToken')
|
||||||
for group in all_groups:
|
for group in all_groups:
|
||||||
try:
|
try:
|
||||||
for alias in group[u'aliases']:
|
for alias in group[u'aliases']:
|
||||||
@ -7496,7 +7498,8 @@ def doPrintGroupMembers():
|
|||||||
cd = buildGAPIObject(u'directory')
|
cd = buildGAPIObject(u'directory')
|
||||||
member_attributes = [{u'group': u'group'},]
|
member_attributes = [{u'group': u'group'},]
|
||||||
if not all_groups:
|
if not all_groups:
|
||||||
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', message_attribute=u'email', customer=customerId, fields=u'nextPageToken,groups(email)')
|
all_groups = callGAPIpages(service=cd.groups(), function=u'list', items=u'groups', message_attribute=u'email',
|
||||||
|
customer=customerId, fields=u'nextPageToken,groups(email)')
|
||||||
total_groups = len(all_groups)
|
total_groups = len(all_groups)
|
||||||
i = 1
|
i = 1
|
||||||
for group in all_groups:
|
for group in all_groups:
|
||||||
@ -7551,7 +7554,9 @@ def doPrintMobileDevices():
|
|||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
sys.stderr.write(u'Retrieving All Mobile Devices for organization (may take some time for large accounts)...\n')
|
sys.stderr.write(u'Retrieving All Mobile Devices for organization (may take some time for large accounts)...\n')
|
||||||
page_message = u'Got %%num_items%% mobile devices...\n'
|
page_message = u'Got %%num_items%% mobile devices...\n'
|
||||||
all_mobile = callGAPIpages(service=cd.mobiledevices(), function=u'list', items=u'mobiledevices', page_message=page_message, customerId=customerId, query=query, orderBy=orderBy, sortOrder=sortOrder)
|
all_mobile = callGAPIpages(service=cd.mobiledevices(), function=u'list', items=u'mobiledevices', page_message=page_message,
|
||||||
|
customerId=customerId, query=query,
|
||||||
|
orderBy=orderBy, sortOrder=sortOrder, maxResults=500)
|
||||||
for mobile in all_mobile:
|
for mobile in all_mobile:
|
||||||
mobiledevice = dict()
|
mobiledevice = dict()
|
||||||
for title in mobile:
|
for title in mobile:
|
||||||
@ -7632,7 +7637,8 @@ def doPrintCrosDevices():
|
|||||||
sys.stderr.write(u'Retrieving All Chrome OS Devices for organization (may take some time for large accounts)...\n')
|
sys.stderr.write(u'Retrieving All Chrome OS Devices for organization (may take some time for large accounts)...\n')
|
||||||
page_message = u'Got %%num_items%% Chrome devices...\n'
|
page_message = u'Got %%num_items%% Chrome devices...\n'
|
||||||
all_cros = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices', page_message=page_message,
|
all_cros = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices', page_message=page_message,
|
||||||
query=query, customerId=customerId, projection=projection, orderBy=orderBy, sortOrder=sortOrder)
|
query=query, customerId=customerId, projection=projection,
|
||||||
|
orderBy=orderBy, sortOrder=sortOrder, maxResults=500)
|
||||||
if all_cros:
|
if all_cros:
|
||||||
if (not noLists) and (not selectAttrib):
|
if (not noLists) and (not selectAttrib):
|
||||||
for cros in all_cros:
|
for cros in all_cros:
|
||||||
@ -7697,14 +7703,16 @@ def doPrintLicenses(return_list=False, skus=None):
|
|||||||
product, sku = getProductAndSKU(sku)
|
product, sku = getProductAndSKU(sku)
|
||||||
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % sku
|
page_message = u'Got %%%%total_items%%%% Licenses for %s...\n' % sku
|
||||||
try:
|
try:
|
||||||
licenses += callGAPIpages(service=lic.licenseAssignments(), function=u'listForProductAndSku', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message, customerId=domain, productId=product, skuId=sku, fields=u'items(productId,skuId,userId),nextPageToken')
|
licenses += callGAPIpages(service=lic.licenseAssignments(), function=u'listForProductAndSku', throw_reasons=[u'invalid', u'forbidden'], page_message=page_message,
|
||||||
|
customerId=domain, productId=product, skuId=sku, fields=u'items(productId,skuId,userId),nextPageToken')
|
||||||
except googleapiclient.errors.HttpError:
|
except googleapiclient.errors.HttpError:
|
||||||
licenses += []
|
licenses += []
|
||||||
else:
|
else:
|
||||||
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, fields=u'items(productId,skuId,userId),nextPageToken')
|
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 googleapiclient.errors.HttpError:
|
except googleapiclient.errors.HttpError:
|
||||||
licenses = +[]
|
licenses = +[]
|
||||||
for u_license in licenses:
|
for u_license in licenses:
|
||||||
@ -8187,7 +8195,8 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"Getting %s of %s (may take some time for large groups)..." % (member_type_message, group))
|
sys.stderr.write(u"Getting %s of %s (may take some time for large groups)..." % (member_type_message, group))
|
||||||
page_message = u'Got %%%%total_items%%%% %s...' % member_type_message
|
page_message = u'Got %%%%total_items%%%% %s...' % member_type_message
|
||||||
members = callGAPIpages(service=cd.members(), function=u'list', items=u'members', page_message=page_message, groupKey=group, roles=member_type, fields=u'nextPageToken,members(email,id)')
|
members = callGAPIpages(service=cd.members(), function=u'list', items=u'members', page_message=page_message,
|
||||||
|
groupKey=group, roles=member_type, fields=u'nextPageToken,members(email,id)')
|
||||||
users = []
|
users = []
|
||||||
for member in members:
|
for member in members:
|
||||||
if return_uids:
|
if return_uids:
|
||||||
@ -8204,7 +8213,9 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"Getting all users in the Google Apps organization (may take some time on a large domain)...\n")
|
sys.stderr.write(u"Getting all users in the Google Apps organization (may take some time on a large domain)...\n")
|
||||||
page_message = u'Got %%total_items%% users...'
|
page_message = u'Got %%total_items%% users...'
|
||||||
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, customer=customerId, fields=u'nextPageToken,users(primaryEmail,id,orgUnitPath)', query=u"orgUnitPath='%s'" % ou, maxResults=500)
|
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
customer=customerId, fields=u'nextPageToken,users(primaryEmail,id,orgUnitPath)',
|
||||||
|
query=u"orgUnitPath='%s'" % ou, maxResults=500)
|
||||||
for member in members:
|
for member in members:
|
||||||
if ou.lower() != member[u'orgUnitPath'].lower():
|
if ou.lower() != member[u'orgUnitPath'].lower():
|
||||||
continue
|
continue
|
||||||
@ -8224,7 +8235,9 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"Getting all users in the Google Apps organization (may take some time on a large domain)...\n")
|
sys.stderr.write(u"Getting all users in the Google Apps organization (may take some time on a large domain)...\n")
|
||||||
page_message = u'Got %%total_items%% users..'
|
page_message = u'Got %%total_items%% users..'
|
||||||
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, customer=customerId, fields=u'nextPageToken,users(primaryEmail,id)', query=u"orgUnitPath='%s'" % ou, maxResults=500)
|
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
customer=customerId, fields=u'nextPageToken,users(primaryEmail,id)',
|
||||||
|
query=u"orgUnitPath='%s'" % ou, maxResults=500)
|
||||||
for member in members:
|
for member in members:
|
||||||
if return_uids:
|
if return_uids:
|
||||||
users.append(member[u'id'])
|
users.append(member[u'id'])
|
||||||
@ -8238,7 +8251,9 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"Getting all users that match query %s (may take some time on a large domain)...\n" % entity)
|
sys.stderr.write(u"Getting all users that match query %s (may take some time on a large domain)...\n" % entity)
|
||||||
page_message = u'Got %%total_items%% users...'
|
page_message = u'Got %%total_items%% users...'
|
||||||
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, customer=customerId, fields=u'nextPageToken,users(primaryEmail,id)', query=entity, maxResults=500)
|
members = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
customer=customerId, fields=u'nextPageToken,users(primaryEmail,id)',
|
||||||
|
query=entity, maxResults=500)
|
||||||
for member in members:
|
for member in members:
|
||||||
if return_uids:
|
if return_uids:
|
||||||
users.append(member[u'id'])
|
users.append(member[u'id'])
|
||||||
@ -8289,7 +8304,9 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
if not silent:
|
if not silent:
|
||||||
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...'
|
page_message = u'Got %%total_items%% users...'
|
||||||
all_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message, customer=customerId, fields=u'nextPageToken,users(primaryEmail,suspended,id)', maxResults=500)
|
all_users = callGAPIpages(service=cd.users(), function=u'list', items=u'users', page_message=page_message,
|
||||||
|
customer=customerId,
|
||||||
|
fields=u'nextPageToken,users(primaryEmail,suspended,id)', maxResults=500)
|
||||||
for member in all_users:
|
for member in all_users:
|
||||||
if member[u'suspended'] == False:
|
if member[u'suspended'] == False:
|
||||||
if return_uids:
|
if return_uids:
|
||||||
@ -8301,7 +8318,9 @@ def getUsersToModify(entity_type=None, entity=None, silent=False, return_uids=Fa
|
|||||||
elif entity.lower() == u'cros':
|
elif entity.lower() == u'cros':
|
||||||
if not silent:
|
if not silent:
|
||||||
sys.stderr.write(u"Getting all CrOS devices in Google Apps account (may take some time on a large account)...\n")
|
sys.stderr.write(u"Getting all CrOS devices in Google Apps account (may take some time on a large account)...\n")
|
||||||
all_cros = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices', customerId=customerId, fields=u'nextPageToken,chromeosdevices(deviceId)')
|
all_cros = callGAPIpages(service=cd.chromeosdevices(), function=u'list', items=u'chromeosdevices',
|
||||||
|
customerId=customerId, fields=u'nextPageToken,chromeosdevices(deviceId)',
|
||||||
|
maxResults=500)
|
||||||
for member in all_cros:
|
for member in all_cros:
|
||||||
users.append(member[u'deviceId'])
|
users.append(member[u'deviceId'])
|
||||||
if not silent:
|
if not silent:
|
||||||
@ -8345,12 +8364,7 @@ def OAuthInfo():
|
|||||||
doRequestOAuth()
|
doRequestOAuth()
|
||||||
credentials = storage.get()
|
credentials = storage.get()
|
||||||
credentials.user_agent = GAM_INFO
|
credentials.user_agent = GAM_INFO
|
||||||
disable_ssl_certificate_validation = False
|
http = httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation)
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
|
||||||
httplib2.debuglevel = 4
|
|
||||||
if credentials.access_token_expired:
|
if credentials.access_token_expired:
|
||||||
credentials.refresh(http)
|
credentials.refresh(http)
|
||||||
access_token = credentials.access_token
|
access_token = credentials.access_token
|
||||||
@ -8378,12 +8392,7 @@ def doDeleteOAuth():
|
|||||||
credentials.revoke_uri = oauth2client.GOOGLE_REVOKE_URI
|
credentials.revoke_uri = oauth2client.GOOGLE_REVOKE_URI
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
systemErrorExit(1, u'Authorization doesn\'t exist')
|
systemErrorExit(1, u'Authorization doesn\'t exist')
|
||||||
disable_ssl_certificate_validation = False
|
http = httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation)
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
|
||||||
httplib2.debuglevel = 4
|
|
||||||
sys.stderr.write(u'This OAuth token will self-destruct in 3...')
|
sys.stderr.write(u'This OAuth token will self-destruct in 3...')
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
sys.stderr.write(u'2...')
|
sys.stderr.write(u'2...')
|
||||||
@ -8398,9 +8407,9 @@ def doDeleteOAuth():
|
|||||||
os.remove(oauth2file)
|
os.remove(oauth2file)
|
||||||
|
|
||||||
class cmd_flags(object):
|
class cmd_flags(object):
|
||||||
def __init__(self):
|
def __init__(self, noLocalWebserver):
|
||||||
self.short_url = True
|
self.short_url = True
|
||||||
self.noauth_local_webserver = False
|
self.noauth_local_webserver = noLocalWebserver
|
||||||
self.logging_level = u'ERROR'
|
self.logging_level = u'ERROR'
|
||||||
self.auth_host_name = u'localhost'
|
self.auth_host_name = u'localhost'
|
||||||
self.auth_host_port = [8080, 9090]
|
self.auth_host_port = [8080, 9090]
|
||||||
@ -8552,23 +8561,15 @@ access or an 'a' to grant action-only access.
|
|||||||
scopes.append(u'%s.readonly' % possible_scopes[i])
|
scopes.append(u'%s.readonly' % possible_scopes[i])
|
||||||
elif selected_scopes[i] == u'A':
|
elif selected_scopes[i] == u'A':
|
||||||
scopes.append(u'%s.action' % possible_scopes[i])
|
scopes.append(u'%s.action' % possible_scopes[i])
|
||||||
FLOW = oauth2client.client.flow_from_clientsecrets(CLIENT_SECRETS,
|
try:
|
||||||
scope=scopes,
|
FLOW = oauth2client.client.flow_from_clientsecrets(CLIENT_SECRETS, scope=scopes)
|
||||||
message=MISSING_CLIENT_SECRETS_MESSAGE)
|
except oauth2client.client.clientsecrets.InvalidClientSecretsError:
|
||||||
oauth2file = os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE', FN_OAUTH2_TXT))
|
systemErrorExit(14, MISSING_CLIENT_SECRETS_MESSAGE)
|
||||||
storage = oauth2client.file.Storage(oauth2file)
|
storage = oauth2client.file.Storage(os.path.join(gamUserConfigDir, os.environ.get(u'OAUTHFILE', FN_OAUTH2_TXT)))
|
||||||
credentials = storage.get()
|
credentials = storage.get()
|
||||||
flags = cmd_flags()
|
flags = cmd_flags(noLocalWebserver=os.path.isfile(os.path.join(gamUserConfigDir, u'nobrowser.txt')))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'nobrowser.txt')):
|
|
||||||
flags.noauth_local_webserver = True
|
|
||||||
if credentials is None or credentials.invalid or incremental_auth:
|
if credentials is None or credentials.invalid or incremental_auth:
|
||||||
disable_ssl_certificate_validation = False
|
http = httplib2.Http(disable_ssl_certificate_validation=os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')))
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'noverifyssl.txt')):
|
|
||||||
disable_ssl_certificate_validation = True
|
|
||||||
http = httplib2.Http(disable_ssl_certificate_validation=disable_ssl_certificate_validation)
|
|
||||||
if os.path.isfile(os.path.join(gamUserConfigDir, u'debug.gam')):
|
|
||||||
httplib2.debuglevel = 4
|
|
||||||
extra_args[u'prettyPrint'] = True
|
|
||||||
try:
|
try:
|
||||||
credentials = oauth2client.tools.run_flow(flow=FLOW, storage=storage, flags=flags, http=http)
|
credentials = oauth2client.tools.run_flow(flow=FLOW, storage=storage, flags=flags, http=http)
|
||||||
except httplib2.CertificateValidationUnsupported:
|
except httplib2.CertificateValidationUnsupported:
|
||||||
@ -8617,7 +8618,7 @@ sys.setdefaultencoding(u'UTF-8')
|
|||||||
try:
|
try:
|
||||||
if os.name == u'nt':
|
if os.name == u'nt':
|
||||||
sys.argv = win32_unicode_argv() # cleanup sys.argv on Windows
|
sys.argv = win32_unicode_argv() # cleanup sys.argv on Windows
|
||||||
setGamDirs()
|
SetGlobalVariables()
|
||||||
if sys.argv[1].lower() == u'batch':
|
if sys.argv[1].lower() == u'batch':
|
||||||
import shlex
|
import shlex
|
||||||
f = openFile(sys.argv[2])
|
f = openFile(sys.argv[2])
|
||||||
|
Loading…
x
Reference in New Issue
Block a user