Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bareos/python-bareos.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Steffens <joerg.steffens@bareos.com>2016-04-27 14:45:15 +0300
committerJoerg Steffens <joerg.steffens@bareos.com>2016-04-27 14:45:15 +0300
commit907f1c1c2a4cd2104026cf31dd8eb4c1233f6457 (patch)
tree51fc86e3526d47bcd8bd0ff506a44de1e54c2f24
parent3c3b7a5da5c3f370b5a75bf5a0295ebe4c660acb (diff)
adapt for Python 3, but also for Python 2.6
Added restorejob option for FUSE.
-rwxr-xr-xbareos/bsock/bsockjson.py2
-rw-r--r--bareos/bsock/lowlevel.py10
-rw-r--r--bareos/fuse/bareosfuse.py3
-rw-r--r--bareos/fuse/exceptions.py4
-rw-r--r--bareos/fuse/node/base.py10
-rw-r--r--bareos/fuse/node/bvfscommon.py10
-rw-r--r--bareos/fuse/node/bvfsdir.py3
-rw-r--r--bareos/fuse/node/directory.py2
-rw-r--r--bareos/fuse/node/file.py2
-rw-r--r--bareos/fuse/node/job.py2
-rw-r--r--bareos/fuse/node/volumestatus.py14
-rw-r--r--bareos/fuse/root.py7
-rw-r--r--bareos/util/password.py2
-rwxr-xr-xbin/bareos-fd-connect.py4
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'))