From 69275a79bdbdc2cc370ee7ebbce5593c7840a44f Mon Sep 17 00:00:00 2001 From: Arturo Hernandez Date: Mon, 3 Sep 2018 20:00:30 -0400 Subject: [PATCH] backup file changed from pickle to json (for python2&3 support) --- - | Bin 44947 -> 0 bytes test_backup_restore.py | 34 ++++++++++++++++++++-------------- zk/finger.py | 22 +++++++++++++++++++--- zk/user.py | 15 ++++++++++++++- 4 files changed, 53 insertions(+), 18 deletions(-) delete mode 100644 - diff --git a/- b/- deleted file mode 100644 index 80c966e616ef86d68b37a137f4590a766dc338c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44947 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 diff --git a/test_backup_restore.py b/test_backup_restore.py index 660c11b..54812ca 100755 --- a/test_backup_restore.py +++ b/test_backup_restore.py @@ -8,7 +8,7 @@ import datetime import codecs from builtins import input -import pickle +import json sys.path.append("zk") @@ -55,7 +55,7 @@ try: fp_version = conn.get_fp_version() print ('Serial Number : {}'.format(serialnumber)) print ('Finger Version : {}'.format(fp_version)) - filename = args.filename if args.filename else "{}.bak".format(serialnumber) + filename = args.filename if args.filename else "{}.json.bak".format(serialnumber) print ('') if not args.restore: print ('--- sizes & capacity ---') @@ -76,29 +76,33 @@ try: #save to file! print ('') print ('Saving to file {} ...'.format(filename)) - output = open(filename, 'wb') + output = open(filename, 'w') data = { - 'version':'1.00ut', + 'version':'1.00jut', 'serial': serialnumber, 'fp_version': fp_version, - 'users': users, - 'templates':templates + 'users': [u.__dict__ for u in users], + 'templates':[t.json_pack() for t in templates] } - pickle.dump(data, output, -1) + json.dump(data, output, indent=1) output.close() else: print ('Reading file {}'.format(filename)) - infile = open(filename, 'rb') - data = pickle.load(infile) + infile = open(filename, 'r') + data = json.load(infile) infile.close() #compare versions... - if data['version'] != '1.00ut': + if data['version'] != '1.00jut': raise BasicException("file with different version... aborting!") if data['fp_version'] != fp_version: raise BasicException("fingerprint version mismmatch {} != {} ... aborting!".format(fp_version, data['fp_version'])) #TODO: check data consistency... - print ("INFO: ready to write {} users".format(len(data['users']))) - print ("INFO: ready to write {} templates".format(len(data['templates']))) + users = [User.json_unpack(u) for u in data['users']] + #print (users) + print ("INFO: ready to write {} users".format(len(users))) + templates = [Finger.json_unpack(t) for t in data['templates']] + #print (templates) + print ("INFO: ready to write {} templates".format(len(templates))) #input serial number to corroborate. print ('WARNING! the next step will erase the current device content.') print ('Please input the serialnumber of this device [{}] to acknowledge the ERASING!'.format(serialnumber)) @@ -111,10 +115,12 @@ try: if args.clear_attendance: print ('Clearing attendance too!') conn.clear_attendance() + conn.read_sizes() + print (conn) print ('Restoring Data...') - for u in data['users']: + for u in users: #look for Templates - temps = list(filter(lambda f: f.uid ==u.uid, data['templates'])) + temps = list(filter(lambda f: f.uid ==u.uid, templates)) #print ("user {} has {} fingers".format(u.uid, len(temps))) conn.save_user_template(u,temps) conn.enable_device() diff --git a/zk/finger.py b/zk/finger.py index 77aab11..26de3f0 100644 --- a/zk/finger.py +++ b/zk/finger.py @@ -16,10 +16,26 @@ class Finger(object): def repack_only(self): #only template return pack("H%is" % (self.size), self.size, self.template) - - def __eq__(self, other): + @staticmethod + def json_unpack(json): + return Finger( + uid=json['uid'], + fid=json['fid'], + valid=json['valid'], + template=codecs.decode(json['template'],'hex') + ) + def json_pack(self): #packs for json + return { + "size": self.size, + "uid": self.uid, + "fid": self.fid, + "valid": self.valid, + "template": codecs.encode(self.template, 'hex').decode('ascii') + } + + def __eq__(self, other): return self.__dict__ == other.__dict__ - + def __str__(self): return " [uid:{:>3}, fid:{}, size:{:>4} v:{} t:{}]".format(self.uid, self.fid, self.size, self.valid, self.mark) diff --git a/zk/user.py b/zk/user.py index 7a5fbe6..8c7da46 100644 --- a/zk/user.py +++ b/zk/user.py @@ -10,7 +10,20 @@ class User(object): self.password = str(password) self.group_id = str(group_id) self.user_id = user_id - self.card = card # 64 int to 40 bit int + self.card = int(card) # 64 int to 40 bit int + + @staticmethod + def json_unpack(json): + #validate? + return User( + uid=json['uid'], + name=json['name'], + privilege=json['privilege'], + password=json['password'], + group_id=json['group_id'], + user_id=json['user_id'], + card=json['card'] + ) def repack29(self): # with 02 for zk6 (size 29) return pack("