summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYves Fischer <yvesf-git@xapek.org>2015-02-21 21:21:55 +0100
committerYves Fischer <yvesf-git@xapek.org>2015-02-21 21:21:55 +0100
commit177325a8f1b4fb6130d868a368ac8a2c8165b997 (patch)
treeb09e1f7824c18a5c36a9ac6249180d78a1ea6858
parent083899d6088492b1bc7e01f74be015070224f2c2 (diff)
downloadfuse-httpfs-177325a8f1b4fb6130d868a368ac8a2c8165b997.tar.gz
fuse-httpfs-177325a8f1b4fb6130d868a368ac8a2c8165b997.zip
Improved ssl handling and error logging
-rwxr-xr-xfuse-httpfs69
-rw-r--r--httpfs/__init__.py39
2 files changed, 62 insertions, 46 deletions
diff --git a/fuse-httpfs b/fuse-httpfs
index d955ec3..56662a8 100755
--- a/fuse-httpfs
+++ b/fuse-httpfs
@@ -1,38 +1,43 @@
#!/usr/bin/env python3
-from httpfs import *
+import sys
+import fuse
+import logging
+import argparse
+from httpfs import Config, Httpfs
-if __name__ == '__main__':
- import logging
- FORMAT = "%(threadName)s %(asctime)-15s %(levelname)s:%(name)s %(message)s"
- logging.basicConfig(level=logging.INFO, format=FORMAT)
+FORMAT = "%(threadName)s %(asctime)-15s %(levelname)s:%(name)s %(message)s"
+logging.basicConfig(level=logging.INFO, format=FORMAT)
- import argparse
- p = argparse.ArgumentParser(
- formatter_class=argparse.ArgumentDefaultsHelpFormatter)
- p.add_argument("mountpoint", nargs=1, help="Target directory")
- p.add_argument("--max_background", type=int, default=15,
- help="Maximum number of background threads")
- p.add_argument("--no_foreground", action="store_true", default=False,
- help="Fork into background as a daemon")
- p.add_argument("--debug", action="store_true", help="Enable fuse debug")
- p.add_argument("--nothreads", action="store_true",
- help="Disable fuse threads")
- p.add_argument("--connect_timeout", type=int,
- default=Config.timeout[0], help="HTTP connect timeout")
- p.add_argument("--read_timeout", type=int,
- default=Config.timeout[1], help="HTTP read timeout")
- p.add_argument("--no-verify", action="store_true", help="Disable ssl verify")
+p = argparse.ArgumentParser(
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+p.add_argument("mountpoint", help="Target directory")
+p.add_argument("--max_background", type=int, default=15,
+ help="Maximum number of background threads")
+p.add_argument("--no_foreground", action="store_true", default=False,
+ help="Fork into background as a daemon")
+p.add_argument("--debug", action="store_true", help="Enable fuse debug")
+p.add_argument("--nothreads", action="store_true",
+ help="Disable fuse threads")
+p.add_argument("--connect_timeout", type=int,
+ default=Config.timeout[0], help="HTTP connect timeout")
+p.add_argument("--read_timeout", type=int,
+ default=Config.timeout[1], help="HTTP read timeout")
+p.add_argument("--ssl", choices=["default", "system", "none"],
+ help="SSL Verification", default="default")
+p.add_argument("--system-ca", default="/etc/ssl/certs/ca-certificates.crt",
+ help="Path to system ca bundle")
- args = vars(p.parse_args(sys.argv[1:]))
+args = vars(p.parse_args(sys.argv[1:]))
- Config.timeout = (args.pop("connect_timeout"), args.pop("read_timeout"))
- Config.mountpoint = args.pop("mountpoint")[0]
- Config.verify = not args.pop("no_verify")
- kwargs = {}
- if not args.pop("no_foreground"):
- kwargs["foreground"] = True
- if args.pop("debug"):
- kwargs["debug"] = True
- kwargs.update(args)
+Config.timeout = (args.pop("connect_timeout"), args.pop("read_timeout"))
+Config.mountpoint = args.pop("mountpoint")
+Config.verify = args.pop("ssl")
+Config.system_ca = args.pop("system_ca")
+kwargs = {}
+if not args.pop("no_foreground"):
+ kwargs["foreground"] = True
+if args.pop("debug"):
+ kwargs["debug"] = True
+kwargs.update(args)
- fuse = fuse.FUSE(Httpfs(), Config.mountpoint, **kwargs)
+fuse = fuse.FUSE(Httpfs(), Config.mountpoint, **kwargs)
diff --git a/httpfs/__init__.py b/httpfs/__init__.py
index f7d7ec3..518bcc5 100644
--- a/httpfs/__init__.py
+++ b/httpfs/__init__.py
@@ -19,6 +19,7 @@ class Config(object):
mountpoint = None
timeout = (5, 25) # connect_timeout, read_timeout
verify = None
+ system_ca = None
class Path:
@@ -39,8 +40,6 @@ class Path:
@classmethod
def fromPath(clazz, parent, pathElement):
p = clazz(parent, unquote(pathElement))
- if (pathElement == ""):
- raise SystemExit(1)
logging.info("created {} '{}' referencing {}".format(
clazz.__name__, p.name, p.buildUrl()))
return p
@@ -135,7 +134,15 @@ class Server(Directory):
def __init__(self, parent, name):
super().__init__(parent, name)
self.session = requests.Session()
- self.session.verify = Config.verify
+ if Config.verify == "default":
+ pass
+ elif Config.verify == "system":
+ self.session.verify = Config.system_ca
+ elif Config.verify == "none":
+ logging.warn("SSL Verification disabled!")
+ self.session.verify = False
+ else:
+ raise SystemExit("Invalid value for ssl verification")
def getSession(self):
return self.session
@@ -204,13 +211,13 @@ class Httpfs(fuse.LoggingMixIn, fuse.Operations):
logging.warn("No .netrc file found, no default machines")
def getattr(self, path, fh=None):
- logging.info("getattr path={}".format(path))
+ logging.debug("getattr path={}".format(path))
try:
entry = self._getPath(path)
if entry:
return entry.getAttr()
except Exception as e:
- logging.error("Error", e)
+ logging.exception("Error in getattr(%s)", path)
raise fuse.FuseOSError(EHOSTUNREACH)
raise fuse.FuseOSError(ENOENT)
@@ -265,15 +272,19 @@ class Httpfs(fuse.LoggingMixIn, fuse.Operations):
return prevEntry.entries[lastElement]
def readdir(self, path, fh):
- logging.info("readdir path=%s", path)
- entry = self._getPath(path)
- if not entry:
- raise fuse.FuseOSError(EBADF)
- if not entry.initialized:
- entry.init()
- return [(".", entry.getAttr(), 0),
- ("..", (entry.parent and entry.parent.getAttr() or None), 0)] \
- + [(it.name, it.getAttr(), 0) for it in entry.entries.values()]
+ try:
+ logging.debug("readdir path=%s", path)
+ entry = self._getPath(path)
+ if not entry:
+ raise fuse.FuseOSError(EBADF)
+ if not entry.initialized:
+ entry.init()
+ return [(".", entry.getAttr(), 0),
+ ("..", (entry.parent and entry.parent.getAttr() or None), 0)] \
+ + [(it.name, it.getAttr(), 0) for it in entry.entries.values()]
+ except Exception as e:
+ logging.exception("Error in readdir(%s)", path)
+ raise fuse.FuseOSError(EIO)
def read(self, path, size, offset, fh):
entry = self._getPath(path)