Module: Metasploit::Model::Search::With

Extended by:
ActiveSupport::Concern
Included in:
Metasploit::Model::Search, Attribute
Defined in:
lib/metasploit/model/search/with.rb

Overview

Generalizes operators from attributes to anything directly registered as an operator on a class.

Declaring operator classes

Interface

Operators do not need to subclass any specific superclass, but they are expected to define certain methods.

<span class='rubyid_class class kw'>class</span> <span class='rubyid_MyOperator constant id'>MyOperator</span>
  <span class='comment val'>#</span>
  <span class='comment val'># Instance Methods</span>
  <span class='comment val'>#</span>

  <span class='comment val'># @param klass [Class] The klass on which `search_with` was called.</span>
  <span class='rubyid_def def kw'>def</span> <span class='rubyid_initialize identifier id'>initialize</span><span class='lparen token'>(</span><span class='rubyid_attributes identifier id'>attributes</span><span class='assign token'>=</span><span class='lbrace token'>{</span><span class='rbrace token'>}</span><span class='rparen token'>)</span>
    <span class='comment val'># ...</span>
  <span class='rubyid_end end kw'>end</span>

  <span class='comment val'># Description of what this operator searches for.</span>
  <span class='comment val'>#</span>
  <span class='comment val'># @return [String]</span>
  <span class='rubyid_def def kw'>def</span> <span class='rubyid_help identifier id'>help</span>
    <span class='comment val'># ...</span>
  <span class='rubyid_end end kw'>end</span>

  <span class='comment val'># Name of this operator.  The name of the operator is matched to the string before the ':' in a formatted</span>
  <span class='comment val'># operation.</span>
  <span class='comment val'>#</span>
  <span class='comment val'># @return [Symbol]</span>
  <span class='rubyid_def def kw'>def</span> <span class='rubyid_name identifier id'>name</span>
    <span class='comment val'># ...</span>
  <span class='rubyid_end end kw'>end</span>

  <span class='comment val'># Creates a one or more operations based on `formatted_value`.</span>
  <span class='comment val'>#</span>
  <span class='comment val'># @return [#operator, Array<#operator>] Operation with this operator as the operation's `operator`.</span>
  <span class='rubyid_def def kw'>def</span> <span class='rubyid_operate_on identifier id'>operate_on</span><span class='lparen token'>(</span><span class='rubyid_formatted_value identifier id'>formatted_value</span><span class='rparen token'>)</span>
    <span class='comment val'># ...</span>
  <span class='rubyid_end end kw'>end</span>
<span class='rubyid_end end kw'>end</span>

Help

Instead of having define your own #help method for your operator Class, you can include Operator::Help.

This allows the help to be looked up using I18n, and for the help to be customized based on the following criteria:

klass on which the operator is declared, including any Module#ancestors and the operator name

<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># config/locales/<lang>.yml</span></span>
<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_lang identifier id'>lang</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_klass identifier id'>klass</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'dot token'</span><span class='gt op'>></span><span class='dot token'>.</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_i18n_scope identifier id'>i18n_scope</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>ancestors:</span><span class='lt op'><</span><span class='regexp val'>/span>
      <span class='lt op'><</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_klass_ancestor identifier id'</span><span class='gt op'>></span><span class='rubyid_klass_ancestor identifier id'>klass_ancestor</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_model_name identifier id'</span><span class='gt op'>></span><span class='rubyid_model_name identifier id'>model_name</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_i18n_key identifier id'</span><span class='gt op'>></span><span class='rubyid_i18n_key identifier id'>i18n_key</span><span class='lt op'><</span><span class='regexp val'>/span><span class='gt op'>></s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon op'</span><span class='gt op'>></span><span class='symbol val'>:<</span><span class='regexp val'>/span>
        <span class='label val'>search:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
          <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>operator:</span><span class='lt op'><</span><span class='regexp val'>/span>
            <span class='label val'>names:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
              <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_name identifier id'>name</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
                <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>help:</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='string val'>"Help for searching <name> on <klass>"</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>

class of the operator, including any Module#ancestors and the operator name

<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># config/locales/<lang>.yml</span></span>
<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_lang identifier id'>lang</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_operator identifier id'>operator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'dot token'</span><span class='gt op'>></span><span class='dot token'>.</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_class identifier id'>class</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'dot token'</span><span class='gt op'>></span><span class='dot token'>.</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_i18n_scope identifier id'>i18n_scope</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>search:</span><span class='lt op'><</span><span class='regexp val'>/span>
      <span class='label val'>operator:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
        <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>ancestors:</span><span class='lt op'><</span><span class='regexp val'>/span>
          <span class='lt op'><</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_operator_class_ancestor identifier id'</span><span class='gt op'>></span><span class='rubyid_operator_class_ancestor identifier id'>operator_class_ancestor</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_model_name identifier id'</span><span class='gt op'>></span><span class='rubyid_model_name identifier id'>model_name</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_i18n_key identifier id'</span><span class='gt op'>></span><span class='rubyid_i18n_key identifier id'>i18n_key</span><span class='lt op'><</span><span class='regexp val'>/span><span class='gt op'>></s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon op'</span><span class='gt op'>></span><span class='symbol val'>:<</span><span class='regexp val'>/span>
            <span class='lt op'><</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_name identifier id'</span><span class='gt op'>></span><span class='rubyid_name identifier id'>name</span><span class='lt op'><</span><span class='regexp val'>/span><span class='gt op'>></s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon op'</span><span class='gt op'>></span><span class='symbol val'>:<</span><span class='regexp val'>/span>
              <span class='label val'>help:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span> <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'string val'</span><span class='gt op'>></span><span class='string val'>"Help for searching <name> using <operator.class>"</span><span class='lt op'><</span><span class='regexp val'>/span>
</span>

class of the operator, including any Module#ancestors without the operator name

<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># config/locales/<lang>.yml</span></span>
<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_lang identifier id'>lang</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span><span class='rubyid_operator identifier id'>operator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'dot token'</span><span class='gt op'>></span><span class='dot token'>.</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_class identifier id'>class</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'dot token'</span><span class='gt op'>></span><span class='dot token'>.</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_i18n_scope identifier id'>i18n_scope</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'gt op'</span><span class='rshft op'>>></span><span class='lt op'><</span><span class='regexp val'>/span><span class='colon op'>:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>search:</span><span class='lt op'><</span><span class='regexp val'>/span>
      <span class='label val'>operator:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
        <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'label val'</span><span class='gt op'>></span><span class='label val'>ancestors:</span><span class='lt op'><</span><span class='regexp val'>/span>
          <span class='lt op'><</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_operator_class_ancestor identifier id'</span><span class='gt op'>></span><span class='rubyid_operator_class_ancestor identifier id'>operator_class_ancestor</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_model_name identifier id'</span><span class='gt op'>></span><span class='rubyid_model_name identifier id'>model_name</span><span class='lt op'><</span><span class='regexp val'>/span><span class='dot token'>.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_i18n_key identifier id'</span><span class='gt op'>></span><span class='rubyid_i18n_key identifier id'>i18n_key</span><span class='lt op'><</span><span class='regexp val'>/span><span class='gt op'>></s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon op'</span><span class='gt op'>></span><span class='symbol val'>:<</span><span class='regexp val'>/span>
            <span class='label val'>help:</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span> <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'string val'</span><span class='gt op'>></span><span class='string val'>"Help for searching using <operator.class>"</span><span class='lt op'><</span><span class='regexp val'>/span>
</span>

Operator::Base

Instead of writing an operator completely from scratch, you can subclass Operator::Base.

<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_class class kw'</span><span class='gt op'>></span><span class='rubyid_class class kw'>class</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_MyOperator constant id'>MyOperator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span> <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span> <span class='rubyid_Metasploit constant id'>Metasploit</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Model constant id'>Model</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Search constant id'>Search</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Operator constant id'>Operator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Base constant id'>Base</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># Name of this operator.  The name of the operator is matched to the string before the ':' in a formatted</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># operation.</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'>#</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># @return [Symbol]</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_def def kw'</span><span class='gt op'>></span><span class='rubyid_def def kw'>def</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_name identifier id'>name</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># ...</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_end end kw'</span><span class='gt op'>></span><span class='rubyid_end end kw'>end</span><span class='lt op'><</span><span class='regexp val'>/span>

  <span class='comment val'># Creates a one or more operations based on `formatted_value`.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'>#</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># @return [#operator, Array<#operator>] Operation with this operator as the operation's `operator`.</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_def def kw'</span><span class='gt op'>></span><span class='rubyid_def def kw'>def</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_operate_on identifier id'>operate_on</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lparen token'</span><span class='gt op'>></span><span class='lparen token'>(</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_formatted_value identifier id'>formatted_value</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rparen token'</span><span class='gt op'>></span><span class='rparen token'>)</span><span class='lt op'><</span><span class='regexp val'>/span>
    <span class='comment val'># ...</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_end end kw'</span><span class='gt op'>></span><span class='rubyid_end end kw'>end</span><span class='lt op'><</span><span class='regexp val'>/span>
<span class='rubyid_end end kw'>end</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>

Operator::Single

If all you want do is customize the name and operation Class that your custom operator class returns from #operate_on, then you can subclass Operator::Single instead of Operator::Base.

<span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_class class kw'</span><span class='gt op'>></span><span class='rubyid_class class kw'>class</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_MyOperator constant id'>MyOperator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span> <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'lt op'</span><span class='gt op'>></span><span class='lshft op'><<</span><span class='regexp val'>/span> <span class='rubyid_Metasploit constant id'>Metasploit</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Model constant id'>Model</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Search constant id'>Search</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Operator constant id'>Operator</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span><span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'colon2 op'</span><span class='gt op'>></span><span class='colon3 op'>::</span><span class='lt op'><</span><span class='regexp val'>/span><span class='rubyid_Single constant id'>Single</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># Name of this operator.  The name of the operator is matched to the string before the ':' in a formatted</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># operation.</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'>#</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># @return [Symbol]</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_def def kw'</span><span class='gt op'>></span><span class='rubyid_def def kw'>def</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_name identifier id'>name</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># ...</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_end end kw'</span><span class='gt op'>></span><span class='rubyid_end end kw'>end</span><span class='lt op'><</span><span class='regexp val'>/span>

  <span class='comment val'># `Class.name` of `Class` returned from {Metasploit::Model::Search::Operator::Single#operate_on}.</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'>#</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># @return [String] a `Class.name`</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_def def kw'</span><span class='gt op'>></span><span class='rubyid_def def kw'>def</span><span class='lt op'><</span><span class='regexp val'>/span> <span class='rubyid_operation_class_name identifier id'>operation_class_name</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>
    <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'comment val'</span><span class='gt op'>></span><span class='comment val'># ...</span></span>
  <span class='lt op'><</span><span class='rubyid_span identifier id'>span</span> <span class='rubyid_class class kw'>class</span><span class='assign token'>=</span><span class='string val'>'rubyid_end end kw'</span><span class='gt op'>></span><span class='rubyid_end end kw'>end</span><span class='lt op'><</span><span class='regexp val'>/span>
<span class='rubyid_end end kw'>end</s</span><span class='rubyid_pan identifier id'>pan</span><span class='gt op'>></span>

Testing

ClassMethods#search_with calls can be tested with the 'search_with' shared example. First, ensure the shared examples from metasploit-model are required in your spec_helper.rb:

# spec/spec_helper.rb
support_glob = Metasploit::Model::Engine.root.join('spec', 'support', '**', '*.rb')

Dir.glob(support_glob) do |path|
  require path
end

In the spec fo the Class that called search_with, use the 'search_with' shared example by passing the arguments passed to ClassMethods#search_attribute.

# app/models/my_class.rb
class MyClass
  include Metasploit::Model::Search

  #
  # Search
  #

  search_with MyOperatorClass,
              foo: :bar
end

# spec/app/models/my_class_spec.rb
require 'spec_helper'

describe MyClass do
  context 'search' do
    context 'attributes' do
      it_should_behave_like 'search_with',
                            MyOperatorClass,
                            foo: :bar
    end
  end
end

Defined Under Namespace

Modules: ClassMethods