diff options
author | Devaev Maxim <[email protected]> | 2019-10-19 19:37:32 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2019-10-19 19:37:32 +0300 |
commit | 34da341edc5f319a0bb0c77937470ad7cb58a140 (patch) | |
tree | 059071c94f1d6983e532873b741c1af0eb390e85 /kvmd/helpers | |
parent | c0c1febf7279fcf5e6e265a21b9561938e7bb22f (diff) |
otg msd helpers
Diffstat (limited to 'kvmd/helpers')
-rw-r--r-- | kvmd/helpers/__init__.py | 0 | ||||
-rw-r--r-- | kvmd/helpers/otgmsd/__init__.py | 0 | ||||
-rw-r--r-- | kvmd/helpers/otgmsd/remount/__init__.py | 64 | ||||
-rw-r--r-- | kvmd/helpers/otgmsd/remount/__main__.py | 24 | ||||
-rw-r--r-- | kvmd/helpers/otgmsd/unlock/__init__.py | 54 | ||||
-rw-r--r-- | kvmd/helpers/otgmsd/unlock/__main__.py | 24 |
6 files changed, 166 insertions, 0 deletions
diff --git a/kvmd/helpers/__init__.py b/kvmd/helpers/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/kvmd/helpers/__init__.py diff --git a/kvmd/helpers/otgmsd/__init__.py b/kvmd/helpers/otgmsd/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/kvmd/helpers/otgmsd/__init__.py diff --git a/kvmd/helpers/otgmsd/remount/__init__.py b/kvmd/helpers/otgmsd/remount/__init__.py new file mode 100644 index 00000000..2eba6add --- /dev/null +++ b/kvmd/helpers/otgmsd/remount/__init__.py @@ -0,0 +1,64 @@ +# ========================================================================== # +# # +# 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 sys +import subprocess + + +# ==== +_MOUNT_PATH = "/bin/mount" +_FSTAB_PATH = "/etc/fstab" +_OPTION = "X-kvmd.otg-msd" + + +# ===== +def _find_mountpoint() -> str: + with open(_FSTAB_PATH) as fstab_file: + for line in fstab_file.read().split("\n"): + line = line.strip() + if line and not line.startswith("#"): + parts = line.split() + if len(parts) == 6: + options = parts[3].split(",") + if _OPTION in options: + return parts[1] + raise SystemExit(f"Can't find {_OPTION!r} mountpoint in {_FSTAB_PATH}") + + +def _remount(path: str, ro: bool) -> None: + try: + subprocess.check_call([ + _MOUNT_PATH, + "--options", + f"remount,{'ro' if ro else 'rw'}", + path, + ]) + except subprocess.CalledProcessError as err: + raise SystemExit(str(err)) from None + + +# ===== +def main() -> None: + if len(sys.argv) != 2 or sys.argv[1] not in ["ro", "rw"]: + raise SystemExit(f"This program will remount a first volume marked by {_OPTION!r} option in {_FSTAB_PATH}\n\n" + f"Usage: python -m kvmd.helpers.otgmsd.remount [-h|--help|ro|rw]") + _remount(_find_mountpoint(), (sys.argv[1] == "ro")) diff --git a/kvmd/helpers/otgmsd/remount/__main__.py b/kvmd/helpers/otgmsd/remount/__main__.py new file mode 100644 index 00000000..77f4e294 --- /dev/null +++ b/kvmd/helpers/otgmsd/remount/__main__.py @@ -0,0 +1,24 @@ +# ========================================================================== # +# # +# 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/>. # +# # +# ========================================================================== # + + +from . import main +main() diff --git a/kvmd/helpers/otgmsd/unlock/__init__.py b/kvmd/helpers/otgmsd/unlock/__init__.py new file mode 100644 index 00000000..9bdf353f --- /dev/null +++ b/kvmd/helpers/otgmsd/unlock/__init__.py @@ -0,0 +1,54 @@ +# ========================================================================== # +# # +# 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 sys +import signal + +import psutil + + +# ===== +_PROCESS_NAME = "file-storage" + + +# ===== +def _unlock() -> None: + # https://github.com/torvalds/linux/blob/3039fad/drivers/usb/gadget/function/f_mass_storage.c#L2924 + found = False + for proc in psutil.process_iter(): + attrs = proc.as_dict(attrs=["name", "exe"]) + if attrs.get("name") == _PROCESS_NAME and not attrs.get("exe"): + try: + proc.send_signal(signal.SIGUSR1) + found = True + except Exception as err: + raise SystemExit(f"Can't send SIGUSR1 to MSD kernel thread with pid={attrs['pid']}: {err}") + if not found: + raise SystemExit(f"Can't find MSD kernel thread {_PROCESS_NAME!r}") + + +# ===== +def main() -> None: + if len(sys.argv) != 2 or sys.argv[1] != "unlock": + raise SystemExit(f"This program interrupts all IO operations performed by OTG MSD.\n\n" + f"Usage: python -m kvmd.helpers.otgmsd.unlock [-h|--help|unlock]") + _unlock() diff --git a/kvmd/helpers/otgmsd/unlock/__main__.py b/kvmd/helpers/otgmsd/unlock/__main__.py new file mode 100644 index 00000000..77f4e294 --- /dev/null +++ b/kvmd/helpers/otgmsd/unlock/__main__.py @@ -0,0 +1,24 @@ +# ========================================================================== # +# # +# 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/>. # +# # +# ========================================================================== # + + +from . import main +main() |