mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-29 10:21:35 +00:00
Compare commits
655 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a87ff9effc | ||
|
|
df793c2bbb | ||
|
|
3bc32da275 | ||
|
|
ce7e506c29 | ||
|
|
a9d8ac27d3 | ||
|
|
58912ae7ac | ||
|
|
f882439cbd | ||
|
|
56bc52aa28 | ||
|
|
416125abac | ||
|
|
904292ded3 | ||
|
|
5f55bcc812 | ||
|
|
b35de53f5d | ||
|
|
3c34948678 | ||
|
|
0be73db60b | ||
|
|
5b57b51384 | ||
|
|
139896ec3b | ||
|
|
9b52c0bf18 | ||
|
|
b9c9b59f7b | ||
|
|
0e0877e084 | ||
|
|
bdce13e97b | ||
|
|
9c4a17e12c | ||
|
|
a64f4d4a46 | ||
|
|
c396a3b901 | ||
|
|
78453a15af | ||
|
|
a0282ba775 | ||
|
|
7b708bfeea | ||
|
|
fedb49ca9d | ||
|
|
87b4917fb0 | ||
|
|
5a9486c08a | ||
|
|
e7074cb0bc | ||
|
|
f894e5ffd7 | ||
|
|
5d1379e830 | ||
|
|
aa1b373245 | ||
|
|
1bed2383ff | ||
|
|
332d6c0761 | ||
|
|
597bbe2db9 | ||
|
|
fcb50e1e93 | ||
|
|
048d88c7a0 | ||
|
|
bd4208607b | ||
|
|
7b510075e6 | ||
|
|
882d7b5833 | ||
|
|
d4f5495909 | ||
|
|
b132e789f7 | ||
|
|
701824d984 | ||
|
|
4c63de65a5 | ||
|
|
d1d1040ec3 | ||
|
|
fe4268230e | ||
|
|
bda51867c8 | ||
|
|
a913c8f128 | ||
|
|
89ac556933 | ||
|
|
48c23c2f98 | ||
|
|
3f2a261a99 | ||
|
|
beb76c5879 | ||
|
|
bd22dc1b8b | ||
|
|
2258cd69a5 | ||
|
|
a523f9c0f7 | ||
|
|
ea41cf52de | ||
|
|
aec92f19ae | ||
|
|
df99e6ea8e | ||
|
|
d16166ffac | ||
|
|
1bd75c31ae | ||
|
|
8830da9908 | ||
|
|
fdc6c34c91 | ||
|
|
c6be86946e | ||
|
|
920c9a344a | ||
|
|
ec9f3b9e79 | ||
|
|
326e83a05d | ||
|
|
61c2b06021 | ||
|
|
60093404c1 | ||
|
|
228d3bba95 | ||
|
|
9f5dfc1a0a | ||
|
|
2b5c4561d1 | ||
|
|
4bdce171af | ||
|
|
1f68c8db00 | ||
|
|
963cbebba0 | ||
|
|
c0edbfe596 | ||
|
|
47617c2823 | ||
|
|
11e0f1c760 | ||
|
|
6c4b481eb1 | ||
|
|
c0cbddc93d | ||
|
|
b50d92404f | ||
|
|
19408f8f4c | ||
|
|
0dd8e099c5 | ||
|
|
5738cf5435 | ||
|
|
0739bdc642 | ||
|
|
ddd1924c2c | ||
|
|
a6fb1d7c0f | ||
|
|
6aeed76e70 | ||
|
|
83f94c8122 | ||
|
|
056f23c6cb | ||
|
|
7b1619f95d | ||
|
|
fe4ea3fe41 | ||
|
|
f5edd6bf81 | ||
|
|
7340557a8c | ||
|
|
66ec9d0d4b | ||
|
|
cc6ccd1338 | ||
|
|
25c167ee0a | ||
|
|
f620850a58 | ||
|
|
73ad3cc3e5 | ||
|
|
b03083cb09 | ||
|
|
6642e23e81 | ||
|
|
a237272440 | ||
|
|
d3ac277523 | ||
|
|
e21ff2bec2 | ||
|
|
369df07748 | ||
|
|
b218abaae7 | ||
|
|
967898fa86 | ||
|
|
80570f2fda | ||
|
|
6437547e33 | ||
|
|
f87f000be2 | ||
|
|
08f6f86d10 | ||
|
|
e70bfca92a | ||
|
|
2be5d40f44 | ||
|
|
170e188f1f | ||
|
|
60d6188769 | ||
|
|
626eb1eadc | ||
|
|
db40ada5d0 | ||
|
|
ba8c27339e | ||
|
|
822488dce5 | ||
|
|
bbd76ec23f | ||
|
|
e2a6f8badf | ||
|
|
2462aa7dcb | ||
|
|
d7a0da6e52 | ||
|
|
9922ed4994 | ||
|
|
3a0c52d8eb | ||
|
|
f3e7c46561 | ||
|
|
b42c916516 | ||
|
|
4fd7172f7a | ||
|
|
e670cf3e6a | ||
|
|
e305cc0789 | ||
|
|
d7b9d43c63 | ||
|
|
75e3ae8144 | ||
|
|
130a483e4d | ||
|
|
cbd04bcec4 | ||
|
|
a51b245015 | ||
|
|
64356a9736 | ||
|
|
c18375abb7 | ||
|
|
c9c0cac57e | ||
|
|
8ca3717f97 | ||
|
|
cd0d82e994 | ||
|
|
f29f27577c | ||
|
|
cb5e5d1943 | ||
|
|
88bdfd2883 | ||
|
|
e875acf428 | ||
|
|
5d213e9951 | ||
|
|
35d61da0a0 | ||
|
|
da04ead86d | ||
|
|
5526c987ea | ||
|
|
d9795b3f83 | ||
|
|
39a17bacb1 | ||
|
|
af94ea6e54 | ||
|
|
c220f41cbe | ||
|
|
8a32e53652 | ||
|
|
372f86a79a | ||
|
|
7f307254bf | ||
|
|
2ae7b4a4b5 | ||
|
|
6dde273ee9 | ||
|
|
b66f6f60fe | ||
|
|
01fcefc647 | ||
|
|
a59e3008c5 | ||
|
|
eb82da4ff2 | ||
|
|
c4aa399446 | ||
|
|
f1713ec685 | ||
|
|
74924c9c0e | ||
|
|
8d3b65f5f1 | ||
|
|
260f2d3f5c | ||
|
|
475275add7 | ||
|
|
d71832096a | ||
|
|
f12d3abfc1 | ||
|
|
474aa069b7 | ||
|
|
c49708cbae | ||
|
|
43ecba07bb | ||
|
|
51f8ebe8e2 | ||
|
|
28edce3aca | ||
|
|
fe1f0285f8 | ||
|
|
da83121d0d | ||
|
|
f58a69e374 | ||
|
|
2f40a164c5 | ||
|
|
58a3fa7313 | ||
|
|
39ce5b7349 | ||
|
|
860d44d819 | ||
|
|
5e90ff143e | ||
|
|
28e05bf09a | ||
|
|
0781e27993 | ||
|
|
a441dddc06 | ||
|
|
4a42581e00 | ||
|
|
de2bfb0d52 | ||
|
|
f418287e65 | ||
|
|
fccf6c1278 | ||
|
|
ee874858b4 | ||
|
|
dde1354bd0 | ||
|
|
c241c2744f | ||
|
|
5ee1fa1b61 | ||
|
|
f06944a1fa | ||
|
|
27d4c37be3 | ||
|
|
2f1a7eb347 | ||
|
|
a5818e144d | ||
|
|
4e6f1717fb | ||
|
|
9d347719c7 | ||
|
|
7235022a8e | ||
|
|
5db5dad576 | ||
|
|
72a6651a9f | ||
|
|
47f6dfc730 | ||
|
|
9e6c6138f8 | ||
|
|
c4ec856a58 | ||
|
|
2a32f6d2e4 | ||
|
|
afc6af68a4 | ||
|
|
80ec0a739b | ||
|
|
7a08fb0518 | ||
|
|
3006d8dfe4 | ||
|
|
f9ed16e2e3 | ||
|
|
9999adfb3a | ||
|
|
f09a1e1bd6 | ||
|
|
a95da4e2ea | ||
|
|
fce8704f87 | ||
|
|
4d3b72900b | ||
|
|
fd81d56675 | ||
|
|
762d8479a4 | ||
|
|
6f19ec4f8c | ||
|
|
8af3bc60e6 | ||
|
|
e636a69431 | ||
|
|
673460e91d | ||
|
|
9862ad446f | ||
|
|
67f21ce650 | ||
|
|
e82baccbac | ||
|
|
c51b06a6c3 | ||
|
|
b7415cd63f | ||
|
|
f0f5803698 | ||
|
|
575fdea526 | ||
|
|
f8ee94bad8 | ||
|
|
4b6c8fb518 | ||
|
|
4f8c80dcab | ||
|
|
12f5c5e670 | ||
|
|
a1216b6782 | ||
|
|
05f4795bc3 | ||
|
|
e1ff1ba378 | ||
|
|
5b2804643e | ||
|
|
3925166987 | ||
|
|
5dece6c719 | ||
|
|
b48d316bd9 | ||
|
|
1f2b33b805 | ||
|
|
a6773901c9 | ||
|
|
840784fa98 | ||
|
|
aecb17b9fe | ||
|
|
2d90c75f03 | ||
|
|
cd8691b438 | ||
|
|
e2f0afe891 | ||
|
|
65cd2439d5 | ||
|
|
652ab1dc6d | ||
|
|
88cad201a5 | ||
|
|
9f8100dfbf | ||
|
|
7fbafb2ba0 | ||
|
|
2c631af66c | ||
|
|
3b900ca56f | ||
|
|
4a1e19a753 | ||
|
|
4a0e61a385 | ||
|
|
10b874e2aa | ||
|
|
4c3821766d | ||
|
|
5225a36cbd | ||
|
|
ee64202233 | ||
|
|
25add7034a | ||
|
|
ba042229a8 | ||
|
|
6233bd8d9c | ||
|
|
c7a6ab536f | ||
|
|
39181a4329 | ||
|
|
2d9cb44d47 | ||
|
|
ad17eb5e77 | ||
|
|
3a90f0d92d | ||
|
|
0c360b0e9c | ||
|
|
e572126c76 | ||
|
|
06f1d8d246 | ||
|
|
4b83d13e74 | ||
|
|
b57b10b536 | ||
|
|
b7bd74c6d7 | ||
|
|
3a307cae80 | ||
|
|
d571207cce | ||
|
|
9a79834a12 | ||
|
|
d2f048a773 | ||
|
|
db74a6e22a | ||
|
|
e147ebb253 | ||
|
|
5674c58b81 | ||
|
|
74b62c5cb9 | ||
|
|
1375bde65b | ||
|
|
936406b1b0 | ||
|
|
b39a0efd83 | ||
|
|
bcd327a7f4 | ||
|
|
81ae789acc | ||
|
|
b6ac91b97d | ||
|
|
e05b2a3843 | ||
|
|
d8e69ff50d | ||
|
|
c29f379386 | ||
|
|
f8743e1b7f | ||
|
|
24db5cc886 | ||
|
|
e95fcbaa38 | ||
|
|
a7b31550f3 | ||
|
|
ed19f877a5 | ||
|
|
0ab08c968e | ||
|
|
02a7a1a106 | ||
|
|
170a2e593b | ||
|
|
8339b92537 | ||
|
|
ce16aa252e | ||
|
|
8a70470281 | ||
|
|
981301a878 | ||
|
|
13cfb77811 | ||
|
|
458e08645d | ||
|
|
98d4d3c06f | ||
|
|
2204c35193 | ||
|
|
87827badb8 | ||
|
|
319bedd338 | ||
|
|
b3e4541b9d | ||
|
|
9d17ea2d68 | ||
|
|
9c4b348909 | ||
|
|
a8fafd0dcc | ||
|
|
ac31042576 | ||
|
|
a0d695c57d | ||
|
|
bf742ec88a | ||
|
|
f2206d02e4 | ||
|
|
c3add48f2a | ||
|
|
119047bf2b | ||
|
|
662b7d857c | ||
|
|
3bb9724e50 | ||
|
|
b450716c23 | ||
|
|
73333f921d | ||
|
|
c5d194489f | ||
|
|
4d38b20cec | ||
|
|
f401e96dd4 | ||
|
|
5700c6bc31 | ||
|
|
164b999802 | ||
|
|
f60750a647 | ||
|
|
6d7913f6cf | ||
|
|
f050017771 | ||
|
|
f53c8086e8 | ||
|
|
7bf5d8879b | ||
|
|
c52ee7887d | ||
|
|
677de0867b | ||
|
|
58b17dd1d8 | ||
|
|
41b1ce50da | ||
|
|
613aff99e2 | ||
|
|
0f0eaa40b8 | ||
|
|
c7f9303f58 | ||
|
|
430d23b17b | ||
|
|
9eb5743283 | ||
|
|
7f72dad9b8 | ||
|
|
c866d2f4ab | ||
|
|
9e8c110f08 | ||
|
|
d261bcef40 | ||
|
|
38e96397a1 | ||
|
|
c9ca0a472c | ||
|
|
aa3a0330d1 | ||
|
|
cda74bd758 | ||
|
|
6b5e19b1de | ||
|
|
7cfa8836f8 | ||
|
|
c7ae9cdd6a | ||
|
|
126320e2fb | ||
|
|
46008d4155 | ||
|
|
34a3893676 | ||
|
|
16862a19a3 | ||
|
|
fb8442a5e3 | ||
|
|
d2b7e339ff | ||
|
|
742a6f14fe | ||
|
|
b33c9bc213 | ||
|
|
0af09f7517 | ||
|
|
6113acce66 | ||
|
|
97578029d5 | ||
|
|
f846c81c01 | ||
|
|
13cc34fde6 | ||
|
|
7f90a1a950 | ||
|
|
1b234d5aa7 | ||
|
|
32dc4c9de4 | ||
|
|
a150288a6f | ||
|
|
df053c36a6 | ||
|
|
0d01850356 | ||
|
|
6e9a68627b | ||
|
|
904f743f39 | ||
|
|
64c194e4d0 | ||
|
|
98c7ea08f8 | ||
|
|
a55f065cfb | ||
|
|
8eed07cb2e | ||
|
|
01af866c7b | ||
|
|
614ebd11c5 | ||
|
|
da1266e7cc | ||
|
|
06a6fff029 | ||
|
|
6da2b14111 | ||
|
|
0a89e82f2d | ||
|
|
33051d10c4 | ||
|
|
0652a91f89 | ||
|
|
fed4caeac0 | ||
|
|
f82ced5ade | ||
|
|
56e9027f38 | ||
|
|
73dbec522f | ||
|
|
cc01655b33 | ||
|
|
ac52f936d8 | ||
|
|
b851758baa | ||
|
|
72acbea40f | ||
|
|
2608e9f4c4 | ||
|
|
5ee887e516 | ||
|
|
e5948d416b | ||
|
|
8ff87db537 | ||
|
|
bca1154edd | ||
|
|
dc9104979b | ||
|
|
69dc53260c | ||
|
|
cae1b95485 | ||
|
|
735c25fd2a | ||
|
|
41a6d55c05 | ||
|
|
2aabba68d4 | ||
|
|
4b9292212c | ||
|
|
f156c94690 | ||
|
|
59a7460641 | ||
|
|
9a91ad3f7a | ||
|
|
0345c3d3ac | ||
|
|
d6f17746c8 | ||
|
|
f66220ac75 | ||
|
|
7b97b18115 | ||
|
|
abb02f10dc | ||
|
|
96b163cada | ||
|
|
c4d87f5293 | ||
|
|
3d104152a4 | ||
|
|
fe0ba91d20 | ||
|
|
d5ecf97464 | ||
|
|
a074fef5e6 | ||
|
|
e56574bb67 | ||
|
|
cd9bdb3311 | ||
|
|
b6e5ccd393 | ||
|
|
a4b0ef52be | ||
|
|
5c75c8e8c8 | ||
|
|
1556e736db | ||
|
|
c6b6910aa3 | ||
|
|
cc0e3ef9b1 | ||
|
|
0fedac03c8 | ||
|
|
117eec1cfd | ||
|
|
c460c48289 | ||
|
|
57f6a8745b | ||
|
|
2bf9c7b0d4 | ||
|
|
cbd368e3a6 | ||
|
|
45db6b5989 | ||
|
|
f1d2223517 | ||
|
|
0a3e00df80 | ||
|
|
c81121df58 | ||
|
|
defac7d9a8 | ||
|
|
d308ad1271 | ||
|
|
09be8b08f7 | ||
|
|
10a91091f2 | ||
|
|
16cef20094 | ||
|
|
e588c8851a | ||
|
|
d14cd1ad56 | ||
|
|
0e82964068 | ||
|
|
6394207c2f | ||
|
|
f12b367019 | ||
|
|
9b130ac8bf | ||
|
|
f35bde4f8b | ||
|
|
9ffabc15ff | ||
|
|
212460b636 | ||
|
|
be0dcbc8d4 | ||
|
|
b9ca2ba9a1 | ||
|
|
c4dea95f08 | ||
|
|
7b59b648c7 | ||
|
|
d791a864fa | ||
|
|
b3867fba5b | ||
|
|
e53f440ed2 | ||
|
|
51793f443d | ||
|
|
03daa83d3c | ||
|
|
f2ff6d8bf7 | ||
|
|
3d196b15c8 | ||
|
|
09e3f66563 | ||
|
|
fb0687d3ff | ||
|
|
f639de870b | ||
|
|
81a1855f01 | ||
|
|
d9f8c644fe | ||
|
|
0a755335da | ||
|
|
d4200b66dc | ||
|
|
2afc28e017 | ||
|
|
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 | ||
|
|
65c2a7f3b8 | ||
|
|
74b18457d4 | ||
|
|
82ac454080 | ||
|
|
111471a5ad | ||
|
|
2bc1429ee2 | ||
|
|
25fdd76af0 | ||
|
|
ff3f31cf9e | ||
|
|
0b303ffc30 | ||
|
|
4c78c5fe9f | ||
|
|
17b97d2fb1 | ||
|
|
2193d34f76 | ||
|
|
b1c212e9f6 | ||
|
|
da58ae62a8 | ||
|
|
84d04141b3 | ||
|
|
f29c697455 | ||
|
|
a1238c6397 | ||
|
|
4dfdc3a717 | ||
|
|
7e97f68013 | ||
|
|
48ef2450fd | ||
|
|
ec769703d6 | ||
|
|
e2984ca10b | ||
|
|
7400bfab70 | ||
|
|
1870b25b0b | ||
|
|
8f7eeae4a7 | ||
|
|
f2e16c52cb | ||
|
|
759f0cfb69 | ||
|
|
e1941cb220 | ||
|
|
1af1f10974 | ||
|
|
0e3d82b718 | ||
|
|
74417bbe24 | ||
|
|
3ed60c95c2 | ||
|
|
f859d5eb26 | ||
|
|
f9848c78dc | ||
|
|
60a4014d09 | ||
|
|
2884904d19 | ||
|
|
6fe196bd97 | ||
|
|
e2bbb95591 | ||
|
|
8568b24db2 | ||
|
|
d8f10dc72a | ||
|
|
98ef879a34 | ||
|
|
95b3a97925 | ||
|
|
f24629602c | ||
|
|
e5125b6853 | ||
|
|
31e8ac11a2 | ||
|
|
a9c4c006b2 | ||
|
|
378c763aa3 | ||
|
|
e46c837416 | ||
|
|
a478d45258 | ||
|
|
5476c4d14f | ||
|
|
2759d59cbf | ||
|
|
d2213709f0 | ||
|
|
d2840b95d5 | ||
|
|
49cdad014b | ||
|
|
532271130c | ||
|
|
628ef4aeff | ||
|
|
34b344baf9 | ||
|
|
b2daeffa36 | ||
|
|
3440fa7415 | ||
|
|
77bf001195 | ||
|
|
5d0003ce93 | ||
|
|
a0c4be1d5c | ||
|
|
95be4e2d53 | ||
|
|
5f8705fc09 | ||
|
|
975833bf87 | ||
|
|
b4e3f25c1e | ||
|
|
bb198c8c1a | ||
|
|
40899de989 | ||
|
|
01a6781454 | ||
|
|
f448a75da4 | ||
|
|
8e5f5c9a6b | ||
|
|
04156061c4 | ||
|
|
36f96f75c7 | ||
|
|
197bcb3599 | ||
|
|
1474335a79 | ||
|
|
0f8c361dcd | ||
|
|
beb75dbc20 | ||
|
|
cbb95a47f8 | ||
|
|
d7e36bc5eb | ||
|
|
ef14359d9b | ||
|
|
b1444d7c04 | ||
|
|
c3c7d629f7 | ||
|
|
eb33b6521b | ||
|
|
932fe5db02 | ||
|
|
6885bcae92 | ||
|
|
d35e9fcae4 | ||
|
|
861279e614 | ||
|
|
b80dd15f4b | ||
|
|
ae95c8fdea | ||
|
|
090b5937ab | ||
|
|
2323e130b1 | ||
|
|
6ef127f283 | ||
|
|
266f00d3a8 | ||
|
|
5c61867e1f | ||
|
|
0bbe1cc958 | ||
|
|
d1e02e4695 | ||
|
|
f707c83e1a | ||
|
|
ae67319975 | ||
|
|
dffdd2e190 | ||
|
|
e3ba323764 | ||
|
|
2d7153e151 | ||
|
|
333ad533c1 | ||
|
|
f91ebfabcb | ||
|
|
cae58ffb96 | ||
|
|
caddda2b1c | ||
|
|
f63a04a123 | ||
|
|
fe13508f95 | ||
|
|
53e2b5b563 | ||
|
|
af42342e08 | ||
|
|
1da63a6be0 |
BIN
.github/actions/creds.tar.xz.gpg
vendored
BIN
.github/actions/creds.tar.xz.gpg
vendored
Binary file not shown.
37
.github/actions/decrypt.sh
vendored
Normal file → Executable file
37
.github/actions/decrypt.sh
vendored
Normal file → Executable file
@@ -1,32 +1,19 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
credspath="$3"
|
credspath="$1"
|
||||||
if [ ! -d "$credspath" ]; then
|
if [ ! -d "$credspath" ]; then
|
||||||
echo "creating ${credspath}"
|
echo "creating ${credspath}"
|
||||||
mkdir -p "$credspath"
|
mkdir -p "$credspath"
|
||||||
fi
|
fi
|
||||||
gpgfile="$1"
|
credsfile="${credspath}/oauth2.txt"
|
||||||
if [ -f "$gpgfile" ]; then
|
echo "$oa2" > "$credsfile"
|
||||||
echo "source file is ${gpgfile}"
|
echo "File size:"
|
||||||
|
wc -c "$credsfile"
|
||||||
|
echo "File type:"
|
||||||
|
file "$credsfile"
|
||||||
|
echo "Validation:"
|
||||||
|
jq -e . "$credsfile" > /dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Valid JSON"
|
||||||
else
|
else
|
||||||
echo "ERROR: ${gpgfile} does not exist"
|
echo "Invalid JSON"
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
credsfile="$2"
|
|
||||||
echo "target file is ${credsfile}"
|
|
||||||
if [ -z ${PASSCODE+x} ]; then
|
|
||||||
echo "ERROR: PASSCODE is unset";
|
|
||||||
exit 2
|
|
||||||
else
|
|
||||||
echo "PASSCODE is set";
|
|
||||||
fi
|
|
||||||
|
|
||||||
gpg --batch \
|
|
||||||
--yes \
|
|
||||||
--decrypt \
|
|
||||||
--passphrase="${PASSCODE}" \
|
|
||||||
--output "${credsfile}" \
|
|
||||||
"${gpgfile}"
|
|
||||||
|
|
||||||
tar xvvf "${credsfile}" --directory "${credspath}"
|
|
||||||
rm -rvf "${gpgfile}"
|
|
||||||
rm -rvf "${credsfile}"
|
|
||||||
|
|||||||
398
.github/workflows/build.yml
vendored
398
.github/workflows/build.yml
vendored
@@ -2,9 +2,14 @@ name: Build and test GAM
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- 'wiki/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- 'wiki/**'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '37 22 * * *'
|
- cron: '37 22 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -17,12 +22,14 @@ defaults:
|
|||||||
working-directory: src
|
working-directory: src
|
||||||
|
|
||||||
env:
|
env:
|
||||||
SCRATCH_COUNTER: 1
|
SCRATCH_COUNTER: 14
|
||||||
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
|
||||||
PYTHON_INSTALL_PATH: ${{ github.workspace }}/bin/python
|
PYTHON_INSTALL_PATH: ${{ github.workspace }}/bin/python
|
||||||
PYTHON_SOURCE_PATH: ${{ github.workspace }}/src/cpython
|
PYTHON_SOURCE_PATH: ${{ github.workspace }}/src/cpython
|
||||||
|
CRYPTOGRAPHY_BUILD_OPENSSL_NO_LEGACY: 1
|
||||||
|
CRYPTOGRAPHY_OPENSSL_NO_LEGACY: 1
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -34,60 +41,69 @@ jobs:
|
|||||||
- os: ubuntu-22.04
|
- os: ubuntu-22.04
|
||||||
jid: 1
|
jid: 1
|
||||||
goal: build
|
goal: build
|
||||||
arch: x86_64
|
name: Build Intel Ubuntu Jammy
|
||||||
openssl_archs: linux-x86_64
|
- os: ubuntu-24.04
|
||||||
- os: [self-hosted, linux, arm64]
|
|
||||||
jid: 2
|
jid: 2
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
name: Build Intel Ubuntu Noble
|
||||||
openssl_archs: linux-aarch64
|
- os: ubuntu-24.04-arm
|
||||||
- os: ubuntu-22.04
|
|
||||||
jid: 3
|
jid: 3
|
||||||
goal: build
|
goal: build
|
||||||
arch: x86_64
|
name: Build Arm Ubuntu Noble
|
||||||
openssl_archs: linux-x86_64
|
- os: ubuntu-22.04-arm
|
||||||
staticx: yes
|
|
||||||
- os: [self-hosted, linux, arm64]
|
|
||||||
jid: 4
|
jid: 4
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
name: Build Arm Ubuntu Jammy
|
||||||
openssl_archs: linux-aarch64
|
- os: ubuntu-22.04
|
||||||
staticx: yes
|
|
||||||
- os: macos-13
|
|
||||||
jid: 5
|
jid: 5
|
||||||
goal: build
|
goal: build
|
||||||
arch: x86_64
|
staticx: yes
|
||||||
openssl_archs: darwin64-x86_64
|
name: Build Intel StaticX Legacy
|
||||||
- os: macos-14
|
- os: ubuntu-22.04-arm
|
||||||
jid: 6
|
jid: 6
|
||||||
goal: build
|
goal: build
|
||||||
arch: aarch64
|
staticx: yes
|
||||||
openssl_archs: darwin64-arm64
|
name: Build Arm StaticX Legacy
|
||||||
- os: windows-2022
|
- os: macos-13
|
||||||
jid: 7
|
jid: 7
|
||||||
goal: build
|
goal: build
|
||||||
arch: Win64
|
name: Build Intel MacOS
|
||||||
openssl_archs: VC-WIN64A
|
- os: macos-14
|
||||||
- os: ubuntu-24.04
|
|
||||||
goal: test
|
|
||||||
python: "3.13"
|
|
||||||
jid: 8
|
jid: 8
|
||||||
arch: x86_64
|
goal: build
|
||||||
- os: ubuntu-24.04
|
name: Build Arm MacOS 14
|
||||||
goal: test
|
- os: macos-15
|
||||||
python: "3.9"
|
|
||||||
jid: 9
|
jid: 9
|
||||||
arch: x86_64
|
goal: build
|
||||||
|
name: Build Arm MacOS 15
|
||||||
|
- os: windows-2022
|
||||||
|
jid: 10
|
||||||
|
goal: build
|
||||||
|
name: Build Intel Windows
|
||||||
|
- os: windows-11-arm
|
||||||
|
jid: 11
|
||||||
|
goal: build
|
||||||
|
name: Build Arm Windows
|
||||||
- os: ubuntu-24.04
|
- os: ubuntu-24.04
|
||||||
goal: test
|
goal: test
|
||||||
python: "3.10"
|
python: "3.10"
|
||||||
jid: 10
|
jid: 12
|
||||||
arch: x86_64
|
name: Test Python 3.10
|
||||||
- os: ubuntu-24.04
|
- os: ubuntu-24.04
|
||||||
goal: test
|
goal: test
|
||||||
python: "3.11"
|
python: "3.11"
|
||||||
jid: 11
|
jid: 13
|
||||||
arch: x86_64
|
name: Test Python 3.11
|
||||||
|
- os: ubuntu-24.04
|
||||||
|
goal: test
|
||||||
|
python: "3.12"
|
||||||
|
jid: 14
|
||||||
|
name: Test Python 3.12
|
||||||
|
- os: ubuntu-24.04
|
||||||
|
goal: test
|
||||||
|
python: "3.14-dev"
|
||||||
|
jid: 15
|
||||||
|
name: Test Python 3.14-dev
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
@@ -110,7 +126,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
cache.tar.xz
|
cache.tar.xz
|
||||||
key: gam-${{ matrix.jid }}-20241002
|
key: gam-${{ matrix.jid }}-20250701
|
||||||
|
|
||||||
- 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'
|
||||||
@@ -124,15 +140,25 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python }}
|
python-version: ${{ matrix.python }}
|
||||||
allow-prereleases: true
|
allow-prereleases: true
|
||||||
|
check-latest: true
|
||||||
|
|
||||||
- name: common variables for all runs
|
- name: common variables for all runs
|
||||||
env:
|
env:
|
||||||
arch: ${{ matrix.arch }}
|
|
||||||
JID: ${{ matrix.jid }}
|
JID: ${{ matrix.jid }}
|
||||||
ACTIONS_CACHE: ${{ steps.cache-python-ssl.outputs.cache-hit }}
|
ACTIONS_CACHE: ${{ steps.cache-python-ssl.outputs.cache-hit }}
|
||||||
ACTIONS_GOAL: ${{ matrix.goal }}
|
ACTIONS_GOAL: ${{ matrix.goal }}
|
||||||
run: |
|
run: |
|
||||||
echo "arch=${arch}" >> $GITHUB_ENV
|
case $RUNNER_ARCH in
|
||||||
|
X64)
|
||||||
|
echo "arch=x86_64" >> $GITHUB_ENV
|
||||||
|
;;
|
||||||
|
ARM64)
|
||||||
|
echo "arch=arm64" >> $GITHUB_ENV
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "arch=${RUNNER_ARCH}" >> $GITHUB_ENV
|
||||||
|
;;
|
||||||
|
esac
|
||||||
echo "JID=${JID}" >> $GITHUB_ENV
|
echo "JID=${JID}" >> $GITHUB_ENV
|
||||||
echo "ACTIONS_CACHE=${ACTIONS_CACHE}" >> $GITHUB_ENV
|
echo "ACTIONS_CACHE=${ACTIONS_CACHE}" >> $GITHUB_ENV
|
||||||
echo "ACTIONS_GOAL=${ACTIONS_GOAL}" >> $GITHUB_ENV
|
echo "ACTIONS_GOAL=${ACTIONS_GOAL}" >> $GITHUB_ENV
|
||||||
@@ -146,20 +172,12 @@ jobs:
|
|||||||
echo "curl_retry=${curl_retry}" >> $GITHUB_ENV
|
echo "curl_retry=${curl_retry}" >> $GITHUB_ENV
|
||||||
# GAMCFGDIR should be recreated on every run
|
# GAMCFGDIR should be recreated on every run
|
||||||
GAMCFGDIR="${RUNNER_TEMP}/.gam"
|
GAMCFGDIR="${RUNNER_TEMP}/.gam"
|
||||||
if [ "$arch" == "Win64" ]; then
|
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||||
GAMCFGDIR=$(cygpath -u "$GAMCFGDIR")
|
GAMCFGDIR=$(cygpath -u "$GAMCFGDIR")
|
||||||
fi
|
fi
|
||||||
echo "GAMCFGDIR=${GAMCFGDIR}" >> $GITHUB_ENV
|
echo "GAMCFGDIR=${GAMCFGDIR}" >> $GITHUB_ENV
|
||||||
echo "GAMCFGDIR is: ${GAMCFGDIR}"
|
echo "GAMCFGDIR is: ${GAMCFGDIR}"
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
export GAMOS=$(echo "$RUNNER_OS" | tr '[:upper:]' '[:lower:]')
|
||||||
GAMOS="macos"
|
|
||||||
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
|
|
||||||
GAMOS="linux"
|
|
||||||
elif [[ "${RUNNER_OS}" == "Windows" ]]; then
|
|
||||||
GAMOS="windows"
|
|
||||||
else
|
|
||||||
GAMOS='unknown'
|
|
||||||
fi
|
|
||||||
echo "GAMOS=${GAMOS}" >> $GITHUB_ENV
|
echo "GAMOS=${GAMOS}" >> $GITHUB_ENV
|
||||||
echo "GAMOS is: ${GAMOS}"
|
echo "GAMOS is: ${GAMOS}"
|
||||||
|
|
||||||
@@ -177,11 +195,11 @@ 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
|
||||||
sudo apt-get -qq --yes install swig libpcsclite-dev libxslt1-dev
|
sudo apt-get -qq --yes install swig libpcsclite-dev libxslt1-dev libsqlite3-dev libffi-dev pkg-config
|
||||||
|
|
||||||
- name: MacOS install tools
|
- name: MacOS install tools
|
||||||
if: runner.os == 'macOS'
|
if: runner.os == 'macOS'
|
||||||
@@ -208,23 +226,15 @@ jobs:
|
|||||||
uses: ilammy/msvc-dev-cmd@v1
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
if: runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
with:
|
with:
|
||||||
arch: ${{ matrix.arch }}
|
arch: ${{ runner.arch }}
|
||||||
|
|
||||||
- name: Set Env Variables for build
|
- name: Set Env Variables for build
|
||||||
if: matrix.goal == 'build'
|
if: matrix.goal == 'build'
|
||||||
env:
|
env:
|
||||||
openssl_archs: ${{ matrix.openssl_archs }}
|
|
||||||
staticx: ${{ matrix.staticx }}
|
staticx: ${{ matrix.staticx }}
|
||||||
run: |
|
run: |
|
||||||
echo "We are running on ${RUNNER_OS}"
|
echo "We are running on ${RUNNER_OS}"
|
||||||
LD_LIBRARY_PATH="${OPENSSL_INSTALL_PATH}/lib:${PYTHON_INSTALL_PATH}/lib:/usr/local/lib"
|
LD_LIBRARY_PATH="${OPENSSL_INSTALL_PATH}/lib:${PYTHON_INSTALL_PATH}/lib:/usr/local/lib"
|
||||||
if [[ "${arch}" == "Win64" ]]; then
|
|
||||||
PYEXTERNALS_PATH="amd64"
|
|
||||||
PYBUILDRELEASE_ARCH="x64"
|
|
||||||
GAM_ARCHIVE_ARCH="x86_64"
|
|
||||||
WIX_ARCH="x64"
|
|
||||||
CHOC_OPS=""
|
|
||||||
fi
|
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
||||||
MAKE=make
|
MAKE=make
|
||||||
MAKEOPT="-j$(sysctl -n hw.logicalcpu)"
|
MAKEOPT="-j$(sysctl -n hw.logicalcpu)"
|
||||||
@@ -242,9 +252,15 @@ jobs:
|
|||||||
MAKE=nmake
|
MAKE=nmake
|
||||||
MAKEOPT=""
|
MAKEOPT=""
|
||||||
PERL="c:\strawberry\perl\bin\perl.exe"
|
PERL="c:\strawberry\perl\bin\perl.exe"
|
||||||
|
if [[ "$RUNNER_ARCH" == "ARM64" ]]; then
|
||||||
|
PYEXTERNALS_PATH="arm64"
|
||||||
|
WIX_ARCH="arm64"
|
||||||
|
elif [[ "$RUNNER_ARCH" == "X64" ]]; then
|
||||||
|
PYEXTERNALS_PATH="amd64"
|
||||||
|
WIX_ARCH="x64"
|
||||||
|
fi
|
||||||
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}"
|
LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}"
|
||||||
echo "PYTHON=${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}/python.exe" >> $GITHUB_ENV
|
echo "PYTHON=${PYTHON_SOURCE_PATH}/PCbuild/${PYEXTERNALS_PATH}/python.exe" >> $GITHUB_ENV
|
||||||
echo "GAM_ARCHIVE_ARCH=${GAM_ARCHIVE_ARCH}" >> $GITHUB_ENV
|
|
||||||
echo "WIX_ARCH=${WIX_ARCH}" >> $GITHUB_ENV
|
echo "WIX_ARCH=${WIX_ARCH}" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
echo "We'll run make with: ${MAKEOPT}"
|
echo "We'll run make with: ${MAKEOPT}"
|
||||||
@@ -254,8 +270,6 @@ jobs:
|
|||||||
echo "MAKEOPT=${MAKEOPT}" >> $GITHUB_ENV
|
echo "MAKEOPT=${MAKEOPT}" >> $GITHUB_ENV
|
||||||
echo "PERL=${PERL}" >> $GITHUB_ENV
|
echo "PERL=${PERL}" >> $GITHUB_ENV
|
||||||
echo "PYEXTERNALS_PATH=${PYEXTERNALS_PATH}" >> $GITHUB_ENV
|
echo "PYEXTERNALS_PATH=${PYEXTERNALS_PATH}" >> $GITHUB_ENV
|
||||||
echo "PYBUILDRELEASE_ARCH=${PYBUILDRELEASE_ARCH}" >> $GITHUB_ENV
|
|
||||||
echo "openssl_archs=${openssl_archs}" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Get latest stable OpenSSL source
|
- name: Get latest stable OpenSSL source
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
@@ -269,29 +283,21 @@ jobs:
|
|||||||
git checkout "${LATEST_STABLE_TAG}"
|
git checkout "${LATEST_STABLE_TAG}"
|
||||||
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix
|
export COMPILED_OPENSSL_VERSION=${LATEST_STABLE_TAG:8} # Trim the openssl- prefix
|
||||||
echo "COMPILED_OPENSSL_VERSION=${COMPILED_OPENSSL_VERSION}" >> $GITHUB_ENV
|
echo "COMPILED_OPENSSL_VERSION=${COMPILED_OPENSSL_VERSION}" >> $GITHUB_ENV
|
||||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
|
||||||
for openssl_arch in $openssl_archs; do
|
|
||||||
ssldir="${OPENSSL_SOURCE_PATH}-${openssl_arch}"
|
|
||||||
mkdir -v "${ssldir}"
|
|
||||||
cp -vrf ${OPENSSL_SOURCE_PATH}/* "${ssldir}/"
|
|
||||||
done
|
|
||||||
rm -vrf "${OPENSSL_SOURCE_PATH}"
|
|
||||||
else
|
|
||||||
mv -v "${OPENSSL_SOURCE_PATH}" "${OPENSSL_SOURCE_PATH}-${openssl_archs}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Windows NASM Install
|
- name: Windows NASM Install
|
||||||
uses: ilammy/setup-nasm@v1
|
uses: ilammy/setup-nasm@v1
|
||||||
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && runner.os == 'Windows' && runner.arch == 'X64' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
|
|
||||||
- name: Config OpenSSL
|
- name: Config OpenSSL
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
for openssl_arch in $openssl_archs; do
|
cd "${OPENSSL_SOURCE_PATH}"
|
||||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
#if ([ "$RUNNER_OS" == "Windows" ] && [ "$RUNNER_ARCH" == "ARM64" ]); then
|
||||||
# --libdir=lib is needed so Python can find OpenSSL libraries
|
# https://github.com/openssl/openssl/issues/26239
|
||||||
"${PERL}" ./Configure "${openssl_arch}" --libdir=lib --prefix="${OPENSSL_INSTALL_PATH}" $OPENSSL_CONFIG_OPTS
|
export CFLAGS=-DNO_INTERLOCKEDOR64
|
||||||
done
|
#fi
|
||||||
|
# --libdir=lib is needed so Python can find OpenSSL libraries
|
||||||
|
"${PERL}" ./Configure --libdir=lib --prefix="${OPENSSL_INSTALL_PATH}" $OPENSSL_CONFIG_OPTS
|
||||||
|
|
||||||
- name: Rename GNU link on Windows
|
- name: Rename GNU link on Windows
|
||||||
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && runner.os == 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
@@ -302,53 +308,29 @@ jobs:
|
|||||||
- name: Make OpenSSL
|
- name: Make OpenSSL
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
for openssl_arch in $openssl_archs; do
|
cd "${OPENSSL_SOURCE_PATH}"
|
||||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
# TODO: remove this once https://github.com/openssl/openssl/issues/26239 is fixed.
|
||||||
$MAKE "${MAKEOPT}"
|
if ([ "$RUNNER_OS" == "Windows" ] && [ "$RUNNER_ARCH" == "ARM64" ]); then
|
||||||
done
|
export CFLAGS=-DNO_INTERLOCKEDOR64
|
||||||
|
fi
|
||||||
|
$MAKE "$MAKEOPT"
|
||||||
|
|
||||||
- name: Install OpenSSL
|
- name: Install OpenSSL
|
||||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
cd "${OPENSSL_SOURCE_PATH}"
|
||||||
for openssl_arch in $openssl_archs; do
|
# install_sw saves us ages processing man pages :-)
|
||||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_arch}"
|
$MAKE install_sw
|
||||||
# install_sw saves us ages processing man pages :-)
|
|
||||||
$MAKE install_sw
|
|
||||||
mv -v "${OPENSSL_INSTALL_PATH}" "${GITHUB_WORKSPACE}/bin/ssl-${openssl_arch}"
|
|
||||||
done
|
|
||||||
mkdir -vp "${OPENSSL_INSTALL_PATH}/lib"
|
|
||||||
mkdir -vp "${OPENSSL_INSTALL_PATH}/bin"
|
|
||||||
for archlib in libcrypto.3.dylib libssl.3.dylib libcrypto.a libssl.a; do
|
|
||||||
lipo -create "${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/lib/${archlib}" \
|
|
||||||
"${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64/lib/${archlib}" \
|
|
||||||
-output "${GITHUB_WORKSPACE}/bin/ssl/lib/${archlib}"
|
|
||||||
done
|
|
||||||
mv ${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/include ${GITHUB_WORKSPACE}/bin/ssl/
|
|
||||||
lipo -create "${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64/bin/openssl" \
|
|
||||||
"${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64/bin/openssl" \
|
|
||||||
-output "${GITHUB_WORKSPACE}/bin/ssl/bin/openssl"
|
|
||||||
rm -rf ${GITHUB_WORKSPACE}/bin/ssl-darwin64-x86_64
|
|
||||||
rm -rf ${GITHUB_WORKSPACE}/bin/ssl-darwin64-arm64
|
|
||||||
else
|
|
||||||
cd "${GITHUB_WORKSPACE}/src/openssl-${openssl_archs}"
|
|
||||||
# install_sw saves us ages processing man pages :-)
|
|
||||||
$MAKE install_sw
|
|
||||||
fi
|
|
||||||
if [[ "${RUNNER_OS}" != "Windows" ]]; then
|
if [[ "${RUNNER_OS}" != "Windows" ]]; then
|
||||||
echo "LDFLAGS=-L${OPENSSL_INSTALL_PATH}/lib" >> $GITHUB_ENV
|
echo "LDFLAGS=-L${OPENSSL_INSTALL_PATH}/lib" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
echo "CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1" >> $GITHUB_ENV
|
echo "CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1" >> $GITHUB_ENV
|
||||||
case $arch in
|
case $RUNNER_ARCH in
|
||||||
universal2)
|
X64)
|
||||||
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include -arch arm64 -arch x86_64 ${CFLAGS}" >> $GITHUB_ENV
|
|
||||||
echo "ARCHFLAGS=-arch x86_64 -arch arm64" >> $GITHUB_ENV
|
|
||||||
;;
|
|
||||||
x86_64)
|
|
||||||
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV
|
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV
|
||||||
echo "ARCHFLAGS=-arch x86_64" >> $GITHUB_ENV
|
echo "ARCHFLAGS=-arch x86_64" >> $GITHUB_ENV
|
||||||
;;
|
;;
|
||||||
aarch64)
|
ARM64)
|
||||||
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV
|
echo "CFLAGS=-I${OPENSSL_INSTALL_PATH}/include ${CFLAGS}" >> $GITHUB_ENV
|
||||||
echo "ARCHFLAGS=-arch arm64" >> $GITHUB_ENV
|
echo "ARCHFLAGS=-arch arm64" >> $GITHUB_ENV
|
||||||
;;
|
;;
|
||||||
@@ -375,18 +357,12 @@ jobs:
|
|||||||
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
run: |
|
run: |
|
||||||
cd "${PYTHON_SOURCE_PATH}"
|
cd "${PYTHON_SOURCE_PATH}"
|
||||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
|
||||||
extra_args=( "--enable-universalsdk" "--with-universal-archs=universal2" )
|
|
||||||
else
|
|
||||||
extra_args=( )
|
|
||||||
fi
|
|
||||||
./configure --with-openssl="${OPENSSL_INSTALL_PATH}" \
|
./configure --with-openssl="${OPENSSL_INSTALL_PATH}" \
|
||||||
--prefix="${PYTHON_INSTALL_PATH}" \
|
--prefix="${PYTHON_INSTALL_PATH}" \
|
||||||
--enable-shared \
|
--enable-shared \
|
||||||
--with-ensurepip=upgrade \
|
--with-ensurepip=upgrade \
|
||||||
--enable-optimizations \
|
--enable-optimizations \
|
||||||
--with-lto \
|
--with-lto || : # exit 0
|
||||||
"${extra_args[@]}" || : # exit 0
|
|
||||||
cat config.log
|
cat config.log
|
||||||
|
|
||||||
- name: Windows Get External Python deps
|
- name: Windows Get External Python deps
|
||||||
@@ -406,10 +382,15 @@ jobs:
|
|||||||
Remove-Item -recurse -force "${env:OPENSSL_EXT_PATH}*"
|
Remove-Item -recurse -force "${env:OPENSSL_EXT_PATH}*"
|
||||||
# Emulate what this script does:
|
# Emulate what this script does:
|
||||||
# https://github.com/python/cpython/blob/main/PCbuild/openssl.vcxproj
|
# https://github.com/python/cpython/blob/main/PCbuild/openssl.vcxproj
|
||||||
$env:OPENSSL_EXT_TARGET_PATH = "${env:OPENSSL_EXT_PATH}${env:PYEXTERNALS_PATH}"
|
if (${env:RUNNER_ARCH} -eq "X64") {
|
||||||
|
$env:ossl_path = "amd64"
|
||||||
|
} elseif (${env:RUNNER_ARCH} -eq "ARM64") {
|
||||||
|
$env:ossl_path = "arm64"
|
||||||
|
}
|
||||||
|
$env:OPENSSL_EXT_TARGET_PATH = "${env:OPENSSL_EXT_PATH}${env:ossl_path}"
|
||||||
echo "Copying our OpenSSL to ${env:OPENSSL_EXT_TARGET_PATH}"
|
echo "Copying our OpenSSL to ${env:OPENSSL_EXT_TARGET_PATH}"
|
||||||
mkdir "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\"
|
mkdir "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\"
|
||||||
Copy-Item -Path "${env:GITHUB_WORKSPACE}/src/openssl-${env:openssl_archs}\LICENSE.txt" -Destination "${env:OPENSSL_EXT_TARGET_PATH}\LICENSE" -Verbose
|
Copy-Item -Path "${env:OPENSSL_SOURCE_PATH}\LICENSE.txt" -Destination "${env:OPENSSL_EXT_TARGET_PATH}\LICENSE"
|
||||||
cp -v "$env:OPENSSL_INSTALL_PATH\lib\*" "${env:OPENSSL_EXT_TARGET_PATH}"
|
cp -v "$env:OPENSSL_INSTALL_PATH\lib\*" "${env:OPENSSL_EXT_TARGET_PATH}"
|
||||||
cp -v "$env:OPENSSL_INSTALL_PATH\bin\*" "${env:OPENSSL_EXT_TARGET_PATH}"
|
cp -v "$env:OPENSSL_INSTALL_PATH\bin\*" "${env:OPENSSL_EXT_TARGET_PATH}"
|
||||||
cp -v "$env:OPENSSL_INSTALL_PATH\include\openssl\*" "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\"
|
cp -v "$env:OPENSSL_INSTALL_PATH\include\openssl\*" "${env:OPENSSL_EXT_TARGET_PATH}\include\openssl\"
|
||||||
@@ -430,8 +411,15 @@ jobs:
|
|||||||
cd "${env:PYTHON_SOURCE_PATH}"
|
cd "${env:PYTHON_SOURCE_PATH}"
|
||||||
# We need out custom openssl.props which uses OpenSSL 3 DLL names
|
# We need out custom openssl.props which uses OpenSSL 3 DLL names
|
||||||
Copy-Item -Path "${env:GITHUB_WORKSPACE}\src\tools\openssl.props" -Destination PCBuild\ -Verbose
|
Copy-Item -Path "${env:GITHUB_WORKSPACE}\src\tools\openssl.props" -Destination PCBuild\ -Verbose
|
||||||
echo "Building for ${env:PYBUILDRELEASE_ARCH}..."
|
if (${env:RUNNER_ARCH} -eq "X64") {
|
||||||
PCBuild\build.bat -m --pgo -c Release -p "${env:PYBUILDRELEASE_ARCH}"
|
$env:arch = "x64"
|
||||||
|
PCBuild\build.bat -c Release -p $env:arch --pgo
|
||||||
|
} elseif (${env:RUNNER_ARCH} -eq "ARM64") {
|
||||||
|
$env:arch = "ARM64"
|
||||||
|
# TODO: figure out why Windows ARM64 isn't compat with PGO optimiazation
|
||||||
|
# causes 10-20% slowdown in Python
|
||||||
|
PCBuild\build.bat -c Release -p $env:arch
|
||||||
|
}
|
||||||
|
|
||||||
- name: Mac/Linux Build Python
|
- name: Mac/Linux Build Python
|
||||||
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
if: matrix.goal == 'build' && runner.os != 'Windows' && steps.cache-python-ssl.outputs.cache-hit != 'true'
|
||||||
@@ -458,46 +446,38 @@ jobs:
|
|||||||
- name: Upgrade pip, wheel, etc
|
- name: Upgrade pip, wheel, etc
|
||||||
run: |
|
run: |
|
||||||
curl $curl_retry -O https://bootstrap.pypa.io/get-pip.py
|
curl $curl_retry -O https://bootstrap.pypa.io/get-pip.py
|
||||||
"${PYTHON}" get-pip.py
|
"$PYTHON" get-pip.py
|
||||||
"${PYTHON}" -m pip install --upgrade pip
|
"$PYTHON" -m pip install --upgrade pip
|
||||||
"${PYTHON}" -m pip install --upgrade wheel
|
"$PYTHON" -m pip install --upgrade wheel
|
||||||
"${PYTHON}" -m pip install --upgrade setuptools
|
"$PYTHON" -m pip install setuptools
|
||||||
|
"$PYTHON" -m pip install --upgrade importlib-metadata
|
||||||
|
"$PYTHON" -m pip install --upgrade setuptools-scm
|
||||||
|
"$PYTHON" -m pip list
|
||||||
|
|
||||||
|
- name: Custom wheels for Win arm64
|
||||||
|
if: runner.os == 'Windows' && runner.arch == 'ARM64'
|
||||||
|
run: |
|
||||||
|
latest_crypt_whl=$(curl https://api.github.com/repos/jay0lee/cryptography/releases/latest -s | jq -r .assets.[0].browser_download_url)
|
||||||
|
echo "Downloading ${latest_crypt_whl}..."
|
||||||
|
curl -O -L "$latest_crypt_whl"
|
||||||
|
"$PYTHON" -m pip install cryptography*.whl
|
||||||
|
|
||||||
|
#- uses: actions-rust-lang/setup-rust-toolchain@v1
|
||||||
|
|
||||||
|
# - name: Compile cryptography from source (no legacy)
|
||||||
|
# if: runner.os != 'Windows' || runner.arch != 'ARM64'
|
||||||
|
# run: |
|
||||||
|
# pip install --no-binary ":all:" --force cryptography
|
||||||
|
|
||||||
- name: Install pip requirements
|
- name: Install pip requirements
|
||||||
run: |
|
run: |
|
||||||
echo "before anything..."
|
echo "before anything..."
|
||||||
"${PYTHON}" -m pip list
|
"$PYTHON" -m pip list
|
||||||
if ([ "${RUNNER_OS}" == "macOS" ] && [ "$arch" == "universal2" ]); then
|
"$PYTHON" -m pip install --upgrade ..[yubikey]
|
||||||
# cffi is a dep of cryptography and doesn't ship
|
"$PYTHON" -m pip list
|
||||||
# a universal2 wheel so we must build one ourself :-/
|
#"$PYTHON" -m pip install --force-reinstall --no-deps --upgrade cryptography
|
||||||
export CFLAGS="-arch x86_64 -arch arm64"
|
|
||||||
export ARCHFLAGS="-arch x86_64 -arch arm64"
|
|
||||||
"${PYTHON}" -m pip install --upgrade --force-reinstall --no-binary :all: \
|
|
||||||
--no-cache-dir --no-deps --use-pep517 \
|
|
||||||
--use-feature=no-binary-enable-wheel-cache \
|
|
||||||
cffi
|
|
||||||
echo "before cryptography..."
|
|
||||||
"${PYTHON}" -m pip list
|
|
||||||
# cryptography has a universal2 wheel but getting it installed
|
|
||||||
# on x86-64 MacOS is a royal pain in the keester.
|
|
||||||
"${PYTHON}" -m pip download --only-binary :all: \
|
|
||||||
--dest . \
|
|
||||||
--no-cache \
|
|
||||||
--no-deps \
|
|
||||||
--platform macosx_10_15_universal2 \
|
|
||||||
cryptography
|
|
||||||
"${PYTHON}" -m pip install --force-reinstall --no-deps cryptography*.whl
|
|
||||||
echo "after cryptography..."
|
|
||||||
"${PYTHON}" -m pip list
|
|
||||||
"${PYTHON}" -m pip install --upgrade --no-binary :all: -r requirements.txt
|
|
||||||
else
|
|
||||||
"${PYTHON}" -m pip install --upgrade -r requirements.txt
|
|
||||||
echo "after requirements..."
|
|
||||||
"${PYTHON}" -m pip list
|
|
||||||
"${PYTHON}" -m pip install --force-reinstall --no-deps --upgrade cryptography
|
|
||||||
fi
|
|
||||||
echo "after everything..."
|
echo "after everything..."
|
||||||
"${PYTHON}" -m pip list
|
"$PYTHON" -m pip list
|
||||||
|
|
||||||
- name: Install PyInstaller
|
- name: Install PyInstaller
|
||||||
if: matrix.goal == 'build'
|
if: matrix.goal == 'build'
|
||||||
@@ -505,19 +485,12 @@ jobs:
|
|||||||
git clone https://github.com/pyinstaller/pyinstaller.git
|
git clone https://github.com/pyinstaller/pyinstaller.git
|
||||||
cd pyinstaller
|
cd pyinstaller
|
||||||
export latest_release=$(git tag --list | grep -v dev | grep -v rc | sort -Vr | head -n1)
|
export latest_release=$(git tag --list | grep -v dev | grep -v rc | sort -Vr | head -n1)
|
||||||
# git checkout "${latest_release}"
|
git checkout "${latest_release}"
|
||||||
git checkout "v6.9.0"
|
# git checkout "v6.9.0"
|
||||||
# remove pre-compiled bootloaders so we fail if bootloader compile fails
|
# remove pre-compiled bootloaders so we fail if bootloader compile fails
|
||||||
rm -rvf PyInstaller/bootloader/*-*/*
|
rm -rvf PyInstaller/bootloader/*-*/*
|
||||||
cd bootloader
|
cd bootloader
|
||||||
export PYINSTALLER_BUILD_ARGS=""
|
"${PYTHON}" ./waf all
|
||||||
case "${arch}" in
|
|
||||||
"Win64")
|
|
||||||
export PYINSTALLER_BUILD_ARGS="--target-arch=64bit"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
echo "PyInstaller build arguments: ${PYINSTALLER_BUILD_ARGS}"
|
|
||||||
"${PYTHON}" ./waf all $PYINSTALLER_BUILD_ARGS
|
|
||||||
cd ..
|
cd ..
|
||||||
echo "---- Installing PyInstaller ----"
|
echo "---- Installing PyInstaller ----"
|
||||||
"${PYTHON}" -m pip install .
|
"${PYTHON}" -m pip install .
|
||||||
@@ -538,7 +511,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
|
||||||
@@ -584,10 +556,15 @@ 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
|
||||||
|
# install latest github src for staticx
|
||||||
|
"${PYTHON}" -m pip install --upgrade "git+https://github.com/JonathonReinhart/staticx"
|
||||||
|
|
||||||
- name: Make StaticX
|
- name: Make StaticX GAM build
|
||||||
if: matrix.staticx == 'yes'
|
if: matrix.staticx == 'yes'
|
||||||
run: |
|
run: |
|
||||||
case $RUNNER_ARCH in
|
case $RUNNER_ARCH in
|
||||||
@@ -624,14 +601,12 @@ jobs:
|
|||||||
echo "GAM Version ${GAMVERSION}"
|
echo "GAM Version ${GAMVERSION}"
|
||||||
echo "GAMVERSION=${GAMVERSION}" >> $GITHUB_ENV
|
echo "GAMVERSION=${GAMVERSION}" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Configure service account auth
|
- name: Configure user and service account auth
|
||||||
id: configserviceaccount
|
id: configserviceaccount
|
||||||
env:
|
env:
|
||||||
PASSCODE: ${{ secrets.PASSCODE }}
|
oa2: ${{ secrets[format('GAM_GHA_{0}', matrix.jid)] }}
|
||||||
run: |
|
run: |
|
||||||
source ../.github/actions/decrypt.sh ../.github/actions/creds.tar.xz.gpg creds.tar.xz "${GAMCFGDIR}"
|
../.github/actions/decrypt.sh "${GAMCFGDIR}"
|
||||||
mv -v "${GAMCFGDIR}/oauth2.txt-gam-gha-${JID}" "${GAMCFGDIR}/oauth2.txt"
|
|
||||||
rm -v $GAMCFGDIR/oauth2.txt-gam*
|
|
||||||
$gam create signjwtserviceaccount
|
$gam create signjwtserviceaccount
|
||||||
|
|
||||||
- name: Upload gam.exe Windows for signing
|
- name: Upload gam.exe Windows for signing
|
||||||
@@ -672,31 +647,39 @@ jobs:
|
|||||||
if: runner.os != 'Windows' && matrix.goal == 'build'
|
if: runner.os != 'Windows' && matrix.goal == 'build'
|
||||||
run: |
|
run: |
|
||||||
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
if [[ "${RUNNER_OS}" == "macOS" ]]; then
|
||||||
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-macos-${arch}.tar.xz"
|
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-macos${MACOSX_DEPLOYMENT_TARGET}-${arch}.tar.xz"
|
||||||
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
|
elif [[ "${RUNNER_OS}" == "Linux" ]]; then
|
||||||
if [[ "${staticx}" == "yes" ]]; then
|
if [[ "${staticx}" == "yes" ]]; then
|
||||||
libver="legacy"
|
libver="legacy"
|
||||||
else
|
else
|
||||||
libver="glibc$(ldd --version | awk '/ldd/{print $NF}')"
|
libver="glibc$(ldd --version | awk '/ldd/{print $NF}')"
|
||||||
fi
|
fi
|
||||||
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-linux-$(arch)-${libver}.tar.xz"
|
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-linux-${arch}-${libver}.tar.xz"
|
||||||
fi
|
fi
|
||||||
echo "GAM Archive ${GAM_ARCHIVE}"
|
echo "GAM Archive ${GAM_ARCHIVE}"
|
||||||
tar -C "${gampath}/.." --create --verbose --exclude-from "${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" --file $GAM_ARCHIVE --xz gam7
|
tar -C "${gampath}/.." --create --verbose --exclude-from "${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" --file $GAM_ARCHIVE --xz gam7
|
||||||
|
|
||||||
- name: Windows package
|
- name: Install Wix on Win ARM64
|
||||||
|
if: runner.os == 'Windows' && runner.arch == 'ARM64'
|
||||||
|
run: |
|
||||||
|
choco install wixtoolset
|
||||||
|
|
||||||
|
- name: Windows package zip
|
||||||
if: runner.os == 'Windows' && matrix.goal != 'test'
|
if: runner.os == 'Windows' && matrix.goal != 'test'
|
||||||
run: |
|
run: |
|
||||||
echo "started in $(pwd)"
|
echo "started in $(pwd)"
|
||||||
cd "${gampath}/.."
|
cd "${gampath}/.."
|
||||||
echo "moved to $(pwd)"
|
echo "moved to $(pwd)"
|
||||||
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-windows-${GAM_ARCHIVE_ARCH}.zip"
|
GAM_ARCHIVE="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-windows-${arch}.zip"
|
||||||
/c/Program\ Files/7-Zip/7z.exe a -tzip "$GAM_ARCHIVE" gam7 "-xr@${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" -bb3
|
/c/Program\ Files/7-Zip/7z.exe a -tzip "$GAM_ARCHIVE" gam7 "-xr@${GITHUB_WORKSPACE}/.github/actions/package_exclusions.txt" -bb3
|
||||||
cd ../..
|
|
||||||
echo "moved to $(pwd)"
|
- name: Windows package MSI
|
||||||
export MSI_FILENAME="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-windows-${GAM_ARCHIVE_ARCH}.msi"
|
if: runner.os == 'Windows' && matrix.goal != 'test'
|
||||||
|
run: |
|
||||||
|
export MSI_FILENAME="${GITHUB_WORKSPACE}/gam-${GAMVERSION}-windows-${arch}.msi"
|
||||||
# auto-generate a lib.wxs based on the files PyInstaller created for the lib/ directory
|
# auto-generate a lib.wxs based on the files PyInstaller created for the lib/ directory
|
||||||
/c/Program\ Files\ \(x86\)/WiX\ Toolset\ v3.14/bin/heat.exe dir "${gampath}/lib" -ke -srd -cg Lib -gg -dr lib -directoryid lib -out lib.wxs
|
/c/Program\ Files\ \(x86\)/WiX\ Toolset\ v3.14/bin/heat.exe dir "${gampath}/lib" -ke -srd -cg Lib -gg -dr lib -directoryid lib -out lib.wxs
|
||||||
|
$PYTHON tools/gen-wix-xml-filelist.py lib.wxs
|
||||||
echo "-- begin lib.wxs --"
|
echo "-- begin lib.wxs --"
|
||||||
cat lib.wxs
|
cat lib.wxs
|
||||||
echo "-- end lib.wxs --"
|
echo "-- end lib.wxs --"
|
||||||
@@ -734,7 +717,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
|
||||||
@@ -743,7 +726,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: |
|
||||||
@@ -771,8 +754,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
|
||||||
@@ -798,7 +781,10 @@ jobs:
|
|||||||
|
|
||||||
# cleanup old runs
|
# cleanup old runs
|
||||||
$gam config enable_dasa false save
|
$gam config enable_dasa false save
|
||||||
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print vaultholds || if [ $? != 55 ]; then exit $?; fi | $gam csv - gam delete vaulthold "id:~~holdId~~" matter "id:~~matterId~~"
|
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print vaultholds | $gam csv - gam delete vaulthold "id:~~holdId~~" matter "id:~~matterId~~" || if [ $? != 55 ]; then exit $?; fi
|
||||||
|
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print vaultmatters matterstate OPEN | $gam csv - gam update vaultmatter "id:~~matterId~~" action close
|
||||||
|
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print vaultmatters matterstate CLOSED | $gam csv - gam update vaultmatter "id:~~matterId~~" action delete
|
||||||
|
$gam config csv_output_row_filter "Emails.1.address:regex:^gha_test-${JID}_" print contacts | $gam csv - gam delete contact ~ContactID
|
||||||
$gam config enable_dasa true save
|
$gam config enable_dasa true save
|
||||||
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print features | $gam csv - gam delete feature ~name
|
$gam config csv_output_row_filter "name:regex:gha_test_${JID}_" print features | $gam csv - gam delete feature ~name
|
||||||
$gam config csv_output_row_filter "name:regex:^gha_test_${JID}_" user $gam_user print shareddrives asadmin | $gam csv - gam user $gam_user delete shareddrive ~id nukefromorbit
|
$gam config csv_output_row_filter "name:regex:^gha_test_${JID}_" user $gam_user print shareddrives asadmin | $gam csv - gam user $gam_user delete shareddrive ~id nukefromorbit
|
||||||
@@ -807,7 +793,6 @@ jobs:
|
|||||||
$gam config csv_output_row_filter "email:regex:^gha_test_${JID}_" print cigroups | $gam csv - gam delete cigroup ~email
|
$gam config csv_output_row_filter "email:regex:^gha_test_${JID}_" print cigroups | $gam csv - gam delete cigroup ~email
|
||||||
$gam config csv_output_row_filter "resourceId:regex:^gha_test_${JID}_" print resources | $gam csv - gam delete resource ~resourceId
|
$gam config csv_output_row_filter "resourceId:regex:^gha_test_${JID}_" print resources | $gam csv - gam delete resource ~resourceId
|
||||||
$gam config csv_output_row_filter "buildingId:regex:^gha_test_${JID}_" print buildings | $gam csv - gam delete building ~buildingId
|
$gam config csv_output_row_filter "buildingId:regex:^gha_test_${JID}_" print buildings | $gam csv - gam delete building ~buildingId
|
||||||
$gam config csv_output_row_filter "Emails.1.address:regex:^gha_test-${JID}_" print contacts | $gam csv - gam delete contact ~ContactID
|
|
||||||
|
|
||||||
echo "Creating OrgUnit ${newou}"
|
echo "Creating OrgUnit ${newou}"
|
||||||
$gam create ou "${newou}"
|
$gam create ou "${newou}"
|
||||||
@@ -818,17 +803,18 @@ jobs:
|
|||||||
done
|
done
|
||||||
driveid=$($gam user $gam_user add shareddrive "${newbase}" returnidonly)
|
driveid=$($gam user $gam_user add shareddrive "${newbase}" returnidonly)
|
||||||
echo "Created shared drive ${driveid}"
|
echo "Created shared drive ${driveid}"
|
||||||
# 9/17/24 - temp create in root due to Google API issues creating users in new OUs
|
$gam create user $newuser firstname GHA lastname $JID displayname "Github Actions ${JID}" password random recoveryphone 12125121110 recoveryemail jay0lee@gmail.com gha.jid $JID languages en+,en-GB- ou "${newou}"
|
||||||
$gam create user $newuser firstname GHA lastname $JID displayname "Github Actions ${JID}" password random recoveryphone 12125121110 recoveryemail jay0lee@gmail.com gha.jid $JID languages en+,en-GB- # ou "${newou}"
|
|
||||||
$gam user $newuser add license workspaceenterpriseplus
|
$gam user $newuser add license workspaceenterpriseplus
|
||||||
$gam user $newuser update photo https://dummyimage.com/400x600/000/fff
|
$gam user $newuser update photo https://dummyimage.com/98x98/000/fff.jpg
|
||||||
$gam user $newuser get photo
|
$gam user $newuser get photo
|
||||||
$gam user $newuser delete photo
|
$gam user $newuser delete photo
|
||||||
$gam create alias $newalias user $newuser
|
$gam create alias $newalias user $newuser
|
||||||
$gam create group $newgroup name "GHA $JID group" description "This is a description" isarchived true
|
$gam create group $newgroup name "GHA $JID group" description "This is a description" isarchived true
|
||||||
$gam user $gam_user sendemail recipient dev-null@pdl.jaylee.us subject "test message $newbase" message "GHA test message"
|
$gam user $gam_user sendemail recipient dev-null@pdl.jaylee.us subject "test message $newbase" message "GHA test message"
|
||||||
$gam config enable_dasa false save
|
$gam config enable_dasa false save
|
||||||
#$gam create contact firstname GHA lastname "$JID" email work "${newbase}@example.com" primary
|
# don't expose policy output
|
||||||
|
$gam show policies > policies.csv
|
||||||
|
$gam create contact firstname GHA lastname "$JID" email work "${newbase}@example.com" primary
|
||||||
$gam print contacts
|
$gam print contacts
|
||||||
$gam print privileges
|
$gam print privileges
|
||||||
$gam config enable_dasa true save
|
$gam config enable_dasa true save
|
||||||
@@ -848,25 +834,25 @@ jobs:
|
|||||||
$gam csv sample.csv gam update user ~~email~~ recoveryphone "" recoveryemail ""
|
$gam csv sample.csv gam update user ~~email~~ recoveryphone "" recoveryemail ""
|
||||||
$gam config enable_dasa false save
|
$gam config enable_dasa false save
|
||||||
$gam csv sample.csv gam user ~email add license workspaceenterpriseplus
|
$gam csv sample.csv gam user ~email add license workspaceenterpriseplus
|
||||||
|
#$gam user $newuser add contactdelegate "${newbase}-bulkuser-1"
|
||||||
|
#$gam user $newuser print contactdelegates
|
||||||
$gam config enable_dasa true save
|
$gam config enable_dasa true save
|
||||||
$gam csv sample.csv gam user $gam_user sendemail recipient ~~email~~@pdl.jaylee.us subject "test message $newbase" message "GHA test message"
|
$gam csv sample.csv gam user $gam_user sendemail recipient ~~email~~@pdl.jaylee.us subject "test message $newbase" message "GHA test message"
|
||||||
$gam csv sample.csv gam update group $newgroup add member ~email
|
$gam csv sample.csv gam update group $newgroup add member ~email
|
||||||
$gam info group $newgroup
|
$gam info group $newgroup
|
||||||
$gam info cigroup $newgroup membertree
|
$gam info cigroup $newgroup membertree
|
||||||
# confirm mailbox is provisoned before continuing
|
# confirm mailbox is provisoned before continuing
|
||||||
$gam user $newuser waitformailbox retries 20
|
$gam user $newuser waitformailbox retries 50
|
||||||
$gam user $newuser imap on
|
$gam user $newuser imap on
|
||||||
$gam user $newuser show imap
|
$gam user $newuser show imap
|
||||||
$gam user $newuser show delegates
|
$gam user $newuser show delegates
|
||||||
#$gam user $newuser add contactdelegate "${newbase}-bulkuser-1"
|
|
||||||
#$gam user $newuser print contactdelegates
|
|
||||||
export biohazard=$(echo -e '\xe2\x98\xa3')
|
export biohazard=$(echo -e '\xe2\x98\xa3')
|
||||||
$gam user $newuser label "$biohazard unicode biohazard $biohazard"
|
$gam user $newuser label "$biohazard unicode biohazard $biohazard"
|
||||||
$gam user $newuser show labels
|
$gam user $newuser show labels
|
||||||
$gam user $newuser show labels > labels.txt
|
$gam user $newuser show labels > labels.txt
|
||||||
$gam user $gam_user importemail subject "GHA import $newbase" message "This is a test import" labels IMPORTANT,UNREAD,INBOX,STARRED
|
$gam user $gam_user importemail subject "GHA import $newbase" message "This is a test import" labels IMPORTANT,UNREAD,INBOX,STARRED
|
||||||
$gam user $gam_user insertemail subject "GHA insert $newbase" file gam.py labels INBOX,UNREAD # yep body is gam code
|
$gam user $gam_user insertemail subject "GHA insert $newbase" file gam.py labels INBOX,UNREAD # yep body is gam code
|
||||||
$gam user $gam_user sendemail subject "GHA send $gam_user $newbase" file gam.py recipient admin@pdl.jaylee.us
|
$gam user $gam_user sendemail recipient admin@pdl.jaylee.us subject "GHA send $gam_user $newbase" file gam.py
|
||||||
$gam user $gam_user draftemail subject "GHA draft $newbase" message "Draft message test"
|
$gam user $gam_user draftemail subject "GHA draft $newbase" message "Draft message test"
|
||||||
$gam csvfile sample.csv:email waitformailbox retries 20
|
$gam csvfile sample.csv:email waitformailbox retries 20
|
||||||
$gam user $newuser delegate to "${newbase}-bulkuser-1" || if [ $? != 50 ]; then exit $?; fi # expect a 50 return code (delegation failed)
|
$gam user $newuser delegate to "${newbase}-bulkuser-1" || if [ $? != 50 ]; then exit $?; fi # expect a 50 return code (delegation failed)
|
||||||
@@ -891,7 +877,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
|
||||||
@@ -925,11 +911,11 @@ jobs:
|
|||||||
$gam user $newuser show holds || if [ $? != 55 ]; then exit $?; fi # expect a 55 return code
|
$gam user $newuser show holds || if [ $? != 55 ]; then exit $?; fi # expect a 55 return code
|
||||||
export sn="$JID$JID$JID$JID-$(openssl rand -base64 32 | sed 's/[^a-zA-Z0-9]//g')"
|
export sn="$JID$JID$JID$JID-$(openssl rand -base64 32 | sed 's/[^a-zA-Z0-9]//g')"
|
||||||
$gam create device serialnumber $sn devicetype android
|
$gam create device serialnumber $sn devicetype android
|
||||||
|
$gam delete contacts emailmatchpattern "^${newbase}@example.com$"
|
||||||
$gam config enable_dasa true save
|
$gam config enable_dasa true save
|
||||||
$gam print users query "gha.jid=$JID" | $gam csv - gam delete user ~primaryEmail || if [ $? != 50 ]; then exit $?; fi # expect a 50 return code (vault hold on user)
|
$gam print users query "gha.jid=$JID" | $gam csv - gam delete user ~primaryEmail || if [ $? != 50 ]; then exit $?; fi # expect a 50 return code (vault hold on user)
|
||||||
$gam delete contacts emailmatchpattern "^${newbase}@example.com$"
|
|
||||||
$gam print mobile
|
$gam print mobile
|
||||||
$gam print devices
|
$gam print devices clientstates
|
||||||
$gam print browsers
|
$gam print browsers
|
||||||
$gam print cros allfields orderby serialnumber
|
$gam print cros allfields orderby serialnumber
|
||||||
$gam show crostelemetry storagepercentonly
|
$gam show crostelemetry storagepercentonly
|
||||||
@@ -979,8 +965,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
|
||||||
@@ -993,8 +979,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
|
||||||
|
|||||||
7
.github/workflows/codeql-analysis.yml
vendored
7
.github/workflows/codeql-analysis.yml
vendored
@@ -13,10 +13,11 @@ name: "CodeQL"
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main ]
|
paths-ignore:
|
||||||
|
- 'wiki/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
# The branches below must be a subset of the branches above
|
paths-ignore:
|
||||||
branches: [ main ]
|
- 'wiki/**'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '25 10 * * 1'
|
- cron: '25 10 * * 1'
|
||||||
|
|
||||||
|
|||||||
24
.github/workflows/get-cacerts.yml
vendored
24
.github/workflows/get-cacerts.yml
vendored
@@ -2,7 +2,11 @@ name: Check for Google Root CA Updates
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
paths-ignore:
|
||||||
|
- 'wiki/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- 'wiki/**'
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '23 23 * * *'
|
- cron: '23 23 * * *'
|
||||||
|
|
||||||
@@ -20,8 +24,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: |
|
||||||
|
|||||||
43
.github/workflows/pushwiki.yml
vendored
Normal file
43
.github/workflows/pushwiki.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: Push wiki
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'wiki/**'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pushwiki:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout GAM source
|
||||||
|
run: |
|
||||||
|
# checkout via normal shell here
|
||||||
|
# so we're not authorized to actually make any changes
|
||||||
|
git clone https://github.com/GAM-team/GAM
|
||||||
|
|
||||||
|
- name: Checkout Wiki source
|
||||||
|
uses: actions/checkout@master
|
||||||
|
with:
|
||||||
|
path: GAM.wiki
|
||||||
|
repository: GAM-team/GAM.wiki
|
||||||
|
persist-credentials: true
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Overwrite all Wiki repo files with /wiki from main git
|
||||||
|
run: |
|
||||||
|
# remove all wiki repo files so deletes work
|
||||||
|
rm -fv GAM.wiki/*.md
|
||||||
|
# copy all files from main GAM repo wiki folder
|
||||||
|
cp -fv GAM/wiki/*.md GAM.wiki/
|
||||||
|
|
||||||
|
- name: Commit Wiki changes
|
||||||
|
run: |
|
||||||
|
cd GAM.wiki
|
||||||
|
git config --local user.email "action@github.com"
|
||||||
|
git config --local user.name "GitHub Action"
|
||||||
|
git add *.md
|
||||||
|
git commit -m "[no ci] Push Wiki changes"
|
||||||
|
git status
|
||||||
|
git push
|
||||||
35
.github/workflows/pypi.yml
vendored
Normal file
35
.github/workflows/pypi.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
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
|
||||||
|
with:
|
||||||
|
attestation: true
|
||||||
@@ -1,913 +0,0 @@
|
|||||||
# Administrators
|
|
||||||
- [Administrator roles documentation](#administrator-roles-documentation)
|
|
||||||
- [API documentation](#api-documentation)
|
|
||||||
- [Definitions](#definitions)
|
|
||||||
- [Display administrative privileges](#display-administrative-privileges)
|
|
||||||
- [Manage administrative roles](#manage-administrative-roles)
|
|
||||||
- [Display administrative roles](#display-administrative-roles)
|
|
||||||
- [Create an administrator](#create-an-administrator)
|
|
||||||
- [Delete an administrator](#delete-an-administrator)
|
|
||||||
- [Display administrators](#display-administrators)
|
|
||||||
- [Copy roles from one administrator to another](#copy-roles-from-one-administrator-to-another)
|
|
||||||
|
|
||||||
## Administrator roles documentation
|
|
||||||
* https://support.google.com/a/answer/33325?ref_topic=4514341
|
|
||||||
|
|
||||||
## API documentation
|
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/privileges
|
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/roles
|
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/roleAssignments
|
|
||||||
|
|
||||||
## Definitions
|
|
||||||
```
|
|
||||||
<DomainName> ::= <String>(.<String>)+
|
|
||||||
<EmailAddress> ::= <String>@<DomainName>
|
|
||||||
<GroupItem> ::= <EmailAddress>|<UniqueID>|<String>
|
|
||||||
<OrgUnitID> ::= id:<String>
|
|
||||||
<OrgUnitPath> ::= /|(/<String)+
|
|
||||||
<OrgUnitItem> ::= <OrgUnitID>|<OrgUnitPath>
|
|
||||||
<Privilege> ::= <String>
|
|
||||||
<PrivilegeList> ::= "<Privilege>(,<Privilege)*"
|
|
||||||
<RoleAssignmentID> ::= <String>
|
|
||||||
<RoleItem> ::= id:<String>|uid:<String>|<String>
|
|
||||||
<UniqueID> ::= id:<String>
|
|
||||||
<UserItem> ::= <EmailAddress>|<UniqueID>|<String>
|
|
||||||
```
|
|
||||||
## Display administrative privileges
|
|
||||||
```
|
|
||||||
gam print privileges [todrive <ToDriveAttribute>*]
|
|
||||||
gam show privileges
|
|
||||||
```
|
|
||||||
|
|
||||||
Here is the output from `gam show privileges`; use this to find `<Privilege>`.
|
|
||||||
```
|
|
||||||
Show 91 Privileges
|
|
||||||
Privilege: MANAGE_CSE_SETTINGS (1/91)
|
|
||||||
serviceId: 02pta16n4hxgyp2
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_PLAY_FOR_WORK_STORE (2/91)
|
|
||||||
serviceId: 00tyjcwt49hs5nq
|
|
||||||
serviceName: play_for_work
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_ENTERPRISE_PRIVATE_APPS (3/91)
|
|
||||||
serviceId: 00tyjcwt49hs5nq
|
|
||||||
serviceName: play_for_work
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_EXTERNALLY_HOSTED_APK_UPLOAD_IN_PLAY (4/91)
|
|
||||||
serviceId: 00tyjcwt49hs5nq
|
|
||||||
serviceName: play_for_work
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_PLAY_FOR_WORK_STORE (5/91)
|
|
||||||
serviceId: 02w5ecyt3pkeyqi
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_ENTERPRISE_PRIVATE_APPS (6/91)
|
|
||||||
serviceId: 02w5ecyt3pkeyqi
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_EXTERNALLY_HOSTED_APK_UPLOAD_IN_PLAY (7/91)
|
|
||||||
serviceId: 02w5ecyt3pkeyqi
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (8/91)
|
|
||||||
serviceId: 01ci93xb43sd8me
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: DELEGATES_READ (1/2)
|
|
||||||
serviceId: 01ci93xb43sd8me
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: DELEGATES_WRITE (2/2)
|
|
||||||
serviceId: 01ci93xb43sd8me
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: APP_ADMIN (9/91)
|
|
||||||
serviceId: 03cqmetx3hnlpuf
|
|
||||||
serviceName: gplus
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GPLUS_SQUARE_BATCH_ADD (10/91)
|
|
||||||
serviceId: 03cqmetx3hnlpuf
|
|
||||||
serviceName: gplus
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GPLUS_CONTENT_MANAGER_PRIVILEGE (11/91)
|
|
||||||
serviceId: 03cqmetx3hnlpuf
|
|
||||||
serviceName: gplus
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (12/91)
|
|
||||||
serviceId: 039kk8xu49mji9t
|
|
||||||
serviceName: gmail
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ACCESS_EMAIL_LOG_SEARCH (13/91)
|
|
||||||
serviceId: 039kk8xu49mji9t
|
|
||||||
serviceName: gmail
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ACCESS_ADMIN_QUARANTINE (14/91)
|
|
||||||
serviceId: 039kk8xu49mji9t
|
|
||||||
serviceName: gmail
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ACCESS_RESTRICTED_QUARANTINE (15/91)
|
|
||||||
serviceId: 039kk8xu49mji9t
|
|
||||||
serviceName: gmail
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (16/91)
|
|
||||||
serviceId: 01tuee744837sjz
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_COURSE_SETTINGS (17/91)
|
|
||||||
serviceId: 037m2jsg4g9nirj
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_LTI_CREDENTIAL_MANAGEMENT_MODE (18/91)
|
|
||||||
serviceId: 037m2jsg4g9nirj
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: APP_ADMIN (19/91)
|
|
||||||
serviceId: 01baon6m1wv6b0p
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (20/91)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 3
|
|
||||||
Privilege: DIRECTORY_SETTINGS_READONLY (1/3)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: PROFILE_EDITABILITY_READONLY (1/2)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: CUSTOM_DIRECTORY_READONLY (2/2)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: PROFILE_EDITABILITY_READWRITE (2/3)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: CUSTOM_DIRECTORY_READWRITE (3/3)
|
|
||||||
serviceId: 01yyy98l4k9lq4l
|
|
||||||
serviceName: directory
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: LDAP_MANAGER (21/91)
|
|
||||||
serviceId: 02lwamvv18la4iw
|
|
||||||
serviceName: ldap
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: LDAP_PASSWORD_REBIND (22/91)
|
|
||||||
serviceId: 02lwamvv18la4iw
|
|
||||||
serviceName: ldap
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: LDAP_PASSWORD_REBIND_READONLY
|
|
||||||
serviceId: 02lwamvv18la4iw
|
|
||||||
serviceName: ldap
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: APP_ADMIN (23/91)
|
|
||||||
serviceId: 0319y80a15kueje
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (24/91)
|
|
||||||
serviceId: 044sinio4cntx2o
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (25/91)
|
|
||||||
serviceId: 01ksv4uv2d2noaq
|
|
||||||
serviceName: sites
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ADMIN_DASHBOARD (26/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: SERVICES (27/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SECURITY_SETTINGS (28/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SUPPORT (29/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ADMIN_DOMAIN_SETTINGS (30/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: REPORTS (31/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ADMIN_DASHBOARD (32/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: SERVICES (33/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SUPPORT (34/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: REPORTS (35/91)
|
|
||||||
serviceId: 01ci93xb3tmzyin
|
|
||||||
serviceName: admin
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (36/91)
|
|
||||||
serviceId: 03fwokq01e2ht7x
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: UDM_NETWORK_ADMIN
|
|
||||||
serviceId: 03fwokq01e2ht7x
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: ADMIN_MATTER (37/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: REMOVE_HOLD (38/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_SEARCHES (39/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_EXPORTS (40/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_RETENTION_POLICY (41/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: VIEW_RETENTION_POLICY
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: AUDIT_SYSTEM (42/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ACCESS_ALL_MATTERS (43/91)
|
|
||||||
serviceId: 03l18frh45c63dw
|
|
||||||
serviceName: vault
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (44/91)
|
|
||||||
serviceId: 02afmg282jiquyg
|
|
||||||
serviceName: device_management
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (45/91)
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: CALENDAR_SETTINGS (1/2)
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: CALENDAR_SETTINGS_READ
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: CALENDAR_RESOURCE (2/2)
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: ROOM_INSIGHTS_DASHBOARD_ACCESS (1/2)
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: CALENDAR_RESOURCE_MANAGE (2/2)
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: CALENDAR_RESOURCE_READ
|
|
||||||
serviceId: 037m2jsg3ckz96v
|
|
||||||
serviceName: calendar
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (46/91)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 5
|
|
||||||
Privilege: DOCS_TEMPLATE_ADMIN (1/5)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MIGRATE_TO_TEAM_DRIVE (2/5)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: WRITE_APPS_METADATA_SCHEMAS (3/5)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: VIEW_SITE_DETAILS (4/5)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_CLASSIC_GOOGLE_SITES (5/5)
|
|
||||||
serviceId: 03dy6vkm2sk0pzo
|
|
||||||
serviceName: docs
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ACCESS (47/91)
|
|
||||||
serviceId: 03cqmetx1vygwki
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ORGANIZATION_UNITS_ALL (48/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 4
|
|
||||||
Privilege: ORGANIZATION_UNITS_CREATE (1/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: ORGANIZATION_UNITS_RETRIEVE (2/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: ORGANIZATION_UNITS_UPDATE (3/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: ORGANIZATION_UNITS_DELETE (4/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_ALL (49/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 5
|
|
||||||
Privilege: USERS_CREATE (1/5)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_RETRIEVE (2/5)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_UPDATE (3/5)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 6
|
|
||||||
Privilege: USERS_ALIAS (1/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_MOVE (2/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_RESET_PASSWORD (3/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_FORCE_PASSWORD_CHANGE (4/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_ADD_NICKNAME (5/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_SUSPEND (6/6)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_UPDATE_CUSTOM_ATTRIBUTES_USER_PRIVILEGE_GROUP (4/5)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: USERS_DELETE (5/5)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: GROUPS_ALL (50/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 4
|
|
||||||
Privilege: GROUPS_CREATE (1/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GROUPS_RETRIEVE (2/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GROUPS_UPDATE (3/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GROUPS_DELETE (4/4)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: USER_SECURITY_ALL (51/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: DATATRANSFER_API_PRIVILEGE_GROUP (52/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: DOMAIN_REGISTRATION_MANAGEMENT (53/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SCHEMA_MANAGEMENT (54/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: SCHEMA_RETRIEVE
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: LICENSING (55/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: LICENSING_READ
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: BILLING (56/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: BILLING_READ
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SAML2_SERVICE_PROVIDER (57/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: DOMAIN_MANAGEMENT (58/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: UPGRADE_CONSUMER_CONVERSION (59/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: TRUSTED_DOMAIN_WHITELIST_WRITE (60/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: TRUSTED_DOMAIN_WHITELIST_READ
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: FULL_MIGRATION_ACCESS (61/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: EXECUTE_MIGRATION
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: MODIFY_MIGRATION
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: VIEW_MIGRATION
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GROUPS_MANAGE_SECURITY_LABEL (62/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: GROUPS_MANAGE_LOCKED_LABEL (63/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: ADMIN_REPORTING_ACCESS (64/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: REPORTING_AUDIT_ACCESS
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SUPPORT_PRIVILEGE_GROUP (65/91)
|
|
||||||
serviceId: 00haapch16h1ysv
|
|
||||||
serviceName: admin_apis
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APPS_INCIDENTS_FULL_ACCESS (66/91)
|
|
||||||
serviceId: 02pta16n3efhw69
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: APPS_INCIDENTS_READONLY (1/2)
|
|
||||||
serviceId: 02pta16n3efhw69
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APPS_INCIDENTS_VIEW_VIRUSTOTAL_REPORTS (2/2)
|
|
||||||
serviceId: 02pta16n3efhw69
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (67/91)
|
|
||||||
serviceId: 019c6y1840fzfkt
|
|
||||||
serviceName: classroom
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: ADMIN_OVERSIGHT_MANAGE_CLASSES (68/91)
|
|
||||||
serviceId: 019c6y1840fzfkt
|
|
||||||
serviceName: classroom
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: EDU_ANALYTICS_DATA_ACCESS (69/91)
|
|
||||||
serviceId: 019c6y1840fzfkt
|
|
||||||
serviceName: classroom
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: APP_ADMIN (70/91)
|
|
||||||
serviceId: 037m2jsg46www3g
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_DYNAMITE_SETTINGS (71/91)
|
|
||||||
serviceId: 03whwml44f3n4vd
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MODERATE_DYNAMITE_REPORT (72/91)
|
|
||||||
serviceId: 03whwml44f3n4vd
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_DYNAMITE_SPACES (73/91)
|
|
||||||
serviceId: 03whwml44f3n4vd
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (74/91)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 6
|
|
||||||
Privilege: MANAGE_CHROME_USER_SETTINGS (1/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: MANAGE_CHROME_APPLICATION_SETTINGS (1/2)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_CHROME_WEB_SETTINGS (2/2)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_CHROME_BROWSERS (2/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: MANAGED_CHROME_BROWSERS_READ_ONLY
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_CHROME_REPORTS (3/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 4
|
|
||||||
Privilege: VIEW_CHROME_EXTENSIONS_REPORT (1/4)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_CHROME_VERSION_REPORT (2/4)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_CHROME_INSIGHTS_REPORT (3/4)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_CHROME_PRINTERS_REPORT (4/4)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_PRINTERS (4/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_DEVICES (5/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 2
|
|
||||||
Privilege: MANAGE_DEVICES_READ_ONLY (1/2)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: TELEMETRY_API
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 19
|
|
||||||
Privilege: TELEMETRY_API_DEVICE (1/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_USER (2/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_AUDIO_REPORT (3/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_BUS_DEVICE_INFO (4/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_OS_REPORT (5/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_CPU_INFO (6/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_CPU_REPORT (7/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_MEMORY_INFO (8/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_MEMORY_REPORT (9/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_GRAPHICS_INFO (10/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_GRAPHICS_REPORT (11/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_BATTERY_INFO (12/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_BATTERY_REPORT (13/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_STORAGE_INFO (14/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_STORAGE_REPORT (15/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_NETWORK_INFO (16/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_NETWORK_REPORT (17/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_DEVICE_ACTIVITY_REPORT (18/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: TELEMETRY_API_PERIPHERALS_REPORT (19/19)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: DEVICE_ACTION_CRD (2/2)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_DEVICE_SETTINGS (6/6)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: SERVICE_DATA_DOWNLOADER (75/91)
|
|
||||||
serviceId: 03hv69ve4bjwe54
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_DIRECTORY_SYNC_SETTINGS (76/91)
|
|
||||||
serviceId: 0147n2zr1ynkkmf
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: READ_DIRECTORY_SYNC_SETTINGS
|
|
||||||
serviceId: 0147n2zr1ynkkmf
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (77/91)
|
|
||||||
serviceId: 0279ka651l5iy5q
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: ADMIN_QUALITY_DASHBOARD_ACCESS
|
|
||||||
serviceId: 0279ka651l5iy5q
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: SECURITY_SETTINGS (78/91)
|
|
||||||
serviceId: 00vx122734tbite
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: INBOUND_SSO_SETTINGS
|
|
||||||
serviceId: 00vx122734tbite
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: VIEW_DLP_RULE (79/91)
|
|
||||||
serviceId: 02250f4o3hg8pg8
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_DLP_RULE (80/91)
|
|
||||||
serviceId: 02250f4o3hg8pg8
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (81/91)
|
|
||||||
serviceId: 00nmf14n14wtgcf
|
|
||||||
serviceName: app_maker
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: VIEW_ALL_PROJECTS (82/91)
|
|
||||||
serviceId: 00nmf14n14wtgcf
|
|
||||||
serviceName: app_maker
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (83/91)
|
|
||||||
serviceId: 02zbgiuw2wdxo5p
|
|
||||||
serviceName: youtube
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (84/91)
|
|
||||||
serviceId: 03as4poj2zjehv7
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (85/91)
|
|
||||||
serviceId: 02afmg283v5nmx6
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: ADMIN_QUALITY_DASHBOARD_ACCESS
|
|
||||||
serviceId: 02afmg283v5nmx6
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (86/91)
|
|
||||||
serviceId: 00upglbi0qz687j
|
|
||||||
serviceName: takeout
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: CLOUD_PRINT_MANAGER (87/91)
|
|
||||||
serviceId: 02bn6wsx379ol8g
|
|
||||||
serviceName: cloud_print
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: MANAGE_AGE_BASED_ACCESS_SETTINGS_AGE_LABEL (88/91)
|
|
||||||
serviceId: 046r0co22dnadsi
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: AGE_BASED_ACCESS_SETTINGS_AGE_LABEL_READ
|
|
||||||
serviceId: 046r0co22dnadsi
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: LOGO_PRIVILEGE_GROUP (89/91)
|
|
||||||
serviceId: 03j2qqm31d4j55e
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: False
|
|
||||||
Privilege: APP_ADMIN (90/91)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 7
|
|
||||||
Privilege: MANAGE_DEVICES (1/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_USER_SETTINGS (2/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
childPrivileges: 1
|
|
||||||
Privilege: MANAGE_APPLICATION_SETTINGS
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_DEVICE_SETTINGS (3/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_BROWSERS (4/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_EXTENSIONS_REPORT (5/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: VIEW_VERSION_REPORT (6/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: MANAGE_PRINTERS (7/7)
|
|
||||||
serviceId: 04f1mdlm0ki64aw
|
|
||||||
serviceName: cros
|
|
||||||
isOuScopable: True
|
|
||||||
Privilege: APP_ADMIN (91/91)
|
|
||||||
serviceId: 02et92p02l9sq0n
|
|
||||||
serviceName: Unknown
|
|
||||||
isOuScopable: True
|
|
||||||
```
|
|
||||||
|
|
||||||
## Manage administrative roles
|
|
||||||
```
|
|
||||||
gam create adminrole <String> privileges all|all_ou|<PrivilegeList> [description <String>]
|
|
||||||
gam update adminrole <RoleItem> [name <String>] [privileges all|all_ou|<PrivilegeList>] [description <String>]
|
|
||||||
gam delete adminrole <RoleItem>
|
|
||||||
```
|
|
||||||
* `privileges all` - All defined privileges
|
|
||||||
* `privileges all_ou` - All defined privileges than can be scoped to an OU
|
|
||||||
* `privileges <PrivilegeList>` - A specific list of privileges
|
|
||||||
|
|
||||||
## Display administrative roles
|
|
||||||
```
|
|
||||||
gam info adminrole <RoleItem> [privileges]
|
|
||||||
gam print adminroles|roles [todrive <ToDriveAttribute>*]
|
|
||||||
[privileges] [oneitemperrow]
|
|
||||||
gam show adminroles|roles [todrive <ToDriveAttribute>*] [privileges]
|
|
||||||
```
|
|
||||||
* `privileges` - Display privileges associated with each role
|
|
||||||
|
|
||||||
By default, all privileges for a role are shown on one row as a repeating item.
|
|
||||||
When `oneitemperrow` is specified, each privilege is output on a separate row/line with the other role fields.
|
|
||||||
|
|
||||||
## Create an administrator
|
|
||||||
Add an administrator role to an administrator.
|
|
||||||
```
|
|
||||||
gam create admin <EmailAddress>|<UniqueID> <RoleItem> customer|(org_unit <OrgUnitItem>)
|
|
||||||
[condition securitygroup|nonsecuritygroup]
|
|
||||||
```
|
|
||||||
* `customer` - The administrator can manage all organization units
|
|
||||||
* `org_unit <OrgUnitItem>` - The administrator can manage the specified organization unit
|
|
||||||
|
|
||||||
The option `condition` limits the conditions for delegate admin access. This currently only works with the _GROUPS_EDITOR_ROLE and _GROUPS_READER_ROLE roles.
|
|
||||||
* `condition securitygroup` - limit the delegated admin to managing security groups
|
|
||||||
* `condition nonsecuritygroup` - limit the delegated admin to managing non-security groups
|
|
||||||
|
|
||||||
## Delete an administrator
|
|
||||||
Remove an administrator role from an administrator.
|
|
||||||
```
|
|
||||||
gam delete admin <RoleAssignmentId>
|
|
||||||
```
|
|
||||||
## Display administrators
|
|
||||||
```
|
|
||||||
gam print admins [todrive <ToDriveAttribute>*]
|
|
||||||
[user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition]
|
|
||||||
[privileges] [oneitemperrow]
|
|
||||||
gam show admins
|
|
||||||
[user|group <EmailAddress>|<UniqueID>] [role <RoleItem>] [condition] [privileges]
|
|
||||||
```
|
|
||||||
By default, all administrators and roles are displayed; choose from the following
|
|
||||||
options to limit the display:
|
|
||||||
* `user <UserItem>` - Display only this administrator
|
|
||||||
* `role <RoleItem>` - Display only administrators with this role
|
|
||||||
|
|
||||||
* `condition` - Display any conditions associated with a role assignment
|
|
||||||
* `privileges` - Display privileges associated with each role assignment
|
|
||||||
|
|
||||||
By default, all role privileges for an admin are shown on one row as a repeating item.
|
|
||||||
When `oneitemperrow` is specified, each role privilege is output on a separate row/line with the other admin fields.
|
|
||||||
|
|
||||||
In versions prior to 6.07.01, specification of both `user <UserItem>`
|
|
||||||
and `role <RoleItem>` generated no output due to an undocumented API rule that disallows both.
|
|
||||||
|
|
||||||
## Copy roles from one administrator to another
|
|
||||||
Get roles for current admin.
|
|
||||||
```
|
|
||||||
gam redirect csv ./CurrentAdminRoles.csv print admins user currentadmin@domain.com
|
|
||||||
```
|
|
||||||
Add roles to new admin.
|
|
||||||
```
|
|
||||||
gam config csv_input_row_filter "scopeType:regex:CUSTOMER" redirect stdout ./UpdateNewAdminCustomerRoles.txt multiprocess redirect stderr stdout csv CurrentAdminRoles.csv gam create admin newadmin@domain.com "id:~~roleId~~" customer
|
|
||||||
gam config csv_input_row_filter "scopeType:regex:ORG_UNIT" redirect stdout ./UpdateNewAdminOrgUnitRoles.txt multiprocess redirect stderr stdout csv CurrentAdminRoles.csv gam create admin newadmin@domain.com "id:~~roleId~~" org_unit "id:~~orgUnitId~~"
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
# Downloads-Installs
|
|
||||||
You can download and install the current GAM7 release from the [GitHub Releases](https://github.com/taers232c/GAMADV-XTD3/releases) page. Choose one of the following:
|
|
||||||
|
|
||||||
* Executable Archive, Automatic, Linux/Mac OS/Google Cloud Shell/Raspberry Pi/ChromeOS
|
|
||||||
- Start a terminal session and execute one of the following commands:
|
|
||||||
- New install, default path `$HOME/bin`
|
|
||||||
- `bash <(curl -s -S -L https://raw.githubusercontent.com/taers232c/GAMADV-XTD3/master/src/gam-install.sh)`
|
|
||||||
- New install, specify a path
|
|
||||||
- `bash <(curl -s -S -L https://raw.githubusercontent.com/taers232c/GAMADV-XTD3/master/src/gam-install.sh) -d <Path>`
|
|
||||||
- Update to latest version, do not create project or authorizations, default path `$HOME/bin`
|
|
||||||
- `bash <(curl -s -S -L https://raw.githubusercontent.com/taers232c/GAMADV-XTD3/master/src/gam-install.sh) -l`
|
|
||||||
- Update to latest version, do not create project or authorizations, specify a path
|
|
||||||
- `bash <(curl -s -S -L https://raw.githubusercontent.com/taers232c/GAMADV-XTD3/master/src/gam-install.sh) -l -d <Path>`
|
|
||||||
|
|
||||||
By default, a folder, `gamadv-xtd3`, is created in the default or specified path and the files are downloaded into that folder.
|
|
||||||
Add the `-s` option to the end of the above commands to suppress creating the `gamadv-xtd3` folder; the files are downloaded directly into the default or specified path.
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Linux/Google Cloud Shell
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.35.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.31.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.27.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.23.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-glibc2.19.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-x86_64-legacy.tar.xz`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a terminal session.
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Raspberry Pi/ChromeOS ARM devices
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.31.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.27.tar.xz`
|
|
||||||
- `gamadv-xtd3-6.wx.yz-linux-arm64-glibc2.23.tar.xz`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a terminal session.
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Mac OS versions Big Sur, Monterey, Ventura - M1/M2
|
|
||||||
- `gamadv-xtd3-6.wx.yz-macos-arm64.tar.xz`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a terminal session.
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Mac OS, versions Big Sur, Monterey, Ventura - Intel
|
|
||||||
- `gamadv-xtd3-6.wx.yz-macos-x86_64.tar.xz`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a terminal session.
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Windows 64 bit
|
|
||||||
- `gamadv-xtd3-6.wx.yz-windows-x86_64.zip`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a Command Prompt/PowerShell session.
|
|
||||||
|
|
||||||
* Executable Installer, Manual, Windows 64 bit
|
|
||||||
- `gamadv-xtd3-6.wx.yz-windows-x86_64.msi`
|
|
||||||
- Download the installer and run it.
|
|
||||||
- Start a Command Prompt/PowerShell session.
|
|
||||||
|
|
||||||
* Winget
|
|
||||||
- `winget install taers232c.GAMADV-XTD3 --location C:\GAMADV-XTD3`
|
|
||||||
- Specify an alternate location if desired
|
|
||||||
- Start a Command Prompt/PowerShell session.
|
|
||||||
|
|
||||||
* Source, all platforms
|
|
||||||
- `Source code(zip)`
|
|
||||||
- `Source code(tar.gz)`
|
|
||||||
- Download the archive, extract the contents into some directory.
|
|
||||||
- Start a terminal/Command Prompt/PowerShell session.
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
All Google Drive API calls have been converted from v2 to v3, see: https://developers.google.com/drive/v3/web/migration
|
|
||||||
Many of the changes are internal to Gam and have no visible effect. Google has modified/renamed many field names and these will affect scripts that parse the output from `gam print/show drivesettings/drivefileacls/fileinfo/filelist/filerevisions`. Additionally, Google has dropped some fields and their values are no longer available. On input, Gam accepts both the old and new field names.
|
|
||||||
|
|
||||||
A variable, `drive_v3_native_names` (default value is True), has been added to `gam.cfg` to control the field names on output: when True, the v3 native field names are used; when False, the v3 native field names are mapped to the v2 field names.
|
|
||||||
|
|
||||||
If you have scripts that process the output from these print commands, you may have to make modifications to your scripts.
|
|
||||||
Run your print/show commands with a version of Legacy Gam and save the output.
|
|
||||||
With drive_v3_native_names = False, run your print/show commands with this version of Gam and compare the output to that saved in the previous run;
|
|
||||||
modify your scripts that process the output as appropriate.
|
|
||||||
|
|
||||||
There is a cost to mapping the v3 field names back to the v2 field names; you can avoid this cost by setting drive_v3_native_names = True,
|
|
||||||
running your print/show commands, comparing the output and making the appropriate script modifications.
|
|
||||||
```
|
|
||||||
print/show drivesettings
|
|
||||||
Dropped fields:
|
|
||||||
DRIVE
|
|
||||||
GMAIL
|
|
||||||
PHOTOS
|
|
||||||
domainSharingPolicy
|
|
||||||
lauguageCode
|
|
||||||
Renamed fields (Old->New):
|
|
||||||
name->displayName,
|
|
||||||
quotaBytesTotal->limit
|
|
||||||
quotaBytesUsed->usageInDrive
|
|
||||||
quotaBytesUsedAggregate->usage
|
|
||||||
quotaBytesUsedInTrash->usageInDriveTrash
|
|
||||||
|
|
||||||
print/show drivefileacls
|
|
||||||
Dropped fields:
|
|
||||||
authKey
|
|
||||||
Renamed fields (Old->New):
|
|
||||||
name->displayName
|
|
||||||
withLink->allowFileDiscovery
|
|
||||||
|
|
||||||
print/show fileinfo/filelist
|
|
||||||
Dropped fields:
|
|
||||||
defaultOpenWithLink
|
|
||||||
embedLink
|
|
||||||
exportLinks
|
|
||||||
labels(hidden)
|
|
||||||
markedViewedByMeDate
|
|
||||||
openWithLinks
|
|
||||||
selfLink
|
|
||||||
parents(isRoot)
|
|
||||||
parents(parentLink)
|
|
||||||
parents(selfLink)
|
|
||||||
permissions(selfLink)
|
|
||||||
selfLink
|
|
||||||
userPermission(selfLink)
|
|
||||||
Renamed fields (Old->New):
|
|
||||||
alternateLink->webViewLink
|
|
||||||
capabilities(canChangeRestrictedDownload)->capabilities(canChangeViewersCanCopyContent)
|
|
||||||
createdDate->createdTime
|
|
||||||
expirationDate->expirationTime
|
|
||||||
fileSize->size
|
|
||||||
lastViewedByMeDate->viewedByMeTime
|
|
||||||
modified->modifiedByMe
|
|
||||||
modifiedByMeDate->modifiedByMeTime
|
|
||||||
modifiedDate->modifiedTime
|
|
||||||
restricted->viewersCanCopyContent
|
|
||||||
sharedWithMeDate->sharedWithMeTime
|
|
||||||
title->name
|
|
||||||
trashedDate->trashedTime
|
|
||||||
viewed->viewedByMe
|
|
||||||
withLink->allowFileDiscovery
|
|
||||||
|
|
||||||
print/show filerevisions
|
|
||||||
Dropped fields:
|
|
||||||
exportLinks
|
|
||||||
publishedLink
|
|
||||||
selfLink
|
|
||||||
Renamed fields (Old->New):
|
|
||||||
fileSize->size
|
|
||||||
isAuthenticatedUser->me
|
|
||||||
modifiedDate->modifiedTie
|
|
||||||
picture.url->photoLink
|
|
||||||
pinned->keepForever
|
|
||||||
```
|
|
||||||
The parents field of a file has undergone the most change. In Drive v2 it was a list of compound items with three sub-fields per item: id, isRoot, parentLink.
|
|
||||||
In Drive v3 the parents field is a list of simple items, the parent ids. The following examples show how the parents field is output in a CSV file for a file with two parents.
|
|
||||||
```
|
|
||||||
Previous versions of Gam:
|
|
||||||
Owner,title,parents,parents.0.isRoot,parents.0.id,parents.0.parentLink,parents.1.isRoot,parents.1.id,parents.1.parentLink
|
|
||||||
testuser@domain.com,TestFile,2,True,PPPP1111,https://www.googleapis.com/drive/v2/files/PPPP1111,False,PPPP2222,https://www.googleapis.com/drive/v2/files/PPPP2222
|
|
||||||
|
|
||||||
Current version of Gam with drive_v3_name_names = false
|
|
||||||
Owner,title,parents,parents.0.id,parents.1.id
|
|
||||||
testuser@domain.com,TestFile,2,PPPP1111,PPPP2222
|
|
||||||
|
|
||||||
Current version of Gam with drive_v3_name_names = true
|
|
||||||
Owner,name,parents
|
|
||||||
testuser@domain.com,TestFile,PPPP1111 PPPP2222
|
|
||||||
```
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# GAMADV-XTD3 on Android Devices
|
|
||||||
GAMADV-XTD3 now runs on 64-bit Android devices such as Google's Pixel phones. The installation requires an app that adds the Linux environment to Android such as [UserLAnd](https://play.google.com/store/apps/details?id=tech.ula&hl=en_US).
|
|
||||||
|
|
||||||
_Note: Chromebooks / Chrome OS devices should install GAMADV-XTD3 using [these instructions](GAMADV-XTD3-on-Chrome-OS-Devices)._
|
|
||||||
|
|
||||||
1. Install the [UserLAnd](https://play.google.com/store/apps/details?id=tech.ula&hl=en_US) app.
|
|
||||||
2. Click Debian to install a Debian environment.
|
|
||||||
3. Set a username and password.
|
|
||||||
4. Choose SSH for connection type.
|
|
||||||
5. Once setup, login with the password to get to a Linux shell.
|
|
||||||
6. Run the following commands to install prerequisites:
|
|
||||||
```
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install curl python3
|
|
||||||
```
|
|
||||||
7. [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# GAMADV-XTD3 on Chrome OS Devices
|
|
||||||
Chrome OS devices that [support Linux apps](https://support.google.com/chromebook/answer/9145439?hl=en) can run GAMADV-XTD3. This includes Intel/AMD x86_64 Chromebooks as well as ARM-based Chromebooks with Mediatek or Rockchip 64-bit CPUs.
|
|
||||||
|
|
||||||
1. [Set up Linux on your Chromebook](https://support.google.com/chromebook/answer/9145439?hl=en).
|
|
||||||
1. From the Terminal app, run the following commands:
|
|
||||||
```
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install xz-utils
|
|
||||||
```
|
|
||||||
3. [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
|
||||||
|
|
||||||
# Google cloud shell
|
|
||||||
|
|
||||||
Note that from a Chrome OS device, it might be just as easy to use [Google Cloud Shell](https://cloud.google.com/shell). Especially if you are concerned about network connectivity and/or bandwidth, using a shell instance within Google's server infrastructure is always going to be less resource intensive than sending data back and forth between a Google API and your local machine on your local network.
|
|
||||||
61
docs/Home.md
61
docs/Home.md
@@ -1,61 +0,0 @@
|
|||||||
- [Introduction](#introduction)
|
|
||||||
- [Requirements](#requirements)
|
|
||||||
- [Installation - First time GAM7 installation](#installation---first-time-gam7-installation)
|
|
||||||
- [Installation - Upgrading from Legacy GAM](#installation---upgrading-from-legacy-gam)
|
|
||||||
|
|
||||||
# Introduction
|
|
||||||
GAM7 is a free, open source command line tool for Google Workspace Administrators to manage domain and user settings quickly and easily.
|
|
||||||
|
|
||||||
This page provides simple instructions for downloading, installing and starting to use GAM7.
|
|
||||||
|
|
||||||
GAM7 requires paid, or Education/Non-profit, editions of Google Workspace. G Suite Legacy Free Edition has limited API support and not all GAM commands work.
|
|
||||||
|
|
||||||
GAM7 is a rewrite/extension of Jay Lee's [Legacy GAM], without his efforts, this version wouldn't exist.
|
|
||||||
|
|
||||||
GAM7 is backwards compatible with [Legacy GAM], meaning that if your command works with Legacy GAM, it will also work with GAM7. There may be differences in output, but the syntax is compatible.
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
Documentation for GAM7 is hosted in the [GitHub GAM7 Wiki] and in Gam*.txt files.
|
|
||||||
Legacy GAM documentation is hosted in the [GitHub Legacy Wiki].
|
|
||||||
|
|
||||||
# Mailing List / Discussion group
|
|
||||||
The GAM mailing list / discussion group is hosted on [Google Groups]. You can join the list and interact via email, or just post from the web itself.
|
|
||||||
|
|
||||||
# Source Repository
|
|
||||||
The official GAM7 source repository is on [GitHub] in the master branch.
|
|
||||||
|
|
||||||
# Author
|
|
||||||
GAM7 is maintained by <a href="mailto:ross.scroggs@gmail.com">Ross Scroggs</a>.
|
|
||||||
|
|
||||||
# Requirements
|
|
||||||
To run all commands properly, GAM7 requires three things:
|
|
||||||
* An API project which identifies your install of GAM7 to Google and keeps track of API quotas.
|
|
||||||
* Authorization to act as your Google Workspace Administrator in order to perform management functions like add users, modify group settings and membership and pull domain reports.
|
|
||||||
* A special service account that is authorized to act on behalf of your users in order to modify user-specific settings and data such as Drive files, Calendars and Gmail messages and settings like signatures.
|
|
||||||
|
|
||||||
# Installation - First time GAM7 installation
|
|
||||||
Use these steps if you have never used any version of GAM in your domain. They will create a GAM project
|
|
||||||
and all necessary authentications.
|
|
||||||
|
|
||||||
* Download: [Downloads-Installs](Downloads-Installs)
|
|
||||||
* Configuration: [GAM7 Configuration](gam.cfg)
|
|
||||||
* Install: [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
|
||||||
|
|
||||||
# Installation - Upgrading from Legacy GAM
|
|
||||||
Use these steps if you have used any version of Legacy GAM in your domain. They will update your GAM project
|
|
||||||
and all necessary authentications.
|
|
||||||
|
|
||||||
* Download: [Downloads-Installs](Downloads-Installs)
|
|
||||||
* Configuration: [GAM7 Configuration](gam.cfg)
|
|
||||||
* Upgrade: [How to Upgrade from Legacy GAM](How-to-Upgrade-from-Legacy-GAM)
|
|
||||||
|
|
||||||
You can install multiple versions of GAM and GAM7 in different parallel directories.
|
|
||||||
|
|
||||||
[Legacy GAM]: https://github.com/GAM-team/GAM/releases?q=6.58&expanded=true
|
|
||||||
[GAM7]: https://github.com/GAM-team/GAM
|
|
||||||
[GitHub Releases]: https://github.com/GAM-team/GAM/releases
|
|
||||||
[GitHub]: https://github.com/GAM-team/GAM/tree/master
|
|
||||||
[GitHub Legacy Wiki]: https://github.com/GAM-team/GAM/wiki/
|
|
||||||
[GitHub GAM7 Wiki]: https://github.com/taers232c/GAMADV-XTD3/wiki/
|
|
||||||
[Google Groups]: https://groups.google.com/group/google-apps-manager
|
|
||||||
[GAM Updates]: https://github.com/taers232c/GAMADV-XTD3/wiki/GamUpdates
|
|
||||||
@@ -1,938 +0,0 @@
|
|||||||
# Installing GAMADV-XTD3
|
|
||||||
Use these steps if you have never used any version of GAM in your domain. They will create your GAM project
|
|
||||||
and all necessary authentications.
|
|
||||||
|
|
||||||
- [Downloads-Installs](Downloads-Installs)
|
|
||||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
|
||||||
- [Windows](#windows)
|
|
||||||
- [GAM Configuration](gam.cfg)
|
|
||||||
|
|
||||||
## Linux and MacOS and Google Cloud Shell
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
In these examples, the user home folder is shown as /Users/admin; adjust according to your
|
|
||||||
specific situation; e.g., /home/administrator.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in /Users/admin/bin/gamadv-xtd3.
|
|
||||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
### Set a configuration directory
|
|
||||||
|
|
||||||
The default GAM configuration directory is /Users/admin/.gam; for more flexibility you
|
|
||||||
probably want to select a non-hidden location. This example assumes that the GAM
|
|
||||||
configuration directory will be /Users/admin/GAMConfig; If you've chosen another directory,
|
|
||||||
substitute that value in the directions.
|
|
||||||
|
|
||||||
Make the directory:
|
|
||||||
```
|
|
||||||
mkdir -p /Users/admin/GAMConfig
|
|
||||||
```
|
|
||||||
|
|
||||||
Add the following line:
|
|
||||||
```
|
|
||||||
export GAMCFGDIR="/Users/admin/GAMConfig"
|
|
||||||
```
|
|
||||||
to one of these files based on your shell:
|
|
||||||
```
|
|
||||||
~/.bash_profile
|
|
||||||
~/.bashrc
|
|
||||||
~/.zshrc
|
|
||||||
~/.profile
|
|
||||||
```
|
|
||||||
|
|
||||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
|
||||||
```
|
|
||||||
source <Filename>
|
|
||||||
```
|
|
||||||
|
|
||||||
You need to make sure the GAM configuration directory actually exists. Test that like this:
|
|
||||||
```
|
|
||||||
ls -l $GAMCFGDIR
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set a working directory
|
|
||||||
|
|
||||||
You should establish a GAM working directory; you will store your GAM related
|
|
||||||
data in this folder and execute GAM commands from this folder. You should not use
|
|
||||||
/Users/admin/bin/gamadv-xtd3 or /Users/admin/GAMConfig for this purpose.
|
|
||||||
This example assumes that the GAM working directory will be /Users/admin/GAMWork; If you've chosen
|
|
||||||
another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
Make the directory:
|
|
||||||
```
|
|
||||||
mkdir -p /Users/admin/GAMWork
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set an alias
|
|
||||||
You should set an alias to point to /Users/admin/bin/gamadv-xtd3/gam so you can operate from the /Users/admin/GAMWork directory.
|
|
||||||
Aliases aren't available in scripts, so you may want to set a symlink instead, see below.
|
|
||||||
|
|
||||||
Add the following line:
|
|
||||||
```
|
|
||||||
alias gam="/Users/admin/bin/gamadv-xtd3/gam"
|
|
||||||
```
|
|
||||||
to one of these files based on your shell:
|
|
||||||
```
|
|
||||||
~/.bash_aliases
|
|
||||||
~/.bash_profile
|
|
||||||
~/.bashrc
|
|
||||||
~/.zshrc
|
|
||||||
~/.profile
|
|
||||||
```
|
|
||||||
|
|
||||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
|
||||||
```
|
|
||||||
source <Filename>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set a symlink
|
|
||||||
Set a symlink in `/usr/local/bin` (or some other location on $PATH) to point to GAM.
|
|
||||||
```
|
|
||||||
ln -s "/Users/admin/bin/gamadv-xtd3/gam" /usr/local/bin/gam
|
|
||||||
```
|
|
||||||
|
|
||||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam config drive_dir /Users/admin/GAMWork verify
|
|
||||||
Created: /Users/admin/GAMConfig
|
|
||||||
Created: /Users/admin/GAMConfig/gamcache
|
|
||||||
Config File: /Users/admin/GAMConfig/gam.cfg, Initialized
|
|
||||||
Section: DEFAULT
|
|
||||||
...
|
|
||||||
cache_dir = /Users/admin/GAMConfig/gamcache
|
|
||||||
...
|
|
||||||
config_dir = /Users/admin/GAMConfig
|
|
||||||
...
|
|
||||||
drive_dir = /Users/admin/GAMWork
|
|
||||||
...
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Verify initialization, this was a successful installation.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ ls -l $GAMCFGDIR
|
|
||||||
total 48
|
|
||||||
-rw-r-----+ 1 admin staff 1069 Mar 3 09:23 gam.cfg
|
|
||||||
drwxr-x---+ 2 admin staff 68 Mar 3 09:23 gamcache
|
|
||||||
-rw-rw-rw-+ 1 admin staff 0 Mar 3 09:23 oauth2.txt.lock
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Create your project with local browser
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam create project
|
|
||||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: client_secrets_json, Value: /Users/admin/GAMConfig/client_secrets.json, Not Found
|
|
||||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: oauth2service_json, Value: /Users/admin/GAMConfig/oauth2service.json, Not Found
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?client_id=CLI...response_type=code
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Creating project "GAM Project"...
|
|
||||||
Checking project status...
|
|
||||||
Project: gam-project-abc-def-ghi, Enable 23 APIs
|
|
||||||
API: admin.googleapis.com, Enabled (1/23)
|
|
||||||
API: alertcenter.googleapis.com, Enabled (2/23)
|
|
||||||
API: appsactivity.googleapis.com, Enabled (3/23)
|
|
||||||
API: audit.googleapis.com, Enabled (4/23)
|
|
||||||
API: calendar-json.googleapis.com, Enabled (5/23)
|
|
||||||
API: chat.googleapis.com, Enabled (6/23)
|
|
||||||
API: classroom.googleapis.com, Enabled (7/23)
|
|
||||||
API: contacts.googleapis.com, Enabled (8/23)
|
|
||||||
API: drive.googleapis.com, Enabled (9/23)
|
|
||||||
API: driveactivity.googleapis.com, Enabled (10/23)
|
|
||||||
API: gmail.googleapis.com, Enabled (11/23)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (12/23)
|
|
||||||
API: groupssettings.googleapis.com, Enabled (13/23)
|
|
||||||
API: iam.googleapis.com, Enabled (14/23)
|
|
||||||
API: iap.googleapis.com, Enabled (15/23)
|
|
||||||
API: licensing.googleapis.com, Enabled (16/23)
|
|
||||||
API: people.googleapis.com, Enabled (17/23)
|
|
||||||
API: pubsub.googleapis.com, Enabled (18/23)
|
|
||||||
API: reseller.googleapis.com, Enabled (19/23)
|
|
||||||
API: sheets.googleapis.com, Enabled (20/23)
|
|
||||||
API: siteverification.googleapis.com, Enabled (21/23)
|
|
||||||
API: storage-api.googleapis.com, Enabled (22/23)
|
|
||||||
API: vault.googleapis.com, Enabled (23/23)
|
|
||||||
Setting GAM project consent screen...
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Enabled
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Generating new private key
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Extracting public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Done generating private key and public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Service Account Key: SVCACCTKEY, Uploaded
|
|
||||||
Service Account OAuth2 File: /Users/admin/GAMConfig/oauth2service.json, Service Account Key: SVCACCTKEY, Updated
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Has rights to rotate own private key
|
|
||||||
Please go to:
|
|
||||||
|
|
||||||
https://console.cloud.google.com/apis/credentials/oauthclient?project=gam-project-abc-def-ghi
|
|
||||||
|
|
||||||
1. Choose "Desktop App" or "Other" for "Application type".
|
|
||||||
2. Enter "GAM" or another desired value for "Name".
|
|
||||||
3. Click the blue "Create" button.
|
|
||||||
4. Copy your "client ID" value that shows on the next page.
|
|
||||||
|
|
||||||
Enter your Client ID: CLIENTID
|
|
||||||
|
|
||||||
5. Go back to your browser and copy your "client secret" value.
|
|
||||||
Enter your Client Secret: CLIENTSECRET
|
|
||||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
|
||||||
That's it! Your GAM Project is created and ready to use.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Create your project without local browser (Google Cloud Shell for instance)
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam config no_browser true save
|
|
||||||
admin@server:/Users/admin$ gam create project
|
|
||||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: client_secrets_json, Value: /Users/admin/GAMConfig/client_secrets.json, Not Found
|
|
||||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Item: oauth2service_json, Value: /Users/admin/GAMConfig/oauth2service.json, Not Found
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on other computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?re... m&prompt=consent
|
|
||||||
|
|
||||||
Enter verification code: abc...xyz
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Creating project "GAM Project"...
|
|
||||||
Checking project status...
|
|
||||||
Project: gam-project-abc-def-ghi, Enable 23 APIs
|
|
||||||
API: admin.googleapis.com, Enabled (1/23)
|
|
||||||
API: alertcenter.googleapis.com, Enabled (2/23)
|
|
||||||
API: appsactivity.googleapis.com, Enabled (3/23)
|
|
||||||
API: audit.googleapis.com, Enabled (4/23)
|
|
||||||
API: calendar-json.googleapis.com, Enabled (5/23)
|
|
||||||
API: chat.googleapis.com, Enabled (6/23)
|
|
||||||
API: classroom.googleapis.com, Enabled (7/23)
|
|
||||||
API: contacts.googleapis.com, Enabled (8/23)
|
|
||||||
API: drive.googleapis.com, Enabled (9/23)
|
|
||||||
API: driveactivity.googleapis.com, Enabled (10/23)
|
|
||||||
API: gmail.googleapis.com, Enabled (11/23)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (12/23)
|
|
||||||
API: groupssettings.googleapis.com, Enabled (13/23)
|
|
||||||
API: iam.googleapis.com, Enabled (14/23)
|
|
||||||
API: iap.googleapis.com, Enabled (15/23)
|
|
||||||
API: licensing.googleapis.com, Enabled (16/23)
|
|
||||||
API: people.googleapis.com, Enabled (17/23)
|
|
||||||
API: pubsub.googleapis.com, Enabled (18/23)
|
|
||||||
API: reseller.googleapis.com, Enabled (19/23)
|
|
||||||
API: sheets.googleapis.com, Enabled (20/23)
|
|
||||||
API: siteverification.googleapis.com, Enabled (21/23)
|
|
||||||
API: storage-api.googleapis.com, Enabled (22/23)
|
|
||||||
API: vault.googleapis.com, Enabled (23/23)
|
|
||||||
Setting GAM project consent screen...
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Enabled
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Generating new private key
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Extracting public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Done generating private key and public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Service Account Key: SVCACCTKEY, Uploaded
|
|
||||||
Service Account OAuth2 File: /Users/admin/GAMConfig/oauth2service.json, Service Account Key: SVCACCTKEY, Updated
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Has rights to rotate own private key
|
|
||||||
Please go to:
|
|
||||||
|
|
||||||
https://console.cloud.google.com/apis/credentials/oauthclient?project=gam-project-abc-def-ghi
|
|
||||||
|
|
||||||
1. Choose "Desktop App" or "Other" for "Application type".
|
|
||||||
2. Enter "GAM" or another desired value for "Name".
|
|
||||||
3. Click the blue "Create" button.
|
|
||||||
4. Copy your "client ID" value that shows on the next page.
|
|
||||||
|
|
||||||
Enter your Client ID: CLIENTID
|
|
||||||
|
|
||||||
5. Go back to your browser and copy your "client secret" value.
|
|
||||||
Enter your Client Secret: CLIENTSECRET
|
|
||||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
|
||||||
That's it! Your GAM Project is created and ready to use.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Enable GAMADV-XTD3 client access
|
|
||||||
|
|
||||||
You select a list of scopes, GAM uses a browser to get final authorization from Google for these scopes and
|
|
||||||
writes the credentials into the file oauth2.txt.
|
|
||||||
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam oauth create
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[*] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[ ] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[ ] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
Select an unselected scope [ ] by entering a number; yields [*]
|
|
||||||
For scopes that support readonly, enter a number and an 'r' to grant read-only access; yields [R]
|
|
||||||
For scopes that support action, enter a number and an 'a' to grant action-only access; yields [A]
|
|
||||||
Clear read-only access [R] or action-only access [A] from a scope by entering a number; yields [*]
|
|
||||||
Unselect a selected scope [*] by entering a number; yields [ ]
|
|
||||||
Select all default scopes by entering an 's'; yields [*] for default scopes, [ ] for others
|
|
||||||
Unselect all scopes by entering a 'u'; yields [ ] for all scopes
|
|
||||||
Exit without changes/authorization by entering an 'e'
|
|
||||||
Continue to authorization by entering a 'c'
|
|
||||||
Note, if all scopes are selected, Google will probably generate an authorization error
|
|
||||||
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on this computer or on another computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=423565144751-10lsdt2lgnsch9jmdhl35uq4617u1ifp&redirect_uri=http%3A%2F%2F127.0.0.1%3A8080%2F&scope=...
|
|
||||||
|
|
||||||
If you use a browser on another computer, you will get a browser error that the site can't be reached AFTER you
|
|
||||||
click the Allow button, paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
Enter verification code or paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
The authentication flow has completed.
|
|
||||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Created
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
|
|
||||||
If clicking on the link in the instructions does not work (i.e. you get a 404 or 400 error message, instead of something about 'unable to connect') the URL in the link is too long. Most likely, you have selected all scopes. Try again with fewer scopes until it works. (there is no harm in repeatedly trying)
|
|
||||||
|
|
||||||
### Enable GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
|
||||||
$ gam user admin@domain.com check serviceaccount
|
|
||||||
System time status
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication
|
|
||||||
Authentication PASS
|
|
||||||
Service Account Private Key age; Google recommends rotating keys on a routine basis
|
|
||||||
Service Account Private Key age: 0 days PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED!
|
|
||||||
To authorize them, please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/ac/owl/domainwidedelegation?clientScopeToAdd=https://mail.go...huser=admin@domain.com
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console Security/API Controls/Domain-wide Delegation page
|
|
||||||
The "Add a new Client ID" box will open
|
|
||||||
Make sure that "Overwrite existing client ID" is checked
|
|
||||||
Click AUTHORIZE
|
|
||||||
When the box closes you're done
|
|
||||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam user admin@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Update gam.cfg with some basic values
|
|
||||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
|
||||||
* `domain` - This allows you to omit the domain portion of email addresses
|
|
||||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam info domain
|
|
||||||
Customer ID: C01234567
|
|
||||||
Primary Domain: domain.com
|
|
||||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
|
||||||
Primary Domain Verified: True
|
|
||||||
Default Language: en
|
|
||||||
...
|
|
||||||
|
|
||||||
admin@server:/Users/admin$ gam config customer_id C01234567 domain domain.com timezone local save verify
|
|
||||||
Config File: /Users/admin/GAMConfig/gam.cfg, Saved
|
|
||||||
Section: DEFAULT
|
|
||||||
...
|
|
||||||
customer_id = C01234567
|
|
||||||
...
|
|
||||||
domain = domain.com
|
|
||||||
...
|
|
||||||
timezone = local
|
|
||||||
...
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3; if you've installed
|
|
||||||
GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
These steps assume Command Prompt, adjust if you're using PowerShell.
|
|
||||||
|
|
||||||
### Set a configuration directory
|
|
||||||
|
|
||||||
The default GAM configuration directory is C:\Users\<UserName>\.gam; for more flexibility you
|
|
||||||
probably want to select a non user-specific location. This example assumes that the GAM
|
|
||||||
configuration directory will be C:\GAMConfig; If you've chosen another directory,
|
|
||||||
substitute that value in the directions.
|
|
||||||
* Make the C:\GAMConfig directory before proceeding.
|
|
||||||
|
|
||||||
### Set a working directory
|
|
||||||
|
|
||||||
You should extablish a GAM working directory; you will store your GAM related
|
|
||||||
data in this folder and execute GAM commands from this folder. You should not use
|
|
||||||
C:\GAMADV-XTD3 or C:\GAMConfig for this purpose.
|
|
||||||
This example assumes that the GAM working directory will be C:\GAMWork; If you've chosen
|
|
||||||
another directory, substitute that value in the directions.
|
|
||||||
* Make the C:\GAMWork directory before proceeding.
|
|
||||||
|
|
||||||
### Set system path and GAM configuration directory
|
|
||||||
You should set the system path to point to C:\GAMADV-XTD3 so you can operate from the C:\GAMWork directory.
|
|
||||||
```
|
|
||||||
Start Control Panel
|
|
||||||
Click System
|
|
||||||
Click Advanced system settings
|
|
||||||
Click Environment Variables...
|
|
||||||
Click Path under System variables
|
|
||||||
Click Edit...
|
|
||||||
If C:\GAMADV-XTD3 is already on the Path, skip the next three steps
|
|
||||||
Click New
|
|
||||||
Enter C:\GAMADV-XTD3
|
|
||||||
Click OK
|
|
||||||
Click New
|
|
||||||
Set Variable name: GAMCFGDIR
|
|
||||||
Set Variable value: C:\GAMConfig
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Exit Control Panel
|
|
||||||
```
|
|
||||||
|
|
||||||
At this point, you should restart Command Prompt so that it has the updated path and environment variables.
|
|
||||||
|
|
||||||
### Initialize GAMADV-XTD3; this should be the first GAMADV-XTD3 command executed.
|
|
||||||
```
|
|
||||||
C:\>gam config drive_dir C:\GAMWork verify
|
|
||||||
Created: C:\GAMConfig
|
|
||||||
Created: C:\GAMConfig\gamcache
|
|
||||||
Config File: C:\GAMConfig\gam.cfg, Initialized
|
|
||||||
Section: DEFAULT
|
|
||||||
...
|
|
||||||
cache_dir = C:\GAMConfig\gamcache
|
|
||||||
...
|
|
||||||
config_dir = C:\GAMConfig
|
|
||||||
...
|
|
||||||
drive_dir = C:\GAMWork
|
|
||||||
...
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Verify initialization, this was a successful installation.
|
|
||||||
```
|
|
||||||
C:\>dir %GAMCFGDIR%
|
|
||||||
Volume in drive C has no label.
|
|
||||||
Volume Serial Number is 663F-DA8B
|
|
||||||
|
|
||||||
Directory of C:\GAMConfig
|
|
||||||
|
|
||||||
03/03/2017 10:16 AM <DIR> .
|
|
||||||
03/03/2017 10:16 AM <DIR> ..
|
|
||||||
03/03/2017 10:15 AM 1,125 gam.cfg
|
|
||||||
03/03/2017 10:15 AM <DIR> gamcache
|
|
||||||
03/03/2017 10:15 AM 0 oauth2.txt.lock
|
|
||||||
2 File(s) 15,769 bytes
|
|
||||||
3 Dir(s) 110,532,562,944 bytes free
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Create your project with local browser
|
|
||||||
```
|
|
||||||
C:\>gam create project
|
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: client_secrets_json, Value: C:\GAMConfig\client_secrets.json, Not Found
|
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: oauth2service_json, Value: C:\GAMConfig\oauth2service.json, Not Found
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oaut...pe=code
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Creating project "GAM Project"...
|
|
||||||
Checking project status...
|
|
||||||
Project: gam-project-abc-def-ghi, Enable 23 APIs
|
|
||||||
API: admin.googleapis.com, Enabled (1/23)
|
|
||||||
API: alertcenter.googleapis.com, Enabled (2/23)
|
|
||||||
API: appsactivity.googleapis.com, Enabled (3/23)
|
|
||||||
API: audit.googleapis.com, Enabled (4/23)
|
|
||||||
API: calendar-json.googleapis.com, Enabled (5/23)
|
|
||||||
API: chat.googleapis.com, Enabled (6/23)
|
|
||||||
API: classroom.googleapis.com, Enabled (7/23)
|
|
||||||
API: contacts.googleapis.com, Enabled (8/23)
|
|
||||||
API: drive.googleapis.com, Enabled (9/23)
|
|
||||||
API: driveactivity.googleapis.com, Enabled (10/23)
|
|
||||||
API: gmail.googleapis.com, Enabled (11/23)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (12/23)
|
|
||||||
API: groupssettings.googleapis.com, Enabled (13/23)
|
|
||||||
API: iam.googleapis.com, Enabled (14/23)
|
|
||||||
API: iap.googleapis.com, Enabled (15/23)
|
|
||||||
API: licensing.googleapis.com, Enabled (16/23)
|
|
||||||
API: people.googleapis.com, Enabled (17/23)
|
|
||||||
API: pubsub.googleapis.com, Enabled (18/23)
|
|
||||||
API: reseller.googleapis.com, Enabled (19/23)
|
|
||||||
API: sheets.googleapis.com, Enabled (20/23)
|
|
||||||
API: siteverification.googleapis.com, Enabled (21/23)
|
|
||||||
API: storage-api.googleapis.com, Enabled (22/23)
|
|
||||||
API: vault.googleapis.com, Enabled (23/23)
|
|
||||||
Setting GAM project consent screen...
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Enabled
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Generating new private key
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Extracting public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Done generating private key and public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Service Account Key: SVCACCTKEY, Uploaded
|
|
||||||
Service Account OAuth2 File: C:\GAMConfig\oauth2service.json, Service Account Key: SVCACCTKEY, Updated
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Has rights to rotate own private key
|
|
||||||
Please go to:
|
|
||||||
|
|
||||||
https://console.cloud.google.com/apis/credentials/oauthclient?project=gam-project-abc-def-ghi
|
|
||||||
|
|
||||||
1. Choose "Desktop App" or "Other" for "Application type".
|
|
||||||
2. Enter "GAM" or another desired value for "Name".
|
|
||||||
3. Click the blue "Create" button.
|
|
||||||
4. Copy your "client ID" value that shows on the next page.
|
|
||||||
|
|
||||||
Enter your Client ID: CLIENTID
|
|
||||||
|
|
||||||
5. Go back to your browser and copy your "client secret" value.
|
|
||||||
Enter your Client Secret: CLIENTSECRET
|
|
||||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
|
||||||
That's it! Your GAM Project is created and ready to use.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Create your project without local browser (headless server for instance)
|
|
||||||
```
|
|
||||||
C:\>gam config no_browser true save
|
|
||||||
C:\>gam create project
|
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: client_secrets_json, Value: C:\GAMConfig\client_secrets.json, Not Found
|
|
||||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Item: oauth2service_json, Value: C:\GAMConfig\oauth2service.json, Not Found
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on other computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
Enter verification code: abc...xyz
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Creating project "GAM Project"...
|
|
||||||
Checking project status...
|
|
||||||
Project: gam-project-abc-def-ghi, Enable 23 APIs
|
|
||||||
API: admin.googleapis.com, Enabled (1/23)
|
|
||||||
API: alertcenter.googleapis.com, Enabled (2/23)
|
|
||||||
API: appsactivity.googleapis.com, Enabled (3/23)
|
|
||||||
API: audit.googleapis.com, Enabled (4/23)
|
|
||||||
API: calendar-json.googleapis.com, Enabled (5/23)
|
|
||||||
API: chat.googleapis.com, Enabled (6/23)
|
|
||||||
API: classroom.googleapis.com, Enabled (7/23)
|
|
||||||
API: contacts.googleapis.com, Enabled (8/23)
|
|
||||||
API: drive.googleapis.com, Enabled (9/23)
|
|
||||||
API: driveactivity.googleapis.com, Enabled (10/23)
|
|
||||||
API: gmail.googleapis.com, Enabled (11/23)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (12/23)
|
|
||||||
API: groupssettings.googleapis.com, Enabled (13/23)
|
|
||||||
API: iam.googleapis.com, Enabled (14/23)
|
|
||||||
API: iap.googleapis.com, Enabled (15/23)
|
|
||||||
API: licensing.googleapis.com, Enabled (16/23)
|
|
||||||
API: people.googleapis.com, Enabled (17/23)
|
|
||||||
API: pubsub.googleapis.com, Enabled (18/23)
|
|
||||||
API: reseller.googleapis.com, Enabled (19/23)
|
|
||||||
API: sheets.googleapis.com, Enabled (20/23)
|
|
||||||
API: siteverification.googleapis.com, Enabled (21/23)
|
|
||||||
API: storage-api.googleapis.com, Enabled (22/23)
|
|
||||||
API: vault.googleapis.com, Enabled (23/23)
|
|
||||||
Setting GAM project consent screen...
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Enabled
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Generating new private key
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Extracting public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Done generating private key and public certificate
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Service Account Key: SVCACCTKEY, Uploaded
|
|
||||||
Service Account OAuth2 File: C:\GAMConfig\oauth2service.json, Service Account Key: SVCACCTKEY, Updated
|
|
||||||
Project: gam-project-abc-def-ghi, Service Account: gam-project-abc-def-ghi@gam-project-abc-def-ghi.iam.gserviceaccount.com, Has rights to rotate own private key
|
|
||||||
Please go to:
|
|
||||||
|
|
||||||
https://console.cloud.google.com/apis/credentials/oauthclient?project=gam-project-abc-def-ghi
|
|
||||||
|
|
||||||
1. Choose "Desktop App" or "Other" for "Application type".
|
|
||||||
2. Enter "GAM" or another desired value for "Name".
|
|
||||||
3. Click the blue "Create" button.
|
|
||||||
4. Copy your "client ID" value that shows on the next page.
|
|
||||||
|
|
||||||
Enter your Client ID: CLIENTID
|
|
||||||
|
|
||||||
5. Go back to your browser and copy your "client secret" value.
|
|
||||||
Enter your Client Secret: CLIENTSECRET
|
|
||||||
6. Go back to your browser and click OK to close the "OAuth client" popup if it's still open.
|
|
||||||
That's it! Your GAM Project is created and ready to use.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Enable GAMADV-XTD3 client access
|
|
||||||
|
|
||||||
You select a list of scopes, GAM uses a browser to get final authorization from Google for these scopes and
|
|
||||||
writes the credentials into the file oauth2.txt.
|
|
||||||
|
|
||||||
```
|
|
||||||
C:\>gam oauth create
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[*] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[ ] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[ ] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
Select an unselected scope [ ] by entering a number; yields [*]
|
|
||||||
For scopes that support readonly, enter a number and an 'r' to grant read-only access; yields [R]
|
|
||||||
For scopes that support action, enter a number and an 'a' to grant action-only access; yields [A]
|
|
||||||
Clear read-only access [R] or action-only access [A] from a scope by entering a number; yields [*]
|
|
||||||
Unselect a selected scope [*] by entering a number; yields [ ]
|
|
||||||
Select all default scopes by entering an 's'; yields [*] for default scopes, [ ] for others
|
|
||||||
Unselect all scopes by entering a 'u'; yields [ ] for all scopes
|
|
||||||
Exit without changes/authorization by entering an 'e'
|
|
||||||
Continue to authorization by entering a 'c'
|
|
||||||
Note, if all scopes are selected, Google will probably generate an authorization error
|
|
||||||
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on this computer or on another computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=423565144751-10lsdt2lgnsch9jmdhl35uq4617u1ifp&redirect_uri=http%3A%2F%2F127.0.0.1%3A8080%2F&scope=...
|
|
||||||
|
|
||||||
If you use a browser on another computer, you will get a browser error that the site can't be reached AFTER you
|
|
||||||
click the Allow button, paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
Enter verification code or paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
The authentication flow has completed.
|
|
||||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Created
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Enable GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
C:\>gam user admin@domain.com check serviceaccount
|
|
||||||
System time status
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication
|
|
||||||
Authentication PASS
|
|
||||||
Service Account Private Key age; Google recommends rotating keys on a routine basis
|
|
||||||
Service Account Private Key age: 0 days PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED!
|
|
||||||
To authorize them, please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/ac/owl/domainwide...thuser=admin@domain.com
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console Security/API Controls/Domain-wide Delegation page
|
|
||||||
The "Add a new Client ID" box will open
|
|
||||||
Make sure that "Overwrite existing client ID" is checked
|
|
||||||
Click AUTHORIZE
|
|
||||||
When the box closes you're done
|
|
||||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
C:\>gam user admin@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Update gam.cfg with some basic values
|
|
||||||
* `customer_id` - Having this data keeps Gam from having to make extra API calls
|
|
||||||
* `domain` - This allows you to omit the domain portion of email addresses
|
|
||||||
* `timezone local` - Gam will convert all UTC times to your local timezone
|
|
||||||
```
|
|
||||||
C:\>gam info domain
|
|
||||||
Customer ID: C01234567
|
|
||||||
Primary Domain: domain.com
|
|
||||||
Customer Creation Time: 2007-06-06T15:47:55.444Z
|
|
||||||
Primary Domain Verified: True
|
|
||||||
Default Language: en
|
|
||||||
...
|
|
||||||
|
|
||||||
C:\>gam config customer_id C01234567 domain domain.com timezone local save verify
|
|
||||||
Config File: C:\GAMConfig\gam.cfg, Saved
|
|
||||||
Section: DEFAULT
|
|
||||||
...
|
|
||||||
customer_id = C01234567
|
|
||||||
...
|
|
||||||
domain = domain.com
|
|
||||||
...
|
|
||||||
timezone = local
|
|
||||||
...
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
# Uninstalling GAMADV-XTD3
|
|
||||||
|
|
||||||
- [Get Project Info](#get-project-info)
|
|
||||||
- [Remove Client API access](#remove-client-api-access)
|
|
||||||
- [Remove Service Account API access](#remove-service-account-api-access)
|
|
||||||
- [Delete GAM Project](#delete-gam-project)
|
|
||||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
|
||||||
- [Windows](#windows)
|
|
||||||
|
|
||||||
## Get Project Info
|
|
||||||
```
|
|
||||||
gam version
|
|
||||||
```
|
|
||||||
|
|
||||||
Note the `Config File:` path to `gam.cfg`. In that folder will be a file `oauth2service.json`; look at its contents.
|
|
||||||
You want these two lines:
|
|
||||||
```
|
|
||||||
"client_id": "123691089974044844789"
|
|
||||||
"project_id": "gam-project-123-456-789"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Remove Client API access
|
|
||||||
```
|
|
||||||
gam oauth delete
|
|
||||||
```
|
|
||||||
|
|
||||||
## Remove Service Account API access
|
|
||||||
In a browser, go to `https://admin.google.com`, login and go to the Security/API Controls/Domain-wide Delegation page.
|
|
||||||
Find the `Client ID` that matches the `client_id` value from `oauth2service.json`, hover over it and click `Delete`.
|
|
||||||
|
|
||||||
## Delete GAM Project
|
|
||||||
In a browser, go to `https://console.cloud.google.com/cloud-resource-manager`, login. Find the `ID` that matches
|
|
||||||
the `project_id` value from `oauth2service.json`; click the three dots at the right end of the line and click `Delete`.
|
|
||||||
In the box that pops up, put the `project_id` value in ther `Project ID*` field and click `SHUT DOWN`
|
|
||||||
|
|
||||||
## Linux and MacOS and Google Cloud Shell
|
|
||||||
|
|
||||||
In these examples, the user home folder is shown as /Users/admin; adjust according to your
|
|
||||||
specific situation; e.g., /home/administrator.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in /Users/admin/bin/gamadv-xtd3.
|
|
||||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
### Delete executable directory
|
|
||||||
|
|
||||||
```
|
|
||||||
rm -fr /Users/admin/bin/gamadv-xtd3
|
|
||||||
```
|
|
||||||
|
|
||||||
### Delete configuration directory
|
|
||||||
|
|
||||||
The default GAM configuration directory is /Users/admin/.gam; for more flexibility you
|
|
||||||
probably want to select a non-hidden location. This example assumes that the GAM
|
|
||||||
configuration directory will be /Users/admin/GAMConfig; If you've chosen another directory,
|
|
||||||
substitute that value in the directions.
|
|
||||||
```
|
|
||||||
rm -fr /Users/admin/GAMConfig
|
|
||||||
```
|
|
||||||
|
|
||||||
### Delete working directory
|
|
||||||
|
|
||||||
This example assumes that the GAM working directory is be /Users/admin/GAMWork; If you've chosen
|
|
||||||
another directory, substitute that value in the directions.
|
|
||||||
```
|
|
||||||
rm -fr /Users/admin/GAMConfig
|
|
||||||
```
|
|
||||||
|
|
||||||
### Remove executable alias and GAM configuration export
|
|
||||||
|
|
||||||
Remove the following line:
|
|
||||||
```
|
|
||||||
alias gam="/Users/admin/bin/gamadv-xtd3/gam"
|
|
||||||
export GAMCFGDIR="/Users/admin/GAMConfig"
|
|
||||||
```
|
|
||||||
from these files based on your shell:
|
|
||||||
```
|
|
||||||
~/.bash_profile
|
|
||||||
~/.bashrc
|
|
||||||
~/.zshrc
|
|
||||||
~/.profile
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3; if you've installed
|
|
||||||
GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
### Delete executable directory
|
|
||||||
|
|
||||||
In File Explorer, delete the `C:\GAMADV-XTD3` folder.
|
|
||||||
|
|
||||||
### Delete configuration directory
|
|
||||||
|
|
||||||
The default GAM configuration directory is C:\Users\<UserName>\.gam; for more flexibility you
|
|
||||||
probably want to select a non user-specific location. This example assumes that the GAM
|
|
||||||
configuration directory will be C:\GAMConfig; If you've chosen another directory,
|
|
||||||
substitute that value in the directions.
|
|
||||||
|
|
||||||
In File Explorer, delete the `C:\GAMConfig` folder.
|
|
||||||
|
|
||||||
### Delete working directory
|
|
||||||
|
|
||||||
This example assumes that the GAM working directory will be C:\GAMWork; If you've chosen
|
|
||||||
another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
In File Explorer, delete the `C:\GAMWork` folder.
|
|
||||||
|
|
||||||
### Reset system path and GAM configuration directory
|
|
||||||
```
|
|
||||||
Start Control Panel
|
|
||||||
Click System
|
|
||||||
Click Advanced system settings
|
|
||||||
Click Environment Variables...
|
|
||||||
Click Path under System variables
|
|
||||||
Click Edit...
|
|
||||||
If C:\GAMADV-XTD3 is not on the Path, click Cancel and skip the next three steps
|
|
||||||
Click C:\GAMADV-XTD3
|
|
||||||
Click Delete
|
|
||||||
Click OK
|
|
||||||
If GAMCFGDIR is not in System variables, skip the next two steps
|
|
||||||
Click GAMCFGDIR
|
|
||||||
Click Delete
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Exit Control Panel
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
# Installation - Update Advanced GAM to GAM7
|
|
||||||
|
|
||||||
- [Downloads-Installs-GAM7](Downloads-Installs-GAM7)
|
|
||||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
|
||||||
- [Windows](#windows)
|
|
||||||
|
|
||||||
## Linux and MacOS and Google Cloud Shell
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 was installed in /Users/admin/bin/gamadv-xtd3.
|
|
||||||
If GAMADV-XTD3 was installed in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
Rename install directory.
|
|
||||||
```
|
|
||||||
mv /Users/admin/bin/gamadv-xtd3 /Users/admin/bin/gam7
|
|
||||||
```
|
|
||||||
|
|
||||||
See: [Downloads-Installs-GAM7](Downloads-Installs-GAM7)
|
|
||||||
|
|
||||||
You can download and install the current GAM7 release from the [GitHub Releases](https://github.com/GAM-team/GAM/releases/latest) page. Choose one of the following:
|
|
||||||
|
|
||||||
* Executable Archive, Automatic, Linux/Mac OS/Google Cloud Shell/Raspberry Pi/ChromeOS
|
|
||||||
- Start a terminal session and execute one of the following commands:
|
|
||||||
- Update to latest version, do not create project or authorizations, default path `$HOME/bin`
|
|
||||||
- `bash <(curl -s -S -L https://git.io/gam-install) -l`
|
|
||||||
- Update to latest version, do not create project or authorizations, specify a path
|
|
||||||
- `bash <(curl -s -S -L https://git.io/gam-install) -l -d <Path>`
|
|
||||||
|
|
||||||
In these examples, the user home folder is shown as /Users/admin; adjust according to your
|
|
||||||
specific situation; e.g., /home/administrator.
|
|
||||||
|
|
||||||
### Update gam alias
|
|
||||||
You should set an alias to point to /Users/admin/bin/gam/gam so you can operate from the /Users/admin/GAMWork directory.
|
|
||||||
Aliases aren't available in scripts, so you may want to set a symlink instead, see below.
|
|
||||||
|
|
||||||
Change the following line:
|
|
||||||
```
|
|
||||||
alias gam="/Users/admin/bin/gamadv-xtd3/gam"
|
|
||||||
```
|
|
||||||
to
|
|
||||||
```
|
|
||||||
alias gam="/Users/admin/bin/gam7/gam"
|
|
||||||
```
|
|
||||||
in one of these files based on your shell:
|
|
||||||
```
|
|
||||||
~/.bash_aliases
|
|
||||||
~/.bash_profile
|
|
||||||
~/.bashrc
|
|
||||||
~/.zshrc
|
|
||||||
~/.profile
|
|
||||||
```
|
|
||||||
|
|
||||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
|
||||||
```
|
|
||||||
source <Filename>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set a symlink if desired
|
|
||||||
Set a symlink in `/usr/local/bin` (or some other location on $PATH) to point to GAM.
|
|
||||||
```
|
|
||||||
ln -s "/Users/admin/bin/gam7/gam" /usr/local/bin/gam
|
|
||||||
```
|
|
||||||
|
|
||||||
### Test
|
|
||||||
```
|
|
||||||
gam version
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
You can download and install the current GAM7 release from the [GitHub Releases](https://github.com/GAM-team/GAM/releases/latest) page.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 was installed in C:\GAMADV-XTD3.
|
|
||||||
If GAMADV-XTD3 was installed in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
These steps assume Command Prompt, adjust if you're using PowerShell.
|
|
||||||
|
|
||||||
Rename install directory.
|
|
||||||
```
|
|
||||||
ren C:\GAMADV-STD3 C:\GAM7
|
|
||||||
```
|
|
||||||
|
|
||||||
See: [Downloads-Installs-GAM7](Downloads-Installs-GAM7)
|
|
||||||
|
|
||||||
* Executable Archive, Manual, Windows 64 bit
|
|
||||||
- `gam-7.wx.yz-windows-x86_64.zip`
|
|
||||||
- Download the archive, extract the contents into C:\GAM7.
|
|
||||||
- Start a Command Prompt/PowerShell session.
|
|
||||||
|
|
||||||
* Executable Installer, Manual, Windows 64 bit
|
|
||||||
- `gam-7.wx.yz-windows-x86_64.msi`
|
|
||||||
- Download the installer and run it.
|
|
||||||
- Start a Command Prompt/PowerShell session.
|
|
||||||
|
|
||||||
### Update system path
|
|
||||||
You should set the system path to point to C:\GAM7 so you can operate from the C:\GAMWork directory.
|
|
||||||
```
|
|
||||||
Start Control Panel
|
|
||||||
Click System
|
|
||||||
Click Advanced system settings
|
|
||||||
Click Environment Variables...
|
|
||||||
Click Path under System variables
|
|
||||||
Click Edit...
|
|
||||||
If you have an existing entry referencing GAMADV-XTD3:
|
|
||||||
Click that entry
|
|
||||||
Click Delete
|
|
||||||
If C:\GAM7 is already on the Path, skip the next three steps
|
|
||||||
Click New
|
|
||||||
Enter C:\GAM7
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Exit Control Panel
|
|
||||||
```
|
|
||||||
|
|
||||||
At this point, you should restart Command Prompt so that it has the updated path and environment variables.
|
|
||||||
|
|
||||||
### Test
|
|
||||||
```
|
|
||||||
gam version
|
|
||||||
```
|
|
||||||
@@ -1,581 +0,0 @@
|
|||||||
# Updating GAMADV-XTD3
|
|
||||||
Use these steps to update your version of GAMADV-XTD3.
|
|
||||||
|
|
||||||
- [Downloads-Installs](Downloads-Installs)
|
|
||||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
|
||||||
- [Windows](#windows)
|
|
||||||
- [GAM Configuration](gam.cfg)
|
|
||||||
|
|
||||||
## Linux and MacOS and Google Cloud Shell
|
|
||||||
|
|
||||||
### Download the latest version
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in /Users/admin/bin/gamadv-xtd3.
|
|
||||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions when downloading.
|
|
||||||
|
|
||||||
See: [Downloads-Installs](Downloads-Installs)
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
In these examples, the user home folder is shown as /Users/admin; adjust according to your
|
|
||||||
specific situation; e.g., /home/administrator.
|
|
||||||
|
|
||||||
### Update your project with local browser to include the additional APIs that GAMADV-XTD3 uses.
|
|
||||||
This step may be omitted if you are updating from a recent version.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s): gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
|
||||||
```
|
|
||||||
### Update your project without local browser (Google Cloud Shell for instance) to include the additional APIs that GAMADV-XTD3 uses
|
|
||||||
This step may be omitted if you are updating from a recent version.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam config no_browser true save
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s): gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on other computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
Enter verification code: abc...xyz
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 client access
|
|
||||||
|
|
||||||
You select a list of scopes, GAMADV-XTD3 uses a browser to get final authorization from Google for these scopes and
|
|
||||||
writes the credentials into the file oauth2.txt.
|
|
||||||
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam oauth create
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[*] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[ ] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[ ] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
Select an unselected scope [ ] by entering a number; yields [*]
|
|
||||||
For scopes that support readonly, enter a number and an 'r' to grant read-only access; yields [R]
|
|
||||||
For scopes that support action, enter a number and an 'a' to grant action-only access; yields [A]
|
|
||||||
Clear read-only access [R] or action-only access [A] from a scope by entering a number; yields [*]
|
|
||||||
Unselect a selected scope [*] by entering a number; yields [ ]
|
|
||||||
Select all default scopes by entering an 's'; yields [*] for default scopes, [ ] for others
|
|
||||||
Unselect all scopes by entering a 'u'; yields [ ] for all scopes
|
|
||||||
Exit without changes/authorization by entering an 'e'
|
|
||||||
Continue to authorization by entering a 'c'
|
|
||||||
Note, if all scopes are selected, Google will probably generate an authorization error
|
|
||||||
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on this computer or on another computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=423565144751-10lsdt2lgnsch9jmdhl35uq4617u1ifp&redirect_uri=http%3A%2F%2F127.0.0.1%3A8080%2F&scope=...
|
|
||||||
|
|
||||||
If you use a browser on another computer, you will get a browser error that the site can't be reached AFTER you
|
|
||||||
click the Allow button, paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
Enter verification code or paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
The authentication flow has completed.
|
|
||||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Created
|
|
||||||
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
|
||||||
$ gam user admin@domain.com check serviceaccount
|
|
||||||
System time status
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication
|
|
||||||
Authentication PASS
|
|
||||||
Service Account Private Key age; Google recommends rotating keys on a routine basis
|
|
||||||
Service Account Private Key age: 0 days PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED!
|
|
||||||
To authorize them, please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/ac/owl/domainwidedelegation?clientScopeToAdd=https://mail.google.com/,https://sites.google.com/feeds,https://www.googleapis.com/auth/apps.alerts,https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/classroom.announcements,https://www.googleapis.com/auth/classroom.coursework.students,https://www.googleapis.com/auth/classroom.courseworkmaterials,https://www.googleapis.com/auth/classroom.profile.emails,https://www.googleapis.com/auth/classroom.rosters,https://www.googleapis.com/auth/classroom.topics,https://www.googleapis.com/auth/cloud-identity,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/contacts,https://www.googleapis.com/auth/contacts.other.readonly,https://www.googleapis.com/auth/datastudio,https://www.googleapis.com/auth/directory.readonly,https://www.googleapis.com/auth/documents,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.activity,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.settings.basic,https://www.googleapis.com/auth/gmail.settings.sharing,https://www.googleapis.com/auth/keep,https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/tasks,https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email&clientIdToAdd=SVCACCTID&overwriteClientId=true&dn=domain.com&authuser=admin@domain.com
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console Security/API Controls/Domain-wide Delegation page
|
|
||||||
The "Add a new Client ID" box will open
|
|
||||||
Make sure that "Overwrite existing client ID" is checked
|
|
||||||
Click AUTHORIZE
|
|
||||||
When the box closes you're done
|
|
||||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$ ./gam user admin@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
admin@server:/Users/admin/bin/gamadv-xtd3$
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
### Download the latest version
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3.
|
|
||||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions when downloading.
|
|
||||||
|
|
||||||
See: [Downloads-Installs](Downloads-Installs)
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3; if you've installed
|
|
||||||
GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
These steps assume Command Prompt, adjust if you're using PowerShell.
|
|
||||||
|
|
||||||
### Update your project with local browser to include the additional APIs that GAMADV-XTD3 uses.
|
|
||||||
This step may be omitted if you are updating from a recent version.
|
|
||||||
```
|
|
||||||
C:\GAMADV-XTD3>gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
C:\GAMADV-XTD3>
|
|
||||||
```
|
|
||||||
### Update your project without local browser (headless server for instance) to include the additional APIs that GAMADV-XTD3 uses
|
|
||||||
This step may be omitted if you are updating from a recent version.
|
|
||||||
```
|
|
||||||
C:\GAMADV-XTD3>gam config no_browser true save
|
|
||||||
C:\GAMADV-XTD3>gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on other computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
Enter verification code: abc...xyz
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
C:\GAMADV-XTD3>
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 client access
|
|
||||||
|
|
||||||
You select a list of scopes, GAM uses a browser to get final authorization from Google for these scopes and
|
|
||||||
writes the credentials into the file oauth2.txt.
|
|
||||||
|
|
||||||
```
|
|
||||||
C:\GAMADV-XTD3>gam oauth create
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[*] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[ ] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[ ] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
Select an unselected scope [ ] by entering a number; yields [*]
|
|
||||||
For scopes that support readonly, enter a number and an 'r' to grant read-only access; yields [R]
|
|
||||||
For scopes that support action, enter a number and an 'a' to grant action-only access; yields [A]
|
|
||||||
Clear read-only access [R] or action-only access [A] from a scope by entering a number; yields [*]
|
|
||||||
Unselect a selected scope [*] by entering a number; yields [ ]
|
|
||||||
Select all default scopes by entering an 's'; yields [*] for default scopes, [ ] for others
|
|
||||||
Unselect all scopes by entering a 'u'; yields [ ] for all scopes
|
|
||||||
Exit without changes/authorization by entering an 'e'
|
|
||||||
Continue to authorization by entering a 'c'
|
|
||||||
Note, if all scopes are selected, Google will probably generate an authorization error
|
|
||||||
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address? admin@domain.com
|
|
||||||
|
|
||||||
Go to the following link in a browser on this computer or on another computer:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=423565144751-10lsdt2lgnsch9jmdhl35uq4617u1ifp&redirect_uri=http%3A%2F%2F127.0.0.1%3A8080%2F&scope=...
|
|
||||||
|
|
||||||
If you use a browser on another computer, you will get a browser error that the site can't be reached AFTER you
|
|
||||||
click the Allow button, paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
Enter verification code or paste "Unable to connect" URL from other computer (only URL data up to &scope required):
|
|
||||||
|
|
||||||
The authentication flow has completed.
|
|
||||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Created
|
|
||||||
|
|
||||||
C:\GAMADV-XTD3>
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
|
||||||
System time status
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication
|
|
||||||
Authentication PASS
|
|
||||||
Service Account Private Key age; Google recommends rotating keys on a routine basis
|
|
||||||
Service Account Private Key age: 0 days PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED!
|
|
||||||
To authorize them, please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/ac/owl/domainwidedelegation?clientScopeToAdd=https://mail.google.com/,https://sites.google.com/feeds,https://www.googleapis.com/auth/apps.alerts,https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/classroom.announcements,https://www.googleapis.com/auth/classroom.coursework.students,https://www.googleapis.com/auth/classroom.courseworkmaterials,https://www.googleapis.com/auth/classroom.profile.emails,https://www.googleapis.com/auth/classroom.rosters,https://www.googleapis.com/auth/classroom.topics,https://www.googleapis.com/auth/cloud-identity,https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/contacts,https://www.googleapis.com/auth/contacts.other.readonly,https://www.googleapis.com/auth/datastudio,https://www.googleapis.com/auth/directory.readonly,https://www.googleapis.com/auth/documents,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.activity,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.settings.basic,https://www.googleapis.com/auth/gmail.settings.sharing,https://www.googleapis.com/auth/keep,https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/tasks,https://www.googleapis.com/auth/userinfo.profile,https://www.googleapis.com/auth/userinfo.email&clientIdToAdd=SVCACCTID&overwriteClientId=true&dn=domain.com&authuser=admin@domain.com
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console Security/API Controls/Domain-wide Delegation page
|
|
||||||
The "Add a new Client ID" box will open
|
|
||||||
Make sure that "Overwrite existing client ID" is checked
|
|
||||||
Click AUTHORIZE
|
|
||||||
When the box closes you're done
|
|
||||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
C:\GAMADV-XTD3>
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
C:\GAMADV-XTD3>gam user admin@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs from www.googleapis.com by less than 1 second PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
C:\GAMADV-XTD3>
|
|
||||||
```
|
|
||||||
@@ -1,551 +0,0 @@
|
|||||||
# Installation - Upgrading from a prior version of GAMADV-X or GAMADV-XTD
|
|
||||||
Use these steps if you have used any version of GAMADV-X or GAMADV-XTD in your domain.
|
|
||||||
They will update your GAM project and all necessary authentications.
|
|
||||||
|
|
||||||
- [Downloads-Installs](Downloads-Installs)
|
|
||||||
- [Linux and MacOS and Google Cloud Shell](#linux-and-mac-os-and-google-cloud-shell)
|
|
||||||
- [Windows](#windows)
|
|
||||||
- [GAM Configuration](gam.cfg)
|
|
||||||
|
|
||||||
## Linux and MacOS and Google Cloud Shell
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
In these examples, the user home folder is shown as /Users/admin; adjust according to your
|
|
||||||
specific situation; e.g., /home/administrator.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in /Users/admin/bin/gamadv-xtd3.
|
|
||||||
If you've installed GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
GAMADV-XTD3 uses the same configuration directory and gam.cfg file as GAMADV-X and GAMADV-XTD.
|
|
||||||
|
|
||||||
### Update your alias
|
|
||||||
You should update your alias to point to /Users/admin/bin/gamadv-xtd3/gam.
|
|
||||||
|
|
||||||
Add/edit the following line:
|
|
||||||
```
|
|
||||||
alias gam="/Users/admin/bin/gamadv-xtd3/gam"
|
|
||||||
```
|
|
||||||
to one of these files based on your shell:
|
|
||||||
```
|
|
||||||
~/.bash_aliases
|
|
||||||
~/.bash_profile
|
|
||||||
~/.bashrc
|
|
||||||
~/.zshrc
|
|
||||||
~/.profile
|
|
||||||
```
|
|
||||||
|
|
||||||
Issue the following command replacing `<Filename>` with the name of the file you edited:
|
|
||||||
```
|
|
||||||
source <Filename>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Do you have a browser?
|
|
||||||
If your computer doesn't support a browser, Google Cloud Shell for instance, execute this command:
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam config no_browser true save
|
|
||||||
```
|
|
||||||
### Update your project to include the additional APIs that GAMADV-XTD3 uses.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 client access.
|
|
||||||
|
|
||||||
Update oauth2.txt; it must be updated to reflect the additional capabilites of GAMADV-XTD3.
|
|
||||||
|
|
||||||
You select a list of scopes, GAM uses a browser to get final authorization from Google for these scopes and
|
|
||||||
writes the credentials into the file oauth2.txt.
|
|
||||||
|
|
||||||
If the computer on which you are running GAM does not have access to a browser, issue this command:
|
|
||||||
```
|
|
||||||
gam config no_browser true oauth update
|
|
||||||
```
|
|
||||||
You will be given instructions on how to get the authorization on another computer and apply it locally.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam oauth update
|
|
||||||
|
|
||||||
Select the authorized scopes by entering a number.
|
|
||||||
Append an 'r' to grant read-only access or an 'a' to grant action-only access.
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[ ] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[*] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[*] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
s) Select all scopes
|
|
||||||
u) Unselect all scopes
|
|
||||||
e) Exit without changes
|
|
||||||
c) Continue to authorization
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address?admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?client_id=CLIENTID&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.courses+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.announcements+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.coursework.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.guardianlinks.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.emails+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.photos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.rosters+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudprint+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.read_only+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.datatransfer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.chromeos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.customer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.domain+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.group+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.mobile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.orgunit+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.resource.calendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.rolemanagement+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.userschema+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user.security+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Fcompliance%2Faudit%2F+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Femailsettings%2F2.0%2F+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.migration+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.settings+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.licensing+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.audit.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.usage.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.order+https%3A%2F%2Fsites.google.com%2Ffeeds+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fediscovery&login_hint=admin%40domain.com&access_type=offline&response_type=code
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Client OAuth2 File: /Users/admin/GAMConfig/oauth2.txt, Updated
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam user user@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs by less than 1 second from Google PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED! Please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/domain.com/ManageOauthClients?clientScopeToAdd=https://mail.google.com/,https://sites.google.com/feeds,https://www.google.com/m8/feeds,https://www.googleapis.com/auth/activity,https://www.googleapis.com/auth/apps.alerts,https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/classroom.announcements,https://www.googleapis.com/auth/classroom.coursework.students,https://www.googleapis.com/auth/classroom.rosters,https://www.googleapis.com/auth/classroom.topics,https://www.googleapis.com/auth/cloudprint,https://www.googleapis.com/auth/contacts,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.activity,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.settings.basic,https://www.googleapis.com/auth/gmail.settings.sharing,https://www.googleapis.com/auth/iam,https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/userinfo.email&clientNameToAdd=SVCACCTID
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console. The Client Name and API
|
|
||||||
Scopes fields will be pre-populated. Please click Authorize to allow these
|
|
||||||
scopes access. After authorizing it may take some time for this test to pass so
|
|
||||||
wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
admin@server:/Users/admin$ gam user user@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs by less than 1 second from Google PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
admin@server:/Users/admin$
|
|
||||||
```
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
In these examples, your Google Super admin is shown as admin@domain.com; replace with the
|
|
||||||
actual email adddress.
|
|
||||||
|
|
||||||
This example assumes that GAMADV-XTD3 has been installed in C:\GAMADV-XTD3; if you've installed
|
|
||||||
GAMADV-XTD3 in another directory, substitute that value in the directions.
|
|
||||||
|
|
||||||
GAMADV-XTD3 uses the same configuration directory and gam.cfg file as GAMADV-X and GAMADV-XTD.
|
|
||||||
|
|
||||||
### Update system path
|
|
||||||
You should update the system path to point to C:\GAMADV-XTD3.
|
|
||||||
```
|
|
||||||
Start Control Panel
|
|
||||||
Click System
|
|
||||||
Click Advanced system settings
|
|
||||||
Click Environment Variables...
|
|
||||||
Click Path under System variables
|
|
||||||
Click Edit...
|
|
||||||
If you have an existing entry referencing GAMADV-X or GAMADV-XTD:
|
|
||||||
Click that entry
|
|
||||||
Click Delete
|
|
||||||
If C:\GAMADV-XTD3 is already on the Path, skip the next three steps
|
|
||||||
Click New
|
|
||||||
Enter C:\GAMADV-XTD3
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Click OK
|
|
||||||
Exit Control Panel
|
|
||||||
```
|
|
||||||
|
|
||||||
At this point, you should restart Command Prompt so that it has the updated path and environment variables.
|
|
||||||
|
|
||||||
### Do you have a compatible browser?
|
|
||||||
If the computer on which you are running GAM does not have access to a browser or
|
|
||||||
your default browser is Internet Explorer or Edge, issue this command:
|
|
||||||
```
|
|
||||||
C:\>gam config no_browser true save
|
|
||||||
```
|
|
||||||
### Update your project to include the additional APIs that GAMADV-XTD3 uses.
|
|
||||||
```
|
|
||||||
C:\>gam update project
|
|
||||||
|
|
||||||
Enter your Google Workspace admin or GCP project manager email address authorized to manage project(s) gam-project-abc-123-xyz? admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&response_type=code&client_id=...
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
API: admin.googleapis.com, already enabled...
|
|
||||||
API: appsactivity.googleapis.com, already enabled...
|
|
||||||
API: calendar-json.googleapis.com, already enabled...
|
|
||||||
API: classroom.googleapis.com, already enabled...
|
|
||||||
API: contacts.googleapis.com, already enabled...
|
|
||||||
API: drive.googleapis.com, already enabled...
|
|
||||||
API: gmail.googleapis.com, already enabled...
|
|
||||||
API: groupssettings.googleapis.com, already enabled...
|
|
||||||
API: licensing.googleapis.com, already enabled...
|
|
||||||
API: plus.googleapis.com, already enabled...
|
|
||||||
API: reseller.googleapis.com, already enabled...
|
|
||||||
API: siteverification.googleapis.com, already enabled...
|
|
||||||
API: vault.googleapis.com, already enabled...
|
|
||||||
Enable 3 APIs
|
|
||||||
API: audit.googleapis.com, Enabled (1/3)
|
|
||||||
API: groupsmigration.googleapis.com, Enabled (2/3)
|
|
||||||
API: sheets.googleapis.com, Enabled (3/3)
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Update GAMADV-XTD3 client access.
|
|
||||||
|
|
||||||
Update oauth2.txt; it must be updated to reflect the additional capabilites of GAMADV-XTD3.
|
|
||||||
|
|
||||||
If the PC on which you are running GAM does not have access to a browser or if
|
|
||||||
your default browser is Internet Explorer or Edge, issue this command:
|
|
||||||
```
|
|
||||||
gam config no_browser true oauth update
|
|
||||||
```
|
|
||||||
You will be given instructions on how to get the authorization; this involves a long URL that must be copied/pasted.
|
|
||||||
Older versions of Command Prompt and PowerShell (Windows 7/8, Server 2008) can't properly copy/paste multi line strings;
|
|
||||||
GAM writes the long URL into the file `gamoauthurl.txt` in the folder with the GAM executable.
|
|
||||||
You can open the file with Notepad/Wordpad, do a control-A to select the text, control-C to copy the text,
|
|
||||||
start a browser and paste the URL (control-V) into the address bar. Authenticate and copy the Verification code
|
|
||||||
back to your Command Prompt/PowerShell window.
|
|
||||||
```
|
|
||||||
C:\>gam oauth update
|
|
||||||
|
|
||||||
Select the authorized scopes by entering a number.
|
|
||||||
Append an 'r' to grant read-only access or an 'a' to grant action-only access.
|
|
||||||
|
|
||||||
[*] 0) Calendar API (supports readonly)
|
|
||||||
[*] 1) Chrome Browser Cloud Management API (supports readonly)
|
|
||||||
[*] 2) Chrome Management API - AppDetails read only
|
|
||||||
[*] 3) Chrome Management API - Telemetry read only
|
|
||||||
[*] 4) Chrome Management API - read only
|
|
||||||
[*] 5) Chrome Policy API (supports readonly)
|
|
||||||
[*] 6) Chrome Printer Management API (supports readonly)
|
|
||||||
[ ] 7) Chrome Version History API
|
|
||||||
[*] 8) Classroom API - Course Announcements (supports readonly)
|
|
||||||
[*] 9) Classroom API - Course Topics (supports readonly)
|
|
||||||
[*] 10) Classroom API - Course Work/Materials (supports readonly)
|
|
||||||
[*] 11) Classroom API - Course Work/Submissions (supports readonly)
|
|
||||||
[*] 12) Classroom API - Courses (supports readonly)
|
|
||||||
[*] 13) Classroom API - Profile Emails
|
|
||||||
[*] 14) Classroom API - Profile Photos
|
|
||||||
[*] 15) Classroom API - Rosters (supports readonly)
|
|
||||||
[*] 16) Classroom API - Student Guardians (supports readonly)
|
|
||||||
[*] 17) Cloud Channel API (supports readonly)
|
|
||||||
[*] 18) Cloud Identity - Inbound SSO Settings (supports readonly)
|
|
||||||
[*] 19) Cloud Identity Groups API (supports readonly)
|
|
||||||
[*] 20) Cloud Identity OrgUnits API (supports readonly)
|
|
||||||
[*] 21) Cloud Identity User Invitations API (supports readonly)
|
|
||||||
[ ] 22) Cloud Storage API (Read Only, Vault/Takeout Download, Cloud Storage)
|
|
||||||
[ ] 23) Cloud Storage API (Read/Write, Vault/Takeout Copy/Download, Cloud Storage)
|
|
||||||
[*] 24) Contact Delegation API (supports readonly)
|
|
||||||
[*] 25) Contacts API - Domain Shared Contacts and GAL
|
|
||||||
[*] 26) Data Transfer API (supports readonly)
|
|
||||||
[*] 27) Directory API - Chrome OS Devices (supports readonly)
|
|
||||||
[*] 28) Directory API - Customers (supports readonly)
|
|
||||||
[*] 29) Directory API - Domains (supports readonly)
|
|
||||||
[*] 30) Directory API - Groups (supports readonly)
|
|
||||||
[*] 31) Directory API - Mobile Devices Directory (supports readonly and action)
|
|
||||||
[*] 32) Directory API - Organizational Units (supports readonly)
|
|
||||||
[*] 33) Directory API - Resource Calendars (supports readonly)
|
|
||||||
[*] 34) Directory API - Roles (supports readonly)
|
|
||||||
[*] 35) Directory API - User Schemas (supports readonly)
|
|
||||||
[*] 36) Directory API - User Security
|
|
||||||
[*] 37) Directory API - Users (supports readonly)
|
|
||||||
[ ] 38) Email Audit API
|
|
||||||
[*] 39) Groups Migration API
|
|
||||||
[*] 40) Groups Settings API
|
|
||||||
[*] 41) License Manager API
|
|
||||||
[*] 42) People API (supports readonly)
|
|
||||||
[*] 43) People Directory API - read only
|
|
||||||
[ ] 44) Pub / Sub API
|
|
||||||
[*] 45) Reports API - Audit Reports
|
|
||||||
[*] 46) Reports API - Usage Reports
|
|
||||||
[*] 47) Reseller API
|
|
||||||
[*] 48) Site Verification API
|
|
||||||
[ ] 49) Sites API
|
|
||||||
[*] 50) Vault API (supports readonly)
|
|
||||||
|
|
||||||
s) Select all scopes
|
|
||||||
u) Unselect all scopes
|
|
||||||
e) Exit without changes
|
|
||||||
c) Continue to authorization
|
|
||||||
Please enter 0-50[a|r] or s|u|e|c: c
|
|
||||||
|
|
||||||
Enter your Google Workspace admin email address? admin@domain.com
|
|
||||||
|
|
||||||
Your browser has been opened to visit:
|
|
||||||
|
|
||||||
https://accounts.google.com/o/oauth2/v2/auth?client_id=CLIENTID&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2F&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.courses+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.announcements+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.coursework.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.guardianlinks.students+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.emails+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.profile.photos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fclassroom.rosters+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloudprint+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.read_only+https%3A%2F%2Fwww.google.com%2Fm8%2Ffeeds+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.datatransfer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.chromeos+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.customer+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.domain+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.group+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.device.mobile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.orgunit+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.resource.calendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.rolemanagement+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.userschema+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user.security+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.directory.user+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Fcompliance%2Faudit%2F+https%3A%2F%2Fapps-apis.google.com%2Fa%2Ffeeds%2Femailsettings%2F2.0%2F+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.migration+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.groups.settings+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.licensing+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcontacts+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.audit.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fadmin.reports.usage.readonly+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fapps.order+https%3A%2F%2Fsites.google.com%2Ffeeds+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fediscovery&login_hint=admin%40domain.com&access_type=offline&response_type=code
|
|
||||||
|
|
||||||
If your browser is on a different machine then press CTRL+C,
|
|
||||||
set no_browser = true in gam.cfg and re-run this command.
|
|
||||||
|
|
||||||
Authentication successful.
|
|
||||||
Client OAuth2 File: C:\GAMConfig\oauth2.txt, Updated
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
### Enable GAMADV-XTD3 service account access.
|
|
||||||
```
|
|
||||||
C:\>gam user user@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs by less than 1 second from Google PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels FAIL (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels FAIL (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
Some scopes FAILED! Please go to:
|
|
||||||
|
|
||||||
https://admin.google.com/domain.com/ManageOauthClients?clientScopeToAdd=https://mail.google.com/,https://sites.google.com/feeds,https://www.google.com/m8/feeds,https://www.googleapis.com/auth/activity,https://www.googleapis.com/auth/apps.alerts,https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/classroom.announcements,https://www.googleapis.com/auth/classroom.coursework.students,https://www.googleapis.com/auth/classroom.rosters,https://www.googleapis.com/auth/classroom.topics,https://www.googleapis.com/auth/cloudprint,https://www.googleapis.com/auth/contacts,https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.activity,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.settings.basic,https://www.googleapis.com/auth/gmail.settings.sharing,https://www.googleapis.com/auth/iam,https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/userinfo.email&clientNameToAdd=SVCACCTID
|
|
||||||
|
|
||||||
You will be directed to the Google Workspace admin console. The Client Name and API
|
|
||||||
Scopes fields will be pre-populated. Please click Authorize to allow these
|
|
||||||
scopes access. After authorizing it may take some time for this test to pass so
|
|
||||||
wait a few moments and then try this command again.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
The link shown in the error message should take you directly to the authorization screen.
|
|
||||||
If not, make sure that you are logged in as a domain admin, then re-enter the link.
|
|
||||||
|
|
||||||
### Verify GAMADV-XTD3 service account access.
|
|
||||||
|
|
||||||
Wait a moment and then perform the following command; it it still fails, wait a bit longer, it can sometimes take serveral minutes
|
|
||||||
for the authorization to complete.
|
|
||||||
```
|
|
||||||
C:\>gam user user@domain.com check serviceaccount
|
|
||||||
System time status:
|
|
||||||
Your system time differs by less than 1 second from Google PASS
|
|
||||||
Service Account Private Key Authentication:
|
|
||||||
Authentication PASS
|
|
||||||
Domain-wide Delegation authentication:, User: admin@domain.com, Scopes: 34
|
|
||||||
https://mail.google.com/ PASS (1/34)
|
|
||||||
https://sites.google.com/feeds PASS (2/34)
|
|
||||||
https://www.googleapis.com/auth/analytics.readonly PASS (3/34)
|
|
||||||
https://www.googleapis.com/auth/apps.alerts PASS (4/34)
|
|
||||||
https://www.googleapis.com/auth/calendar PASS (5/34)
|
|
||||||
https://www.googleapis.com/auth/chat.delete PASS (6/34)
|
|
||||||
https://www.googleapis.com/auth/chat.memberships PASS (7/34)
|
|
||||||
https://www.googleapis.com/auth/chat.messages PASS (8/34)
|
|
||||||
https://www.googleapis.com/auth/chat.spaces PASS (9/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.announcements PASS (10/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.coursework.students PASS (11/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.courseworkmaterials PASS (12/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.profile.emails PASS (13/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.rosters PASS (14/34)
|
|
||||||
https://www.googleapis.com/auth/classroom.topics PASS (15/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-identity PASS (16/34)
|
|
||||||
https://www.googleapis.com/auth/cloud-platform PASS (17/34)
|
|
||||||
https://www.googleapis.com/auth/contacts PASS (18/34)
|
|
||||||
https://www.googleapis.com/auth/contacts.other.readonly PASS (19/34)
|
|
||||||
https://www.googleapis.com/auth/datastudio PASS (20/34)
|
|
||||||
https://www.googleapis.com/auth/directory.readonly PASS (21/34)
|
|
||||||
https://www.googleapis.com/auth/documents PASS (22/34)
|
|
||||||
https://www.googleapis.com/auth/drive PASS (23/34)
|
|
||||||
https://www.googleapis.com/auth/drive.activity PASS (24/34)
|
|
||||||
https://www.googleapis.com/auth/drive.admin.labels PASS (25/34)
|
|
||||||
https://www.googleapis.com/auth/drive.labels PASS (26/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.modify PASS (27/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.basic PASS (28/34)
|
|
||||||
https://www.googleapis.com/auth/gmail.settings.sharing PASS (29/34)
|
|
||||||
https://www.googleapis.com/auth/keep PASS (30/34)
|
|
||||||
https://www.googleapis.com/auth/spreadsheets PASS (31/34)
|
|
||||||
https://www.googleapis.com/auth/tasks PASS (32/34)
|
|
||||||
https://www.googleapis.com/auth/userinfo.profile PASS (33/34)
|
|
||||||
https://www.googleapis.com/auth/youtube.readonly PASS (34/34)
|
|
||||||
All scopes PASSED!
|
|
||||||
Service Account Client name: SVCACCTID is fully authorized.
|
|
||||||
|
|
||||||
C:\>
|
|
||||||
```
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
# Introduction
|
|
||||||
GAMADV-XTD3 is a free, open source command line tool for Google Workspace (formerly G Suite) Administrators to manage domain and user settings quickly and easily.
|
|
||||||
|
|
||||||
GAMADV-XTD3 is built with Python 3.
|
|
||||||
|
|
||||||
This page provides simple instructions for downloading, installing and starting to use GAMADV-XTD3.
|
|
||||||
|
|
||||||
GAMADV-XTD3 runs on all versions of Google Workspace; Google Apps Free Edition has limited API support and not all GAM commands work.
|
|
||||||
|
|
||||||
GAMADV-XTD3 is a rewrite/extension of Jay Lee's [GAM], without his efforts, this version wouldn't exist.
|
|
||||||
|
|
||||||
GAMADV-XTD3 is backwards compatible with [GAM], meaning that if your command works with regular GAM, it will also work with GAMADV-XTD3. There may be differences in output, but the syntax is compatible.
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
Documentation for GAMADV-XTD3 is hosted in the [GitHub GAMADV-XTD3 Wiki] and in Gam*.txt files.
|
|
||||||
|
|
||||||
# Mailing List / Discussion group
|
|
||||||
The GAM mailing list / discussion group is hosted on [Google Groups]. You can join the list and interact via email, or just post from the web itself.
|
|
||||||
|
|
||||||
# Source Repository
|
|
||||||
The official GAMADV-XTD3 source repository is on [GitHub] in the master branch.
|
|
||||||
|
|
||||||
# Author
|
|
||||||
GAMADV-XTD3 is maintained by <a href="mailto:ross.scroggs@gmail.com">Ross Scroggs</a>.
|
|
||||||
|
|
||||||
# Requirements
|
|
||||||
To run all commands properly, GAMADV-XTD3 requires three things:
|
|
||||||
* An API project which identifies your install of GAMADV-XTD3 to Google and keeps track of API quotas.
|
|
||||||
* Authorization to act as your G Suite Administrator in order to perform management functions like add users, modify group settings and membership and pull domain reports.
|
|
||||||
* A special service account that is authorized to act on behalf of your users in order to modify user-specific settings and data such as Drive files, Calendars and Gmail messages and settings like signatures.
|
|
||||||
|
|
||||||
# Installation - First time GAM installation
|
|
||||||
Use these steps if you have never used any version of GAM in your domain. They will create a GAM project
|
|
||||||
and all necessary authentications.
|
|
||||||
|
|
||||||
| [Downloads] | [Configuration] | [Install] |
|
|
||||||
| :---: | :---: | :---: |
|
|
||||||
|
|
||||||
# Installation - Update Advanced GAM
|
|
||||||
Use these steps to update your version of GAMADV-XTD3.
|
|
||||||
|
|
||||||
| [Downloads] | [Configuration] | [UpdateAdvanced] |
|
|
||||||
| :---: | :---: | :---: |
|
|
||||||
|
|
||||||
# Installation - Upgrading from Standard GAM
|
|
||||||
Use these steps if you have used any version of Standard GAM in your domain. They will update your GAM project
|
|
||||||
and all necessary authentications.
|
|
||||||
|
|
||||||
| [Downloads] | [Configuration] | [UpgradeFromStandard] |
|
|
||||||
| :---: | :---: | :---: |
|
|
||||||
|
|
||||||
# Installation - Upgrading from a prior version of GAMADV-X or GAMADV-XTD
|
|
||||||
Use these steps if you already use GAMADV-X or GAMADV-XTD. The updates may tell you to update your GAM project
|
|
||||||
or authentications because new features have been included.
|
|
||||||
|
|
||||||
| [Updates] | [Downloads] | [UpgradeFromAdvanced] |
|
|
||||||
| :---: | :---: | :---: |
|
|
||||||
|
|
||||||
# Multiple Versions
|
|
||||||
You can install multiple versions of GAM and GAMADV-XTD3 in different parallel directories.
|
|
||||||
|
|
||||||
[GAM]: https://github.com/GAM-team/GAM
|
|
||||||
[GitHub Releases]: https://github.com/taers232c/GAMADV-XTD3/releases
|
|
||||||
[GitHub]: https://github.com/taers232c/GAMADV-XTD3/tree/master
|
|
||||||
[GitHub GAMADV-XTD3 Wiki]: https://github.com/taers232c/GAMADV-XTD3/wiki
|
|
||||||
[Google Groups]: https://groups.google.com/group/google-apps-manager
|
|
||||||
[Downloads]: https://github.com/taers232c/GAMADV-XTD3/wiki/Downloads
|
|
||||||
[Configuration]: https://github.com/taers232c/GAMADV-XTD3/wiki/gam.cfg
|
|
||||||
[Install]: https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Install-Advanced-GAM
|
|
||||||
[UpdateAdvanced]: https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Update-Advanced-GAM
|
|
||||||
[UpgradeFromStandard]: https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Upgrade-from-Standard-GAM
|
|
||||||
[Updates]: https://github.com/taers232c/GAMADV-XTD3/wiki/GAM-Updates
|
|
||||||
[UpgradeFromAdvanced]: https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Upgrade-from-GAMADV-X-or-GAMADV-XTD
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
# Running GAMADV-XTD3 securely on a Google Compute Engine
|
|
||||||
- [thanks](#thanks)
|
|
||||||
- [Introduction](#introduction)
|
|
||||||
- [Setup Steps](#setup-steps)
|
|
||||||
|
|
||||||
## Thanks
|
|
||||||
|
|
||||||
Thanks to Jay Lee for the original version of this document.
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
GAMADV-XTD3 can run on a Linux or Windows Google Compute Engine (GCE) VM and use the attached service account to access Google Workspace APIs. The advantage of this configuration is that no service account private key is accessible to GAMADV-XTD3 directly and there is no risk of the key being stolen/lost.
|
|
||||||
|
|
||||||
GAMADV-XTD3 version 6.50.00 or higher is required.
|
|
||||||
|
|
||||||
## Setup Steps
|
|
||||||
1. Create a [GCP project](https://cloud.google.com/resource-manager/docs/creating-managing-projects).
|
|
||||||
|
|
||||||
2. Create [a service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts) which will be used by GAMADV-XTD3.
|
|
||||||
* Enter a value in `Service account name`
|
|
||||||
* Enter text in `Service account description`
|
|
||||||
* Click `Create` and `Continue`
|
|
||||||
* Click `Continue` under `Grant this service account access to project`
|
|
||||||
* Click `Done` under `Grant users access to this service account`
|
|
||||||
|
|
||||||
3. Grant the service account rights to generate authentication tokens.
|
|
||||||
* Go to [console.cloud.google.com](https://console.cloud.google.com).
|
|
||||||
* Go to `IAM & Admin` > `Service accounts`
|
|
||||||
* Click on the service account you created (not the default service account).
|
|
||||||
* Copy the email address of your service account to the clipboard.
|
|
||||||
* Click on the `Permissions` tab.
|
|
||||||
* Click `Grant Access`.
|
|
||||||
* In the `New principals` text box, paste the service account email you copied.
|
|
||||||
* Give your service account the `Service Account Token Creator` and `View Service Accounts` roles.
|
|
||||||
* Click `Save`
|
|
||||||
|
|
||||||
4. [Create a Windows or Linux virtual machine](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances).
|
|
||||||
* Scroll down and start at Create a VM and attach the service account
|
|
||||||
* Click `Go to VM instances`
|
|
||||||
* Click `Create Instance`
|
|
||||||
* Enter a value for `Name`
|
|
||||||
* Configure `Manage Tags and Labels`
|
|
||||||
* You can choose a region physically close to you though you may be limited in your choices if you want to use the free tier.
|
|
||||||
* GAMADV-XTD3 can run on the minimal `e2-micro` [free tier VM](https://cloud.google.com/free/docs/free-cloud-features#compute) though performance may suffer. If you are performing batch operations, raising the CPU count will help performance. If you have a very large and busy Workspace instance downloading reports or Drive file lists may require more RAM.
|
|
||||||
* Set `Service account` under `Identity and API access/API and identity management`; choose the service account you created above.
|
|
||||||
* Select `Set access for each API`
|
|
||||||
* Enable `Cloud Platform`
|
|
||||||
* GAMADV-XTD3 does not use a significant amount of storage, unless you have specific storage needs the default disk size should suffice.
|
|
||||||
* Leave other VM instance settings at their defaults unless you know what you are doing.
|
|
||||||
* Click `Create`
|
|
||||||
|
|
||||||
5. Install GAMADV-XTD3 on the VM
|
|
||||||
* See: https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Install-Advanced-GAM
|
|
||||||
|
|
||||||
6. Logout and log back in to the VM, you should now be able to run GAMADV-XTD3 commands like:
|
|
||||||
```
|
|
||||||
gam version
|
|
||||||
```
|
|
||||||
|
|
||||||
7. Create the special `oauth2service.json` file GAMADV-XTD3 will use:
|
|
||||||
```
|
|
||||||
gam create gcpserviceaccount
|
|
||||||
```
|
|
||||||
If you'd like, take a look at the generated ```oauth2service.json``` file;
|
|
||||||
you'll notice that while the file has some fields similar to a normal service account file, there is no `private_key` attribute containing an RSA private key.
|
|
||||||
|
|
||||||
8. Enable the Google APIs GAMADV-XTD3 will use:
|
|
||||||
```
|
|
||||||
gam enable apis
|
|
||||||
```
|
|
||||||
You are given the option to enable them automatically or manually. Automatic enablement will ask you to authenticate to GAMADV-XTD3. You should authenticate as a user with rights to manage project APIs, probably a project owner. If you are not the project owner you can choose manual enablement and GAMADV-XTD3 will provide two or more URLs which you can send to the project owner. When the owner opens these URLs, they'll be prompted to enable all the APIs GAMADV-XTD3 needs.
|
|
||||||
|
|
||||||
9. Perform admin actions (manage users, groups, orgunits, Chrome devices, etc)
|
|
||||||
* [Configure delegated admin service account (DASA)](https://github.com/taers232c/GAMADV-XTD3/wiki/Using-GAMADV-XTD3-with-a-delegated-admin-service-account); start at step 4.
|
|
||||||
|
|
||||||
10. Manage user data
|
|
||||||
* Run ```gam user user@domain.com check serviceaccount``` and follow the instructions to perform domain-wide delegation.
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
# Sites
|
|
||||||
- [API documentation](#api-documentation)
|
|
||||||
- [Definitions](#definitions)
|
|
||||||
- [Manage classic sites](#manage-classic-sites)
|
|
||||||
- [Display classic sites](#display-classic-sites)
|
|
||||||
- [Manage classic sites access](#manage-classic-sites-access)
|
|
||||||
- [Display classic sites access](#display-classic-sites-access)
|
|
||||||
|
|
||||||
## API documentation
|
|
||||||
* https://developers.google.com/google-apps/sites/docs/1.0/developers_guide_python
|
|
||||||
|
|
||||||
## Definitions
|
|
||||||
```
|
|
||||||
<Date> ::=
|
|
||||||
<Year>-<Month>-<Day> |
|
|
||||||
(+|-)<Number>(d|w|y) |
|
|
||||||
never|
|
|
||||||
today
|
|
||||||
|
|
||||||
<DomainName> ::= <String>(.<String>)+
|
|
||||||
<DomainNameList> ::= "<DomainName>(,<DomainName>)*"
|
|
||||||
<DomainNameEntity> ::=
|
|
||||||
<DomainNameList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
|
||||||
|
|
||||||
<SiteName> ::= [a-z,0-9,-]+
|
|
||||||
<SiteItem> ::= [<DomainName>/]<SiteName>
|
|
||||||
<SiteList> ::= "<SiteItem>(,<SiteItem>)*"
|
|
||||||
<SiteEntity> ::=
|
|
||||||
<SiteList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
|
||||||
|
|
||||||
<SiteACLRole> ::= editor|owner|reader|writer
|
|
||||||
<SiteACLRoleList> ::= "<SiteACLRole>(,<SiteACLRole>)*"
|
|
||||||
|
|
||||||
<SiteAttribute> ::=
|
|
||||||
(categories <String>)|
|
|
||||||
(name <String>)|
|
|
||||||
(sourcelink <URI>])|
|
|
||||||
(summary <String>)|
|
|
||||||
(theme <String>)
|
|
||||||
|
|
||||||
<SiteACLScope> ::=
|
|
||||||
<EmailAddress>|user:<EmailAdress>|group:<EmailAddress>|
|
|
||||||
domain:<DomainName>|domain|default
|
|
||||||
<SiteACLScopeList> ::= "<SiteACLScope>(,<SiteACLScope>)*"
|
|
||||||
<SiteACLScopeEntity> ::=
|
|
||||||
<SiteACLScopeList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
|
||||||
```
|
|
||||||
## Manage classic sites
|
|
||||||
```
|
|
||||||
gam [<UserTypeEntity>] create site <SiteItem> <SiteAttribute>*
|
|
||||||
gam [<UserTypeEntity>] update sites <SiteEntity> <SiteAttribute>+
|
|
||||||
```
|
|
||||||
## Display classic sites
|
|
||||||
```
|
|
||||||
gam [<UserTypeEntity>] info sites <SiteEntity>
|
|
||||||
[withmappings] [role|roles all|<SiteACLRoleList>]
|
|
||||||
gam [<UserTypeEntity>] show sites [domain|domains <DomainNameEntity>] [includeallsites]
|
|
||||||
[withmappings] [role|roles all|<SiteACLRoleList>] [maxresults <Number>]
|
|
||||||
gam [<UserTypeEntity>] print sites [todrive <ToDriveAttribute>*]
|
|
||||||
[domain|domains <DomainNameEntity>] [includeallsites]
|
|
||||||
[withmappings] [role|roles all|<SiteACLRoleList>] [maxresults <Number>]
|
|
||||||
[convertcrnl] [delimiter <Character>]
|
|
||||||
|
|
||||||
gam [<UserTypeEntity>] print siteactivity <SiteEntity> [todrive <ToDriveAttribute>*]
|
|
||||||
[maxresults <Number>] [updated_min <Date>] [updated_max <Date>]
|
|
||||||
```
|
|
||||||
## Manage classic sites access
|
|
||||||
```
|
|
||||||
gam [<UserTypeEntity>] add siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] update siteacls <SiteEntity> <SiteACLRole> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] delete siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
||||||
```
|
|
||||||
## Display classic sites access
|
|
||||||
```
|
|
||||||
gam [<UserTypeEntity>] info siteacls <SiteEntity> <SiteACLScopeEntity>
|
|
||||||
gam [<UserTypeEntity>] show siteacls <SiteEntity>
|
|
||||||
gam [<UserTypeEntity>] print siteacls <SiteEntity> [todrive <ToDriveAttribute>*]
|
|
||||||
```
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
# Users - Forms
|
|
||||||
- [API documentation](#api-documentation)
|
|
||||||
- [Notes](#notes)
|
|
||||||
- [Create a Form](#create-a-form)
|
|
||||||
- [Update a Form](#update-a-form)
|
|
||||||
- [Display Forms](#display-forms)
|
|
||||||
- [Display Form Responses](#display-form-responses)
|
|
||||||
- [Combine Form Information](#combine-form-information)
|
|
||||||
|
|
||||||
## API documentation
|
|
||||||
* https://developers.google.com/forms/api/reference/rest
|
|
||||||
|
|
||||||
## Notes
|
|
||||||
To use these commands you must add the 'Forms API' to your project and update your service account authorization.
|
|
||||||
|
|
||||||
Forms are identified by their `<DriveFileID>`.
|
|
||||||
```
|
|
||||||
gam update project
|
|
||||||
gam user user@domain.com update serviceaccount
|
|
||||||
```
|
|
||||||
|
|
||||||
## Definitions
|
|
||||||
* [`<DriveFileEntity>`](Drive-File-Selection)
|
|
||||||
* [`<UserTypeEntity>`](Collections-of-Users)
|
|
||||||
|
|
||||||
```
|
|
||||||
<DriveFileParentAttribute> ::=
|
|
||||||
(parentid <DriveFolderID>)|
|
|
||||||
(parentname <DriveFolderName>)|
|
|
||||||
(anyownerparentname <DriveFolderName>)|
|
|
||||||
(teamdriveparentid <DriveFolderID>)|
|
|
||||||
(teamdriveparent <SharedDriveName>)|
|
|
||||||
(teamdriveparentid <SharedDriveID> teamdriveparentname <DriveFolderName>)|
|
|
||||||
(teamdriveparent <SharedDriveName> teamdriveparentname <DriveFolderName>))|
|
|
||||||
(teamdriveparentid <DriveFolderID>)|(teamdriveparent <SharedDriveName>)|
|
|
||||||
(teamdriveparentid <SharedDriveID> teamdriveparentname <DriveFolderName>)|
|
|
||||||
(teamdriveparent <SharedDriveName> teamdriveparentname <DriveFolderName>)
|
|
||||||
|
|
||||||
<Time> ::=
|
|
||||||
<Year>-<Month>-<Day>(<Space>|T)<Hour>:<Minute>:<Second>[.<MilliSeconds>](Z|(+|-(<Hour>:<Minute>))) |
|
|
||||||
(+|-)<Number>(m|h|d|w|y) |
|
|
||||||
never|
|
|
||||||
now|today
|
|
||||||
```
|
|
||||||
|
|
||||||
## Create a Form
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> create form
|
|
||||||
title <String> [description <String>] [isquiz [Boolean>]
|
|
||||||
[drivefilename <DriveFileName>] [<DriveFileParentAttribute>]
|
|
||||||
[(csv [todrive <ToDriveAttribute>*]) | returnidonly]
|
|
||||||
```
|
|
||||||
|
|
||||||
If `drivefilename <DriveFileName>` is not specified, the file will be named `<String>` from `title`.
|
|
||||||
|
|
||||||
By default, the user, form title and file name/ID values are displayed on stdout.
|
|
||||||
* `csv [todrive <ToDriveAttribute>*]` - Write user, file ID, file name, form title and responderUri values to a CSV file.
|
|
||||||
* `returnidonly` - Display just the file ID of the created file as output
|
|
||||||
|
|
||||||
To retrieve the file ID with `returnidonly`:
|
|
||||||
```
|
|
||||||
Linux/MacOS
|
|
||||||
fileId=$(gam user user@domain.com create form title "xyz" ... returnidonly)
|
|
||||||
Windows PowerShell
|
|
||||||
$fileId = & gam user user@domain.com create form title "xyz" ... returnidonly
|
|
||||||
```
|
|
||||||
The file ID will only be valid when the return code of the command is 0; program accordingly.
|
|
||||||
|
|
||||||
## Update a Form
|
|
||||||
Select forms with `<DriveFileEntity>`:
|
|
||||||
* `<DriveFileID>` - Update a specific form
|
|
||||||
* `my_forms` - Update all forms owned by the user
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> update form <DriveFileEntity>
|
|
||||||
[title <String>] [description <String>] [isquiz [Boolean>]
|
|
||||||
```
|
|
||||||
|
|
||||||
## Display Forms
|
|
||||||
Select forms with `<DriveFileEntity>`:
|
|
||||||
* `<DriveFileID>` - Display responses for a specific form
|
|
||||||
* `my_forms` - Display responses for all forms owned by the user
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> show forms <DriveFileEntity>
|
|
||||||
[formatjson]
|
|
||||||
```
|
|
||||||
By default, Gam displays the information as an indented list of keys and values.
|
|
||||||
* `formatjson` - Display the form in JSON format
|
|
||||||
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> print forms <DriveFileEntity> [todrive <ToDriveAttribute>*]
|
|
||||||
(addcsvdata <FieldName> <String>)*
|
|
||||||
[formatjson [quotechar <Character>]]
|
|
||||||
```
|
|
||||||
* `addcsvdata <FieldName> <String>` - Add additional columns of data from the command line to the output
|
|
||||||
|
|
||||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
|
||||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
|
||||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
|
||||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
|
||||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
|
||||||
|
|
||||||
## Display Form Responses
|
|
||||||
Select forms with `<DriveFileEntity>`:
|
|
||||||
* `<DriveFileID>` - Display responses for a specific form
|
|
||||||
* `my_forms` - Display responses for all forms owned by the user
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> show formresponses <DriveFileEntity>
|
|
||||||
[filtertime.* <Time>] [filter <String>]
|
|
||||||
[countsonly|formatjson]
|
|
||||||
```
|
|
||||||
By default, GAM displays form response details, use the `countsonly` option to get the number of responses but no response details.
|
|
||||||
|
|
||||||
By default, GAM displays all form responses, you can filter by response time:
|
|
||||||
* `timestamp > <Time>` - Display all form responses submitted after `<Time>`
|
|
||||||
* `timestamp >= <Time>` - Display all form responses submitted at or after `<Time>`
|
|
||||||
|
|
||||||
For example, to get the form responses submitted since the beginning of the year:
|
|
||||||
* `filter timestamp >= 2022-01-01T00:00:00Z`
|
|
||||||
|
|
||||||
Use the `filtertime.* <Time>` option to allow times, usually relative, to be substituted into the `filter <String>` option.
|
|
||||||
The characters following `filtertime` can be any combination of lowercase letters and numbers.
|
|
||||||
|
|
||||||
For example, to get the responses subnitted in the last four hours:
|
|
||||||
* `filtertime4h -4h filter "timestamp >= #filtertime4h#`
|
|
||||||
|
|
||||||
By default, Gam displays the information as an indented list of keys and values.
|
|
||||||
* `formatjson` - Display the form response in JSON format
|
|
||||||
|
|
||||||
```
|
|
||||||
gam <UserTypeEntity> print formresponses <DriveFileEntity> [todrive <ToDriveAttribute>*]
|
|
||||||
(addcsvdata <FieldName> <String>)*
|
|
||||||
[filtertime.* <Time>] [filter <String>]
|
|
||||||
[countsonly|(formatjson [quotechar <Character>])]
|
|
||||||
```
|
|
||||||
By default, GAM displays form response details, use the `countsonly` option to get the number of responses but no response details.
|
|
||||||
|
|
||||||
* `addcsvdata <FieldName> <String>` - Add additional columns of data from the command line to the output
|
|
||||||
|
|
||||||
By default, GAM displays all form responses, you can filter by response time:
|
|
||||||
* `timestamp > <Time>` - Display all form responses submitted after `<Time>`
|
|
||||||
* `timestamp >= <Time>` - Display all form responses submitted at or after `<Time>`
|
|
||||||
|
|
||||||
For example, to get the form responses submitted since the beginning of the year:
|
|
||||||
* `filter timestamp >= 2022-01-01T00:00:00Z`
|
|
||||||
|
|
||||||
Use the `filtertime.* <Time>` option to allow times, usually relative, to be substituted into the `filter <String>` option.
|
|
||||||
The characters following `filtertime` can be any combination of lowercase letters and numbers.
|
|
||||||
|
|
||||||
For example, to get the responses subnitted in the last four hours:
|
|
||||||
* `filtertime4h -4h filter "timestamp >= #filtertime4h#`
|
|
||||||
|
|
||||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
|
||||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
|
||||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
|
||||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
|
||||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
|
||||||
|
|
||||||
## Combine Form Information
|
|
||||||
Combine form information from several GAM commands.
|
|
||||||
|
|
||||||
```
|
|
||||||
# Get form Id and createdTime
|
|
||||||
gam redirect csv ./forms.csv user user@domain.com print filelist showmimetype gform fields id,name,createdtime
|
|
||||||
# Get number of responses, add createdTime
|
|
||||||
gam redirect csv ./formsresponses.csv multiprocess csv forms.csv gam user "~Owner" print formresponses "~id" countsonly addcsvdata createdTime "~createdTime"
|
|
||||||
# Get full form info, add createdTime and responses (count)
|
|
||||||
gam redirect csv ./formsinfo.csv multiprocess csv formsresponses.csv gam user "~User" print forms "~formId" addcsvdata createdTime "~createdTime" addcsvdata responses "~responses"
|
|
||||||
```
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
# Using GAMADV-XTD3 with a YubiKey
|
|
||||||
- [Thanks](#thanks)
|
|
||||||
- [Yubikey ykman PIV Commands](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html)
|
|
||||||
- [Introduction](#introduction)
|
|
||||||
- [FAQs](#faqs)
|
|
||||||
- [Setup Steps](#setup-steps)
|
|
||||||
|
|
||||||
## Thanks
|
|
||||||
|
|
||||||
Thanks to Jay Lee for the original version of this document.
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
GAMADV-XTD3 supports using a [YubiKey](https://www.yubico.com/products/yubikey-5-overview/) to generate and store the service account's private RSA key. Private keys generated by the YubiKey cannot be exported even to the computer running GAMADV-XTD3. When compared to the plain text oauth2service.json file with the private key stored in text, the YubiKey offers a more secure option that prevents digital theft and copying of the private key. Instead of reading the private key from the oauth2service.json file and signing requests itself, GAMADV-XTD3 will simply send signing requests to the YubiKey and get back the signature.
|
|
||||||
|
|
||||||
GAMADV-XTD3 version 6.50.01 or higher is required. Best practice is to always use the [latest version of GAMADV-XTD3](https://github.com/taers232c/GAMADV-XTD3/wiki/How-to-Update-Advanced-GAM).
|
|
||||||
|
|
||||||
## FAQs
|
|
||||||
### Can I use a Google Titan or other brand security key?
|
|
||||||
No, while Titan keys are great as security keys / U2F / 2SV, that is not the protocol being used by GAMADV-XTD3 here. GAMADV-XTD3 uses the PIV app of YubiKeys to work with service accounts. You need to use [a genuine Yubikey.](https://yubico.com/genuine/).
|
|
||||||
|
|
||||||
### Does this protect the admin credentials GAMADV-XTD3 stores in oauth2.txt?
|
|
||||||
No, the admin credentials GAMADV-XTD3 stores in oauth2.txt are not protected by the YubiKey as they are not using RSA private keys. Only the service account credentials normally stored in oauth2service.json are protected. The service account credentials are used for domain-wide delegation operations like managing Workspace user data in Drive, Gmail and Calendar. Note that GAMADV-XTD3 also has the ability to perform admin actions as a delegated admin service account (DASA). See [instructions for setting up DASA](https://github.com/taers232c/GAMADV-XTD3/wiki/Using-GAMADV-XTD3-with-a-delegated-admin-service-account.md). When DASA is setup, GAMADV-XTD3 will use the service account to authenticate which can be protected by the YubiKey.
|
|
||||||
|
|
||||||
### What if someone physically steals the YubiKey?
|
|
||||||
The YubiKey can be configured with a PIN that must be entered in order for it to sign data with the private key. GAMADV-XTD3 stores this PIN string in the oauth2service.json file so it can use it as needed. What this means is that an attacker would need to steal *both* the physical YubiKey and the PIN stored in oauth2service.json. The recommendation is to store oauth2service.json and the rest of the GAM directory on an encrypted partition. The YubiKey itself should also be kept in a secure location.
|
|
||||||
|
|
||||||
### Can I require a physical touch of the YubiKey before the private key can be used?
|
|
||||||
Yes but in practice this does not work very well with GAMADV-XTD3. The YubiKey will need to be touched every time there is a GAMADV-XTD3 command running which for batch or cron jobs may be constant. GAMADV-XTD3 can use a PIN configured on the YubiKey in order to offer an additional layer of protection.
|
|
||||||
|
|
||||||
### If I use a YubiKey, do I need to rotate the private key regularly?
|
|
||||||
No, because the YubiKey generated the private key it cannot be digitally exported from the YubiKey so there is no chance for it to be copied and stolen. Instead you should physically secure the YubiKey from theft.
|
|
||||||
|
|
||||||
### What data does the service account private key have access to?
|
|
||||||
When using domain-wide delegation with GAMADV-XTD3, the service account and anyone possessing the service account private key oauth2service.json file has access to the Gmail, Drive and Calendar data of ALL Workspace users in your domain. For this reason, whether using a YubiKey or not, you should take strong measures to protect the service account private key.
|
|
||||||
|
|
||||||
## Setup Steps
|
|
||||||
1. Upgrade to at least GAMADV-XTD3 6.50.01.
|
|
||||||
2. **If you are using a new YubiKey or don't care about the PIV app data on the YubiKey**
|
|
||||||
1. Tell GAMADV-XTD3 to reset and configure the PIV app data on the YubiKey. This wipes all existing keys and configuration and then configures a private key and PIN for GAMADV-XTD3.
|
|
||||||
* Single YubiKey - `gam yubikey reset_piv`
|
|
||||||
* Multiple YubiKeys - `gam yubikey reset_piv yubikeyserialnumber <Number>`
|
|
||||||
2. During the PIV reset, GAMADV-XTD3 will print out a PIN for the private key, record this key.
|
|
||||||
4. **If you are already using the YubiKey and wish to preserve the PIV app data and keys**
|
|
||||||
1. You need to configure one of the PIV slots for a private key GAMADV-XTD3 can use.
|
|
||||||
* [ykman piv keys generate](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html#ykman-piv-keys-options-command-args)
|
|
||||||
`ykman piv keys generate -P <Text> --pin-policy ALWAYS --touch-policy NEVER --algorithm RSA2048 9a new_pubkey.txt`
|
|
||||||
* Use `9a` for the `AUTHENTICATION` slot, `9c` for the `SIGNATURE` slot
|
|
||||||
2. You need to generate a certificate for that slot.
|
|
||||||
* [ykman piv certificates generate](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html#ykman-piv-certificates-generate-options-slot-public-key)
|
|
||||||
`ykman piv certificates generate -P <Text> --subject "GAM Service Account" -d 36500 9a new_pubkey.txt`
|
|
||||||
* Use `9a` for the `AUTHENTICATION` slot, `9c` for the `SIGNATURE` slot
|
|
||||||
|
|
||||||
5. Now that you have a private key on your YubiKey, tell GAMADV-XTD3 to use that instead of the private_key stored in oauth2service.json. We can do that by rotating the key:
|
|
||||||
```
|
|
||||||
copy oauth2service.json to oauth2service.save
|
|
||||||
gam create sakey yubikey yubikey_pin yubikey_slot AUTHENTICATION|SIGNATURE
|
|
||||||
```
|
|
||||||
The yubikey argument tells GAMADV-XTD3 to use a private key on a plugged in YubiKey. The yubikey_pin argument tells GAMADV-XTD3 to prompt you to input the PIN that was set in the previous step. The yubikey_slot argument tells GAMADV-XTD3 which PIV slot to use on the YubiKey.
|
|
||||||
|
|
||||||
If there are problems, you can go back to the original oauth2service.json.
|
|
||||||
```
|
|
||||||
copy oauth2service.json to oauth2service.yk
|
|
||||||
copy oauth2service.save to oauth2service.json
|
|
||||||
```
|
|
||||||
|
|
||||||
6. Now you should be able to run GAMADV-XTD3 commands like:
|
|
||||||
```
|
|
||||||
gam user admin@example.com check serviceaccount
|
|
||||||
```
|
|
||||||
and see the YubiKey lights flash as the YubiKey interacts with GAMADV-XTD3 to sign the GAMADV-XTD3 authentication requests. If you look at the oauth2service.json file, you'll see it contains some new fields like yubikey_serial and yubikey_pin but no longer contains the private_key field where GAMADV-XTD3 would normally store the private key data.
|
|
||||||
|
|
||||||
7. As a last step, since YubiKey-stored private keys do not need to be and should not be rotated, you can remove the service account's permissions to change it's own key. Navigate to the [Cloud Console](https://console.cloud.google.com/iam-admin/serviceaccounts) select the correct project and service account and on the Permissions tab, edit and remove the "Service Account Key Admin" permission that the service account has to itself.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
Need more help? Ask on the [GAM Discussion Group](https://groups.google.com/forum/#!forum/google-apps-manager)
|
|
||||||
65
pyproject.toml
Normal file
65
pyproject.toml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
[project]
|
||||||
|
name = "gam7"
|
||||||
|
dynamic = [
|
||||||
|
"version",
|
||||||
|
]
|
||||||
|
authors = [
|
||||||
|
{ name="Jay Lee", email="jay0lee@gmail.com" },
|
||||||
|
{ name="Ross Scroggs", email="Ross.Scroggs@gmail.com" },
|
||||||
|
]
|
||||||
|
# notice that yubikey-manager remains optional further down since it is less command and adds
|
||||||
|
#significant compile dependencies.
|
||||||
|
dependencies = [
|
||||||
|
"chardet>=5.2.0",
|
||||||
|
"cryptography>=44.0.2",
|
||||||
|
"distro; sys_platform=='linux'",
|
||||||
|
"filelock>=3.18.0",
|
||||||
|
"google-api-python-client>=2.167.0",
|
||||||
|
"google-auth-httplib2>=0.2.0",
|
||||||
|
"google-auth-oauthlib>=1.2.2",
|
||||||
|
"google-auth>=2.39.0",
|
||||||
|
"httplib2>=0.22.0",
|
||||||
|
"lxml>=5.4.0",
|
||||||
|
"passlib>=1.7.4",
|
||||||
|
"pathvalidate>=3.2.3",
|
||||||
|
"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.6.1"]
|
||||||
|
|
||||||
|
[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"
|
||||||
1364
src/GamCommands.txt
1364
src/GamCommands.txt
File diff suppressed because it is too large
Load Diff
1423
src/GamUpdate.txt
1423
src/GamUpdate.txt
File diff suppressed because it is too large
Load Diff
1
src/README.md
Symbolic link
1
src/README.md
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../README.md
|
||||||
File diff suppressed because it is too large
Load Diff
281
src/cacerts.pem
281
src/cacerts.pem
@@ -1,33 +1,3 @@
|
|||||||
# Operating CA: DigiCert
|
|
||||||
# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
|
||||||
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
|
||||||
# Label: "Baltimore CyberTrust Root"
|
|
||||||
# Serial: 33554617
|
|
||||||
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
|
|
||||||
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
|
|
||||||
# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
|
|
||||||
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
|
|
||||||
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
|
|
||||||
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
|
|
||||||
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
|
|
||||||
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
|
|
||||||
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
|
|
||||||
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
|
|
||||||
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
|
|
||||||
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
|
|
||||||
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
|
|
||||||
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
|
|
||||||
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
|
|
||||||
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
|
|
||||||
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
|
|
||||||
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
|
|
||||||
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
|
|
||||||
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
|
|
||||||
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: DigiCert
|
# Operating CA: DigiCert
|
||||||
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
||||||
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
||||||
@@ -273,257 +243,6 @@ r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
|
|||||||
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
|
||||||
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
|
||||||
# Label: "Entrust Root Certification Authority"
|
|
||||||
# Serial: 1164660820
|
|
||||||
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
|
|
||||||
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
|
|
||||||
# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
|
|
||||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
|
||||||
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
|
||||||
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
|
||||||
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
|
|
||||||
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
|
|
||||||
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
|
|
||||||
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
|
|
||||||
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
|
|
||||||
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
|
|
||||||
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
|
|
||||||
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
|
|
||||||
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
|
|
||||||
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
|
|
||||||
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
|
|
||||||
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
|
|
||||||
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
|
|
||||||
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
|
|
||||||
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
|
||||||
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
|
|
||||||
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
|
|
||||||
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
|
|
||||||
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
|
|
||||||
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
|
|
||||||
0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
|
|
||||||
# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
|
|
||||||
# Label: "Entrust Root Certification Authority - EC1"
|
|
||||||
# Serial: 51543124481930649114116133369
|
|
||||||
# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
|
|
||||||
# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
|
|
||||||
# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
|
|
||||||
A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
|
|
||||||
d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
|
|
||||||
dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
|
|
||||||
RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
|
|
||||||
MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
|
|
||||||
VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
|
|
||||||
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
|
|
||||||
Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
|
|
||||||
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
|
|
||||||
A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
|
|
||||||
ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
|
|
||||||
Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
|
|
||||||
BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
|
|
||||||
R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
|
|
||||||
hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
|
|
||||||
# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
|
|
||||||
# Label: "Entrust Root Certification Authority - G2"
|
|
||||||
# Serial: 1246989352
|
|
||||||
# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
|
|
||||||
# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
|
|
||||||
# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
|
|
||||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
|
|
||||||
cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
|
|
||||||
IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
|
|
||||||
dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
|
|
||||||
NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
|
|
||||||
dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
|
|
||||||
dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
|
|
||||||
aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
|
|
||||||
YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
|
||||||
AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
|
|
||||||
RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
|
|
||||||
cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
|
|
||||||
wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
|
|
||||||
U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
|
|
||||||
jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
|
|
||||||
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
|
|
||||||
BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
|
|
||||||
jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
|
|
||||||
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
|
|
||||||
1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
|
|
||||||
nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
|
|
||||||
VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
|
|
||||||
# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
|
|
||||||
# Label: "Entrust.net Premium 2048 Secure Server CA"
|
|
||||||
# Serial: 946069240
|
|
||||||
# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
|
|
||||||
# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
|
|
||||||
# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
|
||||||
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
|
||||||
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
|
||||||
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
|
||||||
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
|
|
||||||
MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
|
||||||
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
|
||||||
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
|
||||||
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
|
||||||
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
|
||||||
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
|
||||||
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
|
||||||
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
|
||||||
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
|
||||||
4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
|
|
||||||
HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
|
|
||||||
j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
|
|
||||||
U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
|
|
||||||
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
|
|
||||||
u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
|
|
||||||
bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
|
|
||||||
fF6adulZkMV8gzURZVE=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Commercial"
|
|
||||||
# Serial: 8608355977964138876
|
|
||||||
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
|
|
||||||
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
|
|
||||||
# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
|
||||||
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
|
|
||||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
|
||||||
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
|
||||||
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
|
|
||||||
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
|
|
||||||
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
|
|
||||||
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
|
|
||||||
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
|
|
||||||
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
|
|
||||||
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
|
||||||
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
|
|
||||||
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
|
|
||||||
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
|
|
||||||
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
|
|
||||||
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
|
|
||||||
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Networking O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Networking O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Networking"
|
|
||||||
# Serial: 8957382827206547757
|
|
||||||
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
|
|
||||||
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
|
|
||||||
# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
|
||||||
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
|
|
||||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
|
||||||
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
|
||||||
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
|
|
||||||
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
|
|
||||||
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
|
|
||||||
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
|
|
||||||
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
|
|
||||||
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
|
|
||||||
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
|
||||||
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
|
|
||||||
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
|
|
||||||
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
|
|
||||||
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
|
|
||||||
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
|
|
||||||
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Premium O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Premium O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Premium"
|
|
||||||
# Serial: 7893706540734352110
|
|
||||||
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
|
|
||||||
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
|
|
||||||
# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
|
|
||||||
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
|
|
||||||
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
|
|
||||||
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
|
|
||||||
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
|
|
||||||
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
|
|
||||||
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
|
|
||||||
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
|
|
||||||
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
|
|
||||||
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
|
|
||||||
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
|
|
||||||
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
|
|
||||||
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
|
|
||||||
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
|
|
||||||
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
|
|
||||||
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
|
|
||||||
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
|
|
||||||
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
|
|
||||||
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
|
|
||||||
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
|
|
||||||
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
|
|
||||||
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
|
|
||||||
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
|
|
||||||
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
|
|
||||||
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
|
|
||||||
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
|
|
||||||
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
|
|
||||||
KeC2uAloGRwYQw==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Premium ECC"
|
|
||||||
# Serial: 8401224907861490260
|
|
||||||
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
|
|
||||||
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
|
|
||||||
# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
|
|
||||||
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
|
|
||||||
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
|
|
||||||
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
|
|
||||||
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
|
|
||||||
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
|
|
||||||
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
|
|
||||||
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
|
|
||||||
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
|
|
||||||
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
|
|
||||||
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: GlobalSign
|
# Operating CA: GlobalSign
|
||||||
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
||||||
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ if __name__ == '__main__':
|
|||||||
# One time initialization
|
# One time initialization
|
||||||
if platform.system() != 'Linux':
|
if platform.system() != 'Linux':
|
||||||
multiprocessing.freeze_support()
|
multiprocessing.freeze_support()
|
||||||
multiprocessing.set_start_method('spawn')
|
multiprocessing.set_start_method('spawn', force=True)
|
||||||
initializeLogging()
|
initializeLogging()
|
||||||
#
|
#
|
||||||
CallGAMCommand(['gam', 'version'])
|
CallGAMCommand(['gam', 'version'])
|
||||||
|
|||||||
@@ -1,594 +0,0 @@
|
|||||||
{
|
|
||||||
"auth": {
|
|
||||||
"oauth2": {
|
|
||||||
"scopes": {
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers": {
|
|
||||||
"description": "View and manage your Chrome browsers registered with Cloud Management"
|
|
||||||
},
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers.readonly": {
|
|
||||||
"description": "View your Chrome browsers registered with Cloud Management"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"basePath": "",
|
|
||||||
"baseUrl": "https://admin.googleapis.com/admin/directory/v1.1beta1/customer/",
|
|
||||||
"batchPath": "batch",
|
|
||||||
"canonicalName": "cbcm",
|
|
||||||
"discoveryVersion": "v1",
|
|
||||||
"documentationLink": "https://support.google.com/chrome/a/answer/9681204",
|
|
||||||
"fullyEncodeReservedExpansion": true,
|
|
||||||
"icons": {
|
|
||||||
"x16": "http://www.google.com/images/icons/product/search-16.gif",
|
|
||||||
"x32": "http://www.google.com/images/icons/product/search-32.gif"
|
|
||||||
},
|
|
||||||
"id": "cbcm:v1.1beta1",
|
|
||||||
"kind": "discovery#restDescription",
|
|
||||||
"mtlsRootUrl": "https://admin.mtls.googleapis.com/",
|
|
||||||
"name": "cbcm",
|
|
||||||
"ownerDomain": "google.com",
|
|
||||||
"ownerName": "Jay Lee",
|
|
||||||
"packagePath": "cbcm",
|
|
||||||
"parameters": {
|
|
||||||
"$.xgafv": {
|
|
||||||
"description": "V1 error format.",
|
|
||||||
"enum": [
|
|
||||||
"1",
|
|
||||||
"2"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"v1 error format",
|
|
||||||
"v2 error format"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"access_token": {
|
|
||||||
"description": "OAuth access token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"alt": {
|
|
||||||
"default": "json",
|
|
||||||
"description": "Data format for response.",
|
|
||||||
"enum": [
|
|
||||||
"json",
|
|
||||||
"media",
|
|
||||||
"proto"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Responses with Content-Type of application/json",
|
|
||||||
"Media download with context-dependent Content-Type",
|
|
||||||
"Responses with Content-Type of application/x-protobuf"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"callback": {
|
|
||||||
"description": "JSONP",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"fields": {
|
|
||||||
"description": "Selector specifying which fields to include in a partial response.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"oauth_token": {
|
|
||||||
"description": "OAuth 2.0 token for the current user.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"prettyPrint": {
|
|
||||||
"default": "true",
|
|
||||||
"description": "Returns response with indentations and line breaks.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "boolean"
|
|
||||||
},
|
|
||||||
"quotaUser": {
|
|
||||||
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"uploadType": {
|
|
||||||
"description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"upload_protocol": {
|
|
||||||
"description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"protocol": "rest",
|
|
||||||
"resources": {
|
|
||||||
"chromebrowsers": {
|
|
||||||
"methods": {
|
|
||||||
"delete": {
|
|
||||||
"description": "Deletes a browser.",
|
|
||||||
"flatPath": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"httpMethod": "DELETE",
|
|
||||||
"id": "cbcm.chromebrowsers.delete",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer",
|
|
||||||
"deviceId"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"deviceId": {
|
|
||||||
"description": "Immutable ID of the browser.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"get": {
|
|
||||||
"description": "Retrieves a browser.",
|
|
||||||
"flatPath": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"id": "cbcm.chromebrowsers.get",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer",
|
|
||||||
"deviceId"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"deviceId": {
|
|
||||||
"description": "Immutable ID of the browser.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"projection": {
|
|
||||||
"description": "Restrict information returned to a set of selected fields. FULL or BASIC.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"response": {
|
|
||||||
"$ref": "ChromeBrowser"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers",
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers.readonly"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"list": {
|
|
||||||
"description": "Retrieves a paginated list of all the browsers in a domain.",
|
|
||||||
"flatPath": "{customer}/devices/chromebrowsers",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"id": "cbcm.chromebrowsers.list",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"maxResults": {
|
|
||||||
"description": "Maximum number of results to return.",
|
|
||||||
"format": "int32",
|
|
||||||
"location": "query",
|
|
||||||
"maximum": "100",
|
|
||||||
"minimum": "1",
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"orderBy": {
|
|
||||||
"description": "property to use for sorting results.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"orgUnitPath": {
|
|
||||||
"description": "The full path of the organizational unit or its unique ID.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"pageToken": {
|
|
||||||
"description": "Token to specify the next page in the list.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"projection": {
|
|
||||||
"description": "Restrict information returned to a set of selected fields. FULL or BASIC.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"query": {
|
|
||||||
"description": "Search string using the list page query language.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"sortOrder": {
|
|
||||||
"description": "Whether to return results in ascending or descending order. Must be used with the orderBy parameter.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/devices/chromebrowsers",
|
|
||||||
"response": {
|
|
||||||
"$ref": "ChromeBrowsers"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers",
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers.readonly"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"moveChromeBrowsersToOu": {
|
|
||||||
"description": "Move Chrome Browsers Device between Organization Units",
|
|
||||||
"flatPath": "{customer}/devices/chromebrowsers/moveChromeBrowsersToOu",
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"id": "cbcm.chromebrowsers.moveChromeBrowsersToOu",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/devices/chromebrowsers/moveChromeBrowsersToOu",
|
|
||||||
"request": {
|
|
||||||
"$ref": "MoveChromeBrowsersRequest"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"update": {
|
|
||||||
"description": "Updates a browser.",
|
|
||||||
"flatPath": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"httpMethod": "PUT",
|
|
||||||
"id": "cbcm.chromebrowsers.update",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer",
|
|
||||||
"deviceId"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"deviceId": {
|
|
||||||
"description": "Immutable ID of the browser.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"projection": {
|
|
||||||
"description": "BASIC or FULL",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/devices/chromebrowsers/{deviceId}",
|
|
||||||
"request": {
|
|
||||||
"$ref": "ChromeBrowser"
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"$ref": "ChromeBrowser"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"enrollmentTokens": {
|
|
||||||
"methods": {
|
|
||||||
"list": {
|
|
||||||
"description": "Retrieves a paginated list of all the browser entollment tokens in a domain.",
|
|
||||||
"flatPath": "{customer}/chrome/enrollmentTokens",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"id": "cbcm.enrollmentTokens.list",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"pageSize": {
|
|
||||||
"description": "Maximum number of results to return.",
|
|
||||||
"format": "int32",
|
|
||||||
"location": "query",
|
|
||||||
"maximum": "100",
|
|
||||||
"minimum": "1",
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"orgUnitPath": {
|
|
||||||
"description": "The full path of the organizational unit or its unique ID.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"pageToken": {
|
|
||||||
"description": "Token to specify the next page in the list.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"query": {
|
|
||||||
"description": "Search string using the list page query language.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/chrome/enrollmentTokens",
|
|
||||||
"response": {
|
|
||||||
"$ref": "EnrollmentTokens"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers",
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers.readonly"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"create": {
|
|
||||||
"description": "Creates a browser enrollment token in a domain.",
|
|
||||||
"flatPath": "{customer}/chrome/enrollmentTokens",
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"id": "cbcm.enrollmentTokens.create",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/chrome/enrollmentTokens",
|
|
||||||
"request": {
|
|
||||||
"$ref": "CreateEnrollmentTokenRequest"
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"$ref": "EnrollmentToken"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"revoke": {
|
|
||||||
"description": "Revokes a browser enrollment token in a domain.",
|
|
||||||
"flatPath": "{customer}/chrome/enrollmentTokens/{tokenPermanentId}:revoke",
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"id": "cbcm.enrollmentTokens.revoke",
|
|
||||||
"parameterOrder": [
|
|
||||||
"customer",
|
|
||||||
"tokenPermanentId"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"customer": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"tokenPermanentId": {
|
|
||||||
"description": "Unique identifier for an enrollment token.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "{customer}/chrome/enrollmentTokens/{tokenPermanentId}:revoke",
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.directory.device.chromebrowsers"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"revision": "20201203",
|
|
||||||
"rootUrl": "https://admin.googleapis.com/admin/directory/v1.1beta1/customer/",
|
|
||||||
"schemas": {
|
|
||||||
"ChromeBrowser": {
|
|
||||||
"id": "ChromeBrowser",
|
|
||||||
"properties": {
|
|
||||||
"annotatedAssetId": {
|
|
||||||
"description": "Asset identifier as annotated by the administrator or specified during enrollment.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"annotatedLocation": {
|
|
||||||
"description": "Address or location of the device as annotated by the administrator.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"annotatedNotes": {
|
|
||||||
"description": "Notes about this device as annotated by the administrator",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"annotatedUser": {
|
|
||||||
"description": "User of the device as annotated by the administrator.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"deviceId": {
|
|
||||||
"annotations": {
|
|
||||||
"required": [
|
|
||||||
"cbcm.chromebrowsers.update"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"description": "The unique ID of the device.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"ChromeBrowsers": {
|
|
||||||
"id": "ChromeBrowsers",
|
|
||||||
"properties": {
|
|
||||||
"browsers": {
|
|
||||||
"description": "List of Chrome browser objects.",
|
|
||||||
"items": {
|
|
||||||
"$ref": "ChromeBrowser"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
},
|
|
||||||
"etag": {
|
|
||||||
"description": "ETag of the resource.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"kind": {
|
|
||||||
"default": "admin#directory#chromeosdevices",
|
|
||||||
"description": "Kind of resource this is.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"nextPageToken": {
|
|
||||||
"description": "Token used to access the next page of this result. To access the next page, use this token's value in the `pageToken` query string of this request.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"EnrollmentToken": {
|
|
||||||
"id": "EnrollmentToken",
|
|
||||||
"properties": {
|
|
||||||
"kind": {
|
|
||||||
"default": "admin#directory#chromeEnrollmentToken",
|
|
||||||
"description": "Kind of resource this is.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"tokenId": {
|
|
||||||
"description": "Enrollment Token ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"tokenPermanentId": {
|
|
||||||
"description": "Enrollment Token Permanent ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"customerId": {
|
|
||||||
"description": "Immutable ID of the G Suite account.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"orgUnitPath": {
|
|
||||||
"description": "The full path of the organizational unit or its unique ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"creatorId": {
|
|
||||||
"description": "Creator ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"createTime": {
|
|
||||||
"description": "Creation Time.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"revokerId": {
|
|
||||||
"description": "Revoker ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"revokeTime": {
|
|
||||||
"description": "Revoke Time",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"EnrollmentTokens": {
|
|
||||||
"id": "EnrollmentTokens",
|
|
||||||
"properties": {
|
|
||||||
"chrome_enrollment_tokens": {
|
|
||||||
"description": "List of Chrome browser enrollment token objects.",
|
|
||||||
"items": {
|
|
||||||
"$ref": "EnrollmentToken"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
},
|
|
||||||
"kind": {
|
|
||||||
"default": "admin#directory#chromeEnrollmentTokens",
|
|
||||||
"description": "Kind of resource this is.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"nextPageToken": {
|
|
||||||
"description": "Token used to access the next page of this result. To access the next page, use this token's value in the `pageToken` query string of this request.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"CreateEnrollmentTokenRequest": {
|
|
||||||
"id": "CreateEnrollmentTokenRequest",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"org_unit_path": {
|
|
||||||
"description": "The full path of the organizational unit or its unique ID.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"expire_time": {
|
|
||||||
"description": "Expiration Time.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"token_type": {
|
|
||||||
"id": "token_type",
|
|
||||||
"annotations": {
|
|
||||||
"required": [
|
|
||||||
"cbcm.enrollmentTokens.create"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"description": "CHROME_BROWSER.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"MoveChromeBrowsersRequest": {
|
|
||||||
"id": "MoveChromeBrowsersRequest",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"org_unit_path": {
|
|
||||||
"annotations": {
|
|
||||||
"required": [
|
|
||||||
"cbcm.chromebrowsers.moveChromeBrowsersToOu"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"description": "Destination organization unit to move devices to. Full path of the organizational unit or its ID prefixed with id:",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"resource_ids": {
|
|
||||||
"annotations": {
|
|
||||||
"required": [
|
|
||||||
"cbcm.chromebrowsers.moveChromeBrowsersToOu"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"description": "List of unique device IDs of Chrome Browser Devices to move. A maximum of 600 browsers may be moved per request.",
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"servicePath": "",
|
|
||||||
"title": "Admin SDK API",
|
|
||||||
"version": "cbcm_v1.1beta1"
|
|
||||||
}
|
|
||||||
@@ -1,249 +0,0 @@
|
|||||||
{
|
|
||||||
"auth": {
|
|
||||||
"oauth2": {
|
|
||||||
"scopes": {
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation": {
|
|
||||||
"description": "View and manage your Contact Delegation"
|
|
||||||
},
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation.readonly": {
|
|
||||||
"description": "View your Contact Delegation"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"basePath": "",
|
|
||||||
"baseUrl": "https://admin.googleapis.com/admin/contacts/v1/",
|
|
||||||
"batchPath": "batch",
|
|
||||||
"canonicalName": "contactdelegation",
|
|
||||||
"description": "The Contact Delegation API allows Admins to delegate access of one user's, called the delegator, contacts to another user, called the delegate.",
|
|
||||||
"discoveryVersion": "v1",
|
|
||||||
"documentationLink": "https://developers.google.com/admin-sdk/contact-delegation",
|
|
||||||
"fullyEncodeReservedExpansion": true,
|
|
||||||
"icons": {
|
|
||||||
"x16": "http://www.google.com/images/icons/product/search-16.gif",
|
|
||||||
"x32": "http://www.google.com/images/icons/product/search-32.gif"
|
|
||||||
},
|
|
||||||
"id": "contactdelegation:v1",
|
|
||||||
"kind": "discovery#restDescription",
|
|
||||||
"name": "contactdelegation",
|
|
||||||
"ownerDomain": "google.com",
|
|
||||||
"ownerName": "Google",
|
|
||||||
"packagePath": "admin",
|
|
||||||
"parameters": {
|
|
||||||
"$.xgafv": {
|
|
||||||
"description": "V1 error format.",
|
|
||||||
"enum": [
|
|
||||||
"1",
|
|
||||||
"2"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"v1 error format",
|
|
||||||
"v2 error format"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"access_token": {
|
|
||||||
"description": "OAuth access token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"alt": {
|
|
||||||
"default": "json",
|
|
||||||
"description": "Data format for response.",
|
|
||||||
"enum": [
|
|
||||||
"json",
|
|
||||||
"media",
|
|
||||||
"proto"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Responses with Content-Type of application/json",
|
|
||||||
"Media download with context-dependent Content-Type",
|
|
||||||
"Responses with Content-Type of application/x-protobuf"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"callback": {
|
|
||||||
"description": "JSONP",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"fields": {
|
|
||||||
"description": "Selector specifying which fields to include in a partial response.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"oauth_token": {
|
|
||||||
"description": "OAuth 2.0 token for the current user.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"prettyPrint": {
|
|
||||||
"default": "true",
|
|
||||||
"description": "Returns response with indentations and line breaks.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "boolean"
|
|
||||||
},
|
|
||||||
"quotaUser": {
|
|
||||||
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"uploadType": {
|
|
||||||
"description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"upload_protocol": {
|
|
||||||
"description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"protocol": "rest",
|
|
||||||
"resources": {
|
|
||||||
"delegates": {
|
|
||||||
"methods": {
|
|
||||||
"create": {
|
|
||||||
"description": "Creates a contact delegations",
|
|
||||||
"flatPath": "users/{user}/delegates",
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"id": "contactdelegations.delegates.create",
|
|
||||||
"parameterOrder": [
|
|
||||||
"user"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"user": {
|
|
||||||
"description": "Email address of the delegator.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "users/{user}/delegates/{delegate}",
|
|
||||||
"request": {
|
|
||||||
"$ref": "Delegate"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"delete": {
|
|
||||||
"description": "Deletes a contact delegation.",
|
|
||||||
"flatPath": "users/{user}/delegates/{delegate}",
|
|
||||||
"httpMethod": "DELETE",
|
|
||||||
"id": "contactdelegations.delegates.delete",
|
|
||||||
"parameterOrder": [
|
|
||||||
"user",
|
|
||||||
"delegate"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"delegate": {
|
|
||||||
"description": "Email address of the delegate",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"user": {
|
|
||||||
"description": "Email address of the delegator.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "users/{user}/delegates/{delegate}",
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"list": {
|
|
||||||
"description": "Lists contact delegates for a user",
|
|
||||||
"flatPath": "users/{user}/delegates",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"id": "contactdelegations.delegates.list",
|
|
||||||
"parameterOrder": [
|
|
||||||
"user"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"pageSize": {
|
|
||||||
"description": "Determines how many delegates are returned in each response. ",
|
|
||||||
"format": "int32",
|
|
||||||
"location": "query",
|
|
||||||
"minimum": "1",
|
|
||||||
"type": "integer"
|
|
||||||
},
|
|
||||||
"pageToken": {
|
|
||||||
"description": "Token to specify the next page in the list.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"user": {
|
|
||||||
"description": "Email address of the delegator.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "users/{user}/delegates",
|
|
||||||
"response": {
|
|
||||||
"$ref": "Delegates"
|
|
||||||
},
|
|
||||||
"scopes": [
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation",
|
|
||||||
"https://www.googleapis.com/auth/admin.contact.delegation.readonly"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rootUrl": "https://admin.googleapis.com/admin/contacts/v1/",
|
|
||||||
"schemas": {
|
|
||||||
"Delegate": {
|
|
||||||
"description": "JSON template for a delegate.",
|
|
||||||
"id": "Delegate",
|
|
||||||
"properties": {
|
|
||||||
"email": {
|
|
||||||
"description": "Email of the delegate.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"Delegates": {
|
|
||||||
"id": "Delegates",
|
|
||||||
"properties": {
|
|
||||||
"delegates": {
|
|
||||||
"description": "List of delegates.",
|
|
||||||
"items": {
|
|
||||||
"$ref": "Delegate"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
},
|
|
||||||
"etag": {
|
|
||||||
"description": "ETag of the resource.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"kind": {
|
|
||||||
"default": "",
|
|
||||||
"description": "Kind of resource this is.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"nextPageToken": {
|
|
||||||
"description": "Token used to access the next page of this result. To access the next page, use this token's value in the `pageToken` query string of this request.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"servicePath": "",
|
|
||||||
"title": "Contact Delegation API",
|
|
||||||
"version": "v1",
|
|
||||||
"version_module": true
|
|
||||||
}
|
|
||||||
@@ -1,486 +0,0 @@
|
|||||||
{
|
|
||||||
"basePath": "",
|
|
||||||
"discoveryVersion": "v1",
|
|
||||||
"documentationLink": "https://support.google.com/datastudio",
|
|
||||||
"canonicalName": "Data Studio",
|
|
||||||
"id": "datastudio:v1",
|
|
||||||
"ownerName": "Google",
|
|
||||||
"description": "Allows programmatic viewing and editing of Data Studio assets.",
|
|
||||||
"rootUrl": "https://datastudio.googleapis.com/",
|
|
||||||
"ownerDomain": "google.com",
|
|
||||||
"mtlsRootUrl": "https://datastudio.mtls.googleapis.com/",
|
|
||||||
"batchPath": "batch",
|
|
||||||
"version_module": true,
|
|
||||||
"version": "v1",
|
|
||||||
"schemas": {
|
|
||||||
"Asset": {
|
|
||||||
"id": "Asset",
|
|
||||||
"properties": {
|
|
||||||
"title": {
|
|
||||||
"description": "The title of the asset.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"createTime": {
|
|
||||||
"format": "google-datetime",
|
|
||||||
"description": "Date the asset was created.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"lastViewByMeTime": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "Date the asset was last viewed by me.",
|
|
||||||
"format": "google-datetime"
|
|
||||||
},
|
|
||||||
"owner": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "The owner of the asset."
|
|
||||||
},
|
|
||||||
"name": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "The name of the asset."
|
|
||||||
},
|
|
||||||
"trashed": {
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Value indicating if the asset is in the trash."
|
|
||||||
},
|
|
||||||
"updateTime": {
|
|
||||||
"format": "google-datetime",
|
|
||||||
"description": "Date the asset was last modified.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"updateByMeTime": {
|
|
||||||
"description": "Date the asset was last modified by me.",
|
|
||||||
"type": "string",
|
|
||||||
"format": "google-datetime"
|
|
||||||
},
|
|
||||||
"assetType": {
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Asset type not specified.",
|
|
||||||
"A report asset.",
|
|
||||||
"A data Source asset."
|
|
||||||
],
|
|
||||||
"enum": [
|
|
||||||
"ASSET_TYPE_UNSPECIFIED",
|
|
||||||
"REPORT",
|
|
||||||
"DATA_SOURCE"
|
|
||||||
],
|
|
||||||
"description": "The type of the asset.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"description": "A Data Studio asset.",
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"SearchAssetsResponse": {
|
|
||||||
"id": "SearchAssetsResponse",
|
|
||||||
"properties": {
|
|
||||||
"assets": {
|
|
||||||
"items": {
|
|
||||||
"$ref": "Asset"
|
|
||||||
},
|
|
||||||
"type": "array",
|
|
||||||
"description": "The list of assets."
|
|
||||||
},
|
|
||||||
"nextPageToken": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "A token to retrieve next page of results. Pass this value in the SearchAssetsRequest.page_token field in the subsequent call to `SearchAssets` method to retrieve the next page of results."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"description": "Response message for DataStudioService.SearchAssets",
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"UpdatePermissionsRequest": {
|
|
||||||
"description": "Request message for DataStudioService.UpdatePermissions",
|
|
||||||
"properties": {
|
|
||||||
"updateMask": {
|
|
||||||
"description": "The list of fields to be updated. Currently not supported.",
|
|
||||||
"type": "string",
|
|
||||||
"format": "google-fieldmask"
|
|
||||||
},
|
|
||||||
"permissions": {
|
|
||||||
"description": "The permissions object to update.",
|
|
||||||
"$ref": "Permissions"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"id": "UpdatePermissionsRequest",
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"AddMembersRequest": {
|
|
||||||
"properties": {
|
|
||||||
"members": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"description": "Required. The members to add to the role. The format of a member is one of - user:alice@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-app@appspot.gserviceaccount.com"
|
|
||||||
},
|
|
||||||
"role": {
|
|
||||||
"type": "string",
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Role not specified.",
|
|
||||||
"A viewer.",
|
|
||||||
"An editor.",
|
|
||||||
"An owner.",
|
|
||||||
"Link shared viewer.",
|
|
||||||
"Link shared editor."
|
|
||||||
],
|
|
||||||
"enum": [
|
|
||||||
"ROLE_UNSPECIFIED",
|
|
||||||
"VIEWER",
|
|
||||||
"EDITOR",
|
|
||||||
"OWNER",
|
|
||||||
"LINK_VIEWER",
|
|
||||||
"LINK_EDITOR"
|
|
||||||
],
|
|
||||||
"description": "Required. The role to add members to."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object",
|
|
||||||
"id": "AddMembersRequest",
|
|
||||||
"description": "Request message for DataStudioService.AddMembers"
|
|
||||||
},
|
|
||||||
"Permissions": {
|
|
||||||
"type": "object",
|
|
||||||
"id": "Permissions",
|
|
||||||
"description": "A Data Studio asset's Permissions.",
|
|
||||||
"properties": {
|
|
||||||
"permissions": {
|
|
||||||
"description": "A map from a Role to a list of members. Role is a string representation of the Role enum. One of: - OWNER - EDITOR - VIEWER",
|
|
||||||
"additionalProperties": {
|
|
||||||
"$ref": "Members"
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
},
|
|
||||||
"etag": {
|
|
||||||
"format": "byte",
|
|
||||||
"description": "etag to detect and fail concurrent modifications",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"RevokeAllPermissionsRequest": {
|
|
||||||
"description": "Request message for DataStudioService.RevokeAllPermissions",
|
|
||||||
"id": "RevokeAllPermissionsRequest",
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"members": {
|
|
||||||
"description": "Required. The members that are having their access revoked. The format of a member is one of - user:alice@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-app@appspot.gserviceaccount.com",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Members": {
|
|
||||||
"description": "A wrapper message for a list of members.",
|
|
||||||
"properties": {
|
|
||||||
"members": {
|
|
||||||
"description": "Format of string is one of - user:alice@example.com - group:admins@example.com - domain:google.com - serviceAccount:my-app@appspot.gserviceaccount.com",
|
|
||||||
"items": {
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"type": "array"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object",
|
|
||||||
"id": "Members"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"name": "datastudio",
|
|
||||||
"protocol": "rest",
|
|
||||||
"baseUrl": "https://datastudio.googleapis.com/",
|
|
||||||
"title": "Data Studio API",
|
|
||||||
"revision": "20210412",
|
|
||||||
"fullyEncodeReservedExpansion": true,
|
|
||||||
"icons": {
|
|
||||||
"x32": "http://www.google.com/images/icons/product/search-32.gif",
|
|
||||||
"x16": "http://www.google.com/images/icons/product/search-16.gif"
|
|
||||||
},
|
|
||||||
"parameters": {
|
|
||||||
"quotaUser": {
|
|
||||||
"location": "query",
|
|
||||||
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"prettyPrint": {
|
|
||||||
"location": "query",
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Returns response with indentations and line breaks.",
|
|
||||||
"default": "true"
|
|
||||||
},
|
|
||||||
"callback": {
|
|
||||||
"location": "query",
|
|
||||||
"type": "string",
|
|
||||||
"description": "JSONP"
|
|
||||||
},
|
|
||||||
"uploadType": {
|
|
||||||
"description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
|
|
||||||
"type": "string",
|
|
||||||
"location": "query"
|
|
||||||
},
|
|
||||||
"upload_protocol": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "Upload protocol for media (e.g. \"raw\", \"multipart\")."
|
|
||||||
},
|
|
||||||
"$.xgafv": {
|
|
||||||
"enumDescriptions": [
|
|
||||||
"v1 error format",
|
|
||||||
"v2 error format"
|
|
||||||
],
|
|
||||||
"description": "V1 error format.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"1",
|
|
||||||
"2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"oauth_token": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "OAuth 2.0 token for the current user."
|
|
||||||
},
|
|
||||||
"alt": {
|
|
||||||
"type": "string",
|
|
||||||
"enum": [
|
|
||||||
"json",
|
|
||||||
"media",
|
|
||||||
"proto"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"description": "Data format for response.",
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Responses with Content-Type of application/json",
|
|
||||||
"Media download with context-dependent Content-Type",
|
|
||||||
"Responses with Content-Type of application/x-protobuf"
|
|
||||||
],
|
|
||||||
"default": "json"
|
|
||||||
},
|
|
||||||
"fields": {
|
|
||||||
"description": "Selector specifying which fields to include in a partial response.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"access_token": {
|
|
||||||
"type": "string",
|
|
||||||
"description": "OAuth access token.",
|
|
||||||
"location": "query"
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"servicePath": "",
|
|
||||||
"kind": "discovery#restDescription",
|
|
||||||
"resources": {
|
|
||||||
"assets": {
|
|
||||||
"methods": {
|
|
||||||
"getPermissions": {
|
|
||||||
"parameters": {
|
|
||||||
"name": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "path",
|
|
||||||
"description": "Required. The name of the asset.",
|
|
||||||
"required": true
|
|
||||||
},
|
|
||||||
"role": {
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Role not specified.",
|
|
||||||
"A viewer.",
|
|
||||||
"An editor.",
|
|
||||||
"An owner.",
|
|
||||||
"Link shared viewer.",
|
|
||||||
"Link shared editor."
|
|
||||||
],
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "The role of the permssion.",
|
|
||||||
"enum": [
|
|
||||||
"ROLE_UNSPECIFIED",
|
|
||||||
"VIEWER",
|
|
||||||
"EDITOR",
|
|
||||||
"OWNER",
|
|
||||||
"LINK_VIEWER",
|
|
||||||
"LINK_EDITOR"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"id": "datastudio.assets.getPermissions",
|
|
||||||
"response": {
|
|
||||||
"$ref": "Permissions"
|
|
||||||
},
|
|
||||||
"flatPath": "v1/assets/{name}/permissions",
|
|
||||||
"path": "v1/assets/{name}/permissions",
|
|
||||||
"description": "Gets the asset's permission for a given role.",
|
|
||||||
"parameterOrder": [
|
|
||||||
"name"
|
|
||||||
],
|
|
||||||
"httpMethod": "GET"
|
|
||||||
},
|
|
||||||
"updatePermissions": {
|
|
||||||
"id": "datastudio.assets.updatePermissions",
|
|
||||||
"parameterOrder": [
|
|
||||||
"name"
|
|
||||||
],
|
|
||||||
"flatPath": "v1/assets/{name}/permissions",
|
|
||||||
"description": "Updates a permission.",
|
|
||||||
"request": {
|
|
||||||
"$ref": "UpdatePermissionsRequest"
|
|
||||||
},
|
|
||||||
"path": "v1/assets/{name}/permissions",
|
|
||||||
"parameters": {
|
|
||||||
"name": {
|
|
||||||
"description": "Required. The name of the asset.",
|
|
||||||
"location": "path",
|
|
||||||
"type": "string",
|
|
||||||
"required": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"response": {
|
|
||||||
"$ref": "Permissions"
|
|
||||||
},
|
|
||||||
"httpMethod": "PATCH"
|
|
||||||
},
|
|
||||||
"get": {
|
|
||||||
"path": "v1/{+name}",
|
|
||||||
"id": "datastudio.assets.get",
|
|
||||||
"parameterOrder": [
|
|
||||||
"name"
|
|
||||||
],
|
|
||||||
"description": "Gets the asset by name.",
|
|
||||||
"parameters": {
|
|
||||||
"name": {
|
|
||||||
"description": "Required. The name of the asset. Format: assets/{asset}",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"pattern": "^assets/[^/]+$",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flatPath": "v1/assets/{assetsId}",
|
|
||||||
"response": {
|
|
||||||
"$ref": "Asset"
|
|
||||||
},
|
|
||||||
"httpMethod": "GET"
|
|
||||||
},
|
|
||||||
"search": {
|
|
||||||
"response": {
|
|
||||||
"$ref": "SearchAssetsResponse"
|
|
||||||
},
|
|
||||||
"path": "v1/assets:search",
|
|
||||||
"parameters": {
|
|
||||||
"pageToken": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "A token identifying a page of results the server should return. Use the value of SearchAssetsResponse.next_page_token returned from the previous call to `SearchAssets` method."
|
|
||||||
},
|
|
||||||
"assetTypes": {
|
|
||||||
"type": "string",
|
|
||||||
"repeated": true,
|
|
||||||
"description": "Exactly one AssetType must be specified.",
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Asset type not specified.",
|
|
||||||
"A report asset.",
|
|
||||||
"A data Source asset."
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"enum": [
|
|
||||||
"ASSET_TYPE_UNSPECIFIED",
|
|
||||||
"REPORT",
|
|
||||||
"DATA_SOURCE"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"title": {
|
|
||||||
"description": "The title of assets to include. Not an exact match, works the same as search from the UI.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"owner": {
|
|
||||||
"type": "string",
|
|
||||||
"location": "query",
|
|
||||||
"description": "The email of the owner of the asset."
|
|
||||||
},
|
|
||||||
"pageSize": {
|
|
||||||
"description": "Requested page size. If unspecified, server will pick an appropriate default.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "integer",
|
|
||||||
"format": "int32"
|
|
||||||
},
|
|
||||||
"orderBy": {
|
|
||||||
"location": "query",
|
|
||||||
"description": "How the results should be ordered. Valid options are: - title",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"includeTrashed": {
|
|
||||||
"location": "query",
|
|
||||||
"type": "boolean",
|
|
||||||
"description": "Value indicating if assets in trash should be included."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"flatPath": "v1/assets:search",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"description": "Searches assets.",
|
|
||||||
"id": "datastudio.assets.search",
|
|
||||||
"parameterOrder": []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"resources": {
|
|
||||||
"permissions": {
|
|
||||||
"methods": {
|
|
||||||
"revokeAllPermissions": {
|
|
||||||
"path": "v1/assets/{name}/permissions:revokeAllPermissions",
|
|
||||||
"response": {
|
|
||||||
"$ref": "Permissions"
|
|
||||||
},
|
|
||||||
"flatPath": "v1/assets/{name}/permissions:revokeAllPermissions",
|
|
||||||
"id": "datastudio.assets.permissions.revokeAllPermissions",
|
|
||||||
"description": "Revokes one or more members' access to an asset.",
|
|
||||||
"parameters": {
|
|
||||||
"name": {
|
|
||||||
"required": true,
|
|
||||||
"type": "string",
|
|
||||||
"location": "path",
|
|
||||||
"description": "Required. The name of the asset."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"parameterOrder": [
|
|
||||||
"name"
|
|
||||||
],
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"request": {
|
|
||||||
"$ref": "RevokeAllPermissionsRequest"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"addMembers": {
|
|
||||||
"path": "v1/assets/{name}/permissions:addMembers",
|
|
||||||
"parameters": {
|
|
||||||
"name": {
|
|
||||||
"required": true,
|
|
||||||
"location": "path",
|
|
||||||
"type": "string",
|
|
||||||
"description": "Required. The name of the asset."
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"httpMethod": "POST",
|
|
||||||
"parameterOrder": [
|
|
||||||
"name"
|
|
||||||
],
|
|
||||||
"response": {
|
|
||||||
"$ref": "Permissions"
|
|
||||||
},
|
|
||||||
"id": "datastudio.assets.permissions.addMembers",
|
|
||||||
"request": {
|
|
||||||
"$ref": "AddMembersRequest"
|
|
||||||
},
|
|
||||||
"description": "Adds one or more members to a role.",
|
|
||||||
"flatPath": "v1/assets/{name}/permissions:addMembers"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,7 @@ GAM installation script.
|
|||||||
OPTIONS:
|
OPTIONS:
|
||||||
-h show help.
|
-h show help.
|
||||||
-d Directory where gam folder will be installed. Default is \$HOME/bin/
|
-d Directory where gam folder will be installed. Default is \$HOME/bin/
|
||||||
-a Architecture to install (i386, x86_64, x86_64_legacy, arm, arm64). Default is to detect your arch with "uname -m".
|
-a Architecture to install (x86_64, arm64). Default is to detect your arch with "uname -m".
|
||||||
-o OS we are running (linux, macos). Default is to detect your OS with "uname -s".
|
-o OS we are running (linux, macos). Default is to detect your OS with "uname -s".
|
||||||
-b OS version. Default is to detect on MacOS and Linux.
|
-b OS version. Default is to detect on MacOS and Linux.
|
||||||
-l Just upgrade GAM to latest version. Skips project creation and auth.
|
-l Just upgrade GAM to latest version. Skips project creation and auth.
|
||||||
@@ -21,7 +21,7 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
target_dir="$HOME/bin"
|
target_dir="$HOME/bin"
|
||||||
target_gam="gam7/gam"
|
target_folder="$target_dir/gam7"
|
||||||
gamarch=$(uname -m)
|
gamarch=$(uname -m)
|
||||||
gamos=$(uname -s)
|
gamos=$(uname -s)
|
||||||
osversion=""
|
osversion=""
|
||||||
@@ -30,15 +30,13 @@ upgrade_only=false
|
|||||||
gamversion="latest"
|
gamversion="latest"
|
||||||
adminuser=""
|
adminuser=""
|
||||||
regularuser=""
|
regularuser=""
|
||||||
gam_x86_64_glibc_vers="2.35 2.31"
|
|
||||||
gam_arm64_glibc_vers="2.31"
|
|
||||||
strip_gam="--strip-components 0"
|
strip_gam="--strip-components 0"
|
||||||
|
|
||||||
while getopts "hd:a:o:b:lp:u:r:v:s" OPTION
|
while getopts "hd:a:o:b:lp:u:r:v:s" OPTION
|
||||||
do
|
do
|
||||||
case $OPTION in
|
case $OPTION in
|
||||||
h) usage; exit;;
|
h) usage; exit;;
|
||||||
d) target_dir="$OPTARG";;
|
d) target_dir="${OPTARG%/}"; target_folder="$target_dir/gam7";;
|
||||||
a) gamarch="$OPTARG";;
|
a) gamarch="$OPTARG";;
|
||||||
o) gamos="$OPTARG";;
|
o) gamos="$OPTARG";;
|
||||||
b) osversion="$OPTARG";;
|
b) osversion="$OPTARG";;
|
||||||
@@ -47,13 +45,11 @@ do
|
|||||||
u) adminuser="$OPTARG";;
|
u) adminuser="$OPTARG";;
|
||||||
r) regularuser="$OPTARG";;
|
r) regularuser="$OPTARG";;
|
||||||
v) gamversion="$OPTARG";;
|
v) gamversion="$OPTARG";;
|
||||||
s) strip_gam="--strip-components 1"; target_gam="gam";;
|
s) strip_gam="--strip-components 1"; target_folder="$target_dir";;
|
||||||
?) usage; exit;;
|
?) usage; exit;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
target_gam="$target_folder/gam"
|
||||||
# remove possible / from end of target_dir
|
|
||||||
target_dir=${target_dir%/}
|
|
||||||
|
|
||||||
update_profile() {
|
update_profile() {
|
||||||
[ "$2" -eq 1 ] || [ -f "$1" ] || return 1
|
[ "$2" -eq 1 ] || [ -f "$1" ] || return 1
|
||||||
@@ -90,7 +86,6 @@ version_gt()
|
|||||||
# MacOS < 10.13 doesn't support sort -V
|
# MacOS < 10.13 doesn't support sort -V
|
||||||
echo "" | sort -V > /dev/null 2>&1
|
echo "" | sort -V > /dev/null 2>&1
|
||||||
vsort_failed=$?
|
vsort_failed=$?
|
||||||
echo "Check:${2}"
|
|
||||||
if [ "${1}" = "${2}" ]; then
|
if [ "${1}" = "${2}" ]; then
|
||||||
true
|
true
|
||||||
elif (( $vsort_failed != 0 )); then
|
elif (( $vsort_failed != 0 )); then
|
||||||
@@ -100,81 +95,6 @@ else
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
case $gamos in
|
|
||||||
[lL]inux)
|
|
||||||
gamos="linux"
|
|
||||||
if [ "$osversion" == "" ]; then
|
|
||||||
this_glibc_ver=$(ldd --version | awk '/ldd/{print $NF}')
|
|
||||||
else
|
|
||||||
this_glibc_ver=$osversion
|
|
||||||
fi
|
|
||||||
echo "This Linux distribution uses glibc $this_glibc_ver"
|
|
||||||
case $gamarch in
|
|
||||||
x86_64)
|
|
||||||
useglibc="legacy"
|
|
||||||
for gam_glibc_ver in $gam_x86_64_glibc_vers; do
|
|
||||||
if version_gt $this_glibc_ver $gam_glibc_ver; then
|
|
||||||
useglibc="glibc$gam_glibc_ver"
|
|
||||||
echo_green "Using GAM compiled against $useglibc"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
gamfile="linux-x86_64-$useglibc.tar.xz";;
|
|
||||||
arm|arm64|aarch64)
|
|
||||||
useglibc=""
|
|
||||||
for gam_glibc_ver in $gam_arm64_glibc_vers; do
|
|
||||||
if version_gt $this_glibc_ver $gam_glibc_ver; then
|
|
||||||
useglibc="glibc$gam_glibc_ver"
|
|
||||||
echo_green "Using GAM compiled against $useglibc"
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ "$useglibc" == "" ]; then
|
|
||||||
echo_red "Sorry, you need to be running at least glibc $useglibc to run GAM"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
gamfile="linux-aarch64-$useglibc.tar.xz";;
|
|
||||||
*)
|
|
||||||
echo_red "ERROR: this installer currently only supports x86_64 and arm64 Linux. Looks like you're running on $gamarch. Exiting."
|
|
||||||
exit
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
[Mm]ac[Oo][sS]|[Dd]arwin)
|
|
||||||
gamos="macos"
|
|
||||||
fullversion=$(sw_vers -productVersion)
|
|
||||||
osversion=${fullversion:0:2}
|
|
||||||
case $gamarch in
|
|
||||||
x86_64)
|
|
||||||
gamfile="macos-x86_64.tar.xz"
|
|
||||||
minimum_version=13
|
|
||||||
;;
|
|
||||||
arm|arm64|aarch64)
|
|
||||||
gamfile="macos-aarch64.tar.xz"
|
|
||||||
minimum_version=14
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo_red "ERROR: this installer currently only supports x86_64 and arm64 MacOS. Looks like you're running on $gamarch. Exiting."
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
if [[ "$osversion" -ge "$minimum_version" ]]; then
|
|
||||||
echo_green "You are running MacOS ${fullversion}, good. Using GAM with ${gamfile}."
|
|
||||||
else
|
|
||||||
echo_red "Sorry, you are running MacOS ${fullversion} but GAM on ${gamarch} requires MacOS ${minimum_version}. Exiting."
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
MINGW64_NT*)
|
|
||||||
gamos="windows"
|
|
||||||
echo "You are running Windows"
|
|
||||||
gamfile="-windows-x86_64.zip"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo_red "Sorry, this installer currently only supports Linux and MacOS. Looks like you're running on $gamos. Exiting."
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
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
|
||||||
@@ -185,15 +105,34 @@ fi
|
|||||||
|
|
||||||
if [ -z ${GHCLIENT+x} ]; then
|
if [ -z ${GHCLIENT+x} ]; then
|
||||||
check_type="unauthenticated"
|
check_type="unauthenticated"
|
||||||
echo_yellow "Checking GitHub URL $release_url for $gamversion GAM release ($check_type)..."
|
curl_opts=( )
|
||||||
release_json=$(curl -s "$release_url" 2>&1 /dev/null)
|
|
||||||
else
|
else
|
||||||
check_type="authenticated"
|
check_type="authenticated"
|
||||||
echo_yellow "Checking GitHub URL $release_url for $gamversion GAM release ($check_type)..."
|
curl_opts=( "$GHCLIENT" )
|
||||||
release_json=$(curl -s "$GHCLIENT" "$release_url" 2>&1 /dev/null)
|
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)..."
|
||||||
|
release_json=$(curl \
|
||||||
|
--silent \
|
||||||
|
"${curl_opts[@]}" \
|
||||||
|
-H "Accept: application/vnd.github+json" \
|
||||||
|
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||||
|
"$release_url" \
|
||||||
|
"${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
|
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
|
||||||
@@ -215,11 +154,9 @@ if type(release) is list:
|
|||||||
break
|
break
|
||||||
try:
|
try:
|
||||||
for asset in release['assets']:
|
for asset in release['assets']:
|
||||||
if asset[attrib].endswith('$gamfile'):
|
print(asset[attrib])
|
||||||
print(asset[attrib])
|
#else:
|
||||||
break
|
# print('ERROR: Attribute: {0} for version {1} not found'.format(attrib, gamversion))
|
||||||
else:
|
|
||||||
print('ERROR: Attribute: {0} for $gamfile version {1} not found'.format(attrib, gamversion))
|
|
||||||
except KeyError:
|
except KeyError:
|
||||||
print('ERROR: assets value not found in JSON value of:\n\n%s' % release)"
|
print('ERROR: assets value not found in JSON value of:\n\n%s' % release)"
|
||||||
|
|
||||||
@@ -245,41 +182,161 @@ if (( $rc != 0 )); then
|
|||||||
echo_red "ERROR: No version of python installed."
|
echo_red "ERROR: No version of python installed."
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
# also sort the URLs once so we're evaluating newest OS version first
|
||||||
|
download_urls=$(echo "$release_json" | \
|
||||||
|
$pycmd -c "$pycode" browser_download_url "$gamversion" | \
|
||||||
|
sort --version-sort --reverse)
|
||||||
|
if [[ ${download_urls:0:5} = "ERROR" ]]; then
|
||||||
|
echo_red "${download_urls}"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $gamos in
|
||||||
|
[lL]inux)
|
||||||
|
gamos="linux"
|
||||||
|
download_urls=$(echo -e "$download_urls" | grep -e "-linux-")
|
||||||
|
if [ "$osversion" == "" ]; then
|
||||||
|
this_glibc_ver=$(ldd --version | awk '/ldd/{print $NF}')
|
||||||
|
else
|
||||||
|
this_glibc_ver=$osversion
|
||||||
|
fi
|
||||||
|
echo "This Linux distribution uses glibc $this_glibc_ver"
|
||||||
|
case $gamarch in
|
||||||
|
x86_64)
|
||||||
|
download_urls=$(echo -e "$download_urls" | grep -e "-x86_64-")
|
||||||
|
gam_x86_64_glibc_vers=$(echo -e "$download_urls" | \
|
||||||
|
grep --only-matching 'glibc[0-9\.]*\.tar\.xz$' \
|
||||||
|
| cut -c 6-9 )
|
||||||
|
useglibc="legacy"
|
||||||
|
for gam_glibc_ver in $gam_x86_64_glibc_vers; do
|
||||||
|
if version_gt $this_glibc_ver $gam_glibc_ver; then
|
||||||
|
useglibc="glibc$gam_glibc_ver"
|
||||||
|
echo_green "Using GAM compiled against $useglibc"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
download_url=$(echo -e "$download_urls" | grep "$useglibc")
|
||||||
|
;;
|
||||||
|
arm|arm64|aarch64)
|
||||||
|
download_urls=$(echo -e "$download_urls" | grep -e "-arm64-\|-aarch64-")
|
||||||
|
gam_arm64_glibc_vers=$(echo -e "$download_urls" | \
|
||||||
|
grep --only-matching 'glibc[0-9\.]*\.tar\.xz$' | \
|
||||||
|
cut -c 6-9)
|
||||||
|
useglibc="legacy"
|
||||||
|
for gam_glibc_ver in $gam_arm64_glibc_vers; do
|
||||||
|
if version_gt $this_glibc_ver $gam_glibc_ver; then
|
||||||
|
useglibc="glibc$gam_glibc_ver"
|
||||||
|
echo_green "Using GAM compiled against $useglibc"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
download_url=$(echo -e "$download_urls" | grep "$useglibc")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo_red "ERROR: this installer currently only supports x86_64 and arm64 Linux. Looks like you're running on $gamarch. Exiting."
|
||||||
|
exit
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
[Mm]ac[Oo][sS]|[Dd]arwin)
|
||||||
|
gamos="macos"
|
||||||
|
currentversion=$(sw_vers -productVersion | awk -F '.' '{print $1 "." $2}')
|
||||||
|
# override osversion only if it wasn't set by cli arguments
|
||||||
|
osversion=${osversion:-${currentversion}}
|
||||||
|
# override osversion only if it wasn't set by cli arguments
|
||||||
|
download_urls=$(echo -e "$download_urls" | grep -e "-macos")
|
||||||
|
case $gamarch in
|
||||||
|
x86_64)
|
||||||
|
archgrep="-x86_64"
|
||||||
|
;;
|
||||||
|
arm|arm64|aarch64)
|
||||||
|
archgrep="-arm64\|-aarch64"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo_red "ERROR: this installer currently only supports x86_64 and arm64 MacOS. Looks like you're running on ${gamarch}. Exiting."
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
gam_macos_urls=$(echo -e "$download_urls" | \
|
||||||
|
grep -e $archgrep)
|
||||||
|
versionless_urls=$(echo -e "$gam_macos_urls" | \
|
||||||
|
grep -e "-macos-")
|
||||||
|
if [ "$versionless_urls" == "" ]; then
|
||||||
|
# versions after 7.00.38 include MacOS version info
|
||||||
|
gam_macos_vers=$(echo -e "$gam_macos_urls" | \
|
||||||
|
grep --only-matching -e '-macos[0-9\.]*' | \
|
||||||
|
cut -c 7-10)
|
||||||
|
for gam_mac_ver in $gam_macos_vers; do
|
||||||
|
if version_gt $currentversion $gam_mac_ver; then
|
||||||
|
download_url=$(echo -e "$gam_macos_urls" | grep "$gam_mac_ver")
|
||||||
|
echo_green "You are running MacOS ${currentversion} Using GAM compiled against ${gam_mac_ver}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z ${download_url+x} ]; then
|
||||||
|
echo_red "Sorry, you are running MacOS ${osversion} but GAM on ${gamarch} requires MacOS ${gam_mac_ver} or newer. Exiting."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
# versions 7.00.38 and older don't include version info
|
||||||
|
case $gamarch in
|
||||||
|
x86_64)
|
||||||
|
minimum_version=13
|
||||||
|
;;
|
||||||
|
arm|arm64|aarch64)
|
||||||
|
minimum_version=14
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
download_url=$(echo -e "$download_urls" | grep -e $archgrep)
|
||||||
|
if version_gt "$osversion" "$minimum_version"; then
|
||||||
|
echo_green "You are running MacOS ${osversion}, good. Downloading GAM from ${download_url}."
|
||||||
|
else
|
||||||
|
echo_red "Sorry, you are running MacOS ${osversion} but GAM on ${gamarch} requires MacOS ${minimum_version}. Exiting."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
if [ -z ${download_url+x} ]; then
|
||||||
|
echo_red "Sorry, you are running MacOS ${currentversion} but GAM on ${gamarch} requires MacOS ${minimum_version}. Exiting."
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
MINGW64_NT*)
|
||||||
|
gamos="windows"
|
||||||
|
echo "You are running Windows"
|
||||||
|
download_url=$(echo -e "$download_urls" | \
|
||||||
|
grep -e "-windows-" | \
|
||||||
|
grep ".zip")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo_red "Sorry, this installer currently only supports Linux and MacOS. Looks like you're running on ${gamos}. Exiting."
|
||||||
|
exit
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
browser_download_url=$(echo "$release_json" | $pycmd -c "$pycode" browser_download_url "$gamversion")
|
|
||||||
if [[ ${browser_download_url:0:5} = "ERROR" ]]; then
|
|
||||||
echo_red "${browser_download_url}"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
name=$(echo "$release_json" | $pycmd -c "$pycode" name "$gamversion")
|
|
||||||
if [[ ${name:0:5} = "ERROR" ]]; then
|
|
||||||
echo_red "${name}"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
# Temp dir for archive
|
# Temp dir for archive
|
||||||
#temp_archive_dir=$(mktemp -d)
|
|
||||||
temp_archive_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
|
temp_archive_dir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')
|
||||||
|
|
||||||
# Clean up after ourselves even if we are killed with CTRL-C
|
# Clean up after ourselves even if we are killed with CTRL-C
|
||||||
trap "rm -rf $temp_archive_dir" EXIT
|
trap "rm -rf $temp_archive_dir" EXIT
|
||||||
|
|
||||||
echo_yellow "Downloading file $name from $browser_download_url to $temp_archive_dir ($check_type)..."
|
# hack to grab the end of the URL which should be the filename.
|
||||||
# Save archive to temp w/o losing our path
|
name=$(echo -e "$download_url" | rev | cut -f1 -d "/" | rev)
|
||||||
if [ -z ${GHCLIENT+x} ]; then
|
|
||||||
(cd "$temp_archive_dir" && curl -O -L $browser_download_url)
|
|
||||||
else
|
|
||||||
(cd "$temp_archive_dir" && curl -O -L $GHCLIENT $browser_download_url)
|
|
||||||
fi
|
|
||||||
|
|
||||||
mkdir -p "$target_dir"
|
echo_yellow "Downloading ${download_url} to $temp_archive_dir ($check_type)..."
|
||||||
|
# Save archive to temp w/o losing our path
|
||||||
|
(cd "$temp_archive_dir" && curl -O -L -s "${curl_opts[@]}" "$download_url")
|
||||||
|
|
||||||
|
mkdir -p "$target_folder"
|
||||||
|
echo_yellow "Deleting contents of $target_folder/lib"
|
||||||
|
rm -frv "$target_folder/lib"
|
||||||
|
|
||||||
echo_yellow "Extracting archive to $target_dir"
|
echo_yellow "Extracting archive to $target_dir"
|
||||||
if [[ "${name}" == *.tar.xz ]]; then
|
if [[ "$name" =~ tar.xz|tar.gz|tar ]]; then
|
||||||
tar $strip_gam -xf "$temp_archive_dir"/"$name" -C "$target_dir"
|
|
||||||
elif [[ "${name}" == *.tar ]]; then
|
|
||||||
tar $strip_gam -xf "$temp_archive_dir"/"$name" -C "$target_dir"
|
tar $strip_gam -xf "$temp_archive_dir"/"$name" -C "$target_dir"
|
||||||
|
elif [[ "$name" == *.zip ]]; then
|
||||||
|
unzip -o "${temp_archive_dir}/${name}" -d "${target_dir}"
|
||||||
else
|
else
|
||||||
unzip "${temp_archive_dir}/${name}" -d "${target_dir}"
|
echo "I don't know what to do with files like ${name}. Giving up."
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc != 0 )); then
|
if (( $rc != 0 )); then
|
||||||
@@ -291,7 +348,7 @@ fi
|
|||||||
|
|
||||||
# Update profile to add gam command
|
# Update profile to add gam command
|
||||||
if [ "$update_profile" = true ]; then
|
if [ "$update_profile" = true ]; then
|
||||||
alias_line="alias gam=\"${target_dir// /\\ }/$target_gam\""
|
alias_line="alias gam=\"$target_gam\""
|
||||||
if [ "$gamos" == "linux" ]; then
|
if [ "$gamos" == "linux" ]; then
|
||||||
update_profile "$HOME/.bash_aliases" 0 || update_profile "$HOME/.bash_profile" 0 || update_profile "$HOME/.bashrc" 0
|
update_profile "$HOME/.bash_aliases" 0 || update_profile "$HOME/.bash_profile" 0 || update_profile "$HOME/.bashrc" 0
|
||||||
update_profile "$HOME/.zshrc" 0
|
update_profile "$HOME/.zshrc" 0
|
||||||
@@ -305,7 +362,7 @@ fi
|
|||||||
|
|
||||||
if [ "$upgrade_only" = true ]; then
|
if [ "$upgrade_only" = true ]; then
|
||||||
echo_green "Here's information about your GAM upgrade:"
|
echo_green "Here's information about your GAM upgrade:"
|
||||||
"$target_dir/$target_gam" version extended
|
"$target_gam" version extended
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc != 0 )); then
|
if (( $rc != 0 )); then
|
||||||
echo_red "ERROR: Failed running GAM for the first time with return code $rc. Please report this error to GAM mailing list. Exiting."
|
echo_red "ERROR: Failed running GAM for the first time with return code $rc. Please report this error to GAM mailing list. Exiting."
|
||||||
@@ -327,7 +384,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_folder/nobrowser.txt" > /dev/null 2>&1
|
||||||
break
|
break
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -345,8 +402,8 @@ while true; do
|
|||||||
if [ "$adminuser" == "" ]; then
|
if [ "$adminuser" == "" ]; then
|
||||||
read -p "Please enter your Google Workspace admin email address: " adminuser
|
read -p "Please enter your Google Workspace admin email address: " adminuser
|
||||||
fi
|
fi
|
||||||
# "$target_dir/$target_gam" $config_cmd create project $adminuser
|
# "$target_gam" $config_cmd create project $adminuser
|
||||||
"$target_dir/$target_gam" create project $adminuser
|
"$target_gam" create project $adminuser
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Project creation complete."
|
echo_green "Project creation complete."
|
||||||
@@ -371,8 +428,8 @@ while $project_created; do
|
|||||||
read -p "Are you ready to authorize GAM to perform Google Workspace management operations as your admin account? (yes or no) " yn
|
read -p "Are you ready to authorize GAM to perform Google Workspace management operations as your admin account? (yes or no) " yn
|
||||||
case $yn in
|
case $yn in
|
||||||
[Yy]*)
|
[Yy]*)
|
||||||
# "$target_dir/$target_gam" $config_cmd oauth create $adminuser
|
# "$target_gam" $config_cmd oauth create $adminuser
|
||||||
"$target_dir/$target_gam" oauth create $adminuser
|
"$target_gam" oauth create $adminuser
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Admin authorization complete."
|
echo_green "Admin authorization complete."
|
||||||
@@ -401,8 +458,8 @@ while $admin_authorized; do
|
|||||||
read -p "Please enter the email address of a regular Google Workspace user: " regularuser
|
read -p "Please enter the email address of a regular Google Workspace user: " regularuser
|
||||||
fi
|
fi
|
||||||
echo_yellow "Great! Checking service account scopes.This will fail the first time. Follow the steps to authorize and retry. It can take a few minutes for scopes to PASS after they've been authorized in the admin console."
|
echo_yellow "Great! Checking service account scopes.This will fail the first time. Follow the steps to authorize and retry. It can take a few minutes for scopes to PASS after they've been authorized in the admin console."
|
||||||
# "$target_dir/$target_gam" $config_cmd user $regularuser check serviceaccount
|
# "$target_gam" $config_cmd user $regularuser check serviceaccount
|
||||||
"$target_dir/$target_gam" user $regularuser check serviceaccount
|
"$target_gam" user $regularuser check serviceaccount
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc == 0 )); then
|
if (( $rc == 0 )); then
|
||||||
echo_green "Service account authorization complete."
|
echo_green "Service account authorization complete."
|
||||||
@@ -423,8 +480,8 @@ while $admin_authorized; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo_green "Here's information about your new GAM installation:"
|
echo_green "Here's information about your new GAM installation:"
|
||||||
#"$target_dir/$target_gam" $config_cmd save version extended
|
#"$target_gam" $config_cmd save version extended
|
||||||
"$target_dir/$target_gam" version extended
|
"$target_gam" version extended
|
||||||
rc=$?
|
rc=$?
|
||||||
if (( $rc != 0 )); then
|
if (( $rc != 0 )); then
|
||||||
echo_red "ERROR: Failed running GAM for the first time with $rc. Please report this error to GAM mailing list. Exiting."
|
echo_red "ERROR: Failed running GAM for the first time with $rc. Please report this error to GAM mailing list. Exiting."
|
||||||
|
|||||||
11
src/gam.exe.manifest
Normal file
11
src/gam.exe.manifest
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- Windows 8.1 / Server 2012 R2 -->
|
||||||
|
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />
|
||||||
|
<!-- Windows 10+ / Server 2016+ -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
</assembly>
|
||||||
@@ -11,5 +11,5 @@ from gam.__main__ import main
|
|||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if platform.system() != 'Linux':
|
if platform.system() != 'Linux':
|
||||||
multiprocessing.freeze_support()
|
multiprocessing.freeze_support()
|
||||||
multiprocessing.set_start_method('spawn')
|
multiprocessing.set_start_method('spawn', force=True)
|
||||||
main()
|
main()
|
||||||
|
|||||||
43
src/gam.spec
43
src/gam.spec
@@ -1,25 +1,47 @@
|
|||||||
# -*- mode: python ; coding: utf-8 -*-
|
# -*- mode: python ; coding: utf-8 -*-
|
||||||
from os import getenv
|
from os import getenv
|
||||||
from re import search
|
import re
|
||||||
from sys import platform
|
from sys import platform
|
||||||
|
|
||||||
from PyInstaller.utils.hooks import copy_metadata
|
from PyInstaller.utils.hooks import copy_metadata
|
||||||
|
|
||||||
from gam.gamlib.glverlibs import GAM_VER_LIBS
|
from gam.gamlib.glverlibs import GAM_VER_LIBS
|
||||||
|
|
||||||
|
|
||||||
|
with open("gam/__init__.py") as f:
|
||||||
|
version_file = f.read()
|
||||||
|
version = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", version_file, re.M).group(1)
|
||||||
|
version_list = [int(i) for i in version.split('.')]
|
||||||
|
while len(version_list) < 4:
|
||||||
|
version_list.append(0)
|
||||||
|
version_tuple = tuple(version_list)
|
||||||
|
version_str = str(version_tuple)
|
||||||
|
with open("version_info.txt.in") as f:
|
||||||
|
version_info = f.read()
|
||||||
|
version_info = version_info.replace("{VERSION}", version).replace(
|
||||||
|
"{VERSION_TUPLE}", version_str
|
||||||
|
)
|
||||||
|
with open("version_info.txt", "w") as f:
|
||||||
|
f.write(version_info)
|
||||||
|
print(version_info)
|
||||||
|
|
||||||
datas = []
|
datas = []
|
||||||
for pkg in GAM_VER_LIBS:
|
for pkg in GAM_VER_LIBS:
|
||||||
datas += copy_metadata(pkg, recursive=True)
|
datas += copy_metadata(pkg, recursive=True)
|
||||||
datas += [('admin-directory_v1.1beta1.json', '.')]
|
datas += [('gam/cbcm-v1.1beta1.json', '.')]
|
||||||
datas += [('cbcm-v1.1beta1.json', '.')]
|
datas += [('gam/contactdelegation-v1.json', '.')]
|
||||||
datas += [('contactdelegation-v1.json', '.')]
|
datas += [('gam/datastudio-v1.json', '.')]
|
||||||
datas += [('datastudio-v1.json', '.')]
|
datas += [('gam/meet-v2beta.json', '.')]
|
||||||
datas += [('serviceaccountlookup-v1.json', '.')]
|
datas += [('gam/serviceaccountlookup-v1.json', '.')]
|
||||||
datas += [('cacerts.pem', '.')]
|
datas += [('cacerts.pem', '.')]
|
||||||
hiddenimports = [
|
hiddenimports = [
|
||||||
'gam.gamlib.yubikey',
|
'gam.gamlib.yubikey',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
excludes = [
|
||||||
|
'pkg_resources',
|
||||||
|
]
|
||||||
|
|
||||||
runtime_hooks = []
|
runtime_hooks = []
|
||||||
a = Analysis(
|
a = Analysis(
|
||||||
['gam/__main__.py'],
|
['gam/__main__.py'],
|
||||||
@@ -30,7 +52,7 @@ a = Analysis(
|
|||||||
hookspath=[],
|
hookspath=[],
|
||||||
hooksconfig={},
|
hooksconfig={},
|
||||||
runtime_hooks=runtime_hooks,
|
runtime_hooks=runtime_hooks,
|
||||||
excludes=[],
|
excludes=excludes,
|
||||||
win_no_prefer_redirects=False,
|
win_no_prefer_redirects=False,
|
||||||
win_private_assemblies=False,
|
win_private_assemblies=False,
|
||||||
cipher=None,
|
cipher=None,
|
||||||
@@ -50,6 +72,8 @@ pyz = PYZ(a.pure,
|
|||||||
target_arch = None
|
target_arch = None
|
||||||
codesign_identity = None
|
codesign_identity = None
|
||||||
entitlements_file = None
|
entitlements_file = None
|
||||||
|
manifest = None
|
||||||
|
version = 'version_info.txt'
|
||||||
match platform:
|
match platform:
|
||||||
case "darwin":
|
case "darwin":
|
||||||
if getenv('arch') == 'universal2':
|
if getenv('arch') == 'universal2':
|
||||||
@@ -62,6 +86,7 @@ match platform:
|
|||||||
case "win32":
|
case "win32":
|
||||||
target_arch = None
|
target_arch = None
|
||||||
strip = False
|
strip = False
|
||||||
|
manifest = 'gam.exe.manifest'
|
||||||
case _:
|
case _:
|
||||||
target_arch = None
|
target_arch = None
|
||||||
strip = True
|
strip = True
|
||||||
@@ -83,6 +108,7 @@ if getenv('PYINSTALLER_BUILD_ONEDIR') == 'yes':
|
|||||||
debug=debug,
|
debug=debug,
|
||||||
bootloader_ignore_signals=bootloader_ignore_signals,
|
bootloader_ignore_signals=bootloader_ignore_signals,
|
||||||
strip=strip,
|
strip=strip,
|
||||||
|
manifest=manifest,
|
||||||
upx=upx,
|
upx=upx,
|
||||||
console=console,
|
console=console,
|
||||||
# put most everyting under a lib/ subfolder
|
# put most everyting under a lib/ subfolder
|
||||||
@@ -92,6 +118,7 @@ if getenv('PYINSTALLER_BUILD_ONEDIR') == 'yes':
|
|||||||
target_arch=target_arch,
|
target_arch=target_arch,
|
||||||
codesign_identity=codesign_identity,
|
codesign_identity=codesign_identity,
|
||||||
entitlements_file=entitlements_file,
|
entitlements_file=entitlements_file,
|
||||||
|
version=version,
|
||||||
)
|
)
|
||||||
coll = COLLECT(
|
coll = COLLECT(
|
||||||
exe,
|
exe,
|
||||||
@@ -115,6 +142,7 @@ else:
|
|||||||
name=name,
|
name=name,
|
||||||
debug=debug,
|
debug=debug,
|
||||||
bootloader_ignore_signals=bootloader_ignore_signals,
|
bootloader_ignore_signals=bootloader_ignore_signals,
|
||||||
|
manifest=manifest,
|
||||||
strip=strip,
|
strip=strip,
|
||||||
upx=upx,
|
upx=upx,
|
||||||
console=console,
|
console=console,
|
||||||
@@ -123,5 +151,6 @@ else:
|
|||||||
target_arch=target_arch,
|
target_arch=target_arch,
|
||||||
codesign_identity=codesign_identity,
|
codesign_identity=codesign_identity,
|
||||||
entitlements_file=entitlements_file,
|
entitlements_file=entitlements_file,
|
||||||
|
version=version,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
9733
src/gam/__init__.py
9733
src/gam/__init__.py
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -247,7 +247,9 @@ class ProxiedHttpClient(HttpClient):
|
|||||||
# Trivial setup for ssl socket.
|
# Trivial setup for ssl socket.
|
||||||
sslobj = None
|
sslobj = None
|
||||||
if ssl_imported:
|
if ssl_imported:
|
||||||
sslobj = ssl.wrap_socket(p_sock, None, None)
|
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
|
||||||
|
context.minimum_version = ssl.TLSVersion.TLSv1_2
|
||||||
|
sslobj = context.wrap_socket(p_sock, server_hostname=url.host)
|
||||||
else:
|
else:
|
||||||
sock_ssl = socket.ssl(p_sock, None, None)
|
sock_ssl = socket.ssl(p_sock, None, None)
|
||||||
sslobj = http.client.FakeSocket(p_sock, sock_ssl)
|
sslobj = http.client.FakeSocket(p_sock, sock_ssl)
|
||||||
|
|||||||
@@ -564,9 +564,11 @@ class ProxiedHttpClient(HttpClient):
|
|||||||
# Trivial setup for ssl socket.
|
# Trivial setup for ssl socket.
|
||||||
sslobj = None
|
sslobj = None
|
||||||
if ssl is not None:
|
if ssl is not None:
|
||||||
sslobj = ssl.wrap_socket(p_sock, None, None)
|
context = ssl.SSLContext(ssl.PROTOCOL_TLS)
|
||||||
|
context.minimum_version = ssl.TLSVersion.TLSv1_2
|
||||||
|
sslobj = context.wrap_socket(p_sock, server_hostname=uri.host)
|
||||||
else:
|
else:
|
||||||
sock_ssl = socket.ssl(p_sock, None, Nonesock_)
|
sock_ssl = socket.ssl(p_sock, None, None)
|
||||||
sslobj = http.client.FakeSocket(p_sock, sock_ssl)
|
sslobj = http.client.FakeSocket(p_sock, sock_ssl)
|
||||||
# Initalize httplib and replace with the proxy socket.
|
# Initalize httplib and replace with the proxy socket.
|
||||||
connection = http.client.HTTPConnection(proxy_uri.host)
|
connection = http.client.HTTPConnection(proxy_uri.host)
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class MockHttpClient(atom.http_interface.GenericHttpClient):
|
|||||||
for recording in self.recordings:
|
for recording in self.recordings:
|
||||||
if recording[0].operation == operation and recording[0].url == url:
|
if recording[0].operation == operation and recording[0].url == url:
|
||||||
return recording[1]
|
return recording[1]
|
||||||
raise NoRecordingFound('No recodings found for %s %s' % (
|
raise NoRecordingFound('No recordings found for %s %s' % (
|
||||||
operation, url))
|
operation, url))
|
||||||
else:
|
else:
|
||||||
# There is a real HTTP client, so make the request, and record the
|
# There is a real HTTP client, so make the request, and record the
|
||||||
|
|||||||
@@ -1,33 +1,3 @@
|
|||||||
# Operating CA: DigiCert
|
|
||||||
# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
|
||||||
# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
|
|
||||||
# Label: "Baltimore CyberTrust Root"
|
|
||||||
# Serial: 33554617
|
|
||||||
# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
|
|
||||||
# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
|
|
||||||
# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
|
|
||||||
RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
|
|
||||||
VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
|
|
||||||
DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
|
|
||||||
ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
|
|
||||||
VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
|
|
||||||
mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
|
|
||||||
IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
|
|
||||||
mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
|
|
||||||
XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
|
|
||||||
dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
|
|
||||||
jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
|
|
||||||
BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
|
|
||||||
DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
|
|
||||||
9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
|
|
||||||
jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
|
|
||||||
Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
|
|
||||||
ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
|
|
||||||
R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: DigiCert
|
# Operating CA: DigiCert
|
||||||
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
||||||
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
|
||||||
@@ -273,257 +243,6 @@ r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1
|
|||||||
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
|
||||||
# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
|
|
||||||
# Label: "Entrust Root Certification Authority"
|
|
||||||
# Serial: 1164660820
|
|
||||||
# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
|
|
||||||
# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
|
|
||||||
# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
|
|
||||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
|
|
||||||
Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
|
|
||||||
KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
|
|
||||||
cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
|
|
||||||
NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
|
|
||||||
NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
|
|
||||||
ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
|
|
||||||
BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
|
|
||||||
KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
|
|
||||||
Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
|
|
||||||
4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
|
|
||||||
KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
|
|
||||||
rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
|
|
||||||
94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
|
|
||||||
sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
|
|
||||||
gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
|
|
||||||
kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
|
|
||||||
vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
|
|
||||||
A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
|
|
||||||
O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
|
|
||||||
AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
|
|
||||||
9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
|
|
||||||
eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
|
|
||||||
0vdXcDazv/wor3ElhVsT/h5/WrQ8
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
|
|
||||||
# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only
|
|
||||||
# Label: "Entrust Root Certification Authority - EC1"
|
|
||||||
# Serial: 51543124481930649114116133369
|
|
||||||
# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc
|
|
||||||
# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47
|
|
||||||
# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG
|
|
||||||
A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3
|
|
||||||
d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu
|
|
||||||
dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq
|
|
||||||
RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy
|
|
||||||
MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD
|
|
||||||
VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0
|
|
||||||
L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g
|
|
||||||
Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD
|
|
||||||
ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi
|
|
||||||
A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt
|
|
||||||
ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH
|
|
||||||
Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O
|
|
||||||
BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC
|
|
||||||
R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX
|
|
||||||
hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
|
|
||||||
# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only
|
|
||||||
# Label: "Entrust Root Certification Authority - G2"
|
|
||||||
# Serial: 1246989352
|
|
||||||
# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2
|
|
||||||
# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4
|
|
||||||
# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC
|
|
||||||
VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50
|
|
||||||
cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs
|
|
||||||
IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz
|
|
||||||
dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy
|
|
||||||
NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu
|
|
||||||
dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt
|
|
||||||
dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0
|
|
||||||
aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj
|
|
||||||
YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
|
||||||
AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T
|
|
||||||
RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN
|
|
||||||
cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW
|
|
||||||
wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1
|
|
||||||
U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0
|
|
||||||
jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP
|
|
||||||
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN
|
|
||||||
BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/
|
|
||||||
jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ
|
|
||||||
Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v
|
|
||||||
1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R
|
|
||||||
nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH
|
|
||||||
VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
|
|
||||||
# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
|
|
||||||
# Label: "Entrust.net Premium 2048 Secure Server CA"
|
|
||||||
# Serial: 946069240
|
|
||||||
# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
|
|
||||||
# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
|
|
||||||
# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
|
|
||||||
RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
|
|
||||||
bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
|
|
||||||
IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
|
|
||||||
ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
|
|
||||||
MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
|
|
||||||
LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
|
|
||||||
YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
|
|
||||||
A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
|
|
||||||
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
|
|
||||||
K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
|
|
||||||
sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
|
|
||||||
MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
|
|
||||||
XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
|
|
||||||
HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
|
|
||||||
4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
|
|
||||||
HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
|
|
||||||
j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
|
|
||||||
U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
|
|
||||||
zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
|
|
||||||
u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
|
|
||||||
bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
|
|
||||||
fF6adulZkMV8gzURZVE=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Commercial O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Commercial"
|
|
||||||
# Serial: 8608355977964138876
|
|
||||||
# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
|
|
||||||
# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
|
|
||||||
# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
|
||||||
dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
|
|
||||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
|
||||||
cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
|
||||||
AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
|
|
||||||
Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
|
|
||||||
ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
|
|
||||||
MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
|
|
||||||
yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
|
|
||||||
VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
|
|
||||||
nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
|
||||||
KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
|
|
||||||
XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
|
|
||||||
vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
|
|
||||||
Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
|
|
||||||
N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
|
|
||||||
nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Networking O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Networking O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Networking"
|
|
||||||
# Serial: 8957382827206547757
|
|
||||||
# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
|
|
||||||
# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
|
|
||||||
# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
|
|
||||||
dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
|
|
||||||
MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
|
|
||||||
cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
|
|
||||||
AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
|
|
||||||
YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
|
|
||||||
kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
|
|
||||||
QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
|
|
||||||
6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
|
|
||||||
yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
|
|
||||||
QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
|
|
||||||
KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
|
|
||||||
tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
|
|
||||||
QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
|
|
||||||
Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
|
|
||||||
olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
|
|
||||||
x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Premium O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Premium O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Premium"
|
|
||||||
# Serial: 7893706540734352110
|
|
||||||
# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
|
|
||||||
# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
|
|
||||||
# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
|
|
||||||
BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
|
|
||||||
dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
|
|
||||||
A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
|
|
||||||
cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
|
|
||||||
qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
|
|
||||||
JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
|
|
||||||
+jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
|
|
||||||
s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
|
|
||||||
HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
|
|
||||||
70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
|
|
||||||
V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
|
|
||||||
qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
|
|
||||||
5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
|
|
||||||
C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
|
|
||||||
OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
|
|
||||||
FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
|
|
||||||
BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
|
|
||||||
KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
|
|
||||||
Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
|
|
||||||
8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
|
|
||||||
MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
|
|
||||||
0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
|
|
||||||
u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
|
|
||||||
u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
|
|
||||||
YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
|
|
||||||
GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
|
|
||||||
RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
|
|
||||||
KeC2uAloGRwYQw==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: Entrust Datacard
|
|
||||||
# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
|
|
||||||
# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
|
|
||||||
# Label: "AffirmTrust Premium ECC"
|
|
||||||
# Serial: 8401224907861490260
|
|
||||||
# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
|
|
||||||
# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
|
|
||||||
# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
|
|
||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
|
|
||||||
VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
|
|
||||||
cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
|
|
||||||
BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
|
|
||||||
VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
|
|
||||||
0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
|
|
||||||
ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
|
|
||||||
A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
|
|
||||||
A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
|
|
||||||
aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
|
|
||||||
flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
|
|
||||||
-----END CERTIFICATE-----
|
|
||||||
|
|
||||||
# Operating CA: GlobalSign
|
# Operating CA: GlobalSign
|
||||||
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
||||||
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
|
||||||
@@ -818,16 +537,16 @@ smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
|
|||||||
# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
|
# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
|
||||||
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
|
# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
|
||||||
# Label: "COMODO Certification Authority"
|
# Label: "COMODO Certification Authority"
|
||||||
# Serial: 104350513648249232941998508985834464573
|
# Serial: 43390818032842818540635488309124489234
|
||||||
# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
|
# MD5 Fingerprint: 20:E7:4F:82:C2:7E:94:80:34:82:8A:13:A9:17:1D:97
|
||||||
# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
|
# SHA1 Fingerprint EE:86:93:87:FF:FD:83:49:AB:5A:D1:43:22:58:87:89:A4:57:B0:12
|
||||||
# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
|
# SHA256 Fingerprint: 1A:0D:20:44:5D:E5:BA:18:62:D1:9E:F8:80:85:8C:BC:E5:01:02:B3:6E:8F:0A:04:0C:3C:69:E7:45:22:FE:6E
|
||||||
-----BEGIN CERTIFICATE-----
|
-----BEGIN CERTIFICATE-----
|
||||||
MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
|
MIID0DCCArigAwIBAgIQIKTEf93f4cdTYwcTiHdgEjANBgkqhkiG9w0BAQUFADCB
|
||||||
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
|
||||||
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
|
A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
|
||||||
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
|
BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xMTAxMDEwMDAw
|
||||||
MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
|
MDBaFw0zMDEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
|
||||||
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
|
YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
|
||||||
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
|
RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
|
||||||
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
|
aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
|
||||||
@@ -836,16 +555,14 @@ UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
|
|||||||
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
|
Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
|
||||||
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
|
+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
|
||||||
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
|
DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
|
||||||
nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
|
nKVIrLsm9wIDAQABo0IwQDAdBgNVHQ4EFgQUC1jli8ZMFTekQKkwqSG+RzZaVv8w
|
||||||
/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
|
DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
|
||||||
PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
|
ggEBAC/JxBwHO89hAgCx2SFRdXIDMLDEFh9sAIsQrK/xR9SuEDwMGvjUk2ysEDd8
|
||||||
QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
|
t6aDZK3N3w6HM503sMZ7OHKx8xoOo/lVem0DZgMXlUrxsXrfViEGQo+x06iF3u6X
|
||||||
SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
|
HWLrp+cxEmbDD6ZLLkGC9/3JG6gbr+48zuOcrigHoSybJMIPIyaDMouGDx8rEkYl
|
||||||
IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
|
Fo92kANr3ryqImhrjKGsKxE5pttwwn1y6TPn/CbxdFqR5p2ErPioBhlG5qfpqjQi
|
||||||
RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
|
pKGfeq23sqSaM4hxAjwu1nqyH6LKwN0vEJT9s4yEIHlG1QXUEOTS22RPuFvuG8Ug
|
||||||
zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
|
R1uUq27UlTMdphVx8fiUylQ5PsE=
|
||||||
BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
|
|
||||||
ZQ==
|
|
||||||
-----END CERTIFICATE-----
|
-----END CERTIFICATE-----
|
||||||
|
|
||||||
# Operating CA: Sectigo
|
# Operating CA: Sectigo
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ class GamAction():
|
|||||||
CLAIM_OWNERSHIP = 'clow'
|
CLAIM_OWNERSHIP = 'clow'
|
||||||
CLEAR = 'clea'
|
CLEAR = 'clea'
|
||||||
CLOSE = 'clos'
|
CLOSE = 'clos'
|
||||||
COLLECT = 'collect'
|
COLLECT = 'coll'
|
||||||
COMMENT = 'comment'
|
COMMENT = 'comm'
|
||||||
COPY = 'copy'
|
COPY = 'copy'
|
||||||
COPY_MERGE = 'copm'
|
COPY_MERGE = 'copm'
|
||||||
CREATE = 'crea'
|
CREATE = 'crea'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -22,11 +22,12 @@
|
|||||||
# APIs
|
# APIs
|
||||||
ACCESSCONTEXTMANAGER = 'accesscontextmanager'
|
ACCESSCONTEXTMANAGER = 'accesscontextmanager'
|
||||||
ALERTCENTER = 'alertcenter'
|
ALERTCENTER = 'alertcenter'
|
||||||
ANALYTICS = 'analytics'
|
|
||||||
ANALYTICS_ADMIN = 'analyticsadmin'
|
ANALYTICS_ADMIN = 'analyticsadmin'
|
||||||
CALENDAR = 'calendar'
|
CALENDAR = 'calendar'
|
||||||
|
BUSINESSACCOUNTMANAGEMENT = 'mybusinessaccountmanagement'
|
||||||
CBCM = 'cbcm'
|
CBCM = 'cbcm'
|
||||||
CHAT = 'chat'
|
CHAT = 'chat'
|
||||||
|
CHAT_CUSTOM_EMOJIS = 'chatcustomemojis'
|
||||||
CHAT_EVENTS = 'chatevents'
|
CHAT_EVENTS = 'chatevents'
|
||||||
CHAT_MEMBERSHIPS = 'chatmemberships'
|
CHAT_MEMBERSHIPS = 'chatmemberships'
|
||||||
CHAT_MEMBERSHIPS_ADMIN = 'chatmembershipsadmin'
|
CHAT_MEMBERSHIPS_ADMIN = 'chatmembershipsadmin'
|
||||||
@@ -37,6 +38,7 @@ CHAT_SPACES_DELETE = 'chatspacesdelete'
|
|||||||
CHAT_SPACES_DELETE_ADMIN = 'chatspacesdeleteadmin'
|
CHAT_SPACES_DELETE_ADMIN = 'chatspacesdeleteadmin'
|
||||||
CHROMEMANAGEMENT = 'chromemanagement'
|
CHROMEMANAGEMENT = 'chromemanagement'
|
||||||
CHROMEMANAGEMENT_APPDETAILS = 'chromemanagementappdetails'
|
CHROMEMANAGEMENT_APPDETAILS = 'chromemanagementappdetails'
|
||||||
|
CHROMEMANAGEMENT_CHROMEPROFILES = 'chromemanagementchromeprofiles'
|
||||||
CHROMEMANAGEMENT_TELEMETRY = 'chromemanagementtelemetry'
|
CHROMEMANAGEMENT_TELEMETRY = 'chromemanagementtelemetry'
|
||||||
CHROMEPOLICY = 'chromepolicy'
|
CHROMEPOLICY = 'chromepolicy'
|
||||||
CHROMEVERSIONHISTORY = 'versionhistory'
|
CHROMEVERSIONHISTORY = 'versionhistory'
|
||||||
@@ -44,17 +46,17 @@ 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_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
|
CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
|
||||||
|
CLOUDIDENTITY_POLICY = 'cloudidentitypolicy'
|
||||||
CLOUDIDENTITY_USERINVITATIONS = 'cloudidentityuserinvitations'
|
CLOUDIDENTITY_USERINVITATIONS = 'cloudidentityuserinvitations'
|
||||||
CLOUDRESOURCEMANAGER = 'cloudresourcemanager'
|
CLOUDRESOURCEMANAGER = 'cloudresourcemanager'
|
||||||
CLOUDRESOURCEMANAGER_V1 = 'cloudresourcemanager1'
|
|
||||||
CONTACTS = 'contacts'
|
CONTACTS = 'contacts'
|
||||||
CONTACTDELEGATION = 'contactdelegation'
|
CONTACTDELEGATION = 'contactdelegation'
|
||||||
DATATRANSFER = 'datatransfer'
|
DATATRANSFER = 'datatransfer'
|
||||||
DIRECTORY = 'directory'
|
DIRECTORY = 'directory'
|
||||||
DIRECTORY_BETA = 'directory_beta'
|
|
||||||
DOCS = 'docs'
|
DOCS = 'docs'
|
||||||
DRIVE2 = 'drive2'
|
DRIVE2 = 'drive2'
|
||||||
DRIVE3 = 'drive3'
|
DRIVE3 = 'drive3'
|
||||||
@@ -70,11 +72,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'
|
||||||
@@ -84,20 +86,23 @@ PRINTERS = 'printers'
|
|||||||
PUBSUB = 'pubsub'
|
PUBSUB = 'pubsub'
|
||||||
REPORTS = 'reports'
|
REPORTS = 'reports'
|
||||||
RESELLER = 'reseller'
|
RESELLER = 'reseller'
|
||||||
|
SEARCHCONSOLE = 'searchconsole'
|
||||||
SERVICEACCOUNTLOOKUP = 'serviceaccountlookup'
|
SERVICEACCOUNTLOOKUP = 'serviceaccountlookup'
|
||||||
SERVICEMANAGEMENT = 'servicemanagement'
|
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'
|
||||||
STORAGEWRITE = 'storagewrite'
|
STORAGEWRITE = 'storagewrite'
|
||||||
|
TAGMANAGER = 'tagmanager'
|
||||||
|
TAGMANAGER_USERS = 'tagmanagerusers'
|
||||||
TASKS = 'tasks'
|
TASKS = 'tasks'
|
||||||
VAULT = 'vault'
|
VAULT = 'vault'
|
||||||
YOUTUBE = 'youtube'
|
YOUTUBE = 'youtube'
|
||||||
#
|
#
|
||||||
|
BUSINESSACCOUNTMANAGEMENT_SCOPE = 'https://www.googleapis.com/auth/business.manage'
|
||||||
CHROMEVERSIONHISTORY_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms'
|
CHROMEVERSIONHISTORY_URL = 'https://versionhistory.googleapis.com/v1/chrome/platforms'
|
||||||
DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive'
|
DRIVE_SCOPE = 'https://www.googleapis.com/auth/drive'
|
||||||
GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'
|
GMAIL_SEND_SCOPE = 'https://www.googleapis.com/auth/gmail.send'
|
||||||
@@ -119,6 +124,7 @@ JWT_APIS = {
|
|||||||
ACCESSCONTEXTMANAGER: [CLOUD_PLATFORM_SCOPE],
|
ACCESSCONTEXTMANAGER: [CLOUD_PLATFORM_SCOPE],
|
||||||
CHAT: ['https://www.googleapis.com/auth/chat.bot'],
|
CHAT: ['https://www.googleapis.com/auth/chat.bot'],
|
||||||
CLOUDRESOURCEMANAGER: [CLOUD_PLATFORM_SCOPE],
|
CLOUDRESOURCEMANAGER: [CLOUD_PLATFORM_SCOPE],
|
||||||
|
IAM: [IAM_SCOPE],
|
||||||
ORGPOLICY: [CLOUD_PLATFORM_SCOPE],
|
ORGPOLICY: [CLOUD_PLATFORM_SCOPE],
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
@@ -132,6 +138,12 @@ APIS_NEEDING_ACCESS_TOKEN = {
|
|||||||
CBCM: ['https://www.googleapis.com/auth/admin.directory.device.chromebrowsers']
|
CBCM: ['https://www.googleapis.com/auth/admin.directory.device.chromebrowsers']
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
|
DEPRECATED_SCOPES = {
|
||||||
|
'https://www.googleapis.com/auth/cloud-identity',
|
||||||
|
'https://www.googleapis.com/auth/cloud-platform',
|
||||||
|
'https://www.googleapis.com/auth/iam',
|
||||||
|
}
|
||||||
|
#
|
||||||
REFRESH_PERM_ERRORS = [
|
REFRESH_PERM_ERRORS = [
|
||||||
'invalid_grant: reauth related error (rapt_required)', # no way to reauth today
|
'invalid_grant: reauth related error (rapt_required)', # no way to reauth today
|
||||||
'invalid_grant: Token has been expired or revoked',
|
'invalid_grant: Token has been expired or revoked',
|
||||||
@@ -162,9 +174,9 @@ PROJECT_APIS = [
|
|||||||
'accesscontextmanager.googleapis.com',
|
'accesscontextmanager.googleapis.com',
|
||||||
'admin.googleapis.com',
|
'admin.googleapis.com',
|
||||||
'alertcenter.googleapis.com',
|
'alertcenter.googleapis.com',
|
||||||
'analytics.googleapis.com',
|
|
||||||
'analyticsadmin.googleapis.com',
|
'analyticsadmin.googleapis.com',
|
||||||
# 'audit.googleapis.com',
|
# 'audit.googleapis.com',
|
||||||
|
'mybusinessaccountmanagement.googleapis.com',
|
||||||
'calendar-json.googleapis.com',
|
'calendar-json.googleapis.com',
|
||||||
'chat.googleapis.com',
|
'chat.googleapis.com',
|
||||||
'chromemanagement.googleapis.com',
|
'chromemanagement.googleapis.com',
|
||||||
@@ -184,16 +196,17 @@ 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',
|
||||||
'people.googleapis.com',
|
'people.googleapis.com',
|
||||||
'pubsub.googleapis.com',
|
'pubsub.googleapis.com',
|
||||||
'reseller.googleapis.com',
|
'reseller.googleapis.com',
|
||||||
|
'searchconsole.googleapis.com',
|
||||||
'sheets.googleapis.com',
|
'sheets.googleapis.com',
|
||||||
'siteverification.googleapis.com',
|
'siteverification.googleapis.com',
|
||||||
'storage-api.googleapis.com',
|
'storage-api.googleapis.com',
|
||||||
|
'tagmanager.googleapis.com',
|
||||||
'tasks.googleapis.com',
|
'tasks.googleapis.com',
|
||||||
'vault.googleapis.com',
|
'vault.googleapis.com',
|
||||||
'youtube.googleapis.com',
|
'youtube.googleapis.com',
|
||||||
@@ -202,11 +215,12 @@ PROJECT_APIS = [
|
|||||||
_INFO = {
|
_INFO = {
|
||||||
ACCESSCONTEXTMANAGER: {'name': 'Access Context Manager API', 'version': 'v1', 'v2discovery': True},
|
ACCESSCONTEXTMANAGER: {'name': 'Access Context Manager API', 'version': 'v1', 'v2discovery': True},
|
||||||
ALERTCENTER: {'name': 'AlertCenter API', 'version': 'v1beta1', 'v2discovery': True},
|
ALERTCENTER: {'name': 'AlertCenter API', 'version': 'v1beta1', 'v2discovery': True},
|
||||||
ANALYTICS: {'name': 'Analytics API', 'version': 'v3', 'v2discovery': False},
|
|
||||||
ANALYTICS_ADMIN: {'name': 'Analytics Admin API', 'version': 'v1beta', 'v2discovery': True},
|
ANALYTICS_ADMIN: {'name': 'Analytics Admin API', 'version': 'v1beta', 'v2discovery': True},
|
||||||
|
BUSINESSACCOUNTMANAGEMENT: {'name': 'Business Account Management API', 'version': 'v1', 'v2discovery': True},
|
||||||
CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
|
CALENDAR: {'name': 'Calendar API', 'version': 'v3', 'v2discovery': True, 'mappedAPI': 'calendar-json'},
|
||||||
CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
|
CBCM: {'name': 'Chrome Browser Cloud Management API', 'version': 'v1.1beta1', 'v2discovery': True, 'localjson': True},
|
||||||
CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True},
|
CHAT: {'name': 'Chat API', 'version': 'v1', 'v2discovery': True},
|
||||||
|
CHAT_CUSTOM_EMOJIS: {'name': 'Chat API - Custom Emojis', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
||||||
CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
CHAT_EVENTS: {'name': 'Chat API - Events', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
||||||
CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
CHAT_MEMBERSHIPS: {'name': 'Chat API - Memberships', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
||||||
CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Memberships Admin', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
CHAT_MEMBERSHIPS_ADMIN: {'name': 'Chat API - Memberships Admin', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHAT},
|
||||||
@@ -221,57 +235,60 @@ _INFO = {
|
|||||||
CHROMEMANAGEMENT_TELEMETRY: {'name': 'Chrome Management API - Telemetry', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHROMEMANAGEMENT},
|
CHROMEMANAGEMENT_TELEMETRY: {'name': 'Chrome Management API - Telemetry', 'version': 'v1', 'v2discovery': True, 'mappedAPI': CHROMEMANAGEMENT},
|
||||||
CHROMEPOLICY: {'name': 'Chrome Policy API', 'version': 'v1', 'v2discovery': True},
|
CHROMEPOLICY: {'name': 'Chrome Policy API', 'version': 'v1', 'v2discovery': True},
|
||||||
CHROMEVERSIONHISTORY: {'name': 'Chrome Version History API', 'version': 'v1', 'v2discovery': True},
|
CHROMEVERSIONHISTORY: {'name': 'Chrome Version History API', 'version': 'v1', 'v2discovery': True},
|
||||||
CLOUDCHANNEL: {'name': 'Channel Channel API', 'version': 'v1', 'v2discovery': True},
|
CLOUDCHANNEL: {'name': 'Cloud Channel API', 'version': 'v1', 'v2discovery': True},
|
||||||
CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity Devices API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_DEVICES: {'name': 'Cloud Identity API - Devices', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity Groups API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_GROUPS: {'name': 'Cloud Identity API - Groups', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity Inbound SSO API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_GROUPS_BETA: {'name': 'Cloud Identity API - Groups Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_INBOUND_SSO: {'name': 'Cloud Identity API - Inbound SSO Settings', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity OrgUnits API', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDIDENTITY_USERINVITATIONS: {'name': 'Cloud Identity User Invitations API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
|
CLOUDIDENTITY_POLICY: {'name': 'Cloud Identity API - Policy', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
|
CLOUDIDENTITY_USERINVITATIONS: {'name': 'Cloud Identity API - User Invitations', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||||
CLOUDRESOURCEMANAGER: {'name': 'Cloud Resource Manager API v3', 'version': 'v3', 'v2discovery': True},
|
CLOUDRESOURCEMANAGER: {'name': 'Cloud Resource Manager API v3', 'version': 'v3', 'v2discovery': True},
|
||||||
CONTACTS: {'name': 'Contacts API', 'version': 'v3', 'v2discovery': False},
|
CONTACTS: {'name': 'Contacts API', 'version': 'v3', 'v2discovery': False},
|
||||||
CONTACTDELEGATION: {'name': 'Contact Delegation API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
CONTACTDELEGATION: {'name': 'Contact Delegation API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
||||||
DATATRANSFER: {'name': 'Data Transfer API', 'version': 'datatransfer_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
DATATRANSFER: {'name': 'Data Transfer API', 'version': 'datatransfer_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
||||||
DIRECTORY: {'name': 'Directory API', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
DIRECTORY: {'name': 'Directory API', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
||||||
DIRECTORY_BETA: {'name': 'Directory API', 'version': 'directory_v1.1beta1', 'v2discovery': True, 'mappedAPI': 'admin', 'localjson': True},
|
|
||||||
DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
|
DOCS: {'name': 'Docs API', 'version': 'v1', 'v2discovery': True},
|
||||||
DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
|
DRIVE2: {'name': 'Drive API v2', 'version': 'v2', 'v2discovery': False, 'mappedAPI': 'drive'},
|
||||||
DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
|
DRIVE3: {'name': 'Drive API v3', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
|
||||||
DRIVETD: {'name': 'Drive API v3 - todrive', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
|
DRIVETD: {'name': 'Drive API v3 - todrive', 'version': 'v3', 'v2discovery': False, 'mappedAPI': 'drive'},
|
||||||
DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
|
DRIVEACTIVITY: {'name': 'Drive Activity API v2', 'version': 'v2', 'v2discovery': True},
|
||||||
DRIVELABELS_ADMIN: {'name': 'Drive Labels API v2beta - Admin', 'version': 'v2beta', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
|
DRIVELABELS_ADMIN: {'name': 'Drive Labels API - Admin', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
|
||||||
DRIVELABELS_USER: {'name': 'Drive Labels API v2beta - User', 'version': 'v2beta', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
|
DRIVELABELS_USER: {'name': 'Drive Labels API - User', 'version': 'v2', 'v2discovery': True, 'mappedAPI': DRIVELABELS},
|
||||||
EMAIL_AUDIT: {'name': 'Email Audit API', 'version': 'v1', 'v2discovery': False},
|
EMAIL_AUDIT: {'name': 'Email Audit API', 'version': 'v1', 'v2discovery': False},
|
||||||
FORMS: {'name': 'Forms API', 'version': 'v1', 'v2discovery': True},
|
FORMS: {'name': 'Forms API', 'version': 'v1', 'v2discovery': True},
|
||||||
GMAIL: {'name': 'Gmail API', 'version': 'v1', 'v2discovery': True},
|
GMAIL: {'name': 'Gmail API', 'version': 'v1', 'v2discovery': True},
|
||||||
GROUPSMIGRATION: {'name': 'Groups Migration API', 'version': 'v1', 'v2discovery': False},
|
GROUPSMIGRATION: {'name': 'Groups Migration API', 'version': 'v1', 'v2discovery': True},
|
||||||
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 Beta', '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},
|
||||||
PEOPLE_DIRECTORY: {'name': 'People Directory API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
|
PEOPLE_DIRECTORY: {'name': 'People Directory API', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
|
||||||
PEOPLE_OTHERCONTACTS: {'name': 'People API - Other Contacts', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
|
PEOPLE_OTHERCONTACTS: {'name': 'People API - Other Contacts', 'version': 'v1', 'v2discovery': True, 'mappedAPI': PEOPLE},
|
||||||
PRINTERS: {'name': 'Directory API Printers', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
PRINTERS: {'name': 'Directory API - Printers', 'version': 'directory_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
||||||
PUBSUB: {'name': 'Pub / Sub API', 'version': 'v1', 'v2discovery': True},
|
PUBSUB: {'name': 'Pub / Sub API', 'version': 'v1', 'v2discovery': True},
|
||||||
REPORTS: {'name': 'Reports API', 'version': 'reports_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
REPORTS: {'name': 'Reports API', 'version': 'reports_v1', 'v2discovery': True, 'mappedAPI': 'admin'},
|
||||||
RESELLER: {'name': 'Reseller API', 'version': 'v1', 'v2discovery': True},
|
RESELLER: {'name': 'Reseller API', 'version': 'v1', 'v2discovery': True},
|
||||||
|
SEARCHCONSOLE: {'name': 'Search Console API', 'version': 'v1', 'v2discovery': True},
|
||||||
SERVICEACCOUNTLOOKUP: {'name': 'Service Account Lookup pseudo-API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
SERVICEACCOUNTLOOKUP: {'name': 'Service Account Lookup pseudo-API', 'version': 'v1', 'v2discovery': True, 'localjson': True},
|
||||||
SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
|
SERVICEMANAGEMENT: {'name': 'Service Management API', 'version': 'v1', 'v2discovery': True},
|
||||||
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},
|
||||||
STORAGEWRITE: {'name': 'Cloud Storage API - Write', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
|
STORAGEWRITE: {'name': 'Cloud Storage API - Write', 'version': 'v1', 'v2discovery': True, 'mappedAPI': STORAGE},
|
||||||
|
TAGMANAGER: {'name': 'Tag Manager API - Accounts, Containers, Workspaces, Tags', 'version': 'v2', 'v2discovery': True},
|
||||||
|
TAGMANAGER_USERS: {'name': 'Tag Manager API - Users', 'version': 'v2', 'v2discovery': True, 'mappedAPI': TAGMANAGER},
|
||||||
TASKS: {'name': 'Tasks API', 'version': 'v1', 'v2discovery': True},
|
TASKS: {'name': 'Tasks API', 'version': 'v1', 'v2discovery': True},
|
||||||
VAULT: {'name': 'Vault API', 'version': 'v1', 'v2discovery': True},
|
VAULT: {'name': 'Vault API', 'version': 'v1', 'v2discovery': True},
|
||||||
YOUTUBE: {'name': 'Youtube API', 'version': 'v3', 'v2discovery': True},
|
YOUTUBE: {'name': 'Youtube API', 'version': 'v3', 'v2discovery': True},
|
||||||
@@ -280,6 +297,11 @@ _INFO = {
|
|||||||
READONLY = ['readonly',]
|
READONLY = ['readonly',]
|
||||||
|
|
||||||
_CLIENT_SCOPES = [
|
_CLIENT_SCOPES = [
|
||||||
|
{'name': 'Business Account Management API',
|
||||||
|
'api': BUSINESSACCOUNTMANAGEMENT,
|
||||||
|
'subscopes': [],
|
||||||
|
'offByDefault': True,
|
||||||
|
'scope': BUSINESSACCOUNTMANAGEMENT_SCOPE},
|
||||||
{'name': 'Calendar API',
|
{'name': 'Calendar API',
|
||||||
'api': CALENDAR,
|
'api': CALENDAR,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -296,6 +318,10 @@ _CLIENT_SCOPES = [
|
|||||||
'api': CHROMEMANAGEMENT_APPDETAILS,
|
'api': CHROMEMANAGEMENT_APPDETAILS,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/chrome.management.appdetails.readonly'},
|
'scope': 'https://www.googleapis.com/auth/chrome.management.appdetails.readonly'},
|
||||||
|
{'name': 'Chrome Management API - Profiles',
|
||||||
|
'api': CHROMEMANAGEMENT_CHROMEPROFILES,
|
||||||
|
'subscopes': READONLY,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/chrome.management.profiles'},
|
||||||
{'name': 'Chrome Management API - Telemetry read only',
|
{'name': 'Chrome Management API - Telemetry read only',
|
||||||
'api': CHROMEMANAGEMENT_TELEMETRY,
|
'api': CHROMEMANAGEMENT_TELEMETRY,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
@@ -353,19 +379,29 @@ _CLIENT_SCOPES = [
|
|||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'offByDefault': True,
|
'offByDefault': True,
|
||||||
'scope': 'https://www.googleapis.com/auth/apps.order'},
|
'scope': 'https://www.googleapis.com/auth/apps.order'},
|
||||||
{'name': 'Cloud Identity Groups API',
|
{'name': 'Cloud Identity API - Groups',
|
||||||
'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 - Inbound SSO Settings',
|
{'name': 'Cloud Identity API - Groups Beta (Enables group locking/unlocking)',
|
||||||
|
'api': CLOUDIDENTITY_GROUPS_BETA,
|
||||||
|
'subscopes': [],
|
||||||
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.groups'},
|
||||||
|
{'name': 'Cloud Identity API - Inbound SSO Settings',
|
||||||
'api': CLOUDIDENTITY_INBOUND_SSO,
|
'api': CLOUDIDENTITY_INBOUND_SSO,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.inboundsso'},
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.inboundsso'},
|
||||||
{'name': 'Cloud Identity OrgUnits API',
|
{'name': 'Cloud Identity API - OrgUnits Beta',
|
||||||
'api': CLOUDIDENTITY_ORGUNITS_BETA,
|
'api': CLOUDIDENTITY_ORGUNITS_BETA,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.orgunits'},
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.orgunits'},
|
||||||
{'name': 'Cloud Identity User Invitations API',
|
{'name': 'Cloud Identity API - Policy',
|
||||||
|
'api': CLOUDIDENTITY_POLICY,
|
||||||
|
'subscopes': READONLY,
|
||||||
|
'roByDefault': True,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'
|
||||||
|
},
|
||||||
|
{'name': 'Cloud Identity API - User Invitations',
|
||||||
'api': CLOUDIDENTITY_USERINVITATIONS,
|
'api': CLOUDIDENTITY_USERINVITATIONS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.userinvitations'},
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.userinvitations'},
|
||||||
@@ -485,12 +521,8 @@ _CLIENT_SCOPES = [
|
|||||||
{'name': 'Site Verification API',
|
{'name': 'Site Verification API',
|
||||||
'api': SITEVERIFICATION,
|
'api': SITEVERIFICATION,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
|
||||||
{'name': 'Sites API',
|
|
||||||
'api': SITES,
|
|
||||||
'subscopes': [],
|
|
||||||
'offByDefault': True,
|
'offByDefault': True,
|
||||||
'scope': 'https://sites.google.com/feeds'},
|
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
||||||
{'name': 'Vault API',
|
{'name': 'Vault API',
|
||||||
'api': VAULT,
|
'api': VAULT,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -523,10 +555,6 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': ALERTCENTER,
|
'api': ALERTCENTER,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/apps.alerts'},
|
'scope': 'https://www.googleapis.com/auth/apps.alerts'},
|
||||||
{'name': 'Analytics API - read only',
|
|
||||||
'api': ANALYTICS,
|
|
||||||
'subscopes': [],
|
|
||||||
'scope': 'https://www.googleapis.com/auth/analytics.readonly'},
|
|
||||||
{'name': 'Analytics Admin API - read only',
|
{'name': 'Analytics Admin API - read only',
|
||||||
'api': ANALYTICS_ADMIN,
|
'api': ANALYTICS_ADMIN,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
@@ -535,6 +563,10 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': CALENDAR,
|
'api': CALENDAR,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/calendar'},
|
'scope': 'https://www.googleapis.com/auth/calendar'},
|
||||||
|
{'name': 'Chat API - Custom Emojis',
|
||||||
|
'api': CHAT_CUSTOM_EMOJIS,
|
||||||
|
'subscopes': READONLY,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/chat.customemojis'},
|
||||||
{'name': 'Chat API - Memberships',
|
{'name': 'Chat API - Memberships',
|
||||||
'api': CHAT_MEMBERSHIPS,
|
'api': CHAT_MEMBERSHIPS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -594,7 +626,7 @@ _SVCACCT_SCOPES = [
|
|||||||
{'name': 'Cloud Identity Devices API',
|
{'name': 'Cloud Identity Devices API',
|
||||||
'api': CLOUDIDENTITY_DEVICES,
|
'api': CLOUDIDENTITY_DEVICES,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/cloud-identity'},
|
'scope': 'https://www.googleapis.com/auth/cloud-identity.devices'},
|
||||||
# {'name': 'Cloud Identity User Invitations API',
|
# {'name': 'Cloud Identity User Invitations API',
|
||||||
# 'api': CLOUDIDENTITY_USERINVITATIONS,
|
# 'api': CLOUDIDENTITY_USERINVITATIONS,
|
||||||
# 'subscopes': READONLY,
|
# 'subscopes': READONLY,
|
||||||
@@ -611,11 +643,11 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': DRIVEACTIVITY,
|
'api': DRIVEACTIVITY,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/drive.activity'},
|
'scope': 'https://www.googleapis.com/auth/drive.activity'},
|
||||||
{'name': 'Drive Labels API v2beta - Admin',
|
{'name': 'Drive Labels API - Admin',
|
||||||
'api': DRIVELABELS_ADMIN,
|
'api': DRIVELABELS_ADMIN,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/drive.admin.labels'},
|
'scope': 'https://www.googleapis.com/auth/drive.admin.labels'},
|
||||||
{'name': 'Drive Labels API v2beta - User',
|
{'name': 'Drive Labels API - User',
|
||||||
'api': DRIVELABELS_USER,
|
'api': DRIVELABELS_USER,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/drive.labels'},
|
'scope': 'https://www.googleapis.com/auth/drive.labels'},
|
||||||
@@ -635,7 +667,7 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': GMAIL,
|
'api': GMAIL,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/gmail.modify'},
|
'scope': 'https://www.googleapis.com/auth/gmail.modify'},
|
||||||
{'name': 'Gmail API - Basic Settings (Filters,IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read',
|
{'name': 'Gmail API - Basic Settings (Filters, IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read',
|
||||||
'api': GMAIL,
|
'api': GMAIL,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/gmail.settings.basic'},
|
'scope': 'https://www.googleapis.com/auth/gmail.settings.basic'},
|
||||||
@@ -643,10 +675,11 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': GMAIL,
|
'api': GMAIL,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/gmail.settings.sharing'},
|
'scope': 'https://www.googleapis.com/auth/gmail.settings.sharing'},
|
||||||
{'name': 'Identity and Access Management API',
|
# {'name': 'Identity and Access Management API',
|
||||||
'api': IAM,
|
# 'api': IAM,
|
||||||
'subscopes': [],
|
# 'offByDefault': True,
|
||||||
'scope': CLOUD_PLATFORM_SCOPE},
|
# 'subscopes': [],
|
||||||
|
# 'scope': CLOUD_PLATFORM_SCOPE},
|
||||||
{'name': 'Keep API',
|
{'name': 'Keep API',
|
||||||
'api': KEEP,
|
'api': KEEP,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -658,7 +691,8 @@ _SVCACCT_SCOPES = [
|
|||||||
{'name': 'Meet API',
|
{'name': 'Meet API',
|
||||||
'api': MEET,
|
'api': MEET,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
'scope': 'https://www.googleapis.com/auth/meetings.space.created'},
|
'scope': 'https://www.googleapis.com/auth/meetings.space.created',
|
||||||
|
'roscope': 'https://www.googleapis.com/auth/meetings.space.readonly'},
|
||||||
{'name': 'OAuth2 API',
|
{'name': 'OAuth2 API',
|
||||||
'api': OAUTH2,
|
'api': OAUTH2,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
@@ -675,14 +709,30 @@ _SVCACCT_SCOPES = [
|
|||||||
'api': PEOPLE_OTHERCONTACTS,
|
'api': PEOPLE_OTHERCONTACTS,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://www.googleapis.com/auth/contacts.other.readonly'},
|
'scope': 'https://www.googleapis.com/auth/contacts.other.readonly'},
|
||||||
|
{'name': 'Search Console API - read only',
|
||||||
|
'api': SEARCHCONSOLE,
|
||||||
|
'subscopes': [],
|
||||||
|
'offByDefault': True,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/webmasters.readonly'},
|
||||||
{'name': 'Sheets API',
|
{'name': 'Sheets API',
|
||||||
'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',
|
{'name': 'Site Verification API',
|
||||||
'api': SITES,
|
'api': SITEVERIFICATION,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
'scope': 'https://sites.google.com/feeds'},
|
'offByDefault': True,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/siteverification'},
|
||||||
|
{'name': 'Tag Manager API - Accounts, Containers, Workspaces, Tags - read only',
|
||||||
|
'api': TAGMANAGER,
|
||||||
|
'subscopes': [],
|
||||||
|
'offByDefault': True,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/tagmanager.readonly'},
|
||||||
|
{'name': 'Tag Manager API - Users',
|
||||||
|
'api': TAGMANAGER_USERS,
|
||||||
|
'subscopes': [],
|
||||||
|
'offByDefault': True,
|
||||||
|
'scope': 'https://www.googleapis.com/auth/tagmanager.manage.users'},
|
||||||
{'name': 'Tasks API',
|
{'name': 'Tasks API',
|
||||||
'api': TASKS,
|
'api': TASKS,
|
||||||
'subscopes': READONLY,
|
'subscopes': READONLY,
|
||||||
@@ -695,10 +745,6 @@ _SVCACCT_SCOPES = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
_SVCACCT_SPECIAL_SCOPES = [
|
_SVCACCT_SPECIAL_SCOPES = [
|
||||||
{'name': 'Cloud Resource Manager API v3',
|
|
||||||
'api': CLOUDRESOURCEMANAGER,
|
|
||||||
'subscopes': [],
|
|
||||||
'scope': CLOUD_PLATFORM_SCOPE},
|
|
||||||
{'name': 'Drive API - todrive',
|
{'name': 'Drive API - todrive',
|
||||||
'api': DRIVETD,
|
'api': DRIVETD,
|
||||||
'subscopes': [],
|
'subscopes': [],
|
||||||
@@ -726,56 +772,6 @@ _USER_SVCACCT_ONLY_SCOPES = [
|
|||||||
'scope': 'https://www.googleapis.com/auth/apps.groups.migration'},
|
'scope': 'https://www.googleapis.com/auth/apps.groups.migration'},
|
||||||
]
|
]
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_ABOUT_FIELDS_MAP = {
|
|
||||||
'displayName': 'name',
|
|
||||||
'limit': 'quotaBytesTotal',
|
|
||||||
'usage': 'quotaBytesUsedAggregate',
|
|
||||||
'usageInDrive': 'quotaBytesUsed',
|
|
||||||
'usageInDriveTrash': 'quotaBytesUsedInTrash',
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_CAPABILITIES_FIELDS_MAP = {
|
|
||||||
'canComment': 'canComment',
|
|
||||||
'canReadRevisions': 'canReadRevisions',
|
|
||||||
'canCopy': 'copyable',
|
|
||||||
'canEdit': 'editable',
|
|
||||||
'canShare': 'shareable',
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_CAPABILITIES_NAMES_MAP = {
|
|
||||||
'canChangeViewersCanCopyContent': 'canChangeRestrictedDownload',
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_FILES_FIELDS_MAP = {
|
|
||||||
'allowFileDiscovery': 'withLink',
|
|
||||||
'createdTime': 'createdDate',
|
|
||||||
'expirationTime': 'expirationDate',
|
|
||||||
'modifiedByMe': 'modified',
|
|
||||||
'modifiedByMeTime': 'modifiedByMeDate',
|
|
||||||
'modifiedTime': 'modifiedDate',
|
|
||||||
'name': 'title',
|
|
||||||
'restrictionTime': 'restrictionDate',
|
|
||||||
'sharedWithMeTime': 'sharedWithMeDate',
|
|
||||||
'size': 'fileSize',
|
|
||||||
'trashedTime': 'trashedDate',
|
|
||||||
'viewedByMe': 'viewed',
|
|
||||||
'viewedByMeTime': 'lastViewedByMeDate',
|
|
||||||
'webViewLink': 'alternateLink',
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_LABELS_MAP = {
|
|
||||||
'modifiedByMe': 'modified',
|
|
||||||
'starred': 'starred',
|
|
||||||
'trashed': 'trashed',
|
|
||||||
'viewedByMe': 'viewed',
|
|
||||||
}
|
|
||||||
|
|
||||||
DRIVE3_TO_DRIVE2_REVISIONS_FIELDS_MAP = {
|
|
||||||
'modifiedTime': 'modifiedDate',
|
|
||||||
'keepForever': 'pinned',
|
|
||||||
'size': 'fileSize',
|
|
||||||
}
|
|
||||||
|
|
||||||
def getAPIName(api):
|
def getAPIName(api):
|
||||||
return _INFO[api]['name']
|
return _INFO[api]['name']
|
||||||
|
|
||||||
@@ -824,3 +820,27 @@ def getSvcAcctScopesList(userServiceAccountAccessOnly, svcAcctSpecialScopes):
|
|||||||
|
|
||||||
def hasLocalJSON(api):
|
def hasLocalJSON(api):
|
||||||
return _INFO[api].get('localjson', False)
|
return _INFO[api].get('localjson', False)
|
||||||
|
|
||||||
|
def findAPIforScope(scopesList):
|
||||||
|
def checkScopeMatch(scope, cscope):
|
||||||
|
if cscope['scope'] == scope:
|
||||||
|
requiredAPIs.append(cscope['name'])
|
||||||
|
return True
|
||||||
|
if cscope['subscopes'] == READONLY and cscope['scope']+'.readonly' == scope:
|
||||||
|
requiredAPIs.append(cscope['name']+' (supports readonly)')
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
requiredAPIs = []
|
||||||
|
for scope in scopesList:
|
||||||
|
for cscope in _CLIENT_SCOPES:
|
||||||
|
if checkScopeMatch(scope, cscope):
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
for cscope in _SVCACCT_SCOPES:
|
||||||
|
if checkScopeMatch(scope, cscope):
|
||||||
|
break
|
||||||
|
if not requiredAPIs:
|
||||||
|
requiredAPIs = scopesList
|
||||||
|
return ' or '.join(requiredAPIs)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -117,6 +117,8 @@ CSV_OUTPUT_HEADER_FILTER = 'csv_output_header_filter'
|
|||||||
CSV_OUTPUT_HEADER_DROP_FILTER = 'csv_output_header_drop_filter'
|
CSV_OUTPUT_HEADER_DROP_FILTER = 'csv_output_header_drop_filter'
|
||||||
# Force output column headers
|
# Force output column headers
|
||||||
CSV_OUTPUT_HEADER_FORCE = 'csv_output_header_force'
|
CSV_OUTPUT_HEADER_FORCE = 'csv_output_header_force'
|
||||||
|
# Orde output column headers
|
||||||
|
CSV_OUTPUT_HEADER_ORDER = 'csv_output_header_order'
|
||||||
# Line terminator in CSV output file
|
# Line terminator in CSV output file
|
||||||
CSV_OUTPUT_LINE_TERMINATOR = 'csv_output_line_terminator'
|
CSV_OUTPUT_LINE_TERMINATOR = 'csv_output_line_terminator'
|
||||||
# Quote character in CSV output file
|
# Quote character in CSV output file
|
||||||
@@ -153,14 +155,14 @@ DRIVE_DIR = 'drive_dir'
|
|||||||
DRIVE_MAX_RESULTS = 'drive_max_results'
|
DRIVE_MAX_RESULTS = 'drive_max_results'
|
||||||
# Use Drive V3 beta
|
# Use Drive V3 beta
|
||||||
DRIVE_V3_BETA = 'drive_v3_beta'
|
DRIVE_V3_BETA = 'drive_v3_beta'
|
||||||
# Use Drive V3 ntive names
|
|
||||||
DRIVE_V3_NATIVE_NAMES = 'drive_v3_native_names'
|
|
||||||
# When processing email messages in batches, how many should be processed in each batch
|
# When processing email messages in batches, how many should be processed in each batch
|
||||||
EMAIL_BATCH_SIZE = 'email_batch_size'
|
EMAIL_BATCH_SIZE = 'email_batch_size'
|
||||||
# Enable Delegated Admin Service Account
|
# Enable Delegated Admin Service Account
|
||||||
ENABLE_DASA = 'enable_dasa'
|
ENABLE_DASA = 'enable_dasa'
|
||||||
# Enable Cloud Session Reauthentication by borrowing a RAPT token from gcloud command
|
# Enable Cloud Session Reauthentication by borrowing a RAPT token from gcloud command
|
||||||
ENABLE_GCLOUD_REAUTH = 'enable_gcloud_reauth'
|
ENABLE_GCLOUD_REAUTH = 'enable_gcloud_reauth'
|
||||||
|
# Value for enforceExpansiveAccess for commands that delete or update drive file ACLs/permissions.
|
||||||
|
ENFORCE_EXPANSIVE_ACCESS = 'enforce_expansive_access'
|
||||||
# When retrieving lists of calendar events from API, how many should be retrieved in each chunk
|
# When retrieving lists of calendar events from API, how many should be retrieved in each chunk
|
||||||
EVENT_MAX_RESULTS = 'event_max_results'
|
EVENT_MAX_RESULTS = 'event_max_results'
|
||||||
# Path to extra_args.txt
|
# Path to extra_args.txt
|
||||||
@@ -175,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
|
||||||
@@ -252,12 +260,12 @@ SMTP_HOST = 'smtp_host'
|
|||||||
SMTP_USERNAME = 'smtp_username'
|
SMTP_USERNAME = 'smtp_username'
|
||||||
# SMTP password
|
# SMTP password
|
||||||
SMTP_PASSWORD = 'smtp_password'
|
SMTP_PASSWORD = 'smtp_password'
|
||||||
|
# Time Zone
|
||||||
|
TIMEZONE = 'timezone'
|
||||||
## Minimum TLS Version required for HTTPS connections
|
## Minimum TLS Version required for HTTPS connections
|
||||||
TLS_MIN_VERSION = 'tls_min_version'
|
TLS_MIN_VERSION = 'tls_min_version'
|
||||||
## Maximum TLS Version used for HTTPS connections
|
## Maximum TLS Version used for HTTPS connections
|
||||||
TLS_MAX_VERSION = 'tls_max_version'
|
TLS_MAX_VERSION = 'tls_max_version'
|
||||||
# Time Zone
|
|
||||||
TIMEZONE = 'timezone'
|
|
||||||
# Clear basic filter when updating an existing sheet
|
# Clear basic filter when updating an existing sheet
|
||||||
TODRIVE_CLEARFILTER = 'todrive_clearfilter'
|
TODRIVE_CLEARFILTER = 'todrive_clearfilter'
|
||||||
# Use client access for todrive
|
# Use client access for todrive
|
||||||
@@ -309,7 +317,8 @@ CSV_INPUT_ROW_FILTER_ITEMS = {CSV_INPUT_ROW_FILTER, CSV_INPUT_ROW_FILTER_MODE,
|
|||||||
CSV_INPUT_ROW_DROP_FILTER, CSV_INPUT_ROW_DROP_FILTER_MODE,
|
CSV_INPUT_ROW_DROP_FILTER, CSV_INPUT_ROW_DROP_FILTER_MODE,
|
||||||
CSV_INPUT_ROW_LIMIT}
|
CSV_INPUT_ROW_LIMIT}
|
||||||
|
|
||||||
CSV_OUTPUT_ROW_FILTER_ITEMS = {CSV_OUTPUT_HEADER_FILTER, CSV_OUTPUT_HEADER_DROP_FILTER, CSV_OUTPUT_HEADER_FORCE,
|
CSV_OUTPUT_ROW_FILTER_ITEMS = {CSV_OUTPUT_HEADER_FILTER, CSV_OUTPUT_HEADER_DROP_FILTER,
|
||||||
|
CSV_OUTPUT_HEADER_FORCE, CSV_OUTPUT_HEADER_ORDER,
|
||||||
CSV_OUTPUT_ROW_FILTER, CSV_OUTPUT_ROW_FILTER_MODE,
|
CSV_OUTPUT_ROW_FILTER, CSV_OUTPUT_ROW_FILTER_MODE,
|
||||||
CSV_OUTPUT_ROW_DROP_FILTER, CSV_OUTPUT_ROW_DROP_FILTER_MODE,
|
CSV_OUTPUT_ROW_DROP_FILTER, CSV_OUTPUT_ROW_DROP_FILTER_MODE,
|
||||||
CSV_OUTPUT_ROW_LIMIT}
|
CSV_OUTPUT_ROW_LIMIT}
|
||||||
@@ -351,6 +360,7 @@ Defaults = {
|
|||||||
CSV_OUTPUT_HEADER_FILTER: '',
|
CSV_OUTPUT_HEADER_FILTER: '',
|
||||||
CSV_OUTPUT_HEADER_DROP_FILTER: '',
|
CSV_OUTPUT_HEADER_DROP_FILTER: '',
|
||||||
CSV_OUTPUT_HEADER_FORCE: '',
|
CSV_OUTPUT_HEADER_FORCE: '',
|
||||||
|
CSV_OUTPUT_HEADER_ORDER: '',
|
||||||
CSV_OUTPUT_LINE_TERMINATOR: 'lf',
|
CSV_OUTPUT_LINE_TERMINATOR: 'lf',
|
||||||
CSV_OUTPUT_QUOTE_CHAR: '\'"\'',
|
CSV_OUTPUT_QUOTE_CHAR: '\'"\'',
|
||||||
CSV_OUTPUT_ROW_FILTER: '',
|
CSV_OUTPUT_ROW_FILTER: '',
|
||||||
@@ -367,9 +377,9 @@ Defaults = {
|
|||||||
DEVICE_MAX_RESULTS: '200',
|
DEVICE_MAX_RESULTS: '200',
|
||||||
DOMAIN: '',
|
DOMAIN: '',
|
||||||
DRIVE_DIR: '',
|
DRIVE_DIR: '',
|
||||||
|
ENFORCE_EXPANSIVE_ACCESS: TRUE,
|
||||||
DRIVE_MAX_RESULTS: '1000',
|
DRIVE_MAX_RESULTS: '1000',
|
||||||
DRIVE_V3_BETA: FALSE,
|
DRIVE_V3_BETA: FALSE,
|
||||||
DRIVE_V3_NATIVE_NAMES: TRUE,
|
|
||||||
EMAIL_BATCH_SIZE: '50',
|
EMAIL_BATCH_SIZE: '50',
|
||||||
ENABLE_DASA: FALSE,
|
ENABLE_DASA: FALSE,
|
||||||
ENABLE_GCLOUD_REAUTH: FALSE,
|
ENABLE_GCLOUD_REAUTH: FALSE,
|
||||||
@@ -380,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',
|
||||||
@@ -418,9 +431,9 @@ Defaults = {
|
|||||||
SMTP_HOST: '',
|
SMTP_HOST: '',
|
||||||
SMTP_USERNAME: '',
|
SMTP_USERNAME: '',
|
||||||
SMTP_PASSWORD: '',
|
SMTP_PASSWORD: '',
|
||||||
|
TIMEZONE: 'utc',
|
||||||
TLS_MIN_VERSION: 'TLSv1_3',
|
TLS_MIN_VERSION: 'TLSv1_3',
|
||||||
TLS_MAX_VERSION: '',
|
TLS_MAX_VERSION: '',
|
||||||
TIMEZONE: 'utc',
|
|
||||||
TODRIVE_CLEARFILTER: FALSE,
|
TODRIVE_CLEARFILTER: FALSE,
|
||||||
TODRIVE_CLIENTACCESS: FALSE,
|
TODRIVE_CLIENTACCESS: FALSE,
|
||||||
TODRIVE_CONVERSION: TRUE,
|
TODRIVE_CONVERSION: TRUE,
|
||||||
@@ -460,6 +473,7 @@ TYPE_FILE = 'file'
|
|||||||
TYPE_FLOAT = 'floa'
|
TYPE_FLOAT = 'floa'
|
||||||
TYPE_HEADERFILTER = 'heaf'
|
TYPE_HEADERFILTER = 'heaf'
|
||||||
TYPE_HEADERFORCE = 'hefo'
|
TYPE_HEADERFORCE = 'hefo'
|
||||||
|
TYPE_HEADERORDER = 'heor'
|
||||||
TYPE_INTEGER = 'inte'
|
TYPE_INTEGER = 'inte'
|
||||||
TYPE_LANGUAGE = 'lang'
|
TYPE_LANGUAGE = 'lang'
|
||||||
TYPE_LOCALE = 'locl'
|
TYPE_LOCALE = 'locl'
|
||||||
@@ -514,6 +528,7 @@ VAR_INFO = {
|
|||||||
CSV_OUTPUT_HEADER_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
|
CSV_OUTPUT_HEADER_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
|
||||||
CSV_OUTPUT_HEADER_DROP_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
|
CSV_OUTPUT_HEADER_DROP_FILTER: {VAR_TYPE: TYPE_HEADERFILTER},
|
||||||
CSV_OUTPUT_HEADER_FORCE: {VAR_TYPE: TYPE_HEADERFORCE},
|
CSV_OUTPUT_HEADER_FORCE: {VAR_TYPE: TYPE_HEADERFORCE},
|
||||||
|
CSV_OUTPUT_HEADER_ORDER: {VAR_TYPE: TYPE_HEADERORDER},
|
||||||
CSV_OUTPUT_LINE_TERMINATOR: {VAR_TYPE: TYPE_CHOICE, VAR_CHOICES: {'cr': '\r', 'lf': '\n', 'crlf': '\r\n'}},
|
CSV_OUTPUT_LINE_TERMINATOR: {VAR_TYPE: TYPE_CHOICE, VAR_CHOICES: {'cr': '\r', 'lf': '\n', 'crlf': '\r\n'}},
|
||||||
CSV_OUTPUT_QUOTE_CHAR: {VAR_TYPE: TYPE_CHARACTER},
|
CSV_OUTPUT_QUOTE_CHAR: {VAR_TYPE: TYPE_CHARACTER},
|
||||||
CSV_OUTPUT_ROW_FILTER: {VAR_TYPE: TYPE_ROWFILTER},
|
CSV_OUTPUT_ROW_FILTER: {VAR_TYPE: TYPE_ROWFILTER},
|
||||||
@@ -530,9 +545,9 @@ VAR_INFO = {
|
|||||||
DEVICE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
|
DEVICE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 200)},
|
||||||
DOMAIN: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'GA_DOMAIN', VAR_LIMITS: (0, None)},
|
DOMAIN: {VAR_TYPE: TYPE_STRING, VAR_ENVVAR: 'GA_DOMAIN', VAR_LIMITS: (0, None)},
|
||||||
DRIVE_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMDRIVEDIR'},
|
DRIVE_DIR: {VAR_TYPE: TYPE_DIRECTORY, VAR_ENVVAR: 'GAMDRIVEDIR'},
|
||||||
|
ENFORCE_EXPANSIVE_ACCESS: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
DRIVE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
|
DRIVE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 1000)},
|
||||||
DRIVE_V3_BETA: {VAR_TYPE: TYPE_BOOLEAN},
|
DRIVE_V3_BETA: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
DRIVE_V3_NATIVE_NAMES: {VAR_TYPE: TYPE_BOOLEAN},
|
|
||||||
EMAIL_BATCH_SIZE: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 100)},
|
EMAIL_BATCH_SIZE: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (1, 100)},
|
||||||
ENABLE_DASA: {VAR_TYPE: TYPE_BOOLEAN, VAR_SIGFILE: 'enabledasa.txt', VAR_SFFT: (FALSE, TRUE)},
|
ENABLE_DASA: {VAR_TYPE: TYPE_BOOLEAN, VAR_SIGFILE: 'enabledasa.txt', VAR_SFFT: (FALSE, TRUE)},
|
||||||
ENABLE_GCLOUD_REAUTH: {VAR_TYPE: TYPE_BOOLEAN},
|
ENABLE_GCLOUD_REAUTH: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
@@ -543,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)},
|
||||||
@@ -581,9 +599,9 @@ VAR_INFO = {
|
|||||||
SMTP_HOST: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
SMTP_HOST: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||||
SMTP_USERNAME: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
SMTP_USERNAME: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||||
SMTP_PASSWORD: {VAR_TYPE: TYPE_PASSWORD, VAR_LIMITS: (0, None)},
|
SMTP_PASSWORD: {VAR_TYPE: TYPE_PASSWORD, VAR_LIMITS: (0, None)},
|
||||||
|
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
||||||
TLS_MIN_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MIN_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
TLS_MIN_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MIN_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
||||||
TLS_MAX_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MAX_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
TLS_MAX_VERSION: {VAR_TYPE: TYPE_CHOICE, VAR_ENVVAR: 'GAM_TLS_MAX_VERSION', VAR_CHOICES: TLS_CHOICE_MAP},
|
||||||
TIMEZONE: {VAR_TYPE: TYPE_TIMEZONE},
|
|
||||||
TODRIVE_CLEARFILTER: {VAR_TYPE: TYPE_BOOLEAN},
|
TODRIVE_CLEARFILTER: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
TODRIVE_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
|
TODRIVE_CLIENTACCESS: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
TODRIVE_CONVERSION: {VAR_TYPE: TYPE_BOOLEAN},
|
TODRIVE_CONVERSION: {VAR_TYPE: TYPE_BOOLEAN},
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -423,8 +423,6 @@ class GamCLArgs():
|
|||||||
ARG_ANALYTICDATASTREAMS = 'analyticdatastreams'
|
ARG_ANALYTICDATASTREAMS = 'analyticdatastreams'
|
||||||
ARG_ANALYTICPROPERTY = 'analyticproperty'
|
ARG_ANALYTICPROPERTY = 'analyticproperty'
|
||||||
ARG_ANALYTICPROPERTIES = 'analyticproperties'
|
ARG_ANALYTICPROPERTIES = 'analyticproperties'
|
||||||
ARG_ANALYTICUAPROPERTY = 'analyticuaproperty'
|
|
||||||
ARG_ANALYTICUAPROPERTIES = 'analyticuaproperties'
|
|
||||||
ARG_API = 'api'
|
ARG_API = 'api'
|
||||||
ARG_APIS = 'apis'
|
ARG_APIS = 'apis'
|
||||||
ARG_APIPROJECT = 'apiproject'
|
ARG_APIPROJECT = 'apiproject'
|
||||||
@@ -443,6 +441,8 @@ class GamCLArgs():
|
|||||||
ARG_BUCKETS = 'buckets'
|
ARG_BUCKETS = 'buckets'
|
||||||
ARG_BUILDING = 'building'
|
ARG_BUILDING = 'building'
|
||||||
ARG_BUILDINGS = 'buildings'
|
ARG_BUILDINGS = 'buildings'
|
||||||
|
ARG_BUSINESSPROFILEACCOUNT = 'businessprofileaccount'
|
||||||
|
ARG_BUSINESSPROFILEACCOUNTS = 'businessprofileaccounts'
|
||||||
ARG_CAALEVEL = 'caalevel'
|
ARG_CAALEVEL = 'caalevel'
|
||||||
ARG_CAALEVELS = 'caalevels'
|
ARG_CAALEVELS = 'caalevels'
|
||||||
ARG_CALATTENDEES = 'calattendees'
|
ARG_CALATTENDEES = 'calattendees'
|
||||||
@@ -463,6 +463,8 @@ class GamCLArgs():
|
|||||||
ARG_CHANNELSKU = 'channelsku'
|
ARG_CHANNELSKU = 'channelsku'
|
||||||
ARG_CHANNELSKUS = 'channelskus'
|
ARG_CHANNELSKUS = 'channelskus'
|
||||||
ARG_CHAT = 'chat'
|
ARG_CHAT = 'chat'
|
||||||
|
ARG_CHATEMOJI = 'chatemoji'
|
||||||
|
ARG_CHATEMOJIS = 'chatemojis'
|
||||||
ARG_CHATEVENT = 'chatevent'
|
ARG_CHATEVENT = 'chatevent'
|
||||||
ARG_CHATEVENTS = 'chatevents'
|
ARG_CHATEVENTS = 'chatevents'
|
||||||
ARG_CHATMEMBER = 'chatmember'
|
ARG_CHATMEMBER = 'chatmember'
|
||||||
@@ -483,6 +485,10 @@ class GamCLArgs():
|
|||||||
ARG_CHROMEPOLICYIMAGE = 'chromepolicyimage'
|
ARG_CHROMEPOLICYIMAGE = 'chromepolicyimage'
|
||||||
ARG_CHROMEPOLICY = 'chromepolicy'
|
ARG_CHROMEPOLICY = 'chromepolicy'
|
||||||
ARG_CHROMEPOLICIES = 'chromepolicies'
|
ARG_CHROMEPOLICIES = 'chromepolicies'
|
||||||
|
ARG_CHROMEPROFILE = 'chromeprofile'
|
||||||
|
ARG_CHROMEPROFILES = 'chromeprofiles'
|
||||||
|
ARG_CHROMEPROFILECOMMAND = 'chromeprofilecommand'
|
||||||
|
ARG_CHROMEPROFILECOMMANDS = 'chromeprofilecommands'
|
||||||
ARG_CHROMESCHEMA = 'chromeschema'
|
ARG_CHROMESCHEMA = 'chromeschema'
|
||||||
ARG_CHROMESCHEMAS = 'chromeschemas'
|
ARG_CHROMESCHEMAS = 'chromeschemas'
|
||||||
ARG_CHROMESNVALIDITY = 'chromesnvalidity'
|
ARG_CHROMESNVALIDITY = 'chromesnvalidity'
|
||||||
@@ -493,6 +499,12 @@ class GamCLArgs():
|
|||||||
ARG_CIGROUPSMEMBERS = 'cigroupsmembers'
|
ARG_CIGROUPSMEMBERS = 'cigroupsmembers'
|
||||||
ARG_CIMEMBER = 'cimember'
|
ARG_CIMEMBER = 'cimember'
|
||||||
ARG_CIMEMBERS = 'cimembers'
|
ARG_CIMEMBERS = 'cimembers'
|
||||||
|
ARG_CIPOLICY = 'policy'
|
||||||
|
ARG_CIPOLICIES = 'policies'
|
||||||
|
ARG_CLASSIFICATIONLABEL = 'classificationlabel'
|
||||||
|
ARG_CLASSIFICATIONLABELS = 'classificationlabels'
|
||||||
|
ARG_CLASSIFICATIONLABELPERMISSION = 'classificationlabelpermission'
|
||||||
|
ARG_CLASSIFICATIONLABELPERMISSIONS = 'classificationlabelpermissions'
|
||||||
ARG_CLASS = 'class'
|
ARG_CLASS = 'class'
|
||||||
ARG_CLASSES = 'classes'
|
ARG_CLASSES = 'classes'
|
||||||
ARG_CLASSPARTICIPANTS = 'classparticipants'
|
ARG_CLASSPARTICIPANTS = 'classparticipants'
|
||||||
@@ -571,6 +583,8 @@ class GamCLArgs():
|
|||||||
ARG_DRIVELABELS = 'drivelabels'
|
ARG_DRIVELABELS = 'drivelabels'
|
||||||
ARG_DRIVELABELPERMISSION = 'drivelabelpermission'
|
ARG_DRIVELABELPERMISSION = 'drivelabelpermission'
|
||||||
ARG_DRIVELABELPERMISSIONS = 'drivelabelpermissions'
|
ARG_DRIVELABELPERMISSIONS = 'drivelabelpermissions'
|
||||||
|
ARG_DRIVELASTMODIFICATION = 'drivelastmodification'
|
||||||
|
ARG_DRIVELASTMODIFICATIONS = 'drivelastmodifications'
|
||||||
ARG_DRIVESETTINGS = 'drivesettings'
|
ARG_DRIVESETTINGS = 'drivesettings'
|
||||||
ARG_DRIVETRASH = 'drivetrash'
|
ARG_DRIVETRASH = 'drivetrash'
|
||||||
ARG_EMPTYDRIVEFOLDERS = 'emptydrivefolders'
|
ARG_EMPTYDRIVEFOLDERS = 'emptydrivefolders'
|
||||||
@@ -608,7 +622,6 @@ class GamCLArgs():
|
|||||||
ARG_FORWARDS = 'forwards'
|
ARG_FORWARDS = 'forwards'
|
||||||
ARG_FORWARDINGADDRESS = 'forwardingaddress'
|
ARG_FORWARDINGADDRESS = 'forwardingaddress'
|
||||||
ARG_FORWARDINGADDRESSES = 'forwardingaddresses'
|
ARG_FORWARDINGADDRESSES = 'forwardingaddresses'
|
||||||
ARG_GAL = 'gal'
|
|
||||||
ARG_GCPFOLDER = 'gcpfolder'
|
ARG_GCPFOLDER = 'gcpfolder'
|
||||||
ARG_GCPSERVICEACCOUNT = 'gcpserviceaccount'
|
ARG_GCPSERVICEACCOUNT = 'gcpserviceaccount'
|
||||||
ARG_GMAIL = 'gmail'
|
ARG_GMAIL = 'gmail'
|
||||||
@@ -748,6 +761,7 @@ class GamCLArgs():
|
|||||||
ARG_SHAREDDRIVES = 'shareddrives'
|
ARG_SHAREDDRIVES = 'shareddrives'
|
||||||
ARG_SHAREDDRIVEACLS = 'shareddriveacls'
|
ARG_SHAREDDRIVEACLS = 'shareddriveacls'
|
||||||
ARG_SHAREDDRIVEINFO = 'shareddriveinfo'
|
ARG_SHAREDDRIVEINFO = 'shareddriveinfo'
|
||||||
|
ARG_SHAREDDRIVEORGANIZERS = 'shareddriveorganizers'
|
||||||
ARG_SHAREDDRIVETHEMES = 'shareddrivethemes'
|
ARG_SHAREDDRIVETHEMES = 'shareddrivethemes'
|
||||||
ARG_SHEET = 'sheet'
|
ARG_SHEET = 'sheet'
|
||||||
ARG_SHEETS = 'sheets'
|
ARG_SHEETS = 'sheets'
|
||||||
@@ -767,8 +781,19 @@ class GamCLArgs():
|
|||||||
ARG_STORAGEBUCKETS = 'storagebuckets'
|
ARG_STORAGEBUCKETS = 'storagebuckets'
|
||||||
ARG_STORAGEFILE = 'storagefile'
|
ARG_STORAGEFILE = 'storagefile'
|
||||||
ARG_STORAGEFILES = 'storagefiles'
|
ARG_STORAGEFILES = 'storagefiles'
|
||||||
|
ARG_SUSPENDED = 'suspended'
|
||||||
ARG_SVCACCT = 'svcacct'
|
ARG_SVCACCT = 'svcacct'
|
||||||
ARG_SVCACCTS = 'svcaccts'
|
ARG_SVCACCTS = 'svcaccts'
|
||||||
|
ARG_TAGMANAGERACCOUNT = 'tagmanageraccount'
|
||||||
|
ARG_TAGMANAGERACCOUNTS = 'tagmanageraccounts'
|
||||||
|
ARG_TAGMANAGERCONTAINER = 'tagmanagercontainer'
|
||||||
|
ARG_TAGMANAGERCONTAINERS = 'tagmanagercontainers'
|
||||||
|
ARG_TAGMANAGERPERMISSION = 'tagmanagerpermission'
|
||||||
|
ARG_TAGMANAGERPERMISSIONS = 'tagmanagerpermissions'
|
||||||
|
ARG_TAGMANAGERTAG = 'tagmanagertag'
|
||||||
|
ARG_TAGMANAGERTAGS = 'tagmanagertags'
|
||||||
|
ARG_TAGMANAGERWORKSPACE = 'tagmanagerworkspace'
|
||||||
|
ARG_TAGMANAGERWORKSPACES = 'tagmanagerworkspaces'
|
||||||
ARG_TASK = 'task'
|
ARG_TASK = 'task'
|
||||||
ARG_TASKS = 'tasks'
|
ARG_TASKS = 'tasks'
|
||||||
ARG_TASKLIST = 'tasklist'
|
ARG_TASKLIST = 'tasklist'
|
||||||
@@ -777,6 +802,7 @@ class GamCLArgs():
|
|||||||
ARG_TEAMDRIVES = 'teamdrives'
|
ARG_TEAMDRIVES = 'teamdrives'
|
||||||
ARG_TEAMDRIVEACLS = 'teamdriveacls'
|
ARG_TEAMDRIVEACLS = 'teamdriveacls'
|
||||||
ARG_TEAMDRIVEINFO = 'teamdriveinfo'
|
ARG_TEAMDRIVEINFO = 'teamdriveinfo'
|
||||||
|
ARG_TEAMDRIVEORGANIZERS = 'teamdriveorganizers'
|
||||||
ARG_TEAMDRIVETHEMES = 'teamdrivethemes'
|
ARG_TEAMDRIVETHEMES = 'teamdrivethemes'
|
||||||
ARG_THREAD = 'thread'
|
ARG_THREAD = 'thread'
|
||||||
ARG_THREADS = 'threads'
|
ARG_THREADS = 'threads'
|
||||||
@@ -806,6 +832,10 @@ class GamCLArgs():
|
|||||||
ARG_VERIFICATION = 'verification'
|
ARG_VERIFICATION = 'verification'
|
||||||
ARG_VERIFICATIONCODES = 'verificationcodes'
|
ARG_VERIFICATIONCODES = 'verificationcodes'
|
||||||
ARG_VERIFY = 'verify'
|
ARG_VERIFY = 'verify'
|
||||||
|
ARG_WEBMASTERSITE = 'webmastersite'
|
||||||
|
ARG_WEBMASTERSITES = 'webmastersites'
|
||||||
|
ARG_WEBRESOURCE = 'webresource'
|
||||||
|
ARG_WEBRESOURCES = 'webresources'
|
||||||
ARG_WORKINGLOCATION = 'workinglocation'
|
ARG_WORKINGLOCATION = 'workinglocation'
|
||||||
ARG_WORKINGLOCATIONS = 'workinglocations'
|
ARG_WORKINGLOCATIONS = 'workinglocations'
|
||||||
ARG_YOUTUBECHANNEL = 'youtubechannel'
|
ARG_YOUTUBECHANNEL = 'youtubechannel'
|
||||||
@@ -834,15 +864,28 @@ class GamCLArgs():
|
|||||||
OB_CHARACTER = 'Character'
|
OB_CHARACTER = 'Character'
|
||||||
OB_CHAR_SET = 'CharacterSet'
|
OB_CHAR_SET = 'CharacterSet'
|
||||||
OG_CHAT_ATTACHMENT = 'ChatAttachment'
|
OG_CHAT_ATTACHMENT = 'ChatAttachment'
|
||||||
|
OB_CHAT_EMOJI = 'ChatEmoji'
|
||||||
|
OB_CHAT_EMOJI_NAME = 'ChatEmojiName'
|
||||||
OB_CHAT_EVENT = 'ChatEvent'
|
OB_CHAT_EVENT = 'ChatEvent'
|
||||||
OB_CHAT_MEMBER = 'ChatMember'
|
OB_CHAT_MEMBER = 'ChatMember'
|
||||||
OB_CHAT_MESSAGE = 'ChatMessage'
|
OB_CHAT_MESSAGE = 'ChatMessage'
|
||||||
OB_CHAT_MESSAGE_ID = 'ChatMessageID'
|
OB_CHAT_MESSAGE_ID = 'ChatMessageID'
|
||||||
OB_CHAT_SPACE = 'ChatSpace'
|
OB_CHAT_SPACE = 'ChatSpace'
|
||||||
|
OB_CHAT_SPACE_LIST = 'ChatSpaceList'
|
||||||
OB_CHAT_THREAD = 'ChatThread'
|
OB_CHAT_THREAD = 'ChatThread'
|
||||||
|
OB_CHROMEPROFILE_NAME = 'ChromeProfileName'
|
||||||
|
OB_CHROMEPROFILE_NAME_LIST = 'ChromeProfileNameList'
|
||||||
|
OB_CHROMEPROFILE_COMMAND_NAME = 'ChromeProfileCommandName'
|
||||||
|
OB_CHROMEPROFILE_COMMAND_NAME_LIST = 'ChromeProfileNameCommandList'
|
||||||
OB_CHROME_VERSION = 'ChromeVersion'
|
OB_CHROME_VERSION = 'ChromeVersion'
|
||||||
OB_CIDR_NETMASK = 'CIDRnetmask'
|
OB_CIDR_NETMASK = 'CIDRnetmask'
|
||||||
OB_CIGROUP_ALIAS_LIST = "CIGroupAliasList"
|
OB_CIGROUP_ALIAS_LIST = "CIGroupAliasList"
|
||||||
|
OB_CIPOLICY_NAME_ENTITY = 'CIPolicyNameEntity'
|
||||||
|
OB_CLASSIFICATION_LABEL_ID = 'ClassificationLabelID'
|
||||||
|
OB_CLASSIFICATION_LABEL_NAME = 'ClassificationLabelName'
|
||||||
|
OB_CLASSIFICATION_LABEL_PERMISSION_NAME = 'ClassificationLabelPermissionName'
|
||||||
|
OB_CLASSIFICATION_LABEL_FIELD_ID = 'ClassificationLabelFieldID'
|
||||||
|
OB_CLASSIFICATION_LABEL_SELECTION_ID_LIST = 'ClassificationLabelSelectionIDList'
|
||||||
OB_CLASSROOM_INVITATION_ID_ENTITY = 'ClassroomInvitationIDEntity'
|
OB_CLASSROOM_INVITATION_ID_ENTITY = 'ClassroomInvitationIDEntity'
|
||||||
OB_CLIENT_ID = 'ClientID'
|
OB_CLIENT_ID = 'ClientID'
|
||||||
OB_COLLABORATOR_ITEM = 'CollaboratorItem'
|
OB_COLLABORATOR_ITEM = 'CollaboratorItem'
|
||||||
@@ -854,8 +897,11 @@ class GamCLArgs():
|
|||||||
OB_CONTACT_GROUP_ITEM = 'ContactGroupItem'
|
OB_CONTACT_GROUP_ITEM = 'ContactGroupItem'
|
||||||
OB_COURSE_ALIAS = 'CourseAlias'
|
OB_COURSE_ALIAS = 'CourseAlias'
|
||||||
OB_COURSE_ALIAS_ENTITY = 'CourseAliasEntity'
|
OB_COURSE_ALIAS_ENTITY = 'CourseAliasEntity'
|
||||||
|
OB_COURSE_ANNOUNCEMENT_ID = "CourseAnnouncementID"
|
||||||
OB_COURSE_ANNOUNCEMENT_ID_ENTITY = "CourseAnnouncementIDEntity"
|
OB_COURSE_ANNOUNCEMENT_ID_ENTITY = "CourseAnnouncementIDEntity"
|
||||||
OB_COURSE_ANNOUNCEMENT_STATE_LIST = "CourseAnnouncementStateList"
|
OB_COURSE_ANNOUNCEMENT_STATE_LIST = "CourseAnnouncementStateList"
|
||||||
|
OB_COURSE_ANNOUNCEMENT_ADD_STATE_LIST = "CourseAnnouncementAddStateList"
|
||||||
|
OB_COURSE_ANNOUNCEMENT_UPDATE_STATE_LIST = "CourseAnnouncementUpdateStateList"
|
||||||
OB_COURSE_ENTITY = 'CourseEntity'
|
OB_COURSE_ENTITY = 'CourseEntity'
|
||||||
OB_COURSE_ID = 'CourseID'
|
OB_COURSE_ID = 'CourseID'
|
||||||
OB_COURSE_MATERIAL_ID_ENTITY = 'CourseMaterialIDEntity'
|
OB_COURSE_MATERIAL_ID_ENTITY = 'CourseMaterialIDEntity'
|
||||||
@@ -896,11 +942,6 @@ class GamCLArgs():
|
|||||||
OB_DRIVE_FOLDER_NAME = 'DriveFolderName'
|
OB_DRIVE_FOLDER_NAME = 'DriveFolderName'
|
||||||
OB_DRIVE_FOLDER_NAME_LIST = 'DriveFolderNameList'
|
OB_DRIVE_FOLDER_NAME_LIST = 'DriveFolderNameList'
|
||||||
OB_DRIVE_FOLDER_PATH = 'DriveFolderPath'
|
OB_DRIVE_FOLDER_PATH = 'DriveFolderPath'
|
||||||
OB_DRIVE_LABEL_ID = 'DriveLabelID'
|
|
||||||
OB_DRIVE_LABEL_NAME = 'DriveLabelName'
|
|
||||||
OB_DRIVE_LABEL_PERMISSION_NAME = 'DriveLabelPermissionName'
|
|
||||||
OB_DRIVE_LABEL_FIELD_ID = 'DriveLabelFieldID'
|
|
||||||
OB_DRIVE_LABEL_SELECTION_ID_LIST = 'DriveLabelSelectionIDList'
|
|
||||||
OB_EMAIL_ADDRESS = 'EmailAddress'
|
OB_EMAIL_ADDRESS = 'EmailAddress'
|
||||||
OB_EMAIL_ADDRESS_ENTITY = 'EmailAddressEntity'
|
OB_EMAIL_ADDRESS_ENTITY = 'EmailAddressEntity'
|
||||||
OB_EMAIL_ADDRESS_LIST = 'EmailAddressList'
|
OB_EMAIL_ADDRESS_LIST = 'EmailAddressList'
|
||||||
@@ -914,9 +955,11 @@ 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'
|
||||||
|
OB_FILE_NAME_PATTERN = 'FileNamePattern'
|
||||||
OB_FILE_PATH = 'FilePath'
|
OB_FILE_PATH = 'FilePath'
|
||||||
OB_FILTER_ID_ENTITY = 'FilterIDEntity'
|
OB_FILTER_ID_ENTITY = 'FilterIDEntity'
|
||||||
OB_FORMAT_LIST = 'FormatList'
|
OB_FORMAT_LIST = 'FormatList'
|
||||||
@@ -941,7 +984,6 @@ class GamCLArgs():
|
|||||||
OB_LABEL_ID_LIST = 'LabelIDLIst'
|
OB_LABEL_ID_LIST = 'LabelIDLIst'
|
||||||
OB_LABEL_NAME = 'LabelName'
|
OB_LABEL_NAME = 'LabelName'
|
||||||
OB_LABEL_NAME_LIST = 'LabelNameList'
|
OB_LABEL_NAME_LIST = 'LabelNameList'
|
||||||
OB_LABEL_REPLACEMENT = 'LabelReplacement'
|
|
||||||
OB_LANGUAGE_LIST = 'LanguageList'
|
OB_LANGUAGE_LIST = 'LanguageList'
|
||||||
OB_LOOKERSTUDIO_PERMISSION_ENTITY = 'LookerStudioPermissionEntity'
|
OB_LOOKERSTUDIO_PERMISSION_ENTITY = 'LookerStudioPermissionEntity'
|
||||||
OB_MATTER_ITEM = 'MatterItem'
|
OB_MATTER_ITEM = 'MatterItem'
|
||||||
@@ -954,6 +996,7 @@ class GamCLArgs():
|
|||||||
OB_MOBILE_ENTITY = 'MobileEntity'
|
OB_MOBILE_ENTITY = 'MobileEntity'
|
||||||
OB_NETWORK_ID = 'networkID'
|
OB_NETWORK_ID = 'networkID'
|
||||||
OB_NAME = 'Name'
|
OB_NAME = 'Name'
|
||||||
|
OB_ORGANIZER_TYPE_LIST = 'OrganizerTypeList'
|
||||||
OB_ORGUNIT_ENTITY = 'OrgUnitEntity'
|
OB_ORGUNIT_ENTITY = 'OrgUnitEntity'
|
||||||
OB_ORGUNIT_ITEM = 'OrgUnitItem'
|
OB_ORGUNIT_ITEM = 'OrgUnitItem'
|
||||||
OB_ORGUNIT_PATH = 'OrgUnitPath'
|
OB_ORGUNIT_PATH = 'OrgUnitPath'
|
||||||
@@ -962,7 +1005,6 @@ class GamCLArgs():
|
|||||||
OB_PERMISSION_ID_LIST = 'PermissionIDList'
|
OB_PERMISSION_ID_LIST = 'PermissionIDList'
|
||||||
OB_PERMISSION_ROLE_LIST = 'PermissionRoleList'
|
OB_PERMISSION_ROLE_LIST = 'PermissionRoleList'
|
||||||
OB_PERMISSION_TYPE_LIST = 'PermissionTypeList'
|
OB_PERMISSION_TYPE_LIST = 'PermissionTypeList'
|
||||||
OB_PHOTO_FILENAME_PATTERN = 'FilenameNamePattern'
|
|
||||||
OB_PRINTER_ID = 'PrinterID'
|
OB_PRINTER_ID = 'PrinterID'
|
||||||
OB_PRIVILEGE_LIST = 'PrivilegeList'
|
OB_PRIVILEGE_LIST = 'PrivilegeList'
|
||||||
OB_PRODUCT_ID = 'ProductID'
|
OB_PRODUCT_ID = 'ProductID'
|
||||||
@@ -980,10 +1022,10 @@ class GamCLArgs():
|
|||||||
OB_RESOURCE_ENTITY = 'ResourceEntity'
|
OB_RESOURCE_ENTITY = 'ResourceEntity'
|
||||||
OB_RESOURCE_ID = 'ResourceID'
|
OB_RESOURCE_ID = 'ResourceID'
|
||||||
OB_RE_PATTERN = 'REPattern'
|
OB_RE_PATTERN = 'REPattern'
|
||||||
|
OB_RE_SUBSTITUTION = 'RESubstitution'
|
||||||
OB_ROLE_ASSIGNMENT_ID = 'RoleAssignmentID'
|
OB_ROLE_ASSIGNMENT_ID = 'RoleAssignmentID'
|
||||||
OB_ROLE_ITEM = 'RoleItem'
|
OB_ROLE_ITEM = 'RoleItem'
|
||||||
OB_ROLE_LIST = 'RoleList'
|
OB_ROLE_LIST = 'RoleList'
|
||||||
OB_ROOM_LIST = 'RoomList'
|
|
||||||
OB_SCHEMA_ENTITY = 'SchemaEntity'
|
OB_SCHEMA_ENTITY = 'SchemaEntity'
|
||||||
OB_SCHEMA_NAME = 'SchemaName'
|
OB_SCHEMA_NAME = 'SchemaName'
|
||||||
OB_SCHEMA_NAME_FIELD_NAME = 'SchemaName.FieldName'
|
OB_SCHEMA_NAME_FIELD_NAME = 'SchemaName.FieldName'
|
||||||
@@ -1013,6 +1055,7 @@ class GamCLArgs():
|
|||||||
OB_STRING_LIST = 'StringList'
|
OB_STRING_LIST = 'StringList'
|
||||||
OB_STUDENT_ITEM = 'StudentItem'
|
OB_STUDENT_ITEM = 'StudentItem'
|
||||||
OB_TAG = 'Tag'
|
OB_TAG = 'Tag'
|
||||||
|
OB_TAGMANAGER_PATH_LIST = 'TagManagerPathList'
|
||||||
OB_TASK_ID = 'TaskID'
|
OB_TASK_ID = 'TaskID'
|
||||||
OB_TASKLIST_ID = 'TaskListID'
|
OB_TASKLIST_ID = 'TaskListID'
|
||||||
OB_TASKLIST_ID_ENTITY = 'TaskListIDEntity'
|
OB_TASKLIST_ID_ENTITY = 'TaskListIDEntity'
|
||||||
@@ -1139,6 +1182,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():
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -25,14 +25,16 @@ class GamEntity():
|
|||||||
ROLE_MANAGER = 'MANAGER'
|
ROLE_MANAGER = 'MANAGER'
|
||||||
ROLE_MEMBER = 'MEMBER'
|
ROLE_MEMBER = 'MEMBER'
|
||||||
ROLE_OWNER = 'OWNER'
|
ROLE_OWNER = 'OWNER'
|
||||||
|
ROLE_LIST = [ROLE_MANAGER, ROLE_MEMBER, ROLE_OWNER]
|
||||||
ROLE_USER = 'USER'
|
ROLE_USER = 'USER'
|
||||||
ROLE_MANAGER_MEMBER = ','.join([ROLE_MANAGER, ROLE_MEMBER])
|
ROLE_MANAGER_MEMBER = ','.join([ROLE_MANAGER, ROLE_MEMBER])
|
||||||
ROLE_MANAGER_OWNER = ','.join([ROLE_MANAGER, ROLE_OWNER])
|
ROLE_MANAGER_OWNER = ','.join([ROLE_MANAGER, ROLE_OWNER])
|
||||||
ROLE_MEMBER_OWNER = ','.join([ROLE_MEMBER, ROLE_OWNER])
|
ROLE_MEMBER_OWNER = ','.join([ROLE_MEMBER, ROLE_OWNER])
|
||||||
ROLE_MANAGER_MEMBER_OWNER = ','.join([ROLE_MANAGER, ROLE_MEMBER, ROLE_OWNER])
|
ROLE_MANAGER_MEMBER_OWNER = ','.join(ROLE_LIST)
|
||||||
ROLE_PUBLIC = 'PUBLIC'
|
ROLE_PUBLIC = 'PUBLIC'
|
||||||
ROLE_ALL = ROLE_MANAGER_MEMBER_OWNER
|
ROLE_ALL = ROLE_MANAGER_MEMBER_OWNER
|
||||||
|
|
||||||
|
TYPE_CBCM_BROWSER = 'CBCM_BROWSER'
|
||||||
TYPE_CUSTOMER = 'CUSTOMER'
|
TYPE_CUSTOMER = 'CUSTOMER'
|
||||||
TYPE_EXTERNAL = 'EXTERNAL'
|
TYPE_EXTERNAL = 'EXTERNAL'
|
||||||
TYPE_OTHER = 'OTHER'
|
TYPE_OTHER = 'OTHER'
|
||||||
@@ -59,7 +61,6 @@ class GamEntity():
|
|||||||
ANALYTIC_ACCOUNT_SUMMARY = 'anas'
|
ANALYTIC_ACCOUNT_SUMMARY = 'anas'
|
||||||
ANALYTIC_DATASTREAM = 'anad'
|
ANALYTIC_DATASTREAM = 'anad'
|
||||||
ANALYTIC_PROPERTY = 'anap'
|
ANALYTIC_PROPERTY = 'anap'
|
||||||
ANALYTIC_UA_PROPERTY = 'anau'
|
|
||||||
API = 'api '
|
API = 'api '
|
||||||
APP_ACCESS_SETTINGS = 'apps'
|
APP_ACCESS_SETTINGS = 'apps'
|
||||||
APP_ID = 'appi'
|
APP_ID = 'appi'
|
||||||
@@ -74,6 +75,7 @@ class GamEntity():
|
|||||||
BACKUP_VERIFICATION_CODES = 'buvc'
|
BACKUP_VERIFICATION_CODES = 'buvc'
|
||||||
BUILDING = 'bldg'
|
BUILDING = 'bldg'
|
||||||
BUILDING_ID = 'bldi'
|
BUILDING_ID = 'bldi'
|
||||||
|
BUSINESS_PROFILE_ACCOUNT = 'bpac'
|
||||||
CAA_LEVEL = 'calv'
|
CAA_LEVEL = 'calv'
|
||||||
CALENDAR = 'cale'
|
CALENDAR = 'cale'
|
||||||
CALENDAR_ACL = 'cacl'
|
CALENDAR_ACL = 'cacl'
|
||||||
@@ -85,6 +87,7 @@ class GamEntity():
|
|||||||
CHANNEL_SKU = 'chsk'
|
CHANNEL_SKU = 'chsk'
|
||||||
CHAT_BOT = 'chbo'
|
CHAT_BOT = 'chbo'
|
||||||
CHAT_ADMIN = 'chad'
|
CHAT_ADMIN = 'chad'
|
||||||
|
CHAT_EMOJI = 'chem'
|
||||||
CHAT_EVENT = 'chev'
|
CHAT_EVENT = 'chev'
|
||||||
CHAT_MANAGER_USER = 'chgu'
|
CHAT_MANAGER_USER = 'chgu'
|
||||||
CHAT_MEMBER = 'chme'
|
CHAT_MEMBER = 'chme'
|
||||||
@@ -108,8 +111,16 @@ class GamEntity():
|
|||||||
CHROME_POLICY = 'cpol'
|
CHROME_POLICY = 'cpol'
|
||||||
CHROME_POLICY_IMAGE = 'cpim'
|
CHROME_POLICY_IMAGE = 'cpim'
|
||||||
CHROME_POLICY_SCHEMA = 'cpsc'
|
CHROME_POLICY_SCHEMA = 'cpsc'
|
||||||
|
CHROME_PROFILE = 'cpro'
|
||||||
|
CHROME_PROFILE_COMMAND = 'cpcm'
|
||||||
CHROME_RELEASE = 'crel'
|
CHROME_RELEASE = 'crel'
|
||||||
CHROME_VERSION = 'cver'
|
CHROME_VERSION = 'cver'
|
||||||
|
CLASSIFICATION_LABEL = 'dlab'
|
||||||
|
CLASSIFICATION_LABEL_FIELD_ID = 'dlfi'
|
||||||
|
CLASSIFICATION_LABEL_ID = 'dlid'
|
||||||
|
CLASSIFICATION_LABEL_NAME = 'dlna'
|
||||||
|
CLASSIFICATION_LABEL_PERMISSION = 'dlpe'
|
||||||
|
CLASSIFICATION_LABEL_PERMISSION_NAME = 'dlpn'
|
||||||
CLASSROOM_INVITATION = 'clai'
|
CLASSROOM_INVITATION = 'clai'
|
||||||
CLASSROOM_INVITATION_OWNER = 'clio'
|
CLASSROOM_INVITATION_OWNER = 'clio'
|
||||||
CLASSROOM_INVITATION_STUDENT = 'clis'
|
CLASSROOM_INVITATION_STUDENT = 'clis'
|
||||||
@@ -193,12 +204,6 @@ class GamEntity():
|
|||||||
DRIVE_FOLDER_PATH = 'folp'
|
DRIVE_FOLDER_PATH = 'folp'
|
||||||
DRIVE_FOLDER_RENAMED = 'forn'
|
DRIVE_FOLDER_RENAMED = 'forn'
|
||||||
DRIVE_FOLDER_SHORTCUT = 'fols'
|
DRIVE_FOLDER_SHORTCUT = 'fols'
|
||||||
DRIVE_LABEL = 'dlab'
|
|
||||||
DRIVE_LABEL_FIELD_ID = 'dlfi'
|
|
||||||
DRIVE_LABEL_ID = 'dlid'
|
|
||||||
DRIVE_LABEL_NAME = 'dlna'
|
|
||||||
DRIVE_LABEL_PERMISSION = 'dlpe'
|
|
||||||
DRIVE_LABEL_PERMISSION_NAME = 'dlpn'
|
|
||||||
DRIVE_ORPHAN_FILE_OR_FOLDER = 'orph'
|
DRIVE_ORPHAN_FILE_OR_FOLDER = 'orph'
|
||||||
DRIVE_PARENT_FOLDER = 'fipf'
|
DRIVE_PARENT_FOLDER = 'fipf'
|
||||||
DRIVE_PARENT_FOLDER_ID = 'fipi'
|
DRIVE_PARENT_FOLDER_ID = 'fipi'
|
||||||
@@ -302,6 +307,7 @@ class GamEntity():
|
|||||||
PERMITTEE = 'prmt'
|
PERMITTEE = 'prmt'
|
||||||
PERSONAL_DEVICE = 'pedv'
|
PERSONAL_DEVICE = 'pedv'
|
||||||
PHOTO = 'phot'
|
PHOTO = 'phot'
|
||||||
|
POLICY = 'poli'
|
||||||
POP_ENABLED = 'popa'
|
POP_ENABLED = 'popa'
|
||||||
PRESENTATION = 'pres'
|
PRESENTATION = 'pres'
|
||||||
PRINTER = 'prin'
|
PRINTER = 'prin'
|
||||||
@@ -338,8 +344,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'
|
||||||
@@ -355,7 +359,12 @@ class GamEntity():
|
|||||||
SUBSCRIPTION = 'subs'
|
SUBSCRIPTION = 'subs'
|
||||||
SVCACCT = 'svac'
|
SVCACCT = 'svac'
|
||||||
SVCACCT_KEY = 'svky'
|
SVCACCT_KEY = 'svky'
|
||||||
TARGET_USER = 'tgt'
|
TAGMANAGER_ACCOUNT = 'tmac'
|
||||||
|
TAGMANAGER_CONTAINER = 'tmco'
|
||||||
|
TAGMANAGER_PERMISSION = 'tmpm'
|
||||||
|
TAGMANAGER_TAG = 'tmtg'
|
||||||
|
TAGMANAGER_WORKSPACE = 'tmws'
|
||||||
|
TARGET_USER = 'tgt '
|
||||||
TASK = 'task'
|
TASK = 'task'
|
||||||
TASKLIST = 'tali'
|
TASKLIST = 'tali'
|
||||||
TEACHER = 'teac'
|
TEACHER = 'teac'
|
||||||
@@ -386,6 +395,8 @@ class GamEntity():
|
|||||||
VAULT_MATTER_ID = 'vlmi'
|
VAULT_MATTER_ID = 'vlmi'
|
||||||
VAULT_OPERATION = 'vlto'
|
VAULT_OPERATION = 'vlto'
|
||||||
VAULT_QUERY = 'vltq'
|
VAULT_QUERY = 'vltq'
|
||||||
|
WEB_MASTERSITE = 'wems'
|
||||||
|
WEB_RESOURCE = 'were'
|
||||||
WEBCLIPS_ENABLED = 'webc'
|
WEBCLIPS_ENABLED = 'webc'
|
||||||
YOUTUBE_CHANNEL = 'ytch'
|
YOUTUBE_CHANNEL = 'ytch'
|
||||||
# _NAMES[0] is plural, _NAMES[1] is singular unless the item name is explicitly plural (Calendar Settings)
|
# _NAMES[0] is plural, _NAMES[1] is singular unless the item name is explicitly plural (Calendar Settings)
|
||||||
@@ -410,7 +421,6 @@ class GamEntity():
|
|||||||
ANALYTIC_ACCOUNT_SUMMARY: ['Analytic Account Summaries', 'Analytic Account Summary'],
|
ANALYTIC_ACCOUNT_SUMMARY: ['Analytic Account Summaries', 'Analytic Account Summary'],
|
||||||
ANALYTIC_DATASTREAM: ['Analytic Datastreams', 'Analytic Datastream'],
|
ANALYTIC_DATASTREAM: ['Analytic Datastreams', 'Analytic Datastream'],
|
||||||
ANALYTIC_PROPERTY: ['Analytic GA4 Properties', 'Analytic GA4 Property'],
|
ANALYTIC_PROPERTY: ['Analytic GA4 Properties', 'Analytic GA4 Property'],
|
||||||
ANALYTIC_UA_PROPERTY: ['Analytic UA Properties', 'Analytic UA Property'],
|
|
||||||
API: ['APIs', 'API'],
|
API: ['APIs', 'API'],
|
||||||
APP_ACCESS_SETTINGS: ['Application Access Settings', 'Application Access Settings'],
|
APP_ACCESS_SETTINGS: ['Application Access Settings', 'Application Access Settings'],
|
||||||
APP_ID: ['Application IDs', 'Application ID'],
|
APP_ID: ['Application IDs', 'Application ID'],
|
||||||
@@ -425,6 +435,7 @@ class GamEntity():
|
|||||||
BACKUP_VERIFICATION_CODES: ['Backup Verification Codes', 'Backup Verification Codes'],
|
BACKUP_VERIFICATION_CODES: ['Backup Verification Codes', 'Backup Verification Codes'],
|
||||||
BUILDING: ['Buildings', 'Building'],
|
BUILDING: ['Buildings', 'Building'],
|
||||||
BUILDING_ID: ['Building IDs', 'Building ID'],
|
BUILDING_ID: ['Building IDs', 'Building ID'],
|
||||||
|
BUSINESS_PROFILE_ACCOUNT: ['Business Profile Accounts', 'Business Profile Account'],
|
||||||
CAA_LEVEL: ['CAA Levels', 'CAA Level'],
|
CAA_LEVEL: ['CAA Levels', 'CAA Level'],
|
||||||
CALENDAR: ['Calendars', 'Calendar'],
|
CALENDAR: ['Calendars', 'Calendar'],
|
||||||
CALENDAR_ACL: ['Calendar ACLs', 'Calendar ACL'],
|
CALENDAR_ACL: ['Calendar ACLs', 'Calendar ACL'],
|
||||||
@@ -436,6 +447,7 @@ class GamEntity():
|
|||||||
CHANNEL_SKU: ['Channel SKUs', 'Channel SKU'],
|
CHANNEL_SKU: ['Channel SKUs', 'Channel SKU'],
|
||||||
CHAT_BOT: ['Chat BOTs', 'Chat BOT'],
|
CHAT_BOT: ['Chat BOTs', 'Chat BOT'],
|
||||||
CHAT_ADMIN: ['Chat Admins', 'Chat Admin'],
|
CHAT_ADMIN: ['Chat Admins', 'Chat Admin'],
|
||||||
|
CHAT_EMOJI: ['Chat Emojis', 'Chat Emoji'],
|
||||||
CHAT_EVENT: ['Chat Events', 'Chat Event'],
|
CHAT_EVENT: ['Chat Events', 'Chat Event'],
|
||||||
CHAT_MANAGER_USER: ['Chat User Managers', 'Chat User Manager'],
|
CHAT_MANAGER_USER: ['Chat User Managers', 'Chat User Manager'],
|
||||||
CHAT_MESSAGE: ['Chat Messages', 'Chat Message'],
|
CHAT_MESSAGE: ['Chat Messages', 'Chat Message'],
|
||||||
@@ -459,8 +471,16 @@ class GamEntity():
|
|||||||
CHROME_POLICY: ['Chrome Policies', 'Chrome Policy'],
|
CHROME_POLICY: ['Chrome Policies', 'Chrome Policy'],
|
||||||
CHROME_POLICY_IMAGE: ['Chrome Policy Images', 'Chrome Policy Image'],
|
CHROME_POLICY_IMAGE: ['Chrome Policy Images', 'Chrome Policy Image'],
|
||||||
CHROME_POLICY_SCHEMA: ['Chrome Policy Schemas', 'Chrome Policy Schema'],
|
CHROME_POLICY_SCHEMA: ['Chrome Policy Schemas', 'Chrome Policy Schema'],
|
||||||
|
CHROME_PROFILE: ['Chrome Profiles', 'Chrome Profile'],
|
||||||
|
CHROME_PROFILE_COMMAND: ['Chrome Profile Commands', 'Chrome Profile Command'],
|
||||||
CHROME_RELEASE: ['Chrome Releases', 'Chrome Release'],
|
CHROME_RELEASE: ['Chrome Releases', 'Chrome Release'],
|
||||||
CHROME_VERSION: ['Chrome Versions', 'Chrome Version'],
|
CHROME_VERSION: ['Chrome Versions', 'Chrome Version'],
|
||||||
|
CLASSIFICATION_LABEL: ['Classification Labels', 'Classification Label'],
|
||||||
|
CLASSIFICATION_LABEL_FIELD_ID: ['Classification Label Field IDs', 'Classification Label Field ID'],
|
||||||
|
CLASSIFICATION_LABEL_ID: ['Classification Label IDs', 'Classification Label ID'],
|
||||||
|
CLASSIFICATION_LABEL_NAME: ['Classification Label Names', 'Classification Label Name'],
|
||||||
|
CLASSIFICATION_LABEL_PERMISSION: ['Classification Label Permissions', 'Classification Label Permission'],
|
||||||
|
CLASSIFICATION_LABEL_PERMISSION_NAME: ['Classification Label Permission Names', 'Classification Label Permission Name'],
|
||||||
CLASSROOM_INVITATION: ['Classroom Invitations', 'Classroom Invitation'],
|
CLASSROOM_INVITATION: ['Classroom Invitations', 'Classroom Invitation'],
|
||||||
CLASSROOM_INVITATION_OWNER: ['Classroom Owner Invitations', 'Classroom Owner Invitation'],
|
CLASSROOM_INVITATION_OWNER: ['Classroom Owner Invitations', 'Classroom Owner Invitation'],
|
||||||
CLASSROOM_INVITATION_STUDENT: ['Classroom Student Invitations', 'Classroom Student Invitation'],
|
CLASSROOM_INVITATION_STUDENT: ['Classroom Student Invitations', 'Classroom Student Invitation'],
|
||||||
@@ -544,12 +564,6 @@ class GamEntity():
|
|||||||
DRIVE_FOLDER_PATH: ['Drive Folder Paths', 'Drive Folder Path'],
|
DRIVE_FOLDER_PATH: ['Drive Folder Paths', 'Drive Folder Path'],
|
||||||
DRIVE_FOLDER_RENAMED: ['Drive Folders Renamed', 'Drive Folder Renamed'],
|
DRIVE_FOLDER_RENAMED: ['Drive Folders Renamed', 'Drive Folder Renamed'],
|
||||||
DRIVE_FOLDER_SHORTCUT: ['Drive Folder Shortcuts', 'Drive Folder Shortcut'],
|
DRIVE_FOLDER_SHORTCUT: ['Drive Folder Shortcuts', 'Drive Folder Shortcut'],
|
||||||
DRIVE_LABEL: ['Drive Labels', 'Drive Label'],
|
|
||||||
DRIVE_LABEL_FIELD_ID: ['Drive Label Field IDs', 'Drive Label Field ID'],
|
|
||||||
DRIVE_LABEL_ID: ['Drive Label IDs', 'Drive Label ID'],
|
|
||||||
DRIVE_LABEL_NAME: ['Drive Label Names', 'Drive Label Name'],
|
|
||||||
DRIVE_LABEL_PERMISSION: ['Drive Label Permissions', 'Drive Label Permission'],
|
|
||||||
DRIVE_LABEL_PERMISSION_NAME: ['Drive Label Permission Names', 'Drive Label Permission Name'],
|
|
||||||
DRIVE_ORPHAN_FILE_OR_FOLDER: ['Drive Orphan Files/Folders', 'Drive Orphan File/Folder'],
|
DRIVE_ORPHAN_FILE_OR_FOLDER: ['Drive Orphan Files/Folders', 'Drive Orphan File/Folder'],
|
||||||
DRIVE_PARENT_FOLDER: ['Drive Parent Folders', 'Drive Parent Folder'],
|
DRIVE_PARENT_FOLDER: ['Drive Parent Folders', 'Drive Parent Folder'],
|
||||||
DRIVE_PARENT_FOLDER_ID: ['Drive Parent Folder IDs', 'Drive Parent Folder ID'],
|
DRIVE_PARENT_FOLDER_ID: ['Drive Parent Folder IDs', 'Drive Parent Folder ID'],
|
||||||
@@ -653,6 +667,7 @@ class GamEntity():
|
|||||||
PERMITTEE: ['Permittees', 'Permittee'],
|
PERMITTEE: ['Permittees', 'Permittee'],
|
||||||
PERSONAL_DEVICE: ['Personal Devices', 'Personal Device'],
|
PERSONAL_DEVICE: ['Personal Devices', 'Personal Device'],
|
||||||
PHOTO: ['Photos', 'Photo'],
|
PHOTO: ['Photos', 'Photo'],
|
||||||
|
POLICY: ['Policies', 'Policy'],
|
||||||
POP_ENABLED: ['POP Enabled', 'POP Enabled'],
|
POP_ENABLED: ['POP Enabled', 'POP Enabled'],
|
||||||
PRESENTATION: ['Presentations', 'Presentation'],
|
PRESENTATION: ['Presentations', 'Presentation'],
|
||||||
PRINTER: ['Printers', 'Printer'],
|
PRINTER: ['Printers', 'Printer'],
|
||||||
@@ -689,8 +704,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'],
|
||||||
@@ -706,6 +719,11 @@ class GamEntity():
|
|||||||
SUBSCRIPTION: ['Subscriptions', 'Subscription'],
|
SUBSCRIPTION: ['Subscriptions', 'Subscription'],
|
||||||
SVCACCT: ['Service Accounts', 'Service Account'],
|
SVCACCT: ['Service Accounts', 'Service Account'],
|
||||||
SVCACCT_KEY: ['Service Account Keys', 'Service Account Key'],
|
SVCACCT_KEY: ['Service Account Keys', 'Service Account Key'],
|
||||||
|
TAGMANAGER_ACCOUNT: ['Tag Manager Accounts', 'Tag Manager Account'],
|
||||||
|
TAGMANAGER_CONTAINER: ['Tag Manager Containers', 'Tag Manager Container'],
|
||||||
|
TAGMANAGER_PERMISSION: ['Tag Manager Permissions', 'Tag Manager Permission'],
|
||||||
|
TAGMANAGER_TAG: ['Tag Manager Tags', 'Tag Manager Tag'],
|
||||||
|
TAGMANAGER_WORKSPACE: ['Tag Manager Workspaces', 'Tag Manager Workspace'],
|
||||||
TARGET_USER: ['Target Users', 'Target User'],
|
TARGET_USER: ['Target Users', 'Target User'],
|
||||||
TASK: ['Tasks', 'Task'],
|
TASK: ['Tasks', 'Task'],
|
||||||
TASKLIST: ['Tasklists', 'Tasklist'],
|
TASKLIST: ['Tasklists', 'Tasklist'],
|
||||||
@@ -738,6 +756,8 @@ class GamEntity():
|
|||||||
VAULT_OPERATION: ['Vault Operations', 'Vault Operation'],
|
VAULT_OPERATION: ['Vault Operations', 'Vault Operation'],
|
||||||
VAULT_QUERY: ['Vault Queries', 'Vault Query'],
|
VAULT_QUERY: ['Vault Queries', 'Vault Query'],
|
||||||
WEBCLIPS_ENABLED: ['Web Clips Enabled', 'Web Clips Enabled'],
|
WEBCLIPS_ENABLED: ['Web Clips Enabled', 'Web Clips Enabled'],
|
||||||
|
WEB_MASTERSITE: ['Web Master Sites', 'Web Master Site'],
|
||||||
|
WEB_RESOURCE: ['Web Resources', 'Web Resource'],
|
||||||
YOUTUBE_CHANNEL: ['YouTube Channels', 'YouTube Channel'],
|
YOUTUBE_CHANNEL: ['YouTube Channels', 'YouTube Channel'],
|
||||||
ROLE_MANAGER: ['Managers', 'Manager'],
|
ROLE_MANAGER: ['Managers', 'Manager'],
|
||||||
ROLE_MEMBER: ['Members', 'Member'],
|
ROLE_MEMBER: ['Members', 'Member'],
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -23,6 +23,7 @@
|
|||||||
ABORTED = 'aborted'
|
ABORTED = 'aborted'
|
||||||
ABUSIVE_CONTENT_RESTRICTION = 'abusiveContentRestriction'
|
ABUSIVE_CONTENT_RESTRICTION = 'abusiveContentRestriction'
|
||||||
ACCESS_NOT_CONFIGURED = 'accessNotConfigured'
|
ACCESS_NOT_CONFIGURED = 'accessNotConfigured'
|
||||||
|
ADMIN_CANNOT_UNSUSPEND = 'adminCannotUnsuspend'
|
||||||
ALREADY_EXISTS = 'alreadyExists'
|
ALREADY_EXISTS = 'alreadyExists'
|
||||||
APPLY_LABEL_FORBIDDEN = 'applyLabelForbidden'
|
APPLY_LABEL_FORBIDDEN = 'applyLabelForbidden'
|
||||||
AUTH_ERROR = 'authError'
|
AUTH_ERROR = 'authError'
|
||||||
@@ -37,9 +38,11 @@ CANNOT_CHANGE_OWNER_ACL = 'cannotChangeOwnerAcl'
|
|||||||
CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION = 'cannotChangeOwnPrimarySubscription'
|
CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION = 'cannotChangeOwnPrimarySubscription'
|
||||||
CANNOT_COPY_FILE = 'cannotCopyFile'
|
CANNOT_COPY_FILE = 'cannotCopyFile'
|
||||||
CANNOT_DELETE_ONLY_REVISION = 'cannotDeleteOnlyRevision'
|
CANNOT_DELETE_ONLY_REVISION = 'cannotDeleteOnlyRevision'
|
||||||
|
CANNOT_DELETE_PERMISSION = 'cannotDeletePermission'
|
||||||
CANNOT_DELETE_PRIMARY_CALENDAR = 'cannotDeletePrimaryCalendar'
|
CANNOT_DELETE_PRIMARY_CALENDAR = 'cannotDeletePrimaryCalendar'
|
||||||
CANNOT_DELETE_PRIMARY_SENDAS = 'cannotDeletePrimarySendAs'
|
CANNOT_DELETE_PRIMARY_SENDAS = 'cannotDeletePrimarySendAs'
|
||||||
CANNOT_DELETE_RESOURCE_WITH_CHILDREN = 'cannotDeleteResourceWithChildren'
|
CANNOT_DELETE_RESOURCE_WITH_CHILDREN = 'cannotDeleteResourceWithChildren'
|
||||||
|
CANNOT_MODIFY_INHERITED_PERMISSION = 'cannotModifyInheritedPermission'
|
||||||
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION = 'cannotModifyInheritedTeamDrivePermission'
|
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION = 'cannotModifyInheritedTeamDrivePermission'
|
||||||
CANNOT_MODIFY_RESTRICTED_LABEL = 'cannotModifyRestrictedLabel'
|
CANNOT_MODIFY_RESTRICTED_LABEL = 'cannotModifyRestrictedLabel'
|
||||||
CANNOT_MODIFY_VIEWERS_CAN_COPY_CONTENT = 'cannotModifyViewersCanCopyContent'
|
CANNOT_MODIFY_VIEWERS_CAN_COPY_CONTENT = 'cannotModifyViewersCanCopyContent'
|
||||||
@@ -47,6 +50,7 @@ CANNOT_MOVE_TRASHED_ITEM_INTO_TEAMDRIVE = 'cannotMoveTrashedItemIntoTeamDrive'
|
|||||||
CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE = 'cannotMoveTrashedItemOutOfTeamDrive'
|
CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE = 'cannotMoveTrashedItemOutOfTeamDrive'
|
||||||
CANNOT_REMOVE_OWNER = 'cannotRemoveOwner'
|
CANNOT_REMOVE_OWNER = 'cannotRemoveOwner'
|
||||||
CANNOT_SET_EXPIRATION = 'cannotSetExpiration'
|
CANNOT_SET_EXPIRATION = 'cannotSetExpiration'
|
||||||
|
CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN = 'cannotSetExpirationOnAnyoneOrDomain'
|
||||||
CANNOT_SHARE_GROUPS_WITHLINK = 'cannotShareGroupsWithLink'
|
CANNOT_SHARE_GROUPS_WITHLINK = 'cannotShareGroupsWithLink'
|
||||||
CANNOT_SHARE_USERS_WITHLINK = 'cannotShareUsersWithLink'
|
CANNOT_SHARE_USERS_WITHLINK = 'cannotShareUsersWithLink'
|
||||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS = 'cannotShareTeamDriveTopFolderWithAnyoneOrDomains'
|
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS = 'cannotShareTeamDriveTopFolderWithAnyoneOrDomains'
|
||||||
@@ -70,6 +74,8 @@ DOMAIN_POLICY = 'domainPolicy'
|
|||||||
DOWNLOAD_QUOTA_EXCEEDED = 'downloadQuotaExceeded'
|
DOWNLOAD_QUOTA_EXCEEDED = 'downloadQuotaExceeded'
|
||||||
DUPLICATE = 'duplicate'
|
DUPLICATE = 'duplicate'
|
||||||
EVENT_DURATION_EXCEEDS_LIMIT = 'eventDurationExceedsLimit'
|
EVENT_DURATION_EXCEEDS_LIMIT = 'eventDurationExceedsLimit'
|
||||||
|
EVENT_TYPE_RESTRICTION = 'eventTypeRestriction'
|
||||||
|
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE = 'expirationDatesMustBeInTheFuture'
|
||||||
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS = 'expirationDateNotAllowedForSharedDriveMembers'
|
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS = 'expirationDateNotAllowedForSharedDriveMembers'
|
||||||
FAILED_PRECONDITION = 'failedPrecondition'
|
FAILED_PRECONDITION = 'failedPrecondition'
|
||||||
FIELD_IN_USE = 'fieldInUse'
|
FIELD_IN_USE = 'fieldInUse'
|
||||||
@@ -129,6 +135,7 @@ OPERATION_NOT_SUPPORTED = 'operationNotSupported'
|
|||||||
ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED = 'organizerOnNonTeamDriveNotSupported'
|
ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED = 'organizerOnNonTeamDriveNotSupported'
|
||||||
ORGANIZER_ON_NON_TEAMDRIVE_ITEM_NOT_SUPPORTED = 'organizerOnNonTeamDriveItemNotSupported'
|
ORGANIZER_ON_NON_TEAMDRIVE_ITEM_NOT_SUPPORTED = 'organizerOnNonTeamDriveItemNotSupported'
|
||||||
ORGUNIT_NOT_FOUND = 'orgunitNotFound'
|
ORGUNIT_NOT_FOUND = 'orgunitNotFound'
|
||||||
|
OUTSIDE_DOMAIN_MEMBER_CANNOT_CHANGE_TEAMDRIVE_RESTRICTIONS = 'outsideDomainMemberCannotChangeTeamDriveRestrictions'
|
||||||
OWNER_ON_TEAMDRIVE_ITEM_NOT_SUPPORTED = 'ownerOnTeamDriveItemNotSupported'
|
OWNER_ON_TEAMDRIVE_ITEM_NOT_SUPPORTED = 'ownerOnTeamDriveItemNotSupported'
|
||||||
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED = 'ownershipChangeAcrossDomainNotPermitted'
|
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED = 'ownershipChangeAcrossDomainNotPermitted'
|
||||||
PARTICIPANT_IS_NEITHER_ORGANIZER_NOR_ATTENDEE = 'participantIsNeitherOrganizerNorAttendee'
|
PARTICIPANT_IS_NEITHER_ORGANIZER_NOR_ATTENDEE = 'participantIsNeitherOrganizerNorAttendee'
|
||||||
@@ -153,6 +160,7 @@ SERVICE_NOT_AVAILABLE = 'serviceNotAvailable'
|
|||||||
SHARE_IN_NOT_PERMITTED = 'shareInNotPermitted'
|
SHARE_IN_NOT_PERMITTED = 'shareInNotPermitted'
|
||||||
SHARE_OUT_NOT_PERMITTED = 'shareOutNotPermitted'
|
SHARE_OUT_NOT_PERMITTED = 'shareOutNotPermitted'
|
||||||
SHARE_OUT_NOT_PERMITTED_TO_USER = 'shareOutNotPermittedToUser'
|
SHARE_OUT_NOT_PERMITTED_TO_USER = 'shareOutNotPermittedToUser'
|
||||||
|
SHARE_OUT_WARNING = 'shareOutWarning'
|
||||||
SHARING_RATE_LIMIT_EXCEEDED = 'sharingRateLimitExceeded'
|
SHARING_RATE_LIMIT_EXCEEDED = 'sharingRateLimitExceeded'
|
||||||
SHORTCUT_TARGET_INVALID = 'shortcutTargetInvalid'
|
SHORTCUT_TARGET_INVALID = 'shortcutTargetInvalid'
|
||||||
STORAGE_QUOTA_EXCEEDED = 'storageQuotaExceeded'
|
STORAGE_QUOTA_EXCEEDED = 'storageQuotaExceeded'
|
||||||
@@ -184,7 +192,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]
|
||||||
@@ -210,7 +218,8 @@ DRIVE_COPY_THROW_REASONS = DRIVE_ACCESS_THROW_REASONS+[CANNOT_COPY_FILE, BAD_REQ
|
|||||||
STORAGE_QUOTA_EXCEEDED, TEAMDRIVE_FILE_LIMIT_EXCEEDED, TEAMDRIVE_HIERARCHY_TOO_DEEP]
|
STORAGE_QUOTA_EXCEEDED, TEAMDRIVE_FILE_LIMIT_EXCEEDED, TEAMDRIVE_HIERARCHY_TOO_DEEP]
|
||||||
DRIVE_GET_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, DOWNLOAD_QUOTA_EXCEEDED]
|
DRIVE_GET_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, DOWNLOAD_QUOTA_EXCEEDED]
|
||||||
DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST, OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST, OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
||||||
CANNOT_SET_EXPIRATION, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
|
CANNOT_SET_EXPIRATION, CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN,
|
||||||
|
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
|
||||||
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
||||||
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
||||||
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
PUBLISH_OUT_NOT_PERMITTED, SHARE_IN_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED, SHARE_OUT_NOT_PERMITTED_TO_USER,
|
||||||
@@ -222,12 +231,14 @@ DRIVE3_CREATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID, INVALID_SHARING_REQUEST
|
|||||||
FILE_ORGANIZER_NOT_YET_ENABLED_FOR_THIS_TEAMDRIVE,
|
FILE_ORGANIZER_NOT_YET_ENABLED_FOR_THIS_TEAMDRIVE,
|
||||||
FILE_ORGANIZER_ON_FOLDERS_IN_SHARED_DRIVE_ONLY,
|
FILE_ORGANIZER_ON_FOLDERS_IN_SHARED_DRIVE_ONLY,
|
||||||
FILE_ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED,
|
FILE_ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED,
|
||||||
|
CANNOT_MODIFY_INHERITED_PERMISSION,
|
||||||
TEAMDRIVES_FOLDER_SHARING_NOT_SUPPORTED, INVALID_LINK_VISIBILITY, ABUSIVE_CONTENT_RESTRICTION]
|
TEAMDRIVES_FOLDER_SHARING_NOT_SUPPORTED, INVALID_LINK_VISIBILITY, ABUSIVE_CONTENT_RESTRICTION]
|
||||||
DRIVE3_GET_ACL_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
|
DRIVE3_GET_ACL_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
|
||||||
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
|
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
|
||||||
UNKNOWN_ERROR, INVALID]
|
UNKNOWN_ERROR, INVALID]
|
||||||
DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANNOT_REMOVE_OWNER,
|
DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANNOT_REMOVE_OWNER,
|
||||||
CANNOT_SET_EXPIRATION, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
|
CANNOT_SET_EXPIRATION, CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN,
|
||||||
|
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE, EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS,
|
||||||
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED,
|
||||||
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
NOT_FOUND, TEAMDRIVE_DOMAIN_USERS_ONLY_RESTRICTION, TEAMDRIVE_TEAM_MEMBERS_ONLY_RESTRICTION,
|
||||||
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
TARGET_USER_ROLE_LIMITED_BY_LICENSE_RESTRICTION, INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
||||||
@@ -241,12 +252,12 @@ DRIVE3_UPDATE_ACL_THROW_REASONS = [BAD_REQUEST, INVALID_OWNERSHIP_TRANSFER, CANN
|
|||||||
FILE_ORGANIZER_ON_FOLDERS_IN_SHARED_DRIVE_ONLY,
|
FILE_ORGANIZER_ON_FOLDERS_IN_SHARED_DRIVE_ONLY,
|
||||||
FILE_ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED,
|
FILE_ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED,
|
||||||
CANNOT_UPDATE_PERMISSION,
|
CANNOT_UPDATE_PERMISSION,
|
||||||
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION,
|
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION, CANNOT_MODIFY_INHERITED_PERMISSION,
|
||||||
FIELD_NOT_WRITABLE, PERMISSION_NOT_FOUND]
|
FIELD_NOT_WRITABLE, PERMISSION_NOT_FOUND]
|
||||||
DRIVE3_DELETE_ACL_THROW_REASONS = [BAD_REQUEST, CANNOT_REMOVE_OWNER,
|
DRIVE3_DELETE_ACL_THROW_REASONS = [BAD_REQUEST, CANNOT_REMOVE_OWNER,
|
||||||
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION,
|
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION, CANNOT_MODIFY_INHERITED_PERMISSION,
|
||||||
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, SHARING_RATE_LIMIT_EXCEEDED,
|
||||||
NOT_FOUND, PERMISSION_NOT_FOUND]
|
NOT_FOUND, PERMISSION_NOT_FOUND, CANNOT_DELETE_PERMISSION]
|
||||||
DRIVE3_MODIFY_LABEL_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
|
DRIVE3_MODIFY_LABEL_THROW_REASONS = DRIVE_USER_THROW_REASONS+[FILE_NOT_FOUND, NOT_FOUND, FORBIDDEN, INTERNAL_ERROR,
|
||||||
FILE_NEVER_WRITABLE, APPLY_LABEL_FORBIDDEN,
|
FILE_NEVER_WRITABLE, APPLY_LABEL_FORBIDDEN,
|
||||||
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
|
INSUFFICIENT_ADMINISTRATOR_PRIVILEGES, INSUFFICIENT_FILE_PERMISSIONS,
|
||||||
@@ -266,19 +277,20 @@ GROUP_SETTINGS_THROW_REASONS = [NOT_FOUND, GROUP_NOT_FOUND, DOMAIN_NOT_FOUND, DO
|
|||||||
INVALID, INVALID_ARGUMENT, INVALID_PARAMETER, INVALID_ATTRIBUTE_VALUE, INVALID_INPUT,
|
INVALID, INVALID_ARGUMENT, INVALID_PARAMETER, INVALID_ATTRIBUTE_VALUE, INVALID_INPUT,
|
||||||
SERVICE_LIMIT, SERVICE_NOT_AVAILABLE, AUTH_ERROR, REQUIRED]
|
SERVICE_LIMIT, SERVICE_NOT_AVAILABLE, AUTH_ERROR, REQUIRED]
|
||||||
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, PERMISSION_DENIED]
|
||||||
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, PERMISSION_DENIED]
|
||||||
MEMBERS_RETRY_REASONS = [SYSTEM_ERROR, SERVICE_NOT_AVAILABLE]
|
MEMBERS_RETRY_REASONS = [SYSTEM_ERROR, SERVICE_NOT_AVAILABLE]
|
||||||
ORGUNIT_GET_THROW_REASONS = [INVALID_ORGUNIT, ORGUNIT_NOT_FOUND, BACKEND_ERROR, BAD_REQUEST, INVALID_CUSTOMER_ID, LOGIN_REQUIRED]
|
ORGUNIT_GET_THROW_REASONS = [INVALID_ORGUNIT, ORGUNIT_NOT_FOUND, BACKEND_ERROR, BAD_REQUEST, INVALID_CUSTOMER_ID, LOGIN_REQUIRED]
|
||||||
PEOPLE_ACCESS_THROW_REASONS = [SERVICE_NOT_AVAILABLE, FORBIDDEN, PERMISSION_DENIED]
|
PEOPLE_ACCESS_THROW_REASONS = [SERVICE_NOT_AVAILABLE, FORBIDDEN, PERMISSION_DENIED, FAILED_PRECONDITION]
|
||||||
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]
|
TAGMANAGER_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]
|
TASK_THROW_REASONS = [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]
|
||||||
|
|
||||||
@@ -299,6 +311,7 @@ REASON_MESSAGE_MAP = {
|
|||||||
('userId', USER_NOT_FOUND),
|
('userId', USER_NOT_FOUND),
|
||||||
('memberKey', INVALID_MEMBER),
|
('memberKey', INVALID_MEMBER),
|
||||||
('A system error has occurred', SYSTEM_ERROR),
|
('A system error has occurred', SYSTEM_ERROR),
|
||||||
|
('Expiration dates must be in the future', EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE),
|
||||||
('Invalid attribute value', INVALID_ATTRIBUTE_VALUE),
|
('Invalid attribute value', INVALID_ATTRIBUTE_VALUE),
|
||||||
('Invalid Customer Id', INVALID_CUSTOMER_ID),
|
('Invalid Customer Id', INVALID_CUSTOMER_ID),
|
||||||
('Invalid Input: INVALID_OU_ID', INVALID_ORGUNIT),
|
('Invalid Input: INVALID_OU_ID', INVALID_ORGUNIT),
|
||||||
@@ -356,6 +369,8 @@ class abusiveContentRestriction(Exception):
|
|||||||
pass
|
pass
|
||||||
class accessNotConfigured(Exception):
|
class accessNotConfigured(Exception):
|
||||||
pass
|
pass
|
||||||
|
class adminCannotUnsuspend(Exception):
|
||||||
|
pass
|
||||||
class alreadyExists(Exception):
|
class alreadyExists(Exception):
|
||||||
pass
|
pass
|
||||||
class applyLabelForbidden(Exception):
|
class applyLabelForbidden(Exception):
|
||||||
@@ -382,12 +397,16 @@ class cannotCopyFile(Exception):
|
|||||||
pass
|
pass
|
||||||
class cannotDeleteOnlyRevision(Exception):
|
class cannotDeleteOnlyRevision(Exception):
|
||||||
pass
|
pass
|
||||||
|
class cannotDeletePermission(Exception):
|
||||||
|
pass
|
||||||
class cannotDeletePrimaryCalendar(Exception):
|
class cannotDeletePrimaryCalendar(Exception):
|
||||||
pass
|
pass
|
||||||
class cannotDeletePrimarySendAs(Exception):
|
class cannotDeletePrimarySendAs(Exception):
|
||||||
pass
|
pass
|
||||||
class cannotDeleteResourceWithChildren(Exception):
|
class cannotDeleteResourceWithChildren(Exception):
|
||||||
pass
|
pass
|
||||||
|
class cannotModifyInheritedPermission(Exception):
|
||||||
|
pass
|
||||||
class cannotModifyInheritedTeamDrivePermission(Exception):
|
class cannotModifyInheritedTeamDrivePermission(Exception):
|
||||||
pass
|
pass
|
||||||
class cannotModifyRestrictedLabel(Exception):
|
class cannotModifyRestrictedLabel(Exception):
|
||||||
@@ -402,6 +421,8 @@ class cannotRemoveOwner(Exception):
|
|||||||
pass
|
pass
|
||||||
class cannotSetExpiration(Exception):
|
class cannotSetExpiration(Exception):
|
||||||
pass
|
pass
|
||||||
|
class cannotSetExpirationOnAnyoneOrDomain(Exception):
|
||||||
|
pass
|
||||||
class cannotShareGroupsWithLink(Exception):
|
class cannotShareGroupsWithLink(Exception):
|
||||||
pass
|
pass
|
||||||
class cannotShareUsersWithLink(Exception):
|
class cannotShareUsersWithLink(Exception):
|
||||||
@@ -446,6 +467,10 @@ class duplicate(Exception):
|
|||||||
pass
|
pass
|
||||||
class eventDurationExceedsLimit(Exception):
|
class eventDurationExceedsLimit(Exception):
|
||||||
pass
|
pass
|
||||||
|
class eventTypeRestriction(Exception):
|
||||||
|
pass
|
||||||
|
class expirationDatesMustBeInTheFuture(Exception):
|
||||||
|
pass
|
||||||
class expirationDateNotAllowedForSharedDriveMembers(Exception):
|
class expirationDateNotAllowedForSharedDriveMembers(Exception):
|
||||||
pass
|
pass
|
||||||
class failedPrecondition(Exception):
|
class failedPrecondition(Exception):
|
||||||
@@ -558,6 +583,8 @@ class organizerOnNonTeamDriveItemNotSupported(Exception):
|
|||||||
pass
|
pass
|
||||||
class orgunitNotFound(Exception):
|
class orgunitNotFound(Exception):
|
||||||
pass
|
pass
|
||||||
|
class outsideDomainMemberCannotChangeTeamDriveRestrictions(Exception):
|
||||||
|
pass
|
||||||
class ownerOnTeamDriveItemNotSupported(Exception):
|
class ownerOnTeamDriveItemNotSupported(Exception):
|
||||||
pass
|
pass
|
||||||
class ownershipChangeAcrossDomainNotPermitted(Exception):
|
class ownershipChangeAcrossDomainNotPermitted(Exception):
|
||||||
@@ -606,6 +633,8 @@ class shareOutNotPermitted(Exception):
|
|||||||
pass
|
pass
|
||||||
class shareOutNotPermittedToUser(Exception):
|
class shareOutNotPermittedToUser(Exception):
|
||||||
pass
|
pass
|
||||||
|
class shareOutWarning(Exception):
|
||||||
|
pass
|
||||||
class sharingRateLimitExceeded(Exception):
|
class sharingRateLimitExceeded(Exception):
|
||||||
pass
|
pass
|
||||||
class shortcutTargetInvalid(Exception):
|
class shortcutTargetInvalid(Exception):
|
||||||
@@ -663,6 +692,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
ABORTED: aborted,
|
ABORTED: aborted,
|
||||||
ABUSIVE_CONTENT_RESTRICTION: abusiveContentRestriction,
|
ABUSIVE_CONTENT_RESTRICTION: abusiveContentRestriction,
|
||||||
ACCESS_NOT_CONFIGURED: accessNotConfigured,
|
ACCESS_NOT_CONFIGURED: accessNotConfigured,
|
||||||
|
ADMIN_CANNOT_UNSUSPEND: adminCannotUnsuspend,
|
||||||
ALREADY_EXISTS: alreadyExists,
|
ALREADY_EXISTS: alreadyExists,
|
||||||
APPLY_LABEL_FORBIDDEN: applyLabelForbidden,
|
APPLY_LABEL_FORBIDDEN: applyLabelForbidden,
|
||||||
AUTH_ERROR: authError,
|
AUTH_ERROR: authError,
|
||||||
@@ -676,9 +706,11 @@ REASON_EXCEPTION_MAP = {
|
|||||||
CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION: cannotChangeOwnPrimarySubscription,
|
CANNOT_CHANGE_OWN_PRIMARY_SUBSCRIPTION: cannotChangeOwnPrimarySubscription,
|
||||||
CANNOT_COPY_FILE: cannotCopyFile,
|
CANNOT_COPY_FILE: cannotCopyFile,
|
||||||
CANNOT_DELETE_ONLY_REVISION: cannotDeleteOnlyRevision,
|
CANNOT_DELETE_ONLY_REVISION: cannotDeleteOnlyRevision,
|
||||||
|
CANNOT_DELETE_PERMISSION: cannotDeletePermission,
|
||||||
CANNOT_DELETE_PRIMARY_CALENDAR: cannotDeletePrimaryCalendar,
|
CANNOT_DELETE_PRIMARY_CALENDAR: cannotDeletePrimaryCalendar,
|
||||||
CANNOT_DELETE_PRIMARY_SENDAS: cannotDeletePrimarySendAs,
|
CANNOT_DELETE_PRIMARY_SENDAS: cannotDeletePrimarySendAs,
|
||||||
CANNOT_DELETE_RESOURCE_WITH_CHILDREN: cannotDeleteResourceWithChildren,
|
CANNOT_DELETE_RESOURCE_WITH_CHILDREN: cannotDeleteResourceWithChildren,
|
||||||
|
CANNOT_MODIFY_INHERITED_PERMISSION: cannotModifyInheritedPermission,
|
||||||
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION: cannotModifyInheritedTeamDrivePermission,
|
CANNOT_MODIFY_INHERITED_TEAMDRIVE_PERMISSION: cannotModifyInheritedTeamDrivePermission,
|
||||||
CANNOT_MODIFY_RESTRICTED_LABEL: cannotModifyRestrictedLabel,
|
CANNOT_MODIFY_RESTRICTED_LABEL: cannotModifyRestrictedLabel,
|
||||||
CANNOT_MODIFY_VIEWERS_CAN_COPY_CONTENT: cannotModifyViewersCanCopyContent,
|
CANNOT_MODIFY_VIEWERS_CAN_COPY_CONTENT: cannotModifyViewersCanCopyContent,
|
||||||
@@ -686,6 +718,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE: cannotMoveTrashedItemOutOfTeamDrive,
|
CANNOT_MOVE_TRASHED_ITEM_OUT_OF_TEAMDRIVE: cannotMoveTrashedItemOutOfTeamDrive,
|
||||||
CANNOT_REMOVE_OWNER: cannotRemoveOwner,
|
CANNOT_REMOVE_OWNER: cannotRemoveOwner,
|
||||||
CANNOT_SET_EXPIRATION: cannotSetExpiration,
|
CANNOT_SET_EXPIRATION: cannotSetExpiration,
|
||||||
|
CANNOT_SET_EXPIRATION_ON_ANYONE_OR_DOMAIN: cannotSetExpirationOnAnyoneOrDomain,
|
||||||
CANNOT_SHARE_GROUPS_WITHLINK: cannotShareGroupsWithLink,
|
CANNOT_SHARE_GROUPS_WITHLINK: cannotShareGroupsWithLink,
|
||||||
CANNOT_SHARE_USERS_WITHLINK: cannotShareUsersWithLink,
|
CANNOT_SHARE_USERS_WITHLINK: cannotShareUsersWithLink,
|
||||||
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS: cannotShareTeamDriveTopFolderWithAnyoneOrDomains,
|
CANNOT_SHARE_TEAMDRIVE_TOPFOLDER_WITH_ANYONEORDOMAINS: cannotShareTeamDriveTopFolderWithAnyoneOrDomains,
|
||||||
@@ -708,6 +741,8 @@ REASON_EXCEPTION_MAP = {
|
|||||||
DOWNLOAD_QUOTA_EXCEEDED: downloadQuotaExceeded,
|
DOWNLOAD_QUOTA_EXCEEDED: downloadQuotaExceeded,
|
||||||
DUPLICATE: duplicate,
|
DUPLICATE: duplicate,
|
||||||
EVENT_DURATION_EXCEEDS_LIMIT: eventDurationExceedsLimit,
|
EVENT_DURATION_EXCEEDS_LIMIT: eventDurationExceedsLimit,
|
||||||
|
EVENT_TYPE_RESTRICTION: eventTypeRestriction,
|
||||||
|
EXPIRATION_DATES_MUST_BE_IN_THE_FUTURE: expirationDatesMustBeInTheFuture,
|
||||||
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS: expirationDateNotAllowedForSharedDriveMembers,
|
EXPIRATION_DATE_NOT_ALLOWED_FOR_SHARED_DRIVE_MEMBERS: expirationDateNotAllowedForSharedDriveMembers,
|
||||||
FAILED_PRECONDITION: failedPrecondition,
|
FAILED_PRECONDITION: failedPrecondition,
|
||||||
FIELD_IN_USE: fieldInUse,
|
FIELD_IN_USE: fieldInUse,
|
||||||
@@ -764,6 +799,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED: organizerOnNonTeamDriveNotSupported,
|
ORGANIZER_ON_NON_TEAMDRIVE_NOT_SUPPORTED: organizerOnNonTeamDriveNotSupported,
|
||||||
ORGANIZER_ON_NON_TEAMDRIVE_ITEM_NOT_SUPPORTED: organizerOnNonTeamDriveItemNotSupported,
|
ORGANIZER_ON_NON_TEAMDRIVE_ITEM_NOT_SUPPORTED: organizerOnNonTeamDriveItemNotSupported,
|
||||||
ORGUNIT_NOT_FOUND: orgunitNotFound,
|
ORGUNIT_NOT_FOUND: orgunitNotFound,
|
||||||
|
OUTSIDE_DOMAIN_MEMBER_CANNOT_CHANGE_TEAMDRIVE_RESTRICTIONS: outsideDomainMemberCannotChangeTeamDriveRestrictions,
|
||||||
OWNER_ON_TEAMDRIVE_ITEM_NOT_SUPPORTED: ownerOnTeamDriveItemNotSupported,
|
OWNER_ON_TEAMDRIVE_ITEM_NOT_SUPPORTED: ownerOnTeamDriveItemNotSupported,
|
||||||
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED: ownershipChangeAcrossDomainNotPermitted,
|
OWNERSHIP_CHANGE_ACROSS_DOMAIN_NOT_PERMITTED: ownershipChangeAcrossDomainNotPermitted,
|
||||||
PARTICIPANT_IS_NEITHER_ORGANIZER_NOR_ATTENDEE: participantIsNeitherOrganizerNorAttendee,
|
PARTICIPANT_IS_NEITHER_ORGANIZER_NOR_ATTENDEE: participantIsNeitherOrganizerNorAttendee,
|
||||||
@@ -788,6 +824,7 @@ REASON_EXCEPTION_MAP = {
|
|||||||
SHARE_IN_NOT_PERMITTED: shareInNotPermitted,
|
SHARE_IN_NOT_PERMITTED: shareInNotPermitted,
|
||||||
SHARE_OUT_NOT_PERMITTED: shareOutNotPermitted,
|
SHARE_OUT_NOT_PERMITTED: shareOutNotPermitted,
|
||||||
SHARE_OUT_NOT_PERMITTED_TO_USER: shareOutNotPermittedToUser,
|
SHARE_OUT_NOT_PERMITTED_TO_USER: shareOutNotPermittedToUser,
|
||||||
|
SHARE_OUT_WARNING: shareOutWarning,
|
||||||
SHARING_RATE_LIMIT_EXCEEDED: sharingRateLimitExceeded,
|
SHARING_RATE_LIMIT_EXCEEDED: sharingRateLimitExceeded,
|
||||||
SHORTCUT_TARGET_INVALID: shortcutTargetInvalid,
|
SHORTCUT_TARGET_INVALID: shortcutTargetInvalid,
|
||||||
STORAGE_QUOTA_EXCEEDED: storageQuotaExceeded,
|
STORAGE_QUOTA_EXCEEDED: storageQuotaExceeded,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2023 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -23,8 +23,8 @@
|
|||||||
# 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'
|
||||||
# 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
|
||||||
@@ -65,6 +65,8 @@ CSV_OUTPUT_HEADER_DROP_FILTER = 'cohd'
|
|||||||
CSV_OUTPUT_HEADER_FILTER = 'cohf'
|
CSV_OUTPUT_HEADER_FILTER = 'cohf'
|
||||||
# Force output column headers
|
# Force output column headers
|
||||||
CSV_OUTPUT_HEADER_FORCE = 'cofh'
|
CSV_OUTPUT_HEADER_FORCE = 'cofh'
|
||||||
|
# Order output column headers
|
||||||
|
CSV_OUTPUT_HEADER_ORDER = 'coho'
|
||||||
# No escape character in CSV output file
|
# No escape character in CSV output file
|
||||||
CSV_OUTPUT_NO_ESCAPE_CHAR = 'cone'
|
CSV_OUTPUT_NO_ESCAPE_CHAR = 'cone'
|
||||||
# Quote character in CSV output file
|
# Quote character in CSV output file
|
||||||
@@ -80,7 +82,9 @@ CSV_OUTPUT_ROW_FILTER_MODE = 'corm'
|
|||||||
# Limit number of output rows
|
# Limit number of output rows
|
||||||
CSV_OUTPUT_ROW_LIMIT = 'corl'
|
CSV_OUTPUT_ROW_LIMIT = 'corl'
|
||||||
# Add timestamp column to CSV output file
|
# Add timestamp column to CSV output file
|
||||||
CSV_OUTPUT_TIMESTAMP_COLUMN = 'csv_output_timestamp_column'
|
CSV_OUTPUT_TIMESTAMP_COLUMN = 'cotc'
|
||||||
|
# Transpose output rows/columns
|
||||||
|
CSV_OUTPUT_TRANSPOSE = 'cotr'
|
||||||
# Output sort headers
|
# Output sort headers
|
||||||
CSV_OUTPUT_SORT_HEADERS = 'cosh'
|
CSV_OUTPUT_SORT_HEADERS = 'cosh'
|
||||||
# CSV todrive options
|
# CSV todrive options
|
||||||
@@ -201,6 +205,7 @@ REDIRECT_WRITE_HEADER = 'rdwh'
|
|||||||
REDIRECT_MULTIPROCESS = 'rdmp'
|
REDIRECT_MULTIPROCESS = 'rdmp'
|
||||||
REDIRECT_QUEUE = 'rdq'
|
REDIRECT_QUEUE = 'rdq'
|
||||||
REDIRECT_QUEUE_NAME = 'name'
|
REDIRECT_QUEUE_NAME = 'name'
|
||||||
|
REDIRECT_QUEUE_CLEAR_ROW_FILTERS = 'clearRowFilters'
|
||||||
REDIRECT_QUEUE_TODRIVE = 'todrive'
|
REDIRECT_QUEUE_TODRIVE = 'todrive'
|
||||||
REDIRECT_QUEUE_CSVPF = 'csvpf'
|
REDIRECT_QUEUE_CSVPF = 'csvpf'
|
||||||
REDIRECT_QUEUE_DATA = 'rows'
|
REDIRECT_QUEUE_DATA = 'rows'
|
||||||
@@ -235,6 +240,7 @@ Globals = {
|
|||||||
CSV_OUTPUT_HEADER_DROP_FILTER: [],
|
CSV_OUTPUT_HEADER_DROP_FILTER: [],
|
||||||
CSV_OUTPUT_HEADER_FILTER: [],
|
CSV_OUTPUT_HEADER_FILTER: [],
|
||||||
CSV_OUTPUT_HEADER_FORCE: [],
|
CSV_OUTPUT_HEADER_FORCE: [],
|
||||||
|
CSV_OUTPUT_HEADER_ORDER: [],
|
||||||
CSV_OUTPUT_NO_ESCAPE_CHAR: None,
|
CSV_OUTPUT_NO_ESCAPE_CHAR: None,
|
||||||
CSV_OUTPUT_QUOTE_CHAR: None,
|
CSV_OUTPUT_QUOTE_CHAR: None,
|
||||||
CSV_OUTPUT_ROW_DROP_FILTER: [],
|
CSV_OUTPUT_ROW_DROP_FILTER: [],
|
||||||
@@ -244,6 +250,7 @@ Globals = {
|
|||||||
CSV_OUTPUT_ROW_LIMIT: 0,
|
CSV_OUTPUT_ROW_LIMIT: 0,
|
||||||
CSV_OUTPUT_SORT_HEADERS: [],
|
CSV_OUTPUT_SORT_HEADERS: [],
|
||||||
CSV_OUTPUT_TIMESTAMP_COLUMN: None,
|
CSV_OUTPUT_TIMESTAMP_COLUMN: None,
|
||||||
|
CSV_OUTPUT_TRANSPOSE: False,
|
||||||
CSV_TODRIVE: {},
|
CSV_TODRIVE: {},
|
||||||
CURRENT_API_SERVICES: {},
|
CURRENT_API_SERVICES: {},
|
||||||
CURRENT_CLIENT_API: None,
|
CURRENT_CLIENT_API: None,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2024 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -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 "OK"
|
||||||
|
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.
|
||||||
@@ -96,7 +118,7 @@ Your workspace is configured to disable service account private key uploads.
|
|||||||
|
|
||||||
Please go to:
|
Please go to:
|
||||||
|
|
||||||
https://github.com/taers232c/GAMADV-XTD3/wiki/Authorization#authorize-service-account-key-uploads
|
https://github.com/GAM-team/GAM/wiki/Authorization#authorize-service-account-key-uploads
|
||||||
|
|
||||||
Follow the steps to allow a service account private key upload for the project ({0}) just created.
|
Follow the steps to allow a service account private key upload for the project ({0}) just created.
|
||||||
Once those steps are completed, you can continue with your project authentication.
|
Once those steps are completed, you can continue with your project authentication.
|
||||||
@@ -118,12 +140,13 @@ SERVICE_ACCOUNT_PRIVATE_KEY_AGE = 'Service Account Private Key age: {0} days'
|
|||||||
SERVICE_ACCOUNT_SKIPPING_KEY_AGE_CHECK = 'Skipping Private Key age check: {0} rotation not necessary'
|
SERVICE_ACCOUNT_SKIPPING_KEY_AGE_CHECK = 'Skipping Private Key age check: {0} rotation not necessary'
|
||||||
UPDATE_PROJECT_TO_VIEW_MANAGE_SAKEYS = 'Please run "gam update project" to view/manage service account keys'
|
UPDATE_PROJECT_TO_VIEW_MANAGE_SAKEYS = 'Please run "gam update project" to view/manage service account keys'
|
||||||
DOMAIN_WIDE_DELEGATION_AUTHENTICATION = 'Domain-wide Delegation authentication'
|
DOMAIN_WIDE_DELEGATION_AUTHENTICATION = 'Domain-wide Delegation authentication'
|
||||||
|
DEPRECATED_SCOPES = 'Deprecated scopes that GAM should NEVER have DwD access to'
|
||||||
SCOPE_AUTHORIZATION_PASSED = '''All scopes PASSED!
|
SCOPE_AUTHORIZATION_PASSED = '''All scopes PASSED!
|
||||||
|
|
||||||
Service Account Client name: {0} is fully authorized.
|
Service Account Client name: {0} is fully authorized.
|
||||||
'''
|
'''
|
||||||
SCOPE_AUTHORIZATION_UPDATE_PASSED = '''All scopes PASSED!
|
SCOPE_AUTHORIZATION_UPDATE_PASSED = '''All scopes PASSED!
|
||||||
To authorize them (in case some scopes were unselected), please go to the following link in your browser:
|
To update authorization (in case some scopes were unselected), please go to the following link in your browser:
|
||||||
{0}
|
{0}
|
||||||
{1}
|
{1}
|
||||||
|
|
||||||
@@ -134,8 +157,8 @@ Click AUTHORIZE
|
|||||||
When the box closes you're done
|
When the box closes you're done
|
||||||
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
After authorizing it may take some time for this test to pass so wait a few moments and then try this command again.
|
||||||
'''
|
'''
|
||||||
SCOPE_AUTHORIZATION_FAILED = '''Some scopes FAILED!
|
SCOPE_AUTHORIZATION_FAILED = '''Some scopes FAILED or should be DISABLED!
|
||||||
To authorize them, please go to the following link in your browser:
|
To update authorization, please go to the following link in your browser:
|
||||||
{0}
|
{0}
|
||||||
{1}
|
{1}
|
||||||
|
|
||||||
@@ -161,8 +184,8 @@ ALREADY_EXISTS_IN_TARGET_FOLDER = 'Already exists in {0}: {1}'
|
|||||||
ALREADY_EXISTS_USE_MERGE_ARGUMENT = 'Already exists; use the "merge" argument to merge the labels'
|
ALREADY_EXISTS_USE_MERGE_ARGUMENT = 'Already exists; use the "merge" argument to merge the labels'
|
||||||
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: {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: {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'
|
||||||
@@ -265,6 +288,7 @@ GAM_OUT_OF_MEMORY = 'GAM has run out of memory. If this is a large Google Worksp
|
|||||||
GENERATING_NEW_PRIVATE_KEY = 'Generating new private key'
|
GENERATING_NEW_PRIVATE_KEY = 'Generating new private key'
|
||||||
GETTING = 'Getting'
|
GETTING = 'Getting'
|
||||||
GETTING_ALL = 'Getting all'
|
GETTING_ALL = 'Getting all'
|
||||||
|
GRANTING_RIGHTS_TO_ROTATE_ITS_OWN_PRIVATE_KEY = '{0} rights to rotate its own private key'
|
||||||
GOOGLE_DELEGATION_ERROR = 'Google delegation error, delegator and delegate both exist and are valid for delegation'
|
GOOGLE_DELEGATION_ERROR = 'Google delegation error, delegator and delegate both exist and are valid for delegation'
|
||||||
GOT = 'Got'
|
GOT = 'Got'
|
||||||
GROUP_MAPS_TO_MULTIPLE_OUS = 'File: {0}, Group: {1} references multiple OUs: {2}'
|
GROUP_MAPS_TO_MULTIPLE_OUS = 'File: {0}, Group: {1} references multiple OUs: {2}'
|
||||||
@@ -272,13 +296,12 @@ GROUP_MAPS_TO_OU_INVALID_ROW = 'File: {0}, Invalid row, must contain non-blank <
|
|||||||
GUARDIAN_INVITATION_STATUS_NOT_PENDING = 'Guardian invitation status is not PENDING'
|
GUARDIAN_INVITATION_STATUS_NOT_PENDING = 'Guardian invitation status is not PENDING'
|
||||||
HAS_CHILD_ORGS = 'Has child {0}'
|
HAS_CHILD_ORGS = 'Has child {0}'
|
||||||
HAS_INVALID_FORMAT = '{0}: {1}, Has invalid format'
|
HAS_INVALID_FORMAT = '{0}: {1}, Has invalid format'
|
||||||
HAS_RIGHTS_TO_ROTATE_OWN_PRIVATE_KEY = 'Giving account {0} rights to rotate {1} private key'
|
|
||||||
HEADER_NOT_FOUND_IN_CSV_HEADERS = 'Header "{0}" not found in CSV headers of "{1}".'
|
HEADER_NOT_FOUND_IN_CSV_HEADERS = 'Header "{0}" not found in CSV headers of "{1}".'
|
||||||
HELP_SYNTAX = 'Help: Syntax in file {0}\n'
|
HELP_SYNTAX = 'Help: Syntax in file {0}\n'
|
||||||
HELP_WIKI = 'Help: Documentation is at {0}\n'
|
HELP_WIKI = 'Help: Documentation is at {0}\n'
|
||||||
IGNORED = 'Ignored'
|
IGNORED = 'Ignored'
|
||||||
INSTRUCTIONS_CLIENT_SECRETS_JSON = 'Please run\n\ngam create|use project\ngam oauth create\n\nto create and authorize a Client account.\n'
|
INSTRUCTIONS_CLIENT_SECRETS_JSON = 'Please run\n\ngam create|use project\ngam oauth create\n\nto create and authorize a Client account.\n'
|
||||||
INSTRUCTIONS_OAUTH2SERVICE_JSON = 'Please run\n\ngam create|use project\ngam user <user> check serviceaccount\n\nto create and authorize a Service account.\n'
|
INSTRUCTIONS_OAUTH2SERVICE_JSON = 'Please run\n\ngam create|use project\ngam user <user> update serviceaccount\n\nto create and authorize a Service account.\n'
|
||||||
INSUFFICIENT_PERMISSIONS_TO_PERFORM_TASK = 'Insufficient permissions to perform this task'
|
INSUFFICIENT_PERMISSIONS_TO_PERFORM_TASK = 'Insufficient permissions to perform this task'
|
||||||
INTER_BATCH_WAIT_INCREASED = 'inter_batch_wait increased to {0:.2f}'
|
INTER_BATCH_WAIT_INCREASED = 'inter_batch_wait increased to {0:.2f}'
|
||||||
INVALID = 'Invalid'
|
INVALID = 'Invalid'
|
||||||
@@ -286,7 +309,9 @@ INVALID_ALIAS = 'Invalid Alias'
|
|||||||
INVALID_ATTENDEE_CHANGE = 'Invalid attendee change "{0}"'
|
INVALID_ATTENDEE_CHANGE = 'Invalid attendee change "{0}"'
|
||||||
INVALID_CHARSET = 'Invalid charset "{0}"'
|
INVALID_CHARSET = 'Invalid charset "{0}"'
|
||||||
INVALID_DATE_TIME_RANGE = '{0} {1} must be greater than/equal to {2} {3}'
|
INVALID_DATE_TIME_RANGE = '{0} {1} must be greater than/equal to {2} {3}'
|
||||||
|
INVALID_EMOJI_NAME = '{0} does not match pattern :[0-9a-z_-]:'
|
||||||
INVALID_ENTITY = 'Invalid {0}, {1}'
|
INVALID_ENTITY = 'Invalid {0}, {1}'
|
||||||
|
INVALID_EVENT_TIMERANGE = '{0} {1} must be less than {2}'
|
||||||
INVALID_FILE_SELECTION_WITH_ADMIN_ACCESS = 'Invalid file selection with adminaccess|asadmin'
|
INVALID_FILE_SELECTION_WITH_ADMIN_ACCESS = 'Invalid file selection with adminaccess|asadmin'
|
||||||
INVALID_GROUP = 'Invalid Group'
|
INVALID_GROUP = 'Invalid Group'
|
||||||
INVALID_HTTP_HEADER = 'Invalid http header data: {0}'
|
INVALID_HTTP_HEADER = 'Invalid http header data: {0}'
|
||||||
@@ -300,7 +325,7 @@ INVALID_NUMBER_OF_CHAT_SPACE_MEMBERS = '{0} type {1} number of members, {2}, mus
|
|||||||
INVALID_ORGUNIT = 'Invalid Organizational Unit'
|
INVALID_ORGUNIT = 'Invalid Organizational Unit'
|
||||||
INVALID_PATH = 'Invalid Path'
|
INVALID_PATH = 'Invalid Path'
|
||||||
INVALID_PERMISSION_ATTRIBUTE_TYPE = 'permission attribute {0} not allowed with type {1}'
|
INVALID_PERMISSION_ATTRIBUTE_TYPE = 'permission attribute {0} not allowed with type {1}'
|
||||||
INVALID_REGION = 'See: https://github.com/taers232c/GAMADV-XTD3/wiki/Context-Aware-Access-Levels#caa-region-codes'
|
INVALID_REGION = 'See: https://github.com/GAM-team/GAM/wiki/Context-Aware-Access-Levels#caa-region-codes'
|
||||||
INVALID_QUERY = 'Invalid Query'
|
INVALID_QUERY = 'Invalid Query'
|
||||||
INVALID_RE = 'Invalid RE'
|
INVALID_RE = 'Invalid RE'
|
||||||
INVALID_REQUEST = 'Invalid Request'
|
INVALID_REQUEST = 'Invalid Request'
|
||||||
@@ -400,7 +425,7 @@ NO_LABELS_TO_PROCESS = 'No Labels to process'
|
|||||||
NO_MESSAGES_WITH_LABEL = 'No Messages with Label'
|
NO_MESSAGES_WITH_LABEL = 'No Messages with Label'
|
||||||
NO_PARENTS_TO_CONVERT_TO_SHORTCUTS = 'No parents to convert to shortcuts'
|
NO_PARENTS_TO_CONVERT_TO_SHORTCUTS = 'No parents to convert to shortcuts'
|
||||||
NO_REPORT_AVAILABLE = 'No {0} report available.'
|
NO_REPORT_AVAILABLE = 'No {0} report available.'
|
||||||
NO_SCOPES_FOR_API = 'There are no scopes authorized for the {0}'
|
NO_SCOPES_FOR_API = 'There are no scopes authorized for the API(s): {0}'
|
||||||
NO_SERIAL_NUMBERS_SPECIFIED = 'No serial numbers specified'
|
NO_SERIAL_NUMBERS_SPECIFIED = 'No serial numbers specified'
|
||||||
NO_SSO_PROFILE_MATCHES = 'No SSO profile matches display name {0}'
|
NO_SSO_PROFILE_MATCHES = 'No SSO profile matches display name {0}'
|
||||||
NO_SSO_PROFILE_ASSIGNED = 'No SSO profile assigned to {0} {1}'
|
NO_SSO_PROFILE_ASSIGNED = 'No SSO profile assigned to {0} {1}'
|
||||||
@@ -446,6 +471,10 @@ REFUSING_TO_DEPROVISION_DEVICES = 'Refusing to deprovision {0} devices because a
|
|||||||
REPLY_TO_CUSTOM_REQUIRES_EMAIL_ADDRESS = 'replyto REPLY_TO_CUSTOM requires customReplyTo <EmailAddress>'
|
REPLY_TO_CUSTOM_REQUIRES_EMAIL_ADDRESS = 'replyto REPLY_TO_CUSTOM requires customReplyTo <EmailAddress>'
|
||||||
REQUEST_COMPLETED_NO_FILES = 'Request completed but no results/files were returned, try requesting again'
|
REQUEST_COMPLETED_NO_FILES = 'Request completed but no results/files were returned, try requesting again'
|
||||||
REQUEST_NOT_COMPLETE = 'Request needs to be completed before downloading, current status is: {0}'
|
REQUEST_NOT_COMPLETE = 'Request needs to be completed before downloading, current status is: {0}'
|
||||||
|
RERUN_THE_COMMAND_AND_SPECIFY_A_NEW_SANAME = """
|
||||||
|
Re-run the command specify a new service account name with: saname <ServiceAccountName>
|
||||||
|
See: https://github.com/GAM-team/GAM/wiki/Authorization#advanced-use
|
||||||
|
"""
|
||||||
RESOURCE_CAPACITY_FLOOR_REQUIRED = 'Options "capacity <Number>" (<Number> > 0) and "floor <String>" required'
|
RESOURCE_CAPACITY_FLOOR_REQUIRED = 'Options "capacity <Number>" (<Number> > 0) and "floor <String>" required'
|
||||||
RESOURCE_FLOOR_REQUIRED = 'Option "floor <String>" required'
|
RESOURCE_FLOOR_REQUIRED = 'Option "floor <String>" required'
|
||||||
RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET = 'Results are too large for Google Spreadsheets. Uploading as a regular CSV file.'
|
RESULTS_TOO_LARGE_FOR_GOOGLE_SPREADSHEET = 'Results are too large for Google Spreadsheets. Uploading as a regular CSV file.'
|
||||||
@@ -457,7 +486,10 @@ SCHEMA_WOULD_HAVE_NO_FIELDS = '{0} would have no {1}'
|
|||||||
SELECTED = 'Selected'
|
SELECTED = 'Selected'
|
||||||
SERVICE_NOT_APPLICABLE = 'Service not applicable/Does not exist'
|
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'
|
||||||
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}'
|
||||||
@@ -475,11 +507,15 @@ TO = 'To'
|
|||||||
TO_LC = 'to'
|
TO_LC = 'to'
|
||||||
TO_MAXIMUM_OF = 'to maximum of'
|
TO_MAXIMUM_OF = 'to maximum of'
|
||||||
TO_SET_UP_GOOGLE_CHAT = """
|
TO_SET_UP_GOOGLE_CHAT = """
|
||||||
To set up Google Chat for your API project, please go to:
|
To set up Google Chat for your current project, please go to:
|
||||||
|
|
||||||
{0}
|
{0}
|
||||||
|
|
||||||
and complete all fields.
|
and follow the instructions at:
|
||||||
|
|
||||||
|
https://github.com/GAM-team/GAM/wiki/Chat-Bot#set-up-a-chat-bot
|
||||||
|
|
||||||
|
You'll use projects/{1}/topics/no-topic in Connection settings Cloud Pub/Sub Topic Name
|
||||||
"""
|
"""
|
||||||
TOTAL_ITEMS_IN_ENTITY = 'Total {0} in {1}'
|
TOTAL_ITEMS_IN_ENTITY = 'Total {0} in {1}'
|
||||||
TRIMMED_MESSAGE_FROM_LENGTH_TO_MAXIMUM = 'Trimmed message of length {0} to maximum length {1}'
|
TRIMMED_MESSAGE_FROM_LENGTH_TO_MAXIMUM = 'Trimmed message of length {0} to maximum length {1}'
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2023 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
# Products/SKUs
|
# Products/SKUs
|
||||||
_PRODUCTS = {
|
_PRODUCTS = {
|
||||||
'101001': 'Cloud Identity Free',
|
'101001': 'Cloud Identity',
|
||||||
'101005': 'Cloud Identity Premium',
|
'101005': 'Cloud Identity Premium',
|
||||||
'101031': 'Google Workspace for Education',
|
'101031': 'Google Workspace for Education',
|
||||||
'101033': 'Google Voice',
|
'101033': 'Google Voice',
|
||||||
@@ -47,6 +47,10 @@ _SKUS = {
|
|||||||
'product': '101001', 'aliases': ['identity', 'cloudidentity'], 'displayName': 'Cloud Identity'},
|
'product': '101001', 'aliases': ['identity', 'cloudidentity'], 'displayName': 'Cloud Identity'},
|
||||||
'1010050001': {
|
'1010050001': {
|
||||||
'product': '101005', 'aliases': ['identitypremium', 'cloudidentitypremium'], 'displayName': 'Cloud Identity Premium'},
|
'product': '101005', 'aliases': ['identitypremium', 'cloudidentitypremium'], 'displayName': 'Cloud Identity Premium'},
|
||||||
|
'1010070001': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['gwef', 'workspaceeducationfundamentals'], 'displayName': 'Google Workspace for Education Fundamentals'},
|
||||||
|
'1010070004': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['gwegmo', 'workspaceeducationgmailonly'], 'displayName': 'Google Workspace for Education Gmail Only'},
|
||||||
'1010310002': {
|
'1010310002': {
|
||||||
'product': '101031', 'aliases': ['gsefe', 'e4e', 'gsuiteenterpriseeducation'], 'displayName': 'Google Workspace for Education Plus - Legacy'},
|
'product': '101031', 'aliases': ['gsefe', 'e4e', 'gsuiteenterpriseeducation'], 'displayName': 'Google Workspace for Education Plus - Legacy'},
|
||||||
'1010310003': {
|
'1010310003': {
|
||||||
@@ -83,6 +87,8 @@ _SKUS = {
|
|||||||
'product': '101038', 'aliases': ['appsheetplus', 'appsheetenterpriseplus'], 'displayName': 'AppSheet Enterprise Plus'},
|
'product': '101038', 'aliases': ['appsheetplus', 'appsheetenterpriseplus'], 'displayName': 'AppSheet Enterprise Plus'},
|
||||||
'1010390001': {
|
'1010390001': {
|
||||||
'product': '101039', 'aliases': ['assuredcontrols'], 'displayName': 'Assured Controls'},
|
'product': '101039', 'aliases': ['assuredcontrols'], 'displayName': 'Assured Controls'},
|
||||||
|
'1010390002': {
|
||||||
|
'product': '101039', 'aliases': ['assuredcontrolsplus'], 'displayName': 'Assured Controls Plus'},
|
||||||
'1010400001': {
|
'1010400001': {
|
||||||
'product': '101040', 'aliases': ['beyondcorp', 'beyondcorpenterprise', 'bce', 'cep', 'chromeenterprisepremium'], 'displayName': 'Chrome Enterprise Premium'},
|
'product': '101040', 'aliases': ['beyondcorp', 'beyondcorpenterprise', 'bce', 'cep', 'chromeenterprisepremium'], 'displayName': 'Chrome Enterprise Premium'},
|
||||||
'1010430001': {
|
'1010430001': {
|
||||||
@@ -101,6 +107,8 @@ _SKUS = {
|
|||||||
'product': '101047', 'aliases': ['aisecurity'], 'displayName': 'AI Security'},
|
'product': '101047', 'aliases': ['aisecurity'], 'displayName': 'AI Security'},
|
||||||
'1010470007': {
|
'1010470007': {
|
||||||
'product': '101047', 'aliases': ['aimeetingsandmessaging'], 'displayName': 'AI Meetings and Messaging'},
|
'product': '101047', 'aliases': ['aimeetingsandmessaging'], 'displayName': 'AI Meetings and Messaging'},
|
||||||
|
'1010470008': {
|
||||||
|
'product': '101047', 'aliases': ['geminiultra'], 'displayName': 'Google AI Ultra for Business'},
|
||||||
'1010490001': {
|
'1010490001': {
|
||||||
'product': '101049', 'aliases': ['eeu'], 'displayName': 'Endpoint Education Upgrade'},
|
'product': '101049', 'aliases': ['eeu'], 'displayName': 'Endpoint Education Upgrade'},
|
||||||
'1010500001': {
|
'1010500001': {
|
||||||
@@ -111,6 +119,8 @@ _SKUS = {
|
|||||||
'product': 'Google-Apps', 'aliases': ['standard', 'free'], 'displayName': 'G Suite Legacy'},
|
'product': 'Google-Apps', 'aliases': ['standard', 'free'], 'displayName': 'G Suite Legacy'},
|
||||||
'Google-Apps-For-Business': {
|
'Google-Apps-For-Business': {
|
||||||
'product': 'Google-Apps', 'aliases': ['gafb', 'gafw', 'basic', 'gsuitebasic'], 'displayName': 'G Suite Basic'},
|
'product': 'Google-Apps', 'aliases': ['gafb', 'gafw', 'basic', 'gsuitebasic'], 'displayName': 'G Suite Basic'},
|
||||||
|
'Google-Apps-For-Education': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['gafe', 'gsuiteeducation', 'gsuiteedu'], 'displayName': 'Google Workspace for Education - Fundamentals'},
|
||||||
'Google-Apps-For-Government': {
|
'Google-Apps-For-Government': {
|
||||||
'product': 'Google-Apps', 'aliases': ['gafg', 'gsuitegovernment', 'gsuitegov'], 'displayName': 'Google Workspace Government'},
|
'product': 'Google-Apps', 'aliases': ['gafg', 'gsuitegovernment', 'gsuitegov'], 'displayName': 'Google Workspace Government'},
|
||||||
'Google-Apps-For-Postini': {
|
'Google-Apps-For-Postini': {
|
||||||
@@ -121,7 +131,7 @@ _SKUS = {
|
|||||||
'product': 'Google-Apps', 'aliases': ['gau', 'gsb', 'unlimited', 'gsuitebusiness'], 'displayName': 'G Suite Business'},
|
'product': 'Google-Apps', 'aliases': ['gau', 'gsb', 'unlimited', 'gsuitebusiness'], 'displayName': 'G Suite Business'},
|
||||||
'1010020020': {
|
'1010020020': {
|
||||||
'product': 'Google-Apps', 'aliases': ['gae', 'gse', 'enterprise', 'gsuiteenterprise',
|
'product': 'Google-Apps', 'aliases': ['gae', 'gse', 'enterprise', 'gsuiteenterprise',
|
||||||
'wsentplus', 'workspaceenterpriseplus'], 'displayName': 'Google Workspace Enterprise Plus'},
|
'wsentplus', 'workspaceenterpriseplus'], 'displayName': 'Google Workspace Enterprise Plus (formerly G Suite Enterprise)'},
|
||||||
'1010020025': {
|
'1010020025': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsbizplus', 'workspacebusinessplus'], 'displayName': 'Google Workspace Business Plus'},
|
'product': 'Google-Apps', 'aliases': ['wsbizplus', 'workspacebusinessplus'], 'displayName': 'Google Workspace Business Plus'},
|
||||||
'1010020026': {
|
'1010020026': {
|
||||||
@@ -136,6 +146,8 @@ _SKUS = {
|
|||||||
'product': 'Google-Apps', 'aliases': ['wsflw', 'workspacefrontline', 'workspacefrontlineworker'], 'displayName': 'Google Workspace Frontline Starter'},
|
'product': 'Google-Apps', 'aliases': ['wsflw', 'workspacefrontline', 'workspacefrontlineworker'], 'displayName': 'Google Workspace Frontline Starter'},
|
||||||
'1010020031': {
|
'1010020031': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsflwstan', 'workspacefrontlinestan', 'workspacefrontlineworkerstan'], 'displayName': 'Google Workspace Frontline Standard'},
|
'product': 'Google-Apps', 'aliases': ['wsflwstan', 'workspacefrontlinestan', 'workspacefrontlineworkerstan'], 'displayName': 'Google Workspace Frontline Standard'},
|
||||||
|
'1010020034': {
|
||||||
|
'product': 'Google-Apps', 'aliases': ['wsflwplus', 'workspacefrontlineplus', 'workspacefrontlineworkerplus'], 'displayName': 'Google Workspace Frontline Plus'},
|
||||||
'1010340001': {
|
'1010340001': {
|
||||||
'product': '101034', 'aliases': ['gseau', 'enterprisearchived', 'gsuiteenterprisearchived'], 'displayName': 'Google Workspace Enterprise Plus - Archived User'},
|
'product': '101034', 'aliases': ['gseau', 'enterprisearchived', 'gsuiteenterprisearchived'], 'displayName': 'Google Workspace Enterprise Plus - Archived User'},
|
||||||
'1010340002': {
|
'1010340002': {
|
||||||
@@ -148,14 +160,16 @@ _SKUS = {
|
|||||||
'product': '101034', 'aliases': ['wsbizstarterarchived', 'workspacebusinessstarterarchived'], 'displayName': 'Google Workspace Business Starter - Archived User'},
|
'product': '101034', 'aliases': ['wsbizstarterarchived', 'workspacebusinessstarterarchived'], 'displayName': 'Google Workspace Business Starter - Archived User'},
|
||||||
'1010340006': {
|
'1010340006': {
|
||||||
'product': '101034', 'aliases': ['wsbizstanarchived', 'workspacebusinessstanarchived'], 'displayName': 'Google Workspace Business Standard - Archived User'},
|
'product': '101034', 'aliases': ['wsbizstanarchived', 'workspacebusinessstanarchived'], 'displayName': 'Google Workspace Business Standard - Archived User'},
|
||||||
|
'1010340007': {
|
||||||
|
'product': '101034', 'aliases': ['gwefau', 'gwefarchived', 'workspaceeducationfundamentalsarchived'], 'displayName': 'Google Workspace for Education Fundamentals - Archived User'},
|
||||||
'1010060001': {
|
'1010060001': {
|
||||||
'product': '101006', 'aliases': ['gsuiteessentials', 'essentials',
|
'product': '101006', 'aliases': ['gsuiteessentials', 'essentials',
|
||||||
'd4e', 'driveenterprise', 'drive4enterprise',
|
'd4e', 'driveenterprise', 'drive4enterprise',
|
||||||
'wsess', 'workspaceesentials'], 'displayName': 'Google Workspace Essentials'},
|
'wsess', 'workspaceesentials'], 'displayName': 'Google Workspace Essentials (formerly G Suite Essentials)'},
|
||||||
'1010060003': {
|
'1010060003': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsentess', 'workspaceenterpriseessentials'], 'displayName': 'Google Workspace Enterprise Essentials'},
|
'product': 'Google-Apps', 'aliases': ['wsentess', 'workspaceenterpriseessentials'], 'displayName': 'Google Workspace Enterprise Essentials'},
|
||||||
'1010060005': {
|
'1010060005': {
|
||||||
'product': 'Google-Apps', 'aliases': ['wsessplus', 'workspaceessentialsplus'], 'displayName': 'Google Workspace Essentials Plus'},
|
'product': 'Google-Apps', 'aliases': ['wsessplus', 'workspaceessentialsplus'], 'displayName': 'Google Workspace Enterprise Essentials Plus'},
|
||||||
'Google-Drive-storage-20GB': {
|
'Google-Drive-storage-20GB': {
|
||||||
'product': 'Google-Drive-storage', 'aliases': ['drive20gb', '20gb', 'googledrivestorage20gb'], 'displayName': 'Google Drive Storage 20GB'},
|
'product': 'Google-Drive-storage', 'aliases': ['drive20gb', '20gb', 'googledrivestorage20gb'], 'displayName': 'Google Drive Storage 20GB'},
|
||||||
'Google-Drive-storage-50GB': {
|
'Google-Drive-storage-50GB': {
|
||||||
@@ -182,6 +196,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,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright (C) 2023 Ross Scroggs All Rights Reserved.
|
# Copyright (C) 2025 Ross Scroggs All Rights Reserved.
|
||||||
#
|
#
|
||||||
# All Rights Reserved.
|
# All Rights Reserved.
|
||||||
#
|
#
|
||||||
@@ -20,14 +20,19 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
GAM_VER_LIBS = ['cryptography',
|
GAM_VER_LIBS = [
|
||||||
'filelock',
|
'chardet',
|
||||||
'google-api-python-client',
|
'cryptography',
|
||||||
'google-auth-httplib2',
|
'filelock',
|
||||||
'google-auth-oauthlib',
|
'google-api-python-client',
|
||||||
'google-auth',
|
'google-auth-httplib2',
|
||||||
'httplib2',
|
'google-auth-oauthlib',
|
||||||
'passlib',
|
'google-auth',
|
||||||
'python-dateutil',
|
'lxml',
|
||||||
'yubikey-manager',
|
'httplib2',
|
||||||
]
|
'passlib',
|
||||||
|
'pathvalidate',
|
||||||
|
'pyscard',
|
||||||
|
'python-dateutil',
|
||||||
|
'yubikey-manager',
|
||||||
|
]
|
||||||
|
|||||||
@@ -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.164.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
BIN
src/license.rtf
BIN
src/license.rtf
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
accesscontextmanager.googleapis.com
|
|
||||||
admin.googleapis.com
|
|
||||||
alertcenter.googleapis.com
|
|
||||||
calendar-json.googleapis.com
|
|
||||||
chat.googleapis.com
|
|
||||||
chromemanagement.googleapis.com
|
|
||||||
chromepolicy.googleapis.com
|
|
||||||
classroom.googleapis.com
|
|
||||||
cloudidentity.googleapis.com
|
|
||||||
cloudresourcemanager.googleapis.com
|
|
||||||
contacts.googleapis.com
|
|
||||||
drive.googleapis.com
|
|
||||||
driveactivity.googleapis.com
|
|
||||||
iap.googleapis.com
|
|
||||||
gmail.googleapis.com
|
|
||||||
groupssettings.googleapis.com
|
|
||||||
iam.googleapis.com
|
|
||||||
licensing.googleapis.com
|
|
||||||
reseller.googleapis.com
|
|
||||||
sheets.googleapis.com
|
|
||||||
siteverification.googleapis.com
|
|
||||||
storage-api.googleapis.com
|
|
||||||
vault.googleapis.com
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
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
|
|
||||||
yubikey-manager>=5.0
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
{
|
|
||||||
"basePath": "",
|
|
||||||
"baseUrl": "https://www.googleapis.com/service_accounts/v1",
|
|
||||||
"canonicalName": "serviceaccountlookup",
|
|
||||||
"description": "Pseudo-API to lookup public certificates for a service account anonymously",
|
|
||||||
"discoveryVersion": "v1",
|
|
||||||
"documentationLink": "https://example.com/",
|
|
||||||
"fullyEncodeReservedExpansion": true,
|
|
||||||
"icons": {
|
|
||||||
"x16": "http://www.google.com/images/icons/product/search-16.gif",
|
|
||||||
"x32": "http://www.google.com/images/icons/product/search-32.gif"
|
|
||||||
},
|
|
||||||
"id": "serviceaccountlookup:v1",
|
|
||||||
"kind": "discovery#restDescription",
|
|
||||||
"name": "serviceaccountlookup",
|
|
||||||
"ownerDomain": "google.com",
|
|
||||||
"ownerName": "Google",
|
|
||||||
"packagePath": "admin",
|
|
||||||
"parameters": {
|
|
||||||
"$.xgafv": {
|
|
||||||
"description": "V1 error format.",
|
|
||||||
"enum": [
|
|
||||||
"1",
|
|
||||||
"2"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"v1 error format",
|
|
||||||
"v2 error format"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"access_token": {
|
|
||||||
"description": "OAuth access token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"alt": {
|
|
||||||
"default": "json",
|
|
||||||
"description": "Data format for response.",
|
|
||||||
"enum": [
|
|
||||||
"json",
|
|
||||||
"media",
|
|
||||||
"proto"
|
|
||||||
],
|
|
||||||
"enumDescriptions": [
|
|
||||||
"Responses with Content-Type of application/json",
|
|
||||||
"Media download with context-dependent Content-Type",
|
|
||||||
"Responses with Content-Type of application/x-protobuf"
|
|
||||||
],
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"callback": {
|
|
||||||
"description": "JSONP",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"fields": {
|
|
||||||
"description": "Selector specifying which fields to include in a partial response.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"key": {
|
|
||||||
"description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"oauth_token": {
|
|
||||||
"description": "OAuth 2.0 token for the current user.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"prettyPrint": {
|
|
||||||
"default": "true",
|
|
||||||
"description": "Returns response with indentations and line breaks.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "boolean"
|
|
||||||
},
|
|
||||||
"quotaUser": {
|
|
||||||
"description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"uploadType": {
|
|
||||||
"description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
},
|
|
||||||
"upload_protocol": {
|
|
||||||
"description": "Upload protocol for media (e.g. \"raw\", \"multipart\").",
|
|
||||||
"location": "query",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"protocol": "rest",
|
|
||||||
"resources": {
|
|
||||||
"serviceaccounts": {
|
|
||||||
"methods": {
|
|
||||||
"lookup": {
|
|
||||||
"description": "Lookup",
|
|
||||||
"flatPath": "metadata/x509/{account}",
|
|
||||||
"httpMethod": "GET",
|
|
||||||
"id": "serviceaccountslookup.lookup",
|
|
||||||
"parameterOrder": [
|
|
||||||
"account"
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"account": {
|
|
||||||
"description": "Email or ID of the service account.",
|
|
||||||
"location": "path",
|
|
||||||
"required": true,
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"path": "metadata/x509/{account}",
|
|
||||||
"response": {
|
|
||||||
"$ref": "Certificates"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rootUrl": "https://www.googleapis.com/service_accounts/v1",
|
|
||||||
"schemas": {
|
|
||||||
"Certificates": {
|
|
||||||
"description": "JSON template for certificates.",
|
|
||||||
"id": "Certificates",
|
|
||||||
"properties": {
|
|
||||||
"email": { "description": "Email of the delegate.",
|
|
||||||
"type": "string"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"type": "object"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"servicePath": "",
|
|
||||||
"title": "Service Account Lookup Pseudo-API",
|
|
||||||
"version": "v1",
|
|
||||||
"version_module": true
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
[metadata]
|
|
||||||
name = GAM for Google Workspace
|
|
||||||
version = attr: gam.var.GAM_VERSION
|
|
||||||
description = Command line management for Google Workspaces
|
|
||||||
long_description = file: readme.md
|
|
||||||
long_description_content_type = text/markdown
|
|
||||||
url = https://github.com/GAM-team/GAM
|
|
||||||
author = GAM Team
|
|
||||||
author_email = google-apps-manager@googlegroups.com
|
|
||||||
license = Apache
|
|
||||||
license_files = LICENSE
|
|
||||||
keywords = google, oauth2, gsuite, google-apps, google-admin-sdk, google-drive, google-cloud, google-calendar, gam, google-api, oauth2-client, google-workspace
|
|
||||||
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
|
|
||||||
License :: OSI Approved :: Apache License
|
|
||||||
|
|
||||||
[options]
|
|
||||||
packages = find:
|
|
||||||
python_requires = >= 3.8
|
|
||||||
install_requires =
|
|
||||||
chardet
|
|
||||||
cryptography
|
|
||||||
distro; sys_platform == 'linux'
|
|
||||||
filelock
|
|
||||||
google-api-python-client >= 2.36
|
|
||||||
google-auth-httplib2
|
|
||||||
google-auth-oauthlib >= 0.4.6
|
|
||||||
google-auth >= 2.3.3
|
|
||||||
httplib2 >= 0.20.2
|
|
||||||
lxml
|
|
||||||
passlib >= 1.7.4
|
|
||||||
pathvalidate
|
|
||||||
python-dateutil
|
|
||||||
yubikey-manager >= 5.0
|
|
||||||
|
|
||||||
[options.package_data]
|
|
||||||
* = *.pem
|
|
||||||
|
|
||||||
# used during pip install .[test]
|
|
||||||
[options.extras_require]
|
|
||||||
test = pre-commit
|
|
||||||
|
|
||||||
[options.entry_points]
|
|
||||||
console_scripts =
|
|
||||||
gam = gam.__main__:main
|
|
||||||
|
|
||||||
[bdist_wheel]
|
|
||||||
universal = True
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from setuptools import setup
|
|
||||||
|
|
||||||
setup()
|
|
||||||
@@ -1,58 +1,23 @@
|
|||||||
import os
|
|
||||||
import sys
|
|
||||||
import uuid
|
import uuid
|
||||||
|
from lxml import etree
|
||||||
|
import sys
|
||||||
|
|
||||||
source_dir = sys.argv[1]
|
# Hacky solution to create a Guid for all files
|
||||||
template_file = sys.argv[2]
|
# so Wix is happy and Guid is stable every time.
|
||||||
target_file = sys.argv[3]
|
# uuid5 is used for the Guid and the input is the
|
||||||
|
# source filename so the Guid will be the same
|
||||||
|
# every time as long as the source file name is
|
||||||
|
# the same.
|
||||||
|
|
||||||
existing_components = {
|
rewrite_file = sys.argv[1]
|
||||||
'gam.exe': ''' <Component Id="gam_exe" Guid="d046ea24-c9f8-40ca-84db-70b0119933ff">
|
|
||||||
<File Name="gam.exe" KeyPath="yes" />
|
|
||||||
<Environment Id="PATH" Name="PATH" Value="[INSTALLFOLDER]" Permanent="yes" Part="last" Action="set" System="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
'LICENSE': ''' <Component Id="license" Guid="c76864c5-d005-44d5-bb7c-a27e5923792d">
|
|
||||||
<File Name="LICENSE" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
'gam-setup.bat': ''' <Component Id="gam_setup_bat" Guid="5e6bbacb-d86f-4d80-a10b-89b81ee63fcb">
|
|
||||||
<File Name="gam-setup.bat" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
'GamCommands.txt': ''' <Component Id="GamCommands_txt" Guid="a2dca862-b222-469e-a637-95ea2a1c53e7">
|
|
||||||
<File Name="GamCommands.txt" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
'GamUpdate.txt': ''' <Component Id="GamUpdate_txt" Guid="1b7cdd48-0fff-4943-a219-102fcd14c755">
|
|
||||||
<File Name="GamUpdate.txt" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
'cacerts.pem': ''' <Component Id="cacerts_pem" Guid="61fe2b2d-1646-4bed-b844-193965e97727">
|
|
||||||
<File Name="cacerts.pem" KeyPath="yes" />
|
|
||||||
</Component>
|
|
||||||
''',
|
|
||||||
}
|
|
||||||
|
|
||||||
component_xml = ''
|
|
||||||
all_files = []
|
|
||||||
for root, dirs, files in os.walk(source_dir):
|
|
||||||
for filename in files:
|
|
||||||
relpath = os.path.relpath(root, source_dir)
|
|
||||||
if relpath == '.':
|
|
||||||
all_files.append(filename)
|
|
||||||
else:
|
|
||||||
all_files.append(os.path.join(relpath, filename))
|
|
||||||
all_files.sort()
|
|
||||||
for filename in all_files:
|
|
||||||
component_xml += existing_components.get(filename,
|
|
||||||
f' <Component>\n <File Name="{filename}" KeyPath="yes"/>\n </Component>\n')
|
|
||||||
|
|
||||||
with open(template_file, 'r') as f:
|
|
||||||
template = f.read()
|
|
||||||
|
|
||||||
full_xml = template.replace('REPLACE_ME_WITH_FILE_COMPONENTS', component_xml)
|
|
||||||
|
|
||||||
with open(target_file, 'w') as f:
|
|
||||||
f.write(full_xml)
|
|
||||||
|
|
||||||
|
with open(rewrite_file, 'rb') as f:
|
||||||
|
input_xml = f.read()
|
||||||
|
root = etree.fromstring(input_xml)
|
||||||
|
for elem in root.getiterator():
|
||||||
|
if 'Guid' in elem.attrib:
|
||||||
|
source = elem.getchildren()[0].attrib['Source']
|
||||||
|
stable_uuid = str(uuid.uuid5(uuid.NAMESPACE_URL, source))
|
||||||
|
elem.attrib['Guid'] = stable_uuid
|
||||||
|
with open(rewrite_file, 'w') as f:
|
||||||
|
f.write(etree.tostring(root).decode())
|
||||||
|
|||||||
42
src/version_info.txt.in
Normal file
42
src/version_info.txt.in
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
# UTF-8
|
||||||
|
#
|
||||||
|
# For more details about fixed file info 'ffi' see:
|
||||||
|
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
|
||||||
|
VSVersionInfo(
|
||||||
|
ffi=FixedFileInfo(
|
||||||
|
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
|
||||||
|
# Set not needed items to zero 0.
|
||||||
|
filevers={VERSION_TUPLE},
|
||||||
|
prodvers={VERSION_TUPLE},
|
||||||
|
# Contains a bitmask that specifies the valid bits 'flags'r
|
||||||
|
mask=0x3f,
|
||||||
|
# Contains a bitmask that specifies the Boolean attributes of the file.
|
||||||
|
flags=0x0,
|
||||||
|
# The operating system for which this file was designed.
|
||||||
|
# 0x4 - NT and there is no need to change it.
|
||||||
|
OS=0x4,
|
||||||
|
# The general type of file.
|
||||||
|
# 0x1 - the file is an application.
|
||||||
|
fileType=0x2,
|
||||||
|
# The function of the file.
|
||||||
|
# 0x0 - the function is not defined for this fileType
|
||||||
|
subtype=0x0,
|
||||||
|
# Creation date and time stamp.
|
||||||
|
date=(0, 0)
|
||||||
|
),
|
||||||
|
kids=[
|
||||||
|
StringFileInfo(
|
||||||
|
[
|
||||||
|
StringTable(
|
||||||
|
'040904b0',
|
||||||
|
[StringStruct('CompanyName', 'GAM-team'),
|
||||||
|
StringStruct('FileDescription', 'CLI for Google Workspace admins'),
|
||||||
|
StringStruct('FileVersion', '{VERSION}'),
|
||||||
|
StringStruct('LegalCopyright', 'Copyright (c) 2024 GAM team'),
|
||||||
|
StringStruct('OriginalFilename', 'gam.exe'),
|
||||||
|
StringStruct('ProductName', 'GAM'),
|
||||||
|
StringStruct('ProductVersion', '{VERSION}')])
|
||||||
|
]),
|
||||||
|
VarFileInfo([VarStruct('Translation', [1033, 1200])])
|
||||||
|
]
|
||||||
|
)
|
||||||
5
wiki/00scratch.md
Normal file
5
wiki/00scratch.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Scratch Me Wiki
|
||||||
|
editing these files shouldn't trigger a regular GitHub Action build.
|
||||||
|
|
||||||
|
# Counter
|
||||||
|
00010
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
- [Display addresses](#display-addresses)
|
- [Display addresses](#display-addresses)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/domains
|
* [Directory API - Domains](https://developers.google.com/admin-sdk/directory/reference/rest/v1/domains)
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/groups
|
* [Directory API - Groups](https://developers.google.com/admin-sdk/directory/reference/rest/v1/groups)
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/resources.calendars
|
* [Directory API - Resources Calendars](https://developers.google.com/admin-sdk/directory/reference/rest/v1/resources.calendars)
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/users
|
* [Directory API - Users](https://developers.google.com/admin-sdk/directory/reference/rest/v1/users)
|
||||||
|
|
||||||
## Display addresses
|
## Display addresses
|
||||||
Produces a three column CSV file (headers Type, Email, Target) that displays all group and user primary
|
Produces a three column CSV file (headers Type, Email, Target) that displays all group and user primary
|
||||||
1471
wiki/Administrators.md
Normal file
1471
wiki/Administrators.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
|||||||
# Alert Center
|
# Alert Center
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
|
- [Query documentation](#query-documentation)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Introduction](#introduction)
|
- [Introduction](#introduction)
|
||||||
- [Manage alerts](#manage-alerts)
|
- [Manage alerts](#manage-alerts)
|
||||||
@@ -8,9 +9,11 @@
|
|||||||
- [Display alert feedback](#display-alert-feedback)
|
- [Display alert feedback](#display-alert-feedback)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/admin-sdk/alertcenter/reference/rest/
|
* [Alert Center API](https://developers.google.com/admin-sdk/alertcenter/reference/rest/)
|
||||||
* https://developers.google.com/admin-sdk/alertcenter/guides/query-filters
|
|
||||||
* https://developers.google.com/admin-sdk/alertcenter/reference/filter-fields
|
## Query documentation
|
||||||
|
* [Query Filters](https://developers.google.com/admin-sdk/alertcenter/guides/query-filters)
|
||||||
|
* [Query Fields](https://developers.google.com/admin-sdk/alertcenter/reference/filter-fields)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
@@ -26,7 +29,7 @@ select alertId and feedbackId.
|
|||||||
To use these commands you must update your gam project and service account authorization.
|
To use these commands you must update your gam project and service account authorization.
|
||||||
```
|
```
|
||||||
gam update project
|
gam update project
|
||||||
gam user user@domain.com check serviceaccount
|
gam user user@domain.com update serviceaccount
|
||||||
```
|
```
|
||||||
## Manage alerts
|
## Manage alerts
|
||||||
```
|
```
|
||||||
@@ -14,11 +14,11 @@
|
|||||||
- [Determine if an address is a user, user alias, group or group alias](#determine-if-an-address-is-a-user-user-alias-group-or-group-alias)
|
- [Determine if an address is a user, user alias, group or group alias](#determine-if-an-address-is-a-user-user-alias-group-or-group-alias)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/users.aliases
|
* [Directory API - User Aliases](https://developers.google.com/admin-sdk/directory/reference/rest/v1/users.aliases)
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/groups.aliases
|
* [Directory API - Group Aliases](https://developers.google.com/admin-sdk/directory/reference/rest/v1/groups.aliases)
|
||||||
|
|
||||||
## Query documentation
|
## Query documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/v1/guides/search-users
|
* [Search Users](https://developers.google.com/admin-sdk/directory/v1/guides/search-users)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
See [Collections of Items](Collections-of-Items)
|
See [Collections of Items](Collections-of-Items)
|
||||||
@@ -30,8 +30,14 @@ See [Collections of Items](Collections-of-Items)
|
|||||||
<EmailAddress> ::= <String>@<DomainName>
|
<EmailAddress> ::= <String>@<DomainName>
|
||||||
<EmailAddressList> ::= "<EmailAddress>(,<EmailAddress>)*"
|
<EmailAddressList> ::= "<EmailAddress>(,<EmailAddress>)*"
|
||||||
<EmailAddressEntity> ::= <EmailAddressList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<EmailAddressEntity> ::= <EmailAddressList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<UniqueID> ::= id:<String>
|
<UniqueID> ::= id:<String>
|
||||||
|
|
||||||
|
<RegularExpression> ::= <String>
|
||||||
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
```
|
```
|
||||||
## Create an alias for a target
|
## Create an alias for a target
|
||||||
```
|
```
|
||||||
@@ -97,7 +103,7 @@ gam print aliases [todrive <ToDriveAttribute>*]
|
|||||||
[limittoou <OrgUnitItem>])
|
[limittoou <OrgUnitItem>])
|
||||||
[user|users <EmailAddressList>] [group|groups <EmailAddressList>]
|
[user|users <EmailAddressList>] [group|groups <EmailAddressList>]
|
||||||
[select <UserTypeEntity>]
|
[select <UserTypeEntity>]
|
||||||
[aliasmatchpattern <RegularExpression>]
|
[aliasmatchpattern <REMatchPattern>]
|
||||||
[shownoneditable] [nogroups] [nousers]
|
[shownoneditable] [nogroups] [nousers]
|
||||||
[onerowpertarget] [delimiter <Character>]
|
[onerowpertarget] [delimiter <Character>]
|
||||||
[suppressnoaliasrows]
|
[suppressnoaliasrows]
|
||||||
@@ -111,7 +117,7 @@ By default, group and user aliases in all domains in the account are selected; t
|
|||||||
* `user|users <EmailAddressList>` - Print aliases for users in `<EmailAddressList`
|
* `user|users <EmailAddressList>` - Print aliases for users in `<EmailAddressList`
|
||||||
* `select <UserTypeEntity>` - Print aliases for users in `<UserTypeEntity>`
|
* `select <UserTypeEntity>` - Print aliases for users in `<UserTypeEntity>`
|
||||||
* `group|groups <EmailAddressList>` - Print aliases for groups in `<EmailAddressList`
|
* `group|groups <EmailAddressList>` - Print aliases for groups in `<EmailAddressList`
|
||||||
* `aliasmatchpattern <RegularExpression>` - Print aliases that match a pattern
|
* `aliasmatchpattern <REMatchPattern>` - Print aliases that match a pattern
|
||||||
* `nogroups` - Print only user aliases
|
* `nogroups` - Print only user aliases
|
||||||
* `nousers` - Print only group aliases
|
* `nousers` - Print only group aliases
|
||||||
|
|
||||||
@@ -149,7 +155,7 @@ Alias,Target,TargetType
|
|||||||
|
|
||||||
## Bulk delete aliases
|
## Bulk delete aliases
|
||||||
You can bulk delete aliases as follows; use `(query <QueryUser>)|(queries <QueryUserList>)` and
|
You can bulk delete aliases as follows; use `(query <QueryUser>)|(queries <QueryUserList>)` and
|
||||||
`aliasmatchpattern <RegularExpression>` as desired.
|
`aliasmatchpattern <REMatchPattern>` as desired.
|
||||||
```
|
```
|
||||||
gam redirect csv ./OldDomainAliases.csv print aliases aliasmatchpattern ".*@olddomain.com" onerowpertarget suppressnoaliasrows
|
gam redirect csv ./OldDomainAliases.csv print aliases aliasmatchpattern ".*@olddomain.com" onerowpertarget suppressnoaliasrows
|
||||||
gam redirect stdout ./DeleteAliases.txt multiprocess redirect stderr stdout csv ./OldDomainAliases.csv gam remove aliases "~Target" "~TargetType" "~Aliases"
|
gam redirect stdout ./DeleteAliases.txt multiprocess redirect stderr stdout csv ./OldDomainAliases.csv gam remove aliases "~Target" "~TargetType" "~Aliases"
|
||||||
@@ -191,4 +197,3 @@ The return code is set based on `<TypeOfEmailItem>`:
|
|||||||
* Group Alias - 23
|
* Group Alias - 23
|
||||||
* User Invitation - 24
|
* User Invitation - 24
|
||||||
* Unknown - 59
|
* Unknown - 59
|
||||||
|
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
# Authorization
|
# Authorization
|
||||||
- [Introduction](#introduction)
|
- [Introduction](#introduction)
|
||||||
- [Headless computers and Cloud Shells](#headless-computers-and-cloud-shells)
|
- [Headless computers and Cloud Shells](#headless-computers-and-cloud-shells)
|
||||||
- [Version 5 Update](#version-5-update)
|
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Python Regular Expressions](Python-Regular-Expressions)
|
- [Python Regular Expressions](Python-Regular-Expressions)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Manage Projects](#manage-projects)
|
- [Manage Projects](#manage-projects)
|
||||||
- [Authorize a super admin to create projects](#authorize-a-super-admin-to-create-projects)
|
- [Authorize a user to create projects](#authorize-a-user-to-create-projects)
|
||||||
- [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
|
- [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
|
||||||
- [Authorize GAM to create projects](#authorize-gam-to-create-projects)
|
- [Authorize GAM to create projects](#authorize-gam-to-create-projects)
|
||||||
- [Create a new GCP project folder](#create-a-new-gcp-project-folder)
|
- [Create a new GCP project folder](#create-a-new-gcp-project-folder)
|
||||||
@@ -46,6 +45,7 @@
|
|||||||
- [Install GAM on the limited users computer](#install-gam-on-the-limited-users-computer)
|
- [Install GAM on the limited users computer](#install-gam-on-the-limited-users-computer)
|
||||||
- [Test Client and Service Account access on the non-administrator computer](#test-client-and-service-account-access-on-the-non-administrator-computer)
|
- [Test Client and Service Account access on the non-administrator computer](#test-client-and-service-account-access-on-the-non-administrator-computer)
|
||||||
- [Unselect limited section on your computer.](#unselect-limited-section-on-your-computer)
|
- [Unselect limited section on your computer.](#unselect-limited-section-on-your-computer)
|
||||||
|
- [Delete old versions of GAM from Configured Apps](#delete-old-versions-of-gam-from-configured-apps)
|
||||||
|
|
||||||
## Introduction
|
## Introduction
|
||||||
GAM requires authorization to perform tasks on your domain; the tasks break down into two categories:
|
GAM requires authorization to perform tasks on your domain; the tasks break down into two categories:
|
||||||
@@ -64,6 +64,7 @@ Verify the following steps:
|
|||||||
* If groups are used to authenticate access, make sure the super admin is in one of the groups
|
* If groups are used to authenticate access, make sure the super admin is in one of the groups
|
||||||
* Collapse "Service status"
|
* Collapse "Service status"
|
||||||
* Expand "Cloud Resource Manager API settings"
|
* Expand "Cloud Resource Manager API settings"
|
||||||
|
* Select the OU in the left that contains the super admin you'll be using
|
||||||
* Make sure that "Allow users to create projects" is checked
|
* Make sure that "Allow users to create projects" is checked
|
||||||
|
|
||||||
Verify that all scopes are available:
|
Verify that all scopes are available:
|
||||||
@@ -73,11 +74,6 @@ Verify that all scopes are available:
|
|||||||
* Select "ON for everyone"
|
* Select "ON for everyone"
|
||||||
* Click "SAVE"
|
* Click "SAVE"
|
||||||
|
|
||||||
Verify that internal apps are trusted.
|
|
||||||
* Access the admin console and go to Security -> Access and data control -> API Controls
|
|
||||||
* Check that "Trust internal, domain-owned apps" is present in the **Settings** section
|
|
||||||
* Click "SAVE"
|
|
||||||
|
|
||||||
If you run a Google Workspace Education SKU, verify that Classroom API is enabled if required.
|
If you run a Google Workspace Education SKU, verify that Classroom API is enabled if required.
|
||||||
* Access the admin console and go to Apps -> Google Workspace - Classroom
|
* Access the admin console and go to Apps -> Google Workspace - Classroom
|
||||||
* Expand "Data access"
|
* Expand "Data access"
|
||||||
@@ -93,31 +89,29 @@ If you run a Google Workspace Education SKU, verify that the super admin you'll
|
|||||||
|
|
||||||
Based on your domain policies, you may have to mark GAM as a trusted app. These steps are performed after a project is created.
|
Based on your domain policies, you may have to mark GAM as a trusted app. These steps are performed after a project is created.
|
||||||
* Access the admin console and go to Security -> Access and data control -> API controls
|
* Access the admin console and go to Security -> Access and data control -> API controls
|
||||||
* Check Trust internal, domain-owned apps
|
* Click Manage third-party app access
|
||||||
* Click **Manage third-party app access**
|
* Click Configure new app
|
||||||
* Click Add app and select **OAuth App Name Or Client ID**
|
* Paste client_id value from client_secrets.json in Search for app
|
||||||
* Paste client_id value from client_secrets.json
|
|
||||||
* Click Search
|
* Click Search
|
||||||
* Click Select at right end of line referencing GAM
|
* Click the line referencing GAM
|
||||||
* Check box to the left of the line with GAM client ID
|
* Keep the default scope All in domain.com (all users) or select an org unit that includes your GAM admin
|
||||||
* Click Select
|
* Click Continue
|
||||||
* Keep the default scope domain.com (all users) or select an org unit that includes your GAM admin
|
|
||||||
* Click Next/Continue
|
|
||||||
* Click Trusted: App can request access to all Google data
|
* Click Trusted: App can request access to all Google data
|
||||||
* Click Next/Continue
|
* Click Continue
|
||||||
* Click Finish
|
* Click Finish
|
||||||
|
* Press Confirm if Confirm parental consent pops up
|
||||||
|
|
||||||
Verify whether the super admin you'll be using is in an OU where reauthentication is required.
|
Verify whether the super admin you'll be using is in an OU where reauthentication is required.
|
||||||
* Access the admin console and go to Security -> Overview
|
* Access the admin console and go to Security -> Overview
|
||||||
* Scroll down and open Google Cloud session control section
|
* Scroll down and open Google Cloud session control section
|
||||||
* Select the OU containing the super admin
|
* Select the OU containing the super admin
|
||||||
* If Require reauthentication is selected and Exempt Trusted apps is not checked, you'll have to do `gam oauth create` at whatever frequency is specified
|
* If Require reauthentication is selected, you'll need either:
|
||||||
* If that sounds unappealing, check Exempt Trusted apps
|
* uncheck Google Cloud Storage and any other GCP APIs that you selected on `gam oauth create` (reauth is only necessary for GCP APIs)
|
||||||
* Click "OVERRIDE"
|
* enable "Exempt Trusted apps"
|
||||||
* Follow the steps below to mark GAM as a trusted app
|
* rerun `gam oauth create` at whatever frequency is specified
|
||||||
|
|
||||||
Additional steps may be required if errors are encountered.
|
Additional steps may be required if errors are encountered.
|
||||||
* [Authorize a super admin to create projects](#authorize-a-super-admin-to-create-projects)
|
* [Authorize a user to create projects](#authorize-a-user-to-create-projects)
|
||||||
* [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
|
* [Authorize Service Account Key Uploads](#authorize-service-account-key-uploads)
|
||||||
* [Authorize GAM to create projects](#authorize-gam-to-create-projects)
|
* [Authorize GAM to create projects](#authorize-gam-to-create-projects)
|
||||||
|
|
||||||
@@ -127,25 +121,6 @@ as required by Google for headless computers/cloud shells; this is required as o
|
|||||||
* See: https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html
|
* See: https://developers.googleblog.com/2022/02/making-oauth-flows-safer.html
|
||||||
* OAuth out-of-band (oob) flow will be deprecated
|
* OAuth out-of-band (oob) flow will be deprecated
|
||||||
|
|
||||||
## Version 5 Update
|
|
||||||
GAM version `5.00.00` replaced the deprecated `oauth2client` library with the `google-auth` library.
|
|
||||||
This change requires a one-time update of the client access file `oauth2.txt`; GAM will continue
|
|
||||||
to use the old version of `oauth2.txt` until you perform the update. There is a small performance
|
|
||||||
impact until the update is performed. However, you can't use the updated version of `oauth2.txt`
|
|
||||||
in prior versions of GAM; if you want to run GAM `5.00.00` and prior versions of GAM,
|
|
||||||
do not perform the update until you no longer need to run the prior versions of GAM.
|
|
||||||
|
|
||||||
If you are running any GAM version `4.85.00` or later, perform the following command
|
|
||||||
after installing `5.00.00` to perform the update.
|
|
||||||
```
|
|
||||||
gam oauth refresh
|
|
||||||
```
|
|
||||||
If you are running any GAM version before `4.85.00`, perform the following command
|
|
||||||
after installing `5.00.00` to perform the update.
|
|
||||||
```
|
|
||||||
gam oauth update
|
|
||||||
```
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://cloud.google.com/resource-manager/docs/creating-managing-organization#adding_an_organization_administrator
|
* https://cloud.google.com/resource-manager/docs/creating-managing-organization#adding_an_organization_administrator
|
||||||
* https://cloud.google.com/service-usage/docs/reference/rest
|
* https://cloud.google.com/service-usage/docs/reference/rest
|
||||||
@@ -168,7 +143,7 @@ gam oauth update
|
|||||||
<ProjectIDEntity> ::=
|
<ProjectIDEntity> ::=
|
||||||
current | gam | <ProjectID> | (filter <String>) |
|
current | gam | <ProjectID> | (filter <String>) |
|
||||||
(select <ProjectIDList> | <FileSelector> | <CSVFileSelector>)
|
(select <ProjectIDList> | <FileSelector> | <CSVFileSelector>)
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<ProjectName> ::= <String>
|
<ProjectName> ::= <String>
|
||||||
Must match this Python Regular Expression: [a-zA-Z0-9 '"!-]{4,30}
|
Must match this Python Regular Expression: [a-zA-Z0-9 '"!-]{4,30}
|
||||||
<ServiceAccountName> ::= <String>
|
<ServiceAccountName> ::= <String>
|
||||||
@@ -183,22 +158,21 @@ gam oauth update
|
|||||||
```
|
```
|
||||||
## Manage Projects
|
## Manage Projects
|
||||||
In all of the project commands, the Google Workspace admin/GCP project manager `<EmailAddress>` can be omitted; you will be prompted for a value.
|
In all of the project commands, the Google Workspace admin/GCP project manager `<EmailAddress>` can be omitted; you will be prompted for a value.
|
||||||
You must enter a full address, i.e., user@domain.com; you will be required to enter the password.
|
You must enter a full address, i.e., user@domain.com; you will be required to authenticate.
|
||||||
|
|
||||||
For `print|show projects`, you can eliminate the password requirement by enabling the following scope in `gam update serviceaccount`;
|
For `print|show projects`, you can eliminate the password prompt and authentication requirement by specifying the super admin emailaddress used in `gam oauth create`.
|
||||||
GAM will then use Service Account access to display projects.
|
|
||||||
```
|
```
|
||||||
[*] 9) Cloud Resource Manager API v3
|
gam print projects admin admin@domain.com
|
||||||
```
|
```
|
||||||
|
|
||||||
## Authorize a super admin to create projects
|
## Authorize a user to create projects
|
||||||
If you try to create a project and get an error saying that the admin you specified is not authorized to create projects,
|
If you try to create a project and get an error saying that the user you specified is not authorized to create projects,
|
||||||
perform these steps and then retry the create project command.
|
perform these steps and then retry the create project command.
|
||||||
|
|
||||||
* Login as an existing super admin at console.cloud.google.com
|
* Login as an existing super admin at console.cloud.google.com
|
||||||
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
||||||
* Under IAM & Admin select IAM
|
* Under IAM & Admin select IAM
|
||||||
* Click the down arrow in the box to the right of Google Cloud
|
* Click in the box to the right of Google Cloud
|
||||||
* Click the three dots at the right and select IAM/Permissions
|
* Click the three dots at the right and select IAM/Permissions
|
||||||
* Now you should be at "Permissions for organization ..."
|
* Now you should be at "Permissions for organization ..."
|
||||||
* Click on Grant Access
|
* Click on Grant Access
|
||||||
@@ -206,39 +180,45 @@ perform these steps and then retry the create project command.
|
|||||||
* Click in the Select a role box
|
* Click in the Select a role box
|
||||||
* Type project creator in the Filter box
|
* Type project creator in the Filter box
|
||||||
* Click Project Creator
|
* Click Project Creator
|
||||||
* Click + Add Another Role
|
|
||||||
* Type organization policy administrator in the Filter box
|
|
||||||
* Click Orgainzation Policy Administrator
|
|
||||||
* Click Save
|
* Click Save
|
||||||
|
|
||||||
## Authorize Service Account Key Uploads
|
## Authorize Service Account Key Uploads
|
||||||
|
|
||||||
If you try to create a project and get an error saying that Constraint `constraints/iam.disableServiceAccountKeyUpload violated for service account projects/gam-project-xxx`,
|
*IMPORTANT:* Google best practice is to NOT use service account keys. Rather than overriding Google's default policy please consider [running GAM on Google Compute Engine Securely](https://github.com/GAM-team/GAM/wiki/l-Running-GAM-on-Google-Compute-Engine-(GCE)-Securely) so that service account keys are not necessary.
|
||||||
|
|
||||||
|
If you try to create a project and get an error saying that Constraint `constraints/iam.disableServiceAccountKeyUpload violated for service account projects/gam-project-xxxxx`,
|
||||||
perform these steps and then you should be able to authorize and use your project.
|
perform these steps and then you should be able to authorize and use your project.
|
||||||
|
|
||||||
* Login as an existing super admin at console.cloud.google.com
|
* Login as an existing super admin at console.cloud.google.com
|
||||||
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
||||||
* Under IAM & Admin select IAM
|
* Under IAM & Admin select IAM
|
||||||
* Click the down arrow in the box to the right of Google Cloud
|
* Click in the box to the right of Google Cloud
|
||||||
* Click the three dots at the right and select IAM/Permissions
|
* Click the three dots at the right and select IAM/Permissions
|
||||||
* Now you should be at "Permissions for organization ..."
|
* Now you should be at "Permissions for organization ..."
|
||||||
* Click on Grant Access
|
* Click on Grant Access
|
||||||
* Enter the new admin address in Principals
|
* Enter the new admin address in Principals
|
||||||
* Click in the Select a role box
|
* Click in the Select a role box
|
||||||
* Type organization policy administrator in the Filter box
|
* Type orgpolicy.policyAdmin in the Filter box
|
||||||
* Click Organization Policy Administrator
|
* Click Organization Policy Administrator
|
||||||
* Click Save
|
* Click Save
|
||||||
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
* In the upper left click the three lines to the left of Google Cloud and select IAM & Admin
|
||||||
* Under IAM & Admin select IAM
|
* Under IAM & Admin select IAM
|
||||||
* Click the down arrow in the box to the right of Google Cloud
|
* Click in the box to the right of Google Cloud
|
||||||
* Click the three dots at the right and select Manage Resources
|
* Click the three dots at the right and select Manage Resources
|
||||||
* Click the three dots at the end of the line for the GAM project just created
|
* Click the three dots at the end of the line for the GAM project just created
|
||||||
* Click Settings
|
* Click Settings
|
||||||
* Click Organization Policies in the left column
|
* Click Organization Policies in the left column
|
||||||
* Now you should be at "Policies for Gam Project"
|
* Now you should be at "Policies for Gam Project"
|
||||||
* Click in the Filter box
|
* Click in the Filter box
|
||||||
* Enter iam.disableServiceAccountKeyUpload
|
* Enter iam.managed.disableServiceAccountKeyUpload
|
||||||
* Click the three dots at the end of the Disable Service Account Key Upload
|
* Click the three dots at the end of the Disable service account key upload/iam.managed.disableServiceAccountKeyUpload line
|
||||||
|
* Choose Edit policy
|
||||||
|
* Click Override parent's policy
|
||||||
|
* Click Add A Rule
|
||||||
|
* Select Enforcement/Off
|
||||||
|
* Click Done
|
||||||
|
* Click Set Policy
|
||||||
|
* Click the three dots at the end of the Disable Service Account Key Upload/iam.disableServiceAccountKeyUpload line
|
||||||
* Choose Edit policy
|
* Choose Edit policy
|
||||||
* Click Override parent's policy
|
* Click Override parent's policy
|
||||||
* Click Add A Rule
|
* Click Add A Rule
|
||||||
@@ -293,13 +273,13 @@ You can skip these steps if you know that untrusted third-party apps are allowed
|
|||||||
|
|
||||||
### Default values
|
### Default values
|
||||||
* `<AppName>` - "GAM"
|
* `<AppName>` - "GAM"
|
||||||
* `<ProjectID>` - "gam-project-abc-def-jki" where "abc-def-ghi" are randomly generated
|
* `<ProjectID>` - "gam-project-a1b2c" where "a1b2c" are randomly generated
|
||||||
* `<ProjectName>` - "GAM Project"
|
* `<ProjectName>` - "GAM Project"
|
||||||
* `<ServiceAccountName>` - `<ProjectID>`
|
* `<ServiceAccountName>` - `<ProjectID>`
|
||||||
* `<ServiceAccountDisplayName>` - `<ProjectName>`
|
* `<ServiceAccountDisplayName>` - `<ProjectName>`
|
||||||
* `<ServiceAccountDescription>` - `<ServiceAccountDisplayName>`
|
* `<ServiceAccountDescription>` - `<ServiceAccountDisplayName>`
|
||||||
|
|
||||||
### Basic
|
### Basic Create
|
||||||
Create a project with default values for the project and service account.
|
Create a project with default values for the project and service account.
|
||||||
```
|
```
|
||||||
gam create project [<EmailAddress>] [<ProjectID>]
|
gam create project [<EmailAddress>] [<ProjectID>]
|
||||||
@@ -307,7 +287,7 @@ gam create project [<EmailAddress>] [<ProjectID>]
|
|||||||
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
* `<ProjectID>` - A new Google project ID; if omitted, a default value will be used
|
* `<ProjectID>` - A new Google project ID; if omitted, a default value will be used
|
||||||
|
|
||||||
### Advanced
|
### Advanced Create
|
||||||
Create a project with user-specified values for the project and service account.
|
Create a project with user-specified values for the project and service account.
|
||||||
```
|
```
|
||||||
gam create project [admin <EmailAddress>] [project <ProjectID>]
|
gam create project [admin <EmailAddress>] [project <ProjectID>]
|
||||||
@@ -342,7 +322,7 @@ Use an existing project to create and download two files: `client_secrets.json`
|
|||||||
* `<ServiceAccountDisplayName>` - `<ProjectName>`
|
* `<ServiceAccountDisplayName>` - `<ProjectName>`
|
||||||
* `<ServiceAccountDescription>` - `<ServiceAccountDisplayName>`
|
* `<ServiceAccountDescription>` - `<ServiceAccountDisplayName>`
|
||||||
|
|
||||||
### Basic
|
### Basic Use
|
||||||
Use an existing uninitialized/uncredentialed project and configure it to be a GAM project; this typically used when
|
Use an existing uninitialized/uncredentialed project and configure it to be a GAM project; this typically used when
|
||||||
the GCP administrators have created a basic project because project creation is not available for most users.
|
the GCP administrators have created a basic project because project creation is not available for most users.
|
||||||
|
|
||||||
@@ -354,12 +334,13 @@ gam use project [<EmailAddress>] [project <ProjectID>]
|
|||||||
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
* `<ProjectID>` - An existing Google project ID; if omitted, you will be prompted for the ID
|
* `<ProjectID>` - An existing Google project ID; if omitted, you will be prompted for the ID
|
||||||
|
|
||||||
### Advanced
|
### Advanced Use
|
||||||
Use an existing project with user-specified values for the service account. If the project is already
|
Use an existing project with user-specified values for the service account. If the project is already
|
||||||
a GAM project you must use `saname <ServiceAccountName>` as the existing service account information
|
a GAM project you must use `saname <ServiceAccountName>` as the existing service account information
|
||||||
can not be re-downloaded.
|
can not be re-downloaded.
|
||||||
```
|
```
|
||||||
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)|
|
||||||
@@ -382,7 +363,7 @@ gam update project [[admin] <EmailAddress>] [<ProjectIDEntity>]
|
|||||||
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `current` - The project referenced in `client_secret.json`; this is the default
|
* `current` - The project referenced in `client_secrets.json`; this is the default
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -394,7 +375,7 @@ gam delete project [[admin] <EmailAddress>] [<ProjectIDEntity>]
|
|||||||
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `current` - The project referenced in `client_secret.json`; this is the default
|
* `current` - The project referenced in `client_secrets.json`; this is the default
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -414,7 +395,7 @@ gam show projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>]
|
|||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `all` - All projects accessible by the administrator; this is the default
|
* `all` - All projects accessible by the administrator; this is the default
|
||||||
* `current` - The project referenced in `client_secret.json`
|
* `current` - The project referenced in `client_secrets.json`
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -432,7 +413,7 @@ gam print projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>] [todrive <To
|
|||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `all` - All projects accessible by the administrator; this is the default
|
* `all` - All projects accessible by the administrator; this is the default
|
||||||
* `current` - The project referenced in `client_secret.json`
|
* `current` - The project referenced in `client_secrets.json`
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -651,8 +632,6 @@ gam select bbb oauth update
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Refresh Client credentials
|
## Refresh Client credentials
|
||||||
If necessary, update `oauth2.txt` from versions of GAM before `5.00.00`.
|
|
||||||
|
|
||||||
Refresh the expiration time in `oauth2.txt`.
|
Refresh the expiration time in `oauth2.txt`.
|
||||||
```
|
```
|
||||||
gam oauth refresh
|
gam oauth refresh
|
||||||
@@ -687,13 +666,9 @@ Export `oauth2.txt` in JSON form.
|
|||||||
```
|
```
|
||||||
gam oauth|oauth2 export [<FileName>]
|
gam oauth|oauth2 export [<FileName>]
|
||||||
```
|
```
|
||||||
For GAM version `5.00.00` and later:
|
|
||||||
* If `<FileName>` is omitted, the JSON data is written to `oauth2.txt`.
|
* If `<FileName>` is omitted, the JSON data is written to `oauth2.txt`.
|
||||||
* If `<FileName>` is `-`, the JSON data is written to stdout.
|
* If `<FileName>` is `-`, the JSON data is written to stdout.
|
||||||
|
|
||||||
For GAM versions before `5.00.00`:
|
|
||||||
* If `<FileName>` is omitted, the JSON data is written to stdout.
|
|
||||||
|
|
||||||
## Manage Service Accounts
|
## Manage Service Accounts
|
||||||
In all of the service account commands, the Google Workspace admin/GCP project manager `<EmailAddress>` can be omitted; you will be prompted for a value.
|
In all of the service account commands, the Google Workspace admin/GCP project manager `<EmailAddress>` can be omitted; you will be prompted for a value.
|
||||||
You must enter a full address, i.e., user@domain.com; you will be required to enter the password.
|
You must enter a full address, i.e., user@domain.com; you will be required to enter the password.
|
||||||
@@ -718,7 +693,7 @@ gam create|add svcacct [[admin] <EmailAddress>] [<ProjectIDEntity>]
|
|||||||
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `current` - The project referenced in `client_secret.json`; this is the default
|
* `current` - The project referenced in `client_secrets.json`; this is the default
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -741,7 +716,7 @@ gam delete svcacct [[admin] <EmailAddress>] [<ProjectIDEntity>]
|
|||||||
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
* `<EmailAddress>` - Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `current` - The project referenced in `client_secret.json`; this is the default
|
* `current` - The project referenced in `client_secrets.json`; this is the default
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -762,7 +737,7 @@ gam print svcaccts [[admin] <EmailAddress>] [all|<ProjectIDEntity>]
|
|||||||
|
|
||||||
Use these options to select projects.
|
Use these options to select projects.
|
||||||
* `all` - All projects accessible by the administrator; this is the default
|
* `all` - All projects accessible by the administrator; this is the default
|
||||||
* `current` - The project referenced in `client_secret.json`
|
* `current` - The project referenced in `client_secrets.json`
|
||||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||||
* `<ProjectID>` - A Google API project ID
|
* `<ProjectID>` - A Google API project ID
|
||||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||||
@@ -808,7 +783,7 @@ The `oauth2service.json` file is updated with the new private key.
|
|||||||
|
|
||||||
Keep a good record of where each Service Account key is used as the keys themselves do not record this information.
|
Keep a good record of where each Service Account key is used as the keys themselves do not record this information.
|
||||||
|
|
||||||
The two forms of the command are equivalent; the second form is used by Basic Gam.
|
The two forms of the command are equivalent; the second form is used by Legacy GAM.
|
||||||
```
|
```
|
||||||
gam create sakey
|
gam create sakey
|
||||||
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
||||||
@@ -834,7 +809,7 @@ The `oauth2service.json` file is updated with the new private key. If you had pr
|
|||||||
this `oauth2service.json` file to other users, you must redistribute the updated file as the private key
|
this `oauth2service.json` file to other users, you must redistribute the updated file as the private key
|
||||||
in the distributed copies has been revoked.
|
in the distributed copies has been revoked.
|
||||||
|
|
||||||
The two forms of the command are equivalent; the second form is used by Basic Gam.
|
The two forms of the command are equivalent; the second form is used by Legacy GAM.
|
||||||
```
|
```
|
||||||
gam update sakey
|
gam update sakey
|
||||||
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
||||||
@@ -853,7 +828,7 @@ in the distributed copies has been revoked.
|
|||||||
|
|
||||||
This command can be used if your Service Account keys have been compromised; all existing private keys are revoked.
|
This command can be used if your Service Account keys have been compromised; all existing private keys are revoked.
|
||||||
|
|
||||||
The two forms of the command are equivalent; the second form is used by Basic Gam.
|
The two forms of the command are equivalent; the second form is used by Legacy GAM.
|
||||||
```
|
```
|
||||||
gam replace sakeys
|
gam replace sakeys
|
||||||
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
(algorithm KEY_ALG_RSA_1024|KEY_ALG_RSA_2048)|
|
||||||
@@ -994,8 +969,8 @@ gam user user@domain.com update serviceaccount
|
|||||||
[*] 18) Drive API (supports readonly)
|
[*] 18) Drive API (supports readonly)
|
||||||
[*] 19) Drive API - todrive
|
[*] 19) Drive API - todrive
|
||||||
[*] 20) Drive Activity API v2 - must pair with Drive API
|
[*] 20) Drive Activity API v2 - must pair with Drive API
|
||||||
[*] 21) Drive Labels API v2beta - Admin (supports readonly)
|
[*] 21) Drive Labels API - Admin (supports readonly)
|
||||||
[*] 22) Drive Labels API v2beta - User (supports readonly)
|
[*] 22) Drive Labels API - User (supports readonly)
|
||||||
[*] 23) Forms API
|
[*] 23) Forms API
|
||||||
[*] 24) Gmail API - Basic Settings (Filters,IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read
|
[*] 24) Gmail API - Basic Settings (Filters,IMAP, Language, POP, Vacation) - read/write, Sharing Settings (Delegates, Forwarding, SendAs) - read
|
||||||
[*] 25) Gmail API - Full Access (Labels, Messages)
|
[*] 25) Gmail API - Full Access (Labels, Messages)
|
||||||
@@ -1236,3 +1211,22 @@ Once you have finished setting up authorizations for the limited user, you need
|
|||||||
gam select default save
|
gam select default save
|
||||||
gam select <Section> save
|
gam select <Section> save
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Delete old versions of GAM from Configured Apps
|
||||||
|
|
||||||
|
```
|
||||||
|
In the Admin console, go to Security/Access and Data Control/API Controls/MANAGE THIRD-PARTY APP ACCESS
|
||||||
|
Click Download list
|
||||||
|
Select Comma-separated values (.csv)
|
||||||
|
Click Download
|
||||||
|
Click Download CSV
|
||||||
|
The CSV file will be named: owl_apps.csv
|
||||||
|
Remove the rows of apps you want to keep.
|
||||||
|
Edit the column Access to UNCONFIGURED for those rows you want to remove.
|
||||||
|
Click Bulk update list
|
||||||
|
Click Attach CSV file
|
||||||
|
Locate owl_apps.csv
|
||||||
|
Click Upload
|
||||||
|
Click Upload
|
||||||
|
Click Confirm
|
||||||
|
```
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
banana|basil|blueberry|flamingo|graphite|grape|
|
banana|basil|blueberry|flamingo|graphite|grape|
|
||||||
lavender|peacock|sage|tangerine|tomato
|
lavender|peacock|sage|tangerine|tomato
|
||||||
<FileFormat> ::=
|
<FileFormat> ::=
|
||||||
csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|mht|odp|ods|odt|
|
csv|doc|dot|docx|dotx|epub|html|jpeg|jpg|json|mht|odp|ods|odt|
|
||||||
pdf|png|ppt|pot|potx|pptx|rtf|svg|tsv|txt|xls|xlt|xlsx|xltx|zip|
|
pdf|png|ppt|pot|potx|pptx|rtf|svg|tsv|txt|xls|xlt|xlsx|xltx|zip|
|
||||||
ms|microsoft|openoffice|
|
ms|microsoft|openoffice|
|
||||||
<LabelColorHex> ::=
|
<LabelColorHex> ::=
|
||||||
@@ -252,6 +252,9 @@
|
|||||||
now|today
|
now|today
|
||||||
<RegularExpression> ::= <String>
|
<RegularExpression> ::= <String>
|
||||||
See: https://docs.python.org/3/library/re.html
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
<ProjectID> ::= <String>
|
<ProjectID> ::= <String>
|
||||||
Must match this Python Regular Expression: [a-z][a-z0-9-]{4,28}[a-z0-9]
|
Must match this Python Regular Expression: [a-z][a-z0-9-]{4,28}[a-z0-9]
|
||||||
<ServiceAccountName> ::= <String>
|
<ServiceAccountName> ::= <String>
|
||||||
@@ -274,14 +277,25 @@
|
|||||||
<EmailAddress>|user:<EmailAddress>|group:<EmailAddress>|
|
<EmailAddress>|user:<EmailAddress>|group:<EmailAddress>|
|
||||||
domain:<DomainName>|domain|default
|
domain:<DomainName>|domain|default
|
||||||
<CalendarItem> ::= <EmailAddress>
|
<CalendarItem> ::= <EmailAddress>
|
||||||
<GIGroupAlias> ::= <EmailAddress>
|
|
||||||
<GIGroupItem> ::= <EmailAddress>|<UniqueID>|groups/<String>
|
|
||||||
<CIGroupType> ::= customer|group|other|serviceaccount|user
|
|
||||||
<ChannelCustomerID> ::= <String>
|
<ChannelCustomerID> ::= <String>
|
||||||
|
<ChatEmojiName> ::= :[0-9a-z_-]+:
|
||||||
|
<ChatEmoji> ::= emojiname <ChatEmojiName> | customemojis/<String>
|
||||||
<ChatMember> ::= spaces/<String>/members/<String>
|
<ChatMember> ::= spaces/<String>/members/<String>
|
||||||
<ChatMessage> ::= spaces/<String>/messages/<String>
|
<ChatMessage> ::= spaces/<String>/messages/<String>
|
||||||
<ChatSpace> ::= spaces/<String> | space <String> | space spaces/<String>
|
<ChatSpace> ::= spaces/<String> | space <String> | space spaces/<String>
|
||||||
<ChatThread> ::= spaces/<String>/threads/<String>
|
<ChatThread> ::= spaces/<String>/threads/<String>
|
||||||
|
<ChromeProfilePermanentID> ::= <String>
|
||||||
|
<ChromeProfileName> ::= customers/<CustomerID>/profiles/<ChromeProfilePermanentID> | <ChromeProfilePermanentID>
|
||||||
|
<ChromeProfileCommandName> ::= <ChomeProfileName>/commands/<String>
|
||||||
|
<GIGroupAlias> ::= <EmailAddress>
|
||||||
|
<GIGroupItem> ::= <EmailAddress>|<UniqueID>|groups/<String>
|
||||||
|
<CIGroupMemberType> ::= cbcmbrowser|chromeosdevice|customer|group|other|serviceaccount|user
|
||||||
|
<CIPolicyName> ::= policies/<String>|settings/<String>|<String>
|
||||||
|
<ClassificationLabelID> ::= <String>
|
||||||
|
<ClassificationLabelFieldID> ::= <String>
|
||||||
|
<ClassificationLabelSelectionID> ::= <String>
|
||||||
|
<ClassificationLabelName> ::= labels/<ClassificationLabelID>[@latest|@published|@<Number>]
|
||||||
|
<ClassificationLabelPermissionName> ::= labels/<ClassificationLabelID>[@latest|@published|@<Number>]/permissions/(audiences|groups|people)/<String>
|
||||||
<ClassroomInvitationID> ::= <String>
|
<ClassroomInvitationID> ::= <String>
|
||||||
<ClientID> ::= <String>
|
<ClientID> ::= <String>
|
||||||
<CommandID> ::= <String>
|
<CommandID> ::= <String>
|
||||||
@@ -291,6 +305,11 @@
|
|||||||
<ContactGroupItem> ::= <ContactGroupID>|<ContactGroupName>
|
<ContactGroupItem> ::= <ContactGroupID>|<ContactGroupName>
|
||||||
<CorporaAttribute> ::= alldrives|allteamdrives|domain|onlyteamdrives|user
|
<CorporaAttribute> ::= alldrives|allteamdrives|domain|onlyteamdrives|user
|
||||||
<CourseAlias> ::= <String>
|
<CourseAlias> ::= <String>
|
||||||
|
<CourseAnnouncementContent> ::=
|
||||||
|
((text <String>)|
|
||||||
|
(textfile <FileName> [charset <Charset>])|
|
||||||
|
(gdoc <UserGoogleDoc>)|
|
||||||
|
(gcsdoc <StorageBucketObjectName>))
|
||||||
<CourseAnnouncementID> ::= <Number>
|
<CourseAnnouncementID> ::= <Number>
|
||||||
<CourseAnnouncementState> ::= draft|published|deleted
|
<CourseAnnouncementState> ::= draft|published|deleted
|
||||||
<CourseID> ::= <Number>|d:<CourseAlias>
|
<CourseID> ::= <Number>|d:<CourseAlias>
|
||||||
@@ -351,11 +370,6 @@
|
|||||||
<DriveFilePermissionID> ::= anyone|anyonewithlink|id:<String>
|
<DriveFilePermissionID> ::= anyone|anyonewithlink|id:<String>
|
||||||
<DriveFilePermissionIDorEmail> ::= <DriveFilePermissionID>|<EmailAddress>
|
<DriveFilePermissionIDorEmail> ::= <DriveFilePermissionID>|<EmailAddress>
|
||||||
<DriveFileRevisionID> ::= <String>
|
<DriveFileRevisionID> ::= <String>
|
||||||
<DriveLabelID> ::= <String>
|
|
||||||
<DriveLabelFieldID> ::= <String>
|
|
||||||
<DriveLabelSelectionID> ::= <String>
|
|
||||||
<DriveLabelName> ::= labels/<DriveLabelID>[@latest|@published|@<Number>]
|
|
||||||
<DriveLabelPermissionName> ::= labels/<DriveLabelID>[@latest|@published|@<Number>]/permissions/(audiences|groups|people)/<String>
|
|
||||||
<EmailAddress> ::= <String>@<DomainName>
|
<EmailAddress> ::= <String>@<DomainName>
|
||||||
<EmailItem> ::= <EmailAddress>|<UniqueID>|<String>
|
<EmailItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||||
<EmailReplacement> ::= <String>
|
<EmailReplacement> ::= <String>
|
||||||
@@ -371,7 +385,7 @@
|
|||||||
<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>
|
||||||
@@ -505,6 +519,14 @@
|
|||||||
gs://<StorageBucketName>/<StorageObjectName>|
|
gs://<StorageBucketName>/<StorageObjectName>|
|
||||||
<StorageBucketName>/<StorageObjectName>
|
<StorageBucketName>/<StorageObjectName>
|
||||||
<Tag> ::= <String>
|
<Tag> ::= <String>
|
||||||
|
<TagManagerAccountID> ::= <String>
|
||||||
|
<TagManagerAccountPath> ::= accounts/<TagManagerAccountID>
|
||||||
|
<TagManagerContainerID> ::= <String>
|
||||||
|
<TagManagerContainerPath> ::= accounts/<TagManagerAccountID>/containers/<TagManagerContainerID>
|
||||||
|
<TagManagerWorkspaceID> ::= <String>
|
||||||
|
<TagManagerWorkspacePath> ::= accounts/<TagManagerAccountID>/containers/<TagManagerContainerID>/workspaces/<TagManagerWorkspaceID>
|
||||||
|
<TagManagerTagID> ::= <String>
|
||||||
|
<TagManagerTagPath> ::= accounts/<TagManagerAccountID>/containers/<TagManagerContainerID>/workspaces/<TagManagerWorkspaceID>/tags/<TagManagerTagID>
|
||||||
<TakeoutBucketName> ::= takeout-export-[a-f,0-9,-]*
|
<TakeoutBucketName> ::= takeout-export-[a-f,0-9,-]*
|
||||||
<TaskID> ::= <String>
|
<TaskID> ::= <String>
|
||||||
<TaskListID> ::= <String>
|
<TaskListID> ::= <String>
|
||||||
@@ -533,6 +555,7 @@
|
|||||||
(tdnotify [<Boolean>])|
|
(tdnotify [<Boolean>])|
|
||||||
(tdparent (id:<DriveFolderID>)|<DriveFolderName>)|
|
(tdparent (id:<DriveFolderID>)|<DriveFolderName>)|
|
||||||
(tdretaintitle [<Boolean>])|
|
(tdretaintitle [<Boolean>])|
|
||||||
|
(tdreturnidonly [<Boolean>])|
|
||||||
(tdshare <EmailAddress> commenter|reader|writer)*|
|
(tdshare <EmailAddress> commenter|reader|writer)*|
|
||||||
(tdsheet (id:<Number>)|<String>)|
|
(tdsheet (id:<Number>)|<String>)|
|
||||||
(tdsheettimestamp [<Boolean>] [tdsheettimeformat <String>])
|
(tdsheettimestamp [<Boolean>] [tdsheettimeformat <String>])
|
||||||
@@ -73,13 +73,13 @@ gam redirect stdout ./NewStudents.out redirect stderr ./NewStudents.err tbatch N
|
|||||||
```
|
```
|
||||||
gam csv <FileName>|-|(gsheet <UserGoogleSheet>)|(gdoc <UserGoogleDoc>) [charset <Charset>] [warnifnodata]
|
gam csv <FileName>|-|(gsheet <UserGoogleSheet>)|(gdoc <UserGoogleDoc>) [charset <Charset>] [warnifnodata]
|
||||||
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
|
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
|
||||||
(matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]]
|
(matchfield|skipfield <FieldName> <RESearchPattern>)* [showcmds [<Boolean>]]
|
||||||
[skiprows <Integer>] [maxrows <Integer>]
|
[skiprows <Integer>] [maxrows <Integer>]
|
||||||
gam <GAMArgumentList>
|
gam <GAMArgumentList>
|
||||||
|
|
||||||
gam loop <FileName>|-|(gsheet <UserGoogleSheet>)|(gdoc <UserGoogleDoc>) [charset <Charset>] [warnifnodata]
|
gam loop <FileName>|-|(gsheet <UserGoogleSheet>)|(gdoc <UserGoogleDoc>) [charset <Charset>] [warnifnodata]
|
||||||
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
|
[columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>] [fields <FieldNameList>]
|
||||||
(matchfield|skipfield <FieldName> <RegularExpression>)* [showcmds [<Boolean>]]
|
(matchfield|skipfield <FieldName> <RESearchPattern>)* [showcmds [<Boolean>]]
|
||||||
[skiprows <Integer>] [maxrows <Integer>]
|
[skiprows <Integer>] [maxrows <Integer>]
|
||||||
gam <GAMArgumentList>
|
gam <GAMArgumentList>
|
||||||
```
|
```
|
||||||
@@ -93,7 +93,7 @@ gam loop <FileName>|-|(gsheet <UserGoogleSheet>)|(gdoc <UserGoogleDoc>) [charset
|
|||||||
* `noescapechar <Boolean>` - Should `\` be ignored as an escape character; if not specified, the value of `csv_input_no_escape_char` from `gam.cfg` will be used
|
* `noescapechar <Boolean>` - Should `\` be ignored as an escape character; if not specified, the value of `csv_input_no_escape_char` from `gam.cfg` will be used
|
||||||
* `quotechar <Character>` - The column quote characer is `<Character>`; if not specified, the value of `csv_input_quote_char` from `gam.cfg` will be used
|
* `quotechar <Character>` - The column quote characer is `<Character>`; if not specified, the value of `csv_input_quote_char` from `gam.cfg` will be used
|
||||||
* `fields <FieldNameList>` - The column headings of a CSV file that does not contain column headings.
|
* `fields <FieldNameList>` - The column headings of a CSV file that does not contain column headings.
|
||||||
* `(matchfield|skipfield <FieldName> <RegularExpression>)*` - The criteria to select rows from the CSV file; can be used multiple times; if not specified, all rows are selected
|
* `(matchfield|skipfield <FieldName> <RESearchPattern>)*` - The criteria to select rows from the CSV file; can be used multiple times; if not specified, all rows are selected
|
||||||
* `showcmds` - Write `timestamp,command number/number of commands,command` to stderr when each command starts; write `timestamp, command number/numberof commands,complete` to stderr when command completes
|
* `showcmds` - Write `timestamp,command number/number of commands,command` to stderr when each command starts; write `timestamp, command number/numberof commands,complete` to stderr when command completes
|
||||||
* `skiprows <Integer>` - Skip filtered rows from the CSV file/Google Sheet.
|
* `skiprows <Integer>` - Skip filtered rows from the CSV file/Google Sheet.
|
||||||
* `skiprows 0` - All rows are processed, this is the default
|
* `skiprows 0` - All rows are processed, this is the default
|
||||||
@@ -15,8 +15,8 @@ There are two values in `gam.cfg` that can be used to filter the input from `gam
|
|||||||
* `csv_input_row_filter` - A list or JSON dictionary used to include specific rows based on column values
|
* `csv_input_row_filter` - A list or JSON dictionary used to include specific rows based on column values
|
||||||
* `csv_input_row_drop_filter` - A list or JSON dictionary used to exclude specific rows based on column values
|
* `csv_input_row_drop_filter` - A list or JSON dictionary used to exclude specific rows based on column values
|
||||||
|
|
||||||
These filters can be used alone or in conjunction with the `matchfield|skipfield <FieldName> <RegularExpression>` options.
|
These filters can be used alone or in conjunction with the `matchfield|skipfield <FieldName> <REMatchPattern>` options.
|
||||||
* https://github.com/taers232c/GAMADV-XTD3/wiki/Bulk-Processing#csv-files
|
* https://github.com/GAM-team/GAM/wiki/Bulk-Processing#csv-files
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
[Data Selectors](Collections-of-items)
|
[Data Selectors](Collections-of-items)
|
||||||
@@ -40,8 +40,11 @@ These filters can be used alone or in conjunction with the `matchfield|skipfield
|
|||||||
<Operator> ::= <|<=|>=|>|=|!=
|
<Operator> ::= <|<=|>=|>|=|!=
|
||||||
<RegularExpression> ::= <String>
|
<RegularExpression> ::= <String>
|
||||||
See: https://docs.python.org/3/library/re.html>
|
See: https://docs.python.org/3/library/re.html>
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
|
|
||||||
<FieldNameFilter> :: = <RegularExpression>
|
<FieldNameFilter> :: = <REMatchPattern>
|
||||||
<RowValueFilter> ::=
|
<RowValueFilter> ::=
|
||||||
[(any|all):]boolean:<Boolean>|
|
[(any|all):]boolean:<Boolean>|
|
||||||
[(any|all):]count<Operator><Number>|
|
[(any|all):]count<Operator><Number>|
|
||||||
@@ -55,10 +58,10 @@ These filters can be used alone or in conjunction with the `matchfield|skipfield
|
|||||||
[(any|all):]lengthrange!=<Number>/<Number>|
|
[(any|all):]lengthrange!=<Number>/<Number>|
|
||||||
[(any|all):]lengthrange=<Number>/<Number>|
|
[(any|all):]lengthrange=<Number>/<Number>|
|
||||||
[(any|all):]notdata:<DataSelector>|
|
[(any|all):]notdata:<DataSelector>|
|
||||||
[(any|all):]notregex:<RegularExpression>|
|
[(any|all):]notregex:<RESearchPattern>|
|
||||||
[(any|all):]notregexcs:<RegularExpression>|
|
[(any|all):]notregexcs:<RESearchPattern>|
|
||||||
[(any|all):]regex:<RegularExpression>|
|
[(any|all):]regex:<RESearchPattern>|
|
||||||
[(any|all):]regexcs:<RegularExpression>|
|
[(any|all):]regexcs:<RESearchPattern>|
|
||||||
[(any|all):]text<Operator><String>|
|
[(any|all):]text<Operator><String>|
|
||||||
[(any|all):]textrange!=<String>/<String>|
|
[(any|all):]textrange!=<String>/<String>|
|
||||||
[(any|all):]textrange=<String>/<String>|
|
[(any|all):]textrange=<String>/<String>|
|
||||||
@@ -82,8 +85,8 @@ Name:value form.
|
|||||||
* `<RowValueFilterList>`, even if it has one element, should be enclosed in `"`.
|
* `<RowValueFilterList>`, even if it has one element, should be enclosed in `"`.
|
||||||
* Each `<FieldNameFilter>:<RowValueFilter>` pair should be enclosed in `'`.
|
* Each `<FieldNameFilter>:<RowValueFilter>` pair should be enclosed in `'`.
|
||||||
* If `<FieldNameFilter>` contains a `:` or a space, it should be enclosed in `\"`.
|
* If `<FieldNameFilter>` contains a `:` or a space, it should be enclosed in `\"`.
|
||||||
* If `<RegularExpression>` or `<DataSelector>` in `<RowValueFilter>` contain a space, it should be enclosed in `\"`.
|
* If `<RESearchPattern>` or `<DataSelector>` in `<RowValueFilter>` contain a space, it should be enclosed in `\"`.
|
||||||
* If `<FieldNameFilter>` or `<RegularExpression>` in `<RowValueFilter>` contain a `\` to escape a special character
|
* If `<FieldNameFilter>` or `<RESearchPattern>` in `<RowValueFilter>` contain a `\` to escape a special character
|
||||||
or enter a special sequence, enter `\\\` on Linux and Mac OS, `\\` on Windows,
|
or enter a special sequence, enter `\\\` on Linux and Mac OS, `\\` on Windows,
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
@@ -186,10 +189,10 @@ These are the row value filter types:
|
|||||||
* `lengthrange!=<Number>/<Number>` - Used on fields with strings; non string fields will not match
|
* `lengthrange!=<Number>/<Number>` - Used on fields with strings; non string fields will not match
|
||||||
* The field length must be `<` the left `<Number>` or `>` the right `<Number>`
|
* The field length must be `<` the left `<Number>` or `>` the right `<Number>`
|
||||||
* `notdata:<DataSelector>` - Used on fields with text; field value must not match any value in `<DataSelector>`; case sensitive
|
* `notdata:<DataSelector>` - Used on fields with text; field value must not match any value in `<DataSelector>`; case sensitive
|
||||||
* `notregex:<RegularExpression>` - Used on fields with text; field value must not match `<RegularExpression>`; case insensitive
|
* `notregex:<RESearchPattern>` - Used on fields with text; field value must not match `<RESearchPattern>`; case insensitive
|
||||||
* `notregexcs:<RegularExpression>` - Used on fields with text; field value must not match `<RegularExpression>`; case sensitive
|
* `notregexcs:<RESearchPattern>` - Used on fields with text; field value must not match `<RESearchPattern>`; case sensitive
|
||||||
* `regex:<RegularExpression>` - Used on fields with text; field value must match `<RegularExpression>`; case insensitive
|
* `regex:<RESearchPattern>` - Used on fields with text; field value must match `<RESearchPattern>`; case insensitive
|
||||||
* `regexcs:<RegularExpression>` - Used on fields with text; field value must match `<RegularExpression>`; case sensitive
|
* `regexcs:<RESearchPattern>` - Used on fields with text; field value must match `<RESearchPattern>`; case sensitive
|
||||||
* `text<Operator><String>` - Used on fields with text
|
* `text<Operator><String>` - Used on fields with text
|
||||||
* `textrange=<String>/<String>` - Used on fields with strings
|
* `textrange=<String>/<String>` - Used on fields with strings
|
||||||
* The field value must be `>=` the left `<String>` and `<=` the right `<String>`
|
* The field value must be `>=` the left `<String>` and `<=` the right `<String>`
|
||||||
@@ -205,13 +208,6 @@ These are the row value filter types:
|
|||||||
* `timerange!=<Time>/<Time>` - Used on fields with times; a blank field will not match
|
* `timerange!=<Time>/<Time>` - Used on fields with times; a blank field will not match
|
||||||
* The field value must be `<` the left `<Time>` or `>` the right `<Time>`
|
* The field value must be `<` the left `<Time>` or `>` the right `<Time>`
|
||||||
|
|
||||||
### **Change in behavior.**
|
|
||||||
In versions prior to `5.12.00`, `regex:<RegularExpression>` and `notregex:<RegularExpression>` were processed in a case sensitive manner;
|
|
||||||
in many cases this is probably not desirable; e.g., matching file names which are case insensitive.
|
|
||||||
|
|
||||||
Now, `regex:<RegularExpression>` and `notregex:<RegularExpression>` are processed in a case insensitive manner.
|
|
||||||
To get the prior case sensitive processing, use `regexcs:<RegularExpression>` and `notregexcs:<RegularExpression>`.
|
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
You want to process groups with 100 or more direct members.
|
You want to process groups with 100 or more direct members.
|
||||||
```
|
```
|
||||||
@@ -258,7 +254,7 @@ gam selectinputfilter Filter510 csv UserInfo.csv gam user "~primaryEmail" ...
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Validate filters
|
## Validate filters
|
||||||
Version `6.30.00` added the `gam comment <String>*` command that can be used to validate input row filters.
|
The `gam comment <String>*` command that can be used to validate input row filters.
|
||||||
```
|
```
|
||||||
$ more Comment.csv
|
$ more Comment.csv
|
||||||
col1,col2
|
col1,col2
|
||||||
@@ -272,4 +268,4 @@ Col1:ccc Col2:333
|
|||||||
$ gam config csv_input_row_filter "col1:regex:bbb" csv Comment.csv gam comment "Col1:~~col1~~" "Col2:~~col2~~"
|
$ gam config csv_input_row_filter "col1:regex:bbb" csv Comment.csv gam comment "Col1:~~col1~~" "Col2:~~col2~~"
|
||||||
2022-12-18T09:42:26.108-08:00,0/1,Using 1 process...
|
2022-12-18T09:42:26.108-08:00,0/1,Using 1 process...
|
||||||
Col1:bbb Col2:222
|
Col1:bbb Col2:222
|
||||||
```
|
```
|
||||||
@@ -11,9 +11,11 @@
|
|||||||
- [Column row limiting](#column-row-limiting)
|
- [Column row limiting](#column-row-limiting)
|
||||||
- [Saving filters in gam.cfg](#saving-filters-in-gamcfg)
|
- [Saving filters in gam.cfg](#saving-filters-in-gamcfg)
|
||||||
|
|
||||||
There are five values in `gam.cfg` that can be used to filter the output from `gam print` commands.
|
There are seven values in `gam.cfg` that can be used to filter the output from `gam print` commands.
|
||||||
* `csv_output_header_filter` - A list of `<RegularExpressions>` used to select specific column headers to include
|
* `csv_output_header_filter` - A list of `<RegularExpressions>` used to select specific column headers to include
|
||||||
* `csv_output_header_drop_filter` - A list of `<RegularExpressions>` used to select specific column headers to exclude
|
* `csv_output_header_drop_filter` - A list of `<RegularExpressions>` used to select specific column headers to exclude
|
||||||
|
* `csv_output_header_force` - A list of <Strings> used to specify the exact column headers to include
|
||||||
|
* `csv_output_header_order` - A list of <Strings> used to specify the column header order; any headers in the file but not in the list will appear after the headers in the list.
|
||||||
* `csv_output_row_filter` - A list or JSON dictionary used to include specific rows based on column values
|
* `csv_output_row_filter` - A list or JSON dictionary used to include specific rows based on column values
|
||||||
* `csv_output_row_drop_filter` - A list or JSON dictionary used to exclude specific rows based on column values
|
* `csv_output_row_drop_filter` - A list or JSON dictionary used to exclude specific rows based on column values
|
||||||
* `csv_output_row_limit` - A limit on the number of rows written
|
* `csv_output_row_limit` - A limit on the number of rows written
|
||||||
@@ -44,8 +46,11 @@ on all platforms.
|
|||||||
<Operator> ::= <|<=|>=|>|=|!=
|
<Operator> ::= <|<=|>=|>|=|!=
|
||||||
<RegularExpression> ::= <String>
|
<RegularExpression> ::= <String>
|
||||||
See: https://docs.python.org/3/library/re.html>
|
See: https://docs.python.org/3/library/re.html>
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
|
|
||||||
<FieldNameFilter> :: = <RegularExpression>
|
<FieldNameFilter> :: = <REMatchPattern>
|
||||||
<ColumnFieldNameFilterList> ::= "<FieldNameFilter>(,<FieldNameFilter>)*"
|
<ColumnFieldNameFilterList> ::= "<FieldNameFilter>(,<FieldNameFilter>)*"
|
||||||
<RowValueFilter> ::=
|
<RowValueFilter> ::=
|
||||||
[(any|all):]boolean:<Boolean>|
|
[(any|all):]boolean:<Boolean>|
|
||||||
@@ -60,10 +65,10 @@ on all platforms.
|
|||||||
[(any|all):]lengthrange!=<Number>/<Number>|
|
[(any|all):]lengthrange!=<Number>/<Number>|
|
||||||
[(any|all):]lengthrange=<Number>/<Number>|
|
[(any|all):]lengthrange=<Number>/<Number>|
|
||||||
[(any|all):]notdata:<DataSelector>
|
[(any|all):]notdata:<DataSelector>
|
||||||
[(any|all):]notregex:<RegularExpression>|
|
[(any|all):]notregex:<RESearchPattern>|
|
||||||
[(any|all):]notregexcs:<RegularExpression>|
|
[(any|all):]notregexcs:<RESearchPattern>|
|
||||||
[(any|all):]regex:<RegularExpression>|
|
[(any|all):]regex:<RESearchPattern>|
|
||||||
[(any|all):]regexcs:<RegularExpression>|
|
[(any|all):]regexcs:<RESearchPattern>|
|
||||||
[(any|all):]text<Operator><String>|
|
[(any|all):]text<Operator><String>|
|
||||||
[(any|all):]textrange!=<String>/<String>|
|
[(any|all):]textrange!=<String>/<String>|
|
||||||
[(any|all):]textrange=<String>/<String>|
|
[(any|all):]textrange=<String>/<String>|
|
||||||
@@ -87,8 +92,8 @@ Name:value form.
|
|||||||
* `<RowValueFilterList>`, even if it has one element, should be enclosed in `"`.
|
* `<RowValueFilterList>`, even if it has one element, should be enclosed in `"`.
|
||||||
* Each `<FieldNameFilter>:<RowValueFilter>` pair should be enclosed in `'`.
|
* Each `<FieldNameFilter>:<RowValueFilter>` pair should be enclosed in `'`.
|
||||||
* If `<FieldNameFilter>` contains a `:` or a space, it should be enclosed in `\"`.
|
* If `<FieldNameFilter>` contains a `:` or a space, it should be enclosed in `\"`.
|
||||||
* If `<RegularExpression>` or `<DataSelector>` in `<RowValueFilter>` contain a space, it should be enclosed in `\"`.
|
* If `<RESearchPattern>` or `<DataSelector>` in `<RowValueFilter>` contain a space, it should be enclosed in `\"`.
|
||||||
* If `<FieldNameFilter>` or `<RegularExpression>` in `<RowValueFilter>` contain a `\` to escape a special character
|
* If `<FieldNameFilter>` or `<RESearchPattern>` in `<RowValueFilter>` contain a `\` to escape a special character
|
||||||
or enter a special sequence, enter `\\\` on Linux and Mac OS, `\\` on Windows,
|
or enter a special sequence, enter `\\\` on Linux and Mac OS, `\\` on Windows,
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
@@ -241,10 +246,10 @@ These are the row value filter types:
|
|||||||
* `lengthrange!=<Number>/<Number>` - Used on fields with strings; non string fields will not match
|
* `lengthrange!=<Number>/<Number>` - Used on fields with strings; non string fields will not match
|
||||||
* The field length must be `<` the left `<Number>` or `>` the right `<Number>`
|
* The field length must be `<` the left `<Number>` or `>` the right `<Number>`
|
||||||
* `notdata:<DataSelector>` - Used on fields with text; field value must not match any value in `<DataSelector>`; case sensitive
|
* `notdata:<DataSelector>` - Used on fields with text; field value must not match any value in `<DataSelector>`; case sensitive
|
||||||
* `notregex:<RegularExpression>` - Used on fields with text; field value must not match `<RegularExpression>`; case insensitive
|
* `notregex:<RESearchPattern>` - Used on fields with text; field value must not match `<RESearchPattern>`; case insensitive
|
||||||
* `notregexcs:<RegularExpression>` - Used on fields with text; field value must not match `<RegularExpression>`; case sensitive
|
* `notregexcs:<RESearchPattern>` - Used on fields with text; field value must not match `<RESearchPattern>`; case sensitive
|
||||||
* `regex:<RegularExpression>` - Used on fields with text; field value must match `<RegularExpression>`; case insensitive
|
* `regex:<RESearchPattern>` - Used on fields with text; field value must match `<RESearchPattern>`; case insensitive
|
||||||
* `regexcs:<RegularExpression>` - Used on fields with text; field value must match `<RegularExpression>`; case sensitive
|
* `regexcs:<RESearchPattern>` - Used on fields with text; field value must match `<RESearchPattern>`; case sensitive
|
||||||
* `text<Operator><String>` - Used on fields with text
|
* `text<Operator><String>` - Used on fields with text
|
||||||
* `textrange=<String>/<String>` - Used on fields with strings
|
* `textrange=<String>/<String>` - Used on fields with strings
|
||||||
* The field value must be `>=` the left `<String>` and `<=` the right `<String>`
|
* The field value must be `>=` the left `<String>` and `<=` the right `<String>`
|
||||||
@@ -260,13 +265,6 @@ These are the row value filter types:
|
|||||||
* `timerange!=<Time>/<Time>` - Used on fields with times; a blank field will not match
|
* `timerange!=<Time>/<Time>` - Used on fields with times; a blank field will not match
|
||||||
* The field value must be `<` the left `<Time>` or `>` the right `<Time>`
|
* The field value must be `<` the left `<Time>` or `>` the right `<Time>`
|
||||||
|
|
||||||
### **Change in behavior.**
|
|
||||||
In versions prior to `5.12.00`, `regex:<RegularExpression>` and `notregex:<RegularExpression>` were processed in a case sensitive manner;
|
|
||||||
in many cases this is probably not desirable; e.g., matching file names which are case insensitive.
|
|
||||||
|
|
||||||
Now, `regex:<RegularExpression>` and `notregex:<RegularExpression>` are processed in a case insensitive manner.
|
|
||||||
To get the prior case sensitive processing, use `regexcs:<RegularExpression>` and `notregexcs:<RegularExpression>`.
|
|
||||||
|
|
||||||
### Examples
|
### Examples
|
||||||
You want a list of groups with 100 or more direct members.
|
You want a list of groups with 100 or more direct members.
|
||||||
```
|
```
|
||||||
@@ -334,7 +332,7 @@ gam config csv_output_row_limit 10 auto_batch_min 1 redirect csv ./BigQuotaFiles
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Saving filters in gam.cfg
|
## Saving filters in gam.cfg
|
||||||
If you define a value for `csv_output_header_filter`, `csv_output_header_drop_filter`, `csv_output_row_filter`, `csv_output_row_drop_filter` or `csv_output_row_limit` in the `[DEFAULT]` section of `gam.cfg`,
|
If you define a value for `csv_output_header_filter`, `csv_output_header_drop_filter`, `csv_output_header_force`, `csv_output_header_order`, `csv_output_row_filter`, `csv_output_row_drop_filter` or `csv_output_row_limit` in the `[DEFAULT]` section of `gam.cfg`,
|
||||||
it will apply to every `gam print` command which is probably not desirable. You can store them in `gam.cfg` in named sections.
|
it will apply to every `gam print` command which is probably not desirable. You can store them in `gam.cfg` in named sections.
|
||||||
```
|
```
|
||||||
[Filter510]
|
[Filter510]
|
||||||
@@ -21,14 +21,14 @@ Calendar ACL roles (as seen in Calendar GUI):
|
|||||||
* `freebusy` & `freebusyreader` - See only free/busy (hide details)
|
* `freebusy` & `freebusyreader` - See only free/busy (hide details)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/calendar/v3/reference/acl
|
* [Calendar API - ACLs](https://developers.google.com/google-apps/calendar/v3/reference/acl)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
<CalendarItem> ::= <EmailAddress>
|
<CalendarItem> ::= <EmailAddress>
|
||||||
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
||||||
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
|
||||||
<CalendarACLRole> ::= editor|freebusy|freebusyreader|owner|reader|writer
|
<CalendarACLRole> ::= editor|freebusy|freebusyreader|owner|reader|writer
|
||||||
<CalendarACLScope> ::= <EmailAddress>|user:<EmailAdress>|group:<EmailAddress>|domain:<DomainName>|domain|default
|
<CalendarACLScope> ::= <EmailAddress>|user:<EmailAdress>|group:<EmailAddress>|domain:<DomainName>|domain|default
|
||||||
@@ -72,7 +72,7 @@ The `quotechar <Character>` option allows you to choose an alternate quote chara
|
|||||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||||
|
|
||||||
### Old format commands
|
### Old format commands
|
||||||
These commands are backwards compatible with basic GAM.
|
These commands are backwards compatible with Legacy GAM.
|
||||||
```
|
```
|
||||||
gam calendar <CalendarEntity> add <CalendarACLRole> ([user] <EmailAddress>)|(group <EmailAddress>)|(domain [<DomainName>])|default [sendnotifications <Boolean>]
|
gam calendar <CalendarEntity> add <CalendarACLRole> ([user] <EmailAddress>)|(group <EmailAddress>)|(domain [<DomainName>])|default [sendnotifications <Boolean>]
|
||||||
gam calendar <CalendarEntity> update <CalendarACLRole> ([user] <EmailAddress>)|(group <EmailAddress>)|(domain [<DomainName>])|default [sendnotifications <Boolean>]
|
gam calendar <CalendarEntity> update <CalendarACLRole> ([user] <EmailAddress>)|(group <EmailAddress>)|(domain [<DomainName>])|default [sendnotifications <Boolean>]
|
||||||
@@ -28,11 +28,17 @@ In general, you should use the following commands to manage user's calendars eve
|
|||||||
Client access works when accessing Resource calendars.
|
Client access works when accessing Resource calendars.
|
||||||
|
|
||||||
## API documentation:
|
## API documentation:
|
||||||
* https://developers.google.com/calendar/v3/reference/events
|
* [Calendar API - Events](https://developers.google.com/calendar/v3/reference/events)
|
||||||
* https://developers.google.com/calendar/v3/reference/events/import
|
* [Calendar API - Import Events](https://developers.google.com/calendar/v3/reference/events/import)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
|
<RegularExpression> ::= <String>
|
||||||
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
|
|
||||||
<Year> ::= <Digit><Digit><Digit><Digit>
|
<Year> ::= <Digit><Digit><Digit><Digit>
|
||||||
<Month> ::= <Digit><Digit>
|
<Month> ::= <Digit><Digit>
|
||||||
<Day> ::= <Digit><Digit>
|
<Day> ::= <Digit><Digit>
|
||||||
@@ -63,12 +69,15 @@ Client access works when accessing Resource calendars.
|
|||||||
<CalendarItem> ::= <EmailAddress>
|
<CalendarItem> ::= <EmailAddress>
|
||||||
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
||||||
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<DomainName> ::= <String>(.<String>)+
|
<DomainName> ::= <String>(.<String>)+
|
||||||
<EmailAddress> ::= <String>@<DomainName>
|
<EmailAddress> ::= <String>@<DomainName>
|
||||||
<EmailAddressList> ::= "<EmailAddess>(,<EmailAddress>)*"
|
<EmailAddressList> ::= "<EmailAddress>(,<EmailAddress>)*"
|
||||||
<EmailAddressEntity> ::= <EmailAddressList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<EmailAddressEntity> ::=
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
<EmailAddressList> | <FileSelector> | <CSVFileSelector> |
|
||||||
|
<CSVkmdSelector> | <CSVDataSelector>
|
||||||
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
<iCalUID> ::= <String>
|
||||||
|
|
||||||
<EventAttachmentsSubfieldName> ::=
|
<EventAttachmentsSubfieldName> ::=
|
||||||
attachments.fileid|
|
attachments.fileid|
|
||||||
@@ -201,26 +210,26 @@ Client access works when accessing Resource calendars.
|
|||||||
(matchfield attendeesonlydomainlist <DomainNameList>)|
|
(matchfield attendeesonlydomainlist <DomainNameList>)|
|
||||||
(matchfield attendeesdomainlist <DomainNameList>)|
|
(matchfield attendeesdomainlist <DomainNameList>)|
|
||||||
(matchfield attendeesnotdomainlist <DomainNameList>)|
|
(matchfield attendeesnotdomainlist <DomainNameList>)|
|
||||||
(matchfield attendeespattern <RegularExpression>)|
|
(matchfield attendeespattern <RESearchPattern>)|
|
||||||
(matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)|
|
(matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>)|
|
||||||
(matchfield creatoremail <RegularExpression>)|
|
(matchfield creatoremail <RESearchPattern>)|
|
||||||
(matchfield creatorname <RegularExpression>)|
|
(matchfield creatorname <RESearchPattern>)|
|
||||||
(matchfield description <RegularExpression>)|
|
(matchfield description <RESearchPattern>)|
|
||||||
(matchfield hangoutlink <RegularExpression>)|
|
(matchfield hangoutlink <RESearchPattern>)|
|
||||||
(matchfield location <RegularExpression>)|
|
(matchfield location <RESearchPattern>)|
|
||||||
(matchfield organizeremail <RegularExpression>)|
|
(matchfield organizeremail <RESearchPattern>)|
|
||||||
(matchfield organizername <RegularExpression>)|
|
(matchfield organizername <RESearchPattern>)|
|
||||||
(matchfield organizerself <Boolean>)|
|
(matchfield organizerself <Boolean>)|
|
||||||
(matchfield status <RegularExpression>)|
|
(matchfield status <RESearchPattern>)|
|
||||||
(matchfield summary <RegularExpression>)|
|
(matchfield summary <RESearchPattern>)|
|
||||||
(matchfield transparency <RegularExpression>)|
|
(matchfield transparency <RESearchPattern>)|
|
||||||
(matchfield visibility <RegularExpression>)
|
(matchfield visibility <RESearchPattern>)
|
||||||
|
|
||||||
<EventIDEntity> ::=
|
<EventIDEntity> ::=
|
||||||
(id|eventid <EventId>) |
|
(id|eventid <EventId>) |
|
||||||
(event|events <EventIdList> |
|
(event|events <EventIdList> |
|
||||||
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>)
|
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>)
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<EventSelectEntity> ::=
|
<EventSelectEntity> ::=
|
||||||
(<EventSelectProperty>+ <EventMatchProperty>*)
|
(<EventSelectProperty>+ <EventMatchProperty>*)
|
||||||
|
|
||||||
@@ -264,6 +273,7 @@ Client access works when accessing Resource calendars.
|
|||||||
(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>)|
|
||||||
@@ -294,9 +304,11 @@ The following attributes are equivalent:
|
|||||||
clearattendees|
|
clearattendees|
|
||||||
clearhangoutsmeet|
|
clearhangoutsmeet|
|
||||||
(clearprivateproperty <PropertyKey>)|
|
(clearprivateproperty <PropertyKey>)|
|
||||||
|
clearresources|
|
||||||
(clearsharedproperty <PropertyKey>)|
|
(clearsharedproperty <PropertyKey>)|
|
||||||
(removeattendee <EmailAddress>)|
|
(removeattendee <EmailAddress>)|
|
||||||
(replacedescription <RegularExpression> <String>)|
|
(removeresource <ResourceID>)|
|
||||||
|
(replacedescription <REMatchPattern> <RESubstitution>)|
|
||||||
(selectremoveattendees <UserTypeEntity>)
|
(selectremoveattendees <UserTypeEntity>)
|
||||||
|
|
||||||
<EventNotificationAttribute> ::=
|
<EventNotificationAttribute> ::=
|
||||||
@@ -370,26 +382,26 @@ GAM processes `<EventMatchProperty>*`; you may specify none or multiple properti
|
|||||||
* `matchfield attendeesnotdomainlist <DomainNameList>` - Some attendee's email address must be in a domain not in `<DomainNameList>`
|
* `matchfield attendeesnotdomainlist <DomainNameList>` - Some attendee's email address must be in a domain not in `<DomainNameList>`
|
||||||
* For example, this lets you look for events with attendees not in your internal domains. You should include `resource.calendar.google.com`
|
* For example, this lets you look for events with attendees not in your internal domains. You should include `resource.calendar.google.com`
|
||||||
in `<DomainNameList>` if the events use resources.
|
in `<DomainNameList>` if the events use resources.
|
||||||
* `matchfield attendeespattern <RegularExpression>` - Some attendee's email address must match `<RegularExpression>`
|
* `matchfield attendeespattern <RESearchPattern>` - Some attendee's email address must match `<RESearchPattern>`
|
||||||
* `matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>` - All of the attendees in `<EmailAddressEntity>` must be present
|
* `matchfield attendeesstatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddressEntity>` - All of the attendees in `<EmailAddressEntity>` must be present
|
||||||
and must have the specified values.
|
and must have the specified values.
|
||||||
* `<AttendeeAttendance>` - Default is `required`
|
* `<AttendeeAttendance>` - Default is `required`
|
||||||
* `<AttendanceStatus>` - Default is`needsaction`
|
* `<AttendanceStatus>` - Default is`needsaction`
|
||||||
* `matchfield creatoremail <RegularExpression>` - The creator email address must match `<RegularExpression>`
|
* `matchfield creatoremail <RESearchPattern>` - The creator email address must match `<RESearchPattern>`
|
||||||
* `matchfield creatorname <RegularExpression>` - The creator name must match `<RegularExpression>`
|
* `matchfield creatorname <RESearchPattern>` - The creator name must match `<RESearchPattern>`
|
||||||
* `matchfield description <RegularExpression>` - The description (summary) must match `<RegularExpression>`
|
* `matchfield description <RESearchPattern>` - The description (summary) must match `<RESearchPattern>`
|
||||||
* `matchfield location <RegularExpression>` - The location must match `<RegularExpression>`
|
* `matchfield location <RESearchPattern>` - The location must match `<RESearchPattern>`
|
||||||
* `matchfield organizeremail <RegularExpression>` - The organizer email address must match `<RegularExpression>`
|
* `matchfield organizeremail <RESearchPattern>` - The organizer email address must match `<RESearchPattern>`
|
||||||
* `matchfield organizername <RegularExpression>` - The orgainzer name must match `<RegularExpression>`
|
* `matchfield organizername <RESearchPattern>` - The orgainzer name must match `<RESearchPattern>`
|
||||||
* `matchfield status <RegularExpression>` - The summary must match `<RegularExpression>`. The API documented values are:
|
* `matchfield status <RESearchPattern>` - The summary must match `<RESearchPattern>`. The API documented values are:
|
||||||
* `confirmed`
|
* `confirmed`
|
||||||
* `tentative`
|
* `tentative`
|
||||||
* `cancelled`
|
* `cancelled`
|
||||||
* `matchfield summary <RegularExpression>` - The summary must match `<RegularExpression>`
|
* `matchfield summary <RESearchPattern>` - The summary must match `<RESearchPattern>`
|
||||||
* `matchfield transparency <RegularExpression>` - The summary must match `<RegularExpression>`. The API documented values are:
|
* `matchfield transparency <RESearchPattern>` - The summary must match `<RESearchPattern>`. The API documented values are:
|
||||||
* `opaque` - Busy. The API does not seem to return this value; use `"(^$)|opaque"` to match no value or `opaque`.
|
* `opaque` - Busy. The API does not seem to return this value; use `"(^$)|opaque"` to match no value or `opaque`.
|
||||||
* `transparent` - Free/Available
|
* `transparent` - Free/Available
|
||||||
* `matchfield visibility <RegularExpression>` - The summary must match `<RegularExpression>`. The API documented values are:
|
* `matchfield visibility <RESearchPattern>` - The summary must match `<RESearchPattern>`. The API documented values are:
|
||||||
* `default` - The API does not seem to return this value; use `"(^$)|default"` to match no value or `default`.
|
* `default` - The API does not seem to return this value; use `"(^$)|default"` to match no value or `default`.
|
||||||
* `public` - The API does not seem to return this value if it is the default; use `"(^$)|public"` to match no value or `public`.
|
* `public` - The API does not seem to return this value if it is the default; use `"(^$)|public"` to match no value or `public`.
|
||||||
* `private` - The API does not seem to return this value if it is the default; use `"(^$)|private"` to match no value or `private`.
|
* `private` - The API does not seem to return this value if it is the default; use `"(^$)|private"` to match no value or `private`.
|
||||||
@@ -428,6 +440,7 @@ You can specify attendees in the following ways:
|
|||||||
* `selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>` - Multiple attendees
|
* `selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>` - Multiple attendees
|
||||||
* If `<AttendeeAttendance>` is not specified, all attendees are required to attend
|
* If `<AttendeeAttendance>` is not specified, all attendees are required to attend
|
||||||
* If `<AttendeeStatus>` is not specified, `needsaction` is chosen
|
* If `<AttendeeStatus>` is not specified, `needsaction` is chosen
|
||||||
|
* `resource <ResourceID>` - Add a resource attendee to the event
|
||||||
|
|
||||||
To add an attendee to a single recurring calendar event, you need to specify the ID of that specific event.
|
To add an attendee to a single recurring calendar event, you need to specify the ID of that specific event.
|
||||||
```
|
```
|
||||||
@@ -452,16 +465,13 @@ You can clear/modify existing attributes:
|
|||||||
* `clearhangoutsmeet` - Clear Hangouts/Meet link
|
* `clearhangoutsmeet` - Clear Hangouts/Meet link
|
||||||
* `clearprivateproperty <PropertyKey>` - Clear private properties
|
* `clearprivateproperty <PropertyKey>` - Clear private properties
|
||||||
* `clearsharedproperty <PropertyKey>` - Clear shared properties
|
* `clearsharedproperty <PropertyKey>` - Clear shared properties
|
||||||
* `replacedescription <RegularExpression> <String>` - Modify the description
|
* `replacedescription <REMatchPattern> <RESubstitution>` - Modify the description
|
||||||
|
|
||||||
## Update calendar attendees
|
## Update calendar attendees
|
||||||
The default behavior of `gam calendar <CalendarEntity> update events` has been changed regarding attendees.
|
The default behavior is to allow incremental changes to the attendees list;
|
||||||
In versions of GAM before `5.02.00`, updating attendees in calendar events was complicated because you had to
|
|
||||||
supply the complete attendee list even if you just wanted incremental changes.
|
|
||||||
The default behavior now is to allow incremental changes to the attendees list;
|
|
||||||
the current attendee list is downloaded and the specified changes are applied.
|
the current attendee list is downloaded and the specified changes are applied.
|
||||||
|
|
||||||
The `replacemode` option invokes the previous behavior from versions before `5.02.00`; the current attendee list is replaced.
|
The `replacemode` option causes the current attendee list to be replaced with the specified changes.
|
||||||
|
|
||||||
You can add attendees in the following ways:
|
You can add attendees in the following ways:
|
||||||
* `attendee <EmailAddress>` - The attendee attendance is required with status `needsaction'
|
* `attendee <EmailAddress>` - The attendee attendance is required with status `needsaction'
|
||||||
@@ -474,11 +484,14 @@ You can add attendees in the following ways:
|
|||||||
* `selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>` - Multiple attendees
|
* `selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>` - Multiple attendees
|
||||||
* If `<AttendeeAttendance>` is not specified, all attendees are required to attend
|
* If `<AttendeeAttendance>` is not specified, all attendees are required to attend
|
||||||
* If `<AttendeeStatus>` is not specified, `needsaction` is chosen
|
* If `<AttendeeStatus>` is not specified, `needsaction` is chosen
|
||||||
|
* `resource <ResourceID>` - Add a resource attendee to the event
|
||||||
|
|
||||||
You can remove attendees in the following ways:
|
You can remove attendees in the following ways:
|
||||||
* `clearattendees` - Clear all current attendees from the attendee list
|
* `clearattendees` - Clear all current attendees from the attendee list
|
||||||
* `removeattendee <EmailAddress>` - Remove a single attendee from the attendee list
|
* `removeattendee <EmailAddress>` - Remove a single attendee from the attendee list
|
||||||
* `selectremoveattendees <UserTypeEntity>` - Remove a selected collection of attendees from the attendee list
|
* `selectremoveattendees <UserTypeEntity>` - Remove a selected collection of attendees from the attendee list
|
||||||
|
* `clearresources` - Clear all resource attendees from the event
|
||||||
|
* `removeresource <ResourceID>` - Remove a resource attendee from the event
|
||||||
|
|
||||||
For `<UserTypeEntity>` See: [Collections of Users](Collections-of-Users)
|
For `<UserTypeEntity>` See: [Collections of Users](Collections-of-Users)
|
||||||
|
|
||||||
@@ -523,7 +536,7 @@ No events are deleted unless you specify the `doit` option; omit `doit` to verif
|
|||||||
|
|
||||||
## Move calendar events to another calendar
|
## Move calendar events to another calendar
|
||||||
Generally you won't move all events from one calendar to another; typically, you'll move events created by the event creator
|
Generally you won't move all events from one calendar to another; typically, you'll move events created by the event creator
|
||||||
using `matchfield creatoremail <RegularExpression>` in conjunction with other `<EventSelectProperty>` and `<EventMatchProperty>` options.
|
using `matchfield creatoremail <RESearchPattern>` in conjunction with other `<EventSelectProperty>` and `<EventMatchProperty>` options.
|
||||||
```
|
```
|
||||||
gam calendar <CalendarEntity> move event [<EventEntity>] destination|to <CalendarItem> [<EventNotificationAttribute>]
|
gam calendar <CalendarEntity> move event [<EventEntity>] destination|to <CalendarItem> [<EventNotificationAttribute>]
|
||||||
```
|
```
|
||||||
@@ -554,7 +567,7 @@ By default, Gam displays the information as an indented list of keys and values.
|
|||||||
```
|
```
|
||||||
gam calendar <CalendarEntity> show events [<EventEntity>] <EventDisplayProperty>*
|
gam calendar <CalendarEntity> show events [<EventEntity>] <EventDisplayProperty>*
|
||||||
[fields <EventFieldNameList>] [showdayofweek]
|
[fields <EventFieldNameList>] [showdayofweek]
|
||||||
[countsonly] [formatjson]
|
[countsly] [formatjson]
|
||||||
```
|
```
|
||||||
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
||||||
|
|
||||||
@@ -572,8 +585,9 @@ By default, Gam displays event details, use `countsonly` to display only the num
|
|||||||
|
|
||||||
```
|
```
|
||||||
gam calendar <CalendarEntity> print events [<EventEntity>] <EventDisplayProperty>*
|
gam calendar <CalendarEntity> print events [<EventEntity>] <EventDisplayProperty>*
|
||||||
[fields <EventFieldNameList>] [showdayofweek]
|
[fields <EventFieldNameList>] [showdayofweek]
|
||||||
[countsonly] [formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
[countsonly [eventrowfilter]]
|
||||||
|
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||||
```
|
```
|
||||||
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
In `<EventEntity>`, any `<EventSelectProperty>` options must precede all other options.
|
||||||
|
|
||||||
@@ -589,20 +603,38 @@ By default, Gam displays the information as columns of fields; the following opt
|
|||||||
|
|
||||||
By default, Gam displays event details, use `countsonly` to display only the number of events. `formatjson` does not apply in this case.
|
By default, Gam displays event details, use `countsonly` to display only the number of events. `formatjson` does not apply in this case.
|
||||||
|
|
||||||
|
When `countsonly` is specified, the `eventrowfilter` option causes
|
||||||
|
GAM to apply `config csv_output_row_filter` to the event details rather than the event counts.
|
||||||
|
This will be useful when `<EventSelectProperty>` and `<EventMatchProperty>` do not have the
|
||||||
|
capabilty to select the events of interest; e.g., you want to filter based on the event `created` property.
|
||||||
|
|
||||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||||
|
|
||||||
|
### Special character processing
|
||||||
|
When outputting events with `formatjson` with the goal of adding the events to another calendar,
|
||||||
|
use these options at the beginning of the command:
|
||||||
|
```config csv_output_convert_cr_nl false csv_output_no_escape_char true```
|
||||||
|
|
||||||
|
On the subsequent command to add the events, use this option at the beginning of the command:
|
||||||
|
```config csv_input_no_escape_char true```
|
||||||
|
|
||||||
|
These options ensure that newline `\n`, double quote `"`, single quote `'` and backslash `\` are
|
||||||
|
properly processed.
|
||||||
|
|
||||||
### Old format commands
|
### Old format commands
|
||||||
These commands are backwards compatible with basic Gam.
|
These commands are backwards compatible with Legacy GAM.
|
||||||
```
|
```
|
||||||
gam calendar <CalendarEntity> addevent <EventAttribute>+ [<EventNotificationAttribute>]
|
gam calendar <CalendarEntity> addevent <EventAttribute>+ [<EventNotificationAttribute>]
|
||||||
gam calendar <CalendarEntity> deleteevent (id|eventid <EventID>)+ [doit] [<EventNotificationAttribute>]
|
gam calendar <CalendarEntity> deleteevent (id|eventid <EventID>)+ [doit] [<EventNotificationAttribute>]
|
||||||
gam calendar <CalendarEntity> moveevent (id|eventid <EventID>)+ destination <CalendarItem> [<EventNotificationAttribute>]
|
gam calendar <CalendarEntity> moveevent (id|eventid <EventID>)+ destination <CalendarItem> [<EventNotificationAttribute>]
|
||||||
gam calendar <CalendarEntity> updateevent <EventID> <EventAttribute>+ [<EventNotificationAttribute>]
|
gam calendar <CalendarEntity> updateevent <EventID> <EventAttribute>+ [<EventNotificationAttribute>]
|
||||||
gam calendar <CalendarEntity> wipe
|
gam calendar <CalendarEntity> wipe
|
||||||
gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayProperty>* [fields <EventFieldNameList>]
|
gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayProperty>*
|
||||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
[fields <EventFieldNameList>]
|
||||||
|
[countsonly [eventrowfilter]]
|
||||||
|
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||||
```
|
```
|
||||||
@@ -14,14 +14,14 @@ In general, you should use the following commands to manage user's calendars.
|
|||||||
Client access works when accessing Resource calendars.
|
Client access works when accessing Resource calendars.
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/google-apps/calendar/v3/reference/calendars
|
* [Calendar API - Calendars](https://developers.google.com/google-apps/calendar/v3/reference/calendars)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
<CalendarItem> ::= <EmailAddress>
|
<CalendarItem> ::= <EmailAddress>
|
||||||
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
<CalendarList> ::= "<CalendarItem>(,<CalendarItem>)*"
|
||||||
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<CalendarEntity> ::= <CalendarList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
|
||||||
<TimeZone> ::= <String>
|
<TimeZone> ::= <String>
|
||||||
See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
# Chat Bot
|
# Chat Bot
|
||||||
|
- [Introduction](#introduction)
|
||||||
- [Notes](#notes)
|
- [Set up a Chat Bot](#set-up-a-chat-bot)
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Set up a Chat Bot](#set-up-a-chat-bot)
|
|
||||||
- [Display Rooms and Chats to which your Bot belongs](#display-rooms-and-chats-to-which-your-bot-belongs)
|
- [Display Rooms and Chats to which your Bot belongs](#display-rooms-and-chats-to-which-your-bot-belongs)
|
||||||
- [Display Members of a Room or Chat](#display-members-of-a-room-or-chat)
|
- [Display Members of a Room or Chat](#display-members-of-a-room-or-chat)
|
||||||
- [Create a Chat Message](#create-a-chat-message)
|
- [Create a Chat Message](#create-a-chat-message)
|
||||||
@@ -11,8 +10,43 @@
|
|||||||
- [Delete a Chat Message](#delete-a-chat-message)
|
- [Delete a Chat Message](#delete-a-chat-message)
|
||||||
- [Display a Chat Message](#display-a-chat-message)
|
- [Display a Chat Message](#display-a-chat-message)
|
||||||
|
|
||||||
## Notes
|
## Introduction
|
||||||
This Wiki page was built directly from Jay Lee's Wiki page; my sincere thanks for his efforts.
|
To use these commands you must update your service account authorization.
|
||||||
|
```
|
||||||
|
gam user user@domain.com update serviceaccount
|
||||||
|
|
||||||
|
[*] 4) Chat API - Memberships (supports readonly)
|
||||||
|
[*] 5) Chat API - Memberships Admin (supports readonly)
|
||||||
|
[*] 6) Chat API - Messages (supports readonly)
|
||||||
|
[*] 7) Chat API - Spaces (supports readonly)
|
||||||
|
[*] 8) Chat API - Spaces Admin (supports readonly)
|
||||||
|
[*] 9) Chat API - Spaces Delete
|
||||||
|
[*] 10) Chat API - Spaces Delete Admin
|
||||||
|
```
|
||||||
|
|
||||||
|
Added `use_chat_admin_access` Boolean variable to `gam.cfg`.
|
||||||
|
```
|
||||||
|
* When False, GAM uses user access when making all Chat API calls. For calls that support admin access,
|
||||||
|
this can be overridden with the asadmin command line option.
|
||||||
|
* When True, GAM uses admin access for Chat API calls that support admin access; other calls will use user access.
|
||||||
|
* Default: False
|
||||||
|
```
|
||||||
|
|
||||||
|
Google requires that you have a Chat Bot configured in order to use the Chat API; set up a Chat Bot as described in the next section.
|
||||||
|
|
||||||
|
## Set up a Chat Bot
|
||||||
|
GAM is capable of acting as a Chat Bot and sending messages to Chat Rooms or direct messages to users.
|
||||||
|
|
||||||
|
Even if you're not going to use GAM as a Chat Bot, you have to configure a Chat Bot as it is required by the Chat API in [Users - Chat](Users-Chat).
|
||||||
|
|
||||||
|
* Run the command `gam setup chat`; it will point you to a URL to configure your Chat Bot.
|
||||||
|
* Uncheck "Build this Chat app as a Workspace add-on."
|
||||||
|
* Enter an App name and Description of your choosing.
|
||||||
|
* For the Avatar URL you can use `https://dummyimage.com/384x256/4d4d4d/0011ff.png&text=+GAM` or a public URL to an image of your own choosing.
|
||||||
|
* In Functionality, uncheck both "Receive 1:1 messages" and "Join spaces and group conversations"
|
||||||
|
* In Connection settings, choose "Cloud Pub/Sub" and enter `projects/<ProjectID>/topics/no-topic` for the Topic Name. Replace `<ProjectID>` with your GAM project ID. GAM doesn't yet listen to pub/sub so this option is not used.
|
||||||
|
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
||||||
|
* Click Save.
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/chat/concepts
|
* https://developers.google.com/chat/concepts
|
||||||
@@ -106,19 +140,6 @@ This Wiki page was built directly from Jay Lee's Wiki page; my sincere thanks fo
|
|||||||
<ChatMessageFieldNameList> ::= "<ChatMessageFieldName>(,<ChatMessageFieldName>)*"
|
<ChatMessageFieldNameList> ::= "<ChatMessageFieldName>(,<ChatMessageFieldName>)*"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Set up a Chat Bot
|
|
||||||
Since GAM 6.04.00, GAM is capable of acting as a Chat Bot and sending messages to Chat Rooms or direct messages to users. You first need to configure your Chat Bot.
|
|
||||||
|
|
||||||
* Run the command `gam setup chat`; it will point you to a URL to configure your Chat Bot.
|
|
||||||
* Enter an App name and Description of your choosing.
|
|
||||||
* For the Avatar URL you can use `https://dummyimage.com/384x256/4d4d4d/0011ff.png&text=+GAM` or a public URL to an image of your own choosing.
|
|
||||||
* In Functionality, uncheck both "Receive 1:1 messages" and "Join spaces and group conversations"
|
|
||||||
* In Connection settings, choose "Cloud Pub/Sub" and enter "no-topic" for the topic name. GAM doesn't yet listen to pub/sub so this option is not used.
|
|
||||||
* In Visibility, uncheck "Make this Chat app available to specific people and groups in Domain Workspace".
|
|
||||||
* Click Save.
|
|
||||||
|
|
||||||
----
|
|
||||||
|
|
||||||
## Display Rooms and Chats to which your Bot belongs
|
## Display Rooms and Chats to which your Bot belongs
|
||||||
Display the spaces to which your Chat Bot can send messages.
|
Display the spaces to which your Chat Bot can send messages.
|
||||||
A space can be a direct message to a user, a chat group or a chat room.
|
A space can be a direct message to a user, a chat group or a chat room.
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
# Chrome Auto Update Expiration Counts
|
# Chrome Auto Update Expiration Counts
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [Chrome Auto Update Expiration Counts](#chrome-auto-update-expiration-counts)
|
- [Definitions](#definitions)
|
||||||
- [API documentation](#api-documentation)
|
- [Quoting rules](#quoting-rules)
|
||||||
- [Definitions](#definitions)
|
- [Display Chrome auto update expiration counts](#display-chrome-auto-update-expiration-counts)
|
||||||
- [Quoting rules](#quoting-rules)
|
|
||||||
- [Display Chrome auto update expiration counts](#display-chrome-auto-update-expiration-counts)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Chrome Management API - Count Devices Reaching AUE](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeDevicesReachingAutoExpirationDate)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeDevicesReachingAutoExpirationDate
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these features you must add the `Chrome Management API` to your project and authorize
|
To use these features you must add the `Chrome Management API` to your project and authorize
|
||||||
@@ -1,27 +1,25 @@
|
|||||||
# Chrome Browser Cloud Management
|
# Chrome Browser Cloud Management
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [Chrome Browser Cloud Management](#chrome-browser-cloud-management)
|
- [Query documentation](#query-documentation)
|
||||||
- [API documentation](#api-documentation)
|
- [Definitions](#definitions)
|
||||||
- [Query documentation](#query-documentation)
|
- [Raw Fields](#raw-fields)
|
||||||
- [Definitions](#definitions)
|
- [Manage Chrome browsers](#manage-chrome-browsers)
|
||||||
- [Manage Chrome browsers](#manage-chrome-browsers)
|
- [Update Chrome browsers](#update-chrome-browsers)
|
||||||
- [Update Chrome browsers](#update-chrome-browsers)
|
- [Example: Add a new note to existing notes](#example-add-a-new-note-to-existing-notes)
|
||||||
- [Example: Add a new note to existing notes](#example-add-a-new-note-to-existing-notes)
|
- [Move Chrome browsers from one OU to another](#move-chrome-browsers-from-one-ou-to-another)
|
||||||
- [Move Chrome browsers from one OU to another](#move-chrome-browsers-from-one-ou-to-another)
|
- [Delete Chrome browsers](#delete-chrome-browsers)
|
||||||
- [Delete Chrome browsers](#delete-chrome-browsers)
|
- [Display Chrome browsers](#display-chrome-browsers)
|
||||||
- [Display Chrome browsers](#display-chrome-browsers)
|
- [Examples](#examples)
|
||||||
- [Examples](#examples)
|
- [Browser Query Searchable Fields](#browser-query-searchable-fields)
|
||||||
- [Browser Query Searchable Fields](#browser-query-searchable-fields)
|
- [Manage Chrome browser enrollment tokens](#manage-chrome-browser-enrollment-tokens)
|
||||||
- [Manage Chrome browser enrollment tokens](#manage-chrome-browser-enrollment-tokens)
|
- [Display Chrome browser enrollment tokens](#display-chrome-browser-enrollment-tokens)
|
||||||
- [Display Chrome browser enrollment tokens](#display-chrome-browser-enrollment-tokens)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Chrome Enterprise Core API](https://support.google.com/chrome/a/answer/9681204)
|
||||||
* https://support.google.com/chrome/a/answer/9681204
|
* [Chrome Browser Enrollment Token API](https://support.google.com/chrome/a/answer/9949706)
|
||||||
* https://support.google.com/chrome/a/answer/9949706
|
|
||||||
|
|
||||||
## Query documentation
|
## Query documentation
|
||||||
* https://support.google.com/chrome/a/answer/9681204#retrieve_all_chrome_devices_for_an_account
|
* [Search Chrome Browser Devices](https://support.google.com/chrome/a/answer/9681204#retrieve_all_chrome_devices_for_an_account)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
* [`<CrOSTypeEntity>`](Collections-of-ChromeOS-Devices)
|
* [`<CrOSTypeEntity>`](Collections-of-ChromeOS-Devices)
|
||||||
@@ -41,7 +39,7 @@
|
|||||||
(query:<QueryBrowser>)|(query:orgunitpath:<OrgUnitPath>)|(query <QueryBrowser>) |
|
(query:<QueryBrowser>)|(query:orgunitpath:<OrgUnitPath>)|(query <QueryBrowser>) |
|
||||||
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
|
(browserou <OrgUnitItem>) | (browserous <OrgUnitList>) |
|
||||||
<FileSelector> | <CSVFileSelector>
|
<FileSelector> | <CSVFileSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
|
||||||
<BrowserAttribute> ::=
|
<BrowserAttribute> ::=
|
||||||
(annotatedassetid|asset|assetid <String>)|
|
(annotatedassetid|asset|assetid <String>)|
|
||||||
@@ -114,6 +112,74 @@
|
|||||||
tokenpermanentid
|
tokenpermanentid
|
||||||
<BrowserTokenFieldNameList> ::= "<BrowseTokenFieldName>(,<BrowserTokenFieldName>)*"
|
<BrowserTokenFieldNameList> ::= "<BrowseTokenFieldName>(,<BrowserTokenFieldName>)*"
|
||||||
```
|
```
|
||||||
|
## Raw Fields
|
||||||
|
|
||||||
|
This is the list of Browser fields showing their subfields.
|
||||||
|
You enter `rawfields` like this: the field names must be entered exactly as shown.
|
||||||
|
```
|
||||||
|
rawfields "deviceId,browsers(profiles(id,name,extensions(appType,name))),lastDeviceUsers(userName),osPlatform,osVersion"
|
||||||
|
```
|
||||||
|
```
|
||||||
|
annotatedAssetId
|
||||||
|
annotatedLocation
|
||||||
|
annotatedNotes
|
||||||
|
annotatedUser
|
||||||
|
deviceId
|
||||||
|
browserVersions
|
||||||
|
browsers
|
||||||
|
browserVersion
|
||||||
|
channel
|
||||||
|
executablePath
|
||||||
|
lastStatusReportTime
|
||||||
|
pendingInstallVersion
|
||||||
|
profiles
|
||||||
|
id
|
||||||
|
chromeSignedInUserEmail
|
||||||
|
lastPolicyFetchTime
|
||||||
|
lastStatusReportTime
|
||||||
|
name
|
||||||
|
extensions
|
||||||
|
appType
|
||||||
|
description
|
||||||
|
extensionId
|
||||||
|
homepageUrl
|
||||||
|
installType
|
||||||
|
manifestVersion
|
||||||
|
name
|
||||||
|
permissions
|
||||||
|
version
|
||||||
|
deviceIdentifiersHistory
|
||||||
|
records
|
||||||
|
firstRecordTime
|
||||||
|
identifiers
|
||||||
|
machineName
|
||||||
|
lastActivityTime
|
||||||
|
extensionCount
|
||||||
|
lastActivityTime
|
||||||
|
lastDeviceUser
|
||||||
|
lastDeviceUsers
|
||||||
|
lastStatusReportTime
|
||||||
|
userName
|
||||||
|
lastPolicyFetchTime
|
||||||
|
lastRegistrationTime
|
||||||
|
lastStatusReportTime
|
||||||
|
machineName
|
||||||
|
machinePolicies
|
||||||
|
error
|
||||||
|
name
|
||||||
|
source
|
||||||
|
value
|
||||||
|
orgUnitPath
|
||||||
|
osArchitecture
|
||||||
|
osPlatform
|
||||||
|
osPlatformVersion
|
||||||
|
osVersion
|
||||||
|
policyCount
|
||||||
|
safeBrowsingClickThroughCount
|
||||||
|
serialNumber
|
||||||
|
virtualDeviceId
|
||||||
|
```
|
||||||
|
|
||||||
## Manage Chrome browsers
|
## Manage Chrome browsers
|
||||||
## Update Chrome browsers
|
## Update Chrome browsers
|
||||||
There are four attributes that can be set for a browser.
|
There are four attributes that can be set for a browser.
|
||||||
@@ -163,7 +229,9 @@ gam delete browser <BrowserDeviceEntity>
|
|||||||
## Display Chrome browsers
|
## Display Chrome browsers
|
||||||
```
|
```
|
||||||
gam info browser <BrowserEntity>
|
gam info browser <BrowserEntity>
|
||||||
[basic|full|annotated] <BrowserFieldName>* [fields <BrowserFieldNameList>]
|
(basic|full|annotated |
|
||||||
|
(<BrowserFieldName>* [fields <BrowserFieldNameList>]) |
|
||||||
|
(rawfields "<BrowserFieldNameList>"))
|
||||||
[formatjson]
|
[formatjson]
|
||||||
```
|
```
|
||||||
Select the fields to be displayed:
|
Select the fields to be displayed:
|
||||||
@@ -171,6 +239,7 @@ Select the fields to be displayed:
|
|||||||
* `basic` - Display all fields except: browsers, lastDeviceUsers, lastStatusReportTime, machinePolicies; this is the default
|
* `basic` - Display all fields except: browsers, lastDeviceUsers, lastStatusReportTime, machinePolicies; this is the default
|
||||||
* `allfields/full` - Display all fields
|
* `allfields/full` - Display all fields
|
||||||
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
||||||
|
* `rawfields "<BrowserFieldNameList>"` - Display a selected list of fields
|
||||||
|
|
||||||
By default, Gam displays the information as an indented list of keys and values:
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
- `formatjson` - Display the fields in JSON format.
|
- `formatjson` - Display the fields in JSON format.
|
||||||
@@ -180,7 +249,9 @@ 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]
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -195,6 +266,7 @@ Select the fields to be displayed:
|
|||||||
* `allfields/full` - Display all fields
|
* `allfields/full` - Display all fields
|
||||||
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
||||||
* Note that `ou, org and orgunit` are both command line options and field names; use `fields` to include them in the selected list of fields
|
* Note that `ou, org and orgunit` are both command line options and field names; use `fields` to include them in the selected list of fields
|
||||||
|
* `rawfields "<BrowserFieldNameList>"` - Display a selected list of fields
|
||||||
|
|
||||||
By default, Gam displays the information as an indented list of keys and values:
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
- `formatjson` - Display the fields in JSON format.
|
- `formatjson` - Display the fields in JSON format.
|
||||||
@@ -208,7 +280,9 @@ 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] [formatjson [quotechar <Character>]]
|
[sortheaders] [formatjson [quotechar <Character>]]
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -235,6 +309,7 @@ Select the fields to be displayed:
|
|||||||
* `allfields/full` - Display all fields
|
* `allfields/full` - Display all fields
|
||||||
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
* `<BrowserFieldName>* [fields <BrowserFieldNameList>]` - Display a selected list of fields
|
||||||
* Note that `ou, org and orgunit` are both command line options and field names; use `fields` to include them in the selected list of fields
|
* Note that `ou, org and orgunit` are both command line options and field names; use `fields` to include them in the selected list of fields
|
||||||
|
* `rawfields "<BrowserFieldNameList>"` - Display a selected list of fields
|
||||||
|
|
||||||
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format:
|
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format:
|
||||||
* `formatjson` - Display the fields in JSON format.
|
* `formatjson` - Display the fields in JSON format.
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
# Chrome Installed Apps Counts
|
# Chrome Installed Apps Counts
|
||||||
|
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Quoting rules](#quoting-rules)
|
- [Quoting rules](#quoting-rules)
|
||||||
@@ -8,9 +7,8 @@
|
|||||||
- [Display Chrome devices with a specific installed application](#display-chrome-devices-with-a-specific-installed-application)
|
- [Display Chrome devices with a specific installed application](#display-chrome-devices-with-a-specific-installed-application)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Chrome Management API - Count Installed Apps](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countInstalledApps)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countInstalledApps
|
* [Chrome Management API - Find Installed App Devices](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/findInstalledAppDevices)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/findInstalledAppDevices
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these features you must add the `Chrome Management API` to your project and authorize
|
To use these features you must add the `Chrome Management API` to your project and authorize
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
# Chrome Device Needs Attention Counts
|
# Chrome Device Needs Attention Counts
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [Chrome Device Needs Attention Counts](#chrome-device-needs-attention-counts)
|
- [Definitions](#definitions)
|
||||||
- [API documentation](#api-documentation)
|
- [Quoting rules](#quoting-rules)
|
||||||
- [Definitions](#definitions)
|
- [Display Chrome Device needs attention counts](#display-chrome-device-needs-attention-counts)
|
||||||
- [Quoting rules](#quoting-rules)
|
|
||||||
- [Display Chrome Device needs attention counts](#display-chrome-device-needs-attention-counts)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Chrome Management API - Count Devices that Need Attention](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeDevicesThatNeedAttention)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeDevicesThatNeedAttention
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these features you must add the `Chrome Management API` to your project and authorize
|
To use these features you must add the `Chrome Management API` to your project and authorize
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -9,7 +9,7 @@
|
|||||||
- [Bulk printer updates](#bulk-printer-updates)
|
- [Bulk printer updates](#bulk-printer-updates)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/admin-sdk/chrome-printer/reference/rest
|
* [Chrome Printer Management API](https://developers.google.com/admin-sdk/chrome-printer/reference/rest)
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these features you must authorize the appropriate scope: `Directory API - Printers (supports readonly)`.
|
To use these features you must authorize the appropriate scope: `Directory API - Printers (supports readonly)`.
|
||||||
@@ -79,7 +79,7 @@ gam oauth create
|
|||||||
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
|
(gcsdoc(:<FieldName>)+ <StorageBucketObjectName>))
|
||||||
[warnifnodata] [columndelimiter <Character>] [quotechar <Character>]
|
[warnifnodata] [columndelimiter <Character>] [quotechar <Character>]
|
||||||
[endcsv|(fields <FieldNameList>)]
|
[endcsv|(fields <FieldNameList>)]
|
||||||
(matchfield|skipfield <FieldName> <RegularExpression>)*
|
(matchfield|skipfield <FieldName> <RESearchPattern>)*
|
||||||
[delimiter <Character>]
|
[delimiter <Character>]
|
||||||
|
|
||||||
```
|
```
|
||||||
316
wiki/Chrome-Profile-Management.md
Normal file
316
wiki/Chrome-Profile-Management.md
Normal file
@@ -0,0 +1,316 @@
|
|||||||
|
# Chrome Profile Management
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
|
- [Introduction](#introduction)
|
||||||
|
- [Definitions](#definitions)
|
||||||
|
- [Delete Chrome Profiles](#delete-chrome-profiles)
|
||||||
|
- [Display Chrome Profiles](#display-chrome-profiles)
|
||||||
|
- [Profile Query Searchable Fields](#profile-query-searchable-fields)
|
||||||
|
- [Collections of Chrome Profile names for commands](#collections-of-chrome-profile-names-for-commands)
|
||||||
|
- [Create a Chrome Profile command](#create-a-chrome-profile-command)
|
||||||
|
- [Display Chrome Profile commands](#display-chrome-profile-commands)
|
||||||
|
|
||||||
|
## Introduction
|
||||||
|
These features were added in version 7.01.00.
|
||||||
|
|
||||||
|
To use these commands you must update your client authorization.
|
||||||
|
```
|
||||||
|
gam oauth create
|
||||||
|
|
||||||
|
[*] 3) Chrome Management API - Profiles (supports readonly)
|
||||||
|
```
|
||||||
|
|
||||||
|
You must enable managed profile reporting, see: https://support.google.com/chrome/a/answer/9301421
|
||||||
|
Follow instructions at: Turn on managed profile reporting
|
||||||
|
|
||||||
|
## API documentation
|
||||||
|
* [Chrome Management API - Profiles](https://developers.google.com/chrome/management/reference/rest/v1/customers.profiles)
|
||||||
|
* [Chrome Management API - Profile Commands](https://developers.google.com/chrome/management/reference/rest/v1/customers.profiles.commands)
|
||||||
|
* [Turn on Chrome Browser and Profile Reporting](https://support.google.com/chrome/a/answer/9301421)
|
||||||
|
|
||||||
|
## Definitions
|
||||||
|
* [`<FileSelector> | <CSVFileSelector>`](Collections-of-Items)
|
||||||
|
|
||||||
|
```
|
||||||
|
<CustomerID> ::= <String>
|
||||||
|
<ChromeProfilePermanentID> ::= <String>
|
||||||
|
<ChromeProfileName> ::= customers/<CustomerID>/profiles/<ChromeProfilePermanentID> | <ChromeProfilePermanentID>
|
||||||
|
<ChromeProfileNameList> ::= "<ChromeProfileName>(,<ChromeProfileName>)*"
|
||||||
|
<ChromeProfileCommandName> ::= <ChomeProfileName>/commands/<String>
|
||||||
|
<ChromeProfileCommandNameList> ::= "<ChromeProfileCommandName>(,<ChromeProfileCommandName>)*"
|
||||||
|
<ChromeProfileNameEntity> ::=
|
||||||
|
<ChromeProfileNameList> |
|
||||||
|
(select <FileSelector>|<CSVFileSelector>) |
|
||||||
|
(filter <String> (filtertime<String> <Time>)* [orderby <ChromeProfileOrderByFieldName> [ascending|descending]]) |
|
||||||
|
(commands <ChromeProfileCommandNameList>|<FileSelector>|<CSVFileSelector>)
|
||||||
|
|
||||||
|
<ChromeProfileFieldName> ::=
|
||||||
|
affiliationstate|
|
||||||
|
annotatedlocation|
|
||||||
|
annotateduser|
|
||||||
|
attestationcredential|
|
||||||
|
profilechannel|
|
||||||
|
profileversion|
|
||||||
|
deviceinfo|
|
||||||
|
displayname|
|
||||||
|
extensioncount|
|
||||||
|
firstenrollmenttime|
|
||||||
|
identityprovider|
|
||||||
|
lastactivitytime|
|
||||||
|
lastpolicyfetchtime|
|
||||||
|
lastpolicysynctime|
|
||||||
|
laststatusreporttime|
|
||||||
|
name|
|
||||||
|
osplatformtype|
|
||||||
|
osplatformversion|
|
||||||
|
osversion|
|
||||||
|
policycount|
|
||||||
|
profileid|
|
||||||
|
profilepermanentid|
|
||||||
|
reportingdata|
|
||||||
|
useremail|
|
||||||
|
userid
|
||||||
|
<ChromeProfileFieldNameList> ::= "<ChromeProfileFieldName>(,<ChromeProfileFieldName>)*"
|
||||||
|
|
||||||
|
<ChromeProfileOrderByFieldName> ::=
|
||||||
|
affiliationstate|
|
||||||
|
profilechannel|
|
||||||
|
profileversion|
|
||||||
|
displayname|
|
||||||
|
extensioncount|
|
||||||
|
firstenrollmenttime|
|
||||||
|
identityprovider|
|
||||||
|
lastactivitytime|
|
||||||
|
lastpolicysynctime|
|
||||||
|
laststatusreporttime|
|
||||||
|
osplatformtype|
|
||||||
|
osversion|
|
||||||
|
policycount|
|
||||||
|
profileid|
|
||||||
|
useremail
|
||||||
|
```
|
||||||
|
## Delete Chrome profiles
|
||||||
|
```
|
||||||
|
gam delete chromeprofile <ChromeProfileName>
|
||||||
|
```
|
||||||
|
|
||||||
|
## Display Chrome profiles
|
||||||
|
```
|
||||||
|
gam info chromeprofile <ChromeProfileName>
|
||||||
|
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
|
||||||
|
[formatjson]
|
||||||
|
```
|
||||||
|
Select the fields to be displayed:
|
||||||
|
* `<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]` - Display a selected list of fields
|
||||||
|
|
||||||
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
|
```
|
||||||
|
gam show chromeprofiles
|
||||||
|
[filter <String> (filtertime<String> <Time>)*]
|
||||||
|
[orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
|
||||||
|
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
|
||||||
|
[formatjson]
|
||||||
|
```
|
||||||
|
|
||||||
|
Use these options to select Chrome profiles; if none are chosen, all Chrome profiles in the account are selected:
|
||||||
|
* `filter <String>` - Limit profiles to those that match a query
|
||||||
|
|
||||||
|
Select the fields to be displayed:
|
||||||
|
* `<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]` - Display a selected list of fields
|
||||||
|
|
||||||
|
Use the `filtertime<String> <Time>` option to allow times, usually relative, to be substituted into the `filter <String>` option.
|
||||||
|
The `filtertime<String> <Time>` value replaces the string `#filtertime<String>#` in the `filter <String>`.
|
||||||
|
The characters following `filtertime` can be any combination of lowercase letters and numbers.
|
||||||
|
|
||||||
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
|
```
|
||||||
|
gam print chromeprofiles [todrive <ToDriveAttribute>*]
|
||||||
|
[filter <String> (filtertime<String> <Time>)*]
|
||||||
|
[orderby <ChromeProfileOrderByFieldName> [ascending|descending]]
|
||||||
|
<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]
|
||||||
|
[formatjson [quotechar <Character>]]
|
||||||
|
```
|
||||||
|
|
||||||
|
Use these options to select Chrome profiles; if none are chosen, all Chrome profiles in the account are selected:
|
||||||
|
* `filter <String>` - Limit profiles to those that match a query
|
||||||
|
|
||||||
|
The first two columns will always `name,profileId`; the remaining field names will be sorted if `sortheaders` is specified;
|
||||||
|
otherwise, the remaining field names will appear in the order specified.
|
||||||
|
|
||||||
|
Select the fields to be displayed:
|
||||||
|
* `<ChromeProfileFieldName>* [fields <ChromeProfileFieldNameList>]` - Display a selected list of fields
|
||||||
|
|
||||||
|
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
|
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||||
|
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||||
|
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||||
|
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||||
|
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||||
|
|
||||||
|
## Profile Query Searchable Fields
|
||||||
|
|
||||||
|
These are the fields that can be used in a filter:
|
||||||
|
```
|
||||||
|
affiliationState
|
||||||
|
browserChannel
|
||||||
|
browserVersion
|
||||||
|
displayName
|
||||||
|
extensionCount
|
||||||
|
firstEnrollmentTime
|
||||||
|
identityProvider
|
||||||
|
lastActivityTime
|
||||||
|
lastPolicySyncTime
|
||||||
|
lastStatusReportTime
|
||||||
|
osPlatformType
|
||||||
|
osVersion
|
||||||
|
ouId
|
||||||
|
policyCount
|
||||||
|
profileId
|
||||||
|
userEmail
|
||||||
|
```
|
||||||
|
Any of the above fields can be used to specify a filter, and filtering by multiple fields is supported with AND operator.
|
||||||
|
String type fields and enum type fields support '=' and '!=' operators. Wildcard '*' can be used with a string type field filter.
|
||||||
|
The integer type and the timestamp type fields support '=', '!=', '<', '>', '<=' and '>=' operators.
|
||||||
|
Timestamps expect an RFC-3339 formatted string (e.g. 2012-04-21T11:30:00-04:00).
|
||||||
|
In addition, string literal filtering is also supported, for example, 'ABC' as a filter maps to a filter that checks if any of the filterable string type fields contains 'ABC'.
|
||||||
|
|
||||||
|
Organization unit number can be used as a filtering criteria here by specifying 'ouId = <String>', please note that only single OU ID matching is supported.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
For Windows PowerShell, replace `\"` with ``` `" ```.
|
||||||
|
|
||||||
|
Print information about Chrome profiles synced more than 30 days ago:
|
||||||
|
|
||||||
|
```
|
||||||
|
gam print chromeprofiles filter "lastPolicySyncTime < \"#filtertime1#\"" filtertime1 -30d
|
||||||
|
```
|
||||||
|
|
||||||
|
Print information about Chrome profiles synced in the last 30 days:
|
||||||
|
|
||||||
|
```
|
||||||
|
gam print chromeprofiles filter "lastPolicySyncTime >= \"#filtertime1#\"" filtertime1 -30d
|
||||||
|
```
|
||||||
|
|
||||||
|
Print information about Chrome profiles synced between 45 days ago and 30 days ago:
|
||||||
|
|
||||||
|
```
|
||||||
|
gam print chromeprofiles filter "lastPolicySyncTime >= \"#filtertime1#\" lastPolicySyncTime <= \"#filtertime2#\"" filtertime1 -45d filtertime2 -30d
|
||||||
|
```
|
||||||
|
|
||||||
|
Print information about Chrome profiles on Windows.
|
||||||
|
```
|
||||||
|
gam print chromeprofiles filter "osPlatformType=WINDOWS"
|
||||||
|
```
|
||||||
|
## Collections of Chrome Profile names for commands
|
||||||
|
```
|
||||||
|
<ChromeProfileNameEntity> ::=
|
||||||
|
<ChromeProfileNameList> |
|
||||||
|
(select <ChromeProfileNameList>|<FileSelector>|<CSVFileSelector>) |
|
||||||
|
(filter <String> (filtertime<String> <Time>)* [orderby <ChromeProfileOrderByFieldName> [ascending|descending]]) |
|
||||||
|
(commands <ChromeProfileCommandNameList>|<FileSelector>|<CSVFileSelector>)
|
||||||
|
```
|
||||||
|
* `<ChromeProfileNameList>` - A list of Chrome profile names
|
||||||
|
* `select <ChromeProfileNameList>` - A list of Chrome profile names
|
||||||
|
* `select <FileSelector>|<CSVFileSelector>` - A flat or CSV file containing Chrome profile names
|
||||||
|
* `filter <String> (filtertime<String> <Time>)*` - A filter to select Chrome profiles
|
||||||
|
* `commands <ChromeProfileCommandNameList>` - A list of Chrome profile command names
|
||||||
|
* `commands <FileSelector>|<CSVFileSelector>` - A flat or CSV file containing Chrome profile command names
|
||||||
|
|
||||||
|
Use the `filtertime<String> <Time>` option to allow times, usually relative, to be substituted into the `filter <String>` option.
|
||||||
|
The `filtertime<String> <Time>` value replaces the string `#filtertime<String>#` in the `filter <String>`.
|
||||||
|
The characters following `filtertime` can be any combination of lowercase letters and numbers.
|
||||||
|
|
||||||
|
## Create a Chrome Profile command
|
||||||
|
Clear a Chrome Browser profile cache and/or cookies.
|
||||||
|
```
|
||||||
|
gam create chromeprofilecommand <ChromeProfileNameEntity>
|
||||||
|
[clearcache [<Boolean>]] [clearcookies [<Boolean>]]
|
||||||
|
[csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]]
|
||||||
|
```
|
||||||
|
By default, when a Chrome profile command is created, GAM outputs details of the command as indented keywords and values.
|
||||||
|
* `formatjson` - Display the details in JSON format.
|
||||||
|
* `csv [todrive <ToDriveAttribute>*] [formatjson [quotechar <Character>]]` - Output the details in CSV format.
|
||||||
|
|
||||||
|
## Display Chrome Profile commands
|
||||||
|
Display the status of a specific Chrome Browser profile command.
|
||||||
|
```
|
||||||
|
gam info chromeprofilecommand <ChromeProfileCommandName>
|
||||||
|
[formatjson]
|
||||||
|
```
|
||||||
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
|
Display the status of selected Chrome Browser profile commands.
|
||||||
|
```
|
||||||
|
gam show chromeprofilecommands <ChromeProfileNameEntity>
|
||||||
|
[formatjson]
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, Gam displays the information as an indented list of keys and values:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
```
|
||||||
|
gam print chromeprofilecommands <ChromeProfileNameEntity> [todrive <ToDriveAttribute>*]
|
||||||
|
[formatjson [quotechar <Character>]]
|
||||||
|
```
|
||||||
|
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format:
|
||||||
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
|
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||||
|
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||||
|
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||||
|
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||||
|
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
For Windows PowerShell, replace `\"` with ``` `" ```.
|
||||||
|
|
||||||
|
Clear cache and cookies for two specific Chrome profiles:
|
||||||
|
```
|
||||||
|
gam create chromeprofilecommand 4c6c0a9f-de78-4285-be86-713fca8cffff,aa03151c-7c1d-41fe-b793-5753e167ffff clearcache clearcookies
|
||||||
|
```
|
||||||
|
|
||||||
|
Display the command status for those Chrome profiles:
|
||||||
|
```
|
||||||
|
gam show chromeprofilecommand 4c6c0a9f-de78-4285-be86-713fca8cffff,aa03151c-7c1d-41fe-b793-5753e167ffff
|
||||||
|
gam print chromeprofilecommand 4c6c0a9f-de78-4285-be86-713fca8cffff,aa03151c-7c1d-41fe-b793-5753e167ffff
|
||||||
|
```
|
||||||
|
|
||||||
|
Clear cache and cookies for Chrome profiles in a CSV file named `ChromeProfiles.csv` with a column `name`:
|
||||||
|
```
|
||||||
|
gam create chromeprofilecommand select csvfile ChromeProfiles.csv:name clearcache clearcookies
|
||||||
|
```
|
||||||
|
|
||||||
|
Display the command status for those Chrome profiles:
|
||||||
|
```
|
||||||
|
gam show chromeprofilecommand select csvfile ChromeProfiles.csv:name
|
||||||
|
gam print chromeprofilecommand select csvfile ChromeProfiles.csv:name
|
||||||
|
```
|
||||||
|
|
||||||
|
Clear cache and cookies for Chrome profiles with last activity more that 60 days ago:
|
||||||
|
```
|
||||||
|
gam create chromeprofilecommand filter "lastActivityTime < \"#filtertime1#\"" filtertime1 -60d clearcache clearcookies
|
||||||
|
```
|
||||||
|
|
||||||
|
Display the command status for those Chrome profiles:
|
||||||
|
```
|
||||||
|
gam show chromeprofilecommand filter "lastActivityTime < \"#filtertime1#\"" filtertime1 -60d
|
||||||
|
gam print chromeprofilecommand filter "lastActivityTime < \"#filtertime1#\"" filtertime1 -60d
|
||||||
|
```
|
||||||
|
|
||||||
|
Clear cache and cookies for Chrome profiles with last activity more that 60 days ago:
|
||||||
|
```
|
||||||
|
gam redirect csv ./ChromeProfileCmds.csv create chromeprofilecommand filter "lastActivityTime < \"#filtertime1#\"" filtertime1 -60d clearcache clearcookies csv
|
||||||
|
```
|
||||||
|
|
||||||
|
Display the command status for those Chrome profile commands
|
||||||
|
```
|
||||||
|
gam show chromeprofilecommand commands ChromeProfileCmds.csv:name
|
||||||
|
gam print chromeprofilecommand commands ChromeProfileCmds.csv:name
|
||||||
|
```
|
||||||
@@ -1,14 +1,11 @@
|
|||||||
# Chrome Version Counts
|
# Chrome Version Counts
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [Chrome Version Counts](#chrome-version-counts)
|
- [Definitions](#definitions)
|
||||||
- [API documentation](#api-documentation)
|
- [Quoting rules](#quoting-rules)
|
||||||
- [Definitions](#definitions)
|
- [Display Chrome version counts](#display-chrome-version-counts)
|
||||||
- [Quoting rules](#quoting-rules)
|
|
||||||
- [Display Chrome version counts](#display-chrome-version-counts)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Chrome Management API - Count Chrome Versions](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeVersions)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countChromeVersions
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these features you must add the `Chrome Management API` to your project and authorize
|
To use these features you must add the `Chrome Management API` to your project and authorize
|
||||||
@@ -1,18 +1,15 @@
|
|||||||
# Chrome Version History
|
# Chrome Version History
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [Chrome Version History](#chrome-version-history)
|
- [Definitions](#definitions)
|
||||||
- [API documentation](#api-documentation)
|
- [Display Chrome platforms](#display-chrome-platforms)
|
||||||
- [Definitions](#definitions)
|
- [Display Chrome channels](#display-chrome-channels)
|
||||||
- [Display Chrome platforms](#display-chrome-platforms)
|
- [Display Chrome versions](#display-chrome-versions)
|
||||||
- [Display Chrome channels](#display-chrome-channels)
|
- [Display Chrome releases](#display-chrome-releases)
|
||||||
- [Display Chrome versions](#display-chrome-versions)
|
|
||||||
- [Display Chrome releases](#display-chrome-releases)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Version History API](https://developer.chrome.com/docs/versionhistory/guide)
|
||||||
* https://developer.chrome.com/docs/versionhistory/guide/
|
* [Version Filter](https://developer.chrome.com/docs/versionhistory/reference/#filter)
|
||||||
* https://developer.chrome.com/docs/versionhistory/reference/#filter
|
* [Version Orderby](https://developer.chrome.com/docs/versionhistory/reference/#order)
|
||||||
* https://developer.chrome.com/docs/versionhistory/reference/#order
|
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
@@ -1,45 +1,42 @@
|
|||||||
# ChromeOS Devices
|
# ChromeOS Devices
|
||||||
|
- [API documentation](#api-documentation)
|
||||||
- [ChromeOS Devices](#chromeos-devices)
|
- [Query documentation](#query-documentation)
|
||||||
- [API documentation](#api-documentation)
|
- [Notes](#notes)
|
||||||
- [Query documentation](#query-documentation)
|
- [Definitions](#definitions)
|
||||||
- [Notes](#notes)
|
- [CrOS Query Searchable Fields](#cros-query-searchable-fields)
|
||||||
- [Definitions](#definitions)
|
- [ChromeOS device update OU error handling](#chromeos-device-update-ou-error-handling)
|
||||||
- [CrOS Query Searchable Fields](#cros-query-searchable-fields)
|
- [Manage ChromeOS devices](#manage-chromeos-devices)
|
||||||
- [ChromeOS device update OU error handling](#chromeos-device-update-ou-error-handling)
|
- [Example: Move CrOS devices from one OU to another](#example-move-cros-devices-from-one-ou-to-another)
|
||||||
- [Manage ChromeOS devices](#manage-chromeos-devices)
|
- [Example: Add a new note to existing notes](#example-add-a-new-note-to-existing-notes)
|
||||||
- [Example: Move CrOS devices from one OU to another](#example-move-cros-devices-from-one-ou-to-another)
|
- [Add ChromeOS devices to an organizational unit](#add-chromeos-devices-to-an-organizational-unit)
|
||||||
- [Example: Add a new note to existing notes](#example-add-a-new-note-to-existing-notes)
|
- [Example: Add ChromeOS devices to a single OU](#example-add-chromeos-devices-to-a-single-ou)
|
||||||
- [Add ChromeOS devices to an organizational unit](#add-chromeos-devices-to-an-organizational-unit)
|
- [Example: Add ChromeOS devices to multiple OUs](#example-add-chromeos-devices-to-multiple-ous)
|
||||||
- [Example: Add ChromeOS devices to a single OU](#example-add-chromeos-devices-to-a-single-ou)
|
- [Action ChromeOS devices](#action-chromeos-devices)
|
||||||
- [Example: Add ChromeOS devices to multiple OUs](#example-add-chromeos-devices-to-multiple-ous)
|
- [Send remote commands to ChromeOS devices](#send-remote-commands-to-chromeos-devices)
|
||||||
- [Action ChromeOS devices](#action-chromeos-devices)
|
- [Action Examples](#action-examples)
|
||||||
- [Send remote commands to ChromeOS devices](#send-remote-commands-to-chromeos-devices)
|
- [ChromeOS device lists](#chromeos-device-lists)
|
||||||
- [Action Examples](#action-examples)
|
- [Display information about ChromeOS devices](#display-information-about-chromeos-devices)
|
||||||
- [ChromeOS device lists](#chromeos-device-lists)
|
- [Print ChromeOS devices](#print-chromeos-devices)
|
||||||
- [Display information about ChromeOS devices](#display-information-about-chromeos-devices)
|
- [Print no header row and deviceId for specified CrOS devices](#print-no-header-row-and-deviceid-for-specified-cros-devices)
|
||||||
- [Print ChromeOS devices](#print-chromeos-devices)
|
- [Print a header row and fields for selected CrOS devices](#print-a-header-row-and-fields-for-selected-cros-devices)
|
||||||
- [Print no header row and deviceId for specified CrOS devices](#print-no-header-row-and-deviceid-for-specified-cros-devices)
|
- [Print a header row and fields for specified CrOS devices](#print-a-header-row-and-fields-for-specified-cros-devices)
|
||||||
- [Print a header row and fields for selected CrOS devices](#print-a-header-row-and-fields-for-selected-cros-devices)
|
- [Display Examples](#display-examples)
|
||||||
- [Print a header row and fields for specified CrOS devices](#print-a-header-row-and-fields-for-specified-cros-devices)
|
- [Display CrOS device counts](#display-cros-device-counts)
|
||||||
- [Display Examples](#display-examples)
|
- [Print ChromeOS device activity](#print-chromeos-device-activity)
|
||||||
- [Display CrOS device counts](#display-cros-device-counts)
|
- [Print a header row and activity for selected CrOS devices](#print-a-header-row-and-activity-for-selected-cros-devices)
|
||||||
- [Print ChromeOS device activity](#print-chromeos-device-activity)
|
- [Print a header row and activity for specified CrOS devices](#print-a-header-row-and-activity-for-specified-cros-devices)
|
||||||
- [Print a header row and activity for selected CrOS devices](#print-a-header-row-and-activity-for-selected-cros-devices)
|
- [Download a ChromeOS device file](#download-a-chromeos-device-file)
|
||||||
- [Print a header row and activity for specified CrOS devices](#print-a-header-row-and-activity-for-specified-cros-devices)
|
- [Download Examples](#download-examples)
|
||||||
- [Download a ChromeOS device file](#download-a-chromeos-device-file)
|
- [Display ChromeOS telemetry data](#display-chromeos-telemetry-data)
|
||||||
- [Download Examples](#download-examples)
|
- [Check ChromeOS device serial number validity](#check-chromeos-device-serial-number-validity)
|
||||||
- [Display ChromeOS telemetry data](#display-chromeos-telemetry-data)
|
|
||||||
- [Check ChromeOS device serial number validity](#check-chromeos-device-serial-number-validity)
|
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
|
* [Directory API ChromeOS Devices](https://developers.google.com/admin-sdk/directory/reference/rest/v1/chromeosdevices)
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/chromeosdevices
|
* [Chrome Management API - Device Telemetry](https://developers.google.com/chrome/management/reference/rest/v1/customers.telemetry.devices)
|
||||||
* https://developers.google.com/chrome/management/reference/rest/v1/customers.telemetry.devices
|
|
||||||
|
|
||||||
## Query documentation
|
## Query documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/v1/list-query-operators
|
* [Search ChromeOS Devices](https://developers.google.com/admin-sdk/directory/v1/list-query-operators)
|
||||||
* https://support.google.com/chrome/a/answer/1698333
|
* [View ChromeOS Device List and Details](https://support.google.com/chrome/a/answer/1698333)
|
||||||
|
|
||||||
Undocumented API query terms.
|
Undocumented API query terms.
|
||||||
```
|
```
|
||||||
@@ -58,7 +55,8 @@ update_status:default_os_up_to_date|pending_update|os_image_download_not_started
|
|||||||
```
|
```
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
The `crostelemetry` commands were added in 6.13.04; to use them you must authorize an additional scope:
|
To use the `crostelemetry` commands you must authorize an additional scope:
|
||||||
|
|
||||||
* `Chrome Management API - Telemetry read only`
|
* `Chrome Management API - Telemetry read only`
|
||||||
```
|
```
|
||||||
gam oauth create
|
gam oauth create
|
||||||
@@ -86,7 +84,7 @@ The second form is backwards compatible with Legacy GAM and selection with `<CrO
|
|||||||
<SerialNumberList> ::= "<SerialNumber>(,<SerialNumber>)*"
|
<SerialNumberList> ::= "<SerialNumber>(,<SerialNumber>)*"
|
||||||
<SerialNumberEntity> ::=
|
<SerialNumberEntity> ::=
|
||||||
<SerialNumberList> | <FileSelector> | <CSVFileSelector>
|
<SerialNumberList> | <FileSelector> | <CSVFileSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
|
||||||
<CrOSEntity> ::=
|
<CrOSEntity> ::=
|
||||||
<CrOSIDList> | (cros_sn <SerialNumberList>) |
|
<CrOSIDList> | (cros_sn <SerialNumberList>) |
|
||||||
@@ -108,12 +106,14 @@ The second form is backwards compatible with Legacy GAM and selection with `<CrO
|
|||||||
autoupdatethrough|
|
autoupdatethrough|
|
||||||
backlightinfo|
|
backlightinfo|
|
||||||
bootmode|
|
bootmode|
|
||||||
|
chromeostype|
|
||||||
cpuinfo|
|
cpuinfo|
|
||||||
cpustatusreports|
|
cpustatusreports|
|
||||||
deprovisionreason|
|
deprovisionreason|
|
||||||
devicefiles|
|
devicefiles|
|
||||||
deviceid|
|
deviceid|
|
||||||
devicelicensetype|
|
devicelicensetype|
|
||||||
|
diskspaceusage|
|
||||||
diskvolumereports|
|
diskvolumereports|
|
||||||
dockmacaddress|
|
dockmacaddress|
|
||||||
ethernetmacaddress|
|
ethernetmacaddress|
|
||||||
@@ -121,6 +121,7 @@ The second form is backwards compatible with Legacy GAM and selection with `<CrO
|
|||||||
extendedsupporteligible|
|
extendedsupporteligible|
|
||||||
extendedsupportstart|
|
extendedsupportstart|
|
||||||
extendedsupportenabled|
|
extendedsupportenabled|
|
||||||
|
faninfo|
|
||||||
firmwareversion|
|
firmwareversion|
|
||||||
firstenrollmenttime|
|
firstenrollmenttime|
|
||||||
lastdeprovisiontimestamp|
|
lastdeprovisiontimestamp|
|
||||||
@@ -476,7 +477,7 @@ Remove profiles using the annotatedAssetID, which is a user editable field, in t
|
|||||||
```
|
```
|
||||||
gam cros_query "asset_id:CB1234" issuecommand command wipe_users doit
|
gam cros_query "asset_id:CB1234" issuecommand command wipe_users doit
|
||||||
```
|
```
|
||||||
For multiple devices you can sepatete each asset ID with a comma
|
For multiple devices you can separate each asset ID with a comma
|
||||||
```
|
```
|
||||||
gam cros_queries "asset_id:CB1234,asset_id:CB5678" issuecommand command wipe_users doit
|
gam cros_queries "asset_id:CB1234,asset_id:CB5678" issuecommand command wipe_users doit
|
||||||
```
|
```
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
- [Create and update courses](#create-and-update-courses)
|
- [Create and update courses](#create-and-update-courses)
|
||||||
- [Delete courses](#delete-courses)
|
- [Delete courses](#delete-courses)
|
||||||
- [Manage course aliases](#manage-course-aliases)
|
- [Manage course aliases](#manage-course-aliases)
|
||||||
|
- [Manage course announcements](#manage-course-announcements)
|
||||||
- [Manage course topics](#manage-course-topics)
|
- [Manage course topics](#manage-course-topics)
|
||||||
- [Display courses](#display-courses)
|
- [Display courses](#display-courses)
|
||||||
- [Display course counts](#display-course-counts)
|
- [Display course counts](#display-course-counts)
|
||||||
@@ -18,14 +19,14 @@
|
|||||||
- [Display course submissions](#display-course-submissions)
|
- [Display course submissions](#display-course-submissions)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/classroom/reference/rest/
|
* [Google Classroom API](https://developers.google.com/classroom/reference/rest)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.students
|
* [Google Classroom API - Courses Students](https://developers.google.com/classroom/reference/rest/v1/courses.students)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.teachers
|
* [Google Classroom API - Courses Teachers](https://developers.google.com/classroom/reference/rest/v1/courses.teachers)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.announcements/list
|
* [Google Classroom API - Announcements](https://developers.google.com/classroom/reference/rest/v1/courses.announcements/list)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.topics/list
|
* [Google Classroom API - Topics](https://developers.google.com/classroom/reference/rest/v1/courses.topics/list)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/list
|
* [Google Classroom API - Course Work](https://developers.google.com/classroom/reference/rest/v1/courses.courseWork/list)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.courseWorkMaterials/list
|
* [Google Classroom API - Course Work Materials](https://developers.google.com/classroom/reference/rest/v1/courses.courseWorkMaterials/list)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.courseWork.studentSubmissions/list
|
* [Google Classroom API - Course Work Student Submissions](https://developers.google.com/classroom/reference/rest/v1/courses.courseWork.studentSubmissions/list)
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
In this document, `course materials` refers to stand-alone materials, not the materials associated with
|
In this document, `course materials` refers to stand-alone materials, not the materials associated with
|
||||||
@@ -44,54 +45,65 @@ gam user user@domain.com check|update serviceaccount
|
|||||||
<UniqueID> ::= id:<String>
|
<UniqueID> ::= id:<String>
|
||||||
<UserItem> ::= <EmailAddress>|<UniqueID>|<String>
|
<UserItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||||
|
|
||||||
|
<RegularExpression> ::= <String>
|
||||||
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
|
|
||||||
<CourseAlias> ::= <String>
|
<CourseAlias> ::= <String>
|
||||||
<CourseAliasList> ::= "<CourseAlias>(,<CourseAlias>)*"
|
<CourseAliasList> ::= "<CourseAlias>(,<CourseAlias>)*"
|
||||||
<CourseAliasEntity> ::=
|
<CourseAliasEntity> ::=
|
||||||
<CourseAliasList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVDataSelector>
|
<CourseAliasList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
|
<CourseAnnouncementContent> ::=
|
||||||
|
((text <String>)|
|
||||||
|
(textfile <FileName> [charset <Charset>])|
|
||||||
|
(gdoc <UserGoogleDoc>)|
|
||||||
|
(gcsdoc <StorageBucketObjectName>))
|
||||||
<CourseAnnouncementID> ::= <Number>
|
<CourseAnnouncementID> ::= <Number>
|
||||||
<CourseAnnouncementIDList> ::= "<CourseAnnouncementID>(,<CourseAnnouncementID>)*"
|
<CourseAnnouncementIDList> ::= "<CourseAnnouncementID>(,<CourseAnnouncementID>)*"
|
||||||
<CourseAnnouncementIDEntity> ::=
|
<CourseAnnouncementIDEntity> ::=
|
||||||
<CourseAnnouncementIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
<CourseAnnouncementIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseAnnouncementState> ::= draft|published|deleted
|
<CourseAnnouncementState> ::= draft|published|deleted
|
||||||
<CourseAnnouncementStateList> ::= all|"<CourseAnnouncementState>(,<CourseAnnouncementState>)*"
|
<CourseAnnouncementStateList> ::= all|"<CourseAnnouncementState>(,<CourseAnnouncementState>)*"
|
||||||
<CourseID> ::= <Number>|d:<CourseAlias>
|
<CourseID> ::= <Number>|d:<CourseAlias>
|
||||||
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
||||||
<CourseEntity> ::=
|
<CourseEntity> ::=
|
||||||
<CourseIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>
|
<CourseIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseMaterialID> ::= <Number>
|
<CourseMaterialID> ::= <Number>
|
||||||
<CourseMaterialIDList> ::= "<CourseMaterialID>(,<CourseMaterialID>)*"
|
<CourseMaterialIDList> ::= "<CourseMaterialID>(,<CourseMaterialID>)*"
|
||||||
<CourseMaterialState> ::= draft|published|deleted
|
<CourseMaterialState> ::= draft|published|deleted
|
||||||
<CourseMaterialStateList> ::= all|"<CourseMaterialState>(,<CourseMaterialState>)*"
|
<CourseMaterialStateList> ::= all|"<CourseMaterialState>(,<CourseMaterialState>)*"
|
||||||
<CourseMaterialIDEntity> ::=
|
<CourseMaterialIDEntity> ::=
|
||||||
<CourseMaterialIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>
|
<CourseMaterialIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVSubkeySelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseState> ::= active|archived|provisioned|declined|suspended
|
<CourseState> ::= active|archived|provisioned|declined|suspended
|
||||||
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
||||||
<CourseSubmissionID> ::= <Number>
|
<CourseSubmissionID> ::= <Number>
|
||||||
<CourseSubmissionIDList> ::= "<CourseSubmissionID>(,<CourseSubmissionID>)*"
|
<CourseSubmissionIDList> ::= "<CourseSubmissionID>(,<CourseSubmissionID>)*"
|
||||||
<CourseSubmissionIDEntity> ::=
|
<CourseSubmissionIDEntity> ::=
|
||||||
<CourseSubmissionIDList>|<FileSelector>|<CSVFileSelector>|<CSVDataSelector>
|
<CourseSubmissionIDList>|<FileSelector>|<CSVFileSelector>|<CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseSubmissionState> ::= new|created|turned_in|returned|reclaimed_by_student
|
<CourseSubmissionState> ::= new|created|turned_in|returned|reclaimed_by_student
|
||||||
<CourseSubmissionStateList> ::= all|"<CourseSubmissionState>(,<CourseSubmissionState>)*"
|
<CourseSubmissionStateList> ::= all|"<CourseSubmissionState>(,<CourseSubmissionState>)*"
|
||||||
<CourseTopic> ::= <String>
|
<CourseTopic> ::= <String>
|
||||||
<CourseTopicList> ::= "<CourseTopic>(,<CourseTopic>)*"
|
<CourseTopicList> ::= "<CourseTopic>(,<CourseTopic>)*"
|
||||||
<CourseTopicEntity> ::=
|
<CourseTopicEntity> ::=
|
||||||
<CourseTopicList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<CourseTopicList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseTopicID> ::= <Number>
|
<CourseTopicID> ::= <Number>
|
||||||
<CourseTopicIDList> ::= "<CourseTopicID>(,<CourseTopicID>)*"
|
<CourseTopicIDList> ::= "<CourseTopicID>(,<CourseTopicID>)*"
|
||||||
<CourseTopicIDEntity> ::=
|
<CourseTopicIDEntity> ::=
|
||||||
<CourseTopicIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
<CourseTopicIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseWorkID> ::= <Number>
|
<CourseWorkID> ::= <Number>
|
||||||
<CourseWorkIDList> ::= "<CourseWorkID>(,<CourseWorkID>)*"
|
<CourseWorkIDList> ::= "<CourseWorkID>(,<CourseWorkID>)*"
|
||||||
<CourseWorkIDEntity> ::=
|
<CourseWorkIDEntity> ::=
|
||||||
<CourseWorkIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
<CourseWorkIDList>|<FileSelector>|<CSVFileSelector>|<CSVkmdSelector>|<CSVSubkeySelector>|<CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseWorkState> ::= draft|published|deleted
|
<CourseWorkState> ::= draft|published|deleted
|
||||||
<CourseWorkStateList> ::= all|"<CourseWorkState>(,<CourseWorkState>)*"
|
<CourseWorkStateList> ::= all|"<CourseWorkState>(,<CourseWorkState>)*"
|
||||||
|
|
||||||
@@ -239,24 +251,14 @@ See: [Lists and Collections](Lists-and-Collections)
|
|||||||
When updating a course owner, the Classroom API generates an error if the new owner is not a co-teacher
|
When updating a course owner, the Classroom API generates an error if the new owner is not a co-teacher
|
||||||
or is the current owner.
|
or is the current owner.
|
||||||
|
|
||||||
Prior to version 5.31.08, if `<UserItem>` was not a co-teacher, you got this error:
|
If `<UserItem>` is not a co-teacher, GAM adds `<UserItem>` as a co-teacher of the course,
|
||||||
```
|
pauses 10 seconds, and then updates them to be the owner.
|
||||||
$ gam update course 123929046789 teacher newteacher@domain.com
|
|
||||||
Course: 123929046789, Update Failed: @IneligibleOwner Only a co-teacher can be invited as owner of the course
|
|
||||||
```
|
|
||||||
GAM now adds `<UserItem>` as a co-teacher of the course, pauses 10 seconds, and then updates them to be the owner.
|
|
||||||
```
|
```
|
||||||
$ gam update course 123929046789 teacher newteacher@domain.com
|
$ gam update course 123929046789 teacher newteacher@domain.com
|
||||||
Course Name: Test, Course: 123929046789, Updated with new teacher as owner: newteacher@domain.com
|
Course Name: Test, Course: 123929046789, Updated with new teacher as owner: newteacher@domain.com
|
||||||
```
|
```
|
||||||
|
|
||||||
Prior to version 5.31.08, if `<UserItem>` is the current owner, you got this error:
|
If `<UserItem>` is the current owner, GAM now reports that the current owner was retained.
|
||||||
```
|
|
||||||
$ gam update course 123929046789 teacher newteacher@domain.com
|
|
||||||
Course: 123929046789, Update Failed: @UserAlreadyOwner Cannot transfer course to the user who is already the owner
|
|
||||||
|
|
||||||
```
|
|
||||||
GAM now reports that the current owner was retained.
|
|
||||||
```
|
```
|
||||||
$ gam update course 123929046789 teacher newteacher@domain.com
|
$ gam update course 123929046789 teacher newteacher@domain.com
|
||||||
Course Name: Test, Course: 123929046789, Updated with current owner: newteacher@domain.com
|
Course Name: Test, Course: 123929046789, Updated with current owner: newteacher@domain.com
|
||||||
@@ -393,17 +395,40 @@ These commands can process multiple courses.
|
|||||||
gam courses <CourseEntity> add alias <CourseAliasEntity>
|
gam courses <CourseEntity> add alias <CourseAliasEntity>
|
||||||
gam courses <CourseEntity> delete alias <CourseAliasEntity>
|
gam courses <CourseEntity> delete alias <CourseAliasEntity>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Manage course announcements
|
||||||
|
These commands can process a single course.
|
||||||
|
```
|
||||||
|
gam course <CourseID> add announcement
|
||||||
|
<CourseAnnouncementContent> [scheduledtime <Time>] [state draft|published]
|
||||||
|
gam course <CourseID> delete announcement <CourseAnnouncementID>
|
||||||
|
gam course <CourseID> update announcement <CourseAnnouncementID>
|
||||||
|
[<CourseAnnouncementContent>] [scheduledtime <Time>] [state published]
|
||||||
|
```
|
||||||
|
These commands can process multiple courses.
|
||||||
|
```
|
||||||
|
gam courses <CourseEntity> add announcement
|
||||||
|
<CourseAnnouncementContent> [scheduledtime <Time>] [state draft|published]
|
||||||
|
gam courses <CourseEntity> delete announcement <CourseAnnouncementIDEntity>
|
||||||
|
gam courses <CourseEntity> update announcement <CourseAnnouncementIDEntity>
|
||||||
|
[<CourseAnnouncementContent>] [scheduledtime <Time>] [state published]
|
||||||
|
```
|
||||||
|
|
||||||
## Manage course topics
|
## Manage course topics
|
||||||
These commands can process a single course.
|
These commands can process a single course.
|
||||||
```
|
```
|
||||||
gam course <CourseID> add topic <CourseTopic>
|
gam course <CourseID> add topic <CourseTopic>
|
||||||
gam course <CourseID> delete topic <CourseTopicID>
|
gam course <CourseID> delete topic <CourseTopicID>
|
||||||
|
gam course <CourseID> update topic <CourseTopicID> <CourseTopic>
|
||||||
|
|
||||||
```
|
```
|
||||||
These commands can process multiple courses.
|
These commands can process multiple courses.
|
||||||
```
|
```
|
||||||
gam courses <CourseEntity> add topic <CourseTopicEntity>
|
gam courses <CourseEntity> add topic <CourseTopicEntity>
|
||||||
gam courses <CourseEntity> delete topic <CourseTopicIDEntity>
|
gam courses <CourseEntity> delete topic <CourseTopicIDEntity>
|
||||||
|
gam courses <CourseEntity> update topic <CourseTopicIDEntity> <CourseTopic>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Display courses
|
## Display courses
|
||||||
```
|
```
|
||||||
gam info course <CourseID> [owneremail] [alias|aliases] [show all|students|teachers] [countsonly]
|
gam info course <CourseID> [owneremail] [alias|aliases] [show all|students|teachers] [countsonly]
|
||||||
@@ -413,7 +438,7 @@ gam info courses <CourseEntity> [owneremail] [alias|aliases] [show all|students|
|
|||||||
|
|
||||||
gam print courses [todrive <ToDriveAttribute>*]
|
gam print courses [todrive <ToDriveAttribute>*]
|
||||||
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
||||||
[owneremail] [owneremailmatchpattern <RegularExpression>]
|
[owneremail] [owneremailmatchpattern <REMatchPattern>]
|
||||||
[alias|aliases|aliasesincolumns [delimiter <Character>]]
|
[alias|aliases|aliasesincolumns [delimiter <Character>]]
|
||||||
[show all|students|teachers] [countsonly]
|
[show all|students|teachers] [countsonly]
|
||||||
[fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>] [formatjson [quotechar <Character>]]
|
[fields <CourseFieldNameList>] [skipfields <CourseFieldNameList>] [formatjson [quotechar <Character>]]
|
||||||
@@ -424,7 +449,7 @@ By default, the `print courses` command displays information about all courses.
|
|||||||
To get information about a specific set of courses, use the following option; it can be repeated to select multiple courses.
|
To get information about a specific set of courses, use the following option; it can be repeated to select multiple courses.
|
||||||
* `(course|class <CourseEntity>)*` - Display courses with the IDs specified in `<CourseEntity>`.
|
* `(course|class <CourseEntity>)*` - Display courses with the IDs specified in `<CourseEntity>`.
|
||||||
|
|
||||||
To get information about courses based on its owner's emailaddress, use the `owneremailmatchpattern <RegularExpression>` option.
|
To get information about courses based on its owner's emailaddress, use the `owneremailmatchpattern <REMatchPattern>` option.
|
||||||
* `foo@bar.com` - Display courses with a specific owner emailaddress.
|
* `foo@bar.com` - Display courses with a specific owner emailaddress.
|
||||||
* `.*test.*` - Display courses with an owner emailaddress that matches a pattern.
|
* `.*test.*` - Display courses with an owner emailaddress that matches a pattern.
|
||||||
* `Unknown user` - Display courses where the owner emailaddress has been deleted.
|
* `Unknown user` - Display courses where the owner emailaddress has been deleted.
|
||||||
@@ -467,7 +492,7 @@ Display the number of courses.
|
|||||||
```
|
```
|
||||||
gam print courses
|
gam print courses
|
||||||
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
||||||
[owneremailmatchpattern <RegularExpression>]
|
[owneremailmatchpattern <REMatchPattern>]
|
||||||
showitemcountonly
|
showitemcountonly
|
||||||
```
|
```
|
||||||
Example
|
Example
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
- [Display guardians, CSV format](#display-guardians-csv-format)
|
- [Display guardians, CSV format](#display-guardians-csv-format)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations
|
* [Classroom API - User Profile Guardian Invitations](https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardianInvitations)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardians
|
* [Classroom API - User Profile Guardians](https://developers.google.com/classroom/reference/rest/v1/userProfiles.guardians)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
<GuardianItemList> ::= "<GuardianItem>(,<GuardianItem>)*"
|
<GuardianItemList> ::= "<GuardianItem>(,<GuardianItem>)*"
|
||||||
<GuardianEntity> ::=
|
<GuardianEntity> ::=
|
||||||
<GuardianList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<GuardianList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<StudentItem> ::= <EmailAddress>|<UniqueID>|<String>
|
<StudentItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||||
<GuardianInvitationID> ::= <String>
|
<GuardianInvitationID> ::= <String>
|
||||||
<GuardianInvitationIDList> ::= "<GuardianInvitationId>(,<GuardianInvitationID>)*"
|
<GuardianInvitationIDList> ::= "<GuardianInvitationId>(,<GuardianInvitationID>)*"
|
||||||
<GuardianInvitationIDEntity> ::=
|
<GuardianInvitationIDEntity> ::=
|
||||||
<GuardianInvitationIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<GuardianInvitationIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<GuardianState> ::= complete|pending
|
<GuardianState> ::= complete|pending
|
||||||
<GuardianStateList> ::= "<GuardianState>(,<GuardianState>)*"
|
<GuardianStateList> ::= "<GuardianState>(,<GuardianState>)*"
|
||||||
```
|
```
|
||||||
@@ -10,18 +10,18 @@
|
|||||||
- [Display classroom invitations by course](#display-classroom-invitations-by-course)
|
- [Display classroom invitations by course](#display-classroom-invitations-by-course)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/invitations
|
* [Classroom API - Invitations](https://developers.google.com/classroom/reference/rest/v1/invitations)
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
You must authorize an additional Service Account scope to use these commands.
|
You must authorize an additional Service Account scope to use these commands.
|
||||||
Do this command; sustitute a valid email address for user@domain.com.
|
Do this command; sustitute a valid email address for user@domain.com.
|
||||||
```
|
```
|
||||||
gam user user@domain.com check serviceaccount
|
gam user user@domain.com update serviceaccount
|
||||||
```
|
```
|
||||||
You should see the following scope fail:
|
You should enable:
|
||||||
```
|
```
|
||||||
Scope: https://www.googleapis.com/auth/classroom.rosters , Checked: FAIL (6/15)
|
[*] 17) Classroom API - Rosters (supports readonly)
|
||||||
```
|
```
|
||||||
Follow the directions to authorize the Service Account scopes.
|
Follow the directions to authorize the Service Account scopes.
|
||||||
|
|
||||||
@@ -34,13 +34,13 @@ Follow the directions to authorize the Service Account scopes.
|
|||||||
<ClassroomInvitationIDList> ::= "<ClassroomInvitationID>(,<ClassroomInvitationID>)*"
|
<ClassroomInvitationIDList> ::= "<ClassroomInvitationID>(,<ClassroomInvitationID>)*"
|
||||||
<ClassroomInvitationIDEntity> ::=
|
<ClassroomInvitationIDEntity> ::=
|
||||||
<ClassroomInvitationIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<ClassroomInvitationIDList> | <FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseAlias> ::= <String>
|
<CourseAlias> ::= <String>
|
||||||
<CourseID> ::= <Number>|d:<CourseAlias>
|
<CourseID> ::= <Number>|d:<CourseAlias>
|
||||||
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
||||||
<CourseEntity> ::=
|
<CourseEntity> ::=
|
||||||
<CourseIDList> | <FileSelector> | <CSVFileSelector | <CSVkmdSelector>
|
<CourseIDList> | <FileSelector> | <CSVFileSelector | <CSVkmdSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseState> ::= active|archived|provisioned|declined|suspended
|
<CourseState> ::= active|archived|provisioned|declined|suspended
|
||||||
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
||||||
```
|
```
|
||||||
@@ -9,9 +9,9 @@
|
|||||||
- [Display course membership counts](#display-course-membership-counts)
|
- [Display course membership counts](#display-course-membership-counts)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/classroom/reference/rest/
|
* [Google Classroom API](https://developers.google.com/classroom/reference/rest)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.students
|
* [Google Classroom API - Courses Students](https://developers.google.com/classroom/reference/rest/v1/courses.students)
|
||||||
* https://developers.google.com/classroom/reference/rest/v1/courses.teachers
|
* [Google Classroom API - Courses Teachers](https://developers.google.com/classroom/reference/rest/v1/courses.teachers)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
<CourseIDList> ::= "<CourseID>(,<CourseID>)*"
|
||||||
<CourseEntity> ::=
|
<CourseEntity> ::=
|
||||||
<CourseIDList> | <FileSelector> | <CSVFileSelector | <CSVkmdSelector>
|
<CourseIDList> | <FileSelector> | <CSVFileSelector | <CSVkmdSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<CourseState> ::= active|archived|provisioned|declined|suspended
|
<CourseState> ::= active|archived|provisioned|declined|suspended
|
||||||
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
||||||
```
|
```
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
- [Display Channel SKUs](#display-channel-skus)
|
- [Display Channel SKUs](#display-channel-skus)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://cloud.google.com/channel/docs/reference/rest
|
* [Cloud Channel API](https://cloud.google.com/channel/docs/reference/rest)
|
||||||
* https://cloud.google.com/channel/docs/concepts/google-cloud/filter-customers
|
* [Filter Customers](https://cloud.google.com/channel/docs/concepts/google-cloud/filter-customers)
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
To use these commands you must add the 'Cloud Channel API' to your project and update your client authorization.
|
To use these commands you must add the 'Cloud Channel API' to your project and update your client authorization.
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
# Cloud Identity Devices
|
# Cloud Identity Devices
|
||||||
|
- [Notes](#notes)
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Query documentation](#query-documentation)
|
- [Query documentation](#query-documentation)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
@@ -20,15 +21,24 @@
|
|||||||
- [Display device user client state](#display-device-user-client-state)
|
- [Display device user client state](#display-device-user-client-state)
|
||||||
- [Update device user client state](#update-device-user-client-state)
|
- [Update device user client state](#update-device-user-client-state)
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
These commands use service account access with `admin_email` (if defined) from `gam.cfg` or
|
||||||
|
the admin from `oauth2.txt` (specified in `gam oauth create`).
|
||||||
|
|
||||||
|
Use `gam user user@domain.com update serviceaccount` and make sure that the following is specified:
|
||||||
|
```
|
||||||
|
[*] 17) Cloud Identity Devices API (supports readonly)
|
||||||
|
```
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/devices
|
* [Cloud Identity API - Devices](https://cloud.google.com/identity/docs/reference/rest/v1/devices)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/devices.deviceUsers
|
* [Cloud Identity API - Device Users](https://cloud.google.com/identity/docs/reference/rest/v1/devices.deviceUsers)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/devices.deviceUsers.clientStates
|
* [Cloud Identity API - Device User Client States](https://cloud.google.com/identity/docs/reference/rest/v1/devices.deviceUsers.clientStates)
|
||||||
* https://cloud.google.com/endpoint-verification/docs/overview
|
* [Endpoint Verification](https://cloud.google.com/endpoint-verification/docs/overview)
|
||||||
|
|
||||||
## Query documentation
|
## Query documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/v1/search-operators
|
* [Filters](https://support.google.com/a/answer/7549103)
|
||||||
* https://support.google.com/a/answer/7549103
|
* [Device Search Fields](https://developers.google.com/admin-sdk/directory/v1/search-operators)
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
@@ -57,11 +67,13 @@
|
|||||||
buildnumber|
|
buildnumber|
|
||||||
compromisedstate|
|
compromisedstate|
|
||||||
createtime|
|
createtime|
|
||||||
|
deviceid|
|
||||||
devicetype|
|
devicetype|
|
||||||
enableddeveloperoptions|
|
enableddeveloperoptions|
|
||||||
enabledusbdebugging|
|
enabledusbdebugging|
|
||||||
endpointverificationspecificattributes|
|
endpointverificationspecificattributes|
|
||||||
encryptionstate|
|
encryptionstate|
|
||||||
|
hostname|
|
||||||
imei|
|
imei|
|
||||||
kernelversion|
|
kernelversion|
|
||||||
lastsynctime|
|
lastsynctime|
|
||||||
@@ -77,6 +89,7 @@
|
|||||||
releaseversion|
|
releaseversion|
|
||||||
securitypatchtime|
|
securitypatchtime|
|
||||||
serialnumber|
|
serialnumber|
|
||||||
|
unifieddeviceid|
|
||||||
wifimacaddresses
|
wifimacaddresses
|
||||||
<DeviceFieldNameList> ::= "<DeviceFieldName>(,<DeviceFieldName>)*"
|
<DeviceFieldNameList> ::= "<DeviceFieldName>(,<DeviceFieldName>)*"
|
||||||
|
|
||||||
@@ -197,7 +210,8 @@ gam print devices [todrive <ToDriveAttribute>*]
|
|||||||
<DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
|
<DeviceFieldName>* [fields <DeviceFieldNameList>] [userfields <DeviceUserFieldNameList>]
|
||||||
[orderby <DeviceOrderByFieldName> [ascending|descending]]
|
[orderby <DeviceOrderByFieldName> [ascending|descending]]
|
||||||
[all|company|personal|nocompanydevices|nopersonaldevices]
|
[all|company|personal|nocompanydevices|nopersonaldevices]
|
||||||
[nodeviceusers]
|
[nodeviceusers|oneuserperrow]
|
||||||
|
[clientstates]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
```
|
```
|
||||||
By default, all devices are displayed; use the query options to limit the display.
|
By default, all devices are displayed; use the query options to limit the display.
|
||||||
@@ -218,6 +232,9 @@ Select the view of devices to display:
|
|||||||
By default, Gam makes additional API calls to display the device users for the devices;
|
By default, Gam makes additional API calls to display the device users for the devices;
|
||||||
use `nodeviceuser` to suppress making the additional calls.
|
use `nodeviceuser` to suppress making the additional calls.
|
||||||
|
|
||||||
|
By default, when device users are displayed, they are all displayed on one row;
|
||||||
|
use `oneuserperrow` to have each of a device's users displayed on a separate row with all of the other device fields.
|
||||||
|
|
||||||
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
||||||
* `formatjson` - Display the fields in JSON format.
|
* `formatjson` - Display the fields in JSON format.
|
||||||
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
# Cloud Identity Groups - Membership
|
# Cloud Identity Groups - Membership
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Query documentation](#query-documentation)
|
|
||||||
- [Cloud Identity Group Documentation](#cloud-identity-group-documentation)
|
|
||||||
- [Security Group Documentation](#security-group-documentation)
|
|
||||||
- [Python Regular Expressions](Python-Regular-Expressions) Match function
|
- [Python Regular Expressions](Python-Regular-Expressions) Match function
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Notes](#Notes)
|
- [Notes](#Notes)
|
||||||
@@ -18,18 +15,11 @@
|
|||||||
- [Display group membership in hierarchical format](#display-group-membership-in-hierarchical-format)
|
- [Display group membership in hierarchical format](#display-group-membership-in-hierarchical-format)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://cloud.google.com/identity/docs/groups
|
* [Cloud Identity Groups Overview](https://cloud.google.com/identity/docs/groups)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups
|
* [Cloud Identity Groups API - Groups](https://cloud.google.com/identity/docs/reference/rest/v1/groups)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships
|
* [Cloud Identity Groups API - Membership](https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships)
|
||||||
|
* [Cloud Identity Groups](https://gsuiteupdates.googleblog.com/2020/08/new-api-cloud-identity-groups-google.html)
|
||||||
## Query documentation
|
* [Security Groups](https://gsuiteupdates.googleblog.com/2020/09/security-groups-beta.html)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups#dynamicgroupquery
|
|
||||||
|
|
||||||
## Cloud Identity Group Documentation
|
|
||||||
* https://gsuiteupdates.googleblog.com/2020/08/new-api-cloud-identity-groups-google.html
|
|
||||||
|
|
||||||
## Security Group Documentation
|
|
||||||
* https://gsuiteupdates.googleblog.com/2020/09/security-groups-beta.html
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@@ -50,12 +40,16 @@ Dynamic Groups require Cloud Identity Premium accounts.
|
|||||||
* https://cloud.google.com/identity/docs/how-to/create-dynamic-groups
|
* https://cloud.google.com/identity/docs/how-to/create-dynamic-groups
|
||||||
|
|
||||||
The `cimember <UserItem>` option of `gam print|show cigroup-members` requires a Google Workspace Enterprise Standard, Enterprise Plus, and Enterprise for Education;
|
The `cimember <UserItem>` option of `gam print|show cigroup-members` requires a Google Workspace Enterprise Standard, Enterprise Plus, and Enterprise for Education;
|
||||||
and Cloud Identity Premium accounts. Unfortunately, even if you have the required account, the API call that supports the query doesn't work.
|
and Cloud Identity Premium accounts.
|
||||||
|
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships/searchTransitiveGroups
|
* https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships/searchTransitiveGroups
|
||||||
|
|
||||||
## Definitions
|
## Definitions
|
||||||
```
|
```
|
||||||
|
<DeviceId> ::= <String>
|
||||||
|
<CBCMBrowser> ::= id:cbcm-browser.<DeviceId>
|
||||||
|
<ChromeOSDevice> ::= id:chrome-os-device.<DeviceId>
|
||||||
|
<BrowserDeviceList> ::= "(<CBCMBrowser>|<ChromeOSDevice>)(,(<CBCMBrowser>|<ChromeOSDevice>))*"
|
||||||
<DomainName> ::= <String>(.<String>)+
|
<DomainName> ::= <String>(.<String>)+
|
||||||
<EmailAddress> ::= <String>@<DomainName>
|
<EmailAddress> ::= <String>@<DomainName>
|
||||||
<UniqueID> ::= id:<String>
|
<UniqueID> ::= id:<String>
|
||||||
@@ -63,27 +57,33 @@ and Cloud Identity Premium accounts. Unfortunately, even if you have the require
|
|||||||
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
||||||
<GroupEntity> ::=
|
<GroupEntity> ::=
|
||||||
<GroupList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<GroupList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<GroupRole> ::= owner|manager|member
|
<GroupRole> ::= owner|manager|member
|
||||||
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
||||||
<CIGroupType> ::= customer|group|other|serviceaccount|user
|
<CIGroupMemberType> ::= cbcmbrowser|chromeosdevice|customer|group|other|serviceaccount|user
|
||||||
<CIGroupTypeList> ::= "<CIGroupType>(,<CIGroupType>)*"
|
<CIGroupMemberTypeList> ::= "<CIGroupMemberType>(,<CIGroupMemberType>)*"
|
||||||
|
|
||||||
<CIGroupMembersFieldName> ::=
|
<CIGroupMembersFieldName> ::=
|
||||||
createtime
|
createtime
|
||||||
|
email|useremail|
|
||||||
expiretime|
|
expiretime|
|
||||||
memberkey|
|
memberkey|
|
||||||
name|
|
name|
|
||||||
preferredmemberkey|
|
preferredmemberkey|
|
||||||
role|
|
role|
|
||||||
type|
|
type|
|
||||||
updatetime|
|
updatetime
|
||||||
useremail
|
|
||||||
<CIGroupMembersFieldNameList> ::= "<CIGroupMembersFieldName>(,<CIGroupMembersFieldName>)*"
|
<CIGroupMembersFieldNameList> ::= "<CIGroupMembersFieldName>(,<CIGroupMembersFieldName>)*"
|
||||||
|
|
||||||
|
<RegularExpression> ::= <String>
|
||||||
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
```
|
```
|
||||||
|
|
||||||
## Collections of Users
|
## Collections of Users
|
||||||
Group membership commands involve specifying collections of users;
|
Group membership commands involve specifying collections of users or lists of browsers/devices;
|
||||||
for `<UserTypeEntity>`, see: [Collections of Users](Collections-of-Users)
|
for `<UserTypeEntity>`, see: [Collections of Users](Collections-of-Users)
|
||||||
|
|
||||||
## Add members to a group
|
## Add members to a group
|
||||||
@@ -92,7 +92,7 @@ gam update cigroups <GroupEntity> create|add [<GroupRole>]
|
|||||||
[usersonly|groupsonly]
|
[usersonly|groupsonly]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[expire|expires <Time>] [preview] [actioncsv]
|
[expire|expires <Time>] [preview] [actioncsv]
|
||||||
<UserTypeEntity>
|
<UserTypeEntity>|<BrowserDeviceList>
|
||||||
```
|
```
|
||||||
When `<UserTypeEntity>` specifies a group or groups:
|
When `<UserTypeEntity>` specifies a group or groups:
|
||||||
* `usersonly` - Only the user members from the specified groups are added
|
* `usersonly` - Only the user members from the specified groups are added
|
||||||
@@ -136,7 +136,7 @@ gam update cigroups <GroupEntity> delete|remove [<GroupRole>]
|
|||||||
[usersonly|groupsonly]
|
[usersonly|groupsonly]
|
||||||
[notsuspended|suspended] [notarchived|archived]
|
[notsuspended|suspended] [notarchived|archived]
|
||||||
[preview] [actioncsv]
|
[preview] [actioncsv]
|
||||||
<UserTypeEntity>
|
<UserTypeEntity>|<BrowserDeviceList>
|
||||||
```
|
```
|
||||||
`<GroupRole>` is ignored, deletions take place regardless of role.
|
`<GroupRole>` is ignored, deletions take place regardless of role.
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@ If `actioncsv` is specified, a CSV file with columns `group,email,role,action,me
|
|||||||
that shows the actions performed when updating the group.
|
that shows the actions performed when updating the group.
|
||||||
|
|
||||||
### Examples using CSV file and Google sheets:
|
### Examples using CSV file and Google sheets:
|
||||||
* https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Users#examples-using-csv-files-and-google-sheets-to-update-the-membership-of-a-group
|
* https://github.com/GAM-team/GAM/wiki/Collections-of-Users#examples-using-csv-files-and-google-sheets-to-update-the-membership-of-a-group
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
Assume that at your school there is a group for each grade level and the members come from an OU; here is a sample CSV file GradeOU.csv
|
Assume that at your school there is a group for each grade level and the members come from an OU; here is a sample CSV file GradeOU.csv
|
||||||
@@ -263,7 +263,7 @@ testgroup@domain.com,testuser4@domain.com,MEMBER,Added,Success
|
|||||||
```
|
```
|
||||||
gam update cigroups <GroupEntity> clear [member] [manager] [owner]
|
gam update cigroups <GroupEntity> clear [member] [manager] [owner]
|
||||||
[usersonly|groupsonly]
|
[usersonly|groupsonly]
|
||||||
[emailclearpattern|emailretainpattern <RegularExpression>]
|
[emailclearpattern|emailretainpattern <REMatchPattern>]
|
||||||
[preview] [actioncsv]
|
[preview] [actioncsv]
|
||||||
```
|
```
|
||||||
If none of `member`, `manager`, or `owner` are specified, `member` is assumed.
|
If none of `member`, `manager`, or `owner` are specified, `member` is assumed.
|
||||||
@@ -273,8 +273,8 @@ By default, when clearing members from a group, all members, whether users or gr
|
|||||||
* `groupsonly` - Clear only the group members
|
* `groupsonly` - Clear only the group members
|
||||||
|
|
||||||
Members that have met the above qualifications to be cleared can be further qualifed by their email address.
|
Members that have met the above qualifications to be cleared can be further qualifed by their email address.
|
||||||
* `emailclearpattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be cleared; others will be retained
|
* `emailclearpattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be cleared; others will be retained
|
||||||
* `emailretainpattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be retained; others will be cleared
|
* `emailretainpattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be retained; others will be cleared
|
||||||
|
|
||||||
If `preview` is specified, the deletes will be previewed but not executed.
|
If `preview` is specified, the deletes will be previewed but not executed.
|
||||||
|
|
||||||
@@ -346,13 +346,14 @@ gam info cimember <UserTypeEntity> <GroupEntity>
|
|||||||
```
|
```
|
||||||
gam print cigroup-members [todrive <ToDriveAttribute>*]
|
gam print cigroup-members [todrive <ToDriveAttribute>*]
|
||||||
[(cimember|showownedby <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
[(cimember|showownedby <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <REMatchPattern>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
[types <CIGroupTypeList>]
|
[types <CIGroupMemberTypeList>]
|
||||||
<CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
|
<CIGroupMembersFieldName>* [fields <CIGroupMembersFieldNameList>]
|
||||||
[(recursive [noduplicates])||includederivedmembership] [nogroupeemail]
|
[minimal|basic|full]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[(recursive [noduplicates]) | |includederivedmembership] [nogroupeemail]
|
||||||
|
[memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
|
||||||
```
|
```
|
||||||
By default, the group membership of all groups in the account are displayed, these options allow selection of subsets of groups:
|
By default, the group membership of all groups in the account are displayed, these options allow selection of subsets of groups:
|
||||||
* `cimember <UserItem>` - Limit display to groups that contain `<UserItem>` as a member
|
* `cimember <UserItem>` - Limit display to groups that contain `<UserItem>` as a member
|
||||||
@@ -361,12 +362,12 @@ By default, the group membership of all groups in the account are displayed, the
|
|||||||
* `select <GroupEntity>` - Limit display to the groups specified in `<GroupEntity>`
|
* `select <GroupEntity>` - Limit display to the groups specified in `<GroupEntity>`
|
||||||
|
|
||||||
These options further limit the list of groups selected above:
|
These options further limit the list of groups selected above:
|
||||||
* `emailmatchpattern <RegularExpression>` - Limit display to groups whose email address matches `<RegularExpression>`
|
* `emailmatchpattern <REMatchPattern>` - Limit display to groups whose email address matches `<REMatchPattern>`
|
||||||
* `emailmatchpattern not <RegularExpression>` - Limit display to groups whose email address does not match `<RegularExpression>`
|
* `emailmatchpattern not <REMatchPattern>` - Limit display to groups whose email address does not match `<REMatchPattern>`
|
||||||
* `namematchpattern <RegularExpression>` - Limit display to groups whose name matches `<RegularExpression>`
|
* `namematchpattern <REMatchPattern>` - Limit display to groups whose name matches `<REMatchPattern>`
|
||||||
* `namematchpattern not <RegularExpression>` - Limit display to groups whose name does not match `<RegularExpression>`
|
* `namematchpattern not <REMatchPattern>` - Limit display to groups whose name does not match `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern <RegularExpression>` - Limit display to groups whose description matches `<RegularExpression>`
|
* `descriptionmatchpattern <REMatchPattern>` - Limit display to groups whose description matches `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern not <RegularExpression>` - Limit display to groups whose description does not match `<RegularExpression>`
|
* `descriptionmatchpattern not <REMatchPattern>` - Limit display to groups whose description does not match `<REMatchPattern>`
|
||||||
|
|
||||||
By default, all members, managers and owners in the group are displayed; these options modify that behavior:
|
By default, all members, managers and owners in the group are displayed; these options modify that behavior:
|
||||||
* `roles <GroupRoleList>` - Display specified roles
|
* `roles <GroupRoleList>` - Display specified roles
|
||||||
@@ -374,26 +375,31 @@ By default, all members, managers and owners in the group are displayed; these o
|
|||||||
* `managers` - Display managers
|
* `managers` - Display managers
|
||||||
* `owners` - Display owners
|
* `owners` - Display owners
|
||||||
|
|
||||||
By default, all types of members (customer, group, serviceaccoun, user) in the group are displayed; when `recursive` is specified,
|
By default, all types of members (cbcmbrowser, chromeosdevice, customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
||||||
the default is to only display type user members. This option modifies those behaviors:
|
* `types <CIGroupMemberTypeList>` - Display specified types
|
||||||
* `types <CIGroupTypeList>` - Display specified types
|
|
||||||
|
By default, members that are groups are displayed as a single entry of type GROUP; this option recursively expands group members to display their user members.
|
||||||
|
* `recursive` - Recursively expand group members
|
||||||
|
|
||||||
|
When `recursive` is specified, the default is to only display type user members; this option modifies those behaviors:
|
||||||
|
* `types <GroupMemberTypeList>` - Display specified types
|
||||||
|
|
||||||
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
||||||
* `memberemaildisplaypattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be displayed; others will not be displayed
|
* `memberemaildisplaypattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be displayed; others will not be displayed
|
||||||
* `memberemailskippattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will not be displayed; others will be displayed
|
* `memberemailskippattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will not be displayed; others will be displayed
|
||||||
|
|
||||||
By default, the ID, role, email address, type, createTime, updateTime and expireTime of each member is displayed along with the group email address;
|
By default, the ID, role, email address, type, createTime, updateTime and expireTime of each member is displayed along with the group email address;
|
||||||
these options specify which fields to display:
|
these options specify which fields to display:
|
||||||
* `<CIGroupMembersFieldName>*` - Individual field names
|
* `<CIGroupMembersFieldName>*` - Individual field names
|
||||||
* `fields <CIGroupMembersFieldNameList>` - A comma separated list of field names
|
* `fields <CIGroupMembersFieldNameList>` - A comma separated list of field names
|
||||||
|
|
||||||
|
You can control the fields displayed:
|
||||||
|
* `minimal` - Fields displayed: group, id, role, email
|
||||||
|
* `basic` - Fields displayed: group, type, id, role, email, expireTime
|
||||||
|
* `full` - Fields displayed: group, type, id, role, email, createTime, updateTime, expireTime; this is the default
|
||||||
|
|
||||||
By default, the group email address is always shown, you can suppress it with the `nogroupemail` option.
|
By default, the group email address is always shown, you can suppress it with the `nogroupemail` option.
|
||||||
|
|
||||||
By default, members that are groups are displayed as a single entry of type GROUP; this option recursively expands group members to display their user members.
|
|
||||||
* `recursive` - Recursively expand group members
|
|
||||||
|
|
||||||
The `recursive` option does not expand or display members of type CUSTOMER.
|
|
||||||
|
|
||||||
The `recursive` option adds two columns, level and subgroup, to the output:
|
The `recursive` option adds two columns, level and subgroup, to the output:
|
||||||
* `level` - At what level of the expansion does the user appear; level 0 is the top level
|
* `level` - At what level of the expansion does the user appear; level 0 is the top level
|
||||||
* `subgroup` - The group that contained the user
|
* `subgroup` - The group that contained the user
|
||||||
@@ -421,13 +427,13 @@ The `quotechar <Character>` option allows you to choose an alternate quote chara
|
|||||||
```
|
```
|
||||||
gam show cigroup-members
|
gam show cigroup-members
|
||||||
[(cimember|showownedby <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
[(cimember|showownedby <UserItem>)|(cigroup <GroupItem>)|(select <GroupEntity>)]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <REMatchPattern>]
|
||||||
[roles <GroupRoleList>] [members] [managers] [owners] [depth <Number>]
|
[roles <GroupRoleList>] [members] [managers] [owners]
|
||||||
[types <CIGroupTypeList>]
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
|
||||||
[includederivedmembership]
|
[minimal|basic|full]
|
||||||
[formatjson [quotechar <Character>]]
|
[(depth <Number>) | includederivedmembership]
|
||||||
```
|
```
|
||||||
By default, the group membership of all groups in the account are displayed, these options allow selection of subsets of groups:
|
By default, the group membership of all groups in the account are displayed, these options allow selection of subsets of groups:
|
||||||
* `cimember <UserItem>` - Limit display to groups that contain `<UserItem>` as a member
|
* `cimember <UserItem>` - Limit display to groups that contain `<UserItem>` as a member
|
||||||
@@ -436,12 +442,12 @@ By default, the group membership of all groups in the account are displayed, the
|
|||||||
* `select <GroupEntity>` - Limit display to the groups specified in `<GroupEntity>`
|
* `select <GroupEntity>` - Limit display to the groups specified in `<GroupEntity>`
|
||||||
|
|
||||||
These options further limit the list of groups selected above:
|
These options further limit the list of groups selected above:
|
||||||
* `emailmatchpattern <RegularExpression>` - Limit display to groups whose email address matches `<RegularExpression>`
|
* `emailmatchpattern <REMatchPattern>` - Limit display to groups whose email address matches `<REMatchPattern>`
|
||||||
* `emailmatchpattern not <RegularExpression>` - Limit display to groups whose email address does not match `<RegularExpression>`
|
* `emailmatchpattern not <REMatchPattern>` - Limit display to groups whose email address does not match `<REMatchPattern>`
|
||||||
* `namematchpattern <RegularExpression>` - Limit display to groups whose name matches `<RegularExpression>`
|
* `namematchpattern <REMatchPattern>` - Limit display to groups whose name matches `<REMatchPattern>`
|
||||||
* `namematchpattern not <RegularExpression>` - Limit display to groups whose name does not match `<RegularExpression>`
|
* `namematchpattern not <REMatchPattern>` - Limit display to groups whose name does not match `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern <RegularExpression>` - Limit display to groups whose description matches `<RegularExpression>`
|
* `descriptionmatchpattern <REMatchPattern>` - Limit display to groups whose description matches `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern not <RegularExpression>` - Limit display to groups whose description does not match `<RegularExpression>`
|
* `descriptionmatchpattern not <REMatchPattern>` - Limit display to groups whose description does not match `<REMatchPattern>`
|
||||||
|
|
||||||
By default, all members, managers and owners in the group are displayed; these options modify that behavior:
|
By default, all members, managers and owners in the group are displayed; these options modify that behavior:
|
||||||
* `roles <GroupRoleList>` - Display specified roles
|
* `roles <GroupRoleList>` - Display specified roles
|
||||||
@@ -449,12 +455,12 @@ By default, all members, managers and owners in the group are displayed; these o
|
|||||||
* `managers` - Display managers
|
* `managers` - Display managers
|
||||||
* `owners` - Display owners
|
* `owners` - Display owners
|
||||||
|
|
||||||
By default, all types of members (customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
By default, all types of members (cbcmbrowser, chromeosdevice, customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
||||||
* `types <CIGroupTypeList>` - Display specified types
|
* `types <CIGroupMemberTypeList>` - Display specified types
|
||||||
|
|
||||||
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
||||||
* `memberemaildisplaypattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be displayed; others will not be displayed
|
* `memberemaildisplaypattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be displayed; others will not be displayed
|
||||||
* `memberemailskippattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will not be displayed; others will be displayed
|
* `memberemailskippattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will not be displayed; others will be displayed
|
||||||
|
|
||||||
By default, members of type GROUP are recursively expanded to show their constituent members. (Members of
|
By default, members of type GROUP are recursively expanded to show their constituent members. (Members of
|
||||||
type CUSTOMER are not expanded.) The `depth <Number>` argument controls the depth to which nested groups are displayed.
|
type CUSTOMER are not expanded.) The `depth <Number>` argument controls the depth to which nested groups are displayed.
|
||||||
@@ -469,6 +475,11 @@ has in any constituent group, it is not necessarily its role in the top group.
|
|||||||
The options `types user` and `includederivedmembership types user` return the same list of users.
|
The options `types user` and `includederivedmembership types user` return the same list of users.
|
||||||
The `includederivedmembership` option makes less API calls but doesn't show hierarchy.
|
The `includederivedmembership` option makes less API calls but doesn't show hierarchy.
|
||||||
|
|
||||||
|
You can control the fields displayed:
|
||||||
|
* `minimal` - Fields displayed: role, email
|
||||||
|
* `basic` - Fields displayed: type, role, email, expireTime
|
||||||
|
* `full` - Fields displayed: type, role, email, createTime, updateTime, expireTime; this is the default
|
||||||
|
|
||||||
### Display group structure
|
### Display group structure
|
||||||
To see a group's structure of nested groups use the `type group` option.
|
To see a group's structure of nested groups use the `type group` option.
|
||||||
```
|
```
|
||||||
@@ -482,5 +493,5 @@ Group: testgroup5@domain.com
|
|||||||
```
|
```
|
||||||
To show the structure of all groups you can do the following; it will be time consuming for a large number of groups.
|
To show the structure of all groups you can do the following; it will be time consuming for a large number of groups.
|
||||||
```
|
```
|
||||||
gam redirect stdout ./groups.txt show group-members types group
|
gam redirect stdout ./groups.txt show cigroup-members types group
|
||||||
```
|
```
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
# Cloud Identity Groups
|
# Cloud Identity Groups
|
||||||
- [API documentation](#api-documentation)
|
- [API documentation](#api-documentation)
|
||||||
- [Python Regular Expressions](Python-Regular-Expressions) Match function
|
|
||||||
- [Query documentation](#query-documentation)
|
- [Query documentation](#query-documentation)
|
||||||
- [Cloud Identity Group Documentation](#cloud-identity-group-documentation)
|
- [Python Regular Expressions](Python-Regular-Expressions) Match function
|
||||||
- [Security Group Documentation](#security-group-documentation)
|
|
||||||
- [Notes](#Notes)
|
- [Notes](#Notes)
|
||||||
- [Definitions](#definitions)
|
- [Definitions](#definitions)
|
||||||
- [Manage groups](#manage-groups)
|
- [Manage groups](#manage-groups)
|
||||||
@@ -12,24 +10,31 @@
|
|||||||
- [Display group counts](#display-group-counts)
|
- [Display group counts](#display-group-counts)
|
||||||
|
|
||||||
## API documentation
|
## API documentation
|
||||||
* https://developers.google.com/admin-sdk/directory/reference/rest/v1/groups
|
* [Cloud Identity Groups Overview](https://cloud.google.com/identity/docs/groups)
|
||||||
* https://developers.google.com/admin-sdk/groups-settings/v1/reference/groups
|
* [Create and Manage Groups uning API](https://support.google.com/a/answer/10427204)
|
||||||
* https://cloud.google.com/identity/docs/groups
|
* [Cloud Identity Groups API - Groups](https://cloud.google.com/identity/docs/reference/rest/v1/groups)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups
|
* [Restrict Group Membership](https://support.google.com/a/answer/11192679)
|
||||||
* https://support.google.com/a/answer/11192679
|
* [Lock Groups Beta](https://workspaceupdates.googleblog.com/2024/12/locked-groups-open-beta.html)
|
||||||
|
* [Cloud Identity Groups](https://gsuiteupdates.googleblog.com/2020/08/new-api-cloud-identity-groups-google.html)
|
||||||
|
* [Security Groups](https://gsuiteupdates.googleblog.com/2020/09/security-groups-beta.html)
|
||||||
|
|
||||||
## Query documentation
|
## Query documentation
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups#dynamicgroupquery
|
* [Cloud Identity Groups API - Search](https://cloud.google.com/identity/docs/reference/rest/v1/groups/search)
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/SecuritySettings#MemberRestriction
|
* [Cloud Identity Groups API - Dynamic Group Query](https://cloud.google.com/identity/docs/reference/rest/v1/groups#dynamicgroupquery)
|
||||||
|
* [Dynamic Groups Member Attributes](https://cloud.google.com/identity/docs/how-to/dynamic-groups-attributes)
|
||||||
## Cloud Identity Group Documentation
|
* [Member Restrictions](https://cloud.google.com/identity/docs/reference/rest/v1/SecuritySettings#MemberRestriction)
|
||||||
* https://gsuiteupdates.googleblog.com/2020/08/new-api-cloud-identity-groups-google.html
|
|
||||||
|
|
||||||
## Security Group Documentation
|
|
||||||
* https://gsuiteupdates.googleblog.com/2020/09/security-groups-beta.html
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
|
In version 7.02.01 options `locked` and `unlocked` wre added to `gam update cigroups` that allow locking 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)
|
||||||
|
```
|
||||||
|
|
||||||
In the Admin Directory API a group has the following characteristics:
|
In the Admin Directory API a group has the following characteristics:
|
||||||
* `id` - The unique ID of a group
|
* `id` - The unique ID of a group
|
||||||
* `email` - The group's email address
|
* `email` - The group's email address
|
||||||
@@ -47,7 +52,7 @@ Dynamic Groups require Cloud Identity Premium accounts.
|
|||||||
* https://cloud.google.com/identity/docs/how-to/create-dynamic-groups
|
* https://cloud.google.com/identity/docs/how-to/create-dynamic-groups
|
||||||
|
|
||||||
The `cimember <UserItem>` option of `gam print cigroups` requires a Google Workspace Enterprise Standard, Enterprise Plus, and Enterprise for Education;
|
The `cimember <UserItem>` option of `gam print cigroups` requires a Google Workspace Enterprise Standard, Enterprise Plus, and Enterprise for Education;
|
||||||
and Cloud Identity Premium accounts. Unfortunately, even if you have the required account, the API call that supports the query doesn't work.
|
and Cloud Identity Premium accounts.
|
||||||
|
|
||||||
* https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships/searchTransitiveGroups
|
* https://cloud.google.com/identity/docs/reference/rest/v1/groups.memberships/searchTransitiveGroups
|
||||||
|
|
||||||
@@ -60,11 +65,11 @@ and Cloud Identity Premium accounts. Unfortunately, even if you have the require
|
|||||||
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
<GroupList> ::= "<GroupItem>(,<GroupItem>)*"
|
||||||
<GroupEntity> ::=
|
<GroupEntity> ::=
|
||||||
<GroupList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
<GroupList> | <FileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||||
See: https://github.com/taers232c/GAMADV-XTD3/wiki/Collections-of-Items
|
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||||
<GroupRole> ::= owner|manager|member
|
<GroupRole> ::= owner|manager|member
|
||||||
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
<GroupRoleList> ::= "<GroupRole>(,<GroupRole>)*"
|
||||||
<CIGroupType> ::= customer|group|other|serviceaccount|user
|
<CIGroupMemberType> ::= cbcmbrowser|customer|group|other|serviceaccount|user
|
||||||
<CIGroupTypeList> ::= "<CIGroupType>(,<CIGroupType>)*"
|
<CIGroupMemberTypeList> ::= "<CIGroupMemberType>(,<CIGroupMemberType>)*"
|
||||||
<QueryDynamicGroup> ::= <String>
|
<QueryDynamicGroup> ::= <String>
|
||||||
See: https://cloud.google.com/identity/docs/reference/rest/v1/groups#dynamicgroupquery
|
See: https://cloud.google.com/identity/docs/reference/rest/v1/groups#dynamicgroupquery
|
||||||
<QueryMemberRestrictions> ::= <String>
|
<QueryMemberRestrictions> ::= <String>
|
||||||
@@ -72,6 +77,12 @@ and Cloud Identity Premium accounts. Unfortunately, even if you have the require
|
|||||||
|
|
||||||
<JSONData> ::= (json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
|
<JSONData> ::= (json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
|
||||||
|
|
||||||
|
<RegularExpression> ::= <String>
|
||||||
|
See: https://docs.python.org/3/library/re.html
|
||||||
|
<REMatchPattern> ::= <RegularExpression>
|
||||||
|
<RESearchPattern> ::= <RegularExpression>
|
||||||
|
<RESubstitution> ::= <String>>
|
||||||
|
|
||||||
<GroupSettingsAttribute> ::=
|
<GroupSettingsAttribute> ::=
|
||||||
(allowexternalmembers <Boolean>)|
|
(allowexternalmembers <Boolean>)|
|
||||||
(allowwebposting <Boolean>)|
|
(allowwebposting <Boolean>)|
|
||||||
@@ -231,11 +242,17 @@ and Cloud Identity Premium accounts. Unfortunately, even if you have the require
|
|||||||
These commands allow you to create, update and delete groups. They use the Admin SDK Groups Settings API
|
These commands allow you to create, update and delete groups. They use the Admin SDK Groups Settings API
|
||||||
to set `<GroupAttribute>`.
|
to set `<GroupAttribute>`.
|
||||||
```
|
```
|
||||||
gam create cigroup <EmailAddress> [copyfrom <GroupItem>] <GroupAttribute>
|
gam create cigroup <EmailAddress>
|
||||||
[makeowner]
|
[copyfrom <GroupItem>] <GroupAttribute>*
|
||||||
[alias|aliases <EmailAddressList>] [dynamic <QueryDynamicGroup>]
|
[makeowner] [alias|aliases <CIGroupAliasList>]
|
||||||
|
[security|makesecuritygroup]
|
||||||
|
[dynamic <QueryDynamicGroup>]
|
||||||
gam update cigroup <GroupEntity> [copyfrom <GroupItem>] <GroupAttribute>
|
gam update cigroup <GroupEntity> [copyfrom <GroupItem>] <GroupAttribute>
|
||||||
[makesecuritygroup|security] [makedynamicsecuritygroup|dynamicsecurity] [dynamic <QueryDynamicGroup>]
|
[security|makesecuritygroup|
|
||||||
|
dynamicsecurity|makedynamicsecuritygroup|
|
||||||
|
lockedsecurity|makelockedsecuritygroup]
|
||||||
|
[locked|unlocked]
|
||||||
|
[dynamic <QueryDynamicGroup>]
|
||||||
[memberrestrictions <QueryMemberRestrictions>]
|
[memberrestrictions <QueryMemberRestrictions>]
|
||||||
gam delete cigroups <GroupEntity>
|
gam delete cigroups <GroupEntity>
|
||||||
```
|
```
|
||||||
@@ -259,8 +276,9 @@ 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]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[types <CIGroupMemberTypeList>]
|
||||||
|
[memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
|
||||||
[formatjson]
|
[formatjson]
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -272,11 +290,19 @@ By default, all direct members, managers and owners in the group are displayed;
|
|||||||
* `membertree` - Display all roles; expand all groups
|
* `membertree` - Display all roles; expand all groups
|
||||||
|
|
||||||
By default, when displaying members from a group, all types of members (customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
By default, when displaying members from a group, all types of members (customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
||||||
* `types <CIGroupTypeList>` - Display specified types
|
* `types <CIGroupMemberTypeList>` - Display specified types
|
||||||
|
|
||||||
|
By default, when listing group members, GAM does not take the domain of the member into account.
|
||||||
|
* `internal internaldomains <DomainNameList>` - Display members whose domain is in `<DomainNameList>`
|
||||||
|
* `external internaldomains <DomainNameList>` - Display members whose domain is not in `<DomainNameList>`
|
||||||
|
* `internal external internaldomains <DomainNameList>` - Display all members, indicate their category: internal or external
|
||||||
|
* `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 that have met the above qualifications to be displayed can be further qualifed by their email address.
|
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
||||||
* `memberemaildisplaypattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be displayed; others will not be displayed
|
* `memberemaildisplaypattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be displayed; others will not be displayed
|
||||||
* `memberemailskippattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will not be displayed; others will be displayed
|
* `memberemailskippattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will not be displayed; others will be displayed
|
||||||
|
|
||||||
By default, all group aliases are displayed, these options modify that behavior:
|
By default, all group aliases are displayed, these options modify that behavior:
|
||||||
* `noaliases` or `quick` - Do not display group aliases
|
* `noaliases` or `quick` - Do not display group aliases
|
||||||
@@ -296,13 +322,14 @@ This command displays information in CSV format.
|
|||||||
```
|
```
|
||||||
gam print cigroups [todrive <ToDriveAttribute>*]
|
gam print cigroups [todrive <ToDriveAttribute>*]
|
||||||
[(cimember|showownedby <UserItem>)|(select <GroupEntity>)|(query <String>)]
|
[(cimember|showownedby <UserItem>)|(select <GroupEntity>)|(query <String>)]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <REMatchPattern>]
|
||||||
[basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
|
[basic|allfields|(<CIGroupFieldName>* [fields <CIGroupFieldNameList>])]
|
||||||
[roles <GroupRoleList>] [memberrestrictions]
|
[roles <GroupRoleList>] [memberrestrictions]
|
||||||
|
[internal] [internaldomains <DomainNameList>] [external]
|
||||||
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
[members|memberscount] [managers|managerscount] [owners|ownerscount] [totalcount] [countsonly]
|
||||||
[types <CIGroupTypeList>]
|
[types <CIGroupMemberTypeList>]
|
||||||
[memberemaildisplaypattern|memberemailskippattern <RegularExpression>]
|
[memberemaildisplaypattern|memberemailskippattern <REMatchPattern>]
|
||||||
[convertcrnl] [delimiter <Character>]
|
[convertcrnl] [delimiter <Character>]
|
||||||
[formatjson [quotechar <Character>]]
|
[formatjson [quotechar <Character>]]
|
||||||
```
|
```
|
||||||
@@ -313,12 +340,12 @@ By default, all groups in the account are displayed, these options allow selecti
|
|||||||
* `query <String>` - Limit display to the groups that match the query
|
* `query <String>` - Limit display to the groups that match the query
|
||||||
|
|
||||||
These options further limit the list of groups selected above:
|
These options further limit the list of groups selected above:
|
||||||
* `emailmatchpattern <RegularExpression>` - Limit display to groups whose email address matches `<RegularExpression>`
|
* `emailmatchpattern <REMatchPattern>` - Limit display to groups whose email address matches `<REMatchPattern>`
|
||||||
* `emailmatchpattern not <RegularExpression>` - Limit display to groups whose email address does not match `<RegularExpression>`
|
* `emailmatchpattern not <REMatchPattern>` - Limit display to groups whose email address does not match `<REMatchPattern>`
|
||||||
* `namematchpattern <RegularExpression>` - Limit display to groups whose name matches `<RegularExpression>`
|
* `namematchpattern <REMatchPattern>` - Limit display to groups whose name matches `<REMatchPattern>`
|
||||||
* `namematchpattern not <RegularExpression>` - Limit display to groups whose name does not match `<RegularExpression>`
|
* `namematchpattern not <REMatchPattern>` - Limit display to groups whose name does not match `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern <RegularExpression>` - Limit display to groups whose description matches `<RegularExpression>`
|
* `descriptionmatchpattern <REMatchPattern>` - Limit display to groups whose description matches `<REMatchPattern>`
|
||||||
* `descriptionmatchpattern not <RegularExpression>` - Limit display to groups whose description does not match `<RegularExpression>`
|
* `descriptionmatchpattern not <REMatchPattern>` - Limit display to groups whose description does not match `<REMatchPattern>`
|
||||||
|
|
||||||
By default, GAM does not make an additional API call todisplay the member restrictions from `SecuritySettings`.
|
By default, GAM does not make an additional API call todisplay the member restrictions from `SecuritySettings`.
|
||||||
* `memberrestrictions` - Make an additional API call and display the member restrictions from `SecuritySettings`
|
* `memberrestrictions` - Make an additional API call and display the member restrictions from `SecuritySettings`
|
||||||
@@ -353,11 +380,19 @@ By default, no members, managers or owners in the group are displayed; these opt
|
|||||||
* `totalcount` - Display sum of counts of members, managers, owners.
|
* `totalcount` - Display sum of counts of members, managers, owners.
|
||||||
|
|
||||||
By default, when displaying members from a group, all types of members (customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
By default, when displaying members from a group, all types of members (customer, group, serviceaccount, user) in the group are displayed; this option modifies that behavior:
|
||||||
* `types <CIGroupTypeList>` - Display specified types
|
* `types <CIGroupMemberTypeList>` - Display specified types
|
||||||
|
|
||||||
|
By default, when listing group members, GAM does not take the domain of the member into account.
|
||||||
|
* `internal internaldomains <DomainNameList>` - Display members whose domain is in `<DomainNameList>`
|
||||||
|
* `external internaldomains <DomainNameList>` - Display members whose domain is not in `<DomainNameList>`
|
||||||
|
* `internal external internaldomains <DomainNameList>` - Display all members, indicate their category: internal or external
|
||||||
|
* `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 that have met the above qualifications to be displayed can be further qualifed by their email address.
|
Members that have met the above qualifications to be displayed can be further qualifed by their email address.
|
||||||
* `memberemaildisplaypattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will be displayed; others will not be displayed
|
* `memberemaildisplaypattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will be displayed; others will not be displayed
|
||||||
* `memberemailskippattern <RegularExpression>` - Members with email addresses that match `<RegularExpression>` will not be displayed; others will be displayed
|
* `memberemailskippattern <REMatchPattern>` - Members with email addresses that match `<REMatchPattern>` will not be displayed; others will be displayed
|
||||||
|
|
||||||
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
||||||
* `formatjson` - Display the fields in JSON format.
|
* `formatjson` - Display the fields in JSON format.
|
||||||
@@ -368,6 +403,37 @@ When using the `formatjson` option, double quotes are used extensively in the da
|
|||||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||||
|
|
||||||
|
### Display member count examples
|
||||||
|
```
|
||||||
|
gam print cigroup select testgroup roles member,manager,owner countsonly totalcount
|
||||||
|
Getting Cloud Identity Groups for testgroup@domain.com
|
||||||
|
Getting Members, Managers, Owners for testgroup@domain.com
|
||||||
|
Got 9 Members, Managers, Owners...
|
||||||
|
email,TotalCount,ManagersCount,MembersCount,OwnersCount
|
||||||
|
testgroup@domain.com,9,0,7,2
|
||||||
|
|
||||||
|
gam print cigroup select testgroup roles member,manager,owner countsonly totalcount internal
|
||||||
|
Getting Cloud Identity Groups for testgroup@domain.com
|
||||||
|
Getting Members, Managers, Owners for testgroup@domain.com
|
||||||
|
Got 9 Members, Managers, Owners...
|
||||||
|
email,TotalCount,TotalInternalCount,InternalManagersCount,InternalMembersCount,InternalOwnersCount
|
||||||
|
testgroup@domain.com,7,7,0,5,2
|
||||||
|
|
||||||
|
gam print cigroup select testgroup roles member,manager,owner countsonly totalcount external
|
||||||
|
Getting Cloud Identity Groups for testgroup@domain.com
|
||||||
|
Getting Members, Managers, Owners for testgroup@domain.com
|
||||||
|
Got 9 Members, Managers, Owners...
|
||||||
|
email,TotalCount,TotalExternalCount,ExternalManagersCount,ExternalMembersCount,ExternalOwnersCount
|
||||||
|
testgroup@domain.com,2,2,0,2,0
|
||||||
|
|
||||||
|
gam print cigroup select testgroup roles member,manager,owner countsonly totalcount external internal
|
||||||
|
Getting Cloud Identity Groups for testgroup@domain.com
|
||||||
|
Getting Members, Managers, Owners for testgroup@domain.com
|
||||||
|
Got 9 Members, Managers, Owners...
|
||||||
|
email,TotalCount,TotalInternalCount,InternalManagersCount,InternalMembersCount,InternalOwnersCount,TotalExternalCount,ExternalManagersCount,ExternalMembersCount,ExternalOwnersCount
|
||||||
|
testgroup@domain.com,9,7,0,5,2,2,0,2,0
|
||||||
|
```
|
||||||
|
|
||||||
### Display dynamic groups
|
### Display dynamic groups
|
||||||
```
|
```
|
||||||
gam print cigroups query "'cloudidentity.googleapis.com/groups.dynamic' in labels"
|
gam print cigroups query "'cloudidentity.googleapis.com/groups.dynamic' in labels"
|
||||||
@@ -383,8 +449,8 @@ Display the number of groups.
|
|||||||
```
|
```
|
||||||
gam print cigroups
|
gam print cigroups
|
||||||
[(cimember|showownedby <UserItem>)|(select <GroupEntity>)|(query <String>)]
|
[(cimember|showownedby <UserItem>)|(select <GroupEntity>)|(query <String>)]
|
||||||
[emailmatchpattern [not] <RegularExpression>] [namematchpattern [not] <RegularExpression>]
|
[emailmatchpattern [not] <REMatchPattern>] [namematchpattern [not] <REMatchPattern>]
|
||||||
[descriptionmatchpattern [not] <RegularExpression>]
|
[descriptionmatchpattern [not] <REMatchPattern>]
|
||||||
showitemcountonly
|
showitemcountonly
|
||||||
```
|
```
|
||||||
Example
|
Example
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user