Added message_bus module for module to module comms. Some changes to core_daemon and daemon_cli...

This commit is contained in:
kalzu rekku
2024-08-11 22:09:40 +03:00
parent a411cdee81
commit c5ded90841
7 changed files with 744 additions and 211 deletions

95
modules/message_bus.py Normal file
View File

@ -0,0 +1,95 @@
import queue
import threading
class MessageBus:
def __init__(self):
self.queues = {}
self.lock = threading.Lock()
def create_queue(self, queue_name):
with self.lock:
if queue_name not in self.queues:
self.queues[queue_name] = queue.Queue()
return True
return False
def delete_queue(self, queue_name):
with self.lock:
if queue_name in self.queues:
del self.queues[queue_name]
return True
return False
def send_message(self, queue_name, message):
with self.lock:
if queue_name in self.queues:
self.queues[queue_name].put(message)
return True
return False
def receive_message(self, queue_name, timeout=None):
with self.lock:
if queue_name in self.queues:
try:
return self.queues[queue_name].get(timeout=timeout)
except queue.Empty:
return None
return None
message_bus = MessageBus()
def do_create_queue(args):
"""Create a new message queue: create_queue <queue_name>"""
queue_name = args.strip()
if message_bus.create_queue(queue_name):
return f"Queue '{queue_name}' created successfully"
else:
return f"Queue '{queue_name}' already exists"
def do_delete_queue(args):
"""Delete a message queue: delete_queue <queue_name>"""
queue_name = args.strip()
if message_bus.delete_queue(queue_name):
return f"Queue '{queue_name}' deleted successfully"
else:
return f"Queue '{queue_name}' does not exist"
def do_send_message(args):
"""Send a message to a queue: send_message <queue_name> <message>"""
parts = args.split(maxsplit=1)
if len(parts) != 2:
return "Invalid arguments. Usage: send_message <queue_name> <message>"
queue_name, message = parts
if message_bus.send_message(queue_name, message):
return f"Message sent to queue '{queue_name}'"
else:
return f"Queue '{queue_name}' does not exist"
def do_receive_message(args):
"""Receive a message from a queue: receive_message <queue_name> [timeout]"""
parts = args.split()
if len(parts) not in (1, 2):
return "Invalid arguments. Usage: receive_message <queue_name> [timeout]"
queue_name = parts[0]
timeout = float(parts[1]) if len(parts) == 2 else None
message = message_bus.receive_message(queue_name, timeout)
if message is not None:
return f"Received message from queue '{queue_name}': {message}"
else:
return f"No message available in queue '{queue_name}'"
commands = {
'create_queue': do_create_queue,
'delete_queue': do_delete_queue,
'send_message': do_send_message,
'receive_message': do_receive_message,
}
def get_commands():
return commands
def initialize():
print("Message bus module initialized")
def shutdown():
print("Message bus module shut down")

View File

@ -0,0 +1,49 @@
message_bus = None
def set_message_bus(bus):
global message_bus
message_bus = bus
def do_something_and_notify(args):
# Do something...
result = "Operation completed"
# Notify another module if message bus is available
if message_bus:
message_bus.send_message('notifications', f"Operation result: {result}")
return "Operation completed and notification sent"
else:
return "Operation completed (notification not sent, message bus not available)"
def do_check_notifications(args):
if not message_bus:
return "Message bus not available"
message = message_bus.receive_message('notifications', timeout=1)
if message:
return f"Received notification: {message}"
else:
return "No new notifications"
commands = {
'do_something': do_something_and_notify,
'check_notifications': do_check_notifications,
}
def get_commands():
return commands
def initialize():
global message_bus
try:
from message_bus import message_bus as mb
message_bus = mb
message_bus.create_queue('notifications')
print("Example module initialized with message bus")
except ImportError:
print("Example module initialized without message bus")
def shutdown():
if message_bus:
message_bus.delete_queue('notifications')
print("Example module shut down")

125
modules/user_auth.py Normal file
View File

@ -0,0 +1,125 @@
import hashlib
import uuid
import time
class UserAuth:
def __init__(self):
self.users = {} # Store users as {username: {password_hash, salt}}
self.sessions = {} # Store sessions as {session_id: {username, expiry}}
self.session_duration = 3600 # 1 hour
def hash_password(self, password, salt=None):
if salt is None:
salt = uuid.uuid4().hex
return hashlib.sha256((password + salt).encode()).hexdigest(), salt
def register_user(self, username, password):
if username in self.users:
return False, "User already exists"
password_hash, salt = self.hash_password(password)
self.users[username] = {"password_hash": password_hash, "salt": salt}
return True, "User registered successfully"
def authenticate(self, username, password):
if username not in self.users:
return False, "User not found"
user = self.users[username]
password_hash, _ = self.hash_password(password, user["salt"])
if password_hash == user["password_hash"]:
session_id = uuid.uuid4().hex
expiry = time.time() + self.session_duration
self.sessions[session_id] = {"username": username, "expiry": expiry}
return True, session_id
return False, "Invalid password"
def authenticate_request(self, session_id, action):
if action in ['register', 'login']: # These actions don't require authentication
return True, None
success, result = self.validate_session(session_id)
if not success:
return False, "Authentication required"
return True, result # result here is the username
def validate_session(self, session_id):
if session_id not in self.sessions:
return False, "Invalid session"
session = self.sessions[session_id]
if time.time() > session["expiry"]:
del self.sessions[session_id]
return False, "Session expired"
return True, session["username"]
def logout(self, session_id):
if session_id in self.sessions:
del self.sessions[session_id]
return True, "Logged out successfully"
return False, "Invalid session"
user_auth = UserAuth()
def do_register(args):
"""Register a new user: register <username> <password>"""
try:
username, password = args.split()
success, message = user_auth.register_user(username, password)
return message
except ValueError:
return "Invalid arguments. Usage: register <username> <password>"
def do_login(args):
"""Login a user: login <username> <password>"""
try:
username, password = args.split()
success, result = user_auth.authenticate(username, password)
if success:
return f"Login successful. Session ID: {result}"
return result
except ValueError:
return "Invalid arguments. Usage: login <username> <password>"
def do_validate(args):
"""Validate a session: validate <session_id>"""
success, result = user_auth.validate_session(args)
if success:
return f"Valid session for user: {result}"
return result
def do_logout(args):
"""Logout a user: logout <session_id>"""
success, message = user_auth.logout(args)
return message
def auth_pre_command_hook(command):
action = command.get('action')
session_id = command.get('session_id')
if action in ['register', 'login']:
return True
success, result = user_auth.validate_session(session_id)
if not success:
return False
return True
commands = {
'register': do_register,
'login': do_login,
'validate': do_validate,
'logout': do_logout,
}
def get_commands():
return commands
def initialize():
print("User authentication module initialized")
def shutdown():
print("User authentication module shut down")
def register_hooks(hook_manager):
hook_manager.register_hook('pre_command', auth_pre_command_hook)
def unregister_hooks(hook_manager):
hook_manager.unregister_hook('pre_command', auth_pre_command_hook)