Shared_Processors/SubDirectoryList.py (67 lines of code) (raw):

#!/usr/bin/python # -*- coding: utf-8 -*- # # Copyright (c) Facebook, Inc. and its affiliates. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree.# """See docstring for SubDirectoryList class.""" from __future__ import absolute_import import os from autopkglib import Processor, ProcessorError __all__ = ["SubDirectoryList"] class SubDirectoryList(Processor): """Finds a filename for use in other Processors. Currently only supports glob filename patterns. """ input_variables = { "root_path": { "description": "Path to start looking for files.", "required": True, }, "suffix_string": { "description": ( "String to append to each found item name in dir. Defaults to ','" ), "default": ",", "required": False, }, } output_variables = { "found_filenames": { "description": ( "String containing a list of all files found " "relative to root_path, separated by " "suffix_string." ) }, "found_directories": { "description": ( "String containg a list of all directories " "found relative to root_path, separated by " "suffix_string." ) }, "relative_root": {"description": ("Relative root path")}, } description = __doc__ def main(self): sip_dirs = ["usr", "usr/local", "private", "private/etc", "Library"] format_string = "%s" % self.env["suffix_string"] # search_string = ' \'{0}\'' search_string = "{0}" dir_list = list() file_list = list() if not os.path.isdir(self.env["root_path"]): raise ProcessorError("Can't find root path!") for dirName, subdirList, fileList in os.walk(self.env["root_path"]): relative_path = os.path.relpath(dirName, self.env["root_path"]) # We need to remove the SIP folders so Chef doesn't try to create them if not relative_path == "." and not (relative_path in sip_dirs): dir_list.append(relative_path) # search_string.format(format_string.join(dirName)).strip() for fname in fileList: if ".DS_Store" in fname: continue # print('\t%s' % fname) relpath = os.path.relpath( os.path.join(fname, dirName), self.env["root_path"] ) self.output("Relative path: %s" % relpath) if relpath == ".": # we want to avoid prepending './' to files at root dir relpath = "" # print "Real relative path: %s" % relpath file_list.append(os.path.join(relpath, fname)) self.env["found_directories"] = search_string.format( format_string.join(dir_list) ).strip() self.env["found_filenames"] = search_string.format( format_string.join(file_list) ).strip() if __name__ == "__main__": PROCESSOR = SubDirectoryList() PROCESSOR.execute_shell()