forked from taers232c/GAM-Scripts3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AddPermissions.py
executable file
·83 lines (75 loc) · 3.64 KB
/
AddPermissions.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python3
"""
# Purpose: Add <DriveFilePermissionList> to a list of files/folders
# Note: This script requires Advanced GAM:
# https://github.com/taers232c/GAMADV-XTD3
# Definitions:
# <DriveFileACLRole> :: =commenter|editor|organizer|owner|reader|writer
# <DriveFilePermissionScope> ::= anyone|anyonewithlink|user:<EmailAddress>|group:<EmailAddress>|domain:<DomainName>|domainwithlink:<DomainName>
# <DriveFilePermission> ::= <DriveFilePermissionScope>;<DriveFileACLRole>
# <DriveFilePermissionList> ::= "<DriveFilePermission>(,<DriveFilePermission)*"
# Python: Use python or python3 below as appropriate to your system; verify that you have version 3
# $ python -V or python3 -V
# Python 3.x.y
# Usage:
# 1: Use print filelist to get selected ACLs
# Syntax: gam <UserTypeEntity> print filelist [anyowner|(showownedby any|me|others)]
# [query <QueryDriveFile>] [fullquery <QueryDriveFile>] [select <DriveFileEntity>|orphans] [depth <Number>] [showparent]
# For a full description of print filelist, see: https://github.com/taers232c/GAMADV-XTD/wiki/Users-Drive-Files
# $ gam redirect csv ./filelist.csv user [email protected] print filelist id ...
# 2: From that list of files, output a CSV file with headers "Owner,driveFileId,permissions"
# that lists the driveFileIds and permissions to be added
# $ python3 AddPermissions.py filelist.csv addperms.csv '<DriveFilePermissionsList>'
# 3: Add the ACLs
# Parallel, faster:
# $ gam csv addperms.csv gam user "~Owner" add permissions "~driveFileId" "~permissions"
# Serial, cleaner output:
# $ gam csvkmd users addperms.csv keyfield Owner subkeyfield driveFileId datafield permissions delimiter "," add permissions csvsubkey driveFileId csvdata permissions
"""
import csv
import sys
QUOTE_CHAR = '"' # Adjust as needed
LINE_TERMINATOR = '\n' # On Windows, you probably want '\r\n'
DRIVEFILE_ACL_ROLES = ['commenter', 'editor', 'owner', 'read', 'reader', 'writer',]
DRIVEFILE_ACL_PERMISSION_TYPES = ['anyone', 'anyonewithlink', 'domain', 'domainwithlink', 'group', 'user',]
if len(sys.argv) < 4:
sys.stderr.write('ERROR: "<DriveFilePermissionsList>" not specified\n')
sys.exit(1)
permissions = sys.argv[3]
errors = 0
for permission in permissions.replace(',', ' ').split():
try:
scope, role = permission.split(';', 1)
if scope.find(':') != -1:
permType, value = scope.split(':', 1)
else:
permType = scope
if permType not in DRIVEFILE_ACL_PERMISSION_TYPES:
sys.stderr.write(f'ERROR: Type ({permType}) must be in list ({",".join(DRIVEFILE_ACL_PERMISSION_TYPES)}), permission ({permission})\n')
errors += 1
if role not in DRIVEFILE_ACL_ROLES:
sys.stderr.write(f'ERROR: Role ({role}) must be in list ({",".join(DRIVEFILE_ACL_ROLES)}), permission ({permission})\n')
errors += 1
except ValueError:
sys.stderr.write(f'ERROR: Permisson must be (scope;role), permission ({permission})\n')
errors += 1
if errors:
sys.exit(1)
if (len(sys.argv) > 2) and (sys.argv[2] != '-'):
outputFile = open(sys.argv[2], 'w', encoding='utf-8', newline='')
else:
outputFile = sys.stdout
outputCSV = csv.DictWriter(outputFile, ['Owner', 'driveFileId', 'permissions'], lineterminator=LINE_TERMINATOR, quotechar=QUOTE_CHAR)
outputCSV.writeheader()
if (len(sys.argv) > 1) and (sys.argv[1] != '-'):
inputFile = open(sys.argv[1], 'r', encoding='utf-8')
else:
inputFile = sys.stdin
for row in csv.DictReader(inputFile, quotechar=QUOTE_CHAR):
outputCSV.writerow({'Owner': row['Owner'],
'driveFileId': row['id'],
'permissions': permissions})
if inputFile != sys.stdin:
inputFile.close()
if outputFile != sys.stdout:
outputFile.close()