mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-22 15:11:37 +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
|
||||
jid: 5
|
||||
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
|
||||
openssl_archs: darwin64-x86_64 darwin64-arm64
|
||||
openssl_archs: darwin64-arm64 darwin64-x86_64
|
||||
- os: windows-2022
|
||||
jid: 6
|
||||
goal: build
|
||||
@@ -104,7 +114,7 @@ jobs:
|
||||
path: |
|
||||
bin.tar.xz
|
||||
src/cpython
|
||||
key: gam-${{ matrix.jid }}-20230608
|
||||
key: gam-${{ matrix.jid }}-20230728
|
||||
|
||||
- name: Untar Cache archive
|
||||
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
|
||||
|
||||
- name: MacOS install tools
|
||||
if: runner.os == 'macOS'
|
||||
if: runner.os == 'macOS' && runner.arch == 'x86_64'
|
||||
run: |
|
||||
# Install latest Rust
|
||||
curl $curl_retry -fsS -o rust.sh https://sh.rustup.rs
|
||||
bash ./rust.sh -y
|
||||
source $HOME/.cargo/env
|
||||
# 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
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
@@ -248,7 +259,7 @@ jobs:
|
||||
git checkout "${LATEST_STABLE_TAG}"
|
||||
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix
|
||||
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
|
||||
ssldir="${OPENSSL_SOURCE_PATH}-${openssl_arch}"
|
||||
mkdir -v "${ssldir}"
|
||||
@@ -288,7 +299,7 @@ jobs:
|
||||
- name: Install OpenSSL
|
||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||
for openssl_arch in $openssl_archs; do
|
||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
||||
# 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'
|
||||
run: |
|
||||
cd "${PYTHON_SOURCE_PATH}"
|
||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
||||
extra_args=( "--enable-universalsdk" "--with-universal-archs=universal2" )
|
||||
else
|
||||
extra_args=( )
|
||||
@@ -430,7 +441,7 @@ jobs:
|
||||
run: |
|
||||
echo "before anything..."
|
||||
"${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
|
||||
# a universal2 wheel so we must build one ourself :-/
|
||||
export CFLAGS="-arch x86_64 -arch arm64"
|
||||
@@ -522,6 +533,7 @@ jobs:
|
||||
cp -v cacerts.pem $gampath
|
||||
cp -v LICENSE $gampath
|
||||
cp -v GamCommands.txt $gampath
|
||||
cp -v GamUpdate.txt $gampath
|
||||
if [[ "${RUNNER_OS}" == "Windows" ]]; then
|
||||
cp -v gam-setup.bat $gampath
|
||||
fi
|
||||
@@ -561,7 +573,7 @@ jobs:
|
||||
if: runner.os != 'Windows' && matrix.goal == 'build'
|
||||
run: |
|
||||
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
|
||||
if [[ "${staticx}" == "yes" ]]; then
|
||||
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.
|
||||
|
||||
### 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
|
||||
|
||||
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$ ./gam version
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
||||
GAMADV-XTD3 6.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>
|
||||
Python 3.10.8 64-bit final
|
||||
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>gam version
|
||||
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>
|
||||
Python 3.11.4 64-bit final
|
||||
Windows-10-10.0.17134 AMD64
|
||||
|
||||
@@ -66,17 +66,20 @@
|
||||
| Google Voice Standard | 1010330004 | voicestandard |
|
||||
| Google Voice Starter | 1010330003 | voicestarter |
|
||||
| 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 - Archived User | 1010340003 | wsbizplusarchived |
|
||||
| Google Workspace Business Standard | 1010020028 | wsbizstan |
|
||||
| Google Workspace Business Standard - Archived User | 1010340006 | wsbizstanarchived |
|
||||
| Google Workspace Business Starter | 1010020027 | wsbizstarter |
|
||||
| Google Workspace Business Starter - Archived User | 1010340005 | wsbizstarterarchived |
|
||||
| Google Workspace Enterprise Essentials | 1010060003 | wsentess |
|
||||
| Google Workspace Enterprise Plus - Archived User | 1010340001 | gsuiteenterprisearchived |
|
||||
| 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 - Archived User | 1010340004 | wsentstanarchived |
|
||||
| Google Workspace Enterprise Starter | 1010020029 | wsentstarter |
|
||||
| Google Workspace Essentials | 1010060001 | wsess |
|
||||
| Google Workspace Essentials Plus | 1010060005 | wsessplus |
|
||||
| Google Workspace Government | Google-Apps-For-Government | gsuitegov |
|
||||
| Google Workspace for Education Plus (Extra Student) | 1010310010 | gwepstudent |
|
||||
| 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 | 1010310005 | gwes |
|
||||
| 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
|
||||
```
|
||||
|
||||
@@ -206,6 +206,7 @@ gam [<UserTypeEntity>] create teamdrive <Name>
|
||||
([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||
[adminaccess|asadmin]
|
||||
```
|
||||
@@ -218,14 +219,20 @@ gam [<UserTypeEntity>] create teamdrive <Name>
|
||||
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||
* `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.
|
||||
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
|
||||
with waits of 15, 30, and 45 seconds 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).
|
||||
* `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
|
||||
|
||||
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.
|
||||
* `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`:
|
||||
```
|
||||
Linux/MacOS
|
||||
teamDriveId=`gam create teamdrive ... returnidonly`
|
||||
teamDriveId=$(gam create teamdrive ... returnidonly)
|
||||
Windows PowerShell
|
||||
$teamDriveId = & gam create teamdrive ... returnidonly`
|
||||
$teamDriveId = & gam create teamdrive ... returnidonly
|
||||
```
|
||||
|
||||
## 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`:
|
||||
```
|
||||
Linux/MacOS
|
||||
fileId=gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
||||
fileId=$(gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly)
|
||||
Windows PowerShell
|
||||
$fileId = & gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
||||
```
|
||||
|
||||
@@ -118,6 +118,14 @@
|
||||
cantrashchildren|
|
||||
canuntrash
|
||||
|
||||
<DriveContentRestrictionsSubfieldName> ::=
|
||||
ownerrestricted|
|
||||
readonly|
|
||||
reason|
|
||||
restrictinguser|
|
||||
restrictiontime|
|
||||
type
|
||||
|
||||
<DriveLabelInfoSubfieldName> ::=
|
||||
labels.id| # modifiedByMe
|
||||
labels.revisionid| # copyRequiresWriterPermission
|
||||
|
||||
@@ -108,8 +108,7 @@
|
||||
```
|
||||
```
|
||||
<DriveFileAttribute> ::=
|
||||
(contentrestrictions readonly false)|
|
||||
(contentrestrictions readonly true [reason <String>])|
|
||||
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||
(copyrequireswriterpermission [<Boolean>])|
|
||||
(description <String>)|
|
||||
(folderColorRgb <ColorValue>)|
|
||||
@@ -214,7 +213,7 @@ Alternatively, you can direct the output to a CSV file:
|
||||
To retrieve the file ID with `returnidonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
fileId=`gam user user@domain.com create drivefile ... returnidonly`
|
||||
fileId=$(gam user user@domain.com create drivefile ... returnidonly)
|
||||
Windows PowerShell
|
||||
$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`:
|
||||
```
|
||||
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
|
||||
$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`:
|
||||
```
|
||||
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
|
||||
$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>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||
[(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||
```
|
||||
* `themeid` - a Shared Drive themeId obtained from `show teamdrivethemes`
|
||||
@@ -191,12 +192,21 @@ gam <UserTypeEntity> create teamdrive <Name>
|
||||
* `color` - set the Shared Drive color
|
||||
* `<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||
* `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.
|
||||
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
|
||||
with waits of 15, 30, and 45 seconds if the Update API continues to fail.
|
||||
* `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
|
||||
|
||||
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.
|
||||
* `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`:
|
||||
```
|
||||
Linux/MacOS
|
||||
teamDriveId=`gam user user@domain.com create teamdrive ... returnidonly`
|
||||
teamDriveId=$(gam user user@domain.com create teamdrive ... returnidonly)
|
||||
Windows PowerShell
|
||||
$teamDriveId = & gam user user@domain.com create teamdrive ... returnidonly`
|
||||
$teamDriveId = & gam user user@domain.com create teamdrive ... returnidonly
|
||||
```
|
||||
|
||||
## Bulk Create Shared Drives
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Print the current version of Gam with details
|
||||
```
|
||||
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>
|
||||
Python 3.11.4 64-bit final
|
||||
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
|
||||
```
|
||||
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>
|
||||
Python 3.11.4 64-bit final
|
||||
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
|
||||
```
|
||||
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>
|
||||
Python 3.11.4 64-bit final
|
||||
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
|
||||
Version Check:
|
||||
Current: 5.35.08
|
||||
Latest: 6.61.14
|
||||
Latest: 6.61.18
|
||||
echo $?
|
||||
1
|
||||
```
|
||||
@@ -72,7 +72,7 @@ echo $?
|
||||
Print the current version number without details
|
||||
```
|
||||
gam version simple
|
||||
6.61.14
|
||||
6.61.18
|
||||
```
|
||||
In Linux/MacOS you can do:
|
||||
```
|
||||
@@ -82,7 +82,7 @@ echo $VER
|
||||
Print the current version of Gam and address of this Wiki
|
||||
```
|
||||
gam help
|
||||
GAM 6.61.14 - https://github.com/taers232c/GAMADV-XTD3
|
||||
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
|
||||
|
||||
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 |
|
||||
wsbizplusarchived | workspacebusinessplusarchived | 1010340003 |
|
||||
wsbizstan | workspacebusinessstandard | 1010020028 |
|
||||
wsbizstanarchived | workspacebusinessstandardarchived | 1010340006 |
|
||||
wsbizstarter | workspacebusinessstarter | wsbizstart | 1010020027 |
|
||||
wsbizstarterarchived | workspacebusinessstarterarchived | 1010340005 |
|
||||
wsentess | workspaceenterpriseessentials | 1010060003 |
|
||||
wsentplus | workspaceenterpriseplus | gae | gse | enterprise | gsuiteenterprise | 1010020020 |
|
||||
wsentstan | workspaceenterprisestandard | 1010020026 |
|
||||
wsentstanarchived | workspaceenterprisestandardarchived | 1010340004 |
|
||||
wsentstarter | workspaceenterprisestarter | 1010020029 | wes |
|
||||
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
|
||||
|
||||
@@ -4410,7 +4414,7 @@ gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
|
||||
gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
||||
gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
||||
|
||||
# Shared Drives
|
||||
# Shared Drives - Administrator
|
||||
|
||||
<SharedDriveFieldName> ::=
|
||||
backgroundimagefile|
|
||||
@@ -4442,30 +4446,31 @@ sharingfoldersrequiresorganizerpermission true
|
||||
|
||||
In these commands, the Google administrator named in oauth2.txt is used.
|
||||
|
||||
gam show teamdrivethemes
|
||||
gam create|add teamdrive <Name>
|
||||
gam show shareddrivethemes
|
||||
gam create shareddrive <Name>
|
||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||
[(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>])]
|
||||
(<SharedDriveRestrictionsFieldName> <Boolean>)*
|
||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
gam delete teamdrive <SharedDriveEntity>
|
||||
gam delete shareddrive <SharedDriveEntity>
|
||||
[adminaccess|asadmin] [allowitemdeletion]
|
||||
gam hide teamdrive <SharedDriveEntity>
|
||||
gam unhide teamdrive <SharedDriveEntity>
|
||||
gam info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
gam hide shareddrive <SharedDriveEntity>
|
||||
gam unhide shareddrive <SharedDriveEntity>
|
||||
gam info shareddrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam show teamdriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
gam show shareddriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam print teamdrives [todrive <ToDriveAttribute>*]
|
||||
gam print shareddrives [todrive <ToDriveAttribute>*]
|
||||
[teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||
[formatjson [quotechar <Character>]]
|
||||
gam show teamdrives
|
||||
gam show shareddrives
|
||||
[teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
[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.
|
||||
|
||||
gam <UserTypeEntity> create|add teamdrive <Name> adminaccess
|
||||
gam <UserTypeEntity> create shareddrive <Name> adminaccess
|
||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide <Boolean>]
|
||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
[errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||
[(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]
|
||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||
gam <UserTypeEntity> info shareddrive <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> show teamdriveinfo <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||
gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity> adminaccess [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> print teamdrives [todrive <ToDriveAttribute>*]
|
||||
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
|
||||
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
(role|roles <SharedDriveACLRoleList>)*
|
||||
[fields <SharedDriveFieldNameList>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
gam <UserTypeEntity> show teamdrives
|
||||
gam <UserTypeEntity> show shareddrives
|
||||
adminaccess [teamdriveadminquery|query <QueryTeamDrive>]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
(role|roles <SharedDriveACLRoleList>)*
|
||||
@@ -5833,8 +5843,7 @@ gam <UserTypeEntity> show datastudiopermissions
|
||||
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>)
|
||||
|
||||
<DriveFileAttribute> ::=
|
||||
(contentrestrictions readonly false)|
|
||||
(contentrestrictions readonly true [reason <String>])|
|
||||
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||
(copyrequireswriterpermission [<Boolean>])|
|
||||
(description <String>)|
|
||||
(folderColorRgb <ColorValue>)|
|
||||
@@ -5905,8 +5914,7 @@ gam <UserTypeEntity> update drivefile <DriveFileEntity> [copy] [returnidonly|ret
|
||||
[charset <CharSet>] [columndelimiter <Character>]
|
||||
|
||||
<DriveFileCopyAttribute> ::=
|
||||
(contentrestrictions readonly false)|
|
||||
(contentrestrictions readonly true [reason <String>])|
|
||||
(contentrestrictions (readonly false)|(readonly true [reason <String>]) [ownerrestricted [<Boolean>]])|
|
||||
(copyrequireswriterpermission [<Boolean>])|
|
||||
(description <String>)|
|
||||
ignoredefaultvisibility|
|
||||
@@ -6249,6 +6257,7 @@ gam <UserTypeEntity> collect orphans
|
||||
canuntrash
|
||||
|
||||
<DriveContentRestrictionsSubfieldName> ::=
|
||||
ownerrestricted|
|
||||
readonly|
|
||||
reason|
|
||||
restrictinguser|
|
||||
@@ -7356,7 +7365,7 @@ gam <UserTypeEntity> show tasklists
|
||||
gam <UserTypeEntity> print tasklists [todrive <ToDriveAttribute>*]
|
||||
[countsonly | (formatjson [quotechar <Character>])]
|
||||
|
||||
# Users - Team Drives
|
||||
# Users - Shared Drives
|
||||
|
||||
<SharedDriveRestrictionsSubfieldName> ::=
|
||||
adminmanagedrestrictions|
|
||||
@@ -7374,32 +7383,32 @@ sharingfoldersrequiresorganizerpermission false
|
||||
allowcontentmanagerstosharefolders false
|
||||
sharingfoldersrequiresorganizerpermission true
|
||||
|
||||
gam <UserTypeEntity> show teamdrivethemes
|
||||
gam <UserTypeEntity> create|add teamdrive <Name> [adminaccess|asadmin]
|
||||
gam <UserTypeEntity> show shareddrivethemes
|
||||
gam <UserTypeEntity> create shareddrive <Name>
|
||||
[(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
gam <UserTypeEntity> update teamdrive <SharedDriveEntity> [adminaccess|asadmin] [name <Name>]
|
||||
[hide|hidden <Boolean>]
|
||||
[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>])]
|
||||
(<SharedDriveRestrictionsSubfieldName> <Boolean>)*
|
||||
[hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
gam <UserTypeEntity> delete teamdrive <SharedDriveEntity>
|
||||
[adminaccess|asadmin] [allowitemdeletion]
|
||||
gam <UserTypeEntity> hide teamdrive <SharedDriveEntity>
|
||||
gam <UserTypeEntity> unhide teamdrive <SharedDriveEntity>
|
||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[hide|hidden <Boolean>]
|
||||
gam <UserTypeEntity> delete shareddrive <SharedDriveEntity>
|
||||
[allowitemdeletion]
|
||||
gam <UserTypeEntity> hide shareddrive <SharedDriveEntity>
|
||||
gam <UserTypeEntity> unhide shareddrive <SharedDriveEntity>
|
||||
gam <UserTypeEntity> info shareddrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> info teamdrive <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
gam <UserTypeEntity> show shareddriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> show teamdriveinfo <SharedDriveEntity> [fields <SharedDriveFieldNameList>]
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> print teamdrives [todrive <ToDriveAttribute>*]
|
||||
gam <UserTypeEntity> print shareddrives [todrive <ToDriveAttribute>*]
|
||||
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
(role|roles <SharedDriveACLRoleList>)*
|
||||
[fields <SharedDriveFieldNameList>] [noorgunits [<Boolean>]]
|
||||
[formatjson [quotechar <Character>]]
|
||||
gam <UserTypeEntity> show teamdrives
|
||||
gam <UserTypeEntity> show shareddrives
|
||||
[adminaccess|asadmin [teamdriveadminquery|query <QueryTeamDrive>]]
|
||||
[matchname <RegularExpression>] [orgunit|org|ou <OrgUnitPath>]
|
||||
(role|roles <SharedDriveACLRoleList>)*
|
||||
|
||||
@@ -2,12 +2,52 @@
|
||||
|
||||
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
|
||||
|
||||
Added `aggregatebyuser [Boolean]` option to `gam report user` to allow data aggregation for users across multiple dates.
|
||||
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
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ if [ "$upgrade_only" = true ]; then
|
||||
fi
|
||||
|
||||
# Set config command
|
||||
config_cmd="config no_browser false"
|
||||
#config_cmd="config no_browser false"
|
||||
|
||||
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
|
||||
@@ -298,7 +298,8 @@ while true; do
|
||||
break
|
||||
;;
|
||||
[Nn]*)
|
||||
config_cmd="config no_browser true"
|
||||
# config_cmd="config no_browser true"
|
||||
touch "$target_dir/gam/nobrowser.txt" > /dev/null 2>&1
|
||||
break
|
||||
;;
|
||||
*)
|
||||
@@ -316,7 +317,8 @@ while true; do
|
||||
if [ "$adminuser" == "" ]; then
|
||||
read -p "Please enter your Google Workspace admin email address: " adminuser
|
||||
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=$?
|
||||
if (( $rc == 0 )); then
|
||||
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
|
||||
case $yn in
|
||||
[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=$?
|
||||
if (( $rc == 0 )); then
|
||||
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
|
||||
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."
|
||||
"$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=$?
|
||||
if (( $rc == 0 )); then
|
||||
echo_green "Service account authorization complete."
|
||||
@@ -391,7 +395,8 @@ while $admin_authorized; do
|
||||
done
|
||||
|
||||
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=$?
|
||||
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."
|
||||
|
||||
@@ -44,7 +44,10 @@ pyz = PYZ(a.pure,
|
||||
# GAM with older versions anyway
|
||||
match platform:
|
||||
case "darwin":
|
||||
target_arch = "universal2"
|
||||
if getenv('arch') == 'universal2':
|
||||
target_arch = "universal2"
|
||||
else:
|
||||
target_arch = None
|
||||
strip = True
|
||||
case "win32":
|
||||
target_arch = None
|
||||
|
||||
@@ -8424,7 +8424,7 @@ class CSVPrintFile():
|
||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||
GAPI.insufficientFilePermissions, GAPI.insufficientParentPermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||
@@ -24786,10 +24786,10 @@ def doInfoChatMember():
|
||||
infoChatMember([None])
|
||||
|
||||
# gam [<UserTypeEntity>] show chatmembers <ChatSpace>
|
||||
# [showinvited [<Boolean>]] [filter <String>]
|
||||
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
|
||||
# [formatjson]
|
||||
# gam [<UserTypeEntity>] print chatmembers [todrive <ToDriveAttribute>*] <ChatSpace>
|
||||
# [showinvited [<Boolean>]] [filter <String>]
|
||||
# [showinvited [<Boolean>]] [showgroups [<Boolean>]] [filter <String>]
|
||||
# [formatjson [quotechar <Character>]]
|
||||
def printShowChatMembers(users):
|
||||
def _printChatMember(user, member):
|
||||
@@ -24808,8 +24808,8 @@ def printShowChatMembers(users):
|
||||
cd = buildGAPIObject(API.DIRECTORY)
|
||||
csvPF = CSVPrintFile(['User', 'name'] if not isinstance(users, list) else ['name']) if Act.csvFormat() else None
|
||||
FJQC = FormatJSONQuoteChar(csvPF)
|
||||
parent = pfilter = None
|
||||
showInvited = False
|
||||
kwargs = {}
|
||||
parent = None
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if csvPF and myarg == 'todrive':
|
||||
@@ -24817,16 +24817,18 @@ def printShowChatMembers(users):
|
||||
elif myarg == 'space' or myarg.startswith('spaces/'):
|
||||
parent = getChatSpace(myarg)
|
||||
elif myarg == 'showinvited':
|
||||
showInvited = getBoolean()
|
||||
kwargs['showInvited'] = getBoolean()
|
||||
elif myarg == 'showgroups':
|
||||
kwargs['showGroups'] = getBoolean()
|
||||
elif myarg =='filter':
|
||||
pfilter = getString(Cmd.OB_STRING)
|
||||
kwargs['filter'] = getString(Cmd.OB_STRING)
|
||||
else:
|
||||
FJQC.GetFormatJSONQuoteChar(myarg, True)
|
||||
if not parent:
|
||||
missingArgumentExit('space')
|
||||
qfilter = f'{Ent.Singular(Ent.CHAT_SPACE)}: {parent}'
|
||||
if pfilter:
|
||||
qfilter += f', {pfilter}'
|
||||
if 'filter' in kwargs:
|
||||
qfilter += f', {kwargs["filter"]}'
|
||||
i, count, users = getEntityArgument(users)
|
||||
for user in users:
|
||||
i += 1
|
||||
@@ -24837,7 +24839,7 @@ def printShowChatMembers(users):
|
||||
members = callGAPIpages(chat.spaces().members(), 'list', 'memberships',
|
||||
pageMessage=_getChatPageMessage(Ent.CHAT_MEMBER, user, i, count, qfilter),
|
||||
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:
|
||||
_getChatMemberEmail(cd, member)
|
||||
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']
|
||||
except (GAPI.notFound, GAPI.forbidden):
|
||||
matter['state'] = 'Unknown'
|
||||
printWarningMessage(DATA_NOT_AVALIABLE_RC, formatKeyValueList('',
|
||||
Ent.FormatEntityValueList([Ent.VAULT_MATTER, matterNameId])+
|
||||
[Msg.MATTER_NOT_OPEN.format(matter['state'])],
|
||||
currentCount(j, jcount)))
|
||||
else:
|
||||
setSysExitRC(DATA_NOT_AVALIABLE_RC)
|
||||
message = formatKeyValueList('',
|
||||
Ent.FormatEntityValueList([Ent.VAULT_MATTER, matterNameId])+
|
||||
[Msg.MATTER_NOT_OPEN.format(matter['state'])],
|
||||
currentCount(j, jcount))
|
||||
writeStderr(f'\n{Ind.Spaces()}{WARNING_PREFIX}{message}\n')
|
||||
|
||||
def _cleanVaultExport(export, cd):
|
||||
query = export.get('query')
|
||||
@@ -48704,13 +48709,14 @@ DRIVEFILE_PROPERTY_VISIBILITY_CHOICE_MAP = {
|
||||
|
||||
DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP = {
|
||||
'readonly': 'readOnly',
|
||||
'ownerrestricted': 'ownerRestricted',
|
||||
}
|
||||
|
||||
def getDriveFileProperty(visibility=None):
|
||||
key = getString(Cmd.OB_PROPERTY_KEY)
|
||||
value = getString(Cmd.OB_PROPERTY_VALUE, minLen=0) or 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)
|
||||
else:
|
||||
visibility = 'properties'
|
||||
@@ -48781,16 +48787,17 @@ def getDriveFileCopyAttribute(myarg, body, parameters):
|
||||
elif myarg == 'writerscantshare':
|
||||
body['writersCanShare'] = not getBoolean()
|
||||
elif myarg == 'contentrestrictions':
|
||||
body['contentRestrictions'] = [{}]
|
||||
restriction = getChoice(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP, mapChoice=True)
|
||||
if restriction == 'readOnly':
|
||||
while Cmd.PeekArgumentPresent(list(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP.keys())):
|
||||
body.setdefault('contentRestrictions', [{}])
|
||||
restriction = getChoice(DRIVE_FILE_CONTENT_RESTRICTIONS_CHOICE_MAP, mapChoice=True)
|
||||
body['contentRestrictions'][0][restriction] = getBoolean()
|
||||
if checkArgumentPresent(['reason']):
|
||||
if body['contentRestrictions'][0][restriction]:
|
||||
body['contentRestrictions'][0]['reason'] = getString(Cmd.OB_STRING, minLen=0)
|
||||
else:
|
||||
Cmd.Backup()
|
||||
usageErrorExit(Msg.REASON_ONLY_VALID_WITH_CONTENTRESTRICTIONS_READONLY_TRUE)
|
||||
if restriction == 'readOnly':
|
||||
if checkArgumentPresent(['reason']):
|
||||
if body['contentRestrictions'][0][restriction]:
|
||||
body['contentRestrictions'][0]['reason'] = getString(Cmd.OB_STRING, minLen=0)
|
||||
else:
|
||||
Cmd.Backup()
|
||||
usageErrorExit(Msg.REASON_ONLY_VALID_WITH_CONTENTRESTRICTIONS_READONLY_TRUE)
|
||||
elif myarg == 'property':
|
||||
driveprop = getDriveFileProperty()
|
||||
body.setdefault(driveprop['visibility'], {})
|
||||
@@ -49682,6 +49689,7 @@ DRIVE_CAPABILITIES_SUBFIELDS_CHOICE_MAP = {
|
||||
}
|
||||
|
||||
DRIVE_CONTENT_RESTRICTIONS_SUBFIELDS_CHOICE_MAP = {
|
||||
'ownerrestricted': 'ownerRestricted',
|
||||
'readonly': 'readOnly',
|
||||
'reason': 'reason',
|
||||
'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,
|
||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||
@@ -55006,7 +55014,7 @@ def _updateMoveFilePermissions(drive, user, i, count,
|
||||
except (GAPI.badRequest, GAPI.invalid, GAPI.fileNotFound, GAPI.forbidden, GAPI.internalError,
|
||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||
@@ -57990,7 +57998,7 @@ def createDriveFileACL(users, useDomainAdminAccess=False):
|
||||
GAPI.cannotSetExpiration,
|
||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||
@@ -58119,7 +58127,7 @@ def updateDriveFileACLs(users, useDomainAdminAccess=False):
|
||||
GAPI.cannotSetExpiration,
|
||||
GAPI.badRequest, GAPI.invalidOwnershipTransfer, GAPI.cannotRemoveOwner,
|
||||
GAPI.fileNeverWritable, GAPI.ownershipChangeAcrossDomainNotPermitted, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.insufficientAdministratorPrivileges,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.organizerOnNonTeamDriveItemNotSupported, GAPI.fileOrganizerOnNonTeamDriveNotSupported,
|
||||
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,
|
||||
GAPI.insufficientFilePermissions, GAPI.unknownError, GAPI.ownershipChangeAcrossDomainNotPermitted,
|
||||
GAPI.teamDriveDomainUsersOnlyRestriction, GAPI.teamDriveTeamMembersOnlyRestriction,
|
||||
GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.targetUserRoleLimitedByLicenseRestriction, GAPI.insufficientAdministratorPrivileges, GAPI.sharingRateLimitExceeded,
|
||||
GAPI.publishOutNotPermitted, GAPI.shareInNotPermitted, GAPI.shareOutNotPermitted, GAPI.shareOutNotPermittedToUser,
|
||||
GAPI.cannotShareTeamDriveTopFolderWithAnyoneOrDomains, GAPI.cannotShareTeamDriveWithNonGoogleAccounts,
|
||||
GAPI.ownerOnTeamDriveItemNotSupported,
|
||||
@@ -59230,7 +59238,7 @@ def _getSharedDriveRestrictions(myarg, body):
|
||||
return True
|
||||
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()
|
||||
name = f'orgUnits/-/memberships/shared_drive;{driveId}'
|
||||
if ci is None:
|
||||
@@ -59240,8 +59248,9 @@ def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci=None):
|
||||
try:
|
||||
callGAPI(ci.orgUnits().memberships(), 'move',
|
||||
name=name, body=cibody)
|
||||
Act.Set(Act.MOVE)
|
||||
entityModifierNewValueActionPerformed([Ent.SHAREDDRIVE, driveId], Act.MODIFIER_TO, f'{Ent.Singular(Ent.ORGANIZATIONAL_UNIT)}: {orgUnit}', i, count)
|
||||
if not returnIdOnly:
|
||||
Act.Set(Act.MOVE)
|
||||
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,
|
||||
GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||
@@ -59254,10 +59263,11 @@ def _moveSharedDriveToOU(orgUnit, orgUnitId, driveId, user, i, count, ci=None):
|
||||
# [(theme|themeid <String>) | ([customtheme <DriveFileID> <Float> <Float> <Float>] [color <ColorValue>])]
|
||||
# (<SharedDriveRestrictionsFieldName> <Boolean>)*
|
||||
# [hide|hidden <Boolean>] [ou|org|orgunit <OrgUnitItem>]
|
||||
# [errorretries <Integer>] [updateinitialdelay <Integer>] [updateretrydelay <Integer>]
|
||||
# [(csv [todrive <ToDriveAttribute>*] (addcsvdata <FieldName> <String>)*) | returnidonly]
|
||||
def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
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)
|
||||
|
||||
requestId = str(uuid.uuid4())
|
||||
@@ -59267,6 +59277,9 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
addCSVData = {}
|
||||
hide = returnIdOnly = False
|
||||
orgUnit = orgUnitId = ci = None
|
||||
errorRetries = 5
|
||||
updateInitialDelay = 10
|
||||
updateRetryDelay = 10
|
||||
while Cmd.ArgumentsRemaining():
|
||||
myarg = getArgument()
|
||||
if _getSharedDriveTheme(myarg, body):
|
||||
@@ -59288,6 +59301,12 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
addCSVData[k] = getString(Cmd.OB_STRING, minLen=0)
|
||||
elif myarg in ADMIN_ACCESS_OPTIONS:
|
||||
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:
|
||||
unknownArgumentExit()
|
||||
if csvPF:
|
||||
@@ -59328,7 +59347,7 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
break
|
||||
except (GAPI.transientError, GAPI.teamDriveAlreadyExists) as e:
|
||||
retry += 1
|
||||
if retry > 3:
|
||||
if retry > errorRetries:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||
break
|
||||
requestId = str(uuid.uuid4())
|
||||
@@ -59342,7 +59361,8 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
userSvcNotApplicableOrDriveDisabled(user, str(e), i, count)
|
||||
break
|
||||
if doUpdate and (updateBody or hide or orgUnit):
|
||||
waitingForCreationToComplete(30)
|
||||
if updateBody or hide:
|
||||
waitingForCreationToComplete(updateInitialDelay)
|
||||
try:
|
||||
if updateBody:
|
||||
Act.Set(Act.UPDATE)
|
||||
@@ -59351,20 +59371,21 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
try:
|
||||
callGAPI(drive.drives(), 'update',
|
||||
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.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)
|
||||
if not returnIdOnly and not csvPF:
|
||||
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
||||
break
|
||||
except GAPI.notFound as e:
|
||||
retry += 1
|
||||
if retry > 3:
|
||||
if retry > errorRetries:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||
break
|
||||
waitingForCreationToComplete(retry*15)
|
||||
except (GAPI.badRequest, GAPI.internalError) as e:
|
||||
waitingForCreationToComplete(updateRetryDelay)
|
||||
except (GAPI.badRequest, GAPI.internalError, GAPI.permissionDenied) as e:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||
break
|
||||
except GAPI.fileNotFound as e:
|
||||
@@ -59385,12 +59406,12 @@ def createSharedDrive(users, useDomainAdminAccess=False):
|
||||
break
|
||||
except GAPI.notFound as e:
|
||||
retry += 1
|
||||
if retry > 3:
|
||||
if retry > errorRetries:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.REQUEST_ID, requestId], str(e), i, count)
|
||||
break
|
||||
time.sleep(retry*retry)
|
||||
waitingForCreationToComplete(updateRetryDelay)
|
||||
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:
|
||||
entityActionFailedWarning([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], str(e), i, count)
|
||||
except (GAPI.serviceNotAvailable, GAPI.authError, GAPI.domainPolicy) as e:
|
||||
@@ -59459,7 +59480,7 @@ def updateSharedDrive(users, useDomainAdminAccess=False):
|
||||
driveId=driveId)
|
||||
entityActionPerformed([Ent.USER, user, Ent.SHAREDDRIVE_ID, driveId], i, count)
|
||||
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,
|
||||
GAPI.noManageTeamDriveAdministratorPrivilege) as e:
|
||||
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'
|
||||
LIMIT_EXCEEDED = 'limitExceeded'
|
||||
LOGIN_REQUIRED = 'loginRequired'
|
||||
MALFORMED_WORKING_LOCATION_EVENT = 'malformedWorkingLocationEvent'
|
||||
MEMBER_NOT_FOUND = 'memberNotFound'
|
||||
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE = 'noListTeamDrivesAdministratorPrivilege'
|
||||
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE = 'noManageTeamDriveAdministratorPrivilege'
|
||||
@@ -149,6 +150,7 @@ SHARING_RATE_LIMIT_EXCEEDED = 'sharingRateLimitExceeded'
|
||||
SHORTCUT_TARGET_INVALID = 'shortcutTargetInvalid'
|
||||
STORAGE_QUOTA_EXCEEDED = 'storageQuotaExceeded'
|
||||
SYSTEM_ERROR = 'systemError'
|
||||
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION = 'targetUserRoleLimitedByLicenseRestriction'
|
||||
TEAMDRIVE_ALREADY_EXISTS = 'teamDriveAlreadyExists'
|
||||
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION = 'teamDriveDomainUsersOnlyRestriction'
|
||||
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]
|
||||
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,
|
||||
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,
|
||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
||||
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,
|
||||
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
||||
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,
|
||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS,
|
||||
CANNOT_SHARE_TEAMDRIVE_WITH_NONGOOGLE_ACCOUNTS,
|
||||
@@ -501,6 +503,8 @@ class limitExceeded(Exception):
|
||||
pass
|
||||
class loginRequired(Exception):
|
||||
pass
|
||||
class malformedWorkingLocationEvent(Exception):
|
||||
pass
|
||||
class memberNotFound(Exception):
|
||||
pass
|
||||
class noListTeamDrivesAdministratorPrivilege(Exception):
|
||||
@@ -577,6 +581,8 @@ class storageQuotaExceeded(Exception):
|
||||
pass
|
||||
class systemError(Exception):
|
||||
pass
|
||||
class targetUserRoleLimitedByLicenseRestriction(Exception):
|
||||
pass
|
||||
class teamDriveAlreadyExists(Exception):
|
||||
pass
|
||||
class teamDriveDomainUsersOnlyRestriction(Exception):
|
||||
@@ -701,6 +707,7 @@ REASON_EXCEPTION_MAP = {
|
||||
LABEL_MUTATION_UNKNOWN_FIELD: labelMutationUnknownField,
|
||||
LIMIT_EXCEEDED: limitExceeded,
|
||||
LOGIN_REQUIRED: loginRequired,
|
||||
MALFORMED_WORKING_LOCATION_EVENT: malformedWorkingLocationEvent,
|
||||
MEMBER_NOT_FOUND: memberNotFound,
|
||||
NO_LIST_TEAMDRIVES_ADMINISTRATOR_PRIVILEGE: noListTeamDrivesAdministratorPrivilege,
|
||||
NO_MANAGE_TEAMDRIVE_ADMINISTRATOR_PRIVILEGE: noManageTeamDriveAdministratorPrivilege,
|
||||
@@ -739,6 +746,7 @@ REASON_EXCEPTION_MAP = {
|
||||
SHORTCUT_TARGET_INVALID: shortcutTargetInvalid,
|
||||
STORAGE_QUOTA_EXCEEDED: storageQuotaExceeded,
|
||||
SYSTEM_ERROR: systemError,
|
||||
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION: targetUserRoleLimitedByLicenseRestriction,
|
||||
TEAMDRIVE_ALREADY_EXISTS: teamDriveAlreadyExists,
|
||||
TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION: teamDriveDomainUsersOnlyRestriction,
|
||||
TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION: teamDriveTeamMembersOnlyRestriction,
|
||||
|
||||
@@ -107,7 +107,9 @@ _SKUS = {
|
||||
'1010020029': {
|
||||
'product': 'Google-Apps', 'aliases': ['wes', 'wsentstarter', 'workspaceenterprisestarter'], 'displayName': 'Workspace Enterprise Starter'},
|
||||
'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': {
|
||||
'product': '101034', 'aliases': ['gseau', 'enterprisearchived', 'gsuiteenterprisearchived'], 'displayName': 'Google Workspace Enterprise Plus - Archived User'},
|
||||
'1010340002': {
|
||||
@@ -116,12 +118,18 @@ _SKUS = {
|
||||
'product': '101034', 'aliases': ['wsbizplusarchived', 'workspacebusinessplusarchived'], 'displayName': 'Google Workspace Business Plus - Archived User'},
|
||||
'1010340004': {
|
||||
'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': {
|
||||
'product': '101006', 'aliases': ['gsuiteessentials', 'essentials',
|
||||
'd4e', 'driveenterprise', 'drive4enterprise',
|
||||
'wsess', 'workspaceesentials'], 'displayName': 'Google Workspace Essentials'},
|
||||
'1010060003': {
|
||||
'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': {
|
||||
'product': 'Google-Drive-storage', 'aliases': ['drive20gb', '20gb', 'googledrivestorage20gb'], 'displayName': 'Google Drive Storage 20GB'},
|
||||
'Google-Drive-storage-50GB': {
|
||||
|
||||
Reference in New Issue
Block a user