From d0f4358730ecfcd846c882b102ce411529d001f5 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Sat, 21 Jul 2012 17:07:42 -0400 Subject: [PATCH] Port the copy module over to the new "common module" logic. --- hacking/test-module | 4 +- lib/ansible/module_common.py | 20 +++++ library/copy | 145 +++++++++++------------------------ 3 files changed, 68 insertions(+), 101 deletions(-) diff --git a/hacking/test-module b/hacking/test-module index 16c8d94f575..398597fd135 100755 --- a/hacking/test-module +++ b/hacking/test-module @@ -30,8 +30,8 @@ import sys import os import subprocess import traceback -from ansible import utils -from ansible import module_common +import ansible.utils as utils +import ansible.module_common as module_common try: import json diff --git a/lib/ansible/module_common.py b/lib/ansible/module_common.py index a9a1fa2bae9..200790f037a 100644 --- a/lib/ansible/module_common.py +++ b/lib/ansible/module_common.py @@ -39,6 +39,11 @@ import subprocess import sys import syslog +try: + from hashlib import md5 as _md5 +except ImportError: + from md5 import md5 as _md5 + class AnsibleModule(object): def __init__(self, argument_spec, bypass_checks=False, no_log=False): @@ -135,6 +140,21 @@ class AnsibleModule(object): print json.dumps(kwargs) sys.exit(1) + def md5(self, filename): + ''' Return MD5 hex digest of local file, or None if file is not present. ''' + if not os.path.exists(filename): + return None + digest = _md5() + blocksize = 64 * 1024 + infile = open(filename, 'rb') + block = infile.read(blocksize) + while block: + digest.update(block) + block = infile.read(blocksize) + infile.close() + return digest.hexdigest() + + # == END DYNAMICALLY INSERTED CODE === """ diff --git a/library/copy b/library/copy index d2a6f750517..dcd8e98a55f 100755 --- a/library/copy +++ b/library/copy @@ -16,108 +16,55 @@ # # You should have received a copy of the GNU General Public License # along with Ansible. If not, see . -# import sys import os import shlex import shutil -import syslog - -try: - from hashlib import md5 as _md5 -except ImportError: - from md5 import md5 as _md5 - -# =========================================== -# convert arguments of form a=b c=d -# to a dictionary -# FIXME: make more idiomatic - -def dump_kv(vars): - return " ".join("%s='%s'" % (k,v) for (k,v) in vars.items()) - -def exit_kv(rc=0, **kwargs): - if 'path' in kwargs: - add_path_info(kwargs) - print dump_kv(kwargs) - sys.exit(rc) - -def md5(filename): - ''' Return MD5 hex digest of local file, or None if file is not present. ''' - if not os.path.exists(filename): - return None - digest = _md5() - blocksize = 64 * 1024 - infile = open(filename, 'rb') - block = infile.read(blocksize) - while block: - digest.update(block) - block = infile.read(blocksize) - infile.close() - return digest.hexdigest() - -# =========================================== - -if len(sys.argv) == 1: - exit_kv(rc=1, failed=1, msg="incorrect number of arguments given") - -argfile = sys.argv[1] -if not os.path.exists(argfile): - exit_kv(rc=1, failed=1, msg="file %s does not exist" % (argfile)) - -args = open(argfile, 'r').read() -items = shlex.split(args) -syslog.openlog('ansible-%s' % os.path.basename(__file__)) -syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % args) - - -params = {} -for x in items: - (k, v) = x.split("=") - params[k] = v - -src = params['src'] -dest = params['dest'] -if src: - src = os.path.expanduser(src) -if dest: - dest = os.path.expanduser(dest) - -md5sum_src = None -# raise an error if there is no src file -if not os.path.exists(src): - exit_kv(rc=1, failed=1, msg="Source %s failed to transfer" % (src)) -if not os.access(src, os.R_OK): - exit_kv(rc=1, failed=1, msg="Source %s not readable" % (src)) -md5sum_src = md5(src) - -md5sum_dest = None -# check if there is no dest file -if os.path.exists(dest): - # raise an error if copy has no permission on dest - if not os.access(dest, os.W_OK): - exit_kv(rc=1, failed=1, msg="Destination %s not writable" % (dest)) - if not os.access(dest, os.R_OK): - exit_kv(rc=1, failed=1, msg="Destination %s not readable" % (dest)) - md5sum_dest = md5(dest) -else: - if not os.access(os.path.dirname(dest), os.W_OK): - exit_kv(rc=1, failed=1, msg="Destination %s not writable" % (os.path.dirname(dest))) - -if md5sum_src != md5sum_dest: - # was os.system("cp %s %s" % (src, dest)) - try: - shutil.copyfile(src, dest) - except shutil.Error: - exit_kv(rc=1, failed=1, msg="failed to copy: %s and %s are the same" % (src, dest)) - except IOError: - exit_kv(rc=1, failed=1, msg="failed to copy: %s to %s" % (src, dest)) - changed = True -else: - changed = False - -# mission accomplished -#print "md5sum=%s changed=%s" % (md5sum_src, changed) -exit_kv(dest=dest, src=src, md5sum=md5sum_src, changed=changed) +def main(): + + module = AnsibleModule( + argument_spec = dict( + src=dict(required=True), + dest=dict(required=True) + ) + ) + + src = os.path.expanduser(module.params['src']) + dest = os.path.expanduser(module.params['dest']) + + if not os.path.exists(src): + module.fail_json(msg="Source %s failed to transfer" % (src)) + if not os.access(src, os.R_OK): + module.fail_json(msg="Source %s not readable" % (src)) + + md5sum_src = module.md5(src) + md5sum_dest = None + + if os.path.exists(dest): + if not os.access(dest, os.W_OK): + module.fail_json(msg="Destination %s not writable" % (dest)) + if not os.access(dest, os.R_OK): + module.fail_json(msg="Destination %s not readable" % (dest)) + md5sum_dest = module.md5(dest) + else: + if not os.access(os.path.dirname(dest), os.W_OK): + module.fail_json(msg="Destination %s not writable" % (os.path.dirname(dest))) + + if md5sum_src != md5sum_dest: + try: + shutil.copyfile(src, dest) + except shutil.Error: + module.fail_json(msg="failed to copy: %s and %s are the same" % (src, dest)) + except IOError: + module.fail_json(msg="failed to copy: %s to %s" % (src, dest)) + changed = True + else: + changed = False + + module.exit_json(dest=dest, src=src, md5sum=md5sum_src, changed=changed) + +# this is magic, see lib/ansible/module_common.py +#<> +main()