#!/usr/bin/env python
# coding=utf-8

import sys
import os
import time
import subprocess
import re
from distutils.spawn import find_executable

# Py2/3 compatibility
# Python3 renamed raw_input to input
try:
    input = raw_input
except NameError:
    pass

try:
    reload

except NameError:
    from importlib import reload

# check where we are and load default directory
if os.path.isdir("/usr/local/share/setoolkit"):
    if not os.path.isfile("setoolkit"):
        os.chdir("/usr/local/share/setoolkit")
        sys.path.append("/usr/local/share/setoolkit")

import src.core.setcore as core

# if we can't see our config then something didn't go good..
if not os.path.isfile("/etc/setoolkit/set.config"):
    core.print_error("Cannot locate SET executable. Try running from the local directory.")
    core.print_error("If this does not work, please run the setup.py install file.")
    sys.exit()


#
# Simple client mode for SET
#
#
# try to import pexpect
try:
    import pexpect

# if pexpect fails
except ImportError:
    print("\n[*] PEXPECT is required, please download and install before running this...")
    print("[*] Exiting SEAUTOMATE mode...")
    sys.exit()

# try to define filename through argument specified during command line mode
try:
    filename = sys.argv[1]

# if we through an exception spit out the command line syntax
except IndexError:
    print("\nThe Social-Engineer Toolkit Automate - Automatation for SET")
    print("\nSimply create a file that has each option you want from menu mode.")
    print("For example your file should look something like this:")
    print("\n2\n2\n2\nhttps://gmail.com\n2\n2\n443\netc.\n")
    print("Usage: ./seautomate <filename>")
    sys.exit()

# if the filename doesnt exist, throw an error
if not os.path.isfile(filename):
    print("\n[*] Sorry hoss, unable to locate that filename, try again.\n")
    sys.exit()

password = False
# if the path is around
if os.path.isfile(filename):
    try:
        print("[*] Spawning SET in a threaded process...")
        cmd = find_executable('python3') or find_executable('python')
        child = pexpect.spawn("{} setoolkit".format(cmd))
        child.expect("99\) Exit the Social-Engineer Toolkit")
        with open(filename) as fileopen:
            for line in fileopen:
                line = line.rstrip()
                # if we just use enter send default
                if line == "":
                    line = "blank line"

                #match1 = re.search("OMGPASSWORDHERE", line)
                #if match1:
                #    line = line.replace("OMGPASSWORDHERE", "")
                #    password = True

                #if password is False:
                print("[*] Sending command {0} to the interface...".format(line))
                #if password is True:
                #    print("[*] Sending command [**********] (password masked) to the interface...")
                #    password = False

                if line == "blank line":
                    line = "\n"

                if line == "CONTROL-C-HERE":
                    try:
                        print("[*] This may take a few seconds while SET catches up...")
                        child.expect("Next line of the body:")
                        time.sleep(2)
                        child.sendline("\n")
                        child.sendcontrol('c')

                    # if the user is using pexpect < 2.3
                    except AttributeError:
                        print("[-] Error: You are running pexpect < 2.3 which is needed for this function")
                        choice = input("Would you like to install it now yes or no: ")
                        if choice == "yes" or choice == "y":
                            #subprocess.Popen("wget http://sourceforge.net/projects/pexpect/files/pexpect/Release%202.3/pexpect-2.3.tar.gz;"
                            #                 "tar -zxvf pexpect-2.3.tar.gz;"
                            #                 "cd pexpect-2.3;"
                            #                 "python setup.py install;"
                            #                 "cd ..;"
                            #                 "rm -rf pexpect-2*", shell=True).wait()
                            subprocess.Popen("pip install pexpect", shell=True).wait()
                            try:
                                reload(pexpect)
                                child.sendcontrol('c')
                            except:
                                print("[*] Relaunch the Social-Engineer Toolkit for changes to apply.")
                                sys.exit()
                if line != "CONTROL-C-HERE":
                    child.sendline(line)

        print("[*] Finished sending commands, interacting with the interface..")
        child.interact()

    # sometimes pexpect can throw errors upon exit this handles them
    except OSError:
        sys.exit()

    # handle keyboardinterrupts (controlc)
    except KeyboardInterrupt:
        print("[*] Control-C detected, exiting the Social-Engineer Toolkit..")
        sys.exit()

    # handle everything else
    except Exception as e:
        print("[*] Something went wrong, printing error: {0}".format(e))
