Added message_bus module for module to module comms. Some changes to core_daemon and daemon_cli...
This commit is contained in:
95
modules/message_bus.py
Normal file
95
modules/message_bus.py
Normal 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")
|
49
modules/messages_example.py
Normal file
49
modules/messages_example.py
Normal 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
125
modules/user_auth.py
Normal 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)
|
Reference in New Issue
Block a user