diff --git a/VmBackup.py b/VmBackup.py index 2fc8d3f..6a1e14e 100644 --- a/VmBackup.py +++ b/VmBackup.py @@ -65,7 +65,7 @@ # Usage w/ config file for multiple vm backups, where you can specify either vm-export or vdi-export: # ./VmBackup.py -import sys, time, os, datetime, subprocess, re, shutil, XenAPI, smtplib, re, base64, socket +import sys, time, os, datetime, subprocess, re, shutil, XenAPI, smtplib, re, base64, socket, signal from email.MIMEText import MIMEText from subprocess import PIPE from subprocess import STDOUT @@ -1369,6 +1369,46 @@ def usage_examples(): print ' ./VmBackup.py /root/VmBackup.pass monthly.cfg' print +def read_char_non_block(file_object,Block=True): + timeout=1 + signal.signal(signal.SIGALRM, input) + signal.alarm(timeout) + try: + if Block or select.select([file_object], [], [], 0) == ([file_object], [], []): + return file_object.read(1) + except: + return + +def read_password_from_stdin(): + password="" + while True: + char = read_char_non_block(sys.stdin) + if char: + password += char + else: + if len(password) > 0: + return password.rstrip() + else: + return + +def get_password(password_arg): + + # read password from stdin if password_arg is a dash("-") + if password_arg == "-": + password = read_password_from_stdin() + if password: + return password + else: + raise "FATAL: Could not get password from stdin" + + # return base64-decoded file content if password_arg is an existing file + if (os.path.exists(password)): + password = base64.b64decode(open(password, 'r').read()) + return password + + # else take the given password_arg as clear text password + return pasword_arg + if __name__ == '__main__': if 'help' in sys.argv or 'config' in sys.argv or 'example' in sys.argv: if 'help' in sys.argv: usage_help() @@ -1378,11 +1418,9 @@ def usage_examples(): if len(sys.argv) < 3: usage() sys.exit(1) - password = sys.argv[1] + password = get_password(sys.argv[1]) cfg_file = sys.argv[2] # obscure password support - if (os.path.exists(password)): - password = base64.b64decode(open(password, 'r').read()) if cfg_file.lower().startswith('create-password-file'): array = sys.argv[2].strip().split('=') open(array[1], 'w').write(base64.b64encode(password))