Skip to content

Commit

Permalink
improved error handling for bareos-fuse
Browse files Browse the repository at this point in the history
  • Loading branch information
joergsteffens committed Oct 4, 2015
1 parent ec03144 commit 8b61728
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 22 deletions.
1 change: 1 addition & 0 deletions bareos/fuse/__init__.py
@@ -1,3 +1,4 @@
#__all__ = [ "bconsole" ]
from bareos.fuse.exceptions import *
from bareos.fuse.bareosfuse import BareosFuse
import bareos.fuse.node
49 changes: 29 additions & 20 deletions bareos/fuse/bareosfuse.py
Expand Up @@ -9,7 +9,9 @@
import errno
import fuse
import logging
import socket
import stat
import os.path
from pprint import pformat

fuse.fuse_python_api = (0, 2)
Expand All @@ -20,6 +22,8 @@ class BareosFuse(fuse.Fuse):
def __init__(self, *args, **kw):
self.bsock = None
self.bareos = None
self.restoreclient = None
self.restorepath = '/var/cache/bareosfs/'
super(BareosFuse, self).__init__(*args, **kw)
self.multithreaded = False

Expand All @@ -32,34 +36,39 @@ def initLogging(self):
hdlr.setFormatter(formatter)
self.logger.addHandler(hdlr)

def main(self, *args, **kw):
# use main() instead of fsinit,
# as this prevents FUSE from being started in case of errors.

self.initLogging()
self.logger.debug('start')
def parse(self, *args, **kw):
super(BareosFuse, self).parse(*args, **kw)
if self.fuse_args.mount_expected():
options = [ 'address', 'port', 'dirname', 'name', 'password' ]
parameter = {}
self.bsockParameter = {}
for i in options:
if hasattr(self, i):
self.logger.debug( "%s: %s" %(i, getattr(self,i)))
parameter[i] = getattr(self,i)
self.bsockParameter[i] = getattr(self,i)
else:
self.logger.debug( "%s: missing, default: %s" %(i, str(getattr(self,i,None))))
self.logger.debug('options: %s' % (parameter))
#self.logger.debug( "%s: missing, default: %s" %(i, str(getattr(self,i,None))))
pass
if not hasattr(self, 'password'):
raise RuntimeError("missing parameter password")
raise bareos.fuse.ParameterMissing("missing parameter password")
else:
password = bareos.bsock.Password(self.password)
parameter['password']=password
self.bsock = bareos.bsock.BSockJson(**parameter)
if not hasattr(self, 'restoreclient'):
self.restoreclient = None
#raise RuntimeError("missing parameter restoreclient")
# TODO: check if restoreclient is valid
if not hasattr(self, 'restorepath'):
self.restorepath = '/var/cache/bareosfs/'
self.bsockParameter['password']=password
self.restorepath = os.path.normpath(self.restorepath)
if not os.path.isabs(self.restorepath):
raise bareos.fuse.RestorePathInvalid("restorepath must be an absolute path")


def main(self, *args, **kw):
# use main() instead of fsinit,
# as this prevents FUSE from being started in case of errors.

self.initLogging()
self.logger.debug('start')
if self.fuse_args.mount_expected():
try:
self.bsock = bareos.bsock.BSockJson(**self.bsockParameter)
except socket.error as e:
self.logger.exception(e)
raise bareos.fuse.SocketConnectionRefused(e)
self.bareos = Root(self.bsock, self.restoreclient, self.restorepath)
super(BareosFuse, self).main(*args, **kw)
self.logger.debug('done')
Expand Down
19 changes: 19 additions & 0 deletions bareos/fuse/exceptions.py
@@ -0,0 +1,19 @@
"""
Bareos-Fuse specific exceptions
"""

class ParameterMissing(Exception):
"""parameter missing"""
pass

class SocketConnectionRefused(Exception):
"""network socket connection refused"""
pass

class RestoreClientUnknown(Exception):
"""given restore client is not known"""
pass

class RestorePathInvalid(Exception):
"""restore path is invalid"""
pass
7 changes: 5 additions & 2 deletions bareos/fuse/node/bvfscommon.py
Expand Up @@ -22,9 +22,12 @@ def init(self, root, jobid, path, filename, stat):
self.xattr = {
'user.bareos.restorepath': str(self.restorepathfull),
'user.bareos.restored': 'no',
'user.bareos.do_options': "mark | restore",
'user.bareos.do': '',
}
if self.root.restoreclient:
# restore is only possible, if a restoreclient is given
self.xattr['user.bareos.do_options'] = 'restore'
self.xattr['user.bareos.do'] = ''

if stat:
self.set_stat(stat)

Expand Down
5 changes: 5 additions & 0 deletions bareos/fuse/root.py
Expand Up @@ -2,6 +2,7 @@
bareosfs root node (top level directory)
"""

import bareos.fuse.exceptions
from bareos.fuse.nodefactory import NodeFactory
from bareos.fuse.node.directory import Directory
from bareos.fuse.node import *
Expand All @@ -13,6 +14,10 @@ class Root(Directory):
def __init__(self, bsock, restoreclient, restorepath):
self.bsock = bsock
self.restoreclient = restoreclient
if restoreclient:
data = self.bsock.call(".clients")
if not restoreclient in [item['name'] for item in data['clients']]:
raise bareos.fuse.RestoreClientUnknown(restoreclient)
self.restorepath = restorepath
super(Root, self).__init__(self, None)
self.factory = NodeFactory(self)
Expand Down

0 comments on commit 8b61728

Please sign in to comment.