Example #1
0
class VirtualFilesystem(AbstractedFS):
    """Represents a virtual filesystem (currently only memory and s3 are supported)
    """
    
    def __init__(self, root, cmd_channel):
        AbstractedFS.__init__(self, root, cmd_channel)
        self.cwd = root
        self.type = cmd_channel.type
        self.s3_bucket = cmd_channel.s3_bucket
        self.aws_access_key = cmd_channel.aws_access_key
        self.aws_secret_key = cmd_channel.aws_secret_key
        self.seperator = cmd_channel.seperator
        self.thread_synchronize = cmd_channel.thread_synchronize
        self.key_sync_timeout = cmd_channel.key_sync_timeout
        if not self.cmd_channel.fs_obj:
            if self.type == "memory":
                self.fs_obj = MemoryFS()
            elif self.type == "s3":
                self.fs_obj = S3FS(bucket=self.bucket, prefix=self.prefix, aws_access_key=self.aws_access_key, aws_secret_key=self.aws_secret_key, separator=self.seperator, thread_synchronize=self.thread_synchronize, key_sync_timeout=self.key_sync_timeout)
            self.cmd_channel.fs_obj = self.fs_obj
        else:
            self.fs_obj = self.cmd_channel.fs_obj
            

    def ftp2fs(self, ftppath):
        return self.ftpnorm(ftppath)

    def fs2ftp(self, fspath):
        return fspath

    def validpath(self, path):
        # validpath was used to check symlinks escaping user home
        # directory; this is no longer necessary.
        return True
    
    def open(self, filename, mode):
            f = self.fs_obj.open(filename, mode)
            f.name=filename
            return f
    
    def mkdir(self, path):
        return self.fs_obj.makedir(path)
        
    def chdir(self, path):
        return self.fs_obj.opendir(path)
    
    def listdir(self,path):
        return self.fs_obj.listdir(path)
    
    def rmdir(self, path):
        return self.fs_obj.removedir(path)
    
    def remove(self, path):
        return self.fs_obj.remove(path)
    
    def rename(self, src, dst):
        return self.fs_obj.rename(src, dst)
    
    def chmod(self, path, mode):
        return True
    
    def readlink(self, path):
        return self.ftp2fs(path)
    
    def isfile(self, path):
        return self.fs_obj.isfile(path)
    
    def islink(self, path):
        return False
    
    def getsize(self, path):
        return self.fs_obj.getsize(path)
    
    def getmtime(self, path):
        return self.fs_obj.getinfo(path)['modified_time']
    
    def realpath(self, path):
        return path
    
    def lexists(self, path):
        return self.fs_obj.exists(path)
    
    def mkstemp(self, suffix='', prefix='', mode='wb'):
        from tempfile import _RandomNameSequence as RandomName
        name = RandomName()
        if suffix != '':
            suffix = 'tmp'
        fname = suffix + name.next()
        return self.fs_obj.open(fname,mode)
Example #2
0
class fs:
    def __init__(self, username="******"):
        self.username = username
        self.__build_default_tree()
        self.NOTFOUND = "Not found"
        self.ALREADYEXISTS = "Already Exists"

    def __create_files_recurse(self, files):
        for file in files:
            if file["type"] == "dir":
                self.mem_fs.makedir(file["name"])
                self.__create_files_recurse(file["children"])
            else:
                data = """��*��̵/"��'g�>����O�����U�\�tc����SAƖ��b���#ں^�+�
                ��,�j��W��=H�a�2�M3��-���2t����5�=��˴�S+���o�G�O�F���B�}����
                ����j4�g���W�%���`3h��0����qss�]�l8�o������l^�VP6d����ƽ��qpD
                o��[n����$V�i�b�{�������XT��dƀݙ���<V6�l���y�N�#)1�+A�xe��#Qd
                y��K��!^��G��@Z�W2L+��M}��S;��qORMX�`��?L*�(��>?�0K6����6G�
                GG�J�&BC�4gO���xb�.��#���"y���k�D�H%��88+B�H�� &l�܋��튰�����
                301���x��mQ������c U{��x_���՞Jt ���y]G��#TԻ�pd{�+)j,wY��4�zN
                .�Y`>W�X)��v��q.L�)K�ry#:��`"L�h"""

                try:
                    data = file["data"]
                except:
                    pass
                self.mem_fs.writetext(file["name"], data)

    def __build_default_tree(self):
        self.mem_fs = MemoryFS()
        dir = os.path.dirname(__file__)
        template_path = os.path.join(dir, "data", "fs_template.json")
        with open(template_path, "r") as raw_template:
            fs_template = json.load(raw_template)
        self.__create_files_recurse(fs_template)
        self.home = f"/home/{self.username}"
        self.pwd = self.home
        self.mem_fs.makedir(self.pwd)
        print(self.mem_fs.listdir("/"))

    def ls(self, path):
        path = self.__format_path(path)
        res = []
        try:
            res = self.mem_fs.listdir(path)
        except fserrors.ResourceNotFound:
            return self.NOTFOUND

        return " ".join(res)

    def mkdir(self, path):
        path = self.__format_path(path)
        try:
            res = self.mem_fs.makedir(path)
        except fserrors.DirectoryExists:
            return self.ALREADYEXISTS
        except fserrors.ResourceNotFound:
            return self.NOTFOUND

    def cd(self, path):
        path = self.__format_path(path)
        try:
            res = self.mem_fs.getinfo(path)
            self.pwd = path
        except fserrors.ResourceNotFound:
            return self.NOTFOUND

    def __format_path(self, path):
        if path == None or len(path) == 0:
            path = self.pwd
        elif path[0] != "~":
            len_rest = self.home
        elif path[0] != "/":
            path = f"{self.pwd}/{path}"
        elif path[0] != ".":
            len_rest = len(path) - 1
            path = f"{self.pwd}/{path[-len_rest:]}"
        return path

    def __str__(self):
        return str(RenderTree(self.root, style=AsciiStyle()))