def factory_reset(master_controller=INJECTED): import glob import shutil logger.info('Wiping master eeprom...') master_controller.start() master_controller.factory_reset() master_controller.stop() logger.info('Removing databases...') # Delete databases. for f in constants.get_all_database_files(): if os.path.exists(f): os.remove(f) # Delete plugins logger.info('Removing plugins...') plugin_dir = constants.get_plugin_dir() plugins = [ name for name in os.listdir(plugin_dir) if os.path.isdir(os.path.join(plugin_dir, name)) ] for plugin in plugins: shutil.rmtree(plugin_dir + plugin) config_files = constants.get_plugin_configfiles() for config_file in glob.glob(config_files): os.remove(config_file)
def get_full_backup(self): """ Get a backup (tar) of the master eeprom, the sqlite databases and the plugins :returns: Tar containing multiple files: master.eep, config.db, scheduled.db, power.db, eeprom_extensions.db, metrics.db and plugins as a string of bytes. """ _ = self # Not static for consistency def backup_sqlite_db(input_db_path, backup_db_path): """ Backup an sqlite db provided the path to the db to backup and the backup db. """ # Connect to database connection = sqlite3.connect(input_db_path) cursor = connection.cursor() # Lock database before making a backup cursor.execute('begin immediate') # Make new backup file shutil.copyfile(input_db_path, backup_db_path) # Unlock database connection.rollback() tmp_dir = tempfile.mkdtemp() tmp_sqlite_dir = '{0}/sqlite'.format(tmp_dir) os.mkdir(tmp_sqlite_dir) try: with open('{0}/master.eep'.format(tmp_sqlite_dir), 'w') as eeprom_file: eeprom_file.write(self.get_master_backup()) for filename, source in { 'config.db': constants.get_config_database_file(), 'power.db': constants.get_power_database_file(), 'eeprom_extensions.db': constants.get_eeprom_extension_database_file(), 'metrics.db': constants.get_metrics_database_file(), 'gateway.db': constants.get_gateway_database_file() }.items(): if os.path.exists(source): target = '{0}/{1}'.format(tmp_sqlite_dir, filename) backup_sqlite_db(source, target) # Backup plugins tmp_plugin_dir = '{0}/{1}'.format(tmp_dir, 'plugins') tmp_plugin_content_dir = '{0}/{1}'.format(tmp_plugin_dir, 'content') tmp_plugin_config_dir = '{0}/{1}'.format(tmp_plugin_dir, 'config') os.mkdir(tmp_plugin_dir) os.mkdir(tmp_plugin_content_dir) os.mkdir(tmp_plugin_config_dir) plugin_dir = constants.get_plugin_dir() plugins = [ name for name in os.listdir(plugin_dir) if os.path.isdir(os.path.join(plugin_dir, name)) ] for plugin in plugins: shutil.copytree( plugin_dir + plugin, '{0}/{1}/'.format(tmp_plugin_content_dir, plugin)) config_files = constants.get_plugin_configfiles() for config_file in glob.glob(config_files): shutil.copy(config_file, '{0}/'.format(tmp_plugin_config_dir)) # Backup hex files tmp_hex_dir = '{0}/{1}'.format(tmp_dir, 'hex') os.mkdir(tmp_hex_dir) hex_files = constants.get_hex_files() for hex_file in glob.glob(hex_files): shutil.copy(hex_file, '{0}/'.format(tmp_hex_dir)) # Backup general config stuff tmp_config_dir = '{0}/{1}'.format(tmp_dir, 'config') os.mkdir(tmp_config_dir) config_dir = constants.get_config_dir() for file_name in ['openmotics.conf', 'https.key', 'https.crt']: shutil.copy(os.path.join(config_dir, file_name), '{0}/'.format(tmp_config_dir)) retcode = subprocess.call( 'cd {0}; tar cf backup.tar *'.format(tmp_dir), shell=True) if retcode != 0: raise Exception('The backup tar could not be created.') with open('{0}/backup.tar'.format(tmp_dir), 'r') as backup_file: return backup_file.read() finally: shutil.rmtree(tmp_dir)