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)
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()))