class Eraser(object): """A wrapper for pyeclib erasure coding driver (ECDriver)""" def __init__(self, ec_k, ec_m, ec_type="liberasurecode_rs_vand", aes_enabled=True): self.ec_type = ec_type if aes_enabled: self.aes = AESDriver() logger.info("Eraser will use AES encryption") else: logger.info("Eraser will not use AES encryption") expected_module_name = "drivers." + ec_type.lower() + "_driver" expected_class_name = ec_type[0].upper() + ec_type[1:].lower( ) + "Driver" try: mod = __import__(expected_module_name, fromlist=[expected_class_name]) driver_class = None driver_class = getattr(mod, expected_class_name) self.driver = driver_class(k=ec_k, m=ec_m, ec_type=ec_type, hd=None) except (ImportError, AttributeError): logger.exception("Driver " + ec_type + " could not be loaded as a custom driver") try: self.driver = ECDriver(k=ec_k, m=ec_m, ec_type=ec_type) except Exception as error: logger.exception("Driver " + ec_type + " could not be loaded by pyeclib") raise error def encode(self, data): """Encode a string of bytes in flattened string of byte strips""" payload = data if hasattr(self, 'aes'): payload = self.aes.encode(data)[0] strips = self.driver.encode(payload) return strips def decode(self, strips): """Decode byte strips in a string of bytes""" payload = self.driver.decode(strips) if hasattr(self, 'aes'): return self.aes.decode([payload]) return payload def reconstruct(self, available_payload_fragments, missing_indices): """ Reconstruct missing fragments of data Args: available_payload_fragments(list(bytes)): Available fragments of data missing_indices(list(int)): List of the indices of the missing blocks Returns: list(bytes): A list of the reconstructed fragments """ return self.driver.reconstruct(available_payload_fragments, missing_indices) def fragments_needed(self, missing_indices): """ Return a list of the fragments needed to recover the missing ones Args: missing_indices(list(int)): The list of indices of the fragments to recover Returns: list(int): A list of the indices of the fragments required to recover the missing ones """ return self.driver.fragments_needed(missing_indices)
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pyeclib from pyeclib.ec_iface import ECDriver import random import string import sys import os import argparse parser = argparse.ArgumentParser( description='PyECLib tool to determine fragment indexes needed to ' 'recover missing fragments.') parser.add_argument('k', type=int, help='number of data elements') parser.add_argument('m', type=int, help='number of parity elements') parser.add_argument('ec_type', help='EC algorithm used') parser.add_argument('missing_fragments', type=int, metavar='missing_fragment', nargs='+', help='missing_fragments') args = parser.parse_args() ec_driver = ECDriver(k=args.k, m=args.m, ec_type=args.ec_type) fragments_needed = ec_driver.fragments_needed(args.missing_fragments) print(fragments_needed)
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pyeclib from pyeclib.ec_iface import ECDriver import random import string import sys import os import argparse parser = argparse.ArgumentParser( description='PyECLib tool to determine fragment indexes needed to ' 'recover missing fragments.') parser.add_argument('k', type=int, help='number of data elements') parser.add_argument('m', type=int, help='number of parity elements') parser.add_argument('ec_type', help='EC algorithm used') parser.add_argument('missing_fragments', type=int, metavar='missing_fragment', nargs='+', help='missing_fragments') args = parser.parse_args() ec_driver = ECDriver(k=args.k, m=args.m, ec_type=args.ec_type) fragments_needed = ec_driver.fragments_needed(args.missing_fragments) print(fragments_needed)