diff --git a/e911_helper.py b/e911_helper.py index 23ba4d5..f25e7f6 100644 --- a/e911_helper.py +++ b/e911_helper.py @@ -21,18 +21,6 @@ except ImportError: logger = logging.getLogger(__name__) - -class bcolors: - HEADER = "\033[95m" - OKBLUE = "\033[94m" - OKCYAN = "\033[96m" - OKGREEN = "\033[92m" - WARNING = "\033[93m" - FAIL = "\033[91m" - ENDC = "\033[0m" - BOLD = "\033[1m" - UNDERLINE = "\033[4m" - class Colors: """ ANSI color codes """ BLACK = "\033[0;30m" @@ -94,17 +82,6 @@ TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL VOICE1 OR I """ ) - -# TODO: Set to config file. -config_file = "config.json" -if os.path.isfile(config_file): - with open(config_file) as f: - config_data = json.load(f) -else: - logger.critical(f"Unable to load config.json. Aborting.") - sys.exit() - - add_type_list = [ "", "Apartment", @@ -133,6 +110,36 @@ add_type_list = [ "Upper", ] +def prompt_credentials(config): + """Prompt for credentials""" + + print(f"{Colors.LIGHT_GREEN}DO NOT SHARE YOUR CREDENTIALS WITH ANYONE.{Colors.END}") + + config["username"] = input("Enter your api.switchvoxuc.com username: ") + config["password"] = getpass("Enter your api.switchvoxuc.com password: ") + config["provider_username"] = input("Enter your api.nwsip.com username: ") + config["provider_password"] = getpass("Enter your api.nwsip.com password: ") + + print(f"{Colors.LIGHT_GREEN}Configure additoinal tenant credentials.{Colors.END}") + tenant = input("Enter your tenant name or enter for None: ") or None + if tenant is not None: + tenant = tenant.upper() + config["tenant"] = {tenant: {}} + config["tenant"][tenant]["username"] = input( + f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.switchvoxuc.com username: " + ) + config["tenant"][tenant]["password"] = getpass( + f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.switchvoxuc.com password: " + ) + config["tenant"][tenant]["provider_username"] = input( + f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.nwsip.com username: " + ) + config["tenant"][tenant]["provider_password"] = getpass( + f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.nwsip.com password: " + ) + + return config + def create_helpdeskticket(**kwargs): """Open helpdesk ticket w/ VOICE1""" @@ -161,6 +168,13 @@ def get_nth_key(dictionary, n=0): return key raise IndexError("dictionary index out of range") +def build_config(): + config = {} + regcode = input(f"Enter your 6 digit regcode: ") or None + e911_callrule_id = int(input(f"Enter the default 'call_rule_id' for dialing 911 to use: ")) or 6 + priority = int(input(f"Enter the default 'position' to add caller_id_rules: ")) or 0 + redirect_extension = int(input(f"Enter the default 'extension number' to redirect calls to: ")) or 7001 + return [config] def set_tenant(**kwargs): global regcode @@ -171,6 +185,10 @@ def set_tenant(**kwargs): global nwsip_url global nwsip_auth + # Empty config.json so build one in memory. + if not config_data: + config_data = build_config() + # Get 1st REGCODE in config. for i, r in enumerate(config_data): print(f"{i}) {r['regcode']}") @@ -221,8 +239,6 @@ def get_caller_id_rule(phone_number=None): # Create outbound caller id rule - - def set_caller_id_rule( caller_id_number, caller_id_name, @@ -278,8 +294,6 @@ def set_caller_id_rule( # Remove Outbound 911 Caller ID Rule - - def remove_caller_id_rule(cid_rule_id=None): """ :param cid_rule_id: The outbound caller id rule to specifiy for removal. @@ -288,7 +302,6 @@ def remove_caller_id_rule(cid_rule_id=None): # !! Remove the caller id rule url = swvx_url + f"/caller_ids/remove/{cid_rule_id}" logger.critical(f"Removing outbound caller id: {url}") - # logger.debug(json.dumps(d, indent=4)) params = {} r = requests.delete(url, auth=swvx_auth, params=params) if r.status_code != 201: @@ -297,8 +310,6 @@ def remove_caller_id_rule(cid_rule_id=None): # Get inbound route of number - - def inbound_route_by_number(inbound_did): try: r = requests.get( @@ -312,10 +323,7 @@ def inbound_route_by_number(inbound_did): # Redirect Inbound DID to new destination - - def redirect_did(inbound_did, dest_account_id, note="", priority=1, label="Available"): - route = inbound_route_by_number(inbound_did=inbound_did) payload = { "name": label, @@ -471,8 +479,6 @@ def add_e911_address(address, extension, auto_correct=True): # Get E911 id by number. - - def get_e911id_by_number(number, **kwargs): """Returns E911 address ID by phone number.""" result = None @@ -847,13 +853,13 @@ def menu(): print( f"You are performing the following actions on {regcode.upper()} Tenant: {tenant}" ) - action = input( - f"What action are you performing?\n\---------- PBX Actions ------------------------\n\ + action = input(f"What action are you performing?\n\ + {Colors.YELLOW}---------- PBX Actions ------------------------{Colors.END}\n\ T = Tenant Change \n\ - M = Move (redirect) DID. (from PBX {regcode.upper()})\n\ - C = Caller ID (from PBX {regcode.upper()} )\n\ + M = Move (redirect) incoming DID. (from PBX {regcode.upper()})\n\ + C = Set Outgoing Caller ID Name & Number (from PBX {regcode.upper()} )\n\ \n\ - ---------- SIP Provider actions ----------------\n\ + {Colors.LIGHT_CYAN}---------- SIP Provider actions ----------------{Colors.END}\n\ N = New E911 Address (from provider)\n\ U = Update existing E911 Address (from provider)\n\ R = Remove E911 record (from provider).\n\ @@ -861,8 +867,8 @@ def menu(): RN = Release DID from account (from provider). \n\ Q = Quit.\n\ \n\ - ---------- Comming soon -------------------------\n\ - ---------- PBX Location/Hotdesking --------------\n\ + {Colors.NEGATIVE}---------- Comming soon -------------------------{Colors.END}\n\ + {Colors.LIGHT_RED}---------- PBX Location/Hotdesking --------------{Colors.END}\n\ L = List/Set device E911 Location/Hotdesking.\n\ H = Enable/Disable phone Hotdesking.\n\ E = Create/Remove PBX extension.\n\ @@ -933,6 +939,13 @@ def menu(): x_pos = config["911_callrule_id"] out_call_rule_id = config["out_call_rule_id"] + print(f"{Colors.LIGHT_RED}If you attempting to set an outgoing " + f"caller ID number for E911 use STOP! You should be using the newer " + f"'phone_locations' function in your Switchvox.{Colors.END}") + ack_new_911 = input(f"Are you setting an outgoing 911 number?: ") or 'y' + if ack_new_911.lower().startswith('y'): + print(f"Finish setting up your phone_location rules and hot-desking in your switchvox.") + return outbound_did = ( input(f"Enter the outbound Caller ID Number [{outbound_did}]: ") or outbound_did @@ -1213,38 +1226,15 @@ def menu(): get_e911_info(e911_id) -def prompt_credentials(config): - """Prompt for credentials""" - - print(f"{Colors.LIGHT_GREEN}DO NOT SHARE YOUR CREDENTIALS WITH ANYONE.{Colors.END}") - - config["username"] = input("Enter your api.switchvoxuc.com username: ") - config["password"] = getpass("Enter your api.switchvoxuc.com password: ") - config["provider_username"] = input("Enter your api.nwsip.com username: ") - config["provider_password"] = getpass("Enter your api.nwsip.com password: ") - - print(f"{Colors.LIGHT_GREEN}Configure additoinal tenant credentials.{Colors.END}") - tenant = input("Enter your tenant name or enter for None: ") or None - if tenant is not None: - tenant = tenant.upper() - config["tenant"] = {tenant: {}} - config["tenant"][tenant]["username"] = input( - f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.switchvoxuc.com username: " - ) - config["tenant"][tenant]["password"] = getpass( - f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.switchvoxuc.com password: " - ) - config["tenant"][tenant]["provider_username"] = input( - f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.nwsip.com username: " - ) - config["tenant"][tenant]["provider_password"] = getpass( - f"Enter your {Colors.LIGHT_CYAN}{tenant}{Colors.END} api.nwsip.com password: " - ) - - return config - - if __name__ == "__main__": + # TODO: Set to config file. + config_file = "config.json" + if os.path.isfile(config_file): + with open(config_file) as f: + config_data = json.load(f) + else: + logger.critical(f"Unable to load config.json. Aborting.") + sys.exit() try: config_data = [prompt_credentials(config_data[0])]