lib/genZPK.rb in genZPK-0.1.11 vs lib/genZPK.rb in genZPK-0.1.13

- old
+ new

@@ -2,66 +2,96 @@ require 'genZPK/templates' require 'tempfile' require 'nokogiri' require 'highline/import' + +# Defines a not_nil? method for all objects +# @return [Boolean] the truth value associated with the nil state class Object def not_nil? !nil? end end + module GenZPK + # Returns the path to the zdpack executable if it can find it, or nil otherwise. + # @return [String] The path to zdpack or nil if unable to find it def getZdpack if File.exists? '/usr/local/zend/bin/zdpack' '/usr/local/zend/bin/zdpack' else nil end end + # Returns the path to the given executable if it can find it, or nil otherwise. + # @return [String] The path to the executable or nil if unable to find it def executablePath (executable=String.new) + # Assume the string is a path if it has a '/' in it if executable.include? '/' if File.exists? executable executable else nil end else + # Assume the executable is in the PATH if a full path is not passed whichOut = `which #{executable}`.chomp! + + # Check to see if the output matches the error signifying that a path wasn't found. if whichOut =~ /\/usr\/bin\/which: no (.*) in \(.*\)/ nil else + # It found it! Woo hoo! if File.exists? whichOut whichOut else nil end end end end + # Get the path to the system text editor specified in the EDITOR env. variable. + # If not defined, default to nano and then vi. + # @return [String] The path to the executable def getEditor + # Check if EDITOR is not defined if ENV['EDITOR'].nil? + # It's not start nano and return the path to it. + # If you can't find it, try vi. ['nano', 'vi'].each do |x| editor = executablePath x + if not editor.nil? return editor end end + + # Couldn't find vi or nano. Raise an exception for the user to deal with. raise "Valid text editor could not be found. Please specify one in the EDITOR environment variable and/or check your PATH." + # It is, so lets use it. else + # Get the path to the specified editor editor = executablePath ENV['EDITOR'] + + # If the path was found, return it. if not editor.nil? editor else + # It wasn't found so cycle through nano and vi like above ['nano', 'vi'].each do |x| editor = executablePath x + if not editor.nil? return editor end end + + # Still couldn't find an editor. Raise an exception. raise "Valid text editor could not be found. Please specify one in the EDITOR environment variable and/or check your PATH." end end end @@ -74,66 +104,106 @@ a = d if a.length == 0 end a == 'y' end + # Requires that some condition be true or otherwise display the given message and exit. + # @param [Boolean] condition the truth value of the condition + # @param [String] the message to display on failure of the condition + # @example Require a condition + # requireCondition File.exists?("foo.bar"), "The file \"foo.bar\" doesn't exist. Exiting.... def requireCondition(condition, message) if not condition puts message exit -1 end end + # Configures genZPK checks, definitions, and subdomain checks bia a user config file. + # If the necessary files and paths do not exist, doConfigure will create them. + # If the config files do exist, then a their contents will be loaded to a temporary file + # for the user to edit. All configurations will be schema checked and the user must correct any + # issues for the changes to be saved. def doConfigure + # Check if the .genZPK folder exists in the user's home directory and create it if it doesn't. if not File.exists?(File.expand_path '~/.genZPK') FileUtils.mkpath(File.expand_path '~/.genZPK') end + # Check if the .genZPK/checks.xml file exists and create it if it doesn't. if not File.exists?(File.expand_path '~/.genZPK/checks.xml') File.new(File.expand_path('~/.genZPK/checks.xml'), 'w') end + # Open the checks file for reading checksFile = File.open(File.expand_path('~/.genZPK/checks.xml'), 'r') + + # Open a new temporary file. By default, it is writable. tmpChecksFile = Tempfile.new 'checks' + + # Read the contents of the existing check file and write them to the temporary file. while buff = checksFile.read(4096) tmpChecksFile.write(buff) end + + # Rewind the temporary file to the begining and close the existing file. tmpChecksFile.rewind checksFile.close + # Get the system editor and allow the user to modify the temporary checksa file. editor = getEditor system("#{editor} #{tmpChecksFile.path}") + # This block rescues the method in case the user enters bad XML begin + # Read in the file and rewind it. content = tmpChecksFile.read tmpChecksFile.rewind + + # Parse the content with Nokogiri. A Nokogiri::XML::SyntaxError exception is raised in the event + # of invalid XML syntax. doc = Nokogiri::XML(content) { |config| config.options = Nokogiri::XML::ParseOptions::STRICT } rescue Nokogiri::XML::SyntaxError => e + # If the user wants to try to correct the file if yesno("Invalid XML entered. Would you like to reopen the file?") + # Loop until they fix it loop do + # Allow them to edit the file system("#{editor} #{tmpChecksFile.path}") + begin + # read in the content of the file and rewind content = tmpChecksFile.read tmpChecksFile.rewind + + # Check the xml syntax doc = Nokogiri::XML(content) { |config| config.options = Nokogiri::XML::ParseOptions::STRICT } + + # If it got here, the syntax was good and exit the oop break rescue + # If the user doesn't want to try again, exit without saving the changes if not yesno("Invalid XML entered. Would you like to reopen the file?") exit -1 end end end else + # The user didn't want to fix the file. Exit. exit -1 end end + + # Reopen the checks config file for writing checksFile = File.open(File.expand_path('~/.genZPK/checks.xml'), 'w+') + # write the contents of the temporary file to the checks file while buff = tmpChecksFile.read(4096) checksFile.write(buff) end + # Close all files and delete the temporary file. checksFile.close tmpChecksFile.close tmpChecksFile.unlink end end \ No newline at end of file