mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-28 18:01:36 +00:00
Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90a2d385d6 | ||
|
|
f123fe197f | ||
|
|
8503aabefe | ||
|
|
80933755c4 | ||
|
|
03148a6ae8 | ||
|
|
96acd40692 | ||
|
|
3004da5ad7 | ||
|
|
bd699e2b31 | ||
|
|
0d9e35d013 | ||
|
|
af43db44ed | ||
|
|
8e3f30e901 | ||
|
|
cccbddcf45 | ||
|
|
a70bbf08ed | ||
|
|
57e1625246 | ||
|
|
24bd99386b | ||
|
|
e1f8969352 | ||
|
|
76aa1d1cdd | ||
|
|
7bdee0927a | ||
|
|
b18d8a0107 | ||
|
|
5ed5540746 | ||
|
|
0a9ea7fc83 | ||
|
|
7ece7a0a1a | ||
|
|
8d9f5689f3 | ||
|
|
8cd378ff8f | ||
|
|
c0e037dda5 | ||
|
|
b5730aadce | ||
|
|
4ec58bb844 | ||
|
|
3ba99582dc | ||
|
|
b61a4f5115 | ||
|
|
7ce83b4623 | ||
|
|
a58a998b49 | ||
|
|
4e04bd7c51 | ||
|
|
779ac0a6a0 | ||
|
|
f18b7258bb | ||
|
|
d4932c9d39 | ||
|
|
352845e482 | ||
|
|
ff49c67580 | ||
|
|
efee86cd33 | ||
|
|
a42eebdae1 | ||
|
|
05333d9521 | ||
|
|
b04ba4b618 | ||
|
|
c8108dace0 | ||
|
|
83a70d656e | ||
|
|
3a38609fbb | ||
|
|
e744aa29e3 | ||
|
|
367c23a13c | ||
|
|
82e8977003 | ||
|
|
54eb666bc5 | ||
|
|
f6ea570888 | ||
|
|
5d3fbed497 | ||
|
|
e7b3b1453a | ||
|
|
c31beeddfa | ||
|
|
bad376ea82 | ||
|
|
6af38e24af | ||
|
|
a4eff89658 | ||
|
|
91db5e5c45 | ||
|
|
67390a9863 | ||
|
|
6c24636833 | ||
|
|
776bc969de | ||
|
|
7008d8c311 | ||
|
|
a54870f91d | ||
|
|
782d57b02e | ||
|
|
0c6825fa12 | ||
|
|
6a82343668 | ||
|
|
47ec93140e | ||
|
|
d0d5ac74da | ||
|
|
a9e28e966a | ||
|
|
89970bbf0d | ||
|
|
0b16bded50 | ||
|
|
2ea6f773cd | ||
|
|
bb922dcff6 | ||
|
|
b38bf3e9bb | ||
|
|
39e5a45d72 | ||
|
|
d0b7ac80da | ||
|
|
320827b76e |
70
.github/workflows/build.yml
vendored
70
.github/workflows/build.yml
vendored
@@ -5,6 +5,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '37 22 * * *'
|
- cron: '37 22 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -17,7 +18,7 @@ defaults:
|
|||||||
working-directory: src
|
working-directory: src
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SCRATCH_COUNTER: 4
|
SCRATCH_COUNTER: 11
|
||||||
OPENSSL_CONFIG_OPTS: no-fips --api=3.0.0
|
OPENSSL_CONFIG_OPTS: no-fips --api=3.0.0
|
||||||
OPENSSL_INSTALL_PATH: ${{ github.workspace }}/bin/ssl
|
OPENSSL_INSTALL_PATH: ${{ github.workspace }}/bin/ssl
|
||||||
OPENSSL_SOURCE_PATH: ${{ github.workspace }}/src/openssl
|
OPENSSL_SOURCE_PATH: ${{ github.workspace }}/src/openssl
|
||||||
@@ -41,48 +42,57 @@ jobs:
|
|||||||
goal: build
|
goal: build
|
||||||
arch: x86_64
|
arch: x86_64
|
||||||
openssl_archs: linux-x86_64
|
openssl_archs: linux-x86_64
|
||||||
- os: [self-hosted, linux, arm64]
|
- os: ubuntu-24.04-arm
|
||||||
jid: 3
|
jid: 3
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
arch: aarch64
|
||||||
openssl_archs: linux-aarch64
|
openssl_archs: linux-aarch64
|
||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04-arm
|
||||||
jid: 4
|
jid: 4
|
||||||
goal: build
|
goal: build
|
||||||
|
arch: aarch64
|
||||||
|
openssl_archs: linux-aarch64
|
||||||
|
- os: ubuntu-22.04
|
||||||
|
jid: 5
|
||||||
|
goal: build
|
||||||
arch: x86_64
|
arch: x86_64
|
||||||
openssl_archs: linux-x86_64
|
openssl_archs: linux-x86_64
|
||||||
staticx: yes
|
staticx: yes
|
||||||
- os: [self-hosted, linux, arm64]
|
- os: ubuntu-22.04-arm
|
||||||
jid: 5
|
jid: 6
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
arch: aarch64
|
||||||
openssl_archs: linux-aarch64
|
openssl_archs: linux-aarch64
|
||||||
staticx: yes
|
staticx: yes
|
||||||
- os: macos-13
|
- os: macos-13
|
||||||
jid: 6
|
jid: 7
|
||||||
goal: build
|
goal: build
|
||||||
arch: x86_64
|
arch: x86_64
|
||||||
openssl_archs: darwin64-x86_64
|
openssl_archs: darwin64-x86_64
|
||||||
- os: macos-14
|
- os: macos-14
|
||||||
jid: 7
|
|
||||||
goal: build
|
|
||||||
arch: aarch64
|
|
||||||
openssl_archs: darwin64-arm64
|
|
||||||
- os: macos-15
|
|
||||||
jid: 8
|
jid: 8
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
arch: aarch64
|
||||||
openssl_archs: darwin64-arm64
|
openssl_archs: darwin64-arm64
|
||||||
- os: windows-2022
|
- os: macos-15
|
||||||
jid: 9
|
jid: 9
|
||||||
goal: build
|
goal: build
|
||||||
|
arch: aarch64
|
||||||
|
openssl_archs: darwin64-arm64
|
||||||
|
- os: windows-2022
|
||||||
|
jid: 10
|
||||||
|
goal: build
|
||||||
arch: Win64
|
arch: Win64
|
||||||
openssl_archs: VC-WIN64A
|
openssl_archs: VC-WIN64A
|
||||||
- os: ubuntu-24.04
|
# disable 3.9 test for now since it's oldest and due
|
||||||
goal: test
|
# for removal in Oct 2025. We only have 13 jid accounts
|
||||||
python: "3.9"
|
# so we need this one off but can re-enable at some point
|
||||||
jid: 10
|
# if we feel the need.
|
||||||
arch: x86_64
|
#- os: ubuntu-24.04
|
||||||
|
# goal: test
|
||||||
|
# python: "3.9"
|
||||||
|
# jid: 11
|
||||||
|
# arch: x86_64
|
||||||
- os: ubuntu-24.04
|
- os: ubuntu-24.04
|
||||||
goal: test
|
goal: test
|
||||||
python: "3.10"
|
python: "3.10"
|
||||||
@@ -120,7 +130,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
cache.tar.xz
|
cache.tar.xz
|
||||||
key: gam-${{ matrix.jid }}-20241203
|
key: gam-${{ matrix.jid }}-20250204
|
||||||
|
|
||||||
- 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'
|
||||||
@@ -187,7 +197,7 @@ jobs:
|
|||||||
echo "gampath=${gampath}" >> $GITHUB_ENV
|
echo "gampath=${gampath}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Install necessary Github-hosted Linux packages
|
- name: Install necessary Github-hosted Linux packages
|
||||||
if: runner.os == 'Linux' && runner.arch == 'X64'
|
if: runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
echo "RUNNING: apt update..."
|
echo "RUNNING: apt update..."
|
||||||
sudo apt-get -qq --yes update
|
sudo apt-get -qq --yes update
|
||||||
@@ -548,7 +558,6 @@ jobs:
|
|||||||
# https://github.com/pyinstaller/pyinstaller/issues/7102
|
# https://github.com/pyinstaller/pyinstaller/issues/7102
|
||||||
export PATH="$(dirname ${PYTHON}):/usr/bin"
|
export PATH="$(dirname ${PYTHON}):/usr/bin"
|
||||||
fi
|
fi
|
||||||
#if ([ "${staticx}" != "yes" ] && [ "$RUNNER_OS" != "Windows" ]); then
|
|
||||||
if [[ "$staticx" != "yes" ]]; then
|
if [[ "$staticx" != "yes" ]]; then
|
||||||
export PYINSTALLER_BUILD_ONEDIR=yes
|
export PYINSTALLER_BUILD_ONEDIR=yes
|
||||||
fi
|
fi
|
||||||
@@ -594,6 +603,9 @@ jobs:
|
|||||||
- name: Install StaticX
|
- name: Install StaticX
|
||||||
if: matrix.staticx == 'yes'
|
if: matrix.staticx == 'yes'
|
||||||
run: |
|
run: |
|
||||||
|
sudo apt-get -qq --yes update
|
||||||
|
# arm64 needs to build a wheel and needs scons to build
|
||||||
|
sudo apt-get -qq --yes install scons
|
||||||
"${PYTHON}" -m pip install --upgrade patchelf-wrapper
|
"${PYTHON}" -m pip install --upgrade patchelf-wrapper
|
||||||
"${PYTHON}" -m pip install --upgrade staticx
|
"${PYTHON}" -m pip install --upgrade staticx
|
||||||
|
|
||||||
@@ -745,7 +757,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Attest that gam package files were generated from this Action
|
- name: Attest that gam package files were generated from this Action
|
||||||
uses: actions/attest-build-provenance@v1
|
uses: actions/attest-build-provenance@v1
|
||||||
if: (github.event_name == 'push' || github.event_name == 'schedule') && matrix.goal == 'build'
|
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && matrix.goal == 'build'
|
||||||
with:
|
with:
|
||||||
subject-path: |
|
subject-path: |
|
||||||
gam*.tar.xz
|
gam*.tar.xz
|
||||||
@@ -754,7 +766,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Archive production artifacts
|
- name: Archive production artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
if: (github.event_name == 'push' || github.event_name == 'schedule') && matrix.goal != 'test'
|
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && matrix.goal != 'test'
|
||||||
with:
|
with:
|
||||||
name: gam-binaries-${{ env.GAMOS }}-${{ env.arch }}-${{ matrix.jid }}
|
name: gam-binaries-${{ env.GAMOS }}-${{ env.arch }}-${{ matrix.jid }}
|
||||||
path: |
|
path: |
|
||||||
@@ -782,8 +794,8 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
echo "We successfully compiled Python ${this_python} and OpenSSL ${this_openssl}"
|
echo "We successfully compiled Python ${this_python} and OpenSSL ${this_openssl}"
|
||||||
|
|
||||||
- name: Live API tests push only
|
- name: Live API tests
|
||||||
if: (github.event_name == 'push' || github.event_name == 'schedule')
|
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
|
||||||
run: |
|
run: |
|
||||||
export gam_user="gam-gha-${JID}@pdl.jaylee.us"
|
export gam_user="gam-gha-${JID}@pdl.jaylee.us"
|
||||||
echo "gam_user=${gam_user}" >> $GITHUB_ENV
|
echo "gam_user=${gam_user}" >> $GITHUB_ENV
|
||||||
@@ -905,7 +917,7 @@ jobs:
|
|||||||
$gam calendar $gam_user addevent summary "GHA test event" start +1h end +2h attendee $newgroup hangoutsmeet guestscanmodify true sendupdates all
|
$gam calendar $gam_user addevent summary "GHA test event" start +1h end +2h attendee $newgroup hangoutsmeet guestscanmodify true sendupdates all
|
||||||
$gam calendar $gam_user printevents after -0d
|
$gam calendar $gam_user printevents after -0d
|
||||||
$gam config enable_dasa false save
|
$gam config enable_dasa false save
|
||||||
matterid=uid:$($gam create vaultmatter name "GHA matter $newbase" description "test matter" collaborators $newuser returnidonly)
|
matterid=uid:$($gam create vaultmatter name "GHA matter $newbase" description "test matter" returnidonly)
|
||||||
$gam create vaulthold matter $matterid name "GHA hold $newbase" corpus mail accounts $newuser
|
$gam create vaulthold matter $matterid name "GHA hold $newbase" corpus mail accounts $newuser
|
||||||
$gam print vaultmatters matterstate open
|
$gam print vaultmatters matterstate open
|
||||||
$gam print vaultholds matter $matterid
|
$gam print vaultholds matter $matterid
|
||||||
@@ -993,8 +1005,8 @@ jobs:
|
|||||||
tar cJvvf cache.tar.xz $tar_folders
|
tar cJvvf cache.tar.xz $tar_folders
|
||||||
|
|
||||||
merge:
|
merge:
|
||||||
if: (github.event_name == 'push' || github.event_name == 'schedule')
|
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
needs: build
|
needs: build
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
@@ -1007,8 +1019,8 @@ jobs:
|
|||||||
pattern: gam-binaries-*
|
pattern: gam-binaries-*
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
if: github.event_name == 'push'
|
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-24.04
|
||||||
needs: merge
|
needs: merge
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
|
|||||||
20
.github/workflows/get-cacerts.yml
vendored
20
.github/workflows/get-cacerts.yml
vendored
@@ -20,8 +20,24 @@ jobs:
|
|||||||
persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token
|
persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal token
|
||||||
fetch-depth: 0 # otherwise, you will failed to push refs to dest repo
|
fetch-depth: 0 # otherwise, you will failed to push refs to dest repo
|
||||||
|
|
||||||
- name: Check for updates
|
- name: Get Current cacerts.pem hash
|
||||||
run: curl -o ./cacerts.pem -vvvv https://pki.goog/roots.pem
|
run: |
|
||||||
|
export CURRENT_HASH=$(sha256sum ./cacerts.pem)
|
||||||
|
echo "Current hash is: ${CURRENT_HASH}"
|
||||||
|
echo "CURRENT_HASH=${CURRENT_HASH}" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Get latest cacerts.pem file from Google
|
||||||
|
run: |
|
||||||
|
curl -o ./cacerts.pem -vvvv https://pki.goog/roots.pem
|
||||||
|
|
||||||
|
- name: Compare hashes
|
||||||
|
run: |
|
||||||
|
export NEW_HASH=$(sha256sum ./cacerts.pem)
|
||||||
|
if [ "$NEW_HASH" == "$CURRENT_HASH" ]; then
|
||||||
|
echo "Same file."
|
||||||
|
else
|
||||||
|
echo "New file content. Was ${CURRENT_HASH} and now is ${NEW_HASH}"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Commit file
|
- name: Commit file
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
33
.github/workflows/pypi.yml
vendored
Normal file
33
.github/workflows/pypi.yml
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: build and publish releases to PyPi
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v[0-9]+.[0-9]+.[0-9]+'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pypi:
|
||||||
|
name: Upload release to PyPI
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment:
|
||||||
|
name: pypi
|
||||||
|
url: https://pypi.org/p/gam7
|
||||||
|
permissions:
|
||||||
|
id-token: write
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install required packages to publish
|
||||||
|
run: |
|
||||||
|
python3 -m pip install --upgrade build
|
||||||
|
|
||||||
|
- name: Build packages
|
||||||
|
run: |
|
||||||
|
python -m build
|
||||||
|
|
||||||
|
- name: Publish package distributions to PyPI
|
||||||
|
uses: pypa/gh-action-pypi-publish@release/v1
|
||||||
63
pyproject.toml
Normal file
63
pyproject.toml
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
[project]
|
||||||
|
name = "gam7"
|
||||||
|
dynamic = [
|
||||||
|
"version",
|
||||||
|
]
|
||||||
|
authors = [
|
||||||
|
{ name="Jay Lee", email="jay0lee@gmail.com" },
|
||||||
|
{ name="Ross Scroggs", email="Ross.Scroggs@gmail.com" },
|
||||||
|
]
|
||||||
|
dependencies = [
|
||||||
|
"chardet",
|
||||||
|
"cryptography",
|
||||||
|
"distro; sys_platform=='linux'",
|
||||||
|
"filelock",
|
||||||
|
"google-api-python-client>=2.1",
|
||||||
|
"google-auth-httplib2",
|
||||||
|
"google-auth-oauthlib>=0.4.1",
|
||||||
|
"google-auth>=2.3.2",
|
||||||
|
"httplib2>=0.17.0",
|
||||||
|
"lxml",
|
||||||
|
"passlib>=1.7.2",
|
||||||
|
"pathvalidate",
|
||||||
|
"python-dateutil",
|
||||||
|
]
|
||||||
|
description = "CLI tool to manage Google Workspace"
|
||||||
|
readme = "README.md"
|
||||||
|
requires-python = ">=3.9"
|
||||||
|
classifiers = [
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
|
"Programming Language :: Python :: 3.9",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
|
"Programming Language :: Python :: 3.11",
|
||||||
|
"Programming Language :: Python :: 3.12",
|
||||||
|
"Programming Language :: Python :: 3.13",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
]
|
||||||
|
license = {text = "Apache License (2.0)"}
|
||||||
|
license-files = ["LICEN[CS]E*"]
|
||||||
|
|
||||||
|
[project.optional-dependencies]
|
||||||
|
yubikey = ["yubikey-manager>=5.0"]
|
||||||
|
|
||||||
|
[project.scripts]
|
||||||
|
gam = "gam.__main__:main"
|
||||||
|
|
||||||
|
[project.urls]
|
||||||
|
Homepage = "https://github.com/GAM-team/GAM"
|
||||||
|
Issues = "https://github.com/GAM-team/GAM/issues"
|
||||||
|
Discussion = "https://groups.google.com/group/google-apps-manager"
|
||||||
|
Chat = "https://git.io/gam-chat"
|
||||||
|
|
||||||
|
[tool.hatch.version]
|
||||||
|
path = "src/gam/__init__.py"
|
||||||
|
|
||||||
|
[tool.hatch.build.targets.wheel]
|
||||||
|
packages = ["src/gam"]
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = [
|
||||||
|
"hatchling",
|
||||||
|
]
|
||||||
|
build-backend = "hatchling.build"
|
||||||
@@ -377,7 +377,7 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
<ChatThread> ::= spaces/<String>/threads/<String>
|
<ChatThread> ::= spaces/<String>/threads/<String>
|
||||||
<GIGroupAlias> ::= <EmailAddress>
|
<GIGroupAlias> ::= <EmailAddress>
|
||||||
<GIGroupItem> ::= <EmailAddress>|<UniqueID>|groups/<String>
|
<GIGroupItem> ::= <EmailAddress>|<UniqueID>|groups/<String>
|
||||||
<CIGroupType> ::= customer|group|other|serviceaccount|user
|
<CIGroupMemberType> ::= cbcmbrowser|chromeosdevice|customer|group|other|serviceaccount|user
|
||||||
<CIPolicyName> ::= policies/<String>|settings/<String>|<String>
|
<CIPolicyName> ::= policies/<String>|settings/<String>|<String>
|
||||||
<ClassificationLabelID> ::= <String>
|
<ClassificationLabelID> ::= <String>
|
||||||
<ClassificationLabelFieldID> ::= <String>
|
<ClassificationLabelFieldID> ::= <String>
|
||||||
@@ -468,7 +468,7 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
<FloorName> ::= <String>
|
<FloorName> ::= <String>
|
||||||
<GroupItem> ::= <EmailAddress>|<UniqueID>|<String>
|
<GroupItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||||
<GroupRole> ::= owner|manager|member
|
<GroupRole> ::= owner|manager|member
|
||||||
<GroupType> ::= customer|group|user
|
<GroupMemberType> ::= customer|group|user
|
||||||
<GuardianItem> ::= <EmailAddress>|<UniqueID>|<String>
|
<GuardianItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||||
<GuardianInvitationID> ::= <String>
|
<GuardianInvitationID> ::= <String>
|
||||||
<HoldItem> ::= <UniqueID>|<String>
|
<HoldItem> ::= <UniqueID>|<String>
|
||||||
@@ -664,7 +664,7 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
||||||
<ChatSpaceList> ::= "<ChatSpace>(,<ChatSpace>)*"
|
<ChatSpaceList> ::= "<ChatSpace>(,<ChatSpace>)*"
|
||||||
<CIGroupAliasList> ::= "<CIGroupAlias>(,<CIGroupAlias>)*"
|
<CIGroupAliasList> ::= "<CIGroupAlias>(,<CIGroupAlias>)*"
|
||||||
<CIGroupTypeList> ::= "<CIGroupType>(,<CIGroupType>)*"
|
<CIGroupMemberTypeList> ::= "<CIGroupMemberType>(,<CIGroupMemberType>)*"
|
||||||
<CIPolicyNameList> ::= "<CIPolicyName>(,<CIPolicyName>)*"
|
<CIPolicyNameList> ::= "<CIPolicyName>(,<CIPolicyName>)*"
|
||||||
<ClassroomInvitationIDList> ::= "<ClassroomInvitationID>(,<ClassroomInvitationID>)*"
|
<ClassroomInvitationIDList> ::= "<ClassroomInvitationID>(,<ClassroomInvitationID>)*"
|
||||||
<ContactGroupList> ::= "<ContactGroupItem>(,<ContactGroupItem>)*"
|
<ContactGroupList> ::= "<ContactGroupItem>(,<ContactGroupItem>)*"
|
||||||
@@ -707,7 +707,7 @@ If an item contains spaces, it should be surrounded by ".
|
|||||||
<GuardianInvitationIDList> ::= "<GuardianInvitationID>(,<GuardianInvitationID>)*"
|
<GuardianInvitationIDList> ::= "<GuardianInvitationID>(,<GuardianInvitationID>)*"
|
||||||
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
||||||
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
||||||
<GroupTypeList> ::= "<GroupType>(,<GroupType>)*"
|
<GroupMemberTypeList> ::= "<GroupMemberType>(,<GroupMemberType>)*"
|
||||||
<LabelIDList> ::= "<LabelID>(,<LabelID>)*"
|
<LabelIDList> ::= "<LabelID>(,<LabelID>)*"
|
||||||
<LabelNameList> ::= "'<LabelName>'(,'<LabelName>')*"
|
<LabelNameList> ::= "'<LabelName>'(,'<LabelName>')*"
|
||||||
<LanguageList> ::= "<Language>(,<Language>)*"
|
<LanguageList> ::= "<Language>(,<Language>)*"
|
||||||
@@ -1362,6 +1362,7 @@ gam create project [admin <EmailAddress>] [project <ProjectID>]
|
|||||||
nokey]
|
nokey]
|
||||||
gam use project [<EmailAddress>] [<ProjectID>]
|
gam use project [<EmailAddress>] [<ProjectID>]
|
||||||
gam use project [admin <EmailAddress>] [project <ProjectID>]
|
gam use project [admin <EmailAddress>] [project <ProjectID>]
|
||||||
|
[appname <String>] [supportemail <EmailAddress>]
|
||||||
[saname <ServiceAccountName>] [sadisplayname <ServiceAccountDisplayName>]
|
[saname <ServiceAccountName>] [sadisplayname <ServiceAccountDisplayName>]
|
||||||
[sadescription <ServiceAccountDescription>]
|
[sadescription <ServiceAccountDescription>]
|
||||||
[(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
[(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
||||||
@@ -1677,6 +1678,7 @@ gam calendar <CalendarEntity> printacl [todrive <ToDriveAttribute>*]
|
|||||||
(range <Date> <Date>)|
|
(range <Date> <Date>)|
|
||||||
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)|
|
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)|
|
||||||
(reminder <Number> email|popup))|
|
(reminder <Number> email|popup))|
|
||||||
|
(resource <ResourceID>)|
|
||||||
(selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>)|
|
(selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>)|
|
||||||
(sequence <Integer>)|
|
(sequence <Integer>)|
|
||||||
(sharedproperty <PropertyKey> <PropertyValue>)|
|
(sharedproperty <PropertyKey> <PropertyValue>)|
|
||||||
@@ -1707,8 +1709,10 @@ The following attributes are equivalent:
|
|||||||
clearattendees|
|
clearattendees|
|
||||||
clearhangoutsmeet|
|
clearhangoutsmeet|
|
||||||
(clearprivateproperty <PropertyKey>)|
|
(clearprivateproperty <PropertyKey>)|
|
||||||
|
clearresources|
|
||||||
(clearsharedproperty <PropertyKey>)|
|
(clearsharedproperty <PropertyKey>)|
|
||||||
(removeattendee <EmailAddress>)|
|
(removeattendee <EmailAddress>)|
|
||||||
|
(removeresource <ResourceID>)|
|
||||||
(replacedescription <RegularExpression> <String>)|
|
(replacedescription <RegularExpression> <String>)|
|
||||||
(selectremoveattendees <UserTypeEntity>)
|
(selectremoveattendees <UserTypeEntity>)
|
||||||
|
|
||||||
@@ -2086,19 +2090,25 @@ gam move browsers ou|org|orgunit <OrgUnitPath>
|
|||||||
[batchsize <Integer>]
|
[batchsize <Integer>]
|
||||||
|
|
||||||
gam info browser <DeviceID>
|
gam info browser <DeviceID>
|
||||||
[basic|full|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
|
(basic|full|annotated |
|
||||||
|
(<BrowserFieldName>* [fields <BrowserFieldNameList>]) |
|
||||||
|
(rawfields "<BrowserFieldNameList>"))
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam show browsers
|
gam show browsers
|
||||||
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
|
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
|
||||||
[querytime<String> <Time>]
|
[querytime<String> <Time>]
|
||||||
[orderby <BrowserOrderByFieldName> [ascending|descending]]
|
[orderby <BrowserOrderByFieldName> [ascending|descending]]
|
||||||
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
|
(basic|full|annotated |
|
||||||
|
(<BrowserFieldName>* [fields <BrowserFieldNameList>]) |
|
||||||
|
(rawfields "<BrowserFieldNameList>"))
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam print browsers [todrive <ToDriveAttribute>*]
|
gam print browsers [todrive <ToDriveAttribute>*]
|
||||||
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
|
([ou|org|orgunit|browserou <OrgUnitPath>] [(query <QueryBrowser>)|(queries <QueryBrowserList>))|(select <BrowserEntity>))
|
||||||
[querytime<String> <Time>]
|
[querytime<String> <Time>]
|
||||||
[orderby <BrowserOrderByFieldName> [ascending|descending]]
|
[orderby <BrowserOrderByFieldName> [ascending|descending]]
|
||||||
[basic|full|allfields|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
|
(basic|full|annotated |
|
||||||
|
(<BrowserFieldName>* [fields <BrowserFieldNameList>]) |
|
||||||
|
(rawfields "<BrowserFieldNameList>"))
|
||||||
[sortheaders]
|
[sortheaders]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
|
|
||||||
@@ -3829,12 +3839,14 @@ gam info group|groups <GroupEntity>
|
|||||||
[basic] <GroupFieldName>* [fields <GroupFieldNameList>] [nodeprecated]
|
[basic] <GroupFieldName>* [fields <GroupFieldNameList>] [nodeprecated]
|
||||||
[ciallfields|(cifields <CIGroupFieldNameList>)]
|
[ciallfields|(cifields <CIGroupFieldNameList>)]
|
||||||
[members] [managers] [owners]
|
[members] [managers] [owners]
|
||||||
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[types <GroupTypeList>]
|
[types <GroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam print groups [todrive <ToDriveAttribute>*]
|
gam print groups [todrive <ToDriveAttribute>*]
|
||||||
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
|
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
|
||||||
|
(group|group_ns|group_susp <GroupItem>)|
|
||||||
(select <GroupEntity>)]
|
(select <GroupEntity>)]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>] (matchsetting [not] <GroupAttribute>)*
|
[descriptionmatchpattern [not] <RegularExpression>] (matchsetting [not] <GroupAttribute>)*
|
||||||
@@ -3845,9 +3857,10 @@ gam print groups [todrive <ToDriveAttribute>*]
|
|||||||
[nodeprecated]
|
[nodeprecated]
|
||||||
[roles <GroupRoleList>]
|
[roles <GroupRoleList>]
|
||||||
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
||||||
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
[includederivedmembership]
|
[includederivedmembership]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[types <GroupTypeList>]
|
[types <GroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[convertcrnl] [delimiter <Character>] [sortheaders]
|
[convertcrnl] [delimiter <Character>] [sortheaders]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
@@ -3880,10 +3893,11 @@ gam print group-members [todrive <ToDriveAttribute>*]
|
|||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <RegularExpression>]
|
||||||
[admincreatedmatch <Boolean>]
|
[admincreatedmatch <Boolean>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
[membernames] [showdeliverysettings]
|
[membernames] [showdeliverysettings]
|
||||||
<MembersFieldName>* [fields <MembersFieldNameList>]
|
<MembersFieldName>* [fields <MembersFieldNameList>]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[types <GroupTypeList>]
|
[types <GroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[userfields <UserFieldNameList>]
|
[userfields <UserFieldNameList>]
|
||||||
[allschemas|(schemas|custom|customschemas <SchemaNameList>)]
|
[allschemas|(schemas|custom|customschemas <SchemaNameList>)]
|
||||||
@@ -3891,7 +3905,7 @@ gam print group-members [todrive <ToDriveAttribute>*]
|
|||||||
[peoplelookup|(peoplelookupuser <EmailAddress>)]
|
[peoplelookup|(peoplelookupuser <EmailAddress>)]
|
||||||
[unknownname <String>] [cachememberinfo [Boolean]]
|
[unknownname <String>] [cachememberinfo [Boolean]]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
gam show group-members
|
`gam show group-members
|
||||||
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
|
[([domain|domains <DomainNameEntity>] ([member|showownedby <EmailItem>]|[(query <QueryGroup>)|(queries <QueryGroupList>)]))|
|
||||||
(group|group_ns|group_susp <GroupItem>)|
|
(group|group_ns|group_susp <GroupItem>)|
|
||||||
(select <GroupEntity>)]
|
(select <GroupEntity>)]
|
||||||
@@ -3899,8 +3913,9 @@ gam show group-members
|
|||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <RegularExpression>]
|
||||||
[admincreatedmatch <Boolean>]
|
[admincreatedmatch <Boolean>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
|
[roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
|
||||||
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[types <GroupTypeList>]
|
[types <GroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[includederivedmembership]
|
[includederivedmembership]
|
||||||
|
|
||||||
@@ -3919,12 +3934,16 @@ gam show group-members
|
|||||||
updatetime
|
updatetime
|
||||||
<CIGroupFieldNameList> ::= "<CIGroupFieldName>(,<CIGroupFieldName>)*"
|
<CIGroupFieldNameList> ::= "<CIGroupFieldName>(,<CIGroupFieldName>)*"
|
||||||
|
|
||||||
gam create cigroup <EmailAddress> [copyfrom <GroupItem>] <GroupAttribute>*
|
gam create cigroup <EmailAddress>
|
||||||
[makeowner] [alias|aliases <CIGroupAliasList>] [dynamic <QueryDynamicGroup>]
|
[copyfrom <GroupItem>] <GroupAttribute>*
|
||||||
|
[makeowner] [alias|aliases <CIGroupAliasList>]
|
||||||
|
[security|makesecuritygroup]
|
||||||
|
[dynamic <QueryDynamicGroup>]
|
||||||
gam update cigroup <GroupEntity> [copyfrom <GroupItem>] <GroupAttribute>
|
gam update cigroup <GroupEntity> [copyfrom <GroupItem>] <GroupAttribute>
|
||||||
[security|makesecuritygroup|
|
[security|makesecuritygroup|
|
||||||
dynamicsecurity|makedynamicsecuritygroup|
|
dynamicsecurity|makedynamicsecuritygroup|
|
||||||
lockedsecurity|makelockedsecuritygroup]
|
lockedsecurity|makelockedsecuritygroup]
|
||||||
|
[locked|unlocked]
|
||||||
[dynamic <QueryDynamicGroup>]
|
[dynamic <QueryDynamicGroup>]
|
||||||
[memberrestrictions <QueryMemberRestrictions>]
|
[memberrestrictions <QueryMemberRestrictions>]
|
||||||
gam update cigroups <GroupEntity> create|add [<GroupRole>]
|
gam update cigroups <GroupEntity> create|add [<GroupRole>]
|
||||||
@@ -3958,7 +3977,8 @@ gam info cigroups <GroupEntity>
|
|||||||
[nosecurity|nosecuritysettings]
|
[nosecurity|nosecuritysettings]
|
||||||
[allfields|<CIGroupFieldName>*|(fields <CIGroupFieldNameList>)]
|
[allfields|<CIGroupFieldName>*|(fields <CIGroupFieldNameList>)]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
[types <CIGroupTypeList>]
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
gam print cigroups [todrive <ToDriveAttribute>*]
|
gam print cigroups [todrive <ToDriveAttribute>*]
|
||||||
@@ -3969,7 +3989,8 @@ gam print cigroups [todrive <ToDriveAttribute>*]
|
|||||||
[basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
|
[basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
|
||||||
[roles <GroupRoleList>] [memberrestrictions]
|
[roles <GroupRoleList>] [memberrestrictions]
|
||||||
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
||||||
[types <CIGroupTypeList>]
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
[convertcrnl] [delimiter <Character>]
|
[convertcrnl] [delimiter <Character>]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
@@ -3977,13 +3998,14 @@ gam print cigroups [todrive <ToDriveAttribute>*]
|
|||||||
|
|
||||||
<CIGroupMembersFieldName> ::=
|
<CIGroupMembersFieldName> ::=
|
||||||
createtime
|
createtime
|
||||||
|
email|useremail|
|
||||||
expiretime|
|
expiretime|
|
||||||
memberkey|
|
memberkey|
|
||||||
name|
|
name|
|
||||||
role|
|
role|
|
||||||
type|
|
type|
|
||||||
updatetime|
|
updatetime
|
||||||
useremail
|
|
||||||
<CIGroupMembersFieldNameList> ::= "<CIGroupMembersFieldName>(,<CIGroupMembersFieldName>)*"
|
<CIGroupMembersFieldNameList> ::= "<CIGroupMembersFieldName>(,<CIGroupMembersFieldName>)*"
|
||||||
|
|
||||||
gam <UserTypeEntity> info cimember <GroupEntity>
|
gam <UserTypeEntity> info cimember <GroupEntity>
|
||||||
@@ -3994,19 +4016,22 @@ gam print cigroup-members [todrive <ToDriveAttribute>*]
|
|||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <RegularExpression>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
[types <CIGroupTypeList>]
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
<CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
|
<CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
|
||||||
[(recursive [noduplicates])includederivedmembership] [nogroupeemail]
|
[minimal|basic|full]
|
||||||
|
[(recursive [noduplicates]) | includederivedmembership] [nogroupemail]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
gam show cigroup-members
|
gam show cigroup-members
|
||||||
[(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
[(cimember|ciowner <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
||||||
[showownedby <UserItem>]
|
[showownedby <UserItem>]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <RegularExpression>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
[types <CIGroupTypeList>]
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
||||||
|
[minimal|basic|full]
|
||||||
|
[(depth <Number>) | includederivedmembership]
|
||||||
|
|
||||||
# Cloud Identity Devices
|
# Cloud Identity Devices
|
||||||
|
|
||||||
@@ -4441,7 +4466,7 @@ gam report <ActivityApplicationName> [todrive <ToDriveAttribute>*]
|
|||||||
[event|events <EventNameList>] [ip <String>]
|
[event|events <EventNameList>] [ip <String>]
|
||||||
[groupidfilter <String>]
|
[groupidfilter <String>]
|
||||||
[maxactivities <Number>] [maxevents <Number>] [maxresults <Number>]
|
[maxactivities <Number>] [maxevents <Number>] [maxresults <Number>]
|
||||||
[countsonly [summary] [eventrowfilter]]
|
[countsonly [bydate|summary] [eventrowfilter]]
|
||||||
(addcsvdata <FieldName> <String>)* [shownoactivities]
|
(addcsvdata <FieldName> <String>)* [shownoactivities]
|
||||||
|
|
||||||
<CustomerServiceName> ::=
|
<CustomerServiceName> ::=
|
||||||
@@ -4504,7 +4529,7 @@ gam report users|user [todrive <ToDriveAttribute>*]
|
|||||||
(country|countrycode <String>)
|
(country|countrycode <String>)
|
||||||
|
|
||||||
gam create|add resoldcustomer <CustomerDomain> (customer_auth_token <String>) <ResoldCustomerAttribute>+
|
gam create|add resoldcustomer <CustomerDomain> (customer_auth_token <String>) <ResoldCustomerAttribute>+
|
||||||
gam update resoldcustomer <CustomerID> [customer_auth_token <String>] <ResoldCustomerAttribues>+
|
gam update resoldcustomer <CustomerID> <ResoldCustomerAttribues>+
|
||||||
gam info resoldcustomer <CustomerID> [formatjson]
|
gam info resoldcustomer <CustomerID> [formatjson]
|
||||||
|
|
||||||
gam create|add resoldsubscription <CustomerID> (sku <SKUID>)
|
gam create|add resoldsubscription <CustomerID> (sku <SKUID>)
|
||||||
@@ -4722,41 +4747,6 @@ gam <UserTypeEntity> sendemail from <EmailAddress>
|
|||||||
[newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
|
[newuser <EmailAddress> firstname|givenname <String> lastname|familyname <string> password <Password>]
|
||||||
(<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
|
(<SMTPDateHeader> <Time>)* (<SMTPHeader> <String>)* (header <String> <String>)*
|
||||||
|
|
||||||
# Sites
|
|
||||||
|
|
||||||
<SiteACLRole> ::= editor|owner|reader|writer
|
|
||||||
<SiteACLRoleList> ::= "<SiteACLRole>(,<SiteACLRole>)*"
|
|
||||||
|
|
||||||
<SiteACLScope> ::=
|
|
||||||
<EmailAddress>|user:<EmailAddress>|group:<EmailAddress>|domain:<DomainName>|domain|default
|
|
||||||
<SiteACLScopeList> ::= "<SiteACLScope>(,<SiteACLScope>)*"
|
|
||||||
<SiteACLScopeEntity> ::=
|
|
||||||
<SiteACLScopeList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
|
||||||
|
|
||||||
<SiteAttribute> ::=
|
|
||||||
(categories <String>)|
|
|
||||||
(name <String>)|
|
|
||||||
(sourcelink <URI>])|
|
|
||||||
(summary <String>)|
|
|
||||||
(theme <String>)
|
|
||||||
|
|
||||||
gam [<UserTypeEntity>] create|add site <SiteItem> <SiteAttribute>*
|
|
||||||
gam [<UserTypeEntity>] update sites <SiteEntity> <SiteAttribute>+
|
|
||||||
gam [<UserTypeEntity>] info sites <SiteEntity> [withmappings] [role|roles all|<SiteACLRoleList>]
|
|
||||||
gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
|
|
||||||
[withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>]
|
|
||||||
gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*] [domain|domains <DomainNameEntity>] [includeallsites]
|
|
||||||
[withmappings] [role|roles all|<SiteACLRoleList>] [startindex <Number>] [maxresults <Number>] [convertcrnl] [delimiter <Character>]
|
|
||||||
|
|
||||||
gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*] [startindex <Number>] [maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
|
|
||||||
|
|
||||||
gam [<UserTypeEntity>] create|add siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
|
||||||
gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
|
||||||
|
|
||||||
# Shared Drives - Administrator
|
# Shared Drives - Administrator
|
||||||
|
|
||||||
<SharedDriveFieldName> ::=
|
<SharedDriveFieldName> ::=
|
||||||
@@ -4974,6 +4964,7 @@ gam create|add permissions <SharedDriveEntityAdmin> <DriveFilePermissionEntity>
|
|||||||
<PermissionMatch>* [<PermissionMatchAction>]
|
<PermissionMatch>* [<PermissionMatchAction>]
|
||||||
gam delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity>
|
gam delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity>
|
||||||
<PermissionMatch>* [<PermissionMatchAction>]
|
<PermissionMatch>* [<PermissionMatchAction>]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
@@ -4987,9 +4978,11 @@ gam <UserTypeEntity> create|add drivefileacl <SharedDriveEntityAdmin>
|
|||||||
adminaccess
|
adminaccess
|
||||||
gam <UserTypeEntity> update drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
|
gam <UserTypeEntity> update drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
|
||||||
(role <DriveFileACLRole>) [expires|expiration <Time>] [removeexpiration [<Boolean>]]
|
(role <DriveFileACLRole>) [expires|expiration <Time>] [removeexpiration [<Boolean>]]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
||||||
adminaccess
|
adminaccess
|
||||||
gam <UserTypeEntity> delete drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
|
gam <UserTypeEntity> delete drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail>
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
[showtitles] adminaccess
|
[showtitles] adminaccess
|
||||||
gam <UserTypeEntity> info drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail> adminaccess
|
gam <UserTypeEntity> info drivefileacl <SharedDriveEntityAdmin> <DriveFilePermissionIDorEmail> adminaccess
|
||||||
[showtitles]
|
[showtitles]
|
||||||
@@ -5015,6 +5008,7 @@ gam <UserTypeEntity> create|add permissions <SharedDriveEntityAdmin> <DriveFileP
|
|||||||
<PermissionMatch>* [<PermissionMatchAction>]
|
<PermissionMatch>* [<PermissionMatchAction>]
|
||||||
gam <UserTypeEntity> delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity> adminaccess
|
gam <UserTypeEntity> delete permissions <SharedDriveEntityAdmin> <DriveFilePermissionIDEntity> adminaccess
|
||||||
<PermissionMatch>* [<PermissionMatchAction>]
|
<PermissionMatch>* [<PermissionMatchAction>]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
|
|
||||||
In these commands, the Google administrator named in oauth2.txt is used.
|
In these commands, the Google administrator named in oauth2.txt is used.
|
||||||
|
|
||||||
@@ -5250,7 +5244,7 @@ gam print vaultcounts [todrive <ToDriveAttributes>*]
|
|||||||
gam print vaultcounts [todrive <ToDriveAttributes>*]
|
gam print vaultcounts [todrive <ToDriveAttributes>*]
|
||||||
matter <MatterItem> operation <String> [wait <Integer>]
|
matter <MatterItem> operation <String> [wait <Integer>]
|
||||||
|
|
||||||
gam create vaultexport|export matter <MatterItem> [name <String>] corpus calendar|drive|mail|groups|hangouts_chat|voice
|
gam create vaultexport|export matter <MatterItem> [name <String>] corpus calendar|drive|gemini|groups|hangouts_chat|mail|voice
|
||||||
(accounts <EmailAddressEntity>) | (orgunit|org|ou <OrgUnitPath>) | everyone
|
(accounts <EmailAddressEntity>) | (orgunit|org|ou <OrgUnitPath>) | everyone
|
||||||
(shareddrives|teamdrives <SharedDriveIDList>) | (rooms <RoomList>) | (sitesurl <URLList>)
|
(shareddrives|teamdrives <SharedDriveIDList>) | (rooms <RoomList>) | (sitesurl <URLList>)
|
||||||
[scope all_data|held_data|unprocessed_data]
|
[scope all_data|held_data|unprocessed_data]
|
||||||
@@ -5258,10 +5252,12 @@ gam create vaultexport|export matter <MatterItem> [name <String>] corpus calenda
|
|||||||
[locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
|
[locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
|
||||||
[responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
|
[responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
|
||||||
[includeshareddrives <Boolean>] [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
[includeshareddrives <Boolean>] [driveversiondate <Date>|<Time>] [includeaccessinfo <Boolean>]
|
||||||
|
[driveclientsideencryption any|encrypted|unencrypted]
|
||||||
[includerooms <Boolean>]
|
[includerooms <Boolean>]
|
||||||
[excludedrafts <Boolean>] [format mbox|pst]
|
[excludedrafts <Boolean>] [mailclientsideencryption any|encrypted|unencrypted]
|
||||||
[showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
|
[showconfidentialmodecontent <Boolean>] [usenewexport <Boolean>] [exportlinkeddrivefiles <Boolean>]
|
||||||
[covereddata calllogs|textmessages|voicemails]
|
[covereddata calllogs|textmessages|voicemails]
|
||||||
|
[format ics|mbox|pst|xml]
|
||||||
[region any|europe|us] [showdetails|returnidonly]
|
[region any|europe|us] [showdetails|returnidonly]
|
||||||
gam delete vaultexport|export <ExportItem> matter <MatterItem>
|
gam delete vaultexport|export <ExportItem> matter <MatterItem>
|
||||||
gam delete vaultexport|export <MatterItem> <ExportItem>
|
gam delete vaultexport|export <MatterItem> <ExportItem>
|
||||||
@@ -6565,6 +6561,8 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
|||||||
[copysubfolderpermissions [<Boolean>]]
|
[copysubfolderpermissions [<Boolean>]]
|
||||||
[copysubfolderinheritedpermissions [<Boolean>]]
|
[copysubfolderinheritedpermissions [<Boolean>]]
|
||||||
[copysubfoldernoniheritedpermissions never|always|syncallfolders|syncupdatedfolders]
|
[copysubfoldernoniheritedpermissions never|always|syncallfolders|syncupdatedfolders]
|
||||||
|
[copypermissionroles <DriveFileACLRoleList>]
|
||||||
|
[copypermissiontypes <DriveFileACLTypeList>]
|
||||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||||
[copysheetprotectedranges [<Boolean>]]
|
[copysheetprotectedranges [<Boolean>]]
|
||||||
@@ -6573,6 +6571,7 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
|||||||
[sendemailifrequired [<Boolean>]]
|
[sendemailifrequired [<Boolean>]]
|
||||||
[suppressnotselectedmessages [<Boolean>]]
|
[suppressnotselectedmessages [<Boolean>]]
|
||||||
[verifyorganizer [<Boolean>]]
|
[verifyorganizer [<Boolean>]]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
|
|
||||||
gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileName>]
|
gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileName>]
|
||||||
[summary [<Boolean>]] [showpermissionmessages [<Boolean>]]
|
[summary [<Boolean>]] [showpermissionmessages [<Boolean>]]
|
||||||
@@ -6596,6 +6595,7 @@ gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileNam
|
|||||||
[retainsourcefolders [<Boolean>]]
|
[retainsourcefolders [<Boolean>]]
|
||||||
[sendemailifrequired [<Boolean>]]
|
[sendemailifrequired [<Boolean>]]
|
||||||
[verifyorganizer [<Boolean>]]
|
[verifyorganizer [<Boolean>]]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
|
|
||||||
gam <UserTypeEntity> get document <DriveFileEntity>
|
gam <UserTypeEntity> get document <DriveFileEntity>
|
||||||
[viewmode default|suggestions_inline|preview_suggestions_accepted|preview_without_suggestions]
|
[viewmode default|suggestions_inline|preview_suggestions_accepted|preview_without_suggestions]
|
||||||
@@ -6701,10 +6701,10 @@ gam <UserTypeEntity> create|add drivefileacl <DriveFileEntity> [adminaccess|asad
|
|||||||
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
||||||
gam <UserTypeEntity> update drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
gam <UserTypeEntity> update drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
||||||
(role <DriveFileACLRole>) [expires|expiration <Time>] [removeexpiration [<Boolean>]]
|
(role <DriveFileACLRole>) [expires|expiration <Time>] [removeexpiration [<Boolean>]]
|
||||||
[updatesheetprotectedranges [<Boolean>]]
|
[updatesheetprotectedranges [<Boolean>]] [enforceexpansiveaccess [<Boolean>]]
|
||||||
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
[showtitles] [nodetails|(csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]])]
|
||||||
gam <UserTypeEntity> delete drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
gam <UserTypeEntity> delete drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
||||||
[updatesheetprotectedranges [<Boolean>]]
|
[updatesheetprotectedranges [<Boolean>]] [enforceexpansiveaccess [<Boolean>]]
|
||||||
[showtitles]
|
[showtitles]
|
||||||
gam <UserTypeEntity> info drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
gam <UserTypeEntity> info drivefileacl <DriveFileEntity> <DriveFilePermissionIDorEmail>
|
||||||
[showtitles]
|
[showtitles]
|
||||||
@@ -6828,6 +6828,7 @@ gam <UserTypeEntity> print filerevisions <DriveFileEntity> [todrive <ToDriveAttr
|
|||||||
|
|
||||||
gam <UserTypeEntity> transfer ownership <DriveFileEntity> <UserItem>
|
gam <UserTypeEntity> transfer ownership <DriveFileEntity> <UserItem>
|
||||||
[<DriveFileParentAttribute>] [includetrashed] [norecursion [<Boolean>]]
|
[<DriveFileParentAttribute>] [includetrashed] [norecursion [<Boolean>]]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
(orderby <DriveFileOrderByFieldName> [ascending|descending])*
|
(orderby <DriveFileOrderByFieldName> [ascending|descending])*
|
||||||
[preview] [filepath] [pathdelimiter <Character>] [buildtree]
|
[preview] [filepath] [pathdelimiter <Character>] [buildtree]
|
||||||
[todrive <ToDriveAttribute>*]
|
[todrive <ToDriveAttribute>*]
|
||||||
@@ -6836,6 +6837,7 @@ gam <UserTypeEntity> claim ownership <DriveFileEntity>
|
|||||||
[skipids <DriveFileEntity>] [onlyusers|skipusers <UserTypeEntity>] [subdomains <DomainNameEntity>]
|
[skipids <DriveFileEntity>] [onlyusers|skipusers <UserTypeEntity>] [subdomains <DomainNameEntity>]
|
||||||
[restricted [<Boolean>]] [writerscanshare|writerscantshare [<Boolean>]]
|
[restricted [<Boolean>]] [writerscanshare|writerscantshare [<Boolean>]]
|
||||||
[keepuser | (retainrole commenter|reader|writer|editor|fileorganizer|none)] [noretentionmessages]
|
[keepuser | (retainrole commenter|reader|writer|editor|fileorganizer|none)] [noretentionmessages]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
(orderby <DriveFileOrderByFieldName> [ascending|descending])*
|
(orderby <DriveFileOrderByFieldName> [ascending|descending])*
|
||||||
[preview] [filepath] [pathdelimiter <Character>] [buildtree]
|
[preview] [filepath] [pathdelimiter <Character>] [buildtree]
|
||||||
[todrive <ToDriveAttribute>*]
|
[todrive <ToDriveAttribute>*]
|
||||||
@@ -6843,6 +6845,7 @@ gam <UserTypeEntity> claim ownership <DriveFileEntity>
|
|||||||
gam <UserTypeEntity> transfer drive <UserItem> [select <DriveFileEntity>]
|
gam <UserTypeEntity> transfer drive <UserItem> [select <DriveFileEntity>]
|
||||||
[(targetfolderid <DriveFolderID>)|(targetfoldername <DriveFolderName>)]
|
[(targetfolderid <DriveFolderID>)|(targetfoldername <DriveFolderName>)]
|
||||||
[targetuserfoldername <DriveFolderName>] [targetuserorphansfoldername <DriveFolderName>]
|
[targetuserfoldername <DriveFolderName>] [targetuserorphansfoldername <DriveFolderName>]
|
||||||
|
[enforceexpansiveaccess [<Boolean>]]
|
||||||
[mergewithtarget [<Boolean>]]
|
[mergewithtarget [<Boolean>]]
|
||||||
[skipids <DriveFileEntity>]
|
[skipids <DriveFileEntity>]
|
||||||
[keepuser | (retainrole reader|commenter|writer|editor|fileorganizer|none)] [noretentionmessages]
|
[keepuser | (retainrole reader|commenter|writer|editor|fileorganizer|none)] [noretentionmessages]
|
||||||
@@ -7345,11 +7348,11 @@ gam <UserTypeEntity> print filters [labelidsonly] [todrive <ToDriveAttribute>*]
|
|||||||
# Users - Forms
|
# Users - Forms
|
||||||
|
|
||||||
gam <UserTypeEntity> create form
|
gam <UserTypeEntity> create form
|
||||||
title <String> [description <String>] [isquiz [<Boolean>]
|
title <String> [description <String>] [isquiz [<Boolean>]] [<JSONData>]
|
||||||
[drivefilename <DriveFileName>] [<DriveFileParentAttribute>]
|
[drivefilename <DriveFileName>] [<DriveFileParentAttribute>]
|
||||||
[(csv [todrive <ToDriveAttribute>*]) | returnidonly]
|
[(csv [todrive <ToDriveAttribute>*]) | returnidonly]
|
||||||
gam <UserTypeEntity> update form <DriveFileEntity>
|
gam <UserTypeEntity> update form <DriveFileEntity>
|
||||||
[title <String>] [description <String>] [isquiz [<Boolean>]
|
[title <String>] [description <String>] [isquiz [<Boolean>]] [<JSONData>]
|
||||||
|
|
||||||
gam <UserTypeEntity> print forms <DriveFileEntity> [todrive <ToDriveAttribute>*]
|
gam <UserTypeEntity> print forms <DriveFileEntity> [todrive <ToDriveAttribute>*]
|
||||||
(addcsvdata <FieldName> <String>)*
|
(addcsvdata <FieldName> <String>)*
|
||||||
@@ -7582,6 +7585,7 @@ gam <UserTypeEntity> show messages|threads
|
|||||||
[countsonly|positivecountsonly] [useronly]
|
[countsonly|positivecountsonly] [useronly]
|
||||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
|
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
|
||||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||||
|
[maxmessagesperthread <Number>]
|
||||||
[[attachmentnamepattern <RegularExpression>]
|
[[attachmentnamepattern <RegularExpression>]
|
||||||
[showattachments [noshowtextplain]]
|
[showattachments [noshowtextplain]]
|
||||||
[saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
|
[saveattachments [targetfolder <FilePath>] [overwrite [<Boolean>]]]
|
||||||
@@ -7593,6 +7597,7 @@ gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*]
|
|||||||
[countsonly|positivecountsonly] [useronly]
|
[countsonly|positivecountsonly] [useronly]
|
||||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]]
|
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]]
|
||||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||||
|
[maxmessagesperthread <Number>]
|
||||||
[convertcrnl] [delimiter <Character>]
|
[convertcrnl] [delimiter <Character>]
|
||||||
[[attachmentnamepattern <RegularExpression>]
|
[[attachmentnamepattern <RegularExpression>]
|
||||||
[showattachments [noshowtextplain]]]
|
[showattachments [noshowtextplain]]]
|
||||||
@@ -7814,7 +7819,8 @@ gam <UserTypeEntity> delete noteacl <NotesNameEntity>
|
|||||||
# Users - Licenses
|
# Users - Licenses
|
||||||
|
|
||||||
gam <UserTypeEntity> create|add license <SKUIDList> [product|productid <ProductID>] [preview] [actioncsv]
|
gam <UserTypeEntity> create|add license <SKUIDList> [product|productid <ProductID>] [preview] [actioncsv]
|
||||||
gam <UserTypeEntity> update license <SKUID> [product|productid <ProductID>] [from] <SKUID> [preview] [actioncsv]
|
gam <UserTypeEntity> update license <NewSKUID> [product|productid <ProductID>] [from] <OldSKUID>
|
||||||
|
[preview|archive] [actioncsv]
|
||||||
gam <UserTypeEntity> delete license <SKUIDList> [product|productid <ProductID>] [preview] [actioncsv]
|
gam <UserTypeEntity> delete license <SKUIDList> [product|productid <ProductID>] [preview] [actioncsv]
|
||||||
gam <UserTypeEntity> sync license <SKUIDList> [product|productid <ProductID>] [addonly|removeonly] [allskus|onesku] [preview] [actioncsv]
|
gam <UserTypeEntity> sync license <SKUIDList> [product|productid <ProductID>] [addonly|removeonly] [allskus|onesku] [preview] [actioncsv]
|
||||||
|
|
||||||
@@ -7886,7 +7892,15 @@ gam <UserTypeEntity> show lookerstudiopermissions
|
|||||||
<MeetSpaceName> ::= spaces/<String> | <String>
|
<MeetSpaceName> ::= spaces/<String> | <String>
|
||||||
<MeetSpaceOptions> ::=
|
<MeetSpaceOptions> ::=
|
||||||
accesstype open|trusted|restricted |
|
accesstype open|trusted|restricted |
|
||||||
entrypointaccess all|creatorapponly
|
entrypointaccess all|creatorapponly |
|
||||||
|
moderation <Boolean> |
|
||||||
|
chatrestriction hostsonly|norestriction |
|
||||||
|
reactionrestriction hostsonly|norestriction |
|
||||||
|
presentrestriction hostsonly|norestriction |
|
||||||
|
defaultjoinasviewer <Boolean> |
|
||||||
|
recording <Boolean> |
|
||||||
|
transcription <Boolean> |
|
||||||
|
smartnotes <Boolean>
|
||||||
|
|
||||||
gam <UserTypeEntity> create meetspace
|
gam <UserTypeEntity> create meetspace
|
||||||
<MeetSpaceOptions>*
|
<MeetSpaceOptions>*
|
||||||
|
|||||||
@@ -1,3 +1,291 @@
|
|||||||
|
7.05.00
|
||||||
|
|
||||||
|
Enabled support for Limited Access as described here:
|
||||||
|
* https://workspaceupdates.googleblog.com/2025/02/updating-access-experience-in-google-drive.html
|
||||||
|
|
||||||
|
Note that the rollout may take 15 days.
|
||||||
|
|
||||||
|
Added option `inheritedpermissionsdisabled [<Boolean>]` to `<DriveFileAttribute>`; this
|
||||||
|
attribute can be set on folders.
|
||||||
|
|
||||||
|
Added `inheritedpermissionsdisabled` to `<DriveFieldName>`.
|
||||||
|
|
||||||
|
Added `capabilities.candisableinheritedpermissions` and `capabilities.canenableinheritedpermissions`
|
||||||
|
to `<DriveCapabilitiesSubfieldName>`.
|
||||||
|
|
||||||
|
Added option `enforceexpansiveaccess [<Boolean>]` to all commands that delete or update
|
||||||
|
drive file ACLs/permissions.
|
||||||
|
```
|
||||||
|
gam <UserTypeEntity> delete permissions
|
||||||
|
gam <UserTypeEntity> delete drivefileacl
|
||||||
|
gam <UserTypeEntity> update drivefileacl
|
||||||
|
gam <UserTypeEntity> copy drivefile
|
||||||
|
gam <UserTypeEntity> move drivefile
|
||||||
|
gam <UserTypeEntity> transfer ownership
|
||||||
|
gam <UserTypeEntity> claim ownership
|
||||||
|
gam <UserTypeEntity> transfer drive
|
||||||
|
```
|
||||||
|
|
||||||
|
7.04.05
|
||||||
|
|
||||||
|
Added initial support for Meet API v2beta; you must be in the Developer Preview program
|
||||||
|
for this to be effective.
|
||||||
|
* https://developers.google.com/meet/api/guides/beta/configuration-beta#auto-artifacts
|
||||||
|
|
||||||
|
Added `meet_v2_beta` Boolean variable to `gam.cfg`. When this variable is true,
|
||||||
|
the following options are added to `<MeetSpaceOptions>` used in `gam <UserTypeEntity> create|update meetspace`.
|
||||||
|
```
|
||||||
|
moderation <Boolean> |
|
||||||
|
chatrestriction hostsonly|norestriction |
|
||||||
|
reactionrestriction hostsonly|norestriction |
|
||||||
|
presentrestriction hostsonly|norestriction |
|
||||||
|
defaultjoinasviewer <Boolean> |
|
||||||
|
recording <Boolean> |
|
||||||
|
transcription <Boolean> |
|
||||||
|
smartnotes <Boolean>
|
||||||
|
```
|
||||||
|
|
||||||
|
This isn't called beta for nothing, I have found problems and reported them.
|
||||||
|
|
||||||
|
7.04.04
|
||||||
|
|
||||||
|
Updated `gam print group-members|cigroup-members` to include the `email` column
|
||||||
|
when `fields <MembersFieldNameList>` did not include `email`.
|
||||||
|
|
||||||
|
7.04.03
|
||||||
|
|
||||||
|
Added option `minimal|basic|full` to `gam print cigroup-members`:
|
||||||
|
* `minimal` - Fields displayed: group, id, role, email
|
||||||
|
* `basic` - Fields displayed: group, type, id, role, email
|
||||||
|
* `full` - Fields displayed: group, type, id, role, email, createTime, updateTime; this is the default
|
||||||
|
|
||||||
|
Added option `minimal|basic|full` to `gam show cigroup-members`:
|
||||||
|
* `minimal` - Fields displayed: role, email
|
||||||
|
* `basic` - Fields displayed: type, role, email
|
||||||
|
* `full` - Fields displayed: type, role, email, createTime, updateTime; this is the default
|
||||||
|
|
||||||
|
Upgraded `gam print cigroup-members ... recursive` to display sub-group email addresses rather than IDs.
|
||||||
|
|
||||||
|
7.04.02
|
||||||
|
|
||||||
|
Improved output formatting for the following commands:
|
||||||
|
```
|
||||||
|
gam info peoplecontact
|
||||||
|
gam show peoplecontacts
|
||||||
|
gam info peopleprofile
|
||||||
|
gam show peopleprofile
|
||||||
|
gam <UserTypeEntity> info contacts
|
||||||
|
gam <UserTypeEntity> show contacts
|
||||||
|
gam <UserTypeEntity> show peopleprofile
|
||||||
|
```
|
||||||
|
|
||||||
|
7.04.01
|
||||||
|
|
||||||
|
Fixed bug where multiple `querytime<String>` values in a query were not properly processed;
|
||||||
|
only the last `querytime<String>` was processed.
|
||||||
|
```
|
||||||
|
Command line: query "sync:#querytime1#..#querytime2# status:provisioned" querytime1 -2y querytime2 -40w
|
||||||
|
Query: (sync:#querytime1#..2024-05-09T00:00:00 status:provisioned) Invalid
|
||||||
|
```
|
||||||
|
|
||||||
|
7.04.00
|
||||||
|
|
||||||
|
The Classic Sites API no longer functions, the following commands are deprecated:
|
||||||
|
```
|
||||||
|
gam [<UserTypeEntity>] create site
|
||||||
|
gam [<UserTypeEntity>] update site
|
||||||
|
gam [<UserTypeEntity>] info site
|
||||||
|
gam [<UserTypeEntity>] print sites
|
||||||
|
gam [<UserTypeEntity>] show sites
|
||||||
|
gam [<UserTypeEntity>] create siteacls
|
||||||
|
gam [<UserTypeEntity>] update siteacls
|
||||||
|
gam [<UserTypeEntity>] delete siteacls
|
||||||
|
gam [<UserTypeEntity>] info siteacls
|
||||||
|
gam [<UserTypeEntity>] show siteacls
|
||||||
|
gam [<UserTypeEntity>] print siteacls
|
||||||
|
gam [<UserTypeEntity>] print siteactivity
|
||||||
|
```
|
||||||
|
|
||||||
|
7.03.09
|
||||||
|
|
||||||
|
Added option `maxmessagesperthread <Number>` to `gam <UserTypeEntity> print|show threads`
|
||||||
|
that limits the number of messages displayed per thread. The default is 0, there is no limit.
|
||||||
|
For example, this can be used if you only want to see the first message of each thread.
|
||||||
|
```
|
||||||
|
gam user user@domain.com print|show threads maxmessagesperthread 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Fixed bug in `gam <UserTypeEntity> print filelist countsonly` where extraneous columns
|
||||||
|
were displayed.
|
||||||
|
|
||||||
|
Fixed bug in `gam <UserTypeEntity> print filelist countsonly showsize` where sizes were
|
||||||
|
all shown as 0 unless`sizefield size` was specified.
|
||||||
|
|
||||||
|
7.03.08
|
||||||
|
|
||||||
|
Improved pip install.
|
||||||
|
|
||||||
|
Yubikey as optional should now be working also. So:
|
||||||
|
|
||||||
|
pip install --upgrade gam7
|
||||||
|
|
||||||
|
skips Yubikey.
|
||||||
|
|
||||||
|
To install with yubikey support (assuming you have installed the necessary swig and libpcsclite-dev packages already) run:
|
||||||
|
|
||||||
|
pip install --upgrade gam7[yubikey]
|
||||||
|
|
||||||
|
7.03.07
|
||||||
|
|
||||||
|
Updated `gam create vaultexport` to include `corpus gemini`.
|
||||||
|
|
||||||
|
* See: https://workspaceupdates.googleblog.com/2025/02/google-vault-now-supports-gemini.html
|
||||||
|
|
||||||
|
7.03.06
|
||||||
|
|
||||||
|
Added option `rawfields "<BrowserFieldNameList>"` to `gam info|print|show browsers` that allows
|
||||||
|
specification of complex field lists with selected subfields.
|
||||||
|
|
||||||
|
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Browser-Cloud-Management#raw-fields
|
||||||
|
|
||||||
|
7.03.05
|
||||||
|
|
||||||
|
Make GAM pip-installable: "pip install gam7"
|
||||||
|
|
||||||
|
7.03.04
|
||||||
|
|
||||||
|
Added option `security` to `gam create cigroup` that allows creation of a security group
|
||||||
|
in a single command.
|
||||||
|
|
||||||
|
Updated to Python 3.13.2.
|
||||||
|
|
||||||
|
7.03.03
|
||||||
|
|
||||||
|
Fixed bug in `gam update resoldcustomer` that caused the following error:
|
||||||
|
```
|
||||||
|
ERROR: Got an unexpected keyword argument customerAuthToken
|
||||||
|
```
|
||||||
|
|
||||||
|
7.03.02
|
||||||
|
|
||||||
|
Updated `gam <UserTypeEntity> show labels nested` to properly display label nesting
|
||||||
|
when labels have embedded `/` characters in their names.
|
||||||
|
|
||||||
|
7.03.01
|
||||||
|
|
||||||
|
Updated `gam create project` to retry the following unexpected error:
|
||||||
|
```
|
||||||
|
ERROR: 400 - invalidArgument - Service account gam-project-a1b2c@gam-project-a1b2c.iam.gserviceaccount.com does not exist.
|
||||||
|
```
|
||||||
|
|
||||||
|
7.03.00
|
||||||
|
|
||||||
|
Updated `gam create|use project` to discontinue use of the `Identity-Aware Proxy (IAP) OAuth Admin APIs`
|
||||||
|
that are being deprecated by Google. You will see a set of instructions detailing how to
|
||||||
|
configure the Oauth Consent screen and create the Oauth client.
|
||||||
|
|
||||||
|
Added options `copypermissionroles <DriveFileACLRoleList>` and `copypermissiontypes <DriveFileACLTypeList>`
|
||||||
|
to `gam <UserTypeEntity> copy drivefile` that provide more control over what permissions are copied
|
||||||
|
from the source files/folders to the destination files/folders.
|
||||||
|
|
||||||
|
7.02.11
|
||||||
|
|
||||||
|
Updated `gam report <ActivityApplicationName>` to display `id:<actor.profileId>` in the `emailAddress` column
|
||||||
|
when `actor.email` is empty. This typically occurs when the actor is not in your workspace.
|
||||||
|
|
||||||
|
Updated `gam <UserTypeEntity> copy drivefile` to ignore ACLs referencing deleted user/groups.
|
||||||
|
|
||||||
|
7.02.10
|
||||||
|
|
||||||
|
Added option `bydate` to `gam report <ActivityApplicationName> ... countsonly` that provides an additional display option.
|
||||||
|
* `countsonly` - Display a row per user across all dates with all event counts on one row
|
||||||
|
* `countsonly bydate` - Display a row per user per date for all dates with any events with all events counts on the row
|
||||||
|
* `countsonly summary` - Display a row per event with counts for each event summarized across users and dates
|
||||||
|
|
||||||
|
7.02.09
|
||||||
|
|
||||||
|
Added option `clearresources` to `<EventUpdateAttribute>` for use in `gam <UserTypeEntity> update events`
|
||||||
|
that allows clearing all resources from a user's calendar events. For example, to clear all resources from a user's future events:
|
||||||
|
```
|
||||||
|
gam user user@domain.com update events primary matchfield attendeespattern @resource.calendar.google.com after now clearresources
|
||||||
|
```
|
||||||
|
|
||||||
|
Added option `resource <ResourceID>` to `<EventAttribute>` for use in `gam <UserTypeEntity> create|update events`
|
||||||
|
that adds a resource to an event.
|
||||||
|
|
||||||
|
Added option `removeresource <ResourceID>` to `<EventUpdateAttribute>` for use in `gam <UserTypeEntity> update events`
|
||||||
|
that removes a resource from an event.
|
||||||
|
|
||||||
|
7.02.08
|
||||||
|
|
||||||
|
Fixed bug in `gam print|show chromepolicies` that caused a trap when neither
|
||||||
|
`ou|orgunit <OrgUnitItem>` nor `group <GroupItem>` was specified.
|
||||||
|
|
||||||
|
7.02.07
|
||||||
|
|
||||||
|
Updated `gam delete|update chromepolicy` to display the `<AppID>` or `<PrinterID>` (if specified)
|
||||||
|
in the command status messages.
|
||||||
|
|
||||||
|
7.02.06
|
||||||
|
|
||||||
|
Added option `<JSONData>` to `gam <UserTypeEntity> create|update form` that allows for
|
||||||
|
creation/modification of all fields in a form. `<JSONData>` is a list of form update requests.
|
||||||
|
|
||||||
|
* See: https://developers.google.com/forms/api/reference/rest/v1/forms/batchUpdate
|
||||||
|
|
||||||
|
7.02.05
|
||||||
|
|
||||||
|
Updated `gam [<UserTypeEntity>] show shareddriveacls ... formatjson` to not display this line
|
||||||
|
which interferes with the JSON output.
|
||||||
|
```
|
||||||
|
User: user@domain.com, Show N Shared Drives
|
||||||
|
```
|
||||||
|
|
||||||
|
7.02.04
|
||||||
|
|
||||||
|
Updated code to eliminate trap caused by bug introduced in 7.02.00 that occurs when an invalid domain or OU is specified.
|
||||||
|
|
||||||
|
7.02.03
|
||||||
|
|
||||||
|
Added option `archive` to `gam <UserTypeEntity> update license <NewSKUID> from <OldSKUID>` that causes GAM
|
||||||
|
to archive `<UserTypeEntity>` after updating their license to `<NewSKUID>`. This will be used when you want to
|
||||||
|
archive a user with a non-archivable license. The `<NewSKUID>` license is assigned to the user and it then converts
|
||||||
|
to the equivalent Archived User license when the user is archived.
|
||||||
|
|
||||||
|
`<NewSKUID>` must be one of the following SKUs:
|
||||||
|
```
|
||||||
|
Google-Apps-Unlimited - G Suite Business
|
||||||
|
1010020020 - Google Workspace Enterprise Plus
|
||||||
|
1010020025 - Google Workspace Business Plus
|
||||||
|
1010020026 - Google Workspace Enterprise Standard
|
||||||
|
1010020027 - Google Workspace Business Starter
|
||||||
|
1010020028 - Google Workspace Business Standard
|
||||||
|
```
|
||||||
|
|
||||||
|
7.02.02
|
||||||
|
|
||||||
|
Updated `gam <UserTypeEntity> archive messages <GroupItem>` to retry the following unexpected error
|
||||||
|
that occurs after many messages have been successfully archived.
|
||||||
|
`ERROR: 404: notFound - Unable to lookup group`
|
||||||
|
|
||||||
|
7.02.01
|
||||||
|
|
||||||
|
Added options `locked` and `unlocked` to `gam update cigroups` that allow locking/unlocking groups.
|
||||||
|
|
||||||
|
* See: https://workspaceupdates.googleblog.com/2024/12/locked-groups-open-beta.html
|
||||||
|
|
||||||
|
You'll have to do a `gam oauth create` and enable the following scope to use these options:
|
||||||
|
```
|
||||||
|
[*] 22) Cloud Identity Groups API Beta (Enables group locking/unlocking)
|
||||||
|
```
|
||||||
|
|
||||||
|
7.02.00
|
||||||
|
|
||||||
|
Improved the error message displayed for user service account access commands when:
|
||||||
|
* The API is not enabled
|
||||||
|
* The user does not exist
|
||||||
|
* The user exists but is in a OU where the service is disabled
|
||||||
|
|
||||||
7.01.04
|
7.01.04
|
||||||
|
|
||||||
Admin role assignments are now in the v1 stable API, use that and remove custom local workaround for the beta. #1724
|
Admin role assignments are now in the v1 stable API, use that and remove custom local workaround for the beta. #1724
|
||||||
@@ -22,13 +310,13 @@ By default, when listing group members, GAM does not take the domain of the memb
|
|||||||
* `internal external internaldomains <DomainNameList>` - Display all members, indicate their category: internal or external
|
* `internal external internaldomains <DomainNameList>` - Display all members, indicate their category: internal or external
|
||||||
* `internaldomains <DomainNameList>` - Defaults to value of `domain` in `gam.cfg`
|
* `internaldomains <DomainNameList>` - Defaults to value of `domain` in `gam.cfg`
|
||||||
|
|
||||||
Members without an email address, e.g. `customer`, `chrome-os-device` and `cbcm-browser` are considered internal.
|
Members without an email address, e.g. `customer`, `chromeosdevice` and `cbcmbrowser` are considered internal.
|
||||||
|
|
||||||
Updated to Python 3.13.1.
|
Updated to Python 3.13.1.
|
||||||
|
|
||||||
7.01.03
|
7.01.03
|
||||||
|
|
||||||
Fixed bug in `gam update cigroups <GroupEntity> delete|sync|update` where `cbcm-browser` and `chrome-os_device`
|
Fixed bug in `gam update cigroups <GroupEntity> delete|sync|update` where `cbcmbrowser` and `chromeosdevice`
|
||||||
addresses were not properly handled.
|
addresses were not properly handled.
|
||||||
|
|
||||||
7.01.02
|
7.01.02
|
||||||
|
|||||||
@@ -97,13 +97,6 @@ else
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse() {
|
|
||||||
for (( i = ${#*}; i > 0; i-- ))
|
|
||||||
{
|
|
||||||
echo ${!i}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ "$gamversion" == "latest" ]; then
|
if [ "$gamversion" == "latest" ]; then
|
||||||
release_url="https://api.github.com/repos/GAM-team/GAM/releases/latest"
|
release_url="https://api.github.com/repos/GAM-team/GAM/releases/latest"
|
||||||
elif [ "$gamversion" == "prerelease" -o "$gamversion" == "draft" ]; then
|
elif [ "$gamversion" == "prerelease" -o "$gamversion" == "draft" ]; then
|
||||||
@@ -119,6 +112,12 @@ else
|
|||||||
check_type="authenticated"
|
check_type="authenticated"
|
||||||
curl_opts=( "$GHCLIENT" )
|
curl_opts=( "$GHCLIENT" )
|
||||||
fi
|
fi
|
||||||
|
curl_ver=$(curl --version|head -1|cut -d " " -f 2)
|
||||||
|
if [[ "${curl_ver:0:4}" < "7.76" ]]; then
|
||||||
|
curl_fail=( )
|
||||||
|
else
|
||||||
|
curl_fail=( "--fail-with-body" )
|
||||||
|
fi
|
||||||
echo_yellow "Checking GitHub URL $release_url for $gamversion GAM release ($check_type)..."
|
echo_yellow "Checking GitHub URL $release_url for $gamversion GAM release ($check_type)..."
|
||||||
release_json=$(curl \
|
release_json=$(curl \
|
||||||
--silent \
|
--silent \
|
||||||
@@ -126,9 +125,16 @@ release_json=$(curl \
|
|||||||
-H "Accept: application/vnd.github+json" \
|
-H "Accept: application/vnd.github+json" \
|
||||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||||
"$release_url" \
|
"$release_url" \
|
||||||
2>&1 /dev/null)
|
"${curl_fail[@]}")
|
||||||
|
curl_exit_code=$?
|
||||||
|
if [ $curl_exit_code -ne 0 ]; then
|
||||||
|
echo_red "ERROR retrieving URL: ${release_json}"
|
||||||
|
exit
|
||||||
|
else
|
||||||
|
echo_green "done"
|
||||||
|
fi
|
||||||
|
|
||||||
echo_yellow "Getting file and download URL..."
|
echo_yellow "Calculating download URL for this device..."
|
||||||
# Python is sadly the nearest to universal way to safely handle JSON with Bash
|
# Python is sadly the nearest to universal way to safely handle JSON with Bash
|
||||||
# At least this code should be compatible with just about any Python version ever
|
# At least this code should be compatible with just about any Python version ever
|
||||||
# unlike GAM itself. If some users don't have Python we can try grep / sed / etc
|
# unlike GAM itself. If some users don't have Python we can try grep / sed / etc
|
||||||
@@ -323,6 +329,8 @@ echo_yellow "Downloading ${download_url} to $temp_archive_dir ($check_type)..."
|
|||||||
(cd "$temp_archive_dir" && curl -O -L -s "${curl_opts[@]}" "$download_url")
|
(cd "$temp_archive_dir" && curl -O -L -s "${curl_opts[@]}" "$download_url")
|
||||||
|
|
||||||
mkdir -p "$target_dir"
|
mkdir -p "$target_dir"
|
||||||
|
echo_yellow "Deleting contents of $target_dir/gam7/lib"
|
||||||
|
rm -frv "$target_dir/gam7/lib"
|
||||||
|
|
||||||
echo_yellow "Extracting archive to $target_dir"
|
echo_yellow "Extracting archive to $target_dir"
|
||||||
if [[ "$name" =~ tar.xz|tar.gz|tar ]]; then
|
if [[ "$name" =~ tar.xz|tar.gz|tar ]]; then
|
||||||
@@ -379,7 +387,7 @@ while true; do
|
|||||||
;;
|
;;
|
||||||
[Nn]*)
|
[Nn]*)
|
||||||
# config_cmd="config no_browser true"
|
# config_cmd="config no_browser true"
|
||||||
touch "$target_dir/gam/nobrowser.txt" > /dev/null 2>&1
|
touch "$target_dir/gam7/nobrowser.txt" > /dev/null 2>&1
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -487,4 +495,3 @@ echo_green "GAM installation and setup complete!"
|
|||||||
if [ "$update_profile" = true ]; then
|
if [ "$update_profile" = true ]; then
|
||||||
echo_green "Please restart your terminal shell or to get started right away run:\n\n$alias_line"
|
echo_green "Please restart your terminal shell or to get started right away run:\n\n$alias_line"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ for pkg in GAM_VER_LIBS:
|
|||||||
datas += [('gam/cbcm-v1.1beta1.json', '.')]
|
datas += [('gam/cbcm-v1.1beta1.json', '.')]
|
||||||
datas += [('gam/contactdelegation-v1.json', '.')]
|
datas += [('gam/contactdelegation-v1.json', '.')]
|
||||||
datas += [('gam/datastudio-v1.json', '.')]
|
datas += [('gam/datastudio-v1.json', '.')]
|
||||||
|
datas += [('gam/meet-v2beta.json', '.')]
|
||||||
datas += [('gam/serviceaccountlookup-v1.json', '.')]
|
datas += [('gam/serviceaccountlookup-v1.json', '.')]
|
||||||
datas += [('cacerts.pem', '.')]
|
datas += [('cacerts.pem', '.')]
|
||||||
hiddenimports = [
|
hiddenimports = [
|
||||||
|
|||||||
3246
src/gam/__init__.py
3246
src/gam/__init__.py
File diff suppressed because it is too large
Load Diff
@@ -45,10 +45,11 @@ CLASSROOM = 'classroom'
|
|||||||
CLOUDCHANNEL = 'cloudchannel'
|
CLOUDCHANNEL = 'cloudchannel'
|
||||||
CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
|
CLOUDIDENTITY_DEVICES = 'cloudidentitydevices'
|
||||||
CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
|
CLOUDIDENTITY_GROUPS = 'cloudidentitygroups'
|
||||||
|
CLOUDIDENTITY_GROUPS_BETA = 'cloudidentitygroupsbeta'
|
||||||
CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
|
CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
|
||||||
CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
|
CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
|
||||||
CLOUDIDENTITY_POLICY = 'cloudidentitypolicy'
|
|
||||||
CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
|
CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
|
||||||
|
CLOUDIDENTITY_POLICY = 'cloudidentitypolicy'
|
||||||
CLOUDIDENTITY_USERINVITATIONS = 'cloudidentityuserinvitations'
|
CLOUDIDENTITY_USERINVITATIONS = 'cloudidentityuserinvitations'
|
||||||
CLOUDRESOURCEMANAGER = 'cloudresourcemanager'
|
CLOUDRESOURCEMANAGER = 'cloudresourcemanager'
|
||||||
CONTACTS = 'contacts'
|
CONTACTS = 'contacts'
|
||||||
@@ -70,11 +71,11 @@ GROUPSMIGRATION = 'groupsmigration'
|
|||||||
GROUPSSETTINGS = 'groupssettings'
|
GROUPSSETTINGS = 'groupssettings'
|
||||||
IAM = 'iam'
|
IAM = 'iam'
|
||||||
IAM_CREDENTIALS = 'iamcredentials'
|
IAM_CREDENTIALS = 'iamcredentials'
|
||||||
IAP = 'iap'
|
|
||||||
KEEP = 'keep'
|
KEEP = 'keep'
|
||||||
LICENSING = 'licensing'
|
LICENSING = 'licensing'
|
||||||
LOOKERSTUDIO = 'datastudio'
|
LOOKERSTUDIO = 'datastudio'
|
||||||
MEET = 'meet'
|
MEET = 'meet'
|
||||||
|
MEET_BETA = 'meetbeta'
|
||||||
OAUTH2 = 'oauth2'
|
OAUTH2 = 'oauth2'
|
||||||
ORGPOLICY = 'orgpolicy'
|
ORGPOLICY = 'orgpolicy'
|
||||||
PEOPLE = 'people'
|
PEOPLE = 'people'
|
||||||
@@ -89,7 +90,6 @@ SERVICEMANAGEMENT = 'servicemanagement'
|
|||||||
SERVICEUSAGE = 'serviceusage'
|
SERVICEUSAGE = 'serviceusage'
|
||||||
SHEETS = 'sheets'
|
SHEETS = 'sheets'
|
||||||
SHEETSTD = 'sheetstd'
|
SHEETSTD = 'sheetstd'
|
||||||
SITES = 'sites'
|
|
||||||
SITEVERIFICATION = 'siteVerification'
|
SITEVERIFICATION = 'siteVerification'
|
||||||
STORAGE = 'storage'
|
STORAGE = 'storage'
|
||||||
STORAGEREAD = 'storageread'
|
STORAGEREAD = 'storageread'
|
||||||
@@ -184,7 +184,6 @@ PROJECT_APIS = [
|
|||||||
'groupsmigration.googleapis.com',
|
'groupsmigration.googleapis.com',
|
||||||
'groupssettings.googleapis.com',
|
'groupssettings.googleapis.com',
|
||||||
'iam.googleapis.com',
|
'iam.googleapis.com',
|
||||||
'iap.googleapis.com',
|
|
||||||
'keep.googleapis.com',
|
'keep.googleapis.com',
|
||||||
'licensing.googleapis.com',
|
'licensing.googleapis.com',
|
||||||
'meet.googleapis.com',
|
'meet.googleapis.com',
|
||||||
@@ -224,6 +223,7 @@ _INFO = {
|
|||||||
CLOUDCHANNEL: {'name': 'Channel Channel API', 'version': 'v1', 'v2discovery': True},
|
CLOUDCHANNEL: {'name': 'Channel Channel API', 'version': 'v1', 'v2discovery': True},
|
||||||
CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity Devices API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity Devices API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity Groups API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity Groups API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
|
CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity Groups API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity Inbound SSO API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity Inbound SSO API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
@@ -248,11 +248,11 @@ _INFO = {
|
|||||||
GROUPSSETTINGS: {'name': 'Groups Settings API', 'version': 'v1', 'v2discovery': True},
|
GROUPSSETTINGS: {'name': 'Groups Settings API', 'version': 'v1', 'v2discovery': True},
|
||||||
IAM: {'name': 'Identity and Access Management API', 'version': 'v1', 'v2discovery': True},
|
IAM: {'name': 'Identity and Access Management API', 'version': 'v1', 'v2discovery': True},
|
||||||
IAM_CREDENTIALS: {'name': 'Identity and Access Management Credentials API', 'version': 'v1', 'v2discovery': True},
|
IAM_CREDENTIALS: {'name': 'Identity and Access Management Credentials API', 'version': 'v1', 'v2discovery': True},
|
||||||
IAP: {'name': 'Cloud Identity-Aware Proxy API', 'version': 'v1', 'v2discovery': True},
|
|
||||||
KEEP: {'name': 'Keep API', 'version': 'v1', 'v2discovery': True},
|
KEEP: {'name': 'Keep API', 'version': 'v1', 'v2discovery': True},
|
||||||
LICENSING: {'name': 'License Manager API', 'version': 'v1', 'v2discovery': True},
|
LICENSING: {'name': 'License Manager API', 'version': 'v1', 'v2discovery': True},
|
||||||
LOOKERSTUDIO: {'name': 'Looker Studio API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
LOOKERSTUDIO: {'name': 'Looker Studio API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
||||||
MEET: {'name': 'Meet API', 'version': 'v2', 'v2discovery': True},
|
MEET: {'name': 'Meet API', 'version': 'v2', 'v2discovery': True},
|
||||||
|
MEET_BETA: {'name': 'Meet API', 'version': 'v2beta', 'v2discovery': True, 'localjson': True, 'mappedAPI': MEET},
|
||||||
OAUTH2: {'name': 'OAuth2 API', 'version': 'v2', 'v2discovery': False},
|
OAUTH2: {'name': 'OAuth2 API', 'version': 'v2', 'v2discovery': False},
|
||||||
ORGPOLICY: {'name': 'Organization Policy API', 'version': 'v2', 'v2discovery': True},
|
ORGPOLICY: {'name': 'Organization Policy API', 'version': 'v2', 'v2discovery': True},
|
||||||
PEOPLE: {'name': 'People API', 'version': 'v1', 'v2discovery': True},
|
PEOPLE: {'name': 'People API', 'version': 'v1', 'v2discovery': True},
|
||||||
@@ -267,7 +267,6 @@ _INFO = {
|
|||||||
SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
|
SERVICEUSAGE: {'name': 'Service Usage API', 'version': 'v1', 'v2discovery': True},
|
||||||
SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
|
SHEETS: {'name': 'Sheets API', 'version': 'v4', 'v2discovery': True},
|
||||||
SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
|
SHEETSTD: {'name': 'Sheets API - todrive', 'version': 'v4', 'v2discovery': True, 'mappedAPI': SHEETS},
|
||||||
SITES: {'name': 'Sites API', 'version': 'v1', 'v2discovery': False},
|
|
||||||
SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
|
SITEVERIFICATION: {'name': 'Site Verification API', 'version': 'v1', 'v2discovery': True},
|
||||||
STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
|
STORAGE: {'name': 'Cloud Storage API', 'version': 'v1', 'v2discovery': True},
|
||||||
STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
|
STORAGEREAD: {'name': 'Cloud Storage API - Read', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
|
||||||
@@ -361,6 +360,10 @@ _CLIENT_SCOPES = [
|
|||||||
'api': CLOUDIDENTITY_GROUPS,
|
'api': CLOUDIDENTITY_GROUPS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
|
||||||
|
{'name': 'Cloud Identity Groups API Beta (Enables group locking/unlocking)',
|
||||||
|
'api': CLOUDIDENTITY_GROUPS_BETA,
|
||||||
|
'subscopes': [],
|
||||||
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
|
||||||
{'name': 'Cloud Identity - Inbound SSO Settings',
|
{'name': 'Cloud Identity - Inbound SSO Settings',
|
||||||
'api': CLOUDIDENTITY_INBOUND_SSO,
|
'api': CLOUDIDENTITY_INBOUND_SSO,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -497,11 +500,6 @@ _CLIENT_SCOPES = [
|
|||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'offByDefault': True,
|
'offByDefault': True,
|
||||||
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
||||||
{'name': 'Sites API',
|
|
||||||
'api': SITES,
|
|
||||||
'subscopes': [],
|
|
||||||
'offByDefault': True,
|
|
||||||
'scope': 'https://sites.google.com/feeds'},
|
|
||||||
{'name': 'Vault API',
|
{'name': 'Vault API',
|
||||||
'api': VAULT,
|
'api': VAULT,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -691,10 +689,6 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': SHEETS,
|
'api': SHEETS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/spreadsheets'},
|
'scope': 'https://www.googleapis.com/auth/spreadsheets'},
|
||||||
{'name': 'Sites API',
|
|
||||||
'api': SITES,
|
|
||||||
'subscopes': [],
|
|
||||||
'scope': 'https://sites.google.com/feeds'},
|
|
||||||
{'name': 'Tasks API',
|
{'name': 'Tasks API',
|
||||||
'api': TASKS,
|
'api': TASKS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
|
|||||||
@@ -177,8 +177,14 @@ INTER_BATCH_WAIT = 'inter_batch_wait'
|
|||||||
LICENSE_MAX_RESULTS = 'license_max_results'
|
LICENSE_MAX_RESULTS = 'license_max_results'
|
||||||
# License SKUs to process
|
# License SKUs to process
|
||||||
LICENSE_SKUS = 'license_skus'
|
LICENSE_SKUS = 'license_skus'
|
||||||
|
# Use Meet V2 beta
|
||||||
|
MEET_V2_BETA = 'meet_v2_beta'
|
||||||
# When retrieving lists of Google Group members from API, how many should be retrieved in each chunk
|
# When retrieving lists of Google Group members from API, how many should be retrieved in each chunk
|
||||||
MEMBER_MAX_RESULTS = 'member_max_results'
|
MEMBER_MAX_RESULTS = 'member_max_results'
|
||||||
|
# CI API Group members max page size when view=BASIC
|
||||||
|
MEMBER_MAX_RESULTS_CI_BASIC = 'member_max_results_ci_basic'
|
||||||
|
# CI API Group members max page size when view=FULL
|
||||||
|
MEMBER_MAX_RESULTS_CI_FULL = 'member_max_results_ci_full'
|
||||||
# When deleting or modifying Gmail messages, how many should be processed in each batch
|
# When deleting or modifying Gmail messages, how many should be processed in each batch
|
||||||
MESSAGE_BATCH_SIZE = 'message_batch_size'
|
MESSAGE_BATCH_SIZE = 'message_batch_size'
|
||||||
# When retrieving lists of Gmail messages from API, how many should be retrieved in each chunk
|
# When retrieving lists of Gmail messages from API, how many should be retrieved in each chunk
|
||||||
@@ -384,7 +390,10 @@ Defaults = {
|
|||||||
INTER_BATCH_WAIT: '0',
|
INTER_BATCH_WAIT: '0',
|
||||||
LICENSE_MAX_RESULTS: '100',
|
LICENSE_MAX_RESULTS: '100',
|
||||||
LICENSE_SKUS: '',
|
LICENSE_SKUS: '',
|
||||||
|
MEET_V2_BETA: FALSE,
|
||||||
MEMBER_MAX_RESULTS: '200',
|
MEMBER_MAX_RESULTS: '200',
|
||||||
|
MEMBER_MAX_RESULTS_CI_BASIC: '1000',
|
||||||
|
MEMBER_MAX_RESULTS_CI_FULL: '500',
|
||||||
MESSAGE_BATCH_SIZE: '50',
|
MESSAGE_BATCH_SIZE: '50',
|
||||||
MESSAGE_MAX_RESULTS: '500',
|
MESSAGE_MAX_RESULTS: '500',
|
||||||
MOBILE_MAX_RESULTS: '100',
|
MOBILE_MAX_RESULTS: '100',
|
||||||
@@ -549,7 +558,10 @@ VAR_INFO = {
|
|||||||
INTER_BATCH_WAIT: {VAR_TYPE: TYPE_FLOAT, VAR_LIMITS: (0.0, 60.0)},
|
INTER_BATCH_WAIT: {VAR_TYPE: TYPE_FLOAT, VAR_LIMITS: (0.0, 60.0)},
|
||||||
LICENSE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (10, 1000)},
|
LICENSE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (10, 1000)},
|
||||||
LICENSE_SKUS: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
LICENSE_SKUS: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||||
|
MEET_V2_BETA: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
MEMBER_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
|
MEMBER_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
|
||||||
|
MEMBER_MAX_RESULTS_CI_BASIC: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
|
||||||
|
MEMBER_MAX_RESULTS_CI_FULL: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 500)},
|
||||||
MESSAGE_BATCH_SIZE: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
|
MESSAGE_BATCH_SIZE: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
|
||||||
MESSAGE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10000)},
|
MESSAGE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 10000)},
|
||||||
MOBILE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 100)},
|
MOBILE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 100)},
|
||||||
|
|||||||
@@ -924,6 +924,7 @@ class GamCLArgs():
|
|||||||
OB_EXPORT_ITEM = 'ExportItem'
|
OB_EXPORT_ITEM = 'ExportItem'
|
||||||
OB_FIELD_NAME = 'FieldName'
|
OB_FIELD_NAME = 'FieldName'
|
||||||
OB_FIELD_NAME_LIST = "FieldNameList"
|
OB_FIELD_NAME_LIST = "FieldNameList"
|
||||||
|
OB_FIELDS = 'Fields'
|
||||||
OB_FILE_NAME = 'FileName'
|
OB_FILE_NAME = 'FileName'
|
||||||
OB_FILE_NAME_FIELD_NAME = OB_FILE_NAME+'(:'+OB_FIELD_NAME+')+'
|
OB_FILE_NAME_FIELD_NAME = OB_FILE_NAME+'(:'+OB_FIELD_NAME+')+'
|
||||||
OB_FILE_NAME_OR_URL = 'FileName|URL'
|
OB_FILE_NAME_OR_URL = 'FileName|URL'
|
||||||
@@ -1149,6 +1150,10 @@ class GamCLArgs():
|
|||||||
return f'Command: {self.QuotedArgumentList(self.argv[:self.argvI])} >>>{self.QuotedArgumentList([self.argv[self.argvI]])}<<< {self.QuotedArgumentList(self.argv[self.argvI+1:])}\n'
|
return f'Command: {self.QuotedArgumentList(self.argv[:self.argvI])} >>>{self.QuotedArgumentList([self.argv[self.argvI]])}<<< {self.QuotedArgumentList(self.argv[self.argvI+1:])}\n'
|
||||||
return f'Command: {self.QuotedArgumentList(self.argv)} >>><<<\n'
|
return f'Command: {self.QuotedArgumentList(self.argv)} >>><<<\n'
|
||||||
|
|
||||||
|
# Deprecated command
|
||||||
|
def CommandDeprecated(self):
|
||||||
|
return f'{self.QuotedArgumentList(self.argv)}\n'
|
||||||
|
|
||||||
# Peek to see if next argument is in choices
|
# Peek to see if next argument is in choices
|
||||||
def PeekArgumentPresent(self, choices):
|
def PeekArgumentPresent(self, choices):
|
||||||
if self.ArgumentsRemaining():
|
if self.ArgumentsRemaining():
|
||||||
|
|||||||
@@ -342,8 +342,6 @@ class GamEntity():
|
|||||||
SHEET = 'shet'
|
SHEET = 'shet'
|
||||||
SHEET_ID = 'shti'
|
SHEET_ID = 'shti'
|
||||||
SIGNATURE = 'sign'
|
SIGNATURE = 'sign'
|
||||||
SITE = 'site'
|
|
||||||
SITE_ACL = 'sacl'
|
|
||||||
SIZE = 'size'
|
SIZE = 'size'
|
||||||
SKU = 'sku '
|
SKU = 'sku '
|
||||||
SMIME_ID = 'smid'
|
SMIME_ID = 'smid'
|
||||||
@@ -695,8 +693,6 @@ class GamEntity():
|
|||||||
SHEET: ['Sheets', 'Sheet'],
|
SHEET: ['Sheets', 'Sheet'],
|
||||||
SHEET_ID: ['Sheet IDs', 'Sheet ID'],
|
SHEET_ID: ['Sheet IDs', 'Sheet ID'],
|
||||||
SIGNATURE: ['Signatures', 'Signature'],
|
SIGNATURE: ['Signatures', 'Signature'],
|
||||||
SITE: ['Sites', 'Site'],
|
|
||||||
SITE_ACL: ['Site ACLs', 'Site ACL'],
|
|
||||||
SIZE: ['Sizes', 'Size'],
|
SIZE: ['Sizes', 'Size'],
|
||||||
SKU: ['SKUs', 'SKU'],
|
SKU: ['SKUs', 'SKU'],
|
||||||
SMIME_ID: ['S/MIME Certificate IDs', 'S/MIME Certificate ID'],
|
SMIME_ID: ['S/MIME Certificate IDs', 'S/MIME Certificate ID'],
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ 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'
|
||||||
MAIL_SERVICE_NOT_ENABLED = 'mailServiceNotEnabled'
|
|
||||||
MALFORMED_WORKING_LOCATION_EVENT = 'malformedWorkingLocationEvent'
|
MALFORMED_WORKING_LOCATION_EVENT = 'malformedWorkingLocationEvent'
|
||||||
MEMBER_NOT_FOUND = 'memberNotFound'
|
MEMBER_NOT_FOUND = 'memberNotFound'
|
||||||
MYDRIVE_HIERARCHY_DEPTH_LIMIT_EXCEEDED = 'myDriveHierarchyDepthLimitExceeded'
|
MYDRIVE_HIERARCHY_DEPTH_LIMIT_EXCEEDED = 'myDriveHierarchyDepthLimitExceeded'
|
||||||
@@ -185,7 +184,7 @@ DEFAULT_RETRY_REASONS = [QUOTA_EXCEEDED, RATE_LIMIT_EXCEEDED, SHARING_RATE_LIMIT
|
|||||||
BACKEND_ERROR, BAD_GATEWAY, GATEWAY_TIMEOUT, INTERNAL_ERROR, TRANSIENT_ERROR]
|
BACKEND_ERROR, BAD_GATEWAY, GATEWAY_TIMEOUT, INTERNAL_ERROR, TRANSIENT_ERROR]
|
||||||
SERVICE_NOT_AVAILABLE_RETRY_REASONS = [SERVICE_NOT_AVAILABLE]
|
SERVICE_NOT_AVAILABLE_RETRY_REASONS = [SERVICE_NOT_AVAILABLE]
|
||||||
ACTIVITY_THROW_REASONS = [SERVICE_NOT_AVAILABLE, BAD_REQUEST]
|
ACTIVITY_THROW_REASONS = [SERVICE_NOT_AVAILABLE, BAD_REQUEST]
|
||||||
ALERT_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR]
|
ALERT_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, PERMISSION_DENIED]
|
||||||
CALENDAR_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, NOT_A_CALENDAR_USER]
|
CALENDAR_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, NOT_A_CALENDAR_USER]
|
||||||
CIGROUP_CREATE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, ALREADY_EXISTS, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, INVALID, INVALID_ARGUMENT, PERMISSION_DENIED, FAILED_PRECONDITION]
|
CIGROUP_CREATE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, ALREADY_EXISTS, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, INVALID, INVALID_ARGUMENT, PERMISSION_DENIED, FAILED_PRECONDITION]
|
||||||
CIGROUP_GET_THROW_REASONS = [SERVICE_NOT_AVAILABLE, NOT_FOUND, GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, SYSTEM_ERROR, PERMISSION_DENIED]
|
CIGROUP_GET_THROW_REASONS = [SERVICE_NOT_AVAILABLE, NOT_FOUND, GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, INVALID, SYSTEM_ERROR, PERMISSION_DENIED]
|
||||||
@@ -269,7 +268,7 @@ GROUP_SETTINGS_THROW_REASONS = [NOT_FOUND, GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DO
|
|||||||
GROUP_SETTINGS_RETRY_REASONS = [INVALID, SERVICE_LIMIT, SERVICE_NOT_AVAILABLE]
|
GROUP_SETTINGS_RETRY_REASONS = [INVALID, SERVICE_LIMIT, SERVICE_NOT_AVAILABLE]
|
||||||
GROUP_LIST_THROW_REASONS = [RESOURCE_NOT_FOUND, DOMAIN_NOT_FOUND, FORBIDDEN, BAD_REQUEST]
|
GROUP_LIST_THROW_REASONS = [RESOURCE_NOT_FOUND, DOMAIN_NOT_FOUND, FORBIDDEN, BAD_REQUEST]
|
||||||
GROUP_LIST_USERKEY_THROW_REASONS = GROUP_LIST_THROW_REASONS+[INVALID_MEMBER, INVALID_INPUT]
|
GROUP_LIST_USERKEY_THROW_REASONS = GROUP_LIST_THROW_REASONS+[INVALID_MEMBER, INVALID_INPUT]
|
||||||
KEEP_THROW_REASONS = [SERVICE_NOT_AVAILABLE, BAD_REQUEST, PERMISSION_DENIED, INVALID_ARGUMENT, NOT_FOUND]
|
KEEP_THROW_REASONS = [AUTH_ERROR, BAD_REQUEST, PERMISSION_DENIED, INVALID_ARGUMENT, NOT_FOUND]
|
||||||
LOOKERSTUDIO_THROW_REASONS = [INVALID_ARGUMENT, SERVICE_NOT_AVAILABLE, BAD_REQUEST, NOT_FOUND, PERMISSION_DENIED, INTERNAL_ERROR]
|
LOOKERSTUDIO_THROW_REASONS = [INVALID_ARGUMENT, SERVICE_NOT_AVAILABLE, BAD_REQUEST, NOT_FOUND, PERMISSION_DENIED, INTERNAL_ERROR]
|
||||||
MEMBERS_THROW_REASONS = [GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, INVALID, FORBIDDEN, SERVICE_NOT_AVAILABLE]
|
MEMBERS_THROW_REASONS = [GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, INVALID, FORBIDDEN, SERVICE_NOT_AVAILABLE]
|
||||||
MEMBERS_RETRY_REASONS = [SYSTEM_ERROR, SERVICE_NOT_AVAILABLE]
|
MEMBERS_RETRY_REASONS = [SYSTEM_ERROR, SERVICE_NOT_AVAILABLE]
|
||||||
@@ -278,8 +277,8 @@ PEOPLE_ACCESS_THROW_REASONS = [SERVICE_NOT_AVAILABLE, FORBIDDEN, PERMISSION_DENI
|
|||||||
RESELLER_THROW_REASONS = [BAD_REQUEST, RESOURCE_NOT_FOUND, FORBIDDEN, INVALID]
|
RESELLER_THROW_REASONS = [BAD_REQUEST, RESOURCE_NOT_FOUND, FORBIDDEN, INVALID]
|
||||||
SHEETS_ACCESS_THROW_REASONS = DRIVE_USER_THROW_REASONS+[NOT_FOUND, PERMISSION_DENIED, FORBIDDEN, INTERNAL_ERROR, INSUFFICIENT_FILE_PERMISSIONS,
|
SHEETS_ACCESS_THROW_REASONS = DRIVE_USER_THROW_REASONS+[NOT_FOUND, PERMISSION_DENIED, FORBIDDEN, INTERNAL_ERROR, INSUFFICIENT_FILE_PERMISSIONS,
|
||||||
BAD_REQUEST, INVALID, INVALID_ARGUMENT, FAILED_PRECONDITION]
|
BAD_REQUEST, INVALID, INVALID_ARGUMENT, FAILED_PRECONDITION]
|
||||||
TASK_THROW_REASONS = [SERVICE_NOT_AVAILABLE, BAD_REQUEST, PERMISSION_DENIED, INVALID, NOT_FOUND, ACCESS_NOT_CONFIGURED]
|
TASK_THROW_REASONS = [BAD_REQUEST, PERMISSION_DENIED, INVALID, NOT_FOUND, ACCESS_NOT_CONFIGURED]
|
||||||
TASKLIST_THROW_REASONS = [SERVICE_NOT_AVAILABLE, BAD_REQUEST, PERMISSION_DENIED, INVALID, NOT_FOUND, ACCESS_NOT_CONFIGURED]
|
TASKLIST_THROW_REASONS = [BAD_REQUEST, PERMISSION_DENIED, INVALID, NOT_FOUND, ACCESS_NOT_CONFIGURED]
|
||||||
USER_GET_THROW_REASONS = [USER_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, SYSTEM_ERROR]
|
USER_GET_THROW_REASONS = [USER_NOT_FOUND, DOMAIN_NOT_FOUND, DOMAIN_CANNOT_USE_APIS, FORBIDDEN, BAD_REQUEST, SYSTEM_ERROR]
|
||||||
YOUTUBE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, UNSUPPORTED_SUPERVISED_ACCOUNT, UNSUPPORTED_LANGUAGE_CODE, CONTENT_OWNER_ACCOUNT_NOT_FOUND]
|
YOUTUBE_THROW_REASONS = [SERVICE_NOT_AVAILABLE, AUTH_ERROR, UNSUPPORTED_SUPERVISED_ACCOUNT, UNSUPPORTED_LANGUAGE_CODE, CONTENT_OWNER_ACCOUNT_NOT_FOUND]
|
||||||
|
|
||||||
@@ -537,8 +536,6 @@ class limitExceeded(Exception):
|
|||||||
pass
|
pass
|
||||||
class loginRequired(Exception):
|
class loginRequired(Exception):
|
||||||
pass
|
pass
|
||||||
class mailServiceNotEnabled(Exception):
|
|
||||||
pass
|
|
||||||
class malformedWorkingLocationEvent(Exception):
|
class malformedWorkingLocationEvent(Exception):
|
||||||
pass
|
pass
|
||||||
class memberNotFound(Exception):
|
class memberNotFound(Exception):
|
||||||
@@ -756,7 +753,6 @@ 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,
|
||||||
MAIL_SERVICE_NOT_ENABLED: mailServiceNotEnabled,
|
|
||||||
MALFORMED_WORKING_LOCATION_EVENT: malformedWorkingLocationEvent,
|
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,
|
||||||
|
|||||||
@@ -23,8 +23,10 @@
|
|||||||
# The following GM_XXX constants are arbitrary but must be unique
|
# The following GM_XXX constants are arbitrary but must be unique
|
||||||
# Most errors print a message and bail out with a return code
|
# Most errors print a message and bail out with a return code
|
||||||
# Some commands want to set a non-zero return code but not bail
|
# Some commands want to set a non-zero return code but not bail
|
||||||
# GAM admin user
|
# GAM admin user from oauth2.txt or oauth2service.json
|
||||||
ADMIN = 'admin'
|
ADMIN = 'admn'
|
||||||
|
# Drive service for admin; used to look up Shared Drive Names
|
||||||
|
ADMIN_DRIVE = 'addr'
|
||||||
# Number/length of API call retries
|
# Number/length of API call retries
|
||||||
API_CALLS_RETRY_DATA = 'rtry'
|
API_CALLS_RETRY_DATA = 'rtry'
|
||||||
# GAM cache directory. If no_cache is True, this variable will be set to None
|
# GAM cache directory. If no_cache is True, this variable will be set to None
|
||||||
@@ -215,6 +217,7 @@ REDIRECT_QUEUE_EOF = 'eof'
|
|||||||
#
|
#
|
||||||
Globals = {
|
Globals = {
|
||||||
ADMIN: None,
|
ADMIN: None,
|
||||||
|
ADMIN_DRIVE: None,
|
||||||
API_CALLS_RETRY_DATA: {},
|
API_CALLS_RETRY_DATA: {},
|
||||||
CACHE_DIR: None,
|
CACHE_DIR: None,
|
||||||
CACHE_DISCOVERY_ONLY: True,
|
CACHE_DISCOVERY_ONLY: True,
|
||||||
|
|||||||
@@ -40,21 +40,43 @@ sign in as {0} and accept the Terms of Service (ToS). As soon as you've accepted
|
|||||||
|
|
||||||
PROJECT_STILL_BEING_CREATED_SLEEPING = 'Project still being created. Sleeping {0} seconds\n'
|
PROJECT_STILL_BEING_CREATED_SLEEPING = 'Project still being created. Sleeping {0} seconds\n'
|
||||||
FAILED_TO_CREATE_PROJECT = 'Failed to create project: {0}\n'
|
FAILED_TO_CREATE_PROJECT = 'Failed to create project: {0}\n'
|
||||||
SETTING_GAM_PROJECT_CONSENT_SCREEN = 'Setting GAM project consent screen...\n'
|
SETTING_GAM_PROJECT_CONSENT_SCREEN_CREATING_CLIENT = 'Setting GAM project consent screen, creating client...\n'
|
||||||
CREATE_PROJECT_INSTRUCTIONS = '''
|
CREATE_CLIENT_INSTRUCTIONS = '''
|
||||||
Please go to:
|
Please go to:
|
||||||
|
|
||||||
{0}
|
{0}
|
||||||
|
|
||||||
1. Choose "Desktop App" or "Other" for "Application type".
|
1. If "+ CREATE CLIENT" is on the screen, skip to step 14
|
||||||
2. Enter "GAM" or another desired value for "Name".
|
2. Click "GET STARTED"
|
||||||
3. Click the blue "Create" button.
|
3. Under "App Information", enter {1} or another value in "App name *"
|
||||||
4. Copy your "Client ID" value that shows on the next page.
|
4. Under "App Information", enter {2} in "User support email *"
|
||||||
|
5. Click "NEXT"
|
||||||
|
6. Under "Audience", choose INTERNAL
|
||||||
|
7. Click "NEXT"
|
||||||
|
8. Under, "Contact Information", enter an email address in "Email addresses *"
|
||||||
|
9. Click "NEXT"
|
||||||
|
10. Under "Finish", click "I agree to the Google API Services: User Data Policy."
|
||||||
|
11. Click "CONTINUE"
|
||||||
|
12. Click "CREATE"
|
||||||
|
13. Click "Clients" in the left-hand column
|
||||||
|
14. Click "+ CREATE CLIENT"
|
||||||
|
15. Choose "Desktop App" for "Application type"
|
||||||
|
16. Enter {1} or another value in "Name *"
|
||||||
|
17. Click "Create"
|
||||||
|
18. Under "Name", click your client name
|
||||||
|
19. Copy the "Client ID" value under "Additional information"
|
||||||
|
20. Paste it at the "Enter your Client ID: " prompt in your terminal
|
||||||
|
21. Press return/enter in your terminal
|
||||||
|
22. Switch back to the browser
|
||||||
|
23. Copy the "Client secret" value under "Client Secrets"
|
||||||
|
24. Paste it at the "Enter your Client Secret: " prompt in your terminal
|
||||||
|
25. Press return/enter in your terminal
|
||||||
|
26. Switch back to the browser
|
||||||
|
27. Click "CANCEL"
|
||||||
|
28. These steps are complete
|
||||||
'''
|
'''
|
||||||
ENTER_YOUR_CLIENT_ID = '\nEnter your Client ID: '
|
ENTER_YOUR_CLIENT_ID = '\nEnter your Client ID: '
|
||||||
GO_BACK_TO_YOUR_BROWSER_AND_COPY_YOUR_CLIENT_SECRET_VALUE = '\n5. Go back to your browser and copy your "Client Secret" value.\n'
|
|
||||||
ENTER_YOUR_CLIENT_SECRET = '\nEnter your Client Secret: '
|
ENTER_YOUR_CLIENT_SECRET = '\nEnter your Client Secret: '
|
||||||
GO_BACK_TO_YOUR_BROWSER_AND_CLICK_OK_TO_CLOSE_THE_OAUTH_CLIENT_POPUP = '\n6. Go back to your browser and click OK to close the "OAuth client" popup if it\'s still open.\n'
|
|
||||||
IS_NOT_A_VALID_CLIENT_ID = '''
|
IS_NOT_A_VALID_CLIENT_ID = '''
|
||||||
|
|
||||||
{0}
|
{0}
|
||||||
@@ -78,12 +100,12 @@ Please go to:
|
|||||||
|
|
||||||
https://admin.google.com/ac/owl/list?tab=configuredApps
|
https://admin.google.com/ac/owl/list?tab=configuredApps
|
||||||
|
|
||||||
1. Click on: Configure new app > OAuth App Name Or Client ID.
|
1. Click on: Configure new app
|
||||||
2. Enter the following Client ID value:
|
2. Enter the following Client ID value in Search for app:
|
||||||
|
|
||||||
{1}
|
{1}
|
||||||
|
|
||||||
3. Press Search, select the {0} app, press Select, check the box and press Select.
|
3. Press Search, select the {0} app, click
|
||||||
4. Keep the default scope or select a preferred scope that includes your GAM admin.
|
4. Keep the default scope or select a preferred scope that includes your GAM admin.
|
||||||
5. Press Continue
|
5. Press Continue
|
||||||
6. Select Trusted radio button, press Continue and Finish.
|
6. Select Trusted radio button, press Continue and Finish.
|
||||||
@@ -162,7 +184,7 @@ ALREADY_EXISTS_USE_MERGE_ARGUMENT = 'Already exists; use the "merge" argument to
|
|||||||
API_ACCESS_DENIED = 'API access Denied'
|
API_ACCESS_DENIED = 'API access Denied'
|
||||||
API_CALLS_RETRY_DATA = 'API calls retry data\n'
|
API_CALLS_RETRY_DATA = 'API calls retry data\n'
|
||||||
API_CHECK_CLIENT_AUTHORIZATION = 'Please make sure the Client ID: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam oauth create\n'
|
API_CHECK_CLIENT_AUTHORIZATION = 'Please make sure the Client ID: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam oauth create\n'
|
||||||
API_CHECK_SVCACCT_AUTHORIZATION = 'Please make sure the Service Account Client name: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam user {2} update serviceaccount\n'
|
API_CHECK_SVCACCT_AUTHORIZATION = 'Please make sure the Service Account Client ID: {0} is authorized for the appropriate API or scopes:\n{1}\n\nRun: gam user {2} update serviceaccount\n'
|
||||||
API_ERROR_SETTINGS = 'API error, some settings not set'
|
API_ERROR_SETTINGS = 'API error, some settings not set'
|
||||||
ARE_BOTH_REQUIRED = 'Arguments {0} and {1} are both required'
|
ARE_BOTH_REQUIRED = 'Arguments {0} and {1} are both required'
|
||||||
ARE_MUTUALLY_EXCLUSIVE = 'Arguments {0} and {1} are mutually exclusive'
|
ARE_MUTUALLY_EXCLUSIVE = 'Arguments {0} and {1} are mutually exclusive'
|
||||||
@@ -459,6 +481,8 @@ SERVICE_NOT_APPLICABLE = 'Service not applicable/Does not exist'
|
|||||||
SERVICE_NOT_APPLICABLE_THIS_ADDRESS = 'Service not applicable for this address: {0}'
|
SERVICE_NOT_APPLICABLE_THIS_ADDRESS = 'Service not applicable for this address: {0}'
|
||||||
SERVICE_NOT_ENABLED = '{0} Service/App not enabled'
|
SERVICE_NOT_ENABLED = '{0} Service/App not enabled'
|
||||||
SHORTCUT_TARGET_CAPABILITY_IS_FALSE = '{0} capability {1} is False'
|
SHORTCUT_TARGET_CAPABILITY_IS_FALSE = '{0} capability {1} is False'
|
||||||
|
SITES_COMMAND_DEPRECATED = 'The Classic Sites API is deprecated, this command will not work:\n{0}'
|
||||||
|
SKU_HAS_NO_MATCHING_ARCHIVED_USER_SKU = 'SKU {0} has no matching Archived User SKU'
|
||||||
STARTING_THREAD = 'Starting thread'
|
STARTING_THREAD = 'Starting thread'
|
||||||
STATISTICS_COPY_FILE = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Copy Failed: {5}, Not copyable: {6}, In skipids: {7}, Permissions Failed: {8}, Protected Ranges Failed: {9}'
|
STATISTICS_COPY_FILE = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Copy Failed: {5}, Not copyable: {6}, In skipids: {7}, Permissions Failed: {8}, Protected Ranges Failed: {9}'
|
||||||
STATISTICS_COPY_FOLDER = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Merged: {5}, Copy Failed: {6}, Not writable: {7}, Permissions Failed: {8}'
|
STATISTICS_COPY_FOLDER = 'Total: {0}, Copied: {1}, Shortcut created {2}, Shortcut exists {3}, Duplicate: {4}, Merged: {5}, Copy Failed: {6}, Not writable: {7}, Permissions Failed: {8}'
|
||||||
|
|||||||
@@ -182,6 +182,8 @@ _SKUS = {
|
|||||||
'product': 'Google-Chrome-Device-Management', 'aliases': ['chrome', 'cdm', 'googlechromedevicemanagement'], 'displayName': 'Google Chrome Device Management'}
|
'product': 'Google-Chrome-Device-Management', 'aliases': ['chrome', 'cdm', 'googlechromedevicemanagement'], 'displayName': 'Google Chrome Device Management'}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ARCHIVABLE_SKUS = {'1010020020', '1010020025', '1010020026', '1010020027', '1010020028', 'Google-Apps-Unlimited'}
|
||||||
|
|
||||||
def getProductAndSKU(sku):
|
def getProductAndSKU(sku):
|
||||||
l_sku = sku.lower().replace('-', '').replace(' ', '').replace('"', '').replace("'", '').strip()
|
l_sku = sku.lower().replace('-', '').replace(' ', '').replace('"', '').replace("'", '').strip()
|
||||||
if l_sku.startswith('nv:'):
|
if l_sku.startswith('nv:'):
|
||||||
|
|||||||
@@ -1,283 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# Copyright 2009 Google Inc. All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
"""Data model classes for parsing and generating XML for the Sites Data API."""
|
|
||||||
|
|
||||||
import atom
|
|
||||||
import gdata
|
|
||||||
|
|
||||||
# XML Namespaces used in Google Sites entities.
|
|
||||||
SITES_NAMESPACE = 'http://schemas.google.com/sites/2008'
|
|
||||||
SITES_TEMPLATE = '{http://schemas.google.com/sites/2008}%s'
|
|
||||||
SPREADSHEETS_NAMESPACE = 'http://schemas.google.com/spreadsheets/2006'
|
|
||||||
SPREADSHEETS_TEMPLATE = '{http://schemas.google.com/spreadsheets/2006}%s'
|
|
||||||
GACL_NAMESPACE = 'http://schemas.google.com/acl/2007'
|
|
||||||
GACL_TEMPLATE = '{http://schemas.google.com/acl/2007}%s'
|
|
||||||
DC_TERMS_TEMPLATE = '{http://purl.org/dc/terms}%s'
|
|
||||||
THR_TERMS_TEMPLATE = '{http://purl.org/syndication/thread/1.0}%s'
|
|
||||||
XHTML_NAMESPACE = 'http://www.w3.org/1999/xhtml'
|
|
||||||
XHTML_TEMPLATE = '{http://www.w3.org/1999/xhtml}%s'
|
|
||||||
|
|
||||||
SITES_INVITE_LINK_REL = SITES_NAMESPACE + '#invite'
|
|
||||||
SITES_PARENT_LINK_REL = SITES_NAMESPACE + '#parent'
|
|
||||||
SITES_REVISION_LINK_REL = SITES_NAMESPACE + '#revision'
|
|
||||||
SITES_SOURCE_LINK_REL = SITES_NAMESPACE + '#source'
|
|
||||||
SITES_TEMPLATE_LINK_REL = SITES_NAMESPACE + '#template'
|
|
||||||
|
|
||||||
ALTERNATE_REL = 'alternate'
|
|
||||||
WEB_ADDRESS_MAPPING_REL = 'webAddressMapping'
|
|
||||||
|
|
||||||
SITES_KIND_SCHEME = 'http://schemas.google.com/g/2005#kind'
|
|
||||||
ANNOUNCEMENT_KIND_TERM = SITES_NAMESPACE + '#announcement'
|
|
||||||
ANNOUNCEMENT_PAGE_KIND_TERM = SITES_NAMESPACE + '#announcementspage'
|
|
||||||
ATTACHMENT_KIND_TERM = SITES_NAMESPACE + '#attachment'
|
|
||||||
COMMENT_KIND_TERM = SITES_NAMESPACE + '#comment'
|
|
||||||
FILECABINET_KIND_TERM = SITES_NAMESPACE + '#filecabinet'
|
|
||||||
LISTITEM_KIND_TERM = SITES_NAMESPACE + '#listitem'
|
|
||||||
LISTPAGE_KIND_TERM = SITES_NAMESPACE + '#listpage'
|
|
||||||
WEBPAGE_KIND_TERM = SITES_NAMESPACE + '#webpage'
|
|
||||||
WEBATTACHMENT_KIND_TERM = SITES_NAMESPACE + '#webattachment'
|
|
||||||
FOLDER_KIND_TERM = SITES_NAMESPACE + '#folder'
|
|
||||||
TAG_KIND_TERM = SITES_NAMESPACE + '#tag'
|
|
||||||
|
|
||||||
SUPPORT_KINDS = [
|
|
||||||
'announcement', 'announcementspage', 'attachment', 'comment', 'filecabinet',
|
|
||||||
'listitem', 'listpage', 'webpage', 'webattachment', 'tag'
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class GDataBase(atom.AtomBase):
|
|
||||||
"""The Google Sites intermediate class from atom.AtomBase."""
|
|
||||||
_namespace = gdata.GDATA_NAMESPACE
|
|
||||||
_children = atom.AtomBase._children.copy()
|
|
||||||
_attributes = atom.AtomBase._attributes.copy()
|
|
||||||
|
|
||||||
def __init__(self, text=None):
|
|
||||||
atom.AtomBase.__init__(self, text=text)
|
|
||||||
|
|
||||||
class SitesBase(GDataBase):
|
|
||||||
_namespace = SITES_NAMESPACE
|
|
||||||
|
|
||||||
class SiteName(SitesBase):
|
|
||||||
"""Google Sites <sites:siteName>."""
|
|
||||||
_tag = 'siteName'
|
|
||||||
|
|
||||||
class Theme(SitesBase):
|
|
||||||
"""Google Sites <sites:theme>."""
|
|
||||||
_tag = 'theme'
|
|
||||||
|
|
||||||
class SiteEntry(gdata.BatchEntry):
|
|
||||||
"""Google Sites Site Feed Entry."""
|
|
||||||
_tag = 'entry'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchEntry._children.copy()
|
|
||||||
|
|
||||||
_children['{%s}siteName' % SITES_NAMESPACE] = ('siteName', SiteName)
|
|
||||||
_children['{%s}theme' % SITES_NAMESPACE] = ('theme', Theme)
|
|
||||||
_attributes = gdata.BatchEntry._attributes.copy()
|
|
||||||
_attributes['{%s}etag' % gdata.GDATA_NAMESPACE] = 'etag'
|
|
||||||
|
|
||||||
def __init__(self, siteName=None, title=None, summary=None, theme=None, sourceSite=None, category=None, etag=None):
|
|
||||||
gdata.BatchEntry.__init__(self, category=category)
|
|
||||||
self.siteName = siteName
|
|
||||||
self.title = title
|
|
||||||
self.summary = summary
|
|
||||||
self.theme = theme
|
|
||||||
if sourceSite is not None:
|
|
||||||
sourceLink = atom.Link(href=sourceSite, rel=SITES_SOURCE_LINK_REL, link_type='application/atom+xml')
|
|
||||||
self.link.append(sourceLink)
|
|
||||||
self.etag = etag
|
|
||||||
|
|
||||||
def find_alternate_link(self):
|
|
||||||
for link in self.link:
|
|
||||||
if link.rel == ALTERNATE_REL and link.href:
|
|
||||||
return link.href
|
|
||||||
return None
|
|
||||||
|
|
||||||
FindAlternateLink = find_alternate_link
|
|
||||||
|
|
||||||
def find_source_link(self):
|
|
||||||
for link in self.link:
|
|
||||||
if link.rel == SITES_SOURCE_LINK_REL and link.href:
|
|
||||||
return link.href
|
|
||||||
return None
|
|
||||||
|
|
||||||
FindSourceLink = find_source_link
|
|
||||||
|
|
||||||
def find_webaddress_mappings(self):
|
|
||||||
mappingLinks = []
|
|
||||||
for link in self.link:
|
|
||||||
if link.rel == WEB_ADDRESS_MAPPING_REL and link.href:
|
|
||||||
mappingLinks.append(link.href)
|
|
||||||
return mappingLinks
|
|
||||||
|
|
||||||
FindWebAddressMappings = find_webaddress_mappings
|
|
||||||
|
|
||||||
def SiteEntryFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(SiteEntry, xml_string)
|
|
||||||
|
|
||||||
class SiteFeed(gdata.BatchFeed, gdata.LinkFinder):
|
|
||||||
"""A Google Sites feed flavor of an Atom Feed."""
|
|
||||||
_tag = 'feed'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchFeed._children.copy()
|
|
||||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [SiteEntry])
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
gdata.BatchFeed.__init__(self)
|
|
||||||
|
|
||||||
def SiteFeedFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(SiteFeed, xml_string)
|
|
||||||
|
|
||||||
class AclBase(GDataBase):
|
|
||||||
_namespace = GACL_NAMESPACE
|
|
||||||
|
|
||||||
class AclRole(AclBase):
|
|
||||||
"""Describes the role of an entry in an access control list."""
|
|
||||||
_tag = 'role'
|
|
||||||
_children = AclBase._children.copy()
|
|
||||||
_attributes = AclBase._attributes.copy()
|
|
||||||
_attributes['value'] = 'value'
|
|
||||||
|
|
||||||
def __init__(self, value=None):
|
|
||||||
AclBase.__init__(self)
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
class AclAdditionalRole(AclBase):
|
|
||||||
"""Describes an additionalRole element."""
|
|
||||||
_tag = 'additionalRole'
|
|
||||||
_children = AclBase._children.copy()
|
|
||||||
_attributes = AclBase._attributes.copy()
|
|
||||||
_attributes['value'] = 'value'
|
|
||||||
|
|
||||||
def __init__(self, value=None):
|
|
||||||
AclBase.__init__(self)
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
class AclScope(AclBase):
|
|
||||||
"""Describes the scope of an entry in an access control list."""
|
|
||||||
_tag = 'scope'
|
|
||||||
_children = AclBase._children.copy()
|
|
||||||
_attributes = AclBase._attributes.copy()
|
|
||||||
_attributes['type'] = 'type'
|
|
||||||
_attributes['value'] = 'value'
|
|
||||||
|
|
||||||
def __init__(self, stype=None, value=None):
|
|
||||||
AclBase.__init__(self)
|
|
||||||
self.type = stype
|
|
||||||
self.value = value
|
|
||||||
|
|
||||||
|
|
||||||
class AclWithKey(AclBase):
|
|
||||||
"""Describes a key that can be used to access a document."""
|
|
||||||
_tag = 'withKey'
|
|
||||||
_children = AclBase._children.copy()
|
|
||||||
_children['{%s}role' % GACL_NAMESPACE] = ('role', AclRole)
|
|
||||||
_children['{%s}additionalRole' % GACL_NAMESPACE] = ('additionalRole', AclAdditionalRole)
|
|
||||||
_attributes = AclBase._attributes.copy()
|
|
||||||
_attributes['key'] = 'key'
|
|
||||||
|
|
||||||
def __init__(self, key=None, role=None, additionalRole=None):
|
|
||||||
AclBase.__init__(self)
|
|
||||||
self.key = key
|
|
||||||
self.role = role
|
|
||||||
self.additionalRole = additionalRole
|
|
||||||
|
|
||||||
class AclEntry(gdata.BatchEntry):
|
|
||||||
"""Describes an entry in a feed of an access control list (ACL)."""
|
|
||||||
_tag = 'entry'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchEntry._children.copy()
|
|
||||||
|
|
||||||
_children['{%s}role' % GACL_NAMESPACE] = ('role', AclRole)
|
|
||||||
_children['{%s}additionalRole' % GACL_NAMESPACE] = ('additionalRole', AclAdditionalRole)
|
|
||||||
_children['{%s}scope' % GACL_NAMESPACE] = ('scope', AclScope)
|
|
||||||
_children['{%s}withKey' % GACL_NAMESPACE] = ('withKey', AclWithKey)
|
|
||||||
_attributes = gdata.BatchEntry._attributes.copy()
|
|
||||||
_attributes['{%s}etag' % gdata.GDATA_NAMESPACE] = 'etag'
|
|
||||||
|
|
||||||
def __init__(self, role=None, additionalRole=None, scope=None, withKey=None, etag=None):
|
|
||||||
gdata.BatchEntry.__init__(self)
|
|
||||||
self.role = role
|
|
||||||
self.additionalRole = additionalRole
|
|
||||||
self.scope = scope
|
|
||||||
self.withKey = withKey
|
|
||||||
self.etag = etag
|
|
||||||
|
|
||||||
def find_invite_link(self):
|
|
||||||
for link in self.link:
|
|
||||||
if link.rel == SITES_INVITE_LINK_REL and link.href:
|
|
||||||
return link.href
|
|
||||||
return None
|
|
||||||
|
|
||||||
FindInviteLink = find_invite_link
|
|
||||||
|
|
||||||
def AclEntryFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(AclEntry, xml_string)
|
|
||||||
|
|
||||||
class AclFeed(gdata.BatchFeed, gdata.LinkFinder):
|
|
||||||
"""Describes a feed of an access control list (ACL)."""
|
|
||||||
_tag = 'feed'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchFeed._children.copy()
|
|
||||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [AclEntry])
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
gdata.BatchFeed.__init__(self)
|
|
||||||
|
|
||||||
def AclFeedFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(AclFeed, xml_string)
|
|
||||||
|
|
||||||
class ActivityEntry(gdata.BatchEntry):
|
|
||||||
"""Describes an entry in a feed of site activity (changes)."""
|
|
||||||
_tag = 'entry'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchEntry._children.copy()
|
|
||||||
_attributes = gdata.BatchEntry._attributes.copy()
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
gdata.BatchEntry.__init__(self)
|
|
||||||
|
|
||||||
def __find_category_scheme(self, scheme):
|
|
||||||
for category in self.category:
|
|
||||||
if category.scheme == scheme:
|
|
||||||
return category
|
|
||||||
return None
|
|
||||||
|
|
||||||
def kind(self):
|
|
||||||
kind = self.__find_category_scheme(SITES_KIND_SCHEME)
|
|
||||||
if kind is not None:
|
|
||||||
return kind.term[len(SITES_NAMESPACE) + 1:]
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
Kind = kind
|
|
||||||
|
|
||||||
def ActivityEntryFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(ActivityEntry, xml_string)
|
|
||||||
|
|
||||||
class ActivityFeed(gdata.BatchFeed, gdata.LinkFinder):
|
|
||||||
"""Describes a feed of site activity (changes)."""
|
|
||||||
_tag = 'feed'
|
|
||||||
_namespace = atom.ATOM_NAMESPACE
|
|
||||||
_children = gdata.BatchFeed._children.copy()
|
|
||||||
_children['{%s}entry' % atom.ATOM_NAMESPACE] = ('entry', [ActivityEntry])
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
gdata.BatchFeed.__init__(self)
|
|
||||||
|
|
||||||
def ActivityFeedFromString(xml_string):
|
|
||||||
return atom.CreateClassFromXMLString(ActivityFeed, xml_string)
|
|
||||||
@@ -1,246 +0,0 @@
|
|||||||
#!/usr/bin/python
|
|
||||||
#
|
|
||||||
# Copyright 2009 Google Inc. All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
"""SitesService extends the GDataService for Google Sites API calls."""
|
|
||||||
|
|
||||||
import gdata.apps
|
|
||||||
import gdata.apps.service
|
|
||||||
import gdata.service
|
|
||||||
|
|
||||||
|
|
||||||
# Feed URI templates
|
|
||||||
CONTENT_FEED_TEMPLATE = '/feeds/content/%s/%s/'
|
|
||||||
REVISION_FEED_TEMPLATE = '/feeds/revision/%s/%s/'
|
|
||||||
ACTIVITY_FEED_TEMPLATE = '/feeds/activity/%s/%s/'
|
|
||||||
ACTIVITY_ENTRY_TEMPLATE = '/feeds/activity/%s/%s/%s'
|
|
||||||
SITE_FEED_TEMPLATE = '/feeds/site/%s/'
|
|
||||||
ACL_FEED_TEMPLATE = '/feeds/acl/site/%s/%s'
|
|
||||||
ACL_ENTRY_TEMPLATE = '/feeds/acl/site/%s/%s/%s'
|
|
||||||
|
|
||||||
|
|
||||||
class SitesService(gdata.service.GDataService):
|
|
||||||
"""Client extension for the Google Sites API service."""
|
|
||||||
|
|
||||||
def __init__(self,
|
|
||||||
source=None, server='sites.google.com', additional_headers=None,
|
|
||||||
**kwargs):
|
|
||||||
"""Constructs a new client for the Sites API.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
site: string (optional) Name (webspace) of the Google Site
|
|
||||||
domain: string (optional) Domain of the (Google Apps hosted) Site.
|
|
||||||
If no domain is given, the Site is assumed to be a consumer Google
|
|
||||||
Site, in which case the value 'site' is used.
|
|
||||||
source: string (optional) The name of the user's application.
|
|
||||||
server: string (optional) The name of the server to which a connection
|
|
||||||
will be opened. Default value: 'sites..google.com'.
|
|
||||||
**kwargs: The other parameters to pass to gdata.service.GDataService
|
|
||||||
constructor.
|
|
||||||
"""
|
|
||||||
if additional_headers == None:
|
|
||||||
additional_headers = {}
|
|
||||||
additional_headers['GData-Version'] = '1.4'
|
|
||||||
gdata.service.GDataService.__init__(self,
|
|
||||||
source=source, server=server, additional_headers=additional_headers,
|
|
||||||
**kwargs)
|
|
||||||
self.ssl = True
|
|
||||||
self.port = 443
|
|
||||||
|
|
||||||
def make_site_feed_uri(self, domain=None, site=None):
|
|
||||||
if not domain:
|
|
||||||
domain = 'site'
|
|
||||||
if not site:
|
|
||||||
return SITE_FEED_TEMPLATE % domain
|
|
||||||
return (SITE_FEED_TEMPLATE % domain) + site
|
|
||||||
|
|
||||||
MakeSiteFeedUri = make_site_feed_uri
|
|
||||||
|
|
||||||
def get_site_feed(self, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_site_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.SiteFeedFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetSiteFeed = get_site_feed
|
|
||||||
|
|
||||||
def create_site(self, siteentry=None, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
if uri is None:
|
|
||||||
uri = self.make_site_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Post(siteentry, uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.SiteEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
CreateSite = create_site
|
|
||||||
|
|
||||||
def get_site(self, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_site_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.SiteEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetSite = get_site
|
|
||||||
|
|
||||||
def update_site(self, siteentry=None, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_site_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Put(siteentry, uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.SiteEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
UpdateSite = update_site
|
|
||||||
|
|
||||||
def make_acl_feed_uri(self, domain=None, site=None):
|
|
||||||
return ACL_FEED_TEMPLATE % (domain, site)
|
|
||||||
|
|
||||||
MakeAclFeedUri = make_acl_feed_uri
|
|
||||||
|
|
||||||
def get_acl_feed(self, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_acl_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.AclFeedFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetAclFeed = get_acl_feed
|
|
||||||
|
|
||||||
def make_acl_entry_uri(self, domain=None, site=None, ruleId=None):
|
|
||||||
return ACL_ENTRY_TEMPLATE % (domain, site, ruleId)
|
|
||||||
|
|
||||||
MakeAclEntryUri = make_acl_entry_uri
|
|
||||||
|
|
||||||
def create_acl_entry(self, aclentry=None, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_acl_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Post(aclentry, uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.AclEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
CreateAclEntry = create_acl_entry
|
|
||||||
|
|
||||||
def get_acl_entry(self, uri=None, domain=None, site=None, ruleId=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_acl_entry_uri(domain=domain, site=site, ruleId=ruleId)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.AclEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetAclEntry = get_acl_entry
|
|
||||||
|
|
||||||
def update_acl_entry(self, aclentry=None, uri=None, domain=None, site=None, ruleId=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_acl_entry_uri(domain=domain, site=site, ruleId=ruleId)
|
|
||||||
try:
|
|
||||||
return self.Put(aclentry, uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.AclEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
UpdateAclEntry = update_acl_entry
|
|
||||||
|
|
||||||
def delete_acl_entry(self, uri=None, domain=None, site=None, ruleId=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_acl_entry_uri(domain=domain, site=site, ruleId=ruleId)
|
|
||||||
try:
|
|
||||||
return self.Delete(uri,
|
|
||||||
url_params=url_params, escape_params=escape_params, extra_headers=extra_headers)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
DeleteAclEntry = delete_acl_entry
|
|
||||||
|
|
||||||
def make_activity_feed_uri(self, domain=None, site=None):
|
|
||||||
return ACTIVITY_FEED_TEMPLATE % (domain, site)
|
|
||||||
|
|
||||||
MakeActivityFeedUri = make_activity_feed_uri
|
|
||||||
|
|
||||||
def get_activity_feed(self, uri=None, domain=None, site=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_activity_feed_uri(domain=domain, site=site)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.ActivityFeedFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetActivityFeed = get_activity_feed
|
|
||||||
|
|
||||||
def make_activity_entry_uri(self, domain=None, site=None, activityId=None):
|
|
||||||
return ACTIVITY_ENTRY_TEMPLATE % (domain, site, activityId)
|
|
||||||
|
|
||||||
MakeActivityEntryUri = make_activity_entry_uri
|
|
||||||
|
|
||||||
def get_activity_entry(self, uri=None, domain=None, site=None, activityId=None,
|
|
||||||
extra_headers=None, url_params=None, escape_params=True):
|
|
||||||
|
|
||||||
uri = uri or self.make_activity_entry_uri(domain=domain, site=site, activityId=activityId)
|
|
||||||
try:
|
|
||||||
return self.Get(uri,
|
|
||||||
url_params=url_params, extra_headers=extra_headers, escape_params=escape_params,
|
|
||||||
converter=gdata.apps.sites.ActivityEntryFromString)
|
|
||||||
except gdata.service.RequestError as e:
|
|
||||||
raise gdata.apps.service.AppsForYourDomainException(e.args[0])
|
|
||||||
|
|
||||||
GetActivityEntry = get_activity_entry
|
|
||||||
|
|
||||||
class SitesQuery(gdata.service.Query):
|
|
||||||
|
|
||||||
def make_site_feed_uri(self, domain=None, site=None):
|
|
||||||
if not domain:
|
|
||||||
domain = 'site'
|
|
||||||
if not site:
|
|
||||||
return SITE_FEED_TEMPLATE % domain
|
|
||||||
return (SITE_FEED_TEMPLATE % domain) + site
|
|
||||||
|
|
||||||
def __init__(self, feed=None, domain=None, site=None, params=None):
|
|
||||||
self.feed = feed or self.make_site_feed_uri(domain=domain, site=site)
|
|
||||||
gdata.service.Query.__init__(self, feed=self.feed, params=params)
|
|
||||||
|
|
||||||
@@ -12,4 +12,4 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
__version__ = "2.146.0"
|
__version__ = "2.156.0"
|
||||||
|
|||||||
1152
src/gam/meet-v2beta.json
Normal file
1152
src/gam/meet-v2beta.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -11,4 +11,4 @@ lxml
|
|||||||
passlib>=1.7.2
|
passlib>=1.7.2
|
||||||
pathvalidate
|
pathvalidate
|
||||||
python-dateutil
|
python-dateutil
|
||||||
yubikey-manager>=5.0
|
yubikey-manager[yubikey]>=5.0
|
||||||
|
|||||||
Reference in New Issue
Block a user