from __future__ import print_function import argparse import glob import googleapiclient.discovery import json import os import pickle import progress.bar import sys import time from google.auth.transport.requests import Request from google_auth_oauthlib.flow import InstalledAppFlow 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 following client id is added to the shared drive as Manager:\n' + json.loads((open( # credentials[0],'r').read()))['installed']['client_id']) 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 there are no (valid) credentials available, let the user log in. 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_local_server(port=0) creds = flow.run_console() # Save the credentials for the next run 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(f"{acc_dir}/*.json") 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))