/usr/bin/cassie is in ruby-cassiopee 0.1.12-1build1.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139  | #!/usr/bin/ruby
require 'cassiopee'
require 'optparse'
require 'logger'
 
options = {}
 
optparse = OptionParser.new do|opts|
   # Set a banner, displayed at the top
   # of the help screen.
   opts.banner = "Usage: cassie.rb [options]"
 
   options[:verbose] = false
   opts.on( '-v', '--verbose', 'Output more information' ) do
     options[:verbose] = true
   end
   options[:filter] = nil
   opts.on( '-f', '--filter FILTER', 'Filter matches between min and max positions ex. 100-150' ) do |filter|
	options[:filter] = filter
   end
   options[:file] = nil
   opts.on( '-i', '--index FILE', 'File to index' ) do |file|
        options[:file] = file 
   end
   options[:fpattern] = nil
   opts.on( '--fpattern FILE', 'File with pattern' ) do |file|
        options[:fpattern] = file
   end
   options[:pattern] = nil
   opts.on( '-p', '--pattern PATTERN', 'Search pattern' ) do |file|
        options[:pattern] = file
   end
   options[:store] = nil
   opts.on( '-s', '--store FILE', 'Store index to file' ) do |file|
        options[:store] = file
   end
   options[:name] = nil
   opts.on( '-n', '--name NAME', 'name of index, default [crawler]' ) do |name|
        options[:name] = name
   end
   options[:exact] = false
   opts.on( '-x', '--exact', 'Do exact search (default)' ) do
        options[:exact] = true
   end
   options[:error] = 0
   opts.on( '-m', '--hamming ERROR', 'Maximum number of error to search with Hamming distance' ) do |error|
        options[:error] = error
   end
   opts.on( '-e', '--edit ERROR', 'Maximum number of error to search with edit(levenshtein) distance' ) do |error|
        options[:error] = error * (-1)
   end
   opts.on( '-h', '--help', 'Display this screen' ) do
     puts opts
     exit
   end
end
  optparse.parse!
  if(options[:file]==nil)
    puts "Error, input file is missing, use -h option for usage"
    exit
  elif(options[:verbose])
    puts "Input sequence: " << options[:file].to_s 
  end
  if(options[:fpattern]==nil && options[:pattern]==nil)
    puts "Error, pattern is missing, use -h option for usage"
    exit
  end
 if(options[:error]==0)
   options[:exact] = true
 end
crawler = Cassiopee::Crawler.new
crawler.setLogLevel(Logger::INFO)
if(options[:store])
crawler.use_store = true
end
if(options[:name]!=nil)
crawler.file_suffix = options[:name]
end
if(options[:filter]!=nil)
positions = options[:filter].split('-')
crawler.filter_position(positions[0],positions[1])
end
# String to index
crawler.indexFile(options[:file])
matches = nil
if(options[:fpattern]==nil)
	pattern = options[:pattern]
else
	pattern = ''
	file = File.new(options[:fpattern], "r")
        while (line = file.gets)
        	input = line.downcase.chomp
		pattern << input
        end
	file.close
	if(pattern.length==0)
		puts "Error pattern file is empty"
		exit 
        end
end
  if(options[:verbose])
    puts "Search pattern " << pattern
  end
if(options[:exact])
        puts "Search exact" unless !options[:verbose]
	matches = crawler.searchExact(pattern)
else
        puts "Search approximate" unless !options[:verbose]
	matches = crawler.searchApproximate(pattern,options[:errors])
end
# Go through matches
while((match = crawler.next())!=nil)
  puts "Match: " << match.inspect
end
 |