示例#1
0
	def mount(drive_name):
		'''
		Reconnects a drive as a volume.
		Any data on the drive is preserved.
		Returns the volume.
		'''
		drive = Drive.reconnect(drive_name)
		inputt = drive.read_block(0)
		data = inputt.splitlines()
		length = int(data[0])
		i = 1
		while i < length:
			inputt = drive.read_block(i)
			data.extend(inputt.splitlines())
			i+=1
		i = 1
		outcome = False
		
		data[len(data)-1] = data[len(data)-1].rstrip()
	
		while len(data) > (i+1):
			while len(data) > (i+1) and data[i+1].isdigit() == outcome:
				data[i] += data[i+1]
				data.pop(i+1)
			i+=1
			outcome = not outcome
		
		volume = Volume(drive, data[1])
		for i in range(len(data[3])):                #TODO Needs better fix
			if data[3][i] == 120:
				volume.bmap[i] = b'x'
		volume.import_files()

		return volume
示例#2
0
    def mount(drive_name):
        '''
        Reconnects a drive as a volume.
        Any data on the drive is preserved.
        Returns the volume.
        '''
        drive = Drive.reconnect(drive_name)
        vol = Volume()

        block = drive.read_block(0).split(b'\n')
        volinfosize= int(bytes.decode(block[0]))
        volinfo =b''
        volinfo+=drive.read_block(0)
        if volinfosize!=1:
            for i in range (1,volinfosize+1):
                volinfo+=drive.read_block(i)
        vol.setSize(int(bytes.decode(block[2])))
        vol.setDrive(drive)

        bmpArr =[]
        
        bmp = bytes.decode(volinfo.split(b'\n')[3])

        for i,v in enumerate(bmp):
            if v == 'x':
                bmpArr.append(1)
            else:
                bmpArr.append(0)
        vol.setVolInfo(volinfo)
        vol.setBitmapArray(bmpArr)
        return vol
示例#3
0
    def mount(drive_name):
        drive = Drive.reconnect(drive_name)
        allVolumeData = drive.read_block(0).decode()
        numOfBlocksUsed = allVolumeData.split('\n',1)[0]
        if int(numOfBlocksUsed)>1:
            for i in range(1,int(numOfBlocksUsed)):
                allVolumeData+=drive.read_block(i).decode() 
                
        data = allVolumeData.split('\n')
        numOfBlocksUsed=int(data[0])
        name = data[1]
        #dont need this
        numOfBlocksInDrive = int(data[2])
        bitmap = data[3]
        rootIndex = int(data[4])
        usedDrives=[False]*numOfBlocksInDrive
        Volume.calculate_volume_data_blocks(name, drive, rootIndex)
        numOfDataBlocks = Volume.calculate_volume_data_blocks(name, drive, rootIndex )
        for i in range(numOfDataBlocks):
            usedDrives[i]=True
        usedDrives[rootIndex]=True
        volume = Volume(drive, name.encode(), rootIndex, usedDrives, numOfBlocksUsed)
        #read the rootdirectory
        rootString = drive.read_block(rootIndex).decode()
        root= rootString.split('\n')
        for i in range(len(root)):
            if root[i].isdigit():
                if int(root[i])!=0:

                    fileData =  volume.drive.read_block(int(root[i])).decode().split('\n')
                    for i in range(0,len(fileData)-1,3):
                        fileName = fileData[i]
                        fileDataLength =  fileData[i+1]
                        fileStart = fileData[i + 2]
                        #then go into the fileStart
                        fileDirectory = volume.drive.read_block(int(fileStart))
                        fileDirectory = fileDirectory.decode().split('\n')
                        dataLocations = []
                        for j in range(len(fileDirectory)):
                            if fileDirectory[j].isdigit():
                                dataLocations.append(fileDirectory[j])
                        #now that we have all the locations of the data, we can read all the locations and concatinate them
                        dataOnFile = b''
                        for k in range(len(dataLocations)):
                            dataOnFile+=volume.drive.read_block(int(dataLocations[k]))
                        #only want the first n bits
                        dataOnFile = dataOnFile[:int(fileDataLength)]    
                        file = volume.open(fileName.encode())
                        file.write(0, dataOnFile)
                        print (file.data)
                    
        #print (root)
        
        return volume
        '''
示例#4
0
 def test_reconnect_drive(self):
      blocks = 10
      drive_name = 'driveC.txt'
      drive = Drive.format(drive_name, blocks)
      drive.disconnect()
      with self.assertRaises(IOError):
          Drive.reconnect('badname')
      drive = Drive.reconnect(drive_name)
      self.assertEqual(blocks * Drive.BLK_SIZE, drive.num_bytes())
      name = b'reconnect volume'
      volume = Volume.format(drive, name)
      volume.unmount()
      with self.assertRaises(IOError):
          Volume.mount('driveZ')
      volume = Volume.mount(drive_name)
      self.assertEqual(1, volume.volume_data_blocks())
      self.assertEqual(name, volume.name())
      self.assertEqual(blocks, volume.size())
      self.assertEqual(b'x--------x', volume.bitmap())
      self.assertEqual(9, volume.root_index())
      volume.unmount()
示例#5
0
    def mount(drive_name):
        '''
        Reconnects a drive as a volume.
        Any data on the drive is preserved.
        Returns the volume.
        '''
        print("mounting volume: " + str(drive_name))

        volume = Volume()
        volume.drive = Drive.reconnect(drive_name)
        # volume.drive_name = drive.name
        # int
        volume.block_info_occupied_blocks_num = int(volume.drive.read_block(0).split()[0].decode())
        # int
        volume.BLK_SIZE = volume.drive.BLK_SIZE
        # print("mounting: " + str(volume.drive.read_block(0)))
        volumeInfoByte = volume.read_block_info()
        volumeInfoStr = volumeInfoByte.decode().split('\n')

        # volume.volumeName = volumeInfoStr[1].encode()
        # volume.numberOfBlocks = int(volumeInfoStr[2])
        # volume.bitmapStr = volumeInfoStr[3]
        # volume.rootDirIndex = int(volumeInfoStr[4])
        # volume.rootFileList = volume.getRootFileList()
        # volume.openingFiles = []
        print("volumeInfoStr: " + str(volumeInfoStr))
        # byte
        volume.volume_name = volumeInfoStr[1].encode()
        # int
        volume.total_num_of_blocks = int(volumeInfoStr[2])
        # str
        volume.bitmapStr = volumeInfoStr[3]
        print("mounting volume with bitmap: " + volume.bitmapStr)
        # int int(volumeInfoStr[4]) [s.strip() for s in content_byte.decode().split("\n") if s.strip() != ""]
        volume.root_files_block_index = [int(i) for i in volumeInfoStr[4].split() if i.strip() != "" and i.isdigit()]
        print("root_files_block_index: " + str(volume.root_files_block_index))
        # array
        volume.rootFileList = volume.get_root_file_list()
        volume.openingFiles = []
        return volume
示例#6
0
class Volume:
    
    def __init__(self):
        self.currentDrive = None
        self.rootDirectory = None  
        self.blocksAvailability = None      

    def format(self, name):
        thisDrive = Drive(name)
        thisDrive.format()
        thisDrive.write_block(0, "+" + "-" * 127 + ("f:" + " " * 9 + "0000:" + "000 " * 12) * 6)
        global availableBlocksList
        availableBlocksList = ['+'] + ['-' for x in range(127)]
        global availableBlockIndices 
        availableBlockIndices = list(range(1, 128))
        self.currentDrive = thisDrive
        self.rootDirectory = Directory(self.currentDrive, None, 0, None, None) #drive, fileNum, parentBlockNum, parent, name
        self.blocksAvailability = thisDrive.read_block(0)[:127]

    def mkfile(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes[:-1]:
                lastNode = lastNode.getChild(node)
        except:
            print("Um there is some problem with your input")
        lastNode.addFile(nodes[-1])

    def mkdir(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes[:-1]:
                lastNode = lastNode.getChild(node)
        except:
            print("Um there is some problem with your input")
        lastNode.addDirectory(nodes[-1])

    def reconnect(self, name):
        self.currentDrive = Drive(name)
        self.rootDirectory = Directory(self.currentDrive, None, 0, None, name)
        self.currentDrive.reconnect()      
        self.blocksAvailability = self.currentDrive.read_block(0)[:127]

    def append(self, path, data):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes:
                lastNode = lastNode.getChild(node)
        except:
            print("Um there is some problem with your input")
        lastNode.appendData(data)
            
    def ls(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes:
                if node != "":
                    lastNode = lastNode.getChild(node)
            lastNode.list()
        except:
            print("Um there is some problem with your input")

    def print(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes:
                if node != "":
                    lastNode = lastNode.getChild(node)
            lastNode.print()
        except:
            print("Um there is some problem with your input")

    def delfile(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes:
                if node != "":
                    lastNode = lastNode.getChild(node)
            lastNode.delete()
        except:
            print("Um there is some problem with your input")

    def deldir(self, path):
        try:
            nodes = path.strip('/').split('/')
            lastNode = self.rootDirectory
            for node in nodes:
                if node != "":
                    lastNode = lastNode.getChild(node)      
            lastNode.delete()
        except:
            print("Um there is some problem with your input")