diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b4eac50c..66a2d865e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -115,6 +115,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/). - "/api/island-configuration" endpoint. #2003 - "-t/--tunnel" from agent command line arguments. #2216 - "/api/monkey-control/neets-to-stop". #2261 +- "GET /api/test/monkey" endpoint. #2269 +- "GET /api/test/log" endpoint. #2269 ### Fixed - A bug in network map page that caused delay of telemetry log loading. #1545 diff --git a/envs/monkey_zoo/blackbox/island_client/monkey_island_client.py b/envs/monkey_zoo/blackbox/island_client/monkey_island_client.py index bc8115db7..4f723e8a7 100644 --- a/envs/monkey_zoo/blackbox/island_client/monkey_island_client.py +++ b/envs/monkey_zoo/blackbox/island_client/monkey_island_client.py @@ -15,7 +15,6 @@ SLEEP_BETWEEN_REQUESTS_SECONDS = 0.5 GET_AGENTS_ENDPOINT = "api/agents" GET_LOG_ENDPOINT = "api/agent-logs" GET_MACHINES_ENDPOINT = "api/machines" -MONKEY_TEST_ENDPOINT = "api/test/monkey" TELEMETRY_TEST_ENDPOINT = "api/test/telemetry" LOGGER = logging.getLogger(__name__) @@ -139,14 +138,6 @@ class MonkeyIslandClient(object): LOGGER.error("Failed to reset island mode") assert False - def find_monkeys_in_db(self, query): - if query is None: - raise TypeError - response = self.requests.get( - MONKEY_TEST_ENDPOINT, MonkeyIslandClient.form_find_query_for_request(query) - ) - return MonkeyIslandClient.get_test_query_results(response) - def find_telems_in_db(self, query: dict): if query is None: raise TypeError @@ -155,12 +146,6 @@ class MonkeyIslandClient(object): ) return MonkeyIslandClient.get_test_query_results(response) - def get_all_monkeys_from_db(self): - response = self.requests.get( - MONKEY_TEST_ENDPOINT, MonkeyIslandClient.form_find_query_for_request(None) - ) - return MonkeyIslandClient.get_test_query_results(response) - def get_agents(self) -> Sequence[Agent]: response = self.requests.get(GET_AGENTS_ENDPOINT) @@ -186,5 +171,5 @@ class MonkeyIslandClient(object): return json.loads(response.content)["results"] def is_all_monkeys_dead(self): - query = {"dead": False} - return len(self.find_monkeys_in_db(query)) == 0 + agents = self.get_agents() + return all((a.stop_time is not None for a in agents)) diff --git a/envs/os_compatibility/test_compatibility.py b/envs/os_compatibility/test_compatibility.py index f43323e19..b6cb81577 100644 --- a/envs/os_compatibility/test_compatibility.py +++ b/envs/os_compatibility/test_compatibility.py @@ -1,3 +1,6 @@ +from ipaddress import IPv4Address +from typing import Collection + import pytest from envs.monkey_zoo.blackbox.island_client.monkey_island_client import MonkeyIslandClient @@ -40,18 +43,17 @@ def island_client(island): @pytest.mark.usefixtures("island_client") # noinspection PyUnresolvedReferences class TestOSCompatibility(object): - def test_os_compat(self, island_client): + def test_os_compat(self, island_client: MonkeyIslandClient): print() - all_monkeys = island_client.get_all_monkeys_from_db() - ips_that_communicated = [] - for monkey in all_monkeys: - for ip in monkey["ip_addresses"]: - if ip in machine_list: - ips_that_communicated.append(ip) - break + ips_that_communicated = self._get_agent_ips(island_client) for ip, os in machine_list.items(): - if ip not in ips_that_communicated: + if IPv4Address(ip) not in ips_that_communicated: print("{} didn't communicate to island".format(os)) if len(ips_that_communicated) < len(machine_list): assert False + + def _get_agent_ips(self, island_client: MonkeyIslandClient) -> Collection[IPv4Address]: + agents = island_client.get_agents() + machines = island_client.get_machines() + return {i.ip for a in agents for i in machines[a.machine_id].network_interfaces} diff --git a/monkey/monkey_island/cc/app.py b/monkey/monkey_island/cc/app.py index 18af5f2a6..63ee6a72b 100644 --- a/monkey/monkey_island/cc/app.py +++ b/monkey/monkey_island/cc/app.py @@ -31,8 +31,6 @@ from monkey_island.cc.resources import ( from monkey_island.cc.resources.AbstractResource import AbstractResource from monkey_island.cc.resources.attack.attack_report import AttackReport from monkey_island.cc.resources.auth import Authenticate, Register, RegistrationStatus, init_jwt -from monkey_island.cc.resources.blackbox.log_blackbox_endpoint import LogBlackboxEndpoint -from monkey_island.cc.resources.blackbox.monkey_blackbox_endpoint import MonkeyBlackboxEndpoint from monkey_island.cc.resources.blackbox.telemetry_blackbox_endpoint import ( TelemetryBlackboxEndpoint, ) @@ -207,8 +205,6 @@ def init_restful_endpoints(api: FlaskDIWrapper): # API Spec: Fix all the following endpoints, see comments in the resource classes # Note: Preferably, the API will provide a rich feature set and allow access to all of the # necessary data. This would make these endpoints obsolete. - api.add_resource(MonkeyBlackboxEndpoint) - api.add_resource(LogBlackboxEndpoint) api.add_resource(TelemetryBlackboxEndpoint) diff --git a/monkey/monkey_island/cc/resources/blackbox/log_blackbox_endpoint.py b/monkey/monkey_island/cc/resources/blackbox/log_blackbox_endpoint.py deleted file mode 100644 index 643b7f592..000000000 --- a/monkey/monkey_island/cc/resources/blackbox/log_blackbox_endpoint.py +++ /dev/null @@ -1,20 +0,0 @@ -from bson import json_util -from flask import request - -from monkey_island.cc.database import database, mongo -from monkey_island.cc.resources.AbstractResource import AbstractResource -from monkey_island.cc.resources.request_authentication import jwt_required - - -class LogBlackboxEndpoint(AbstractResource): - # API Spec: Rename to noun, BlackboxTestsLogs or something - urls = ["/api/test/log"] - - @jwt_required - def get(self): - find_query = json_util.loads(request.args.get("find_query")) - log = mongo.db.log.find_one(find_query) - if not log: - return {"results": None} - log_file = database.gridfs.get(log["file_id"]) - return {"results": log_file.read().decode()} diff --git a/monkey/monkey_island/cc/resources/blackbox/monkey_blackbox_endpoint.py b/monkey/monkey_island/cc/resources/blackbox/monkey_blackbox_endpoint.py deleted file mode 100644 index 4a140f265..000000000 --- a/monkey/monkey_island/cc/resources/blackbox/monkey_blackbox_endpoint.py +++ /dev/null @@ -1,16 +0,0 @@ -from bson import json_util -from flask import request - -from monkey_island.cc.database import mongo -from monkey_island.cc.resources.AbstractResource import AbstractResource -from monkey_island.cc.resources.request_authentication import jwt_required - - -class MonkeyBlackboxEndpoint(AbstractResource): - # API Spec: Rename to noun, BlackboxTestsMonkeys or something - urls = ["/api/test/monkey"] - - @jwt_required - def get(self, **kw): - find_query = json_util.loads(request.args.get("find_query")) - return {"results": list(mongo.db.monkey.find(find_query))}