diff --git a/files/stat b/files/stat new file mode 100644 index 00000000000..95a630e7d5b --- /dev/null +++ b/files/stat @@ -0,0 +1,109 @@ +#!/usr/bin/python +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +DOCUMENTATION = ''' +--- +module: stat +version_added: "1.3" +short_description: retrieve file or file system status +description: + - Retrieves facts for a file similar to the linux/unix 'stat' command. +options: + path: + description: + - The full path of the file/object to get the facts of + required: true + default: null + aliases: [] +author: Bruce Pennypacker +''' + +EXAMPLES = ''' +# Obtain the stats of /etc/foo.conf +- stats: > + path=/etc/foo.conf + +''' + +import os +import sys +from stat import * +from pprint import pprint + +def main(): + module = AnsibleModule( + argument_spec = dict( + path = dict(required=True), + ) + ) + + path = module.params.get('path') + + try: + st = os.stat(path) + except OSError, e: + if e.errno == errno.ENOENT: + d = { 'exists' : False } + module.exit_json(changed=False, stat=d) + + module.fail_json(msg = e.strerror) + + mode = st.st_mode + + # back to ansible + d = { + 'exists' : True, + 'mode' : S_IMODE(mode), + 'isdir' : S_ISDIR(mode), + 'ischr' : S_ISCHR(mode), + 'isblk' : S_ISBLK(mode), + 'isreg' : S_ISREG(mode), + 'isfifo' : S_ISFIFO(mode), + 'islnk' : S_ISLNK(mode), + 'issock' : S_ISSOCK(mode), + 'uid' : st.st_uid, + 'gid' : st.st_gid, + 'size' : st.st_size, + 'inode' : st.st_ino, + 'dev' : st.st_dev, + 'nlink' : st.st_nlink, + 'atime' : st.st_atime, + 'mtime' : st.st_mtime, + 'ctime' : st.st_ctime, + 'wusr' : bool(mode & stat.S_IWUSR), + 'rusr' : bool(mode & stat.S_IRUSR), + 'xusr' : bool(mode & stat.S_IXUSR), + 'wgrp' : bool(mode & stat.S_IWGRP), + 'rgrp' : bool(mode & stat.S_IRGRP), + 'xgrp' : bool(mode & stat.S_IXGRP), + 'woth' : bool(mode & stat.S_IWOTH), + 'roth' : bool(mode & stat.S_IROTH), + 'xoth' : bool(mode & stat.S_IXOTH), + 'isuid' : bool(mode & stat.S_ISUID), + 'isgid' : bool(mode & stat.S_ISGID), + } + + if S_ISDIR(mode) and os.path.islink(path): + d['isdir'] = False + d['islnk'] = True + + + module.exit_json(changed=False, stat=d) + +# this is magic, see lib/ansible/module_common.py +#<> + +main()