mirror of
https://github.com/Z4nzu/hackingtool.git
synced 2025-12-07 10:15:14 +08:00
Some checks failed
lint_python / lint_python (push) Has been cancelled
test_install / test_install (17
0
1
99
99
99) (push) Has been cancelled
test_install / test_install (17
0
2
99
99
99) (push) Has been cancelled
test_install / test_install (17
1
1
) (push) Has been cancelled
test_install / test_install (99) (push) Has been cancelled
208 lines
9.5 KiB
Python
Executable File
208 lines
9.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# install_hackingtool.py (rich-based installer UI)
|
|
import os
|
|
import sys
|
|
import shutil
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
from rich.console import Console
|
|
from rich.panel import Panel
|
|
from rich.prompt import Prompt, Confirm, IntPrompt
|
|
from rich.table import Table
|
|
from rich.align import Align
|
|
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
from rich.text import Text
|
|
from rich import box
|
|
from random import choice
|
|
|
|
console = Console()
|
|
|
|
REPO_URL = "https://github.com/Z4nzu/hackingtool.git"
|
|
INSTALL_DIR = Path("/usr/share/hackingtool")
|
|
BIN_PATH = Path("/usr/bin/hackingtool")
|
|
VENV_DIR_NAME = "venv"
|
|
REQUIREMENTS = "requirements.txt"
|
|
|
|
|
|
def check_root():
|
|
if os.geteuid() != 0:
|
|
console.print(Panel("[red]This installer must be run as root. Use: sudo python3 install_hackingtool.py[/red]"))
|
|
sys.exit(1)
|
|
|
|
|
|
def run_cmd(cmd, check=True, capture=False, env=None):
|
|
return subprocess.run(cmd, shell=True, check=check, capture_output=capture, text=True, env=env)
|
|
|
|
|
|
def colorful_logo():
|
|
logos = ["magenta", "bright_magenta", "cyan", "blue", "green", "yellow"]
|
|
style = choice(logos)
|
|
logo_lines = r"""
|
|
▄█ █▄ ▄████████ ▄████████ ▄█ ▄█▄ ▄█ ███▄▄▄▄ ▄██████▄ ███ ▄██████▄ ▄██████▄ ▄█
|
|
███ ███ ███ ███ ███ ███ ███ ▄███▀ ███ ███▀▀▀██▄ ███ ███ ▀█████████▄ ███ ███ ███ ███ ███
|
|
███ ███ ███ ███ ███ █▀ ███▐██▀ ███▌ ███ ███ ███ █▀ ▀███▀▀██ ███ ███ ███ ███ ███
|
|
▄███▄▄▄▄███▄▄ ███ ███ ███ ▄█████▀ ███▌ ███ ███ ▄███ ███ ▀ ███ ███ ███ ███ ███
|
|
▀▀███▀▀▀▀███▀ ▀███████████ ███ ▀▀█████▄ ███▌ ███ ███ ▀▀███ ████▄ ███ ███ ███ ███ ███ ███
|
|
███ ███ ███ ███ ███ █▄ ███▐██▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███
|
|
███ ███ ███ ███ ███ ███ ███ ▀███▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▌ ▄
|
|
███ █▀ ███ █▀ ████████▀ ███ ▀█▀ █▀ ▀█ █▀ ████████▀ ▄████▀ ▀██████▀ ▀██████▀ █████▄▄██
|
|
▀ ▀
|
|
"""
|
|
panel = Panel(Text(logo_lines, style=style), box=box.DOUBLE, border_style=style)
|
|
console.print(panel)
|
|
console.print(f"[bold {style}]https://github.com/Z4nzu/hackingtool[/bold {style}]\n")
|
|
|
|
|
|
def choose_distro():
|
|
console.print(Panel("[bold magenta]Select installation target[/bold magenta]\n\n[1] Kali / Parrot (apt)\n[2] Arch (pacman)\n[0] Exit", border_style="bright_magenta"))
|
|
choice = IntPrompt.ask("Choice", choices=["0", "1", "2"], default=1)
|
|
return choice
|
|
|
|
|
|
def check_internet():
|
|
console.print("[yellow]* Checking internet connectivity...[/yellow]")
|
|
try:
|
|
run_cmd("curl -sSf --max-time 10 https://www.google.com > /dev/null", check=True)
|
|
console.print("[green][✔] Internet connection OK[/green]")
|
|
return True
|
|
except Exception:
|
|
try:
|
|
run_cmd("curl -sSf --max-time 10 https://github.com > /dev/null", check=True)
|
|
console.print("[green][✔] Internet connection OK[/green]")
|
|
return True
|
|
except Exception:
|
|
console.print("[red][✘] Internet connection not available[/red]")
|
|
return False
|
|
|
|
|
|
def system_update_and_install(choice):
|
|
if choice == 1:
|
|
console.print("[yellow]* Running apt update/upgrade...[/yellow]")
|
|
try:
|
|
run_cmd("apt update -y && apt upgrade -y")
|
|
except subprocess.CalledProcessError as e:
|
|
console.print(f"[red][!][/red] apt update/upgrade failed (non-fatal). Continuing installation. Error: {e}")
|
|
console.print("[yellow]* Installing required packages (apt)...[/yellow]")
|
|
try:
|
|
run_cmd("apt-get install -y git python3-pip python3-venv figlet boxes php curl xdotool wget")
|
|
except subprocess.CalledProcessError as e:
|
|
console.print(f"[red][!][/red] apt-get install failed (non-fatal). You may need to install some packages manually. Error: {e}")
|
|
elif choice == 2:
|
|
console.print("[yellow]* Running pacman update...[/yellow]")
|
|
try:
|
|
run_cmd("pacman -Syu --noconfirm")
|
|
except subprocess.CalledProcessError as e:
|
|
console.print(f"[red][!][/red] pacman update failed (non-fatal). Continuing installation. Error: {e}")
|
|
console.print("[yellow]* Installing required packages (pacman)...[/yellow]")
|
|
try:
|
|
run_cmd("pacman -S --noconfirm git python-pip")
|
|
except subprocess.CalledProcessError as e:
|
|
console.print(f"[red][!][/red] pacman install failed (non-fatal). You may need to install some packages manually. Error: {e}")
|
|
else:
|
|
console.print("[red]Invalid package manager choice[/red]")
|
|
|
|
|
|
def prepare_install_dir():
|
|
if INSTALL_DIR.exists():
|
|
console.print(f"[red]The directory {INSTALL_DIR} already exists.[/red]")
|
|
if Confirm.ask("Replace it? This will remove the existing directory", default=False):
|
|
run_cmd(f"rm -rf {str(INSTALL_DIR)}")
|
|
else:
|
|
console.print("[red]Installation aborted by user.[/red]")
|
|
sys.exit(1)
|
|
INSTALL_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
def git_clone():
|
|
console.print("[yellow]* Cloning hackingtool repository...[/yellow]")
|
|
try:
|
|
run_cmd(f"git clone {REPO_URL} {str(INSTALL_DIR)}")
|
|
console.print("[green][✔] Repository cloned[/green]")
|
|
return True
|
|
except Exception as e:
|
|
console.print(f"[red][✘] Failed to clone repository: {e}[/red]")
|
|
return False
|
|
|
|
|
|
def create_venv_and_install(choice):
|
|
venv_path = INSTALL_DIR / VENV_DIR_NAME
|
|
console.print("[yellow]* Creating virtual environment...[/yellow]")
|
|
run_cmd(f"python3 -m venv {str(venv_path)}")
|
|
activate = venv_path / "bin" / "activate"
|
|
pip = str(venv_path / "bin" / "pip")
|
|
if (INSTALL_DIR / REQUIREMENTS).exists():
|
|
console.print("[yellow]* Installing Python requirements...[/yellow]")
|
|
run_cmd(f"{pip} install -r {str(INSTALL_DIR / REQUIREMENTS)}")
|
|
else:
|
|
console.print("[yellow]requirements.txt not found, skipping pip install.[/yellow]")
|
|
if choice == 1:
|
|
run_cmd("apt install figlet -y")
|
|
elif choice == 2:
|
|
# try pacman and fallback to AUR instructions
|
|
try:
|
|
run_cmd("pacman -S --noconfirm figlet")
|
|
except Exception:
|
|
console.print("[yellow]figlet not available in pacman automatically. Consider installing from AUR.[/yellow]")
|
|
|
|
|
|
def create_launcher():
|
|
console.print("[yellow]* Creating launcher script...[/yellow]")
|
|
launcher = INSTALL_DIR / "hackingtool.sh"
|
|
with open(launcher, "w") as f:
|
|
f.write("#!/bin/bash\n")
|
|
f.write(f"source {str(INSTALL_DIR / VENV_DIR_NAME)}/bin/activate\n")
|
|
f.write(f"python3 {str(INSTALL_DIR / 'hackingtool.py')} \"$@\"\n")
|
|
os.chmod(launcher, 0o755)
|
|
# move to /usr/bin/hackingtool
|
|
if BIN_PATH.exists():
|
|
BIN_PATH.unlink()
|
|
shutil.move(str(launcher), str(BIN_PATH))
|
|
console.print(f"[green][✔] Launcher installed at {str(BIN_PATH)}[/green]")
|
|
|
|
|
|
def final_messages():
|
|
panel = Panel(
|
|
"[bold magenta]Installation complete[/bold magenta]\n\nType [bold cyan]hackingtool[/bold cyan] in terminal to start.",
|
|
border_style="magenta",
|
|
)
|
|
console.print(panel)
|
|
|
|
def main():
|
|
check_root()
|
|
console.clear()
|
|
colorful_logo()
|
|
choice = choose_distro()
|
|
if choice == 0:
|
|
console.print("[red]Exiting...[/red]")
|
|
sys.exit(0)
|
|
if not check_internet():
|
|
sys.exit(1)
|
|
|
|
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
progress.add_task(description="Preparing system...", total=None)
|
|
system_update_and_install(choice)
|
|
|
|
prepare_install_dir()
|
|
ok = git_clone()
|
|
if not ok:
|
|
sys.exit(1)
|
|
|
|
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
progress.add_task(description="Setting up virtualenv & requirements...", total=None)
|
|
create_venv_and_install(choice)
|
|
|
|
create_launcher()
|
|
final_messages()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
console.print("\n[red]Installation interrupted by user[/red]")
|
|
sys.exit(1)
|
|
except subprocess.CalledProcessError as e:
|
|
console.print(f"[red]Command failed: {e}[/red]")
|
|
sys.exit(1)
|