{
    "id": "AzD8XysWg1BBXCjCDkfq",
    "name": "Add a new configuration setting to the Agent ⚙",
    "task": {
        "dod": "Make the max victim number that Monkey will find before stopping configurable by the user instead of constant.",
        "tests": [],
        "hints": [
            "Look for `victims_max_exploit` - it's rather similar."
        ]
    },
    "content": [
        {
            "type": "text",
            "text": "# Make something configurable\n\nIn this unit, you will learn how to add a configuration option to Monkey and how to use it in the Monkey Agent code. \n\n![computer fire](https://media.giphy.com/media/7J4P7cUur2DlErijp3/giphy.gif \"computer fire\")\n\n## Why is this important?\n\nEnabling users to configure the Monkey's behaviour gives them a lot more freedom in how they want to use the Monkey and enables more use cases.\n\n## What is \"Max victims to find\"?\n\nThe Monkey has a function which finds \"victim\" machines on the network for the Monkey to try and exploit. It's called `get_victim_machines`. This function accepts an argument which limits how many machines the Monkey should find.\n\nWe want to make that value editable by the user instead of constant in the code.\n\n## Manual testing\n\n1. After you've performed the required changes, reload the Server and check your value exists in the Internal tab of the config (see image).\n\n![](https://i.imgur.com/e0XAxuV.png)\n\n2. Set the new value to 1, and run Monkey locally (from source). See that the Monkey only scans one machine."
        },
        {
            "type": "snippet",
            "path": "monkey/infection_monkey/config.py",
            "comments": [],
            "firstLineNumber": 126,
            "lines": [
                "     exploiter_classes = []",
                "     system_info_collector_classes = []",
                " ",
                "*    # how many victims to look for in a single scan iteration\r",
                "*    victims_max_find = 100\r",
                " ",
                "     # how many victims to exploit before stopping",
                "     victims_max_exploit = 100"
            ]
        },
        {
            "type": "snippet",
            "path": "monkey/infection_monkey/monkey.py",
            "comments": [],
            "firstLineNumber": 159,
            "lines": [
                " ",
                "                 if not self._keep_running or not WormConfiguration.alive:",
                "                     break",
                "*",
                "*                machines = self._network.get_victim_machines(",
                "*                    max_find=WormConfiguration.victims_max_find,",
                "*                    stop_callback=ControlClient.check_for_stop,",
                "*                )",
                "                 is_empty = True",
                "                 for machine in machines:",
                "                     if ControlClient.check_for_stop():"
            ]
        },
        {
            "type": "snippet",
            "path": "monkey/monkey_island/cc/services/config_schema/internal.py",
            "comments": [],
            "firstLineNumber": 42,
            "lines": [
                "             \"title\": \"Monkey\",",
                "             \"type\": \"object\",",
                "             \"properties\": {",
                "*                \"victims_max_find\": {",
                "*                    \"title\": \"Max victims to find\",",
                "*                    \"type\": \"integer\",",
                "*                    \"default\": 100,",
                "*                    \"description\": \"Determines the maximum number of machines the monkey is \"",
                "*                    \"allowed to scan\",",
                "*                },",
                "                 \"victims_max_exploit\": {",
                "                     \"title\": \"Max victims to exploit\",",
                "                     \"type\": \"integer\","
            ]
        },
        {
            "type": "text",
            "text": "* When changing config schema by adding or deleting keys, you need to update the Blackbox Test configurations as well [here](https://github.com/guardicore/monkey/tree/develop/envs/monkey_zoo/blackbox/config_templates)."
        }
    ],
    "symbols": {},
    "file_version": "2.0.1",
    "meta": {
        "app_version": "0.4.1-1",
        "file_blobs": {
            "monkey/infection_monkey/config.py": "ffdea551eb1ae2b65d4700db896c746771e7954c",
            "monkey/infection_monkey/monkey.py": "c81a6251746e3af4e93eaa7d50af44d33debe05c",
            "monkey/monkey_island/cc/services/config_schema/internal.py": "d03527b89c21dfb832a15e4f7d55f4027d83b453"
        }
    }
}