Пример #1
0
 def test_get_config_no_exist(self, base_server: Server):
     fake_path = pathlib.Path("no_exist")
     if fake_path.exists():
         pytest.fail("Path exists")
     args = dict(base_server.app_args)
     args["config_file"] = str(fake_path)
     with pytest.raises(ConfigError):
         confighelper.get_configuration(base_server, args)
Пример #2
0
 def test_get_config_no_server(self, base_server: Server,
                               path_args: Dict[str, pathlib.Path]):
     assets = path_args['asset_path']
     sup_cfg_path = assets.joinpath("moonraker/supplemental.conf")
     if not sup_cfg_path.exists():
         pytest.fail("Supplemental config not found")
     args = dict(base_server.app_args)
     args["config_file"] = str(sup_cfg_path)
     with pytest.raises(ConfigError):
         confighelper.get_configuration(base_server, args)
Пример #3
0
 def test_get_config_no_access(self, base_server: Server,
                               path_args: Dict[str, pathlib.Path]):
     cfg_path = path_args["config_path"]
     test_cfg = cfg_path.joinpath("test.conf")
     shutil.copy(path_args["moonraker.conf"], test_cfg)
     test_cfg.chmod(mode=222)
     args = dict(base_server.app_args)
     args["config_file"] = str(test_cfg)
     with pytest.raises(ConfigError):
         confighelper.get_configuration(base_server, args)
Пример #4
0
    def __init__(self, args, file_logger):
        self.file_logger = file_logger
        config = confighelper.get_configuration(self, args)
        # log config file
        strio = io.StringIO()
        config.write_config(strio)
        cfg_item = f"\n{'#'*20} Moonraker Configuration {'#'*20}\n\n"
        cfg_item += strio.getvalue()
        cfg_item += "#" * 65
        strio.close()
        self.add_log_rollover_item('config', cfg_item)
        self.host = config.get('host', "0.0.0.0")
        self.port = config.getint('port', 7125)

        # Event initialization
        self.events = {}

        # Klippy Connection Handling
        self.klippy_address = config.get('klippy_uds_address',
                                         "/tmp/klippy_uds")
        self.klippy_connection = KlippyConnection(self.process_command,
                                                  self.on_connection_closed)
        self.klippy_info = {}
        self.init_list = []
        self.init_handle = None
        self.init_attempts = 0
        self.klippy_state = "disconnected"
        self.subscriptions = {}
        self.failed_plugins = []

        # Server/IOLoop
        self.server_running = False
        self.moonraker_app = app = MoonrakerApp(config)
        self.register_endpoint = app.register_local_handler
        self.register_static_file_handler = app.register_static_file_handler
        self.register_upload_handler = app.register_upload_handler
        self.ioloop = IOLoop.current()

        self.register_endpoint("/server/info", ['GET'],
                               self._handle_info_request)
        self.register_endpoint("/server/restart", ['POST'],
                               self._handle_server_restart)

        # Setup remote methods accessable to Klippy.  Note that all
        # registered remote methods should be of the notification type,
        # they do not return a response to Klippy after execution
        self.pending_requests = {}
        self.remote_methods = {}
        self.klippy_reg_methods = []
        self.register_remote_method('process_gcode_response',
                                    self._process_gcode_response,
                                    need_klippy_reg=False)
        self.register_remote_method('process_status_update',
                                    self._process_status_update,
                                    need_klippy_reg=False)

        # Plugin initialization
        self.plugins = {}
        self.klippy_apis = self.load_plugin(config, 'klippy_apis')
        self._load_plugins(config)
Пример #5
0
    def __init__(self, args):
        config = confighelper.get_configuration(self, args)
        self.host = config.get('host', "0.0.0.0")
        self.port = config.getint('port', 7125)

        # Event initialization
        self.events = {}

        # Klippy Connection Handling
        self.klippy_address = config.get(
            'klippy_uds_address', "/tmp/klippy_uds")
        self.klippy_connection = KlippyConnection(
            self.process_command, self.on_connection_closed)
        self.init_list = []
        self.init_handle = None
        self.init_attempts = 0
        self.klippy_state = "disconnected"

        # XXX - currently moonraker maintains a superset of all
        # subscriptions, the results of which are forwarded to all
        # connected websockets. A better implementation would open a
        # unique unix domain socket for each websocket client and
        # allow Klipper to forward only those subscriptions back to
        # correct client.
        self.all_subscriptions = {}

        # Server/IOLoop
        self.server_running = False
        self.moonraker_app = app = MoonrakerApp(config)
        self.register_endpoint = app.register_local_handler
        self.register_static_file_handler = app.register_static_file_handler
        self.register_upload_handler = app.register_upload_handler
        self.ioloop = IOLoop.current()

        self.register_endpoint(
            "/server/info", ['GET'], self._handle_info_request)
        self.register_endpoint(
            "/server/restart", ['POST'], self._handle_server_restart)

        # Setup remote methods accessable to Klippy.  Note that all
        # registered remote methods should be of the notification type,
        # they do not return a response to Klippy after execution
        self.pending_requests = {}
        self.remote_methods = {}
        self.klippy_reg_methods = []
        self.register_remote_method(
            'process_gcode_response', self._process_gcode_response,
            need_klippy_reg=False)
        self.register_remote_method(
            'process_status_update', self._process_status_update,
            need_klippy_reg=False)

        # Plugin initialization
        self.plugins = {}
        self.klippy_apis = self.load_plugin(config, 'klippy_apis')
        self._load_plugins(config)
Пример #6
0
 def _parse_config(self) -> confighelper.ConfigHelper:
     config = confighelper.get_configuration(self, self.app_args)
     # log config file
     strio = io.StringIO()
     config.write_config(strio)
     cfg_item = f"\n{'#'*20} Moonraker Configuration {'#'*20}\n\n"
     cfg_item += strio.getvalue()
     cfg_item += "#" * 65
     strio.close()
     self.add_log_rollover_item('config', cfg_item)
     return config
Пример #7
0
    def __init__(self,
                 args: Dict[str, Any],
                 file_logger: Optional[utils.MoonrakerLoggingHandler],
                 event_loop: EventLoop
                 ) -> None:
        self.event_loop = event_loop
        self.file_logger = file_logger
        self.app_args = args
        self.config = config = confighelper.get_configuration(self, args)
        # log config file
        strio = io.StringIO()
        config.write_config(strio)
        cfg_item = f"\n{'#'*20} Moonraker Configuration {'#'*20}\n\n"
        cfg_item += strio.getvalue()
        cfg_item += "#"*65
        strio.close()
        self.add_log_rollover_item('config', cfg_item)
        self.host: str = config.get('host', "0.0.0.0")
        self.port: int = config.getint('port', 7125)
        self.ssl_port: int = config.getint('ssl_port', 7130)
        self.exit_reason: str = ""

        # Configure Debug Logging
        self.debug = config.getboolean('enable_debug_logging', False)
        asyncio_debug = config.getboolean('enable_asyncio_debug', False)
        log_level = logging.DEBUG if self.debug else logging.INFO
        logging.getLogger().setLevel(log_level)
        self.event_loop.set_debug(asyncio_debug)

        # Event initialization
        self.events: Dict[str, List[FlexCallback]] = {}

        # Klippy Connection Handling
        self.klippy_address: str = config.get(
            'klippy_uds_address', "/tmp/klippy_uds")
        self.klippy_connection = KlippyConnection(
            self.process_command, self.on_connection_closed, event_loop)
        self.klippy_info: Dict[str, Any] = {}
        self.init_list: List[str] = []
        self.init_handle: Optional[asyncio.Handle] = None
        self.init_attempts: int = 0
        self.klippy_state: str = "disconnected"
        self.klippy_disconnect_evt: Optional[asyncio.Event] = None
        self.connection_init_lock: asyncio.Lock = asyncio.Lock()
        self.subscriptions: Dict[Subscribable, Dict[str, Any]] = {}
        self.failed_components: List[str] = []
        self.warnings: List[str] = []

        # Tornado Application/Server
        self.server_running: bool = False
        self.moonraker_app = app = MoonrakerApp(config)
        self.register_endpoint = app.register_local_handler
        self.register_static_file_handler = app.register_static_file_handler
        self.register_upload_handler = app.register_upload_handler
        self.get_websocket_manager = app.get_websocket_manager
        self.register_api_transport = app.register_api_transport

        self.register_endpoint(
            "/server/info", ['GET'], self._handle_info_request)
        self.register_endpoint(
            "/server/config", ['GET'], self._handle_config_request)
        self.register_endpoint(
            "/server/restart", ['POST'], self._handle_server_restart)

        self.register_notification("server:klippy_ready")
        self.register_notification("server:klippy_shutdown")
        self.register_notification("server:klippy_disconnect",
                                   "klippy_disconnected")
        self.register_notification("server:gcode_response")

        # Setup remote methods accessable to Klippy.  Note that all
        # registered remote methods should be of the notification type,
        # they do not return a response to Klippy after execution
        self.pending_requests: Dict[int, BaseRequest] = {}
        self.remote_methods: Dict[str, FlexCallback] = {}
        self.klippy_reg_methods: List[str] = []
        self.register_remote_method(
            'process_gcode_response', self._process_gcode_response,
            need_klippy_reg=False)
        self.register_remote_method(
            'process_status_update', self._process_status_update,
            need_klippy_reg=False)

        # Component initialization
        self.components: Dict[str, Any] = {}
        self._load_components(config)
        self.klippy_apis: KlippyAPI = self.lookup_component('klippy_apis')
        config.validate_config()
        self.event_loop.add_signal_handler(
            signal.SIGTERM, self._handle_term_signal)
        self.event_loop.register_callback(self._start_server)
Пример #8
0
    def __init__(self, args: argparse.Namespace,
                 file_logger: Optional[utils.MoonrakerLoggingHandler]) -> None:
        self.file_logger = file_logger
        self.config = config = confighelper.get_configuration(self, args)
        # log config file
        strio = io.StringIO()
        config.write_config(strio)
        cfg_item = f"\n{'#'*20} Moonraker Configuration {'#'*20}\n\n"
        cfg_item += strio.getvalue()
        cfg_item += "#" * 65
        strio.close()
        self.add_log_rollover_item('config', cfg_item)
        self.host: str = config.get('host', "0.0.0.0")
        self.port: int = config.getint('port', 7125)
        self.ssl_port: int = config.getint('ssl_port', 7130)
        self.exit_reason: str = ""

        # Event initialization
        self.events: Dict[str, List[FlexCallback]] = {}

        # Klippy Connection Handling
        self.klippy_address: str = config.get('klippy_uds_address',
                                              "/tmp/klippy_uds")
        self.klippy_connection = KlippyConnection(self.process_command,
                                                  self.on_connection_closed)
        self.klippy_info: Dict[str, Any] = {}
        self.init_list: List[str] = []
        self.init_handle: Optional[object] = None
        self.init_attempts: int = 0
        self.klippy_state: str = "disconnected"
        self.klippy_disconnect_evt: Optional[Event] = None
        self.subscriptions: Dict[Subscribable, Dict[str, Any]] = {}
        self.failed_components: List[str] = []
        self.warnings: List[str] = []

        # Server/IOLoop
        self.server_running: bool = False
        self.moonraker_app = app = MoonrakerApp(config)
        self.register_endpoint = app.register_local_handler
        self.register_static_file_handler = app.register_static_file_handler
        self.register_upload_handler = app.register_upload_handler
        self.ioloop = IOLoop.current()

        self.register_endpoint("/server/info", ['GET'],
                               self._handle_info_request)
        self.register_endpoint("/server/config", ['GET'],
                               self._handle_config_request)
        self.register_endpoint("/server/restart", ['POST'],
                               self._handle_server_restart)

        self.register_notification("server:klippy_ready")
        self.register_notification("server:klippy_shutdown")
        self.register_notification("server:klippy_disconnect",
                                   "klippy_disconnected")
        self.register_notification("server:gcode_response")

        # Setup remote methods accessable to Klippy.  Note that all
        # registered remote methods should be of the notification type,
        # they do not return a response to Klippy after execution
        self.pending_requests: Dict[int, BaseRequest] = {}
        self.remote_methods: Dict[str, FlexCallback] = {}
        self.klippy_reg_methods: List[str] = []
        self.register_remote_method('process_gcode_response',
                                    self._process_gcode_response,
                                    need_klippy_reg=False)
        self.register_remote_method('process_status_update',
                                    self._process_status_update,
                                    need_klippy_reg=False)

        # Component initialization
        self.components: Dict[str, Any] = {}
        self._load_components(config)
        self.klippy_apis: KlippyAPI = self.lookup_component('klippy_apis')
        config.validate_config()