forked from p15670423/monkey
Agent: Add an AutomatedMaster that implements start() and terminate()
This commit is contained in:
parent
418b5ce9ec
commit
0456d695c4
|
@ -0,0 +1,71 @@
|
|||
import logging
|
||||
import threading
|
||||
import time
|
||||
|
||||
from infection_monkey.i_control_channel import IControlChannel
|
||||
from infection_monkey.i_master import IMaster
|
||||
from infection_monkey.i_puppet import IPuppet
|
||||
from infection_monkey.telemetry.messengers.i_telemetry_messenger import ITelemetryMessenger
|
||||
|
||||
CHECK_FOR_STOP_INTERVAL_SEC = 5
|
||||
SHUTDOWN_TIMEOUT = 2
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
||||
class AutomatedMaster(IMaster):
|
||||
def __init__(
|
||||
self,
|
||||
puppet: IPuppet,
|
||||
telemetry_messenger: ITelemetryMessenger,
|
||||
control_channel: IControlChannel,
|
||||
):
|
||||
self._puppet = puppet
|
||||
self._telemetry_messenger = telemetry_messenger
|
||||
self._control_channel = control_channel
|
||||
|
||||
self._stop = threading.Event()
|
||||
self._master_thread = threading.Thread(target=self._run_master_thread, daemon=True)
|
||||
|
||||
def start(self):
|
||||
logger.info("Starting automated breach and attack simulation")
|
||||
self._master_thread.start()
|
||||
self._master_thread.join()
|
||||
logger.info("The simulation has been shutdown.")
|
||||
|
||||
def _check_for_stop(self):
|
||||
pass
|
||||
|
||||
def terminate(self):
|
||||
logger.info("Stopping automated breach and attack simulation")
|
||||
self._stop.set()
|
||||
|
||||
if self._master_thread.is_alive():
|
||||
self._master_thread.join()
|
||||
|
||||
def _run_master_thread(self):
|
||||
_simulation_thread = threading.Thread(target=self._run_simulation, daemon=True)
|
||||
_simulation_thread.start()
|
||||
|
||||
while (not self._stop.is_set()) and _simulation_thread.is_alive():
|
||||
time.sleep(CHECK_FOR_STOP_INTERVAL_SEC)
|
||||
self._check_for_stop()
|
||||
|
||||
logger.debug("Waiting for the simulation thread to stop")
|
||||
_simulation_thread.join(SHUTDOWN_TIMEOUT)
|
||||
|
||||
if _simulation_thread.is_alive():
|
||||
logger.warn("Timed out waiting for the simulation to stop")
|
||||
# Since the master thread is a Daemon thread, it will be forcefully
|
||||
# killed when the program exits.
|
||||
logger.warn("Forcefully killing the simulation")
|
||||
|
||||
def _run_simulation(self):
|
||||
while True:
|
||||
time.sleep(30)
|
||||
logger.debug("Simulation thread is finished sleeping")
|
||||
if self._stop.is_set():
|
||||
break
|
||||
|
||||
def cleanup(self):
|
||||
pass
|
|
@ -0,0 +1,7 @@
|
|||
from infection_monkey.master.automated_master import AutomatedMaster
|
||||
|
||||
def test_terminate_without_start():
|
||||
m = AutomatedMaster(None, None, None)
|
||||
|
||||
# Test that call to terminate does not raise exception
|
||||
m.terminate()
|
Loading…
Reference in New Issue