def __init__(self, *args, **kw): fuse.Fuse.__init__(self, *args, **kw) self.parser.add_option("-c", "--config", type="string", dest="config", help="Use CONFIG as a configuration file", metavar="CONFIG") # self.parser.add_option("-k", "--key", type="string", dest="key", help="Use KEY to decrypt the filesystem", metavar="KEY") # self.parser.add_option("-p", "--prefix", type="string", dest="prefix", help="Prefix where the image files are", metavar="PREFIX") # self.parser.add_option("-i", "--root_inode", type="string", dest="root_inode", help="Root inode location", metavar="ROOT") # options, args = self.parser.parse_args() # if not options.key or not options.prefix or not options.root_inode: # self.parser.print_help() # quit() # self.root = options.root_inode # self.key = options.key # self.prefix = options.prefix self.root = raw_input("Root inode: ") self.key = raw_input("Encryption key: ") self.prefix = raw_input("Prefix: ") print self.root, self.key, self.prefix inode = Inode(self.root, self.key, prefix=self.prefix) self.root_dir = Directory(inode, prefix=self.prefix) self.freefile = File(self.root_dir.dirs[".freefile"]) self.free = self.freefile.read(self.freefile.inode.file_size, 0).split("$") self.root_dir.free = self.free print self.root_dir.free self.last_objs = dict()
def post(self, request, *args, **kwargs): data = request.data # 验证 """ hosts [] hosts中的ip 必须要在/etc/ansible/hosts文件中注册过才行,否则忽略. """ if not (isinstance(data['hosts'], list) and len(data['hosts']) < 100): # 安全风险考虑 # TODO: 100 to config return json_api_response(code=-1, data=None, message="一次任务要执行的主机数量不能大于100台.") script_name = data["script_name"] if script_name.endswith("yaml"): # exec script task_data = { "playbook": File.get_join_path(settings.ANSIBLE_SCRIPT_PATH, data["script_name"]), "extra_vars": { "host_list": data['hosts'] }, "forks": data.get("forks", 5), } result = playbook_task.delay(**task_data) else: # exec playbook task_data = { "hosts": data['hosts'], "forks": data.get("forks", 5), "module": "script", 'args': File.get_join_path(settings.ANSIBLE_SCRIPT_PATH, data["script_name"]), } result = runner_task.delay(**task_data) return json_api_response(code=0, data=result.id, message=None)
def list_dir(self): """列出目录下所有脚本和剧本""" ret = { "script": [], "playbook": [], } file_list = File.list_dir(settings.ANSIBLE_SCRIPT_PATH) for x in file_list: if x.endswith("sh") or x.endswith("py"): ret['script'].append(x) elif x.endswith("yaml"): ret['playbook'].append(x) return ret, True
inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.add_direction_str(Direction("0|||$")) inode.file_size = 0 inode.type = "1" inode.save_data() print "Creating .freefile" f = Directory(inode, files, prefix=dir) f.mkfile(".freefile") freefile = File(f.dirs[".freefile"], files, prefix=dir) # We need to write this twice... freefile.write("$".join(files), 0) freefile.save_data() f.save_data() freefile.truncate(len("$".join(files))-1) freefile.write("$".join(files), 0) freefile.save_data() print files print "Done formatting" print "To start using your new filesystem execute:" print "\t python esfs.py <mount point> --prefix=<path to the images files> --root_inode=<path to the root inode file> --key=<key>"
class ESFS(fuse.Fuse): def __init__(self, *args, **kw): fuse.Fuse.__init__(self, *args, **kw) self.parser.add_option("-c", "--config", type="string", dest="config", help="Use CONFIG as a configuration file", metavar="CONFIG") # self.parser.add_option("-k", "--key", type="string", dest="key", help="Use KEY to decrypt the filesystem", metavar="KEY") # self.parser.add_option("-p", "--prefix", type="string", dest="prefix", help="Prefix where the image files are", metavar="PREFIX") # self.parser.add_option("-i", "--root_inode", type="string", dest="root_inode", help="Root inode location", metavar="ROOT") # options, args = self.parser.parse_args() # if not options.key or not options.prefix or not options.root_inode: # self.parser.print_help() # quit() # self.root = options.root_inode # self.key = options.key # self.prefix = options.prefix self.root = raw_input("Root inode: ") self.key = raw_input("Encryption key: ") self.prefix = raw_input("Prefix: ") print self.root, self.key, self.prefix inode = Inode(self.root, self.key, prefix=self.prefix) self.root_dir = Directory(inode, prefix=self.prefix) self.freefile = File(self.root_dir.dirs[".freefile"]) self.free = self.freefile.read(self.freefile.inode.file_size, 0).split("$") self.root_dir.free = self.free print self.root_dir.free self.last_objs = dict() def get_obj(self, path): """ Given a path it returns the file or directory of the last element """ if path in self.last_objs.keys(): return self.last_objs[path] pe = path.split('/')[1:] step = 0 current = self.root_dir whole_path = "" # we cycle through the whole path for part in pe: in_cache = False whole_path += "/"+part if whole_path in self.last_objs.keys(): in_cache = True current = self.last_objs[whole_path] else: # if its a dir, stand on it if current.dirs[part].is_dir(): current = Directory(current.dirs[part], self.free, prefix=self.prefix) # if it's not a dir, and it's not the last element, error elif part != pe[-1]: return -errno.ENOENT # else it's a file and the last element of the path else: current = File(current.dirs[part], self.free, prefix=self.prefix) # if it's just a directory in the middle, cycle, and take the new current # as the base # save all the objects in a temporal cache if not in_cache: self.last_objs[whole_path] = current return current def clear_cache(self): self.last_objs = dict() def getattr(self, path): st = Stat() if path == '/': pass else: try: obj = self.get_obj(path) st = obj.getattr() except: return -errno.ENOENT return st def readdir(self, path, offset): dirs = dict() if path == '/': dirs = self.root_dir.dirs else: obj = self.get_obj(path) if obj.inode.is_dir(): dirs = obj.dirs else: dirs = dict() dirs["."] = None dirs[".."] = None for r in dirs.keys(): yield fuse.Direntry(r) def mknod(self, path, mode, dev): elems = path.split('/') npath = "/".join(elems[:-1]) if npath == "": self.root_dir.mkfile(elems[-1]) self.root_dir.save_data() else: d = self.get_obj(npath) d.mkfile(elems[-1]) d.save_data() self.root_dir.save_data() self.release("",0) return 0 def unlink(self, path): elems = path.split('/') npath = "/".join(elems[:-1]) if npath == "": self.root_dir.delete(elems[-1]) self.root_dir.save_data() else: d = self.get_obj(npath) d.delete(elems[-1]) d.save_data() self.release("",0) return 0 def read(self, path, size, offset): f = self.get_obj(path) return f.read(size, offset) def write(self, path, buf, offset): f = self.get_obj(path) written = f.write(buf, offset) f.save_data() return written def release(self, path, flags): self.freefile.truncate(len("$".join(self.free))-1) self.freefile.write("$".join(self.free), 0) self.freefile.save_data() return 0 def open(self, path, flags): return 0 def truncate(self, path, size): d = self.get_obj(path) d.truncate(size) return 0 def utime(self, path, times): return 0 def mkdir(self, path, mode): elems = path.split('/') npath = "/".join(elems[:-1]) if npath == "": self.root_dir.mkdir(elems[-1]) self.root_dir.save_data() else: d = self.get_obj(npath) d.mkdir(elems[-1]) d.save_data() self.release("",0) return 0 def rmdir(self, path): self.unlink(path) return 0 def rename(self, pathfrom, pathto): return 0 def fsync(self, path, isfsyncfile): return 0
def read_file(self, filename): """ 读文件内容 """ file_path = File.get_join_path(settings.ANSIBLE_SCRIPT_PATH, filename) return File.read_file(file_path)