Ejemplo n.º 1
0
 def __init__(self, catalog, req, resp):
     self.log = Log.get('agent-instance-lcp')
     self.req = req
     self.resp = resp
     self.req_lcp = []
     self.actions = []
     self.parameters = []
     self.resources = []
     self.catalogs = {'actions': {}, 'parameters': {}, 'resources': {}}
     operations = wrap(self.req.get('operations', []))
     for req_op in operations:
         req_lcp_op = {}
         self.req_lcp.append(req_lcp_op)
         self.__prepare(req_lcp_op,
                        'actions',
                        catalog=catalog.actions,
                        data=req_op.get('actions', []),
                        transform_handler=self.__transform_action)
         self.__prepare(req_lcp_op,
                        'parameters',
                        catalog=catalog.parameters,
                        data=req_op.get('parameters', []),
                        transform_handler=self.__transform_parameter)
         self.__prepare(req_lcp_op,
                        'resources',
                        catalog=catalog.resources,
                        data=req_op.get('resources', []),
                        transform_handler=self.__transform_resource)
     self.num = len(operations)
Ejemplo n.º 2
0
def heartbeat_exec_env(exec_env):
    log = Log.get('heartbeat')
    try:
        id = exec_env.meta.id
        lcp = exec_env.lcp
        lbl = f'{id} (LCP at {exec_env.hostname}:{lcp.port})'
        if exec_env.enabled:
            schema = 'https' if lcp.https else 'http'
            resp = post(f'{schema}://{exec_env.hostname}:{lcp.port}/status',
                        timeout=Arg_Reader.db.hb_timeout,
                        headers={'Authorization': create_token()},
                        json={'id': id})
            if resp.status_code == HTTP_Status.OK:
                data = resp.json()
                id = data.pop('id', None)
                lcp.started = data.get('started', None)
                lcp.last_heartbeat = data.get('last_heartbeat', None)
                log.success(f'Connection established with exec-env {lbl}')
            else:
                lcp.last_heartbeat = None
                log.warning(f'Connection reset with exec-env {lbl}')
                log.notice(f'Response: {resp.content}')
            if not lcp.https:
                lcp.https = False
            exec_env.save()
        else:
            log.notice(f'Exec-env {lbl} not enabled')
    except ConnectTimeout:
        log.error(f'Connection timeout with exec-env {lbl}')
    except ConnectionError:
        log.error(f'Connection refused with exec-env {lbl}')
    except Exception as exception:
        log.exception(f'Exception during connection with exec-env {lbl}',
                      exception)
Ejemplo n.º 3
0
def api(title, version):
    log = Log.get('api')

    middlewares = [Negotiation_Middleware()]

    if Arg_Reader.db.auth:
        log.notice('JWT authentication enabled')
        middlewares.append(
            Falcon_Auth_Middleware(
                JWT_Auth_Backend(
                    user_loader=lambda token: {'user': token},
                    secret_key=Arg_Reader.db.auth_secret_key,
                    auth_header_prefix=Arg_Reader.db.auth_header_prefix),
                exempt_routes=['/api/doc', '/api/doc/swagger.json']))
    else:
        log.notice('JWT authentication disabled')

    if Arg_Reader.db.https:
        log.notice('Force to use HTTPS instead of HTTP')
        middlewares.append(RequireHTTPS())
    else:
        log.notice('HTTPS not set')

    if Arg_Reader.db.apm_enabled:
        log.notice('Elastic APM enabled')
        middlewares.append(
            Elastic_Apm_Middleware(service_name='lcp-apm',
                                   server_url=Arg_Reader.db.apm_server))
    else:
        log.notice('Elastic APM disabled')

    instance = API(middleware=middlewares)

    media_handlers = {
        falcon.MEDIA_JSON:
        JSON_Handler(loads=loads,
                     dumps=partial(dumps, ensure_ascii=False, sort_keys=True)),
        falcon.MEDIA_MSGPACK:
        Message_Pack_Handler(),
        falcon.MEDIA_XML:
        XML_Handler(),
        falcon.MEDIA_YAML:
        YAML_Handler()
    }
    instance.req_options.media_handlers.update(media_handlers)
    instance.resp_options.media_handlers.update(media_handlers)

    instance.add_error_handler(*Bad_Request_Handler.get())
    instance.add_error_handler(*Internal_Server_Error_Handler.get())
    instance.add_error_handler(*Unsupported_Media_Type_Handler.get())

    api_spec = Spec(api=instance, title=title, version=version)
    routes(api=instance, spec=api_spec.get())
    falcon_api_doc(instance,
                   config_path='./swagger/schema.json',
                   url_prefix='/api/doc',
                   title='API doc')
    api_spec.write()

    return instance
Ejemplo n.º 4
0
def routes(api, spec):
    log = Log.get('resource')
    for res_class in db:
        res = res_class()
        for route in wrap(res_class.routes):
            api.add_route(route, res)
            spec.path(resource=res)
            log.success(f'{route} endpoint configured')
Ejemplo n.º 5
0
 def __init__(self):
     """Set the data and logger."""
     self.data = {
         'id': False,
         'started': datetime_to_str(),
         'last_heartbeat': False
     }
     self.log = Log.get('status')
Ejemplo n.º 6
0
def property_parser(schema, source, path, value):
    with open(source, 'rb') as file:
        content = Properties()
        content.load(file, 'utf-8')
        k = '.'.join(path)
        try:
            old_value, _ = content[k]
        except Exception as e:
            Log.get('property-parser').exception(f'Parsing property {k}', e)
            old_value = None
        if old_value != value:
            content[k] = value
            with open(source, 'wb') as file:
                content.store(file, encoding='utf-8')
                return {'value': {'new': value, 'old': old_value}}
        else:
            return {'note': NO_CHANGE_NEEDED}
Ejemplo n.º 7
0
 def __init__(self):
     """Set the data and logger."""
     cls = Status_Resource
     self.data = dict(id=None,
                      started=datetime_to_str(),
                      last_heartbeat=None)
     ttl = int(Arg_Reader.db.auth_max_ttl)
     cls.auth_db = TTL_Ordered_Dict(default_ttl=ttl)
     self.log = Log.get('status')
Ejemplo n.º 8
0
 def parse(self, query, id=None):
     try:
         self.__select(query)
         self.s.query = self.__where(query, id=id)
         self.__order(query)
         self.__limit(query)
     except Request_Error as req_err:
         raise HTTP_Bad_Request(title=req_err.error,
                                description=req_err.info)
     except HTTP_Bad_Request as http_bad_req:
         raise http_bad_req
     except Exception as exception:
         Log.get('query-reader').error(f'Exception: {exception}')
         raise HTTP_Bad_Request(
             title='Not valid JSON',
             description=
             'The request body is not a valid JSON or it is not encoded as UTF-8.'
         )
     return self.s
Ejemplo n.º 9
0
 def __init__(self):
     if self.doc is not None:
         self.log = Log.get(self.doc.Index.name)
         err_es_init = True
         while err_es_init:
             try:
                 msg = f'Start initialization index {self.doc.Index.name}'
                 self.log.info(msg)
                 self.doc.init()
                 msg = f'Index {self.doc.Index.name} initialized'
                 self.log.success(msg)
                 err_es_init = False
             except Exception as e:
                 msg = f'Initialization index {self.doc.Index.name} not possible'
                 self.log.exception(msg, e)
                 msg = f'Waiting for {Arg_Reader.db.es_retry_period} seconds and try again'
                 self.log.info(msg)
                 sleep(Arg_Reader.db.es_retry_period)
     else:
         Log.get(self.__class__.__name__).warning('doc not set')
Ejemplo n.º 10
0
def connection(endpoint, timeout, retry_period):
    log = Log.get('elastic-search')
    try:
        log.info(f'Start connection to Elasticsearch ({endpoint})')
        connections.create_connection(hosts=endpoint, timeout=timeout)
    except Exception as exception:
        log.exception(f'Connection to Elasticsearch ({endpoint}) not possible',
                      exception)
        log.warn(f'Try again in {retry_period} seconds')
        sleep(retry_period)
        connection(endpoint, timeout, retry_period)
    else:
        log.success(f'Connection to Elasticsearch ({endpoint}) established')
Ejemplo n.º 11
0
    def __init__(self):
        self.host = Arg_Reader.db.polycube_host
        self.port = Arg_Reader.db.polycube_port
        self.timeout = Arg_Reader.db.polycube_timeout
        self.endpoint = f'http://{self.host}:{self.port}/polycube/v1'
        self.log = Log.get('polycube')

        self.log.info(f'Check connection to {self.endpoint}')
        try:
            resp_req = get_req(self.endpoint,
                               timeout=Arg_Reader.db.polycube_timeout)
            self.__manager(resp_req)
        except Connection_Error as e:
            self.log.exception(e)
Ejemplo n.º 12
0
def property_parser(schema, source, path, value):
    with open(source, 'rb') as file:
        content = Properties()
        content.load(file, 'utf-8')
        k = '.'.join(path)
        try:
            old_value, _ = content[k]
        except Exception as e:
            Log.get('property-parser').exception(e)
            old_value = None
        if old_value != value:
            content[k] = value
            with open(source, 'wb') as file:
                content.store(file, encoding='utf-8')
                return dict(schema=schema,
                            source=source,
                            path=path,
                            value=dict(new=value, old=old_value))
        else:
            return dict(schema=schema,
                        source=source,
                        path=path,
                        value=value,
                        note=NO_CHANGE_NEEDED)
Ejemplo n.º 13
0
 def __init__(self):
     """Initialize the log."""
     self.log = Log.get(self.routes[0].replace('/', ''))
Ejemplo n.º 14
0
 def __init__(self, catalog, req, resp):
     self.log = Log.get('ebpf-program-instance-lcp')
     self.req = req
     self.resp = resp
     self.req_lcp = {}
     self.catalog = catalog
Ejemplo n.º 15
0
def __get(code):
    po = cpo.get(code, None)
    if po is None:
        Log.get('http-lib').warn(f'{code} without priority order.')
Ejemplo n.º 16
0
 def __log():
     return Log.get('lcp')
Ejemplo n.º 17
0
 def __init__(self, dev_username, dev_password):
     super().__init__(self.__auth)
     self.dev_username = dev_username
     self.dev_password = dev_password
     self.log = Log.get('basic-auth-backend-extended')
Ejemplo n.º 18
0
 def __init__(self, message, error=False, exception=None, **kwargs):
     self.log = Log.get(self.__class__.__name__)
     self.data = {'message': message}
     if exception is not None:
         self.data.update(exception=extract_info(exception))
     self.data.update(kwargs)
Ejemplo n.º 19
0
import waitress  # noqa: E402
from rich import pretty, traceback  # noqa: E402
from rich.console import Console  # noqa: E402
from rich.panel import Panel  # noqa: E402

pretty.install()
traceback.install(show_locals=False)

from about import project, title, version  # noqa: E402
from api import api  # noqa: E402
from reader.arg import Arg_Reader  # noqa: E402
from utils.log import Log  # noqa: E402

db = Arg_Reader.read()

if db.version is not None:
    print(db.version)
else:
    ident = f'{project} - {title} v:{version}'
    console = Console()
    console.print(Panel.fit(ident))
    Log.init(config=db.log_config)
    api_instance = api(title=title, version=version)
    Log.get('api').success(f'Accept requests at {db.host}:{db.port}')
    waitress.serve(api_instance,
                   host=db.host,
                   port=db.port,
                   expose_tracebacks=False,
                   ident=ident,
                   _quiet=True)