mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 17:20:30 +08:00
get rid of the otg-unlock helper
This commit is contained in:
parent
122242ea47
commit
486f1be986
3
PKGBUILD
3
PKGBUILD
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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):
|
||||||
|
|||||||
@ -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)))
|
||||||
|
|||||||
@ -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()
|
|
||||||
@ -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()
|
|
||||||
@ -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)
|
|
||||||
|
|||||||
@ -53,7 +53,10 @@ class Drive:
|
|||||||
# =====
|
# =====
|
||||||
|
|
||||||
def set_image_path(self, path: str) -> None:
|
def set_image_path(self, path: str) -> None:
|
||||||
self.__set_param("file", path)
|
if 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")
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
2
setup.py
2
setup.py
@ -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",
|
||||||
],
|
],
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
1
testenv/fakes/sys/class/udc/fe980000.usb/device/driver
Symbolic link
1
testenv/fakes/sys/class/udc/fe980000.usb/device/driver
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../../../../bus/platform/drivers/dwc2
|
||||||
1
testenv/fakes/sys/class/udc/fe980000.usb/state
Normal file
1
testenv/fakes/sys/class/udc/fe980000.usb/state
Normal file
@ -0,0 +1 @@
|
|||||||
|
configured
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../../functions/mass_storage.usb0
|
||||||
@ -0,0 +1 @@
|
|||||||
|
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
|
||||||
|
|||||||
@ -14,7 +14,6 @@ kvmd:
|
|||||||
|
|
||||||
msd:
|
msd:
|
||||||
remount_cmd: /bin/true
|
remount_cmd: /bin/true
|
||||||
unlock_cmd: /bin/true
|
|
||||||
|
|
||||||
streamer:
|
streamer:
|
||||||
cmd:
|
cmd:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user