Sha256: dc94b4656b33b92879e90cced0d728825c34019c8894de575abee3f7853a02ba

Contents?: true

Size: 1.93 KB

Versions: 6

Compression:

Stored size: 1.93 KB

Contents

# frozen_string_literal: true

require_relative 'identification_tool'

module Libis
  module Format
    module Tool
      class FileTool < Libis::Format::Tool::IdentificationTool
        def run_list(filelist, **_options)
          create_list_file(filelist) do |list_file|
            output = runner(nil, '--files-from', list_file)

            process_output(output)
          end
        end

        def run_dir(dir, recursive = true, **_options)
          filelist = find_files(dir, recursive)

          create_list_file(filelist) do |list_file|
            output = runner(nil, '--files-from', list_file)

            process_output(output)
          end
        end

        def run(file, **_options)
          output = runner(file)

          process_output(output)
        end

        protected

        def runner(filename, *args)
          # Create new argument list
          opts = []

          # Add fixed options
          # -L : follow symlinks
          # --mime-type : only print MIME type
          opts << '-L' << '--mime-type'

          # Append passed arguments
          opts += args

          # Finally add the filename to process
          opts << filename.escape_for_string if filename

          # Run the UNIX file command and capture the results
          timeout = Libis::Format::Config[:timeouts][:file_tool]
          result = ::Libis::Tools::Command.run(
            'file', *opts,
            timeout:,
            kill_after: timeout * 2
          )

          raise "#{self.class} took too long (> #{timeout} seconds) to complete" if result[:timeout]
          raise "#{self.class} errors: #{result[:err].join("\n")}" unless (result[:status]).zero? && result[:err].empty?

          # Parse output text into array and return result
          result[:out].map do |line|
            r = line.split(/:\s+/)
            { filepath: r[0], mimetype: r[1], matchtype: 'magic', tool: :file }
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
libis-format-1.3.4 lib/libis/format/tool/file_tool.rb
libis-format-1.3.3 lib/libis/format/tool/file_tool.rb
libis-format-1.3.2 lib/libis/format/tool/file_tool.rb
libis-format-1.3.0 lib/libis/format/tool/file_tool.rb
libis-format-1.2.9 lib/libis/format/tool/file_tool.rb
libis-format-1.2.8 lib/libis/format/tool/file_tool.rb