mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-20 14:11:37 +00:00
Compare commits
52 Commits
v7.07.05
...
20250601.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3006d8dfe4 | ||
|
|
f9ed16e2e3 | ||
|
|
9999adfb3a | ||
|
|
f09a1e1bd6 | ||
|
|
a95da4e2ea | ||
|
|
fce8704f87 | ||
|
|
4d3b72900b | ||
|
|
fd81d56675 | ||
|
|
762d8479a4 | ||
|
|
6f19ec4f8c | ||
|
|
8af3bc60e6 | ||
|
|
e636a69431 | ||
|
|
673460e91d | ||
|
|
9862ad446f | ||
|
|
67f21ce650 | ||
|
|
e82baccbac | ||
|
|
c51b06a6c3 | ||
|
|
b7415cd63f | ||
|
|
f0f5803698 | ||
|
|
575fdea526 | ||
|
|
f8ee94bad8 | ||
|
|
4b6c8fb518 | ||
|
|
4f8c80dcab | ||
|
|
12f5c5e670 | ||
|
|
a1216b6782 | ||
|
|
05f4795bc3 | ||
|
|
e1ff1ba378 | ||
|
|
5b2804643e | ||
|
|
3925166987 | ||
|
|
5dece6c719 | ||
|
|
b48d316bd9 | ||
|
|
1f2b33b805 | ||
|
|
a6773901c9 | ||
|
|
840784fa98 | ||
|
|
aecb17b9fe | ||
|
|
2d90c75f03 | ||
|
|
cd8691b438 | ||
|
|
e2f0afe891 | ||
|
|
65cd2439d5 | ||
|
|
652ab1dc6d | ||
|
|
88cad201a5 | ||
|
|
9f8100dfbf | ||
|
|
7fbafb2ba0 | ||
|
|
2c631af66c | ||
|
|
3b900ca56f | ||
|
|
4a1e19a753 | ||
|
|
4a0e61a385 | ||
|
|
10b874e2aa | ||
|
|
4c3821766d | ||
|
|
5225a36cbd | ||
|
|
ee64202233 | ||
|
|
25add7034a |
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -449,7 +449,7 @@ jobs:
|
||||
"$PYTHON" get-pip.py
|
||||
"$PYTHON" -m pip install --upgrade pip
|
||||
"$PYTHON" -m pip install --upgrade wheel
|
||||
"$PYTHON" -m pip install --upgrade setuptools
|
||||
"$PYTHON" -m pip install setuptools
|
||||
"$PYTHON" -m pip install --upgrade importlib-metadata
|
||||
"$PYTHON" -m pip install --upgrade setuptools-scm
|
||||
"$PYTHON" -m pip list
|
||||
|
||||
@@ -21,8 +21,8 @@ dependencies = [
|
||||
"lxml>=5.4.0",
|
||||
"passlib>=1.7.4",
|
||||
"pathvalidate>=3.2.3",
|
||||
"pyscard==2.2.1",
|
||||
"python-dateutil",
|
||||
"yubikey-manager>=5.6.1",
|
||||
]
|
||||
description = "CLI tool to manage Google Workspace"
|
||||
readme = "README.md"
|
||||
|
||||
@@ -1383,7 +1383,7 @@ gam show projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>]
|
||||
[states all|active|deleterequested] [showiampolicies 0|1|3]
|
||||
gam print projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>] [todrive <ToDriveAttribute>*]
|
||||
[states all|active|deleterequested] [showiampolicies 0|1|3 [onememberperrow]]
|
||||
[delimiter <Character>]] [[formatjson [quotechar <Character>]]
|
||||
[delimiter <Character>] [[formatjson [quotechar <Character>]]
|
||||
gam info currentprojectid
|
||||
|
||||
gam create|add svcacct [[admin] <EmailAddress>] [<ProjectIDEntity>]
|
||||
@@ -1862,7 +1862,7 @@ gam calendar|calendars <CalendarEntity> show events [<EventEntity>] <EventDispla
|
||||
[formatjson]
|
||||
gam calendar|calendars <CalendarEntity> print events [<EventEntity>] <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly]
|
||||
[countsonly [eventrowfilter]]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
|
||||
gam calendar <CalendarEntity> addevent <EventAttribute>+ [<EventNotificationAttribute>]
|
||||
@@ -1876,7 +1876,7 @@ gam calendar <CalendarEntity> moveevent (id|eventid <EventID>)+ destination <Cal
|
||||
gam calendar <CalendarEntity> wipe
|
||||
gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly]
|
||||
[countsonly [eventrowfilter]]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
|
||||
<CalendarSettingsField> ::=
|
||||
@@ -2396,12 +2396,14 @@ gam <CrOSTypeEntity> update <CrOSAttribute>+ [quickcrosmove [<Boolean>]] [nobatc
|
||||
autoupdatethrough|
|
||||
backlightinfo|
|
||||
bootmode|
|
||||
chromeostype|
|
||||
cpuinfo|
|
||||
cpustatusreports|
|
||||
deprovisionreason|
|
||||
devicefiles|
|
||||
deviceid|
|
||||
devicelicensetype|
|
||||
diskspaceusage|
|
||||
diskvolumereports|
|
||||
dockmacaddress|
|
||||
ethernetmacaddress|
|
||||
@@ -2409,6 +2411,7 @@ gam <CrOSTypeEntity> update <CrOSAttribute>+ [quickcrosmove [<Boolean>]] [nobatc
|
||||
extendedsupporteligible|
|
||||
extendedsupportstart|
|
||||
extendedsupportenabled|
|
||||
faninfo|
|
||||
firmwareversion|
|
||||
firstenrollmenttime|
|
||||
lastdeprovisiontimestamp|
|
||||
@@ -4116,7 +4119,7 @@ gam print devices [todrive <ToDriveAttribute>*]
|
||||
<DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
|
||||
[orderby <DeviceOrderByFieldName> [ascending|descending]]
|
||||
[all|company|personal|nocompanydevices|nopersonaldevices]
|
||||
[nodeviceusers]
|
||||
[nodeviceusers|oneuserperrow]
|
||||
[formatjson [quotechar <Character>]]
|
||||
[showitemcountonly]
|
||||
|
||||
@@ -4816,6 +4819,16 @@ gam show shareddrives
|
||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||
[formatjson] [noorgunits [<Boolean>]]
|
||||
|
||||
gam print shareddriveorganizers [todrive <ToDriveAttribute>*]
|
||||
[shareddriveadminquery|query <QuerySharedDrive>]
|
||||
[orgunit|org|ou <OrgUnitPath>]
|
||||
[matchname <REMatchPattern>]
|
||||
[domainlist <DomainList>]
|
||||
[includetypes <OrganizerTypeList>]
|
||||
[oneorganizer [<Boolean>]]
|
||||
[shownorganizerdrives [false|true|only]]
|
||||
[includefileorganizers [<Boolean>]]
|
||||
[delimiter <Character>]
|
||||
gam print oushareddrives [todrive <ToDriveAttribute>*]
|
||||
[ou|org|orgunit <OrgUnitPath>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
@@ -5260,7 +5273,8 @@ gam create vaultexport|export matter <MatterItem> [name <String>] corpus calenda
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>] [timezone <TimeZone>]
|
||||
[locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
|
||||
[responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
|
||||
[includeshareddrives <Boolean>] [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
||||
[(includeshareddrives <Boolean>)|(shareddrivesoption included|included_if_account_is_not_a_member|not_included)]
|
||||
[driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
||||
[driveclientsideencryption any|encrypted|unencrypted]
|
||||
[includerooms <Boolean>]
|
||||
[excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
|
||||
@@ -5326,14 +5340,14 @@ gam create vaulthold|hold matter <MatterItem> [name <String>] corpus calendar|dr
|
||||
[query <QueryVaultCorpus>]
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
|
||||
[includerooms <Boolean>] [covereddata calllogs|textmessages|voicemails]
|
||||
[includeshareddrives|includeteamdrives <Boolean>]
|
||||
[includeshareddrives <Boolean>]
|
||||
[showdetails|returnidonly]
|
||||
gam update vaulthold|hold <HoldItem> matter <MatterItem>
|
||||
[([addaccounts|addgroups|addusers <EmailItemList>] [removeaccounts|removegroups|removeusers <EmailItemList>]) | (orgunit|org|ou <OrgUnit>)]
|
||||
[query <QueryVaultCorpus>]
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
|
||||
[includerooms <Boolean>] [covereddata calllogs|textmessages|voicemails]
|
||||
[includeshareddrives|includeteamdrives <Boolean>]
|
||||
[includeshareddrives <Boolean>]
|
||||
[showdetails]
|
||||
gam delete vaulthold|hold <HoldItem> matter <MatterItem>
|
||||
gam delete vaulthold|hold <MatterItem> <HoldItem>
|
||||
@@ -6099,7 +6113,7 @@ gam <UserTypeEntity> show events <UserCalendarEntity> [<EventEntity>] <EventDisp
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> print events <UserCalendarEntity> [<EventEntity>] <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly]
|
||||
[countsonly [eventrowfilter]]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
|
||||
gam <UserTypeEntity> update calattendees <UserCalendarEntity> <EventEntity> [anyorganizer]
|
||||
@@ -8322,6 +8336,17 @@ gam <UserTypeEntity> show shareddrives
|
||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||
[formatjson]
|
||||
|
||||
gam <UserTypeEntity> print shareddriveorganizers [todrive <ToDriveAttribute>*]
|
||||
[adminaccess|asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
|
||||
[orgunit|org|ou <OrgUnitPath>]
|
||||
[matchname <REMatchPattern>]
|
||||
[domainlist <DomainList>]
|
||||
[includetypes <OrganizerTypeList>]
|
||||
[oneorganizer [<Boolean>]]
|
||||
[shownorganizerdrives [false|true|only]]
|
||||
[includefileorganizers [<Boolean>]]
|
||||
[delimiter <Character>]
|
||||
|
||||
# Users - Force Signout and Turn Off 2-Step Verification
|
||||
|
||||
gam <UserTypeEntity> signout
|
||||
|
||||
@@ -1,3 +1,124 @@
|
||||
7.08.00
|
||||
|
||||
Added the following command that can be used instead of the `GetTeamDriveOrganizers.py` script.
|
||||
|
||||
```
|
||||
gam [<UserTypeEntity>] print shareddriveorganizers [todrive <ToDriveAttribute>*]
|
||||
[adminaccess|asadmin] [shareddriveadminquery|query <QuerySharedDrive>]
|
||||
[orgunit|org|ou <OrgUnitPath>]
|
||||
[matchname <REMatchPattern>]
|
||||
[domainlist <DomainList>]
|
||||
[includetypes <OrganizerTypeList>]
|
||||
[oneorganizer [<Boolean>]]
|
||||
[shownorganizerdrives [false|true|only]]
|
||||
[includefileorganizers [<Boolean>]]
|
||||
[delimiter <Character>]
|
||||
```
|
||||
The command defaults match the script defaults:
|
||||
* `domainlist` - All domains
|
||||
* `includetypes` - user,groups
|
||||
* `oneorganizer` - False
|
||||
* `shownoorganizerdrives` - True
|
||||
* `includefileorganizers` - False
|
||||
|
||||
For example, to get a single organizer from your domain for all Shared Drives including no organizer drives:
|
||||
```
|
||||
gam redirect csv ./TeamDriveOrganizers.csv print shareddriveorganizers domainlist mydomain.com includetypes user oneorganizer shownoorganizerdrives
|
||||
```
|
||||
|
||||
7.07.17
|
||||
|
||||
Added option `oneuserperrow` to `gam print devices` to have each of a
|
||||
device's users displayed on a separate row with all of the other device fields.
|
||||
|
||||
7.07.16
|
||||
|
||||
Added `chromeostype`, `diskspaceusage` and `faninfo` to `<CrOSFieldName>` for use in `gam info|print cros`.
|
||||
|
||||
Fixed bugs/cleaned output in `gam info|print cros`.
|
||||
|
||||
7.07.15
|
||||
|
||||
Added option `shareddrivesoption included|included_if_account_is_not_a_member|not_included` to `gam create vaultexport`.
|
||||
|
||||
The previous option `includeshareddrives <Boolean>` is mapped as follows:
|
||||
* `includeshareddrives false` - `shareddrivesoption included_if_account_is_not_a_member`
|
||||
* `includeshareddrives true` - `shareddrivesoption included`
|
||||
|
||||
7.07.14
|
||||
|
||||
Update `gam setup chat` output to include the following that shows the actual Cloud Pub/Sub Topic Name.
|
||||
```
|
||||
You'll use projects/<ProjectID>/topics/no-topic in Connection settings Cloud Pub/Sub Topic Name
|
||||
```
|
||||
|
||||
7.07.13
|
||||
|
||||
Added option `showitemcountonly` to `gam [<UserTypeEntity>] print|show shareddrives` that causes GAM to display the
|
||||
number of Shared Drives on stdout; no CSV file is written.
|
||||
|
||||
7.07.12
|
||||
|
||||
Fixed bug in `gam print|show oushareddrives` that caused a trap.
|
||||
|
||||
Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
|
||||
|
||||
7.07.11
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
ERROR: 400: badRequest - Bad Request
|
||||
```
|
||||
|
||||
Updated `gam <UserTypeEntity> move drivefile` to handle the following error:
|
||||
```
|
||||
ERROR: 400: shareOutNotPermitted
|
||||
```
|
||||
|
||||
7.07.10
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
ERROR: 400: eventTypeRestriction - Attendees cannot be added to 'fromGmail' event with this visibility setting.
|
||||
```
|
||||
|
||||
7.07.09
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
gamlib.glgapi.serviceNotAvailable: Authentication backend unavailable.
|
||||
```
|
||||
|
||||
7.07.08
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print filelist ... countsonly` that issued an
|
||||
incorrect warning message like the following when `redirect csv <FileName> multiprocess` was specified.
|
||||
```
|
||||
WARNING: csv_output_row_filter column "^name$" does not match any output columns
|
||||
```
|
||||
|
||||
7.07.07
|
||||
|
||||
Fixed bug in `gam report <ActivityApplictionName> ... countsonly eventrowfilter` that issued an
|
||||
incorrect warning message like the following when `redirect csv <FileName> multiprocess` was specified.
|
||||
```
|
||||
WARNING: csv_output_row_filter column "^doc_title$" does not match any output columns
|
||||
```
|
||||
|
||||
7.07.06
|
||||
|
||||
Added option `eventrowfilter` to `gam calendars <CalendarEntity> print events ... countsonly`
|
||||
and `gam <UserTypeEntity> print events <UserCalendarEntity> ... countsonly` that causes
|
||||
GAM to apply `config csv_output_row_filter` to the event details rather than the event counts.
|
||||
This will be useful when `<EventSelectProperty>` and `<EventMatchProperty>` do not have the
|
||||
capabilty to select the events of interest; e.g., you want to filter based on the event `created` property.
|
||||
|
||||
Dropped the extraneous `id` column for `gam calendars <CalendarEntity> print events ... countsonly`
|
||||
and `gam <UserTypeEntity> print events <UserCalendarEntity> ... countsonly`.
|
||||
|
||||
7.07.05
|
||||
|
||||
Updated `gam <UserTypeEntity> move drivefile` to recognize the API error: `ERROR: 400: shareOutWarning`.
|
||||
|
||||
@@ -38,6 +38,10 @@ hiddenimports = [
|
||||
'gam.gamlib.yubikey',
|
||||
]
|
||||
|
||||
excludes = [
|
||||
'pkg_resources',
|
||||
]
|
||||
|
||||
runtime_hooks = []
|
||||
a = Analysis(
|
||||
['gam/__main__.py'],
|
||||
@@ -48,7 +52,7 @@ a = Analysis(
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=runtime_hooks,
|
||||
excludes=[],
|
||||
excludes=excludes,
|
||||
win_no_prefer_redirects=False,
|
||||
win_private_assemblies=False,
|
||||
cipher=None,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
||||
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@@ -260,12 +260,12 @@ SMTP_HOST = 'smtp_host'
|
||||
SMTP_USERNAME = 'smtp_username'
|
||||
# SMTP password
|
||||
SMTP_PASSWORD = 'smtp_password'
|
||||
# Time Zone
|
||||
TIMEZONE = 'timezone'
|
||||
## Minimum TLS Version required for HTTPS connections
|
||||
TLS_MIN_VERSION = 'tls_min_version'
|
||||
## Maximum TLS Version used for HTTPS connections
|
||||
TLS_MAX_VERSION = 'tls_max_version'
|
||||
# Time Zone
|
||||
TIMEZONE = 'timezone'
|
||||
# Clear basic filter when updating an existing sheet
|
||||
TODRIVE_CLEARFILTER = 'todrive_clearfilter'
|
||||
# Use client access for todrive
|
||||
@@ -431,9 +431,9 @@ Defaults = {
|
||||
SMTP_HOST: '',
|
||||
SMTP_USERNAME: '',
|
||||
SMTP_PASSWORD: '',
|
||||
TIMEZONE: 'utc',
|
||||
TLS_MIN_VERSION: 'TLSv1_3',
|
||||
TLS_MAX_VERSION: '',
|
||||
TIMEZONE: 'utc',
|
||||
TODRIVE_CLEARFILTER: FALSE,
|
||||
TODRIVE_CLIENTACCESS: FALSE,
|
||||
TODRIVE_CONVERSION: TRUE,
|
||||
@@ -599,9 +599,9 @@ VAR_INFO = {
|
||||
SMTP_HOST: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||
SMTP_USERNAME: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||
SMTP_PASSWORD: {VAR_TYPE: TYPE_PASSWORD, VAR_LIMITS: (0, None)},
|
||||
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
||||
TLS_MIN_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MIN_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
||||
TLS_MAX_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MAX_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
||||
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
||||
TODRIVE_CLEARFILTER: {VAR_TYPE: TYPE_BOOLEAN},
|
||||
TODRIVE_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
|
||||
TODRIVE_CONVERSION: {VAR_TYPE: TYPE_BOOLEAN},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
||||
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@@ -755,6 +755,7 @@ class GamCLArgs():
|
||||
ARG_SHAREDDRIVES = 'shareddrives'
|
||||
ARG_SHAREDDRIVEACLS = 'shareddriveacls'
|
||||
ARG_SHAREDDRIVEINFO = 'shareddriveinfo'
|
||||
ARG_SHAREDDRIVEORGANIZERS = 'shareddriveorganizers'
|
||||
ARG_SHAREDDRIVETHEMES = 'shareddrivethemes'
|
||||
ARG_SHEET = 'sheet'
|
||||
ARG_SHEETS = 'sheets'
|
||||
@@ -784,6 +785,7 @@ class GamCLArgs():
|
||||
ARG_TEAMDRIVES = 'teamdrives'
|
||||
ARG_TEAMDRIVEACLS = 'teamdriveacls'
|
||||
ARG_TEAMDRIVEINFO = 'teamdriveinfo'
|
||||
ARG_TEAMDRIVEORGANIZERS = 'teamdriveorganizers'
|
||||
ARG_TEAMDRIVETHEMES = 'teamdrivethemes'
|
||||
ARG_THREAD = 'thread'
|
||||
ARG_THREADS = 'threads'
|
||||
@@ -964,6 +966,7 @@ class GamCLArgs():
|
||||
OB_MOBILE_ENTITY = 'MobileEntity'
|
||||
OB_NETWORK_ID = 'networkID'
|
||||
OB_NAME = 'Name'
|
||||
OB_ORGANIZER_TYPE_LIST = 'OrganizerTypeList'
|
||||
OB_ORGUNIT_ENTITY = 'OrgUnitEntity'
|
||||
OB_ORGUNIT_ITEM = 'OrgUnitItem'
|
||||
OB_ORGUNIT_PATH = 'OrgUnitPath'
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
||||
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@@ -72,6 +72,7 @@ DOMAIN_POLICY = 'domainPolicy'
|
||||
DOWNLOAD_QUOTA_EXCEEDED = 'downloadQuotaExceeded'
|
||||
DUPLICATE = 'duplicate'
|
||||
EVENT_DURATION_EXCEEDS_LIMIT = 'eventDurationExceedsLimit'
|
||||
EVENT_TYPE_RESTRICTION = 'eventTypeRestriction'
|
||||
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE = 'expirationDatesMustBeInTheFuture'
|
||||
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS = 'expirationDateNotAllowedForSharedDriveMembers'
|
||||
FAILED_PRECONDITION = 'failedPrecondition'
|
||||
@@ -457,6 +458,8 @@ class duplicate(Exception):
|
||||
pass
|
||||
class eventDurationExceedsLimit(Exception):
|
||||
pass
|
||||
class eventTypeRestriction(Exception):
|
||||
pass
|
||||
class expirationDatesMustBeInTheFuture(Exception):
|
||||
pass
|
||||
class expirationDateNotAllowedForSharedDriveMembers(Exception):
|
||||
@@ -725,6 +728,7 @@ REASON_EXCEPTION_MAP = {
|
||||
DOWNLOAD_QUOTA_EXCEEDED: downloadQuotaExceeded,
|
||||
DUPLICATE: duplicate,
|
||||
EVENT_DURATION_EXCEEDS_LIMIT: eventDurationExceedsLimit,
|
||||
EVENT_TYPE_RESTRICTION: eventTypeRestriction,
|
||||
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE: expirationDatesMustBeInTheFuture,
|
||||
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS: expirationDateNotAllowedForSharedDriveMembers,
|
||||
FAILED_PRECONDITION: failedPrecondition,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2023 Ross Scroggs All Rights Reserved.
|
||||
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@@ -25,8 +25,6 @@
|
||||
# Some commands want to set a non-zero return code but not bail
|
||||
# GAM admin user from oauth2.txt or oauth2service.json
|
||||
ADMIN = 'admn'
|
||||
# Drive service for admin; used to look up Shared Drive Names
|
||||
ADMIN_DRIVE = 'addr'
|
||||
# Number/length of API call retries
|
||||
API_CALLS_RETRY_DATA = 'rtry'
|
||||
# GAM cache directory. If no_cache is True, this variable will be set to None
|
||||
@@ -207,6 +205,7 @@ REDIRECT_WRITE_HEADER = 'rdwh'
|
||||
REDIRECT_MULTIPROCESS = 'rdmp'
|
||||
REDIRECT_QUEUE = 'rdq'
|
||||
REDIRECT_QUEUE_NAME = 'name'
|
||||
REDIRECT_QUEUE_CLEAR_ROW_FILTERS = 'clearRowFilters'
|
||||
REDIRECT_QUEUE_TODRIVE = 'todrive'
|
||||
REDIRECT_QUEUE_CSVPF = 'csvpf'
|
||||
REDIRECT_QUEUE_DATA = 'rows'
|
||||
@@ -219,7 +218,6 @@ REDIRECT_QUEUE_EOF = 'eof'
|
||||
#
|
||||
Globals = {
|
||||
ADMIN: None,
|
||||
ADMIN_DRIVE: None,
|
||||
API_CALLS_RETRY_DATA: {},
|
||||
CACHE_DIR: None,
|
||||
CACHE_DISCOVERY_ONLY: True,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
||||
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||
#
|
||||
# All Rights Reserved.
|
||||
#
|
||||
@@ -504,13 +504,15 @@ TO = 'To'
|
||||
TO_LC = 'to'
|
||||
TO_MAXIMUM_OF = 'to maximum of'
|
||||
TO_SET_UP_GOOGLE_CHAT = """
|
||||
To set up Google Chat for your API project, please go to:
|
||||
To set up Google Chat for your current project, please go to:
|
||||
|
||||
{0}
|
||||
|
||||
and follow the instructions at:
|
||||
|
||||
https://github.com/GAM-team/GAM/wiki/Chat-Bot#set-up-a-chat-bot
|
||||
|
||||
You'll use projects/{1}/topics/no-topic in Connection settings Cloud Pub/Sub Topic Name
|
||||
"""
|
||||
TOTAL_ITEMS_IN_ENTITY = 'Total {0} in {1}'
|
||||
TRIMMED_MESSAGE_FROM_LENGTH_TO_MAXIMUM = 'Trimmed message of length {0} to maximum length {1}'
|
||||
|
||||
@@ -10,6 +10,5 @@ httplib2>=0.22.0
|
||||
lxml>=5.4.0
|
||||
passlib>=1.7.4
|
||||
pathvalidate>=3.2.3
|
||||
pyscard==2.2.1
|
||||
python-dateutil
|
||||
yubikey-manager>=5.6.1
|
||||
|
||||
@@ -37,7 +37,6 @@ install_requires =
|
||||
lxml >= 5.4.0
|
||||
passlib >= 1.7.4
|
||||
pathvalidate >= 3.2.3
|
||||
pyscard == 2.2.1
|
||||
python-dateutil
|
||||
yubikey-manager >= 5.6.1
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@ Verify the following steps:
|
||||
* If groups are used to authenticate access, make sure the super admin is in one of the groups
|
||||
* Collapse "Service status"
|
||||
* Expand "Cloud Resource Manager API settings"
|
||||
* Select the OU in the left that contains the super admin you'll be using
|
||||
* Make sure that "Allow users to create projects" is checked
|
||||
|
||||
Verify that all scopes are available:
|
||||
|
||||
@@ -567,7 +567,7 @@ By default, Gam displays the information as an indented list of keys and values.
|
||||
```
|
||||
gam calendar <CalendarEntity> show events [<EventEntity>] <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly] [formatjson]
|
||||
[countsly] [formatjson]
|
||||
```
|
||||
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
||||
|
||||
@@ -585,8 +585,9 @@ By default, Gam displays event details, use `countsonly` to display only the num
|
||||
|
||||
```
|
||||
gam calendar <CalendarEntity> print events [<EventEntity>] <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly] [formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly [eventrowfilter]]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
||||
|
||||
@@ -602,6 +603,11 @@ By default, Gam displays the information as columns of fields; the following opt
|
||||
|
||||
By default, Gam displays event details, use `countsonly` to display only the number of events. `formatjson` does not apply in this case.
|
||||
|
||||
When `countsonly` is specified, the `eventrowfilter` option causes
|
||||
GAM to apply `config csv_output_row_filter` to the event details rather than the event counts.
|
||||
This will be useful when `<EventSelectProperty>` and `<EventMatchProperty>` do not have the
|
||||
capabilty to select the events of interest; e.g., you want to filter based on the event `created` property.
|
||||
|
||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||
@@ -627,6 +633,8 @@ gam calendar <CalendarEntity> deleteevent (id|eventid <EventID>)+ [doit] [<Event
|
||||
gam calendar <CalendarEntity> moveevent (id|eventid <EventID>)+ destination <CalendarItem> [<EventNotificationAttribute>]
|
||||
gam calendar <CalendarEntity> updateevent <EventID> <EventAttribute>+ [<EventNotificationAttribute>]
|
||||
gam calendar <CalendarEntity> wipe
|
||||
gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayProperty>* [fields <EventFieldNameList>]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>]
|
||||
[countsonly [eventrowfilter]]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Chat Bot
|
||||
|
||||
- [Introduction](#introduction)
|
||||
- [Set up a Chat Bot](#set-up-a-chat-bot)
|
||||
- [API documentation](#api-documentation)
|
||||
- [Definitions](#definitions)
|
||||
- [Set up a Chat Bot](#set-up-a-chat-bot)
|
||||
- [Display Rooms and Chats to which your Bot belongs](#display-rooms-and-chats-to-which-your-bot-belongs)
|
||||
- [Display Members of a Room or Chat](#display-members-of-a-room-or-chat)
|
||||
- [Create a Chat Message](#create-a-chat-message)
|
||||
@@ -10,6 +10,43 @@
|
||||
- [Delete a Chat Message](#delete-a-chat-message)
|
||||
- [Display a Chat Message](#display-a-chat-message)
|
||||
|
||||
## Introduction
|
||||
To use these commands you must update your service account authorization.
|
||||
```
|
||||
gam user user@domain.com update serviceaccount
|
||||
|
||||
[*] 4) Chat API - Memberships (supports readonly)
|
||||
[*] 5) Chat API - Memberships Admin (supports readonly)
|
||||
[*] 6) Chat API - Messages (supports readonly)
|
||||
[*] 7) Chat API - Spaces (supports readonly)
|
||||
[*] 8) Chat API - Spaces Admin (supports readonly)
|
||||
[*] 9) Chat API - Spaces Delete
|
||||
[*] 10) Chat API - Spaces Delete Admin
|
||||
```
|
||||
|
||||
Added `use_chat_admin_access` Boolean variable to `gam.cfg`.
|
||||
```
|
||||
* When False, GAM uses user access when making all Chat API calls. For calls that support admin access,
|
||||
this can be overridden with the asadmin command line option.
|
||||
* When True, GAM uses admin access for Chat API calls that support admin access; other calls will use user access.
|
||||
* Default: False
|
||||
```
|
||||
|
||||
Google requires that you have a Chat Bot configured in order to use the Chat API; set up a Chat Bot as described in the next section.
|
||||
|
||||
## Set up a Chat Bot
|
||||
GAM is capable of acting as a Chat Bot and sending messages to Chat Rooms or direct messages to users.
|
||||
|
||||
Even if you're not going to use GAM as a Chat Bot, you have to configure a Chat Bot as it is required by the Chat API in [Users - Chat](Users-Chat).
|
||||
|
||||
* Run the command `gam setup chat`; it will point you to a URL to configure your Chat Bot.
|
||||
* Enter an App name and Description of your choosing.
|
||||
* For the Avatar URL you can use `https://dummyimage.com/384x256/4d4d4d/0011ff.png&text=+GAM` or a public URL to an image of your own choosing.
|
||||
* In Functionality, uncheck both "Receive 1:1 messages" and "Join spaces and group conversations"
|
||||
* In Connection settings, choose "Cloud Pub/Sub" and enter `projects/<ProjectID>/topics/no-topic` for the Topic Name. Replace `<ProjectID>` with your GAM project ID. GAM doesn't yet listen to pub/sub so this option is not used.
|
||||
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
||||
* Click Save.
|
||||
|
||||
## API documentation
|
||||
* https://developers.google.com/chat/concepts
|
||||
* https://developers.google.com/chat/reference/rest
|
||||
@@ -102,19 +139,6 @@
|
||||
<ChatMessageFieldNameList> ::= "<ChatMessageFieldName>(,<ChatMessageFieldName>)*"
|
||||
```
|
||||
|
||||
## Set up a Chat Bot
|
||||
Since GAM 6.04.00, GAM is capable of acting as a Chat Bot and sending messages to Chat Rooms or direct messages to users. You first need to configure your Chat Bot.
|
||||
|
||||
* Run the command `gam setup chat`; it will point you to a URL to configure your Chat Bot.
|
||||
* Enter an App name and Description of your choosing.
|
||||
* For the Avatar URL you can use `https://dummyimage.com/384x256/4d4d4d/0011ff.png&text=+GAM` or a public URL to an image of your own choosing.
|
||||
* In Functionality, uncheck both "Receive 1:1 messages" and "Join spaces and group conversations"
|
||||
* In Connection settings, choose "Cloud Pub/Sub" and enter `projects/<ProjectID>/topics/no-topic` for the topic name. Replace `<ProjectID>` with your GAM project ID. GAM doesn't yet listen to pub/sub so this option is not used.
|
||||
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
||||
* Click Save.
|
||||
|
||||
----
|
||||
|
||||
## Display Rooms and Chats to which your Bot belongs
|
||||
Display the spaces to which your Chat Bot can send messages.
|
||||
A space can be a direct message to a user, a chat group or a chat room.
|
||||
|
||||
@@ -106,12 +106,14 @@ The second form is backwards compatible with Legacy GAM and selection with `<CrO
|
||||
autoupdatethrough|
|
||||
backlightinfo|
|
||||
bootmode|
|
||||
chromeostype|
|
||||
cpuinfo|
|
||||
cpustatusreports|
|
||||
deprovisionreason|
|
||||
devicefiles|
|
||||
deviceid|
|
||||
devicelicensetype|
|
||||
diskspaceusage|
|
||||
diskvolumereports|
|
||||
dockmacaddress|
|
||||
ethernetmacaddress|
|
||||
@@ -119,6 +121,7 @@ The second form is backwards compatible with Legacy GAM and selection with `<CrO
|
||||
extendedsupporteligible|
|
||||
extendedsupportstart|
|
||||
extendedsupportenabled|
|
||||
faninfo|
|
||||
firmwareversion|
|
||||
firstenrollmenttime|
|
||||
lastdeprovisiontimestamp|
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# Cloud Identity Devices
|
||||
- [Notes](#notes)
|
||||
- [API documentation](#api-documentation)
|
||||
- [Query documentation](#query-documentation)
|
||||
- [Definitions](#definitions)
|
||||
@@ -20,6 +21,15 @@
|
||||
- [Display device user client state](#display-device-user-client-state)
|
||||
- [Update device user client state](#update-device-user-client-state)
|
||||
|
||||
## Notes
|
||||
These commands use service account access with `admin_email` (if defined) from `gam.cfg` or
|
||||
the admin from `oauth2.txt` (specified in `gam oauth create`).
|
||||
|
||||
Use `gam user user@domain.com update serviceaccount` and make sure that the following is specified:
|
||||
```
|
||||
[*] 17) Cloud Identity Devices API (supports readonly)
|
||||
```
|
||||
|
||||
## API documentation
|
||||
* [Cloud Identity API - Devices](https://cloud.google.com/identity/docs/reference/rest/v1/devices)
|
||||
* [Cloud Identity API - Device Users](https://cloud.google.com/identity/docs/reference/rest/v1/devices.deviceUsers)
|
||||
@@ -200,7 +210,7 @@ gam print devices [todrive <ToDriveAttribute>*]
|
||||
<DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
|
||||
[orderby <DeviceOrderByFieldName> [ascending|descending]]
|
||||
[all|company|personal|nocompanydevices|nopersonaldevices]
|
||||
[nodeviceusers]
|
||||
[nodeviceusers|oneuserperrow]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, all devices are displayed; use the query options to limit the display.
|
||||
@@ -221,6 +231,9 @@ Select the view of devices to display:
|
||||
By default, Gam makes additional API calls to display the device users for the devices;
|
||||
use `nodeviceuser` to suppress making the additional calls.
|
||||
|
||||
By default, when device users are displayed, they are all displayed on one row;
|
||||
use `oneuserperrow` to have each of a device's users displayed on a separate row with all of the other device fields.
|
||||
|
||||
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
You can download and install the current GAM7 release from the [GitHub Releases](https://github.com/GAM-team/GAM/releases/latest) page.
|
||||
Choose one of the following:
|
||||
|
||||
## Executable, Automatic
|
||||
|
||||
* Executable Archive, Automatic, Linux/Mac OS/Google Cloud Shell/Raspberry Pi/ChromeOS
|
||||
- Start a terminal session and execute one of the following commands:
|
||||
- New install, default path `$HOME/bin`
|
||||
@@ -16,6 +18,12 @@ Choose one of the following:
|
||||
By default, a folder, `gam7`, is created in the default or specified path and the files are downloaded into that folder.
|
||||
Add the `-s` option to the end of the above commands to suppress creating the `gam7` folder; the files are downloaded directly into the default or specified path.
|
||||
|
||||
If, when executing one of the above commands, you get an error message stating that Python is not installed,
|
||||
go here [Python](https://www.python.org/downloads/) and download/install Python. When the installation is complete,
|
||||
start a new terminal session and reissue the command from above.
|
||||
|
||||
## Executable, Manual
|
||||
|
||||
* Executable Archive, Manual, Linux/Google Cloud Shell
|
||||
- `gam-7.wx.yz-linux-x86_64-glibc2.35.tar.xz`
|
||||
- `gam-7.wx.yz-linux-x86_64-glibc2.39.tar.xz`
|
||||
@@ -65,6 +73,8 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
||||
- Download the installer and run it.
|
||||
- Start a Command Prompt/PowerShell session.
|
||||
|
||||
## Source
|
||||
|
||||
* Source, all platforms
|
||||
- `Source code(zip)`
|
||||
- `Source code(tar.gz)`
|
||||
|
||||
@@ -10,6 +10,103 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
||||
|
||||
See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
|
||||
|
||||
### 7.07.17
|
||||
|
||||
Added option `oneuserperrow` to `gam print devices` to have each of a
|
||||
device's users displayed on a separate row with all of the other device fields.
|
||||
|
||||
### 7.07.16
|
||||
|
||||
Added `chromeostype`, `diskspaceusage` and `faninfo` to `<CrOSFieldName>` for use in `gam info|print cros`.
|
||||
|
||||
Fixed bugs/cleaned output in `gam info|print cros`.
|
||||
|
||||
### 7.07.15
|
||||
|
||||
Added option `shareddrivesoption included|included_if_account_is_not_a_member|not_included` to `gam create vaultexport`.
|
||||
|
||||
The previous option `includeshareddrives <Boolean>` is mapped as follows:
|
||||
* `includeshareddrives false` - `shareddrivesoption included_if_account_is_not_a_member`
|
||||
* `includeshareddrives true` - `shareddrivesoption included`
|
||||
|
||||
### 7.07.14
|
||||
|
||||
Update `gam setup chat` output to include the following that shows the actual Cloud Pub/Sub Topic Name.
|
||||
```
|
||||
You'll use projects/<ProjectID>/topics/no-topic in Connection settings Cloud Pub/Sub Topic Name
|
||||
```
|
||||
|
||||
### 7.07.13
|
||||
|
||||
Added option `showitemcountonly` to `gam [<UserTypeEntity>] print|show shareddrives` that causes GAM to display the
|
||||
number of Shared Drives on stdout; no CSV file is written.
|
||||
|
||||
### 7.07.12
|
||||
|
||||
Fixed bug in `gam print|show oushareddrives` that caused a trap.
|
||||
|
||||
Improved getting Shared Drive names from IDs when accessing Shared Drives in external workspaces.
|
||||
|
||||
### 7.07.11
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
ERROR: 400: badRequest - Bad Request
|
||||
```
|
||||
|
||||
Updated `gam <UserTypeEntity> move drivefile` to handle the following error:
|
||||
```
|
||||
ERROR: 400: shareOutNotPermitted
|
||||
```
|
||||
|
||||
### 7.07.10
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
ERROR: 400: eventTypeRestriction - Attendees cannot be added to 'fromGmail' event with this visibility setting.
|
||||
```
|
||||
|
||||
### 7.07.09
|
||||
|
||||
Updated `gam calendars <CalendarEntity> update events` and `gam <UserTypeEntity> update events <UserCalendarEntity>`
|
||||
to handle the following error:
|
||||
```
|
||||
gamlib.glgapi.serviceNotAvailable: Authentication backend unavailable.
|
||||
```
|
||||
|
||||
### 7.07.08
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print filelist ... countsonly` that issued an
|
||||
incorrect warning message like the following when `redirect csv <FileName> multiprocess` was specified.
|
||||
```
|
||||
WARNING: csv_output_row_filter column "^name$" does not match any output columns
|
||||
```
|
||||
|
||||
### 7.07.07
|
||||
|
||||
Fixed bug in `gam report <ActivityApplictionName> ... countsonly eventrowfilter` that issued an
|
||||
incorrect warning message like the following when `redirect csv <FileName> multiprocess` was specified.
|
||||
```
|
||||
WARNING: csv_output_row_filter column "^doc_title$" does not match any output columns
|
||||
```
|
||||
|
||||
### 7.07.06
|
||||
|
||||
Added option `eventrowfilter` to `gam calendars <CalendarEntity> print events ... countsonly`
|
||||
and `gam <UserTypeEntity> print events <UserCalendarEntity> ... countsonly` that causes
|
||||
GAM to apply `config csv_output_row_filter` to the event details rather than the event counts.
|
||||
This will be useful when `<EventSelectProperty>` and `<EventMatchProperty>` do not have the
|
||||
capabilty to select the events of interest; e.g., you want to filter based on the event `created` property.
|
||||
|
||||
Dropped the extraneous `id` column for `gam calendars <CalendarEntity> print events ... countsonly`
|
||||
and `gam <UserTypeEntity> print events <UserCalendarEntity> ... countsonly`.
|
||||
|
||||
### 7.07.05
|
||||
|
||||
Updated `gam <UserTypeEntity> move drivefile` to recognize the API error: `ERROR: 400: shareOutWarning`.
|
||||
|
||||
### 7.07.04
|
||||
|
||||
Updated `gam create vaultexport ... rooms <ChatSpaceList>` to strip `spaces/` from the Chat Space IDs.
|
||||
|
||||
@@ -335,6 +335,11 @@ gam update group group@domain.com whoCanViewMembership ALL_MEMBERS_CAN_VIEW whoC
|
||||
Group: group@domain.com, Updated
|
||||
```
|
||||
|
||||
If you are entering a valid combination but an error message is returned, do the following and then re-issue your command.
|
||||
```
|
||||
gam update group group@domain.com whoCanViewMembership ALL_IN_DOMAIN_CAN_VIEW whoCanDiscoverGroup ALL_IN_DOMAIN_CAN_DISCOVER
|
||||
```
|
||||
|
||||
## Manage groups
|
||||
|
||||
These commands allow you to create, update and delete groups.
|
||||
|
||||
@@ -251,10 +251,10 @@ writes the credentials into the file oauth2.txt.
|
||||
admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
||||
admin@server:/Users/admin$ gam version
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
MacOS Sequoia 15.4.1 x86_64
|
||||
MacOS Sequoia 15.5 x86_64
|
||||
Path: /Users/admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
|
||||
@@ -989,7 +989,7 @@ writes the credentials into the file oauth2.txt.
|
||||
C:\>del C:\GAMConfig\oauth2.txt
|
||||
C:\>gam version
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM - pythonsource
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM - pythonsource
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
Windows-10-10.0.17134 AMD64
|
||||
|
||||
@@ -12,8 +12,9 @@
|
||||
- [Delete a Shared Drive](#delete-a-shared-drive)
|
||||
- [Change Shared Drive visibility](#change-shared-drive-visibility)
|
||||
- [Display Shared Drives](#display-shared-drives)
|
||||
- [Display List of Shared Drives in an Organizational Unit other than /](#display-list-of-shared-drives-in-an-organizational-unit-other-than-)
|
||||
- [Display Shared Drive Counts](#display-shared-drive-counts)
|
||||
- [Display List of Shared Drives in an Organizational Unit](#display-list-of-shared-drives-in-an-organizational-unit)
|
||||
- [Display Count of Shared Drives in an Organizational Unit](#display-count-of-shared-drives-in-an-organizational-unit)
|
||||
- [Display all Shared Drives with no members](#display-all-shared-drives-with-no-members)
|
||||
- [Display all Shared Drives with no organizers](#display-all-shared-drives-with-no-organizers)
|
||||
- [Display all Shared Drives with a specific organizer](#display-all-shared-drives-with-a-specific-organizer)
|
||||
@@ -29,6 +30,7 @@
|
||||
- [Display ACLs for Shared Drives with all organizers outside of your domain](#display-acls-for-shared-drives-with-all-organizers-outside-of-your-domain)
|
||||
- [Display ACLs for Shared Drives with all ACLs outside of your domain](#display-acls-for-shared-drives-with-all-acls-outside-of-your-domain)
|
||||
- [Clean up scammed Shared Drives](#clean-up-scammed-shared-drives)
|
||||
- [Delete old empty Shared Drives](#delete-old-empty-shared-drives)
|
||||
|
||||
## API documentation
|
||||
* [Drive API - Drives](https://developers.google.com/drive/api/reference/rest/v3/drives)
|
||||
@@ -416,6 +418,36 @@ gam print teamdrives query "memberCount = 0"
|
||||
gam print teamdrives query "organizerCount = 0"
|
||||
```
|
||||
|
||||
## Display Shared Drive Counts
|
||||
Display the number of Shared Drives.
|
||||
```
|
||||
gam [<UserTypeEntity>] show|print shareddrives
|
||||
[adminaccess|asadmin] [teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
|
||||
showitemcountonly
|
||||
```
|
||||
By default, all Shared Drives are counted; use the following options to select a subset of Shared Drives:
|
||||
* `teamdriveadminquery|query <QueryTeamDrive>` - Use a query to select Shared Drives
|
||||
* `matchname <REMatchPattern>` - Retrieve Shared Drives with names that match a pattern.
|
||||
* `orgunit|org|ou <OrgUnitPath>` - Only Shared Drives in the specified Org Unit are selected
|
||||
|
||||
Example
|
||||
```
|
||||
$ gam print shareddrives showitemcountonly
|
||||
Getting all Shared Drives, may take some time on a large Google Workspace Account...
|
||||
Got 12 Shared Drives...
|
||||
12
|
||||
```
|
||||
The `Getting` and `Got` messages are written to stderr, the count is writtem to stdout.
|
||||
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam print shareddrives showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print shareddrives showitemcountonly
|
||||
```
|
||||
|
||||
## Display all Shared Drives with a specific organizer
|
||||
Substitute actual email address for `organizer@domain.com`.
|
||||
```
|
||||
@@ -428,18 +460,9 @@ Substitute actual email address for `organizer@domain.com`.
|
||||
gam config csv_output_header_filter "id,name" print teamdriveacls pm emailaddress organizer@domain.com role organizer em pma skip pmselect
|
||||
```
|
||||
|
||||
## Display List of Shared Drives in an Organizational Unit other than /
|
||||
Get the orgUnitID of OU / and use it (without the id:) in the print|show command. Adjust fields as desired.
|
||||
```
|
||||
gam info ou / nousers
|
||||
gam show teamdrives query "orgUnitId!='00gjdgxs2p9cxyz'" fields id,name,orgunit,createdtime
|
||||
gam print teamdrives query "orgUnitId!='00gjdgxs2p9cxyz'" fields id,name,orgunit,createdtime
|
||||
```
|
||||
|
||||
## Display List of Shared Drives in an Organizational Unit
|
||||
Get the orgUnitID of the desired OU and use it (without the id:) in the print|show command. Adjust fields as desired.
|
||||
```
|
||||
gam info ou <OrgUnitPath> nousers
|
||||
gam show teamdrives query "orgUnitId='03ph8a2z21rexy'" fields id,name,orgunit,createdtime
|
||||
gam print teamdrives query "orgUnitId='03ph8a2z21rexy'" fields id,name,orgunit,createdtime
|
||||
```
|
||||
@@ -453,6 +476,31 @@ gam print oushareddrives [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
|
||||
## Display Count of Shared Drives in an Organizational Unit
|
||||
```
|
||||
gam print|show oushareddrives
|
||||
[ou|org|orgunit <OrgUnitPath>]
|
||||
showitemcountonly
|
||||
```
|
||||
`<OrgUnitPath>` defaults to `"/"`.
|
||||
|
||||
Example
|
||||
```
|
||||
$ gam print oushareddrives showitemcountonly
|
||||
Getting all Shared Drives for /, may take some time on a large Organizational Unit...
|
||||
Got 9 Shared Drives for /...
|
||||
9
|
||||
```
|
||||
The `Getting` and `Got` messages are written to stderr, the count is writtem to stdout.
|
||||
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam print oushareddrives showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print oushareddrives showitemcountonly
|
||||
```
|
||||
|
||||
## Manage Shared Drive access
|
||||
These commands are used to manage the ACLs on Shared Drives themselves, not the files/folders on the Shared Drives.
|
||||
|
||||
@@ -744,3 +792,37 @@ This is not reversible, proceed with caution.
|
||||
```
|
||||
gam redirect stdout ./DeleteSharedDrives.txt multiprocess redirect stderr stdout csv ./SharedDriveACLsAllExternal.csv gam delete teamdrive "~id" allowitemdeletion
|
||||
```
|
||||
|
||||
## Delete old empty Shared Drives
|
||||
```
|
||||
# Get a list of Shared Drives created before one year ago; alter date<-1y as required
|
||||
gam config csv_output_row_filter "createdTime:date<-1y" redirect csv ./TeamDrives.csv print teamdrives fields id,name,createdtime
|
||||
|
||||
# You'll need a list of Shared Drive IDs and organizers; get ACLs for Shared Drives from above
|
||||
gam redirect csv ./TeamDriveACLs.csv multiprocess csv ./TeamDrives.csv gam print drivefileacls "~id" fields id,emailaddress,role,type,deleted
|
||||
|
||||
# Customize script: https://github.com/taers232c/GAM-Scripts3/blob/master/GetTeamDriveOrganizers.py
|
||||
DOMAIN_LIST = ['yourdomain.org']
|
||||
|
||||
INCLUDE_TYPES = {
|
||||
'user': True,
|
||||
'group': False,
|
||||
}
|
||||
|
||||
ONE_ORGANIZER = True
|
||||
SHOW_NO_ORGANIZER_DRIVES = True
|
||||
INCLUDE_FILE_ORGANIZERS = False
|
||||
|
||||
# Run script
|
||||
python GetTeamDriveOrganizers.py TeamDriveACLs.csv TeamDrives.csv TeamDriveOrganizers.csv
|
||||
|
||||
# Inspect TeamDriveOrganizers.csv, you'll have to deal with Shared Drives with no organizer/manager
|
||||
|
||||
# Get old empty Shared Drives
|
||||
gam config num_threads 10 csv_input_row_filter "organizers:regex:^.+$" csv_output_row_filter "Total:count=0" redirect csv ./OldEmptySharedDrives.csv multiprocess redirect stderr - multiprocess csv ./TeamDriveOrganizers.csv gam user "~organizers" print filecounts select teamdriveid "~id" showsize
|
||||
|
||||
# Inspect OldEmptySharedDrives.csv, if you're confident of the results, proceed
|
||||
|
||||
# Delete old empty Shared Drives
|
||||
gam redirect stdout ./DeleteOldEmptySharedDrives.txt multiprocess redirect stderr stdout csv ./OldEmptySharedDrives.csv gam user "~User" delete shareddrive "~id"
|
||||
```
|
||||
@@ -671,8 +671,9 @@ By default, Gam displays event details, use `countsonly` to display only the num
|
||||
|
||||
```
|
||||
gam <UserTypeEntity> print events <UserCalendarEntity> [<EventEntity>] <EventDisplayProperty>*
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly] [formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
[fields <EventFieldNameList>] [showdayofweek]
|
||||
[countsonly]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
||||
|
||||
@@ -688,6 +689,11 @@ By default, Gam displays the information as columns of fields; the following opt
|
||||
|
||||
By default, Gam displays event details, use `countsonly` to display only the number of events. `formatjson` does not apply in this case.
|
||||
|
||||
When `countsonly` is specified, the `eventrowfilter` option causes
|
||||
GAM to apply `config csv_output_row_filter` to the event details rather than the event counts.
|
||||
This will be useful when `<EventSelectProperty>` and `<EventMatchProperty>` do not have the
|
||||
capabilty to select the events of interest; e.g., you want to filter based on the event `created` property.
|
||||
|
||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||
|
||||
@@ -15,8 +15,6 @@
|
||||
- [Bulk Operations](#bulk-operations)
|
||||
|
||||
## Introduction
|
||||
These features were added in version 6.60.00.
|
||||
|
||||
To use these commands you must update your service account authorization.
|
||||
```
|
||||
gam user user@domain.com update serviceaccount
|
||||
@@ -46,8 +44,8 @@ Google requires that you have a Chat Bot configured in order to use the Chat API
|
||||
* Enter an App name and Description of your choosing.
|
||||
* For the Avatar URL you can use `https://dummyimage.com/384x256/4d4d4d/0011ff.png&text=+GAM` or a public URL to an image of your own choosing.
|
||||
* In Functionality, uncheck both "Receive 1:1 messages" and "Join spaces and group conversations"
|
||||
* In Connection settings, choose "Cloud Pub/Sub" and enter `projects/<ProjectID>/topics/no-topic` for the topic name. Replace `<ProjectID>` with your GAM project ID. GAM doesn't yet listen to pub/sub so this option is not used.
|
||||
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
||||
* In Connection settings, choose "Cloud Pub/Sub" and enter `projects/<ProjectID>/topics/no-topic` for the Topic Name. Replace `<ProjectID>` with your GAM project ID. GAM doesn't yet listen to pub/sub so this option is not used.
|
||||
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
||||
* Click Save.
|
||||
|
||||
## API documentation
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* [Drive API - Files](https://developers.google.com/drive/api/v3/reference/files)
|
||||
* [Move content to Shared Drives](https://support.google.com/a/answer/7374057)
|
||||
* [Shared Drive Limits](https://support.google.com/a/users/answer/7338880)
|
||||
* [Limited and Expansive Access](https://developers.google.com/workspace/drive/api/guides/limited-expansive-access)
|
||||
|
||||
## Definitions
|
||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
||||
@@ -115,6 +116,7 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[sendemailifrequired [<Boolean>]]
|
||||
[verifyorganizer [<Boolean>]]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
```
|
||||
The files/folders specified by `<DriveFileEntity>` are referred to as `source`, `target` refers to where those files are being copied.
|
||||
The files/folders specified by `<DriveFileEntity>` are referred to as `top`; when a folder is being copied recursively, the files/folders that it contains are referred as `sub`.
|
||||
@@ -499,6 +501,7 @@ gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileNam
|
||||
[retainsourcefolders [<Boolean>]]
|
||||
[sendemailifrequired [<Boolean>]]
|
||||
[verifyorganizer [<Boolean>]]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
```
|
||||
The files/folders specified by `<DriveFileEntity>` are referred to as `source`, `target` refers to where those files are being moved.
|
||||
The files/folders specified by `<DriveFileEntity>` are referred to as `top`; when a folder is being moved, the files/folders that it contains are referred as `sub`.
|
||||
@@ -659,7 +662,7 @@ When moving a folder you can use the `retainsourcefolders` option to cause GAM t
|
||||
Moving a Drive folder to a Shared Drive is not directly supported by the API; GAM has to make a copy of the folder on the Shared Drive and
|
||||
recursively adjust the files/folders within it to point to the new parent folder. Once the original folder is emptied, it is deleted unless `retainsourcefolders` is specified.
|
||||
|
||||
### Move content of a Shared Drive to another Shared Drive
|
||||
## Move content of a Shared Drive to another Shared Drive
|
||||
Suppose you have a source Shared Drive with ID 0AC_1AB with multiple files and folders, and want to move all of its content to the target Shared Drive with ID 0AE_9ZX.
|
||||
|
||||
The following command will change the parents of the top level files and folders from 0AC_1AB to 0AE_9ZX; the sub files and folders will move along with their top level folder.
|
||||
@@ -673,3 +676,19 @@ If you want the source Shared Drive with ID 0AC_1AB to be contained in a top lev
|
||||
```
|
||||
gam user user@domain.com move drivefile teamdriveid 0AC_1AB teamdriveparentid 0AE_9ZX
|
||||
```
|
||||
|
||||
### Inter-workspace moves
|
||||
Due to a restructuring, you want to move data from Shared Drive A in domaina.com to Shared Drive B in domainb.com.
|
||||
* Shared Drive A in domaina.com has the following unchecked: `Allow people outside of Domain A to access files`
|
||||
* Shared Drive B in domainb.com has the following checked: `Allow people outside of Domain B to access files`
|
||||
* `user@domaina.com` is a manager of both Shared Drives.
|
||||
|
||||
```
|
||||
$ gam user user@domaina move drivefile teamdriveid <SharedDriveAID> teamdriveparentid <SharedDriveBID> mergewithparent
|
||||
User: user@domaina.com, Move 1 Drive File/Folder
|
||||
User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Move(Merge) contents with Drive Folder: Shared Drive B(<SharedDriveBID>)
|
||||
User: user@domaina.com, Drive File: Filename(<FileID>), Move Failed: Bad Request. User message: "shareOutNotPermitted"
|
||||
...
|
||||
User: user@domaina.com, Drive Folder: Shared Drive A(<SharedDriveAID>), Retained
|
||||
```
|
||||
To get this to work, you must check `Allow people outside of Domain A to access files` on Shared Drive A in domaina.com
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* [Shared Drive Limits](https://support.google.com/a/users/answer/7338880)
|
||||
* [My Drive Shared Drive API differences](https://developers.google.com/drive/api/v3/shared-drives-diffs)
|
||||
* [Google Docs API](https://developers.google.com/docs/api/reference/rest)
|
||||
* [Limited Access](https://workspaceupdates.googleblog.com/2025/02/updating-access-experience-in-google-drive.html)
|
||||
* [Limited and Expansive Access](https://developers.google.com/workspace/drive/api/guides/limited-expansive-access)
|
||||
|
||||
## Definitions
|
||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
## API documentation
|
||||
* [Drive API - Files](https://developers.google.com/drive/api/v3/reference/files)
|
||||
* [Limited and Expansive Access](https://developers.google.com/workspace/drive/api/guides/limited-expansive-access)
|
||||
|
||||
## Definitions
|
||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
||||
@@ -60,6 +61,7 @@ Use [Users - Drive - Transfer](Users-Drive-Transfer) for more complex ownership
|
||||
```
|
||||
gam <UserTypeEntity> transfer ownership <DriveFileEntity> <UserItem>
|
||||
[<DriveFileParentAttribute>] [includetrashed] [norecursion [<Boolean>]]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
(orderby <DriveOrderByFieldName> [ascending|descending])*
|
||||
[preview] [filepath] [pathdelimiter <Character>] [buildtree] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
@@ -99,6 +101,7 @@ gam <UserTypeEntity> claim ownership <DriveFileEntity>
|
||||
[skipids <DriveFileEntity>] [onlyusers|skipusers <UserTypeEntity>] [subdomains <DomainNameEntity>]
|
||||
[restricted [<Boolean>]] [writerscanshare|writerscantshare [<Boolean>]]
|
||||
[keepuser | (retainrole reader|commenter|writer|editor|none)] [noretentionmessages]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
(orderby <DriveOrderByFieldName> [ascending|descending])*
|
||||
[preview] [filepath] [pathdelimiter <Character>] [buildtree] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
|
||||
@@ -7,12 +7,14 @@
|
||||
- [Manage file permissions/sharing](#manage-file-permissionssharing)
|
||||
- [Display file permissions/sharing](#display-file-permissionssharing)
|
||||
- [Delete all ACLs except owner from a file](#delete-all-acls-except-owner-from-a-file)
|
||||
- [Delete all ACLs except owner from a user's My Drive](#delete-all-acls-except-owner-from-a-users-my-drive)
|
||||
- [Change shares to User1 to shares to User2](#change-shares-to-user1-to-shares-to-user2)
|
||||
- [Map All ACLs from an old domain to a new domain](#map-all-acls-from-an-old-domain-to-a-new-domain)
|
||||
|
||||
## API documentation
|
||||
* [Drive API - Permissions](https://developers.google.com/drive/api/v3/reference/permissions)
|
||||
* [Shortcuts](https://developers.google.com/drive/api/guides/shortcuts)
|
||||
* [Limited and Expansive Access](https://developers.google.com/workspace/drive/api/guides/limited-expansive-access)
|
||||
|
||||
## Definitions
|
||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
||||
@@ -196,7 +198,7 @@ By default, when an ACL is created, GAM outputs details of the ACL as indented k
|
||||
```
|
||||
gam <UserTypeEntity> update drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
||||
(role <DriveFileACLRole>) [expiration <Time>] [removeexpiration [<Boolean>]]
|
||||
[updatesheetprotectedranges [<Boolean>]]
|
||||
[updatesheetprotectedranges [<Boolean>]] [enforceexpansiveaccess [<Boolean>]]
|
||||
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
||||
```
|
||||
There is no change of parents when a new user is updated to be a file's owner.
|
||||
@@ -222,7 +224,7 @@ By default, when an ACL is updated, GAM outputs details of the ACL as indented k
|
||||
### Delete
|
||||
```
|
||||
gam <UserTypeEntity> delete|del drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
||||
[updatesheetprotectedranges [<Boolean>]]
|
||||
[updatesheetprotectedranges [<Boolean>]] [enforceexpansiveaccess [<Boolean>]]
|
||||
[showtitles]
|
||||
```
|
||||
The option `updatesheetprotectedranges` only applies to items in `<DriveFileEntity>` that are Google Sheets.
|
||||
@@ -262,6 +264,7 @@ When adding permissions from JSON data, permissions with `deleted` true are neve
|
||||
```
|
||||
gam <UserTypeEntity> delete permissions <DriveFileEntity> <DriveFilePermissionIDEntity>
|
||||
<PermissionMatch>* [<PermissionMatchAction>]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
```
|
||||
When deleting permissions from JSON data, permissions with role `owner` true are never processed.
|
||||
|
||||
@@ -316,13 +319,23 @@ gam redirect csv ./TeamDriveACLs.csv multiprocess csv ./TeamDrives.csv gam print
|
||||
## Delete all ACLs except owner from a file
|
||||
Get the current ACLs.
|
||||
```
|
||||
gam redirect csv ./Permissions.csv user <UserItem> print drivefileacls <DriveFileID> oneitemperrow
|
||||
gam redirect csv ./Permissions.csv user user@domain.com print drivefileacls <DriveFileID> oneitemperrow
|
||||
```
|
||||
Inspect Permissions.csv, verify that you want to proceed.
|
||||
```
|
||||
gam config csv_input_row_drop_filter "permission.role:regex:(owner)|(organizer)" csv ./Permissions.csv gam user "~Owner" delete drivefileacl "~id" "id:~~permission.id~~"
|
||||
```
|
||||
|
||||
## Delete all ACLs except owner from a user's My Drive
|
||||
Get the current ACLs.
|
||||
```
|
||||
gam redirect csv ./Permissions.csv user user@domain.com print filelist fields id,name,mimetype,basicpermissions pm not role owner em pmfilter oneitemperrow
|
||||
```
|
||||
Inspect Permissions.csv, verify that you want to proceed.
|
||||
```
|
||||
gam redirect stdout ./DeletePermissions.txt multiprocess redirect stderr stdout csv Permissions.csv.csv gam user "~Owner" delete drivefileacls "~id" "id:~~permission.id~~"
|
||||
```
|
||||
|
||||
## Change shares to User1 to shares to User2
|
||||
```
|
||||
# Get files shared to User1
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
* [Drive API - Files](https://developers.google.com/drive/api/v3/reference/files)
|
||||
* [Shortcuts](https://developers.google.com/drive/api/guides/shortcuts)
|
||||
* [Prepare account for transfer](https://support.google.com/a/answer/1247799)
|
||||
* [Limited and Expansive Access](https://developers.google.com/workspace/drive/api/guides/limited-expansive-access)
|
||||
|
||||
## Definitions
|
||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
||||
@@ -47,6 +48,7 @@ gam <UserTypeEntity> transfer drive <UserItem> [select <DriveFileEntity>]
|
||||
[noretentionmessages]
|
||||
[nonowner_retainrole reader|commenter|writer|editor|contentmanager|fileorganizer|current|none]
|
||||
[nonowner_targetrole reader|commenter|writer|editor|contentmanager|fileorganizer|current|none|source]
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
(orderby <DriveFileOrderByFieldName> [ascending|descending])*
|
||||
[preview] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
# Users - Gmail - Delegates
|
||||
- [Notes](#notes)
|
||||
- [API documentation](#api-documentation)
|
||||
- [Definitions](#definitions)
|
||||
- [Aliases](#aliases)
|
||||
@@ -8,6 +9,11 @@
|
||||
- [Display Gmail delegates](#display-gmail-delegates)
|
||||
- [Delete all delegates for a user](#delete-all-delegates-for-a-user)
|
||||
|
||||
## Notes
|
||||
|
||||
To use Gmail delegation, the delegator and delagatee must be in org units where
|
||||
mail delegation is enabled. In the admin console, go to Apps/Google Workspace/Gmail/User Settings.
|
||||
|
||||
## API documentation
|
||||
* [Gmail API - Delegates](https://developers.google.com/gmail/api/v1/reference/users.settings.delegates)
|
||||
* [Delegation Notes](https://support.google.com/a/answer/7223765)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
- [Delete a Shared Drive](#delete-a-shared-drive)
|
||||
- [Change Shared Drive visibility](#change-shared-drive-visibility)
|
||||
- [Display Shared Drives](#display-shared-drives)
|
||||
- [Display Shared Drive Counts](#display-shared-drive-counts)
|
||||
- [Manage Shared Drive access](#manage-shared-drive-access)
|
||||
- [Display Shared Drive access](#display-shared-drive-access)
|
||||
- [Display Shared Drive access for specific Shared Drives](#display-shared-drive-access-for-specific-shared-drives)
|
||||
@@ -356,6 +357,35 @@ When using the `formatjson` option, double quotes are used extensively in the da
|
||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||
|
||||
## Display Shared Drive Counts
|
||||
Display the number of Shared Drives.
|
||||
```
|
||||
gam <UserTypeEntity> show|print shareddrives
|
||||
[teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <REMatchPattern>] [orgunit|org|ou <OrgUnitPath>]
|
||||
showitemcountonly
|
||||
```
|
||||
By default, all Shared Drives are counted; use the following options to select a subset of Shared Drives:
|
||||
* `teamdriveadminquery|query <QueryTeamDrive>` - Use a query to select Shared Drives
|
||||
* `matchname <REMatchPattern>` - Retrieve Shared Drives with names that match a pattern.
|
||||
* `orgunit|org|ou <OrgUnitPath>` - Only Shared Drives in the specified Org Unit are selected
|
||||
|
||||
Example
|
||||
```
|
||||
$ gam user user@domain.com print shareddrives showitemcountonly
|
||||
Getting all Shared Drives for user@domain.com
|
||||
Got 4 Shared Drives for user@domain.com ...
|
||||
4
|
||||
```
|
||||
The `Getting` and `Got` messages are written to stderr, the count is writtem to stdout.
|
||||
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam user user@domain.com print shareddrives showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam user user@domain.com print shareddrives showitemcountonly
|
||||
```
|
||||
## Manage Shared Drive access
|
||||
These commands must be issued by a user with Shared Drive permission role organizer.
|
||||
### Process single ACLs.
|
||||
|
||||
@@ -243,7 +243,8 @@ gam create vaultexport|export matter <MatterItem> [name <String>] corpus calenda
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>] [timezone <TimeZone>]
|
||||
[locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
|
||||
[responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
|
||||
[includeshareddrives <Boolean>] [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
||||
[(includeshareddrives <Boolean>)|(shareddrivesoption included|included_if_account_is_not_a_member|not_included)]
|
||||
[driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
||||
[driveclientsideencryption any|encrypted|unencrypted]
|
||||
[includerooms <Boolean>]
|
||||
[excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
|
||||
@@ -315,8 +316,11 @@ For `corpus calendar`, you can specify the format of the exported data:
|
||||
|
||||
For `corpus drive`, you can specify advanced search options:
|
||||
* `driveversiondate <Date>|<Time>` - Search the versions of the Drive file as of the reference date. These timestamps are in GMT and rounded down to the given date.
|
||||
* `includeshareddrives False` - Do not include Shared Drives in the search, this is the default.
|
||||
* `includeshareddrives True` - Include Shared Drives in the search.
|
||||
* `includeshareddrives False` - Mapped to `sharedrivesoption included_if_account_is_not_a_member`
|
||||
* `includeshareddrives True` - Mapped to `sharedrivesoption included`
|
||||
* `sharedrivesoption included` - Resources in shared drives are included in the search
|
||||
* `sharedrivesoption included_if_account_is_not_a_member` - Resources in shared drives where account is not a member are included in the search, this is the default
|
||||
* `sharedrivesoption not_included` - Resources in shared drives are not included in the search
|
||||
* `driveclientsideencryption any` - Include both client-side encrypted and unencrypted content in search, this is the default.
|
||||
* `driveclientsideencryption encrypted` - Include client-side encrypted content only in search.
|
||||
* `driveclientsideencryption unencrypted` - Include client-side unencrypted content only in search.
|
||||
@@ -599,7 +603,7 @@ gam create vaulthold|hold matter <MatterItem> [name <String>] corpus calendar|dr
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
|
||||
[includerooms <Boolean>]
|
||||
[covereddata calllogs|textmessages|voicemails]
|
||||
[includeshareddrives|includeteamdrives <Boolean>]
|
||||
[includeshareddrives <Boolean>]
|
||||
[showdetails|returnidonly]
|
||||
```
|
||||
Specify the name of the hold:
|
||||
@@ -621,8 +625,8 @@ Specify the search method, this option is required:
|
||||
The `query <QueryVaultCorpus>` option can still be used but it is much simpler to use the following options.
|
||||
|
||||
For `corpus drive`, you can specify advanced search options:
|
||||
* `includeshareddrives False` - Do not include Shared Drives in the search, this is the default.
|
||||
* `includeshareddrives True` - Include Shared Drives in the search.
|
||||
* `includeshareddrives False` - Files in shared drives are not included in the hold, this is the default
|
||||
* `includeshareddrives True` - Files in shared drives are included in the hold
|
||||
|
||||
For `corpus mail`, you can specify search terms to limit the search.
|
||||
* `terms <String>` - [Vault search](https://support.google.com/vault/answer/2474474)
|
||||
@@ -652,12 +656,12 @@ gam update vaulthold|hold <HoldItem> matter <MatterItem>
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>]
|
||||
[includerooms <Boolean>]
|
||||
[covereddata calllogs|textmessages|voicemails]
|
||||
[includeshareddrives|includeteamdrives <Boolean>]
|
||||
[includeshareddrives <Boolean>]
|
||||
[showdetails]
|
||||
```
|
||||
For a hold with `corpus drive`, you can specify advanced search options:
|
||||
* `includeshareddrives False` - Do not include Shared Drives in the search, this is the default.
|
||||
* `includeshareddrives True` - Include Shared Drives in the search.
|
||||
* `includeshareddrives False` - Files in shared drives are not included in the hold, this is the default
|
||||
* `includeshareddrives True` - Files in shared drives are included in the hold
|
||||
|
||||
For a hold with `corpus mail`, you can specify search terms to limit the search.
|
||||
* `terms <String>` - [Vault search](https://support.google.com/vault/answer/2474474)
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
Print the current version of Gam with details
|
||||
```
|
||||
gam version
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
MacOS Sequoia 15.4.1 x86_64
|
||||
MacOS Sequoia 15.5 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
@@ -15,10 +15,10 @@ Time: 2023-06-02T21:10:00-07:00
|
||||
Print the current version of Gam with details and time offset information
|
||||
```
|
||||
gam version timeoffset
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
MacOS Sequoia 15.4.1 x86_64
|
||||
MacOS Sequoia 15.5 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Your system time differs from www.googleapis.com by less than 1 second
|
||||
@@ -27,10 +27,10 @@ Your system time differs from www.googleapis.com by less than 1 second
|
||||
Print the current version of Gam with extended details and SSL information
|
||||
```
|
||||
gam version extended
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
MacOS Sequoia 15.4.1 x86_64
|
||||
MacOS Sequoia 15.5 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Version Check:
|
||||
Current: 5.35.08
|
||||
Latest: 7.07.04
|
||||
Latest: 7.07.17
|
||||
echo $?
|
||||
1
|
||||
```
|
||||
@@ -72,7 +72,7 @@ echo $?
|
||||
Print the current version number without details
|
||||
```
|
||||
gam version simple
|
||||
7.07.04
|
||||
7.07.17
|
||||
```
|
||||
In Linux/MacOS you can do:
|
||||
```
|
||||
@@ -82,10 +82,10 @@ echo $VER
|
||||
Print the current version of Gam and address of this Wiki
|
||||
```
|
||||
gam help
|
||||
GAM 7.07.04 - https://github.com/GAM-team/GAM
|
||||
GAM 7.07.17 - https://github.com/GAM-team/GAM
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.13.3 64-bit final
|
||||
MacOS Sequoia 15.4.1 x86_64
|
||||
MacOS Sequoia 15.5 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
|
||||
@@ -287,7 +287,7 @@ csv_output_users_audit
|
||||
Default: False
|
||||
customer_id
|
||||
Google Customer ID
|
||||
Default: Blank
|
||||
Default: my_customer
|
||||
Environment variable: CUSTOMER_ID
|
||||
debug_level
|
||||
If debug_level > 0, turn on API debugging output.
|
||||
@@ -321,7 +321,7 @@ drive_v3_native_names
|
||||
email_batch_size
|
||||
When archiving, printing, showing, trashing, untrashing, marking as spam Gmail messages.
|
||||
how many should be processed in each batch
|
||||
Default: 100
|
||||
Default: 50
|
||||
Range: 1 - 100
|
||||
enable_dasa
|
||||
Enable/disable Delegated Admin Service Account API Access
|
||||
@@ -384,7 +384,7 @@ message_batch_size
|
||||
message_max_results
|
||||
When retrieving lists of Gmail messages from API,
|
||||
how many should be retrieved in each API call
|
||||
Default: 1000
|
||||
Default: 500
|
||||
Range: 1 - 10000
|
||||
mobile_max_results
|
||||
When retrieving lists of Mobile devices from API,
|
||||
@@ -416,8 +416,10 @@ no_short_urls
|
||||
the shortened URL redirects to the long URL.
|
||||
When True, the long scopes URLs in `gam oauth create` and
|
||||
`gam <UserTypeEntity> check|update serviceaccount` will be used as is.
|
||||
Default: True
|
||||
no_verify_ssl
|
||||
Disable SSL certificate validation
|
||||
Default: False
|
||||
num_tbatch_threads
|
||||
Number of threads for gam tbatch
|
||||
Default: 2
|
||||
|
||||
Reference in New Issue
Block a user