From 1e96abd8888f408454ac4e1bea5dc73f1b3556f8 Mon Sep 17 00:00:00 2001 From: Alexandr Ilenko Date: Fri, 24 Jun 2022 17:53:39 +0300 Subject: Add: nfs, smb protocols to virtual-media, cdrom pre-configured --- .../virtual-media/virtual-media.bbappend | 10 +- ...dia.3-Upd-Use-umount2-.-instead-of-umount.patch | 37 +++ ...-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch | 17 ++ ...-media.3-Upd-Just-move-SmbShare-s-methods.patch | 47 ++++ ...ia.3-Upd-Split-SmbShare-to-NetDevShare-an.patch | 73 ++++++ ...media.3-Add-NfsShare-based-on-NetDevShare.patch | 87 +++++++ ...ia.3-Upd-Apply-NetDevShare-devices-CifsSh.patch | 101 ++++++++ ...ia.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch | 264 +++++++++++++++++++++ ...ia.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch | 159 +++++++++++++ 9 files changed, 794 insertions(+), 1 deletion(-) create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch create mode 100644 meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend index 31aea02c0a..03d468783b 100644 --- a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend @@ -8,6 +8,14 @@ SRC_URI += "\ file://0005-virtual-media.1-Fix-Use-machine.forceDisconnectNbd.patch \ file://0006-Upd-disable-tls13-ciphers-for-http-protocol.patch \ file://0007-Upd-rename-Slot_-0123-to-USB-0123-in-virtual-media.j.patch \ + file://0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch \ + file://0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch \ + file://0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch \ + file://0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch \ + file://0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch \ + file://0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch \ + file://0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch \ + file://0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch \ " -RDEPENDS:${PN}:append = " nfs-utils-mount" +RDEPENDS:${PN}:append = " nfs-utils-mount phosphor-misc-usb-ctrl" diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch new file mode 100644 index 0000000000..1695161967 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch @@ -0,0 +1,37 @@ +From 23c187385db3228bd01520fc0dc7f83cd988e37a Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 09:56:47 +0300 +Subject: [PATCH 08/20] virtual-media.3: Upd: Use "::umount2(.)" instead of + "::umount(.)" + +--- + src/resources.hpp | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/src/resources.hpp b/src/resources.hpp +index b211d55..e307955 100644 +--- a/src/resources.hpp ++++ b/src/resources.hpp +@@ -88,10 +88,17 @@ class Mount + + ~Mount() + { +- if (int result = ::umount(directory->getPath().string().c_str())) ++ if (int result = ::umount2(directory->getPath().string().c_str(), MNT_DETACH)) + { +- LogMsg(Logger::Error, result, " : Unable to unmout directory ", ++ LogMsg(Logger::Error, result, " : Unable to lazy unmout directory. Attempt to force umount ", + directory->getPath()); ++ result = ::umount2(directory->getPath().string().c_str(), MNT_FORCE); ++ if (result) ++ { ++ LogMsg(Logger::Error, result, " : Unable to unmout directory ", ++ directory->getPath().string()); ++ return; ++ } + } + } + +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch new file mode 100644 index 0000000000..db3b677240 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch @@ -0,0 +1,17 @@ +From 5bc7ec6580751844474bd7c111394cce76e2dbf8 Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 09:43:07 +0300 +Subject: [PATCH 09/20] virtual-media.3: Upd: Just re-name "{smb=>netdev}.hpp" + +--- + src/{smb.hpp => netdev.hpp} | 0 + 1 file changed, 0 insertions(+), 0 deletions(-) + rename src/{smb.hpp => netdev.hpp} (100%) + +diff --git a/src/smb.hpp b/src/netdev.hpp +similarity index 100% +rename from src/smb.hpp +rename to src/netdev.hpp +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch new file mode 100644 index 0000000000..6e947c6081 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch @@ -0,0 +1,47 @@ +From b3ce2fd3b4095b8232d679d48a1156aec84aa0c7 Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 09:52:28 +0300 +Subject: [PATCH 10/20] virtual-media.3: Upd: Just move SmbShare`s methods + +--- + src/netdev.hpp | 17 +++++++++-------- + 1 file changed, 9 insertions(+), 8 deletions(-) + +diff --git a/src/netdev.hpp b/src/netdev.hpp +index 9e4a2fc..064b340 100644 +--- a/src/netdev.hpp ++++ b/src/netdev.hpp +@@ -13,6 +13,15 @@ namespace fs = std::filesystem; + + class SmbShare + { ++ protected: ++ std::string mountDir; ++ ++ /* Check if username does not contain comma (,) character */ ++ bool validateUsername(const std::string& username) ++ { ++ return username.find(',') == std::string::npos; ++ } ++ + public: + SmbShare(const fs::path& mountDir) : mountDir(mountDir) + { +@@ -68,14 +77,6 @@ class SmbShare + } + + private: +- std::string mountDir; +- +- /* Check if username does not contain comma (,) character */ +- bool validateUsername(const std::string& username) +- { +- return username.find(',') == std::string::npos; +- } +- + int mountWithSmbVers(const fs::path& remote, std::string options, + const std::string& version) + { +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch new file mode 100644 index 0000000000..e6d693fde3 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch @@ -0,0 +1,73 @@ +From 36cb2a2adc06483e65278e367d2146934cfaf080 Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 09:53:41 +0300 +Subject: [PATCH 11/20] virtual-media.3: Upd: Split "SmbShare" to "NetDevShare" + and "CifsShare" + +--- + src/netdev.hpp | 28 ++++++++++++++++++++++++---- + 1 file changed, 24 insertions(+), 4 deletions(-) + +diff --git a/src/netdev.hpp b/src/netdev.hpp +index 064b340..47d39a1 100644 +--- a/src/netdev.hpp ++++ b/src/netdev.hpp +@@ -11,8 +11,19 @@ + + namespace fs = std::filesystem; + +-class SmbShare ++class NetDevShare + { ++ public: ++ NetDevShare(const fs::path& mountDir) : mountDir(mountDir) ++ { ++ } ++ ~NetDevShare() = default; ++ ++ virtual const char* getMountType() const = 0; ++ ++ virtual bool mount(const fs::path& remote, bool rw, ++ const std::unique_ptr& credentials) = 0; ++ + protected: + std::string mountDir; + +@@ -21,14 +32,23 @@ class SmbShare + { + return username.find(',') == std::string::npos; + } ++}; + ++class SmbShare : public NetDevShare ++{ ++ static constexpr const char* mountType = "cifs"; + public: +- SmbShare(const fs::path& mountDir) : mountDir(mountDir) ++ SmbShare(const fs::path& mountDir) : NetDevShare(mountDir) ++ { ++ } ++ ++ virtual const char* getMountType() const override + { ++ return mountType; + } + + bool mount(const fs::path& remote, bool rw, +- const std::unique_ptr& credentials) ++ const std::unique_ptr& credentials) override + { + LogMsg(Logger::Debug, "Trying to mount remote : ", remote); + +@@ -82,7 +102,7 @@ class SmbShare + { + options += "," + version; + +- auto ec = ::mount(remote.c_str(), mountDir.c_str(), "cifs", 0, ++ auto ec = ::mount(remote.c_str(), mountDir.c_str(), mountType, 0, + options.c_str()); + utils::secureCleanup(options); + +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch new file mode 100644 index 0000000000..a3a64087b8 --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch @@ -0,0 +1,87 @@ +From 190e85aaf6cfa553ce31467a7ef57a1ae13305a5 Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 09:46:43 +0300 +Subject: [PATCH 12/20] virtual-media.3: Add: "NfsShare", based on + "NetDevShare" + +--- + src/netdev.hpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 66 insertions(+) + +diff --git a/src/netdev.hpp b/src/netdev.hpp +index 47d39a1..fc1b907 100644 +--- a/src/netdev.hpp ++++ b/src/netdev.hpp +@@ -115,3 +115,69 @@ class SmbShare : public NetDevShare + return ec; + } + }; ++ ++class NfsShare final: public NetDevShare ++{ ++ static constexpr const char* mountType = "nfs"; ++ public: ++ explicit NfsShare(const fs::path& mountDir): NetDevShare(mountDir) ++ { ++ } ++ ++ virtual const char* getMountType() const override ++ { ++ return mountType; ++ } ++ ++ bool mount(const fs::path& remote, bool rw, ++ const std::unique_ptr& credentials) override ++ { ++ LogMsg(Logger::Debug, "Trying to mount remote : ", remote); ++ ++ try { ++ auto mountUri = parseMountUri(remote); ++ const std::string params = "nolock"; ++ const std::string& mountAddress = mountUri.first; ++ const std::string& mountPath = mountUri.second; ++ auto options = params + ",addr=" + mountAddress; ++ ++ LogMsg(Logger::Debug, "Mounting URI: ", mountPath); ++ LogMsg(Logger::Debug, "With options: ", options); ++ ++ auto ec = ::mount((":" + mountPath).c_str(), mountDir.c_str(), ++ mountType, 0, options.c_str()); ++ utils::secureCleanup(options); ++ ++ if (ec) ++ { ++ LogMsg(Logger::Error, "Mount failed with ec = ", ec, ++ " errno = ", errno); ++ return false; ++ } ++ } catch (const std::exception& ex) { ++ ++ LogMsg(Logger::Error, "Mount failed: ", ex.what()); ++ return false; ++ } ++ return true; ++ } ++ private: ++ using MountAddress = std::string; ++ using MountPath = std::string; ++ ++ static std::pair parseMountUri(const std::string uri) ++ { ++ // All paths start with '//', so seek a cursor to the 2 positions ++ // forward. ++ constexpr unsigned char startAddressPos = 2U; ++ auto hostnameEndPos = uri.find('/', startAddressPos); ++ if (hostnameEndPos == std::string::npos) { ++ throw std::invalid_argument("Mount Uri"); ++ } ++ return { ++ uri.substr(startAddressPos, hostnameEndPos - startAddressPos), ++ uri.substr(hostnameEndPos), ++ }; ++ } ++ ++}; +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch new file mode 100644 index 0000000000..a94ced515f --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch @@ -0,0 +1,101 @@ +From 740679a451f361b83f9604d238f02ef95aefd01e Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 10:02:29 +0300 +Subject: [PATCH 13/20] virtual-media.3: Upd: Apply "NetDevShare" devices + ("CifsShare" and "NfsShare") + +--- + src/resources.hpp | 9 +++++---- + src/state/activating_state.cpp | 11 ++++++++--- + src/state/activating_state.hpp | 1 + + 3 files changed, 14 insertions(+), 7 deletions(-) + +diff --git a/src/resources.hpp b/src/resources.hpp +index e307955..f300308 100644 +--- a/src/resources.hpp ++++ b/src/resources.hpp +@@ -1,6 +1,6 @@ + #pragma once + +-#include "smb.hpp" ++#include "netdev.hpp" + #include "system.hpp" + + namespace interfaces +@@ -74,15 +74,16 @@ class Mount + Mount& operator=(Mount&& other) = delete; + + explicit Mount( +- std::unique_ptr directory, SmbShare& smb, ++ std::unique_ptr directory, NetDevShare& netDevShare, + const std::filesystem::path& remote, bool rw, + const std::unique_ptr& credentials) : + directory(std::move(directory)) + { +- if (!smb.mount(remote, rw, credentials)) ++ if (!netDevShare.mount(remote, rw, credentials)) + { + throw Error(std::errc::invalid_argument, +- "Failed to mount CIFS share"); ++ (std::stringstream("Failed to mount ") ++ << netDevShare.getMountType() << " share").str()); + } + } + +diff --git a/src/state/activating_state.cpp b/src/state/activating_state.cpp +index f926547..e50d284 100644 +--- a/src/state/activating_state.cpp ++++ b/src/state/activating_state.cpp +@@ -143,13 +143,18 @@ std::unique_ptr ActivatingState::activateLegacyMode() + } + + std::unique_ptr ActivatingState::mountSmbShare() ++{ ++ return mountNetDevShare([](const fs::path& mountDir){ return std::make_unique(mountDir); }); ++} ++ ++std::unique_ptr ActivatingState::mountNetDevShare(const std::function(const fs::path&)>& netDevShareCreator) + { + try + { + auto mountDir = + std::make_unique(machine.getName()); + +- SmbShare smb(mountDir->getPath()); ++ std::unique_ptr netDevShare = netDevShareCreator(mountDir->getPath()); + fs::path remote = getImagePath(machine.getTarget()->imgUrl); + auto remoteParent = "/" + remote.parent_path().string(); + auto localFile = mountDir->getPath() / remote.filename(); +@@ -159,7 +164,7 @@ std::unique_ptr ActivatingState::mountSmbShare() + "\n Local file: ", localFile); + + machine.getTarget()->mountPoint = std::make_unique( +- std::move(mountDir), smb, remoteParent, machine.getTarget()->rw, ++ std::move(mountDir), *netDevShare, remoteParent, machine.getTarget()->rw, + machine.getTarget()->credentials); + + process = spawnNbdKit(machine, localFile); +@@ -195,7 +200,7 @@ std::unique_ptr ActivatingState::mountFtpShare() + + std::unique_ptr ActivatingState::mountNfsShare() + { +- return mountXxxShare("NFS"); ++ return mountNetDevShare([](const fs::path& mountDir){ return std::make_unique(mountDir); }); + } + + std::unique_ptr ActivatingState::mountXxxShare(const char* pMountType) +diff --git a/src/state/activating_state.hpp b/src/state/activating_state.hpp +index affca24..1dca7aa 100644 +--- a/src/state/activating_state.hpp ++++ b/src/state/activating_state.hpp +@@ -30,6 +30,7 @@ struct ActivatingState : public BasicStateT + std::unique_ptr mountFtpShare(); + std::unique_ptr mountNfsShare(); + std::unique_ptr mountXxxShare(const char* pMountType); ++ std::unique_ptr mountNetDevShare(const std::function(const fs::path&)>& netDevShareCreator); + + static std::unique_ptr + spawnNbdKit(interfaces::MountPointStateMachine& machine, +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch new file mode 100644 index 0000000000..d52a8d4afd --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch @@ -0,0 +1,264 @@ +From c367cf3c1b092ad00ee4865b2f470169ef65c74e Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Mon, 20 Jun 2022 18:36:59 +0300 +Subject: [PATCH 14/20] virtual-media.1: Upd: Use "usb-ctrl" instead of + "sysfs". Add: machine.target.type + +--- + src/interfaces/mount_point_state_machine.hpp | 1 + + src/resources.cpp | 2 + + src/state/initial_state.hpp | 20 +++- + src/system.hpp | 120 ++++++++++--------- + 4 files changed, 86 insertions(+), 57 deletions(-) + +diff --git a/src/interfaces/mount_point_state_machine.hpp b/src/interfaces/mount_point_state_machine.hpp +index c4b4391..b023b63 100644 +--- a/src/interfaces/mount_point_state_machine.hpp ++++ b/src/interfaces/mount_point_state_machine.hpp +@@ -16,6 +16,7 @@ struct MountPointStateMachine + { + std::string imgUrl; + bool rw; ++ UsbGadget::InterfaceType type; + std::unique_ptr mountPoint; + std::unique_ptr credentials; + }; +diff --git a/src/resources.cpp b/src/resources.cpp +index a501bba..950f698 100644 +--- a/src/resources.cpp ++++ b/src/resources.cpp +@@ -23,6 +23,8 @@ Gadget::Gadget(interfaces::MountPointStateMachine& machine, + { + status = UsbGadget::configure( + std::string(machine.getName()), machine.getConfig().nbdDevice, devState, ++ machine.getTarget() ? machine.getTarget()->type ++ : UsbGadget::interfaceTypeUSB, + machine.getTarget() ? machine.getTarget()->rw : false); + } + +diff --git a/src/state/initial_state.hpp b/src/state/initial_state.hpp +index 0e8876a..e0d8a5d 100644 +--- a/src/state/initial_state.hpp ++++ b/src/state/initial_state.hpp +@@ -153,6 +153,21 @@ struct InitialState : public BasicStateT + machine.getConfig().nbdDevice.to_string()); + iface->register_property("EndpointId", machine.getConfig().endPointId); + iface->register_property("Socket", machine.getConfig().unixSocket); ++ iface->register_property( ++ "InterfaceType", static_cast(UsbGadget::interfaceTypeUSB), ++ [](uint8_t, uint8_t) -> bool { ++ throw sdbusplus::exception::SdBusError( ++ EPERM, "Setting InterfaceType property is not allowed"); ++ return false; ++ }, ++ [&target = machine.getTarget()]( ++ uint8_t) -> uint8_t { ++ if (!target.has_value()) ++ { ++ return UsbGadget::interfaceTypeUSB; ++ } ++ return target->type; ++ }); + iface->register_property( + "ImageURL", std::string(), + []([[maybe_unused]] const std::string& req, +@@ -234,12 +249,15 @@ struct InitialState : public BasicStateT + iface->register_method( + "Mount", [&machine = machine](boost::asio::yield_context yield, + std::string imgUrl, bool rw, ++ uint8_t type, + optional_fd fd) { + LogMsg(Logger::Info, "[App]: Mount called on ", + getObjectPath(machine), machine.getName()); + + interfaces::MountPointStateMachine::Target target = { +- imgUrl, rw, nullptr, nullptr}; ++ imgUrl, rw, ++ static_cast(type), ++ nullptr, nullptr}; + + if (std::holds_alternative(fd)) + { +diff --git a/src/system.hpp b/src/system.hpp +index d0af549..5dfb4df 100644 +--- a/src/system.hpp ++++ b/src/system.hpp +@@ -498,24 +498,48 @@ struct UsbGadget : private FsHelper + static const std::string getGadgetDirPrefix() + { + const std::string gadgetDirPrefix = +- "/sys/kernel/config/usb_gadget/mass-storage-"; ++ "/sys/kernel/config/usb_gadget/"; + return gadgetDirPrefix; + } + + public: ++ enum InterfaceType : uint8_t ++ { ++ interfaceTypeUSB = 0, ++ interfaceTypeHDD = 1, ++ interfaceTypeCDROM = 2, ++ unknown = 0xFF ++ }; ++ + static int32_t configure(const std::string& name, const NBDDevice& nbd, +- StateChange change, const bool rw = false) ++ StateChange change, ++ InterfaceType interfaceType = interfaceTypeUSB, ++ const bool rw = false) + { +- return configure(name, nbd.to_path(), change, rw); ++ return configure(name, nbd.to_path(), change, interfaceType, rw); + } + + static int32_t configure(const std::string& name, const fs::path& path, +- StateChange change, const bool rw = false) ++ StateChange change, ++ InterfaceType interfaceType = interfaceTypeUSB, ++ const bool rw = false) + { + LogMsg(Logger::Info, "[App]: Configure USB Gadget (name=", name, + ", path=", path, ", State=", static_cast(change), ")"); + bool success = true; +- std::error_code ec; ++ static const std::map vmInterfaces { ++ {interfaceTypeUSB, "usb"}, ++ {interfaceTypeHDD, "hdd"}, ++ {interfaceTypeCDROM, "cdrom"}, ++ }; ++ auto interfaceIt = vmInterfaces.find(interfaceType); ++ if (interfaceIt == vmInterfaces.end()) ++ { ++ LogMsg(Logger::Critical, ++ "[App]: Spiecifed unknown interface type: ", interfaceType); ++ return -1; ++ } ++ + if (change == StateChange::unknown) + { + LogMsg(Logger::Critical, +@@ -523,50 +547,35 @@ struct UsbGadget : private FsHelper + return -1; + } + +- const fs::path gadgetDir = getGadgetDirPrefix() + name; +- const fs::path funcMassStorageDir = +- gadgetDir / "functions/mass_storage.usb0"; +- const fs::path stringsDir = gadgetDir / "strings/0x409"; +- const fs::path configDir = gadgetDir / "configs/c.1"; +- const fs::path massStorageDir = configDir / "mass_storage.usb0"; +- const fs::path configStringsDir = configDir / "strings/0x409"; +- + if (change == StateChange::inserted) + { ++ const std::string roConfPath = "/sys/kernel/config/usb_gadget/" + ++ name + "/functions/mass_storage." + ++ name + "/lun.0/ro"; ++ // /usr/bin/usb-ctrl insert [] + try + { +- fs::create_directories(gadgetDir); +- echoToFile(gadgetDir / "idVendor", "0x1d6b"); +- echoToFile(gadgetDir / "idProduct", "0x0104"); +- fs::create_directories(stringsDir); +- echoToFile(stringsDir / "manufacturer", "OpenBMC"); +- echoToFile(stringsDir / "product", "Virtual Media Device"); +- fs::create_directories(configStringsDir); +- echoToFile(configStringsDir / "configuration", "config 1"); +- fs::create_directories(funcMassStorageDir); +- fs::create_directories(funcMassStorageDir / "lun.0"); +- fs::create_directory_symlink(funcMassStorageDir, +- massStorageDir); +- echoToFile(funcMassStorageDir / "lun.0/removable", "1"); +- echoToFile(funcMassStorageDir / "lun.0/ro", rw ? "0" : "1"); +- echoToFile(funcMassStorageDir / "lun.0/cdrom", "0"); +- echoToFile(funcMassStorageDir / "lun.0/file", path); +- +- for (const auto& port : fs::directory_iterator( +- "/sys/bus/platform/devices/1e6a0000.usb-vhub")) ++ std::vector args{ ++ "insert", ++ name, ++ path, ++ interfaceIt->second, ++ }; ++ if (!rw) + { +- if (fs::is_directory(port) && !fs::is_symlink(port) && +- !fs::exists(port.path() / "gadget/suspended")) +- { +- const std::string portId = port.path().filename(); +- LogMsg(Logger::Debug, +- "Use port : ", port.path().filename()); +- echoToFile(gadgetDir / "UDC", portId); +- return 0; +- } ++ args.emplace_back("readonly"); + } ++ auto child = boost::process::child( ++ "/usr/bin/usb-ctrl", boost::process::args(args)); ++ child.wait(); ++ ++ LogMsg(Logger::Debug, "Success of 'usb-ctrl insert ", ++ name.c_str(), " ", path.c_str(), " ", ++ interfaceIt->second.c_str(), ++ "': ", std::strerror(child.exit_code())); ++ return 0; + } +- catch (fs::filesystem_error& e) ++ catch (boost::process::process_error& e) + { + // Got error perform cleanup + LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what()); +@@ -574,7 +583,6 @@ struct UsbGadget : private FsHelper + } + catch (std::ofstream::failure& e) + { +- // Got error perform cleanup + LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what()); + success = false; + } +@@ -582,19 +590,18 @@ struct UsbGadget : private FsHelper + // StateChange: unknown, notMonitored, inserted were handler + // earlier. We'll get here only for removed, or cleanup + +- echoToFile(gadgetDir / "UDC", ""); +- const std::array dirs = { +- massStorageDir.c_str(), funcMassStorageDir.c_str(), +- configStringsDir.c_str(), configDir.c_str(), +- stringsDir.c_str(), gadgetDir.c_str()}; +- for (const char* dir : dirs) ++ // /usr/bin/usb-ctrl eject ++ try + { +- fs::remove(dir, ec); +- if (ec) +- { +- success = false; +- LogMsg(Logger::Error, "[App]: UsbGadget ", ec.message()); +- } ++ auto result = boost::process::system( ++ "/usr/bin/usb-ctrl", "eject", name.c_str()); ++ LogMsg(Logger::Debug, "Success of 'usb-ctrl eject ", name.c_str(), ++ "': ", std::strerror(result)); ++ } ++ catch (boost::process::process_error& e) ++ { ++ LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what()); ++ success = false; + } + + if (success) +@@ -607,7 +614,8 @@ struct UsbGadget : private FsHelper + static std::optional getStats(const std::string& name) + { + const fs::path statsPath = getGadgetDirPrefix() + name + +- "/functions/mass_storage.usb0/lun.0/stats"; ++ "/functions/mass_storage." + name + ++ "/lun.0/stats"; + + std::ifstream ifs(statsPath); + if (!ifs.is_open()) +-- +2.35.1 + diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch new file mode 100644 index 0000000000..ae2bc7d5dd --- /dev/null +++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch @@ -0,0 +1,159 @@ +From c7755195ee7107a72bf40ad3101079f94cf015ae Mon Sep 17 00:00:00 2001 +From: Alexandr Ilenko +Date: Fri, 24 Jun 2022 17:15:54 +0300 +Subject: [PATCH 15/20] virtual-media.1: Fix: Use "usb-ctrl" ("cdrom" is + pre-configured). + +--- + src/configuration.hpp | 18 ++++++++++++++++++ + src/state/initial_state.hpp | 31 ++++++++++++++++++++++++++++++- + src/system.hpp | 3 --- + virtual-media.json | 12 ++++++++---- + 4 files changed, 56 insertions(+), 8 deletions(-) + +diff --git a/src/configuration.hpp b/src/configuration.hpp +index efdddf2..0a713a5 100644 +--- a/src/configuration.hpp ++++ b/src/configuration.hpp +@@ -36,6 +36,7 @@ class Configuration + static constexpr int defaultTimeout = 30; + + NBDDevice nbdDevice; ++ std::string interfaceType; + std::string unixSocket; + std::string endPointId; + std::optional timeout; +@@ -142,6 +143,23 @@ class Configuration + continue; + } + }; ++ const auto interfaceTypeIter = ++ mountpoint.value().find("InterfaceType"); ++ if (interfaceTypeIter != mountpoint.value().cend()) ++ { ++ const std::string* value = ++ interfaceTypeIter->get_ptr(); ++ if (value) ++ { ++ mp.interfaceType = *value; ++ } ++ else ++ { ++ LogMsg(Logger::Error, ++ "InterfaceType required, not set"); ++ continue; ++ } ++ } + const auto unixSocketIter = + mountpoint.value().find("UnixSocket"); + if (unixSocketIter != mountpoint.value().cend()) +diff --git a/src/state/initial_state.hpp b/src/state/initial_state.hpp +index e0d8a5d..7f25fc7 100644 +--- a/src/state/initial_state.hpp ++++ b/src/state/initial_state.hpp +@@ -249,11 +249,40 @@ struct InitialState : public BasicStateT + iface->register_method( + "Mount", [&machine = machine](boost::asio::yield_context yield, + std::string imgUrl, bool rw, +- uint8_t type, ++ // This new argument requires 3-repos to be updated: ++ // uint8_t type, ++ // Let`s use original way: ++ // cdrom-type is pre-configured hardly + optional_fd fd) { + LogMsg(Logger::Info, "[App]: Mount called on ", + getObjectPath(machine), machine.getName()); + ++ uint8_t type = UsbGadget::interfaceTypeUSB; ++ // TODO: extract id<=>string mapping to proper place ++ static const std::map vmInterfaces { ++ {"usb" , UsbGadget::interfaceTypeUSB, }, ++ {"hdd" , UsbGadget::interfaceTypeHDD, }, ++ {"cdrom", UsbGadget::interfaceTypeCDROM, }, ++ }; ++ const auto& interfaceTypeStr = machine.getConfig().interfaceType; ++ auto interfaceIt = vmInterfaces.find(interfaceTypeStr); ++ if (interfaceIt == vmInterfaces.end()) ++ { ++ LogMsg(Logger::Error, ++ "[App]: Spiecifed unknown interface type: ", interfaceTypeStr); ++ interfaceIt = vmInterfaces.begin(); ++ LogMsg(Logger::Warning, ++ "[App]: Forcly apply interface type: ", interfaceIt->first); ++ } ++ type = interfaceIt->second; ++ ++ if (type == UsbGadget::interfaceTypeCDROM && rw) ++ { ++ LogMsg(Logger::Warning, ++ "[App]: Forcly apply read-only for cdrom: "); ++ rw = false; ++ } ++ + interfaces::MountPointStateMachine::Target target = { + imgUrl, rw, + static_cast(type), +diff --git a/src/system.hpp b/src/system.hpp +index 5dfb4df..33e3363 100644 +--- a/src/system.hpp ++++ b/src/system.hpp +@@ -549,9 +549,6 @@ struct UsbGadget : private FsHelper + + if (change == StateChange::inserted) + { +- const std::string roConfPath = "/sys/kernel/config/usb_gadget/" + +- name + "/functions/mass_storage." + +- name + "/lun.0/ro"; + // /usr/bin/usb-ctrl insert [] + try + { +diff --git a/virtual-media.json b/virtual-media.json +index 79615c9..6d035f1 100644 +--- a/virtual-media.json ++++ b/virtual-media.json +@@ -1,34 +1,38 @@ + { + "InactivityTimeout": 1800, + "MountPoints": { +- "USB0": { ++ "ISO0": { + "EndpointId": "/nbd/0", + "Mode": 0, + "NBDDevice": "nbd0", ++ "InterfaceType": "cdrom", + "UnixSocket": "/run/virtual-media/nbd0.sock", + "Timeout": 30, + "BlockSize": 512 + }, +- "USB1": { ++ "USB0": { + "EndpointId": "/nbd/1", + "Mode": 0, + "NBDDevice": "nbd1", ++ "InterfaceType": "usb", + "UnixSocket": "/run/virtual-media/nbd1.sock", + "Timeout": 30, + "BlockSize": 512 + }, +- "USB2": { ++ "ISO1": { + "EndpointId": "", + "Mode": 1, + "NBDDevice": "nbd2", ++ "InterfaceType": "cdrom", + "UnixSocket": "/run/virtual-media/nbd2.sock", + "Timeout": 90, + "BlockSize": 512 + }, +- "USB3": { ++ "USB1": { + "EndpointId": "", + "Mode": 1, + "NBDDevice": "nbd3", ++ "InterfaceType": "usb", + "UnixSocket": "/run/virtual-media/nbd3.sock", + "Timeout": 90, + "BlockSize": 512 +-- +2.35.1 + -- cgit v1.2.3