Mini Shell
# -*- coding: utf-8 -*-
# Copyright © Cloud Linux GmbH & Cloud Linux Software, Inc 2010-2021 All Rights Reserved
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT
"""
This module contains contains classes implementing SSA Agent behaviour
"""
import json
import logging
from threading import Thread, current_thread
from .internal.constants import agent_sock
from .internal.exceptions import SSAError
from .internal.utils import create_socket
from .modules.processor import RequestProcessor
class SimpleAgent:
"""
SSA Simple Agent class
"""
def __init__(self):
self.logger = logging.getLogger('agent')
self.request_processor = RequestProcessor()
# start serving incoming connections
self.listen()
def listen(self) -> None:
"""
Start listening socket
"""
_socket = create_socket(agent_sock)
while True:
connection, address = _socket.accept()
t = Thread(target=self.handle, args=(connection,))
t.start()
self.logger.debug('[%s] Started', t.name)
def handle(self, connection: 'socket object') -> None:
"""
Handle incoming connection
:param connection: socket object usable to
send and receive data on the connection
"""
fileobj = connection.makefile(errors='ignore')
try:
input_data = self.read_input(fileobj)
self.request_processor.handle(input_data)
except SSAError as e:
self.logger.error('Handled exception in [%s]: %s',
current_thread().name, str(e))
pass
connection.close()
def read_input(self, fileio: 'file object') -> dict:
"""
Read input data and return decoded json
:param fileio: a file-like object providing read method
"""
data = fileio.read()
self.logger.info('[%s] I received %i bytes: %s',
current_thread().name, len(data.encode()),
data)
if data:
return json.loads(data.strip(), strict=False)
else:
return {}
Zerion Mini Shell 1.0