diff options
author | Joerg Steffens <joerg.steffens@bareos.com> | 2016-04-27 14:45:15 +0300 |
---|---|---|
committer | Joerg Steffens <joerg.steffens@bareos.com> | 2016-04-27 14:45:15 +0300 |
commit | 907f1c1c2a4cd2104026cf31dd8eb4c1233f6457 (patch) | |
tree | 51fc86e3526d47bcd8bd0ff506a44de1e54c2f24 | |
parent | 3c3b7a5da5c3f370b5a75bf5a0295ebe4c660acb (diff) |
adapt for Python 3, but also for Python 2.6
Added restorejob option for FUSE.
-rwxr-xr-x | bareos/bsock/bsockjson.py | 2 | ||||
-rw-r--r-- | bareos/bsock/lowlevel.py | 10 | ||||
-rw-r--r-- | bareos/fuse/bareosfuse.py | 3 | ||||
-rw-r--r-- | bareos/fuse/exceptions.py | 4 | ||||
-rw-r--r-- | bareos/fuse/node/base.py | 10 | ||||
-rw-r--r-- | bareos/fuse/node/bvfscommon.py | 10 | ||||
-rw-r--r-- | bareos/fuse/node/bvfsdir.py | 3 | ||||
-rw-r--r-- | bareos/fuse/node/directory.py | 2 | ||||
-rw-r--r-- | bareos/fuse/node/file.py | 2 | ||||
-rw-r--r-- | bareos/fuse/node/job.py | 2 | ||||
-rw-r--r-- | bareos/fuse/node/volumestatus.py | 14 | ||||
-rw-r--r-- | bareos/fuse/root.py | 7 | ||||
-rw-r--r-- | bareos/util/password.py | 2 | ||||
-rwxr-xr-x | bin/bareos-fd-connect.py | 4 |
14 files changed, 44 insertions, 31 deletions
diff --git a/bareos/bsock/bsockjson.py b/bareos/bsock/bsockjson.py index b23685b..d0b5898 100755 --- a/bareos/bsock/bsockjson.py +++ b/bareos/bsock/bsockjson.py @@ -38,7 +38,7 @@ class BSockJson(BSock): resultstring = super(BSockJson, self).call(command) data = None if resultstring: - print(resultstring.decode('utf-8')) + #print(resultstring.decode('utf-8')) try: data = json.loads(resultstring.decode('utf-8')) except ValueError as e: diff --git a/bareos/bsock/lowlevel.py b/bareos/bsock/lowlevel.py index 3695b65..644c3de 100644 --- a/bareos/bsock/lowlevel.py +++ b/bareos/bsock/lowlevel.py @@ -176,7 +176,7 @@ class LowLevel(object): #self.logger.debug(submsg) msg += submsg if (type(msg) is str): - msg = bytearray(msg, 'utf-8') + msg = bytearray(msg.decode('utf-8'), 'utf-8') if (type(msg) is bytes): msg = bytearray(msg) return msg @@ -228,8 +228,8 @@ class LowLevel(object): self.logger.debug("received: " + str(msg)) # hash with password - hmac_md5 = hmac.new(bytearray(password, 'utf-8')) - hmac_md5.update(bytearray(chal, 'utf-8')) + hmac_md5 = hmac.new(bytes(bytearray(password, 'utf-8'))) + hmac_md5.update(bytes(bytearray(chal, 'utf-8'))) bbase64compatible = BareosBase64().string_to_base64(bytearray(hmac_md5.digest()), True) bbase64notcompatible = BareosBase64().string_to_base64(bytearray(hmac_md5.digest()), False) self.logger.debug("string_to_base64, compatible: " + str(bbase64compatible)) @@ -269,8 +269,8 @@ class LowLevel(object): ssl = int(msg_list[3][4]) compatible = True # hmac chal and the password - hmac_md5 = hmac.new(bytearray(password, 'utf-8')) - hmac_md5.update(chal) + hmac_md5 = hmac.new(bytes(bytearray(password, 'utf-8'))) + hmac_md5.update(bytes(chal)) # base64 encoding msg = BareosBase64().string_to_base64(bytearray(hmac_md5.digest())) diff --git a/bareos/fuse/bareosfuse.py b/bareos/fuse/bareosfuse.py index b04a253..23b1c59 100644 --- a/bareos/fuse/bareosfuse.py +++ b/bareos/fuse/bareosfuse.py @@ -23,6 +23,7 @@ class BareosFuse(fuse.Fuse): self.bsock = None self.bareos = None self.restoreclient = None + self.restorejob = None self.restorepath = '/var/cache/bareosfs/' super(BareosFuse, self).__init__(*args, **kw) self.multithreaded = False @@ -70,7 +71,7 @@ class BareosFuse(fuse.Fuse): except socket.error as e: self.logger.exception(e) raise bareos.fuse.SocketConnectionRefused(e) - self.bareos = Root(self.bsock, self.restoreclient, self.restorepath) + self.bareos = Root(self.bsock, self.restoreclient, self.restorejob, self.restorepath) super(BareosFuse, self).main(*args, **kw) self.logger.debug('done') diff --git a/bareos/fuse/exceptions.py b/bareos/fuse/exceptions.py index bab281b..2a7eb2f 100644 --- a/bareos/fuse/exceptions.py +++ b/bareos/fuse/exceptions.py @@ -14,6 +14,10 @@ class RestoreClientUnknown(Exception): """given restore client is not known""" pass +class RestoreJobUnknown(Exception): + """given restore job is not known""" + pass + class RestorePathInvalid(Exception): """restore path is invalid""" pass diff --git a/bareos/fuse/node/base.py b/bareos/fuse/node/base.py index 916e2b0..ac6f36d 100644 --- a/bareos/fuse/node/base.py +++ b/bareos/fuse/node/base.py @@ -117,10 +117,10 @@ class Base(object): def add_subnode(self, classtype, *args, **kwargs): instance = self.root.factory.get_instance(classtype, *args, **kwargs) name = instance.get_name(*args, **kwargs) - if not self.subnodes.has_key(name): + if name not in self.subnodes: self.subnodes[name] = instance else: - if self.subnodes_old.has_key(name): + if name in self.subnodes_old: del(self.subnodes_old[name]) def update_stat(self): @@ -159,7 +159,7 @@ class Base(object): # and delete all not updated subnodes after do_update() self.subnodes_old = self.subnodes.copy() self.do_update() - for i in self.subnodes_old.keys(): + for i in list(self.subnodes_old.keys()): self.logger.debug("removing outdated node %s" % (i)) del(self.subnodes[i]) self.subnode_count = len(self.subnodes) @@ -228,7 +228,7 @@ class Base(object): #self.logger.debug("%s(\"%s\", %s)" % (str(self.get_name()), str(path), str(size))) result = [] if path.len() == 0: - result = self.xattr.keys() + result = list(self.xattr.keys()) else: if path.get(0) in self.subnodes: topdir = path.shift() @@ -258,8 +258,6 @@ class Base(object): ''' set value of extended attribute ''' - #self.logger.debug("%s(\"%s\")" % (str(self), str(path))) - #result = -errno.EOPNOTSUPP result = 0 if path.len() == 0: self.xattr[key] = value diff --git a/bareos/fuse/node/bvfscommon.py b/bareos/fuse/node/bvfscommon.py index 91a5bee..b9eead3 100644 --- a/bareos/fuse/node/bvfscommon.py +++ b/bareos/fuse/node/bvfscommon.py @@ -16,9 +16,9 @@ class BvfsCommon(Base): self.static = True self.restorepath = os.path.normpath("/%s/jobid=%s/" % (self.root.restorepath, self.jobid)) if filename: - self.restorepathfull = os.path.normpath(u"%s%s%s" % (self.restorepath, path, filename)) + self.restorepathfull = os.path.normpath("%s%s%s" % (self.restorepath, path, filename)) else: - self.restorepathfull = os.path.normpath(u"%s%s" % (self.restorepath, path)) + self.restorepathfull = os.path.normpath("%s%s" % (self.restorepath, path)) self.xattr = { 'user.bareos.restorepath': self.restorepathfull, 'user.bareos.restored': 'no', @@ -56,10 +56,14 @@ class BvfsCommon(Base): dirid = dirId, fileid = fileId, bvfs_restore_id = bvfs_restore_id)) + restorejob='' + if self.root.restorejob: + restorejob="restorejob={restorejob} ".format(restorejob=self.root.restorejob) restore = self.bsock.call( - 'restore file=?{bvfs_restore_id} client={client} restoreclient={restoreclient} where="{where}" yes'.format( + 'restore file=?{bvfs_restore_id} client={client} restoreclient={restoreclient} {restorejob} where="{where}" yes'.format( client = self.job.job['client'], restoreclient = self.root.restoreclient, + restorejob = restorejob, where = self.restorepath, bvfs_restore_id = bvfs_restore_id)) try: diff --git a/bareos/fuse/node/bvfsdir.py b/bareos/fuse/node/bvfsdir.py index b664d0f..0eb47d8 100644 --- a/bareos/fuse/node/bvfsdir.py +++ b/bareos/fuse/node/bvfsdir.py @@ -33,7 +33,8 @@ class BvfsDir(Directory, BvfsCommon): def setxattr(self, path, key, value, flags): if path.len() == 0: - if key == self.XattrKeyRestoreTrigger and value == "restore": + self.logger.debug("value: " + value + " ,type: " + str(type(value))) + if key == self.XattrKeyRestoreTrigger and value == b"restore": if not self.root.restoreclient: self.logger.warning("no restoreclient given, files can not be restored") return -errno.ENOENT diff --git a/bareos/fuse/node/directory.py b/bareos/fuse/node/directory.py index e54915d..672b9cb 100644 --- a/bareos/fuse/node/directory.py +++ b/bareos/fuse/node/directory.py @@ -14,7 +14,7 @@ class Directory(Base): def __init__(self, root, name): super(Directory, self).__init__(root, name) self.defaultdirs = [ '.', '..' ] - self.stat.st_mode = stat.S_IFDIR | 0755 + self.stat.st_mode = stat.S_IFDIR | 0o755 self.stat.st_nlink = len(self.defaultdirs) # arbitrary default value self.stat.st_size = 4096 diff --git a/bareos/fuse/node/file.py b/bareos/fuse/node/file.py index 825a294..5eddd94 100644 --- a/bareos/fuse/node/file.py +++ b/bareos/fuse/node/file.py @@ -15,7 +15,7 @@ class File(Base): def __init__(self, root, name, content = ""): super(File, self).__init__(root, name) self.content = content - self.stat.st_mode = stat.S_IFREG | 0444 + self.stat.st_mode = stat.S_IFREG | 0o444 self.stat.st_nlink = 1 def get_stat(self): diff --git a/bareos/fuse/node/job.py b/bareos/fuse/node/job.py index 7db12e5..b9b48f0 100644 --- a/bareos/fuse/node/job.py +++ b/bareos/fuse/node/job.py @@ -16,7 +16,7 @@ class Job(Directory): self.job = job super(Job, self).__init__(root, self.get_name(job)) try: - if not job.has_key('client'): + if 'client' not in job: job['client'] = job['clientname'] except KeyError: pass diff --git a/bareos/fuse/node/volumestatus.py b/bareos/fuse/node/volumestatus.py index bc33dbf..aa1eb62 100644 --- a/bareos/fuse/node/volumestatus.py +++ b/bareos/fuse/node/volumestatus.py @@ -8,15 +8,15 @@ import stat class VolumeStatus(File): __volstatus2filemode = { - "Archive": 0440, + "Archive": 0o440, # rw - "Append": 0660, + "Append": 0o660, # ro - "Full": 0440, - "Used": 0440, + "Full": 0o440, + "Used": 0o440, # to be used - "Recycle": 0100, - "Purged": 0100, + "Recycle": 0o100, + "Purged": 0o100, # not to use "Cleaning": 0000, "Error": 0000, @@ -55,7 +55,7 @@ class VolumeStatus(File): # set mode dependend on if volume is in apppend mode or full volstatus = self.volume['volstatus'] - if self.__volstatus2filemode.has_key(volstatus): + if volstatus in self.__volstatus2filemode: self.stat.st_mode = stat.S_IFREG | self.__volstatus2filemode[volstatus] else: self.logger.warning( "volume status %s unknown" % (self.volume['volstatus']) ) diff --git a/bareos/fuse/root.py b/bareos/fuse/root.py index c83ad8e..1136388 100644 --- a/bareos/fuse/root.py +++ b/bareos/fuse/root.py @@ -11,13 +11,18 @@ class Root(Directory): """ Define filesystem structure of root (/) directory. """ - def __init__(self, bsock, restoreclient, restorepath): + def __init__(self, bsock, restoreclient, restorejob, 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.restorejob = restorejob + if restorejob: + data = self.bsock.call(".jobs") + if not restorejob in [item['name'] for item in data['jobs']]: + raise bareos.fuse.RestoreJobUnknown(restorejob) self.restorepath = restorepath super(Root, self).__init__(self, None) self.factory = NodeFactory(self) diff --git a/bareos/util/password.py b/bareos/util/password.py index 99def12..b20f2a8 100644 --- a/bareos/util/password.py +++ b/bareos/util/password.py @@ -29,5 +29,5 @@ class Password(object): md5 the password and return the hex style ''' md5 = hashlib.md5() - md5.update(bytearray(password, 'utf-8')) + md5.update(bytes(bytearray(password, 'utf-8'))) return md5.hexdigest() diff --git a/bin/bareos-fd-connect.py b/bin/bareos-fd-connect.py index 21a0de9..37ac402 100755 --- a/bin/bareos-fd-connect.py +++ b/bin/bareos-fd-connect.py @@ -39,8 +39,8 @@ if __name__ == '__main__': parameter['password']=password bsock=FileDaemon(**parameter) except RuntimeError as e: - print str(e) + print(str(e)) sys.exit(1) logger.debug( "authentication successful" ) if args.command: - print bsock.call(args.command) + print(bsock.call(args.command).decode('utf-8')) |