class DatalackeyProcess

Attributes

executable[R]
exit_code[R]
stderr[R]
stdin[R]
stdout[R]

Public Class Methods

locate_executable(exe_name, dirs_outside_path = []) click to toggle source
# File lib/datalackeylib.rb, line 72
def DatalackeyProcess.locate_executable(exe_name, dirs_outside_path = [])
  # Absolute file name or found in current working directory.
  return exe_name if File.exist?(exe_name) && File.executable?(exe_name)
  dirs = []
  dirs_outside_path = [ dirs_outside_path ] unless dirs_outside_path.is_a? Array
  dirs.concat dirs_outside_path
  dirs.concat ENV['PATH'].split(File::PATH_SEPARATOR)
  dirs.each do |d|
    exe = File.join(d, exe_name)
    return exe if File.exist?(exe) && File.executable?(exe)
  end
  nil
end
new(exe, directory, permissions, memory) click to toggle source
# File lib/datalackeylib.rb, line 12
def initialize(exe, directory, permissions, memory)
  @exit_code = 0
  if exe.nil?
    exe = DatalackeyProcess.locate_executable(
      'datalackey', [ '/usr/local/libexec', '/usr/libexec' ])
    raise ArgumentError, 'datalackey not found' if exe.nil?
  elsif !File.exist?(exe) || !File.executable?(exe)
    raise ArgumentError, "Executable not found or not executable: #{exe}"
  end
  @executable = exe
  args = [ exe,
      '--command-in', 'stdin', 'JSON', '--command-out', 'stdout', 'JSON' ]
  args.push('--memory') unless memory.nil?
  args.concat([ '--directory', directory ]) unless directory.nil?
  args.concat([ '--permissions', permissions ]) unless permissions.nil?
  @stdin, @stdout, @stderr, @wait_thread = Open3.popen3(*args)
end
options_for_OptionParser(parser, separator, exe_callable, mem_callable, dir_callable, perm_callable, echo_callable) click to toggle source
# File lib/datalackeylib.rb, line 37
def DatalackeyProcess.options_for_OptionParser(parser, separator,
    exe_callable, mem_callable, dir_callable, perm_callable, echo_callable)
  unless separator.nil?
    unless separator.is_a? String
      separator = 'Options for case where this process runs datalackey:'
    end
    parser.separator separator
  end
  unless exe_callable.nil?
    parser.on('-l', '--lackey PROGRAM', 'Use specified datalackey executable.') do |e|
      exe_callable.call(e)
    end
  end
  unless mem_callable.nil?
    parser.on('-m', '--memory', 'Store data in memory.') do
      mem_callable.call(true)
    end
  end
  unless dir_callable.nil?
    parser.on('-d', '--directory [DIR]', 'Store data under (working) directory.') do |d|
      dir_callable.call(d || Dir.pwd)
    end
  end
  unless perm_callable.nil?
    parser.on('-p', '--permissions MODE', %i[user group other], 'File permissions cover (user, group, other).') do |p|
      perm_callable.call({ user: '600', group: '660', other: '666' }[p])
    end
  end
  unless echo_callable.nil?
    parser.on('--echo', 'Echo communication with datalackey.') do
      echo_callable.call(true)
    end
  end
end
verify_directory_permissions_memory( directory, permissions, memory) click to toggle source
# File lib/datalackeylib.rb, line 86
def DatalackeyProcess.verify_directory_permissions_memory(
    directory, permissions, memory)
  if !memory.nil? && !(directory.nil? && permissions.nil?)
    raise ArgumentError, 'Cannot use both memory and directory/permissions.'
  end
  if memory.nil?
    if directory.nil?
      directory = Dir.pwd
    elsif !Dir.exist? directory
      raise ArgumentError, "Given directory does not exist: #{directory}"
    end
    if permissions.nil?
      if (File.umask & 0o77).zero?
        permissions = '666'
      elsif (File.umask & 0o70).zero?
        permissions = '660'
      else
        permissions = '600'
      end
    elsif permissions != '600' && permissions != '660' && permissions != '666'
      raise ArgumentError, 'Permissions not in {600, 660, 666}.'
    end
  end
  [ directory, permissions, memory ]
end

Public Instance Methods

finish() click to toggle source
# File lib/datalackeylib.rb, line 30
def finish
  @stdin.close
  @wait_thread.join
  @exit_code = @wait_thread.value.exitstatus
end