|
|
|
|
|
"""
|
|
|
Script to rename response analysis files to shorter, more readable names.
|
|
|
|
|
|
This script renames all JSON and MD files in the final_response directory
|
|
|
from long names like:
|
|
|
- covenant_dcsync_dcerpc_drsuapi_DsGetNCChanges_2020-08-05020926_response_analysis.json
|
|
|
- covenant_dcsync_dcerpc_drsuapi_DsGetNCChanges_2020-08-05020926_threat_report.md
|
|
|
|
|
|
To shorter names:
|
|
|
- response_analysis.json
|
|
|
- threat_report.md
|
|
|
"""
|
|
|
|
|
|
import os
|
|
|
import sys
|
|
|
from pathlib import Path
|
|
|
from typing import List, Tuple
|
|
|
|
|
|
|
|
|
def find_response_files(base_dir: str) -> List[Tuple[str, str, str]]:
|
|
|
"""
|
|
|
Find all response analysis files that need to be renamed.
|
|
|
|
|
|
Args:
|
|
|
base_dir: Base directory to search (e.g., 'final_response')
|
|
|
|
|
|
Returns:
|
|
|
List of tuples: (file_path, new_json_name, new_md_name)
|
|
|
"""
|
|
|
files_to_rename = []
|
|
|
base_path = Path(base_dir)
|
|
|
|
|
|
if not base_path.exists():
|
|
|
print(f"[ERROR] Base directory '{base_dir}' does not exist!")
|
|
|
return files_to_rename
|
|
|
|
|
|
|
|
|
for root, dirs, files in os.walk(base_path):
|
|
|
root_path = Path(root)
|
|
|
|
|
|
|
|
|
json_files = [f for f in files if f.endswith('_response_analysis.json')]
|
|
|
md_files = [f for f in files if f.endswith('_threat_report.md')]
|
|
|
|
|
|
|
|
|
for json_file in json_files:
|
|
|
json_path = root_path / json_file
|
|
|
new_json_name = "response_analysis.json"
|
|
|
new_md_name = "threat_report.md"
|
|
|
files_to_rename.append((str(json_path), new_json_name, new_md_name))
|
|
|
|
|
|
|
|
|
for md_file in md_files:
|
|
|
md_path = root_path / md_file
|
|
|
new_json_name = "response_analysis.json"
|
|
|
new_md_name = "threat_report.md"
|
|
|
files_to_rename.append((str(md_path), new_json_name, new_md_name))
|
|
|
|
|
|
return files_to_rename
|
|
|
|
|
|
|
|
|
def rename_files(files_to_rename: List[Tuple[str, str, str]], dry_run: bool = True) -> None:
|
|
|
"""
|
|
|
Rename the files to shorter names.
|
|
|
|
|
|
Args:
|
|
|
files_to_rename: List of files to rename
|
|
|
dry_run: If True, only show what would be renamed without actually doing it
|
|
|
"""
|
|
|
if not files_to_rename:
|
|
|
print("[INFO] No files found that need renaming.")
|
|
|
return
|
|
|
|
|
|
print(f"[INFO] Found {len(files_to_rename)} files to rename.")
|
|
|
|
|
|
if dry_run:
|
|
|
print("\n[DRY RUN] Files that would be renamed:")
|
|
|
else:
|
|
|
print("\n[RENAMING] Renaming files:")
|
|
|
|
|
|
success_count = 0
|
|
|
error_count = 0
|
|
|
|
|
|
for file_path, new_json_name, new_md_name in files_to_rename:
|
|
|
try:
|
|
|
old_path = Path(file_path)
|
|
|
new_name = new_json_name if file_path.endswith('.json') else new_md_name
|
|
|
new_path = old_path.parent / new_name
|
|
|
|
|
|
if dry_run:
|
|
|
print(f" {old_path.name} -> {new_name}")
|
|
|
else:
|
|
|
|
|
|
if new_path.exists():
|
|
|
print(f" [SKIP] {old_path.name} -> {new_name} (target already exists)")
|
|
|
continue
|
|
|
|
|
|
|
|
|
old_path.rename(new_path)
|
|
|
print(f" [OK] {old_path.name} -> {new_name}")
|
|
|
success_count += 1
|
|
|
|
|
|
except Exception as e:
|
|
|
print(f" [ERROR] Failed to rename {file_path}: {e}")
|
|
|
error_count += 1
|
|
|
|
|
|
if not dry_run:
|
|
|
print(f"\n[SUMMARY] Renamed {success_count} files successfully, {error_count} errors.")
|
|
|
|
|
|
|
|
|
def main():
|
|
|
"""Main function to handle command line arguments and execute renaming."""
|
|
|
import argparse
|
|
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
description="Rename response analysis files to shorter names",
|
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
|
epilog="""
|
|
|
Examples:
|
|
|
python rename_response_files.py # Dry run (show what would be renamed)
|
|
|
python rename_response_files.py --execute # Actually rename the files
|
|
|
python rename_response_files.py --dir custom_dir # Use custom directory
|
|
|
"""
|
|
|
)
|
|
|
|
|
|
parser.add_argument(
|
|
|
'--dir',
|
|
|
default='final_response',
|
|
|
help='Base directory to search for files (default: final_response)'
|
|
|
)
|
|
|
|
|
|
parser.add_argument(
|
|
|
'--execute',
|
|
|
action='store_true',
|
|
|
help='Actually rename files (default is dry run)'
|
|
|
)
|
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
|
print(f"[INFO] Searching for response files in: {args.dir}")
|
|
|
|
|
|
|
|
|
files_to_rename = find_response_files(args.dir)
|
|
|
|
|
|
if not files_to_rename:
|
|
|
print("[INFO] No files found that need renaming.")
|
|
|
return
|
|
|
|
|
|
|
|
|
print(f"[INFO] Found {len(files_to_rename)} files that match the old naming pattern.")
|
|
|
|
|
|
|
|
|
rename_files(files_to_rename, dry_run=not args.execute)
|
|
|
|
|
|
if not args.execute:
|
|
|
print("\n[INFO] This was a dry run. Use --execute to actually rename the files.")
|
|
|
print("Example: python rename_response_files.py --execute")
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
main()
|
|
|
|