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
Beispiel #2
0
Datei: db.py Projekt: perldev/zoo
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])}
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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}
Beispiel #6
0
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}
Beispiel #7
0
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
Beispiel #8
0
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()
Beispiel #9
0
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
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #14
0
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
Beispiel #15
0
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 {}
Beispiel #16
0
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, "/")
    }
Beispiel #17
0
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, "/")
    }
Beispiel #18
0
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 {}
Beispiel #19
0
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
Beispiel #20
0
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()}
Beispiel #21
0
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()}
Beispiel #22
0
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
Beispiel #23
0
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'])
Beispiel #24
0
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'])
Beispiel #25
0
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
Beispiel #27
0
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