summaryrefslogtreecommitdiff
path: root/kvmd
diff options
context:
space:
mode:
authorDevaev Maxim <[email protected]>2020-02-29 17:23:57 +0300
committerDevaev Maxim <[email protected]>2020-02-29 17:23:57 +0300
commit75d9b858d73bf3ed31597e554b27520e3e31f72e (patch)
treef52e60f468d7ad99d8e9abf2df590026a4502862 /kvmd
parent5ef5e00da9e5d15270cdc253eb67bef72174b78f (diff)
moved AioExclusiveRegion to aiotools
Diffstat (limited to 'kvmd')
-rw-r--r--kvmd/aioregion.py55
-rw-r--r--kvmd/aiotools.py53
-rw-r--r--kvmd/plugins/atx/gpio.py5
-rw-r--r--kvmd/plugins/msd/otg/__init__.py3
-rw-r--r--kvmd/plugins/msd/relay.py5
5 files changed, 46 insertions, 75 deletions
diff --git a/kvmd/aioregion.py b/kvmd/aioregion.py
deleted file mode 100644
index 4d5e16bc..00000000
--- a/kvmd/aioregion.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# ========================================================================== #
-# #
-# 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 types
-
-from typing import Type
-
-
-# =====
-class AioExclusiveRegion:
- def __init__(self, exc_type: Type[Exception]) -> None:
- self.__exc_type = exc_type
- self.__busy = False
-
- def is_busy(self) -> bool:
- return self.__busy
-
- def enter(self) -> None:
- if not self.__busy:
- self.__busy = True
- return
- raise self.__exc_type()
-
- def exit(self) -> None:
- self.__busy = False
-
- def __enter__(self) -> None:
- self.enter()
-
- def __exit__(
- self,
- _exc_type: Type[BaseException],
- _exc: BaseException,
- _tb: types.TracebackType,
- ) -> None:
- self.exit()
diff --git a/kvmd/aiotools.py b/kvmd/aiotools.py
index 98a2a524..76798e5c 100644
--- a/kvmd/aiotools.py
+++ b/kvmd/aiotools.py
@@ -24,6 +24,7 @@ import os
import asyncio
import functools
import contextlib
+import types
import typing
@@ -32,14 +33,13 @@ from typing import Callable
from typing import Coroutine
from typing import Generator
from typing import AsyncGenerator
+from typing import Type
from typing import TypeVar
from typing import Any
import aiofiles
import aiofiles.base
-from . import aioregion
-
from .logging import get_logger
@@ -104,16 +104,6 @@ def run_sync(coro: Coroutine[Any, Any, _RetvalT]) -> _RetvalT:
# =====
-def unregion_only_on_exception(region: aioregion.AioExclusiveRegion) -> Generator[None, None, None]:
- region.enter()
- try:
- yield
- except: # noqa: E722
- region.exit()
- raise
-
-
@contextlib.asynccontextmanager
async def unlock_only_on_exception(lock: asyncio.Lock) -> AsyncGenerator[None, None]:
await lock.acquire()
@@ -129,3 +119,42 @@ async def afile_write_now(afile: aiofiles.base.AiofilesContextManager, data: byt
await afile.write(data)
await afile.flush()
await run_async(os.fsync, afile.fileno())
+
+
+# =====
+class AioExclusiveRegion:
+ def __init__(self, exc_type: Type[Exception]) -> None:
+ self.__exc_type = exc_type
+ self.__busy = False
+
+ def is_busy(self) -> bool:
+ return self.__busy
+
+ def enter(self) -> None:
+ if not self.__busy:
+ self.__busy = True
+ return
+ raise self.__exc_type()
+
+ def exit(self) -> None:
+ self.__busy = False
+
+ @contextlib.contextmanager
+ def exit_only_on_exception(self) -> Generator[None, None, None]:
+ self.enter()
+ try:
+ yield
+ except: # noqa: E722
+ self.exit()
+ raise
+
+ def __enter__(self) -> None:
+ self.enter()
+
+ def __exit__(
+ self,
+ _exc_type: Type[BaseException],
+ _exc: BaseException,
+ _tb: types.TracebackType,
+ ) -> None:
+ self.exit()
diff --git a/kvmd/plugins/atx/gpio.py b/kvmd/plugins/atx/gpio.py
index c657a7f3..cca58a18 100644
--- a/kvmd/plugins/atx/gpio.py
+++ b/kvmd/plugins/atx/gpio.py
@@ -29,7 +29,6 @@ from typing import AsyncGenerator
from ...logging import get_logger
from ... import aiotools
-from ... import aioregion
from ... import gpio
from ...yamlconf import Option
@@ -75,7 +74,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
self.__state_poll = state_poll
- self.__region = aioregion.AioExclusiveRegion(AtxIsBusyError)
+ self.__region = aiotools.AioExclusiveRegion(AtxIsBusyError)
@classmethod
def get_plugin_options(cls) -> Dict:
@@ -163,7 +162,7 @@ class Plugin(BaseAtx): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def __click(self, name: str, pin: int, delay: float) -> None:
- with aiotools.unregion_only_on_exception(self.__region):
+ with self.__region.exit_only_on_exception():
await self.__inner_click(name, pin, delay)
@aiotools.tasked
diff --git a/kvmd/plugins/msd/otg/__init__.py b/kvmd/plugins/msd/otg/__init__.py
index 41e1653f..f3695530 100644
--- a/kvmd/plugins/msd/otg/__init__.py
+++ b/kvmd/plugins/msd/otg/__init__.py
@@ -45,7 +45,6 @@ from ....validators.os import valid_abs_dir
from ....validators.os import valid_command
from .... import aiotools
-from .... import aioregion
from .. import MsdError
from .. import MsdIsBusyError
@@ -111,7 +110,7 @@ class _State:
self.vd: Optional[_VirtualDriveState] = None
self._lock = asyncio.Lock()
- self._region = aioregion.AioExclusiveRegion(MsdIsBusyError)
+ self._region = aiotools.AioExclusiveRegion(MsdIsBusyError)
@contextlib.asynccontextmanager
async def busy(self, check_online: bool=True) -> AsyncGenerator[None, None]:
diff --git a/kvmd/plugins/msd/relay.py b/kvmd/plugins/msd/relay.py
index 4e621cc2..81456efa 100644
--- a/kvmd/plugins/msd/relay.py
+++ b/kvmd/plugins/msd/relay.py
@@ -40,7 +40,6 @@ import aiofiles.base
from ...logging import get_logger
from ... import aiotools
-from ... import aioregion
from ... import gpio
from ...yamlconf import Option
@@ -174,7 +173,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
self.__init_retries = init_retries
self.__reset_delay = reset_delay
- self.__region = aioregion.AioExclusiveRegion(MsdIsBusyError)
+ self.__region = aiotools.AioExclusiveRegion(MsdIsBusyError)
self.__device_info: Optional[_DeviceInfo] = None
self.__connected = False
@@ -235,7 +234,7 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
@aiotools.atomic
async def reset(self) -> None:
- with aiotools.unregion_only_on_exception(self.__region):
+ with self.__region.exit_only_on_exception():
await self.__inner_reset()
@aiotools.tasked