Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Z4nzu
GitHub Repository: Z4nzu/hackingtool
Path: blob/master/core.py
1761 views
1
from rich.console import Console
2
from rich.panel import Panel
3
from rich.table import Table
4
from rich import box
5
from rich.traceback import install
6
from rich.theme import Theme
7
8
import os
9
import sys
10
import webbrowser
11
from platform import system
12
from traceback import print_exc
13
from typing import Callable, List, Tuple
14
15
# Enable rich tracebacks
16
install()
17
_theme = Theme({"purple": "#7B61FF"})
18
console = Console(theme=_theme)
19
20
21
def clear_screen():
22
os.system("cls" if system() == "Windows" else "clear")
23
24
25
def validate_input(ip, val_range):
26
val_range = val_range or []
27
try:
28
ip = int(ip)
29
if ip in val_range:
30
return ip
31
except Exception:
32
return None
33
return None
34
35
36
class HackingTool(object):
37
TITLE: str = ""
38
DESCRIPTION: str = ""
39
INSTALL_COMMANDS: List[str] = []
40
INSTALLATION_DIR: str = ""
41
UNINSTALL_COMMANDS: List[str] = []
42
RUN_COMMANDS: List[str] = []
43
OPTIONS: List[Tuple[str, Callable]] = []
44
PROJECT_URL: str = ""
45
46
def __init__(self, options=None, installable=True, runnable=True):
47
options = options or []
48
if isinstance(options, list):
49
self.OPTIONS = []
50
if installable:
51
self.OPTIONS.append(("Install", self.install))
52
if runnable:
53
self.OPTIONS.append(("Run", self.run))
54
self.OPTIONS.extend(options)
55
else:
56
raise Exception("options must be a list of (option_name, option_fn) tuples")
57
58
def show_info(self):
59
desc = f"[cyan]{self.DESCRIPTION}[/cyan]"
60
if self.PROJECT_URL:
61
desc += f"\n[green]🔗 {self.PROJECT_URL}[/green]"
62
console.print(Panel(desc, title=f"[bold purple]{self.TITLE}[/bold purple]", border_style="purple", box=box.DOUBLE))
63
64
def show_options(self, parent=None):
65
clear_screen()
66
self.show_info()
67
68
table = Table(title="Options", box=box.SIMPLE_HEAVY)
69
table.add_column("No.", style="bold cyan", justify="center")
70
table.add_column("Action", style="bold yellow")
71
72
for index, option in enumerate(self.OPTIONS):
73
table.add_row(str(index + 1), option[0])
74
75
if self.PROJECT_URL:
76
table.add_row("98", "Open Project Page")
77
table.add_row("99", f"Back to {parent.TITLE if parent else 'Exit'}")
78
79
console.print(table)
80
81
option_index = input("\n[?] Select an option: ").strip()
82
try:
83
option_index = int(option_index)
84
if option_index - 1 in range(len(self.OPTIONS)):
85
ret_code = self.OPTIONS[option_index - 1][1]()
86
if ret_code != 99:
87
input("\nPress [Enter] to continue...")
88
elif option_index == 98:
89
self.show_project_page()
90
elif option_index == 99:
91
if parent is None:
92
sys.exit()
93
return 99
94
except (TypeError, ValueError):
95
console.print("[red]⚠ Please enter a valid option.[/red]")
96
input("\nPress [Enter] to continue...")
97
except Exception:
98
console.print_exception(show_locals=True)
99
input("\nPress [Enter] to continue...")
100
return self.show_options(parent=parent)
101
102
def before_install(self): pass
103
104
def install(self):
105
self.before_install()
106
if isinstance(self.INSTALL_COMMANDS, (list, tuple)):
107
for INSTALL_COMMAND in self.INSTALL_COMMANDS:
108
console.print(f"[yellow]→ {INSTALL_COMMAND}[/yellow]")
109
os.system(INSTALL_COMMAND)
110
self.after_install()
111
112
def after_install(self):
113
console.print("[green]✔ Successfully installed![/green]")
114
115
def before_uninstall(self) -> bool:
116
return True
117
118
def uninstall(self):
119
if self.before_uninstall():
120
if isinstance(self.UNINSTALL_COMMANDS, (list, tuple)):
121
for UNINSTALL_COMMAND in self.UNINSTALL_COMMANDS:
122
console.print(f"[red]→ {UNINSTALL_COMMAND}[/red]")
123
os.system(UNINSTALL_COMMAND)
124
self.after_uninstall()
125
126
def after_uninstall(self): pass
127
128
def before_run(self): pass
129
130
def run(self):
131
self.before_run()
132
if isinstance(self.RUN_COMMANDS, (list, tuple)):
133
for RUN_COMMAND in self.RUN_COMMANDS:
134
console.print(f"[cyan]⚙ Running:[/cyan] [bold]{RUN_COMMAND}[/bold]")
135
os.system(RUN_COMMAND)
136
self.after_run()
137
138
def after_run(self): pass
139
140
def is_installed(self, dir_to_check=None):
141
console.print("[yellow]⚠ Unimplemented: DO NOT USE[/yellow]")
142
return "?"
143
144
def show_project_page(self):
145
console.print(f"[blue]🌐 Opening project page: {self.PROJECT_URL}[/blue]")
146
webbrowser.open_new_tab(self.PROJECT_URL)
147
148
149
class HackingToolsCollection(object):
150
TITLE: str = ""
151
DESCRIPTION: str = ""
152
TOOLS: List = []
153
154
def __init__(self):
155
pass
156
157
def show_info(self):
158
console.rule(f"[bold purple]{self.TITLE}[/bold purple]", style="purple")
159
console.print(f"[italic cyan]{self.DESCRIPTION}[/italic cyan]\n")
160
161
def show_options(self, parent=None):
162
clear_screen()
163
self.show_info()
164
165
table = Table(title="Available Tools", box=box.MINIMAL_DOUBLE_HEAD)
166
table.add_column("No.", justify="center", style="bold cyan")
167
table.add_column("Tool Name", style="bold yellow")
168
169
for index, tool in enumerate(self.TOOLS):
170
table.add_row(str(index), tool.TITLE)
171
172
table.add_row("99", f"Back to {parent.TITLE if parent else 'Exit'}")
173
console.print(table)
174
175
tool_index = input("\n[?] Choose a tool: ").strip()
176
try:
177
tool_index = int(tool_index)
178
if tool_index in range(len(self.TOOLS)):
179
ret_code = self.TOOLS[tool_index].show_options(parent=self)
180
if ret_code != 99:
181
input("\nPress [Enter] to continue...")
182
elif tool_index == 99:
183
if parent is None:
184
sys.exit()
185
return 99
186
except (TypeError, ValueError):
187
console.print("[red]⚠ Please enter a valid option.[/red]")
188
input("\nPress [Enter] to continue...")
189
except Exception:
190
console.print_exception(show_locals=True)
191
input("\nPress [Enter] to continue...")
192
return self.show_options(parent=parent)
193
194