module Obfus

Constants

CONFIG_LOCATIONS
OPTIONS
VERSION

Public Class Methods

apply_config(options) click to toggle source
# File lib/obfus/main.rb, line 54
def apply_config(options)
  file = find_config
  opts = OpenStruct.new OPTIONS
  config = nil
  unless file.nil?
    config = parse_config(file)
    if options.preset.nil?
      if config['default'].nil?
        # use native defaults
      else
        # use config file
        opts = OpenStruct.new config['default']
        opts.preset = 'default'
      end
    else
      # use preset
      opts = OpenStruct.new config[options.preset]
    end
  end

  # override
  options.each_pair do |k, v|
    opts[k] = v
  end

  opts['keep'] = true if opts['keep'].nil?

  opts['config'] = file

  opts
end
compress(files, options) click to toggle source
# File lib/obfus/main.rb, line 91
def compress(files, options)
  archive_name = 'Archive'
  if files.count < 1
    puts 'error: no files specified'
    puts 'try `obfus --help`'
    exit 1
  elsif files.count == 1
    # call it the name of the file
    archive_name = File.basename files[0], '.*'
  end

  unless options.output.nil?
    archive_name = options.output.strip
    archive_name.gsub!(/^.*(\\|\/)/, '')
  end

  unless options.force
    if ensure_file(archive_name)
      # file already exists
      puts "error: file #{archive_name} already exists"
      puts 'to overwrite the file use `--force`'
      exit 1
    end
  end

  files.each do |file|
    next if ensure_file(file)
    # TODO: file <file> does not exist!
    puts "error: #{file} does not exist"
    exit 1
  end

  if options.recipients.count < 1
    # TODO: throw error! no recipients specified
    puts 'error: no recipients specified'
    puts 'try `obfus --help`'
    exit 1
  end

  if options.verbosity == :verbose
    unless options.verbosity == :quiet
      puts 'using config file: ' + options.config
      puts 'using preset: ' + options.preset
      puts 'keeping original files: ' + options.keep.to_s
      puts 'compression quality: ' + options.level.to_s
      puts 'compressing:'
      files.each { |f| puts '- ' + f }
      puts
      puts 'recipients:'
      options.recipients.each { |r| puts '- ' + r }
      puts
    end
  end

  File.open archive_name, 'w' do |f|
    # add recipients `-r <recipient>`
    recipients = []

    options.recipients.each do |r|
      recipients << '-r'
      recipients << r
    end

    Open3.pipeline_r(
      ['tar', 'cf', '-', *files],
      ['brotli', '-cq', options.level.to_s],
      ['gpg', '-eq', *recipients]
    ) do |o, _ts|
      # ts.each { |t| puts t.pid, t.status }
      f.write o.read
    end
  end
end
decompress(file) click to toggle source
# File lib/obfus/main.rb, line 165
def decompress(file)
  # TODO: iterate over files
  unless ensure_file(file)
    puts "error: file #{file} does not exist"
    exit 1
  end

  Open3.pipeline_r(
    ['gpg', '-dq', file],
    ['brotli', '-dc'],
    ['tar', '-x']
  ) do |o, ts|
    # ts.each { |t| puts t.pid, t.status }
  end
end
ensure_file(name) click to toggle source
# File lib/obfus/main.rb, line 86
def ensure_file(name)
  path = File.expand_path name
  File.exist? path
end
exec(args) click to toggle source
# File lib/obfus/main.rb, line 181
def exec(args)
  options = OpenStruct.new

  opt_parser = OptionParser.new do |opts|
    opts.banner = "\nUsage: obfus [options] <file...>"
    opts.separator ''
    opts.separator 'Operation Modes:'
    opts.on('-z', '--compress', 'Compress operation mode (default)') do
      options.mode = :compress
    end
    opts.on('-d', '--decompress', 'Decompress operation mode') do
      options.mode = :decompress
    end

    opts.separator ''
    opts.separator 'Options:'
    opts.on('-o', '--output NAME', 'Specify the output file name') do |name|
      options.output = name
    end
    opts.on('-f', '--force', 'Overwrites output file if conflicts with an existing one') do |v|
      options.force = v
    end
    opts.on('-p', '--preset NAME', 'Use a configuration preset') do |name|
      options.preset = name
    end
    opts.on('-l', '--level [0..9]', Integer, 'Specify compression level (defaults to 9)') do |v|
      options.level = v
    end
    opts.on('-k', '--[no-]keep', 'Keep the original files') do |keep|
      options.keep = keep
    end
    opts.on('-r', '--recipients x,y,z', Array, 'Add recipients list') do |list|
      options.recipients = [] if options.recipient.nil?
      options.recipients += list
    end

    opts.on('-v', '--verbose', 'Run verbosely') do
      options.verbosity = :verbose
    end
    opts.on('-q', '--quiet', 'Suppress any output') do
      options.verbosity = :quiet
    end

    opts.separator ''
    opts.separator 'Other options:'
    opts.on_tail('--version', 'Show the version number') do
      puts Obfus::VERSION
      exit
    end

    opts.on_tail('-h', '--help', 'Show this message') do
      puts opts
      exit
    end
  end

  opt_parser.parse!(args)

  options = apply_config(options)

  if options.mode == :decompress
    # decompress archive
    decompress(ARGV[0])
  else
    # compress
    compress(ARGV, options)
  end

  # puts options
  # puts ARGV
end
find_config() click to toggle source
# File lib/obfus/main.rb, line 24
def find_config
  list = []
  CONFIG_LOCATIONS.each do |pattern|
    list += Dir.glob pattern
  end

  if list.count < 1
    # no config file detected
    nil
  elsif list.count > 1
    # TODO: print warning (multiple config files: <list...>, reading from <path>)
    puts 'error: encountered multiple configuration files:'
    list.each do |l|
      puts File.expand_path l
    end
    puts "reading from: #{File.expand_path list[0]}"
    nil
  else
    list[0]
  end
end
parse_config(file) click to toggle source
# File lib/obfus/main.rb, line 46
def parse_config(file)
  parsed = nil
  File.open(file, 'r') do |f|
    parsed = YAML.safe_load f.read
  end
  parsed
end