diff --git a/variable_grabbler.py b/variable_grabbler.py index 6fa83d5..c185334 100644 --- a/variable_grabbler.py +++ b/variable_grabbler.py @@ -1,97 +1,72 @@ -#!/usr/bin/python2 +#!/usr/bin/env python3 -print """ -Variable Grabbler - version 4.0_pre6 -------------------------------------""" -################################################################ -# Changes in this version: -#=============================================================== -# *"\?" in a variable will now be replaced with a simple ? -# before processing, remember to double escape that because -# json doesn't like \? (=> \\?) -# *commands are now not run over and over again if not needed -# *files are now not rewritten for each variable individually -# *some technical stuff +import os, sys, json, traceback -################################################################ +# Definitions +def stdout(string, end='\n', flush=False): + print(string, end=end, file=sys.stdout, flush=flush) + +def stderr(string, end='\n', flush=False): + print(string, end=end, file=sys.stderr, flush=flush) + +stderr("Variable Grabbler - version 5.0_pre1\n--------------------------------------------------------------------------------") +################################################################################ +# Chnages in this version: +# - port to Python 3 +# - output to stdout instead of rewriting the file +#=============================================================================== +# Full documentation: tbd +#=============================================================================== # Exit codes: -#=============================================================== -# 0 => normal exit -# 1 => command line argument error -# 2 => error while processing -# - -# definitions -import os, json, sys, subprocess - -def print_err(text): - print >> sys.stderr, text +# 0: normal exit +# 1: wrong usage +# 2: error while processing +# Command line input handling +usage = "Usage: python3 "+sys.argv[0]+" " if not len(sys.argv)==3: - print_err("Error: Exactly two arguments required: \"python variable_grabbler.py \"") - sys.exit(1) + stderr("E: Wrong amount of arguments.") + stderr(usage) + sys.exit(1) +if sys.argv[1] == sys.argv[2]: + stderr("E: Both input files are the same.") + stderr(usage) + sys.exit(1) -print "Reading config file...", -config_file = open(sys.argv[2],"r") -config_values = json.loads(config_file.read().decode("utf-8")) -config_file.close() -print "Done." - - -print "Reading file: "+sys.argv[1]+"..." -file_in = open(sys.argv[1], "r") -file_content = file_in.read() -file_in.close() - -print "Replacing variables:" -for variable in config_values: - print "> "+variable.upper()+" => ", - - if config_values[variable][0] == "file": - print "Found array. Adding file instead: " + config_values[variable][1] - file_replacement = open(config_values[variable][1], "r") - file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", file_replacement.read()).encode('utf-8') - file_replacement.close() - elif config_values[variable][0] == "exec": - print "Found array. Executing command instead: " + config_values[variable][1] - if variable.upper() in file_content: - process = subprocess.Popen(config_values[variable][1], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = process.communicate() - if process.returncode == 0: - print "Process exited normally. Replacing variable with the output from STDOUT..." - print_err("Subprocess exited normally.\nThe following error messages were produced:") - print_err(stderr) - file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", stdout).encode('utf-8') - else: - print "Process exited abnormally. Exiting. No changes will be made." - print_err("Subprocess exited abnormally. Exiting.\nThe following output was produced:") - print_err(stdout) - print_err("The following error messages were produced:") - print_err(stderr) - print "Exiting now." - sys.exit(2) +stderr("I: Reading macro definitions... ", end="") +macros = {} +try: + if os.path.isfile(sys.argv[1]): + macro_file = open(sys.argv[1], "r") + macros = json.loads(macro_file.read()) + macro_file.close() + elif sys.argv[1] == '-': + macros = json.loads(sys.stdin.read()) else: - print variable.upper(), - print "was not found in the file. Skipping command execution." - else: - replacement = str(config_values[variable]) - # look for variable sections that contain question marks - argument_positions = [] - i = 0 - while i \\?) +# *commands are now not run over and over again if not needed +# *files are now not rewritten for each variable individually +# *some technical stuff + +################################################################ +# Exit codes: +#=============================================================== +# 0 => normal exit +# 1 => command line argument error +# 2 => error while processing +# + +# definitions +import os, json, sys, subprocess + +def print_err(text): + print >> sys.stderr, text + +if not len(sys.argv)==3: + print_err("Error: Exactly two arguments required: \"python variable_grabbler.py \"") + sys.exit(1) + +print "Reading config file...", +config_file = open(sys.argv[2],"r") +config_values = json.loads(config_file.read().decode("utf-8")) +config_file.close() +print "Done." + + +print "Reading file: "+sys.argv[1]+"..." +file_in = open(sys.argv[1], "r") +file_content = file_in.read() +file_in.close() + +print "Replacing variables:" +for variable in config_values: + print "> "+variable.upper()+" => ", + + if config_values[variable][0] == "file": + print "Found array. Adding file instead: " + config_values[variable][1] + file_replacement = open(config_values[variable][1], "r") + file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", file_replacement.read()).encode('utf-8') + file_replacement.close() + elif config_values[variable][0] == "exec": + print "Found array. Executing command instead: " + config_values[variable][1] + if variable.upper() in file_content: + process = subprocess.Popen(config_values[variable][1], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + if process.returncode == 0: + print "Process exited normally. Replacing variable with the output from STDOUT..." + print_err("Subprocess exited normally.\nThe following error messages were produced:") + print_err(stderr) + file_content = file_content.decode('utf-8').replace("%" + variable.upper() + "%", stdout).encode('utf-8') + else: + print "Process exited abnormally. Exiting. No changes will be made." + print_err("Subprocess exited abnormally. Exiting.\nThe following output was produced:") + print_err(stdout) + print_err("The following error messages were produced:") + print_err(stderr) + print "Exiting now." + sys.exit(2) + else: + print variable.upper(), + print "was not found in the file. Skipping command execution." + else: + replacement = str(config_values[variable]) + # look for variable sections that contain question marks + argument_positions = [] + i = 0 + while i