summaryrefslogtreecommitdiff
path: root/kvmd/plugins/__init__.py
blob: 235e7e0e181e7450e699cbf1c10b5659c5d4304c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ========================================================================== #
#                                                                            #
#    KVMD - The main Pi-KVM daemon.                                          #
#                                                                            #
#    Copyright (C) 2018  Maxim Devaev <[email protected]>                    #
#                                                                            #
#    This program is free software: you can redistribute it and/or modify    #
#    it under the terms of the GNU General Public License as published by    #
#    the Free Software Foundation, either version 3 of the License, or       #
#    (at your option) any later version.                                     #
#                                                                            #
#    This program is distributed in the hope that it will be useful,         #
#    but WITHOUT ANY WARRANTY; without even the implied warranty of          #
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           #
#    GNU General Public License for more details.                            #
#                                                                            #
#    You should have received a copy of the GNU General Public License       #
#    along with this program.  If not, see <https://www.gnu.org/licenses/>.  #
#                                                                            #
# ========================================================================== #


import importlib
import functools
import os

from typing import Dict
from typing import Type
from typing import Any

from ..yamlconf import Option


# =====
class UnknownPluginError(Exception):
    pass


# =====
class BasePlugin:
    PLUGIN_NAME: str = ""

    def __init__(self, **_: Any) -> None:
        pass  # pragma: nocover

    @classmethod
    def get_options(cls) -> Dict[str, Option]:
        return {}  # pragma: nocover


# =====
def get_plugin_class(sub: str, name: str) -> Type[BasePlugin]:
    classes = _get_plugin_classes(sub)
    try:
        return classes[name]
    except KeyError:
        raise UnknownPluginError("Unknown plugin '%s/%s'" % (sub, name))


# =====
@functools.lru_cache()
def _get_plugin_classes(sub: str) -> Dict[str, Type[BasePlugin]]:
    classes: Dict[str, Type[BasePlugin]] = {}  # noqa: E701
    sub_path = os.path.join(os.path.dirname(__file__), sub)
    for file_name in os.listdir(sub_path):
        if not file_name.startswith("__") and file_name.endswith(".py"):
            module_name = file_name[:-3]
            module = importlib.import_module("kvmd.plugins.{}.{}".format(sub, module_name))
            plugin_class = getattr(module, "Plugin")
            classes[plugin_class.PLUGIN_NAME] = plugin_class
    return classes