def install_application(request, app_name): """ Этот вызов используется для передать в веб-интерфейс дерево зависимостей для первого шага install application Возвращает продукты необходимые для установки Application для запуска инсталяции используется стандартный вызов install Примеры запросов и ответов: начальный запрос: """ req = json_request(request) # это начальный запрос? dm = DependencyManager() core = Core.get_instance() # продукты, которые запрошены на установку (без зависимостей) requested_products = [app_name] if len(requested_products) > 1: raise RuntimeError("You are able to install only one application") application_item = [ dm.get_dependencies(product_name) for product_name in requested_products ] resp = {'task': None, "state": "requirements", 'items': application_item} return resp
def check(request): """ Проверяет коннект к базы данных, используется на мастере установки приложения, если у приложения есть параметры для БД. """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) # распарсим джейсон запрос req = json_request(request) # и дёрнем соответствующий метод для полученного типа бд. if req[KnownParameters.DB_ENGINE.value] == "mysql": return test_mysql( req[KnownParameters.DB_HOST.value], req[KnownParameters.DB_PORT.value], req[KnownParameters.DB_USERNAME.value], req[KnownParameters.DB_PASSWORD.value], req[KnownParameters.DB_NAME.value]) if req[KnownParameters.DB_ENGINE.value] == "mssql": return test_mssql( req[KnownParameters.DB_HOST.value], req[KnownParameters.DB_PORT.value], req[KnownParameters.DB_USERNAME.value], req[KnownParameters.DB_PASSWORD.value], req[KnownParameters.DB_NAME.value]) if req[KnownParameters.DB_ENGINE.value] == "sqlite": return test_sqlite( req[KnownParameters.DB_NAME.value]) return {'success': False, 'message': 'Unknown database engine: {0}'.format(req[KnownParameters.DB_ENGINE.value])}
def install_application(request, app_name): """ Этот вызов используется для передать в веб-интерфейс дерево зависимостей для первого шага install application Возвращает продукты необходимые для установки Application для запуска инсталяции используется стандартный вызов install Примеры запросов и ответов: начальный запрос: """ req = json_request(request) # это начальный запрос? dm = DependencyManager() core = Core.get_instance() # продукты, которые запрошены на установку (без зависимостей) requested_products = [app_name] if len(requested_products) > 1: raise RuntimeError("You are able to install only one application") application_item = [dm.get_dependencies(product_name) for product_name in requested_products] resp = {'task': None, "state": "requirements", 'items': application_item} return resp
def website_create(request): """ хендлер для запроса, создать сайт создает и возвращает сайт, или ошибка :param request: :return: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) name = req['name'] ip_address = req['ip_address'] port = req['port'] hostname = req['hostname'] # 127.0.0.1:8085:localhost1.helicontech.com binding = 'http/{0}:{1}:{2}'.format(ip_address, port, hostname) core = Core.get_instance() try: path = core.api.os.web_server.create_physical_path_for_virtual_path( name) core.api.os.web_server.site_create(name, path, binding) website_object = core.api.os.web_server.get_site(name) response = {'error': None, 'website': website_object.to_dict()} except Exception as e: response = {'error': str(e), 'website': None} return response
def website_launch(request): core = Core.get_instance() sites = core.api.os.web_server.get_list_of_sites() req = json_request(request) name = req['sitename'] url = req['url'] if core.platform.web_server == "iisexpress": core.api.os.web_server.launch_iis_express(name) return {"status": True}
def uninstall(request): """ Обрабатывает запросы на деинсталляцию продуктов. """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) # это начальный запрос ? # список имён продуктов для деинсталляции requested_products = req['requested_products'] # добываем список продуктов из списка имён products = ProductCollection( [product_name for product_name in requested_products], feed=Core.get_instance().current_storage.feed, #feed=Core.get_instance().feed, fail_on_product_not_found=False) if req["command"] == "start": # для начального запроса отдает список продуктов resp = { 'task': None, 'state': 'product_list', 'items': [ { 'product': product.to_dict(True), 'parameters': [], 'error': None } for product in products ] } else: # создаём задачу на деинсталляцию task_manager = MasterProduct.getInstance() task_id = task_manager.create_uninstall_task(products) resp = { 'task': { 'id': task_id, 'url': reverse('task_id', args=(task_id,)) }, "state": "uninstalling", 'items': None } return resp
def create(request): """ Создать экземпляр веб-консоли консолей может быть несколько, но для каждого пути только 1 :param request: :return: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) path = req['path'] console = WebConsole.create_console(path) return console.to_dict()
def upgrade(request): """ Обрабатывает запросы на апгрейд продуктов. Форматы входных запросов и выходных ответов такие же как для install() """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) initial = 'initial' in req dm = DependencyManager() requested_products = req['requested_products'] core = Core.get_instance() if initial: # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, 'items': [ dm.get_dependencies(product_name) for product_name in requested_products ] } else: # это запрос на апгрейд # список имён продуктов, которые нужно апгрейдить (с зависимостями) product_list = [item['product'] for item in req['install_products']] product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list) parsed_parameters = ParametersParserJson(req['install_products']).get() # создаём менеджер параметров parameter_manager = ParametersManager(core, products, parsed_parameters) # создаёт задачу на апгрейд task = TaskFactory.create_task("upgrade", products, parameter_manager) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) resp = { 'task': { 'id': task_id, }, 'items': None } return resp
def uninstall(request): """ Обрабатывает запросы на деинсталляцию продуктов. """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) # это начальный запрос ? # список имён продуктов для деинсталляции requested_products = req['requested_products'] # добываем список продуктов из списка имён products = ProductCollection( [product_name for product_name in requested_products], feed=Core.get_instance().current_storage.feed, # feed=Core.get_instance().feed, fail_on_product_not_found=False) if req["command"] == "start": # для начального запроса отдает список продуктов resp = { 'task': None, 'state': 'product_list', 'items': [ { 'product': product.to_dict(True), 'parameters': [], 'error': None } for product in products ] } else: # создаём задачу на деинсталляцию task = TaskFactory.create_task("uninstall", products) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) # и готовим ответ веб-интерфейсу, что уставнока началась resp = {'task': {'id': task_id}, "state": "uninstalling"} return resp
def write(request): """ записать в консоль строку, переданную в параметрах :param request: :return: :raise RuntimeError: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) path = req['path'] console = WebConsole.get_console(path) if not console: raise RuntimeError('Console for {0} is not created or closed.'.format(path)) return console.write(req['data'] + '\r\n')
def uninstall(request): """ Обрабатывает запросы на деинсталляцию продуктов. """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) # это начальный запрос ? # список имён продуктов для деинсталляции requested_products = req['requested_products'] # добываем список продуктов из списка имён products = ProductCollection( [product_name for product_name in requested_products], feed=Core.get_instance().current_storage.feed, # feed=Core.get_instance().feed, fail_on_product_not_found=False) if req["command"] == "start": # для начального запроса отдает список продуктов resp = { 'task': None, 'state': 'product_list', 'items': [{ 'product': product.to_dict(True), 'parameters': [], 'error': None } for product in products] } else: # создаём задачу на деинсталляцию task = TaskFactory.create_task("uninstall", products) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) # и готовим ответ веб-интерфейсу, что уставнока началась resp = {'task': {'id': task_id}, "state": "uninstalling"} return resp
def upgrade(request): """ Обрабатывает запросы на апгрейд продуктов. Форматы входных запросов и выходных ответов такие же как для install() """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) initial = 'initial' in req dm = DependencyManager() requested_products = req['requested_products'] core = Core.get_instance() if initial: # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, 'items': [dm.get_dependencies(product_name) for product_name in requested_products] } else: # это запрос на апгрейд # список имён продуктов, которые нужно апгрейдить (с зависимостями) product_list = [item['product'] for item in req['install_products']] product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list) parsed_parameters = ParametersParserJson(req['install_products']).get() # создаём менеджер параметров parameter_manager = ParametersManager(core, products, parsed_parameters) # создаёт задачу на апгрейд task = TaskFactory.create_task("upgrade", products, parameter_manager) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) resp = { 'task': { 'id': task_id, }, 'items': None } return resp
def cancel(request): """ убить дочерний процесс. :param request: :return: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) path = req['path'] console = WebConsole.get_console(path) if not console: return HttpResponseServerError('console is not created for {0}'.format(path)) WebConsole.cancel_console(console) return {}
def website_item(request, name): """ хендлер для запроса, узла дерева - сайт GET - получить дочерние узлы POST - обновить zoo_config с переданными значаниями :param request: :param name: :return: """ core = Core.get_instance() if request.method == 'POST': req = json_request(request) core.api.os.web_server.update_zoo_config(name, "/", req) return { 'node': core.api.os.web_server.get_site_node(name), 'children': core.api.os.web_server.get_directories(name, "/") }
def cancel(request): """ убить дочерний процесс. :param request: :return: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) path = req['path'] console = WebConsole.get_console(path) if not console: http_body = 'console is not created for {0}'.format(path) return HttpResponseServerError(body=http_body) WebConsole.cancel_console(console) return {}
def upgrade(request): """ Обрабатывает запросы на апгрейд продуктов. Форматы входных запросов и выходных ответов такие же как для install() """ if request.method != 'POST': # принимаем только пост-запросы return HttpResponseNotAllowed(['POST']) # парсим джейсон запрос req = json_request(request) initial = 'initial' in req dm = DependencyManager() requested_products = req['requested_products'] if initial: # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, 'items': [dm.get_dependencies(product_name) for product_name in requested_products] } else: # это запрос на апгрейд # список имён продуктов, которые нужно апгрейдить (с зависимостями) product_list = [item['product'] for item in req['install_products']] product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list) # создаёт задачу на апгрейд task_manager = TaskManager.get_instance() task_id = task_manager.create_upgrade_task(requested_products, products) resp = { 'task': { 'id': task_id, 'url': reverse('task_id', args=(task_id,)) }, 'items': None } return resp
def settings(request): """ Хендлер. GET - Получить настройки POST - сохранить переданные настройки, после сохранения настроек - перезагрузить ядро :param request: :return: """ core = Core.get_instance() if request.method == "POST": req = json_request(request) core.set_settings(req) # restart core setts = core.settings CoreLoader.get_instance().restart(setts) else: setts = core.settings return {"settings": setts.to_dict(), "info": setts.get_state()}
def settings(request): """ Хендлер. GET - Получить настройки POST - сохранить переданные настройки, после сохранения настроек - перезагрузить ядро :param request: :return: """ core = Core.get_instance() if request.method == 'POST': req = json_request(request) core.set_settings(req) # restart core setts = core.settings CoreLoader.get_instance().restart(setts) else: setts = core.settings return {'settings': setts.to_dict(), 'info': setts.get_state()}
def website_create(request): """ хендлер для запроса, создать сайт создает и возвращает сайт, или ошибка :param request: :return: """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) req = json_request(request) name = req['name'] ip_address = req['ip_address'] port = req['port'] hostname = req['hostname'] # 127.0.0.1:8085:localhost1.helicontech.com binding = 'http/{0}:{1}:{2}'.format( ip_address, port, hostname ) core = Core.get_instance() try: path = core.api.os.web_server.create_physical_path_for_virtual_path(name) core.api.os.web_server.site_create(name, path, binding) website_object = core.api.os.web_server.get_site(name) response = { 'error': None, 'website': website_object.to_dict() } except Exception as e: response = { 'error': str(e), 'website': None } return response
def config(request, name): """ GET - Получить конфиг для энажайна POST - сохранить конфиг для энажайна в engine_storage :param request: :param name: :return: :raise HttpResponseNotAllowed: """ core = Core.get_instance() core.engine_storage.update() if request.method == 'GET': engine = core.engine_storage.feed.get_product(name) return engine.to_dict(True) if request.method == 'POST': engine_config = json_request(request) engine = core.engine_storage.feed.get_product(name) engine.config = engine_config core.engine_storage.feed.update_product(engine) core.engine_storage.save() return engine.to_dict(True) raise HttpResponseNotAllowed(['GET', 'POST'])
def check(request): """ Проверяет коннект к базы данных, используется на мастере установки приложения, если у приложения есть параметры для БД. """ if request.method != 'POST': return HttpResponseNotAllowed(['POST']) # распарсим джейсон запрос req = json_request(request) # и дёрнем соответствующий метод для полученного типа бд. if req[KnownParameters.DB_ENGINE.value] == "mysql": return test_mysql(req[KnownParameters.DB_HOST.value], req[KnownParameters.DB_PORT.value], req[KnownParameters.DB_USERNAME.value], req[KnownParameters.DB_PASSWORD.value], req[KnownParameters.DB_NAME.value]) if req[KnownParameters.DB_ENGINE.value] == "mssql": return test_mssql(req[KnownParameters.DB_HOST.value], req[KnownParameters.DB_PORT.value], req[KnownParameters.DB_USERNAME.value], req[KnownParameters.DB_PASSWORD.value], req[KnownParameters.DB_NAME.value]) if req[KnownParameters.DB_ENGINE.value] == "sqlite": return test_sqlite(req[KnownParameters.DB_NAME.value]) return { 'success': False, 'message': 'Unknown database engine: {0}'.format( req[KnownParameters.DB_ENGINE.value]) }
def install(request): """ Этот вызов используется для передать в веб-интерфейс дерево зависимостей и принять от него запрос на установку. Примеры запросов и ответов: начальный запрос: command: "start" requested_products: [JavaJettyTemplate] ответ: task: id: 168 url: /task/168/ items: paramters: [...] product: name: ... title: ... and: - item 1... - item 2... """ # TODO do not give ability to install application through this function if request.method != 'POST': # принимаем только пост-запросы resp = HttpResponseNotAllowed(['POST']) return resp # джейсон запрос в питоний словарь req = json_request(request) # это начальный запрос? dm = DependencyManager() core = Core.get_instance() # продукты, которые запрошены на установку (без зависимостей) requested_products = req['requested_products'] if req["command"] == "start": # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, "state": "requirements", 'items': [ dm.get_dependencies(product_name) for product_name in requested_products ] } else: # это запрос на установку # список имён продуктов, которые нужно установить # ВАЖНЫЙ МОМЕНТ (с зависимостями) product_list = [item['product'] for item in req['install_products']] # переворачиваем его product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list, feeds=(core.feed, core.current)) # парсим параметры установки из запроса parsed_parameters = ParametersParserJson(req['install_products']).get() # создаём менеджер параметров parameter_manager = ParametersManager(core, products, parsed_parameters) # все ли параметры заполнены? if parameter_manager.are_all_parameters_filled(): # всё ок, создаём задание на установку task = TaskFactory.create_task("install", products, parameter_manager) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) # и готовим ответ веб-интерфейсу, что уставнока началась resp = { 'task': { 'id': task_id, }, } else: # что-то не так с параметрами, возвращаем в веб морду ошибку resp = { 'task': None, 'items': [ dm.get_dependencies(product_name) for product_name in req['requested_products'] ], 'error': [parameter_manager.get_error(product) for product in products] } return resp
def install(request): """ Этот вызов используется для передать в веб-интерфейс дерево зависимостей и принять от него запрос на установку. Примеры запросов и ответов: начальный запрос: command: "start" requested_products: [JavaJettyTemplate] ответ: task: id: 168 url: /task/168/ items: paramters: [...] product: name: ... title: ... and: - item 1... - item 2... """ # TODO do not give ability to install application through this function if request.method != 'POST': # принимаем только пост-запросы resp = HttpResponseNotAllowed(['POST']) return resp # джейсон запрос в питоний словарь req = json_request(request) # это начальный запрос? dm = DependencyManager() core = Core.get_instance() # продукты, которые запрошены на установку (без зависимостей) requested_products = req['requested_products'] if req["command"] == "start": # если это начальный запрос, то отдаем дерево зависимостей resp = { 'task': None, "state": "requirements", 'items': [dm.get_dependencies(product_name) for product_name in requested_products] } else: # это запрос на установку # список имён продуктов, которые нужно установить # ВАЖНЫЙ МОМЕНТ (с зависимостями) product_list = [item['product'] for item in req['install_products']] # переворачиваем его product_list.reverse() # добывает спсисоко продуктов из списка имён products = ProductCollection(product_list, feeds=(core.feed, core.current)) # парсим параметры установки из запроса parsed_parameters = ParametersParserJson(req['install_products']).get() # создаём менеджер параметров parameter_manager = ParametersManager(core, products, parsed_parameters) # все ли параметры заполнены? if parameter_manager.are_all_parameters_filled(): # всё ок, создаём задание на установку task = TaskFactory.create_task("install", products, parameter_manager) task_id = TaskManager.queue_task(task) TornadoWorker.start_new_task(task) # и готовим ответ веб-интерфейсу, что уставнока началась resp = { 'task': { 'id': task_id, }, } else: # что-то не так с параметрами, возвращаем в веб морду ошибку resp = { 'task': None, 'items': [dm.get_dependencies(product_name) for product_name in req['requested_products']], 'error': [parameter_manager.get_error(product) for product in products] } return resp