diff --git a/monkey_island/cc/app.py b/monkey_island/cc/app.py index 21eea154a..586016341 100644 --- a/monkey_island/cc/app.py +++ b/monkey_island/cc/app.py @@ -15,6 +15,7 @@ from cc.resources.edge import Edge from cc.resources.node import Node from cc.resources.root import Root +from cc.services.config import ConfigService __author__ = 'Barak' @@ -65,6 +66,9 @@ def init_app(mongo_url): app.config['MONGO_URI'] = mongo_url mongo.init_app(app) + with app.app_context(): + ConfigService.init_config() + app.add_url_rule('/', 'serve_home', serve_home) app.add_url_rule('/', 'serve_static_file', serve_static_file) diff --git a/monkey_island/cc/resources/monkey_configuration.py b/monkey_island/cc/resources/monkey_configuration.py index 2ae5bf4d4..091d1e8a7 100644 --- a/monkey_island/cc/resources/monkey_configuration.py +++ b/monkey_island/cc/resources/monkey_configuration.py @@ -15,7 +15,6 @@ class MonkeyConfiguration(flask_restful.Resource): def post(self): config_json = json.loads(request.data) - - mongo.db.config.update({'name': 'newconfig'}, {"$set": config_json}, upsert=True) - return jsonify(schema=ConfigService.get_config_schema(), configuration=ConfigService.get_config()) + ConfigService.update_config(config_json) + return self.get() diff --git a/monkey_island/cc/resources/root.py b/monkey_island/cc/resources/root.py index f9d7afc2a..02e152853 100644 --- a/monkey_island/cc/resources/root.py +++ b/monkey_island/cc/resources/root.py @@ -4,6 +4,7 @@ from flask import request, make_response, jsonify import flask_restful from cc.database import mongo +from cc.services.config import ConfigService from cc.utils import local_ip_addresses @@ -24,6 +25,7 @@ class Root(flask_restful.Resource): mongo.db.telemetry.drop() mongo.db.node.drop() mongo.db.edge.drop() + ConfigService.init_config() return jsonify(status='OK') elif action == "killall": mongo.db.monkey.update({}, {'$set': {'config.alive': False, 'modifytime': datetime.now()}}, upsert=False, diff --git a/monkey_island/cc/services/config.py b/monkey_island/cc/services/config.py index cc203ba9f..6c51f97e3 100644 --- a/monkey_island/cc/services/config.py +++ b/monkey_island/cc/services/config.py @@ -1,4 +1,8 @@ from cc.database import mongo +from jsonschema import Draft4Validator, validators + +from cc.island_config import ISLAND_PORT +from cc.utils import local_ip_addresses __author__ = "itay.mizeretz" @@ -799,5 +803,51 @@ class ConfigService: ) @staticmethod - def update_config(): - pass + def update_config(config_json): + mongo.db.config.update({'name': 'newconfig'}, {"$set": config_json}, upsert=True) + + @staticmethod + def get_default_config(): + defaultValidatingDraft4Validator = ConfigService._extend_config_with_default(Draft4Validator) + config = {} + defaultValidatingDraft4Validator(SCHEMA).validate(config) + return config + + @staticmethod + def init_config(): + if ConfigService.get_config() != {}: + return + config = ConfigService.get_default_config() + ConfigService.set_server_ips_in_config(config) + ConfigService.update_config(config) + + @staticmethod + def set_server_ips_in_config(config): + ips = local_ip_addresses() + config["cnc"]["servers"]["command_servers"] = ["%s:%d" % (ip, ISLAND_PORT) for ip in ips] + config["cnc"]["servers"]["current_server"] = "%s:%d" % (ips[0], ISLAND_PORT) + + @staticmethod + def _extend_config_with_default(validator_class): + validate_properties = validator_class.VALIDATORS["properties"] + + def set_defaults(validator, properties, instance, schema): + # Do it only for root. + if instance != {}: + return + for property, subschema in properties.iteritems(): + main_dict = {} + for property2, subschema2 in subschema["properties"].iteritems(): + sub_dict = {} + for property3, subschema3 in subschema2["properties"].iteritems(): + if "default" in subschema3: + sub_dict[property3] = subschema3["default"] + main_dict[property2] = sub_dict + instance.setdefault(property, main_dict) + + for error in validate_properties(validator, properties, instance, schema): + yield error + + return validators.extend( + validator_class, {"properties": set_defaults}, + ) diff --git a/monkey_island/cc/ui/src/components/pages/ConfigurePage.js b/monkey_island/cc/ui/src/components/pages/ConfigurePage.js index 3f090fda9..3383ee336 100644 --- a/monkey_island/cc/ui/src/components/pages/ConfigurePage.js +++ b/monkey_island/cc/ui/src/components/pages/ConfigurePage.js @@ -12,7 +12,7 @@ class ConfigurePageComponent extends React.Component { configuration: {}, saved: false, sections: [], - selectedSection: '' + selectedSection: 'basic' }; } @@ -55,8 +55,13 @@ class ConfigurePageComponent extends React.Component { }; render() { - let displayedSchema = this.state.schema["properties"][this.state.selectedSection]; - displayedSchema["definitions"] = this.state.schema["definitions"]; + let displayedSchema = {}; + + if (this.state.schema.hasOwnProperty('properties')) { + displayedSchema = this.state.schema["properties"][this.state.selectedSection]; + displayedSchema["definitions"] = this.state.schema["definitions"]; + } + return (

Monkey Configuration