Codebase list python-faraday / debian/2.0.0-0kali1 faraday-server.py
debian/2.0.0-0kali1

Tree @debian/2.0.0-0kali1 (Download .tar.gz)

faraday-server.py @debian/2.0.0-0kali1raw · history · blame

#!/usr/bin/env python2.7
# Faraday Penetration Test IDE
# Copyright (C) 2016  Infobyte LLC (http://www.infobytesec.com/)
# See the file 'doc/LICENSE' for the license information

import sys
import argparse
import server.config

from server.utils import daemonize
from server.utils.logger import setup_logging, get_logger, set_logging_level
from utils.dependencies import DependencyChecker
from utils.user_input import query_yes_no


def main():
    setup_logging()

    cli_arguments = parse_arguments()

    process_run_commands(cli_arguments)
    setup_environment(cli_arguments)
    setup_and_run_server(cli_arguments)

def parse_arguments():
    parser = argparse.ArgumentParser()
    parser.add_argument('--ssl', action='store_true', help='enable HTTPS')
    parser.add_argument('--debug', action='store_true', help='run Faraday Server in debug mode')
    parser.add_argument('--start', action='store_true', help='run Faraday Server in background')
    parser.add_argument('--stop', action='store_true', help='stop Faraday Server')
    return parser.parse_args()

def process_run_commands(cli_arguments):
    logger = get_logger(__name__)

    if cli_arguments.stop:
        if not daemonize.stop_server():
            # Exists with an error if it couldn't close the server
            sys.exit(1)
        else:
            logger.info("Faraday Server stopped successfully")
            sys.exit(0)

    # Check if server is already running
    pid = daemonize.is_server_running()
    if pid is not None:
        logger.error("Faraday Server is already running. PID: {}".format(pid))
        sys.exit(1)

def setup_environment(cli_arguments):
    logger = get_logger(__name__)
    server.config.copy_default_config_to_local()

    if cli_arguments.debug:
        set_logging_level(server.config.DEBUG)

    missing_packages = check_dependencies()

    if len(missing_packages) > 0:
        answer = ask_to_install(missing_packages)
        if answer:
            logger.info(
                "Dependencies installed. Please launch Faraday Server again")
            sys.exit(0)
        else:
            logger.error("Dependencies not met")
            sys.exit(1)

    server.config.gen_web_config()

def check_dependencies():
    checker = DependencyChecker(server.config.REQUIREMENTS_FILE)
    missing = checker.check_dependencies()
    return missing

def ask_to_install(missing_packages):
    logger = get_logger(__name__)
    logger.warning("The following packages are not installed:")
    for package in missing_packages:
        logger.warning("%s" % package)
    res = query_yes_no("Do you want to install them?", default="no")
    if res:
        checker = DependencyChecker(server.config.REQUIREMENTS_FILE)
        checker.install_packages(missing_packages)
    return res

def setup_and_run_server(cli_arguments):
    import server.web
    import server.database

    server.database.setup()

    web_server = server.web.WebServer(enable_ssl=cli_arguments.ssl)
    get_logger().info('Faraday Server is ready')

    # Now that server is ready to go, run in background if requested
    if cli_arguments.start:
        daemonize.start_server()

    daemonize.create_pid_file()

    web_server.run()

if __name__ == '__main__':
    main()