Files
acc-installer/main.py

149 lines
4.5 KiB
Python

"""
Main Orchestrator for Acc Installer.
Executes directory setup, file copy, archive extraction, and automated installation.
"""
import argparse
import logging
import sys
import time
from typing import Optional
from module.config import InstallerConfig, detect_target_drive
from module.downloader_copier import setup_directories_and_copy
from module.extract_acc import extract_acc_archive
from module.install_novindesk import install_novindesk
def setup_logger(verbose: bool = False) -> logging.Logger:
level = logging.DEBUG if verbose else logging.INFO
logging.basicConfig(
level=level,
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%H:%M:%S"
)
return logging.getLogger("acc_installer")
def parse_arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="NovinPardaz Acc Installer - Automated Setup Pipeline",
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument(
"--source",
type=str,
default=r"C:\SoftwareNP",
help="Source directory containing installation archives"
)
parser.add_argument(
"--drive",
type=str,
default=None,
help="Target drive for installation (e.g. 'D:\\'). Auto-detected if not specified."
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Simulate execution without modifying files or launching processes"
)
parser.add_argument(
"--skip-acc",
action="store_true",
help="Skip extraction of NovinAcc archive"
)
parser.add_argument(
"--skip-desk",
action="store_true",
help="Skip installation of NovinDesk"
)
parser.add_argument(
"--no-ui",
action="store_true",
help="Disable automatic UI interaction during NovinDesk installation"
)
parser.add_argument(
"--verbose",
"-v",
action="store_true",
help="Enable detailed debug logging"
)
return parser.parse_args()
def run_pipeline(config: InstallerConfig,
skip_acc: bool = False,
skip_desk: bool = False,
auto_ui: bool = True) -> bool:
"""
Executes the installer pipeline steps sequentially.
"""
start_time = time.time()
print("=" * 60)
print(" NovinPardaz Acc Installer Pipeline ")
print("=" * 60)
print(f" Source Directory : {config.source_dir}")
print(f" Target Drive : {config.target_drive}")
print(f" Target Base Dir : {config.base_dir}")
print(f" Dry Run Mode : {config.dry_run}")
print("-" * 60)
try:
# Step 1: Directory Setup & Software Copy
print("\n[Step 1/3] Setting up directories and copying software files...")
setup_directories_and_copy(config)
print("[+] Step 1 completed successfully.")
# Step 2: Extract NovinAcc Archive
if not skip_acc:
print("\n[Step 2/3] Extracting NovinAcc accounting archive...")
extract_acc_archive(config)
print("[+] Step 2 completed successfully.")
else:
print("\n[Step 2/3] Skipped NovinAcc extraction (--skip-acc specified).")
# Step 3: Install NovinDesk
if not skip_desk:
print("\n[Step 3/3] Extracting and launching NovinDesk installer...")
install_novindesk(config, auto_ui=auto_ui)
print("[+] Step 3 completed successfully.")
else:
print("\n[Step 3/3] Skipped NovinDesk installation (--skip-desk specified).")
elapsed = time.time() - start_time
print("\n" + "=" * 60)
print(f"[SUCCESS] All installation steps completed in {elapsed:.2f} seconds.")
print("=" * 60)
return True
except Exception as exc:
elapsed = time.time() - start_time
print(f"\n[-] Installation pipeline failed after {elapsed:.2f} seconds!")
print(f"[-] Error: {exc}", file=sys.stderr)
return False
def main() -> None:
args = parse_arguments()
setup_logger(args.verbose)
target_drive = args.drive if args.drive else detect_target_drive()
config = InstallerConfig(
source_dir=args.source,
target_drive=target_drive,
dry_run=args.dry_run
)
success = run_pipeline(
config=config,
skip_acc=args.skip_acc,
skip_desk=args.skip_desk,
auto_ui=not args.no_ui
)
sys.exit(0 if success else 1)
if __name__ == "__main__":
main()