From 669808e29fd4feaf5a86c74f541141c06f6f5943 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 4 Apr 2018 11:06:27 +0200 Subject: [PATCH 1/2] added option to supply password via stdin --- VmBackup.py | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/VmBackup.py b/VmBackup.py index 2fc8d3f..07c8a53 100644 --- a/VmBackup.py +++ b/VmBackup.py @@ -1369,6 +1369,37 @@ def usage_examples(): print ' ./VmBackup.py /root/VmBackup.pass monthly.cfg' print +def read_char_non_block(file_object,Block=True): + if Block or select.select([file_object], [], [], 0) == ([file_object], [], []): + char = file_object.read(1) + return char + raise error('Could not read password from stream') + +import time + +def read_password_from_stdin(): + password="" + while True: + char = read_char_non_block(sys.stdin,True) + if char: + password += char + else: + return password.rstrip() + +def get_password(password_arg): + + # read password from stdin if password_arg is a dash("-") + if password_arg == "-": + return read_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 +1409,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)) From a6b2b90c89a367d2c946dc312098483db8336eb8 Mon Sep 17 00:00:00 2001 From: Tobias Date: Wed, 4 Apr 2018 11:52:59 +0200 Subject: [PATCH 2/2] reworked password read from stdin --- VmBackup.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/VmBackup.py b/VmBackup.py index 07c8a53..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 @@ -1370,32 +1370,41 @@ def usage_examples(): print def read_char_non_block(file_object,Block=True): - if Block or select.select([file_object], [], [], 0) == ([file_object], [], []): - char = file_object.read(1) - return char - raise error('Could not read password from stream') - -import time + 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,True) + char = read_char_non_block(sys.stdin) if char: password += char else: - return password.rstrip() + 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 == "-": - return read_password_from_stdin() + 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 + password = base64.b64decode(open(password, 'r').read()) + return password # else take the given password_arg as clear text password return pasword_arg