diff options
-rw-r--r-- | netfs/fuse/fuseApp.cpp | 37 | ||||
-rw-r--r-- | netfs/fuse/fuseApp.h | 8 | ||||
-rw-r--r-- | netfs/unittests/testCore.cpp | 15 |
3 files changed, 52 insertions, 8 deletions
diff --git a/netfs/fuse/fuseApp.cpp b/netfs/fuse/fuseApp.cpp index 4766360..d05bcc0 100644 --- a/netfs/fuse/fuseApp.cpp +++ b/netfs/fuse/fuseApp.cpp @@ -6,6 +6,7 @@ #include <entCache.h> #include <slicer/slicer.h> #include <xml/serializer.h> +#include <uriParse.h> namespace AdHoc { template class Cache<struct stat, std::string>; @@ -69,13 +70,33 @@ void * NetFS::FuseApp::init(struct fuse_conn_info *) { ic = Ice::initialize(args); + fcr = configurator(); + return NULL; +} + +NetFS::Client::ResourcePtr +NetFS::FuseApp::configureFromFile(const std::string & configPath, const std::string & resourceName) const +{ auto fc = ReadConfiguration(configPath); auto e = fc->Resources.find(resourceName); if (e == fc->Resources.end()) { throw std::runtime_error("No such resource: " + resourceName); } - fcr = e->second; - return NULL; + return e->second; +} + +NetFS::Client::ResourcePtr +NetFS::FuseApp::configureFromUri(const std::string & uriString) const +{ + AdHoc::Uri uri(uriString); + + NetFS::Client::ResourcePtr r = new NetFS::Client::Resource(); + r->ExportName = uri.path->string(); + r->Endpoints.push_back(stringbf("%s -h %s -p %d", uri.scheme, uri.host, uri.port ? *uri.port : 4000)); + if (uri.password) { + r->AuthToken = *uri.password; + } + return r; } int @@ -90,10 +111,14 @@ NetFS::FuseApp::opt_parse(void *, const char * arg, int, struct fuse_args *) else if (arg[0] == '-') { return 1; } - else if (resourceName.empty()) { - const char * colon = strchr(arg, ':'); - resourceName = colon + 1; - configPath.assign(arg, colon); + else if (!configurator) { + if (strstr(arg, "://")) { + configurator = boost::bind(&NetFS::FuseApp::configureFromUri, this, arg); + } + else { + const char * colon = strchr(arg, ':'); + configurator = boost::bind(&NetFS::FuseApp::configureFromFile, this, std::string(arg, colon), colon + 1); + } return 0; } else if (mountPoint.empty()) { diff --git a/netfs/fuse/fuseApp.h b/netfs/fuse/fuseApp.h index 3e9f1c4..a97d271 100644 --- a/netfs/fuse/fuseApp.h +++ b/netfs/fuse/fuseApp.h @@ -2,6 +2,7 @@ #define NETFS_FUSE_H #include <boost/thread/shared_mutex.hpp> +#include <boost/function.hpp> #include <Ice/Ice.h> #include <Glacier2/Session.h> #include <service.h> @@ -85,9 +86,14 @@ namespace NetFS { virtual struct fuse_context * fuse_get_context() = 0; protected: + typedef boost::function<Client::ResourcePtr()> Configurator; + Configurator configurator; virtual NetFS::Client::ConfigurationPtr ReadConfiguration(const std::string &) const; + virtual NetFS::Client::ResourcePtr configureFromFile(const std::string &, const std::string &) const; + virtual NetFS::Client::ResourcePtr configureFromUri(const std::string &) const; private: + void setProxy(OpenFilePtr, uint64_t & fh); OpenFilePtr getFileProxy(uint64_t localID) const; void clearFileProxy(uint64_t localID); @@ -109,8 +115,6 @@ namespace NetFS { bool sessionOpened; std::string mountPoint; - std::string resourceName; - std::string configPath; OpenDirs openDirs; int openDirID; diff --git a/netfs/unittests/testCore.cpp b/netfs/unittests/testCore.cpp index c18f1cb..27a5cf4 100644 --- a/netfs/unittests/testCore.cpp +++ b/netfs/unittests/testCore.cpp @@ -6,6 +6,7 @@ #include <boost/filesystem/path.hpp> const std::string testEndpoint("tcp -h localhost -p 12012"); +const std::string testUri("tcp://localhost:12012/testvol"); class Core { public: @@ -77,3 +78,17 @@ BOOST_AUTO_TEST_CASE( testNoAuthWithPass ) BOOST_REQUIRE_EQUAL(0, c.fuse->statfs("/", &s)); } +BOOST_AUTO_TEST_CASE( uriConnect ) +{ + MockDaemonHost daemon(testEndpoint, { + "--NetFSD.ConfigPath=" + (rootDir / "defaultDaemon.xml").string() + }); + FuseMockHost fuse(std::string(), { + testUri, + (rootDir / "test").string(), + }); + + struct statvfs s; + BOOST_REQUIRE_EQUAL(0, fuse.fuse->statfs("/", &s)); +} + |