get rid of the otg-unlock helper

This commit is contained in:
Maxim Devaev 2022-04-10 06:00:10 +03:00
parent 122242ea47
commit 486f1be986
24 changed files with 18 additions and 151 deletions

View File

@ -185,6 +185,9 @@ for _variant in "${_variants[@]}"; do
pkgdesc=\"PiKVM platform configs - $_platform for $_board\" pkgdesc=\"PiKVM platform configs - $_platform for $_board\"
depends=(kvmd=$pkgver-$pkgrel) depends=(kvmd=$pkgver-$pkgrel)
if [ $_board != generic ]; then
depends=(\"\${depends[@]}\" \"linux-rpi-pikvm>=5.15.25-15\")
fi
backup=( backup=(
etc/sysctl.d/99-kvmd.conf etc/sysctl.d/99-kvmd.conf

View File

@ -1,3 +1,2 @@
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-unlock
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount
kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount

View File

@ -1,3 +1,2 @@
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-unlock
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount
kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount

View File

@ -1,3 +1,2 @@
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-unlock
kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount kvmd ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-otgmsd-remount
kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount kvmd-pst ALL=(ALL) NOPASSWD: /usr/bin/kvmd-helper-pst-remount

View File

@ -71,7 +71,7 @@ def _rmdir(path: str) -> None:
def _unlink(path: str, optional: bool=False) -> None: def _unlink(path: str, optional: bool=False) -> None:
logger = get_logger() logger = get_logger()
if optional and not os.access(path, os.F_OK): if optional and not os.access(path, os.F_OK):
logger.info("SKIP-RM - %s", path) logger.info("RM ------ [SKIPPED] %s", path)
return return
logger.info("RM ------ %s", path) logger.info("RM ------ %s", path)
os.unlink(path) os.unlink(path)
@ -185,6 +185,7 @@ class _GadgetConfig:
_chown(join(func_path, "lun.0/cdrom"), user) _chown(join(func_path, "lun.0/cdrom"), user)
_chown(join(func_path, "lun.0/ro"), user) _chown(join(func_path, "lun.0/ro"), user)
_chown(join(func_path, "lun.0/file"), user) _chown(join(func_path, "lun.0/file"), user)
_chown(join(func_path, "lun.0/forced_eject"), user)
_symlink(func_path, join(self.__profile_path, func)) _symlink(func_path, join(self.__profile_path, func))
name = ("Mass Storage Drive" if self.__msd_instance == 0 else f"Extra Drive #{self.__msd_instance}") name = ("Mass Storage Drive" if self.__msd_instance == 0 else f"Extra Drive #{self.__msd_instance}")
self.__create_meta(func, name) self.__create_meta(func, name)
@ -269,8 +270,6 @@ def _cmd_start(config: Section) -> None: # pylint: disable=too-many-statements
logger.info("Enabling the gadget ...") logger.info("Enabling the gadget ...")
_write(join(gadget_path, "UDC"), udc) _write(join(gadget_path, "UDC"), udc)
time.sleep(config.otg.init_delay) time.sleep(config.otg.init_delay)
logger.info("Setting up permissions ...")
_chown(join(gadget_path, "UDC"), config.otg.user) _chown(join(gadget_path, "UDC"), config.otg.user)
_chown(profile_path, config.otg.user) _chown(profile_path, config.otg.user)
@ -290,7 +289,7 @@ def _cmd_stop(config: Section) -> None:
logger.info("Disabling gadget %r ...", config.otg.gadget) logger.info("Disabling gadget %r ...", config.otg.gadget)
_write(join(gadget_path, "UDC"), "\n") _write(join(gadget_path, "UDC"), "\n")
_unlink(join(gadget_path, "os_desc", usb.G_PROFILE_NAME), True) _unlink(join(gadget_path, "os_desc", usb.G_PROFILE_NAME), optional=True)
profile_path = join(gadget_path, usb.G_PROFILE) profile_path = join(gadget_path, usb.G_PROFILE)
for func in os.listdir(profile_path): for func in os.listdir(profile_path):

View File

@ -21,15 +21,12 @@
import os import os
import signal
import errno import errno
import argparse import argparse
from typing import List from typing import List
from typing import Optional from typing import Optional
import psutil
from ...validators.basic import valid_bool from ...validators.basic import valid_bool
from ...validators.basic import valid_int_f0 from ...validators.basic import valid_int_f0
from ...validators.os import valid_abs_file from ...validators.os import valid_abs_file
@ -59,21 +56,6 @@ def _set_param(gadget: str, instance: int, param: str, value: str) -> None:
raise raise
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", "pid"])
if attrs.get("name") == "file-storage" 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("Can't find MSD kernel thread")
# ===== # =====
def main(argv: Optional[List[str]]=None) -> None: def main(argv: Optional[List[str]]=None) -> None:
(parent_parser, argv, config) = init( (parent_parser, argv, config) = init(
@ -88,8 +70,6 @@ def main(argv: Optional[List[str]]=None) -> None:
) )
parser.add_argument("-i", "--instance", default=0, type=valid_int_f0, parser.add_argument("-i", "--instance", default=0, type=valid_int_f0,
metavar="<N>", help="Drive instance (0 for KVMD drive)") metavar="<N>", help="Drive instance (0 for KVMD drive)")
parser.add_argument("--unlock", action="store_true",
help="Send SIGUSR1 to MSD kernel thread")
parser.add_argument("--set-cdrom", default=None, type=valid_bool, parser.add_argument("--set-cdrom", default=None, type=valid_bool,
metavar="<1|0|yes|no>", help="Set CD-ROM flag") metavar="<1|0|yes|no>", help="Set CD-ROM flag")
parser.add_argument("--set-rw", default=None, type=valid_bool, parser.add_argument("--set-rw", default=None, type=valid_bool,
@ -107,11 +87,8 @@ def main(argv: Optional[List[str]]=None) -> None:
set_param = (lambda param, value: _set_param(config.otg.gadget, options.instance, param, value)) set_param = (lambda param, value: _set_param(config.otg.gadget, options.instance, param, value))
get_param = (lambda param: _get_param(config.otg.gadget, options.instance, param)) get_param = (lambda param: _get_param(config.otg.gadget, options.instance, param))
if options.unlock:
_unlock()
if options.eject: if options.eject:
set_param("file", "") set_param("forced_eject", "")
if options.set_cdrom is not None: if options.set_cdrom is not None:
set_param("cdrom", str(int(options.set_cdrom))) set_param("cdrom", str(int(options.set_cdrom)))

View File

@ -1,58 +0,0 @@
# ========================================================================== #
# #
# KVMD - The main PiKVM daemon. #
# #
# Copyright (C) 2018-2022 Maxim Devaev <mdevaev@gmail.com> #
# #
# 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 _log(msg: str) -> None:
print(msg, file=sys.stderr)
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", "pid"])
if attrs.get("name") == _PROCESS_NAME and not attrs.get("exe"):
_log(f"Sending SIGUSR1 to MSD {_PROCESS_NAME!r} kernel thread with pid={attrs['pid']} ...")
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"Usage: {sys.argv[0]} [unlock]")
_unlock()

View File

@ -1,24 +0,0 @@
# ========================================================================== #
# #
# KVMD - The main PiKVM daemon. #
# #
# Copyright (C) 2018-2022 Maxim Devaev <mdevaev@gmail.com> #
# #
# 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()

View File

@ -140,7 +140,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
storage_path: str, storage_path: str,
remount_cmd: List[str], remount_cmd: List[str],
unlock_cmd: List[str],
initial: Dict, initial: Dict,
@ -155,7 +154,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
self.__meta_path = os.path.join(self.__storage_path, "meta") self.__meta_path = os.path.join(self.__storage_path, "meta")
self.__remount_cmd = remount_cmd self.__remount_cmd = remount_cmd
self.__unlock_cmd = unlock_cmd
self.__initial_image: str = initial["image"] self.__initial_image: str = initial["image"]
self.__initial_cdrom: bool = initial["cdrom"] self.__initial_cdrom: bool = initial["cdrom"]
@ -182,7 +180,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
"storage": Option("/var/lib/kvmd/msd", type=valid_abs_dir, unpack_as="storage_path"), "storage": Option("/var/lib/kvmd/msd", type=valid_abs_dir, unpack_as="storage_path"),
"remount_cmd": Option([*sudo, "/usr/bin/kvmd-helper-otgmsd-remount", "{mode}"], type=valid_command), "remount_cmd": Option([*sudo, "/usr/bin/kvmd-helper-otgmsd-remount", "{mode}"], type=valid_command),
"unlock_cmd": Option([*sudo, "/usr/bin/kvmd-helper-otgmsd-unlock", "unlock"], type=valid_command),
"initial": { "initial": {
"image": Option("", type=valid_printable_filename, if_empty=""), "image": Option("", type=valid_printable_filename, if_empty=""),
@ -242,7 +239,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async def reset(self) -> None: async def reset(self) -> None:
async with self.__state.busy(check_online=False): async with self.__state.busy(check_online=False):
try: try:
await self.__unlock_drive()
self.__drive.set_image_path("") self.__drive.set_image_path("")
self.__drive.set_rw_flag(False) self.__drive.set_rw_flag(False)
self.__drive.set_cdrom_flag(False) self.__drive.set_cdrom_flag(False)
@ -292,15 +288,12 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
if not os.path.exists(self.__state.vd.image.path): if not os.path.exists(self.__state.vd.image.path):
raise MsdUnknownImageError() raise MsdUnknownImageError()
await self.__unlock_drive()
self.__drive.set_cdrom_flag(self.__state.vd.cdrom) self.__drive.set_cdrom_flag(self.__state.vd.cdrom)
self.__drive.set_image_path(self.__state.vd.image.path) self.__drive.set_image_path(self.__state.vd.image.path)
else: else:
if not (self.__state.vd.connected or self.__drive.get_image_path()): if not (self.__state.vd.connected or self.__drive.get_image_path()):
raise MsdDisconnectedError() raise MsdDisconnectedError()
await self.__unlock_drive()
self.__drive.set_image_path("") self.__drive.set_image_path("")
self.__state.vd.connected = connected self.__state.vd.connected = connected
@ -479,7 +472,6 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
if os.path.exists(path): if os.path.exists(path):
logger.info("Setting up initial image %r ...", self.__initial_image) logger.info("Setting up initial image %r ...", self.__initial_image)
try: try:
await self.__unlock_drive()
self.__drive.set_cdrom_flag(self.__initial_cdrom) self.__drive.set_cdrom_flag(self.__initial_cdrom)
self.__drive.set_image_path(path) self.__drive.set_image_path(path)
except Exception: except Exception:
@ -547,6 +539,3 @@ class Plugin(BaseMsd): # pylint: disable=too-many-instance-attributes
async def __remount_storage(self, rw: bool) -> None: async def __remount_storage(self, rw: bool) -> None:
await helpers.remount_storage(self.__remount_cmd, rw) await helpers.remount_storage(self.__remount_cmd, rw)
async def __unlock_drive(self) -> None:
await helpers.unlock_drive(self.__unlock_cmd)

View File

@ -53,7 +53,10 @@ class Drive:
# ===== # =====
def set_image_path(self, path: str) -> None: def set_image_path(self, path: str) -> None:
if path:
self.__set_param("file", path) self.__set_param("file", path)
else:
self.__set_param("forced_eject", "")
def get_image_path(self) -> str: def get_image_path(self) -> str:
return self.__get_param("file") return self.__get_param("file")

View File

@ -45,16 +45,6 @@ async def remount_storage(base_cmd: List[str], rw: bool) -> None:
raise raise
async def unlock_drive(base_cmd: List[str]) -> None:
logger = get_logger(0)
logger.info("Unlocking the drive ...")
try:
await _run_helper(base_cmd)
except Exception:
logger.error("Can't unlock the drive")
raise
# ===== # =====
async def _run_helper(cmd: List[str]) -> None: async def _run_helper(cmd: List[str]) -> None:
logger = get_logger(0) logger = get_logger(0)

View File

@ -108,7 +108,6 @@ def main() -> None:
"kvmd.apps.janus", "kvmd.apps.janus",
"kvmd.apps.watchdog", "kvmd.apps.watchdog",
"kvmd.helpers", "kvmd.helpers",
"kvmd.helpers.unlock",
"kvmd.helpers.remount", "kvmd.helpers.remount",
], ],
@ -129,7 +128,6 @@ def main() -> None:
"kvmd-vnc = kvmd.apps.vnc:main", "kvmd-vnc = kvmd.apps.vnc:main",
"kvmd-janus = kvmd.apps.janus:main", "kvmd-janus = kvmd.apps.janus:main",
"kvmd-watchdog = kvmd.apps.watchdog:main", "kvmd-watchdog = kvmd.apps.watchdog:main",
"kvmd-helper-otgmsd-unlock = kvmd.helpers.unlock:main",
"kvmd-helper-otgmsd-remount = kvmd.helpers.remount:main", "kvmd-helper-otgmsd-remount = kvmd.helpers.remount:main",
"kvmd-helper-pst-remount = kvmd.helpers.remount:main", "kvmd-helper-pst-remount = kvmd.helpers.remount:main",
], ],

View File

@ -95,19 +95,10 @@ RUN git clone https://github.com/pikvm/ustreamer \
RUN mkdir -p \ RUN mkdir -p \
/etc/kvmd/{nginx,vnc} \ /etc/kvmd/{nginx,vnc} \
/var/lib/kvmd/msd/{images,meta} \ /var/lib/kvmd/msd/{images,meta} \
/opt/vc/bin \ /opt/vc/bin
/fake_sysfs/sys/kernel/config/usb_gadget/kvmd/configs/c.1 \
/fake_sysfs/sys/kernel/config/usb_gadget/kvmd/functions/mass_storage.usb0/lun.0 \
/fake_sysfs/sys/class/thermal/thermal_zone0 \
/fake_procfs/proc/device-tree \
/fake_sysfs/sys/class/udc/fe980000.usb/device \
/fake_sysfs/sys/bus/platform/drivers/dwc2 \
&& echo configured > /fake_sysfs/sys/class/udc/fe980000.usb/state \
&& ln -s /fake_sysfs/sys/bus/platform/drivers/dwc2 /fake_sysfs/sys/class/udc/fe980000.usb/device/driver
COPY testenv/fakes/vcgencmd /opt/vc/bin/ COPY testenv/fakes/vcgencmd /opt/vc/bin/
COPY testenv/fakes/msd/* /fake_sysfs/sys/kernel/config/usb_gadget/kvmd/functions/mass_storage.usb0/lun.0/ COPY testenv/fakes/sys /fake_sysfs/sys
COPY testenv/fakes/cpu_temp /fake_sysfs/sys/class/thermal/thermal_zone0/temp COPY testenv/fakes/proc /fake_procfs/proc
COPY testenv/fakes/dt_model /fake_procfs/proc/device-tree/model
CMD /bin/bash CMD /bin/bash

View File

@ -0,0 +1 @@
../../../../bus/platform/drivers/dwc2

View File

@ -0,0 +1 @@
configured

View File

@ -0,0 +1 @@
../../functions/mass_storage.usb0

View File

@ -17,7 +17,6 @@ kvmd:
msd: msd:
remount_cmd: /bin/true remount_cmd: /bin/true
unlock_cmd: /bin/true
streamer: streamer:
desired_fps: 30 desired_fps: 30

View File

@ -14,7 +14,6 @@ kvmd:
msd: msd:
remount_cmd: /bin/true remount_cmd: /bin/true
unlock_cmd: /bin/true
streamer: streamer:
cmd: cmd: