mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-22 15:11:37 +00:00
Compare commits
13 Commits
20240708.2
...
20240721.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
19304f95e8 | ||
|
|
5b49b8c957 | ||
|
|
f1e599d535 | ||
|
|
752b502399 | ||
|
|
8e3d562830 | ||
|
|
5b6c7a30d7 | ||
|
|
5b7e8b6e01 | ||
|
|
8bd30af109 | ||
|
|
828b196414 | ||
|
|
83117a1eca | ||
|
|
bb65265930 | ||
|
|
14ea845aa3 | ||
|
|
c1bb4bf7fa |
@@ -347,7 +347,7 @@ If none of the following options are selected, all events are selected.
|
||||
* `<EventSelectProperty>* <EventMatchProperty>*` - Properties used to select events
|
||||
|
||||
The Google Calendar API processes `<EventSelectProperty>*`; you may specify none or multiple properties.
|
||||
* `after|starttime|timemin <Time>` - Lower bound (inclusive) for an event's end time to filter by. If timeMax is set, timeMin must be smaller than timeMax.
|
||||
* `after|starttime|timemin <Time>` - Lower bound (exclusive) for an event's end time to filter by. If timeMax is set, timeMin must be smaller than timeMax.
|
||||
* `before|endtime|timemax <Time>` - Upper bound (exclusive) for an event's start time to filter by. If timeMin is set, timeMax must be greater than timeMin.
|
||||
* `eventtypes <EventTypeList>` - Select events based on their type.
|
||||
* `query <QueryCalendar>` - Free text search terms to find events that match these terms in any field, except for extended properties
|
||||
|
||||
@@ -5,8 +5,10 @@
|
||||
- [Promote a domain to be primary](#promote-a-domain-to-be-primary)
|
||||
- [Delete a domain](#delete-a-domain)
|
||||
- [Display domains](#display-domains)
|
||||
- [Display domains count](#display-domains-count)
|
||||
- [Create and delete domain aliases](#create-and-delete-domain-aliases)
|
||||
- [Display domain aliases](#display-domain-aliases)
|
||||
- [Display domain aliases count](#display-domain-aliases-count)
|
||||
|
||||
## API documentation
|
||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/domains
|
||||
@@ -30,15 +32,18 @@ gam delete domain <DomainName>
|
||||
```
|
||||
## Display domains
|
||||
```
|
||||
gam info domain [<DomainName>] [formatjson]
|
||||
gam show domains [formatjson]
|
||||
gam info domain [<DomainName>]
|
||||
[formatjson]
|
||||
gam show domains
|
||||
[formatjson]
|
||||
```
|
||||
For `info`, if `<DomainName>` is omitted, information about the primary domain will be displayed.
|
||||
|
||||
By default, Gam displays the information as an indented list of keys and values.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
```
|
||||
gam print domains [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]
|
||||
gam print domains [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, Gam displays the information as columns of fields.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
@@ -49,6 +54,13 @@ 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 domains count
|
||||
Display the number of domains.
|
||||
```
|
||||
gam print|show domains
|
||||
showitemcountonly
|
||||
```
|
||||
|
||||
## Create and delete domain aliases
|
||||
```
|
||||
gam create domainalias|aliasdomain <DomainAlias> <DomainName>
|
||||
@@ -56,13 +68,16 @@ gam delete domainalias|aliasdomain <DomainAlias>
|
||||
```
|
||||
## Display domain aliases
|
||||
```
|
||||
gam info domainalias|aliasdomain <DomainAlias> [formatjson]
|
||||
gam show domainaliases|aliasdomains [formatjson] [formatjson [quotechar <Character>]]
|
||||
gam info domainalias|aliasdomain <DomainAlias>
|
||||
[formatjson]
|
||||
gam show domainaliases|aliasdomains
|
||||
[formatjson]
|
||||
```
|
||||
By default, Gam displays the information as an indented list of keys and values.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
```
|
||||
gam print domainaliases|aliasdomains [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]
|
||||
gam print domainaliases|aliasdomains [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, Gam displays the information as columns of fields.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
@@ -73,3 +88,9 @@ 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 domain aliases count
|
||||
Display the number of domain aliases.
|
||||
```
|
||||
gam print|show domainaliases|aliasdomains
|
||||
showitemcountonly
|
||||
```
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# Downloads
|
||||
You can download the current GAMADV-XTD3 release from the [GitHub Releases](https://github.com/taers232c/GAMADV-XTD3/releases) page. Choose one of the following:
|
||||
# Downloads-Installs
|
||||
You can download and install the current GAMADV-XTD3 release from the [GitHub Releases](https://github.com/taers232c/GAMADV-XTD3/releases) page. Choose one of the following:
|
||||
|
||||
* Executable Archive, Automatic, Linux/Mac OS/Google Cloud Shell/Raspberry Pi/ChromeOS
|
||||
- Start a terminal session and execute one of the following commands:
|
||||
@@ -23,52 +23,42 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.19.tar.xz`
|
||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-legacy.tar.xz`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
- Start a terminal session.
|
||||
|
||||
* Executable Archive, Manual, Raspberry Pi/ChromeOS ARM devices
|
||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.31.tar.xz`
|
||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.27.tar.xz`
|
||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.23.tar.xz`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
- Start a terminal session.
|
||||
|
||||
* Executable Archive, Manual, Mac OS versions Big Sur, Monterey, Ventura - M1/M2
|
||||
- `gamadv-xtd3-6.wx.yz-macos-arm64.tar.xz`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
- Start a terminal session.
|
||||
|
||||
* Executable Archive, Manual, Mac OS, versions Big Sur, Monterey, Ventura - Intel
|
||||
- `gamadv-xtd3-6.wx.yz-macos-x86_64.tar.xz`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
|
||||
* Executable Archive, Manual, Mac OS, versions prior to Big Sur
|
||||
- `gamadv-xtd3-6.wx.yz-macos-x86_64-legacy.tar`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
- Start a terminal session.
|
||||
|
||||
* Executable Archive, Manual, Windows 64 bit
|
||||
- `gamadv-xtd3-6.wx.yz-windows-x86_64.zip`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
- Start a Command Prompt/PowerShell session.
|
||||
|
||||
* Executable Installer, Manual, Windows 64 bit
|
||||
- `gamadv-xtd3-6.wx.yz-windows-x86_64.msi`
|
||||
- Download the installer and run it.
|
||||
- Start a Command Prompt/PowerShell session and cd to the install directory.
|
||||
|
||||
* Executable Archive, Manual, Windows 32 bit
|
||||
- `gamadv-xtd3-6.wx.yz-windows-x86.zip`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal session and cd to the install directory.
|
||||
|
||||
* Executable Installer, Manual, Windows 32 bit
|
||||
- `gamadv-xtd3-6.wx.yz-windows-x86.msi`
|
||||
- Download the installer and run it.
|
||||
- Start a Command Prompt/PowerShell session and cd to the install directory.
|
||||
- Start a Command Prompt/PowerShell session.
|
||||
|
||||
* Winget
|
||||
- `winget install taers232c.GAMADV-XTD3 --location C:\GAMADV-XTD3`
|
||||
- Specify an alternate location if desired
|
||||
- Start a Command Prompt/PowerShell session.
|
||||
|
||||
* Source, all platforms
|
||||
- `Source code(zip)`
|
||||
- `Source code(tar.gz)`
|
||||
- Download the archive, extract the contents into some directory.
|
||||
- Start a terminal/Command Prompt/PowerShell session and cd to the install directory.
|
||||
- Start a terminal/Command Prompt/PowerShell session.
|
||||
@@ -32,6 +32,7 @@ ENTITY_IS_A_USER_ALIAS_RC = 21
|
||||
ENTITY_IS_A_GROUP_RC = 22
|
||||
ENTITY_IS_A_GROUP_ALIAS_RC = 23
|
||||
ENTITY_IS_AN_UNMANAGED_ACCOUNT_RC = 24
|
||||
ORGUNIT_NOT_EMPTY_RC = 25
|
||||
CHECK_USER_GROUPS_ERROR_RC = 29
|
||||
ORPHANS_COLLECTED_RC = 30
|
||||
# Warnings/Errors
|
||||
@@ -61,4 +62,14 @@ TARGET_DRIVE_SPACE_ERROR_RC = 74
|
||||
USER_REQUIRED_TO_CHANGE_PASSWORD_ERROR_RC = 75
|
||||
USER_SUSPENDED_ERROR_RC = 76
|
||||
NO_CSV_DATA_TO_UPLOAD_RC = 77
|
||||
NO_SA_ACCESS_CONTEXT_MANAGER_EDITOR_ROLE_RC = 78
|
||||
ACCESS_POLICY_ERROR_RC = 79
|
||||
YUBIKEY_CONNECTION_ERROR_RC = 80
|
||||
YUBIKEY_INVALID_KEY_TYPE_RC = 81
|
||||
YUBIKEY_INVALID_SLOT_RC = 82
|
||||
YUBIKEY_INVALID_PIN_RC = 83
|
||||
YUBIKEY_APDU_ERROR_RC = 84
|
||||
YUBIKEY_VALUE_ERROR_RC = 85
|
||||
YUBIKEY_MULTIPLE_CONNECTED_RC = 86
|
||||
YUBIKEY_NOT_FOUND_RC = 87
|
||||
```
|
||||
|
||||
@@ -8,7 +8,58 @@ Automatic update to the latest version on Linux/Mac OS/Google Cloud Shell/Raspbe
|
||||
By default, a folder, `gamadv-xtd3`, 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 `gamadv-xtd3` folder; the files are downloaded directly into the default or specified path.
|
||||
|
||||
See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation
|
||||
See [Downloads-Installs](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads-Installs) for Windows or other options, including manual installation
|
||||
|
||||
### 6.78.00
|
||||
|
||||
Added command to check if an OU contains items; this is useful when tryng to delete an OU
|
||||
as it must not contain any items in order to be deleted.
|
||||
|
||||
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/Organizational-Units#check-organizational-unit-for-contained-items
|
||||
|
||||
### 6.77.18
|
||||
|
||||
Added option `showitemcountonly` to `gam print domainaliases` that causes GAM to display the
|
||||
number of domain aliasess on stdout; no CSV file is written.
|
||||
|
||||
### 6.77.17
|
||||
|
||||
Added option `showitemcountonly` to `gam print domains` that causes GAM to display the
|
||||
number of domains on stdout; no CSV file is written.
|
||||
|
||||
### 6.77.16
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print filelist` that caused a trap.
|
||||
|
||||
### 6.77.15
|
||||
|
||||
Updated `gam calendars <CalendarEntity> import event icaluid <iCalUID> json <JSONdata>` to handle API
|
||||
constraints on recurring events.
|
||||
|
||||
### 6.77.14
|
||||
|
||||
Fixed bug in `gam calendars <CalendarEntity> import event icaluid <iCalUID> json <JSONdata>` that caused an error.
|
||||
|
||||
### 6.77.13
|
||||
|
||||
Updated `gam <UserTypeEntity> print|show filecounts` to reflect that Shared Drives now
|
||||
have a capacity of 500000 files/folders/shortcuts.
|
||||
|
||||
|
||||
### 6.77.12
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print chatspaces todrive` that caused an error.
|
||||
|
||||
### 6.77.11
|
||||
|
||||
Added option `convertmbtogb` to `gam report usage customer|user` and
|
||||
`gam report customer|user` that causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
### 6.77.10
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> get profilephoto` where data written to stdout, e.g. `> filename`,
|
||||
was not properly base64 encoded.
|
||||
|
||||
### 6.77.09
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ To run all commands properly, GAMADV-XTD3 requires three things:
|
||||
Use these steps if you have never used any version of GAM in your domain. They will create a GAM project
|
||||
and all necessary authentications.
|
||||
|
||||
* Download: [Downloads](Downloads)
|
||||
* Download: [Downloads-Installs](Downloads-Installs)
|
||||
* Configuration: [GAM Configuration](gam.cfg)
|
||||
* Install: [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
||||
|
||||
@@ -47,7 +47,7 @@ and all necessary authentications.
|
||||
Use these steps if you have used any version of GAM in your domain. They will update your GAM project
|
||||
and all necessary authentications.
|
||||
|
||||
* Download: [Downloads](Downloads)
|
||||
* Download: [Downloads-Installs](Downloads-Installs)
|
||||
* Configuration: [GAM Configuration](gam.cfg)
|
||||
* Upgrade: [How to Upgrade from Standard GAM](How-to-Upgrade-from-Standard-GAM)
|
||||
|
||||
@@ -56,7 +56,7 @@ Use these steps if you already use GAMADV-X or GAMADV-XTD or GAMADV-XTD3. The up
|
||||
or authentications because new features have been included.
|
||||
|
||||
* Updates: [GAM Updates]
|
||||
* Download: [Downloads](Downloads)
|
||||
* Download: [Downloads-Installs](Downloads-Installs)
|
||||
|
||||
You can install multiple versions of GAM and GAMADV-XTD3 in different parallel directories.
|
||||
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
Use these steps if you have never used any version of GAM in your domain. They will create your GAM project
|
||||
and all necessary authentications.
|
||||
|
||||
- [Downloads](Downloads)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
- [Downloads-Installs](Downloads-Installs)
|
||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
||||
- [Windows](#windows)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
|
||||
## Linux and MacOS and Google Cloud Shell
|
||||
|
||||
@@ -25,6 +25,11 @@ probably want to select a non-hidden location. This example assumes that the GAM
|
||||
configuration directory will be /Users/admin/GAMConfig; If you've chosen another directory,
|
||||
substitute that value in the directions.
|
||||
|
||||
Make the directory:
|
||||
```
|
||||
mkdir -p /Users/admin/GAMConfig
|
||||
```
|
||||
|
||||
Add the following line:
|
||||
```
|
||||
export GAMCFGDIR="/Users/admin/GAMConfig"
|
||||
@@ -37,14 +42,7 @@ to one of these files based on your shell:
|
||||
~/.profile
|
||||
```
|
||||
|
||||
You need to enable this setting in the environment. The easiest way is probably to close your terminal and open a new session. This will load the environment variables, including the one you just added. Test this by issuing this command:
|
||||
```
|
||||
echo $GAMCFGDIR
|
||||
```
|
||||
|
||||
This should print the name of the directory you used above.
|
||||
|
||||
Alternatively, without starting a new session, load the new variable in this session directly: issue the following command replacing `<Filename>` with the name of the file you edited:
|
||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
||||
```
|
||||
source <Filename>
|
||||
```
|
||||
@@ -54,11 +52,6 @@ You need to make sure the GAM configuration directory actually exists. Test that
|
||||
ls -l $GAMCFGDIR
|
||||
```
|
||||
|
||||
If this gives you an error, make the directory:
|
||||
```
|
||||
mkdir -p $GAMCFGDIR
|
||||
```
|
||||
|
||||
### Set a working directory
|
||||
|
||||
You should establish a GAM working directory; you will store your GAM related
|
||||
@@ -66,7 +59,11 @@ data in this folder and execute GAM commands from this folder. You should not us
|
||||
/Users/admin/bin/gamadv-xtd3 or /Users/admin/GAMConfig for this purpose.
|
||||
This example assumes that the GAM working directory will be /Users/admin/GAMWork; If you've chosen
|
||||
another directory, substitute that value in the directions.
|
||||
* Make the /Users/admin/GAMWork directory before proceeding.
|
||||
|
||||
Make the directory:
|
||||
```
|
||||
mkdir -p /Users/admin/GAMWork
|
||||
```
|
||||
|
||||
### Set an alias
|
||||
You should set an alias to point to /Users/admin/bin/gamadv-xtd3/gam so you can operate from the /Users/admin/GAMWork directory.
|
||||
@@ -98,31 +95,33 @@ ln -s "/Users/admin/bin/gamadv-xtd3/gam" /usr/local/bin/gam
|
||||
|
||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
||||
```
|
||||
admin@server:~$ cd /Users/admin/bin/gamadv-xtd3
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam config drive_dir /Users/admin/GAMWork verify
|
||||
admin@server:/Users/admin$ gam config drive_dir /Users/admin/GAMWork verify
|
||||
Created: /Users/admin/GAMConfig
|
||||
Created: /Users/admin/GAMConfig/gamcache
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Initialized
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
...
|
||||
[long list of all config settings that should match the directories you specified]
|
||||
cache_dir = /Users/admin/GAMConfig/gamcache
|
||||
...
|
||||
config_dir = /Users/admin/GAMConfig
|
||||
...
|
||||
drive_dir = /Users/admin/GAMWork
|
||||
...
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Verify initialization, this was a successful installation.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ls -l $GAMCFGDIR
|
||||
admin@server:/Users/admin$ ls -l $GAMCFGDIR
|
||||
total 48
|
||||
-rw-r-----+ 1 admin staff 1069 Mar 3 09:23 gam.cfg
|
||||
drwxr-x---+ 2 admin staff 68 Mar 3 09:23 gamcache
|
||||
-rw-rw-rw-+ 1 admin staff 0 Mar 3 09:23 oauth2.txt.lock
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Create your project with local browser
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam create project
|
||||
admin@server:/Users/admin$ gam create project
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: client_secrets_json, Value: /Users/admin/GAMConfig/client_secrets.json, Not Found
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: oauth2service_json, Value: /Users/admin/GAMConfig/oauth2service.json, Not Found
|
||||
|
||||
@@ -186,12 +185,12 @@ Enter your Client Secret: CLIENTSECRET
|
||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
||||
That's it! Your GAM Project is created and ready to use.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Create your project without local browser (Google Cloud Shell for instance)
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam config no_browser true save
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam create project
|
||||
admin@server:/Users/admin$ gam config no_browser true save
|
||||
admin@server:/Users/admin$ gam create project
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: client_secrets_json, Value: /Users/admin/GAMConfig/client_secrets.json, Not Found
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: oauth2service_json, Value: /Users/admin/GAMConfig/oauth2service.json, Not Found
|
||||
|
||||
@@ -254,7 +253,7 @@ Enter your Client Secret: CLIENTSECRET
|
||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
||||
That's it! Your GAM Project is created and ready to use.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Enable GAMADV-XTD3 client access
|
||||
|
||||
@@ -262,7 +261,7 @@ You select a list of scopes, GAM uses a browser to get final authorization from
|
||||
writes the credentials into the file oauth2.txt.
|
||||
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam oauth create
|
||||
admin@server:/Users/admin$ gam oauth create
|
||||
|
||||
[*] 0) Calendar API (supports readonly)
|
||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
||||
@@ -343,14 +342,14 @@ Enter verification code or paste "Unable to connect" URL from other computer (on
|
||||
The authentication flow has completed.
|
||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Created
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
|
||||
If clicking on the link in the instructions does not work (i.e. you get a 404 or 400 error message, instead of something about 'unable to connect') the URL in the link is too long. Most likely, you have selected all scopes. Try again with fewer scopes until it works. (there is no harm in repeatedly trying)
|
||||
|
||||
### Enable GAMADV-XTD3 service account access.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
||||
$ gam user admin@domain.com check serviceaccount
|
||||
System time status
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
@@ -405,7 +404,7 @@ Click AUTHORIZE
|
||||
When the box closes you're done
|
||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -415,7 +414,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -459,14 +458,14 @@ All scopes PASSED!
|
||||
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Update gam.cfg with some basic values
|
||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
||||
* `domain` - This allows you to omit the domain portion of email addresses
|
||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam info domain
|
||||
admin@server:/Users/admin$ gam info domain
|
||||
Customer ID: C01234567
|
||||
Primary Domain: domain.com
|
||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
||||
@@ -474,15 +473,18 @@ Primary Domain Verified: True
|
||||
Default Language: en
|
||||
...
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
admin@server:/Users/admin$ gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Saved
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
...
|
||||
[long list of all config settings that should match the data you specified]
|
||||
customer_id = C01234567
|
||||
...
|
||||
domain = domain.com
|
||||
...
|
||||
timezone = local
|
||||
...
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
|
||||
## Windows
|
||||
@@ -538,22 +540,24 @@ At this point, you should restart Command Prompt so that it has the updated path
|
||||
|
||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
||||
```
|
||||
C:>cd C:\GAMADV-XTD3
|
||||
C:\GAMADV-XTD3>gam config drive_dir C:\GAMWork verify
|
||||
C:\>gam config drive_dir C:\GAMWork verify
|
||||
Created: C:\GAMConfig
|
||||
Created: C:\GAMConfig\gamcache
|
||||
Config File: C:\GAMConfig\gam.cfg, Initialized
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
...
|
||||
[long list of all config settings that should match the directories you specified]
|
||||
cache_dir = C:\GAMConfig\gamcache
|
||||
...
|
||||
config_dir = C:\GAMConfig
|
||||
...
|
||||
drive_dir = C:\GAMWork
|
||||
...
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Verify initialization, this was a successful installation.
|
||||
```
|
||||
C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
C:\>dir %GAMCFGDIR%
|
||||
Volume in drive C has no label.
|
||||
Volume Serial Number is 663F-DA8B
|
||||
|
||||
@@ -566,12 +570,12 @@ C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
03/03/2017 10:15 AM 0 oauth2.txt.lock
|
||||
2 File(s) 15,769 bytes
|
||||
3 Dir(s) 110,532,562,944 bytes free
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
|
||||
### Create your project with local browser
|
||||
```
|
||||
C:\GAMADV-XTD3>gam create project
|
||||
C:\>gam create project
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: client_secrets_json, Value: C:\GAMConfig\client_secrets.json, Not Found
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: oauth2service_json, Value: C:\GAMConfig\oauth2service.json, Not Found
|
||||
|
||||
@@ -635,12 +639,12 @@ Enter your Client Secret: CLIENTSECRET
|
||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
||||
That's it! Your GAM Project is created and ready to use.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Create your project without local browser (headless server for instance)
|
||||
```
|
||||
C:\GAMADV-XTD3>gam config no_browser true save
|
||||
C:\GAMADV-XTD3>gam create project
|
||||
C:\>gam config no_browser true save
|
||||
C:\>gam create project
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: client_secrets_json, Value: C:\GAMConfig\client_secrets.json, Not Found
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: oauth2service_json, Value: C:\GAMConfig\oauth2service.json, Not Found
|
||||
|
||||
@@ -703,7 +707,7 @@ Enter your Client Secret: CLIENTSECRET
|
||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
||||
That's it! Your GAM Project is created and ready to use.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Enable GAMADV-XTD3 client access
|
||||
|
||||
@@ -711,7 +715,7 @@ You select a list of scopes, GAM uses a browser to get final authorization from
|
||||
writes the credentials into the file oauth2.txt.
|
||||
|
||||
```
|
||||
C:\GAMADV-XTD3>gam oauth create
|
||||
C:\>gam oauth create
|
||||
|
||||
[*] 0) Calendar API (supports readonly)
|
||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
||||
@@ -792,11 +796,11 @@ Enter verification code or paste "Unable to connect" URL from other computer (on
|
||||
The authentication flow has completed.
|
||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Created
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Enable GAMADV-XTD3 service account access.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
||||
C:\>gam user admin@domain.com check serviceaccount
|
||||
System time status
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication
|
||||
@@ -850,7 +854,7 @@ Click AUTHORIZE
|
||||
When the box closes you're done
|
||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -860,7 +864,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
||||
C:\>gam user admin@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -904,14 +908,14 @@ All scopes PASSED!
|
||||
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Update gam.cfg with some basic values
|
||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
||||
* `domain` - This allows you to omit the domain portion of email addresses
|
||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
||||
```
|
||||
C:\GAMADV-XTD3>gam info domain
|
||||
C:\>gam info domain
|
||||
Customer ID: C01234567
|
||||
Primary Domain: domain.com
|
||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
||||
@@ -919,13 +923,16 @@ Primary Domain Verified: True
|
||||
Default Language: en
|
||||
...
|
||||
|
||||
C:\GAMADV-XTD3>gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
C:\>gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
Config File: C:\GAMConfig\gam.cfg, Saved
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
...
|
||||
[long list of all config settings that should match the directories you specified]
|
||||
customer_id = C01234567
|
||||
...
|
||||
domain = domain.com
|
||||
...
|
||||
timezone = local
|
||||
...
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
# Updating GAMADV-XTD3
|
||||
Use these steps to update your version of GAMADV-XTD3.
|
||||
|
||||
- [Downloads](Downloads)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
- [Downloads-Installs](Downloads-Installs)
|
||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
||||
- [Windows](#windows)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
|
||||
## Linux and MacOS and Google Cloud Shell
|
||||
|
||||
@@ -13,7 +13,7 @@ Use these steps to update your version of GAMADV-XTD3.
|
||||
This example assumes that GAMADV-XTD3 has been installed in /Users/admin/bin/gamadv-xtd3.
|
||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions when downloading.
|
||||
|
||||
See: [Downloads](Downloads)
|
||||
See: [Downloads-Installs](Downloads-Installs)
|
||||
|
||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
||||
actual email adddress.
|
||||
@@ -301,7 +301,7 @@ admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3.
|
||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions when downloading.
|
||||
|
||||
See: [Downloads](Downloads)
|
||||
See: [Downloads-Installs](Downloads-Installs)
|
||||
|
||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
||||
actual email adddress.
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
Use these steps if you have used any version of GAMADV-X or GAMADV-XTD in your domain.
|
||||
They will update your GAM project and all necessary authentications.
|
||||
|
||||
- [Downloads](Downloads)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
- [Downloads-Installs](Downloads-Installs)
|
||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
||||
- [Windows](#windows)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
|
||||
## Linux and MacOS and Google Cloud Shell
|
||||
|
||||
@@ -23,29 +23,32 @@ GAMADV-XTD3 uses the same configuration directory and gam.cfg file as GAMADV-X a
|
||||
### Update your alias
|
||||
You should update your alias to point to /Users/admin/bin/gamadv-xtd3/gam.
|
||||
|
||||
Add the following line:
|
||||
Add/edit the following line:
|
||||
```
|
||||
alias gam="/Users/admin/bin/gamadv-xtd3/gam"
|
||||
```
|
||||
to one of these files if you're running bash or an equivalent file if you're running some other shell:
|
||||
to one of these files based on your shell:
|
||||
```
|
||||
~/.bash_aliases
|
||||
~/.bash_profile
|
||||
~/.bashrc
|
||||
~/.zshrc
|
||||
~/.profile
|
||||
```
|
||||
|
||||
If you already have a gam alias for standard GAM and want to run it and GAMADV-XTD3, give your new alias a different name:
|
||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
||||
```
|
||||
alias gam3="/Users/admin/bin/gamadv-xtd3/gam"
|
||||
source <Filename>
|
||||
```
|
||||
|
||||
### Do you have a browser?
|
||||
If your computer doesn't support a browser, Google Cloud Shell for instance, execute this command:
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam config no_browser true save
|
||||
admin@server:/Users/admin$ gam config no_browser true save
|
||||
```
|
||||
### Update your project to include the additional APIs that GAMADV-XTD3 uses.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam update project
|
||||
admin@server:/Users/admin$ gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -75,7 +78,7 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Update GAMADV-XTD3 client access.
|
||||
|
||||
@@ -90,7 +93,7 @@ gam config no_browser true oauth update
|
||||
```
|
||||
You will be given instructions on how to get the authorization on another computer and apply it locally.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam oauth update
|
||||
admin@server:/Users/admin$ gam oauth update
|
||||
|
||||
Select the authorized scopes by entering a number.
|
||||
Append an 'r' to grant read-only access or an 'a' to grant action-only access.
|
||||
@@ -165,11 +168,11 @@ set no_browser = true in gam.cfg and re-run this command.
|
||||
Authentication successful.
|
||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Updated
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Update GAMADV-XTD3 service account access.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user user@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user user@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs by less than 1 second from Google PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -218,7 +221,7 @@ Scopes fields will be pre-populated. Please click Authorize to allow these
|
||||
scopes access. After authorizing it may take some time for this test to pass so
|
||||
wait a few moments and then try this command again.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -228,7 +231,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user user@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user user@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs by less than 1 second from Google PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -271,7 +274,7 @@ Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
||||
All scopes PASSED!
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
|
||||
## Windows
|
||||
@@ -305,15 +308,17 @@ Click OK
|
||||
Exit Control Panel
|
||||
```
|
||||
|
||||
At this point, you should restart Command Prompt so that it has the updated path and environment variables.
|
||||
|
||||
### Do you have a compatible browser?
|
||||
If the computer on which you are running GAM does not have access to a browser or
|
||||
your default browser is Internet Explorer or Edge, issue this command:
|
||||
```
|
||||
C:\GAMADV-X>gam config no_browser true save
|
||||
C:\>gam config no_browser true save
|
||||
```
|
||||
### Update your project to include the additional APIs that GAMADV-XTD3 uses.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam update project
|
||||
C:\>gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -343,7 +348,7 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Update GAMADV-XTD3 client access.
|
||||
|
||||
@@ -361,7 +366,7 @@ You can open the file with Notepad/Wordpad, do a control-A to select the text, c
|
||||
start a browser and paste the URL (control-V) into the address bar. Authenticate and copy the Verification code
|
||||
back to your Command Prompt/PowerShell window.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam oauth update
|
||||
C:\>gam oauth update
|
||||
|
||||
Select the authorized scopes by entering a number.
|
||||
Append an 'r' to grant read-only access or an 'a' to grant action-only access.
|
||||
@@ -436,11 +441,11 @@ set no_browser = true in gam.cfg and re-run this command.
|
||||
Authentication successful.
|
||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Updated
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Enable GAMADV-XTD3 service account access.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user user@domain.com check serviceaccount
|
||||
C:\>gam user user@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs by less than 1 second from Google PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -489,7 +494,7 @@ Scopes fields will be pre-populated. Please click Authorize to allow these
|
||||
scopes access. After authorizing it may take some time for this test to pass so
|
||||
wait a few moments and then try this command again.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -499,7 +504,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user user@domain.com check serviceaccount
|
||||
C:\>gam user user@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs by less than 1 second from Google PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -542,5 +547,5 @@ Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
||||
All scopes PASSED!
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
Use these steps if you have used any version of GAM in your domain. They will update your GAM project
|
||||
and all necessary authentications.
|
||||
|
||||
- [Downloads](Downloads)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
- [Downloads-Installs](Downloads-Installs)
|
||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
||||
- [Windows](#windows)
|
||||
- [GAM Configuration](gam.cfg)
|
||||
|
||||
## Linux and MacOS and Google Cloud Shell
|
||||
|
||||
@@ -25,6 +25,11 @@ probably want to select a non-hidden location. This example assumes that the GAM
|
||||
configuration directory will be /Users/admin/GAMConfig; If you've chosen another directory,
|
||||
substitute that value in the directions.
|
||||
|
||||
Make the directory:
|
||||
```
|
||||
mkdir -p /Users/admin/GAMConfig
|
||||
```
|
||||
|
||||
Add the following line:
|
||||
```
|
||||
export GAMCFGDIR="/Users/admin/GAMConfig"
|
||||
@@ -42,7 +47,10 @@ Issue the following command replacing `<Filename>` with the name of the file you
|
||||
source <Filename>
|
||||
```
|
||||
|
||||
* Make the /Users/admin/GAMConfig directory before proceeding.
|
||||
You need to make sure the GAM configuration directory actually exists. Test that like this:
|
||||
```
|
||||
ls -l $GAMCFGDIR
|
||||
```
|
||||
|
||||
### Set a working directory
|
||||
|
||||
@@ -51,10 +59,15 @@ data in this folder and execute GAM commands from this folder. You should not us
|
||||
/Users/admin/bin/gamadv-xtd3 or /Users/admin/GAMConfig for this purpose.
|
||||
This example assumes that the GAM working directory will be /Users/admin/GAMWork; If you've chosen
|
||||
another directory, substitute that value in the directions.
|
||||
* Make the /Users/admin/GAMWork directory before proceeding.
|
||||
|
||||
Make the directory:
|
||||
```
|
||||
mkdir -p /Users/admin/GAMWork
|
||||
```
|
||||
|
||||
### Set an alias
|
||||
You should set an alias to point to /Users/admin/bin/gamadv-xtd3/gam so you can operate from the /Users/admin/GAMWork directory.
|
||||
Aliases aren't available in scripts, so you may want to set a symlink instead, see below.
|
||||
|
||||
Add the following line:
|
||||
```
|
||||
@@ -69,32 +82,44 @@ to one of these files based on your shell:
|
||||
~/.profile
|
||||
```
|
||||
|
||||
If you already have an alias for standard GAM but are no longer going to run it, delete these lines:
|
||||
```
|
||||
function gam() { "/Users/admin/bin/gam/gam" "$@" ; }"
|
||||
alias gam="/Users/admin/bin/gam/gam"
|
||||
```
|
||||
|
||||
If you already have an alias for standard GAM and want to run it and GAMADV-XTD3, give your old alias a different name:
|
||||
```
|
||||
function gamstd() { "/Users/admin/bin/gam/gam" "$@" ; }"
|
||||
alias gamstd="/Users/admin/bin/gam/gam"
|
||||
```
|
||||
|
||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
||||
```
|
||||
source <Filename>
|
||||
```
|
||||
|
||||
If you already have a gam alias for standard GAM and want to run it and GAMADV-XTD3, give your new alias a different name:
|
||||
### Set a symlink
|
||||
Set a symlink in `/usr/local/bin` (or some other location on $PATH) to point to GAM.
|
||||
```
|
||||
alias gam3="/Users/admin/bin/gamadv-xtd3/gam"
|
||||
ln -s "/Users/admin/bin/gamadv-xtd3/gam" /usr/local/bin/gam
|
||||
```
|
||||
|
||||
Set environment variable OLDGAMPATH to point to the existing Gam directory; /Users/admin/bin/gam will be used in this example.
|
||||
If your existing Gam is in another directory, substitute that value in the directions.
|
||||
```
|
||||
admin@server:~$ cd /Users/admin/bin/gamadv-xtd3
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ export OLDGAMPATH=/Users/admin/bin/gam
|
||||
admin@server:/Users/admin$ export OLDGAMPATH=/Users/admin/bin/gam
|
||||
```
|
||||
Verify that OLDGAMPATH points to the correct location.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ls -l $OLDGAMPATH/*.json
|
||||
admin@server:/Users/admin$ ls -l $OLDGAMPATH/*.json
|
||||
-rw-r-----@ 1 admin staff 553 Feb 26 10:39 /Users/admin/bin/gam/client_secrets.json
|
||||
-rw-r-----@ 1 admin staff 2377 Feb 26 10:39 /Users/admin/bin/gam/oauth2service.json
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam config drive_dir /Users/admin/GAMWork verify
|
||||
admin@server:/Users/admin$ gam config drive_dir /Users/admin/GAMWork verify
|
||||
Created: /Users/admin/GAMConfig
|
||||
Created: /Users/admin/GAMConfig/gamcache
|
||||
Copied: /Users/admin/bin/gam/oauth2service.json, To: /Users/admin/GAMConfig/oauth2service.json
|
||||
@@ -102,128 +127,19 @@ Copied: /Users/admin/bin/gam/oauth2.txt, To: /Users/admin/GAMConfig/oauth2.txt
|
||||
Copied: /Users/admin/bin/gam/client_secrets.json, To: /Users/admin/GAMConfig/client_secrets.json
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Initialized
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
admin_email = ''
|
||||
api_calls_rate_check = false
|
||||
api_calls_rate_limit = 100
|
||||
api_calls_tries_limit = 10
|
||||
auto_batch_min = 0
|
||||
bail_on_internal_error_tries = 2
|
||||
batch_size = 50
|
||||
cacerts_pem = ''
|
||||
...
|
||||
cache_dir = /Users/admin/GAMConfig/gamcache
|
||||
cache_discovery_only = true
|
||||
channel_customer_id = ''
|
||||
charset = utf-8
|
||||
classroom_max_results = 0
|
||||
client_secrets_json = client_secrets.json ; /Users/admin/GAMConfig/client_secrets.json
|
||||
clock_skew_in_seconds = 10
|
||||
cmdlog = ''
|
||||
cmdlog_max_backups = 5
|
||||
cmdlog_max_kilo_bytes = 1000
|
||||
...
|
||||
config_dir = /Users/admin/GAMConfig
|
||||
contact_max_results = 100
|
||||
csv_input_column_delimiter = ,
|
||||
csv_input_quote_char = '"'
|
||||
csv_input_row_drop_filter = ''
|
||||
csv_input_row_drop_filter_mode = anymatch
|
||||
csv_input_row_filter = ''
|
||||
csv_input_row_filter_mode = allmatch
|
||||
csv_input_row_limit = 0
|
||||
csv_output_column_delimiter = ,
|
||||
csv_output_convert_cr_nl = false
|
||||
csv_output_field_delimiter = ' '
|
||||
csv_output_header_drop_filter = ''
|
||||
csv_output_header_filter = ''
|
||||
csv_output_header_force = ''
|
||||
csv_output_line_terminator = lf
|
||||
csv_output_quote_char = '"'
|
||||
csv_output_row_drop_filter = ''
|
||||
csv_output_row_drop_filter_mode = anymatch
|
||||
csv_output_row_filter = ''
|
||||
csv_output_row_filter_mode = allmatch
|
||||
csv_output_row_limit = 0
|
||||
csv_output_subfield_delimiter = '.'
|
||||
csv_output_timestamp_column = ''
|
||||
csv_output_users_audit = false
|
||||
customer_id = my_customer
|
||||
debug_level = 0
|
||||
device_max_results = 200
|
||||
domain = ''
|
||||
...
|
||||
drive_dir = /Users/admin/GAMWork
|
||||
drive_max_results = 1000
|
||||
drive_v3_native_names = true
|
||||
email_batch_size = 50
|
||||
enable_dasa = false
|
||||
event_max_results = 250
|
||||
extra_args = ''
|
||||
inter_batch_wait = 0
|
||||
license_max_results = 100
|
||||
license_skus = ''
|
||||
member_max_results = 200
|
||||
message_batch_size = 50
|
||||
message_max_results = 500
|
||||
mobile_max_results = 100
|
||||
multiprocess_pool_limit = 0
|
||||
never_time = Never
|
||||
no_browser = false
|
||||
no_cache = false
|
||||
no_update_check = true
|
||||
no_verify_ssl = false
|
||||
num_tbatch_threads = 2
|
||||
num_threads = 5
|
||||
oauth2_txt = oauth2.txt ; /Users/admin/GAMConfig/oauth2.txt
|
||||
oauth2service_json = oauth2service.json ; /Users/admin/GAMConfig/oauth2service.json
|
||||
people_max_results = 100
|
||||
print_agu_domains = ''
|
||||
print_cros_ous = ''
|
||||
print_cros_ous_and_children = ''
|
||||
process_wait_limit = 0
|
||||
quick_cros_move = false
|
||||
quick_info_user = false
|
||||
reseller_id = ''
|
||||
retry_api_service_not_available = false
|
||||
section = ''
|
||||
show_api_calls_retry_data = false
|
||||
show_commands = false
|
||||
show_convert_cr_nl = false
|
||||
show_counts_min = 1
|
||||
show_gettings = true
|
||||
show_gettings_got_nl = false
|
||||
show_multiprocess_info = false
|
||||
smtp_fqdn = ''
|
||||
smtp_host = ''
|
||||
smtp_password = ''
|
||||
smtp_username = ''
|
||||
timezone = utc
|
||||
tls_max_version = ''
|
||||
tls_min_version = 'TLSv1_2'
|
||||
todrive_clearfilter = false
|
||||
todrive_clientaccess = false
|
||||
todrive_conversion = true
|
||||
todrive_localcopy = false
|
||||
todrive_locale = ''
|
||||
todrive_nobrowser = false
|
||||
todrive_noemail = true
|
||||
todrive_parent = root
|
||||
todrive_sheet_timeformat = ''
|
||||
todrive_sheet_timestamp = false
|
||||
todrive_timeformat = ''
|
||||
todrive_timestamp = false
|
||||
todrive_timezone = ''
|
||||
todrive_upload_nodata = true
|
||||
todrive_user = ''
|
||||
truncate_client_id = false
|
||||
update_cros_ou_with_id = false
|
||||
use_projectid_as_name = false
|
||||
user_max_results = 500
|
||||
user_service_account_access_only = false
|
||||
...
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Verify initialization, this was a successful installation.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ls -l $GAMCFGDIR
|
||||
admin@server:/Users/admin$ ls -l $GAMCFGDIR
|
||||
total 48
|
||||
-rw-r-----+ 1 admin staff 553 Mar 3 09:23 client_secrets.json
|
||||
-rw-r-----+ 1 admin staff 1069 Mar 3 09:23 gam.cfg
|
||||
@@ -232,21 +148,21 @@ drwxr-x---+ 2 admin staff 68 Mar 3 09:23 gamcache
|
||||
-rw-r-----+ 1 admin staff 5104 Mar 3 09:23 oauth2.txt
|
||||
-rw-rw-rw-+ 1 admin staff 0 Mar 3 09:23 oauth2.txt.lock
|
||||
-rw-r-----+ 1 admin staff 2377 Mar 3 09:23 oauth2service.json
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
If the verification looks like this, then you'll have to copy client_secrets.json and oauth2service.json manually.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ls -l $GAMCFGDIR
|
||||
admin@server:/Users/admin$ ls -l $GAMCFGDIR
|
||||
total 40
|
||||
-rw-r-----+ 1 admin admin 1427 Nov 1 11:38 gam.cfg
|
||||
drwxr-x---+ 16 admin admin 544 Nov 2 07:25 gamcache
|
||||
-rw-r--r--+ 1 admin admin 10 Nov 2 15:31 lastupdatecheck.txt
|
||||
-rw-rw-rw-+ 1 admin admin 0 Sep 19 17:28 oauth2.txt.lock
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ cp -p $OLDGAMPATH/client_secrets.json $GAMCFGDIR/
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ cp -p $OLDGAMPATH/oauth2service.json $GAMCFGDIR/
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ cp -p $OLDGAMPATH/oauth2.txt $GAMCFGDIR/
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ls -l $GAMCFGDIR
|
||||
admin@server:/Users/admin$ cp -p $OLDGAMPATH/client_secrets.json $GAMCFGDIR/
|
||||
admin@server:/Users/admin$ cp -p $OLDGAMPATH/oauth2service.json $GAMCFGDIR/
|
||||
admin@server:/Users/admin$ cp -p $OLDGAMPATH/oauth2.txt $GAMCFGDIR/
|
||||
admin@server:/Users/admin$ ls -l $GAMCFGDIR
|
||||
total 40
|
||||
-rw-r-----+ 1 admin staff 553 Mar 3 09:23 client_secrets.json
|
||||
-rw-r-----+ 1 admin staff 1069 Mar 3 09:23 gam.cfg
|
||||
@@ -258,7 +174,7 @@ drwxr-x---+ 2 admin staff 68 Mar 3 09:23 gamcache
|
||||
```
|
||||
### Update your project with local browser to include the additional APIs that GAMADV-XTD3 uses.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam update project
|
||||
admin@server:/Users/admin$ gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -288,12 +204,12 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Update your project without local browser (Google Cloud Shell for instance) to include the additional APIs that GAMADV-XTD3 uses
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam config no_browser true save
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam update project
|
||||
admin@server:/Users/admin$ gam config no_browser true save
|
||||
admin@server:/Users/admin$ gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -322,7 +238,7 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Enable GAMADV-XTD3 client access
|
||||
|
||||
@@ -332,17 +248,17 @@ You select a list of scopes, GAM uses a browser to get final authorization from
|
||||
writes the credentials into the file oauth2.txt.
|
||||
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version
|
||||
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
|
||||
GAMADV-XTD3 6.77.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
GAMADV-XTD3 6.78.00 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
MacOS Sonoma 14.5 x86_64
|
||||
Path: /Users/admin/bin/gamadv-xtd3
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam oauth create
|
||||
admin@server:/Users/admin$ gam oauth create
|
||||
|
||||
[*] 0) Calendar API (supports readonly)
|
||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
||||
@@ -423,11 +339,11 @@ Enter verification code or paste "Unable to connect" URL from other computer (on
|
||||
The authentication flow has completed.
|
||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Created
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Enable GAMADV-XTD3 service account access.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
||||
$ gam user admin@domain.com check serviceaccount
|
||||
System time status
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
@@ -482,7 +398,7 @@ Click AUTHORIZE
|
||||
When the box closes you're done
|
||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -492,7 +408,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -536,14 +452,14 @@ All scopes PASSED!
|
||||
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
### Update gam.cfg with some basic values
|
||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
||||
* `domain` - This allows you to omit the domain portion of email addresses
|
||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
||||
```
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam info domain
|
||||
admin@server:/Users/admin$ gam info domain
|
||||
Customer ID: C01234567
|
||||
Primary Domain: domain.com
|
||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
||||
@@ -551,7 +467,7 @@ Primary Domain Verified: True
|
||||
Default Language: en
|
||||
...
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
admin@server:/Users/admin$ gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Saved
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
@@ -668,7 +584,7 @@ Section: DEFAULT
|
||||
user_max_results = 500
|
||||
user_service_account_access_only = false
|
||||
|
||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
||||
admin@server:/Users/admin$
|
||||
```
|
||||
|
||||
## Windows
|
||||
@@ -728,12 +644,11 @@ At this point, you should restart Command Prompt so that it has the updated path
|
||||
Set environment variable OLDGAMPATH to point to the existing Gam directory; C:\GAM will be used in this example.
|
||||
If your existing Gam is in another directory, substitute that value in the directions.
|
||||
```
|
||||
C:>cd C:\GAMADV-XTD3
|
||||
C:\GAMADV-XTD3>set OLDGAMPATH=C:\GAM
|
||||
C:\>set OLDGAMPATH=C:\GAM
|
||||
```
|
||||
### Verify that OLDGAMPATH points to the correct location.
|
||||
```
|
||||
C:\GAMADV-XTD3>dir %OLDGAMPATH%\*.json
|
||||
C:\>dir %OLDGAMPATH%\*.json
|
||||
Volume in drive C has no label.
|
||||
Volume Serial Number is 663F-DA8B
|
||||
|
||||
@@ -748,8 +663,7 @@ C:\GAMADV-XTD3>dir %OLDGAMPATH%\*.json
|
||||
```
|
||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
||||
```
|
||||
C:>cd C:\GAMADV-XTD3
|
||||
C:\GAMADV-XTD3>gam config drive_dir C:\GAMWork verify
|
||||
C:\>gam config drive_dir C:\GAMWork verify
|
||||
Created: C:\GAMConfig
|
||||
Created: C:\GAMConfig\gamcache
|
||||
Copied: C:\GAM\oauth2service.json, To: C:\GAMConfig\oauth2service.json
|
||||
@@ -871,11 +785,11 @@ Section: DEFAULT
|
||||
user_max_results = 500
|
||||
user_service_account_access_only = false
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Verify initialization, this was a successful installation.
|
||||
```
|
||||
C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
C:\>dir %GAMCFGDIR%
|
||||
Volume in drive C has no label.
|
||||
Volume Serial Number is 663F-DA8B
|
||||
|
||||
@@ -892,11 +806,11 @@ C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
03/03/2017 10:15 AM 2,377 oauth2service.json
|
||||
6 File(s) 15,769 bytes
|
||||
3 Dir(s) 110,532,562,944 bytes free
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
If the verification looks like this, then you'll have to copy client_secrets.json and oauth2service.json manually.
|
||||
```
|
||||
C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
C:\>dir %GAMCFGDIR%
|
||||
Volume in drive C has no label.
|
||||
Volume Serial Number is 663F-DA8B
|
||||
|
||||
@@ -911,13 +825,13 @@ C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
3 File(s) 1,135 bytes
|
||||
3 Dir(s) 110,532,562,944 bytes free
|
||||
|
||||
C:\GAMADV-XTD3>copy %OLDGAMPATH%\client_secrets.json %HOMEPATH%\.gam\
|
||||
C:\>copy %OLDGAMPATH%\client_secrets.json %GAMCFGDIR%
|
||||
1 file(s) copied.
|
||||
|
||||
C:\GAMADV-XTD3>copy %OLDGAMPATH%\oauth2service.json %HOMEPATH%\.gam\
|
||||
C:\>copy %OLDGAMPATH%\oauth2service.json %GAMCFGDIR%
|
||||
1 file(s) copied.
|
||||
|
||||
C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
C:\>dir %GAMCFGDIR%
|
||||
Volume in drive C has no label.
|
||||
Volume Serial Number is 663F-DA8B
|
||||
|
||||
@@ -936,7 +850,7 @@ C:\GAMADV-XTD3>dir %GAMCFGDIR%
|
||||
```
|
||||
### Update your project with local browser to include the additional APIs that GAMADV-XTD3 uses.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam update project
|
||||
C:\>gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -963,12 +877,12 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Update your project without local browser (headless server for instance) to include the additional APIs that GAMADV-XTD3 uses
|
||||
```
|
||||
C:\GAMADV-XTD3>gam config no_browser true save
|
||||
C:\GAMADV-XTD3>gam update project
|
||||
C:\>gam config no_browser true save
|
||||
C:\>gam update project
|
||||
|
||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
||||
|
||||
@@ -997,7 +911,7 @@ Enable 3 APIs
|
||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
||||
API: sheets.googleapis.com, Enabled (3/3)
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Enable GAMADV-XTD3 client access
|
||||
|
||||
@@ -1006,17 +920,17 @@ Create oauth2.txt; it must be deleted and recreated because it is in a different
|
||||
You select a list of scopes, GAM uses a browser to get final authorization from Google for these scopes and
|
||||
writes the credentials into the file oauth2.txt.
|
||||
```
|
||||
C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt
|
||||
C:\GAMADV-XTD3>gam version
|
||||
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
|
||||
GAMADV-XTD3 6.77.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
GAMADV-XTD3 6.78.00 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
Windows-10-10.0.17134 AMD64
|
||||
Path: C:\GAMADV-XTD3
|
||||
Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
|
||||
C:\GAMADV-XTD3>gam oauth create
|
||||
C:\>gam oauth create
|
||||
|
||||
[*] 0) Calendar API (supports readonly)
|
||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
||||
@@ -1097,12 +1011,12 @@ Enter verification code or paste "Unable to connect" URL from other computer (on
|
||||
The authentication flow has completed.
|
||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Created
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
|
||||
### Enable GAMADV-XTD3 service account access.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
||||
C:\>gam user admin@domain.com check serviceaccount
|
||||
System time status
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication
|
||||
@@ -1156,7 +1070,7 @@ Click AUTHORIZE
|
||||
When the box closes you're done
|
||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
The link shown in the error message should take you directly to the authorization screen.
|
||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
||||
@@ -1166,7 +1080,7 @@ If not, make sure that you are logged in as a domain admin, then re-enter the li
|
||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
||||
for the authorization to complete.
|
||||
```
|
||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
||||
C:\>gam user admin@domain.com check serviceaccount
|
||||
System time status:
|
||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
||||
Service Account Private Key Authentication:
|
||||
@@ -1210,14 +1124,14 @@ All scopes PASSED!
|
||||
|
||||
Service Account Client name: SVCACCTID is fully authorized.
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
### Update gam.cfg with some basic values
|
||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
||||
* `domain` - This allows you to omit the domain portion of email addresses
|
||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
||||
```
|
||||
C:\GAMADV-XTD3>gam info domain
|
||||
C:\>gam info domain
|
||||
Customer ID: C01234567
|
||||
Primary Domain: domain.com
|
||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
||||
@@ -1225,7 +1139,7 @@ Primary Domain Verified: True
|
||||
Default Language: en
|
||||
...
|
||||
|
||||
C:\GAMADV-XTD3>gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
C:\>gam config customer_id C01234567 domain domain.com timezone local save verify
|
||||
Config File: C:\GAMConfig\gam.cfg, Saved
|
||||
Section: DEFAULT
|
||||
activity_max_results = 100
|
||||
@@ -1344,5 +1258,5 @@ Section: DEFAULT
|
||||
user_max_results = 500
|
||||
user_service_account_access_only = false
|
||||
|
||||
C:\GAMADV-XTD3>
|
||||
C:\>
|
||||
```
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
- [Print organizational units](#print-organizational-units)
|
||||
- [Display organizational unit counts](#display-organizational-unit-counts)
|
||||
- [Display indented organizational unit tree](#display-indented-organizational-unit-tree)
|
||||
- [Check organizational unit for contained items](#check-organizational-unit-for-contained-items)
|
||||
- [Special case handling for large number of organizational units](#special-case-handling-for-large-number-of-organizational-units)
|
||||
|
||||
## API documentation
|
||||
@@ -270,6 +271,44 @@ gam show orgtree [fromparent <OrgUnitItem>] [batchsuborgs [<Boolean>]]
|
||||
By default, Gam displays the organizational unit tree starting at /.
|
||||
* `fromparent <OrgUnitItem>` - Display the organizational unit tree starting at `<OrgUnitItem>`.
|
||||
|
||||
## Check organizational unit for contained items
|
||||
An organizational unit can be deleted only when it contains no items:
|
||||
* Chrome Browsers
|
||||
* ChromeOS Devices
|
||||
* Shared Drives
|
||||
* Sub Org Units
|
||||
* Users
|
||||
|
||||
This command counts those items and displays a CSV file with the item counts.
|
||||
* All counts are zero - A return code of 0 is returned and the `empty` column is `True`
|
||||
* Some count is greater than 0 - A return code of 25 is returned and the `empty` column is `False`
|
||||
|
||||
Only items directly within the OU are counted, items in sub-OUs are not counted.
|
||||
```
|
||||
<OrgUnitCheckName> ::=
|
||||
browsers|
|
||||
devices|
|
||||
shareddrives|
|
||||
subous|
|
||||
users
|
||||
<OrgUnitCheckNameList> ::= "<OrgUnitCheckName>(,<OrgUnitCheckName>)*"
|
||||
|
||||
gam check org|ou <OrgUnitItem> [todrive <ToDriveAttribute>*]
|
||||
[<OrgUnitCheckName>*|(fields <OrgUnitCheckNameList>)]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, GAM checks each of the five items; you can select specfic fields
|
||||
with `<OrgUnitCheckName>*` or `fields <OrgUnitCheckNameList>`.
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
## Special case handling for large number of organizational units
|
||||
|
||||
By default, the `print orgs` and `show orgtree` commands issue a single API call to get the
|
||||
|
||||
@@ -188,6 +188,7 @@ gam report usage customer [todrive <ToDriveAttribute>*]
|
||||
thismonth|(previousmonths <Integer>)]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
```
|
||||
Limit the time period.
|
||||
* `start <Date>` - Default value is 30 days prior to `end <Date>`
|
||||
@@ -196,6 +197,9 @@ Limit the time period.
|
||||
* `thismonth` - The current calendar month up to the current time
|
||||
* `previousmonths <Integer>` - A number in the range 1 to 6 indicating calendar months previous to the current month
|
||||
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
### Example
|
||||
Jay provided this example.
|
||||
```
|
||||
@@ -237,6 +241,7 @@ gam report customers|customer|domain [todrive <ToDriveAttributes>*]
|
||||
[(nodatechange | limitdatechanges <Integer>) | (fulldatarequired all|<CustomerServiceNameList>)]
|
||||
[(fields|parameters <String>)|(services <CustomerServiceNameList>)]
|
||||
[noauthorizedapps]
|
||||
[convertmbtogb]
|
||||
```
|
||||
Specify the report date; the default is today's date.
|
||||
* `date <Date>` - A single date; there is one API call
|
||||
@@ -246,6 +251,9 @@ Specify the report date; the default is today's date.
|
||||
* `thismonth` - The current calendar month up to the current time; there is an API call per date
|
||||
* `previousmonths <Integer>` - A number in the range 1 to 6 indicating calendar months previous to the current month; there is an API call per date
|
||||
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
If no report is available for the specified date, can an earlier date be used?
|
||||
* `limitdatechanges -1' - Back up to earlier dates to find report data; this is the default.
|
||||
* `limitdatechanges 0 | nodatechange' - Do not report on an earlier date if no report data is available for the specified date.
|
||||
@@ -298,6 +306,7 @@ gam report usage user [todrive]
|
||||
thismonth|(previousmonths <Integer>)]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
```
|
||||
Select the users for whom information is desired.
|
||||
* `user all` - All users, the default; there is one API call
|
||||
@@ -313,6 +322,9 @@ Limit the time period.
|
||||
* `thismonth` - The current calendar month up to the current time
|
||||
* `previousmonths <Integer>` - A number in the range 1 to 6 indicating calendar months previous to the current month
|
||||
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
## User reports
|
||||
User reports are generally available up to four days before the current date.
|
||||
```
|
||||
@@ -335,6 +347,7 @@ gam report users|user [todrive <ToDriveAttributes>*]
|
||||
[(fields|parameters <String>)|(services <UserServiceNameList>)]
|
||||
[aggregatebydate|aggregatebyuser [Boolean]]
|
||||
[maxresults <Number>]
|
||||
[convertmbtogb]
|
||||
```
|
||||
Select the users for whom information is desired.
|
||||
* `user all` - All users, the default; there is one API call
|
||||
@@ -354,6 +367,9 @@ Specify the report date; the default is today's date.
|
||||
* `thismonth` - The current calendar month up to the current time; there is an API call per date
|
||||
* `previousmonths <Integer>` - A number in the range 1 to 6 indicating calendar months previous to the current month; there is an API call per date
|
||||
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
If no report is available for the specified date, can an earlier date be used?
|
||||
* `limitdatechanges -1' - Back up to earlier dates to find report data; this is the default.
|
||||
* `limitdatechanges 0 | nodatechange' - Do not report on an earlier date if no report data is available for the specified date.
|
||||
|
||||
@@ -519,13 +519,17 @@ count = & gam print resources showitemcountonly
|
||||
These commands operate on a single resource calendar.
|
||||
```
|
||||
gam resource <ResourceID> add acls|calendaracls <CalendarACLRole> <CalendarACLScopeEntity>
|
||||
[sendnotifications <Boolean>]
|
||||
gam resource <ResourceID> update acls|calendaracls <CalendarACLRole> <CalendarACLScopeEntity>
|
||||
[sendnotifications <Boolean>]
|
||||
gam resource <ResourceID> delete acls|calendaracls [<CalendarACLRole>] <CalendarACLScopeEntity>
|
||||
```
|
||||
These commands operate on multiple resource calendars.
|
||||
```
|
||||
gam resources <ResourceEntity> add acls|calendaracls <CalendarACLRole> <CalendarACLScopeEntity>
|
||||
[sendnotifications <Boolean>]
|
||||
gam resources <ResourceEntity> update acls|calendaracls <CalendarACLRole> <CalendarACLScopeEntity>
|
||||
[sendnotifications <Boolean>]
|
||||
gam resources <ResourceEntity> delete acls|calendaracls [<CalendarACLRole>] <CalendarACLScopeEntity>
|
||||
```
|
||||
## Display resource calendar ACLs
|
||||
|
||||
@@ -509,7 +509,7 @@ Find all the organizers and file organizers on the Golgafrincham shared drive in
|
||||
```
|
||||
|
||||
By default, all Shared Drives specified are displayed; use the following option to select a subset of those Shared Drives.
|
||||
* `<PermissionMatch>* [<PermissionMatchAction>] pmselect` - Use permission matching to select Shared Drives
|
||||
* `<PermissionMatch>* [<PermissionMatchAction>] pmselect` - Use permission matching to select Shared Drives; all ACLs are displayed for the selected Shared Drives
|
||||
|
||||
By default, all ACLS are displayed; use the following option to select a subset of the ACLS to display.
|
||||
* `<PermissionMatch>* [<PermissionMatchAction>]` - Use permission matching to display a subset of the ACLs for each Shared Drive; this only applies when `pmselect` is not specified
|
||||
@@ -548,7 +548,7 @@ By default, all Shared Drives are displayed; use the following options to select
|
||||
* `teamdriveadminquery|query <QueryTeamDrive>` - Use a query to select Shared Drives
|
||||
* `matchname <RegularExpression>` - Retrieve Shared Drives with names that match a pattern.
|
||||
* `orgunit|org|ou <OrgUnitPath>` - Only Shared Drives in the specified Org Unit are selected
|
||||
* `<PermissionMatch>* [<PermissionMatchAction>] pmselect` - Use permission matching to select Shared Drives
|
||||
* `<PermissionMatch>* [<PermissionMatchAction>] pmselect` - Use permission matching to select Shared Drives; all ACLs are displayed for the selected Shared Drives
|
||||
|
||||
By default, Shared Drives with no permissions are not displayed; use the `shownopermissionsdrives` to control whether
|
||||
Shared Drives with no permissions are displayed.
|
||||
|
||||
@@ -429,7 +429,7 @@ If none of the following options are selected, all events are selected.
|
||||
* `<EventSelectProperty>* <EventMatchProperty>*` - Properties used to select events
|
||||
|
||||
The Google Calendar API processes `<EventSelectProperty>*`; you may specify none or multiple properties.
|
||||
* `after|starttime|timemin <Time>` - Lower bound (inclusive) for an event's end time to filter by. If timeMax is set, timeMin must be smaller than timeMax.
|
||||
* `after|starttime|timemin <Time>` - Lower bound (exclusive) for an event's end time to filter by. If timeMax is set, timeMin must be smaller than timeMax.
|
||||
* `before|endtime|timemax <Time>` - Upper bound (exclusive) for an event's start time to filter by. If timeMin is set, timeMax must be greater than timeMin.
|
||||
* `eventtypes <EventTypeList>` - Select events based on their type.
|
||||
* `query <QueryCalendar>` - Free text search terms to find events that match these terms in any field, except for extended properties
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
- [Display file list](#display-file-list)
|
||||
- [File selection by name and entity shortcuts for Display file list](#file-selection-by-name-and-entity-shortcuts-for-display-file-list)
|
||||
- [File selection starting point for Display file list](#file-selection-starting-point-for-display-file-list)
|
||||
- [File selection with a particular drive label](#file-selection-with-a-particular-drive-label)
|
||||
- [File selection with or without a particular drive label](#file-selection-with-or-without-a-particular-drive-label)
|
||||
- [Handle empty file lists](#handle-empty-file-lists)
|
||||
- [Display disk usage](#display-disk-usage)
|
||||
|
||||
@@ -540,6 +540,9 @@ See: [Drive File Selection](Drive-File-Selection) for details of `<DriveFileName
|
||||
my_3p_shortcuts |
|
||||
my_items |
|
||||
my_forms |
|
||||
my_top_files |
|
||||
my_top_folders |
|
||||
my_top_items |
|
||||
others_files |
|
||||
others_folders |
|
||||
others_forms |
|
||||
@@ -1475,7 +1478,7 @@ testuser@domain.com,Bottom Folder 11,1,My Drive/Top Folder/Middle Folder 1/Botto
|
||||
testuser@domain.com,Bottom Sheet 11,1,My Drive/Top Folder/Middle Folder 1/Bottom Folder 11/Bottom Sheet 11
|
||||
```
|
||||
|
||||
## File selection with a particular drive label
|
||||
## File selection with or without a particular drive label
|
||||
The Drive API doesn't support querying for a drive label, so GAM must do the filtering.
|
||||
|
||||
Get the label id.
|
||||
@@ -1485,9 +1488,13 @@ gam show drivelabels
|
||||
|
||||
Find the label with properties:title: XXX where XXX is the desired label title, then get its id: value
|
||||
|
||||
List the files.
|
||||
List the files with the label
|
||||
```
|
||||
gam config csv_output_row_filter "labelInfo.labels.0.id:regex:PutLabelIdHere" user user@domain.com print filelist fields id,name,labelinfo includelabels PutLabelIdHere
|
||||
gam config csv_output_row_filter "labels:count>0" user user@domain.com print filelist fields id,name,mimetype showlabels ids includelabels PutLabelIdHere
|
||||
```
|
||||
List the files without the label
|
||||
```
|
||||
gam config csv_output_row_filter "labels:count=0" user user@domain.com print filelist fields id,name,mimetype showlabels ids includelabels PutLabelIdHere
|
||||
```
|
||||
|
||||
Adjust the `fields` list as desired.
|
||||
|
||||
@@ -203,6 +203,17 @@ File Sheet.json contains:
|
||||
gam user testuser@domain.com update sheet <DriveFileItem> json file Sheet.json
|
||||
```
|
||||
|
||||
Rename a tab/sheet in a spreadsheet.
|
||||
```
|
||||
Get the sheet IDs.
|
||||
gam user testuser@domain.com info sheet <DriveFileItem> fields sheets
|
||||
Get the desired sheetId from the output.
|
||||
File Sheet.json contains:
|
||||
{"requests": [{"updateSheetProperties": {"properties": {"sheetId": 1234567890, "title": "New Title"}, "fields": "title"}}]}
|
||||
|
||||
gam user testuser@domain.com update sheet <DriveFileItem> json file Sheet.json
|
||||
```
|
||||
|
||||
Delete a column from a tab in a spreadsheet.
|
||||
```
|
||||
Get the sheet IDs.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Print the current version of Gam with details
|
||||
```
|
||||
gam version
|
||||
GAMADV-XTD3 6.77.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
GAMADV-XTD3 6.78.00 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
MacOS Sonoma 14.5 x86_64
|
||||
@@ -15,7 +15,7 @@ Time: 2023-06-02T21:10:00-07:00
|
||||
Print the current version of Gam with details and time offset information
|
||||
```
|
||||
gam version timeoffset
|
||||
GAMADV-XTD3 6.77.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
GAMADV-XTD3 6.78.00 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
MacOS Sonoma 14.5 x86_64
|
||||
@@ -27,7 +27,7 @@ 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
|
||||
GAMADV-XTD3 6.77.09 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
GAMADV-XTD3 6.78.00 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
MacOS Sonoma 14.5 x86_64
|
||||
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
|
||||
Path: /Users/Admin/bin/gamadv-xtd3
|
||||
Version Check:
|
||||
Current: 5.35.08
|
||||
Latest: 6.77.09
|
||||
Latest: 6.78.00
|
||||
echo $?
|
||||
1
|
||||
```
|
||||
@@ -72,7 +72,7 @@ echo $?
|
||||
Print the current version number without details
|
||||
```
|
||||
gam version simple
|
||||
6.77.09
|
||||
6.78.00
|
||||
```
|
||||
In Linux/MacOS you can do:
|
||||
```
|
||||
@@ -82,7 +82,7 @@ echo $VER
|
||||
Print the current version of Gam and address of this Wiki
|
||||
```
|
||||
gam help
|
||||
GAM 6.77.09 - https://github.com/taers232c/GAMADV-XTD3
|
||||
GAM 6.78.00 - https://github.com/taers232c/GAMADV-XTD3
|
||||
Ross Scroggs <ross.scroggs@gmail.com>
|
||||
Python 3.12.4 64-bit final
|
||||
MacOS Sonoma 14.5 x86_64
|
||||
|
||||
@@ -1073,6 +1073,7 @@ Specify a collection of items by directly specifying them; the item type is dete
|
||||
others_3p_shortcuts |
|
||||
others_items |
|
||||
writable_files
|
||||
|
||||
<DriveFileEntityShortcut> ::=
|
||||
alldrives |
|
||||
mydrive_any |
|
||||
@@ -1088,6 +1089,7 @@ Specify a collection of items by directly specifying them; the item type is dete
|
||||
sharedwithme_all |
|
||||
sharedwithme_mydrive |
|
||||
sharedwithme_notmydrive
|
||||
|
||||
<DriveFileEntity> ::=
|
||||
<DriveFileIDEntity> |
|
||||
<DriveFileNameEntity> |
|
||||
@@ -3275,15 +3277,22 @@ gam info domain [<DomainName>]
|
||||
[formatjson]
|
||||
gam print domains [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
gam show domains [formatjson]
|
||||
[showitemcountonly]
|
||||
gam show domains
|
||||
[formatjson]
|
||||
[showitemcountonly]
|
||||
|
||||
gam create|add domainalias|aliasdomain <DomainAlias> <DomainName>
|
||||
gam delete domainalias|aliasdomain <DomainAlias>
|
||||
|
||||
gam info domainalias|aliasdomain <DomainAlias> [formatjson]
|
||||
gam info domainalias|aliasdomain <DomainAlias>
|
||||
[formatjson]
|
||||
gam print domainaliases|aliasdomains [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
gam show domainaliases|aliasdomains [formatjson]
|
||||
[showitemcountonly]
|
||||
gam show domainaliases|aliasdomains
|
||||
[formatjson]
|
||||
[showitemcountonly]
|
||||
|
||||
# Domain - Contacts and Global Address List
|
||||
|
||||
@@ -4208,6 +4217,18 @@ gam print orgs|ous [todrive <ToDriveAttribute>*]
|
||||
[showitemcountonly]
|
||||
gam show orgtree [fromparent <OrgUnitItem>] [batchsuborgs [<Boolean>]]
|
||||
|
||||
<OrgUnitCheckName> ::=
|
||||
browsers|
|
||||
devices|
|
||||
shareddrives|
|
||||
subous|
|
||||
users
|
||||
<OrgUnitCheckNameList> ::= "<OrgUnitCheckName>(,<OrgUnitCheckName>)*"
|
||||
|
||||
gam check org|ou <OrgUnitItem> [todrive <ToDriveAttribute>*]
|
||||
[<OrgUnitCheckName>*|(fields <OrgUnitCheckNameList>)]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
# Printers
|
||||
|
||||
<PrinterAttribute> ::=
|
||||
@@ -4269,11 +4290,13 @@ gam report usage user [todrive <ToDriveAttribute>*]
|
||||
thismonth|(previousmonths <Integer>)]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
gam report usage customer [todrive <ToDriveAttribute>*]
|
||||
[([start|startdate <Date>] [end|enddate <Date>])|(range <Date> <Date>)|
|
||||
thismonth|(previousmonths <Integer>)]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
|
||||
<ActivityApplicationName> ::=
|
||||
access|accesstransparency|
|
||||
@@ -4333,6 +4356,7 @@ gam report customers|customer|domain [todrive <ToDriveAttribute>*]
|
||||
yesterday|today|thismonth|(previousmonths <Integer>)]
|
||||
[(nodatechange | limitdatechanges <Integer>) | (fulldatarequired all|<CustomerServiceNameList>)]
|
||||
[(fields|parameters <String>)|(services <CustomerServiceNameList>)] [noauthorizedapps]
|
||||
[convertmbtogb]
|
||||
|
||||
<UserServiceName> ::=
|
||||
accounts|
|
||||
@@ -4353,6 +4377,7 @@ gam report users|user [todrive <ToDriveAttribute>*]
|
||||
[(fields|parameters <String>)|(services <UserServiceNameList>)]
|
||||
[aggregatebydate|aggregatebyuser [Boolean]]
|
||||
[maxresults <Number>]
|
||||
[convertmbtogb]
|
||||
|
||||
# Reseller
|
||||
|
||||
|
||||
@@ -2,6 +2,56 @@
|
||||
|
||||
Merged GAM-Team version
|
||||
|
||||
6.78.00
|
||||
|
||||
Added command to check if an OU contains items; this is useful when tryng to delete an OU
|
||||
as it must not contain any items in order to be deleted.
|
||||
|
||||
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/Organizational-Units#check-organizational-unit-for-contained-items
|
||||
|
||||
6.77.18
|
||||
|
||||
Added option `showitemcountonly` to `gam print domainaliases` that causes GAM to display the
|
||||
number of domain aliasess on stdout; no CSV file is written.
|
||||
|
||||
6.77.17
|
||||
|
||||
Added option `showitemcountonly` to `gam print domains` that causes GAM to display the
|
||||
number of domains on stdout; no CSV file is written.
|
||||
|
||||
6.77.16
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print filelist` that caused a trap.
|
||||
|
||||
6.77.15
|
||||
|
||||
Updated `gam calendars <CalendarEntity> import event icaluid <iCalUID> json <JSONdata>` to handle API
|
||||
constraints on recurring events.
|
||||
|
||||
6.77.14
|
||||
|
||||
Fixed bug in `gam calendars <CalendarEntity> import event icaluid <iCalUID> json <JSONdata>` that caused an error.
|
||||
|
||||
6.77.13
|
||||
|
||||
Updated `gam <UserTypeEntity> print|show filecounts` to reflect that Shared Drives now
|
||||
have a capacity of 500000 files/folders/shortcuts.
|
||||
|
||||
6.77.12
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> print chatspaces todrive` that caused an error.
|
||||
|
||||
6.77.11
|
||||
|
||||
Added option `convertmbtogb` to `gam report usage customer|user` and
|
||||
`gam report customer|user` that causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
6.77.10
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> get profilephoto` where data written to stdout, e.g. `> filename`,
|
||||
was not properly base64 encoded.
|
||||
|
||||
6.77.09
|
||||
|
||||
Added option `usertokencounts` to `gam <UserTypeEntity> print|show tokens` that causes GAM to display
|
||||
|
||||
@@ -216,7 +216,7 @@ SECONDS_PER_DAY = 86400
|
||||
SECONDS_PER_WEEK = 604800
|
||||
MAX_GOOGLE_SHEET_CELLS = 10000000 # See https://support.google.com/drive/answer/37603
|
||||
MAX_LOCAL_GOOGLE_TIME_OFFSET = 30
|
||||
SHARED_DRIVE_MAX_FILES_FOLDERS = 400000
|
||||
SHARED_DRIVE_MAX_FILES_FOLDERS = 500000
|
||||
UTF8 = 'utf-8'
|
||||
UTF8_SIG = 'utf-8-sig'
|
||||
EV_GAMCFGDIR = 'GAMCFGDIR'
|
||||
@@ -332,6 +332,7 @@ ENTITY_IS_A_USER_ALIAS_RC = 21
|
||||
ENTITY_IS_A_GROUP_RC = 22
|
||||
ENTITY_IS_A_GROUP_ALIAS_RC = 23
|
||||
ENTITY_IS_AN_UNMANAGED_ACCOUNT_RC = 24
|
||||
ORGUNIT_NOT_EMPTY_RC = 25
|
||||
CHECK_USER_GROUPS_ERROR_RC = 29
|
||||
ORPHANS_COLLECTED_RC = 30
|
||||
# Warnings/Errors
|
||||
@@ -5703,6 +5704,8 @@ def convertUIDtoEmailAddressWithType(emailAddressOrUID, cd=None, sal=None, email
|
||||
# Convert UID to email address
|
||||
def convertUIDtoEmailAddress(emailAddressOrUID, cd=None, emailTypes=None,
|
||||
checkForCustomerId=False, ciGroupsAPI=False, aliasAllowed=True):
|
||||
if emailAddressOrUID.startswith('cbcm-browser.'):
|
||||
return emailAddressOrUID
|
||||
email, _ = convertUIDtoEmailAddressWithType(emailAddressOrUID, cd, emailTypes,
|
||||
checkForCustomerId, ciGroupsAPI, aliasAllowed)
|
||||
return email
|
||||
@@ -8888,14 +8891,6 @@ def getTodriveOnly(csvPF):
|
||||
else:
|
||||
unknownArgumentExit()
|
||||
|
||||
def getTodriveFJQCOnly(csvPF, FJQC, addTitle=False, noExit=False):
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
csvPF.GetTodriveParameters()
|
||||
else:
|
||||
FJQC.GetFormatJSONQuoteChar(myarg, addTitle, noExit)
|
||||
|
||||
DEFAULT_SKIP_OBJECTS = {'kind', 'etag', 'etags', '@type'}
|
||||
|
||||
# Clean a JSON object
|
||||
@@ -13063,6 +13058,12 @@ def getUserOrgUnits(cd, orgUnit, orgUnitId):
|
||||
GAPI.invalidCustomerId, GAPI.loginRequired, GAPI.resourceNotFound, GAPI.forbidden):
|
||||
checkEntityDNEorAccessErrorExit(cd, Ent.ORGANIZATIONAL_UNIT, orgUnit)
|
||||
|
||||
# Convert report mb item to gb
|
||||
def convertReportMBtoGB(name, item):
|
||||
if item is not None:
|
||||
item['intValue'] = f"{int(item['intValue'])/1024:.2f}"
|
||||
return name.replace('_in_mb', '_in_gb')
|
||||
|
||||
REPORTS_PARAMETERS_SIMPLE_TYPES = ['intValue', 'boolValue', 'datetimeValue', 'stringValue']
|
||||
|
||||
# gam report usage user [todrive <ToDriveAttribute>*]
|
||||
@@ -13070,10 +13071,12 @@ REPORTS_PARAMETERS_SIMPLE_TYPES = ['intValue', 'boolValue', 'datetimeValue', 'st
|
||||
# [([start|startdate <Date>] [end|enddate <Date>])|(range <Date> <Date>)|
|
||||
# thismonth|(previousmonths <Integer>)]
|
||||
# [fields|parameters <String>)]
|
||||
# [convertmbtogb]
|
||||
# gam report usage customer [todrive <ToDriveAttribute>*]
|
||||
# [([start|startdate <Date>] [end|enddate <Date>])|(range <Date> <Date>)|
|
||||
# thismonth|(previousmonths <Integer>)]
|
||||
# [fields|parameters <String>)]
|
||||
# [convertmbtogb]
|
||||
def doReportUsage():
|
||||
def usageEntitySelectors():
|
||||
selectorChoices = Cmd.USER_ENTITY_SELECTORS+Cmd.USER_CSVDATA_ENTITY_SELECTORS
|
||||
@@ -13118,7 +13121,7 @@ def doReportUsage():
|
||||
if customerId == GC.MY_CUSTOMER:
|
||||
customerId = None
|
||||
parameters = set()
|
||||
select = showOrgUnit = False
|
||||
convertMbToGb = select = showOrgUnit = False
|
||||
userKey = 'all'
|
||||
cd = orgUnit = orgUnitId = None
|
||||
userOrgUnits = {}
|
||||
@@ -13178,6 +13181,8 @@ def doReportUsage():
|
||||
_, users = getEntityToModify(defaultEntityType=Cmd.ENTITY_USERS)
|
||||
orgUnit = orgUnitId = None
|
||||
select = True
|
||||
elif myarg == 'convertmbtogb':
|
||||
convertMbToGb = True
|
||||
else:
|
||||
unknownArgumentExit()
|
||||
if startEndTime.endDateTime is None:
|
||||
@@ -13259,6 +13264,8 @@ def doReportUsage():
|
||||
for ptype in REPORTS_PARAMETERS_SIMPLE_TYPES:
|
||||
if ptype in item:
|
||||
if ptype != 'datetimeValue':
|
||||
if convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, item)
|
||||
row[name] = item[ptype]
|
||||
else:
|
||||
row[name] = formatLocalTime(item[ptype])
|
||||
@@ -13361,11 +13368,13 @@ REPORT_ACTIVITIES_TIME_OBJECTS = {'time'}
|
||||
# [(fields|parameters <String>)|(services <UserServiceNameList>)]
|
||||
# [aggregatebydate|aggregatebyuser [Boolean]]
|
||||
# [maxresults <Number>]
|
||||
# [convertmbtogb]
|
||||
# gam report customers|customer|domain [todrive <ToDriveAttribute>*]
|
||||
# [(date <Date>)|(range <Date> <Date>)|
|
||||
# yesterday|today|thismonth|(previousmonths <Integer>)]
|
||||
# [nodatechange | (fulldatarequired all|<CustomerServiceNameList>)]
|
||||
# [(fields|parameters <String>)|(services <CustomerServiceNameList>)] [noauthorizedapps]
|
||||
# [convertmbtogb]
|
||||
def doReport():
|
||||
def processUserUsage(usage, lastDate):
|
||||
if not usage:
|
||||
@@ -13399,6 +13408,8 @@ def doReport():
|
||||
csvPF.AddTitles('accounts:disabled_time')
|
||||
except ValueError:
|
||||
pass
|
||||
elif convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, item)
|
||||
csvPF.AddTitles(name)
|
||||
for ptype in REPORTS_PARAMETERS_SIMPLE_TYPES:
|
||||
if ptype in item:
|
||||
@@ -13432,6 +13443,8 @@ def doReport():
|
||||
if repsvc not in includeServices:
|
||||
continue
|
||||
if 'intValue' in item:
|
||||
if convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, None)
|
||||
csvPF.AddTitles(name)
|
||||
eventCounts.setdefault(email, {})
|
||||
eventCounts[email].setdefault(name, 0)
|
||||
@@ -13455,6 +13468,8 @@ def doReport():
|
||||
if repsvc not in includeServices:
|
||||
continue
|
||||
if 'intValue' in item:
|
||||
if convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, None)
|
||||
csvPF.AddTitles(name)
|
||||
eventCounts.setdefault(lastDate, {})
|
||||
eventCounts[lastDate].setdefault(name, 0)
|
||||
@@ -13477,6 +13492,8 @@ def doReport():
|
||||
continue
|
||||
for ptype in REPORTS_PARAMETERS_SIMPLE_TYPES:
|
||||
if ptype in item:
|
||||
if convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, item)
|
||||
csvPF.AddTitles(name)
|
||||
if ptype != 'datetimeValue':
|
||||
row[name] = item[ptype]
|
||||
@@ -13541,6 +13558,8 @@ def doReport():
|
||||
for ptype in REPORTS_PARAMETERS_SIMPLE_TYPES:
|
||||
if ptype in item:
|
||||
if ptype != 'datetimeValue':
|
||||
if convertMbToGb and name.endswith('_in_mb'):
|
||||
name = convertReportMBtoGB(name, item)
|
||||
csvPF.WriteRow({'date': lastDate, 'name': name, 'value': item[ptype]})
|
||||
else:
|
||||
csvPF.WriteRow({'date': lastDate, 'name': name, 'value': formatLocalTime(item[ptype])})
|
||||
@@ -13610,8 +13629,8 @@ def doReport():
|
||||
filterTimes = {}
|
||||
maxActivities = maxEvents = 0
|
||||
maxResults = 1000
|
||||
aggregateByDate = aggregateByUser = countsOnly = eventRowFilter = exitUserLoop = noAuthorizedApps = \
|
||||
normalizeUsers = select = summary = userCustomerRange = False
|
||||
aggregateByDate = aggregateByUser = convertMbToGb = countsOnly = eventRowFilter = exitUserLoop = \
|
||||
noAuthorizedApps = normalizeUsers = select = summary = userCustomerRange = False
|
||||
limitDateChanges = -1
|
||||
allVerifyUser = userKey = 'all'
|
||||
cd = orgUnit = orgUnitId = None
|
||||
@@ -13690,6 +13709,8 @@ def doReport():
|
||||
includeServices.add(repsvc)
|
||||
else:
|
||||
invalidChoiceExit(repsvc, fullDataServices, True)
|
||||
elif usageReports and myarg == 'convertmbtogb':
|
||||
convertMbToGb = True
|
||||
elif customerReports and myarg == 'noauthorizedapps':
|
||||
noAuthorizedApps = True
|
||||
elif activityReports and myarg == 'maxactivities':
|
||||
@@ -13861,6 +13882,8 @@ def doReport():
|
||||
for usageDate, events in iter(eventCounts.items()):
|
||||
row = {'date': usageDate}
|
||||
for event, count in iter(events.items()):
|
||||
if convertMbToGb and event.endswith('_in_gb'):
|
||||
count = f'{count/1024:.2f}'
|
||||
row[event] = count
|
||||
csvPF.WriteRow(row)
|
||||
csvPF.SortRows('date', False)
|
||||
@@ -13871,6 +13894,8 @@ def doReport():
|
||||
if showOrgUnit:
|
||||
row['orgUnitPath'] = userOrgUnits.get(email, UNKNOWN)
|
||||
for event, count in iter(events.items()):
|
||||
if convertMbToGb and event.endswith('_in_gb'):
|
||||
count = f'{count/1024:.2f}'
|
||||
row[event] = count
|
||||
csvPF.WriteRow(row)
|
||||
csvPF.SortRows('email', False)
|
||||
@@ -15731,18 +15756,33 @@ def _printDomain(domain, csvPF):
|
||||
|
||||
DOMAIN_ALIAS_SORT_TITLES = ['domainAliasName', 'parentDomainName', 'creationTime', 'verified']
|
||||
|
||||
# gam print domainaliases [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]
|
||||
# gam show domainaliases [formatjson]
|
||||
# gam print domainaliases [todrive <ToDriveAttribute>*]
|
||||
# [formatjson [quotechar <Character>]]
|
||||
# [showitemcountonly]
|
||||
# gam show domainaliases
|
||||
# [formatjson]
|
||||
# [showitemcountonly]
|
||||
def doPrintShowDomainAliases():
|
||||
cd = buildGAPIObject(API.DIRECTORY)
|
||||
csvPF = CSVPrintFile(['domainAliasName'], DOMAIN_ALIAS_SORT_TITLES) if Act.csvFormat() else None
|
||||
FJQC = FormatJSONQuoteChar(csvPF)
|
||||
getTodriveFJQCOnly(csvPF, FJQC, True)
|
||||
showItemCountOnly = False
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
csvPF.GetTodriveParameters()
|
||||
elif myarg == 'showitemcountonly':
|
||||
showItemCountOnly = True
|
||||
else:
|
||||
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
||||
try:
|
||||
domainAliases = callGAPIitems(cd.domainAliases(), 'list', 'domainAliases',
|
||||
throwReasons=[GAPI.BAD_REQUEST, GAPI.NOT_FOUND, GAPI.FORBIDDEN],
|
||||
customer=GC.Values[GC.CUSTOMER_ID])
|
||||
count = len(domainAliases)
|
||||
if showItemCountOnly:
|
||||
writeStdout(f'{count}\n')
|
||||
return
|
||||
i = 0
|
||||
for domainAlias in domainAliases:
|
||||
i += 1
|
||||
@@ -16058,18 +16098,33 @@ def doInfoDomain():
|
||||
|
||||
DOMAIN_SORT_TITLES = ['domainName', 'parentDomainName', 'creationTime', 'type', 'verified']
|
||||
|
||||
# gam print domains [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]
|
||||
# gam show domains [formatjson]
|
||||
# gam print domains [todrive <ToDriveAttribute>*]
|
||||
# [formatjson [quotechar <Character>]]
|
||||
# [showitemcountonly]
|
||||
# gam show domains
|
||||
# [formatjson]
|
||||
# [showitemcountonly]
|
||||
def doPrintShowDomains():
|
||||
cd = buildGAPIObject(API.DIRECTORY)
|
||||
csvPF = CSVPrintFile(['domainName'], DOMAIN_SORT_TITLES) if Act.csvFormat() else None
|
||||
FJQC = FormatJSONQuoteChar(csvPF)
|
||||
getTodriveFJQCOnly(csvPF, FJQC, True)
|
||||
showItemCountOnly = False
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
csvPF.GetTodriveParameters()
|
||||
elif myarg == 'showitemcountonly':
|
||||
showItemCountOnly = True
|
||||
else:
|
||||
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
||||
try:
|
||||
domains = callGAPIitems(cd.domains(), 'list', 'domains',
|
||||
throwReasons=[GAPI.BAD_REQUEST, GAPI.NOT_FOUND, GAPI.FORBIDDEN],
|
||||
customer=GC.Values[GC.CUSTOMER_ID])
|
||||
count = len(domains)
|
||||
if showItemCountOnly:
|
||||
writeStdout(f'{count}\n')
|
||||
return
|
||||
i = 0
|
||||
for domain in domains:
|
||||
i += 1
|
||||
@@ -16434,12 +16489,12 @@ def doDeleteAdmin():
|
||||
callGAPI(cd.roleAssignments(), 'delete',
|
||||
throwReasons=[GAPI.NOT_FOUND, GAPI.OPERATION_NOT_SUPPORTED, GAPI.FORBIDDEN,
|
||||
GAPI.INVALID_INPUT, GAPI.SERVICE_NOT_AVAILABLE, GAPI.RESOURCE_NOT_FOUND,
|
||||
GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND],
|
||||
GAPI.FAILED_PRECONDITION, GAPI.BAD_REQUEST, GAPI.CUSTOMER_NOT_FOUND],
|
||||
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
|
||||
customer=GC.Values[GC.CUSTOMER_ID], roleAssignmentId=roleAssignmentId)
|
||||
entityActionPerformed([Ent.ADMIN_ROLE_ASSIGNMENT, roleAssignmentId])
|
||||
except (GAPI.notFound, GAPI.operationNotSupported, GAPI.forbidden,
|
||||
GAPI.invalidInput, GAPI.serviceNotAvailable, GAPI.resourceNotFound) as e:
|
||||
GAPI.invalidInput, GAPI.serviceNotAvailable, GAPI.resourceNotFound, GAPI.failedPrecondition) as e:
|
||||
entityActionFailedWarning([Ent.ADMIN_ROLE_ASSIGNMENT, roleAssignmentId], str(e))
|
||||
except (GAPI.badRequest, GAPI.customerNotFound):
|
||||
accessErrorExit(cd)
|
||||
@@ -17430,7 +17485,11 @@ def _getOrgUnits(cd, orgUnitPath, fieldsList, listType, showParent, batchSubOrgs
|
||||
else:
|
||||
fields = ','.join(set(fieldsList))
|
||||
listfields = f'organizationUnits({fields})'
|
||||
printGettingAllAccountEntities(Ent.ORGANIZATIONAL_UNIT)
|
||||
if listType == 'all' and orgUnitPath == '/':
|
||||
printGettingAllAccountEntities(Ent.ORGANIZATIONAL_UNIT)
|
||||
else:
|
||||
printGettingAllEntityItemsForWhom(Ent.CHILD_ORGANIZATIONAL_UNIT, orgUnitPath,
|
||||
qualifier=' (Direct Children)' if listType == 'children' else '', entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
if listType == 'children':
|
||||
batchSubOrgs = False
|
||||
try:
|
||||
@@ -17468,7 +17527,10 @@ def _getOrgUnits(cd, orgUnitPath, fieldsList, listType, showParent, batchSubOrgs
|
||||
except (GAPI.invalidOrgunit, GAPI.orgunitNotFound, GAPI.backendError,
|
||||
GAPI.badRequest, GAPI.invalidCustomerId, GAPI.loginRequired):
|
||||
pass
|
||||
printGotAccountEntities(len(orgUnits))
|
||||
if listType == 'all' and orgUnitPath == '/':
|
||||
printGotAccountEntities(len(orgUnits))
|
||||
else:
|
||||
printGotEntityItemsForWhom(len(orgUnits))
|
||||
if childSelector is not None:
|
||||
for orgUnit in orgUnits:
|
||||
orgUnit[ORG_UNIT_SELECTOR_FIELD] = childSelector if orgUnit['orgUnitPath'] != orgUnitPath else parentSelector
|
||||
@@ -17701,6 +17763,157 @@ def doShowOrgTree():
|
||||
for org in sorted(orgTree):
|
||||
printOrgUnit(org, orgTree)
|
||||
|
||||
ORG_ITEMS_FIELD_MAP = {
|
||||
'browsers': 'browsers',
|
||||
'devices': 'devices',
|
||||
'shareddrives': 'sharedDrives',
|
||||
'subous': 'subOus',
|
||||
'users': 'users',
|
||||
}
|
||||
|
||||
# gam check org|ou <OrgUnitItem> [todrive <ToDriveAttribute>*]
|
||||
# [<OrgUnitCheckName>*|(fields <OrgUnitCheckNameList>)]
|
||||
# [formatjson [quotechar <Character>]]
|
||||
def doCheckOrgUnit():
|
||||
cd = buildGAPIObject(API.DIRECTORY)
|
||||
csvPF = CSVPrintFile(['orgUnitPath', 'orgUnitId', 'empty'])
|
||||
FJQC = FormatJSONQuoteChar(csvPF)
|
||||
orgUnitPath = None
|
||||
fieldsList = []
|
||||
titlesList = []
|
||||
status, orgUnitPath, orgUnitId = checkOrgUnitPathExists(cd, getOrgUnitItem())
|
||||
orgUnitPathLower = orgUnitPath.lower()
|
||||
if not status:
|
||||
entityDoesNotExistExit(Ent.ORGANIZATIONAL_UNIT, orgUnitPath)
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
csvPF.GetTodriveParameters()
|
||||
elif myarg in ORG_ITEMS_FIELD_MAP:
|
||||
fieldsList.append(myarg)
|
||||
elif myarg == 'fields':
|
||||
for field in _getFieldsList():
|
||||
if field in ORG_ITEMS_FIELD_MAP:
|
||||
fieldsList.append(field)
|
||||
else:
|
||||
invalidChoiceExit(field, list(ORG_ITEMS_FIELD_MAP), True)
|
||||
else:
|
||||
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
||||
if orgUnitPath is None:
|
||||
missingArgumentExit('orgunit <OrgUnitItem>')
|
||||
if not fieldsList:
|
||||
fieldsList = ORG_ITEMS_FIELD_MAP.keys()
|
||||
orgUnitItemCounts = {}
|
||||
for field in sorted(fieldsList):
|
||||
title = ORG_ITEMS_FIELD_MAP[field]
|
||||
orgUnitItemCounts[title] = 0
|
||||
if not FJQC.formatJSON:
|
||||
titlesList.append(title)
|
||||
if 'browsers' in fieldsList:
|
||||
cbcm = buildGAPIObject(API.CBCM)
|
||||
customerId = _getCustomerIdNoC()
|
||||
printGettingAllEntityItemsForWhom(Ent.CHROME_BROWSER, orgUnitPath, entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
pageMessage = getPageMessage()
|
||||
try:
|
||||
feed = yieldGAPIpages(cbcm.chromebrowsers(), 'list', 'browsers',
|
||||
pageMessage=pageMessage, messageAttribute='deviceId',
|
||||
throwReasons=[GAPI.INVALID_INPUT, GAPI.BAD_REQUEST, GAPI.INVALID_ORGUNIT, GAPI.FORBIDDEN],
|
||||
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
|
||||
customer=customerId, orgUnitPath=orgUnitPath, projection='BASIC',
|
||||
fields='nextPageToken,browsers(deviceId)')
|
||||
for browsers in feed:
|
||||
orgUnitItemCounts['browsers'] += len(browsers)
|
||||
except (GAPI.invalidInput, GAPI.forbidden) as e:
|
||||
entityActionFailedWarning([Ent.CHROME_BROWSER, None], str(e))
|
||||
except GAPI.invalidOrgunit as e:
|
||||
entityActionFailedExit([Ent.CHROME_BROWSER, None], str(e))
|
||||
except (GAPI.badRequest, GAPI.resourceNotFound):
|
||||
accessErrorExit(None)
|
||||
if 'devices' in fieldsList:
|
||||
printGettingAllEntityItemsForWhom(Ent.CROS_DEVICE, orgUnitPath, entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
pageMessage = getPageMessageForWhom()
|
||||
pageToken = None
|
||||
totalItems = 0
|
||||
tokenRetries = 0
|
||||
while True:
|
||||
try:
|
||||
feed = callGAPI(cd.chromeosdevices(), 'list',
|
||||
throwReasons=[GAPI.INVALID_INPUT, GAPI.INVALID_ORGUNIT,
|
||||
GAPI.BAD_REQUEST, GAPI.RESOURCE_NOT_FOUND, GAPI.FORBIDDEN],
|
||||
retryReasons=GAPI.SERVICE_NOT_AVAILABLE_RETRY_REASONS,
|
||||
pageToken=pageToken, customerId=GC.Values[GC.CUSTOMER_ID],
|
||||
orgUnitPath=orgUnitPath, fields='nextPageToken,chromeosdevices(deviceId)', maxResults=GC.Values[GC.DEVICE_MAX_RESULTS])
|
||||
tokenRetries = 0
|
||||
pageToken, totalItems = _processGAPIpagesResult(feed, 'chromeosdevices', None, totalItems, pageMessage, None, Ent.CROS_DEVICE)
|
||||
if feed:
|
||||
orgUnitItemCounts['devices'] += len(feed.get('chromeosdevices', []))
|
||||
del feed
|
||||
if not pageToken:
|
||||
_finalizeGAPIpagesResult(pageMessage)
|
||||
printGotAccountEntities(totalItems)
|
||||
break
|
||||
except GAPI.invalidInput as e:
|
||||
message = str(e)
|
||||
# Invalid Input: xyz - Check for invalid pageToken!!
|
||||
# 0123456789012345
|
||||
if message[15:] == pageToken:
|
||||
tokenRetries += 1
|
||||
if tokenRetries <= 2:
|
||||
writeStderr(f'{WARNING_PREFIX}{Msg.LIST_CHROMEOS_INVALID_INPUT_PAGE_TOKEN_RETRY}')
|
||||
time.sleep(tokenRetries*5)
|
||||
continue
|
||||
entityActionFailedWarning([Ent.CROS_DEVICE, None], message)
|
||||
break
|
||||
entityActionFailedWarning([Ent.CROS_DEVICE, None], message)
|
||||
break
|
||||
except GAPI.invalidOrgunit as e:
|
||||
entityActionFailedExit([Ent.CROS_DEVICE, None], str(e))
|
||||
except (GAPI.badRequest, GAPI.resourceNotFound, GAPI.forbidden):
|
||||
accessErrorExit(cd)
|
||||
if 'shareddrives' in fieldsList:
|
||||
ci = buildGAPIObject(API.CLOUDIDENTITY_ORGUNITS_BETA)
|
||||
printGettingAllEntityItemsForWhom(Ent.SHAREDDRIVE, orgUnitPath, entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
sds = callGAPIpages(ci.orgUnits().memberships(), 'list', 'orgMemberships',
|
||||
pageMessage=getPageMessageForWhom(),
|
||||
parent=f'orgUnits/{orgUnitId[3:]}',
|
||||
customer=_getCustomersCustomerIdWithC(),
|
||||
filter="type == 'shared_drive'")
|
||||
orgUnitItemCounts['sharedDrives'] = len(sds)
|
||||
if 'subous' in fieldsList:
|
||||
orgUnitItemCounts['subOus'] = len(_getOrgUnits(cd, orgUnitPath, ['orgUnitPath'], 'children', False, False, None, None))
|
||||
if 'users' in fieldsList:
|
||||
printGettingAllEntityItemsForWhom(Ent.USER, orgUnitPath, entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
pageMessage = getPageMessageForWhom()
|
||||
try:
|
||||
feed = yieldGAPIpages(cd.users(), 'list', 'users',
|
||||
pageMessage=pageMessage,
|
||||
throwReasons=[GAPI.INVALID_ORGUNIT, GAPI.ORGUNIT_NOT_FOUND,
|
||||
GAPI.INVALID_INPUT, GAPI.BAD_REQUEST, GAPI.RESOURCE_NOT_FOUND, GAPI.FORBIDDEN],
|
||||
customer=GC.Values[GC.CUSTOMER_ID], query=orgUnitPathQuery(orgUnitPath, None),
|
||||
fields='nextPageToken,users(orgUnitPath)', maxResults=GC.Values[GC.USER_MAX_RESULTS])
|
||||
for users in feed:
|
||||
for user in users:
|
||||
if orgUnitPathLower == user.get('orgUnitPath', '').lower():
|
||||
orgUnitItemCounts['users'] += 1
|
||||
except (GAPI.invalidOrgunit, GAPI.orgunitNotFound, GAPI.invalidInput, GAPI.badRequest, GAPI.backendError,
|
||||
GAPI.invalidCustomerId, GAPI.loginRequired, GAPI.resourceNotFound, GAPI.forbidden):
|
||||
checkEntityDNEorAccessErrorExit(cd, Ent.ORGANIZATIONAL_UNIT, orgUnitPath)
|
||||
empty = True
|
||||
for count in orgUnitItemCounts.values():
|
||||
if count > 0:
|
||||
empty = False
|
||||
break
|
||||
baseRow = {'orgUnitPath': orgUnitPath, 'orgUnitId': orgUnitId, 'empty': empty}
|
||||
row = flattenJSON(orgUnitItemCounts, baseRow.copy())
|
||||
if not FJQC.formatJSON:
|
||||
csvPF.WriteRowTitles(row)
|
||||
elif csvPF.CheckRowTitles(row):
|
||||
baseRow['JSON'] = json.dumps(cleanJSON(orgUnitItemCounts), ensure_ascii=False, sort_keys=True)
|
||||
csvPF.WriteRowNoFilter(baseRow)
|
||||
csvPF.writeCSVfile(f'OrgUnit {orgUnitPath} Item Counts')
|
||||
if not empty and GM.Globals[GM.SYSEXITRC] == 0:
|
||||
setSysExitRC(ORGUNIT_NOT_EMPTY_RC)
|
||||
|
||||
ALIAS_TARGET_TYPES = ['user', 'group', 'target']
|
||||
|
||||
# gam create aliases|nicknames <EmailAddressEntity> user|group|target <UniqueID>|<EmailAddress>
|
||||
@@ -25003,10 +25216,10 @@ def doPrintShowBrowsers():
|
||||
else:
|
||||
entityActionFailedWarning([Ent.CHROME_BROWSER, None], str(e))
|
||||
return
|
||||
except GAPI.invalidOrgunit as e:
|
||||
except (GAPI.invalidOrgunit, GAPI.forbidden) as e:
|
||||
entityActionFailedWarning([Ent.CHROME_BROWSER, None], str(e))
|
||||
return
|
||||
except (GAPI.badRequest, GAPI.resourceNotFound, GAPI.forbidden):
|
||||
except (GAPI.badRequest, GAPI.resourceNotFound):
|
||||
accessErrorExit(None)
|
||||
else:
|
||||
sortRows = True
|
||||
@@ -25670,7 +25883,7 @@ def printShowChatSpaces(users):
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
csvPF.GetTodriveParameters()
|
||||
if getFieldsList(myarg, CHAT_SPACES_FIELDS_CHOICE_MAP, fieldsList, initialField='name', onlyFieldsArg=True):
|
||||
elif getFieldsList(myarg, CHAT_SPACES_FIELDS_CHOICE_MAP, fieldsList, initialField='name', onlyFieldsArg=True):
|
||||
pass
|
||||
elif not useAdminAccess and _getChatSpaceListParms(myarg, kwargs):
|
||||
pass
|
||||
@@ -36889,6 +37102,10 @@ def _getCalendarEventAttribute(myarg, body, parameters, function):
|
||||
if function == 'insert':
|
||||
body.update(jsonData)
|
||||
clearJSONfields(body, EVENT_JSON_INSERT_CLEAR_FIELDS)
|
||||
elif function == 'import':
|
||||
if 'id' in jsonData:
|
||||
jsonData['iCalUID'] = jsonData.pop('id')
|
||||
body.update(jsonData)
|
||||
elif function == 'update':
|
||||
if 'event' in jsonData and 'attendees' in jsonData['event']:
|
||||
parameters['attendees'].extend(jsonData['event'].pop('attendees'))
|
||||
@@ -43755,18 +43972,21 @@ def doPrintUsers(entityList=None):
|
||||
projection=schemaParms['projection'], customFieldMask=schemaParms['customFieldMask'],
|
||||
maxResults=maxResults, **kwargs)
|
||||
for users in feed:
|
||||
if showItemCountOnly:
|
||||
itemCount += len(users)
|
||||
continue
|
||||
if orgUnitPath is None:
|
||||
if not printOptions['countOnly']:
|
||||
if showItemCountOnly:
|
||||
itemCount += len(users)
|
||||
elif not printOptions['countOnly']:
|
||||
for user in users:
|
||||
_printUser(user, 0, 0)
|
||||
else:
|
||||
for user in users:
|
||||
_updateDomainCounts(user['primaryEmail'])
|
||||
else:
|
||||
if not printOptions['countOnly']:
|
||||
if showItemCountOnly:
|
||||
for user in users:
|
||||
if orgUnitPathLower == user.get('orgUnitPath', '').lower():
|
||||
itemCount += 1
|
||||
elif not printOptions['countOnly']:
|
||||
for user in users:
|
||||
if orgUnitPathLower == user.get('orgUnitPath', '').lower():
|
||||
_printUser(user, 0, 0)
|
||||
@@ -54377,7 +54597,7 @@ def printFileList(users):
|
||||
simpleLists = ['permissionIds', 'spaces']
|
||||
skipObjects = set()
|
||||
fileIdEntity = {}
|
||||
selectSubQuery = ''
|
||||
getSharedDriveACLsCountMsg = selectSubQuery = ''
|
||||
delimiter = GC.Values[GC.CSV_OUTPUT_FIELD_DELIMITER]
|
||||
DLP = DriveListParameters({'allowChoose': True, 'allowCorpora': True, 'allowQuery': True, 'mimeTypeInQuery': False})
|
||||
DFF = DriveFileFields()
|
||||
@@ -63802,7 +64022,9 @@ def doPrintShowOrgunitSharedDrives():
|
||||
if csvPF and FJQC.formatJSON:
|
||||
csvPF.SetJSONTitles(['name', 'JSON'])
|
||||
_, orgUnitId = getOrgUnitId(None, orgUnitPath)
|
||||
printGettingAllEntityItemsForWhom(Ent.SHAREDDRIVE, orgUnitPath, entityType=Ent.ORGANIZATIONAL_UNIT)
|
||||
sds = callGAPIpages(ci.orgUnits().memberships(), 'list', 'orgMemberships',
|
||||
pageMessage=getPageMessageForWhom(),
|
||||
parent=f'orgUnits/{orgUnitId[3:]}',
|
||||
customer=_getCustomersCustomerIdWithC(),
|
||||
filter="type == 'shared_drive'")
|
||||
@@ -65755,7 +65977,7 @@ def getPhoto(users, profileMode):
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], Msg.NOT_ALLOWED, i, count)
|
||||
continue
|
||||
if showPhotoData:
|
||||
writeStdout(base64.urlsafe_b64encode(photo_data).decode(UTF8)+'\n')
|
||||
writeStdout(base64.encodebytes(photo_data).decode(UTF8))
|
||||
except (httplib2.HttpLib2Error, google.auth.exceptions.TransportError, RuntimeError) as e:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.PHOTO, filename], str(e), i, count)
|
||||
continue
|
||||
@@ -66614,16 +66836,19 @@ def _printShowTokens(entityType, users):
|
||||
csvPF.writeCSVfile('OAuth Tokens')
|
||||
|
||||
# gam <UserTypeEntity> print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>]
|
||||
# [aggregateusersby|orderby clientid|id|appname|displaytext] [delimiter <Character>]
|
||||
# [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [delimiter <Character>]
|
||||
# gam <UserTypeEntity> show tokens|token|3lo|oauth [clientid <ClientID>]
|
||||
# [aggregateusersby|orderby clientid|id|appname|displaytext]
|
||||
# [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [delimiter <Character>]
|
||||
def printShowTokens(users):
|
||||
_printShowTokens(Cmd.ENTITY_USERS, users)
|
||||
|
||||
# gam print tokens|token [todrive <ToDriveAttribute>*] [clientid <ClientID>]
|
||||
# [aggregateusersby|orderby clientid|id|appname|displaytext] [delimiter <Character>]
|
||||
# [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [delimiter <Character>]
|
||||
# [<UserTypeEntity>]
|
||||
def doPrintTokens():
|
||||
# gam show tokens|token [clientid <ClientID>]
|
||||
# [usertokencounts|(aggregateusersby|orderby clientid|id|appname|displaytext)] [delimiter <Character>]
|
||||
# [<UserTypeEntity>]
|
||||
def doPrintShowTokens():
|
||||
_printShowTokens(None, None)
|
||||
|
||||
# gam <UserTypeEntity> deprovision|deprov [popimap] [signout] [turnoff2sv]
|
||||
@@ -73612,6 +73837,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
||||
{Cmd.ARG_SVCACCT: doCheckUpdateSvcAcct,
|
||||
Cmd.ARG_USERINVITATION: doCheckCIUserInvitations,
|
||||
Cmd.ARG_ISINVITABLE: doCheckCIUserInvitations,
|
||||
Cmd.ARG_ORG: doCheckOrgUnit,
|
||||
}
|
||||
),
|
||||
'clear':
|
||||
@@ -73875,7 +74101,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
||||
Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
|
||||
Cmd.ARG_SITEACTIVITY: doPrintDomainSiteActivity,
|
||||
Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
|
||||
Cmd.ARG_TOKEN: doPrintTokens,
|
||||
Cmd.ARG_TOKEN: doPrintShowTokens,
|
||||
Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
|
||||
Cmd.ARG_USER: doPrintUsers,
|
||||
Cmd.ARG_USERS: doPrintUsers,
|
||||
@@ -73990,6 +74216,7 @@ MAIN_COMMANDS_WITH_OBJECTS = {
|
||||
Cmd.ARG_SITE: doPrintShowDomainSites,
|
||||
Cmd.ARG_SITEACL: doProcessDomainSiteACLs,
|
||||
Cmd.ARG_SVCACCT: doPrintShowSvcAccts,
|
||||
Cmd.ARG_TOKEN: doPrintShowTokens,
|
||||
Cmd.ARG_TRANSFERAPPS: doShowTransferApps,
|
||||
Cmd.ARG_USERINVITATION: doPrintShowCIUserInvitations,
|
||||
Cmd.ARG_VAULTEXPORT: doPrintShowVaultExports,
|
||||
|
||||
@@ -94,6 +94,7 @@ class GamEntity():
|
||||
CHAT_MESSAGE_ID = 'chmi'
|
||||
CHAT_SPACE = 'chsp'
|
||||
CHAT_THREAD = 'chth'
|
||||
CHILD_ORGANIZATIONAL_UNIT = 'corg'
|
||||
CHROME_APP = 'capp'
|
||||
CHROME_APP_DEVICE = 'capd'
|
||||
CHROME_BROWSER = 'chbr'
|
||||
@@ -435,6 +436,7 @@ class GamEntity():
|
||||
CHAT_MEMBER_USER: ['Chat User Members', 'Chat User Member'],
|
||||
CHAT_SPACE: ['Chat Spaces', 'Chat Space'],
|
||||
CHAT_THREAD: ['Chat Threads', 'Chat Thread'],
|
||||
CHILD_ORGANIZATIONAL_UNIT: ['Child Organizational Units', 'Child Organizational Unit'],
|
||||
CHROME_APP: ['Chrome Applications', 'Chrome Application'],
|
||||
CHROME_APP_DEVICE: ['Chrome Application Devices', 'Chrome Application Device'],
|
||||
CHROME_BROWSER: ['Chrome Browsers', 'Chrome Browser'],
|
||||
|
||||
Reference in New Issue
Block a user