Example #1
0
 def status(self):
     option = input(
         "Enter 1 for Local File System status, 2 for Server status: ")
     if option == 1:
         print "\n", (MemoryInterface.status_MFS())
     else:
         print "\n", (MemoryInterface.status())
 def update_inode_table(self, table_inode, inode_number):
     if table_inode:
         table_inode.time_modified = datetime.datetime.now(
         )  #TIME OF MODIFICATION
     array_inode = InodeOps.InodeOperations().convert_table_to_array(
         table_inode)
     MemoryInterface.update_inode_table(array_inode, inode_number)
Example #3
0
    def read(self, path, offset=0, size=-1):
        print(
            "plz input serverNumber whose data is corrupted, if ur input >3, no server's data is corrupted"
        )
        serverNum = int(raw_input())
        if serverNum < 4:
            MemoryInterface.corruptData(serverNum)

        read_buffer = interface.read(path, offset, size)
        if read_buffer != -1: print(path + " : " + read_buffer)
Example #4
0
 def INODE_NUMBER_TO_INODE(self, inode_number):
     array_inode = MemoryInterface.inode_number_to_inode(inode_number)
     inode = InodeOps.InodeOperations().convert_array_to_table(array_inode)
     if inode:
         inode.time_accessed = str(
             datetime.datetime.now())[:19]  #TIME OF ACCESS
     return inode
Example #5
0
	def INODE_NUMBER_TO_INODE(self, inode_number):
		#print(inode_number)
		array_inode = MemoryInterface.inode_number_to_inode(inode_number)
		#print("###############")
		#print(array_inode)
		inode = InodeOps.InodeOperations().convert_array_to_table(array_inode)
		#print(inode)
		if inode: inode.time_accessed = datetime.datetime.now()   #TIME OF ACCESS
		return inode
Example #6
0
	def unlink(self, inode_number, parent_inode_number):
		'''WRITE YOUR CODE HERE'''
		error = -1
		inode = self.INODE_NUMBER_TO_INODE(inode_number)
		if(inode == False):
			return error
		parent_inode = self.INODE_NUMBER_TO_INODE(parent_inode_number)
		if(parent_inode == False):
			return error
		#unlinking dir, make sure it is empty, dir inode can only be deleted if its empty
		if inode.type == 1 and len(inode.directory) != 0:
			print("ERROR: cant unlink non empty directory")
			return error
		#if the file is an inode decrement its links
		if inode.type == 0:
			inode.links -=1
			if(inode.links == 0):
				interface.free_data_block(inode,0)
				MemoryInterface.update_inode_table(False, inode_number)
				return parent_inode
		if inode.type == 1:
			interface.free_data_block(inode,0)
			MemoryInterface.update_inode_table(False, inode_number)
			return parent_inode
		array_inode = InodeOps.InodeOperations().convert_table_to_array(inode)		
		MemoryInterface.update_inode_table(array_inode, inode_number)
		return parent_inode
    def read(self, inode, offset, length):
        '''READING DATA'''
        B = inode.ser_numbers

        if (inode.type != 0):
            print "ERROR: INODE TYPE NOT FILE"
            return (-1)

        if (offset >= inode.size
            ):  #If the offset is greater than the size of the inode
            print "ERROR: OFFSET LARGER THAN FILE SIZE."
            return (-1)  #Give an error and exit
        if (length == -1):
            length = inode.size

        if (length - offset > inode.size):
            print "ERROR: LENGTH GREATER THAN FILE SIZE"
        bl_dat = ""  #Stores data that is read
        index = offset / config.BLOCK_SIZE  #Index of the block thst contains the offset
        abc = math.ceil(
            min([offset + length, inode.size])
        ) / config.BLOCK_SIZE  #Index of the block that contains the last charcter to be read
        index1 = self.ceilings(abc)
        E = index * config.BLOCK_SIZE  #Stores number of characters before the index block
        N = offset - E  #Stores number of characters in the index block that do not have to be read

        read_servers = []
        if index == index1:
            for i in range(index, index1 + 1):
                read_servers = MemoryInterface.Read_Data_Servers(B[i])
            print("\n\nData to be read resides on the following servers: ")
            for i in range(0, len(read_servers)):
                print read_servers[i]
            MemoryInterface.Read_Server_Ack(read_servers)
            for i in range(index, index1 +
                           1):  #For number of block that have to be read from
                bl_dat = bl_dat + MemoryInterface.get_data_block(
                    inode.blk_numbers[i],
                    B[i])  #Put all the data block appended togther in bl_data
        inode.time_accessed = str(
            datetime.datetime.now())[:19]  #Update the access time

        for i in range(index, index1):
            read_servers = MemoryInterface.Read_Data_Servers(B[i])
        print("\n\nData to be read resides on the following servers: ")
        for i in range(0, len(read_servers)):
            print read_servers[i]
        MemoryInterface.Read_Server_Ack(read_servers)
        for i in range(index,
                       index1):  #For number of block that have to be read from
            bl_dat = bl_dat + MemoryInterface.get_data_block(
                inode.blk_numbers[i],
                B[i])  #Put all the data block appended togther in bl_data
        inode.time_accessed = str(
            datetime.datetime.now())[:19]  #Update the access time
        data_read = bl_dat[N:N + length]

        return inode, data_read  #Read data is bl_data removing N characters from the index block to N+length characters
        '''#IMPLEMENTS THE READ FUNCTION 
Example #8
0
 def get_valid_data_block(self):
     return MemoryInterface.get_valid_data_block()
Example #9
0
 def update_data_block(self, block_number, block_data, delay_sec):
     MemoryInterface.update_data_block(block_number, block_data, delay_sec)
Example #10
0
 def BLOCK_NUMBER_TO_DATA_BLOCK(self, block_number, delay_sec):
     return ''.join(MemoryInterface.get_data_block(block_number, delay_sec))
Example #11
0
            print "\n", (MemoryInterface.status_MFS())
        else:
            print "\n", (MemoryInterface.status())


if __name__ == '__main__':
    #DO NOT MODIFY THIS

    my_object = FileSystemOperations()

    num_of_servers = input("Enter the number of servers: ")
    #for i in range (0,num_of_servers):
    #os.system("gnome-terminal -e 'bash -c \"/media/sf_share/server"+str(i+1)+"/ServerStub"+str(i+1)+".py; exec bash\"'")

    time_t = input("Enter time t in seconds: ")
    MemoryInterface.time_func(time_t)

    port_num = input("Enter the first port number: ")

    MemoryInterface.Init(num_of_servers, port_num)

    Initialize_My_FileSystem()
    Initialize_My_FileSystem_MFS()
    text = []
    while text != "exit":
        text = raw_input(
            "\nEnter input command: \nTo create a directory: 'mkdir PATH' \nTo create a file: 'create PATH' \nTo write to a file: 'write'\nTo read froma file: 'read' \nTo move a file from oldpath to newpath: 'mv OLDPATH NEWPATH' \nTo remove a file: 'rm PATH' \nTo see the status: 'status' \nTo quit: 'exit'  \n$"
        )
        text1 = text.split(' ')
        print text
        if len(text1) > 1:
    def write(self, inode, offset, data):

        no_blocks_needed = self.ceilings(
            math.ceil(len(data)) / config.BLOCK_SIZE)
        B = inode.ser_numbers
        if inode.blk_numbers[0] == -1:
            A = inode.blk_numbers

            X = []
            for i in range(0, len(A)):
                X = interface.get_valid_data_block()
                A[i] = X[0]
                B[i] = X[1]
        '''TYPE ERROR'''

        if (inode.type != 0):
            print "ERROR: Inode type not file"
            return -1
        '''OFFSET ERROR'''
        if (offset > inode.size):
            print "ERROR: Offset greater than file size"
            return -1
        '''OFFSET ERROR'''
        if (offset < 0):
            print "ERROR: Offset less than 0"
            return -1
        '''TRUNCATE DATA'''
        mfs = (len(inode.blk_numbers)) * config.BLOCK_SIZE

        if (offset >= mfs):
            print "ERROR: Offset greater than inode size"  #mfs -> Maximum File Size
            return -1
        index = int(
            offset /
            config.BLOCK_SIZE)  #Index block=Block number with the offset
        block_data = []  #To get the data of the index block

        q = 0  #To store the star
        count = 0
        d = mfs - inode.size

        if (index == 0):  #If index block is the first block
            if (
                    len(data) - offset > mfs
            ):  #If length of data exceeds the maximum file size Data is truncated at the end by the
                data = data[0:mfs - offset]  #remaining space in the file
                print "Data larger than file size. Data truncated."

        else:  #If index block is not the first block
            if (inode.size == mfs):  #If inode is filled
                if (offset < mfs):  #But offset is lesser than the EOF
                    d = mfs - offset  #d stores the space in which new data is to be appended before EOF
                    if (
                            len(data) > d
                    ):  #if the data is longer than the space in the file after offset
                        data = data[
                            0:
                            d]  #Truncates the data by keeping only the length=space available
                        print "Data larger than file size. Data truncated."

            else:  #If the file is not full,
                d = mfs - inode.size  #d stores the space available in the inode
                if (len(data) > d
                    ):  #If the length of data is more than the space in inode
                    data = data[
                        0:
                        d]  #Truncates the data by only keeping the length=space available
                    print "Data larger than file size. Data truncated."

        block_data = MemoryInterface.get_data_block(
            inode.blk_numbers[index],
            B[index])  #Gets previous data from the index block
        b_d = []  #b_d stores the data in the index block
        b_d = block_data.replace('\x00', "")

        if index == 0:  #If the index block is first block
            b_d = b_d[
                0:
                offset] + data  #data to be written=previous data upto offset+new data

        else:
            for i in range(0, index):
                count += config.BLOCK_SIZE  #If index block is not first block, for number of blocks before index block
                q = offset - count  #increment the offset by block size to get new offset
                b_d = b_d[
                    0:
                    q] + data  #Data to be written= previous data upto new offset+newdata

        if (len(b_d) > config.BLOCK_SIZE):
            no_blocks_needed = self.ceilings(
                math.ceil(len(b_d)) / config.BLOCK_SIZE)

        MemoryInterface.No_Writing_Blocks(no_blocks_needed, inode)
        '''WRITING DATA'''
        if len(
                b_d
        ) > config.BLOCK_SIZE:  #If len of data to be written is greater than size of 1 block

            interface.free_data_block(inode.blk_numbers[index],
                                      B[index])  #Free the first data block

            interface.update_data_block(
                inode.blk_numbers[index], b_d[0:config.BLOCK_SIZE], B[index]
            )  #Write the first (blocksize) characters of the data to be written

            inode.time_accessed = str(datetime.datetime.now(
            ))[:19]  #Update access and modification time
            inode.time_modified = str(datetime.datetime.now())[:19]
            a = copy.deepcopy(
                config.BLOCK_SIZE
            )  #Copy blocksize into a & b without pointing to the same object
            b = copy.deepcopy(config.BLOCK_SIZE)
            x = len(b_d) / 8

            for i in range(
                    1,
                    no_blocks_needed):  #Executing for the rest of the blocks
                y = b + a

                interface.free_data_block(
                    inode.blk_numbers[index + i],
                    B[index + i])  #Free all the blocks after index block
                interface.update_data_block(
                    inode.blk_numbers[index + i], b_d[b:y], B[index + i]
                )  #In block after the index bloc, write the data left after first block

                inode.time_accessed = str(datetime.datetime.now())[:19]
                inode.time_modified = str(datetime.datetime.now())[:19]
                b = b + a
                inode.size = offset + len(
                    data)  #Increment inode size= length of the data written

        else:
            for i in range(
                    0, (inode.size / config.BLOCK_SIZE) - 1
            ):  #If the length of the data to be written is less than the block size

                interface.free_data_block(
                    inode.blk_numbers[index + i], B[index + i]
                )  #Free all the data blocks after index block and update the index block with
            interface.update_data_block(inode.blk_numbers[index], b_d,
                                        B[index + i])  #the data to be written

            inode.time_accessed = str(datetime.datetime.now())[:19]
            inode.time_modified = str(datetime.datetime.now())[:19]
            inode.size = offset + len(data)
        inode.blk_numbers = inode.blk_numbers
        return (
            inode
        )  #Updating inode.blk_numbers with the block numbers written in
Example #13
0
def Initialize_My_FileSystem(num_servers, raid_mode):
    MemoryInterface.Initialize_My_FileSystem(num_servers, raid_mode)
    AbsolutePathNameLayer.AbsolutePathNameLayer().new_entry('/', 1)
                for i in range(2, len(a)):
                    if (a[i] == ' '):
                        command = a[2:i]
                        instruction = a[i + 1:]
                        return command, instruction
                        break


if __name__ == '__main__':
    #DO NOT MODIFY THIS
    while True:
        raid = raw_input("Choose the type of RAID (1 or 5): ")
        print(raid)
        if (int(raid) == 5):
            print("RAID 5 Method is applied!")
            MemoryInterface.RAID_5()
            break
        if (int(raid) == 1):
            print("RAID 1 Method is applied!")
            MemoryInterface.RAID_1()
            break
        else:
            print("Wrong Number Typed. Please choose either 1 or 5.")
    Initialize_My_FileSystem()
    my_object = FileSystemOperations()

    #=======================INITIAL START FOR RUNNING TEST=====================
    #IF YOU WANT TO TYPE FROM BEGINNING, COMMENT THIS AREA
    my_object.mkdir("/A")
    my_object.mkdir("/B")
    my_object.mkdir("/C")
    def parse(cls, desc):
        """
        
        Parse the description of this IP object from an dictionary
        return a defaultdictionary built from the key-value pairs.

        Arguments:

        e -- An element tree element containing the description of this
        object
        
        """
        # Try to parse interfaces -- if it fails, return
        d = super(GroupMemoryInterface, cls).parse(desc)
        # Required Description Parameters
        q = None
        ifs = None
        if ("quantity" in desc):
            q = cls.parse_quantity(desc)
        if ("interfaces" in desc):
            ifs = cls.parse_interfaces(desc)

        if (ifs is not None):
            d["interfaces"] = ifs
            d["quantity"] = len(ifs)
            if (q is not None and q != len(ifs)):
                # TODO: is this the right error message?
                Tinker.value_error_map("quantity", q, str(len(ifs)))
            if ((set(desc.keys()) - cls._C_INTERFACE_KEYS) == set()):
                pass
            elif (set(ifs) == (set(desc.keys()) - cls._C_INTERFACE_KEYS)):
                for i in ifs:
                    if (desc[i]["role"] == "primary"):
                        d["primary"] = i
                for i in ifs:
                    # Hack...
                    if (desc[i]["role"] != "primary"):
                        desc[i]["master"] = d["primary"]
                    d[i] = MemoryInterface.MemoryInterface(desc[i])
            else:
                sys.exit("Error! Interfaces \"%s\" were missing keys" % str(
                    list(set(desc.keys()) - cls._C_INTERFACE_KEYS - set(ifs))))
        elif (q is not None):
            d["quantity"] = q
        else:
            sys.exit(
                "Failed to find an enumeration of memory interfaces in %s" %
                str(desc))

        # Optional Description Parameters
        if ("role" in desc):
            d["role"] = cls.parse_role(desc)

        if ("burst" in desc):
            d["burst"] = cls.parse_burst(desc)

        if ("ratio" in desc):
            d["ratio"] = cls.parse_ratio(desc)

        if ("width" in desc):
            d["width"] = cls.parse_width(desc)

        if ("name" in desc):
            d["name"] = cls.parse_name(desc)
        return d
    def implement(self, b):
        """

        Implement the Interface described by this object using the Board
        object describing the IP available on this board. 

        Arguments:

        d -- A Description object, containing the parsed user description
        of a custom board
        
        """
        self.validate(self)
        self.check_quantity(self)
        if ("interfaces" in self):
            self.check_interfaces(self)
        else:
            self["interfaces"] = []
            # TODO: Check interfaces, type
            ifs = b[self["type"]]["interfaces"]
            q = self["quantity"]
            if (q > len(ifs)):
                Tinker.value_error_map("quantity", str(q),
                                       "Range(1, %d)" % str(len(ifs)),
                                       Tinker.tostr_dict(self))
            default = b[self["type"]]["default"]
            d = {"role": "primary"}
            self["primary"] = default
            self["interfaces"].append(default)
            self[default] = MemoryInterface.MemoryInterface(d)
            ifs.remove(default)
            q -= 1

            for i in ifs:
                if (q <= 0):
                    break

                p = b[self["type"]][i]
                d = {}
                if ("independent" in p["roles"]):
                    d["role"] = "independent"
                    d["master"] = default
                elif ("secondary" in p["roles"] and default in p["group"]):
                    d["role"] = "secondary"
                    d["master"] = default
                else:
                    continue
                q -= 1
                self[i] = MemoryInterface.MemoryInterface(d)
                self["interfaces"].append(i)
            if (q > 0):
                print "In Key-Value Map"
                print Tinker.tostr_dict(self)
                sys.exit("Error! Not enough independent or capable " +
                         "secondary interfaces to implement memory group")
        ba = 0
        sz = 0
        for i in self["interfaces"]:
            self[i].implement(b[self["type"]][i])
            self[i] = self[i]["IP"]

            if ("burst" in self):
                self[i].set_burst(self["burst"])
            if ("ratio" in self):
                self[i].set_ratio(self["ratio"])
            if ("width" in self):
                self[i].set_ratio(self["width"])

        self.__configure()
        pass
Example #17
0
	def remove_and_free_memory_inode(self, inode, inode_number):
		interface.free_data_block(inode,0)
		MemoryInterface.update_inode_table(False, inode_number)
Example #18
0
 def update_data_block(self, block_number, block_data):
     MemoryInterface.update_data_block(block_number, block_data)
Example #19
0
 def get_first_four_blocks(self):
     return MemoryInterface.get_first_four_blocks()
Example #20
0
 def free_data_block(self, block_number):
     MemoryInterface.free_data_block(block_number)
Example #21
0
 def assign_virtual_blk_numbers(self, blk_number_list):
     return MemoryInterface.assign_virtual_blk_numbers(blk_number_list)
Example #22
0
 def rf(self):
     MemoryInterface.rf()
def Initialize_My_FileSystem():
    MemoryInterface.Initialize_My_FileSystem()
    AbsolutePathNameLayer.AbsolutePathNameLayer().new_entry('/', 1)
Example #24
0
def Initialize_My_FileSystem():
    MemoryInterface.Initialize_My_FileSystem()
Example #25
0
 def translate_virtual_blk_numbers(self, blk_number_list):
     return MemoryInterface.translate_virtual_blk_numbers(blk_number_list)
Example #26
0
# fixTest.py

import datetime, config, BlockLayer, InodeOps, MemoryInterface, InodeLayer, time

interface = BlockLayer.BlockLayer()
inodeInt = InodeLayer.InodeLayer()

print(MemoryInterface.status())

testInode = inodeInt.new_inode(0)

# Indicate the running test
print "\nRUNNING TEST 1:\n"

# Write and print the memory interface status
testInode = inodeInt.write(testInode, 0, "01234567")

print(MemoryInterface.status())
time.sleep(1)

# Read the file just written to
testInode, testRead = inodeInt.read(testInode, 0, 8)

# Print the read results
print "\n"
print "'" + testRead + "'"
print "\n"

# Indicate the running test
print "\nRUNNING TEST 2:\n"
Example #27
0
 def status(self, server):
     print("++++++++++++++" * 5)
     print("Status for Server " + str(server))
     print("++++++++++++++" * 5)
     print(MemoryInterface.status(server))
Example #28
0
 def status(self):
     return MemoryInterface.status()
Example #29
0
 def status(self):
     print(MemoryInterface.status())
Example #30
0
 def kill_all(self):
     MemoryInterface.kill_all()