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