bin/genZPK in genZPK-0.1.11 vs bin/genZPK in genZPK-0.1.13

- old
+ new

@@ -4,18 +4,20 @@ require 'erb' require 'genZPK' require 'xmlsimple' include GenZPK - +# Initialize the hash to store the various command line options options = {} opt_parser = OptionParser.new do |opt| opt.banner = "Usage: genZPK -s SYSTEM -v ZPK_VERSION -n PACKAGE_NAME DIR" opt.separator "Initial configuration: genZPK --configure " opt.separator "" + + opt.on("-s","--system SYSTEM","which system should checks be performed for") do |system| options[:system] = system end opt.on("-v","--app-version ZPK_VERSION","version of zpk to create") do |version| @@ -44,74 +46,94 @@ opt.on("-h","--help","help") do puts opt_parser end end - +# Parse options begin opt_parser.parse! rescue OptionParser::InvalidOption + # The user goofed. Send themt ot he documentation. warn "Required parameters not set or invalid argument. Please run genZPK --help for more info." exit -1 end +# Read in the working directory for the PHP code to be packaged appending a '/' if missing dir = String(ARGV[0]).end_with?('/') ? String(ARGV[0]) : String(ARGV[0]) + "/" + +# Ensure all the required conditions to run are true requireCondition File.exists?(File.expand_path '~/.genZPK/checks.xml'), "Unable to locate configuration files. Please run genZPK --configure" requireCondition (File.read(File.expand_path('~/.genZPK/checks.xml')).gsub(/\s+/, "") != ""), "Configuration empty. Please run genZPK --configure" requireCondition getZdpack.not_nil?, "unable to locate zdpack executable. Please check zend server installation at /usr/local/zend/" requireCondition dir.not_nil?,"Required parameters not set or invalid argument. Please run genZPK --help for more info." requireCondition options[:system].not_nil?,"Required parameters not set or invalid argument. Please run genZPK --help for more info." requireCondition options[:version].not_nil?,"Required parameters not set or invalid argument. Please run genZPK --help for more info." requireCondition options[:name].not_nil?,"Required parameters not set or invalid argument. Please run genZPK --help for more info." requireCondition File.exists?(dir), "Error: Directory \"#{dir}\" does not exist." +# Read in the checks.xml file in using xml-simple. KeyAttr specifies that instead of using a zero-based array to +# store sub-nodes, they should be loaded into a hash where the 'name' field is the key. Setting ForceArray to false +# removes all arrays unless there are multiple nodes of the same name that KeyAttr doesn't apply to., configHash = XmlSimple.xml_in(File.expand_path( '~/.genZPK/checks.xml'), {'KeyAttr' => 'name', 'ForceArray'=>false}) - +# If the user specified to pull down new sorcce from git, change the directory and do. Exit on failure. if options[:pull] == true Dir.chdir dir do requireCondition system("git pull origin master"), "Unable to update code via git. Exiting..." end end +# If the name key ixists in the hash, that means there is only a single +# entry in it so the name of the system doesn't need to be specified. if configHash["system"].has_key? "name" + # Ensure that the system specified on the command line matches the system in the config file. Exit otherwise. if not configHash["system"]["name"] == options[:system] warn "Could not find system \"#{options[:system]}\" in configuration. Please run genZPK --configure to setup checks for this system or verify the system name." exit -1 end + # If configHash["system"]["checks"]["check"] isn't an array, there is only one check and an array consisting + # of that checvk should be loaded into checks if configHash["system"]["checks"]["check"].is_a? Array checks = configHash["system"]["checks"]["check"] else checks = Array.new checks.push configHash["system"]["checks"]["check"] end + + # Check is any subdomains are setup if configHash["system"].has_key? "subdomains" + + # Same logic as above. Ensure than subdomainChecks is always an array. if configHash["system"]["subdomains"]["file"].is_a? Array subdomainChecks = configHash["system"]["subdomains"]["file"] else subdomainChecks = Array.new subdomainChecks.push configHash["system"]["subdomains"]["file"] end else + # If there aren't any defined, set it to nil. subdomainChecks = nil end -else +else # There are multiple systems configured + # Check to make sure system exists, exit otherwise. if not configHash["system"].has_key? options[:system] warn "Could not find system \"#{options[:system]}\" in configuration. Please run genZPK --configure to setup checks for this system or verify the system name." exit -1 end + # Ensure checks is an array if there is only a single check. if configHash["system"][options[:system]]["checks"]["check"].is_a? Array checks = configHash["system"][options[:system]]["checks"]["check"] else checks = Array.new checks.push configHash["system"][options[:system]]["checks"]["check"] end + # If there are subdomain checks defined, make sure they are saved as an array, otherwise nil. if configHash["system"][options[:system]].has_key? "subdomains" if configHash["system"][options[:system]]["subdomains"]["file"].is_a? Array subdomainChecks = configHash["system"][options[:system]]["subdomains"]["file"] else subdomainChecks = Array.new @@ -125,66 +147,80 @@ puts "Running checks" puts "-" * 80 successes = 0 +# For every check for i in 0..(checks.size - 1) check = checks[i] desc = check["desc"] filepath = check["file"] matchval = check["value"] + + # Make sure regular expression is valid, exit otherwise. begin regex = /#{check["regex"]["content"]}/ rescue RegexpError => e puts "Invalid regular in configuration. Please run genZPK --configure\n#{e.message}" exit -1 end - + # match groups should be 1 indexed in the config file. Correct that here. matchgrp = Integer(check["regex"]["group"]) - 1 display = desc + # Display an error if the file cannot be found and proceed to the next check if not File.exists?(dir + filepath) display << "." * (80 - "FAIL".size - desc.size) display << "FAIL\n" display << "\tFile not found: #{dir + filepath}" puts display puts "-" * 80 next end + # Read in the contents of the file to check and scan it with the given regexp contents = File.read(dir + filepath) matches = contents.scan(regex) + results = "" passes = 0 + + # For every match for i in 0..(matches.size - 1) match = matches[i] + #Ensure the match is the right value and increment the number of passed matches if not match[matchgrp] == matchval results << "\t#{dir + filepath}\n" results << "\tValue found: #{match[matchgrp]}\n" results << "\tRequired value: #{matchval}\n\n" else passes += 1 end end + # If ever match passed if passes == matches.size + # Display a success display << "." * (80 - "SUCCESS".size - desc.size) display << "SUCCESS" puts display + + # and increment the number of successfl checks successes += 1 - else + else # otherwise display that it failed and proceed to the next check display << "." * (80 - "FAIL".size - desc.size) display << "FAIL" puts display puts results.chomp end puts "-" * 80 end +# If no all the checks passed, exit the program. if not successes == checks.size puts "#{successes} of #{checks.size} checks passed. Please check files listed above and try again." exit -1 end @@ -195,133 +231,170 @@ puts "Verifying subdomains" puts "-" * 80 successes = 0 -for i in 0..(subdomainChecks.size - 1) +if not subdomainChecks.nil? +# For every subdomain to check + for i in 0..(subdomainChecks.size - 1) - check = subdomainChecks[i] - path = check["path"] + check = subdomainChecks[i] + path = check["path"] - display = dir + path + display = dir + path - if File.exists?(dir + path) - contents = File.read(dir + path) - fieldPasses = 0 + # Ensure the file exists + if File.exists?(dir + path) + # read in its contents + contents = File.read(dir + path) + fieldPasses = 0 - check.each do |field, value| - if field != "path" - if not configHash["definitions"]["definition"][field].nil? - begin - regex = /#{configHash["definitions"]["definition"][field]["regex"]["content"]}/ - rescue RegexpError => e - puts "Invalid regular in configuration. Please run genZPK --configure\n#{e.message}" - exit -1 - end + # For each field-value pair in this file + check.each do |field, value| + # make sure it isn't the file path + if field != "path" + # If the field is defined + if not configHash["definitions"]["definition"][field].nil? + # Make sure the regular expession is valid, otherwise exit. + begin + regex = /#{configHash["definitions"]["definition"][field]["regex"]["content"]}/ + rescue RegexpError => e + puts "Invalid regular in configuration. Please run genZPK --configure\n#{e.message}" + exit -1 + end - matchgrp = Integer(configHash["definitions"]["definition"][field]["regex"]["group"]) - 1 - matches = contents.scan(regex) + # Offset the match group to be zero-indexed + matchgrp = Integer(configHash["definitions"]["definition"][field]["regex"]["group"]) - 1 - if matches == [] - if display.end_with? "\n" - display << "\tField not found in file: #{field}\n" - else - display << "\n\tField not found in file: #{field}\n" - end - else - if matches[0][matchgrp] == value - fieldPasses += 1 - else + # scan the file for a match + matches = contents.scan(regex) + + # If there are no matches, let the user know and continue to the next field + if matches == [] if display.end_with? "\n" - display << "\tField Failed: #{field}\n" - display << "\t\tValue: #{matches[0][0]}\n" - display << "\t\tDefined value: #{value}\n" + display << "\tField not found in file: #{field}\n" else - display << "\n\tField Failed: #{field}\n" - display << "\t\tValue: #{matches[0][0]}\n" - display << "\t\tDefined value: #{value}\n" + display << "\n\tField not found in file: #{field}\n" end + else # There were matches + # Ensure the value is correct and if it isn't display an error and continue to the next field + if matches[0][matchgrp] == value + fieldPasses += 1 + else + if display.end_with? "\n" + display << "\tField Failed: #{field}\n" + display << "\t\tValue: #{matches[0][0]}\n" + display << "\t\tDefined value: #{value}\n" + else + display << "\n\tField Failed: #{field}\n" + display << "\t\tValue: #{matches[0][0]}\n" + display << "\t\tDefined value: #{value}\n" + end + end end + else # the field isn't defined. + # Let the user know and continue to the next field + if display.end_with? "\n" + display << "\tField not defined: #{field}\n" + else + display << "\n\tField not defined: #{field}\n" + end end - else - if display.end_with? "\n" - display << "\tField not defined: #{field}\n" - else - display << "\n\tField not defined: #{field}\n" - end end end - end - - if fieldPasses == (check.size - 1) - display << "." * (80 - "SUCCESS".size - display.size) - display << "SUCCESS" + # Check if all the fields passed and display a success. The number of passes should be one less + # than all the fields since we excluded path. + if fieldPasses == (check.size - 1) + display << "." * (80 - "SUCCESS".size - display.size) + display << "SUCCESS" + puts display + puts "-" * 80 + successes += 1 + else # one or more fields failed. Let the user know + tmpString = "#{fieldPasses} of #{check.size - 1} fields verified" + display << tmpString + display << "." * (80 - "#{fieldPasses} of #{check.size - 1} fields verified".size - "FAIL".size) + display << "FAIL" + puts display + puts "-" * 80 + end + else # the specified subdomain file couldn't be found. Display an error + display << "." * (80 - "FAIL".size - display.size) + display << "FAIL\n" + display << "\tFile not found: #{dir + path}" puts display puts "-" * 80 - successes += 1 - else - tmpString = "#{fieldPasses} of #{check.size - 1} fields verified" - display << tmpString - display << "." * (80 - "#{fieldPasses} of #{check.size - 1} fields verified".size - "FAIL".size) - display << "FAIL" - puts display - puts "-" * 80 end - else - display << "." * (80 - "FAIL".size - display.size) - display << "FAIL\n" - display << "\tFile not found: #{dir + path}" - puts display - puts "-" * 80 end end +#Check to see if all the subdomains passed. If they didn't, exit. if not successes == subdomainChecks.size puts "#{successes} of #{subdomainChecks.size} subdomains passed. Please check files listed above and try again." exit -1 end puts "All subdomains passed. Continuing...\n" - +# Ensure the /scripts directory exists in the working directory if not File.exists? dir + "/scripts" FileUtils.mkpath dir + "/scripts" end +# get the templates for the deployment configuration and pre-activation script scriptTemplate = getTemplate 'pre_activate.php' deploymentTemplate = getTemplate 'deployment.xml' +# These are used to populate the tamplates releaseName = options[:name] zpkVersion = options[:version] +# Generate the files script = ERB.new(scriptTemplate) deployment = ERB.new(deploymentTemplate) +# Write out the files File.open(dir + '/scripts/pre_activate.php', 'w') {|f| f.puts(script.result(binding))} File.open(dir + '/deployment.xml', 'w') {|f| f.puts(deployment.result(binding))} + zpkFile = "#{options[:name]}.zpk" +# Continue to increment the zpk suffix until an unused filename is found. while File.exists? zpkFile + # Pull the base filename and suffix from the filename. matches = /(.*\.zpk)\.?(.*)?/.match(zpkFile) + # if no match found for the suffix, start at zero if matches[2]=="" ver = 0 else ver = Integer(matches[2]) end + # increment the suffix by 1 zpkFile = "#{matches[1]}.#{ver + 1}" end +# Make a temporary directory to work in Dir.mktmpdir do |tempDir| + # get the zdpack executable zdpack = getZdpack + + # temporarily remove the git repo from the working directory to prevent packaging it. system("mv #{dir}/.git #{tempDir}/") + + # package the zpk and output it to the temp directory system("#{zdpack} pack --output-dir=#{tempDir} #{dir}") + + # Move the git repository back and place the zpk in the current directory system("mv #{tempDir}/.git #{dir}/") system("mv #{tempDir}/#{options[:name]}.zpk ./#{zpkFile}") + + # remove the generated files from the working directory system("rm -r #{dir + '/scripts'}") system("rm #{dir + '/deployment.xml'}") end +# Let the user know that nothing screwed up and it worked puts "Successfully created ZPK at ./#{zpkFile}" \ No newline at end of file