gam7 7.6.14__tar.gz → 7.7.1__tar.gz

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.

Files changed (318) hide show
  1. {gam7-7.6.14 → gam7-7.7.1}/PKG-INFO +1 -1
  2. {gam7-7.6.14 → gam7-7.7.1}/src/GamCommands.txt +0 -13
  3. {gam7-7.6.14 → gam7-7.7.1}/src/GamUpdate.txt +23 -1
  4. {gam7-7.6.14 → gam7-7.7.1}/src/gam/__init__.py +161 -106
  5. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glclargs.py +0 -1
  6. {gam7-7.6.14 → gam7-7.7.1}/wiki/Administrators.md +27 -7
  7. gam7-7.6.14/wiki/Domain-SharedContacts-GAL.md → gam7-7.7.1/wiki/Domain-SharedContacts.md +1 -1
  8. {gam7-7.6.14 → gam7-7.7.1}/wiki/GamUpdates.md +30 -0
  9. {gam7-7.6.14 → gam7-7.7.1}/wiki/How-to-Upgrade-Legacy-GAM-to-GAM7.md +2 -2
  10. {gam7-7.6.14 → gam7-7.7.1}/wiki/Version-and-Help.md +7 -6
  11. {gam7-7.6.14 → gam7-7.7.1}/wiki/_Sidebar.md +1 -1
  12. {gam7-7.6.14 → gam7-7.7.1}/.github/ISSUE_TEMPLATE/aa-question.md +0 -0
  13. {gam7-7.6.14 → gam7-7.7.1}/.github/ISSUE_TEMPLATE/za-bug-report.md +0 -0
  14. {gam7-7.6.14 → gam7-7.7.1}/.github/ISSUE_TEMPLATE/zz-feature-request.md +0 -0
  15. {gam7-7.6.14 → gam7-7.7.1}/.github/ISSUE_TEMPLATE.txt +0 -0
  16. {gam7-7.6.14 → gam7-7.7.1}/.github/actions/decrypt.sh +0 -0
  17. {gam7-7.6.14 → gam7-7.7.1}/.github/actions/entitlements.plist +0 -0
  18. {gam7-7.6.14 → gam7-7.7.1}/.github/actions/package_exclusions.txt +0 -0
  19. {gam7-7.6.14 → gam7-7.7.1}/.github/stale.yml +0 -0
  20. {gam7-7.6.14 → gam7-7.7.1}/.github/workflows/build.yml +0 -0
  21. {gam7-7.6.14 → gam7-7.7.1}/.github/workflows/codeql-analysis.yml +0 -0
  22. {gam7-7.6.14 → gam7-7.7.1}/.github/workflows/get-cacerts.yml +0 -0
  23. {gam7-7.6.14 → gam7-7.7.1}/.github/workflows/pushwiki.yml +0 -0
  24. {gam7-7.6.14 → gam7-7.7.1}/.github/workflows/pypi.yml +0 -0
  25. {gam7-7.6.14 → gam7-7.7.1}/.pre-commit-config.yaml +0 -0
  26. {gam7-7.6.14 → gam7-7.7.1}/LICENSE +0 -0
  27. {gam7-7.6.14 → gam7-7.7.1}/README.md +0 -0
  28. {gam7-7.6.14 → gam7-7.7.1}/pyproject.toml +0 -0
  29. {gam7-7.6.14 → gam7-7.7.1}/src/.gitignore +0 -0
  30. {gam7-7.6.14 → gam7-7.7.1}/src/LICENSE +0 -0
  31. {gam7-7.6.14 → gam7-7.7.1}/src/cacerts.pem +0 -0
  32. {gam7-7.6.14 → gam7-7.7.1}/src/callgam.py +0 -0
  33. {gam7-7.6.14 → gam7-7.7.1}/src/gam/__main__.py +0 -0
  34. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/__init__.py +0 -0
  35. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/auth.py +0 -0
  36. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/client.py +0 -0
  37. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/core.py +0 -0
  38. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/data.py +0 -0
  39. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/http.py +0 -0
  40. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/http_core.py +0 -0
  41. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/http_interface.py +0 -0
  42. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/mock_http.py +0 -0
  43. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/mock_http_core.py +0 -0
  44. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/mock_service.py +0 -0
  45. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/service.py +0 -0
  46. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/token_store.py +0 -0
  47. {gam7-7.6.14 → gam7-7.7.1}/src/gam/atom/url.py +0 -0
  48. {gam7-7.6.14 → gam7-7.7.1}/src/gam/cacerts.pem +0 -0
  49. {gam7-7.6.14 → gam7-7.7.1}/src/gam/cbcm-v1.1beta1.json +0 -0
  50. {gam7-7.6.14 → gam7-7.7.1}/src/gam/contactdelegation-v1.json +0 -0
  51. {gam7-7.6.14 → gam7-7.7.1}/src/gam/datastudio-v1.json +0 -0
  52. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/__init__.py +0 -0
  53. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glaction.py +0 -0
  54. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glapi.py +0 -0
  55. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glcfg.py +0 -0
  56. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glentity.py +0 -0
  57. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glgapi.py +0 -0
  58. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glgdata.py +0 -0
  59. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glglobals.py +0 -0
  60. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glindent.py +0 -0
  61. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glmsgs.py +0 -0
  62. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glskus.py +0 -0
  63. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/gluprop.py +0 -0
  64. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/glverlibs.py +0 -0
  65. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gamlib/yubikey.py +0 -0
  66. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/__init__.py +0 -0
  67. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/alt/__init__.py +0 -0
  68. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/alt/app_engine.py +0 -0
  69. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/alt/appengine.py +0 -0
  70. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/__init__.py +0 -0
  71. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/audit/__init__.py +0 -0
  72. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/audit/service.py +0 -0
  73. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/contacts/__init__.py +0 -0
  74. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/contacts/service.py +0 -0
  75. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/apps/service.py +0 -0
  76. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/service.py +0 -0
  77. {gam7-7.6.14 → gam7-7.7.1}/src/gam/gdata/urlfetch.py +0 -0
  78. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/__init__.py +0 -0
  79. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/_auth.py +0 -0
  80. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/_helpers.py +0 -0
  81. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/channel.py +0 -0
  82. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/discovery.py +0 -0
  83. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/discovery_cache/__init__.py +0 -0
  84. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/discovery_cache/appengine_memcache.py +0 -0
  85. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/discovery_cache/base.py +0 -0
  86. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/discovery_cache/file_cache.py +0 -0
  87. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/errors.py +0 -0
  88. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/http.py +0 -0
  89. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/mimeparse.py +0 -0
  90. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/model.py +0 -0
  91. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/schema.py +0 -0
  92. {gam7-7.6.14 → gam7-7.7.1}/src/gam/googleapiclient/version.py +0 -0
  93. {gam7-7.6.14 → gam7-7.7.1}/src/gam/iso8601/__init__.py +0 -0
  94. {gam7-7.6.14 → gam7-7.7.1}/src/gam/iso8601/iso8601.py +0 -0
  95. {gam7-7.6.14 → gam7-7.7.1}/src/gam/meet-v2beta.json +0 -0
  96. {gam7-7.6.14 → gam7-7.7.1}/src/gam/serviceaccountlookup-v1.json +0 -0
  97. {gam7-7.6.14 → gam7-7.7.1}/src/gam/six.py +0 -0
  98. {gam7-7.6.14 → gam7-7.7.1}/src/gam-install.sh +0 -0
  99. {gam7-7.6.14 → gam7-7.7.1}/src/gam-setup.bat +0 -0
  100. {gam7-7.6.14 → gam7-7.7.1}/src/gam.exe.manifest +0 -0
  101. {gam7-7.6.14 → gam7-7.7.1}/src/gam.py +0 -0
  102. {gam7-7.6.14 → gam7-7.7.1}/src/gam.spec +0 -0
  103. {gam7-7.6.14 → gam7-7.7.1}/src/gam.wxs +0 -0
  104. {gam7-7.6.14 → gam7-7.7.1}/src/license.rtf +0 -0
  105. {gam7-7.6.14 → gam7-7.7.1}/src/requirements-dev.txt +0 -0
  106. {gam7-7.6.14 → gam7-7.7.1}/src/requirements.txt +0 -0
  107. {gam7-7.6.14 → gam7-7.7.1}/src/setup.cfg +0 -0
  108. {gam7-7.6.14 → gam7-7.7.1}/src/setup.py +0 -0
  109. {gam7-7.6.14 → gam7-7.7.1}/src/tools/a_atleast_b.py +0 -0
  110. {gam7-7.6.14 → gam7-7.7.1}/src/tools/gen-wix-xml-filelist.py +0 -0
  111. {gam7-7.6.14 → gam7-7.7.1}/src/tools/mkGamRef.py +0 -0
  112. {gam7-7.6.14 → gam7-7.7.1}/src/tools/openssl.props +0 -0
  113. {gam7-7.6.14 → gam7-7.7.1}/src/version_info.txt.in +0 -0
  114. {gam7-7.6.14 → gam7-7.7.1}/wiki/00scratch.md +0 -0
  115. {gam7-7.6.14 → gam7-7.7.1}/wiki/Addresses.md +0 -0
  116. {gam7-7.6.14 → gam7-7.7.1}/wiki/Alert-Center.md +0 -0
  117. {gam7-7.6.14 → gam7-7.7.1}/wiki/Aliases.md +0 -0
  118. {gam7-7.6.14 → gam7-7.7.1}/wiki/Authorization.md +0 -0
  119. {gam7-7.6.14 → gam7-7.7.1}/wiki/BNF-Syntax.md +0 -0
  120. {gam7-7.6.14 → gam7-7.7.1}/wiki/Basic-Items.md +0 -0
  121. {gam7-7.6.14 → gam7-7.7.1}/wiki/Bulk-Processing.md +0 -0
  122. {gam7-7.6.14 → gam7-7.7.1}/wiki/CSV-Input-Filtering.md +0 -0
  123. {gam7-7.6.14 → gam7-7.7.1}/wiki/CSV-Output-Filtering.md +0 -0
  124. {gam7-7.6.14 → gam7-7.7.1}/wiki/CSV-Special-Characters.md +0 -0
  125. {gam7-7.6.14 → gam7-7.7.1}/wiki/Calendars-Access.md +0 -0
  126. {gam7-7.6.14 → gam7-7.7.1}/wiki/Calendars-Events.md +0 -0
  127. {gam7-7.6.14 → gam7-7.7.1}/wiki/Calendars.md +0 -0
  128. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chat-Bot.md +0 -0
  129. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-AUE-Counts.md +0 -0
  130. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Browser-Cloud-Management.md +0 -0
  131. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Installed-Apps.md +0 -0
  132. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Needs-Attention-Counts.md +0 -0
  133. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Policies.md +0 -0
  134. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Printers.md +0 -0
  135. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Profile-Management.md +0 -0
  136. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Version-Counts.md +0 -0
  137. {gam7-7.6.14 → gam7-7.7.1}/wiki/Chrome-Version-History.md +0 -0
  138. {gam7-7.6.14 → gam7-7.7.1}/wiki/ChromeOS-Devices.md +0 -0
  139. {gam7-7.6.14 → gam7-7.7.1}/wiki/Classroom-Courses.md +0 -0
  140. {gam7-7.6.14 → gam7-7.7.1}/wiki/Classroom-Guardians.md +0 -0
  141. {gam7-7.6.14 → gam7-7.7.1}/wiki/Classroom-Invitations.md +0 -0
  142. {gam7-7.6.14 → gam7-7.7.1}/wiki/Classroom-Membership.md +0 -0
  143. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Channel.md +0 -0
  144. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Identity-Devices.md +0 -0
  145. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Identity-Groups-Membership.md +0 -0
  146. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Identity-Groups.md +0 -0
  147. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Identity-Policies.md +0 -0
  148. {gam7-7.6.14 → gam7-7.7.1}/wiki/Cloud-Storage.md +0 -0
  149. {gam7-7.6.14 → gam7-7.7.1}/wiki/Collections-of-ChromeOS-Devices.md +0 -0
  150. {gam7-7.6.14 → gam7-7.7.1}/wiki/Collections-of-Items.md +0 -0
  151. {gam7-7.6.14 → gam7-7.7.1}/wiki/Collections-of-Users.md +0 -0
  152. {gam7-7.6.14 → gam7-7.7.1}/wiki/Command-Data-From-Google-Docs-Sheets-Storage.md +0 -0
  153. {gam7-7.6.14 → gam7-7.7.1}/wiki/Command-Line-Parsing.md +0 -0
  154. {gam7-7.6.14 → gam7-7.7.1}/wiki/Command-Logging-Progress.md +0 -0
  155. {gam7-7.6.14 → gam7-7.7.1}/wiki/Context-Aware-Access-Levels.md +0 -0
  156. {gam7-7.6.14 → gam7-7.7.1}/wiki/Customer.md +0 -0
  157. {gam7-7.6.14 → gam7-7.7.1}/wiki/Domain-People-Contacts-Profiles.md +0 -0
  158. {gam7-7.6.14 → gam7-7.7.1}/wiki/Domains-Verification.md +0 -0
  159. {gam7-7.6.14 → gam7-7.7.1}/wiki/Domains.md +0 -0
  160. {gam7-7.6.14 → gam7-7.7.1}/wiki/Downloads-Installs.md +0 -0
  161. {gam7-7.6.14 → gam7-7.7.1}/wiki/Drive-File-Selection.md +0 -0
  162. {gam7-7.6.14 → gam7-7.7.1}/wiki/Drive-Items.md +0 -0
  163. {gam7-7.6.14 → gam7-7.7.1}/wiki/Drive-REST-API-v3.md +0 -0
  164. {gam7-7.6.14 → gam7-7.7.1}/wiki/Email-Audit-Monitor.md +0 -0
  165. {gam7-7.6.14 → gam7-7.7.1}/wiki/Find-File-Owner.md +0 -0
  166. {gam7-7.6.14 → gam7-7.7.1}/wiki/GAM-Public-Chat-Room.md +0 -0
  167. {gam7-7.6.14 → gam7-7.7.1}/wiki/GAM-Return-Codes.md +0 -0
  168. {gam7-7.6.14 → gam7-7.7.1}/wiki/GAM-with-minimal-GCP-rights.md +0 -0
  169. {gam7-7.6.14 → gam7-7.7.1}/wiki/GAM7-on-Android-Devices.md +0 -0
  170. {gam7-7.6.14 → gam7-7.7.1}/wiki/GAM7-on-Chrome-OS-Devices.md +0 -0
  171. {gam7-7.6.14 → gam7-7.7.1}/wiki/Google-Data-Transfers.md +0 -0
  172. {gam7-7.6.14 → gam7-7.7.1}/wiki/Google-Network-Addresses.md +0 -0
  173. {gam7-7.6.14 → gam7-7.7.1}/wiki/Groups-Membership.md +0 -0
  174. {gam7-7.6.14 → gam7-7.7.1}/wiki/Groups.md +0 -0
  175. {gam7-7.6.14 → gam7-7.7.1}/wiki/HTTPS-Proxy.md +0 -0
  176. {gam7-7.6.14 → gam7-7.7.1}/wiki/Home.md +0 -0
  177. {gam7-7.6.14 → gam7-7.7.1}/wiki/How-to-Install-GAM7.md +0 -0
  178. {gam7-7.6.14 → gam7-7.7.1}/wiki/How-to-Uninstall-GAM7.md +0 -0
  179. {gam7-7.6.14 → gam7-7.7.1}/wiki/How-to-Update-GAM7.md +0 -0
  180. {gam7-7.6.14 → gam7-7.7.1}/wiki/How-to-Upgrade-GAMADV-XTD3-to-GAM7.md +0 -0
  181. {gam7-7.6.14 → gam7-7.7.1}/wiki/Inbound-SSO.md +0 -0
  182. {gam7-7.6.14 → gam7-7.7.1}/wiki/Install-GAM-as-Python-Library.md +0 -0
  183. {gam7-7.6.14 → gam7-7.7.1}/wiki/Licenses.md +0 -0
  184. {gam7-7.6.14 → gam7-7.7.1}/wiki/List-Items.md +0 -0
  185. {gam7-7.6.14 → gam7-7.7.1}/wiki/List.md +0 -0
  186. {gam7-7.6.14 → gam7-7.7.1}/wiki/Meta-Commands-and-File-Redirection.md +0 -0
  187. {gam7-7.6.14 → gam7-7.7.1}/wiki/Mobile-Devices.md +0 -0
  188. {gam7-7.6.14 → gam7-7.7.1}/wiki/Organizational-Units.md +0 -0
  189. {gam7-7.6.14 → gam7-7.7.1}/wiki/Other-Resources.md +0 -0
  190. {gam7-7.6.14 → gam7-7.7.1}/wiki/Permission-Matches.md +0 -0
  191. {gam7-7.6.14 → gam7-7.7.1}/wiki/Python-Regular-Expressions.md +0 -0
  192. {gam7-7.6.14 → gam7-7.7.1}/wiki/README.md +0 -0
  193. {gam7-7.6.14 → gam7-7.7.1}/wiki/Rclone.md +0 -0
  194. {gam7-7.6.14 → gam7-7.7.1}/wiki/Reports.md +0 -0
  195. {gam7-7.6.14 → gam7-7.7.1}/wiki/Reseller.md +0 -0
  196. {gam7-7.6.14 → gam7-7.7.1}/wiki/Resources.md +0 -0
  197. {gam7-7.6.14 → gam7-7.7.1}/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine.md +0 -0
  198. {gam7-7.6.14 → gam7-7.7.1}/wiki/SSL-Root-CA-Certificates.md +0 -0
  199. {gam7-7.6.14 → gam7-7.7.1}/wiki/Schemas.md +0 -0
  200. {gam7-7.6.14 → gam7-7.7.1}/wiki/Scripts.md +0 -0
  201. {gam7-7.6.14 → gam7-7.7.1}/wiki/Send-Email.md +0 -0
  202. {gam7-7.6.14 → gam7-7.7.1}/wiki/Shared-Drives.md +0 -0
  203. {gam7-7.6.14 → gam7-7.7.1}/wiki/Sites.md +0 -0
  204. {gam7-7.6.14 → gam7-7.7.1}/wiki/Tag-Replace.md +0 -0
  205. {gam7-7.6.14 → gam7-7.7.1}/wiki/Todrive.md +0 -0
  206. {gam7-7.6.14 → gam7-7.7.1}/wiki/Unmanaged-Accounts.md +0 -0
  207. {gam7-7.6.14 → gam7-7.7.1}/wiki/Upgrade-Benefits.md +0 -0
  208. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Analytics-Admin.md +0 -0
  209. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Application-Specific-Passwords.md +0 -0
  210. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Backup-Verification-Codes.md +0 -0
  211. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Calendars-Access.md +0 -0
  212. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Calendars-Events.md +0 -0
  213. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Calendars.md +0 -0
  214. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Chat.md +0 -0
  215. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Classification-Labels.md +0 -0
  216. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Classroom-Profile.md +0 -0
  217. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Contacts-Delegates.md +0 -0
  218. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Contacts.md +0 -0
  219. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Deprovision.md +0 -0
  220. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Activity-Settings.md +0 -0
  221. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Cleanup.md +0 -0
  222. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Comments.md +0 -0
  223. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Copy-Move.md +0 -0
  224. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Files-Display.md +0 -0
  225. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Files-Manage.md +0 -0
  226. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Orphans.md +0 -0
  227. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Ownership.md +0 -0
  228. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Permissions.md +0 -0
  229. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Query.md +0 -0
  230. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Revisions.md +0 -0
  231. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Shortcuts.md +0 -0
  232. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Drive-Transfer.md +0 -0
  233. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Forms.md +0 -0
  234. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-CSE.md +0 -0
  235. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Delegates.md +0 -0
  236. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Filters.md +0 -0
  237. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Forwarding.md +0 -0
  238. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Labels.md +0 -0
  239. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Messages-Threads.md +0 -0
  240. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Profile.md +0 -0
  241. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-S-MIME.md +0 -0
  242. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Send-As-Signature-Vacation.md +0 -0
  243. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Gmail-Settings.md +0 -0
  244. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Group-Membership.md +0 -0
  245. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Keep-Notes.md +0 -0
  246. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Looker-Studio.md +0 -0
  247. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Meet.md +0 -0
  248. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-People-Contacts-Profiles.md +0 -0
  249. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Photo.md +0 -0
  250. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Profile-Photo.md +0 -0
  251. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Profile-Sharing.md +0 -0
  252. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Shared-Drives.md +0 -0
  253. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Signout-Turnoff2SV.md +0 -0
  254. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Spreadsheets.md +0 -0
  255. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Tasks.md +0 -0
  256. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-Tokens.md +0 -0
  257. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users-YouTube.md +0 -0
  258. {gam7-7.6.14 → gam7-7.7.1}/wiki/Users.md +0 -0
  259. {gam7-7.6.14 → gam7-7.7.1}/wiki/Using-GAM7-with-a-YubiKey.md +0 -0
  260. {gam7-7.6.14 → gam7-7.7.1}/wiki/Using-GAM7-with-a-delegated-admin-service-account.md +0 -0
  261. {gam7-7.6.14 → gam7-7.7.1}/wiki/Vault-Takeout.md +0 -0
  262. {gam7-7.6.14 → gam7-7.7.1}/wiki/Verifying-a-GAM7-Build-is-Legitimate-and-Official.md +0 -0
  263. {gam7-7.6.14 → gam7-7.7.1}/wiki/gam.cfg.md +0 -0
  264. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-AdminSettingsExamples.md +0 -0
  265. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Android-Installation.md +0 -0
  266. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-BulkOperations.md +0 -0
  267. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-CalendarExamples.md +0 -0
  268. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Chat-Bot.md +0 -0
  269. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Chrome-Browser-Management.md +0 -0
  270. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Chrome-OS-Installation.md +0 -0
  271. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Chrome-Policy-Settings.md +0 -0
  272. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Cloud-Identity-Groups.md +0 -0
  273. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Calendar-Resources.md +0 -0
  274. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Calendars.md +0 -0
  275. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Definitions.md +0 -0
  276. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Drive.md +0 -0
  277. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Email.md +0 -0
  278. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Group-Attributes.md +0 -0
  279. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Groups.md +0 -0
  280. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Command-Reference-Users.md +0 -0
  281. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Context-Aware-Access-Levels.md +0 -0
  282. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Creating-client_secrets.json-and-oauth2service.json.md +0 -0
  283. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-CreatingClientSecretsFile.md +0 -0
  284. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Custom-Schemas.md +0 -0
  285. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Data-Transfers.md +0 -0
  286. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-DomainVerification.md +0 -0
  287. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-ExamplesAccountAuditing.md +0 -0
  288. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-ExamplesCSV.md +0 -0
  289. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-ExamplesEmailSettings.md +0 -0
  290. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-ExamplesOrganizations.md +0 -0
  291. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM-Discussion-Group.md +0 -0
  292. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM-on-Android-and-Chrome-OS.md +0 -0
  293. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM-options-files.md +0 -0
  294. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM-with--minimal-GCP-rights.md +0 -0
  295. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM3CSVListings.md +0 -0
  296. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM3DirectoryCommands.md +0 -0
  297. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM3GroupSettings.md +0 -0
  298. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GAM7-FAQ.md +0 -0
  299. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Google-Vault---Takeout-Commands.md +0 -0
  300. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-GoogleDriveManagement.md +0 -0
  301. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Grouping-18-or-Older-Users.md +0 -0
  302. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Home.md +0 -0
  303. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-How-to-upgrade-from-Standard-GAM.md +0 -0
  304. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Inbound-SSO-Settings.md +0 -0
  305. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-LicenseExamples.md +0 -0
  306. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Managing-Admins.md +0 -0
  307. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Managing-CloudPrint-Printers.md +0 -0
  308. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Managing-Devices.md +0 -0
  309. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Managing-Google-Classroom.md +0 -0
  310. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-OAuthKeyManagement.md +0 -0
  311. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Printers.md +0 -0
  312. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-ResellerCommands.md +0 -0
  313. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely.md +0 -0
  314. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-SecurityExamples.md +0 -0
  315. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-UnmanagedUsersExamples.md +0 -0
  316. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Use-a-Yubikey.md +0 -0
  317. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-Using-GAM-with-a-delegated-admin-service-account-(DASA).md +0 -0
  318. {gam7-7.6.14 → gam7-7.7.1}/wiki/l-_Footer.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gam7
3
- Version: 7.6.14
3
+ Version: 7.7.1
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
@@ -3545,19 +3545,6 @@ gam print contacts [todrive <ToDriveAttribute>*] <ContactSelection>
3545
3545
  [fields <ContactFieldNameList>]
3546
3546
  [formatjson [quotechar <Character>]]
3547
3547
 
3548
- vgam info gal <ContactEntity>
3549
- [basic|full]
3550
- [fields <ContactFieldNameList>]
3551
- [formatjson]
3552
- gam show gal <ContactSelection>
3553
- [basic|full] [orderby <ContactOrderByFieldName> [ascending|descending]]
3554
- [fields <ContactFieldNameList>]
3555
- [formatjson]
3556
- gam print gal [todrive <ToDriveAttribute>*] <ContactSelection>
3557
- [basic|full] [orderby <ContactOrderByFieldName> [ascending|descending]]
3558
- [fields <ContactFieldNameList>]
3559
- [formatjson [quotechar <Character>]]
3560
-
3561
3548
  # Domain - People Contacts and Profiles
3562
3549
 
3563
3550
  <PeopleSourceName> ::=
@@ -1,9 +1,31 @@
1
+ 7.07.01
2
+
3
+ Fixed bug in `gam print|show chromepolicies` that caused a trap. Made additional
4
+ updates to handle changes in the Chrome Policy API.
5
+
6
+ 7.07.00
7
+
8
+ As of mid-October 2024, Google deprecated the API that retrieved the Global Address List.
9
+
10
+ The following commands have been eliminated.
11
+ ```
12
+ gam info gal
13
+ gam print gal
14
+ gam show gal
15
+ ```
16
+
17
+ These commands are a work-around for `gam print gal`.
18
+ ```
19
+ gam config csv_output_row_filter "includeInGlobalAddressList:boolean:true" redirect csv ./UserGAL.csv print users fields name,gal
20
+ gam config csv_output_row_filter "includeInGlobalAddressList:boolean:true" batch_size 25 redirect csv ./GroupGAL.csv print groups fields name,gal
21
+ ```
22
+
1
23
  7.06.14
2
24
 
3
25
  Updated `gam create|update adminrole` to allow specifying a collection of privileges
4
26
  with `privileges select <FileSelector>|<CSVFileSelector>` which makes copying roles much simpler.
5
27
 
6
- Updated option `role <RoleItem>` to `gam print|show adminroles` to allow display of information
28
+ Added option `role <RoleItem>` to `gam print|show adminroles` to allow display of information
7
29
  for a specific role.
8
30
 
9
31
  7.06.13
@@ -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.06.14'
28
+ __version__ = '7.07.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
@@ -5655,8 +5655,8 @@ def getGDataUserCredentials(api, user, i, count):
5655
5655
  handleOAuthTokenError(e, True, True, i, count)
5656
5656
  return (userEmail, None)
5657
5657
 
5658
- def getContactsObject(contactFeed):
5659
- contactsObject = initGDataObject(gdata.apps.contacts.service.ContactsService(contactFeed=contactFeed),
5658
+ def getContactsObject():
5659
+ contactsObject = initGDataObject(gdata.apps.contacts.service.ContactsService(contactFeed=True),
5660
5660
  API.CONTACTS)
5661
5661
  return (GC.Values[GC.DOMAIN], contactsObject)
5662
5662
 
@@ -19996,7 +19996,9 @@ def dedupEmailAddressMatches(contactsManager, emailMatchType, fields):
19996
19996
  fields[CONTACT_EMAILS] = savedAddresses
19997
19997
  return updateRequired
19998
19998
 
19999
- def _createContact():
19999
+ # gam create contact <ContactAttribute>+
20000
+ # [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*))| returnidonly]
20001
+ def doCreateDomainContact():
20000
20002
  entityType = Ent.DOMAIN
20001
20003
  contactsManager = ContactsManager()
20002
20004
  parameters = {'csvPF': None, 'titles': ['Domain', CONTACT_ID], 'addCSVData': {}, 'returnIdOnly': False}
@@ -20007,7 +20009,7 @@ def _createContact():
20007
20009
  csvPF.AddTitles(sorted(addCSVData.keys()))
20008
20010
  returnIdOnly = parameters['returnIdOnly']
20009
20011
  contactEntry = contactsManager.FieldsToContact(fields)
20010
- user, contactsObject = getContactsObject(True)
20012
+ user, contactsObject = getContactsObject()
20011
20013
  try:
20012
20014
  contact = callGData(contactsObject, 'CreateContact',
20013
20015
  throwErrors=[GDATA.BAD_REQUEST, GDATA.SERVICE_NOT_APPLICABLE, GDATA.FORBIDDEN],
@@ -20032,11 +20034,6 @@ def _createContact():
20032
20034
  if csvPF:
20033
20035
  csvPF.writeCSVfile('Contacts')
20034
20036
 
20035
- # gam create contact <ContactAttribute>+
20036
- # [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*))| returnidonly]
20037
- def doCreateDomainContact():
20038
- _createContact()
20039
-
20040
20037
  def _clearUpdateContacts(updateContacts):
20041
20038
  entityType = Ent.DOMAIN
20042
20039
  contactsManager = ContactsManager()
@@ -20058,7 +20055,7 @@ def _clearUpdateContacts(updateContacts):
20058
20055
  unknownArgumentExit()
20059
20056
  if not contactClear['emailClearPattern']:
20060
20057
  missingArgumentExit('emailclearpattern')
20061
- user, contactsObject = getContactsObject(True)
20058
+ user, contactsObject = getContactsObject()
20062
20059
  if queriedContacts:
20063
20060
  entityList = queryContacts(contactsObject, contactQuery)
20064
20061
  if entityList is None:
@@ -20129,7 +20126,8 @@ def doClearDomainContacts():
20129
20126
  def doUpdateDomainContacts():
20130
20127
  _clearUpdateContacts(True)
20131
20128
 
20132
- def _dedupContacts():
20129
+ # gam dedup contacts <ContactEntity>|<ContactSelection> [matchType [<Boolean>]]
20130
+ def doDedupDomainContacts():
20133
20131
  entityType = Ent.DOMAIN
20134
20132
  contactsManager = ContactsManager()
20135
20133
  contactQuery = _initContactQueryAttributes()
@@ -20140,7 +20138,7 @@ def _dedupContacts():
20140
20138
  emailMatchType = getBoolean()
20141
20139
  else:
20142
20140
  _getContactQueryAttributes(contactQuery, myarg, -1, False)
20143
- user, contactsObject = getContactsObject(True)
20141
+ user, contactsObject = getContactsObject()
20144
20142
  contacts = queryContacts(contactsObject, contactQuery)
20145
20143
  if contacts is None:
20146
20144
  return
@@ -20180,15 +20178,12 @@ def _dedupContacts():
20180
20178
  break
20181
20179
  Ind.Decrement()
20182
20180
 
20183
- # gam dedup contacts <ContactEntity>|<ContactSelection> [matchType [<Boolean>]]
20184
- def doDedupDomainContacts():
20185
- _dedupContacts()
20186
-
20187
- def _deleteContacts():
20181
+ # gam delete contacts <ContactEntity>|<ContactSelection>
20182
+ def doDeleteDomainContacts():
20188
20183
  entityType = Ent.DOMAIN
20189
20184
  contactsManager = ContactsManager()
20190
20185
  entityList, contactQuery, queriedContacts = _getContactEntityList(-1, False)
20191
- user, contactsObject = getContactsObject(True)
20186
+ user, contactsObject = getContactsObject()
20192
20187
  if queriedContacts:
20193
20188
  entityList = queryContacts(contactsObject, contactQuery)
20194
20189
  if entityList is None:
@@ -20228,10 +20223,6 @@ def _deleteContacts():
20228
20223
  break
20229
20224
  Ind.Decrement()
20230
20225
 
20231
- # gam delete contacts <ContactEntity>|<ContactSelection>
20232
- def doDeleteDomainContacts():
20233
- _deleteContacts()
20234
-
20235
20226
  CONTACT_TIME_OBJECTS = {CONTACT_UPDATED}
20236
20227
  CONTACT_FIELDS_WITH_CRS_NLS = {CONTACT_NOTES, CONTACT_BILLING_INFORMATION}
20237
20228
 
@@ -20299,7 +20290,10 @@ def _getContactFieldsList(contactsManager, displayFieldsList):
20299
20290
  else:
20300
20291
  invalidChoiceExit(field, contactsManager.CONTACT_ARGUMENT_TO_PROPERTY_MAP, True)
20301
20292
 
20302
- def _infoContacts(contactFeed):
20293
+ # gam info contacts <ContactEntity>
20294
+ # [basic|full]
20295
+ # [fields <ContactFieldNameList>] [formatjson]
20296
+ def doInfoDomainContacts():
20303
20297
  entityType = Ent.DOMAIN
20304
20298
  contactsManager = ContactsManager()
20305
20299
  entityList = getEntityList(Cmd.OB_CONTACT_ENTITY)
@@ -20314,7 +20308,7 @@ def _infoContacts(contactFeed):
20314
20308
  _getContactFieldsList(contactsManager, displayFieldsList)
20315
20309
  else:
20316
20310
  FJQC.GetFormatJSON(myarg)
20317
- user, contactsObject = getContactsObject(contactFeed)
20311
+ user, contactsObject = getContactsObject()
20318
20312
  j = 0
20319
20313
  jcount = len(entityList)
20320
20314
  if not FJQC.formatJSON:
@@ -20342,19 +20336,13 @@ def _infoContacts(contactFeed):
20342
20336
  break
20343
20337
  Ind.Decrement()
20344
20338
 
20345
- # gam info contacts <ContactEntity>
20346
- # [basic|full]
20347
- # [fields <ContactFieldNameList>] [formatjson]
20348
- def doInfoDomainContacts():
20349
- _infoContacts(True)
20350
-
20351
- # gam info gal <ContactEntity>
20352
- # [basic|full]
20339
+ # gam print contacts [todrive <ToDriveAttribute>*] <ContactSelection>
20340
+ # [basic|full|countsonly] [showdeleted] [orderby <ContactOrderByFieldName> [ascending|descending]]
20341
+ # [fields <ContactFieldNameList>] [formatjson [quotechar <Character>]]
20342
+ # gam show contacts <ContactSelection>
20343
+ # [basic|full|countsonly] [showdeleted] [orderby <ContactOrderByFieldName> [ascending|descending]]
20353
20344
  # [fields <ContactFieldNameList>] [formatjson]
20354
- def doInfoGAL():
20355
- _infoContacts(False)
20356
-
20357
- def _printShowContacts(contactFeed):
20345
+ def doPrintShowDomainContacts():
20358
20346
  entityType = Ent.DOMAIN
20359
20347
  entityTypeName = Ent.Singular(entityType)
20360
20348
  contactsManager = ContactsManager()
@@ -20380,7 +20368,7 @@ def _printShowContacts(contactFeed):
20380
20368
  pass
20381
20369
  else:
20382
20370
  FJQC.GetFormatJSONQuoteChar(myarg, True)
20383
- user, contactsObject = getContactsObject(contactFeed)
20371
+ user, contactsObject = getContactsObject()
20384
20372
  contacts = queryContacts(contactsObject, contactQuery)
20385
20373
  if countsOnly:
20386
20374
  jcount = countLocalContactSelects(contactsManager, contacts, contactQuery)
@@ -20466,24 +20454,6 @@ def _printShowContacts(contactFeed):
20466
20454
  if csvPF:
20467
20455
  csvPF.writeCSVfile(CSVTitle)
20468
20456
 
20469
- # gam print contacts [todrive <ToDriveAttribute>*] <ContactSelection>
20470
- # [basic|full|countsonly] [showdeleted] [orderby <ContactOrderByFieldName> [ascending|descending]]
20471
- # [fields <ContactFieldNameList>] [formatjson [quotechar <Character>]]
20472
- # gam show contacts <ContactSelection>
20473
- # [basic|full|countsonly] [showdeleted] [orderby <ContactOrderByFieldName> [ascending|descending]]
20474
- # [fields <ContactFieldNameList>] [formatjson]
20475
- def doPrintShowDomainContacts():
20476
- _printShowContacts(True)
20477
-
20478
- # gam print gal [todrive <ToDriveAttribute>*] <ContactSelection>
20479
- # [basic|full] [orderby <ContactOrderByFieldName> [ascending|descending]]
20480
- # [fields <ContactFieldNameList>] [formatjson [quotechar <Character>]]
20481
- # gam show gal <ContactSelection>
20482
- # [basic|full|countsonly] [orderby <ContactOrderByFieldName> [ascending|descending]]
20483
- # [fields <ContactFieldNameList>] [formatjson]
20484
- def doPrintShowGAL():
20485
- _printShowContacts(False)
20486
-
20487
20457
  # Prople commands utilities
20488
20458
  #
20489
20459
  def normalizePeopleResourceName(resourceName):
@@ -28213,75 +28183,171 @@ def doDeleteChromePolicy():
28213
28183
  except (GAPI.notFound, GAPI.permissionDenied, GAPI.invalidArgument, GAPI.serviceNotAvailable, GAPI.quotaExceeded) as e:
28214
28184
  entityActionFailedWarning(kvList, str(e))
28215
28185
 
28216
- CHROME_SCHEMA_TYPE_MESSAGE = {
28217
- 'chrome.users.AutoUpdateCheckPeriodNew':
28218
- {'autoupdatecheckperiodminutesnew':
28219
- {'casedField': 'autoUpdateCheckPeriodMinutesNew',
28220
- 'type': 'duration', 'minVal': 1, 'maxVal': 720, 'scale': 60}},
28186
+ CHROME_SCHEMA_SPECIAL_CASES = {
28221
28187
  'chrome.users.AutoUpdateCheckPeriodNewV2':
28222
28188
  {'autoupdatecheckperiodminutesnew':
28223
28189
  {'casedField': 'autoUpdateCheckPeriodMinutesNew',
28224
- 'type': 'duration', 'minVal': 1, 'maxVal': 720, 'scale': 60}},
28225
- 'chrome.users.BrowserSwitcherDelayDuration':
28190
+ 'type': 'duration', 'minVal': 1, 'maxVal': 720}},
28191
+ 'chrome.users.Avatar':
28192
+ {'useravatarimage':
28193
+ {'casedField': 'userAvatarImage',
28194
+ 'type': 'downloadUri'}},
28195
+ 'chrome.users.BrowserSwitcherDelayDurationV2':
28226
28196
  {'browserswitcherdelayduration':
28227
28197
  {'casedField': 'browserSwitcherDelayDuration',
28228
- 'type': 'duration', 'minVal': 0, 'maxVal': 30, 'scale': 1}},
28198
+ 'type': 'duration', 'minVal': 0, 'maxVal': 30}},
28199
+ 'chrome.users.BrowsingDataLifetimeV2':
28200
+ {'browsinghistoryttl':
28201
+ {'casedField': 'browsingHistoryTtl',
28202
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28203
+ 'downloadhistoryttl':
28204
+ {'casedField': 'downloadHistoryTtl',
28205
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28206
+ 'cookiesandothersitedatattl':
28207
+ {'casedField': 'cookiesAndOtherSiteDataTtl',
28208
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28209
+ 'cachedimagesandfilesttl':
28210
+ {'casedField': 'cachedImagesAndFilesTtl',
28211
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28212
+ 'passwordsigninttl':
28213
+ {'casedField': 'passwordSigninTtl',
28214
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28215
+ 'autofillttl':
28216
+ {'casedField': 'autofillTtl',
28217
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28218
+ 'sitesettingsttl':
28219
+ {'casedField': 'siteSettingsTtl',
28220
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28221
+ 'hostedappdatattl':
28222
+ {'casedField': 'hostedAppDataTtl',
28223
+ 'type': 'duration', 'minVal': 1, 'maxVal': None}},
28229
28224
  'chrome.users.CloudReportingUploadFrequencyV2':
28230
28225
  {'cloudreportinguploadfrequency':
28231
28226
  {'casedField': 'cloudReportingUploadFrequency',
28232
- 'type': 'count', 'minVal': 3, 'maxVal': 24, 'scale': 1}},
28233
- 'chrome.users.FetchKeepaliveDurationSecondsOnShutdown':
28227
+ 'type': 'duration', 'minVal': 3, 'maxVal': 24}},
28228
+ 'chrome.users.FetchKeepaliveDurationSecondsOnShutdownV2':
28234
28229
  {'fetchkeepalivedurationsecondsonshutdown':
28235
28230
  {'casedField': 'fetchKeepaliveDurationSecondsOnShutdown',
28236
- 'type': 'duration', 'minVal': 0, 'maxVal': 5, 'scale': 1}},
28237
- 'chrome.users.MaxInvalidationFetchDelay':
28231
+ 'type': 'duration', 'minVal': 0, 'maxVal': 5}},
28232
+ 'chrome.users.MaxInvalidationFetchDelayV2':
28238
28233
  {'maxinvalidationfetchdelay':
28239
28234
  {'casedField': 'maxInvalidationFetchDelay',
28240
- 'type': 'duration', 'minVal': 1, 'maxVal': 30, 'scale': 1, 'default': 10}},
28235
+ 'type': 'duration', 'minVal': 1, 'maxVal': 30, 'default': 10}},
28241
28236
  'chrome.users.PrintingMaxSheetsAllowed':
28242
28237
  {'printingmaxsheetsallowednullable':
28243
28238
  {'casedField': 'printingMaxSheetsAllowedNullable',
28244
- 'type': 'value', 'minVal': 1, 'maxVal': None, 'scale': 1}},
28245
- 'chrome.users.PrintJobHistoryExpirationPeriodNew':
28239
+ 'type': 'value', 'minVal': 1, 'maxVal': None}},
28240
+ 'chrome.users.PrintJobHistoryExpirationPeriodNewV2':
28246
28241
  {'printjobhistoryexpirationperioddaysnew':
28247
28242
  {'casedField': 'printJobHistoryExpirationPeriodDaysNew',
28248
- 'type': 'duration', 'minVal': -1, 'maxVal': None, 'scale': 86400}},
28243
+ 'type': 'duration', 'minVal': -1, 'maxVal': None}},
28249
28244
  'chrome.users.RelaunchNotificationWithDurationV2':
28250
28245
  {'relaunchnotificationperiodduration':
28251
28246
  {'casedField': 'relaunchNotificationPeriodDuration',
28252
- 'type': 'duration', 'minVal': -1, 'maxVal': None, 'scale': 3600}},
28253
- 'chrome.users.SecurityTokenSessionSettings':
28247
+ 'type': 'duration', 'minVal': -1, 'maxVal': None}},
28248
+ 'chrome.users.SecurityTokenSessionSettingsV2':
28254
28249
  {'securitytokensessionnotificationseconds':
28255
28250
  {'casedField': 'securityTokenSessionNotificationSeconds',
28256
- 'type': 'duration', 'minVal': 0, 'maxVal': 9999, 'scale': 1}},
28257
- 'chrome.users.SessionLength':
28251
+ 'type': 'duration', 'minVal': 0, 'maxVal': 9999}},
28252
+ 'chrome.users.SessionLengthV2':
28258
28253
  {'sessiondurationlimit':
28259
28254
  {'casedField': 'sessionDurationLimit',
28260
- 'type': 'duration', 'minVal': 1, 'maxVal': 1440, 'scale': 60}},
28255
+ 'type': 'duration', 'minVal': 1, 'maxVal': 1440}},
28261
28256
  'chrome.users.UpdatesSuppressed':
28262
28257
  {'updatessuppresseddurationmin':
28263
28258
  {'casedField': 'updatesSuppressedDurationMin',
28264
- 'type': 'count', 'minVal': 1, 'maxVal': 1440, 'scale': 1},
28259
+ 'type': 'count', 'minVal': 1, 'maxVal': 1440},
28265
28260
  'updatessuppressedstarttime':
28266
28261
  {'casedField': 'updatesSuppressedStartTime',
28267
28262
  'type': 'timeOfDay'}},
28268
- 'chrome.devices.managedguest.Avatar':
28269
- {'useravatarimage':
28270
- {'casedField': 'userAvatarImage',
28271
- 'type': 'downloadUri'}},
28272
- 'chrome.devices.managedguest.Wallpaper':
28263
+ 'chrome.users.Wallpaper':
28273
28264
  {'wallpaperimage':
28274
28265
  {'casedField': 'wallpaperImage',
28275
28266
  'type': 'downloadUri'}},
28267
+ 'chrome.devices.EnableReportUploadFrequencyV2':
28268
+ {'reportdeviceuploadfrequency':
28269
+ {'casedField': 'reportDeviceUploadFrequency',
28270
+ 'type': 'duration', 'minVal': 60, 'maxVal': 25379}},
28271
+ 'chrome.devices.ScheduledRebootDurationV2':
28272
+ {'uptimelimitduration':
28273
+ {'casedField': 'uptimeLimitDuration',
28274
+ 'type': 'duration', 'minVal': 1, 'maxVal': 365}},
28276
28275
  'chrome.devices.SignInWallpaperImage':
28277
28276
  {'devicewallpaperimage':
28278
28277
  {'casedField': 'deviceWallpaperImage',
28279
28278
  'type': 'downloadUri'}},
28280
- 'chrome.users.Avatar':
28279
+ 'chrome.devices.kiosk.AcPowerSettingsV2':
28280
+ {'acidletimeout':
28281
+ {'casedField': 'acIdleTimeout',
28282
+ 'type': 'duration', 'minVal': 1, 'maxVal': 35000},
28283
+ 'acwarningtimeout':
28284
+ {'casedField': 'acWarningTimeout',
28285
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000},
28286
+ 'acdimtimeout':
28287
+ {'casedField': 'acDimTimeout',
28288
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000},
28289
+ 'acscreenofftimeout':
28290
+ {'casedField': 'acScreenOffTimeout',
28291
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000}},
28292
+ 'chrome.devices.kiosk.BatteryPowerSettingsV2':
28293
+ {'batteryidletimeout':
28294
+ {'casedField': 'batteryIdleTimeout',
28295
+ 'type': 'duration', 'minVal': 1, 'maxVal': 35000},
28296
+ 'batterywarningtimeout':
28297
+ {'casedField': 'batteryWarningTimeout',
28298
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000},
28299
+ 'batterydimtimeout':
28300
+ {'casedField': 'batteryDimTimeout',
28301
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000},
28302
+ 'batteryscreenofftimeout':
28303
+ {'casedField': 'batteryScreenOffTimeout',
28304
+ 'type': 'duration', 'minVal': 0, 'maxVal': 35000}},
28305
+ 'chrome.devices.managedguest.Avatar':
28281
28306
  {'useravatarimage':
28282
28307
  {'casedField': 'userAvatarImage',
28283
28308
  'type': 'downloadUri'}},
28284
- 'chrome.users.Wallpaper':
28309
+ 'chrome.devices.managedguest.BrowsingDataLifetimeV2':
28310
+ {'browsinghistoryttl':
28311
+ {'casedField': 'browsingHistoryTtl',
28312
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28313
+ 'downloadhistoryttl':
28314
+ {'casedField': 'downloadHistoryTtl',
28315
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28316
+ 'cookiesandothersitedatattl':
28317
+ {'casedField': 'cookiesAndOtherSiteDataTtl',
28318
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28319
+ 'cachedimagesandfilesttl':
28320
+ {'casedField': 'cachedImagesAndFilesTtl',
28321
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28322
+ 'passwordsigninttl':
28323
+ {'casedField': 'passwordSigninTtl',
28324
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28325
+ 'autofillttl':
28326
+ {'casedField': 'autofillTtl',
28327
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28328
+ 'sitesettingsttl':
28329
+ {'casedField': 'siteSettingsTtl',
28330
+ 'type': 'duration', 'minVal': 1, 'maxVal': None},
28331
+ 'hostedappdatattl':
28332
+ {'casedField': 'hostedAppDataTtl',
28333
+ 'type': 'duration', 'minVal': 1, 'maxVal': None}},
28334
+ 'chrome.devices.managedguest.MaxInvalidationFetchDelayV2':
28335
+ {'maxinvalidationfetchdelay':
28336
+ {'casedField': 'maxInvalidationFetchDelay',
28337
+ 'type': 'duration', 'minVal': 1, 'maxVal': 30, 'default': 10}},
28338
+ 'chrome.devices.managedguest.PrintJobHistoryExpirationPeriodNewV2':
28339
+ {'printjobhistoryexpirationperioddaysnew':
28340
+ {'casedField': 'printJobHistoryExpirationPeriodDaysNew',
28341
+ 'type': 'duration', 'minVal': -1, 'maxVal': None}},
28342
+ 'chrome.devices.managedguest.SecurityTokenSessionSettingsV2':
28343
+ {'securitytokensessionnotificationseconds':
28344
+ {'casedField': 'securityTokenSessionNotificationSeconds',
28345
+ 'type': 'duration', 'minVal': 0, 'maxVal': 9999}},
28346
+ 'chrome.devices.managedguest.SessionLengthV2':
28347
+ {'sessiondurationlimit':
28348
+ {'casedField': 'sessionDurationLimit',
28349
+ 'type': 'duration', 'minVal': 1, 'maxVal': 1440}},
28350
+ 'chrome.devices.managedguest.Wallpaper':
28285
28351
  {'wallpaperimage':
28286
28352
  {'casedField': 'wallpaperImage',
28287
28353
  'type': 'downloadUri'}},
@@ -28296,9 +28362,7 @@ CHROME_TARGET_VERSION_PATTERN = re.compile(r'^(\d{1,4}\.){1,4}$')
28296
28362
  # [(printerid <PrinterID>)|(appid <AppID>)]
28297
28363
  def doUpdateChromePolicy():
28298
28364
  def getSpecialVtypeValue(vtype, value):
28299
- if vtype == 'duration':
28300
- return {vtype: f'{value}s'}
28301
- if vtype in {'value', 'downloadUri'}:
28365
+ if vtype in {'duration', 'value', 'downloadUri'}:
28302
28366
  return {vtype: value}
28303
28367
  if vtype == 'count':
28304
28368
  return value
@@ -28356,8 +28420,8 @@ def doUpdateChromePolicy():
28356
28420
  for field in jsonData.get('fields', []):
28357
28421
  casedField = field['name']
28358
28422
  lowerField = casedField.lower()
28359
- # Handle TYPE_MESSAGE fields with durations, values, counts and timeOfDay as special cases
28360
- tmschema = CHROME_SCHEMA_TYPE_MESSAGE.get(schemaName, {}).get(lowerField)
28423
+ # Handle fields with durations, values, counts and timeOfDay as special cases
28424
+ tmschema = CHROME_SCHEMA_SPECIAL_CASES.get(schemaName, {}).get(lowerField)
28361
28425
  if tmschema:
28362
28426
  body['requests'][-1]['policyValue']['value'][casedField] = getSpecialVtypeValue(tmschema['type'], field['value'])
28363
28427
  body['requests'][-1]['updateMask'] += f'{casedField},'
@@ -28393,8 +28457,8 @@ def doUpdateChromePolicy():
28393
28457
  body['requests'][-1]['policyValue']['value'][casedField] = value
28394
28458
  body['requests'][-1]['updateMask'] += f'{casedField},'
28395
28459
  break
28396
- # Handle TYPE_MESSAGE fields with durations, values, counts and timeOfDay as special cases
28397
- tmschema = CHROME_SCHEMA_TYPE_MESSAGE.get(schemaName, {}).get(field)
28460
+ # Handle fields with durations, values, counts and timeOfDay as special cases
28461
+ tmschema = CHROME_SCHEMA_SPECIAL_CASES.get(schemaName, {}).get(field)
28398
28462
  if tmschema:
28399
28463
  casedField = tmschema['casedField']
28400
28464
  vtype = tmschema['type']
@@ -28402,9 +28466,9 @@ def doUpdateChromePolicy():
28402
28466
  value = getString(Cmd.OB_STRING)
28403
28467
  elif vtype != 'timeOfDay':
28404
28468
  if 'default' not in tmschema:
28405
- value = getInteger(minVal=tmschema['minVal'], maxVal=tmschema['maxVal'])*tmschema['scale']
28469
+ value = getInteger(minVal=tmschema['minVal'], maxVal=tmschema['maxVal'])
28406
28470
  else:
28407
- value = getIntegerEmptyAllowed(minVal=tmschema['minVal'], maxVal=tmschema['maxVal'], default=tmschema['default'])*tmschema['scale']
28471
+ value = getIntegerEmptyAllowed(minVal=tmschema['minVal'], maxVal=tmschema['maxVal'], default=tmschema['default'])
28408
28472
  else:
28409
28473
  value = getHHMM()
28410
28474
  body['requests'][-1]['policyValue']['value'][casedField] = getSpecialVtypeValue(vtype, value)
@@ -28537,20 +28601,14 @@ def doPrintShowChromePolicies():
28537
28601
  'chrome.users.apps.ManagedConfiguration'} and 'managedConfiguration' in values:
28538
28602
  values['managedConfiguration'] = json.dumps(values['managedConfiguration'], ensure_ascii=False).replace('\\n', '').replace('\\"', '"')[1:-1]
28539
28603
  for setting, value in values.items():
28540
- # Handle TYPE_MESSAGE fields with durations, values, counts and timeOfDay as special cases
28541
- schema = CHROME_SCHEMA_TYPE_MESSAGE.get(name, {}).get(setting.lower())
28604
+ # Handle fields with durations, values, counts and timeOfDay as special cases
28605
+ schema = CHROME_SCHEMA_SPECIAL_CASES.get(name, {}).get(setting.lower())
28542
28606
  if schema and setting == schema['casedField']:
28543
28607
  vtype = schema['type']
28544
- if vtype in {'duration', 'value'}:
28608
+ if vtype in {'duration', 'value', 'downloadUri'}:
28545
28609
  value = value.get(vtype, '')
28546
- if value:
28547
- if value.endswith('s'):
28548
- value = value[:-1]
28549
- value = int(value) // schema['scale']
28550
28610
  elif vtype == 'count':
28551
28611
  pass
28552
- elif vtype == 'downloadUri':
28553
- value = value.get(vtype, '')
28554
28612
  else: #timeOfDay
28555
28613
  hours = value.get(vtype, {}).get('hours', 0)
28556
28614
  minutes = value.get(vtype, {}).get('minutes', 0)
@@ -75645,7 +75703,6 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75645
75703
  Cmd.ARG_DRIVEFILEACL: doInfoDriveFileACLs,
75646
75704
  Cmd.ARG_DRIVELABEL: doInfoDriveLabels,
75647
75705
  Cmd.ARG_INSTANCE: doInfoInstance,
75648
- Cmd.ARG_GAL: doInfoGAL,
75649
75706
  Cmd.ARG_GROUP: doInfoGroups,
75650
75707
  Cmd.ARG_GROUPMEMBERS: doInfoGroupMembers,
75651
75708
  Cmd.ARG_INBOUNDSSOASSIGNMENT: doInfoInboundSSOAssignment,
@@ -75740,7 +75797,6 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75740
75797
  Cmd.ARG_DRIVELABEL: doPrintShowDriveLabels,
75741
75798
  Cmd.ARG_DRIVELABELPERMISSION: doPrintShowDriveLabelPermissions,
75742
75799
  Cmd.ARG_FEATURE: doPrintShowFeatures,
75743
- Cmd.ARG_GAL: doPrintShowGAL,
75744
75800
  Cmd.ARG_GROUP: doPrintGroups,
75745
75801
  Cmd.ARG_GROUPMEMBERS: doPrintGroupMembers,
75746
75802
  Cmd.ARG_GROUPTREE: doPrintShowGroupTree,
@@ -75858,7 +75914,6 @@ MAIN_COMMANDS_WITH_OBJECTS = {
75858
75914
  Cmd.ARG_DRIVELABEL: doPrintShowDriveLabels,
75859
75915
  Cmd.ARG_DRIVELABELPERMISSION: doPrintShowDriveLabelPermissions,
75860
75916
  Cmd.ARG_FEATURE: doPrintShowFeatures,
75861
- Cmd.ARG_GAL: doPrintShowGAL,
75862
75917
  Cmd.ARG_GROUPMEMBERS: doShowGroupMembers,
75863
75918
  Cmd.ARG_GROUPTREE: doPrintShowGroupTree,
75864
75919
  Cmd.ARG_GUARDIAN: doPrintShowGuardians,
@@ -616,7 +616,6 @@ class GamCLArgs():
616
616
  ARG_FORWARDS = 'forwards'
617
617
  ARG_FORWARDINGADDRESS = 'forwardingaddress'
618
618
  ARG_FORWARDINGADDRESSES = 'forwardingaddresses'
619
- ARG_GAL = 'gal'
620
619
  ARG_GCPFOLDER = 'gcpfolder'
621
620
  ARG_GCPSERVICEACCOUNT = 'gcpserviceaccount'
622
621
  ARG_GMAIL = 'gmail'
@@ -7,13 +7,14 @@
7
7
  - [Create an administrator](#create-an-administrator)
8
8
  - [Delete an administrator](#delete-an-administrator)
9
9
  - [Display administrators](#display-administrators)
10
+ - [Copy privileges from one role to a new role](#copy-privileges-from-one-role-to-a-new-role)
10
11
  - [Copy roles from one administrator to another](#copy-roles-from-one-administrator-to-another)
11
12
 
12
13
  ## API documentation
13
14
  * [About Administrator roles](https://support.google.com/a/answer/33325?ref_topic=4514341)
14
15
  * [Directory API - Privileges](https://developers.google.com/admin-sdk/directory/reference/rest/v1/privileges)
15
16
  * [Directory API - Roles](https://developers.google.com/admin-sdk/directory/reference/rest/v1/roles)
16
- * [Directory API - Role SAssignments](https://developers.google.com/admin-sdk/directory/reference/rest/v1/roleAssignments)
17
+ * [Directory API - Role Assignments](https://developers.google.com/admin-sdk/directory/reference/rest/v1/roleAssignments)
17
18
 
18
19
  ## Definitions
19
20
  ```
@@ -36,7 +37,7 @@ gam print privileges [todrive <ToDriveAttribute>*]
36
37
  gam show privileges
37
38
  ```
38
39
 
39
- Here is the output from `gam show privileges`; use this to find `<Privilege>`.
40
+ Here is the output from `gam show privileges`; use this to find a specific `<Privilege>`.
40
41
  ```
41
42
  Show 111 Privileges
42
43
  Privilege: REPORTS_ACCESS (1/111)
@@ -1381,24 +1382,33 @@ Show 111 Privileges
1381
1382
 
1382
1383
  ## Manage administrative roles
1383
1384
  ```
1384
- gam create adminrole <String> privileges all|all_ou|<PrivilegeList> [description <String>]
1385
- gam update adminrole <RoleItem> [name <String>] [privileges all|all_ou|<PrivilegeList>] [description <String>]
1385
+ gam create adminrole <String> [description <String>]
1386
+ privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)
1387
+ gam update adminrole <RoleItem> [name <String>] [description <String>]
1388
+ [privileges all|all_ou|<PrivilegeList>|(select <FileSelector>|<CSVFileSelector>>)]
1386
1389
  gam delete adminrole <RoleItem>
1387
1390
  ```
1388
1391
  * `privileges all` - All defined privileges
1389
1392
  * `privileges all_ou` - All defined privileges than can be scoped to an OU
1390
1393
  * `privileges <PrivilegeList>` - A specific list of privileges
1394
+ * `privileges select <FileSelector>|<CSVFileSelector>>` - A collection of privileges from a flat or CSV file
1391
1395
 
1392
1396
  ## Display administrative roles
1393
1397
  ```
1394
1398
  gam info adminrole <RoleItem> [privileges]
1399
+ ```
1400
+ * `privileges` - Display privileges associated with role
1401
+ ```
1395
1402
  gam print adminroles|roles [todrive <ToDriveAttribute>*]
1396
- [privileges] [oneitemperrow]
1397
- gam show adminroles|roles [todrive <ToDriveAttribute>*] [privileges]
1403
+ [role <RoleItem>] [privileges] [oneitemperrow]
1404
+ gam show adminroles|roles
1405
+ [role <RoleItem>] [privileges]
1398
1406
  ```
1407
+ By default, all roles are displayed, use `role <RoleItem>` to display a specific role.
1408
+
1399
1409
  * `privileges` - Display privileges associated with each role
1400
1410
 
1401
- By default, all privileges for a role are shown on one row as a repeating item.
1411
+ By default, with `print`, all privileges for a role are shown on one row as a repeating item.
1402
1412
  When `oneitemperrow` is specified, each privilege is output on a separate row/line with the other role fields.
1403
1413
 
1404
1414
  ## Create an administrator
@@ -1438,6 +1448,16 @@ options to limit the display:
1438
1448
  By default, all role privileges for an admin are shown on one row as a repeating item.
1439
1449
  When `oneitemperrow` is specified, each role privilege is output on a separate row/line with the other admin fields.
1440
1450
 
1451
+ ## Copy privileges from one role to a new role
1452
+ Get privileges for existing role; replace Role Name with actual role name
1453
+ ```
1454
+ gam redirect csv ./RolePrivileges.csv print adminrole role 'Role Name' privileges oneitemperrow
1455
+ ```
1456
+ Create a new role with those privileges
1457
+ ```
1458
+ gam create adminrole "New Role Name" privileges select csvfile RolePrivileges.csv:privilegeName
1459
+ ```
1460
+
1441
1461
  ## Copy roles from one administrator to another
1442
1462
  Get roles for current admin.
1443
1463
  ```
@@ -1,4 +1,4 @@
1
- # Domain Shared Contacts - Global Address List
1
+ # Domain Shared Contacts
2
2
  - [API documentation](#api-documentation)
3
3
  - [Python Regular Expressions](Python-Regular-Expressions) Match function
4
4
  - [Definitions](#definitions)