#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import threading
from threading import enumerate
from sys import exit
from impacket import smbserver


class CMESMBServer(threading.Thread):
    def __init__(
        self,
        logger,
        share_name,
        share_path="/tmp/cme_hosted",
        listen_address="0.0.0.0",
        listen_port=445,
        verbose=False,
    ):
        try:
            threading.Thread.__init__(self)
            self.server = smbserver.SimpleSMBServer(listen_address, listen_port)
            self.server.addShare(share_name.upper(), share_path)
            if verbose:
                self.server.setLogFile("")
            self.server.setSMB2Support(True)
            self.server.setSMBChallenge("")
        except Exception as e:
            errno, message = e.args
            if errno == 98 and message == "Address already in use":
                logger.error("Error starting SMB server on port 445: the port is already in use")
            else:
                logger.error(f"Error starting SMB server on port 445: {message}")
                exit(1)

    def addShare(self, share_name, share_path):
        self.server.addShare(share_name, share_path)

    def run(self):
        try:
            self.server.start()
        except:
            pass

    def shutdown(self):
        # TODO: should fine the proper way
        # make sure all the threads are killed
        for thread in enumerate():
            if thread.is_alive():
                try:
                    self._stop()
                except:
                    pass
