Esempio n. 1
0
from flask import Blueprint, request, g
from flask_restx import Resource
from elasticsearch import exceptions as es_exceptions

from leek.api.channels.pipeline import notify
from leek.api.conf import settings
from leek.api.decorators import get_app_context
from leek.api.db.events import merge_events
from leek.api.errors import responses
from leek.api.schemas.serializer import validate_payload
from leek.api.routes.api_v1 import api_v1
from leek.api.db.template import get_app

events_bp = Blueprint('events', __name__, url_prefix='/v1/events')
events_ns = api_v1.namespace('events', 'Agents events handler')

logger = logging.getLogger(__name__)


@events_ns.route('/process')
class ProcessEvents(Resource):
    @get_app_context
    def post(self):
        """
        Process agent events
        """
        # TODO: API Key validation should be moved to API Gateway
        start_time = time.time()
        payload = request.get_json()
        env = g.context["app_env"]
Esempio n. 2
0
import logging

from flask import Blueprint, g, request
from flask_restx import Resource
from elasticsearch import exceptions as es_exceptions

from leek.api.db.store import STATES_TERMINAL
from leek.api.decorators import auth
from leek.api.db import search
from leek.api.routes.api_v1 import api_v1
from leek.api.control import task
from leek.api.errors import responses
from leek.api.schemas.control import RevocationSchema

control_bp = Blueprint('control', __name__, url_prefix='/v1/control')
control_ns = api_v1.namespace('control', 'Celery controlLer')

logger = logging.getLogger(__name__)


@control_ns.route('/tasks/<string:task_uuid>/retry')
class TaskRetry(Resource):
    @auth
    def post(self, task_uuid):
        """
        Retry a celery task
        """
        try:
            task_doc = search.get_task_by_uuid(index_alias=g.index_alias,
                                               task_uuid=task_uuid)
            return task.retry_task(g.app_name, task_doc["_source"])
Esempio n. 3
0
import logging

from flask import Blueprint, request, g
from flask_restx import Resource

from leek.api.decorators import auth
from leek.api.schemas.search_params import SearchParamsSchema
from leek.api.db.search import search_index
from leek.api.routes.api_v1 import api_v1

search_bp = Blueprint('search', __name__, url_prefix='/v1/search')
search_ns = api_v1.namespace('search', 'Search index.')

logger = logging.getLogger(__name__)


@search_ns.route('/')
class Search(Resource):
    @auth
    def post(self):
        """
        Search index
        """
        org_name = g.org_name
        app_name = request.headers["x-leek-app-name"]
        index_alias = f"{org_name}-{app_name}"
        query = request.get_json()
        params = SearchParamsSchema.validate(request.args.to_dict())
        return search_index(index_alias, query, params)
Esempio n. 4
0
from xmlrpc.client import ServerProxy
import supervisor.xmlrpc
from amqp import AccessRefused
from flask import Blueprint, request, g
from flask_restx import Resource
from kombu.connection import Connection

from leek.api.schemas.subscription import SubscriptionSchema
from leek.api.conf import settings
from leek.api.decorators import auth
from leek.api.routes.api_v1 import api_v1
from leek.api.errors import responses

agent_bp = Blueprint('agent', __name__, url_prefix='/v1/agent')
agent_ns = api_v1.namespace('agent', 'Agent manager')

logger = logging.getLogger(__name__)
SUBSCRIPTIONS_FILE = "/opt/app/conf/subscriptions.json"
"""
This is only supported for Local Agent. 
If you don't have access to brokers infrastructure consider using the Standalone Agent
"""


@agent_ns.route('/control')
class AgentControl(Resource):
    """
    Control agent process
    """
Esempio n. 5
0
import time
from random import choice
from string import ascii_uppercase

from flask import Blueprint, request, g
from flask_restx import Resource
from schema import SchemaError

from leek.api.decorators import auth
from leek.api.utils import generate_app_key, init_trigger
from leek.api.schemas.application import ApplicationSchema, TriggerSchema
from leek.api.db import template as apps
from leek.api.routes.api_v1 import api_v1

applications_bp = Blueprint('applications', __name__, url_prefix='/v1/applications')
applications_ns = api_v1.namespace('applications', 'Manage Leek Applications')

logger = logging.getLogger(__name__)


@applications_ns.route('/')
class Applications(Resource):

    @auth
    def post(self):
        """
        Create application
        """
        data = request.get_json()
        app = ApplicationSchema.validate(data)
        org_name = g.org_name
Esempio n. 6
0
import logging

from flask import Blueprint, current_app, url_for
from flask_restx import Resource

from leek.api.utils import has_no_empty_params
from leek.api.conf import settings
from leek.api.db.policy import create_or_update_default_lifecycle_policy
from leek.api.routes.api_v1 import api_v1
from leek.api.decorators import auth

manage_bp = Blueprint('manage', __name__, url_prefix='/v1/manage')
manage_ns = api_v1.namespace('manage', 'Operations related to management.')

logger = logging.getLogger(__name__)


###############################################
#                 Health Check                |
#  Can be called from ttt to avoid cold start |
###############################################
@manage_ns.route('/hc')
class HealthCheck(Resource):
    def get(self):
        """
        Useful to prevent cold start, should be called periodically by another lambda
        """
        return {"status": "I'm sexy and i know it"}, 200


@manage_ns.route('/site-map')
Esempio n. 7
0
import logging

from flask import Blueprint, g
from flask_restx import Resource

from leek.api.routes.api_v1 import api_v1
from leek.api.decorators import auth

users_bp = Blueprint('users', __name__, url_prefix='/v1/users')
users_ns = api_v1.namespace('users', 'Operations related to users.')

logger = logging.getLogger(__name__)


@users_ns.route('/whoami')
class WhoAmI(Resource):
    @auth
    def get(self):
        """
        Useful to prevent cold start, should be called periodically by another lambda
        """
        return {"claims": g.claims}, 200