#!/usr/bin/env python # RaidGuessFS, a FUSE pseudo-filesystem to guess RAID parameters of a damaged device # Copyright (C) 2015 Ludovic Pouzenc # # This file is part of RaidGuessFS. # # RaidGuessFS is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # RaidGuessFS is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with RaidGuessFS. If not, see import os, sys, logging class MyDisks(): """Auxiliary class, managing disk layer""" def __init__(self, *args, **kwargs): self.disks = [] self.disk_paths = [] self.disk_count = 0 self.disks_size = [0] self.max_disks = 16 def get_disk_count(self): return self.disk_count def set_disks_path(self,disk_path_list): """Set the list of real filepath to disks or images""" self.disk_paths = disk_path_list def set_disk_count(self,new_disk_count): """Update the number of attached disks on the fly""" self.disk_count = min(new_disk_count,self.max_disks) logging.info("MyDisks.set_disk_count(%d) : setting disk_count to %d" % (new_disk_count, self.disk_count)) def open_disks(self): """(re)open all disks""" logging.debug("Enter open_disks()") for fh in self.disks: try: fh.close() except: pass self.disks = [ None for d in range(self.disk_count) ] self.disks_size = [ 0 for d in range(self.disk_count) ] for d in range(self.disk_count): path = self.disk_paths[d] logging.debug("Try to open disk #%2d"%d) try: fh = open(path, "rb") self.disks_size[d] = os.lseek(fh.fileno(), 0, os.SEEK_END) self.disks[d] = fh logging.debug("Opened disk #%2d"%d) except IOError as e: logging.error("Can't open disk #%2d ('%s') : %s"%(d, path, e.strerror)) logging.exception(e) self.disks_size[d] = 0 except Exception as e: logging.error("Can't open disk #%2d ('%s') : unhandled exception"%(d, path)) self.disks_size[d] = 0 logging.exception(e) logging.debug("Exit. open_disks()") def is_readable(self,disk_no,offset,size): import random return random.randint(0,100) > 1 # FIXME : implement this (parse ddrescue log files) def read(self,disk_no,offset,size): self.disks[disk_no].seek(offset) return self.disks[disk_no].read(size)