Skip to content
Snippets Groups Projects
scan.py 3.15 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/env python3
    
    import logging
    import json
    from sys import argv, exit
    import os
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    import scan_gvm_library as gvm_library
    import scan_utilities as utilities
    
    import argparse
    
    ### GVM Options ###
    
    WAIT_TIMEOUT = 3600 #1h
    
    
    parser = argparse.ArgumentParser(
        description='Scan endpoints and machines')
                
    parser.add_argument(
        "--endpoint-keys",
    
        help="Orchestrator output endpoints to scan (endpoints1,endpoints2)",
        default="None"
    
        )
    parser.add_argument(
        "--dep-json", 
        default="./dep.json"
        )
    parser.add_argument(
        "--output-dir", 
        default="."
        )
    
    args = parser.parse_args()
    
    logging.basicConfig(
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
        filename='scan.log', 
    
        level=logging.DEBUG,
        format='%(asctime)s %(levelname)-8s %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        filemode='w')
    logging.info("\n\nStart scan application")
    
    if os.environ.get('GMP_USER') is not None and \
            os.environ.get('GMP_USER') != '':
        auth_name = os.getenv('GMP_USER')
    else:
        logging.error("GMP_USER env var is not defined\nexit")
        raise Exception("GMP_USER env var is not defined")
    
    if os.environ.get('GMP_PASSWORD') is not None and \
            os.environ.get('GMP_PASSWORD') != '':
        auth_passwd = os.getenv('GMP_PASSWORD')
    else:
        logging.error("GMP_PASSWORD env var is not defined\nexit")
        raise Exception("GMP_PASSWORD env var is not defined")
    
    dep_json = args.dep_json
    output_dir = args.output_dir
    logging.info(f"endpoint_keys: {args.endpoint_keys}")
    logging.info(f"dep_json: {dep_json}")
    logging.info(f"output_dir: {output_dir}")
    
    endpoints = utilities.import_dep_info(
            dep_json, 
            args.endpoint_keys)
    
    logging.info(f"endpoints: {endpoints}")
    
    # test gmp connection
    
    Gioacchino Vino's avatar
    Gioacchino Vino committed
    gvm_library.set_auth(auth_name, auth_passwd)
    
    logging.info(f"gvm version: {gvm_library.get_version()}")
    
    reports = dict()
    for host,ports in endpoints.items():
        logging.info(f"endpoint: {host}:{ports}")
        
        target_name = f"{auth_name}_target_{host}"
        task_name = f"{auth_name}_task_{host}"
        port_list_name = f"{auth_name}_pl_{host}"
        report_filename = f"{output_dir}/{host}-report.txt"
        summary_filename = f"{output_dir}/summary-report.json"
    
        port_list = gvm_library.get_or_create_port_list(port_list_name,ports)
        logging.info(f"Port list:\n {utilities.pretty_json(port_list)}")
        
        target = gvm_library.get_or_create_target(target_name,host,port_list)
        logging.info(f"Target:\n {utilities.pretty_json(target)}")
        
        task = gvm_library.get_or_create_task(task_name, target)
        logging.info(f"Task:\n {utilities.pretty_json(task)}")
        
        if task['status'] == 'New':
            task = gvm_library.start_task(task)
    
        if gvm_library.wait_for_task_ending(task, WAIT_TIMEOUT):
    
            gvm_library.save_report(task,gvm_library.report_formats.txt, report_filename)
            reports[host] = gvm_library.get_report_info(task)
        else:
            reports[host] = f"ERROR Task: {task['id']}"
        
        gvm_library.delete_task(task)
        gvm_library.delete_target(target)
        gvm_library.delete_port_list(port_list)
    
    reports = gvm_library.process_global_reports_info(reports)
    
    logging.info(utilities.pretty_json(reports))
    
    with open(summary_filename, "w") as f:
        f.write(json.dumps(reports))