Merge '2887-Align_Node_Types' into 3062-discriminators
This commit is contained in:
@@ -25,7 +25,8 @@ def router_with_acl_rules():
|
||||
|
||||
:return: A configured Router object with ACL rules.
|
||||
"""
|
||||
router = Router("Router")
|
||||
router_cfg = {"hostname": "router_1", "type": "router"}
|
||||
router = Router.from_config(config=router_cfg)
|
||||
acl = router.acl
|
||||
# Add rules here as needed
|
||||
acl.add_rule(
|
||||
@@ -62,7 +63,8 @@ def router_with_wildcard_acl():
|
||||
|
||||
:return: A Router object with configured ACL rules, including rules with wildcard masking.
|
||||
"""
|
||||
router = Router("Router")
|
||||
router_cfg = {"hostname": "router_1", "type": "router"}
|
||||
router = Router.from_config(config=router_cfg)
|
||||
acl = router.acl
|
||||
# Rule to permit traffic from a specific source IP and port to a specific destination IP and port
|
||||
acl.add_rule(
|
||||
@@ -243,7 +245,8 @@ def test_ip_traffic_from_specific_subnet():
|
||||
- Traffic from outside the 192.168.1.0/24 subnet is denied.
|
||||
"""
|
||||
|
||||
router = Router("Router")
|
||||
router_cfg = {"hostname": "router_1", "type": "router"}
|
||||
router = Router.from_config(config=router_cfg)
|
||||
acl = router.acl
|
||||
# Add rules here as needed
|
||||
acl.add_rule(
|
||||
|
||||
@@ -50,9 +50,9 @@ def test_wireless_router_from_config():
|
||||
},
|
||||
}
|
||||
|
||||
rt = Router.from_config(cfg=cfg)
|
||||
rt = Router.from_config(config=cfg)
|
||||
|
||||
assert rt.num_ports == 6
|
||||
assert rt.config.num_ports == 6
|
||||
|
||||
assert rt.network_interface[1].ip_address == IPv4Address("192.168.1.1")
|
||||
assert rt.network_interface[1].subnet_mask == IPv4Address("255.255.255.0")
|
||||
|
||||
@@ -7,7 +7,8 @@ from primaite.simulator.network.hardware.nodes.network.switch import Switch
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def switch() -> Switch:
|
||||
switch: Switch = Switch(hostname="switch_1", num_ports=8, start_up_duration=0)
|
||||
switch_cfg = {"type": "switch", "hostname": "switch_1", "num_ports": 8, "start_up_duration": 0}
|
||||
switch: Switch = Switch.from_config(config=switch_cfg)
|
||||
switch.power_on()
|
||||
switch.show()
|
||||
return switch
|
||||
|
||||
@@ -7,7 +7,10 @@ from primaite.simulator.network.hardware.nodes.host.computer import Computer
|
||||
|
||||
@pytest.fixture
|
||||
def node() -> Node:
|
||||
return Computer(hostname="test", ip_address="192.168.1.2", subnet_mask="255.255.255.0")
|
||||
computer_cfg = {"type": "computer", "hostname": "test", "ip_address": "192.168.1.2", "subnet_mask": "255.255.255.0"}
|
||||
computer = Computer.from_config(config=computer_cfg)
|
||||
|
||||
return computer
|
||||
|
||||
|
||||
def test_nic_enabled_validator(node):
|
||||
|
||||
@@ -12,7 +12,16 @@ from tests.conftest import DummyApplication, DummyService
|
||||
|
||||
@pytest.fixture
|
||||
def node() -> Node:
|
||||
return Computer(hostname="test", ip_address="192.168.1.2", subnet_mask="255.255.255.0")
|
||||
computer_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "test",
|
||||
"ip_address": "192.168.1.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"operating_state": "OFF",
|
||||
}
|
||||
computer = Computer.from_config(config=computer_cfg)
|
||||
|
||||
return computer
|
||||
|
||||
|
||||
def test_node_startup(node):
|
||||
@@ -166,7 +175,7 @@ def test_node_is_on_validator(node):
|
||||
"""Test that the node is on validator."""
|
||||
node.power_on()
|
||||
|
||||
for i in range(node.start_up_duration + 1):
|
||||
for i in range(node.config.start_up_duration + 1):
|
||||
node.apply_timestep(i)
|
||||
|
||||
validator = Node._NodeIsOnValidator(node=node)
|
||||
@@ -174,7 +183,7 @@ def test_node_is_on_validator(node):
|
||||
assert validator(request=[], context={})
|
||||
|
||||
node.power_off()
|
||||
for i in range(node.shut_down_duration + 1):
|
||||
for i in range(node.config.shut_down_duration + 1):
|
||||
node.apply_timestep(i)
|
||||
|
||||
assert validator(request=[], context={}) is False
|
||||
@@ -184,7 +193,7 @@ def test_node_is_off_validator(node):
|
||||
"""Test that the node is on validator."""
|
||||
node.power_on()
|
||||
|
||||
for i in range(node.start_up_duration + 1):
|
||||
for i in range(node.config.start_up_duration + 1):
|
||||
node.apply_timestep(i)
|
||||
|
||||
validator = Node._NodeIsOffValidator(node=node)
|
||||
@@ -192,7 +201,7 @@ def test_node_is_off_validator(node):
|
||||
assert validator(request=[], context={}) is False
|
||||
|
||||
node.power_off()
|
||||
for i in range(node.shut_down_duration + 1):
|
||||
for i in range(node.config.shut_down_duration + 1):
|
||||
node.apply_timestep(i)
|
||||
|
||||
assert validator(request=[], context={})
|
||||
|
||||
@@ -61,12 +61,12 @@ def test_apply_timestep_to_nodes(network):
|
||||
client_1.power_off()
|
||||
assert client_1.operating_state is NodeOperatingState.SHUTTING_DOWN
|
||||
|
||||
for i in range(client_1.shut_down_duration + 1):
|
||||
for i in range(client_1.config.shut_down_duration + 1):
|
||||
network.apply_timestep(timestep=i)
|
||||
|
||||
assert client_1.operating_state is NodeOperatingState.OFF
|
||||
|
||||
network.apply_timestep(client_1.shut_down_duration + 2)
|
||||
network.apply_timestep(client_1.config.shut_down_duration + 2)
|
||||
assert client_1.operating_state is NodeOperatingState.OFF
|
||||
|
||||
|
||||
@@ -74,7 +74,16 @@ def test_removing_node_that_does_not_exist(network):
|
||||
"""Node that does not exist on network should not affect existing nodes."""
|
||||
assert len(network.nodes) is 7
|
||||
|
||||
network.remove_node(Computer(hostname="new_node", ip_address="192.168.1.2", subnet_mask="255.255.255.0"))
|
||||
network.remove_node(
|
||||
Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "new_node",
|
||||
"ip_address": "192.168.1.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
}
|
||||
)
|
||||
)
|
||||
assert len(network.nodes) is 7
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ def _assert_valid_creation(net: Network, lan_name, subnet_base, pcs_ip_block_sta
|
||||
num_routers = 1 if include_router else 0
|
||||
total_nodes = num_pcs + num_switches + num_routers
|
||||
|
||||
assert all((n.hostname.endswith(lan_name) for n in net.nodes.values()))
|
||||
assert all((n.config.hostname.endswith(lan_name) for n in net.nodes.values()))
|
||||
assert len(net.computer_nodes) == num_pcs
|
||||
assert len(net.switch_nodes) == num_switches
|
||||
assert len(net.router_nodes) == num_routers
|
||||
|
||||
@@ -16,19 +16,27 @@ def basic_c2_network() -> Network:
|
||||
network = Network()
|
||||
|
||||
# Creating two generic nodes for the C2 Server and the C2 Beacon.
|
||||
computer_a_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "computer_a",
|
||||
"ip_address": "192.168.0.1",
|
||||
"subnet_mask": "255.255.255.252",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
computer_a = Computer.from_config(config=computer_a_cfg)
|
||||
|
||||
computer_a = Computer(
|
||||
hostname="computer_a",
|
||||
ip_address="192.168.0.1",
|
||||
subnet_mask="255.255.255.252",
|
||||
start_up_duration=0,
|
||||
)
|
||||
computer_a.power_on()
|
||||
computer_a.software_manager.install(software_class=C2Server)
|
||||
|
||||
computer_b = Computer(
|
||||
hostname="computer_b", ip_address="192.168.0.2", subnet_mask="255.255.255.252", start_up_duration=0
|
||||
)
|
||||
computer_b_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "computer_b",
|
||||
"ip_address": "192.168.0.2",
|
||||
"subnet_mask": "255.255.255.252",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
computer_b = Computer.from_config(config=computer_b_cfg)
|
||||
|
||||
computer_b.power_on()
|
||||
computer_b.software_manager.install(software_class=C2Beacon)
|
||||
|
||||
@@ -12,9 +12,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def dos_bot() -> DoSBot:
|
||||
computer = Computer(
|
||||
hostname="compromised_pc", ip_address="192.168.0.1", subnet_mask="255.255.255.0", start_up_duration=0
|
||||
)
|
||||
computer_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "compromised_pc",
|
||||
"ip_address": "192.168.0.1",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
computer: Computer = Computer.from_config(config=computer_cfg)
|
||||
|
||||
computer.power_on()
|
||||
computer.software_manager.install(DoSBot)
|
||||
|
||||
@@ -34,7 +40,7 @@ def test_dos_bot_cannot_run_when_node_offline(dos_bot):
|
||||
|
||||
dos_bot_node.power_off()
|
||||
|
||||
for i in range(dos_bot_node.shut_down_duration + 1):
|
||||
for i in range(dos_bot_node.config.shut_down_duration + 1):
|
||||
dos_bot_node.apply_timestep(timestep=i)
|
||||
|
||||
assert dos_bot_node.operating_state is NodeOperatingState.OFF
|
||||
|
||||
@@ -17,13 +17,27 @@ from primaite.simulator.system.services.database.database_service import Databas
|
||||
def database_client_on_computer() -> Tuple[DatabaseClient, Computer]:
|
||||
network = Network()
|
||||
|
||||
db_server = Server(hostname="db_server", ip_address="192.168.0.1", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
db_server: Server = Server.from_config(
|
||||
config={
|
||||
"type": "server",
|
||||
"hostname": "db_server",
|
||||
"ip_address": "192.168.0.1",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
db_server.power_on()
|
||||
db_server.software_manager.install(DatabaseService)
|
||||
db_server.software_manager.software["database-service"].start()
|
||||
|
||||
db_client = Computer(
|
||||
hostname="db_client", ip_address="192.168.0.2", subnet_mask="255.255.255.0", start_up_duration=0
|
||||
db_client: Computer = Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "db_client",
|
||||
"ip_address": "192.168.0.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
db_client.power_on()
|
||||
db_client.software_manager.install(DatabaseClient)
|
||||
|
||||
@@ -12,13 +12,17 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def web_browser() -> WebBrowser:
|
||||
computer = Computer(
|
||||
hostname="web_client",
|
||||
ip_address="192.168.1.11",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
computer_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "web_client",
|
||||
"ip_address": "192.168.1.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
computer: Computer = Computer.from_config(config=computer_cfg)
|
||||
|
||||
computer.power_on()
|
||||
# Web Browser should be pre-installed in computer
|
||||
web_browser: WebBrowser = computer.software_manager.software.get("web-browser")
|
||||
@@ -28,13 +32,17 @@ def web_browser() -> WebBrowser:
|
||||
|
||||
|
||||
def test_create_web_client():
|
||||
computer = Computer(
|
||||
hostname="web_client",
|
||||
ip_address="192.168.1.11",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
computer_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "web_client",
|
||||
"ip_address": "192.168.1.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
computer: Computer = Computer.from_config(config=computer_cfg)
|
||||
|
||||
computer.power_on()
|
||||
# Web Browser should be pre-installed in computer
|
||||
web_browser: WebBrowser = computer.software_manager.software.get("web-browser")
|
||||
|
||||
@@ -8,7 +8,15 @@ from primaite.simulator.system.services.database.database_service import Databas
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def database_server() -> Node:
|
||||
node = Computer(hostname="db_node", ip_address="192.168.1.2", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
node_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "db_node",
|
||||
"ip_address": "192.168.1.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
node = Computer.from_config(config=node_cfg)
|
||||
node.power_on()
|
||||
node.software_manager.install(DatabaseService)
|
||||
node.software_manager.software.get("database-service").start()
|
||||
|
||||
@@ -14,13 +14,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def dns_client() -> Computer:
|
||||
node = Computer(
|
||||
hostname="dns_client",
|
||||
ip_address="192.168.1.11",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
dns_server=IPv4Address("192.168.1.10"),
|
||||
)
|
||||
node_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "dns_client",
|
||||
"ip_address": "192.168.1.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"dns_server": IPv4Address("192.168.1.10"),
|
||||
}
|
||||
node = Computer.from_config(config=node_cfg)
|
||||
return node
|
||||
|
||||
|
||||
@@ -34,6 +36,16 @@ def test_create_dns_client(dns_client):
|
||||
|
||||
def test_dns_client_add_domain_to_cache_when_not_running(dns_client):
|
||||
dns_client_service: DNSClient = dns_client.software_manager.software.get("dns-client")
|
||||
|
||||
# shutdown the dns_client
|
||||
dns_client.power_off()
|
||||
|
||||
# wait for dns_client to turn off
|
||||
idx = 0
|
||||
while dns_client.operating_state == NodeOperatingState.SHUTTING_DOWN:
|
||||
dns_client.apply_timestep(idx)
|
||||
idx += 1
|
||||
|
||||
assert dns_client.operating_state is NodeOperatingState.OFF
|
||||
assert dns_client_service.operating_state is ServiceOperatingState.STOPPED
|
||||
|
||||
@@ -61,7 +73,7 @@ def test_dns_client_check_domain_exists_when_not_running(dns_client):
|
||||
|
||||
dns_client.power_off()
|
||||
|
||||
for i in range(dns_client.shut_down_duration + 1):
|
||||
for i in range(dns_client.config.shut_down_duration + 1):
|
||||
dns_client.apply_timestep(timestep=i)
|
||||
|
||||
assert dns_client.operating_state is NodeOperatingState.OFF
|
||||
|
||||
@@ -16,13 +16,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def dns_server() -> Node:
|
||||
node = Server(
|
||||
hostname="dns_server",
|
||||
ip_address="192.168.1.10",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
node_cfg = {
|
||||
"type": "server",
|
||||
"hostname": "dns_server",
|
||||
"ip_address": "192.168.1.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
node = Server.from_config(config=node_cfg)
|
||||
node.power_on()
|
||||
node.software_manager.install(software_class=DNSServer)
|
||||
return node
|
||||
@@ -55,9 +57,16 @@ def test_dns_server_receive(dns_server):
|
||||
# register the web server in the domain controller
|
||||
dns_server_service.dns_register(domain_name="real-domain.com", domain_ip_address=IPv4Address("192.168.1.12"))
|
||||
|
||||
client = Computer(hostname="client", ip_address="192.168.1.11", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
client_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "client",
|
||||
"ip_address": "192.168.1.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
client = Computer.from_config(config=client_cfg)
|
||||
client.power_on()
|
||||
client.dns_server = IPv4Address("192.168.1.10")
|
||||
client.config.dns_server = IPv4Address("192.168.1.10")
|
||||
network = Network()
|
||||
network.connect(dns_server.network_interface[1], client.network_interface[1])
|
||||
dns_client: DNSClient = client.software_manager.software["dns-client"] # noqa
|
||||
|
||||
@@ -16,13 +16,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def ftp_client() -> Node:
|
||||
node = Computer(
|
||||
hostname="ftp_client",
|
||||
ip_address="192.168.1.11",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
node_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "ftp_client",
|
||||
"ip_address": "192.168.1.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
node = Computer.from_config(config=node_cfg)
|
||||
node.power_on()
|
||||
return node
|
||||
|
||||
@@ -94,7 +96,7 @@ def test_offline_ftp_client_receives_request(ftp_client):
|
||||
ftp_client_service: FTPClient = ftp_client.software_manager.software.get("ftp-client")
|
||||
ftp_client.power_off()
|
||||
|
||||
for i in range(ftp_client.shut_down_duration + 1):
|
||||
for i in range(ftp_client.config.shut_down_duration + 1):
|
||||
ftp_client.apply_timestep(timestep=i)
|
||||
|
||||
assert ftp_client.operating_state is NodeOperatingState.OFF
|
||||
|
||||
@@ -14,13 +14,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def ftp_server() -> Node:
|
||||
node = Server(
|
||||
hostname="ftp_server",
|
||||
ip_address="192.168.1.10",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
node_cfg = {
|
||||
"type": "server",
|
||||
"hostname": "ftp_server",
|
||||
"ip_address": "192.168.1.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
node = Server.from_config(config=node_cfg)
|
||||
node.power_on()
|
||||
node.software_manager.install(software_class=FTPServer)
|
||||
return node
|
||||
|
||||
@@ -12,6 +12,7 @@ from primaite.simulator.network.hardware.nodes.host.server import Server
|
||||
from primaite.simulator.network.hardware.nodes.network.router import ACLAction, Router
|
||||
from primaite.simulator.network.hardware.nodes.network.switch import Switch
|
||||
from primaite.simulator.network.hardware.nodes.network.wireless_router import WirelessRouter
|
||||
from primaite.simulator.network.networks import arcd_uc2_network
|
||||
from primaite.simulator.network.protocols.ssh import (
|
||||
SSHConnectionMessage,
|
||||
SSHPacket,
|
||||
@@ -29,8 +30,14 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def terminal_on_computer() -> Tuple[Terminal, Computer]:
|
||||
computer: Computer = Computer(
|
||||
hostname="node_a", ip_address="192.168.0.10", subnet_mask="255.255.255.0", start_up_duration=0
|
||||
computer: Computer = Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "node_a",
|
||||
"ip_address": "192.168.0.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
computer.power_on()
|
||||
terminal: Terminal = computer.software_manager.software.get("terminal")
|
||||
@@ -41,11 +48,27 @@ def terminal_on_computer() -> Tuple[Terminal, Computer]:
|
||||
@pytest.fixture(scope="function")
|
||||
def basic_network() -> Network:
|
||||
network = Network()
|
||||
node_a = Computer(hostname="node_a", ip_address="192.168.0.10", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
node_a = Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "node_a",
|
||||
"ip_address": "192.168.0.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
node_a.power_on()
|
||||
node_a.software_manager.get_open_ports()
|
||||
|
||||
node_b = Computer(hostname="node_b", ip_address="192.168.0.11", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
node_b = Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "node_b",
|
||||
"ip_address": "192.168.0.11",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
node_b.power_on()
|
||||
network.connect(node_a.network_interface[1], node_b.network_interface[1])
|
||||
|
||||
@@ -57,18 +80,23 @@ def wireless_wan_network():
|
||||
network = Network()
|
||||
|
||||
# Configure PC A
|
||||
pc_a = Computer(
|
||||
hostname="pc_a",
|
||||
ip_address="192.168.0.2",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.0.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
pc_a_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "pc_a",
|
||||
"ip_address": "192.168.0.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.0.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
pc_a = Computer.from_config(config=pc_a_cfg)
|
||||
pc_a.power_on()
|
||||
network.add_node(pc_a)
|
||||
|
||||
# Configure Router 1
|
||||
router_1 = WirelessRouter(hostname="router_1", start_up_duration=0, airspace=network.airspace)
|
||||
router_1 = WirelessRouter.from_config(
|
||||
config={"type": "wireless_router", "hostname": "router_1", "start_up_duration": 0, "airspace": network.airspace}
|
||||
)
|
||||
router_1.power_on()
|
||||
network.add_node(router_1)
|
||||
|
||||
@@ -88,41 +116,30 @@ def wireless_wan_network():
|
||||
)
|
||||
|
||||
# Configure PC B
|
||||
pc_b = Computer(
|
||||
hostname="pc_b",
|
||||
ip_address="192.168.2.2",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.2.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
|
||||
pc_b_cfg = {
|
||||
"type": "computer",
|
||||
"hostname": "pc_b",
|
||||
"ip_address": "192.168.2.2",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.2.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
|
||||
pc_b = Computer.from_config(config=pc_b_cfg)
|
||||
pc_b.power_on()
|
||||
network.add_node(pc_b)
|
||||
|
||||
# Configure Router 2
|
||||
router_2 = WirelessRouter(hostname="router_2", start_up_duration=0, airspace=network.airspace)
|
||||
router_2.power_on()
|
||||
network.add_node(router_2)
|
||||
|
||||
# Configure the connection between PC B and Router 2 port 2
|
||||
router_2.configure_router_interface("192.168.2.1", "255.255.255.0")
|
||||
network.connect(pc_b.network_interface[1], router_2.network_interface[2])
|
||||
|
||||
# Configure Router 2 ACLs
|
||||
|
||||
# Configure the wireless connection between Router 1 port 1 and Router 2 port 1
|
||||
router_1.configure_wireless_access_point("192.168.1.1", "255.255.255.0")
|
||||
router_2.configure_wireless_access_point("192.168.1.2", "255.255.255.0")
|
||||
|
||||
router_1.route_table.add_route(
|
||||
address="192.168.2.0", subnet_mask="255.255.255.0", next_hop_ip_address="192.168.1.2"
|
||||
)
|
||||
|
||||
# Configure Route from Router 2 to PC A subnet
|
||||
router_2.route_table.add_route(
|
||||
address="192.168.0.2", subnet_mask="255.255.255.0", next_hop_ip_address="192.168.1.1"
|
||||
)
|
||||
|
||||
return pc_a, pc_b, router_1, router_2
|
||||
return network
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -131,7 +148,7 @@ def game_and_agent_fixture(game_and_agent):
|
||||
game, agent = game_and_agent
|
||||
|
||||
client_1: Computer = game.simulation.network.get_node_by_hostname("client_1")
|
||||
client_1.start_up_duration = 3
|
||||
client_1.config.start_up_duration = 3
|
||||
|
||||
return game, agent
|
||||
|
||||
@@ -142,8 +159,16 @@ def test_terminal_creation(terminal_on_computer):
|
||||
|
||||
|
||||
def test_terminal_install_default():
|
||||
"""terminal should be auto installed onto Nodes"""
|
||||
computer = Computer(hostname="node_a", ip_address="192.168.0.10", subnet_mask="255.255.255.0", start_up_duration=0)
|
||||
"""Terminal should be auto installed onto Nodes"""
|
||||
computer: Computer = Computer.from_config(
|
||||
config={
|
||||
"type": "computer",
|
||||
"hostname": "node_a",
|
||||
"ip_address": "192.168.0.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
)
|
||||
computer.power_on()
|
||||
|
||||
assert computer.software_manager.software.get("terminal")
|
||||
@@ -151,7 +176,7 @@ def test_terminal_install_default():
|
||||
|
||||
def test_terminal_not_on_switch():
|
||||
"""Ensure terminal does not auto-install to switch"""
|
||||
test_switch = Switch(hostname="Test")
|
||||
test_switch = Switch.from_config(config={"type": "switch", "hostname": "Test"})
|
||||
|
||||
assert not test_switch.software_manager.software.get("terminal")
|
||||
|
||||
@@ -274,7 +299,10 @@ def test_terminal_ignores_when_off(basic_network):
|
||||
|
||||
def test_computer_remote_login_to_router(wireless_wan_network):
|
||||
"""Test to confirm that a computer can SSH into a router."""
|
||||
pc_a, _, router_1, _ = wireless_wan_network
|
||||
|
||||
pc_a = wireless_wan_network.get_node_by_hostname("pc_a")
|
||||
|
||||
router_1 = wireless_wan_network.get_node_by_hostname("router_1")
|
||||
|
||||
pc_a_terminal: Terminal = pc_a.software_manager.software.get("terminal")
|
||||
|
||||
@@ -293,7 +321,9 @@ def test_computer_remote_login_to_router(wireless_wan_network):
|
||||
|
||||
def test_router_remote_login_to_computer(wireless_wan_network):
|
||||
"""Test to confirm that a router can ssh into a computer."""
|
||||
pc_a, _, router_1, _ = wireless_wan_network
|
||||
pc_a = wireless_wan_network.get_node_by_hostname("pc_a")
|
||||
|
||||
router_1 = wireless_wan_network.get_node_by_hostname("router_1")
|
||||
|
||||
router_1_terminal: Terminal = router_1.software_manager.software.get("terminal")
|
||||
|
||||
@@ -311,8 +341,10 @@ def test_router_remote_login_to_computer(wireless_wan_network):
|
||||
|
||||
|
||||
def test_router_blocks_SSH_traffic(wireless_wan_network):
|
||||
"""Test to check that router will block SSH traffic if no acl rule."""
|
||||
pc_a, _, router_1, _ = wireless_wan_network
|
||||
"""Test to check that router will block SSH traffic if no ACL rule."""
|
||||
pc_a = wireless_wan_network.get_node_by_hostname("pc_a")
|
||||
|
||||
router_1 = wireless_wan_network.get_node_by_hostname("router_1")
|
||||
|
||||
# Remove rule that allows SSH traffic.
|
||||
router_1.acl.remove_rule(position=21)
|
||||
@@ -326,20 +358,22 @@ def test_router_blocks_SSH_traffic(wireless_wan_network):
|
||||
assert len(pc_a_terminal._connections) == 0
|
||||
|
||||
|
||||
def test_SSH_across_network(wireless_wan_network):
|
||||
def test_SSH_across_network():
|
||||
"""Test to show ability to SSH across a network."""
|
||||
pc_a, pc_b, router_1, router_2 = wireless_wan_network
|
||||
network: Network = arcd_uc2_network()
|
||||
pc_a = network.get_node_by_hostname("client_1")
|
||||
router_1 = network.get_node_by_hostname("router_1")
|
||||
|
||||
terminal_a: Terminal = pc_a.software_manager.software.get("terminal")
|
||||
terminal_b: Terminal = pc_b.software_manager.software.get("terminal")
|
||||
terminal_a: Terminal = pc_a.software_manager.software.get("Terminal")
|
||||
|
||||
router_2.acl.add_rule(
|
||||
router_1.acl.add_rule(
|
||||
action=ACLAction.PERMIT, src_port=PORT_LOOKUP["SSH"], dst_port=PORT_LOOKUP["SSH"], position=21
|
||||
)
|
||||
|
||||
assert len(terminal_a._connections) == 0
|
||||
|
||||
terminal_b_on_terminal_a = terminal_b.login(username="admin", password="admin", ip_address="192.168.0.2")
|
||||
# Login to the Domain Controller
|
||||
terminal_a.login(username="admin", password="admin", ip_address="192.168.1.10")
|
||||
|
||||
assert len(terminal_a._connections) == 1
|
||||
|
||||
@@ -357,8 +391,6 @@ def test_multiple_remote_terminals_same_node(basic_network):
|
||||
for attempt in range(3):
|
||||
remote_connection = terminal_a.login(username="admin", password="admin", ip_address="192.168.0.11")
|
||||
|
||||
terminal_a.show()
|
||||
|
||||
assert len(terminal_a._connections) == 3
|
||||
|
||||
|
||||
|
||||
@@ -16,13 +16,15 @@ from primaite.utils.validation.port import PORT_LOOKUP
|
||||
|
||||
@pytest.fixture(scope="function")
|
||||
def web_server() -> Server:
|
||||
node = Server(
|
||||
hostname="web_server",
|
||||
ip_address="192.168.1.10",
|
||||
subnet_mask="255.255.255.0",
|
||||
default_gateway="192.168.1.1",
|
||||
start_up_duration=0,
|
||||
)
|
||||
node_cfg = {
|
||||
"type": "server",
|
||||
"hostname": "web_server",
|
||||
"ip_address": "192.168.1.10",
|
||||
"subnet_mask": "255.255.255.0",
|
||||
"default_gateway": "192.168.1.1",
|
||||
"start_up_duration": 0,
|
||||
}
|
||||
node = Server.from_config(config=node_cfg)
|
||||
node.power_on()
|
||||
node.software_manager.install(WebServer)
|
||||
node.software_manager.software.get("web-server").start()
|
||||
|
||||
Reference in New Issue
Block a user