#!/usr/bin/python

import sys
import argparse
sys.path.append("../")
from elem.elem import Elem
from distutils import sysconfig
from os.path import expanduser

sys.dont_write_bytecode = True
red_hat_security_api = 'https://access.redhat.com/labs/securitydataapi'
exploitdb_github = 'https://github.com/offensive-security/exploit-database.git'


def str2bool(v):
    if v.lower() in ('yes', 'true', 't', 'y', '1'):
        return True
    elif v.lower() in ('no', 'false', 'f', 'n', '0'):
        return False
    else:
        raise argparse.ArgumentTypeError('Boolean value expected.')


def main():

    parser = argparse.ArgumentParser(description='Cross Reference CVE\'s ' +
                                     'against a Exploit-DB entries for ' +
                                     'Enterprise Linux.')

    parser.add_argument('--exploitdb',
                        help='Exploit DB directory to search',
                        default=sysconfig.get_python_lib() +
                                '/elem/exploit-database',
                        required=False)
    parser.add_argument('--exploits',
                        help='Directory to store exploit data',
                        default=sysconfig.get_python_lib() + '/elem/exploits',
                        required=False)
    parser.add_argument('--exploitdbrepo',
                        help='ExploitDB Git Repository Remote ',
                        default=exploitdb_github,
                        required=False)

    subparsers = parser.add_subparsers()
    refresh_parser = subparsers.add_parser('refresh')
    refresh_parser.add_argument('--refresh',
                                required=False,
                                type=str2bool,
                                nargs='?',
                                const=True,
                                default='t',
                                help=argparse.SUPPRESS)

    refresh_parser.add_argument('--securityapi',
                                help='Red Hat Security API base URL.',
                                required=False,
                                default=red_hat_security_api)

    list_parser = subparsers.add_parser('list')
    list_parser.add_argument('--list',
                             required=False,
                             type=str2bool,
                             nargs='?',
                             const=True,
                             default='t',
                             help=argparse.SUPPRESS)
    list_parser.add_argument('--edbid',
                             help="The edbid on which to filter.",
                             required=False,
                             type=str)
    list_parser.add_argument('--cveid',
                             help="The CVE ID on which to filter.",
                             required=False,
                             type=str)

    score_parser = subparsers.add_parser('score')
    score_parser.add_argument('--score',
                              required=False,
                              type=str2bool,
                              nargs='?',
                              const=True,
                              default='t',
                              help=argparse.SUPPRESS)
    score_parser.add_argument('--edbid',
                              help='Which exploit to score',
                              required=True,
                              type=str)
    score_parser.add_argument('--version',
                              required=True,
                              type=str)
    score_parser.add_argument('--kind',
                              required=False,
                              default='stride',
                              choices=['stride'],
                              help='Threat Score Kind',
                              type=str)
    score_parser.add_argument('--value',
                              required=True,
                              help='Threat Score',
                              type=str)

    assess_parser = subparsers.add_parser('assess')
    assess_parser.add_argument('--assess',
                               required=False,
                               type=str2bool,
                               nargs='?',
                               const=True,
                               default='t',
                               help=argparse.SUPPRESS)

    copy_parser = subparsers.add_parser('copy')
    copy_parser.add_argument('--copy',
                               required=False,
                               type=str2bool,
                               nargs='?',
                               const=True,
                               default='t',
                               help=argparse.SUPPRESS)
    copy_parser.add_argument('--destination',
                              required=False,
                              default=expanduser("~"),
                              type=str)
    copy_parser.add_argument('--edbid',
                              help='Which exploit to copy',
                              required=True,
                              type=str)

    args = parser.parse_args()
    mapper = Elem(args)
    mapper.run()

if __name__ == "__main__":
    main()
