hets.rb revision b5bf21df9d1d61069e6dc9e13569543d0b868bc8
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning muellermodule Hets
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller class HetsError < Exception; end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller class Config
2b056a2f5c950d0b5aec8f3f08d1050c408d73a2henning mueller attr_reader :path
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller def initialize
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller yaml = YAML.load_file(File.join(Rails.root, 'config', 'hets.yml'))
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller @path = first_which_exists yaml['hets_path']
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
e062724b7bdbbe8c1ddfbc7f3bb5bdb6e129d82cDaniel Vale raise HetsError, 'Could not find hets' unless @path
e062724b7bdbbe8c1ddfbc7f3bb5bdb6e129d82cDaniel Vale
e062724b7bdbbe8c1ddfbc7f3bb5bdb6e129d82cDaniel Vale version = `#{@path} -V`
e062724b7bdbbe8c1ddfbc7f3bb5bdb6e129d82cDaniel Vale raise ArgumentError, "Your version of hets is too old" if version.include?("2011")
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller yaml.each_pair do |key, value|
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller ENV[key.upcase] = first_which_exists value if key != 'hets_path'
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller private
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller def first_which_exists(array)
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller array.each do |path|
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller path = File.expand_path path
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller return path if File.exists? path
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller nil
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller # Runs hets with input_file and returns XML output file path.
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller def self.parse(input_file, output_path = '')
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller config = Config.new
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller output_path = "-O \"#{output_path}\"" unless output_path.blank?
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller
1cc8cf027c7907544308ffefc3e8071292c907f7henning mueller command = "#{config.path} -o xml --full-signatures -v2 #{output_path} '#{input_file}' 2>&1"
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller Rails.logger.debug command
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale # Executes command with low priority
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale output = `nice #{command}`
705933deb08bc4269e8c08d50143af3cb5c1c670henning mueller
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale # Exclude usage message if exit status equals 2
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale if $?.exitstatus == 2 and output.include? 'Usage:'
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale output = output.split("Usage:").first
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
7ea9649883e1bbe8f2582db1a3c66af8b7206056henning mueller
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale output = output.split("\n").last
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale Rails.logger.debug output
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale # Raise error if exit status different from 0
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale if $?.exitstatus != 0 or output.starts_with? '*** Error'
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale raise HetsError.new(output)
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale end
b5bf21df9d1d61069e6dc9e13569543d0b868bc8Daniel Couto Vale return output.split(': ').last
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning mueller end
58721b9d3a8cd6a624269ddf507f80af4417c9bdhenning muellerend