Browse Source

Storage backs up data to disk

Helge Jung 9 years ago
parent
commit
895a5462dd
3 changed files with 43 additions and 2 deletions
  1. 3 0
      .gitignore
  2. 7 1
      batcave.py
  3. 33 1
      ffstatus/storage.py

+ 3 - 0
.gitignore

@@ -1,6 +1,9 @@
 *.log
 *.pyc
 
+# storage
+storage.dat
+
 # dummy scripts + datafiles
 alfred*json
 batadv-vis*

+ 7 - 1
batcave.py

@@ -26,6 +26,7 @@ parser.add_argument('--dashing-url', help='Dashing URL')
 parser.add_argument('--dashing-token', help='Dashing\'s secret update token')
 parser.add_argument('--api-bind-host', default='::', help='API-Server Hostname')
 parser.add_argument('--api-bind-port', type=int, default=8888, help='API-Server Port')
+parser.add_argument('-S', '--storage-dir', default='.', help='Path where to store data')
 args = parser.parse_args()
 
 if args.interval < 5:
@@ -49,7 +50,8 @@ if args.no_detach:
 
 logger.info('Starting up')
 
-storage = Storage()
+storage = Storage(args.storage_dir)
+logger.info('Storage: ' + str(storage))
 
 a = AlfredParser()
 b = BatmanParser()
@@ -107,11 +109,15 @@ while True:
 		logger.debug('Step 3/3: Merging current data ...')
 		storage.data = dict_merge(storage.data, newdata)
 		logger.info('I have data for ' + str(len(storage.data)) + ' nodes.')
+
+		storage.save()
+
 	except Exception as err:
 		logger.error(str(err))
 
 	logger.debug('Sleeping for {0} seconds'.format(args.interval))
 	time.sleep(args.interval)
 
+storage.close()
 logger.info('Shut down.')
 

+ 33 - 1
ffstatus/storage.py

@@ -1,2 +1,34 @@
+import cPickle as pickle
+import logging
+import os
+
 class Storage:
-	data = {}
+	data = None
+
+	def __init__(self, storage_dir):
+		self.logger = logging.getLogger('Storage')
+		self.storage_dir = storage_dir
+
+		self.logger.debug('Using storage at \'{0}\''.format(storage_dir))
+		self.storage_file = open(os.path.join(storage_dir, 'storage.dat'), 'rwb')
+		self.logger.debug('storage_file = ' + str(self.storage_file))
+		try:
+			self.data = pickle.load(self.storage_file)
+		except EOFError:
+			self.logger.info('The storage file was empty, I can handle this.')
+		except Exception as err:
+			self.logger.error('Loading the storage failed. Please resolve the error and/or remove the storage file \'{0}\': {1}'.format(self.storage_file, str(err)))
+			raise err
+		if self.data is None: self.data = {}
+		self.logger.info('Opened storage with ' + str(len(self.data)) + ' entries.')
+
+	def save(self):
+		#self.storage_file.seek(0, os.SEEK_SET)
+		#self.storage_file.truncate()
+		pickle.dump(self.data, self.storage_file, protocol=2)
+		#self.storage_file.flush()
+
+	def close(self):
+		self.save()
+		self.storage_file.close()
+		self.data = None