mirror of
https://github.com/GAM-team/GAM.git
synced 2026-07-03 12:21:35 +00:00
Merge branch 'main' into gcloud_reauth
This commit is contained in:
30
.github/workflows/build.yml
vendored
30
.github/workflows/build.yml
vendored
@@ -54,8 +54,18 @@ jobs:
|
|||||||
- os: macos-12
|
- os: macos-12
|
||||||
jid: 5
|
jid: 5
|
||||||
goal: build
|
goal: build
|
||||||
|
arch: x86_64
|
||||||
|
openssl_archs: darwin64-x86_64
|
||||||
|
- os: [self-hosted, macOS, ARM64]
|
||||||
|
jid: 7
|
||||||
|
goal: build
|
||||||
|
arch: aarch64
|
||||||
|
openssl_archs: darwin64-arm64
|
||||||
|
- os: [self-hosted, macOS, ARM64]
|
||||||
|
jid: 12
|
||||||
|
goal: build
|
||||||
arch: universal2
|
arch: universal2
|
||||||
openssl_archs: darwin64-x86_64 darwin64-arm64
|
openssl_archs: darwin64-arm64 darwin64-x86_64
|
||||||
- os: windows-2022
|
- os: windows-2022
|
||||||
jid: 6
|
jid: 6
|
||||||
goal: build
|
goal: build
|
||||||
@@ -104,7 +114,7 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
bin.tar.xz
|
bin.tar.xz
|
||||||
src/cpython
|
src/cpython
|
||||||
key: gam-${{ matrix.jid }}-20230608
|
key: gam-${{ matrix.jid }}-20230728
|
||||||
|
|
||||||
- name: Untar Cache archive
|
- name: Untar Cache archive
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
|
||||||
@@ -167,14 +177,15 @@ jobs:
|
|||||||
sudo apt-get -qq --yes install swig libpcsclite-dev libxslt1-dev
|
sudo apt-get -qq --yes install swig libpcsclite-dev libxslt1-dev
|
||||||
|
|
||||||
- name: MacOS install tools
|
- name: MacOS install tools
|
||||||
if: runner.os == 'macOS'
|
if: runner.os == 'macOS' && runner.arch == 'x86_64'
|
||||||
run: |
|
run: |
|
||||||
# Install latest Rust
|
# Install latest Rust
|
||||||
curl $curl_retry -fsS -o rust.sh https://sh.rustup.rs
|
curl $curl_retry -fsS -o rust.sh https://sh.rustup.rs
|
||||||
bash ./rust.sh -y
|
bash ./rust.sh -y
|
||||||
source $HOME/.cargo/env
|
source $HOME/.cargo/env
|
||||||
# needed for Rust to compile cryptography Python package for universal2
|
# needed for Rust to compile cryptography Python package for universal2
|
||||||
rustup target add aarch64-apple-darwin
|
# not needed since MacOS ARM and universal will be on self-hosted
|
||||||
|
#rustup target add aarch64-apple-darwin
|
||||||
|
|
||||||
- name: Windows Configure VCode
|
- name: Windows Configure VCode
|
||||||
uses: ilammy/msvc-dev-cmd@v1
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
@@ -248,7 +259,7 @@ jobs:
|
|||||||
git checkout "${LATEST_STABLE_TAG}"
|
git checkout "${LATEST_STABLE_TAG}"
|
||||||
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix
|
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix
|
||||||
echo "COMPILED_OPENSSL_VERSION=${COMPILED_OPENSSL_VERSION}" >> $GITHUB_ENV
|
echo "COMPILED_OPENSSL_VERSION=${COMPILED_OPENSSL_VERSION}" >> $GITHUB_ENV
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||||
for openssl_arch in $openssl_archs; do
|
for openssl_arch in $openssl_archs; do
|
||||||
ssldir="${OPENSSL_SOURCE_PATH}-${openssl_arch}"
|
ssldir="${OPENSSL_SOURCE_PATH}-${openssl_arch}"
|
||||||
mkdir -v "${ssldir}"
|
mkdir -v "${ssldir}"
|
||||||
@@ -288,7 +299,7 @@ jobs:
|
|||||||
- name: Install OpenSSL
|
- name: Install OpenSSL
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||||
for openssl_arch in $openssl_archs; do
|
for openssl_arch in $openssl_archs; do
|
||||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
||||||
# install_sw saves us ages processing man pages :-)
|
# install_sw saves us ages processing man pages :-)
|
||||||
@@ -340,7 +351,7 @@ jobs:
|
|||||||
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
cd "${PYTHON_SOURCE_PATH}"
|
cd "${PYTHON_SOURCE_PATH}"
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||||
extra_args=( "--enable-universalsdk" "--with-universal-archs=universal2" )
|
extra_args=( "--enable-universalsdk" "--with-universal-archs=universal2" )
|
||||||
else
|
else
|
||||||
extra_args=( )
|
extra_args=( )
|
||||||
@@ -430,7 +441,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
echo "before anything..."
|
echo "before anything..."
|
||||||
"${PYTHON}" -m pip list
|
"${PYTHON}" -m pip list
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||||
# cffi is a dep of cryptography and doesn't ship
|
# cffi is a dep of cryptography and doesn't ship
|
||||||
# a universal2 wheel so we must build one ourself :-/
|
# a universal2 wheel so we must build one ourself :-/
|
||||||
export CFLAGS="-arch x86_64 -arch arm64"
|
export CFLAGS="-arch x86_64 -arch arm64"
|
||||||
@@ -522,6 +533,7 @@ jobs:
|
|||||||
cp -v cacerts.pem $gampath
|
cp -v cacerts.pem $gampath
|
||||||
cp -v LICENSE $gampath
|
cp -v LICENSE $gampath
|
||||||
cp -v GamCommands.txt $gampath
|
cp -v GamCommands.txt $gampath
|
||||||
|
cp -v GamUpdate.txt $gampath
|
||||||
if [[ "${RUNNER_OS}" == "Windows" ]]; then
|
if [[ "${RUNNER_OS}" == "Windows" ]]; then
|
||||||
cp -v gam-setup.bat $gampath
|
cp -v gam-setup.bat $gampath
|
||||||
fi
|
fi
|
||||||
@@ -561,7 +573,7 @@ jobs:
|
|||||||
if: runner.os != 'Windows' && matrix.goal == 'build'
|
if: runner.os != 'Windows' && matrix.goal == 'build'
|
||||||
run: |
|
run: |
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
||||||
GAM_ARCHIVE="gam-${GAMVERSION}-macos-universal2.tar.xz"
|
GAM_ARCHIVE="gam-${GAMVERSION}-macos-${arch}.tar.xz"
|
||||||
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
|
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
|
||||||
if [[ "${staticx}" == "yes" ]]; then
|
if [[ "${staticx}" == "yes" ]]; then
|
||||||
libver="legacy"
|
libver="legacy"
|
||||||
|
|||||||
@@ -10,6 +10,46 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
|||||||
|
|
||||||
See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation.
|
See [Downloads](https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads) for Windows or other options, including manual installation.
|
||||||
|
|
||||||
|
### 6.61.19
|
||||||
|
|
||||||
|
Fixed bug in `gam <UserTypeEntity> print|show chatmembers <ChatSpace>` that caused a trap.
|
||||||
|
|
||||||
|
### 6.61.18
|
||||||
|
|
||||||
|
Added the following options to `gam [<UserTypeEntity>] create shareddrive` to allow better control
|
||||||
|
of the create/update process when attributes other than `themeid` are specified.
|
||||||
|
```
|
||||||
|
errorretries <Integer> - Number of create/update error retries; default value 5, range 0-10
|
||||||
|
updateinitialdelay <Integer> - Initial delay after create before update: default value 10, range 0-60
|
||||||
|
updateretrydelay <Integer> - Retry delay when update fails; default value 10, range 0-60
|
||||||
|
```
|
||||||
|
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/Shared-Drives#create-a-shared-drive
|
||||||
|
|
||||||
|
### 6.61.17
|
||||||
|
|
||||||
|
Updated `gam print|show vaultexports|vaultholds|vaultqueries` to not set a non-zero return code
|
||||||
|
when a vault matter changes state from `OPEN` to `CLOSED|DELETED` while the command is being processed.
|
||||||
|
|
||||||
|
Updated `gam create shareddrive <Name> ou|org|orgunit <OrgUnitItem>` to handle the following error:
|
||||||
|
```
|
||||||
|
ERROR: 403: permissionDenied - Request had insufficient authentication scopes.
|
||||||
|
```
|
||||||
|
It's not clear what causes the error.
|
||||||
|
|
||||||
|
### 6.61.16
|
||||||
|
|
||||||
|
Added the following license SKUs.
|
||||||
|
```
|
||||||
|
1010060005 - Google Workspace Essentials Plus
|
||||||
|
1010020031 - Google Workspace Frontline Standard
|
||||||
|
1010340005 - Google Workspace Business Starter - Archived User
|
||||||
|
1010340006 - Google Workspace Business Standard - Archived User
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.61.15
|
||||||
|
|
||||||
|
Added option `contentrestrictions ownerrestricted [<Boolean>]` to `<DriveFileAttribute>`.
|
||||||
|
|
||||||
### 6.61.14
|
### 6.61.14
|
||||||
|
|
||||||
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ 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$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version
|
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam version
|
||||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
||||||
GAMADV-XTD3 6.61.14 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.10.8 64-bit final
|
Python 3.10.8 64-bit final
|
||||||
MacOS High Sierra 10.13.6 x86_64
|
MacOS High Sierra 10.13.6 x86_64
|
||||||
@@ -969,7 +969,7 @@ writes the credentials into the file oauth2.txt.
|
|||||||
C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt
|
C:\GAMADV-XTD3>del C:\GAMConfig\oauth2.txt
|
||||||
C:\GAMADV-XTD3>gam version
|
C:\GAMADV-XTD3>gam version
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
||||||
GAMADV-XTD3 6.61.14 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.11.4 64-bit final
|
Python 3.11.4 64-bit final
|
||||||
Windows-10-10.0.17134 AMD64
|
Windows-10-10.0.17134 AMD64
|
||||||
|
|||||||
@@ -66,17 +66,20 @@
|
|||||||
| Google Voice Standard | 1010330004 | voicestandard |
|
| Google Voice Standard | 1010330004 | voicestandard |
|
||||||
| Google Voice Starter | 1010330003 | voicestarter |
|
| Google Voice Starter | 1010330003 | voicestarter |
|
||||||
| Google Workspace Business - Archived User | 1010340002 | gsuitebusinessarchived |
|
| Google Workspace Business - Archived User | 1010340002 | gsuitebusinessarchived |
|
||||||
| Google Workspace Business Plus - Archived User | 1010340003 | wsbizplusarchived |
|
|
||||||
| Google Workspace Business Plus | 1010020025 | wsbizplus |
|
| Google Workspace Business Plus | 1010020025 | wsbizplus |
|
||||||
|
| Google Workspace Business Plus - Archived User | 1010340003 | wsbizplusarchived |
|
||||||
| Google Workspace Business Standard | 1010020028 | wsbizstan |
|
| Google Workspace Business Standard | 1010020028 | wsbizstan |
|
||||||
|
| Google Workspace Business Standard - Archived User | 1010340006 | wsbizstanarchived |
|
||||||
| Google Workspace Business Starter | 1010020027 | wsbizstarter |
|
| Google Workspace Business Starter | 1010020027 | wsbizstarter |
|
||||||
|
| Google Workspace Business Starter - Archived User | 1010340005 | wsbizstarterarchived |
|
||||||
| Google Workspace Enterprise Essentials | 1010060003 | wsentess |
|
| Google Workspace Enterprise Essentials | 1010060003 | wsentess |
|
||||||
| Google Workspace Enterprise Plus - Archived User | 1010340001 | gsuiteenterprisearchived |
|
|
||||||
| Google Workspace Enterprise Plus | 1010020020 | wsentplus |
|
| Google Workspace Enterprise Plus | 1010020020 | wsentplus |
|
||||||
| Google Workspace Enterprise Standard - Archived User | 1010340004 | wsentstanarchived |
|
| Google Workspace Enterprise Plus - Archived User | 1010340001 | gsuiteenterprisearchived |
|
||||||
| Google Workspace Enterprise Standard | 1010020026 | wsentstan |
|
| Google Workspace Enterprise Standard | 1010020026 | wsentstan |
|
||||||
|
| Google Workspace Enterprise Standard - Archived User | 1010340004 | wsentstanarchived |
|
||||||
| Google Workspace Enterprise Starter | 1010020029 | wsentstarter |
|
| Google Workspace Enterprise Starter | 1010020029 | wsentstarter |
|
||||||
| Google Workspace Essentials | 1010060001 | wsess |
|
| Google Workspace Essentials | 1010060001 | wsess |
|
||||||
|
| Google Workspace Essentials Plus | 1010060005 | wsessplus |
|
||||||
| Google Workspace Government | Google-Apps-For-Government | gsuitegov |
|
| Google Workspace Government | Google-Apps-For-Government | gsuitegov |
|
||||||
| Google Workspace for Education Plus (Extra Student) | 1010310010 | gwepstudent |
|
| Google Workspace for Education Plus (Extra Student) | 1010310010 | gwepstudent |
|
||||||
| Google Workspace for Education Plus (Staff) | 1010310009 | gwepstaff |
|
| Google Workspace for Education Plus (Staff) | 1010310009 | gwepstaff |
|
||||||
@@ -87,7 +90,8 @@
|
|||||||
| Google Workspace for Education Standard (Staff) | 1010310006 | gwesstaff |
|
| Google Workspace for Education Standard (Staff) | 1010310006 | gwesstaff |
|
||||||
| Google Workspace for Education Standard | 1010310005 | gwes |
|
| Google Workspace for Education Standard | 1010310005 | gwes |
|
||||||
| Google Workspace for Education: Teaching and Learning Upgrade | 1010370001 | gwetlu |
|
| Google Workspace for Education: Teaching and Learning Upgrade | 1010370001 | gwetlu |
|
||||||
| Google Workspace Frontline | 1010020030 | wsflw,workspacefrontline,workspacefrontlineworker |
|
| Google Workspace Frontline Starter | 1010020030 | wsflw |
|
||||||
|
| Google Workspace Frontline Standard | 1010020031 | wsflwstan |
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ gam [<UserTypeEntity>] create teamdrive <Name>
|
|||||||
([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
[adminaccess|asadmin]
|
[adminaccess|asadmin]
|
||||||
```
|
```
|
||||||
@@ -218,14 +219,20 @@ gam [<UserTypeEntity>] create teamdrive <Name>
|
|||||||
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||||
* `hide <Boolean>` - Set Shared Drive visibility
|
* `hide <Boolean>` - Set Shared Drive visibility
|
||||||
|
|
||||||
This option is only available when the command is run as an administrator.
|
|
||||||
* `ou|org|orgunit <OrgUnitItem>` - See: https://workspaceupdates.googleblog.com/2022/05/shared-drives-in-organizational-units-open-beta.html
|
|
||||||
|
|
||||||
If any attributes other than `themeid` are specified, GAM must create the Drive and then update the Drive attributes.
|
If any attributes other than `themeid` are specified, GAM must create the Drive and then update the Drive attributes.
|
||||||
Even though the Create API returns success, the Update API fails and reports that the Drive does not exist.
|
Even though the Create API returns success, the Update API fails and reports that the Drive does not exist.
|
||||||
For this reason, GAM waits 30 seconds after the create before attempting the update. GAM repeats the update
|
* `errorretries <Integer>` - Number of create/update error retries; default value 5, range 0-10
|
||||||
with waits of 15, 30, and 45 seconds if the Update API continues to fail. This is acceptable when creating
|
* `updateinitialdelay <Integer>` - Initial delay after create before update: default value 10, range 0-60
|
||||||
a single Shared Drive, for bulk Shared Drive creation see [Bulk Create Shared Drives](#bulk-create-shared-drives).
|
* `updateretrydelay <Integer>` - Retry delay when update fails; default value 10, range 0-60
|
||||||
|
|
||||||
|
For this reason, GAM waits `updateinitialdelay <Integer>` seconds after the create before attempting the update.
|
||||||
|
GAM repeats the update `errorretries <Integer>` times waiting `updateretrydelay <Integer>` between tries
|
||||||
|
if the Update API continues to fail.
|
||||||
|
|
||||||
|
This is acceptable when creating a single Shared Drive, for bulk Shared Drive creation see [Bulk Create Shared Drives](#bulk-create-shared-drives).
|
||||||
|
|
||||||
|
This option is only available when the command is run as an administrator.
|
||||||
|
* `ou|org|orgunit <OrgUnitItem>` - See: https://workspaceupdates.googleblog.com/2022/05/shared-drives-in-organizational-units-open-beta.html
|
||||||
|
|
||||||
By default, the Google Administrator and Shared Drive name and ID values are displayed on stdout.
|
By default, the Google Administrator and Shared Drive name and ID values are displayed on stdout.
|
||||||
* `csv [todrive <ToDriveAttribute>*]` - Write Google Administrator, Shared Drive name and ID values to a CSV file.
|
* `csv [todrive <ToDriveAttribute>*]` - Write Google Administrator, Shared Drive name and ID values to a CSV file.
|
||||||
@@ -236,9 +243,9 @@ When either of these options is chosen, no infomation about Shared Drive restric
|
|||||||
To retrieve the Shared Drive ID with `returnidonly`:
|
To retrieve the Shared Drive ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
teamDriveId=`gam create teamdrive ... returnidonly`
|
teamDriveId=$(gam create teamdrive ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$teamDriveId = & gam create teamdrive ... returnidonly`
|
$teamDriveId = & gam create teamdrive ... returnidonly
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bulk Create Shared Drives
|
## Bulk Create Shared Drives
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ When copying folders, the option is only useful when copying a folder without re
|
|||||||
To retrieve the file ID with `returnidonly`:
|
To retrieve the file ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
fileId=gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
fileId=$(gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$fileId = & gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
$fileId = & gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -118,6 +118,14 @@
|
|||||||
cantrashchildren|
|
cantrashchildren|
|
||||||
canuntrash
|
canuntrash
|
||||||
|
|
||||||
|
<DriveContentRestrictionsSubfieldName> ::=
|
||||||
|
ownerrestricted|
|
||||||
|
readonly|
|
||||||
|
reason|
|
||||||
|
restrictinguser|
|
||||||
|
restrictiontime|
|
||||||
|
type
|
||||||
|
|
||||||
<DriveLabelInfoSubfieldName> ::=
|
<DriveLabelInfoSubfieldName> ::=
|
||||||
labels.id| # modifiedByMe
|
labels.id| # modifiedByMe
|
||||||
labels.revisionid| # copyRequiresWriterPermission
|
labels.revisionid| # copyRequiresWriterPermission
|
||||||
|
|||||||
@@ -108,8 +108,7 @@
|
|||||||
```
|
```
|
||||||
```
|
```
|
||||||
<DriveFileAttribute> ::=
|
<DriveFileAttribute> ::=
|
||||||
(contentrestrictions readonly false)|
|
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||||
(contentrestrictions readonly true [reason <String>])|
|
|
||||||
(copyrequireswriterpermission [<Boolean>])|
|
(copyrequireswriterpermission [<Boolean>])|
|
||||||
(description <String>)|
|
(description <String>)|
|
||||||
(folderColorRgb <ColorValue>)|
|
(folderColorRgb <ColorValue>)|
|
||||||
@@ -214,7 +213,7 @@ Alternatively, you can direct the output to a CSV file:
|
|||||||
To retrieve the file ID with `returnidonly`:
|
To retrieve the file ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
fileId=`gam user user@domain.com create drivefile ... returnidonly`
|
fileId=$(gam user user@domain.com create drivefile ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$fileId = & gam user user@domain.com create drivefile ... returnidonly
|
$fileId = & gam user user@domain.com create drivefile ... returnidonly
|
||||||
```
|
```
|
||||||
@@ -512,7 +511,7 @@ By default, the user, file name, updated file name and id values are displayed o
|
|||||||
To retrieve the file ID with `returnidonly`:
|
To retrieve the file ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
fileId=`gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly`
|
fileId=$(gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$fileId = & gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly
|
$fileId = & gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ By default, the user, form title and file name/ID values are displayed on stdout
|
|||||||
To retrieve the file ID with `returnidonly`:
|
To retrieve the file ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
fileId=`gam user user@domain.com create form title "xyz" ... returnidonly`
|
fileId=$(gam user user@domain.com create form title "xyz" ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$fileId = & gam user user@domain.com create form title "xyz" ... returnidonly
|
$fileId = & gam user user@domain.com create form title "xyz" ... returnidonly
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ gam <UserTypeEntity> create teamdrive <Name>
|
|||||||
([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
```
|
```
|
||||||
* `themeid` - a Shared Drive themeId obtained from `show teamdrivethemes`
|
* `themeid` - a Shared Drive themeId obtained from `show teamdrivethemes`
|
||||||
@@ -191,12 +192,21 @@ gam <UserTypeEntity> create teamdrive <Name>
|
|||||||
* `color` - set the Shared Drive color
|
* `color` - set the Shared Drive color
|
||||||
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||||
* `hide <Boolean>` - Set Shared Drive visibility
|
* `hide <Boolean>` - Set Shared Drive visibility
|
||||||
* `ou|org|orgunit <OrgUnitItem>` - See: https://workspaceupdates.googleblog.com/2022/05/shared-drives-in-organizational-units-open-beta.html
|
|
||||||
|
|
||||||
If any attributes other than `themeid` are specified, GAM must create the Drive and then update the Drive attributes.
|
If any attributes other than `themeid` are specified, GAM must create the Drive and then update the Drive attributes.
|
||||||
Even though the Create API returns success, the Update API fails and reports that the Drive does not exist.
|
Even though the Create API returns success, the Update API fails and reports that the Drive does not exist.
|
||||||
For this reason, GAM waits 30 seconds after the create before attempting the update. GAM repeats the update
|
* `errorretries <Integer>` - Number of create/update error retries; default value 5, range 0-10
|
||||||
with waits of 15, 30, and 45 seconds if the Update API continues to fail.
|
* `updateinitialdelay <Integer>` - Initial delay after create before update: default value 10, range 0-60
|
||||||
|
* `updateretrydelay <Integer>` - Retry delay when update fails; default value 10, range 0-60
|
||||||
|
|
||||||
|
For this reason, GAM waits `updateinitialdelay <Integer>` seconds after the create before attempting the update.
|
||||||
|
GAM repeats the update `errorretries <Integer>` times waiting `updateretrydelay <Integer>` between tries
|
||||||
|
if the Update API continues to fail.
|
||||||
|
|
||||||
|
This is acceptable when creating a single Shared Drive, for bulk Shared Drive creation see [Bulk Create Shared Drives](#bulk-create-shared-drives).
|
||||||
|
|
||||||
|
This option is only available when the command is run as an administrator.
|
||||||
|
* `ou|org|orgunit <OrgUnitItem>` - See: https://workspaceupdates.googleblog.com/2022/05/shared-drives-in-organizational-units-open-beta.html
|
||||||
|
|
||||||
By default, the user and Shared Drive name and ID values are displayed on stdout.
|
By default, the user and Shared Drive name and ID values are displayed on stdout.
|
||||||
* `csv [todrive <ToDriveAttribute>*]` - Write user, Shared Drive name and ID values to a CSV file.
|
* `csv [todrive <ToDriveAttribute>*]` - Write user, Shared Drive name and ID values to a CSV file.
|
||||||
@@ -207,9 +217,9 @@ When either of these options is chosen, no infomation about Shared Drive restric
|
|||||||
To retrieve the Shared Drive ID with `returnidonly`:
|
To retrieve the Shared Drive ID with `returnidonly`:
|
||||||
```
|
```
|
||||||
Linux/MacOS
|
Linux/MacOS
|
||||||
teamDriveId=`gam user user@domain.com create teamdrive ... returnidonly`
|
teamDriveId=$(gam user user@domain.com create teamdrive ... returnidonly)
|
||||||
Windows PowerShell
|
Windows PowerShell
|
||||||
$teamDriveId = & gam user user@domain.com create teamdrive ... returnidonly`
|
$teamDriveId = & gam user user@domain.com create teamdrive ... returnidonly
|
||||||
```
|
```
|
||||||
|
|
||||||
## Bulk Create Shared Drives
|
## Bulk Create Shared Drives
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
Print the current version of Gam with details
|
Print the current version of Gam with details
|
||||||
```
|
```
|
||||||
gam version
|
gam version
|
||||||
GAMADV-XTD3 6.61.14 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.11.4 64-bit final
|
Python 3.11.4 64-bit final
|
||||||
MacOS Monterey 12.6.6 x86_64
|
MacOS Monterey 12.6.6 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
|
Print the current version of Gam with details and time offset information
|
||||||
```
|
```
|
||||||
gam version timeoffset
|
gam version timeoffset
|
||||||
GAMADV-XTD3 6.61.14 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.11.4 64-bit final
|
Python 3.11.4 64-bit final
|
||||||
MacOS Monterey 12.6.6 x86_64
|
MacOS Monterey 12.6.6 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
|
Print the current version of Gam with extended details and SSL information
|
||||||
```
|
```
|
||||||
gam version extended
|
gam version extended
|
||||||
GAMADV-XTD3 6.61.14 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.11.4 64-bit final
|
Python 3.11.4 64-bit final
|
||||||
MacOS Monterey 12.6.6 x86_64
|
MacOS Monterey 12.6.6 x86_64
|
||||||
@@ -64,7 +64,7 @@ MacOS High Sierra 10.13.6 x86_64
|
|||||||
Path: /Users/Admin/bin/gamadv-xtd3
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
Version Check:
|
Version Check:
|
||||||
Current: 5.35.08
|
Current: 5.35.08
|
||||||
Latest: 6.61.14
|
Latest: 6.61.18
|
||||||
echo $?
|
echo $?
|
||||||
1
|
1
|
||||||
```
|
```
|
||||||
@@ -72,7 +72,7 @@ echo $?
|
|||||||
Print the current version number without details
|
Print the current version number without details
|
||||||
```
|
```
|
||||||
gam version simple
|
gam version simple
|
||||||
6.61.14
|
6.61.18
|
||||||
```
|
```
|
||||||
In Linux/MacOS you can do:
|
In Linux/MacOS you can do:
|
||||||
```
|
```
|
||||||
@@ -82,7 +82,7 @@ echo $VER
|
|||||||
Print the current version of Gam and address of this Wiki
|
Print the current version of Gam and address of this Wiki
|
||||||
```
|
```
|
||||||
gam help
|
gam help
|
||||||
GAM 6.61.14 - https://github.com/taers232c/GAMADV-XTD3
|
GAM 6.61.18 - https://github.com/taers232c/GAMADV-XTD3
|
||||||
Ross Scroggs <ross.scroggs@gmail.com>
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
Python 3.11.4 64-bit final
|
Python 3.11.4 64-bit final
|
||||||
MacOS Monterey 12.6.6 x86_64
|
MacOS Monterey 12.6.6 x86_64
|
||||||
|
|||||||
94
docs~
Normal file
94
docs~
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# Version and Help
|
||||||
|
|
||||||
|
Print the current version of Gam with details
|
||||||
|
```
|
||||||
|
gam version
|
||||||
|
GAMADV-XTD3 6.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
|
Python 3.11.4 64-bit final
|
||||||
|
MacOS Monterey 12.6.6 x86_64
|
||||||
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
|
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain.com
|
||||||
|
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.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
|
Python 3.11.4 64-bit final
|
||||||
|
MacOS Monterey 12.6.6 x86_64
|
||||||
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
|
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain.com
|
||||||
|
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.61.18 - https://github.com/taers232c/GAMADV-XTD3 - pythonsource
|
||||||
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
|
Python 3.11.4 64-bit final
|
||||||
|
MacOS Monterey 12.6.6 x86_64
|
||||||
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
|
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain.com
|
||||||
|
Time: 2023-06-02T21:10:00-07:00
|
||||||
|
Your system time differs from admin.googleapis.com by less than 1 second
|
||||||
|
OpenSSL 3.1.1 30 May 2023
|
||||||
|
cryptography 41.0.1
|
||||||
|
filelock 3.12.0
|
||||||
|
google-api-python-client 2.88.0
|
||||||
|
google-auth-httplib2 0.1.0
|
||||||
|
google-auth-oauthlib 1.0.0
|
||||||
|
google-auth 2.19.1
|
||||||
|
httplib2 0.22.0
|
||||||
|
passlib 1.7.4
|
||||||
|
python-dateutil 2.8.2
|
||||||
|
yubikey-manager 5.1.1
|
||||||
|
admin.googleapis.com connects using TLSv1.3 TLS_AES_256_GCM_SHA384
|
||||||
|
```
|
||||||
|
|
||||||
|
Print the current and latest versions of Gam and:
|
||||||
|
* set the return code to 0 if the current version is the latest version
|
||||||
|
* set the return code to 1 if the current version is not the latest
|
||||||
|
```
|
||||||
|
gam version checkrc
|
||||||
|
GAM 5.35.08 - https://github.com/taers232c/GAMADV-XTD3
|
||||||
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
|
Python 3.8.1 64-bit final
|
||||||
|
google-api-python-client 2.77.0
|
||||||
|
httplib2 0.16.0
|
||||||
|
oauth2client 4.1.3
|
||||||
|
MacOS High Sierra 10.13.6 x86_64
|
||||||
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
|
Version Check:
|
||||||
|
Current: 5.35.08
|
||||||
|
Latest: 6.61.18
|
||||||
|
echo $?
|
||||||
|
1
|
||||||
|
```
|
||||||
|
|
||||||
|
Print the current version number without details
|
||||||
|
```
|
||||||
|
gam version simple
|
||||||
|
6.61.18
|
||||||
|
```
|
||||||
|
In Linux/MacOS you can do:
|
||||||
|
```
|
||||||
|
VER=`gam version simple`
|
||||||
|
echo $VER
|
||||||
|
```
|
||||||
|
Print the current version of Gam and address of this Wiki
|
||||||
|
```
|
||||||
|
gam help
|
||||||
|
GAM 6.61.18 - https://github.com/taers232c/GAMADV-XTD3
|
||||||
|
Ross Scroggs <ross.scroggs@gmail.com>
|
||||||
|
Python 3.11.4 64-bit final
|
||||||
|
MacOS Monterey 12.6.6 x86_64
|
||||||
|
Path: /Users/Admin/bin/gamadv-xtd3
|
||||||
|
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain.com
|
||||||
|
Time: 2023-06-02T21:10:00-07:00
|
||||||
|
Help: Syntax in file /Users/Admin/bin/gamadv-xtd3/GamCommands.txt
|
||||||
|
Help: Documentation is at https://github.com/taers232c/GAMADV-XTD3/wiki
|
||||||
|
```
|
||||||
@@ -290,14 +290,18 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
wsbizplus | workspacebusinessplus | 1010020025 |
|
wsbizplus | workspacebusinessplus | 1010020025 |
|
||||||
wsbizplusarchived | workspacebusinessplusarchived | 1010340003 |
|
wsbizplusarchived | workspacebusinessplusarchived | 1010340003 |
|
||||||
wsbizstan | workspacebusinessstandard | 1010020028 |
|
wsbizstan | workspacebusinessstandard | 1010020028 |
|
||||||
|
wsbizstanarchived | workspacebusinessstandardarchived | 1010340006 |
|
||||||
wsbizstarter | workspacebusinessstarter | wsbizstart | 1010020027 |
|
wsbizstarter | workspacebusinessstarter | wsbizstart | 1010020027 |
|
||||||
|
wsbizstarterarchived | workspacebusinessstarterarchived | 1010340005 |
|
||||||
wsentess | workspaceenterpriseessentials | 1010060003 |
|
wsentess | workspaceenterpriseessentials | 1010060003 |
|
||||||
wsentplus | workspaceenterpriseplus | gae | gse | enterprise | gsuiteenterprise | 1010020020 |
|
wsentplus | workspaceenterpriseplus | gae | gse | enterprise | gsuiteenterprise | 1010020020 |
|
||||||
wsentstan | workspaceenterprisestandard | 1010020026 |
|
wsentstan | workspaceenterprisestandard | 1010020026 |
|
||||||
wsentstanarchived | workspaceenterprisestandardarchived | 1010340004 |
|
wsentstanarchived | workspaceenterprisestandardarchived | 1010340004 |
|
||||||
wsentstarter | workspaceenterprisestarter | 1010020029 | wes |
|
wsentstarter | workspaceenterprisestarter | 1010020029 | wes |
|
||||||
wsess | workspaceesentials | gsuiteessentials | essentials | d4e | driveenterprise | drive4enterprise | 1010060001 |
|
wsess | workspaceesentials | gsuiteessentials | essentials | d4e | driveenterprise | drive4enterprise | 1010060001 |
|
||||||
wsflw | workspacefrontline | workspacefrontlineworker | 1010020030
|
wsessplus | workspaceessentialsplus | 1010060005 |
|
||||||
|
wsflw | workspacefrontline | workspacefrontlineworker | 1010020030 |
|
||||||
|
wsflwstan | workspacefrontlinestan | workspacefrontlineworkerstan | 1010020031
|
||||||
|
|
||||||
## Items built from primitives
|
## Items built from primitives
|
||||||
|
|
||||||
@@ -4410,7 +4414,7 @@ gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
|
|||||||
gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
||||||
gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
||||||
|
|
||||||
# Shared Drives
|
# Shared Drives - Administrator
|
||||||
|
|
||||||
<SharedDriveFieldName> ::=
|
<SharedDriveFieldName> ::=
|
||||||
backgroundimagefile|
|
backgroundimagefile|
|
||||||
@@ -4442,30 +4446,31 @@ sharingfoldersrequiresorganizerpermission true
|
|||||||
|
|
||||||
In these commands, the Google administrator named in oauth2.txt is used.
|
In these commands, the Google administrator named in oauth2.txt is used.
|
||||||
|
|
||||||
gam show teamdrivethemes
|
gam show shareddrivethemes
|
||||||
gam create|add teamdrive <Name>
|
gam create shareddrive <Name>
|
||||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
gam update teamdrive <SharedDriveEntity> [name <Name>]
|
gam update shareddrive <SharedDriveEntity> [name <Name>]
|
||||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsFieldName> <Boolean>)*
|
(<SharedDriveRestrictionsFieldName> <Boolean>)*
|
||||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
gam delete teamdrive <SharedDriveEntity>
|
gam delete shareddrive <SharedDriveEntity>
|
||||||
[adminaccess|asadmin] [allowitemdeletion]
|
[adminaccess|asadmin] [allowitemdeletion]
|
||||||
gam hide teamdrive <SharedDriveEntity>
|
gam hide shareddrive <SharedDriveEntity>
|
||||||
gam unhide teamdrive <SharedDriveEntity>
|
gam unhide shareddrive <SharedDriveEntity>
|
||||||
gam info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
gam info shareddrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam show teamdriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
gam show shareddriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam print teamdrives [todrive <ToDriveAttribute>*]
|
gam print shareddrives [todrive <ToDriveAttribute>*]
|
||||||
[teamdriveadminquery|query <QueryTeamDrive>]
|
[teamdriveadminquery|query <QueryTeamDrive>]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
gam show teamdrives
|
gam show shareddrives
|
||||||
[teamdriveadminquery|query <QueryTeamDrive>]
|
[teamdriveadminquery|query <QueryTeamDrive>]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||||
@@ -4480,24 +4485,29 @@ gam show oushareddrives
|
|||||||
|
|
||||||
In these commands, you specify an administrator and then indicate that you want domain administrator access with the adminaccess option.
|
In these commands, you specify an administrator and then indicate that you want domain administrator access with the adminaccess option.
|
||||||
|
|
||||||
gam <UserTypeEntity> create|add teamdrive <Name> adminaccess
|
gam <UserTypeEntity> create shareddrive <Name> adminaccess
|
||||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide <Boolean>]
|
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
gam <UserTypeEntity> delete teamdrive <SharedDriveEntity>
|
gam update shareddrive <SharedDriveEntity> asadmin [name <Name>]
|
||||||
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
|
(<SharedDriveRestrictionsFieldName> <Boolean>)*
|
||||||
|
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
gam <UserTypeEntity> delete shareddrive <SharedDriveEntity>
|
||||||
adminaccess [allowitemdeletion]
|
adminaccess [allowitemdeletion]
|
||||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
gam <UserTypeEntity> info shareddrive <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam <UserTypeEntity> show teamdriveinfo <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam <UserTypeEntity> print teamdrives [todrive <ToDriveAttribute>*]
|
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
|
||||||
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
(role|roles <SharedDriveACLRoleList>)*
|
(role|roles <SharedDriveACLRoleList>)*
|
||||||
[fields <SharedDriveFieldNameList>]
|
[fields <SharedDriveFieldNameList>]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
gam <UserTypeEntity> show teamdrives
|
gam <UserTypeEntity> show shareddrives
|
||||||
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
(role|roles <SharedDriveACLRoleList>)*
|
(role|roles <SharedDriveACLRoleList>)*
|
||||||
@@ -5833,8 +5843,7 @@ gam <UserTypeEntity> show datastudiopermissions
|
|||||||
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>)
|
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>)
|
||||||
|
|
||||||
<DriveFileAttribute> ::=
|
<DriveFileAttribute> ::=
|
||||||
(contentrestrictions readonly false)|
|
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||||
(contentrestrictions readonly true [reason <String>])|
|
|
||||||
(copyrequireswriterpermission [<Boolean>])|
|
(copyrequireswriterpermission [<Boolean>])|
|
||||||
(description <String>)|
|
(description <String>)|
|
||||||
(folderColorRgb <ColorValue>)|
|
(folderColorRgb <ColorValue>)|
|
||||||
@@ -5905,8 +5914,7 @@ gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|ret
|
|||||||
[charset <CharSet>] [columndelimiter <Character>]
|
[charset <CharSet>] [columndelimiter <Character>]
|
||||||
|
|
||||||
<DriveFileCopyAttribute> ::=
|
<DriveFileCopyAttribute> ::=
|
||||||
(contentrestrictions readonly false)|
|
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||||
(contentrestrictions readonly true [reason <String>])|
|
|
||||||
(copyrequireswriterpermission [<Boolean>])|
|
(copyrequireswriterpermission [<Boolean>])|
|
||||||
(description <String>)|
|
(description <String>)|
|
||||||
ignoredefaultvisibility|
|
ignoredefaultvisibility|
|
||||||
@@ -6249,6 +6257,7 @@ gam <UserTypeEntity> collect orphans
|
|||||||
canuntrash
|
canuntrash
|
||||||
|
|
||||||
<DriveContentRestrictionsSubfieldName> ::=
|
<DriveContentRestrictionsSubfieldName> ::=
|
||||||
|
ownerrestricted|
|
||||||
readonly|
|
readonly|
|
||||||
reason|
|
reason|
|
||||||
restrictinguser|
|
restrictinguser|
|
||||||
@@ -7356,7 +7365,7 @@ gam <UserTypeEntity> show tasklists
|
|||||||
gam <UserTypeEntity> print tasklists [todrive <ToDriveAttribute>*]
|
gam <UserTypeEntity> print tasklists [todrive <ToDriveAttribute>*]
|
||||||
[countsonly | (formatjson [quotechar <Character>])]
|
[countsonly | (formatjson [quotechar <Character>])]
|
||||||
|
|
||||||
# Users - Team Drives
|
# Users - Shared Drives
|
||||||
|
|
||||||
<SharedDriveRestrictionsSubfieldName> ::=
|
<SharedDriveRestrictionsSubfieldName> ::=
|
||||||
adminmanagedrestrictions|
|
adminmanagedrestrictions|
|
||||||
@@ -7374,32 +7383,32 @@ sharingfoldersrequiresorganizerpermission false
|
|||||||
allowcontentmanagerstosharefolders false
|
allowcontentmanagerstosharefolders false
|
||||||
sharingfoldersrequiresorganizerpermission true
|
sharingfoldersrequiresorganizerpermission true
|
||||||
|
|
||||||
gam <UserTypeEntity> show teamdrivethemes
|
gam <UserTypeEntity> show shareddrivethemes
|
||||||
gam <UserTypeEntity> create|add teamdrive <Name> [adminaccess|asadmin]
|
gam <UserTypeEntity> create shareddrive <Name>
|
||||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide|hidden <Boolean>]
|
||||||
gam <UserTypeEntity> update teamdrive <SharedDriveEntity> [adminaccess|asadmin] [name <Name>]
|
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
|
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
|
gam <UserTypeEntity> update shareddrive <SharedDriveEntity> [name <Name>]
|
||||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
[hide|hidden <Boolean>]
|
||||||
gam <UserTypeEntity> delete teamdrive <SharedDriveEntity>
|
gam <UserTypeEntity> delete shareddrive <SharedDriveEntity>
|
||||||
[adminaccess|asadmin] [allowitemdeletion]
|
[allowitemdeletion]
|
||||||
gam <UserTypeEntity> hide teamdrive <SharedDriveEntity>
|
gam <UserTypeEntity> hide shareddrive <SharedDriveEntity>
|
||||||
gam <UserTypeEntity> unhide teamdrive <SharedDriveEntity>
|
gam <UserTypeEntity> unhide shareddrive <SharedDriveEntity>
|
||||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
gam <UserTypeEntity> info shareddrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam <UserTypeEntity> show teamdriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
|
||||||
[formatjson]
|
|
||||||
gam <UserTypeEntity> print teamdrives [todrive <ToDriveAttribute>*]
|
|
||||||
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
(role|roles <SharedDriveACLRoleList>)*
|
(role|roles <SharedDriveACLRoleList>)*
|
||||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
gam <UserTypeEntity> show teamdrives
|
gam <UserTypeEntity> show shareddrives
|
||||||
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
||||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||||
(role|roles <SharedDriveACLRoleList>)*
|
(role|roles <SharedDriveACLRoleList>)*
|
||||||
|
|||||||
@@ -2,12 +2,52 @@
|
|||||||
|
|
||||||
Merged GAM-Team version
|
Merged GAM-Team version
|
||||||
|
|
||||||
|
6.61.19
|
||||||
|
|
||||||
|
Fixed bug in `gam <UserTypeEntity> print|show chatmembers <ChatSpace>` that caused a trap.
|
||||||
|
|
||||||
|
6.61.18
|
||||||
|
|
||||||
|
Added the following options to `gam [<UserTypeEntity>] create shareddrive` to allow better control
|
||||||
|
of the create/update process when attributes other than `themeid` are specified.
|
||||||
|
```
|
||||||
|
errorretries <Integer> - Number of create/update error retries; default value 5, range 0-10
|
||||||
|
updateinitialdelay <Integer> - Initial delay after create before update: default value 10, range 0-60
|
||||||
|
updateretrydelay <Integer> - Retry delay when update fails; default value 10, range 0-60
|
||||||
|
```
|
||||||
|
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/Shared-Drives#create-a-shared-drive
|
||||||
|
|
||||||
|
6.61.17
|
||||||
|
|
||||||
|
Updated `gam print|show vaultexports|vaultholds|vaultqueries` to not set a non-zero return code
|
||||||
|
when a vault matter changes state from `OPEN` to `CLOSED|DELETED` while the command is being processed.
|
||||||
|
|
||||||
|
Updated `gam create shareddrive <Name> ou|org|orgunit <OrgUnitItem>` to handle the following error:
|
||||||
|
```
|
||||||
|
ERROR: 403: permissionDenied - Request had insufficient authentication scopes.
|
||||||
|
```
|
||||||
|
It's not clear what causes the error.
|
||||||
|
|
||||||
|
6.61.16
|
||||||
|
|
||||||
|
Added the following license SKUs.
|
||||||
|
```
|
||||||
|
1010060005 - Google Workspace Essentials Plus
|
||||||
|
1010020031 - Google Workspace Frontline Standard
|
||||||
|
1010340005 - Google Workspace Business Starter - Archived User
|
||||||
|
1010340006 - Google Workspace Business Standard - Archived User
|
||||||
|
```
|
||||||
|
|
||||||
|
6.61.15
|
||||||
|
|
||||||
|
Added option `contentrestrictions ownerrestricted [<Boolean>]` to `<DriveFileAttribute>`.
|
||||||
|
|
||||||
6.61.14
|
6.61.14
|
||||||
|
|
||||||
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
||||||
Options `aggregatebyuser` and `aggregatebydate` are mutually exclusive.
|
Options `aggregatebyuser` and `aggregatebydate` are mutually exclusive.
|
||||||
|
|
||||||
* https://github.com/taers232c/GAMADV-XTD3/wiki/Reports#user-reports
|
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/Reports#user-reports
|
||||||
|
|
||||||
6.61.13
|
6.61.13
|
||||||
|
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ if [ "$upgrade_only" = true ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Set config command
|
# Set config command
|
||||||
config_cmd="config no_browser false"
|
#config_cmd="config no_browser false"
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
read -p "Can you run a full browser on this machine? (usually Y for MacOS, N for Linux if you SSH into this machine) " yn
|
read -p "Can you run a full browser on this machine? (usually Y for MacOS, N for Linux if you SSH into this machine) " yn
|
||||||
@@ -298,7 +298,8 @@ while true; do
|
|||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
[Nn]*)
|
[Nn]*)
|
||||||
config_cmd="config no_browser true"
|
# config_cmd="config no_browser true"
|
||||||
|
touch "$target_dir/gam/nobrowser.txt" > /dev/null 2>&1
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -316,7 +317,8 @@ while true; do
|
|||||||
if [ "$adminuser" == "" ]; then
|
if [ "$adminuser" == "" ]; then
|
||||||
read -p "Please enter your Google Workspace admin email address: " adminuser
|
read -p "Please enter your Google Workspace admin email address: " adminuser
|
||||||
fi
|
fi
|
||||||
"$target_dir/$target_gam" $config_cmd create project $adminuser
|
# "$target_dir/$target_gam" $config_cmd create project $adminuser
|
||||||
|
"$target_dir/$target_gam" create project $adminuser
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Project creation complete."
|
echo_green "Project creation complete."
|
||||||
@@ -341,7 +343,8 @@ while $project_created; do
|
|||||||
read -p "Are you ready to authorize GAM to perform Google Workspace management operations as your admin account? (yes or no) " yn
|
read -p "Are you ready to authorize GAM to perform Google Workspace management operations as your admin account? (yes or no) " yn
|
||||||
case $yn in
|
case $yn in
|
||||||
[Yy]*)
|
[Yy]*)
|
||||||
"$target_dir/$target_gam" $config_cmd oauth create $adminuser
|
# "$target_dir/$target_gam" $config_cmd oauth create $adminuser
|
||||||
|
"$target_dir/$target_gam" oauth create $adminuser
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Admin authorization complete."
|
echo_green "Admin authorization complete."
|
||||||
@@ -370,7 +373,8 @@ while $admin_authorized; do
|
|||||||
read -p "Please enter the email address of a regular Google Workspace user: " regularuser
|
read -p "Please enter the email address of a regular Google Workspace user: " regularuser
|
||||||
fi
|
fi
|
||||||
echo_yellow "Great! Checking service account scopes.This will fail the first time. Follow the steps to authorize and retry. It can take a few minutes for scopes to PASS after they've been authorized in the admin console."
|
echo_yellow "Great! Checking service account scopes.This will fail the first time. Follow the steps to authorize and retry. It can take a few minutes for scopes to PASS after they've been authorized in the admin console."
|
||||||
"$target_dir/$target_gam" $config_cmd user $regularuser check serviceaccount
|
# "$target_dir/$target_gam" $config_cmd user $regularuser check serviceaccount
|
||||||
|
"$target_dir/$target_gam" user $regularuser check serviceaccount
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Service account authorization complete."
|
echo_green "Service account authorization complete."
|
||||||
@@ -391,7 +395,8 @@ while $admin_authorized; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo_green "Here's information about your new GAM installation:"
|
echo_green "Here's information about your new GAM installation:"
|
||||||
"$target_dir/$target_gam" $config_cmd save version extended
|
#"$target_dir/$target_gam" $config_cmd save version extended
|
||||||
|
"$target_dir/$target_gam" version extended
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc != 0 )); then
|
if (( $rc != 0 )); then
|
||||||
echo_red "ERROR: Failed running GAM for the first time with $rc. Please report this error to GAM mailing list. Exiting."
|
echo_red "ERROR: Failed running GAM for the first time with $rc. Please report this error to GAM mailing list. Exiting."
|
||||||
|
|||||||
@@ -44,7 +44,10 @@ pyz = PYZ(a.pure,
|
|||||||
# GAM with older versions anyway
|
# GAM with older versions anyway
|
||||||
match platform:
|
match platform:
|
||||||
case "darwin":
|
case "darwin":
|
||||||
|
if getenv('arch') == 'universal2':
|
||||||
target_arch = "universal2"
|
target_arch = "universal2"
|
||||||
|
else:
|
||||||
|
target_arch = None
|
||||||
strip = True
|
strip = True
|
||||||
case "win32":
|
case "win32":
|
||||||
target_arch = None
|
target_arch = None
|
||||||
|
|||||||
@@ -8424,7 +8424,7 @@ class CSVPrintFile():
|
|||||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||||
GAPI.insufficientFilePermissions, GAPI.insufficientParentPermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
GAPI.insufficientFilePermissions, GAPI.insufficientParentPermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||||
@@ -24786,10 +24786,10 @@ def doInfoChatMember():
|
|||||||
infoChatMember([None])
|
infoChatMember([None])
|
||||||
|
|
||||||
# gam [<UserTypeEntity>] show chatmembers <ChatSpace>
|
# gam [<UserTypeEntity>] show chatmembers <ChatSpace>
|
||||||
# [showinvited [<Boolean>]] [filter <String>]
|
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
|
||||||
# [formatjson]
|
# [formatjson]
|
||||||
# gam [<UserTypeEntity>] print chatmembers [todrive <ToDriveAttribute>*] <ChatSpace>
|
# gam [<UserTypeEntity>] print chatmembers [todrive <ToDriveAttribute>*] <ChatSpace>
|
||||||
# [showinvited [<Boolean>]] [filter <String>]
|
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
|
||||||
# [formatjson [quotechar <Character>]]
|
# [formatjson [quotechar <Character>]]
|
||||||
def printShowChatMembers(users):
|
def printShowChatMembers(users):
|
||||||
def _printChatMember(user, member):
|
def _printChatMember(user, member):
|
||||||
@@ -24808,8 +24808,8 @@ def printShowChatMembers(users):
|
|||||||
cd = buildGAPIObject(API.DIRECTORY)
|
cd = buildGAPIObject(API.DIRECTORY)
|
||||||
csvPF = CSVPrintFile(['User', 'name'] if not isinstance(users, list) else ['name']) if Act.csvFormat() else None
|
csvPF = CSVPrintFile(['User', 'name'] if not isinstance(users, list) else ['name']) if Act.csvFormat() else None
|
||||||
FJQC = FormatJSONQuoteChar(csvPF)
|
FJQC = FormatJSONQuoteChar(csvPF)
|
||||||
parent = pfilter = None
|
kwargs = {}
|
||||||
showInvited = False
|
parent = None
|
||||||
while Cmd.ArgumentsRemaining():
|
while Cmd.ArgumentsRemaining():
|
||||||
myarg = getArgument()
|
myarg = getArgument()
|
||||||
if csvPF and myarg == 'todrive':
|
if csvPF and myarg == 'todrive':
|
||||||
@@ -24817,16 +24817,18 @@ def printShowChatMembers(users):
|
|||||||
elif myarg == 'space' or myarg.startswith('spaces/'):
|
elif myarg == 'space' or myarg.startswith('spaces/'):
|
||||||
parent = getChatSpace(myarg)
|
parent = getChatSpace(myarg)
|
||||||
elif myarg == 'showinvited':
|
elif myarg == 'showinvited':
|
||||||
showInvited = getBoolean()
|
kwargs['showInvited'] = getBoolean()
|
||||||
|
elif myarg == 'showgroups':
|
||||||
|
kwargs['showGroups'] = getBoolean()
|
||||||
elif myarg =='filter':
|
elif myarg =='filter':
|
||||||
pfilter = getString(Cmd.OB_STRING)
|
kwargs['filter'] = getString(Cmd.OB_STRING)
|
||||||
else:
|
else:
|
||||||
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
||||||
if not parent:
|
if not parent:
|
||||||
missingArgumentExit('space')
|
missingArgumentExit('space')
|
||||||
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
|
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
|
||||||
if pfilter:
|
if 'filter' in kwargs:
|
||||||
qfilter += f', {pfilter}'
|
qfilter += f', {kwargs["filter"]}'
|
||||||
i, count, users = getEntityArgument(users)
|
i, count, users = getEntityArgument(users)
|
||||||
for user in users:
|
for user in users:
|
||||||
i += 1
|
i += 1
|
||||||
@@ -24837,7 +24839,7 @@ def printShowChatMembers(users):
|
|||||||
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
||||||
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter),
|
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter),
|
||||||
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
|
throwReasons=[GAPI.NOT_FOUND, GAPI.INVALID_ARGUMENT, GAPI.PERMISSION_DENIED],
|
||||||
pageSize=CHAT_PAGE_SIZE, parent=parent, filter=pfilter, showInvited=showInvited)
|
pageSize=CHAT_PAGE_SIZE, parent=parent, **kwargs)
|
||||||
for member in members:
|
for member in members:
|
||||||
_getChatMemberEmail(cd, member)
|
_getChatMemberEmail(cd, member)
|
||||||
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
|
except (GAPI.notFound, GAPI.invalidArgument, GAPI.permissionDenied) as e:
|
||||||
@@ -36838,10 +36840,13 @@ def warnMatterNotOpen(v, matter, matterNameId, j, jcount):
|
|||||||
matterId=matter['matterId'], view='BASIC', fields='state')['state']
|
matterId=matter['matterId'], view='BASIC', fields='state')['state']
|
||||||
except (GAPI.notFound, GAPI.forbidden):
|
except (GAPI.notFound, GAPI.forbidden):
|
||||||
matter['state'] = 'Unknown'
|
matter['state'] = 'Unknown'
|
||||||
printWarningMessage(DATA_NOT_AVALIABLE_RC, formatKeyValueList('',
|
else:
|
||||||
|
setSysExitRC(DATA_NOT_AVALIABLE_RC)
|
||||||
|
message = formatKeyValueList('',
|
||||||
Ent.FormatEntityValueList([Ent.VAULT_MATTER, matterNameId])+
|
Ent.FormatEntityValueList([Ent.VAULT_MATTER, matterNameId])+
|
||||||
[Msg.MATTER_NOT_OPEN.format(matter['state'])],
|
[Msg.MATTER_NOT_OPEN.format(matter['state'])],
|
||||||
currentCount(j, jcount)))
|
currentCount(j, jcount))
|
||||||
|
writeStderr(f'\n{Ind.Spaces()}{WARNING_PREFIX}{message}\n')
|
||||||
|
|
||||||
def _cleanVaultExport(export, cd):
|
def _cleanVaultExport(export, cd):
|
||||||
query = export.get('query')
|
query = export.get('query')
|
||||||
@@ -48704,13 +48709,14 @@ DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP = {
|
|||||||
|
|
||||||
DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP = {
|
DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP = {
|
||||||
'readonly': 'readOnly',
|
'readonly': 'readOnly',
|
||||||
|
'ownerrestricted': 'ownerRestricted',
|
||||||
}
|
}
|
||||||
|
|
||||||
def getDriveFileProperty(visibility=None):
|
def getDriveFileProperty(visibility=None):
|
||||||
key = getString(Cmd.OB_PROPERTY_KEY)
|
key = getString(Cmd.OB_PROPERTY_KEY)
|
||||||
value = getString(Cmd.OB_PROPERTY_VALUE, minLen=0) or None
|
value = getString(Cmd.OB_PROPERTY_VALUE, minLen=0) or None
|
||||||
if visibility is None:
|
if visibility is None:
|
||||||
if Cmd.PeekArgumentPresent(DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP):
|
if Cmd.PeekArgumentPresent(list(DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP.keys())):
|
||||||
visibility = getChoice(DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP, mapChoice=True)
|
visibility = getChoice(DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP, mapChoice=True)
|
||||||
else:
|
else:
|
||||||
visibility = 'properties'
|
visibility = 'properties'
|
||||||
@@ -48781,10 +48787,11 @@ def getDriveFileCopyAttribute(myarg, body, parameters):
|
|||||||
elif myarg == 'writerscantshare':
|
elif myarg == 'writerscantshare':
|
||||||
body['writersCanShare'] = not getBoolean()
|
body['writersCanShare'] = not getBoolean()
|
||||||
elif myarg == 'contentrestrictions':
|
elif myarg == 'contentrestrictions':
|
||||||
body['contentRestrictions'] = [{}]
|
while Cmd.PeekArgumentPresent(list(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP.keys())):
|
||||||
|
body.setdefault('contentRestrictions', [{}])
|
||||||
restriction = getChoice(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP, mapChoice=True)
|
restriction = getChoice(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP, mapChoice=True)
|
||||||
if restriction == 'readOnly':
|
|
||||||
body['contentRestrictions'][0][restriction] = getBoolean()
|
body['contentRestrictions'][0][restriction] = getBoolean()
|
||||||
|
if restriction == 'readOnly':
|
||||||
if checkArgumentPresent(['reason']):
|
if checkArgumentPresent(['reason']):
|
||||||
if body['contentRestrictions'][0][restriction]:
|
if body['contentRestrictions'][0][restriction]:
|
||||||
body['contentRestrictions'][0]['reason'] = getString(Cmd.OB_STRING, minLen=0)
|
body['contentRestrictions'][0]['reason'] = getString(Cmd.OB_STRING, minLen=0)
|
||||||
@@ -49682,6 +49689,7 @@ DRIVE_CAPABILITIES_SUBFIELDS_CHOICE_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DRIVE_CONTENT_RESTRICTIONS_SUBFIELDS_CHOICE_MAP = {
|
DRIVE_CONTENT_RESTRICTIONS_SUBFIELDS_CHOICE_MAP = {
|
||||||
|
'ownerrestricted': 'ownerRestricted',
|
||||||
'readonly': 'readOnly',
|
'readonly': 'readOnly',
|
||||||
'reason': 'reason',
|
'reason': 'reason',
|
||||||
'restrictinguser': 'restructingUser',
|
'restrictinguser': 'restructingUser',
|
||||||
@@ -53953,7 +53961,7 @@ def _copyPermissions(drive, user, i, count, j, jcount,
|
|||||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||||
@@ -55006,7 +55014,7 @@ def _updateMoveFilePermissions(drive, user, i, count,
|
|||||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||||
@@ -57990,7 +57998,7 @@ def createDriveFileACL(users, useDomainAdminAccess=False):
|
|||||||
GAPI.cannotSetExpiration,
|
GAPI.cannotSetExpiration,
|
||||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||||
@@ -58119,7 +58127,7 @@ def updateDriveFileACLs(users, useDomainAdminAccess=False):
|
|||||||
GAPI.cannotSetExpiration,
|
GAPI.cannotSetExpiration,
|
||||||
GAPI.badRequest, GAPI.invalidOwnershipTransfer, GAPI.cannotRemoveOwner,
|
GAPI.badRequest, GAPI.invalidOwnershipTransfer, GAPI.cannotRemoveOwner,
|
||||||
GAPI.fileNeverWritable, GAPI.ownershipChangeAcrossDomainNotPermitted, GAPI.sharingRateLimitExceeded,
|
GAPI.fileNeverWritable, GAPI.ownershipChangeAcrossDomainNotPermitted, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.insufficientAdministratorPrivileges,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.organizerOnNonTeamDriveItemNotSupported, GAPI.fileOrganizerOnNonTeamDriveNotSupported,
|
GAPI.organizerOnNonTeamDriveItemNotSupported, GAPI.fileOrganizerOnNonTeamDriveNotSupported,
|
||||||
GAPI.cannotUpdatePermission, GAPI.cannotModifyInheritedTeamDrivePermission, GAPI.fieldNotWritable) as e:
|
GAPI.cannotUpdatePermission, GAPI.cannotModifyInheritedTeamDrivePermission, GAPI.fieldNotWritable) as e:
|
||||||
@@ -58218,7 +58226,7 @@ def createDriveFilePermissions(users, useDomainAdminAccess=False):
|
|||||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||||
@@ -59230,7 +59238,7 @@ def _getSharedDriveRestrictions(myarg, body):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci=None):
|
def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci, returnIdOnly):
|
||||||
action = Act.Get()
|
action = Act.Get()
|
||||||
name = f'orgUnits/-/memberships/shared_drive;{driveId}'
|
name = f'orgUnits/-/memberships/shared_drive;{driveId}'
|
||||||
if ci is None:
|
if ci is None:
|
||||||
@@ -59240,6 +59248,7 @@ def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci=None):
|
|||||||
try:
|
try:
|
||||||
callGAPI(ci.orgUnits().memberships(), 'move',
|
callGAPI(ci.orgUnits().memberships(), 'move',
|
||||||
name=name, body=cibody)
|
name=name, body=cibody)
|
||||||
|
if not returnIdOnly:
|
||||||
Act.Set(Act.MOVE)
|
Act.Set(Act.MOVE)
|
||||||
entityModifierNewValueActionPerformed([Ent.SHAREDDRIVE, driveId], Act.MODIFIER_TO, f'{Ent.Singular(Ent.ORGANIZATIONAL_UNIT)}: {orgUnit}', i, count)
|
entityModifierNewValueActionPerformed([Ent.SHAREDDRIVE, driveId], Act.MODIFIER_TO, f'{Ent.Singular(Ent.ORGANIZATIONAL_UNIT)}: {orgUnit}', i, count)
|
||||||
except (GAPI.notFound, GAPI.forbidden, GAPI.badRequest, GAPI.internalError,
|
except (GAPI.notFound, GAPI.forbidden, GAPI.badRequest, GAPI.internalError,
|
||||||
@@ -59254,10 +59263,11 @@ def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci=None):
|
|||||||
# [(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
# [(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||||
# (<SharedDriveRestrictionsFieldName> <Boolean>)*
|
# (<SharedDriveRestrictionsFieldName> <Boolean>)*
|
||||||
# [hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
# [hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||||
|
# [errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||||
# [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
# [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||||
def createSharedDrive(users, useDomainAdminAccess=False):
|
def createSharedDrive(users, useDomainAdminAccess=False):
|
||||||
def waitingForCreationToComplete(sleep_time):
|
def waitingForCreationToComplete(sleep_time):
|
||||||
writeStdout(Ind.Spaces()+Msg.WAITING_FOR_SHARED_DRIVE_CREATION_TO_COMPLETE_SLEEPING.format(sleep_time))
|
writeStderr(Ind.Spaces()+Msg.WAITING_FOR_SHARED_DRIVE_CREATION_TO_COMPLETE_SLEEPING.format(sleep_time))
|
||||||
time.sleep(sleep_time)
|
time.sleep(sleep_time)
|
||||||
|
|
||||||
requestId = str(uuid.uuid4())
|
requestId = str(uuid.uuid4())
|
||||||
@@ -59267,6 +59277,9 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
addCSVData = {}
|
addCSVData = {}
|
||||||
hide = returnIdOnly = False
|
hide = returnIdOnly = False
|
||||||
orgUnit = orgUnitId = ci = None
|
orgUnit = orgUnitId = ci = None
|
||||||
|
errorRetries = 5
|
||||||
|
updateInitialDelay = 10
|
||||||
|
updateRetryDelay = 10
|
||||||
while Cmd.ArgumentsRemaining():
|
while Cmd.ArgumentsRemaining():
|
||||||
myarg = getArgument()
|
myarg = getArgument()
|
||||||
if _getSharedDriveTheme(myarg, body):
|
if _getSharedDriveTheme(myarg, body):
|
||||||
@@ -59288,6 +59301,12 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
|
addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
|
||||||
elif myarg in ADMIN_ACCESS_OPTIONS:
|
elif myarg in ADMIN_ACCESS_OPTIONS:
|
||||||
useDomainAdminAccess = True
|
useDomainAdminAccess = True
|
||||||
|
elif myarg == 'errorretries':
|
||||||
|
errorRetries = getInteger(minVal=0, maxVal=10)
|
||||||
|
elif myarg == 'updateinitialdelay':
|
||||||
|
updateInitialDelay = getInteger(minVal=0, maxVal=60)
|
||||||
|
elif myarg == 'updateretrydelay':
|
||||||
|
updateRetryDelay = getInteger(minVal=0, maxVal=60)
|
||||||
else:
|
else:
|
||||||
unknownArgumentExit()
|
unknownArgumentExit()
|
||||||
if csvPF:
|
if csvPF:
|
||||||
@@ -59328,7 +59347,7 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
break
|
break
|
||||||
except (GAPI.transientError, GAPI.teamDriveAlreadyExists) as e:
|
except (GAPI.transientError, GAPI.teamDriveAlreadyExists) as e:
|
||||||
retry += 1
|
retry += 1
|
||||||
if retry > 3:
|
if retry > errorRetries:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||||
break
|
break
|
||||||
requestId = str(uuid.uuid4())
|
requestId = str(uuid.uuid4())
|
||||||
@@ -59342,7 +59361,8 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
userSvcNotApplicableOrDriveDisabled(user, str(e), i, count)
|
userSvcNotApplicableOrDriveDisabled(user, str(e), i, count)
|
||||||
break
|
break
|
||||||
if doUpdate and (updateBody or hide or orgUnit):
|
if doUpdate and (updateBody or hide or orgUnit):
|
||||||
waitingForCreationToComplete(30)
|
if updateBody or hide:
|
||||||
|
waitingForCreationToComplete(updateInitialDelay)
|
||||||
try:
|
try:
|
||||||
if updateBody:
|
if updateBody:
|
||||||
Act.Set(Act.UPDATE)
|
Act.Set(Act.UPDATE)
|
||||||
@@ -59351,20 +59371,21 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
try:
|
try:
|
||||||
callGAPI(drive.drives(), 'update',
|
callGAPI(drive.drives(), 'update',
|
||||||
bailOnInternalError=True,
|
bailOnInternalError=True,
|
||||||
throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND, GAPI.FORBIDDEN, GAPI.BAD_REQUEST,
|
throwReasons=GAPI.DRIVE_USER_THROW_REASONS+[GAPI.NOT_FOUND, GAPI.FORBIDDEN,
|
||||||
GAPI.NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE,
|
GAPI.NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE,
|
||||||
GAPI.INTERNAL_ERROR, GAPI.FILE_NOT_FOUND],
|
GAPI.BAD_REQUEST, GAPI.INTERNAL_ERROR, GAPI.PERMISSION_DENIED,
|
||||||
|
GAPI.FILE_NOT_FOUND],
|
||||||
useDomainAdminAccess=useDomainAdminAccess, driveId=driveId, body=updateBody)
|
useDomainAdminAccess=useDomainAdminAccess, driveId=driveId, body=updateBody)
|
||||||
if not returnIdOnly and not csvPF:
|
if not returnIdOnly and not csvPF:
|
||||||
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
||||||
break
|
break
|
||||||
except GAPI.notFound as e:
|
except GAPI.notFound as e:
|
||||||
retry += 1
|
retry += 1
|
||||||
if retry > 3:
|
if retry > errorRetries:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||||
break
|
break
|
||||||
waitingForCreationToComplete(retry*15)
|
waitingForCreationToComplete(updateRetryDelay)
|
||||||
except (GAPI.badRequest, GAPI.internalError) as e:
|
except (GAPI.badRequest, GAPI.internalError, GAPI.permissionDenied) as e:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||||
break
|
break
|
||||||
except GAPI.fileNotFound as e:
|
except GAPI.fileNotFound as e:
|
||||||
@@ -59385,12 +59406,12 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
break
|
break
|
||||||
except GAPI.notFound as e:
|
except GAPI.notFound as e:
|
||||||
retry += 1
|
retry += 1
|
||||||
if retry > 3:
|
if retry > errorRetries:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||||
break
|
break
|
||||||
time.sleep(retry*retry)
|
waitingForCreationToComplete(updateRetryDelay)
|
||||||
if orgUnit:
|
if orgUnit:
|
||||||
ci = _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci)
|
ci = _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci, returnIdOnly)
|
||||||
except (GAPI.forbidden, GAPI.badRequest, GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
except (GAPI.forbidden, GAPI.badRequest, GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||||
except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
|
except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
|
||||||
@@ -59459,7 +59480,7 @@ def updateSharedDrive(users, useDomainAdminAccess=False):
|
|||||||
driveId=driveId)
|
driveId=driveId)
|
||||||
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
||||||
if orgUnit:
|
if orgUnit:
|
||||||
ci = _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci)
|
ci = _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci, False)
|
||||||
except (GAPI.notFound, GAPI.forbidden, GAPI.badRequest, GAPI.internalError,
|
except (GAPI.notFound, GAPI.forbidden, GAPI.badRequest, GAPI.internalError,
|
||||||
GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
||||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ LABEL_MUTATION_ILLEGAL_SELECTION = 'labelMutationIllegalSelection'
|
|||||||
LABEL_MUTATION_UNKNOWN_FIELD = 'labelMutationUnknownField'
|
LABEL_MUTATION_UNKNOWN_FIELD = 'labelMutationUnknownField'
|
||||||
LIMIT_EXCEEDED = 'limitExceeded'
|
LIMIT_EXCEEDED = 'limitExceeded'
|
||||||
LOGIN_REQUIRED = 'loginRequired'
|
LOGIN_REQUIRED = 'loginRequired'
|
||||||
|
MALFORMED_WORKING_LOCATION_EVENT = 'malformedWorkingLocationEvent'
|
||||||
MEMBER_NOT_FOUND = 'memberNotFound'
|
MEMBER_NOT_FOUND = 'memberNotFound'
|
||||||
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE = 'noListTeamDrivesAdministratorPrivilege'
|
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE = 'noListTeamDrivesAdministratorPrivilege'
|
||||||
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE = 'noManageTeamDriveAdministratorPrivilege'
|
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE = 'noManageTeamDriveAdministratorPrivilege'
|
||||||
@@ -149,6 +150,7 @@ SHARING_RATE_LIMIT_EXCEEDED = 'sharingRateLimitExceeded'
|
|||||||
SHORTCUT_TARGET_INVALID = 'shortcutTargetInvalid'
|
SHORTCUT_TARGET_INVALID = 'shortcutTargetInvalid'
|
||||||
STORAGE_QUOTA_EXCEEDED = 'storageQuotaExceeded'
|
STORAGE_QUOTA_EXCEEDED = 'storageQuotaExceeded'
|
||||||
SYSTEM_ERROR = 'systemError'
|
SYSTEM_ERROR = 'systemError'
|
||||||
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION = 'targetUserRoleLimitedByLicenseRestriction'
|
||||||
TEAMDRIVE_ALREADY_EXISTS = 'teamDriveAlreadyExists'
|
TEAMDRIVE_ALREADY_EXISTS = 'teamDriveAlreadyExists'
|
||||||
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION = 'teamDriveDomainUsersOnlyRestriction'
|
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION = 'teamDriveDomainUsersOnlyRestriction'
|
||||||
TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION = 'teamDriveTeamMembersOnlyRestriction'
|
TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION = 'teamDriveTeamMembersOnlyRestriction'
|
||||||
@@ -196,7 +198,7 @@ DRIVE_COPY_THROW_REASONS = DRIVE_ACCESS_THROW_REASONS+[CANNOT_COPY_FILE, BAD_REQ
|
|||||||
DRIVE_GET_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND]
|
DRIVE_GET_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND]
|
||||||
DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST, OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED, CANNOT_SET_EXPIRATION,
|
DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST, OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED, CANNOT_SET_EXPIRATION,
|
||||||
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
||||||
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
||||||
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
||||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
||||||
CANNOT_SHARE_TEAMDRIVE_WITH_NONGOOGLE_ACCOUNTS,
|
CANNOT_SHARE_TEAMDRIVE_WITH_NONGOOGLE_ACCOUNTS,
|
||||||
@@ -213,7 +215,7 @@ DRIVE3_GET_ACL_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, FORBIDDEN, IN
|
|||||||
DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANNOT_REMOVE_OWNER, CANNOT_SET_EXPIRATION,
|
DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANNOT_REMOVE_OWNER, CANNOT_SET_EXPIRATION,
|
||||||
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
||||||
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
||||||
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
||||||
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
||||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
||||||
CANNOT_SHARE_TEAMDRIVE_WITH_NONGOOGLE_ACCOUNTS,
|
CANNOT_SHARE_TEAMDRIVE_WITH_NONGOOGLE_ACCOUNTS,
|
||||||
@@ -501,6 +503,8 @@ class limitExceeded(Exception):
|
|||||||
pass
|
pass
|
||||||
class loginRequired(Exception):
|
class loginRequired(Exception):
|
||||||
pass
|
pass
|
||||||
|
class malformedWorkingLocationEvent(Exception):
|
||||||
|
pass
|
||||||
class memberNotFound(Exception):
|
class memberNotFound(Exception):
|
||||||
pass
|
pass
|
||||||
class noListTeamDrivesAdministratorPrivilege(Exception):
|
class noListTeamDrivesAdministratorPrivilege(Exception):
|
||||||
@@ -577,6 +581,8 @@ class storageQuotaExceeded(Exception):
|
|||||||
pass
|
pass
|
||||||
class systemError(Exception):
|
class systemError(Exception):
|
||||||
pass
|
pass
|
||||||
|
class targetUserRoleLimitedByLicenseRestriction(Exception):
|
||||||
|
pass
|
||||||
class teamDriveAlreadyExists(Exception):
|
class teamDriveAlreadyExists(Exception):
|
||||||
pass
|
pass
|
||||||
class teamDriveDomainUsersOnlyRestriction(Exception):
|
class teamDriveDomainUsersOnlyRestriction(Exception):
|
||||||
@@ -701,6 +707,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
LABEL_MUTATION_UNKNOWN_FIELD: labelMutationUnknownField,
|
LABEL_MUTATION_UNKNOWN_FIELD: labelMutationUnknownField,
|
||||||
LIMIT_EXCEEDED: limitExceeded,
|
LIMIT_EXCEEDED: limitExceeded,
|
||||||
LOGIN_REQUIRED: loginRequired,
|
LOGIN_REQUIRED: loginRequired,
|
||||||
|
MALFORMED_WORKING_LOCATION_EVENT: malformedWorkingLocationEvent,
|
||||||
MEMBER_NOT_FOUND: memberNotFound,
|
MEMBER_NOT_FOUND: memberNotFound,
|
||||||
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE: noListTeamDrivesAdministratorPrivilege,
|
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE: noListTeamDrivesAdministratorPrivilege,
|
||||||
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE: noManageTeamDriveAdministratorPrivilege,
|
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE: noManageTeamDriveAdministratorPrivilege,
|
||||||
@@ -739,6 +746,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
SHORTCUT_TARGET_INVALID: shortcutTargetInvalid,
|
SHORTCUT_TARGET_INVALID: shortcutTargetInvalid,
|
||||||
STORAGE_QUOTA_EXCEEDED: storageQuotaExceeded,
|
STORAGE_QUOTA_EXCEEDED: storageQuotaExceeded,
|
||||||
SYSTEM_ERROR: systemError,
|
SYSTEM_ERROR: systemError,
|
||||||
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION: targetUserRoleLimitedByLicenseRestriction,
|
||||||
TEAMDRIVE_ALREADY_EXISTS: teamDriveAlreadyExists,
|
TEAMDRIVE_ALREADY_EXISTS: teamDriveAlreadyExists,
|
||||||
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION: teamDriveDomainUsersOnlyRestriction,
|
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION: teamDriveDomainUsersOnlyRestriction,
|
||||||
TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION: teamDriveTeamMembersOnlyRestriction,
|
TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION: teamDriveTeamMembersOnlyRestriction,
|
||||||
|
|||||||
@@ -107,7 +107,9 @@ _SKUS = {
|
|||||||
'1010020029': {
|
'1010020029': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wes', 'wsentstarter', 'workspaceenterprisestarter'], 'displayName': 'Workspace Enterprise Starter'},
|
'product': 'Google-Apps', 'aliases': ['wes', 'wsentstarter', 'workspaceenterprisestarter'], 'displayName': 'Workspace Enterprise Starter'},
|
||||||
'1010020030': {
|
'1010020030': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsflw', 'workspacefrontline', 'workspacefrontlineworker'], 'displayName': 'Google Workspace Frontline'},
|
'product': 'Google-Apps', 'aliases': ['wsflw', 'workspacefrontline', 'workspacefrontlineworker'], 'displayName': 'Google Workspace Frontline Starter'},
|
||||||
|
'1010020031`': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['wsflwstan', 'workspacefrontlinestan', 'workspacefrontlineworkerstan'], 'displayName': 'Google Workspace Frontline Standard'},
|
||||||
'1010340001': {
|
'1010340001': {
|
||||||
'product': '101034', 'aliases': ['gseau', 'enterprisearchived', 'gsuiteenterprisearchived'], 'displayName': 'Google Workspace Enterprise Plus - Archived User'},
|
'product': '101034', 'aliases': ['gseau', 'enterprisearchived', 'gsuiteenterprisearchived'], 'displayName': 'Google Workspace Enterprise Plus - Archived User'},
|
||||||
'1010340002': {
|
'1010340002': {
|
||||||
@@ -116,12 +118,18 @@ _SKUS = {
|
|||||||
'product': '101034', 'aliases': ['wsbizplusarchived', 'workspacebusinessplusarchived'], 'displayName': 'Google Workspace Business Plus - Archived User'},
|
'product': '101034', 'aliases': ['wsbizplusarchived', 'workspacebusinessplusarchived'], 'displayName': 'Google Workspace Business Plus - Archived User'},
|
||||||
'1010340004': {
|
'1010340004': {
|
||||||
'product': '101034', 'aliases': ['wsentstanarchived', 'workspaceenterprisestandardarchived'], 'displayName': 'Google Workspace Enterprise Standard - Archived User'},
|
'product': '101034', 'aliases': ['wsentstanarchived', 'workspaceenterprisestandardarchived'], 'displayName': 'Google Workspace Enterprise Standard - Archived User'},
|
||||||
|
'1010340005': {
|
||||||
|
'product': '101034', 'aliases': ['wsbizstarterarchived', 'workspacebusinessstarterarchived'], 'displayName': 'Google Workspace Business Starter - Archived User'},
|
||||||
|
'1010340006': {
|
||||||
|
'product': '101034', 'aliases': ['wsbizstanarchived', 'workspacebusinessstanarchived'], 'displayName': 'Google Workspace Business Standard - Archived User'},
|
||||||
'1010060001': {
|
'1010060001': {
|
||||||
'product': '101006', 'aliases': ['gsuiteessentials', 'essentials',
|
'product': '101006', 'aliases': ['gsuiteessentials', 'essentials',
|
||||||
'd4e', 'driveenterprise', 'drive4enterprise',
|
'd4e', 'driveenterprise', 'drive4enterprise',
|
||||||
'wsess', 'workspaceesentials'], 'displayName': 'Google Workspace Essentials'},
|
'wsess', 'workspaceesentials'], 'displayName': 'Google Workspace Essentials'},
|
||||||
'1010060003': {
|
'1010060003': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsentess', 'workspaceenterpriseessentials'], 'displayName': 'Google Workspace Enterprise Essentials'},
|
'product': 'Google-Apps', 'aliases': ['wsentess', 'workspaceenterpriseessentials'], 'displayName': 'Google Workspace Enterprise Essentials'},
|
||||||
|
'1010060005': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['wsessplus', 'workspaceessentialsplus'], 'displayName': 'Google Workspace Essentials Plus'},
|
||||||
'Google-Drive-storage-20GB': {
|
'Google-Drive-storage-20GB': {
|
||||||
'product': 'Google-Drive-storage', 'aliases': ['drive20gb', '20gb', 'googledrivestorage20gb'], 'displayName': 'Google Drive Storage 20GB'},
|
'product': 'Google-Drive-storage', 'aliases': ['drive20gb', '20gb', 'googledrivestorage20gb'], 'displayName': 'Google Drive Storage 20GB'},
|
||||||
'Google-Drive-storage-50GB': {
|
'Google-Drive-storage-50GB': {
|
||||||
|
|||||||
Reference in New Issue
Block a user