AllForOne/AllForOne.py
2023-07-02 19:55:33 +05:30

155 lines
5.7 KiB
Python

import os
import subprocess
import shutil
import time
import requests
from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor, wait
import glob
from tabulate import tabulate
print("\033[91m\033[93m ,-. _,---._ __ / \ _ _ _ ___ ___ ")
print(r" / ) .-' `./ / \ /_\ | | | / __\__ _ __ /___\_ __ ___ ")
print(r"( ( ,' `/ /| //_\\| | | / _\/ _ \| '__| // // '_ \ / _ \ ")
print(r' \ `-" \ \ / | / _ \ | | / / | (_) | | / \_//| | | | __/ ')
print(r" `. , \ \ / | \_/ \_/_|_| \/ \___/|_| \___/ |_| |_|\___| ")
print(r" /`. ,'-`----Y | ")
print(r" ( ; | ' ")
print(r" | ,-. ,-' Git-HUB | / Nuclei Template Collector ")
print(r" | | ( | BoX | / - AggressiveUser ")
print(r" ) | \ `.___________|/ ")
print(" `--' `--' \033[0m")
def git_clone(url, destination):
env = os.environ.copy()
env['GIT_TERMINAL_PROMPT'] = '0'
result = subprocess.run(['git', 'clone', url, destination], stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, env=env)
return result.returncode, result.stderr.decode().strip()
def generate_destination_folder(url):
folder_name = os.path.basename(url.rstrip('.git'))
counter = 1
while os.path.exists(os.path.join('TRASH', folder_name)):
folder_name = f"{os.path.basename(url.rstrip('.git'))}_{counter}"
counter += 1
return folder_name
def clone_repository(repo):
destination = generate_destination_folder(repo)
return_code, error_msg = git_clone(repo, os.path.join('TRASH', destination))
if return_code != 0 or 'Username for' in error_msg:
return repo
return None
def clone_repositories(file_url):
response = requests.get(file_url)
if response.status_code == 200:
repositories = response.text.strip().split('\n')
else:
print('Failed to retrieve Repo List from the server.')
return
total_repos = len(repositories)
os.makedirs('TRASH', exist_ok=True)
failed_repos = []
with ThreadPoolExecutor(max_workers=6) as executor:
futures = [executor.submit(clone_repository, repo) for repo in repositories]
with tqdm(total=total_repos, unit='repo', desc='Cloning repositories', ncols=80) as progress_bar:
completed = 0
while completed < total_repos:
done, _ = wait(futures, return_when='FIRST_COMPLETED')
completed += len(done)
for future in done:
failed_repo = future.result()
if failed_repo:
failed_repos.append(failed_repo)
progress_bar.update(1)
progress = progress_bar.n / total_repos * 100
progress_bar.set_postfix({'Progress': f'{progress:.2f}%'})
futures = [future for future in futures if not future.done()]
progress_bar.close()
print('Cloning process complete!\n')
if failed_repos:
print("\033[91mFailed to clone the following repositories:\033[0m")
for repo in failed_repos:
print(repo)
template_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Templates')
os.makedirs(template_folder, exist_ok=True)
for root, dirs, files in os.walk('TRASH'):
for file in files:
if file.endswith('.yaml'):
source_path = os.path.join(root, file)
cve_year = extract_cve_year(file)
if cve_year:
destination_folder = os.path.join(template_folder, f"CVE-{cve_year}")
else:
destination_folder = os.path.join(template_folder, "Vulnerability-Templates")
os.makedirs(destination_folder, exist_ok=True)
destination_path = os.path.join(destination_folder, file)
shutil.copy2(source_path, destination_path)
print('\nRemoving caches and temporary files.\n')
shutil.rmtree('TRASH')
time.sleep(2)
def extract_cve_year(file_name):
if file_name.startswith('CVE-') and file_name[4:8].isdigit():
return file_name[4:8]
return None
def count_yaml_files(folder):
count = 0
for root, dirs, files in os.walk(folder):
for file in files:
if file.endswith('.yaml'):
count += 1
return count
def summarize_templates():
cve_folders = glob.glob(os.path.join(template_folder, 'CVE-*'))
cve_yaml_count = 0
for folder in cve_folders:
cve_yaml_count += count_yaml_files(folder)
vulnerability_templates_folder = os.path.join(template_folder, 'Vulnerability-Templates')
vulnerability_yaml_count = count_yaml_files(vulnerability_templates_folder)
total_yaml_count = cve_yaml_count + vulnerability_yaml_count
data = [
["CVE Templates", cve_yaml_count],
["Other Vulnerability Templates", vulnerability_yaml_count],
["Total Templates", total_yaml_count]
]
headers = ["Templates Type", "Templates Count"]
table = tabulate(data, headers, tablefmt="fancy_grid")
print(table)
file_url = 'https://raw.githubusercontent.com/AggressiveUser/AllForOne/main/PleaseUpdateMe.txt'
clone_repositories(file_url)
template_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Templates')
summarize_templates()
#Intro
print('\033[91m\033[93mPlease show your support by giving star to my GitHub repository "AllForOne".')
print('GITHUB: https://github.com/AggressiveUser/AllForOne\033[0m')