#!/usr/bin/env python
#
# Copyright (c) 2011 Duo Security
# All Rights Reserved
#

# This import _must_ be first
import _fipscustomize # noqa: F401, isort:skip

import json
import os
import platform
import sys
import time
from subprocess import call
from zipfile import ZipFile

from duoauthproxy.lib import config_provider, path_util

file_paths = []
CONFIG_ERROR = 1


def add_config_path():
    config_file = os.path.join("conf", "authproxy.cfg")
    scrubbed_config_file = os.path.join("conf", "clean_authproxy.cfg")

    with open(config_file, "r") as lines:
        with open(scrubbed_config_file, "w") as output:
            for line in lines:
                lower_line = line.lower()
                if (
                    ("skey" in lower_line)
                    or ("secret" in lower_line)
                    or ("password" in lower_line)
                ):
                    key, seperator, value = line.partition("=")
                    if value:
                        value = "*****"
                    output.write(key + seperator + value + "\n")
                else:
                    output.write(line)

    file_paths.append(scrubbed_config_file)


def add_logs_path(log_dir):
    logs_dir = os.path.join(log_dir)

    for dirpath, _, filenames in os.walk(logs_dir):
        for filename in filenames:
            if (
                "authproxy.log" in filename
                or "ssoevents.log" in filename
                or "connectivity_tool.log" in filename
            ):
                file_paths.append(os.path.join(dirpath, filename))


def create_zip(filename):
    with ZipFile(filename, "w") as zip:
        for file_to_zip in file_paths:
            if (
                "authproxy.log" in file_to_zip
                or "ssoevents.log" in file_to_zip
                or "connectivity_tool.log" in file_to_zip
            ):
                zip.write(
                    file_to_zip, os.path.join("log", os.path.basename(file_to_zip))
                )
            else:
                zip.write(file_to_zip)


def run_connectivity_tool():
    call(os.path.join("bin", "authproxy_connectivity_tool"))


def cleanup():
    os.remove(os.path.join("conf", "clean_authproxy.cfg"))
    os.remove("os_info.json")


def get_info():
    platform_info = platform.platform()
    sys_info = sys.platform
    os_info_name = "os_info.json"
    dictionary = {"Platform Info": platform_info, "System Info": sys_info}
    with open(os_info_name, "w") as os_info:
        json.dump(dictionary, os_info)
    file_paths.append(os_info_name)


def get_log_dir():
    configuration = config_provider.get_config()
    main_config = configuration.get_main_section_config()
    log_dir = main_config.get_str("log_dir", "log")
    return log_dir


def main():
    filename = "duoauthproxy-support-{}.zip".format(time.strftime("%Y%m%d-%H%M%S"))

    log_dir = get_log_dir()
    home_dir = path_util.get_home_dir()
    os.chdir(home_dir)

    try:
        print(
            "Running the Duo Authentication Proxy support tool in order to gather necessary files. This may take several minutes..."
        )
        run_connectivity_tool()
        add_config_path()
        add_logs_path(log_dir)
        get_info()
        create_zip(filename)
        cleanup()

        full_zip_file_path = os.path.join(home_dir, filename)
        print(
            "Authentication Proxy support bundle successfully created: {}".format(
                full_zip_file_path
            )
        )

    except Exception as e:
        print(e)


if __name__ == "__main__":
    main()
