From 33b4911cb1d412217ddf8c8fc8b682afaa39c98e Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Mon, 4 Sep 2023 10:20:06 +0100 Subject: [PATCH 01/15] Move actions to pydantic --- src/primaite/simulator/core.py | 67 ++++++++++++++++------------------ 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index 69edd8db..1456d41c 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -1,3 +1,4 @@ +# flake8: noqa """Core of the PrimAITE Simulator.""" from abc import ABC, abstractmethod from typing import Callable, Dict, List, Optional, Union @@ -10,7 +11,7 @@ from primaite import getLogger _LOGGER = getLogger(__name__) -class ActionPermissionValidator(ABC): +class ActionPermissionValidator(BaseModel): """ Base class for action validators. @@ -33,7 +34,7 @@ class AllowAllValidator(ActionPermissionValidator): return True -class Action: +class Action(BaseModel): """ This object stores data related to a single action. @@ -41,34 +42,22 @@ class Action: the action can be performed or not. """ - def __init__( - self, func: Callable[[List[str], Dict], None], validator: ActionPermissionValidator = AllowAllValidator() - ) -> None: - """ - Save the functions that are for this action. - - Here's a description for the intended use of both of these. - - ``func`` is a function that accepts a request and a context dict. Typically this would be a lambda function - that invokes a class method of your SimComponent. For example if the component is a node and the action is for - turning it off, then the SimComponent should have a turn_off(self) method that does not need to accept any args. - Then, this Action will be given something like ``func = lambda request, context: self.turn_off()``. - - ``validator`` is an instance of a subclass of `ActionPermissionValidator`. This is essentially a callable that - accepts `request` and `context` and returns a boolean to represent whether the permission is granted to perform - the action. - - :param func: Function that performs the request. - :type func: Callable[[List[str], Dict], None] - :param validator: Function that checks if the request is authenticated given the context. By default, if no - validator is provided, an 'allow all' validator is added which permits all requests. - :type validator: ActionPermissionValidator - """ - self.func: Callable[[List[str], Dict], None] = func - self.validator: ActionPermissionValidator = validator + func: Callable[[List[str], Dict], None] + """ + ``func`` is a function that accepts a request and a context dict. Typically this would be a lambda function + that invokes a class method of your SimComponent. For example if the component is a node and the action is for + turning it off, then the SimComponent should have a turn_off(self) method that does not need to accept any args. + Then, this Action will be given something like ``func = lambda request, context: self.turn_off()``. + """ + validator: ActionPermissionValidator = AllowAllValidator() + """ + ``validator`` is an instance of `ActionPermissionValidator`. This is essentially a callable that + accepts `request` and `context` and returns a boolean to represent whether the permission is granted to perform + the action. The default validator will allow + """ -class ActionManager: +class ActionManager(BaseModel): """ ActionManager is used by `SimComponent` instances to keep track of actions. @@ -76,9 +65,8 @@ class ActionManager: class is responsible for providing a consistent API for processing actions as well as helpful error messages. """ - def __init__(self) -> None: - """Initialise ActionManager with an empty action lookup.""" - self.actions: Dict[str, Action] = {} + actions: Dict[str, Action] = {} + """maps action verb to an action object.""" def process_request(self, request: List[str], context: Dict) -> None: """Process an action request. @@ -125,6 +113,11 @@ class ActionManager: self.actions[name] = action + def list_actions(self) -> List[List[str]]: + actions = [] + for act_name, act in self.actions.items(): + pass # TODO: + class SimComponent(BaseModel): """Extension of pydantic BaseModel with additional methods that must be defined by all classes in the simulator.""" @@ -178,6 +171,14 @@ class SimComponent(BaseModel): } return state + def possible_actions(self) -> List[List[str]]: + """Enumerate all actions that this component can accept. + + :return: List of all action strings that can be passed to this component. + :rtype: List[Dict[str]] + """ + action_list = ActionManager # TODO: extract possible actions? how to do this neatly? + def apply_action(self, action: List[str], context: Dict = {}) -> None: """ Apply an action to a simulation component. Action data is passed in as a 'namespaced' list of strings. @@ -230,7 +231,3 @@ class SimComponent(BaseModel): _LOGGER.warn(msg) raise RuntimeWarning(msg) self._parent = new_parent - - @parent.deleter - def parent(self) -> None: - self._parent = None From 2b68ed813c595576ff8dc091fdd8f60796467490 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 5 Sep 2023 14:51:04 +0100 Subject: [PATCH 02/15] Make actions more recursive --- src/primaite/simulator/core.py | 39 ++++++++++++++++--- src/primaite/simulator/domain/controller.py | 10 +---- src/primaite/simulator/network/container.py | 8 ++-- .../simulator/network/hardware/base.py | 1 - src/primaite/simulator/sim_container.py | 14 +------ 5 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index c38a7e2f..e8cd4b98 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -48,6 +48,9 @@ class Action(BaseModel): that invokes a class method of your SimComponent. For example if the component is a node and the action is for turning it off, then the SimComponent should have a turn_off(self) method that does not need to accept any args. Then, this Action will be given something like ``func = lambda request, context: self.turn_off()``. + + ``func`` can also be another action manager, since ActionManager is a callable with a signature that matches what is + expected by ``func``. """ validator: ActionPermissionValidator = AllowAllValidator() """ @@ -68,8 +71,9 @@ class ActionManager(BaseModel): actions: Dict[str, Action] = {} """maps action verb to an action object.""" - def process_request(self, request: List[str], context: Dict) -> None: - """Process an action request. + def __call__(self, request: List[str], context: Dict) -> None: + """ + Process an action request. :param request: A list of strings which specify what action to take. The first string must be one of the allowed actions, i.e. it must be a key of self.actions. The subsequent strings in the list are passed as parameters @@ -99,7 +103,8 @@ class ActionManager(BaseModel): action.func(action_options, context) def add_action(self, name: str, action: Action) -> None: - """Add an action to this action manager. + """ + Add an action to this action manager. :param name: The string associated to this action. :type name: str @@ -113,10 +118,32 @@ class ActionManager(BaseModel): self.actions[name] = action - def list_actions(self) -> List[List[str]]: + def remove_action(self, name: str) -> None: + """ + Remove an action from this manager. + + :param name: name identifier of the action + :type name: str + """ + if name not in self.actions: + msg = f"Attempted to remove action {name} from action manager, but it was not registered." + _LOGGER.error(msg) + raise RuntimeError(msg) + + self.actions.pop(name) + + + def get_action_tree(self) -> List[List[str]]: + """Recursively generate action tree for this component.""" actions = [] for act_name, act in self.actions.items(): - pass # TODO: + if isinstance(act.func, ActionManager): + sub_actions = act.func.get_action_tree() + sub_actions = [[act_name]+a for a in sub_actions] + actions.extend(sub_actions) + else: + actions.append([act_name]) + return actions class SimComponent(BaseModel): @@ -196,7 +223,7 @@ class SimComponent(BaseModel): """ if self.action_manager is None: return - self.action_manager.process_request(action, context) + self.action_manager(action, context) def apply_timestep(self, timestep: int) -> None: """ diff --git a/src/primaite/simulator/domain/controller.py b/src/primaite/simulator/domain/controller.py index b436ca79..cd0fe9de 100644 --- a/src/primaite/simulator/domain/controller.py +++ b/src/primaite/simulator/domain/controller.py @@ -46,13 +46,7 @@ class AccountGroup(Enum): class GroupMembershipValidator(ActionPermissionValidator): """Permit actions based on group membership.""" - def __init__(self, allowed_groups: List[AccountGroup]) -> None: - """Store a list of groups that should be granted permission. - - :param allowed_groups: List of AccountGroups that are permitted to perform some action. - :type allowed_groups: List[AccountGroup] - """ - self.allowed_groups = allowed_groups + allowed_groups:List[AccountGroup] def __call__(self, request: List[str], context: Dict) -> bool: """Permit the action if the request comes from an account which belongs to the right group.""" @@ -93,7 +87,7 @@ class DomainController(SimComponent): "account", Action( func=lambda request, context: self.accounts[request.pop(0)].apply_action(request, context), - validator=GroupMembershipValidator([AccountGroup.DOMAIN_ADMIN]), + validator=GroupMembershipValidator(allowed_groups=[AccountGroup.DOMAIN_ADMIN]), ), ) return am diff --git a/src/primaite/simulator/network/container.py b/src/primaite/simulator/network/container.py index 4d1afe72..1c7bbec7 100644 --- a/src/primaite/simulator/network/container.py +++ b/src/primaite/simulator/network/container.py @@ -43,12 +43,12 @@ class Network(SimComponent): def _init_action_manager(self) -> ActionManager: am = super()._init_action_manager() - + self._node_action_manager = ActionManager() am.add_action( "node", Action( - func=lambda request, context: self.nodes[request.pop(0)].apply_action(request, context), - validator=AllowAllValidator(), + func = self._node_action_manager + # func=lambda request, context: self.nodes[request.pop(0)].apply_action(request, context), ), ) return am @@ -182,6 +182,7 @@ class Network(SimComponent): node.parent = self self._nx_graph.add_node(node.hostname) _LOGGER.info(f"Added node {node.uuid} to Network {self.uuid}") + self._node_action_manager.add_action(name = node.uuid, action = Action(func=node._action_manager)) def get_node_by_hostname(self, hostname: str) -> Optional[Node]: """ @@ -211,6 +212,7 @@ class Network(SimComponent): self.nodes.pop(node.uuid) node.parent = None _LOGGER.info(f"Removed node {node.uuid} from network {self.uuid}") + self._node_action_manager.remove_action(name = node.uuid) def connect(self, endpoint_a: Union[NIC, SwitchPort], endpoint_b: Union[NIC, SwitchPort], **kwargs) -> None: """ diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 101d6b72..a846f7e2 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -135,7 +135,6 @@ class NIC(SimComponent): { "ip_adress": str(self.ip_address), "subnet_mask": str(self.subnet_mask), - "gateway": str(self.gateway), "mac_address": self.mac_address, "speed": self.speed, "mtu": self.mtu, diff --git a/src/primaite/simulator/sim_container.py b/src/primaite/simulator/sim_container.py index 2a5123f3..d647b0bc 100644 --- a/src/primaite/simulator/sim_container.py +++ b/src/primaite/simulator/sim_container.py @@ -24,19 +24,9 @@ class Simulation(SimComponent): def _init_action_manager(self) -> ActionManager: am = super()._init_action_manager() # pass through network actions to the network objects - am.add_action( - "network", - Action( - func=lambda request, context: self.network.apply_action(request, context), validator=AllowAllValidator() - ), - ) + am.add_action("network", Action(func=self.network._action_manager)) # pass through domain actions to the domain object - am.add_action( - "domain", - Action( - func=lambda request, context: self.domain.apply_action(request, context), validator=AllowAllValidator() - ), - ) + am.add_action("domain", Action(func=self.domain._action_manager)) return am def describe_state(self) -> Dict: From ffe1e92664b341e9f74b54f4ffd5db1b4e28d787 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 5 Sep 2023 14:51:25 +0100 Subject: [PATCH 03/15] Make actions more recursive --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ff86b65f..77e74e17 100644 --- a/.gitignore +++ b/.gitignore @@ -151,3 +151,4 @@ src/primaite/outputs/ # benchmark session outputs benchmark/output src/primaite/notebooks/scratch.ipynb +src/primaite/notebooks/scratch.py From 1dccceaf5695a7d025f985ec9f34219143790c2e Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 5 Sep 2023 15:53:22 +0100 Subject: [PATCH 04/15] Verify that action tree is starting to work! --- src/primaite/simulator/core.py | 6 ++-- .../simulator/network/hardware/base.py | 32 ++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index e8cd4b98..f6c0b5d9 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -60,6 +60,9 @@ class Action(BaseModel): """ +# TODO: maybe this can be renamed to something like action selector? +# Because there are two ways it's used, to select from a list of action verbs, or to select a child object to which to +# forward the request. class ActionManager(BaseModel): """ ActionManager is used by `SimComponent` instances to keep track of actions. @@ -132,14 +135,13 @@ class ActionManager(BaseModel): self.actions.pop(name) - def get_action_tree(self) -> List[List[str]]: """Recursively generate action tree for this component.""" actions = [] for act_name, act in self.actions.items(): if isinstance(act.func, ActionManager): sub_actions = act.func.get_action_tree() - sub_actions = [[act_name]+a for a in sub_actions] + sub_actions = [[act_name] + a for a in sub_actions] actions.extend(sub_actions) else: actions.append([act_name]) diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index a846f7e2..e5f16323 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -10,7 +10,7 @@ from prettytable import MARKDOWN, PrettyTable from primaite import getLogger from primaite.exceptions import NetworkError -from primaite.simulator.core import SimComponent +from primaite.simulator.core import Action, ActionManager, SimComponent from primaite.simulator.domain.account import Account from primaite.simulator.file_system.file_system import FileSystem from primaite.simulator.network.protocols.arp import ARPEntry, ARPPacket @@ -145,6 +145,14 @@ class NIC(SimComponent): ) return state + def _init_action_manager(self) -> ActionManager: + am = super()._init_action_manager() + + am.add_action("enable", Action(func=lambda request, context: self.enable())) + am.add_action("disable", Action(func=lambda request, context: self.disable())) + + return am + @property def ip_network(self) -> IPv4Network: """ @@ -925,6 +933,24 @@ class Node(SimComponent): super().__init__(**kwargs) self.arp.nics = self.nics + def _init_action_manager(self) -> ActionManager: + # TODO: I see that this code is really confusing and hard to read right now... I think some of these things will + # need a better name and better documentation. + am = super()._init_action_manager() + # since there are potentially many services, create an action manager that can map service name + self._service_action_manager = ActionManager() + am.add_action("service", Action(func=self._service_action_manager)) + self._process_action_manager = ActionManager() + am.add_action("process", Action(func=self._process_action_manager)) + self._application_action_manager = ActionManager() + am.add_action("application", Action(func=self._application_action_manager)) + self._nic_action_manager = ActionManager() + am.add_action("nic", Action(func=self._nic_action_manager)) + + am.add_action("file_system", Action(func=self.file_system._action_manager)) + + return am + def describe_state(self) -> Dict: """ Produce a dictionary describing the current state of this object. @@ -1000,6 +1026,7 @@ class Node(SimComponent): self.sys_log.info(f"Connected NIC {nic}") if self.operating_state == NodeOperatingState.ON: nic.enable() + self._nic_action_manager.add_action(nic.uuid, Action(func=nic._action_manager)) else: msg = f"Cannot connect NIC {nic} as it is already connected" self.sys_log.logger.error(msg) @@ -1024,6 +1051,7 @@ class Node(SimComponent): nic.parent = None nic.disable() self.sys_log.info(f"Disconnected NIC {nic}") + self._nic_action_manager.remove_action(nic.uuid) else: msg = f"Cannot disconnect NIC {nic} as it is not connected" self.sys_log.logger.error(msg) @@ -1110,6 +1138,7 @@ class Node(SimComponent): service.install() # Perform any additional setup, such as creating files for this service on the node. self.sys_log.info(f"Installed service {service.name}") _LOGGER.info(f"Added service {service.uuid} to node {self.uuid}") + self._service_action_manager.add_action(service.uuid, Action(func=service._action_manager)) def uninstall_service(self, service: Service) -> None: """Uninstall and completely remove service from this node. @@ -1125,6 +1154,7 @@ class Node(SimComponent): service.parent = None self.sys_log.info(f"Uninstalled service {service.name}") _LOGGER.info(f"Removed service {service.uuid} from node {self.uuid}") + self._service_action_manager.remove_action(service.uuid) def __contains__(self, item: Any) -> bool: if isinstance(item, Service): From 4f89adb19aab1055ef01f57635288def5b0466c8 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Wed, 6 Sep 2023 12:51:47 +0100 Subject: [PATCH 05/15] Start changing to dict instead of string actions. --- .gitignore | 2 +- src/primaite/notebooks/scratch.ipynb | 194 +++++++++++++++++++++++++++ src/primaite/simulator/core.py | 6 +- 3 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 src/primaite/notebooks/scratch.ipynb diff --git a/.gitignore b/.gitignore index 77e74e17..fd115d62 100644 --- a/.gitignore +++ b/.gitignore @@ -150,5 +150,5 @@ src/primaite/outputs/ # benchmark session outputs benchmark/output -src/primaite/notebooks/scratch.ipynb +# src/primaite/notebooks/scratch.ipynb src/primaite/notebooks/scratch.py diff --git a/src/primaite/notebooks/scratch.ipynb b/src/primaite/notebooks/scratch.ipynb new file mode 100644 index 00000000..50a85e7a --- /dev/null +++ b/src/primaite/notebooks/scratch.ipynb @@ -0,0 +1,194 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from primaite.simulator.network.networks import arcd_uc2_network\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-05 15:52:13,305: Added node 26e189bb-442e-4f73-ab7a-1c4dd162e986 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,307: Added node 9d07f591-1e44-41c9-9d7a-0eecf0c53fa4 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,322: NIC d5:3d:df:8d:21:94/192.168.1.1 connected to Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84\n", + "2023-09-05 15:52:13,324: SwitchPort 70:63:71:75:0f:84 connected to Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84\n", + "2023-09-05 15:52:13,326: Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84 up\n", + "2023-09-05 15:52:13,327: Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84 up\n", + "2023-09-05 15:52:13,329: Added link 497f7357-e14e-4f00-b6cd-68286b053496 to connect d5:3d:df:8d:21:94/192.168.1.1 and 70:63:71:75:0f:84\n", + "2023-09-05 15:52:13,333: Added node 9cf37bd7-9f67-47f8-836b-3b5e69dd600c to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,336: NIC c7:ca:5f:6c:50:c9/192.168.10.1 connected to Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c\n", + "2023-09-05 15:52:13,338: SwitchPort e7:21:66:e4:da:2c connected to Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c\n", + "2023-09-05 15:52:13,340: Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c up\n", + "2023-09-05 15:52:13,341: Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c up\n", + "2023-09-05 15:52:13,343: Added link b1165845-46af-400d-b408-9f6b0fe4a51a to connect c7:ca:5f:6c:50:c9/192.168.10.1 and e7:21:66:e4:da:2c\n", + "2023-09-05 15:52:13,345: Added node 9c7f4049-30fa-40bd-b0c8-2119bef7936c to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,347: SwitchPort e9:5c:26:c2:74:a2 connected to Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21\n", + "2023-09-05 15:52:13,351: Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21 up\n", + "2023-09-05 15:52:13,353: NIC fb:05:aa:54:2d:3e/192.168.10.21 connected to Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21\n", + "2023-09-05 15:52:13,354: Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21 up\n", + "2023-09-05 15:52:13,356: Added link 7d9ade8d-ed9c-4688-8375-18b58102b2a7 to connect e9:5c:26:c2:74:a2 and fb:05:aa:54:2d:3e/192.168.10.21\n", + "2023-09-05 15:52:13,358: Added node 88c26ce5-4243-4247-98a3-315ff54f7ef6 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,360: SwitchPort 30:fd:61:15:db:ad connected to Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22\n", + "2023-09-05 15:52:13,362: Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22 up\n", + "2023-09-05 15:52:13,363: NIC c1:e2:46:a2:cb:b2/192.168.10.22 connected to Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22\n", + "2023-09-05 15:52:13,365: Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22 up\n", + "2023-09-05 15:52:13,367: Added link bcfe4c45-d680-4f72-a90a-9fa57c2a6fba to connect 30:fd:61:15:db:ad and c1:e2:46:a2:cb:b2/192.168.10.22\n", + "2023-09-05 15:52:13,370: Added node d7e5389a-9970-4c47-926c-9069b925e934 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,372: SwitchPort 35:0c:3a:21:7c:d1 connected to Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10\n", + "2023-09-05 15:52:13,375: Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10 up\n", + "2023-09-05 15:52:13,376: NIC 40:4f:3e:f0:32:66/192.168.1.10 connected to Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10\n", + "2023-09-05 15:52:13,378: Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10 up\n", + "2023-09-05 15:52:13,380: Added link 34254262-beeb-4967-b7ff-3480928e47f9 to connect 35:0c:3a:21:7c:d1 and 40:4f:3e:f0:32:66/192.168.1.10\n", + "2023-09-05 15:52:13,386: Added node 02c25642-baa5-49a4-aadd-f5d549696351 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,388: SwitchPort a4:ab:83:f0:b5:fe connected to Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12\n", + "2023-09-05 15:52:13,390: Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12 up\n", + "2023-09-05 15:52:13,392: NIC 4b:a9:6c:90:ae:8f/192.168.1.12 connected to Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12\n", + "2023-09-05 15:52:13,393: Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12 up\n", + "2023-09-05 15:52:13,395: Added link 433b0cec-445d-4447-9502-c8727eb14a81 to connect a4:ab:83:f0:b5:fe and 4b:a9:6c:90:ae:8f/192.168.1.12\n", + "2023-09-05 15:52:13,398: Added node 6f89bce8-34e4-4fdf-b860-b34027efa639 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,400: SwitchPort c2:9f:42:ec:ea:a0 connected to Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14\n", + "2023-09-05 15:52:13,403: Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14 up\n", + "2023-09-05 15:52:13,405: NIC c7:61:9d:6e:0b:29/192.168.1.14 connected to Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14\n", + "2023-09-05 15:52:13,407: Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14 up\n", + "2023-09-05 15:52:13,408: Added link 30b18ea0-ea2b-494a-8a63-d5b4bd703668 to connect c2:9f:42:ec:ea:a0 and c7:61:9d:6e:0b:29/192.168.1.14\n", + "2023-09-05 15:52:13,412: Added node 15eb1a5c-50f4-4681-81f8-7ad457c6b1af to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,414: SwitchPort 5c:0e:20:b3:65:cb connected to Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16\n", + "2023-09-05 15:52:13,417: Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16 up\n", + "2023-09-05 15:52:13,419: NIC bd:06:4d:19:fb:f2/192.168.1.16 connected to Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16\n", + "2023-09-05 15:52:13,420: Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16 up\n", + "2023-09-05 15:52:13,421: Added link deb1ee09-9731-46e2-99fb-1276ca48ccb3 to connect 5c:0e:20:b3:65:cb and bd:06:4d:19:fb:f2/192.168.1.16\n", + "2023-09-05 15:52:13,424: Added node 5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6 to Network 16435554-f108-479e-a4de-719f39898d0a\n", + "2023-09-05 15:52:13,425: SwitchPort e6:fa:f7:9a:d3:8c connected to Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110\n", + "2023-09-05 15:52:13,429: Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110 up\n", + "2023-09-05 15:52:13,430: NIC 37:5b:c5:ac:e5:08/192.168.1.110 connected to Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110\n", + "2023-09-05 15:52:13,432: Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110 up\n", + "2023-09-05 15:52:13,434: Added link cf4ecad7-3b24-4f8f-9de8-01b9f64b270b to connect e6:fa:f7:9a:d3:8c and 37:5b:c5:ac:e5:08/192.168.1.110\n", + "2023-09-05 15:52:13,436::ERROR::primaite.simulator.network.hardware.base::176::NIC 4f:4b:3f:f1:02:c0/192.168.10.110 cannot be enabled as it is not connected to a Link\n", + "2023-09-05 15:52:13,438: SwitchPort 57:0a:35:80:1c:38 connected to Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110\n", + "2023-09-05 15:52:13,440: Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110 up\n", + "2023-09-05 15:52:13,441: NIC 4f:4b:3f:f1:02:c0/192.168.10.110 connected to Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110\n", + "2023-09-05 15:52:13,443: Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110 up\n", + "2023-09-05 15:52:13,447: Added link 035d9749-1bf6-4bd5-b945-c931f207ffb9 to connect 57:0a:35:80:1c:38 and 4f:4b:3f:f1:02:c0/192.168.10.110\n" + ] + } + ], + "source": [ + "net = arcd_uc2_network()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "act_tree = net._action_manager.get_action_tree()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', 'enable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', 'disable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '2192673d-ad8c-437f-a4d6-0e222ab7e190', 'enable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '2192673d-ad8c-437f-a4d6-0e222ab7e190', 'disable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '3c3fb3d8-c5d1-41aa-8e3e-db1cc0445b0b', 'enable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '3c3fb3d8-c5d1-41aa-8e3e-db1cc0445b0b', 'disable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '29e90915-815f-4505-b957-6f46681950b3', 'enable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '29e90915-815f-4505-b957-6f46681950b3', 'disable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '0915f437-6ed3-4134-b754-7d903c98eb57', 'enable']\n", + "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '0915f437-6ed3-4134-b754-7d903c98eb57', 'disable']\n", + "['node', '9c7f4049-30fa-40bd-b0c8-2119bef7936c', 'nic', '199c9558-6a73-423e-9c69-ced05cd597cb', 'enable']\n", + "['node', '9c7f4049-30fa-40bd-b0c8-2119bef7936c', 'nic', '199c9558-6a73-423e-9c69-ced05cd597cb', 'disable']\n", + "['node', '88c26ce5-4243-4247-98a3-315ff54f7ef6', 'nic', '6f871129-d13e-4c8a-85ff-7102fa1e7b8e', 'enable']\n", + "['node', '88c26ce5-4243-4247-98a3-315ff54f7ef6', 'nic', '6f871129-d13e-4c8a-85ff-7102fa1e7b8e', 'disable']\n", + "['node', 'd7e5389a-9970-4c47-926c-9069b925e934', 'nic', 'b6c15c77-8869-400c-8a47-62856dd27ce6', 'enable']\n", + "['node', 'd7e5389a-9970-4c47-926c-9069b925e934', 'nic', 'b6c15c77-8869-400c-8a47-62856dd27ce6', 'disable']\n", + "['node', '02c25642-baa5-49a4-aadd-f5d549696351', 'nic', '398660cc-20ce-444e-b93e-d45b8b865e10', 'enable']\n", + "['node', '02c25642-baa5-49a4-aadd-f5d549696351', 'nic', '398660cc-20ce-444e-b93e-d45b8b865e10', 'disable']\n", + "['node', '6f89bce8-34e4-4fdf-b860-b34027efa639', 'nic', '43c0f913-a203-4436-8649-ab73363bd8cb', 'enable']\n", + "['node', '6f89bce8-34e4-4fdf-b860-b34027efa639', 'nic', '43c0f913-a203-4436-8649-ab73363bd8cb', 'disable']\n", + "['node', '15eb1a5c-50f4-4681-81f8-7ad457c6b1af', 'nic', '1d42ed40-b6f9-4dba-aa23-10143842aac8', 'enable']\n", + "['node', '15eb1a5c-50f4-4681-81f8-7ad457c6b1af', 'nic', '1d42ed40-b6f9-4dba-aa23-10143842aac8', 'disable']\n", + "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', 'f921e45e-5a11-4c87-bfe9-47bdba7d6828', 'enable']\n", + "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', 'f921e45e-5a11-4c87-bfe9-47bdba7d6828', 'disable']\n", + "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', '0ed5ed4a-e36f-4060-a13d-a7832d391887', 'enable']\n", + "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', '0ed5ed4a-e36f-4060-a13d-a7832d391887', 'disable']\n" + ] + } + ], + "source": [ + "for a in act_tree:\n", + " print(a)\n", + "simController.apply_action(\n", + " {\n", + " 'network':'', \n", + " 'node': '26e189bb-442e-4f73-ab7a-1c4dd162e986', \n", + " 'nic': 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', \n", + " 'verb': 'enable', \n", + " 'options':{'...':'...'}\n", + " })\n", + "\n", + "a = {\n", + " 'target_type': 'network',\n", + " 'target_options': {\n", + " 'identifier': '',\n", + " 'target_type': '',\n", + " 'target_options': {\n", + " 'identifier': '',\n", + " \n", + " }\n", + " }\n", + "}\n", + "# ^ do something like this where the requests are k:v pairs instead, have a simple/similar approach " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index f6c0b5d9..0fbc33fd 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -1,7 +1,7 @@ # flake8: noqa """Core of the PrimAITE Simulator.""" from abc import ABC, abstractmethod -from typing import Callable, Dict, List, Optional, Union +from typing import Callable, ClassVar, Dict, List, Optional, Union from uuid import uuid4 from pydantic import BaseModel, ConfigDict @@ -42,7 +42,7 @@ class Action(BaseModel): the action can be performed or not. """ - func: Callable[[List[str], Dict], None] + func: Callable[[Dict], None] """ ``func`` is a function that accepts a request and a context dict. Typically this would be a lambda function that invokes a class method of your SimComponent. For example if the component is a node and the action is for @@ -74,7 +74,7 @@ class ActionManager(BaseModel): actions: Dict[str, Action] = {} """maps action verb to an action object.""" - def __call__(self, request: List[str], context: Dict) -> None: + def __call__(self, request: Dict, context: Dict) -> None: """ Process an action request. From a719389e05aee3f2520685ab9944e718667377c5 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 11:24:42 +0100 Subject: [PATCH 06/15] Add placeholder actions --- src/primaite/notebooks/scratch.ipynb | 345 ++++++++++++------ .../simulator/file_system/file_system.py | 38 +- .../simulator/network/hardware/base.py | 16 +- 3 files changed, 284 insertions(+), 115 deletions(-) diff --git a/src/primaite/notebooks/scratch.ipynb b/src/primaite/notebooks/scratch.ipynb index 50a85e7a..023b7d12 100644 --- a/src/primaite/notebooks/scratch.ipynb +++ b/src/primaite/notebooks/scratch.ipynb @@ -2,83 +2,50 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], "source": [ - "from primaite.simulator.network.networks import arcd_uc2_network\n" + "from primaite.simulator.network.networks import arcd_uc2_network\n", + "%load_ext autoreload\n", + "%autoreload 2" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-09-05 15:52:13,305: Added node 26e189bb-442e-4f73-ab7a-1c4dd162e986 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,307: Added node 9d07f591-1e44-41c9-9d7a-0eecf0c53fa4 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,322: NIC d5:3d:df:8d:21:94/192.168.1.1 connected to Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84\n", - "2023-09-05 15:52:13,324: SwitchPort 70:63:71:75:0f:84 connected to Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84\n", - "2023-09-05 15:52:13,326: Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84 up\n", - "2023-09-05 15:52:13,327: Link d5:3d:df:8d:21:94/192.168.1.1<-->70:63:71:75:0f:84 up\n", - "2023-09-05 15:52:13,329: Added link 497f7357-e14e-4f00-b6cd-68286b053496 to connect d5:3d:df:8d:21:94/192.168.1.1 and 70:63:71:75:0f:84\n", - "2023-09-05 15:52:13,333: Added node 9cf37bd7-9f67-47f8-836b-3b5e69dd600c to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,336: NIC c7:ca:5f:6c:50:c9/192.168.10.1 connected to Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c\n", - "2023-09-05 15:52:13,338: SwitchPort e7:21:66:e4:da:2c connected to Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c\n", - "2023-09-05 15:52:13,340: Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c up\n", - "2023-09-05 15:52:13,341: Link c7:ca:5f:6c:50:c9/192.168.10.1<-->e7:21:66:e4:da:2c up\n", - "2023-09-05 15:52:13,343: Added link b1165845-46af-400d-b408-9f6b0fe4a51a to connect c7:ca:5f:6c:50:c9/192.168.10.1 and e7:21:66:e4:da:2c\n", - "2023-09-05 15:52:13,345: Added node 9c7f4049-30fa-40bd-b0c8-2119bef7936c to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,347: SwitchPort e9:5c:26:c2:74:a2 connected to Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21\n", - "2023-09-05 15:52:13,351: Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21 up\n", - "2023-09-05 15:52:13,353: NIC fb:05:aa:54:2d:3e/192.168.10.21 connected to Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21\n", - "2023-09-05 15:52:13,354: Link e9:5c:26:c2:74:a2<-->fb:05:aa:54:2d:3e/192.168.10.21 up\n", - "2023-09-05 15:52:13,356: Added link 7d9ade8d-ed9c-4688-8375-18b58102b2a7 to connect e9:5c:26:c2:74:a2 and fb:05:aa:54:2d:3e/192.168.10.21\n", - "2023-09-05 15:52:13,358: Added node 88c26ce5-4243-4247-98a3-315ff54f7ef6 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,360: SwitchPort 30:fd:61:15:db:ad connected to Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22\n", - "2023-09-05 15:52:13,362: Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22 up\n", - "2023-09-05 15:52:13,363: NIC c1:e2:46:a2:cb:b2/192.168.10.22 connected to Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22\n", - "2023-09-05 15:52:13,365: Link 30:fd:61:15:db:ad<-->c1:e2:46:a2:cb:b2/192.168.10.22 up\n", - "2023-09-05 15:52:13,367: Added link bcfe4c45-d680-4f72-a90a-9fa57c2a6fba to connect 30:fd:61:15:db:ad and c1:e2:46:a2:cb:b2/192.168.10.22\n", - "2023-09-05 15:52:13,370: Added node d7e5389a-9970-4c47-926c-9069b925e934 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,372: SwitchPort 35:0c:3a:21:7c:d1 connected to Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10\n", - "2023-09-05 15:52:13,375: Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10 up\n", - "2023-09-05 15:52:13,376: NIC 40:4f:3e:f0:32:66/192.168.1.10 connected to Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10\n", - "2023-09-05 15:52:13,378: Link 35:0c:3a:21:7c:d1<-->40:4f:3e:f0:32:66/192.168.1.10 up\n", - "2023-09-05 15:52:13,380: Added link 34254262-beeb-4967-b7ff-3480928e47f9 to connect 35:0c:3a:21:7c:d1 and 40:4f:3e:f0:32:66/192.168.1.10\n", - "2023-09-05 15:52:13,386: Added node 02c25642-baa5-49a4-aadd-f5d549696351 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,388: SwitchPort a4:ab:83:f0:b5:fe connected to Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12\n", - "2023-09-05 15:52:13,390: Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12 up\n", - "2023-09-05 15:52:13,392: NIC 4b:a9:6c:90:ae:8f/192.168.1.12 connected to Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12\n", - "2023-09-05 15:52:13,393: Link a4:ab:83:f0:b5:fe<-->4b:a9:6c:90:ae:8f/192.168.1.12 up\n", - "2023-09-05 15:52:13,395: Added link 433b0cec-445d-4447-9502-c8727eb14a81 to connect a4:ab:83:f0:b5:fe and 4b:a9:6c:90:ae:8f/192.168.1.12\n", - "2023-09-05 15:52:13,398: Added node 6f89bce8-34e4-4fdf-b860-b34027efa639 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,400: SwitchPort c2:9f:42:ec:ea:a0 connected to Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14\n", - "2023-09-05 15:52:13,403: Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14 up\n", - "2023-09-05 15:52:13,405: NIC c7:61:9d:6e:0b:29/192.168.1.14 connected to Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14\n", - "2023-09-05 15:52:13,407: Link c2:9f:42:ec:ea:a0<-->c7:61:9d:6e:0b:29/192.168.1.14 up\n", - "2023-09-05 15:52:13,408: Added link 30b18ea0-ea2b-494a-8a63-d5b4bd703668 to connect c2:9f:42:ec:ea:a0 and c7:61:9d:6e:0b:29/192.168.1.14\n", - "2023-09-05 15:52:13,412: Added node 15eb1a5c-50f4-4681-81f8-7ad457c6b1af to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,414: SwitchPort 5c:0e:20:b3:65:cb connected to Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16\n", - "2023-09-05 15:52:13,417: Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16 up\n", - "2023-09-05 15:52:13,419: NIC bd:06:4d:19:fb:f2/192.168.1.16 connected to Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16\n", - "2023-09-05 15:52:13,420: Link 5c:0e:20:b3:65:cb<-->bd:06:4d:19:fb:f2/192.168.1.16 up\n", - "2023-09-05 15:52:13,421: Added link deb1ee09-9731-46e2-99fb-1276ca48ccb3 to connect 5c:0e:20:b3:65:cb and bd:06:4d:19:fb:f2/192.168.1.16\n", - "2023-09-05 15:52:13,424: Added node 5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6 to Network 16435554-f108-479e-a4de-719f39898d0a\n", - "2023-09-05 15:52:13,425: SwitchPort e6:fa:f7:9a:d3:8c connected to Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110\n", - "2023-09-05 15:52:13,429: Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110 up\n", - "2023-09-05 15:52:13,430: NIC 37:5b:c5:ac:e5:08/192.168.1.110 connected to Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110\n", - "2023-09-05 15:52:13,432: Link e6:fa:f7:9a:d3:8c<-->37:5b:c5:ac:e5:08/192.168.1.110 up\n", - "2023-09-05 15:52:13,434: Added link cf4ecad7-3b24-4f8f-9de8-01b9f64b270b to connect e6:fa:f7:9a:d3:8c and 37:5b:c5:ac:e5:08/192.168.1.110\n", - "2023-09-05 15:52:13,436::ERROR::primaite.simulator.network.hardware.base::176::NIC 4f:4b:3f:f1:02:c0/192.168.10.110 cannot be enabled as it is not connected to a Link\n", - "2023-09-05 15:52:13,438: SwitchPort 57:0a:35:80:1c:38 connected to Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110\n", - "2023-09-05 15:52:13,440: Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110 up\n", - "2023-09-05 15:52:13,441: NIC 4f:4b:3f:f1:02:c0/192.168.10.110 connected to Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110\n", - "2023-09-05 15:52:13,443: Link 57:0a:35:80:1c:38<-->4f:4b:3f:f1:02:c0/192.168.10.110 up\n", - "2023-09-05 15:52:13,447: Added link 035d9749-1bf6-4bd5-b945-c931f207ffb9 to connect 57:0a:35:80:1c:38 and 4f:4b:3f:f1:02:c0/192.168.10.110\n" + "2023-09-19 11:04:37,447: Added node 654e2f3e-1017-4f0a-9f77-addc1f652148 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,449: Added node 5953be77-ab77-43c0-a8bb-a72f94121358 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,453: Added node 7eeca128-bea5-4046-8b0c-c11a684f5638 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,457: Added node dc517f9b-699a-423a-8e68-40f45aece537 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,461: Added node 0b77284b-93c4-4820-91aa-46ef87d95afe to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,467: Added node 5bbb11fb-d9d6-4e44-92e5-42b31a110bc7 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,469: Added node f6be7556-fdd9-4207-a588-447ccbdb1ee2 to Network f31c099e-6349-4f78-8a35-899443011640\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-19 11:04:37,539: Added node 51795116-f673-4c38-9524-525014565ac6 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,546: Added node 3fc6c09a-2918-4ae6-85ca-e85eeda8bd47 to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,549: Added node 664bd02f-8c85-4766-8144-46944b9160cb to Network f31c099e-6349-4f78-8a35-899443011640\n", + "2023-09-19 11:04:37,552::ERROR::primaite.simulator.network.hardware.base::176::NIC fb:f1:07:56:1a:dc/192.168.10.110 cannot be enabled as it is not connected to a Link\n" ] } ], @@ -86,6 +53,38 @@ "net = arcd_uc2_network()" ] }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "RecursionError", + "evalue": "maximum recursion depth exceeded while calling a Python object", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRecursionError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/core/formatters.py:708\u001b[0m, in \u001b[0;36mPlainTextFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 701\u001b[0m stream \u001b[39m=\u001b[39m StringIO()\n\u001b[1;32m 702\u001b[0m printer \u001b[39m=\u001b[39m pretty\u001b[39m.\u001b[39mRepresentationPrinter(stream, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mverbose,\n\u001b[1;32m 703\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmax_width, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mnewline,\n\u001b[1;32m 704\u001b[0m max_seq_length\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmax_seq_length,\n\u001b[1;32m 705\u001b[0m singleton_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msingleton_printers,\n\u001b[1;32m 706\u001b[0m type_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtype_printers,\n\u001b[1;32m 707\u001b[0m deferred_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdeferred_printers)\n\u001b[0;32m--> 708\u001b[0m printer\u001b[39m.\u001b[39;49mpretty(obj)\n\u001b[1;32m 709\u001b[0m printer\u001b[39m.\u001b[39mflush()\n\u001b[1;32m 710\u001b[0m \u001b[39mreturn\u001b[39;00m stream\u001b[39m.\u001b[39mgetvalue()\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/lib/pretty.py:410\u001b[0m, in \u001b[0;36mRepresentationPrinter.pretty\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 407\u001b[0m \u001b[39mreturn\u001b[39;00m meth(obj, \u001b[39mself\u001b[39m, cycle)\n\u001b[1;32m 408\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mcls\u001b[39m \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mobject\u001b[39m \\\n\u001b[1;32m 409\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mcallable\u001b[39m(\u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__dict__\u001b[39m\u001b[39m.\u001b[39mget(\u001b[39m'\u001b[39m\u001b[39m__repr__\u001b[39m\u001b[39m'\u001b[39m)):\n\u001b[0;32m--> 410\u001b[0m \u001b[39mreturn\u001b[39;00m _repr_pprint(obj, \u001b[39mself\u001b[39;49m, cycle)\n\u001b[1;32m 412\u001b[0m \u001b[39mreturn\u001b[39;00m _default_pprint(obj, \u001b[39mself\u001b[39m, cycle)\n\u001b[1;32m 413\u001b[0m \u001b[39mfinally\u001b[39;00m:\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/lib/pretty.py:778\u001b[0m, in \u001b[0;36m_repr_pprint\u001b[0;34m(obj, p, cycle)\u001b[0m\n\u001b[1;32m 776\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"A pprint that just redirects to the normal repr function.\"\"\"\u001b[39;00m\n\u001b[1;32m 777\u001b[0m \u001b[39m# Find newlines and replace them with p.break_()\u001b[39;00m\n\u001b[0;32m--> 778\u001b[0m output \u001b[39m=\u001b[39m \u001b[39mrepr\u001b[39;49m(obj)\n\u001b[1;32m 779\u001b[0m lines \u001b[39m=\u001b[39m output\u001b[39m.\u001b[39msplitlines()\n\u001b[1;32m 780\u001b[0m \u001b[39mwith\u001b[39;00m p\u001b[39m.\u001b[39mgroup():\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_str__(\u001b[39m\"\u001b[39;49m\u001b[39m, \u001b[39;49m\u001b[39m\"\u001b[39;49m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_str__(\u001b[39m\"\u001b[39;49m\u001b[39m, \u001b[39;49m\u001b[39m\"\u001b[39;49m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", + " \u001b[0;31m[... skipping similar frames: BaseModel.__repr__ at line 859 (589 times), at line 55 (588 times), Representation.__repr_str__ at line 55 (588 times)]\u001b[0m\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_str__(\u001b[39m\"\u001b[39m\u001b[39m, \u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", + "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:52\u001b[0m, in \u001b[0;36mRepresentation.__repr_name__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_name__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[1;32m 51\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Name of the instance's class, used in __repr__.\"\"\"\u001b[39;00m\n\u001b[0;32m---> 52\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m__class__\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m__name__\u001b[39;49m\n", + "\u001b[0;31mRecursionError\u001b[0m: maximum recursion depth exceeded while calling a Python object" + ] + } + ], + "source": [] + }, { "cell_type": "code", "execution_count": 3, @@ -95,6 +94,26 @@ "act_tree = net._action_manager.get_action_tree()" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "115" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(act_tree)" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -104,59 +123,165 @@ "name": "stdout", "output_type": "stream", "text": [ - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', 'enable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', 'disable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '2192673d-ad8c-437f-a4d6-0e222ab7e190', 'enable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '2192673d-ad8c-437f-a4d6-0e222ab7e190', 'disable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '3c3fb3d8-c5d1-41aa-8e3e-db1cc0445b0b', 'enable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '3c3fb3d8-c5d1-41aa-8e3e-db1cc0445b0b', 'disable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '29e90915-815f-4505-b957-6f46681950b3', 'enable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '29e90915-815f-4505-b957-6f46681950b3', 'disable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '0915f437-6ed3-4134-b754-7d903c98eb57', 'enable']\n", - "['node', '26e189bb-442e-4f73-ab7a-1c4dd162e986', 'nic', '0915f437-6ed3-4134-b754-7d903c98eb57', 'disable']\n", - "['node', '9c7f4049-30fa-40bd-b0c8-2119bef7936c', 'nic', '199c9558-6a73-423e-9c69-ced05cd597cb', 'enable']\n", - "['node', '9c7f4049-30fa-40bd-b0c8-2119bef7936c', 'nic', '199c9558-6a73-423e-9c69-ced05cd597cb', 'disable']\n", - "['node', '88c26ce5-4243-4247-98a3-315ff54f7ef6', 'nic', '6f871129-d13e-4c8a-85ff-7102fa1e7b8e', 'enable']\n", - "['node', '88c26ce5-4243-4247-98a3-315ff54f7ef6', 'nic', '6f871129-d13e-4c8a-85ff-7102fa1e7b8e', 'disable']\n", - "['node', 'd7e5389a-9970-4c47-926c-9069b925e934', 'nic', 'b6c15c77-8869-400c-8a47-62856dd27ce6', 'enable']\n", - "['node', 'd7e5389a-9970-4c47-926c-9069b925e934', 'nic', 'b6c15c77-8869-400c-8a47-62856dd27ce6', 'disable']\n", - "['node', '02c25642-baa5-49a4-aadd-f5d549696351', 'nic', '398660cc-20ce-444e-b93e-d45b8b865e10', 'enable']\n", - "['node', '02c25642-baa5-49a4-aadd-f5d549696351', 'nic', '398660cc-20ce-444e-b93e-d45b8b865e10', 'disable']\n", - "['node', '6f89bce8-34e4-4fdf-b860-b34027efa639', 'nic', '43c0f913-a203-4436-8649-ab73363bd8cb', 'enable']\n", - "['node', '6f89bce8-34e4-4fdf-b860-b34027efa639', 'nic', '43c0f913-a203-4436-8649-ab73363bd8cb', 'disable']\n", - "['node', '15eb1a5c-50f4-4681-81f8-7ad457c6b1af', 'nic', '1d42ed40-b6f9-4dba-aa23-10143842aac8', 'enable']\n", - "['node', '15eb1a5c-50f4-4681-81f8-7ad457c6b1af', 'nic', '1d42ed40-b6f9-4dba-aa23-10143842aac8', 'disable']\n", - "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', 'f921e45e-5a11-4c87-bfe9-47bdba7d6828', 'enable']\n", - "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', 'f921e45e-5a11-4c87-bfe9-47bdba7d6828', 'disable']\n", - "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', '0ed5ed4a-e36f-4060-a13d-a7832d391887', 'enable']\n", - "['node', '5c5b1c84-5d06-4319-80c0-ca3adf9ce2c6', 'nic', '0ed5ed4a-e36f-4060-a13d-a7832d391887', 'disable']\n" + "[['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'scan'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'checkhash'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'repair'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'restore'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'scan'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'shutdown'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'startup'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'reset'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'scan'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'checkhash'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'repair'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'restore'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'scan'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'shutdown'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'startup'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'reset'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'scan'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'checkhash'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'repair'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'restore'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'scan'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'shutdown'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'startup'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'reset'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'enable'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'disable'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'scan'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'checkhash'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'repair'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'restore'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'scan'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'shutdown'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'startup'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'reset'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'enable'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'disable'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'scan'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'checkhash'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'repair'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'restore'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'scan'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'shutdown'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'startup'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'reset'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'enable'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'disable'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'scan'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'checkhash'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'repair'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'restore'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'scan'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'shutdown'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'startup'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'reset'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'enable'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'disable'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'delete'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'shutdown'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'startup'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'reset'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'enable'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'disable'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'scan'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'checkhash'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'repair'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'restore'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'scan'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'shutdown'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'startup'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'reset'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'enable'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'disable'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'scan'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'checkhash'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'repair'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'restore'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'scan'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'shutdown'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'startup'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'reset'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'enable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'disable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'enable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'disable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'scan'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'checkhash'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'repair'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'restore'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'scan'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'shutdown'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'startup'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'reset']]\n" + ] + } + ], + "source": [ + "print(act_tree)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'enable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'disable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'enable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'disable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'enable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'disable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'enable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'disable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'enable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'disable']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'scan']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'checkhash']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'repair']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'restore']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'scan']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'shutdown']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'startup']\n", + "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'reset']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'scan']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'checkhash']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'repair']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'restore']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'scan']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'shutdown']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'startup']\n", + "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'reset']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'scan']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'checkhash']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'repair']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'restore']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'scan']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'shutdown']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'startup']\n", + "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'reset']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'enable']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'disable']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'scan']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'checkhash']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'repair']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'restore']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'scan']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'shutdown']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'startup']\n", + "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'reset']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'enable']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'disable']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'scan']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'checkhash']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'repair']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'restore']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'scan']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'shutdown']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'startup']\n", + "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'reset']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'enable']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'disable']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'scan']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'checkhash']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'repair']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'restore']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'scan']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'shutdown']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'startup']\n", + "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'reset']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'enable']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'disable']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'scan']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'checkhash']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'repair']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'restore']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'scan']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'checkhash']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'repair']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'restore']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'scan']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'checkhash']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'delete']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'repair']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'restore']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'scan']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'shutdown']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'startup']\n", + "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'reset']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'enable']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'disable']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'scan']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'checkhash']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'repair']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'restore']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'scan']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'shutdown']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'startup']\n", + "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'reset']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'enable']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'disable']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'scan']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'checkhash']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'repair']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'restore']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'scan']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'shutdown']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'startup']\n", + "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'reset']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'enable']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'disable']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'enable']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'disable']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'scan']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'checkhash']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'repair']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'restore']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'scan']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'shutdown']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'startup']\n", + "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'reset']\n" ] } ], "source": [ "for a in act_tree:\n", " print(a)\n", - "simController.apply_action(\n", - " {\n", - " 'network':'', \n", - " 'node': '26e189bb-442e-4f73-ab7a-1c4dd162e986', \n", - " 'nic': 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', \n", - " 'verb': 'enable', \n", - " 'options':{'...':'...'}\n", - " })\n", + "# simController.apply_action(\n", + "# {\n", + "# 'network':'', \n", + "# 'node': '26e189bb-442e-4f73-ab7a-1c4dd162e986', \n", + "# 'nic': 'eb6dfd45-d688-47cf-b061-5f45820a6bc7', \n", + "# 'verb': 'enable', \n", + "# 'options':{'...':'...'}\n", + "# })\n", "\n", - "a = {\n", - " 'target_type': 'network',\n", - " 'target_options': {\n", - " 'identifier': '',\n", - " 'target_type': '',\n", - " 'target_options': {\n", - " 'identifier': '',\n", + "# a = {\n", + "# 'target_type': 'network',\n", + "# 'target_options': {\n", + "# 'identifier': '',\n", + "# 'target_type': '',\n", + "# 'target_options': {\n", + "# 'identifier': '',\n", " \n", - " }\n", - " }\n", - "}\n", - "# ^ do something like this where the requests are k:v pairs instead, have a simple/similar approach " + "# }\n", + "# }\n", + "# }\n", + "# # ^ do something like this where the requests are k:v pairs instead, have a simple/similar approach " ] }, { diff --git a/src/primaite/simulator/file_system/file_system.py b/src/primaite/simulator/file_system/file_system.py index b2037729..cbe30c96 100644 --- a/src/primaite/simulator/file_system/file_system.py +++ b/src/primaite/simulator/file_system/file_system.py @@ -9,7 +9,7 @@ from typing import Dict, Optional from prettytable import MARKDOWN, PrettyTable from primaite import getLogger -from primaite.simulator.core import SimComponent +from primaite.simulator.core import Action, ActionManager, SimComponent from primaite.simulator.file_system.file_type import FileType, get_file_type_from_extension from primaite.simulator.system.core.sys_log import SysLog @@ -94,6 +94,17 @@ class FileSystem(SimComponent): if not self.folders: self.create_folder("root") + def _init_action_manager(self) -> ActionManager: + am = super()._init_action_manager() + + self._folder_action_manager = ActionManager() + am.add_action("folder", Action(func=self._folder_action_manager)) + + self._file_action_manager = ActionManager() + am.add_action("file", Action(func=self._file_action_manager)) + + return am + @property def size(self) -> int: """ @@ -154,6 +165,7 @@ class FileSystem(SimComponent): self.folders[folder.uuid] = folder self._folders_by_name[folder.name] = folder self.sys_log.info(f"Created folder /{folder.name}") + self._folder_action_manager.add_action(folder.uuid, Action(func=folder._action_manager)) return folder def delete_folder(self, folder_name: str): @@ -172,6 +184,7 @@ class FileSystem(SimComponent): self.folders.pop(folder.uuid) self._folders_by_name.pop(folder.name) self.sys_log.info(f"Deleted folder /{folder.name} and its contents") + self._folder_action_manager.remove_action(folder.uuid) else: _LOGGER.debug(f"Cannot delete folder as it does not exist: {folder_name}") @@ -213,6 +226,7 @@ class FileSystem(SimComponent): ) folder.add_file(file) self.sys_log.info(f"Created file /{file.path}") + self._file_action_manager.add_action(file.uuid, Action(func=file._action_manager)) return file def get_file(self, folder_name: str, file_name: str) -> Optional[File]: @@ -240,6 +254,7 @@ class FileSystem(SimComponent): file = folder.get_file(file_name) if file: folder.remove_file(file) + self._file_action_manager.remove_action(file.uuid) self.sys_log.info(f"Deleted file /{file.path}") def move_file(self, src_folder_name: str, src_file_name: str, dst_folder_name: str): @@ -317,6 +332,16 @@ class Folder(FileSystemItemABC): is_quarantined: bool = False "Flag that marks the folder as quarantined if true." + def _init_action_manager(sekf) -> ActionManager: + am = super()._init_action_manager() + + am.add_action("scan", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("checkhash", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("repair", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("restore", Action(func=lambda request, context: ...)) # TODO implement action + + return am + def describe_state(self) -> Dict: """ Produce a dictionary describing the current state of this object. @@ -482,6 +507,17 @@ class File(FileSystemItemABC): with open(self.sim_path, mode="a"): pass + def _init_action_manager(self) -> ActionManager: + am = super()._init_action_manager() + + am.add_action("scan", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("checkhash", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("delete", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("repair", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("restore", Action(func=lambda request, context: ...)) # TODO implement action + + return am + def make_copy(self, dst_folder: Folder) -> File: """ Create a copy of the current File object in the given destination folder. diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 24844cc3..713c293b 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -951,15 +951,23 @@ class Node(SimComponent): # since there are potentially many services, create an action manager that can map service name self._service_action_manager = ActionManager() am.add_action("service", Action(func=self._service_action_manager)) - self._process_action_manager = ActionManager() - am.add_action("process", Action(func=self._process_action_manager)) - self._application_action_manager = ActionManager() - am.add_action("application", Action(func=self._application_action_manager)) self._nic_action_manager = ActionManager() am.add_action("nic", Action(func=self._nic_action_manager)) am.add_action("file_system", Action(func=self.file_system._action_manager)) + # currently we don't have any applications nor processes, so these will be empty + self._process_action_manager = ActionManager() + am.add_action("process", Action(func=self._process_action_manager)) + self._application_action_manager = ActionManager() + am.add_action("application", Action(func=self._application_action_manager)) + + am.add_action("scan", Action(func=lambda request, context: ...)) # TODO implement OS scan + + am.add_action("shutdown", Action(func=lambda request, context: self.power_off())) + am.add_action("startup", Action(func=lambda request, context: self.power_on())) + am.add_action("reset", Action(func=lambda request, context: ...)) # TODO implement node reset + return am def describe_state(self) -> Dict: From 610517d81705a4179928278f89fa19c5faa3ab44 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 11:28:13 +0100 Subject: [PATCH 07/15] Underscore 'parent' refs to make pydantic happy. Rename attributes like connected_link and connected_node to start with an underscore. This will prevent circular dependency and stack recursion depth error. --- .../simulator/network/hardware/base.py | 102 +++++++++--------- .../network/hardware/nodes/switch.py | 4 +- .../network/test_network_creation.py | 4 +- 3 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 713c293b..73e7b20c 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -89,9 +89,9 @@ class NIC(SimComponent): "The Maximum Transmission Unit (MTU) of the NIC in Bytes. Default is 1500 B" wake_on_lan: bool = False "Indicates if the NIC supports Wake-on-LAN functionality." - connected_node: Optional[Node] = None + _connected_node: Optional[Node] = None "The Node to which the NIC is connected." - connected_link: Optional[Link] = None + _connected_link: Optional[Link] = None "The Link to which the NIC is connected." enabled: bool = False "Indicates whether the NIC is enabled." @@ -166,21 +166,21 @@ class NIC(SimComponent): """Attempt to enable the NIC.""" if self.enabled: return - if not self.connected_node: + if not self._connected_node: _LOGGER.error(f"NIC {self} cannot be enabled as it is not connected to a Node") return - if self.connected_node.operating_state != NodeOperatingState.ON: - self.connected_node.sys_log.error(f"NIC {self} cannot be enabled as the endpoint is not turned on") + if self._connected_node.operating_state != NodeOperatingState.ON: + self._connected_node.sys_log.error(f"NIC {self} cannot be enabled as the endpoint is not turned on") return - if not self.connected_link: + if not self._connected_link: _LOGGER.error(f"NIC {self} cannot be enabled as it is not connected to a Link") return self.enabled = True - self.connected_node.sys_log.info(f"NIC {self} enabled") - self.pcap = PacketCapture(hostname=self.connected_node.hostname, ip_address=self.ip_address) - if self.connected_link: - self.connected_link.endpoint_up() + self._connected_node.sys_log.info(f"NIC {self} enabled") + self.pcap = PacketCapture(hostname=self._connected_node.hostname, ip_address=self.ip_address) + if self._connected_link: + self._connected_link.endpoint_up() def disable(self): """Disable the NIC.""" @@ -188,12 +188,12 @@ class NIC(SimComponent): return self.enabled = False - if self.connected_node: - self.connected_node.sys_log.info(f"NIC {self} disabled") + if self._connected_node: + self._connected_node.sys_log.info(f"NIC {self} disabled") else: _LOGGER.debug(f"NIC {self} disabled") - if self.connected_link: - self.connected_link.endpoint_down() + if self._connected_link: + self._connected_link.endpoint_down() def connect_link(self, link: Link): """ @@ -202,26 +202,26 @@ class NIC(SimComponent): :param link: The link to which the NIC is connected. :type link: :class:`~primaite.simulator.network.transmission.physical_layer.Link` """ - if self.connected_link: + if self._connected_link: _LOGGER.error(f"Cannot connect Link to NIC ({self.mac_address}) as it already has a connection") return - if self.connected_link == link: + if self._connected_link == link: _LOGGER.error(f"Cannot connect Link to NIC ({self.mac_address}) as it is already connected") return # TODO: Inform the Node that a link has been connected - self.connected_link = link + self._connected_link = link self.enable() _LOGGER.debug(f"NIC {self} connected to Link {link}") def disconnect_link(self): """Disconnect the NIC from the connected Link.""" - if self.connected_link.endpoint_a == self: - self.connected_link.endpoint_a = None - if self.connected_link.endpoint_b == self: - self.connected_link.endpoint_b = None - self.connected_link = None + if self._connected_link.endpoint_a == self: + self._connected_link.endpoint_a = None + if self._connected_link.endpoint_b == self: + self._connected_link.endpoint_b = None + self._connected_link = None def add_dns_server(self, ip_address: IPv4Address): """ @@ -251,7 +251,7 @@ class NIC(SimComponent): if self.enabled: frame.set_sent_timestamp() self.pcap.capture(frame) - self.connected_link.transmit_frame(sender_nic=self, frame=frame) + self._connected_link.transmit_frame(sender_nic=self, frame=frame) return True # Cannot send Frame as the NIC is not enabled return False @@ -270,7 +270,7 @@ class NIC(SimComponent): self.pcap.capture(frame) # If this destination or is broadcast if frame.ethernet.dst_mac_addr == self.mac_address or frame.ethernet.dst_mac_addr == "ff:ff:ff:ff:ff:ff": - self.connected_node.receive_frame(frame=frame, from_nic=self) + self._connected_node.receive_frame(frame=frame, from_nic=self) return True return False @@ -295,9 +295,9 @@ class SwitchPort(SimComponent): "The speed of the SwitchPort in Mbps. Default is 100 Mbps." mtu: int = 1500 "The Maximum Transmission Unit (MTU) of the SwitchPort in Bytes. Default is 1500 B" - connected_node: Optional[Node] = None + _connected_node: Optional[Node] = None "The Node to which the SwitchPort is connected." - connected_link: Optional[Link] = None + _connected_link: Optional[Link] = None "The Link to which the SwitchPort is connected." enabled: bool = False "Indicates whether the SwitchPort is enabled." @@ -334,31 +334,31 @@ class SwitchPort(SimComponent): if self.enabled: return - if not self.connected_node: + if not self._connected_node: _LOGGER.error(f"SwitchPort {self} cannot be enabled as it is not connected to a Node") return - if self.connected_node.operating_state != NodeOperatingState.ON: - self.connected_node.sys_log.info(f"SwitchPort {self} cannot be enabled as the endpoint is not turned on") + if self._connected_node.operating_state != NodeOperatingState.ON: + self._connected_node.sys_log.info(f"SwitchPort {self} cannot be enabled as the endpoint is not turned on") return self.enabled = True - self.connected_node.sys_log.info(f"SwitchPort {self} enabled") - self.pcap = PacketCapture(hostname=self.connected_node.hostname, switch_port_number=self.port_num) - if self.connected_link: - self.connected_link.endpoint_up() + self._connected_node.sys_log.info(f"SwitchPort {self} enabled") + self.pcap = PacketCapture(hostname=self._connected_node.hostname, switch_port_number=self.port_num) + if self._connected_link: + self._connected_link.endpoint_up() def disable(self): """Disable the SwitchPort.""" if not self.enabled: return self.enabled = False - if self.connected_node: - self.connected_node.sys_log.info(f"SwitchPort {self} disabled") + if self._connected_node: + self._connected_node.sys_log.info(f"SwitchPort {self} disabled") else: _LOGGER.debug(f"SwitchPort {self} disabled") - if self.connected_link: - self.connected_link.endpoint_down() + if self._connected_link: + self._connected_link.endpoint_down() def connect_link(self, link: Link): """ @@ -366,26 +366,26 @@ class SwitchPort(SimComponent): :param link: The link to which the SwitchPort is connected. """ - if self.connected_link: + if self._connected_link: _LOGGER.error(f"Cannot connect link to SwitchPort {self.mac_address} as it already has a connection") return - if self.connected_link == link: + if self._connected_link == link: _LOGGER.error(f"Cannot connect Link to SwitchPort {self.mac_address} as it is already connected") return # TODO: Inform the Switch that a link has been connected - self.connected_link = link + self._connected_link = link _LOGGER.debug(f"SwitchPort {self} connected to Link {link}") self.enable() def disconnect_link(self): """Disconnect the SwitchPort from the connected Link.""" - if self.connected_link.endpoint_a == self: - self.connected_link.endpoint_a = None - if self.connected_link.endpoint_b == self: - self.connected_link.endpoint_b = None - self.connected_link = None + if self._connected_link.endpoint_a == self: + self._connected_link.endpoint_a = None + if self._connected_link.endpoint_b == self: + self._connected_link.endpoint_b = None + self._connected_link = None def send_frame(self, frame: Frame) -> bool: """ @@ -395,7 +395,7 @@ class SwitchPort(SimComponent): """ if self.enabled: self.pcap.capture(frame) - self.connected_link.transmit_frame(sender_nic=self, frame=frame) + self._connected_link.transmit_frame(sender_nic=self, frame=frame) return True # Cannot send Frame as the SwitchPort is not enabled return False @@ -411,7 +411,7 @@ class SwitchPort(SimComponent): if self.enabled: frame.decrement_ttl() self.pcap.capture(frame) - connected_node: Node = self.connected_node + connected_node: Node = self._connected_node connected_node.forward_frame(frame=frame, incoming_port=self) return True return False @@ -1037,7 +1037,7 @@ class Node(SimComponent): self.operating_state = NodeOperatingState.ON self.sys_log.info("Turned on") for nic in self.nics.values(): - if nic.connected_link: + if nic._connected_link: nic.enable() def power_off(self): @@ -1058,7 +1058,7 @@ class Node(SimComponent): if nic.uuid not in self.nics: self.nics[nic.uuid] = nic self.ethernet_port[len(self.nics)] = nic - nic.connected_node = self + nic._connected_node = self nic.parent = self self.sys_log.info(f"Connected NIC {nic}") if self.operating_state == NodeOperatingState.ON: @@ -1225,7 +1225,7 @@ class Switch(Node): if not self.switch_ports: self.switch_ports = {i: SwitchPort() for i in range(1, self.num_ports + 1)} for port_num, port in self.switch_ports.items(): - port.connected_node = self + port._connected_node = self port.parent = self port.port_num = port_num @@ -1298,7 +1298,7 @@ class Switch(Node): _LOGGER.error(msg) raise NetworkError(msg) - if port.connected_link != link: + if port._connected_link != link: msg = f"The link does not match the connection at port number {port_number}" _LOGGER.error(msg) raise NetworkError(msg) diff --git a/src/primaite/simulator/network/hardware/nodes/switch.py b/src/primaite/simulator/network/hardware/nodes/switch.py index b7cc1242..ac8dabd1 100644 --- a/src/primaite/simulator/network/hardware/nodes/switch.py +++ b/src/primaite/simulator/network/hardware/nodes/switch.py @@ -30,7 +30,7 @@ class Switch(Node): if not self.switch_ports: self.switch_ports = {i: SwitchPort() for i in range(1, self.num_ports + 1)} for port_num, port in self.switch_ports.items(): - port.connected_node = self + port._connected_node = self port.parent = self port.port_num = port_num @@ -113,7 +113,7 @@ class Switch(Node): _LOGGER.error(msg) raise NetworkError(msg) - if port.connected_link != link: + if port._connected_link != link: msg = f"The link does not match the connection at port number {port_number}" _LOGGER.error(msg) raise NetworkError(msg) diff --git a/tests/integration_tests/network/test_network_creation.py b/tests/integration_tests/network/test_network_creation.py index 356eb1db..91218068 100644 --- a/tests/integration_tests/network/test_network_creation.py +++ b/tests/integration_tests/network/test_network_creation.py @@ -70,8 +70,8 @@ def test_connecting_node_to_itself(): net.connect(node.nics[nic1.uuid], node.nics[nic2.uuid], bandwidth=30) assert node in net - assert nic1.connected_link is None - assert nic2.connected_link is None + assert nic1._connected_link is None + assert nic2._connected_link is None assert len(net.links) == 0 From aa6834ad08d7c4204daa17900712c410269a3707 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 11:41:02 +0100 Subject: [PATCH 08/15] Check service actions work. --- src/primaite/notebooks/scratch.ipynb | 435 ++++++++++-------- .../simulator/network/hardware/base.py | 1 - src/primaite/simulator/system/software.py | 2 +- 3 files changed, 256 insertions(+), 182 deletions(-) diff --git a/src/primaite/notebooks/scratch.ipynb b/src/primaite/notebooks/scratch.ipynb index 023b7d12..f7b29fa4 100644 --- a/src/primaite/notebooks/scratch.ipynb +++ b/src/primaite/notebooks/scratch.ipynb @@ -2,18 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The autoreload extension is already loaded. To reload it, use:\n", - " %reload_ext autoreload\n" - ] - } - ], + "outputs": [], "source": [ "from primaite.simulator.network.networks import arcd_uc2_network\n", "%load_ext autoreload\n", @@ -22,30 +13,24 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-09-19 11:04:37,447: Added node 654e2f3e-1017-4f0a-9f77-addc1f652148 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,449: Added node 5953be77-ab77-43c0-a8bb-a72f94121358 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,453: Added node 7eeca128-bea5-4046-8b0c-c11a684f5638 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,457: Added node dc517f9b-699a-423a-8e68-40f45aece537 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,461: Added node 0b77284b-93c4-4820-91aa-46ef87d95afe to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,467: Added node 5bbb11fb-d9d6-4e44-92e5-42b31a110bc7 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,469: Added node f6be7556-fdd9-4207-a588-447ccbdb1ee2 to Network f31c099e-6349-4f78-8a35-899443011640\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-09-19 11:04:37,539: Added node 51795116-f673-4c38-9524-525014565ac6 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,546: Added node 3fc6c09a-2918-4ae6-85ca-e85eeda8bd47 to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,549: Added node 664bd02f-8c85-4766-8144-46944b9160cb to Network f31c099e-6349-4f78-8a35-899443011640\n", - "2023-09-19 11:04:37,552::ERROR::primaite.simulator.network.hardware.base::176::NIC fb:f1:07:56:1a:dc/192.168.10.110 cannot be enabled as it is not connected to a Link\n" + "2023-09-19 11:26:37,748: Added node 9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,750: Added node e0f81131-2c42-4182-99a7-695e9016c518 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,757: Added node 524ebdb4-ed76-4e8e-8cd6-babbf0d02f69 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,762: Added node 1e78d3ae-8eb7-4bb7-830e-dcf7fc000625 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,768: Added node fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,773: Added node 40b4845a-11a7-41a7-9ab7-1fb80b1799b3 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,778: Added node 119850a0-61c2-4050-afd9-709656e65c7b to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,966: Added node f7c983b1-0374-4280-be8f-2eae561dbf08 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,983: Added node 8479b2e0-9f97-47ea-a2e0-483ad604439f to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,991: Added node a2d78848-9e70-4824-bd91-9a6915988e38 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", + "2023-09-19 11:26:37,995::ERROR::primaite.simulator.network.hardware.base::176::NIC 68:3b:a1:83:01:a1/192.168.10.110 cannot be enabled as it is not connected to a Link\n" ] } ], @@ -54,40 +39,116 @@ ] }, { - "cell_type": "code", - "execution_count": 11, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "ename": "RecursionError", - "evalue": "maximum recursion depth exceeded while calling a Python object", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mRecursionError\u001b[0m Traceback (most recent call last)", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/core/formatters.py:708\u001b[0m, in \u001b[0;36mPlainTextFormatter.__call__\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 701\u001b[0m stream \u001b[39m=\u001b[39m StringIO()\n\u001b[1;32m 702\u001b[0m printer \u001b[39m=\u001b[39m pretty\u001b[39m.\u001b[39mRepresentationPrinter(stream, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mverbose,\n\u001b[1;32m 703\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmax_width, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mnewline,\n\u001b[1;32m 704\u001b[0m max_seq_length\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmax_seq_length,\n\u001b[1;32m 705\u001b[0m singleton_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39msingleton_printers,\n\u001b[1;32m 706\u001b[0m type_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mtype_printers,\n\u001b[1;32m 707\u001b[0m deferred_pprinters\u001b[39m=\u001b[39m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdeferred_printers)\n\u001b[0;32m--> 708\u001b[0m printer\u001b[39m.\u001b[39;49mpretty(obj)\n\u001b[1;32m 709\u001b[0m printer\u001b[39m.\u001b[39mflush()\n\u001b[1;32m 710\u001b[0m \u001b[39mreturn\u001b[39;00m stream\u001b[39m.\u001b[39mgetvalue()\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/lib/pretty.py:410\u001b[0m, in \u001b[0;36mRepresentationPrinter.pretty\u001b[0;34m(self, obj)\u001b[0m\n\u001b[1;32m 407\u001b[0m \u001b[39mreturn\u001b[39;00m meth(obj, \u001b[39mself\u001b[39m, cycle)\n\u001b[1;32m 408\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mcls\u001b[39m \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mobject\u001b[39m \\\n\u001b[1;32m 409\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mcallable\u001b[39m(\u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__dict__\u001b[39m\u001b[39m.\u001b[39mget(\u001b[39m'\u001b[39m\u001b[39m__repr__\u001b[39m\u001b[39m'\u001b[39m)):\n\u001b[0;32m--> 410\u001b[0m \u001b[39mreturn\u001b[39;00m _repr_pprint(obj, \u001b[39mself\u001b[39;49m, cycle)\n\u001b[1;32m 412\u001b[0m \u001b[39mreturn\u001b[39;00m _default_pprint(obj, \u001b[39mself\u001b[39m, cycle)\n\u001b[1;32m 413\u001b[0m \u001b[39mfinally\u001b[39;00m:\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/IPython/lib/pretty.py:778\u001b[0m, in \u001b[0;36m_repr_pprint\u001b[0;34m(obj, p, cycle)\u001b[0m\n\u001b[1;32m 776\u001b[0m \u001b[39m\u001b[39m\u001b[39m\"\"\"A pprint that just redirects to the normal repr function.\"\"\"\u001b[39;00m\n\u001b[1;32m 777\u001b[0m \u001b[39m# Find newlines and replace them with p.break_()\u001b[39;00m\n\u001b[0;32m--> 778\u001b[0m output \u001b[39m=\u001b[39m \u001b[39mrepr\u001b[39;49m(obj)\n\u001b[1;32m 779\u001b[0m lines \u001b[39m=\u001b[39m output\u001b[39m.\u001b[39msplitlines()\n\u001b[1;32m 780\u001b[0m \u001b[39mwith\u001b[39;00m p\u001b[39m.\u001b[39mgroup():\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_str__(\u001b[39m\"\u001b[39;49m\u001b[39m, \u001b[39;49m\u001b[39m\"\u001b[39;49m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_str__(\u001b[39m\"\u001b[39;49m\u001b[39m, \u001b[39;49m\u001b[39m\"\u001b[39;49m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", - " \u001b[0;31m[... skipping similar frames: BaseModel.__repr__ at line 859 (589 times), at line 55 (588 times), Representation.__repr_str__ at line 55 (588 times)]\u001b[0m\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36mRepresentation.__repr_str__\u001b[0;34m(self, join_str)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39;49mjoin(\u001b[39mrepr\u001b[39;49m(v) \u001b[39mif\u001b[39;49;00m a \u001b[39mis\u001b[39;49;00m \u001b[39mNone\u001b[39;49;00m \u001b[39melse\u001b[39;49;00m \u001b[39mf\u001b[39;49m\u001b[39m'\u001b[39;49m\u001b[39m{\u001b[39;49;00ma\u001b[39m}\u001b[39;49;00m\u001b[39m=\u001b[39;49m\u001b[39m{\u001b[39;49;00mv\u001b[39m!r}\u001b[39;49;00m\u001b[39m'\u001b[39;49m \u001b[39mfor\u001b[39;49;00m a, v \u001b[39min\u001b[39;49;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_args__())\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:55\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 54\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_str__\u001b[39m(\u001b[39mself\u001b[39m, join_str: \u001b[39mstr\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m---> 55\u001b[0m \u001b[39mreturn\u001b[39;00m join_str\u001b[39m.\u001b[39mjoin(\u001b[39mrepr\u001b[39m(v) \u001b[39mif\u001b[39;00m a \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00ma\u001b[39m}\u001b[39;00m\u001b[39m=\u001b[39m\u001b[39m{\u001b[39;00mv\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m \u001b[39mfor\u001b[39;00m a, v \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_args__())\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/main.py:859\u001b[0m, in \u001b[0;36mBaseModel.__repr__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 858\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[0;32m--> 859\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m__repr_name__()\u001b[39m}\u001b[39;00m\u001b[39m(\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m__repr_str__(\u001b[39m\"\u001b[39m\u001b[39m, \u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m}\u001b[39;00m\u001b[39m)\u001b[39m\u001b[39m'\u001b[39m\n", - "File \u001b[0;32m~/repos/PrimAITE/venv/lib/python3.10/site-packages/pydantic/_internal/_repr.py:52\u001b[0m, in \u001b[0;36mRepresentation.__repr_name__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__repr_name__\u001b[39m(\u001b[39mself\u001b[39m) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m \u001b[39mstr\u001b[39m:\n\u001b[1;32m 51\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Name of the instance's class, used in __repr__.\"\"\"\u001b[39;00m\n\u001b[0;32m---> 52\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m__class__\u001b[39;49m\u001b[39m.\u001b[39;49m\u001b[39m__name__\u001b[39;49m\n", - "\u001b[0;31mRecursionError\u001b[0m: maximum recursion depth exceeded while calling a Python object" - ] - } - ], - "source": [] + "source": [ + "### set up some services to test if actions are working" + ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "db_serv = net.get_node_by_hostname('database_server')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "from primaite.simulator.system.services.database_service import DatabaseService" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "db_svc = DatabaseService(file_system=db_serv.file_system)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2023-09-19 11:35:45,008: Added service d2090e0c-1080-4a4e-98af-489f2c7b5370 to node 119850a0-61c2-4050-afd9-709656e65c7b\n" + ] + } + ], + "source": [ + "db_serv.install_service(db_svc)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'uuid': '119850a0-61c2-4050-afd9-709656e65c7b',\n", + " 'hostname': 'database_server',\n", + " 'operating_state': 1,\n", + " 'NICs': {'89cbde58-4726-4a8b-8de0-fb5bdcdf615b': {'uuid': '89cbde58-4726-4a8b-8de0-fb5bdcdf615b',\n", + " 'ip_adress': '192.168.1.14',\n", + " 'subnet_mask': '255.255.255.0',\n", + " 'mac_address': '51:46:0d:52:99:9d',\n", + " 'speed': 100,\n", + " 'mtu': 1500,\n", + " 'wake_on_lan': False,\n", + " 'enabled': True}},\n", + " 'file_system': {'uuid': 'af425e71-5437-4de4-b1f2-e7c36d9cff06',\n", + " 'folders': {'root': {'uuid': 'e75401ee-e311-4519-8d63-f1c04376fb18',\n", + " 'name': 'root',\n", + " 'files': {},\n", + " 'is_quarantined': False},\n", + " 'database': {'uuid': '6ff67dbf-69ee-465e-935b-3c557c716702',\n", + " 'name': 'database',\n", + " 'files': {'database.db': {'uuid': '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4',\n", + " 'name': 'database.db',\n", + " 'size': 12288,\n", + " 'file_type': 'DB'}},\n", + " 'is_quarantined': False}}},\n", + " 'applications': {},\n", + " 'services': {'d2090e0c-1080-4a4e-98af-489f2c7b5370': {'uuid': 'd2090e0c-1080-4a4e-98af-489f2c7b5370',\n", + " 'health_state': 'GOOD',\n", + " 'health_state_red_view': 'GOOD',\n", + " 'criticality': 'LOWEST',\n", + " 'patching_count': 0,\n", + " 'scanning_count': 0,\n", + " 'revealed_to_red': False,\n", + " 'installing_count': 0,\n", + " 'max_sessions': 1,\n", + " 'tcp': True,\n", + " 'udp': True,\n", + " 'port': 5432,\n", + " 'operating_state': 'STOPPED'}},\n", + " 'process': {}}" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "db_serv.describe_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -96,16 +157,16 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "115" + "129" ] }, - "execution_count": 4, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -116,14 +177,14 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'enable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'disable'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'scan'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'checkhash'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'repair'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'restore'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'scan'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'shutdown'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'startup'], ['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'reset'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'scan'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'checkhash'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'repair'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'restore'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'scan'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'shutdown'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'startup'], ['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'reset'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'scan'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'checkhash'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'repair'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'restore'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'scan'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'shutdown'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'startup'], ['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'reset'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'enable'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'disable'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'scan'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'checkhash'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'repair'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'restore'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'scan'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'shutdown'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'startup'], ['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'reset'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'enable'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'disable'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'scan'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'checkhash'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'repair'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'restore'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'scan'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'shutdown'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'startup'], ['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'reset'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'enable'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'disable'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'scan'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'checkhash'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'repair'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'restore'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'scan'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'shutdown'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'startup'], ['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'reset'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'enable'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'disable'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'checkhash'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'delete'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'repair'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'restore'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'scan'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'shutdown'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'startup'], ['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'reset'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'enable'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'disable'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'scan'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'checkhash'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'repair'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'restore'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'scan'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'shutdown'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'startup'], ['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'reset'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'enable'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'disable'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'scan'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'checkhash'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'repair'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'restore'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'scan'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'shutdown'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'startup'], ['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'reset'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'enable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'disable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'enable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'disable'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'scan'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'checkhash'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'repair'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'restore'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'scan'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'shutdown'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'startup'], ['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'reset']]\n" + "[['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'scan'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'checkhash'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'repair'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'restore'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'scan'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'shutdown'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'startup'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'reset'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'scan'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'checkhash'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'repair'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'restore'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'scan'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'shutdown'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'startup'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'reset'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'scan'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'checkhash'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'repair'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'restore'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'scan'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'shutdown'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'startup'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'reset'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'enable'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'disable'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'scan'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'checkhash'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'repair'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'restore'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'scan'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'shutdown'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'startup'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'reset'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'enable'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'disable'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'scan'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'checkhash'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'repair'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'restore'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'scan'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'shutdown'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'startup'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'reset'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'enable'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'disable'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'scan'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'checkhash'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'repair'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'restore'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'scan'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'shutdown'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'startup'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'reset'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'compromise'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'stop'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'start'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'pause'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'resume'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'restart'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'disable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'enable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'enable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'disable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'delete'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'delete'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'shutdown'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'startup'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'reset'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'enable'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'disable'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'scan'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'checkhash'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'repair'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'restore'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'scan'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'shutdown'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'startup'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'reset'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'enable'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'disable'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'scan'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'checkhash'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'repair'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'restore'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'scan'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'shutdown'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'startup'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'reset'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'enable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'disable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'enable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'disable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'scan'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'checkhash'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'repair'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'restore'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'scan'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'shutdown'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'startup'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'reset']]\n" ] } ], @@ -133,128 +194,142 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'enable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '9f5dfd4a-2727-466d-b7ab-6d4f18e0ce2b', 'disable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'enable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '7ba299f5-1d94-4f9d-a286-8fe3b903a581', 'disable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'enable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '022a1240-844d-4099-930d-052e0452472e', 'disable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'enable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', '829ff3c6-7e0b-4d28-93bf-b6dc2abd8e2a', 'disable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'enable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'nic', 'ea185a03-8b34-4347-b0d7-ca2ed61303b4', 'disable']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'scan']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'checkhash']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'repair']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'file_system', 'folder', '2615763e-d91b-46a5-982b-a21a18d7e02c', 'restore']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'scan']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'shutdown']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'startup']\n", - "['node', '72a46527-b4c6-4a51-a935-06b9a97c51da', 'reset']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'scan']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'checkhash']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'repair']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'file_system', 'folder', '7afde692-db6f-4ca7-a806-629daf0d8098', 'restore']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'scan']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'shutdown']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'startup']\n", - "['node', '8efa0ed9-bbe8-4d8a-985a-6e8f281f4527', 'reset']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'scan']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'checkhash']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'repair']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'file_system', 'folder', '75cc4623-27c3-49c8-9ce3-220bbaf7e56a', 'restore']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'scan']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'shutdown']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'startup']\n", - "['node', 'f80d3953-2165-48c9-935a-5ce65549f0fd', 'reset']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'enable']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'nic', 'b9b3406a-3a46-4ce7-99d2-6eef00c01b17', 'disable']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'scan']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'checkhash']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'repair']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'file_system', 'folder', '8703d164-fee6-4014-8472-268066bface1', 'restore']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'scan']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'shutdown']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'startup']\n", - "['node', '7d8f5581-f87b-4623-b9e9-87e0a335c5ca', 'reset']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'enable']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'nic', '428b04e5-03e5-4046-8b4e-6ecf9dc25ff7', 'disable']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'scan']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'checkhash']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'repair']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'file_system', 'folder', 'e3296695-9096-4e92-8dcf-fdbc77956983', 'restore']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'scan']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'shutdown']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'startup']\n", - "['node', '520615e4-0e98-4aef-becf-5be9c22a02e8', 'reset']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'enable']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'nic', 'bc6c1fd1-4bda-4b98-9d5c-382b77879eee', 'disable']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'scan']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'checkhash']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'repair']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'file_system', 'folder', 'b7958051-da38-4a00-a4f2-8596fee9904d', 'restore']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'scan']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'shutdown']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'startup']\n", - "['node', '36f21fb5-9c5f-4b03-8797-a925b4a4edb0', 'reset']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'enable']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'nic', '795ba4b5-a910-444d-b9f8-31944ea4ff17', 'disable']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'scan']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'checkhash']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'repair']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', '70edd316-e521-4b09-9b9e-362558422439', 'restore']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'scan']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'checkhash']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'repair']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'folder', 'ee3d96b6-20b3-41d0-bbb1-70e7a7add2c0', 'restore']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'scan']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'checkhash']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'delete']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'repair']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'file_system', 'file', 'deaeb707-de1b-4040-9462-f59941c5afd3', 'restore']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'scan']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'shutdown']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'startup']\n", - "['node', '0b14139f-d0d8-4656-b9de-587c53357d4c', 'reset']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'enable']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'nic', 'aa5c5909-bf8c-4dce-8664-a74e9454cc4a', 'disable']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'scan']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'checkhash']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'repair']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'file_system', 'folder', '4b2f461c-ef93-4910-acc4-006d518c0d6e', 'restore']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'scan']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'shutdown']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'startup']\n", - "['node', '6c5cdd15-fdf8-4695-8462-8b8704ef616b', 'reset']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'enable']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'nic', '21f32886-65e9-40a0-9483-a86e94dc0a3b', 'disable']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'scan']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'checkhash']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'repair']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'file_system', 'folder', '9580a6b2-eeff-400a-948e-e8f3694dada0', 'restore']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'scan']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'shutdown']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'startup']\n", - "['node', 'f8e4eebc-30b7-4d54-bbef-959e456a7649', 'reset']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'enable']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', 'a1287e24-97c6-4007-93ae-c6b5176f4fbe', 'disable']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'enable']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'nic', '174b908b-e214-4efa-8837-d84924dad75f', 'disable']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'scan']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'checkhash']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'repair']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'file_system', 'folder', '23d89e95-f6af-428d-809b-68c43c0d098a', 'restore']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'scan']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'shutdown']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'startup']\n", - "['node', '87190295-f369-49f4-ae7e-b5aced13bdf1', 'reset']\n" + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'enable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'disable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'enable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'disable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'enable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'disable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'enable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'disable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'enable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'disable']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'scan']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'checkhash']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'repair']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'restore']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'scan']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'shutdown']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'startup']\n", + "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'reset']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'scan']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'checkhash']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'repair']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'restore']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'scan']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'shutdown']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'startup']\n", + "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'reset']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'scan']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'checkhash']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'repair']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'restore']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'scan']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'shutdown']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'startup']\n", + "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'reset']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'enable']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'disable']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'scan']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'checkhash']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'repair']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'restore']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'scan']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'shutdown']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'startup']\n", + "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'reset']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'enable']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'disable']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'scan']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'checkhash']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'repair']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'restore']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'scan']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'shutdown']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'startup']\n", + "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'reset']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'enable']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'disable']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'scan']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'checkhash']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'repair']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'restore']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'scan']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'shutdown']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'startup']\n", + "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'reset']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'compromise']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'stop']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'start']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'pause']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'resume']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'restart']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'disable']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'enable']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'enable']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'disable']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'checkhash']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'repair']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'restore']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'checkhash']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'repair']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'restore']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'checkhash']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'delete']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'repair']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'restore']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'checkhash']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'delete']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'repair']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'restore']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'scan']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'shutdown']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'startup']\n", + "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'reset']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'enable']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'disable']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'scan']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'checkhash']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'repair']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'restore']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'scan']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'shutdown']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'startup']\n", + "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'reset']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'enable']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'disable']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'scan']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'checkhash']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'repair']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'restore']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'scan']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'shutdown']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'startup']\n", + "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'reset']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'enable']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'disable']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'enable']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'disable']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'scan']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'checkhash']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'repair']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'restore']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'scan']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'shutdown']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'startup']\n", + "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'reset']\n" ] } ], diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index 73e7b20c..c346ddf5 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -139,7 +139,6 @@ class NIC(SimComponent): "speed": self.speed, "mtu": self.mtu, "wake_on_lan": self.wake_on_lan, - "dns_servers": self.dns_servers, "enabled": self.enabled, } ) diff --git a/src/primaite/simulator/system/software.py b/src/primaite/simulator/system/software.py index 70c1bbf2..a112eccf 100644 --- a/src/primaite/simulator/system/software.py +++ b/src/primaite/simulator/system/software.py @@ -204,7 +204,7 @@ class IOSoftware(Software): "max_sessions": self.max_sessions, "tcp": self.tcp, "udp": self.udp, - "ports": [port.name for port in self.ports], # TODO: not sure if this should be port.name or port.value + "port": self.port.value, } ) return state From 898123cb10b80020622e39085d0f084df38a571f Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 11:46:02 +0100 Subject: [PATCH 09/15] Stub out more actions --- src/primaite/simulator/file_system/file_system.py | 3 +++ src/primaite/simulator/network/hardware/base.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/primaite/simulator/file_system/file_system.py b/src/primaite/simulator/file_system/file_system.py index cbe30c96..91e98b35 100644 --- a/src/primaite/simulator/file_system/file_system.py +++ b/src/primaite/simulator/file_system/file_system.py @@ -339,6 +339,8 @@ class Folder(FileSystemItemABC): am.add_action("checkhash", Action(func=lambda request, context: ...)) # TODO implement action am.add_action("repair", Action(func=lambda request, context: ...)) # TODO implement action am.add_action("restore", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("delete", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("corrupt", Action(func=lambda request, context: ...)) # TODO implement action return am @@ -515,6 +517,7 @@ class File(FileSystemItemABC): am.add_action("delete", Action(func=lambda request, context: ...)) # TODO implement action am.add_action("repair", Action(func=lambda request, context: ...)) # TODO implement action am.add_action("restore", Action(func=lambda request, context: ...)) # TODO implement action + am.add_action("corrupt", Action(func=lambda request, context: ...)) # TODO implement action return am diff --git a/src/primaite/simulator/network/hardware/base.py b/src/primaite/simulator/network/hardware/base.py index c346ddf5..a14d6a6d 100644 --- a/src/primaite/simulator/network/hardware/base.py +++ b/src/primaite/simulator/network/hardware/base.py @@ -966,6 +966,8 @@ class Node(SimComponent): am.add_action("shutdown", Action(func=lambda request, context: self.power_off())) am.add_action("startup", Action(func=lambda request, context: self.power_on())) am.add_action("reset", Action(func=lambda request, context: ...)) # TODO implement node reset + am.add_action("logon", Action(func=lambda request, context: ...)) # TODO implement logon action + am.add_action("logoff", Action(func=lambda request, context: ...)) # TODO implement logoff action return am From 3ee5e22b24ee4bd65160815f70c8875d9bc83bde Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 12:48:55 +0100 Subject: [PATCH 10/15] Add router action --- .../network/hardware/nodes/router.py | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/primaite/simulator/network/hardware/nodes/router.py b/src/primaite/simulator/network/hardware/nodes/router.py index 092680a7..53b9b176 100644 --- a/src/primaite/simulator/network/hardware/nodes/router.py +++ b/src/primaite/simulator/network/hardware/nodes/router.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Tuple, Union from prettytable import MARKDOWN, PrettyTable -from primaite.simulator.core import SimComponent +from primaite.simulator.core import Action, ActionManager, SimComponent from primaite.simulator.network.hardware.base import ARPCache, ICMP, NIC, Node from primaite.simulator.network.transmission.data_link_layer import EthernetHeader, Frame from primaite.simulator.network.transmission.network_layer import ICMPPacket, ICMPType, IPPacket, IPProtocol @@ -87,6 +87,36 @@ class AccessControlList(SimComponent): super().__init__(**kwargs) self._acl = [None] * (self.max_acl_rules - 1) + def _init_action_manager(self) -> ActionManager: + am = super()._init_action_manager() + + # When the request reaches this action, it should now contain solely positional args for the 'add_rule' action. + # POSITIONAL ARGUMENTS: + # 0: action (str name of an ACLAction) + # 1: protocol (str name of an IPProtocol) + # 2: source ip address (str castable to IPV4Address (e.g. '10.10.1.2')) + # 3: source port (str name of a Port (e.g. "HTTP")) # should we be using value, such as 80 or 443? + # 4: destination ip address (str castable to IPV4Address (e.g. '10.10.1.2')) + # 5: destination port (str name of a Port (e.g. "HTTP")) + # 6: position (int) + am.add_action( + "add_rule", + Action( + func=lambda request, context: self.add_rule( + ACLAction[request[0]], + IPProtocol[request[1]], + IPv4Address[request[2]], + Port[request[3]], + IPv4Address[request[4]], + Port[request[5]], + int(request[6]), + ) + ), + ) + + am.add_action("remove_rule", Action(func=lambda request, context: self.remove_rule(int(request[0])))) + return am + def describe_state(self) -> Dict: """ Describes the current state of the AccessControlList. @@ -596,6 +626,11 @@ class Router(Node): self.arp.nics = self.nics self.icmp.arp = self.arp + def _init_action_manager(self) -> ActionManager: + am = super()._init_action_manager() + am.add_action("acl", Action(func=self.acl._action_manager)) + return am + def _get_port_of_nic(self, target_nic: NIC) -> Optional[int]: """ Retrieve the port number for a given NIC. From d523ccc3cb61b21086bcd1b31b4d5ac3517fc8c6 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 14:23:14 +0100 Subject: [PATCH 11/15] Improve docs on action system --- docs/source/action_system.rst | 82 ++++++ docs/source/simulation.rst | 1 + src/primaite/notebooks/scratch.ipynb | 370 +++++++++++++++------------ 3 files changed, 291 insertions(+), 162 deletions(-) create mode 100644 docs/source/action_system.rst diff --git a/docs/source/action_system.rst b/docs/source/action_system.rst new file mode 100644 index 00000000..e79ef348 --- /dev/null +++ b/docs/source/action_system.rst @@ -0,0 +1,82 @@ +.. only:: comment + + © Crown-owned copyright 2023, Defence Science and Technology Laboratory UK + +Actions System +============== + +`SimComponent`s in the simulation are decoupled from the agent training logic. However, they still need a managed means of accepting requests to perform actions. For this, they use `ActionManager` and `Action`. + +Just like other aspects of SimComponent, the actions are not managed centrally for the whole simulation, but instead they are dynamically created and updated based on the nodes, links, and other components that currently exist. This was achieved with the following design decisions: + +- API + An 'action' contains two elements: + 1. `request` - selects which action you want to take on this `SimComponent`. This is formatted as a list of strings such as `['network', 'node', '', 'service', '', 'restart']`. + 2. `context` - optional extra information that can be used to decide how to process the action. This is formatted as a dictionary. For example, if the action requires authentication, the context can include information about the user that initiated the request to decide if their permissions are sufficient. + +- request + The request is a list of strings which help specify who should handle the request. The strings in the request list help ActionManagers traverse the 'ownership tree' of SimComponent. The example given above would be handled in the following way: + 1. `Simulation` receives `['network', 'node', '', 'service', '', 'restart']`. + The first element of the action is `network`, therefore it passes the action down to its network. + 2. `Network` receives `['node', '', 'service', '', 'restart']`. + The first element of the action is `node`, therefore the network looks at the node uuid and passes the action down to the node with that uuid. + 3. `Node` receives `['service', '', 'restart']`. + The first element of the action is `service`, therefore the node looks at the service uuid and passes the rest of the action to the service with that uuid. + 4. `Service` receives `['restart']`. + Since `restart` is a defined action in the service's own ActionManager, the service performs a restart. + +Techincal Detail +================ + +This system was achieved by implementing two classes, :py:class:`primaite.simulator.core.Action`, and :py:class:`primaite.simulator.core.ActionManager`. + +Action +------ + +The `Action` object stores a reference to a method that performs the action, for example a node could have an action that stores a reference to `self.turn_on()`. Techincally, this can be any callable that accepts `request, context` as it's parameters. In practice, this is often defined using `lambda` functions within a component's `self._init_action_manager()` method. Optionally, the `Action` object can also hold a validator that will permit/deny the action depending on context. + +ActionManager +------------- + +The `ActionManager` object stores a mapping between strings and actions. It is responsible for processing the `request` and passing it down the ownership tree. Techincally, the `ActionManager` is itself a callable that accepts `request, context` tuple, and so it can be chained with other action managers. + +A simple example without chaining can be seen in the :py:class:`primaite.simulator.file_system.file_system.File` class. + +.. code-block:: python + + class File(FileSystemItemABC): + ... + def _init_action_manager(self): + ... + action_manager.add_action("scan", Action(func=lambda request, context: self.scan())) + action_manager.add_action("repair", Action(func=lambda request, context: self.repair())) + action_manager.add_action("restore", Action(func=lambda request, context: self.restore())) + +*ellipses (`...`) used to omit code impertinent to this explanation* + +Chaining ActionManagers +----------------------- + +Since the method for performing an action needs to accept `request, context` as parameters, and ActionManager itself is a callable that accepts `request, context` as parameters, it possible to use ActionManager as an action. In fact, that is how PrimAITE deals with traversing the ownership tree. Each time an ActionManager accepts a request, it pops the first elements and uses it to decide to which Action it should send the remaining request. However, the Action could have another ActionManager as it's function, therefore the request will be routed again. Each time the request is passed to a new action manager, the first element is popped. + +An example of how this works is in the :py:class:`primaite.simulator.network.hardware.base.Node` class. + +.. code-block:: python + + class Node(SimComponent): + ... + def _init_action_manager(self): + ... + # a regular action which is processed by the Node itself + action_manager.add_action("turn_on", Action(func=lambda request, context: self.turn_on())) + + # if the Node receives a request where the first word is 'service', it will use a dummy manager called self._service_action_manager to pass on the reqeust to the relevant service. This dummy manager is simply here to map the service UUID that that service's own action manager. This is done because the next string after "service" is always the uuid of that service, so we need an actionmanager to pop that string before sending it onto the relevant service's ActionManager. + self._service_action_manager = ActionManager() + action_manager.add_action("service", Action(func=self._service_action_manager)) + ... + + def install_service(self, service): + self.services[service.uuid] = service + ... + # Here, the service UUID is registered to allow passing actions between the node and the service. + self._service_action_manager.add_action(service.uuid, Action(func=service._action_manager)) diff --git a/docs/source/simulation.rst b/docs/source/simulation.rst index e5c0d2c8..8671a2d2 100644 --- a/docs/source/simulation.rst +++ b/docs/source/simulation.rst @@ -23,3 +23,4 @@ Contents simulation_components/network/network simulation_components/system/internal_frame_processing simulation_components/system/software + action_system diff --git a/src/primaite/notebooks/scratch.ipynb b/src/primaite/notebooks/scratch.ipynb index f7b29fa4..1b94c5e4 100644 --- a/src/primaite/notebooks/scratch.ipynb +++ b/src/primaite/notebooks/scratch.ipynb @@ -20,17 +20,17 @@ "name": "stderr", "output_type": "stream", "text": [ - "2023-09-19 11:26:37,748: Added node 9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,750: Added node e0f81131-2c42-4182-99a7-695e9016c518 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,757: Added node 524ebdb4-ed76-4e8e-8cd6-babbf0d02f69 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,762: Added node 1e78d3ae-8eb7-4bb7-830e-dcf7fc000625 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,768: Added node fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,773: Added node 40b4845a-11a7-41a7-9ab7-1fb80b1799b3 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,778: Added node 119850a0-61c2-4050-afd9-709656e65c7b to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,966: Added node f7c983b1-0374-4280-be8f-2eae561dbf08 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,983: Added node 8479b2e0-9f97-47ea-a2e0-483ad604439f to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,991: Added node a2d78848-9e70-4824-bd91-9a6915988e38 to Network f9af7826-619c-4d9c-949c-ec2f4815cb46\n", - "2023-09-19 11:26:37,995::ERROR::primaite.simulator.network.hardware.base::176::NIC 68:3b:a1:83:01:a1/192.168.10.110 cannot be enabled as it is not connected to a Link\n" + "2023-09-19 12:47:23,225: Added node d3242ce1-43b7-40b7-86f3-f0473f1bbaec to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,227: Added node 67a2f88b-448c-416d-9fbd-02629347aabd to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,232: Added node 8d69c19e-69ad-41bd-9525-bdefb680a9e2 to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,237: Added node c29ebde3-9748-4a97-b8a0-1673cbd53b62 to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,248: Added node f734ac26-40b3-4380-ad37-f8782202a628 to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,256: Added node 23785fbc-7d27-4697-bd06-937fcbb63e87 to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,262: Added node 1ceaff86-bccd-4a06-81e0-0c616c803eab to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,356: Added node 854b2562-1dc2-4dd4-9e50-8f079ba2971c to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,371: Added node 211e8c06-b3f9-48f1-9627-62a7e81e34d3 to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,376: Added node b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c to Network 49f27f36-ea3d-4b3c-8e21-87c8ed489fff\n", + "2023-09-19 12:47:23,380::ERROR::primaite.simulator.network.hardware.base::175::NIC 84:42:75:c8:10:28/192.168.10.110 cannot be enabled as it is not connected to a Link\n" ] } ], @@ -47,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -56,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -65,7 +65,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -74,14 +74,14 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-09-19 11:35:45,008: Added service d2090e0c-1080-4a4e-98af-489f2c7b5370 to node 119850a0-61c2-4050-afd9-709656e65c7b\n" + "2023-09-19 12:47:26,764: Added service 6a8c0179-3ea6-48c1-bc97-259bb5853118 to node 1ceaff86-bccd-4a06-81e0-0c616c803eab\n" ] } ], @@ -91,37 +91,37 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "{'uuid': '119850a0-61c2-4050-afd9-709656e65c7b',\n", + "{'uuid': '1ceaff86-bccd-4a06-81e0-0c616c803eab',\n", " 'hostname': 'database_server',\n", " 'operating_state': 1,\n", - " 'NICs': {'89cbde58-4726-4a8b-8de0-fb5bdcdf615b': {'uuid': '89cbde58-4726-4a8b-8de0-fb5bdcdf615b',\n", + " 'NICs': {'4b53abce-74ca-4015-868e-3c7dc2f29117': {'uuid': '4b53abce-74ca-4015-868e-3c7dc2f29117',\n", " 'ip_adress': '192.168.1.14',\n", " 'subnet_mask': '255.255.255.0',\n", - " 'mac_address': '51:46:0d:52:99:9d',\n", + " 'mac_address': '7b:9e:4e:29:2b:ca',\n", " 'speed': 100,\n", " 'mtu': 1500,\n", " 'wake_on_lan': False,\n", " 'enabled': True}},\n", - " 'file_system': {'uuid': 'af425e71-5437-4de4-b1f2-e7c36d9cff06',\n", - " 'folders': {'root': {'uuid': 'e75401ee-e311-4519-8d63-f1c04376fb18',\n", + " 'file_system': {'uuid': '0b831f3b-a3df-40cc-ab5b-21a3f22f4b68',\n", + " 'folders': {'root': {'uuid': 'a388f22b-0a4d-465d-b5f6-e98ff9564483',\n", " 'name': 'root',\n", " 'files': {},\n", " 'is_quarantined': False},\n", - " 'database': {'uuid': '6ff67dbf-69ee-465e-935b-3c557c716702',\n", + " 'database': {'uuid': 'c13d8734-9e01-42f6-84d7-4ea36424663d',\n", " 'name': 'database',\n", - " 'files': {'database.db': {'uuid': '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4',\n", + " 'files': {'database.db': {'uuid': '213ed482-6028-44ff-a6ab-45e5800ac1a1',\n", " 'name': 'database.db',\n", " 'size': 12288,\n", " 'file_type': 'DB'}},\n", " 'is_quarantined': False}}},\n", " 'applications': {},\n", - " 'services': {'d2090e0c-1080-4a4e-98af-489f2c7b5370': {'uuid': 'd2090e0c-1080-4a4e-98af-489f2c7b5370',\n", + " 'services': {'6a8c0179-3ea6-48c1-bc97-259bb5853118': {'uuid': '6a8c0179-3ea6-48c1-bc97-259bb5853118',\n", " 'health_state': 'GOOD',\n", " 'health_state_red_view': 'GOOD',\n", " 'criticality': 'LOWEST',\n", @@ -137,7 +137,7 @@ " 'process': {}}" ] }, - "execution_count": 17, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -148,7 +148,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -157,16 +157,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "129" + "175" ] }, - "execution_count": 19, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -177,14 +177,14 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'enable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'disable'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'scan'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'checkhash'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'repair'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'restore'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'scan'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'shutdown'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'startup'], ['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'reset'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'scan'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'checkhash'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'repair'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'restore'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'scan'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'shutdown'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'startup'], ['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'reset'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'scan'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'checkhash'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'repair'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'restore'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'scan'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'shutdown'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'startup'], ['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'reset'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'enable'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'disable'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'scan'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'checkhash'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'repair'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'restore'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'scan'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'shutdown'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'startup'], ['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'reset'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'enable'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'disable'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'scan'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'checkhash'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'repair'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'restore'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'scan'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'shutdown'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'startup'], ['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'reset'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'enable'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'disable'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'scan'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'checkhash'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'repair'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'restore'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'scan'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'shutdown'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'startup'], ['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'reset'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'compromise'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'stop'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'start'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'pause'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'resume'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'restart'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'disable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'enable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'enable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'disable'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'delete'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'checkhash'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'delete'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'repair'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'restore'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'scan'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'shutdown'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'startup'], ['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'reset'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'enable'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'disable'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'scan'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'checkhash'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'repair'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'restore'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'scan'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'shutdown'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'startup'], ['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'reset'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'enable'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'disable'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'scan'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'checkhash'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'repair'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'restore'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'scan'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'shutdown'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'startup'], ['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'reset'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'enable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'disable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'enable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'disable'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'scan'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'checkhash'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'repair'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'restore'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'scan'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'shutdown'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'startup'], ['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'reset']]\n" + "[['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'cbb4c7b4-d218-41e0-a871-64cf087afbbf', 'enable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'cbb4c7b4-d218-41e0-a871-64cf087afbbf', 'disable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'b26668a8-3ac4-4a0f-8c85-f7776d773f4b', 'enable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'b26668a8-3ac4-4a0f-8c85-f7776d773f4b', 'disable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '2cb97c78-2819-48be-8ab1-a938c67731e7', 'enable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '2cb97c78-2819-48be-8ab1-a938c67731e7', 'disable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'af5fd9d3-de73-4595-a3c5-c79530415a82', 'enable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'af5fd9d3-de73-4595-a3c5-c79530415a82', 'disable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '5c9195e7-82f9-4486-9747-162fbcc31f93', 'enable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '5c9195e7-82f9-4486-9747-162fbcc31f93', 'disable'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'scan'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'checkhash'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'repair'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'restore'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'delete'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'corrupt'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'scan'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'shutdown'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'startup'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'reset'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'logon'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'logoff'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'acl', 'add_rule'], ['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'acl', 'remove_rule'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'scan'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'checkhash'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'repair'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'restore'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'delete'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'corrupt'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'scan'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'shutdown'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'startup'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'reset'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'logon'], ['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'logoff'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'scan'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'checkhash'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'repair'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'restore'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'delete'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'corrupt'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'scan'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'shutdown'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'startup'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'reset'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'logon'], ['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'logoff'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'nic', '77c037a4-5d66-4275-b34a-3690f0df1fb3', 'enable'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'nic', '77c037a4-5d66-4275-b34a-3690f0df1fb3', 'disable'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'scan'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'checkhash'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'repair'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'restore'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'delete'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'corrupt'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'scan'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'shutdown'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'startup'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'reset'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'logon'], ['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'logoff'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'nic', 'b6bb225c-5782-4374-8e9c-f8ae611c6300', 'enable'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'nic', 'b6bb225c-5782-4374-8e9c-f8ae611c6300', 'disable'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'scan'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'checkhash'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'repair'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'restore'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'delete'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'corrupt'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'scan'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'shutdown'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'startup'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'reset'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'logon'], ['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'logoff'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'nic', 'b6b13073-88ff-4153-ac3d-89475aaa8974', 'enable'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'nic', 'b6b13073-88ff-4153-ac3d-89475aaa8974', 'disable'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'scan'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'checkhash'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'repair'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'restore'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'delete'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'corrupt'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'scan'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'shutdown'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'startup'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'reset'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'logon'], ['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'logoff'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'compromise'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'stop'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'start'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'pause'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'resume'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'restart'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'disable'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'enable'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'nic', '4b53abce-74ca-4015-868e-3c7dc2f29117', 'enable'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'nic', '4b53abce-74ca-4015-868e-3c7dc2f29117', 'disable'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'checkhash'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'repair'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'restore'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'delete'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'corrupt'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'checkhash'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'repair'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'restore'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'delete'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'corrupt'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'checkhash'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'delete'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'repair'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'restore'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'corrupt'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'checkhash'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'delete'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'repair'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'restore'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'corrupt'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'scan'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'shutdown'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'startup'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'reset'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'logon'], ['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'logoff'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'nic', '229b368c-55f5-463b-bafc-d6a804aa0e85', 'enable'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'nic', '229b368c-55f5-463b-bafc-d6a804aa0e85', 'disable'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'scan'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'checkhash'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'repair'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'restore'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'delete'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'corrupt'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'scan'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'shutdown'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'startup'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'reset'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'logon'], ['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'logoff'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'nic', 'e291339e-d212-4807-b475-e779042de3f5', 'enable'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'nic', 'e291339e-d212-4807-b475-e779042de3f5', 'disable'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'scan'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'checkhash'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'repair'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'restore'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'delete'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'corrupt'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'scan'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'shutdown'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'startup'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'reset'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'logon'], ['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'logoff'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '2b2a29e6-f56f-4328-9376-34d0cdb30d8d', 'enable'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '2b2a29e6-f56f-4328-9376-34d0cdb30d8d', 'disable'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '3b2d0133-9fa0-4872-a449-9f2bb0337b49', 'enable'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '3b2d0133-9fa0-4872-a449-9f2bb0337b49', 'disable'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'scan'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'checkhash'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'repair'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'restore'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'delete'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'corrupt'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'scan'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'shutdown'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'startup'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'reset'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'logon'], ['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'logoff']]\n" ] } ], @@ -194,142 +194,188 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'enable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '1b9ef60a-371c-43b9-af56-d0ddb220189e', 'disable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'enable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '41e2ffb4-3d19-4824-a665-6f6fa68afcd1', 'disable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'enable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', 'c61a3021-876b-491b-a3af-4e8955f26fc4', 'disable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'enable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '217f5929-bb4c-4e4d-b564-efd805be5733', 'disable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'enable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'nic', '29708cc6-008e-4db1-b50f-cf4f9246c3e2', 'disable']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'scan']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'checkhash']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'repair']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'file_system', 'folder', 'aeb786fe-145b-4be5-baba-da1d47cf85e9', 'restore']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'scan']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'shutdown']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'startup']\n", - "['node', '9a63b1cf-1700-4ea9-94fa-4cdefb7f94a4', 'reset']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'scan']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'checkhash']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'repair']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'file_system', 'folder', '08438583-8fd3-4239-851d-b851042bd9a4', 'restore']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'scan']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'shutdown']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'startup']\n", - "['node', 'e0f81131-2c42-4182-99a7-695e9016c518', 'reset']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'scan']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'checkhash']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'repair']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'file_system', 'folder', 'a2333863-f204-4f10-99ad-5ecadd9e0a3e', 'restore']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'scan']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'shutdown']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'startup']\n", - "['node', '524ebdb4-ed76-4e8e-8cd6-babbf0d02f69', 'reset']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'enable']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'nic', '27a09b26-0912-4de1-8fac-afefd06668a7', 'disable']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'scan']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'checkhash']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'repair']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'file_system', 'folder', '8e9d5646-e151-4902-91e4-58cf6026dccc', 'restore']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'scan']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'shutdown']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'startup']\n", - "['node', '1e78d3ae-8eb7-4bb7-830e-dcf7fc000625', 'reset']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'enable']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'nic', '34050ee7-c5a0-42c3-9be3-f55d6668443d', 'disable']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'scan']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'checkhash']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'repair']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'file_system', 'folder', 'd2fedd6f-4604-42f8-baa4-125db2a62495', 'restore']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'scan']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'shutdown']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'startup']\n", - "['node', 'fa1bc1f8-8d28-49a2-bf06-bac6ffdeacf5', 'reset']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'enable']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'nic', 'd0748224-7123-48a7-a0ab-1775ad3390e2', 'disable']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'scan']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'checkhash']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'repair']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'file_system', 'folder', '3387bfee-5beb-4a1c-9320-52fddf0a24cb', 'restore']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'scan']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'shutdown']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'startup']\n", - "['node', '40b4845a-11a7-41a7-9ab7-1fb80b1799b3', 'reset']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'compromise']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'stop']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'start']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'pause']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'resume']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'restart']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'disable']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'service', 'd2090e0c-1080-4a4e-98af-489f2c7b5370', 'enable']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'enable']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'nic', '89cbde58-4726-4a8b-8de0-fb5bdcdf615b', 'disable']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'checkhash']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'repair']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', 'e75401ee-e311-4519-8d63-f1c04376fb18', 'restore']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'checkhash']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'repair']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'folder', '6ff67dbf-69ee-465e-935b-3c557c716702', 'restore']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'checkhash']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'delete']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'repair']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', 'c677e354-e93d-44c1-abe3-e6ab148627e2', 'restore']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'checkhash']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'delete']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'repair']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'file_system', 'file', '840c0b5d-e1fb-4500-8769-0a0ea9b1c5f4', 'restore']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'scan']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'shutdown']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'startup']\n", - "['node', '119850a0-61c2-4050-afd9-709656e65c7b', 'reset']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'enable']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'nic', 'c6b8769b-c411-497c-a2e6-b4b46d805d8a', 'disable']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'scan']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'checkhash']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'repair']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'file_system', 'folder', 'e1d27b2a-b7a6-4ebf-bbf3-7e23e9e160a4', 'restore']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'scan']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'shutdown']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'startup']\n", - "['node', 'f7c983b1-0374-4280-be8f-2eae561dbf08', 'reset']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'enable']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'nic', 'e72aa295-6132-424c-8892-75f4c9999c8e', 'disable']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'scan']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'checkhash']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'repair']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'file_system', 'folder', '91a8fc8b-fbcc-4752-bb08-017d9d266279', 'restore']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'scan']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'shutdown']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'startup']\n", - "['node', '8479b2e0-9f97-47ea-a2e0-483ad604439f', 'reset']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'enable']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', '2f3f3ba3-4722-4fe7-9a60-96d55f737c77', 'disable']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'enable']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'nic', 'a4e26b3a-981c-4d77-8f39-dcfc88639da7', 'disable']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'scan']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'checkhash']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'repair']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'file_system', 'folder', '113499d8-b41c-405b-b8c9-44444e87e9d1', 'restore']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'scan']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'shutdown']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'startup']\n", - "['node', 'a2d78848-9e70-4824-bd91-9a6915988e38', 'reset']\n" + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'cbb4c7b4-d218-41e0-a871-64cf087afbbf', 'enable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'cbb4c7b4-d218-41e0-a871-64cf087afbbf', 'disable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'b26668a8-3ac4-4a0f-8c85-f7776d773f4b', 'enable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'b26668a8-3ac4-4a0f-8c85-f7776d773f4b', 'disable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '2cb97c78-2819-48be-8ab1-a938c67731e7', 'enable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '2cb97c78-2819-48be-8ab1-a938c67731e7', 'disable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'af5fd9d3-de73-4595-a3c5-c79530415a82', 'enable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', 'af5fd9d3-de73-4595-a3c5-c79530415a82', 'disable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '5c9195e7-82f9-4486-9747-162fbcc31f93', 'enable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'nic', '5c9195e7-82f9-4486-9747-162fbcc31f93', 'disable']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'scan']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'checkhash']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'repair']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'restore']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'delete']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'file_system', 'folder', '1fd6018b-6619-4408-8a38-acff04f6febe', 'corrupt']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'scan']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'shutdown']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'startup']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'reset']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'logon']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'logoff']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'acl', 'add_rule']\n", + "['node', 'd3242ce1-43b7-40b7-86f3-f0473f1bbaec', 'acl', 'remove_rule']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'scan']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'checkhash']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'repair']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'restore']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'delete']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'file_system', 'folder', '92080f30-ee19-4083-ae03-f9305201911d', 'corrupt']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'scan']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'shutdown']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'startup']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'reset']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'logon']\n", + "['node', '67a2f88b-448c-416d-9fbd-02629347aabd', 'logoff']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'scan']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'checkhash']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'repair']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'restore']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'delete']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'file_system', 'folder', '7141f9fd-9727-4159-b489-c0f5bec703fb', 'corrupt']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'scan']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'shutdown']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'startup']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'reset']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'logon']\n", + "['node', '8d69c19e-69ad-41bd-9525-bdefb680a9e2', 'logoff']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'nic', '77c037a4-5d66-4275-b34a-3690f0df1fb3', 'enable']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'nic', '77c037a4-5d66-4275-b34a-3690f0df1fb3', 'disable']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'scan']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'checkhash']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'repair']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'restore']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'delete']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'file_system', 'folder', 'ac6ca8f7-c8c5-4fc6-8cb0-70c664c9095f', 'corrupt']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'scan']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'shutdown']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'startup']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'reset']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'logon']\n", + "['node', 'c29ebde3-9748-4a97-b8a0-1673cbd53b62', 'logoff']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'nic', 'b6bb225c-5782-4374-8e9c-f8ae611c6300', 'enable']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'nic', 'b6bb225c-5782-4374-8e9c-f8ae611c6300', 'disable']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'scan']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'checkhash']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'repair']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'restore']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'delete']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'file_system', 'folder', '99089070-8984-41d1-b9bf-bcf9da9e859b', 'corrupt']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'scan']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'shutdown']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'startup']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'reset']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'logon']\n", + "['node', 'f734ac26-40b3-4380-ad37-f8782202a628', 'logoff']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'nic', 'b6b13073-88ff-4153-ac3d-89475aaa8974', 'enable']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'nic', 'b6b13073-88ff-4153-ac3d-89475aaa8974', 'disable']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'scan']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'checkhash']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'repair']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'restore']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'delete']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'file_system', 'folder', 'bcab8f58-4d62-48db-924a-a5a45fa215cf', 'corrupt']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'scan']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'shutdown']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'startup']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'reset']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'logon']\n", + "['node', '23785fbc-7d27-4697-bd06-937fcbb63e87', 'logoff']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'compromise']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'stop']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'start']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'pause']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'resume']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'restart']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'disable']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'service', '6a8c0179-3ea6-48c1-bc97-259bb5853118', 'enable']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'nic', '4b53abce-74ca-4015-868e-3c7dc2f29117', 'enable']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'nic', '4b53abce-74ca-4015-868e-3c7dc2f29117', 'disable']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'checkhash']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'repair']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'restore']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'delete']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'a388f22b-0a4d-465d-b5f6-e98ff9564483', 'corrupt']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'checkhash']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'repair']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'restore']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'delete']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'folder', 'c13d8734-9e01-42f6-84d7-4ea36424663d', 'corrupt']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'checkhash']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'delete']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'repair']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'restore']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', 'ab96a3a6-1779-4789-99a1-fa31dd252121', 'corrupt']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'checkhash']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'delete']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'repair']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'restore']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'file_system', 'file', '213ed482-6028-44ff-a6ab-45e5800ac1a1', 'corrupt']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'scan']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'shutdown']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'startup']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'reset']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'logon']\n", + "['node', '1ceaff86-bccd-4a06-81e0-0c616c803eab', 'logoff']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'nic', '229b368c-55f5-463b-bafc-d6a804aa0e85', 'enable']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'nic', '229b368c-55f5-463b-bafc-d6a804aa0e85', 'disable']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'scan']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'checkhash']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'repair']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'restore']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'delete']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'file_system', 'folder', '7147bb84-83cd-4c53-ae33-ffb28ac29f03', 'corrupt']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'scan']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'shutdown']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'startup']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'reset']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'logon']\n", + "['node', '854b2562-1dc2-4dd4-9e50-8f079ba2971c', 'logoff']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'nic', 'e291339e-d212-4807-b475-e779042de3f5', 'enable']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'nic', 'e291339e-d212-4807-b475-e779042de3f5', 'disable']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'scan']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'checkhash']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'repair']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'restore']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'delete']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'file_system', 'folder', '287266f2-395a-401c-85b3-4b67e05642d3', 'corrupt']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'scan']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'shutdown']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'startup']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'reset']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'logon']\n", + "['node', '211e8c06-b3f9-48f1-9627-62a7e81e34d3', 'logoff']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '2b2a29e6-f56f-4328-9376-34d0cdb30d8d', 'enable']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '2b2a29e6-f56f-4328-9376-34d0cdb30d8d', 'disable']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '3b2d0133-9fa0-4872-a449-9f2bb0337b49', 'enable']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'nic', '3b2d0133-9fa0-4872-a449-9f2bb0337b49', 'disable']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'scan']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'checkhash']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'repair']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'restore']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'delete']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'file_system', 'folder', '34eb8fde-6450-4d87-8136-65c35f11b9a9', 'corrupt']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'scan']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'shutdown']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'startup']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'reset']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'logon']\n", + "['node', 'b2aea8d0-a7fe-4d81-a63d-c40851ab1d9c', 'logoff']\n" ] } ], From 68f67f13da153f1ebb520d69db889fa287ed5cc7 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 15:13:51 +0100 Subject: [PATCH 12/15] Fix formatting on docs for actions. --- docs/source/action_system.rst | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/source/action_system.rst b/docs/source/action_system.rst index e79ef348..b527bff9 100644 --- a/docs/source/action_system.rst +++ b/docs/source/action_system.rst @@ -11,11 +11,13 @@ Just like other aspects of SimComponent, the actions are not managed centrally f - API An 'action' contains two elements: + 1. `request` - selects which action you want to take on this `SimComponent`. This is formatted as a list of strings such as `['network', 'node', '', 'service', '', 'restart']`. 2. `context` - optional extra information that can be used to decide how to process the action. This is formatted as a dictionary. For example, if the action requires authentication, the context can include information about the user that initiated the request to decide if their permissions are sufficient. - request The request is a list of strings which help specify who should handle the request. The strings in the request list help ActionManagers traverse the 'ownership tree' of SimComponent. The example given above would be handled in the following way: + 1. `Simulation` receives `['network', 'node', '', 'service', '', 'restart']`. The first element of the action is `network`, therefore it passes the action down to its network. 2. `Network` receives `['node', '', 'service', '', 'restart']`. @@ -70,7 +72,11 @@ An example of how this works is in the :py:class:`primaite.simulator.network.har # a regular action which is processed by the Node itself action_manager.add_action("turn_on", Action(func=lambda request, context: self.turn_on())) - # if the Node receives a request where the first word is 'service', it will use a dummy manager called self._service_action_manager to pass on the reqeust to the relevant service. This dummy manager is simply here to map the service UUID that that service's own action manager. This is done because the next string after "service" is always the uuid of that service, so we need an actionmanager to pop that string before sending it onto the relevant service's ActionManager. + # if the Node receives a request where the first word is 'service', it will use a dummy manager + # called self._service_action_manager to pass on the reqeust to the relevant service. This dummy + # manager is simply here to map the service UUID that that service's own action manager. This is + # done because the next string after "service" is always the uuid of that service, so we need an + # actionmanager to pop that string before sending it onto the relevant service's ActionManager. self._service_action_manager = ActionManager() action_manager.add_action("service", Action(func=self._service_action_manager)) ... From 93476554a9e09fd68800bafb399f571a6945f790 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 15:17:13 +0100 Subject: [PATCH 13/15] Undo experimental changes to request format --- src/primaite/simulator/core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index 78e6139f..df9d17ea 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -42,7 +42,7 @@ class Action(BaseModel): the action can be performed or not. """ - func: Callable[[Dict], None] + func: Callable[[List[str], Dict], None] """ ``func`` is a function that accepts a request and a context dict. Typically this would be a lambda function that invokes a class method of your SimComponent. For example if the component is a node and the action is for @@ -74,7 +74,7 @@ class ActionManager(BaseModel): actions: Dict[str, Action] = {} """maps action verb to an action object.""" - def __call__(self, request: Dict, context: Dict) -> None: + def __call__(self, request: Callable[[List[str], Dict], None], context: Dict) -> None: """ Process an action request. From 682091b4ba2fe9df1a6bb651585de4da167d4ece Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 15:30:02 +0100 Subject: [PATCH 14/15] Remove redundant method --- src/primaite/simulator/core.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index df9d17ea..ceba88c9 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -200,14 +200,6 @@ class SimComponent(BaseModel): } return state - def possible_actions(self) -> List[List[str]]: - """Enumerate all actions that this component can accept. - - :return: List of all action strings that can be passed to this component. - :rtype: List[Dict[str]] - """ - action_list = ActionManager # TODO: extract possible actions? how to do this neatly? - def apply_action(self, action: List[str], context: Dict = {}) -> None: """ Apply an action to a simulation component. Action data is passed in as a 'namespaced' list of strings. From 860b3fb8018de91f1f3f1c8a0129d3df51ce2105 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Tue, 19 Sep 2023 16:11:42 +0100 Subject: [PATCH 15/15] Add test to new action functionliaty --- src/primaite/simulator/core.py | 4 +- .../test_action_integration.py | 55 +++++++++++++++++++ .../test_permission_system.py | 6 +- 3 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 tests/integration_tests/component_creation/test_action_integration.py diff --git a/src/primaite/simulator/core.py b/src/primaite/simulator/core.py index ceba88c9..a292be18 100644 --- a/src/primaite/simulator/core.py +++ b/src/primaite/simulator/core.py @@ -218,9 +218,9 @@ class SimComponent(BaseModel): :param: context: Dict containing context for actions :type context: Dict """ - if self.action_manager is None: + if self._action_manager is None: return - self.action_manager(action, context) + self._action_manager(action, context) def apply_timestep(self, timestep: int) -> None: """ diff --git a/tests/integration_tests/component_creation/test_action_integration.py b/tests/integration_tests/component_creation/test_action_integration.py new file mode 100644 index 00000000..eb18110d --- /dev/null +++ b/tests/integration_tests/component_creation/test_action_integration.py @@ -0,0 +1,55 @@ +import pytest + +from primaite.simulator.core import Action +from primaite.simulator.network.hardware.nodes.computer import Computer +from primaite.simulator.network.hardware.nodes.server import Server +from primaite.simulator.network.hardware.nodes.switch import Switch +from primaite.simulator.sim_container import Simulation +from primaite.simulator.system.services.database_service import DatabaseService + + +def test_passing_actions_down(monkeypatch) -> None: + """Check that an action is passed down correctly to the child component.""" + + sim = Simulation() + + pc1 = Computer(hostname="PC-1", ip_address="10.10.1.1", subnet_mask="255.255.255.0") + pc2 = Computer(hostname="PC-2", ip_address="10.10.1.2", subnet_mask="255.255.255.0") + srv = Server(hostname="WEBSERVER", ip_address="10.10.1.100", subnet_mask="255.255.255.0") + s1 = Switch(hostname="switch1") + + for n in [pc1, pc2, srv, s1]: + sim.network.add_node(n) + + database_service = DatabaseService(file_system=srv.file_system) + srv.install_service(database_service) + + downloads_folder = pc1.file_system.create_folder("downloads") + pc1.file_system.create_file("bermuda_triangle.png", folder_name="downloads") + + sim.network.connect(pc1.ethernet_port[1], s1.switch_ports[1]) + sim.network.connect(pc2.ethernet_port[1], s1.switch_ports[2]) + sim.network.connect(s1.switch_ports[3], srv.ethernet_port[1]) + + # call this method to make sure no errors occur. + sim._action_manager.get_action_tree() + + # patch the action to do something which we can check the result of. + action_invoked = False + + def succeed(): + nonlocal action_invoked + action_invoked = True + + monkeypatch.setitem( + downloads_folder._action_manager.actions, "repair", Action(func=lambda request, context: succeed()) + ) + + assert not action_invoked + + # call the patched method + sim.apply_action( + ["network", "node", pc1.uuid, "file_system", "folder", pc1.file_system.get_folder("downloads").uuid, "repair"] + ) + + assert action_invoked diff --git a/tests/integration_tests/component_creation/test_permission_system.py b/tests/integration_tests/component_creation/test_permission_system.py index 6816ba84..57e0b35a 100644 --- a/tests/integration_tests/component_creation/test_permission_system.py +++ b/tests/integration_tests/component_creation/test_permission_system.py @@ -7,6 +7,7 @@ from primaite.simulator.core import Action, ActionManager, AllowAllValidator, Si from primaite.simulator.domain.controller import AccountGroup, GroupMembershipValidator +@pytest.mark.skip(reason="Action validation is not currently a required feature.") def test_group_action_validation() -> None: """ Check that actions are denied when an unauthorised request is made. @@ -28,9 +29,9 @@ def test_group_action_validation() -> None: def __init__(self, **kwargs): super().__init__(**kwargs) - self.action_manager = ActionManager() + self._action_manager = ActionManager() - self.action_manager.add_action( + self._action_manager.add_action( "create_folder", Action( func=lambda request, context: self.create_folder(request[0]), @@ -62,6 +63,7 @@ def test_group_action_validation() -> None: assert my_node.folders[0].name == "memes" +@pytest.mark.skip(reason="Action validation is not currently a required feature.") def test_hierarchical_action_with_validation() -> None: """ Check that validation works with sub-objects.