gam7 7.3.9__py3-none-any.whl → 7.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of gam7 might be problematic. Click here for more details.
- gam/__init__.py +73 -832
- gam/gamlib/glapi.py +0 -11
- gam/gamlib/glclargs.py +4 -0
- gam/gamlib/glentity.py +0 -4
- gam/gamlib/glmsgs.py +1 -0
- {gam7-7.3.9.dist-info → gam7-7.4.1.dist-info}/METADATA +1 -1
- {gam7-7.3.9.dist-info → gam7-7.4.1.dist-info}/RECORD +10 -10
- {gam7-7.3.9.dist-info → gam7-7.4.1.dist-info}/WHEEL +0 -0
- {gam7-7.3.9.dist-info → gam7-7.4.1.dist-info}/entry_points.txt +0 -0
- {gam7-7.3.9.dist-info → gam7-7.4.1.dist-info}/licenses/LICENSE +0 -0
gam/__init__.py
CHANGED
|
@@ -25,7 +25,7 @@ https://github.com/GAM-team/GAM/wiki
|
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
27
|
__author__ = 'GAM Team <google-apps-manager@googlegroups.com>'
|
|
28
|
-
__version__ = '7.
|
|
28
|
+
__version__ = '7.04.01'
|
|
29
29
|
__license__ = 'Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)'
|
|
30
30
|
|
|
31
31
|
#pylint: disable=wrong-import-position
|
|
@@ -142,14 +142,11 @@ from gamlib import glskus as SKU
|
|
|
142
142
|
from gamlib import gluprop as UProp
|
|
143
143
|
from gamlib import glverlibs
|
|
144
144
|
|
|
145
|
-
import atom
|
|
146
145
|
import gdata.apps.service
|
|
147
146
|
import gdata.apps.audit
|
|
148
147
|
import gdata.apps.audit.service
|
|
149
148
|
import gdata.apps.contacts
|
|
150
149
|
import gdata.apps.contacts.service
|
|
151
|
-
import gdata.apps.sites
|
|
152
|
-
import gdata.apps.sites.service
|
|
153
150
|
# Import local library, does not include discovery documents
|
|
154
151
|
import googleapiclient
|
|
155
152
|
import googleapiclient.discovery
|
|
@@ -670,8 +667,10 @@ def accessErrorExitNonDirectory(api, errMsg):
|
|
|
670
667
|
Ent.API, api])+[errMsg],
|
|
671
668
|
''))
|
|
672
669
|
|
|
673
|
-
def ClientAPIAccessDeniedExit():
|
|
670
|
+
def ClientAPIAccessDeniedExit(errMsg=None):
|
|
674
671
|
stderrErrorMsg(Msg.API_ACCESS_DENIED)
|
|
672
|
+
if errMsg:
|
|
673
|
+
stderrErrorMsg(errMsg)
|
|
675
674
|
missingScopes = API.getClientScopesSet(GM.Globals[GM.CURRENT_CLIENT_API])-GM.Globals[GM.CURRENT_CLIENT_API_SCOPES]
|
|
676
675
|
if missingScopes:
|
|
677
676
|
writeStderr(Msg.API_CHECK_CLIENT_AUTHORIZATION.format(GM.Globals[GM.OAUTH2_CLIENT_ID],
|
|
@@ -825,6 +824,9 @@ def deprecatedArgument(argument):
|
|
|
825
824
|
def deprecatedArgumentExit(argument):
|
|
826
825
|
usageErrorExit(f'{Cmd.ARGUMENT_ERROR_NAMES[Cmd.ARGUMENT_DEPRECATED][1]}: <{argument}>')
|
|
827
826
|
|
|
827
|
+
def deprecatedCommandExit():
|
|
828
|
+
systemErrorExit(USAGE_ERROR_RC, Msg.SITES_COMMAND_DEPRECATED.format(Cmd.CommandDeprecated()))
|
|
829
|
+
|
|
828
830
|
# Choices is the valid set of choices that was expected
|
|
829
831
|
def formatChoiceList(choices):
|
|
830
832
|
choiceList = [c if c else "''" for c in choices]
|
|
@@ -1749,33 +1751,6 @@ def protectedSheetId(spreadsheet, sheetId):
|
|
|
1749
1751
|
return True
|
|
1750
1752
|
return False
|
|
1751
1753
|
|
|
1752
|
-
SITENAME_PATTERN = re.compile(r'^[a-z0-9\-_]+$')
|
|
1753
|
-
SITENAME_FORMAT_REQUIRED = '[a-z,0-9,-_]+'
|
|
1754
|
-
|
|
1755
|
-
def validateSplitSiteName(fullSite):
|
|
1756
|
-
siteParts = fullSite.lower().split('/', 1)
|
|
1757
|
-
if (len(siteParts) == 1) or not siteParts[1]:
|
|
1758
|
-
domain = GC.Values[GC.DOMAIN]
|
|
1759
|
-
site = siteParts[0]
|
|
1760
|
-
elif not siteParts[0]:
|
|
1761
|
-
domain = GC.Values[GC.DOMAIN]
|
|
1762
|
-
site = siteParts[1]
|
|
1763
|
-
else:
|
|
1764
|
-
domain = siteParts[0]
|
|
1765
|
-
site = siteParts[1]
|
|
1766
|
-
if SITENAME_PATTERN.match(site):
|
|
1767
|
-
return (domain, site, f'{domain}/{site}')
|
|
1768
|
-
return (domain, site, None)
|
|
1769
|
-
|
|
1770
|
-
def getSiteName():
|
|
1771
|
-
if Cmd.ArgumentsRemaining():
|
|
1772
|
-
domain, site, domainSite = validateSplitSiteName(Cmd.Current())
|
|
1773
|
-
if domainSite:
|
|
1774
|
-
Cmd.Advance()
|
|
1775
|
-
return (domain, site, domainSite)
|
|
1776
|
-
invalidArgumentExit(SITENAME_FORMAT_REQUIRED)
|
|
1777
|
-
missingArgumentExit(SITENAME_FORMAT_REQUIRED)
|
|
1778
|
-
|
|
1779
1754
|
def getString(item, checkBlank=False, optional=False, minLen=1, maxLen=None):
|
|
1780
1755
|
if Cmd.ArgumentsRemaining():
|
|
1781
1756
|
argstr = Cmd.Current()
|
|
@@ -5674,21 +5649,6 @@ def getContactsQuery(**kwargs):
|
|
|
5674
5649
|
def getEmailAuditObject():
|
|
5675
5650
|
return initGDataObject(gdata.apps.audit.service.AuditService(), API.EMAIL_AUDIT)
|
|
5676
5651
|
|
|
5677
|
-
def getSitesObject(entityType=Ent.DOMAIN, entityName=None, i=0, count=0):
|
|
5678
|
-
if entityType == Ent.DOMAIN:
|
|
5679
|
-
sitesObject = initGDataObject(gdata.apps.sites.service.SitesService(), API.SITES)
|
|
5680
|
-
return (entityName or GC.Values[GC.DOMAIN], sitesObject)
|
|
5681
|
-
userEmail, credentials = getGDataUserCredentials(API.SITES, entityName, i, count)
|
|
5682
|
-
if not credentials:
|
|
5683
|
-
return (userEmail, None)
|
|
5684
|
-
if GC.Values[GC.NO_VERIFY_SSL]:
|
|
5685
|
-
ssl._create_default_https_context = ssl._create_unverified_context
|
|
5686
|
-
sitesObject = gdata.apps.sites.service.SitesService(source=GAM_USER_AGENT,
|
|
5687
|
-
additional_headers={'Authorization': f'Bearer {credentials.token}'})
|
|
5688
|
-
if GC.Values[GC.DEBUG_LEVEL] > 0:
|
|
5689
|
-
sitesObject.debug = True
|
|
5690
|
-
return (userEmail, sitesObject)
|
|
5691
|
-
|
|
5692
5652
|
def getUserEmailFromID(uid, cd):
|
|
5693
5653
|
try:
|
|
5694
5654
|
result = callGAPI(cd.users(), 'get',
|
|
@@ -21267,6 +21227,8 @@ def _getPeopleOtherContacts(people, entityType, user, i=0, count=0):
|
|
|
21267
21227
|
resourceName = contact.pop('resourceName')
|
|
21268
21228
|
otherContacts[resourceName] = contact
|
|
21269
21229
|
return otherContacts
|
|
21230
|
+
except GAPI.permissionDenied as e:
|
|
21231
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21270
21232
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21271
21233
|
entityUnknownWarning(entityType, user, i, count)
|
|
21272
21234
|
return None
|
|
@@ -21323,6 +21285,8 @@ def queryPeopleContacts(people, contactQuery, fields, sortOrder, entityType, use
|
|
|
21323
21285
|
showMessage = pageMessage.replace(TOTAL_ITEMS_MARKER, str(totalItems))
|
|
21324
21286
|
writeGotMessage(showMessage.replace('{0}', str(Ent.Choose(Ent.PEOPLE_CONTACT, totalItems))))
|
|
21325
21287
|
return entityList
|
|
21288
|
+
except GAPI.permissionDenied as e:
|
|
21289
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21326
21290
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21327
21291
|
entityUnknownWarning(entityType, user, i, count)
|
|
21328
21292
|
return None
|
|
@@ -21349,6 +21313,8 @@ def queryPeopleOtherContacts(people, contactQuery, fields, entityType, user, i=0
|
|
|
21349
21313
|
showMessage = pageMessage.replace(TOTAL_ITEMS_MARKER, str(totalItems))
|
|
21350
21314
|
writeGotMessage(showMessage.replace('{0}', str(Ent.Choose(Ent.OTHER_CONTACT, totalItems))))
|
|
21351
21315
|
return entityList
|
|
21316
|
+
except GAPI.permissionDenied as e:
|
|
21317
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21352
21318
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21353
21319
|
entityUnknownWarning(entityType, user, i, count)
|
|
21354
21320
|
return None
|
|
@@ -21369,6 +21335,8 @@ def getPeopleContactGroupsInfo(people, entityType, entityName, i, count):
|
|
|
21369
21335
|
if group['formattedName'] != group['name']:
|
|
21370
21336
|
contactGroupNames.setdefault(group['name'], [])
|
|
21371
21337
|
contactGroupNames[group['name']].append(group['resourceName'])
|
|
21338
|
+
except GAPI.permissionDenied as e:
|
|
21339
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21372
21340
|
except GAPI.forbidden:
|
|
21373
21341
|
userPeopleServiceNotEnabledWarning(entityName, i, count)
|
|
21374
21342
|
return (contactGroupIDs, False)
|
|
@@ -21467,6 +21435,8 @@ def createUserPeopleContact(users):
|
|
|
21467
21435
|
csvPF.WriteRow(row)
|
|
21468
21436
|
except GAPI.invalidArgument as e:
|
|
21469
21437
|
entityActionFailedWarning([entityType, user, peopleEntityType, None], str(e), i, count)
|
|
21438
|
+
except GAPI.permissionDenied as e:
|
|
21439
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21470
21440
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21471
21441
|
ClientAPIAccessDeniedExit()
|
|
21472
21442
|
if csvPF:
|
|
@@ -21630,6 +21600,8 @@ def _clearUpdatePeopleContacts(users, updateContacts):
|
|
|
21630
21600
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
|
|
21631
21601
|
except (GAPI.notFound, GAPI.internalError):
|
|
21632
21602
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
|
|
21603
|
+
except GAPI.permissionDenied as e:
|
|
21604
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21633
21605
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21634
21606
|
ClientAPIAccessDeniedExit()
|
|
21635
21607
|
Ind.Decrement()
|
|
@@ -21778,6 +21750,8 @@ def dedupReplaceDomainUserPeopleContacts(users):
|
|
|
21778
21750
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
|
|
21779
21751
|
except (GAPI.notFound, GAPI.internalError):
|
|
21780
21752
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
|
|
21753
|
+
except GAPI.permissionDenied as e:
|
|
21754
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21781
21755
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21782
21756
|
ClientAPIAccessDeniedExit()
|
|
21783
21757
|
Ind.Decrement()
|
|
@@ -21831,6 +21805,8 @@ def deleteUserPeopleContacts(users):
|
|
|
21831
21805
|
entityActionPerformed([entityType, user, peopleEntityType, resourceName], j, jcount)
|
|
21832
21806
|
except (GAPI.notFound, GAPI.internalError):
|
|
21833
21807
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
|
|
21808
|
+
except GAPI.permissionDenied as e:
|
|
21809
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
21834
21810
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
21835
21811
|
ClientAPIAccessDeniedExit()
|
|
21836
21812
|
Ind.Decrement()
|
|
@@ -22109,6 +22085,8 @@ def _infoPeople(users, entityType, source):
|
|
|
22109
22085
|
except GAPI.invalidArgument as e:
|
|
22110
22086
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], str(e), j, jcount)
|
|
22111
22087
|
continue
|
|
22088
|
+
except GAPI.permissionDenied as e:
|
|
22089
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22112
22090
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22113
22091
|
ClientAPIAccessDeniedExit()
|
|
22114
22092
|
if showContactGroups and contactGroupIDs:
|
|
@@ -22287,6 +22265,8 @@ def copyUserPeopleOtherContacts(users):
|
|
|
22287
22265
|
except (GAPI.notFound, GAPI.internalError):
|
|
22288
22266
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
|
|
22289
22267
|
continue
|
|
22268
|
+
except GAPI.permissionDenied as e:
|
|
22269
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22290
22270
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22291
22271
|
ClientAPIAccessDeniedExit()
|
|
22292
22272
|
Ind.Decrement()
|
|
@@ -22401,7 +22381,9 @@ def processUserPeopleOtherContacts(users):
|
|
|
22401
22381
|
except (GAPI.notFound, GAPI.internalError):
|
|
22402
22382
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName], Msg.DOES_NOT_EXIST, j, jcount)
|
|
22403
22383
|
continue
|
|
22404
|
-
except
|
|
22384
|
+
except GAPI.permissionDenied as e:
|
|
22385
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22386
|
+
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22405
22387
|
ClientAPIAccessDeniedExit()
|
|
22406
22388
|
Ind.Decrement()
|
|
22407
22389
|
|
|
@@ -22518,6 +22500,8 @@ def _printShowPeople(source):
|
|
|
22518
22500
|
pageSize=GC.Values[GC.PEOPLE_MAX_RESULTS],
|
|
22519
22501
|
sources=sources, mergeSources=mergeSources,
|
|
22520
22502
|
readMask=fields, fields='nextPageToken,people', **kwargs)
|
|
22503
|
+
except GAPI.permissionDenied as e:
|
|
22504
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22521
22505
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22522
22506
|
ClientAPIAccessDeniedExit()
|
|
22523
22507
|
if not countsOnly:
|
|
@@ -22638,6 +22622,8 @@ def printShowUserPeopleProfiles(users):
|
|
|
22638
22622
|
except GAPI.notFound:
|
|
22639
22623
|
entityUnknownWarning(Ent.PEOPLE_PROFILE, user, i, count)
|
|
22640
22624
|
continue
|
|
22625
|
+
except GAPI.permissionDenied as e:
|
|
22626
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22641
22627
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22642
22628
|
ClientAPIAccessDeniedExit()
|
|
22643
22629
|
if not csvPF:
|
|
@@ -22792,6 +22778,8 @@ def _processPeopleContactPhotos(users, function):
|
|
|
22792
22778
|
entityDoesNotHaveItemWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], j, jcount)
|
|
22793
22779
|
except (GAPI.invalidArgument, OSError, IOError) as e:
|
|
22794
22780
|
entityActionFailedWarning([entityType, user, peopleEntityType, resourceName, Ent.PHOTO, filename], str(e), j, jcount)
|
|
22781
|
+
except GAPI.permissionDenied as e:
|
|
22782
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
22795
22783
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
22796
22784
|
ClientAPIAccessDeniedExit()
|
|
22797
22785
|
break
|
|
@@ -22866,7 +22854,7 @@ def createUserPeopleContactGroup(users):
|
|
|
22866
22854
|
if addCSVData:
|
|
22867
22855
|
row.update(addCSVData)
|
|
22868
22856
|
csvPF.WriteRow(row)
|
|
22869
|
-
except GAPI.forbidden:
|
|
22857
|
+
except (GAPI.forbidden, GAPI.permissionDenied):
|
|
22870
22858
|
userPeopleServiceNotEnabledWarning(user, i, count)
|
|
22871
22859
|
except GAPI.serviceNotAvailable:
|
|
22872
22860
|
entityUnknownWarning(entityType, user, i, count)
|
|
@@ -22920,7 +22908,7 @@ def updateUserPeopleContactGroup(users):
|
|
|
22920
22908
|
entityActionPerformed([entityType, user, Ent.CONTACT_GROUP, contactGroup], j, jcount)
|
|
22921
22909
|
except (GAPI.notFound, GAPI.internalError) as e:
|
|
22922
22910
|
entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
|
|
22923
|
-
except GAPI.forbidden:
|
|
22911
|
+
except (GAPI.forbidden, GAPI.permissionDenied):
|
|
22924
22912
|
userPeopleServiceNotEnabledWarning(user, i, count)
|
|
22925
22913
|
break
|
|
22926
22914
|
except GAPI.serviceNotAvailable:
|
|
@@ -22965,7 +22953,7 @@ def deleteUserPeopleContactGroups(users):
|
|
|
22965
22953
|
entityActionPerformed([entityType, user, Ent.CONTACT_GROUP, contactGroup], j, jcount)
|
|
22966
22954
|
except GAPI.notFound as e:
|
|
22967
22955
|
entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
|
|
22968
|
-
except GAPI.forbidden:
|
|
22956
|
+
except (GAPI.forbidden, GAPI.permissionDenied):
|
|
22969
22957
|
userPeopleServiceNotEnabledWarning(user, i, count)
|
|
22970
22958
|
break
|
|
22971
22959
|
except GAPI.serviceNotAvailable:
|
|
@@ -23066,7 +23054,7 @@ def infoUserPeopleContactGroups(users):
|
|
|
23066
23054
|
_showContactGroup(entityType, user, Ent.CONTACT_GROUP, group, j, jcount, FJQC)
|
|
23067
23055
|
except GAPI.notFound as e:
|
|
23068
23056
|
entityActionFailedWarning([entityType, user, Ent.CONTACT_GROUP, contactGroup], str(e), j, jcount)
|
|
23069
|
-
except GAPI.forbidden:
|
|
23057
|
+
except (GAPI.forbidden, GAPI.permissionDenied):
|
|
23070
23058
|
userPeopleServiceNotEnabledWarning(user, i, count)
|
|
23071
23059
|
break
|
|
23072
23060
|
except GAPI.serviceNotAvailable:
|
|
@@ -23115,6 +23103,8 @@ def printShowUserPeopleContactGroups(users):
|
|
|
23115
23103
|
throwReasons=GAPI.PEOPLE_ACCESS_THROW_REASONS,
|
|
23116
23104
|
pageSize=GC.Values[GC.PEOPLE_MAX_RESULTS],
|
|
23117
23105
|
groupFields=fields, fields='nextPageToken,contactGroups')
|
|
23106
|
+
except GAPI.permissionDenied as e:
|
|
23107
|
+
ClientAPIAccessDeniedExit(str(e))
|
|
23118
23108
|
except (GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
23119
23109
|
ClientAPIAccessDeniedExit()
|
|
23120
23110
|
_printPersonEntityList(Ent.PEOPLE_CONTACT_GROUP, entityList, entityType, user, i, count, csvPF, FJQC, parameters, None)
|
|
@@ -24185,7 +24175,8 @@ def substituteQueryTimes(queries, queryTimes):
|
|
|
24185
24175
|
for i, query in enumerate(queries):
|
|
24186
24176
|
if query is not None:
|
|
24187
24177
|
for queryTimeName, queryTimeValue in iter(queryTimes.items()):
|
|
24188
|
-
|
|
24178
|
+
query = query.replace(f'#{queryTimeName}#', queryTimeValue)
|
|
24179
|
+
queries[i] = query
|
|
24189
24180
|
|
|
24190
24181
|
# Get CrOS devices from gam.cfg print_cros_ous and print_cros_ous_and_children
|
|
24191
24182
|
def getCfgCrOSEntities():
|
|
@@ -34137,7 +34128,7 @@ def doPrintGroupMembers():
|
|
|
34137
34128
|
for name in info['names']:
|
|
34138
34129
|
if name['metadata']['source']['type'] == sourceType:
|
|
34139
34130
|
return name['displayName']
|
|
34140
|
-
except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden):
|
|
34131
|
+
except (GAPI.notFound, GAPI.serviceNotAvailable, GAPI.forbidden, GAPI.permissionDenied):
|
|
34141
34132
|
pass
|
|
34142
34133
|
return unknownName
|
|
34143
34134
|
|
|
@@ -42266,776 +42257,26 @@ def doPrintVaultCounts():
|
|
|
42266
42257
|
csvPF.WriteRow({'account': account, 'count': 0})
|
|
42267
42258
|
csvPF.writeCSVfile('Vault Counts')
|
|
42268
42259
|
|
|
42269
|
-
def checkSiteExists(sitesObject, domain, site):
|
|
42270
|
-
try:
|
|
42271
|
-
callGData(sitesObject, 'GetSite',
|
|
42272
|
-
throwErrors=[GDATA.NOT_FOUND],
|
|
42273
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42274
|
-
domain=domain, site=site)
|
|
42275
|
-
return True
|
|
42276
|
-
except GDATA.notFound:
|
|
42277
|
-
return None
|
|
42278
|
-
|
|
42279
|
-
SITE_ACLS = 'ACLs'
|
|
42280
|
-
SITE_CATEGORIES = 'Categories'
|
|
42281
|
-
SITE_LINK = 'Link'
|
|
42282
|
-
SITE_NAME = 'Name'
|
|
42283
|
-
SITE_SITE = 'Site'
|
|
42284
|
-
SITE_SOURCELINK = 'SourceLink'
|
|
42285
|
-
SITE_SUMMARY = 'Summary'
|
|
42286
|
-
SITE_THEME = 'Theme'
|
|
42287
|
-
SITE_UPDATED = 'Updated'
|
|
42288
|
-
SITE_WEB_ADDRESS_MAPPINGS = 'WebAddressMappings'
|
|
42289
|
-
|
|
42290
|
-
SITE_DATA_DOMAIN = 'domain'
|
|
42291
|
-
SITE_DATA_SITE = 'site'
|
|
42292
|
-
SITE_DATA_DOMAIN_SITE = 'domainSite'
|
|
42293
|
-
SITE_DATA_FIELDS = 'fields'
|
|
42294
|
-
|
|
42295
|
-
class SitesManager():
|
|
42296
|
-
|
|
42297
|
-
SITE_ARGUMENT_TO_PROPERTY_MAP = {
|
|
42298
|
-
'categories': SITE_CATEGORIES,
|
|
42299
|
-
'name': SITE_NAME,
|
|
42300
|
-
'sourcelink': SITE_SOURCELINK,
|
|
42301
|
-
'summary': SITE_SUMMARY,
|
|
42302
|
-
'theme': SITE_THEME,
|
|
42303
|
-
}
|
|
42304
|
-
|
|
42305
|
-
@staticmethod
|
|
42306
|
-
def AclEntryToFields(acl_entry):
|
|
42307
|
-
|
|
42308
|
-
def GetAclAttr(attrlist):
|
|
42309
|
-
objAttr = acl_entry
|
|
42310
|
-
for attr in attrlist:
|
|
42311
|
-
objAttr = getattr(objAttr, attr)
|
|
42312
|
-
if not objAttr:
|
|
42313
|
-
return None
|
|
42314
|
-
return objAttr
|
|
42315
|
-
|
|
42316
|
-
fields = {}
|
|
42317
|
-
fields['role'] = GetAclAttr(['role', 'value'])
|
|
42318
|
-
if not fields['role']:
|
|
42319
|
-
fields['role'] = GetAclAttr(['withKey', 'role', 'value'])+' (with link)'
|
|
42320
|
-
fields['scope'] = {'type': GetAclAttr(['scope', 'type']),
|
|
42321
|
-
'value': GetAclAttr(['scope', 'value'])}
|
|
42322
|
-
link = acl_entry.FindInviteLink()
|
|
42323
|
-
if link:
|
|
42324
|
-
fields['inviteLink'] = link
|
|
42325
|
-
return fields
|
|
42326
|
-
|
|
42327
|
-
@staticmethod
|
|
42328
|
-
def FieldsToAclEntry(fields):
|
|
42329
|
-
acl_entry = gdata.apps.sites.AclEntry()
|
|
42330
|
-
acl_entry.role = gdata.apps.sites.AclRole(value=fields['role'])
|
|
42331
|
-
acl_entry.scope = gdata.apps.sites.AclScope(stype=fields['scope']['type'], value=fields['scope'].get('value'))
|
|
42332
|
-
return acl_entry
|
|
42333
|
-
|
|
42334
|
-
@staticmethod
|
|
42335
|
-
def ActivityEntryToFields(activity_entry):
|
|
42336
|
-
fields = {}
|
|
42337
|
-
|
|
42338
|
-
def GetActivityField(fieldName, attrlist):
|
|
42339
|
-
objAttr = activity_entry
|
|
42340
|
-
for attr in attrlist:
|
|
42341
|
-
objAttr = getattr(objAttr, attr)
|
|
42342
|
-
if not objAttr:
|
|
42343
|
-
return
|
|
42344
|
-
fields[fieldName] = objAttr
|
|
42345
|
-
|
|
42346
|
-
def GetActivityFieldData(objAttr, attrlist, default):
|
|
42347
|
-
for attr in attrlist:
|
|
42348
|
-
objAttr = getattr(objAttr, attr)
|
|
42349
|
-
if not objAttr:
|
|
42350
|
-
return default
|
|
42351
|
-
return objAttr
|
|
42352
|
-
|
|
42353
|
-
def AppendItemToFieldsList(fieldName, fieldValue):
|
|
42354
|
-
fields.setdefault(fieldName, [])
|
|
42355
|
-
fields[fieldName].append(fieldValue)
|
|
42356
|
-
|
|
42357
|
-
GetActivityField('Summary', ['title', 'text'])
|
|
42358
|
-
GetActivityField('Updated', ['updated', 'text'])
|
|
42359
|
-
for author in activity_entry.author:
|
|
42360
|
-
AppendItemToFieldsList('Authors', f'{GetActivityFieldData(author, ["name", "text"], "Unknown Name")}/{GetActivityFieldData(author, ["email", "text"], "Unknown Email")}')
|
|
42361
|
-
fields['Operation'] = activity_entry.Kind()
|
|
42362
|
-
return fields
|
|
42363
|
-
|
|
42364
|
-
@staticmethod
|
|
42365
|
-
def SiteToFields(site_entry):
|
|
42366
|
-
fields = {}
|
|
42367
|
-
|
|
42368
|
-
def GetSiteField(fieldName, attrlist):
|
|
42369
|
-
objAttr = site_entry
|
|
42370
|
-
for attr in attrlist:
|
|
42371
|
-
objAttr = getattr(objAttr, attr)
|
|
42372
|
-
if not objAttr:
|
|
42373
|
-
return
|
|
42374
|
-
fields[fieldName] = objAttr
|
|
42375
|
-
|
|
42376
|
-
def AppendItemToFieldsList(fieldName, fieldValue):
|
|
42377
|
-
fields.setdefault(fieldName, [])
|
|
42378
|
-
fields[fieldName].append(fieldValue)
|
|
42379
|
-
|
|
42380
|
-
GetSiteField(SITE_SITE, ['siteName', 'text'])
|
|
42381
|
-
GetSiteField(SITE_NAME, ['title', 'text'])
|
|
42382
|
-
GetSiteField(SITE_SUMMARY, ['summary', 'text'])
|
|
42383
|
-
GetSiteField(SITE_THEME, ['theme', 'text'])
|
|
42384
|
-
GetSiteField(SITE_UPDATED, ['updated', 'text'])
|
|
42385
|
-
if site_entry.category:
|
|
42386
|
-
for category in site_entry.category:
|
|
42387
|
-
if category.term:
|
|
42388
|
-
AppendItemToFieldsList(SITE_CATEGORIES, category.term)
|
|
42389
|
-
link = site_entry.FindAlternateLink()
|
|
42390
|
-
if link:
|
|
42391
|
-
fields[SITE_LINK] = link
|
|
42392
|
-
link = site_entry.FindSourceLink()
|
|
42393
|
-
if link:
|
|
42394
|
-
fields[SITE_SOURCELINK] = link
|
|
42395
|
-
for link in site_entry.FindWebAddressMappings():
|
|
42396
|
-
AppendItemToFieldsList(SITE_WEB_ADDRESS_MAPPINGS, link)
|
|
42397
|
-
return fields
|
|
42398
|
-
|
|
42399
|
-
@staticmethod
|
|
42400
|
-
def GetSiteFields():
|
|
42401
|
-
|
|
42402
|
-
fields = {}
|
|
42403
|
-
while Cmd.ArgumentsRemaining():
|
|
42404
|
-
myarg = getArgument()
|
|
42405
|
-
if myarg in SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP:
|
|
42406
|
-
fieldName = SitesManager.SITE_ARGUMENT_TO_PROPERTY_MAP[myarg]
|
|
42407
|
-
if fieldName == SITE_NAME:
|
|
42408
|
-
fields[fieldName] = getString(Cmd.OB_STRING)
|
|
42409
|
-
elif fieldName == SITE_SOURCELINK:
|
|
42410
|
-
fields[fieldName] = getString(Cmd.OB_URI)
|
|
42411
|
-
elif fieldName == SITE_SUMMARY:
|
|
42412
|
-
fields[fieldName] = getStringWithCRsNLs()
|
|
42413
|
-
elif fieldName == SITE_THEME:
|
|
42414
|
-
fields[fieldName] = getString(Cmd.OB_STRING)
|
|
42415
|
-
elif fieldName == SITE_CATEGORIES:
|
|
42416
|
-
fields[fieldName] = getString(Cmd.OB_STRING, minLen=0).split(',')
|
|
42417
|
-
else:
|
|
42418
|
-
unknownArgumentExit()
|
|
42419
|
-
return fields
|
|
42420
|
-
|
|
42421
|
-
@staticmethod
|
|
42422
|
-
def FieldsToSite(fields):
|
|
42423
|
-
def GetField(fieldName):
|
|
42424
|
-
return fields.get(fieldName)
|
|
42425
|
-
|
|
42426
|
-
def GetSiteField(fieldName, fieldClass):
|
|
42427
|
-
value = fields.get(fieldName)
|
|
42428
|
-
if value:
|
|
42429
|
-
return fieldClass(text=value)
|
|
42430
|
-
return None
|
|
42431
|
-
|
|
42432
|
-
site_entry = gdata.apps.sites.SiteEntry(sourceSite=GetField(SITE_SOURCELINK))
|
|
42433
|
-
site_entry.siteName = GetSiteField(SITE_SITE, gdata.apps.sites.SiteName)
|
|
42434
|
-
site_entry.title = GetSiteField(SITE_NAME, atom.Title)
|
|
42435
|
-
site_entry.summary = GetSiteField(SITE_SUMMARY, atom.Summary)
|
|
42436
|
-
site_entry.theme = GetSiteField(SITE_THEME, gdata.apps.sites.Theme)
|
|
42437
|
-
value = GetField(SITE_CATEGORIES)
|
|
42438
|
-
if value:
|
|
42439
|
-
for category in value:
|
|
42440
|
-
site_entry.category.append(atom.Category(term=category, scheme=gdata.apps.sites.TAG_KIND_TERM))
|
|
42441
|
-
return site_entry
|
|
42442
|
-
|
|
42443
|
-
def getSiteEntity():
|
|
42444
|
-
siteEntity = {'list': getEntityList(Cmd.OB_SITE_ENTITY), 'dict': None}
|
|
42445
|
-
if isinstance(siteEntity['list'], dict):
|
|
42446
|
-
siteEntity['dict'] = siteEntity['list']
|
|
42447
|
-
return siteEntity
|
|
42448
|
-
|
|
42449
|
-
def _validateUserGetSites(entityType, user, i, count, siteEntity, itemType=None, modifier=None):
|
|
42450
|
-
if siteEntity['dict']:
|
|
42451
|
-
sites = siteEntity['dict'][user]
|
|
42452
|
-
else:
|
|
42453
|
-
sites = siteEntity['list']
|
|
42454
|
-
user, sitesObject = getSitesObject(entityType, user, i, count)
|
|
42455
|
-
if not sitesObject:
|
|
42456
|
-
return (user, None, None, 0)
|
|
42457
|
-
jcount = len(sites)
|
|
42458
|
-
if not itemType:
|
|
42459
|
-
entityPerformActionNumItems([entityType, user], jcount, Ent.SITE, i, count)
|
|
42460
|
-
else:
|
|
42461
|
-
entityPerformActionSubItemModifierNumItems([entityType, user], itemType, modifier, jcount, Ent.SITE, i, count)
|
|
42462
|
-
if jcount == 0:
|
|
42463
|
-
setSysExitRC(NO_ENTITIES_FOUND_RC)
|
|
42464
|
-
return (user, sitesObject, sites, jcount)
|
|
42465
|
-
|
|
42466
|
-
def _validateSite(fullSite, i, count):
|
|
42467
|
-
domain, site, domainSite = validateSplitSiteName(fullSite)
|
|
42468
|
-
if domainSite:
|
|
42469
|
-
return (domain, site, domainSite)
|
|
42470
|
-
entityActionNotPerformedWarning([Ent.SITE, site], Msg.INVALID_SITE.format(site, SITENAME_FORMAT_REQUIRED), i, count)
|
|
42471
|
-
return (domain, site, None)
|
|
42472
|
-
|
|
42473
|
-
def _validateSiteGetRuleIds(origUser, fullSite, j, jcount, ACLScopeEntity, showAction=True):
|
|
42474
|
-
domain, site, domainSite = _validateSite(fullSite, j, jcount)
|
|
42475
|
-
if not domainSite:
|
|
42476
|
-
return (domain, site, None, None, 0)
|
|
42477
|
-
if ACLScopeEntity:
|
|
42478
|
-
if ACLScopeEntity['dict']:
|
|
42479
|
-
if not GM.Globals[GM.CSV_SUBKEY_FIELD]:
|
|
42480
|
-
ruleIds = ACLScopeEntity['dict'][fullSite]
|
|
42481
|
-
else:
|
|
42482
|
-
ruleIds = ACLScopeEntity['dict'][origUser][fullSite]
|
|
42483
|
-
else:
|
|
42484
|
-
ruleIds = ACLScopeEntity['list']
|
|
42485
|
-
kcount = len(ruleIds)
|
|
42486
|
-
if kcount == 0:
|
|
42487
|
-
setSysExitRC(NO_ENTITIES_FOUND_RC)
|
|
42488
|
-
else:
|
|
42489
|
-
ruleIds = []
|
|
42490
|
-
kcount = 0
|
|
42491
|
-
if showAction:
|
|
42492
|
-
entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
|
|
42493
|
-
return (domain, site, domainSite, ruleIds, kcount)
|
|
42494
|
-
|
|
42495
|
-
def _createSite(users, entityType):
|
|
42496
|
-
sitesManager = SitesManager()
|
|
42497
|
-
domain, site, domainSite = getSiteName()
|
|
42498
|
-
fields = sitesManager.GetSiteFields()
|
|
42499
|
-
if not fields.get(SITE_NAME):
|
|
42500
|
-
fields[SITE_NAME] = site
|
|
42501
|
-
i, count, users = getEntityArgument(users)
|
|
42502
|
-
for user in users:
|
|
42503
|
-
i += 1
|
|
42504
|
-
user, sitesObject = getSitesObject(entityType, user, i, count)
|
|
42505
|
-
if not sitesObject:
|
|
42506
|
-
continue
|
|
42507
|
-
try:
|
|
42508
|
-
siteEntry = sitesManager.FieldsToSite(fields)
|
|
42509
|
-
callGData(sitesObject, 'CreateSite',
|
|
42510
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42511
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42512
|
-
siteentry=siteEntry, domain=domain, site=None)
|
|
42513
|
-
entityActionPerformed([Ent.SITE, domainSite])
|
|
42514
|
-
except GDATA.notFound as e:
|
|
42515
|
-
entityActionFailedWarning([Ent.DOMAIN, domain], str(e))
|
|
42516
|
-
except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
|
|
42517
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e))
|
|
42518
|
-
|
|
42519
42260
|
# gam [<UserTypeEntity>] create site <SiteName> <SiteAttribute>*
|
|
42520
|
-
def createUserSite(users):
|
|
42521
|
-
_createSite(users, Ent.USER)
|
|
42522
|
-
|
|
42523
|
-
def doCreateDomainSite():
|
|
42524
|
-
_createSite([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
|
|
42525
|
-
|
|
42526
|
-
def _updateSites(users, entityType):
|
|
42527
|
-
sitesManager = SitesManager()
|
|
42528
|
-
siteEntity = getSiteEntity()
|
|
42529
|
-
updateFields = sitesManager.GetSiteFields()
|
|
42530
|
-
i, count, users = getEntityArgument(users)
|
|
42531
|
-
for user in users:
|
|
42532
|
-
i += 1
|
|
42533
|
-
user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
|
|
42534
|
-
if jcount == 0:
|
|
42535
|
-
continue
|
|
42536
|
-
Ind.Increment()
|
|
42537
|
-
j = 0
|
|
42538
|
-
for site in sites:
|
|
42539
|
-
j += 1
|
|
42540
|
-
domain, site, domainSite = _validateSite(site, j, jcount)
|
|
42541
|
-
if not domainSite:
|
|
42542
|
-
continue
|
|
42543
|
-
try:
|
|
42544
|
-
siteEntry = callGData(sitesObject, 'GetSite',
|
|
42545
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42546
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42547
|
-
domain=domain, site=site)
|
|
42548
|
-
fields = sitesManager.SiteToFields(siteEntry)
|
|
42549
|
-
for field, value in iter(updateFields.items()):
|
|
42550
|
-
if field != SITE_SOURCELINK:
|
|
42551
|
-
fields[field] = value
|
|
42552
|
-
newSiteEntry = sitesManager.FieldsToSite(fields)
|
|
42553
|
-
callGData(sitesObject, 'UpdateSite',
|
|
42554
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42555
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42556
|
-
siteentry=newSiteEntry, domain=domain, site=site, extra_headers={'If-Match': siteEntry.etag})
|
|
42557
|
-
entityActionPerformed([Ent.SITE, domainSite])
|
|
42558
|
-
except (GDATA.notFound, GDATA.badRequest, GDATA.forbidden) as e:
|
|
42559
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e))
|
|
42560
|
-
|
|
42561
42261
|
# gam [<UserTypeEntity>] update site <SiteEntity> <SiteAttribute>+
|
|
42562
|
-
def updateUserSites(users):
|
|
42563
|
-
_updateSites(users, Ent.USER)
|
|
42564
|
-
|
|
42565
|
-
def doUpdateDomainSites():
|
|
42566
|
-
_updateSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
|
|
42567
|
-
|
|
42568
|
-
SITE_FIELD_PRINT_ORDER = [
|
|
42569
|
-
SITE_UPDATED,
|
|
42570
|
-
SITE_NAME,
|
|
42571
|
-
SITE_SUMMARY,
|
|
42572
|
-
SITE_THEME,
|
|
42573
|
-
SITE_SOURCELINK,
|
|
42574
|
-
SITE_CATEGORIES,
|
|
42575
|
-
SITE_LINK,
|
|
42576
|
-
]
|
|
42577
|
-
|
|
42578
|
-
def _showSite(sitesManager, sitesObject, domain, site, roles, j, jcount):
|
|
42579
|
-
fields = sitesManager.SiteToFields(site)
|
|
42580
|
-
domainSite = f'{domain}/{fields[SITE_SITE]}'
|
|
42581
|
-
printKeyValueListWithCount([SITE_SITE, domainSite], j, jcount)
|
|
42582
|
-
Ind.Increment()
|
|
42583
|
-
for field in SITE_FIELD_PRINT_ORDER:
|
|
42584
|
-
if field in fields:
|
|
42585
|
-
if not isinstance(fields[field], list):
|
|
42586
|
-
if field != SITE_SUMMARY:
|
|
42587
|
-
printKeyValueList([field, fields[field]])
|
|
42588
|
-
else:
|
|
42589
|
-
printKeyValueWithCRsNLs(field, fields[field])
|
|
42590
|
-
else:
|
|
42591
|
-
printKeyValueList([field, ','.join(fields[field])])
|
|
42592
|
-
if fields.get(SITE_WEB_ADDRESS_MAPPINGS):
|
|
42593
|
-
printKeyValueList([SITE_WEB_ADDRESS_MAPPINGS, None])
|
|
42594
|
-
Ind.Increment()
|
|
42595
|
-
for link in fields[SITE_WEB_ADDRESS_MAPPINGS]:
|
|
42596
|
-
printKeyValueList([link, None])
|
|
42597
|
-
Ind.Decrement()
|
|
42598
|
-
if roles:
|
|
42599
|
-
try:
|
|
42600
|
-
acls = callGDataPages(sitesObject, 'GetAclFeed',
|
|
42601
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42602
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42603
|
-
domain=domain, site=fields[SITE_SITE])
|
|
42604
|
-
printKeyValueList([SITE_ACLS, None])
|
|
42605
|
-
Ind.Increment()
|
|
42606
|
-
for acl in acls:
|
|
42607
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42608
|
-
if fields['role'] in roles:
|
|
42609
|
-
printKeyValueList([formatACLRule(fields)])
|
|
42610
|
-
Ind.Decrement()
|
|
42611
|
-
except GDATA.notFound as e:
|
|
42612
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e))
|
|
42613
|
-
except GDATA.forbidden:
|
|
42614
|
-
pass
|
|
42615
|
-
Ind.Decrement()
|
|
42616
|
-
|
|
42617
|
-
SITE_ACL_ROLES_MAP = {
|
|
42618
|
-
'editor': 'writer',
|
|
42619
|
-
'invite': 'invite',
|
|
42620
|
-
'owner': 'owner',
|
|
42621
|
-
'read': 'reader',
|
|
42622
|
-
'reader': 'reader',
|
|
42623
|
-
'writer': 'writer',
|
|
42624
|
-
}
|
|
42625
|
-
|
|
42626
|
-
def _infoSites(users, entityType):
|
|
42627
|
-
siteEntity = getSiteEntity()
|
|
42628
|
-
url_params = {}
|
|
42629
|
-
roles = set()
|
|
42630
|
-
while Cmd.ArgumentsRemaining():
|
|
42631
|
-
myarg = getArgument()
|
|
42632
|
-
if myarg == 'withmappings':
|
|
42633
|
-
url_params['with-mappings'] = 'true'
|
|
42634
|
-
elif myarg in {'role', 'roles'}:
|
|
42635
|
-
roles = getACLRoles(SITE_ACL_ROLES_MAP)
|
|
42636
|
-
else:
|
|
42637
|
-
unknownArgumentExit()
|
|
42638
|
-
sitesManager = SitesManager()
|
|
42639
|
-
i, count, users = getEntityArgument(users)
|
|
42640
|
-
for user in users:
|
|
42641
|
-
i += 1
|
|
42642
|
-
user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity)
|
|
42643
|
-
if jcount == 0:
|
|
42644
|
-
continue
|
|
42645
|
-
Ind.Increment()
|
|
42646
|
-
j = 0
|
|
42647
|
-
for site in sites:
|
|
42648
|
-
j += 1
|
|
42649
|
-
domain, site, domainSite = _validateSite(site, j, jcount)
|
|
42650
|
-
if not domainSite:
|
|
42651
|
-
continue
|
|
42652
|
-
try:
|
|
42653
|
-
result = callGData(sitesObject, 'GetSite',
|
|
42654
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42655
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42656
|
-
domain=domain, site=site, url_params=url_params)
|
|
42657
|
-
if result:
|
|
42658
|
-
_showSite(sitesManager, sitesObject, domain, result, roles, j, jcount)
|
|
42659
|
-
except (GDATA.notFound, GDATA.forbidden) as e:
|
|
42660
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e))
|
|
42661
|
-
Ind.Decrement()
|
|
42662
|
-
|
|
42663
42262
|
# gam [<UserTypeEntity>] info site <SiteEntity> [withmappings] [role|roles all|<SiteACLRoleList>]
|
|
42664
|
-
def infoUserSites(users):
|
|
42665
|
-
_infoSites(users, Ent.USER)
|
|
42666
|
-
|
|
42667
|
-
def doInfoDomainSites():
|
|
42668
|
-
_infoSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
|
|
42669
|
-
|
|
42670
|
-
def printShowSites(entityList, entityType):
|
|
42671
|
-
def _getSites(domain, i, count):
|
|
42672
|
-
try:
|
|
42673
|
-
return callGDataPages(sitesObject, 'GetSiteFeed',
|
|
42674
|
-
pageMessage=getPageMessageForWhom(),
|
|
42675
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42676
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42677
|
-
domain=domain, url_params=url_params)
|
|
42678
|
-
except (GDATA.notFound, GDATA.forbidden) as e:
|
|
42679
|
-
entityActionFailedWarning([Ent.DOMAIN, domain], str(e), i, count)
|
|
42680
|
-
return []
|
|
42681
|
-
|
|
42682
|
-
def _printSites(entity, i, count, domain, sites):
|
|
42683
|
-
for site in sites:
|
|
42684
|
-
fields = sitesManager.SiteToFields(site)
|
|
42685
|
-
if fields[SITE_SITE] in sitesSet:
|
|
42686
|
-
continue
|
|
42687
|
-
sitesSet.add(fields[SITE_SITE])
|
|
42688
|
-
domainSite = f'{domain}/{fields[SITE_SITE]}'
|
|
42689
|
-
siteRow = {Ent.Singular(entityType): entity, SITE_SITE: domainSite}
|
|
42690
|
-
for field, value in iter(fields.items()):
|
|
42691
|
-
if field != SITE_SITE:
|
|
42692
|
-
if not isinstance(value, list):
|
|
42693
|
-
if field != SITE_SUMMARY or not convertCRNL:
|
|
42694
|
-
siteRow[field] = value
|
|
42695
|
-
else:
|
|
42696
|
-
siteRow[field] = escapeCRsNLs(value)
|
|
42697
|
-
else:
|
|
42698
|
-
siteRow[field] = delimiter.join(value)
|
|
42699
|
-
rowShown = False
|
|
42700
|
-
if roles:
|
|
42701
|
-
try:
|
|
42702
|
-
acls = callGDataPages(sitesObject, 'GetAclFeed',
|
|
42703
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42704
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42705
|
-
domain=domain, site=fields[SITE_SITE])
|
|
42706
|
-
for acl in acls:
|
|
42707
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42708
|
-
if fields['role'] in roles:
|
|
42709
|
-
siteACLRow = siteRow.copy()
|
|
42710
|
-
siteACLRow.update(ACLRuleDict(fields))
|
|
42711
|
-
csvPF.WriteRowTitles(siteACLRow)
|
|
42712
|
-
rowShown = True
|
|
42713
|
-
except GDATA.notFound as e:
|
|
42714
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e), i, count)
|
|
42715
|
-
except GDATA.forbidden:
|
|
42716
|
-
pass
|
|
42717
|
-
if not rowShown:
|
|
42718
|
-
csvPF.WriteRowTitles(siteRow)
|
|
42719
|
-
|
|
42720
|
-
def _showSites(entity, i, count, domain, sites):
|
|
42721
|
-
jcount = len(sites)
|
|
42722
|
-
if entityType == Ent.USER:
|
|
42723
|
-
entityPerformActionNumItems([entityType, entity, Ent.DOMAIN, domain], jcount, Ent.SITE, i, count)
|
|
42724
|
-
else:
|
|
42725
|
-
entityPerformActionNumItems([entityType, entity], jcount, Ent.SITE, i, count)
|
|
42726
|
-
Ind.Increment()
|
|
42727
|
-
j = 0
|
|
42728
|
-
for site in sites:
|
|
42729
|
-
j += 1
|
|
42730
|
-
_showSite(sitesManager, sitesObject, domain, site, roles, j, jcount)
|
|
42731
|
-
Ind.Decrement()
|
|
42732
|
-
|
|
42733
|
-
domains = []
|
|
42734
|
-
domainLists = []
|
|
42735
|
-
url_params = {}
|
|
42736
|
-
includeAllSites = 'true' if entityType == Ent.DOMAIN else 'false'
|
|
42737
|
-
roles = set()
|
|
42738
|
-
convertCRNL = GC.Values[GC.CSV_OUTPUT_CONVERT_CR_NL]
|
|
42739
|
-
delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
|
|
42740
|
-
csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, SITE_NAME, SITE_SUMMARY], 'sortall') if Act.csvFormat() else None
|
|
42741
|
-
while Cmd.ArgumentsRemaining():
|
|
42742
|
-
myarg = getArgument()
|
|
42743
|
-
if csvPF and myarg == 'todrive':
|
|
42744
|
-
csvPF.GetTodriveParameters()
|
|
42745
|
-
elif myarg in {'domain', 'domains'}:
|
|
42746
|
-
if entityType == Ent.DOMAIN:
|
|
42747
|
-
entityList = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
|
|
42748
|
-
else:
|
|
42749
|
-
domains = getEntityList(Cmd.OB_DOMAIN_NAME_ENTITY)
|
|
42750
|
-
domainLists = domains if isinstance(domains, dict) else None
|
|
42751
|
-
elif myarg == 'includeallsites':
|
|
42752
|
-
includeAllSites = 'true'
|
|
42753
|
-
elif myarg == 'maxresults':
|
|
42754
|
-
url_params['max-results'] = getInteger(minVal=1)
|
|
42755
|
-
elif myarg == 'startindex':
|
|
42756
|
-
url_params['start-index'] = getInteger(minVal=1)
|
|
42757
|
-
elif myarg == 'withmappings':
|
|
42758
|
-
url_params['with-mappings'] = 'true'
|
|
42759
|
-
elif myarg in {'role', 'roles'}:
|
|
42760
|
-
roles = getACLRoles(SITE_ACL_ROLES_MAP)
|
|
42761
|
-
elif myarg in {'convertcrnl', 'converttextnl', 'convertsummarynl'}:
|
|
42762
|
-
convertCRNL = True
|
|
42763
|
-
elif myarg == 'delimiter':
|
|
42764
|
-
delimiter = getCharacter()
|
|
42765
|
-
else:
|
|
42766
|
-
unknownArgumentExit()
|
|
42767
|
-
sitesManager = SitesManager()
|
|
42768
|
-
sitesSet = set()
|
|
42769
|
-
i, count, entityList = getEntityArgument(entityList)
|
|
42770
|
-
if entityType == Ent.USER:
|
|
42771
|
-
for user in entityList:
|
|
42772
|
-
i += 1
|
|
42773
|
-
if domainLists:
|
|
42774
|
-
domainList = domainLists[user]
|
|
42775
|
-
elif domains:
|
|
42776
|
-
domainList = domains
|
|
42777
|
-
else:
|
|
42778
|
-
_, domain = splitEmailAddress(user)
|
|
42779
|
-
domainList = [domain]
|
|
42780
|
-
user, sitesObject = getSitesObject(entityType, user, i, count)
|
|
42781
|
-
if not sitesObject:
|
|
42782
|
-
continue
|
|
42783
|
-
jcount = len(domainList)
|
|
42784
|
-
j = 0
|
|
42785
|
-
for domain in domainList:
|
|
42786
|
-
j += 1
|
|
42787
|
-
if domain != 'site':
|
|
42788
|
-
url_params['include-all-sites'] = includeAllSites
|
|
42789
|
-
else:
|
|
42790
|
-
url_params.pop('include-all-sites', None)
|
|
42791
|
-
printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.USER)}: {user}, {Ent.Singular(Ent.DOMAIN)}: {domain}')
|
|
42792
|
-
sites = _getSites(domain, i, count)
|
|
42793
|
-
if not csvPF:
|
|
42794
|
-
_showSites(domain, j, jcount, domain, sites)
|
|
42795
|
-
else:
|
|
42796
|
-
_printSites(user, j, jcount, domain, sites)
|
|
42797
|
-
else:
|
|
42798
|
-
for domain in entityList:
|
|
42799
|
-
i += 1
|
|
42800
|
-
domain, sitesObject = getSitesObject(entityType, domain, i, count)
|
|
42801
|
-
if not sitesObject:
|
|
42802
|
-
continue
|
|
42803
|
-
if domain != 'site':
|
|
42804
|
-
url_params['include-all-sites'] = includeAllSites
|
|
42805
|
-
else:
|
|
42806
|
-
url_params.pop('include-all-sites', None)
|
|
42807
|
-
printGettingAllEntityItemsForWhom(Ent.SITE, f'{Ent.Singular(Ent.DOMAIN)}: {domain}')
|
|
42808
|
-
sites = _getSites(domain, i, count)
|
|
42809
|
-
if not csvPF:
|
|
42810
|
-
_showSites(domain, i, count, domain, sites)
|
|
42811
|
-
else:
|
|
42812
|
-
_printSites(domain, i, count, domain, sites)
|
|
42813
|
-
if csvPF:
|
|
42814
|
-
csvPF.SortTitles()
|
|
42815
|
-
csvPF.SetSortTitles([])
|
|
42816
|
-
if roles:
|
|
42817
|
-
csvPF.MoveTitlesToEnd(['Scope', 'Role'])
|
|
42818
|
-
csvPF.writeCSVfile('Sites')
|
|
42819
|
-
|
|
42820
|
-
# gam print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
|
|
42821
|
-
# [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
|
|
42822
|
-
# gam show sites [domain|domains <DomainNameEntity>] [includeallsites]
|
|
42823
|
-
# [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
|
|
42824
|
-
def doPrintShowDomainSites():
|
|
42825
|
-
printShowSites([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
|
|
42826
|
-
|
|
42827
42263
|
# gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
|
|
42828
42264
|
# [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
|
|
42829
42265
|
# gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
|
|
42830
42266
|
# [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl]
|
|
42831
|
-
def printShowUserSites(users):
|
|
42832
|
-
printShowSites(users, Ent.USER)
|
|
42833
|
-
|
|
42834
|
-
SITE_ACTION_TO_MODIFIER_MAP = {
|
|
42835
|
-
Act.ADD: Act.MODIFIER_TO,
|
|
42836
|
-
Act.UPDATE: Act.MODIFIER_IN,
|
|
42837
|
-
Act.DELETE: Act.MODIFIER_FROM,
|
|
42838
|
-
Act.INFO: Act.MODIFIER_FROM,
|
|
42839
|
-
Act.PRINT: Act.MODIFIER_FROM,
|
|
42840
|
-
Act.SHOW: Act.MODIFIER_FROM,
|
|
42841
|
-
}
|
|
42842
|
-
|
|
42843
|
-
def _processSiteACLs(users, entityType):
|
|
42844
|
-
action = Act.Get()
|
|
42845
|
-
siteEntity = getSiteEntity()
|
|
42846
|
-
csvPF = None
|
|
42847
|
-
if action in [Act.ADD, Act.UPDATE]:
|
|
42848
|
-
role = getChoice(SITE_ACL_ROLES_MAP, mapChoice=True)
|
|
42849
|
-
elif action == Act.PRINT:
|
|
42850
|
-
csvPF = CSVPrintFile([Ent.Singular(entityType), SITE_SITE, 'Scope', 'Role'])
|
|
42851
|
-
else:
|
|
42852
|
-
role = None
|
|
42853
|
-
actionPrintShow = action in [Act.PRINT, Act.SHOW]
|
|
42854
|
-
ACLScopeEntity = getCalendarSiteACLScopeEntity() if not actionPrintShow else {}
|
|
42855
|
-
getTodriveOnly(csvPF)
|
|
42856
|
-
modifier = SITE_ACTION_TO_MODIFIER_MAP[action]
|
|
42857
|
-
sitesManager = SitesManager()
|
|
42858
|
-
i, count, users = getEntityArgument(users)
|
|
42859
|
-
for user in users:
|
|
42860
|
-
i += 1
|
|
42861
|
-
origUser = user
|
|
42862
|
-
user, sitesObject, sites, jcount = _validateUserGetSites(entityType, user, i, count, siteEntity, Ent.SITE_ACL, modifier)
|
|
42863
|
-
if jcount == 0:
|
|
42864
|
-
continue
|
|
42865
|
-
Ind.Increment()
|
|
42866
|
-
j = 0
|
|
42867
|
-
for site in sites:
|
|
42868
|
-
j += 1
|
|
42869
|
-
domain, site, domainSite, ruleIds, kcount = _validateSiteGetRuleIds(origUser, site, j, jcount, ACLScopeEntity, showAction=not actionPrintShow)
|
|
42870
|
-
if not domainSite:
|
|
42871
|
-
continue
|
|
42872
|
-
if not actionPrintShow:
|
|
42873
|
-
Ind.Increment()
|
|
42874
|
-
k = 0
|
|
42875
|
-
for ruleId in ruleIds:
|
|
42876
|
-
k += 1
|
|
42877
|
-
ruleId = normalizeRuleId(ruleId)
|
|
42878
|
-
try:
|
|
42879
|
-
if action in [Act.CREATE, Act.ADD]:
|
|
42880
|
-
acl = callGData(sitesObject, 'CreateAclEntry',
|
|
42881
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.ENTITY_EXISTS, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42882
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42883
|
-
aclentry=sitesManager.FieldsToAclEntry(makeRoleRuleIdBody(role, ruleId)), domain=domain, site=site)
|
|
42884
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42885
|
-
if not fields.get('inviteLink'):
|
|
42886
|
-
entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
|
|
42887
|
-
else:
|
|
42888
|
-
entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, f'{formatACLRule(fields)} (Link: {fields["inviteLink"]})'], k, kcount)
|
|
42889
|
-
elif action == Act.UPDATE:
|
|
42890
|
-
acl = callGData(sitesObject, 'GetAclEntry',
|
|
42891
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42892
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42893
|
-
domain=domain, site=site, ruleId=ruleId)
|
|
42894
|
-
acl.role.value = role
|
|
42895
|
-
acl = callGData(sitesObject, 'UpdateAclEntry',
|
|
42896
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42897
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42898
|
-
aclentry=acl, domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
|
|
42899
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42900
|
-
entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
|
|
42901
|
-
elif action == Act.DELETE:
|
|
42902
|
-
acl = callGData(sitesObject, 'GetAclEntry',
|
|
42903
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42904
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42905
|
-
domain=domain, site=site, ruleId=ruleId)
|
|
42906
|
-
callGData(sitesObject, 'DeleteAclEntry',
|
|
42907
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42908
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42909
|
-
domain=domain, site=site, ruleId=ruleId, extra_headers={'If-Match': acl.etag})
|
|
42910
|
-
entityActionPerformed([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, None)], k, kcount)
|
|
42911
|
-
elif action == Act.INFO:
|
|
42912
|
-
acl = callGData(sitesObject, 'GetAclEntry',
|
|
42913
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.BAD_REQUEST, GDATA.FORBIDDEN],
|
|
42914
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42915
|
-
domain=domain, site=site, ruleId=ruleId)
|
|
42916
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42917
|
-
printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
|
|
42918
|
-
except GDATA.notFound as e:
|
|
42919
|
-
if not checkSiteExists(sitesObject, domain, site):
|
|
42920
|
-
entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
|
|
42921
|
-
break
|
|
42922
|
-
entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
|
|
42923
|
-
except (GDATA.entityExists, GDATA.badRequest, GDATA.forbidden) as e:
|
|
42924
|
-
entityActionFailedWarning([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLScopeRole(ruleId, role)], str(e), k, kcount)
|
|
42925
|
-
Ind.Decrement()
|
|
42926
|
-
else:
|
|
42927
|
-
try:
|
|
42928
|
-
acls = callGDataPages(sitesObject, 'GetAclFeed',
|
|
42929
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
42930
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
42931
|
-
domain=domain, site=site)
|
|
42932
|
-
if not csvPF:
|
|
42933
|
-
kcount = len(acls)
|
|
42934
|
-
entityPerformActionNumItems([Ent.SITE, domainSite], kcount, Ent.SITE_ACL, j, jcount)
|
|
42935
|
-
if kcount == 0:
|
|
42936
|
-
continue
|
|
42937
|
-
Ind.Increment()
|
|
42938
|
-
k = 0
|
|
42939
|
-
for acl in acls:
|
|
42940
|
-
k += 1
|
|
42941
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42942
|
-
printEntity([Ent.SITE, domainSite, Ent.SITE_ACL, formatACLRule(fields)], k, kcount)
|
|
42943
|
-
Ind.Decrement()
|
|
42944
|
-
else:
|
|
42945
|
-
siteRow = {Ent.Singular(entityType): user, SITE_SITE: domainSite}
|
|
42946
|
-
for acl in acls:
|
|
42947
|
-
fields = sitesManager.AclEntryToFields(acl)
|
|
42948
|
-
siteACLRow = siteRow.copy()
|
|
42949
|
-
siteACLRow.update(ACLRuleDict(fields))
|
|
42950
|
-
csvPF.WriteRowTitles(siteACLRow)
|
|
42951
|
-
except GDATA.notFound:
|
|
42952
|
-
entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
|
|
42953
|
-
except GDATA.forbidden as e:
|
|
42954
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
|
|
42955
|
-
Ind.Decrement()
|
|
42956
|
-
if csvPF:
|
|
42957
|
-
csvPF.writeCSVfile('Site ACLs')
|
|
42958
|
-
|
|
42959
42267
|
# gam [<UserTypeEntity>] create siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
42960
42268
|
# gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
42961
42269
|
# gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
42962
42270
|
# gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
42963
42271
|
# gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
|
42964
42272
|
# gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
|
42965
|
-
def processUserSiteACLs(users):
|
|
42966
|
-
_processSiteACLs(users, Ent.USER)
|
|
42967
|
-
|
|
42968
|
-
def doProcessDomainSiteACLs():
|
|
42969
|
-
_processSiteACLs([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
|
|
42970
|
-
|
|
42971
|
-
def _printSiteActivity(users, entityType):
|
|
42972
|
-
sitesManager = SitesManager()
|
|
42973
|
-
url_params = {}
|
|
42974
|
-
csvPF = CSVPrintFile([SITE_SITE, SITE_SUMMARY, SITE_UPDATED], 'sortall')
|
|
42975
|
-
sites = getEntityList(Cmd.OB_SITE_ENTITY)
|
|
42976
|
-
siteLists = sites if isinstance(sites, dict) else None
|
|
42977
|
-
while Cmd.ArgumentsRemaining():
|
|
42978
|
-
myarg = getArgument()
|
|
42979
|
-
if myarg == 'todrive':
|
|
42980
|
-
csvPF.GetTodriveParameters()
|
|
42981
|
-
elif myarg == 'maxresults':
|
|
42982
|
-
url_params['max-results'] = getInteger(minVal=1)
|
|
42983
|
-
elif myarg == 'startindex':
|
|
42984
|
-
url_params['start-index'] = getInteger(minVal=1)
|
|
42985
|
-
elif myarg == 'updatedmin':
|
|
42986
|
-
url_params['updated-min'] = getYYYYMMDD()
|
|
42987
|
-
elif myarg == 'updatedmax':
|
|
42988
|
-
url_params['updated-max'] = getYYYYMMDD()
|
|
42989
|
-
else:
|
|
42990
|
-
unknownArgumentExit()
|
|
42991
|
-
i, count, users = getEntityArgument(users)
|
|
42992
|
-
for user in users:
|
|
42993
|
-
i += 1
|
|
42994
|
-
if siteLists:
|
|
42995
|
-
sites = siteLists[user]
|
|
42996
|
-
user, sitesObject = getSitesObject(entityType, user, i, count)
|
|
42997
|
-
if not sitesObject:
|
|
42998
|
-
continue
|
|
42999
|
-
jcount = len(sites)
|
|
43000
|
-
if jcount == 0:
|
|
43001
|
-
setSysExitRC(NO_ENTITIES_FOUND_RC)
|
|
43002
|
-
continue
|
|
43003
|
-
Ind.Increment()
|
|
43004
|
-
j = 0
|
|
43005
|
-
for site in sites:
|
|
43006
|
-
j += 1
|
|
43007
|
-
domain, site, domainSite = _validateSite(site, j, jcount)
|
|
43008
|
-
if not domainSite:
|
|
43009
|
-
continue
|
|
43010
|
-
printGettingAllEntityItemsForWhom(Ent.ACTIVITY, domainSite)
|
|
43011
|
-
try:
|
|
43012
|
-
activities = callGDataPages(sitesObject, 'GetActivityFeed',
|
|
43013
|
-
pageMessage=getPageMessageForWhom(),
|
|
43014
|
-
throwErrors=[GDATA.NOT_FOUND, GDATA.FORBIDDEN],
|
|
43015
|
-
retryErrors=[GDATA.INTERNAL_SERVER_ERROR],
|
|
43016
|
-
domain=domain, site=site, url_params=url_params)
|
|
43017
|
-
for activity in activities:
|
|
43018
|
-
fields = sitesManager.ActivityEntryToFields(activity)
|
|
43019
|
-
activityRow = {SITE_SITE: domainSite}
|
|
43020
|
-
for key, value in iter(fields.items()):
|
|
43021
|
-
if not isinstance(value, list):
|
|
43022
|
-
activityRow[key] = value
|
|
43023
|
-
else:
|
|
43024
|
-
activityRow[key] = ','.join(value)
|
|
43025
|
-
csvPF.WriteRowTitles(activityRow)
|
|
43026
|
-
except GDATA.notFound:
|
|
43027
|
-
entityUnknownWarning(Ent.SITE, domainSite, j, jcount)
|
|
43028
|
-
except GDATA.forbidden as e:
|
|
43029
|
-
entityActionFailedWarning([Ent.SITE, domainSite], str(e), j, jcount)
|
|
43030
|
-
csvPF.writeCSVfile('Site Activities')
|
|
43031
|
-
|
|
43032
42273
|
# gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*]
|
|
43033
42274
|
# [startindex <Number>] [maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
|
|
43034
|
-
def
|
|
43035
|
-
|
|
42275
|
+
def deprecatedUserSites(users):
|
|
42276
|
+
deprecatedCommandExit()
|
|
43036
42277
|
|
|
43037
|
-
def
|
|
43038
|
-
|
|
42278
|
+
def deprecatedDomainSites():
|
|
42279
|
+
deprecatedCommandExit()
|
|
43039
42280
|
|
|
43040
42281
|
# <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]
|
|
43041
42282
|
def _getGroupOrgUnitMap():
|
|
@@ -75733,8 +74974,8 @@ MAIN_ADD_CREATE_FUNCTIONS = {
|
|
|
75733
74974
|
Cmd.ARG_SAKEY: doCreateSvcAcctKeys,
|
|
75734
74975
|
Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
|
|
75735
74976
|
Cmd.ARG_SHAREDDRIVE: doCreateSharedDrive,
|
|
75736
|
-
Cmd.ARG_SITE:
|
|
75737
|
-
Cmd.ARG_SITEACL:
|
|
74977
|
+
Cmd.ARG_SITE: deprecatedDomainSites,
|
|
74978
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
75738
74979
|
Cmd.ARG_SVCACCT: doCreateSvcAcct,
|
|
75739
74980
|
Cmd.ARG_USER: doCreateUser,
|
|
75740
74981
|
Cmd.ARG_VAULTEXPORT: doCreateVaultExport,
|
|
@@ -75848,7 +75089,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
|
|
75848
75089
|
Cmd.ARG_SAKEY: doDeleteSvcAcctKeys,
|
|
75849
75090
|
Cmd.ARG_SCHEMA: doDeleteUserSchemas,
|
|
75850
75091
|
Cmd.ARG_SHAREDDRIVE: doDeleteSharedDrive,
|
|
75851
|
-
Cmd.ARG_SITEACL:
|
|
75092
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
75852
75093
|
Cmd.ARG_SVCACCT: doDeleteSvcAcct,
|
|
75853
75094
|
Cmd.ARG_USER: doDeleteUser,
|
|
75854
75095
|
Cmd.ARG_USERS: doDeleteUsers,
|
|
@@ -75937,8 +75178,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
|
|
75937
75178
|
Cmd.ARG_RESOURCES: doInfoResourceCalendars,
|
|
75938
75179
|
Cmd.ARG_SCHEMA: doInfoUserSchemas,
|
|
75939
75180
|
Cmd.ARG_SHAREDDRIVE: doInfoSharedDrive,
|
|
75940
|
-
Cmd.ARG_SITE:
|
|
75941
|
-
Cmd.ARG_SITEACL:
|
|
75181
|
+
Cmd.ARG_SITE: deprecatedDomainSites,
|
|
75182
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
75942
75183
|
Cmd.ARG_USER: doInfoUser,
|
|
75943
75184
|
Cmd.ARG_USERS: doInfoUsers,
|
|
75944
75185
|
Cmd.ARG_USERINVITATION: doInfoCIUserInvitations,
|
|
@@ -76040,9 +75281,9 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
|
|
76040
75281
|
Cmd.ARG_SCHEMA: doPrintShowUserSchemas,
|
|
76041
75282
|
Cmd.ARG_SHAREDDRIVE: doPrintShowSharedDrives,
|
|
76042
75283
|
Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
|
|
76043
|
-
Cmd.ARG_SITE:
|
|
76044
|
-
Cmd.ARG_SITEACL:
|
|
76045
|
-
Cmd.ARG_SITEACTIVITY:
|
|
75284
|
+
Cmd.ARG_SITE: deprecatedDomainSites,
|
|
75285
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
75286
|
+
Cmd.ARG_SITEACTIVITY: deprecatedDomainSites,
|
|
76046
75287
|
Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
|
|
76047
75288
|
Cmd.ARG_TOKEN: doPrintShowTokens,
|
|
76048
75289
|
Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
|
|
@@ -76158,8 +75399,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
|
|
76158
75399
|
Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
|
|
76159
75400
|
Cmd.ARG_SHAREDDRIVEINFO: doInfoSharedDrive,
|
|
76160
75401
|
Cmd.ARG_SHAREDDRIVETHEMES: doShowSharedDriveThemes,
|
|
76161
|
-
Cmd.ARG_SITE:
|
|
76162
|
-
Cmd.ARG_SITEACL:
|
|
75402
|
+
Cmd.ARG_SITE: deprecatedDomainSites,
|
|
75403
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
76163
75404
|
Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
|
|
76164
75405
|
Cmd.ARG_TOKEN: doPrintShowTokens,
|
|
76165
75406
|
Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
|
|
@@ -76224,8 +75465,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
|
|
76224
75465
|
Cmd.ARG_SAKEY: doUpdateSvcAcctKeys,
|
|
76225
75466
|
Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
|
|
76226
75467
|
Cmd.ARG_SHAREDDRIVE: doUpdateSharedDrive,
|
|
76227
|
-
Cmd.ARG_SITE:
|
|
76228
|
-
Cmd.ARG_SITEACL:
|
|
75468
|
+
Cmd.ARG_SITE: deprecatedDomainSites,
|
|
75469
|
+
Cmd.ARG_SITEACL: deprecatedDomainSites,
|
|
76229
75470
|
Cmd.ARG_SVCACCT: doCheckUpdateSvcAcct,
|
|
76230
75471
|
Cmd.ARG_USER: doUpdateUser,
|
|
76231
75472
|
Cmd.ARG_USERS: doUpdateUsers,
|
|
@@ -76764,8 +76005,8 @@ USER_ADD_CREATE_FUNCTIONS = {
|
|
|
76764
76005
|
Cmd.ARG_SENDAS: createUpdateSendAs,
|
|
76765
76006
|
Cmd.ARG_SHAREDDRIVE: createSharedDrive,
|
|
76766
76007
|
Cmd.ARG_SHEET: createSheet,
|
|
76767
|
-
Cmd.ARG_SITE:
|
|
76768
|
-
Cmd.ARG_SITEACL:
|
|
76008
|
+
Cmd.ARG_SITE: deprecatedUserSites,
|
|
76009
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
76769
76010
|
Cmd.ARG_SMIME: createSmime,
|
|
76770
76011
|
Cmd.ARG_TASK: processTasks,
|
|
76771
76012
|
Cmd.ARG_TASKLIST: processTasklists,
|
|
@@ -76883,7 +76124,7 @@ USER_COMMANDS_WITH_OBJECTS = {
|
|
|
76883
76124
|
Cmd.ARG_SENDAS: deleteInfoSendAs,
|
|
76884
76125
|
Cmd.ARG_SMIME: deleteSmime,
|
|
76885
76126
|
Cmd.ARG_SHAREDDRIVE: deleteSharedDrive,
|
|
76886
|
-
Cmd.ARG_SITEACL:
|
|
76127
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
76887
76128
|
Cmd.ARG_TASK: processTasks,
|
|
76888
76129
|
Cmd.ARG_TASKLIST: processTasklists,
|
|
76889
76130
|
Cmd.ARG_THREAD: processThreads,
|
|
@@ -76972,8 +76213,8 @@ USER_COMMANDS_WITH_OBJECTS = {
|
|
|
76972
76213
|
Cmd.ARG_SENDAS: deleteInfoSendAs,
|
|
76973
76214
|
Cmd.ARG_SHAREDDRIVE: infoSharedDrive,
|
|
76974
76215
|
Cmd.ARG_SHEET: infoPrintShowSheets,
|
|
76975
|
-
Cmd.ARG_SITE:
|
|
76976
|
-
Cmd.ARG_SITEACL:
|
|
76216
|
+
Cmd.ARG_SITE: deprecatedUserSites,
|
|
76217
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
76977
76218
|
Cmd.ARG_TASK: processTasks,
|
|
76978
76219
|
Cmd.ARG_TASKLIST: processTasklists,
|
|
76979
76220
|
Cmd.ARG_USER: infoUsers,
|
|
@@ -77085,9 +76326,9 @@ USER_COMMANDS_WITH_OBJECTS = {
|
|
|
77085
76326
|
Cmd.ARG_SHEETRANGE: printShowSheetRanges,
|
|
77086
76327
|
Cmd.ARG_SIGNATURE: printShowSignature,
|
|
77087
76328
|
Cmd.ARG_SMIME: printShowSmimes,
|
|
77088
|
-
Cmd.ARG_SITE:
|
|
77089
|
-
Cmd.ARG_SITEACL:
|
|
77090
|
-
Cmd.ARG_SITEACTIVITY:
|
|
76329
|
+
Cmd.ARG_SITE: deprecatedUserSites,
|
|
76330
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
76331
|
+
Cmd.ARG_SITEACTIVITY: deprecatedUserSites,
|
|
77091
76332
|
Cmd.ARG_TASK: printShowTasks,
|
|
77092
76333
|
Cmd.ARG_TASKLIST: printShowTasklists,
|
|
77093
76334
|
Cmd.ARG_THREAD: printShowThreads,
|
|
@@ -77191,8 +76432,8 @@ USER_COMMANDS_WITH_OBJECTS = {
|
|
|
77191
76432
|
Cmd.ARG_SHEET: infoPrintShowSheets,
|
|
77192
76433
|
Cmd.ARG_SHEETRANGE: printShowSheetRanges,
|
|
77193
76434
|
Cmd.ARG_SIGNATURE: printShowSignature,
|
|
77194
|
-
Cmd.ARG_SITE:
|
|
77195
|
-
Cmd.ARG_SITEACL:
|
|
76435
|
+
Cmd.ARG_SITE: deprecatedUserSites,
|
|
76436
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
77196
76437
|
Cmd.ARG_SMIME: printShowSmimes,
|
|
77197
76438
|
Cmd.ARG_TASK: printShowTasks,
|
|
77198
76439
|
Cmd.ARG_TASKLIST: printShowTasklists,
|
|
@@ -77295,8 +76536,8 @@ USER_COMMANDS_WITH_OBJECTS = {
|
|
|
77295
76536
|
Cmd.ARG_SHEET: updateSheets,
|
|
77296
76537
|
Cmd.ARG_SHEETRANGE: updateSheetRanges,
|
|
77297
76538
|
Cmd.ARG_SMIME: updateSmime,
|
|
77298
|
-
Cmd.ARG_SITE:
|
|
77299
|
-
Cmd.ARG_SITEACL:
|
|
76539
|
+
Cmd.ARG_SITE: deprecatedUserSites,
|
|
76540
|
+
Cmd.ARG_SITEACL: deprecatedUserSites,
|
|
77300
76541
|
Cmd.ARG_TASK: processTasks,
|
|
77301
76542
|
Cmd.ARG_TASKLIST: processTasklists,
|
|
77302
76543
|
Cmd.ARG_USER: updateUsers,
|
gam/gamlib/glapi.py
CHANGED
|
@@ -89,7 +89,6 @@ SERVICEMANAGEMENT = 'servicemanagement'
|
|
|
89
89
|
SERVICEUSAGE = 'serviceusage'
|
|
90
90
|
SHEETS = 'sheets'
|
|
91
91
|
SHEETSTD = 'sheetstd'
|
|
92
|
-
SITES = 'sites'
|
|
93
92
|
SITEVERIFICATION = 'siteVerification'
|
|
94
93
|
STORAGE = 'storage'
|
|
95
94
|
STORAGEREAD = 'storageread'
|
|
@@ -266,7 +265,6 @@ _INFO = {
|
|
|
266
265
|
SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
|
|
267
266
|
SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
|
|
268
267
|
SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
|
|
269
|
-
SITES: {'name': 'Sites API', 'version': 'v1', 'v2discovery': False},
|
|
270
268
|
SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
|
|
271
269
|
STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
|
|
272
270
|
STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
|
|
@@ -500,11 +498,6 @@ _CLIENT_SCOPES = [
|
|
|
500
498
|
'subscopes': [],
|
|
501
499
|
'offByDefault': True,
|
|
502
500
|
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
|
503
|
-
{'name': 'Sites API',
|
|
504
|
-
'api': SITES,
|
|
505
|
-
'subscopes': [],
|
|
506
|
-
'offByDefault': True,
|
|
507
|
-
'scope': 'https://sites.google.com/feeds'},
|
|
508
501
|
{'name': 'Vault API',
|
|
509
502
|
'api': VAULT,
|
|
510
503
|
'subscopes': READONLY,
|
|
@@ -694,10 +687,6 @@ _SVCACCT_SCOPES = [
|
|
|
694
687
|
'api': SHEETS,
|
|
695
688
|
'subscopes': READONLY,
|
|
696
689
|
'scope': 'https://www.googleapis.com/auth/spreadsheets'},
|
|
697
|
-
{'name': 'Sites API',
|
|
698
|
-
'api': SITES,
|
|
699
|
-
'subscopes': [],
|
|
700
|
-
'scope': 'https://sites.google.com/feeds'},
|
|
701
690
|
{'name': 'Tasks API',
|
|
702
691
|
'api': TASKS,
|
|
703
692
|
'subscopes': READONLY,
|
gam/gamlib/glclargs.py
CHANGED
|
@@ -1150,6 +1150,10 @@ class GamCLArgs():
|
|
|
1150
1150
|
return f'Command: {self.QuotedArgumentList(self.argv[:self.argvI])} >>>{self.QuotedArgumentList([self.argv[self.argvI]])}<<< {self.QuotedArgumentList(self.argv[self.argvI+1:])}\n'
|
|
1151
1151
|
return f'Command: {self.QuotedArgumentList(self.argv)} >>><<<\n'
|
|
1152
1152
|
|
|
1153
|
+
# Deprecated command
|
|
1154
|
+
def CommandDeprecated(self):
|
|
1155
|
+
return f'{self.QuotedArgumentList(self.argv)}\n'
|
|
1156
|
+
|
|
1153
1157
|
# Peek to see if next argument is in choices
|
|
1154
1158
|
def PeekArgumentPresent(self, choices):
|
|
1155
1159
|
if self.ArgumentsRemaining():
|
gam/gamlib/glentity.py
CHANGED
|
@@ -342,8 +342,6 @@ class GamEntity():
|
|
|
342
342
|
SHEET = 'shet'
|
|
343
343
|
SHEET_ID = 'shti'
|
|
344
344
|
SIGNATURE = 'sign'
|
|
345
|
-
SITE = 'site'
|
|
346
|
-
SITE_ACL = 'sacl'
|
|
347
345
|
SIZE = 'size'
|
|
348
346
|
SKU = 'sku '
|
|
349
347
|
SMIME_ID = 'smid'
|
|
@@ -695,8 +693,6 @@ class GamEntity():
|
|
|
695
693
|
SHEET: ['Sheets', 'Sheet'],
|
|
696
694
|
SHEET_ID: ['Sheet IDs', 'Sheet ID'],
|
|
697
695
|
SIGNATURE: ['Signatures', 'Signature'],
|
|
698
|
-
SITE: ['Sites', 'Site'],
|
|
699
|
-
SITE_ACL: ['Site ACLs', 'Site ACL'],
|
|
700
696
|
SIZE: ['Sizes', 'Size'],
|
|
701
697
|
SKU: ['SKUs', 'SKU'],
|
|
702
698
|
SMIME_ID: ['S/MIME Certificate IDs', 'S/MIME Certificate ID'],
|
gam/gamlib/glmsgs.py
CHANGED
|
@@ -481,6 +481,7 @@ SERVICE_NOT_APPLICABLE = 'Service not applicable/Does not exist'
|
|
|
481
481
|
SERVICE_NOT_APPLICABLE_THIS_ADDRESS = 'Service not applicable for this address: {0}'
|
|
482
482
|
SERVICE_NOT_ENABLED = '{0} Service/App not enabled'
|
|
483
483
|
SHORTCUT_TARGET_CAPABILITY_IS_FALSE = '{0} capability {1} is False'
|
|
484
|
+
SITES_COMMAND_DEPRECATED = 'The Classic Sites API is deprecated, this command will not work:\n{0}'
|
|
484
485
|
SKU_HAS_NO_MATCHING_ARCHIVED_USER_SKU = 'SKU {0} has no matching Archived User SKU'
|
|
485
486
|
STARTING_THREAD = 'Starting thread'
|
|
486
487
|
STATISTICS_COPY_FILE = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Copy Failed: {5}, Not copyable: {6}, In skipids: {7}, Permissions Failed: {8}, Protected Ranges Failed: {9}'
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
gam/__init__.py,sha256=
|
|
1
|
+
gam/__init__.py,sha256=TVtDzftfoUVfeees4B_zmjxR3QmMDByRTKrN_qzBdN4,3471510
|
|
2
2
|
gam/__main__.py,sha256=amz0-959ph6zkZKqjaar4n60yho-T37w6qWI36qx0CA,1049
|
|
3
3
|
gam/cacerts.pem,sha256=nJuWha0xm5dHw_5ptGphwRoO-r36Ccpqiww9pCEDbSc,67484
|
|
4
4
|
gam/cbcm-v1.1beta1.json,sha256=xO5XloCQQULmPbFBx5bckdqmbLFQ7sJ2TImhE1ysDIY,19439
|
|
@@ -22,15 +22,15 @@ gam/atom/token_store.py,sha256=7E6Ecvxa86WCvl1pJAhv78jg9OxQv8pMtIUcPhZCq04,3803
|
|
|
22
22
|
gam/atom/url.py,sha256=pxO1TlORxyKQTQ1bkBE1unFzjnv9c8LjJkm-UEORShY,4276
|
|
23
23
|
gam/gamlib/__init__.py,sha256=z5mF-y0j8pm-YNFBaiuxB4M_GAUPG-cXWwrhYwrVReM,679
|
|
24
24
|
gam/gamlib/glaction.py,sha256=1Il_HrChVnPkzZwiZs5au4mFQVtq4K1Z42uIuR6qdnI,9419
|
|
25
|
-
gam/gamlib/glapi.py,sha256=
|
|
25
|
+
gam/gamlib/glapi.py,sha256=AkZRK0ebSBn7iJApTZl2crRWY3-D0vNmwTI36ZEo34s,34171
|
|
26
26
|
gam/gamlib/glcfg.py,sha256=3ix3GFXP8riaD4z4ubt4qUCxznhmLU-bZHCw8TxLiz8,27484
|
|
27
|
-
gam/gamlib/glclargs.py,sha256=
|
|
28
|
-
gam/gamlib/glentity.py,sha256=
|
|
27
|
+
gam/gamlib/glclargs.py,sha256=ptSTGELZHQS6SfvGGJ3NrXRoHAToO108NTYsFQE-C4c,42200
|
|
28
|
+
gam/gamlib/glentity.py,sha256=ZLbyMl9NhN-MBf9Rxmho2dBYeS4SNLMctpeaKFZSbQ4,33801
|
|
29
29
|
gam/gamlib/glgapi.py,sha256=W1nFH0sY7P8pnb98_4uzMSCs8gre0rvG5pBRI6HJq0c,38274
|
|
30
30
|
gam/gamlib/glgdata.py,sha256=weRppttWm6uRyqtBoGPKoHiNZ2h28nhfUV4J_mbCszY,2707
|
|
31
31
|
gam/gamlib/glglobals.py,sha256=B0kCz4K6PO1-n3eZI_lvdRG99Ane1-dH4zS4J4aymlI,9566
|
|
32
32
|
gam/gamlib/glindent.py,sha256=RfBa2LDfLIqPLL5vMfC689TCVmqn8xf-qulSzkiatrc,1228
|
|
33
|
-
gam/gamlib/glmsgs.py,sha256=
|
|
33
|
+
gam/gamlib/glmsgs.py,sha256=HzISx_btqbwOKjMm2rokV4-Y1BMDS04-bwu6fa92XCo,33202
|
|
34
34
|
gam/gamlib/glskus.py,sha256=S-OasG1SteZSV0cG8JM74L3wFp9sozoZd39fTXajQWc,14159
|
|
35
35
|
gam/gamlib/gluprop.py,sha256=IyPLCyvn7-NHTUenM71YPQPXRZXx6CB5q-GtJ-FYd1c,11461
|
|
36
36
|
gam/gamlib/glverlibs.py,sha256=XXYhmjOVti78JTy7NNr4ShIwiOX7LrfrmFSlqSWixrE,1077
|
|
@@ -66,8 +66,8 @@ gam/googleapiclient/discovery_cache/base.py,sha256=yCDPtxnbNN-p5_9fzBacC6P3wcUPl
|
|
|
66
66
|
gam/googleapiclient/discovery_cache/file_cache.py,sha256=sim3Mg4HgRYo3vX75jvcKy_aV568EvIrtBfvfbw-044,4774
|
|
67
67
|
gam/iso8601/__init__.py,sha256=Z2PsYbXgAH5a5xzUvgczCboPzqWpm65kRcIngCnhViU,1218
|
|
68
68
|
gam/iso8601/iso8601.py,sha256=Li2FHZ4sBTWuthuQhyCvmvj0j6At8JbGzkSv2fc2RHU,4384
|
|
69
|
-
gam7-7.
|
|
70
|
-
gam7-7.
|
|
71
|
-
gam7-7.
|
|
72
|
-
gam7-7.
|
|
73
|
-
gam7-7.
|
|
69
|
+
gam7-7.4.1.dist-info/METADATA,sha256=CtD82jtdLbj0wYtnKS0VoRQ0xCwE4rO-_PDDKjONh9g,2888
|
|
70
|
+
gam7-7.4.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
71
|
+
gam7-7.4.1.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
|
|
72
|
+
gam7-7.4.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
73
|
+
gam7-7.4.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|