Exemple #1
0
 def create(self, file_name):
     superblock = self._superblock
     fat = self._fat
     inode_map = self._inode_map
     root = self._root
     
     if file_name in root.list:
         raise FileExistsError('Файл с данным именем уже существует')
     
     if superblock.free_cluster_num == 0:
         raise NoFreeClustersException(
             'Не осталось свободных блоков данных')
     
     if len(file_name) > 59:
         raise ValueError('Имя файла должно быть не более 59 символов')
     
     inode_id = inode_map.get_free_inode()
     now = int(time())
     first_cluster = fat.get_free_cluster()
     inode = Inode(inode_id, uid=self._uid, ctime=now, mtime=now,
                   first_cluster=first_cluster)
     inode.set_permissions(owner_read=True, owner_write=True,
                           other_read=True, other_write=False)
     fat.set(index=first_cluster, value=-1)
     inode_map.set(inode.id, False)
     root.add(file_name, inode)
Exemple #2
0
    def create(self, file_name):
        superblock = self._superblock
        fat = self._fat
        inode_map = self._inode_map
        root = self._root

        if file_name in root.list:
            raise FileExistsError('Файл с данным именем уже существует')

        if superblock.free_cluster_num == 0:
            raise NoFreeClustersException(
                'Не осталось свободных блоков данных')

        if len(file_name) > 59:
            raise ValueError('Имя файла должно быть не более 59 символов')

        inode_id = inode_map.get_free_inode()
        now = int(time())
        first_cluster = fat.get_free_cluster()
        inode = Inode(inode_id,
                      uid=self._uid,
                      ctime=now,
                      mtime=now,
                      first_cluster=first_cluster)
        inode.set_permissions(owner_read=True,
                              owner_write=True,
                              other_read=True,
                              other_write=False)
        fat.set(index=first_cluster, value=-1)
        inode_map.set(inode.id, False)
        root.add(file_name, inode)
Exemple #3
0
    def add(self, file_name, inode):
        superblock = self._superblock
        fat = self._fat
        file = self._file

        file_name = bytes(file_name, "utf-8")

        clusters = fat.get_clusters_chain(0)
        empty_space = None

        for cluster in clusters:
            file.seek(self._cluster_offset(cluster))
            for _ in range(superblock.cluster_size // 64):
                data = unpack("59sci", file.read(64))
                if ord(data[1]) == 0:
                    empty_space = file.tell() - 64
                    break

            if empty_space:
                break
        else:
            cluster_index = fat.get_free_cluster()

            fat.set(clusters[-1], cluster_index)
            fat.set(cluster_index, -1)
            empty_space = self._cluster_offset(cluster_index)

            root_inode = Inode.get_inode(superblock.inode_array_offset, file, 0)
            root_inode.size = (len(clusters) + 1) * superblock.cluster_size
            Inode.set_inode(superblock.inode_array_offset, file, root_inode)

        file.seek(empty_space)
        file.write(pack("59sci", file_name, bytes([len(file_name)]), inode.id))

        self._list[file_name.decode()] = inode
        Inode.set_inode(superblock.inode_array_offset, file, inode)
Exemple #4
0
    def _init_files_list(self):
        superblock = self._superblock
        fat = self._fat
        file = self._file

        self._list = {}
        clusters = fat.get_clusters_chain(0)

        for cluster in clusters:
            file.seek(self._cluster_offset(cluster))
            for _ in range(superblock.cluster_size // 64):
                data = unpack("59sci", file.read(64))
                length = ord(data[1])

                if length:
                    position = file.tell()
                    self._list[data[0][:length].decode()] = Inode.get_inode(
                        superblock.inode_array_offset, file, data[2]
                    )
                    file.seek(position)
Exemple #5
0
    def format(file_name, password='******', size=50 * 1024 * 1024):
        file = open(file_name, 'wb')

        file.seek(size - 1)
        file.write(b'\0')

        superblock = SuperBlock.default(size)

        file.seek(superblock.inode_array_offset)
        inode_table = [Inode(id) for id in range(superblock.cluster_num)]
        for inode in inode_table:
            file.write(inode.pack())

        cluster_size = superblock.cluster_size
        offset = cluster_size - file.tell() % cluster_size
        superblock.first_cluster_offset = file.tell() + offset
        superblock.free_cluster_num = (
            superblock.cluster_num -
            superblock.first_cluster_offset // cluster_size)

        fat = FAT.empty(superblock.free_cluster_num, superblock)

        inode_map = InodeMap.empty(superblock.free_cluster_num)

        Root.write(superblock, fat, inode_map, file)

        superblock.write(file)
        fat.write(superblock.fat_offset, file)
        inode_map.write(superblock.inode_map_offset, file)

        file.close()

        fs = FileSystem(file_name, 0)
        fs.create('users')
        hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
        fs.write('users', '0 admin %s' % hash)
Exemple #6
0
 def write(superblock, fat, inode_map, file):
     now = int(time())
     inode = Inode(id=0, size=superblock.cluster_size, ctime=now, mtime=now, first_cluster=0)
     Inode.set_inode(superblock.inode_array_offset, file, inode)
     inode_map.set(inode.id, False)
     fat.set(0, -1)
Exemple #7
0
 def update_inode(self, file_name, inode):
     self._list[file_name] = inode
     Inode.set_inode(self._superblock.inode_array_offset, self._file, inode)