#!/usr/bin/env python
import sys
import subprocess
import lief
import os
import shutil
import argparse
from utils import is_linux, is_x86_64

MELKOR_BIN = "@MELKOR_BINARY@"

def generate_samples(seed = '/usr/bin/ls', nb = 100):
    cmd = [MELKOR_BIN, '-A', seed, '-n', '{:d}'.format(nb), '-q']
    output_dir = "orcs_{}".format(os.path.basename(seed))
    output_dir = os.path.join(os.path.dirname(MELKOR_BIN), output_dir)

    if os.path.exists(output_dir) and os.path.isdir(output_dir):
        shutil.rmtree(output_dir)
    p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE, cwd = os.path.dirname(MELKOR_BIN))
    out, err = p.communicate()

    return output_dir



def fuzz(seed, nb):
    outputdir = generate_samples(seed, nb)
    for _, __, filesname in os.walk(outputdir):
        for file in filesname:
            filepath = os.path.join(outputdir, file)
            if lief.is_elf(filepath):
                print("Try to parse {}".format(filepath))
                try:
                    b = lief.parse(filepath)
                except lief.exception as e:
                    pass


if __name__ == '__main__':

    if not is_linux() and not is_x86_64():
        print("Melkor fuzzing is currently only supported on Linux x86-64", file=sys.stderr)
        sys.exit(0)

    parser = argparse.ArgumentParser(description = "LIEF ELF Fuzzer")
    parser.add_argument("--input-seed",
            dest = 'input_seed',
            type = str,
            default = '/usr/bin/ls')

    parser.add_argument("--numberof_samples", "-n",
            dest = 'nb_samples',
            type = int,
            default = 100)

    args = parser.parse_args()
    fuzz(args.input_seed, args.nb_samples)
    print(lief)