Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Python CLI script (menu.py) for exploring repository tools #218

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
134 changes: 134 additions & 0 deletions menu.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import re
import os
import webbrowser
import requests

# Filepath to the README.md file
README_FILE = "README.md"

# GitHub API URL for fetching repository data
GITHUB_API_URL = "https://api.github.com/repos/"

# Function to parse tools and links from the README.md file
def parse_tools(readme_path):
tools = []
current_category = None

with open(readme_path, "r") as f:
for line in f:
# Detect categories (e.g., "## Static Analysis Tools")
category_match = re.match(r"^##\s+(.+)$", line)
if category_match:
current_category = category_match.group(1).strip()
continue

# Detect tool links (e.g., "1. [Tool Name](https://example.com)")
tool_match = re.match(r"^\d+\.\s+\[(.+?)\]\((https?://.+?)\)\s*-?\s*(.*)$", line)
if tool_match:
tool_name = tool_match.group(1).strip()
tool_url = tool_match.group(2).strip()
tool_desc = tool_match.group(3).strip()

tools.append({
"name": tool_name,
"url": tool_url,
"desc": tool_desc,
"category": current_category,
})

return tools

# Function to fetch GitHub metadata (stars, last updated)
def fetch_github_metadata(url):
if "github.com" not in url:
return None

try:
# Extract owner and repo name from the URL
repo_path = re.search(r"github.com/([^/]+/[^/]+)/?", url).group(1)
response = requests.get(GITHUB_API_URL + repo_path)

if response.status_code == 200:
data = response.json()
return {
"stars": data.get("stargazers_count", "N/A"),
"last_updated": data.get("updated_at", "N/A"),
}
except Exception as e:
print(f"Error fetching metadata for {url}: {e}")

return None

# Function to display tools by category
def list_tools_by_category(tools):
categories = sorted(set(tool["category"] for tool in tools if tool["category"]))

print("\nCategories:")
for i, category in enumerate(categories, start=1):
print(f"{i}. {category}")

choice = input("\nSelect a category by number: ")
if not choice.isdigit() or int(choice) < 1 or int(choice) > len(categories):
print("Invalid choice. Returning to main menu.")
return

selected_category = categories[int(choice) - 1]
print(f"\nTools in '{selected_category}':\n")
for tool in tools:
if tool["category"] == selected_category:
print(f"- {tool['name']} ({tool['url']})\n {tool['desc']}")

# Function to search for a tool by name
def search_tool(tools):
query = input("\nEnter the tool name to search for: ").lower()

results = [tool for tool in tools if query in tool["name"].lower()]
if results:
print("\nSearch Results:")
for tool in results:
print(f"- {tool['name']} ({tool['url']})\n {tool['desc']}")
else:
print("\nNo tools found with that name.")

# Function to open a tool's URL in the default web browser
def open_tool_url(tools):
query = input("\nEnter the tool name to open: ").lower()

for tool in tools:
if query in tool["name"].lower():
print(f"Opening {tool['name']} in your web browser...")
webbrowser.open(tool["url"])
return

print("\nTool not found.")

# Main menu
def main_menu(tools):
while True:
print("\nAndroid Security Tools CLI")
print("1. List tools by category")
print("2. Search for a tool")
print("3. Open a tool's webpage")
print("4. Exit")

choice = input("\nEnter your choice: ")

if choice == "1":
list_tools_by_category(tools)
elif choice == "2":
search_tool(tools)
elif choice == "3":
open_tool_url(tools)
elif choice == "4":
print("Goodbye!")
break
else:
print("Invalid choice. Please try again.")

# Entry point
if __name__ == "__main__":
if not os.path.exists(README_FILE):
print(f"Error: {README_FILE} not found. Please ensure the script is in the same directory as the README.md file.")
else:
tools = parse_tools(README_FILE)
main_menu(tools)