diff --git a/monkey/infection_monkey/transport/__init__.py b/monkey/infection_monkey/transport/__init__.py index 960bce311..b59fc76f9 100644 --- a/monkey/infection_monkey/transport/__init__.py +++ b/monkey/infection_monkey/transport/__init__.py @@ -1 +1,2 @@ from infection_monkey.transport.http import LockedHTTPServer +from .island_api_client import IslandApiClient diff --git a/monkey/infection_monkey/transport/island_api_client.py b/monkey/infection_monkey/transport/island_api_client.py new file mode 100644 index 000000000..19a4033bc --- /dev/null +++ b/monkey/infection_monkey/transport/island_api_client.py @@ -0,0 +1,39 @@ +import logging + +import requests + +from common.common_consts.timeouts import MEDIUM_REQUEST_TIMEOUT +from infection_monkey.transport.island_api_client_errors import ( + IslandAPIConnectionError, + IslandAPIError, + IslandAPITimeoutError, +) + +logger = logging.getLogger(__name__) + + +class IslandApiClient: + """ + Represents Island API client + """ + + def __init__(self, island_server: str): + """ + Tries to connect to the island. + + :param island_server: String representing the island ip address and port + :raises IslandAPIError: + """ + + try: + requests.get( # noqa: DUO123 + f"https://{island_server}/api?action=is-up", + verify=False, + timeout=MEDIUM_REQUEST_TIMEOUT, + ) + except requests.exceptions.ConnectionError as err: + raise IslandAPIConnectionError(err) + except TimeoutError as err: + raise IslandAPITimeoutError(err) + except Exception as err: + raise IslandAPIError(err) diff --git a/monkey/tests/unit_tests/infection_monkey/transport/test_island_api_client.py b/monkey/tests/unit_tests/infection_monkey/transport/test_island_api_client.py new file mode 100644 index 000000000..819dd0ab4 --- /dev/null +++ b/monkey/tests/unit_tests/infection_monkey/transport/test_island_api_client.py @@ -0,0 +1,30 @@ +import pytest +import requests +import requests_mock + +from infection_monkey.transport import IslandApiClient +from infection_monkey.transport.island_api_client_errors import ( + IslandAPIConnectionError, + IslandAPIError, + IslandAPITimeoutError, +) + +SERVER = "1.1.1.1:9999" + +ISLAND_URI = f"https://{SERVER}/api?action=is-up" + + +@pytest.mark.parametrize( + "actual_error, expected_error", + [ + (requests.exceptions.ConnectionError, IslandAPIConnectionError), + (TimeoutError, IslandAPITimeoutError), + (Exception, IslandAPIError), + ], +) +def test_island_api_client(actual_error, expected_error): + with requests_mock.Mocker() as m: + m.get(ISLAND_URI, exc=actual_error) + + with pytest.raises(expected_error): + IslandApiClient(SERVER) diff --git a/vulture_allowlist.py b/vulture_allowlist.py index 5abcf4452..a29efe83e 100644 --- a/vulture_allowlist.py +++ b/vulture_allowlist.py @@ -9,6 +9,8 @@ from common.agent_configuration.agent_sub_configurations import ( ) from common.credentials import Credentials, LMHash, NTHash from infection_monkey.exploit.log4shell_utils.ldap_server import LDAPServerFactory +from infection_monkey.transport import IslandApiClient +from infection_monkey.transport.island_api_client_errors import IslandAPIRequestFailedError from monkey_island.cc.event_queue import IslandEventTopic, PyPubSubIslandEventQueue from monkey_island.cc.models import Report from monkey_island.cc.models.networkmap import Arc, NetworkMap @@ -328,3 +330,7 @@ CC_TUNNEL IslandEventTopic.AGENT_CONNECTED IslandEventTopic.CLEAR_SIMULATION_DATA IslandEventTopic.RESET_AGENT_CONFIGURATION + +# TODO: Remove after #2292 is closed +IslandApiClient +IslandAPIRequestFailedError