diff --git a/lib/ansible/module_common.py b/lib/ansible/module_common.py index c2376564415..4106c44d84d 100644 --- a/lib/ansible/module_common.py +++ b/lib/ansible/module_common.py @@ -47,6 +47,8 @@ import subprocess import sys import syslog import types +import time +import shutil try: from hashlib import md5 as _md5 @@ -274,6 +276,18 @@ class AnsibleModule(object): infile.close() return digest.hexdigest() + def backuplocal(self, fn): + '''make a date-marked backup of the specified file, return True or False on success or failure''' + # backups named basename-YYYY-MM-DD@HH:MM~ + ext = time.strftime("%Y-%m-%d@%H:%M~", time.localtime(time.time())) + backupdest = '%s.%s' % (fn, ext) + + try: + shutil.copy2(fn, backupdest) + except shutil.Error, e: + self.fail_json(msg='Could not make backup of %s to %s: %s' % (fn, backupdest, e)) + return backupdest + # == END DYNAMICALLY INSERTED CODE === diff --git a/library/assemble b/library/assemble index 400438cb0e9..c0c516b117f 100755 --- a/library/assemble +++ b/library/assemble @@ -50,6 +50,7 @@ def main(): argument_spec = dict( src = dict(required=True), dest = dict(required=True), + backup=dict(default=False, choices=BOOLEANS), ) ) @@ -58,6 +59,7 @@ def main(): destmd5 = None src = os.path.expanduser(module.params['src']) dest = os.path.expanduser(module.params['dest']) + backup = module.boolean(module.params.get('backup', False)) if not os.path.exists(src): module.fail_json(msg="Source (%s) does not exist" % src) @@ -72,6 +74,8 @@ def main(): destmd5 = module.md5(dest) if pathmd5 != destmd5: + if backup and destmd5 is not None: + module.backuplocal(dest) shutil.copy(path, dest) changed = True diff --git a/library/copy b/library/copy index be7e685a8ab..9d9a00241bc 100755 --- a/library/copy +++ b/library/copy @@ -20,19 +20,6 @@ import os import shutil -import time - -def backuplocal(fn): - """make a date-marked backup of the specified file, return True or False on success or failure""" - # backups named basename-YYYY-MM-DD@HH:MM~ - ext = time.strftime("%Y-%m-%d@%H:%M~", time.localtime(time.time())) - backupdest = '%s.%s' % (fn, ext) - - try: - shutil.copy2(fn, backupdest) - except shutil.Error, e: - return False, 'Could not make backup of %s to %s: %s' % (fn, backupdest, e) - return True, backupdest def main(): @@ -76,11 +63,7 @@ def main(): try: if backup: if os.path.exists(dest): - success, msg = backuplocal(dest) - if not success: - module.fail_jason(msg=msg) - else: - backup_file = msg + backup_file = module.backuplocal(dest) shutil.copyfile(src, dest) except shutil.Error: module.fail_json(msg="failed to copy: %s and %s are the same" % (src, dest)) diff --git a/library/lineinfile b/library/lineinfile index 40fca34987a..00f298e12bf 100755 --- a/library/lineinfile +++ b/library/lineinfile @@ -21,7 +21,7 @@ import re import os -def present(module, name, regexp, line, insertafter): +def present(module, name, regexp, line, insertafter, backup): f = open(name, 'rb') lines = f.readlines() f.close() @@ -69,13 +69,15 @@ def present(module, name, regexp, line, insertafter): changed = True if changed: + if backup: + module.backuplocal(name) f = open(name, 'wb') f.writelines(lines) f.close() module.exit_json(changed=changed, msg=msg) -def absent(module, name, regexp): +def absent(module, name, regexp, backup): f = open(name, 'rb') lines = f.readlines() f.close() @@ -90,6 +92,8 @@ def absent(module, name, regexp): lines = filter(matcher, lines) changed = len(found) > 0 if changed: + if backup: + module.backuplocal(name) f = open(name, 'wb') f.writelines(lines) f.close() @@ -103,18 +107,20 @@ def main(): regexp=dict(required=True), line=dict(aliases=['value']), insertafter=dict(default='EOF'), + backup=dict(default=False, choices=BOOLEANS), ), ) params = module.params + backup = module.boolean(module.params.get('backup', False)) if params['state'] == 'present': if 'line' not in params: module.fail_json(msg='line= is required with state=present') present(module, params['name'], params['regexp'], params['line'], - params['insertafter']) + params['insertafter'], backup) else: - absent(module, params['name'], params['regexp']) + absent(module, params['name'], params['regexp'], backup) # this is magic, see lib/ansible/module_common.py #<>