diff --git a/AirlockTools.py b/AirlockTools.py index 9a10dc9..1be9010 100644 --- a/AirlockTools.py +++ b/AirlockTools.py @@ -125,12 +125,13 @@ def deduplicate_list(lst): def menu_main(): while True: ct.displayIntro(); - print(ct.colorText("1. Get All Events for Single Device", "yellow")) - print(ct.colorText("2. OTP", "yellow")) - print(ct.colorText("3. Find Unexcluded from 24hr Execution", "yellow")) - print(ct.colorText("4. Prepare Policy For Enforcement", "yellow")) - print(ct.colorText("5. Update Audit Policies from Enforcement Policies", "yellow")) - print(ct.colorText("Q. Quit", "yellow")) + print(ct.colorText("1. šŸ–„ļø - Get All Events for Single Device", "yellow")) + print(ct.colorText("2. šŸŽ« - OTP", "yellow")) + print(ct.colorText("3. ā±ļø - Find Unexcluded from 24hr Execution", "yellow")) + print(ct.colorText("4. šŸ”’ - Prepare Policy For Enforcement", "yellow")) + print(ct.colorText("5. šŸ”„ - Update Audit Policies from Enforcement Policies", "yellow")) + print(ct.colorText("6 šŸ” - Device Search", "yellow")) + print(ct.colorText("Q. šŸ”š - Quit", "yellow")) choice = input(ct.colorText("\nEnter Menu Item: ", "white")) if choice == '1': @@ -143,6 +144,9 @@ def menu_main(): menu_prepare_to_enforce() elif choice == "5": utils.policyfunctions.updateAuditPoliciesFromEnforcementPolices(url, policy_relationship_map) + elif choice == "6": + device_input_str = utils.clientfunctions.promptForDevices() + utils.clientfunctions.findAgents(url, device_input_str) elif choice == "Q": break else: @@ -150,7 +154,7 @@ def menu_main(): def menu_otp(): while True: - print(ct.colorText("\n--- OTP Submenu ---","cyan")) + print(ct.colorText("\n--- šŸŽ« OTP Submenu šŸŽ« ---","cyan")) print(ct.colorText("1. Generate OTP","cyan")) #print(ct.colorText("2. Sub-option B","cyan")) print(ct.colorText("Q. Return to Main Menu","cyan")) diff --git a/utils/clientfunctions.py b/utils/clientfunctions.py index c49537a..bbde0a6 100644 --- a/utils/clientfunctions.py +++ b/utils/clientfunctions.py @@ -17,9 +17,10 @@ import utils.pretty as ct #Standard Libary Imports: -import datetime +from datetime import datetime import json import os +import re #3rd Party Imports: import pandas as pd @@ -184,3 +185,62 @@ def devicehistory(url, outputjson: bool): else: print(ct.colorText("No execution history found or data is not in expected format.", "red")) +def findAllAgents(url): + endpoint = url + '/v1/agent/find' + payload = {} + headers = {"X-APIKey": os.getenv('APIKEY')} + payload = json.dumps(payload) + response = requests.post(endpoint, headers=headers, data=payload, verify=False) + result = json.loads(response.text) + data = pd.DataFrame(result["response"]["agents"]) + return(data) + +def findAgents(url, device_input_str): + + os.makedirs("device_search", exist_ok=True) + # Step 1: Get the DataFrame from your function + df = findAllAgents(url) + + # Step 2: Parse the input string into device names (newline-separated only) + device_names = device_input_str.strip().split('\n') + device_names = [name.strip() for name in device_names if name.strip()] + + # Step 3: Build a regex pattern for case-insensitive matching + pattern = '|'.join([re.escape(name) for name in device_names]) + regex = re.compile(pattern, re.IGNORECASE) + + # Step 4: Filter the DataFrame using regex + matched_df = df[df['hostname'].apply(lambda x: bool(regex.search(str(x))))] + + # Step 5: Export to CSV with timestamp + timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + filename = f"agentsearch_{timestamp}.csv" + matched_df.to_csv(f"device_search\\{filename}", index=False) + + print(ct.colorText(f"\nāœ… Matched devices exported to: device_search\\{filename}","green")) + +def promptForDevices(): + + print(ct.colorText("šŸ” Device Search", "cyan")) + print(ct.colorText("Enter the device hostnames you'd like to search for, one per line.", "cyan")) + print(ct.colorText("When you're done, press Enter twice.\n", "cyan")) + print(ct.colorText("Example:", "cyan")) + print(ct.colorText("H00000", "cyan")) + print(ct.colorText("UTN00000", "cyan")) + print(ct.colorText("i-hSuperSecretServer", "cyan")) + print(ct.colorText("u-hVenderBroke\n", "cyan")) + + + # Collect multiline input from user + print(ct.colorText("Paste or type your device names below:", "white")) + device_input_lines = [] + while True: + line = input() + if line == "": + break + device_input_lines.append(line) + + device_input_str = "\n".join(device_input_lines) + + return device_input_str + diff --git a/utils/pretty.py b/utils/pretty.py index 3a19d2b..5b151e4 100644 --- a/utils/pretty.py +++ b/utils/pretty.py @@ -196,7 +196,7 @@ def displayIntro(): def printEnforceChecklist(first_policy, second_policy, allowlist_child_name, allowlist_parent_name, destination_name): print(colorText("\n --------------------------------------------------------------------", "cyan")) - print(colorText(" -------------------- Prepare to Enforce Policy ---------------------", "cyan")) + print(colorText(" ------------- šŸ› ļø šŸ”’ Prepare to Enforce Policy šŸ› ļø šŸ”’ ------------------", "cyan")) print(colorText(" --------------------------------------------------------------------", "cyan")) print(colorText("\nSequentually follow these steps to prepare a policy for enforcement:", "white")) @@ -308,17 +308,14 @@ def printEnforceChecklist(first_policy, second_policy, allowlist_child_name, all print(colorText("Q. Quit", "cyan")) - - - def areYouSure(): - print(colorText(f"*******************************************************************************************************************************************","red")) - print(colorText(f"*=========================================================================================================================================*","yellow")) - print(colorText(f"*=========================================================================================================================================*","red")) - print(colorText(f"*-------------This program will now begin to make changes to the Airlock Console. Do you understand and agree to proceed? ----------------*", "yellow")) - print(colorText(f"*=========================================================================================================================================*","red")) - print(colorText(f"*=========================================================================================================================================*","yellow")) - print(colorText(f"*******************************************************************************************************************************************","red")) + print(colorText(f"šŸ›‘*****************************************************************************************************************************************šŸ›‘","red")) + print(colorText(f"āš ļø=========================================================================================================================================āš ļø","yellow")) + print(colorText(f"šŸ›‘========================================================================================================================================šŸ›‘","red")) + print(colorText(f"āš ļø-------------This program will now begin to make changes to the Airlock Console. Do you understand and agree to proceed? ----------------āš ļø", "yellow")) + print(colorText(f"šŸ›‘=========================================================================================================================================šŸ›‘","red")) + print(colorText(f"āš ļø=========================================================================================================================================āš ļø","yellow")) + print(colorText(f"šŸ›‘******************************************************************************************************************************************šŸ›‘","red")) def locked():