diff --git a/galaxy/api/jsonrpc.py b/galaxy/api/jsonrpc.py index 6e431da..9dadb48 100644 --- a/galaxy/api/jsonrpc.py +++ b/galaxy/api/jsonrpc.py @@ -143,8 +143,8 @@ class Server(): self._send_error(request.id, MethodNotFound()) except JsonRpcError as error: self._send_error(request.id, error) - except Exception as error: #pylint: disable=broad-except - logging.error("Unexpected exception raised in plugin handler: %s", repr(error)) + except Exception: #pylint: disable=broad-except + logging.exception("Unexpected exception raised in plugin handler") asyncio.create_task(handle()) diff --git a/galaxy/api/plugin.py b/galaxy/api/plugin.py index fd19f88..a7e35af 100644 --- a/galaxy/api/plugin.py +++ b/galaxy/api/plugin.py @@ -1,9 +1,11 @@ import asyncio import json import logging +import logging.handlers import dataclasses from enum import Enum from collections import OrderedDict +import sys from galaxy.api.jsonrpc import Server, NotificationClient from galaxy.api.consts import Feature @@ -21,6 +23,7 @@ class JSONEncoder(json.JSONEncoder): class Plugin(): def __init__(self, platform, reader, writer, handshake_token): + logging.info("Creating plugin for platform %s", platform.value) self._platform = platform self._feature_methods = OrderedDict() @@ -167,7 +170,10 @@ class Plugin(): async def pass_control(): while self._active: logging.debug("Passing control to plugin") - self.tick() + try: + self.tick() + except Exception: + logging.exception("Unexpected exception raised in plugin tick") await asyncio.sleep(1) await asyncio.gather(pass_control(), self._server.run()) @@ -309,22 +315,40 @@ class Plugin(): async def get_game_times(self): raise NotImplementedError() - def create_and_run_plugin(plugin_class, argv): - if not issubclass(plugin_class, Plugin): - raise TypeError("plugin_class must be subclass of Plugin") + root = logging.getLogger() + root.setLevel(logging.DEBUG) + if len(argv) >= 4: + handler = logging.handlers.RotatingFileHandler(argv[3], "a", 10000000, 10) + root.addHandler(handler) + if len(argv) < 3: - raise ValueError("Not enough parameters, required: token, port") + logging.critical("Not enough parameters, required: token, port") + sys.exit(1) + token = argv[1] + try: port = int(argv[2]) - except ValueError as e: - raise ValueError("Failed to parse port value, {}".format(e)) + except ValueError: + logging.critical("Failed to parse port value: %s", argv[2]) + sys.exit(2) + if not (1 <= port <= 65535): - raise ValueError("Port value out of range (1, 65535)") + logging.critical("Port value out of range (1, 65535)") + sys.exit(3) + + if not issubclass(plugin_class, Plugin): + logging.critical("plugin_class must be subclass of Plugin") + sys.exit(4) async def coroutine(): reader, writer = await asyncio.open_connection("127.0.0.1", port) plugin = plugin_class(reader, writer, token) await plugin.run() - asyncio.run(coroutine()) + + try: + asyncio.run(coroutine()) + except Exception: + logging.exception("Error while running plugin") + sys.exit(5) diff --git a/setup.py b/setup.py index f6c1dc2..3510b19 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages setup( name="galaxy.plugin.api", - version="0.8", + version="0.9", description="Galaxy python plugin API", author='Galaxy team', author_email='galaxy@gog.com',