diff --git a/.idea/meshview-2.iml b/.idea/meshview 4.iml similarity index 100% rename from .idea/meshview-2.iml rename to .idea/meshview 4.iml diff --git a/.idea/modules.xml b/.idea/modules.xml index 99ffd7e..c25156b 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..4bc5ff1 --- /dev/null +++ b/config.py @@ -0,0 +1,31 @@ +import configparser +import argparse + +# Parse command-line arguments +parser = argparse.ArgumentParser(description="MeshView Configuration Loader") +parser.add_argument("--config", type=str, default="config.ini", help="Path to config.ini file (default: config.ini)") +args = parser.parse_args() + +# Initialize config parser +config = configparser.ConfigParser() +if not config.read(args.config): + raise FileNotFoundError(f"Config file '{args.config}' not found! Ensure the file exists.") + +# MQTT settings +SERVER = config["MQTT"].get("SERVER", "localhost") +TOPICS = config["MQTT"].get("TOPICS", "").split(",") # Convert to list +MQTT_PORT = int(config["MQTT"].get("PORT", 1883)) +USERNAME = config["MQTT"].get("USERNAME", "") +PASSWORD = config["MQTT"].get("PASSWORD", "") + +# Database settings +CONNECTION_STRING = config["DATABASE"].get("CONNECTION_STRING", "sqlite:///meshview.db") + +# Server settings +BIND = config["SERVER"].get("BIND", "0.0.0.0") +WEB_PORT = int(config["SERVER"].get("PORT", 8080)) +TLS_CERTS = config["SERVER"].get("TLS_CERTS", "") +ACME_CHALLENGE = config["SERVER"].get("ACME_CHALLENGE", "") + +# Website settings +TITLE = config["WEBSITE"].get("TITLE", "MeshView") diff --git a/main.py b/main.py index f9a791e..828a47c 100644 --- a/main.py +++ b/main.py @@ -1,48 +1,12 @@ import asyncio -import argparse -import configparser -from meshview import mqtt_reader -from meshview import database -from meshview import mqtt_store from meshview import web +async def main(): - -async def load_database_from_mqtt(mqtt_server: str , mqtt_port: int, topic: list, mqtt_user: str | None = None, mqtt_passwd: str | None = None): - async for topic, env in mqtt_reader.get_topic_envelopes(mqtt_server, mqtt_port, topic, mqtt_user, mqtt_passwd): - await mqtt_store.process_envelope(topic, env) - - -async def main(config): - database.init_database(config["database"]["connection_string"]) - - #await database.create_tables() - async with asyncio.TaskGroup() as tg: tg.create_task( - web.run_server( - config["server"]["bind"], - int(config["server"]["port"]), - config["server"].get("tls_cert"), - ) + web.run_server() ) -def load_config(file_path): - """Load configuration from an INI-style text file.""" - config_parser = configparser.ConfigParser() - config_parser.read(file_path) - - # Convert to a dictionary for easier access - config = {section: dict(config_parser.items(section)) for section in config_parser.sections()} - return config - - - if __name__ == '__main__': - parser = argparse.ArgumentParser("meshview") - parser.add_argument("--config", help="Path to the configuration file.", default="config.ini") - args = parser.parse_args() - - config = load_config(args.config) - - asyncio.run(main(config)) \ No newline at end of file + asyncio.run(main()) diff --git a/meshview/web.py b/meshview/web.py index bedd3db..47c78ef 100644 --- a/meshview/web.py +++ b/meshview/web.py @@ -20,10 +20,14 @@ from meshtastic.protobuf.portnums_pb2 import PortNum from meshview import store from meshview import models from meshview import decode_payload -import gc +from meshview import database import psutil +import gc +import config env = Environment(loader=PackageLoader("meshview"), autoescape=select_autoescape()) +# Start Database +database.init_database(config.CONNECTION_STRING) # Optimize garbage collection frequency gc.set_threshold(100, 10, 10) @@ -1329,21 +1333,27 @@ async def nodegraph(request): -async def run_server(bind, port, tls_cert): - gc.set_threshold(10, 10, 10) +@routes.get("/config") +async def get_config(request): + return web.json_response({ + "Server": config.SERVER, + "Title": config.TITLE + }) + + +async def run_server(): app = web.Application() app.add_routes(routes) runner = web.AppRunner(app) await runner.setup() - if tls_cert: + if config.TLS_CERTS: ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) - ssl_context.load_cert_chain(tls_cert) + ssl_context.load_cert_chain(config.TLS_CERTS) else: ssl_context = None - for host in bind: - site = web.TCPSite(runner, host, port, ssl_context=ssl_context) + for host in config.BIND: + site = web.TCPSite(runner, host, config.WEB_PORT, ssl_context=ssl_context) await site.start() - print_memory_usage() while True: await asyncio.sleep(3600) # sleep forever