# Copyright (C) 2017 Open Information Security Foundation
# Copyright (c) 2013 Jason Ish
#
# You can copy, redistribute or modify this Program under the terms of
# the GNU General Public License version 2 as published by the Free
# Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

""" Module for utility functions that don't really fit anywhere else. """

import hashlib
import tempfile
import atexit
import shutil
import zipfile
import sys


def md5_hexdigest(buf):
    """ Compute the MD5 checksum for the provided buffer.

    :returns: A string representing the hex value of the computed MD5.
    """
    try:
        return hashlib.md5(buf, usedforsecurity=False).hexdigest().strip()
    except:
        return hashlib.md5(buf).hexdigest().strip()

def mktempdir(delete_on_exit=True):
    """ Create a temporary directory that is removed on exit. """
    tmpdir = tempfile.mkdtemp("suricata-update")
    if delete_on_exit:
        atexit.register(shutil.rmtree, tmpdir, ignore_errors=True)
    return tmpdir

class ZipArchiveReader:

    def __init__(self, zipfile):
        self.zipfile = zipfile
        self.names = self.zipfile.namelist()

    def __iter__(self):
        return self

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.zipfile.close()

    def next(self):
        if self.names:
            name = self.names.pop(0)
            if name.endswith("/"):
                # Is a directory, ignore
                return self.next()
            return name
        raise StopIteration

    def open(self, name):
        return self.zipfile.open(name)

    def read(self, name):
        return self.zipfile.read(name)

    @classmethod
    def from_fileobj(cls, fileobj):
        zf = zipfile.ZipFile(fileobj)
        return cls(zf)

GREEN = "\x1b[32m"
BLUE = "\x1b[34m"
REDB = "\x1b[1;31m"
YELLOW = "\x1b[33m"
RED = "\x1b[31m"
YELLOWB = "\x1b[1;33m"
ORANGE = "\x1b[38;5;208m"
BRIGHT_MAGENTA = "\x1b[1;35m"
BRIGHT_CYAN = "\x1b[1;36m"
RESET = "\x1b[0m"

def blue(msg):
    return "%s%s%s" % (BLUE, msg, RESET)

def bright_magenta(msg):
    return "%s%s%s" % (BRIGHT_MAGENTA, msg, RESET)

def bright_cyan(msg):
    return "%s%s%s" % (BRIGHT_CYAN, msg, RESET)

def orange(msg):
    return "%s%s%s" % (ORANGE, msg, RESET)
