gam7 7.3.9__py3-none-any.whl → 7.4.0__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 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.03.09'
28
+ __version__ = '7.04.00'
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
@@ -825,6 +822,9 @@ def deprecatedArgument(argument):
825
822
  def deprecatedArgumentExit(argument):
826
823
  usageErrorExit(f'{Cmd.ARGUMENT_ERROR_NAMES[Cmd.ARGUMENT_DEPRECATED][1]}: <{argument}>')
827
824
 
825
+ def deprecatedCommandExit():
826
+ systemErrorExit(USAGE_ERROR_RC, Msg.SITES_COMMAND_DEPRECATED.format(Cmd.CommandDeprecated()))
827
+
828
828
  # Choices is the valid set of choices that was expected
829
829
  def formatChoiceList(choices):
830
830
  choiceList = [c if c else "''" for c in choices]
@@ -1749,33 +1749,6 @@ def protectedSheetId(spreadsheet, sheetId):
1749
1749
  return True
1750
1750
  return False
1751
1751
 
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
1752
  def getString(item, checkBlank=False, optional=False, minLen=1, maxLen=None):
1780
1753
  if Cmd.ArgumentsRemaining():
1781
1754
  argstr = Cmd.Current()
@@ -5674,21 +5647,6 @@ def getContactsQuery(**kwargs):
5674
5647
  def getEmailAuditObject():
5675
5648
  return initGDataObject(gdata.apps.audit.service.AuditService(), API.EMAIL_AUDIT)
5676
5649
 
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
5650
  def getUserEmailFromID(uid, cd):
5693
5651
  try:
5694
5652
  result = callGAPI(cd.users(), 'get',
@@ -42266,776 +42224,26 @@ def doPrintVaultCounts():
42266
42224
  csvPF.WriteRow({'account': account, 'count': 0})
42267
42225
  csvPF.writeCSVfile('Vault Counts')
42268
42226
 
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
42227
  # 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
42228
  # 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
42229
  # 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
42230
  # gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
42828
42231
  # [withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
42829
42232
  # gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
42830
42233
  # [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
42234
  # gam [<UserTypeEntity>] create siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42960
42235
  # gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
42961
42236
  # gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
42962
42237
  # gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
42963
42238
  # gam [<UserTypeEntity>] show siteacls <SiteEntity>
42964
42239
  # 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
42240
  # gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*]
43033
42241
  # [startindex <Number>] [maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
43034
- def printUserSiteActivity(users):
43035
- _printSiteActivity(users, Ent.USER)
42242
+ def deprecatedUserSites(users):
42243
+ deprecatedCommandExit()
43036
42244
 
43037
- def doPrintDomainSiteActivity():
43038
- _printSiteActivity([GC.Values[GC.DOMAIN]], Ent.DOMAIN)
42245
+ def deprecatedDomainSites():
42246
+ deprecatedCommandExit()
43039
42247
 
43040
42248
  # <CSVFileInput> [keyfield <FieldName>] [datafield <FieldName>]
43041
42249
  def _getGroupOrgUnitMap():
@@ -75733,8 +74941,8 @@ MAIN_ADD_CREATE_FUNCTIONS = {
75733
74941
  Cmd.ARG_SAKEY: doCreateSvcAcctKeys,
75734
74942
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
75735
74943
  Cmd.ARG_SHAREDDRIVE: doCreateSharedDrive,
75736
- Cmd.ARG_SITE: doCreateDomainSite,
75737
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
74944
+ Cmd.ARG_SITE: deprecatedDomainSites,
74945
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75738
74946
  Cmd.ARG_SVCACCT: doCreateSvcAcct,
75739
74947
  Cmd.ARG_USER: doCreateUser,
75740
74948
  Cmd.ARG_VAULTEXPORT: doCreateVaultExport,
@@ -75848,7 +75056,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75848
75056
  Cmd.ARG_SAKEY: doDeleteSvcAcctKeys,
75849
75057
  Cmd.ARG_SCHEMA: doDeleteUserSchemas,
75850
75058
  Cmd.ARG_SHAREDDRIVE: doDeleteSharedDrive,
75851
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75059
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75852
75060
  Cmd.ARG_SVCACCT: doDeleteSvcAcct,
75853
75061
  Cmd.ARG_USER: doDeleteUser,
75854
75062
  Cmd.ARG_USERS: doDeleteUsers,
@@ -75937,8 +75145,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75937
75145
  Cmd.ARG_RESOURCES: doInfoResourceCalendars,
75938
75146
  Cmd.ARG_SCHEMA: doInfoUserSchemas,
75939
75147
  Cmd.ARG_SHAREDDRIVE: doInfoSharedDrive,
75940
- Cmd.ARG_SITE: doInfoDomainSites,
75941
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75148
+ Cmd.ARG_SITE: deprecatedDomainSites,
75149
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75942
75150
  Cmd.ARG_USER: doInfoUser,
75943
75151
  Cmd.ARG_USERS: doInfoUsers,
75944
75152
  Cmd.ARG_USERINVITATION: doInfoCIUserInvitations,
@@ -76040,9 +75248,9 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76040
75248
  Cmd.ARG_SCHEMA: doPrintShowUserSchemas,
76041
75249
  Cmd.ARG_SHAREDDRIVE: doPrintShowSharedDrives,
76042
75250
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76043
- Cmd.ARG_SITE: doPrintShowDomainSites,
76044
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
76045
- Cmd.ARG_SITEACTIVITY: doPrintDomainSiteActivity,
75251
+ Cmd.ARG_SITE: deprecatedDomainSites,
75252
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
75253
+ Cmd.ARG_SITEACTIVITY: deprecatedDomainSites,
76046
75254
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76047
75255
  Cmd.ARG_TOKEN: doPrintShowTokens,
76048
75256
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76158,8 +75366,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76158
75366
  Cmd.ARG_SHAREDDRIVEACLS: doPrintShowSharedDriveACLs,
76159
75367
  Cmd.ARG_SHAREDDRIVEINFO: doInfoSharedDrive,
76160
75368
  Cmd.ARG_SHAREDDRIVETHEMES: doShowSharedDriveThemes,
76161
- Cmd.ARG_SITE: doPrintShowDomainSites,
76162
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75369
+ Cmd.ARG_SITE: deprecatedDomainSites,
75370
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76163
75371
  Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
76164
75372
  Cmd.ARG_TOKEN: doPrintShowTokens,
76165
75373
  Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
@@ -76224,8 +75432,8 @@ MAIN_COMMANDS_WITH_OBJECTS = {
76224
75432
  Cmd.ARG_SAKEY: doUpdateSvcAcctKeys,
76225
75433
  Cmd.ARG_SCHEMA: doCreateUpdateUserSchemas,
76226
75434
  Cmd.ARG_SHAREDDRIVE: doUpdateSharedDrive,
76227
- Cmd.ARG_SITE: doUpdateDomainSites,
76228
- Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
75435
+ Cmd.ARG_SITE: deprecatedDomainSites,
75436
+ Cmd.ARG_SITEACL: deprecatedDomainSites,
76229
75437
  Cmd.ARG_SVCACCT: doCheckUpdateSvcAcct,
76230
75438
  Cmd.ARG_USER: doUpdateUser,
76231
75439
  Cmd.ARG_USERS: doUpdateUsers,
@@ -76764,8 +75972,8 @@ USER_ADD_CREATE_FUNCTIONS = {
76764
75972
  Cmd.ARG_SENDAS: createUpdateSendAs,
76765
75973
  Cmd.ARG_SHAREDDRIVE: createSharedDrive,
76766
75974
  Cmd.ARG_SHEET: createSheet,
76767
- Cmd.ARG_SITE: createUserSite,
76768
- Cmd.ARG_SITEACL: processUserSiteACLs,
75975
+ Cmd.ARG_SITE: deprecatedUserSites,
75976
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76769
75977
  Cmd.ARG_SMIME: createSmime,
76770
75978
  Cmd.ARG_TASK: processTasks,
76771
75979
  Cmd.ARG_TASKLIST: processTasklists,
@@ -76883,7 +76091,7 @@ USER_COMMANDS_WITH_OBJECTS = {
76883
76091
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76884
76092
  Cmd.ARG_SMIME: deleteSmime,
76885
76093
  Cmd.ARG_SHAREDDRIVE: deleteSharedDrive,
76886
- Cmd.ARG_SITEACL: processUserSiteACLs,
76094
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76887
76095
  Cmd.ARG_TASK: processTasks,
76888
76096
  Cmd.ARG_TASKLIST: processTasklists,
76889
76097
  Cmd.ARG_THREAD: processThreads,
@@ -76972,8 +76180,8 @@ USER_COMMANDS_WITH_OBJECTS = {
76972
76180
  Cmd.ARG_SENDAS: deleteInfoSendAs,
76973
76181
  Cmd.ARG_SHAREDDRIVE: infoSharedDrive,
76974
76182
  Cmd.ARG_SHEET: infoPrintShowSheets,
76975
- Cmd.ARG_SITE: infoUserSites,
76976
- Cmd.ARG_SITEACL: processUserSiteACLs,
76183
+ Cmd.ARG_SITE: deprecatedUserSites,
76184
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76977
76185
  Cmd.ARG_TASK: processTasks,
76978
76186
  Cmd.ARG_TASKLIST: processTasklists,
76979
76187
  Cmd.ARG_USER: infoUsers,
@@ -77085,9 +76293,9 @@ USER_COMMANDS_WITH_OBJECTS = {
77085
76293
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77086
76294
  Cmd.ARG_SIGNATURE: printShowSignature,
77087
76295
  Cmd.ARG_SMIME: printShowSmimes,
77088
- Cmd.ARG_SITE: printShowUserSites,
77089
- Cmd.ARG_SITEACL: processUserSiteACLs,
77090
- Cmd.ARG_SITEACTIVITY: printUserSiteActivity,
76296
+ Cmd.ARG_SITE: deprecatedUserSites,
76297
+ Cmd.ARG_SITEACL: deprecatedUserSites,
76298
+ Cmd.ARG_SITEACTIVITY: deprecatedUserSites,
77091
76299
  Cmd.ARG_TASK: printShowTasks,
77092
76300
  Cmd.ARG_TASKLIST: printShowTasklists,
77093
76301
  Cmd.ARG_THREAD: printShowThreads,
@@ -77191,8 +76399,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77191
76399
  Cmd.ARG_SHEET: infoPrintShowSheets,
77192
76400
  Cmd.ARG_SHEETRANGE: printShowSheetRanges,
77193
76401
  Cmd.ARG_SIGNATURE: printShowSignature,
77194
- Cmd.ARG_SITE: printShowUserSites,
77195
- Cmd.ARG_SITEACL: processUserSiteACLs,
76402
+ Cmd.ARG_SITE: deprecatedUserSites,
76403
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77196
76404
  Cmd.ARG_SMIME: printShowSmimes,
77197
76405
  Cmd.ARG_TASK: printShowTasks,
77198
76406
  Cmd.ARG_TASKLIST: printShowTasklists,
@@ -77295,8 +76503,8 @@ USER_COMMANDS_WITH_OBJECTS = {
77295
76503
  Cmd.ARG_SHEET: updateSheets,
77296
76504
  Cmd.ARG_SHEETRANGE: updateSheetRanges,
77297
76505
  Cmd.ARG_SMIME: updateSmime,
77298
- Cmd.ARG_SITE: updateUserSites,
77299
- Cmd.ARG_SITEACL: processUserSiteACLs,
76506
+ Cmd.ARG_SITE: deprecatedUserSites,
76507
+ Cmd.ARG_SITEACL: deprecatedUserSites,
77300
76508
  Cmd.ARG_TASK: processTasks,
77301
76509
  Cmd.ARG_TASKLIST: processTasklists,
77302
76510
  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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.3.9
3
+ Version: 7.4.0
4
4
  Summary: CLI tool to manage Google Workspace
5
5
  Project-URL: Homepage, https://github.com/GAM-team/GAM
6
6
  Project-URL: Issues, https://github.com/GAM-team/GAM/issues
@@ -1,4 +1,4 @@
1
- gam/__init__.py,sha256=XPvY7SEYLr2Eehx9ZaOv0gG_W8Zeq394eAzGA6Qs70M,3500602
1
+ gam/__init__.py,sha256=siFL0HiLrLvg1EOrtiIs1nFbyYzyAPlsilNd4CGMpXc,3470144
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=t8E0oM1negh5PydXDyzKoer-vjuCLGHcw7bh4NBs_dY,34499
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=nB366gRthM0fHQpWbWWuWRBCnKvlcfB5cejFZfx0Xdc,42094
28
- gam/gamlib/glentity.py,sha256=4DGlmRxugViY1K3zObva8ByL3yA9sccXxjAVQz-xIjg,33907
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=Evdd4lEXGFPaf7m0IOt_MJbQZ40Gauma5NlOyGO4M1I,33103
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.3.9.dist-info/METADATA,sha256=JWBdFrsHj2n57HCMqC8M5E8pt081CRd_8k-djkiDZZg,2888
70
- gam7-7.3.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
- gam7-7.3.9.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
72
- gam7-7.3.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
- gam7-7.3.9.dist-info/RECORD,,
69
+ gam7-7.4.0.dist-info/METADATA,sha256=OkqtLXKZQjbP8QM5bYvqx65hXnReESoLPIye8I64V4A,2888
70
+ gam7-7.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
+ gam7-7.4.0.dist-info/entry_points.txt,sha256=HVUM5J7dA8YwvJfG30jiLefR19ExMs387TWugWd9sf4,42
72
+ gam7-7.4.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
73
+ gam7-7.4.0.dist-info/RECORD,,
File without changes