libzypp 17.31.23
mountingworker.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
9#include "mountingworker.h"
11#include <zypp-media/ng/MediaVerifier>
12#include <zypp-core/fs/PathInfo.h>
13
14#undef ZYPP_BASE_LOGGER_LOGGROUP
15#define ZYPP_BASE_LOGGER_LOGGROUP "MountingWorker"
16
17namespace zyppng::worker
18{
19
20 MountingWorker::MountingWorker( std::string_view workerName, DeviceDriverRef driver )
21 : ProvideWorker( workerName )
22 , _driver(driver)
23 { }
24
26 {
27 _driver->immediateShutdown();
28 }
29
30 zyppng::expected<zyppng::worker::WorkerCaps> MountingWorker::initialize( const zyppng::worker::Configuration &conf )
31 {
32 return _driver->initialize(conf);
33 }
34
36 {
37 _driver->detectDevices();
38 auto &queue = requestQueue();
39
40 if ( !queue.size() )
41 return;
42
43 auto req = queue.front();
44 queue.pop_front();
45
46 MIL_PRV << "Received provide: " << req->_spec.code() << std::endl;
47
48 try {
49 switch ( req->_spec.code () ) {
50 case zyppng::ProvideMessage::Code::Attach: {
51
52 const auto attachUrl = zypp::Url( req->_spec.value( zyppng::AttachMsgFields::Url ).asString() );
53 const auto label = req->_spec.value( zyppng::AttachMsgFields::Label, "No label" ).asString();
54 const auto attachId = req->_spec.value( zyppng::AttachMsgFields::AttachId ).asString();
55 HeaderValueMap vals;
56 req ->_spec.forEachVal([&]( const std::string &name, const auto &val ) {
60 return true;
61 vals.add( name, val );
62 return true;
63 });
64
65 const auto &res = _driver->mountDevice( req->_spec.requestId(), attachUrl, attachId, label, vals );
66 if ( !res ) {
67 const auto &err = res.error();
69 provideFailed( req->_spec.requestId()
70 , err._code
71 , err._reason
72 , err._transient
73 , err._extra );
74 return;
75 }
76
77 MIL << "Attach of " << attachUrl << " was successfull" << std::endl;
78 attachSuccess( req->_spec.requestId() );
79 return;
80 }
81 case zyppng::ProvideMessage::Code::Detach: {
82
83 const auto url = zypp::Url( req->_spec.value( zyppng::DetachMsgFields::Url ).asString() );
84 const auto &attachId = url.getAuthority();
85
86 if ( _driver->detachMedia( attachId ) ) {
87 detachSuccess ( req->_spec.requestId() );
88 } else {
89 provideFailed( req->_spec.requestId()
90 , zyppng::ProvideMessage::Code::NotFound
91 , "Attach ID not known."
92 , false
93 , {} );
94 return;
95 }
96
97 _driver->releaseIdleDevices();
98 return;
99 }
100
101 case zyppng::ProvideMessage::Code::Provide: {
102
103 const auto url = zypp::Url( req->_spec.value( zyppng::DetachMsgFields::Url ).asString() );
104 const auto &attachId = url.getAuthority();
105 const auto &path = zypp::Pathname(url.getPathName());
106 const auto &availMedia = _driver->attachedMedia();
107
108 auto i = availMedia.find( attachId );
109 if ( i == availMedia.end() ) {
110 ERR << "Unknown Attach ID " << attachId << std::endl;
111 provideFailed( req->_spec.requestId()
112 , zyppng::ProvideMessage::Code::NotFound
113 , "Attach ID not known."
114 , false
115 , {} );
116 return;
117 }
118
119 const auto &locPath = i->second._dev->_mountPoint / i->second._attachRoot / path;
120
121 MIL << "Trying to find file: " << locPath << std::endl;
122
123 zypp::PathInfo info( locPath );
124 if( info.isFile() ) {
125 provideSuccess ( req->_spec.requestId(), false, locPath );
126 return;
127 }
128
129 if (info.isExist())
130 provideFailed( req->_spec.requestId()
131 , zyppng::ProvideMessage::Code::NotAFile
132 , zypp::str::Str() << "Path " << path << " exists, but its not a file"
133 , false
134 , {} );
135 else
136 provideFailed( req->_spec.requestId()
137 , zyppng::ProvideMessage::Code::NotFound
138 , zypp::str::Str() << "File " << path << " not found on medium"
139 , false
140 , {} );
141
142
143 break;
144 }
145 default: {
147 provideFailed( req->_spec.requestId()
148 , zyppng::ProvideMessage::Code::BadRequest
149 , "Request type not implemented"
150 , false
151 , {} );
152 return;
153 }
154 }
155 } catch ( const zypp::Exception &e ) {
157 provideFailed( req->_spec.requestId()
158 , zyppng::ProvideMessage::Code::BadRequest
159 , e.asString()
160 , false
161 , {} );
162 return;
163 } catch ( const std::exception &e ) {
165 provideFailed( req->_spec.requestId()
166 , zyppng::ProvideMessage::Code::BadRequest
167 , e.what()
168 , false
169 , {} );
170 return;
171 } catch ( ... ) {
173 provideFailed( req->_spec.requestId()
174 , zyppng::ProvideMessage::Code::BadRequest
175 , "Unknown exception"
176 , false
177 , {} );
178 return;
179 }
180 }
181
182 void MountingWorker::cancel( const std::deque<zyppng::worker::ProvideWorkerItemRef>::iterator &i )
183 {
184 ERR << "Bug, cancel should never be called for running items" << std::endl;
185 }
186
188 {
189 _driver->immediateShutdown();
190 }
191}
Base class for Exception.
Definition: Exception.h:146
std::string asString() const
Error message provided by dumpOn as string.
Definition: Exception.cc:75
virtual const char * what() const
Return message string.
Definition: Exception.h:313
Url manipulation class.
Definition: Url.h:92
Wrapper class for stat/lstat.
Definition: PathInfo.h:221
bool isExist() const
Return whether valid stat info exists.
Definition: PathInfo.h:281
void add(const std::string &key, const Value &val)
MountingWorker(std::string_view workerName, DeviceDriverRef driver)
zyppng::expected< zyppng::worker::WorkerCaps > initialize(const zyppng::worker::Configuration &conf) override
void cancel(const std::deque< zyppng::worker::ProvideWorkerItemRef >::iterator &i) override
void detachSuccess(const uint32_t id)
void attachSuccess(const uint32_t id)
void provideSuccess(const uint32_t id, bool cacheHit, const zypp::Pathname &localFile, const HeaderValueMap extra={})
void provideFailed(const uint32_t id, const uint code, const std::string &reason, const bool transient, const HeaderValueMap extra={})
std::deque< ProvideWorkerItemRef > & requestQueue()
constexpr std::string_view AttachId("attach_id")
constexpr std::string_view Label("label")
constexpr std::string_view Url("url")
constexpr std::string_view Url("url")
zypp::proto::Configuration Configuration
Definition: provideworker.h:33
#define MIL_PRV
Definition: providedbg_p.h:35
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Definition: String.h:212
#define MIL
Definition: Logger.h:96
#define ERR
Definition: Logger.h:98