import logging import sys import O365 import traceback import pause import dialog import argparse from dialog import Dialog from o365_util import O365_User if __name__ == '__main__': # Announce an argument parser parser = argparse.ArgumentParser(description="Automated API calling program.") parser.add_argument("-i", "--interactive", action="store_true", help="Config the arguments in interactive mode") parser.add_argument("--business-hour", action="store_true", help="Only runs the routine in business hours, " "that is 9AM to 5PM from Monday to Friday.") parser.add_argument("--interval", type=int, help="Set the interval of routine. " "(Conflicts with the min and max arguments!)") parser.add_argument("--min", type=int, help="Set the minimum interval of routine. " "(Conflicts with the interval arguments!)") parser.add_argument("--max", type=int, help="Set the maximum interval of routine. " "(Conflicts with the interval arguments!)") parser.add_argument("-t", "--temp-file-threshold", type=int, default=5, help="The maximum amount of files " "stored in your onedrive drive.") parser.add_argument("--client-id", type=str, help="The client id from graph API.") parser.add_argument("--secret", type=str, help="The client secret from graph API.") if not len(sys.argv) == 1: parsed_arguments = parser.parse_args(sys.argv[1:]) try: # Check interactive mode first if parsed_arguments.interactive: d = Dialog() d.set_background_title("Office E5 Continuer") d.infobox("Welcome to use this program!", width=54) pause.seconds(2) # Setting the default value credentials = [("" if not parsed_arguments.client_id else parsed_arguments.client_id), ("" if not parsed_arguments.secret else parsed_arguments.secret)] routine_mode = "" interval: int = 0 business_hour: bool = False threshold: int = 5 while True: (choice0, credentials) = d.form("Enter the Client ID and secret below:", width=65, elements=[ ("Client ID", 2, 5, credentials[0], 2, 16, 41, 0), ("Secret", 4, 5, credentials[1], 4, 16, 41, 0) ], title="Setting the API", form_height=5) if choice0 == d.CANCEL: exit(2) (choice1, routine_mode) = d.menu("Choose the routine mode listed below.", width=54, choices=[("Fixed", "Fixed interval between each routine."), ("Ranged", "Randomly picks an interval in a range.")], title="Routine Mode") if choice1 == d.CANCEL: exit(2) else: if routine_mode == "Fixed": (choice2, interval) = d.inputbox("Enter the interval during each routine, in seconds", width=54, init=str( 600 if not parsed_arguments.interval else parsed_arguments.interval), title="Setting the interval") interval = int(interval) else: (choice2, interval) = d.form("Enter the minimum and the maximum interval, in seconds", width=54, elements=[ ("Min", 1, 15, str(600 if not parsed_arguments.min else parsed_arguments.min), 1, 23, 10, 0), ("Max", 2, 15, str(1200 if not parsed_arguments.max else parsed_arguments.max), 2, 23, 10, 0) ], title="Setting the interval") for item in interval: item = int(item) if choice2 == "cancel": exit(2) business_hour = True if d.yesno("Do you wanna enable business hours mode?\n" "If you enabled this, the API will be only called from 9 to 5, " "from Monday to Friday.", width=54) == d.OK else False (choice4, threshold) = d.inputbox("Enter the maximum file amount stored in the OneDrive.", width=54, init=str(5 if not parsed_arguments.temp_file_threshold else parsed_arguments.temp_file_threshold), title="Temporary file threshold") if choice4 == "Cancel": exit(2) # Conclusion if d.yesno("You've selected:\n" "Client ID: {0}\n" "Secret: {1}***{2}\n" "Routine Mode: {3}\n" "Interval: {4} s\n" "Business Mode: {5}\n" "Threshold: {6}\n\n" "Is this OK?".format(credentials[0], credentials[1][0:5], credentials[1][-5:], routine_mode, str(interval) if isinstance(interval, int) else ( "{0} - {1}".format(str(interval[0]), str(interval[1]))), "Yes" if business_hour else "No", str(threshold) ), width=54, height=15, title="Final Check") == d.OK: break else: continue (client_id, secret) = credentials account = O365.Account(credentials=(client_id, secret), scopes=['basic', 'message_all', 'onedrive_all']) user_obj = O365_User(account) user_obj.infinite_routine(interval, business_hour, 30, threshold, interactive=True) else: if parsed_arguments.client_id is None or parsed_arguments.secret is None: raise ValueError("Both of the client ID and secret VALUE (not uuid) should be provided!") if parsed_arguments.interval and (parsed_arguments.min or parsed_arguments.max): raise ValueError("Intervals and the range cannot be set at the same time!") if (not (parsed_arguments.min and parsed_arguments.max)) and (not parsed_arguments.interval): raise ValueError("The minimum and the maximum should be set at the same time. " "If you wanna use a fixed interval, use --interval instead.") account = O365.Account(credentials=(parsed_arguments.client_id, parsed_arguments.secret), scopes=['basic', 'message_all', 'onedrive_all']) user_obj = O365_User(account) user_obj.infinite_routine(int(parsed_arguments.interval) if parsed_arguments.interval else (int(parsed_arguments.min), int(parsed_arguments.max)), parsed_arguments.business_hour, 30, int(parsed_arguments.temp_file_threshold)) except dialog.PythonDialogBug: logging.error("Cannot use dialogs here, try to change to a terminal or disable interactive mode. Make sure " "that UNIX dialog have been installed in your machine.") except ValueError as e: if parsed_arguments.interactive: d = Dialog() d.msgbox(str(e), width=54, title="Error") logging.error("{0}: {1}".format(type(e).__name__, e)) logging.error(traceback.format_exc()) except Exception as e: logging.error("{0}: {1}".format(type(e).__name__, e)) logging.error(traceback.format_exc()) else: parser.print_help()