|
from __future__ import print_function |
|
from google.oauth2.service_account import Credentials |
|
import googleapiclient.discovery |
|
import json |
|
import progress.bar |
|
import glob |
|
import sys |
|
import argparse |
|
import time |
|
from google_auth_oauthlib.flow import InstalledAppFlow |
|
from google.auth.transport.requests import Request |
|
import os |
|
import pickle |
|
|
|
stt = time.time() |
|
|
|
parse = argparse.ArgumentParser( |
|
description='A tool to add service accounts to a shared drive from a folder containing credential files.') |
|
parse.add_argument('--path', '-p', default='accounts', |
|
help='Specify an alternative path to the service accounts folder.') |
|
parse.add_argument('--credentials', '-c', default='./credentials.json', |
|
help='Specify the relative path for the credentials file.') |
|
parse.add_argument('--yes', '-y', default=False, |
|
action='store_true', help='Skips the sanity prompt.') |
|
parsereq = parse.add_argument_group('required arguments') |
|
parsereq.add_argument('--drive-id', '-d', |
|
help='The ID of the Shared Drive.', required=True) |
|
|
|
args = parse.parse_args() |
|
acc_dir = args.path |
|
did = args.drive_id |
|
credentials = glob.glob(args.credentials) |
|
|
|
try: |
|
open(credentials[0], 'r') |
|
print('>> Found credentials.') |
|
except IndexError: |
|
print('>> No credentials found.') |
|
sys.exit(0) |
|
|
|
if not args.yes: |
|
|
|
|
|
input('>> Make sure the **Google account** that has generated credentials.json\n is added into your Team Drive ' |
|
'(shared drive) as Manager\n>> (Press any key to continue)') |
|
|
|
creds = None |
|
if os.path.exists('token_sa.pickle'): |
|
with open('token_sa.pickle', 'rb') as token: |
|
creds = pickle.load(token) |
|
|
|
if not creds or not creds.valid: |
|
if creds and creds.expired and creds.refresh_token: |
|
creds.refresh(Request()) |
|
else: |
|
flow = InstalledAppFlow.from_client_secrets_file(credentials[0], scopes=[ |
|
'https://www.googleapis.com/auth/admin.directory.group', |
|
'https://www.googleapis.com/auth/admin.directory.group.member' |
|
]) |
|
|
|
creds = flow.run_console() |
|
|
|
with open('token_sa.pickle', 'wb') as token: |
|
pickle.dump(creds, token) |
|
|
|
drive = googleapiclient.discovery.build("drive", "v3", credentials=creds) |
|
batch = drive.new_batch_http_request() |
|
|
|
aa = glob.glob('%s/*.json' % acc_dir) |
|
pbar = progress.bar.Bar("Readying accounts", max=len(aa)) |
|
for i in aa: |
|
ce = json.loads(open(i, 'r').read())['client_email'] |
|
batch.add(drive.permissions().create(fileId=did, supportsAllDrives=True, body={ |
|
"role": "organizer", |
|
"type": "user", |
|
"emailAddress": ce |
|
})) |
|
pbar.next() |
|
pbar.finish() |
|
print('Adding...') |
|
batch.execute() |
|
|
|
print('Complete.') |
|
hours, rem = divmod((time.time() - stt), 3600) |
|
minutes, sec = divmod(rem, 60) |
|
print("Elapsed Time:\n{:0>2}:{:0>2}:{:05.2f}".format( |
|
int(hours), int(minutes), sec)) |
|
|