{"action":"created","comment":{"url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments/44422411","id":44422411,"diff_hunk":"@@ -136,65 +196,10 @@ def self.each_reference_name(max_run_count: nil, module_path_real_pathname:, mod\n \n               reference_name = yield relative_pathname\n \n-\n-              context_options = {}\n-              pending_reason = pending_reason_by_reference_name[reference_name]\n-\n-              if pending_reason\n-                context_options[:pending] = pending_reason\n-              end\n-\n-              context reference_name, context_options do\n-                unless pending_reason\n-                  if max_run_count\n-                    before(:each) do\n-                      run_count += 1\n-\n-                      if run_count > max_run_count\n-                        skip \"Skipping because #{max_run_count} Metasploit Modules with ancestors under \" \\\n-                           \"#{relative_path_prefix} have been tested already and testing them all takes too long\"\n-                      end\n-                    end\n-                  end\n-                end\n-\n-                full_name = \"#{module_type}/#{reference_name}\"\n-\n-                it \"can be `use`d\" do\n-                  metasploit_framework_root = Metasploit::Framework::Engine.root\n-\n-                  metasploit_cache_use = ChildProcess.build(\n-                      'bundle',\n-                      'exec',\n-                      'metasploit-cache',\n-                      'use',\n-                      full_name,\n-                      '--database-yaml', 'config/database.yml',\n-                      '--environment', 'content',\n-                      '--include', metasploit_framework_root.to_path,\n-                      metasploit_framework_root.join('app', 'validators').to_path,\n-                      '--require', 'metasploit/framework',\n-                      'metasploit/framework/executable_path_validator',\n-                      'metasploit/framework/file_path_validator',\n-                      '--logger-severity', 'ERROR'\n-                  )\n-\n-                  metasploit_cache_use_out = Tempfile.new(['metasploit-cache-use', '.log'])\n-                  metasploit_cache_use_out.sync = true\n-\n-                  metasploit_cache_use.cwd = Metasploit::Cache::Engine.root.join('spec', 'dummy').to_path\n-                  metasploit_cache_use.io.stdout = metasploit_cache_use_out\n-                  metasploit_cache_use.start\n-                  metasploit_cache_use.wait\n-\n-                  expect(metasploit_cache_use.exit_code).to eq(0), ->(){\n-                    metasploit_cache_use_out.rewind\n-\n-                    \"metasploit-cache use #{full_name} exited with non-zero status \" \\\n-                      \"(#{metasploit_cache_use.exit_code}):\\n#{metasploit_cache_use_out.read}\"\n-                  }\n-                end\n-              end\n+              reference_name_context module_type,\n+                                     reference_name,\n+                                     pending_reason_by_reference_name: pending_reason_by_reference_name,","path":"spec/exe/metasploit_cache_spec.rb","position":141,"original_position":141,"commit_id":"0731964a3f4962f3603c788b4215a073ea0d1625","original_commit_id":"0731964a3f4962f3603c788b4215a073ea0d1625","user":{"login":"houndci","id":6697940,"avatar_url":"https://avatars.githubusercontent.com/u/6697940?v=3","gravatar_id":"","url":"https://api.github.com/users/houndci","html_url":"https://github.com/houndci","followers_url":"https://api.github.com/users/houndci/followers","following_url":"https://api.github.com/users/houndci/following{/other_user}","gists_url":"https://api.github.com/users/houndci/gists{/gist_id}","starred_url":"https://api.github.com/users/houndci/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/houndci/subscriptions","organizations_url":"https://api.github.com/users/houndci/orgs","repos_url":"https://api.github.com/users/houndci/repos","events_url":"https://api.github.com/users/houndci/events{/privacy}","received_events_url":"https://api.github.com/users/houndci/received_events","type":"User","site_admin":false},"body":"Line is too long. [104/80]","created_at":"2015-11-10T15:51:31Z","updated_at":"2015-11-10T15:51:31Z","html_url":"https://github.com/rapid7/metasploit-cache/pull/88#discussion_r44422411","pull_request_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88","_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments/44422411"},"html":{"href":"https://github.com/rapid7/metasploit-cache/pull/88#discussion_r44422411"},"pull_request":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88"}}},"pull_request":{"url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88","id":48070851,"html_url":"https://github.com/rapid7/metasploit-cache/pull/88","diff_url":"https://github.com/rapid7/metasploit-cache/pull/88.diff","patch_url":"https://github.com/rapid7/metasploit-cache/pull/88.patch","issue_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/88","number":88,"state":"open","locked":false,"title":"Load by reference name payload staged classes","user":{"login":"limhoff-r7","id":2230482,"avatar_url":"https://avatars.githubusercontent.com/u/2230482?v=3","gravatar_id":"","url":"https://api.github.com/users/limhoff-r7","html_url":"https://github.com/limhoff-r7","followers_url":"https://api.github.com/users/limhoff-r7/followers","following_url":"https://api.github.com/users/limhoff-r7/following{/other_user}","gists_url":"https://api.github.com/users/limhoff-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/limhoff-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/limhoff-r7/subscriptions","organizations_url":"https://api.github.com/users/limhoff-r7/orgs","repos_url":"https://api.github.com/users/limhoff-r7/repos","events_url":"https://api.github.com/users/limhoff-r7/events{/privacy}","received_events_url":"https://api.github.com/users/limhoff-r7/received_events","type":"User","site_admin":false},"body":"MSP-12461\r\nMS-594\r\n\r\n# Changelog\r\n* Enhancements\r\n  * `metasploit-cache load` can load `payloads/stages` and `payloads/stagers`.\r\n  * `metasploit-cache load --staged-payloads` (on by default) will load staged payload from stage and stager payloads already loaded in the cache (can be disabled with `--no-staged-payloads`).\r\n  * `Metasploit::Cache::Module::Ancestor::Ephemeral#persist` now uses keyword arguments instead of options `Hash` and `Hash#assert_valid_keys`.\r\n  * `Metasploit::Cache::Module::Ancestor::Ephemeral.with_module_ancestor_tag` exposed as class method so other `Metasploit::Cache::*::Ephemeral` can use it for tagging log with `Metasploit::Cache::Module::Ancestor#real_pathname`.\r\n  * Remove unnecessary `ActiveRecord::Base.connection_pool.with_connection` calls for `with_*_tag` methods.  (Connection is checked out and returned by caller.)\r\n  * `Metasploit::Cache::Auxiliary::Instance::Ephemeral::Stance` can synchronize the `#passive?` of an auxiliary Metasploit Module instance to `Metasploit::Cache::Auxiliary::Instance#stance`.\r\n  * `<synchronize(destination:, logger:, source:)>Metasploit::Cache::Ephemeral.synchronizer(Array<Symbol, Hash{Symbol => Symbol}>)` will create a synchronizer Module that implements the `synchronize(destination:, logger:, source:)` method and synchronizes attributes on `source` to attributes on `destination`.  Use `Symbol` when the attribute name on the `source` is the same as the name on `destination`.  Use `Hash{Symbol => Symbol}` to map `source` attribute names to `destination` attribute names.\r\n  * Lift synchronizers list to `SYNCRHONIZERS` constant on `Metasploit::Cache::Auxiliary::Instance::Ephemeral`, `Metasploit::Cache::Encoder::Instance::Ephemeral`, `Metasploit::Cache::Exploit::Instance::Ephemeral`, `Metasploit::Cache::Nop::Instance::Ephemeral`, `Metasploit::Cache::Payload::Single::Unhandled::Instance::Ephemeral`, `Metasploit::Cache::Payload::Stage::Instance::Ephemeral`, `Metasploit::Cache::Payload::Stager::Instance::Ephemeral`, `Metasploit::Cache::Post::Instance::Ephemeral`\r\n  * `Metasploit::Cache::Ephemeral.seriazable_batched_save(record)` will attempt to batch save `record` inside a serializable transaction.\r\n  * `Metasploit::Cache::Ephemeral.synchronize(destination:, logger:, source:, synchronizers: [])` will reduce `destination` through the `synchronize(destination:, logger:, source:)` on each synchronizer.\r\n  * `Metasploit::Cache::Ephemeral.persist(destination: ActiveRecord::Base, logger: ActiveSupport::TaggedLogging, source:, synchronizers: Array<#synchronize(destination: ActiveRecord::Base, logger: ActiveSupport::TaggedLogging, source:>)` synchronizes `destination` with `source` using `synchronizers` before attempting a batched save of `record` inside a serlizable transaction, if the save fails, then validation errors are logged as an error to `logger`. i.e. the core of the all the `Metasploit::Cache::*::Ephemeral#persist` methods.\r\n  * `Metasploit::Cache::Direct::Class::Ephemeral::Name#synchronize(destination: ActiveRecord::Base, logger:, source:)` will build `#name` on `destination`.\r\n  * `Metasploit::Cache::Payload::Single::Handled::Class::Ephemeral::Name#synchronize(destination: ActiveRecord::Base, logger:, source:)` will build `#name` on `destination`.\r\n  * `Metasploit::Cache::Module::Persister` is an abstract base class for Persisters.  Has `#ephemeral`, `#logger`, `#persist`, and `#persistent`.  Needs `#persistent_relation`, `#with_tagged_logger`, and `SYNCHRONIZERS` defined by subclass.\r\n  * `Metasploit::Cache::Module::Class::Persister::PersistentClass` defines `#persistent` that uses `#persistent_class`, which is validated for presence.\r\n  * `'Metasploit::Cache::Module::Persister'` shared examples check subclasses maintain interface for `Metasploit::Cache::Module::Persister`.\r\n  * `Metasploit::Cache::Payload::Stager::Ancestor::Handler` for holding `#type_alias` from `#handler_type_alias` on payload stager Metasploit Module ruby Module.\r\n  * `Metasploit::Cache::Payload::Stager::Ancestor` can have one `#handler`, which is a `Metasploit::Cache::Payload::Stager::Ancestor::Handler`.  It is `nil` when the payload stager Metasploit Module ruby Module does NOT respond to `#handler_type_alias`.\r\n  * `:full_metasploit_cache_payload_stager_ancestor` factory will build `:metasploit_cache_payload_stager_ancestor` with a populated `#handler`.\r\n  * `Metasploit::Cache::Payload::Stager::Ancestor::Persister` ensures `Metasploit::Cache::Payload::Stager::Ancestor#handler` is persisted using `Metasploit::Cache::Payload::Stager::Ancestor::Persister::Handler`\r\n  * `Metasploit::Cache::Module::Class::Name#full` can be used to get the full name of a Metasploit Module class instead of having to manually build it from `#module_type` and `#reference`.  **NOTE: It is in-memory only, not in the schema.**\r\n  * `metasploit-cache use` can load staged payloads by name by loading the stage and stager ancestors first before constructing the staged class and instance.\r\n* Incompatible Changes\r\n  * `Metasploit::Cache::Module::Ancestor::Ephemeral#persist_module_ancestor` renamed to `#persist` to match interface on `Metasploit::Cache::*::Instance::Ephemeral` classes.\r\n  * `Metasploit::Cache::Direct::Class::Ephemeral#persist_direct_class` renamed to `#persist` to match interface on `Metasploit::Cache::*::Instance::Ephemeral` classes.\r\n  * All resurrecting attributes on `Metasploit::Cache::*::Ephemeral` are now called `persistent`.\r\n    * `Metasploit::Cache::Auxiliary::Instance::Ephemeral#auxiliary_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Direct::Class::Ephemeral#direct_class_class` renamed to `#persistent_class`\r\n    * `Metasploit::Cache::Direct::Class::Ephemeral#direct_class` renamed to `#persistent`\r\n    * `Metasploit::Cache::Encoder::Instance::Ephemeral#encoder_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Exploit::Instance::Ephemeral#exploit_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Module::Ancestor::Ephemeral#module_ancestor` renamed to `#persistent`\r\n    * `Metasploit::Cache::Nop::Instance::Ephemeral#nop_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Class::Ephemeral#payload_single_handled_class` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Instance::Ephemeral#payload_single_handled_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Single::Unhandled::Instance::Ephemeral#payload_single_unhandled_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Stage::Instance::Ephemeral#payload_stage_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Staged::Class::Ephemeral#payload_staged_class` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Staged::Instance::Ephemeral#payload_staged_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Stager::Instance::Ephemeral#payload_staged_instance` renamed to `#persistent`\r\n    * `Metasploit::Cache::Payload::Unhandled::Class::Ephemeral#payload_unhandled_class` renamed to `#persistent`\r\n    * `Metasploit::Cache::Post::Instance::Ephemeral#post_instance` renamed to `#persistent`\r\n  * `with_*_tag -> with_tagged_logger` in `Metasploit::Cache::*::Ephemeral`.\r\n  * `Ephemeral` renamed to `Persister` because ephemeral is the in-memory cache (i.e. the Metasploit Module module, class or instance).\r\n    * `Metasploit::Cache::Author::Ephemeral` renamed to `Metasploit::Cache::Author::Persister`\r\n    * `Metasploit::Cache::Auxiliary::Instance::Ephemeral` renamed to `Metasploit::Cache::Auxiliary::Instance::Persister`\r\n    * `Metasploit::Cache::Module::Rankable::Ephemeral` renamed to `Metasploit::Cache::Module::Rankable::Persister`\r\n    * `Metasploit::Cache::Direct::Class::Ephemeral` renamed to `Metasploit::Cache::Direct::Class::Persister`\r\n    * `Metasploit::Cache::EmailAddress::Ephemeral` renamed to `Metasploit::Cache::EmailAddress::Persister`\r\n    * `Metasploit::Cache::Encoder::Instance::Ephemeral` renamed to `Metasploit::Cache::Encoder::Instance::Persister`\r\n    * `Metasploit::Cache::Exploit::Instance::Ephemeral` renamed to `Metasploit::Cache::Exploit::Instance::Persister`\r\n    * `Metasploit::Cache::License::Ephemeral` renamed to `Metasploit::Cache::License::Persister`\r\n    * `Metasploit::Cache::Module::Ancestor::Ephemeral` renamed to `Metasploit::Cache::Module::Ancestor::Persister`\r\n    * `Metasploit::Cache::Nop::Instance::Ephemeral` renamed to `Metasploit::Cache::Nop::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Handler::Ephemeral` renamed to `Metasploit::Cache::Payload::Handler::Persister`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Instance::Ephemeral` renamed to `Metasploit::Cache::Payload::Single::Handled::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Single::Unhandled::Instance::Ephemeral` renamed to `Metasploit::Cache::Payload::Single::Unhandled::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Stage::Instance::Ephemeral` renamed to `Metasploit::Cache::Payload::Stage::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Staged::Class::Ephemeral` renamed to `Metasploit::Cache::Payload::Staged::Class::Persister`\r\n    * `Metasploit::Cache::Payload::Staged::Instance::Ephemeral` renamed to `Metasploit::Cache::Payload::Staged::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Stager::Instance::Ephemeral` renamed to `Metasploit::Cache::Payload::Stager::Instance::Persister`\r\n    * `Metasploit::Cache::Payload::Unhandled::Class::Ephemeral` renamed to `Metasploit::Cache::Payload::Unhandled::Class::Persister`\r\n    * `Metasploit::Cache::Post::Instance::Ephemeral` renamed to `Metasploit::Cache::Post::Instance::Persister`\r\n    * `Metasploit::Cache::Actionable::Ephemeral` renamed to `Metasploit::Cache::Actionable::Persister`\r\n    * `Metasploit::Cache::Actionable::Ephemeral::Actions` renamed to `Metasploit::Cache::Actionable::Persister::Actions`\r\n    * `Metasploit::Cache::Architecturable::Ephemeral` renamed to `Metasploit::Cache::Architecturable::Persister`\r\n    * `Metasploit::Cache::Architecturable::Ephemeral::ArchitecturableArchitectures` renamed to `Metasploit::Cache::Architecturable::Persister::ArchitecturableArchitectures`\r\n    * `Metasploit::Cache::Author::Ephemeral` renamed to `Metasploit::Cache::Author::Persister`\r\n    * `Metasploit::Cache::Auxiliary::Instance::Ephemeral::Stance` renamed to `Metasploit::Cache::Auxiliary::Instance::Persister::Stance`\r\n    * `Metasploit::Cache::Cacheable#ephemeral_cache_by_source` renamed to `#persister_by_source`\r\n    * `Metasploit::Cache::Contributable::Ephemeral` renamed to `Metasploit::Cache::Contributable::Persister`\r\n    * `Metasploit::Cache::Contributable::Ephemeral::Contributions` renamed to `Metasploit::Cache::Contributable::Persister::Contributions`\r\n    * `Metasploit::Cache::Direct::Class::Ephemeral::Name` renamed to `Metasploit::Cache::Direct::Class::Persister::Name`\r\n    * `Metasploit::Cache::Exploit::Instance::Ephemeral::ExploitTargets` renamed to `Metasploit::Cache::Exploit::Instance::Persister::ExploitTargets`\r\n    * `Metasploit::Cache::Exploit::Instance::Ephemeral::Stance` renamed to `Metasploit::Cache::Exploit::Instance::Persister::Stance`\r\n    * `Metasploit::Cache::Licensable::Ephemeral` renamed to `Metasploit::Cache::Licensable::Persister`\r\n    * `Metasploit::Cache::Licensable::Ephemeral::LicensableLicenses` renamed to `Metasploit::Cache::Licensable::Persister::LicensableLicenses`\r\n    * `Metasploit::Cache::License::Ephemeral` renamed to `Metasploit::Cache::License::Persister`\r\n    * `Metasploit::Cache::Module::Class::Ephemeral` renamed to `Metasploit::Cache::Module::Class::Persister`\r\n    * `Metasploit::Cache::Module::Class::Ephemeral::Rank` renamed to `Metasploit::Cache::Module::Class::Persister::Rank`\r\n    * `Metasploit::Cache::Module::Instance::Load#ephemeral_class` renamed to `#persister_class`\r\n    * `Metasploit::Cache::Payload::Handable::Ephemeral` renamed to `Metasploit::Cache::Payload::Handable::Persister`\r\n    * `Metasploit::Cache::Payload::Handable::Ephemeral::Handler` renamed to `Metasploit::Cache::Payload::Handable::Persister::Handler`\r\n    * `Metasploit::Cache::Payload::Handler::Ephemeral` renamed to `Metasploit::Cache::Payload::Handler::Persister`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Class::Ephemeral::Name` renamed to `Metasploit::Cache::Payload::Single::Handled::Class::Persister::Name`\r\n    * `Metasploit::Cache::Ephemeral` renamed to `Metasploit::Cache::Persister`\r\n    * `Metasploit::Cache::Ephemeral::AttributeSet` renamed to `Metasploit::Cache::Persister::AttributeSet`\r\n    * `Metasploit::Cache::Platformable::Ephemeral` renamed to `Metasploit::Cache::Platformable::Persister`\r\n    * `Metasploit::Cache::Platformable::Ephemeral::PlatformablePlatforms` renamed to `Metasploit::Cache::Platformable::Persister::PlatformablePlatforms`\r\n    * `Metasploit::Cache::Referencable::Ephemeral` renamed to `Metasploit::Cache::Referencable::Persister`\r\n    * `Metasploit::Cache::Referencable::Ephemeral::ReferencableReferences` renamed to `Metasploit::Cache::Referencable::Persister::ReferencableReferences`\r\n    * `Metasploit::Cache::Reference::Ephemeral` renamed to `Metasploit::Cache::Reference::Persister`\r\n    * `Metasploit::Cache::Payload::Unhandled::Class::Persister#payload_unhandled_class_class` renamed to `#persistent_class`\r\n  * In Persisters, the Metasploit Module instance, class, or ancestor ruby Class or Module should be in the `#ephemeral` attribute.\r\n    * `Metasploit::Cache::Auxiliary::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Direct::Class::Persister#metasploit_class` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Encoder::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Exploit::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Module::Ancestor::Persister#metasploit_module` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Nop::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Class::Persister#payload_single_handled_metasploit_module_class ` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Single::Handled::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Single::Unhandled::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Stage::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Staged::Class::Persister#payload_staged_metasploit_module_class` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Staged::Instance::Persister#metasploit_module_instance` renamed to `ephemeral`\r\n    * `Metasploit::Cache::Payload::Stager::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Payload::Unhandled::Class::Persister#payload_unhandled_class_class` renamed to `#ephemeral`\r\n    * `Metasploit::Cache::Post::Instance::Persister#metasploit_module_instance` renamed to `#ephemeral`\r\n  * `Metasploit::Cache::Module::Ancestor::Loader#persister_class` must be set to `Metasploit::Cache::Payload::Stager::Ancestor::Persister` or `Metasploit::Cache::Module::Ancestor::Persister`.\r\n  * `Metasploit::Cache::Payload::Stager::Instance#handler_type_alias` is removed.  Use `Metasploit::Cache::Payload::Stager::Ancestor#handler` and `Metasploit::Cache::Payload::Stager::Ancestor::Handler#type_alias` instead.\r\n  * ``\r\n\r\n# Pre-verification Steps\r\n- [x] Merge #86\r\n\r\n# Verification Steps\r\n- [ ] `rm Gemfile.lock`\r\n- [ ] `bundle install --without sqlite3`\r\n- [ ] `rake db:drop db:create db:migrate`\r\n\r\n## Manual\r\n\r\n### Load\r\n- [ ] `rake app:db:test:load`\r\n- [ ] \r\n```\r\ntime metasploit-cache load ${METASPLOIT_FRAMEWORK}/modules\r\n                           --database-yaml spec/dummy/config/database.yml \\\r\n                           --environment test \\\r\n                           --include ${METASPLOIT_FRAMEWORK} ${METASPLOIT_FRAMEWORK}/app/validators \\\r\n                           --require metasploit/framework metasploit/framework/executable_path_validator metasploit/framework/file_path_validator \\\r\n                           --gem metasploit-framework \\\r\n                           --logger-severity INFO \\\r\n                           --name modules \\\r\n                           --only-type-directories payloads/stages payloads/stagers\r\n                           --staged-payloads                           \r\n```\r\n- [ ] VERIFY progress bar is printed to log\r\n\r\n### Use\r\n- [ ] \r\n```\r\ntime metasploit-cache use payload/php/meterpreter/bind_tcp_ipv6 \\\r\n                          --database-yaml spec/dummy/config/database.yml \\\r\n                          --environment test \\\r\n                          --include ${METASPLOIT_FRAMEWORK} ${METASPLOIT_FRAMEWORK}/app/validators \\\r\n                          --require metasploit/framework metasploit/framework/executable_path_validator metasploit/framework/file_path_validator \\\r\n                          --logger-severity ERROR\r\n```\r\n- [ ] **VERIFY** `payload/php/meterpreter/bind_tcp_ipv6 is usable` is logged\r\n\r\n## Postgresql\r\n- [ ] `rm Gemfile.lock`\r\n- [ ] `bundle install --without sqlite3`\r\n- [ ] `rake db:drop db:create db:migrate`\r\n\r\n### Test coverage\r\n- [ ] `rake cucumber spec coverage`\r\n- [ ] VERIFY no failures\r\n- [ ] VERIFY 100% coverage\r\n\r\n### Documentation Coverage\r\n- [ ] `rake yard:stats`\r\n- [ ] VERIFY no `[warn]`ings\r\n- [ ] VERIFY no undocumented objects\r\n\r\n## Sqlite3\r\n- [ ] `rm Gemfile.lock`\r\n- [ ] `bundle install --without postgresql`\r\n- [ ] `rake db:drop db:create db:migrate`\r\n\r\n### Test coverage\r\n- [ ] `rake cucumber spec coverage`\r\n- [ ] VERIFY no failures\r\n- [ ] VERIFY 100% coverage\r\n\r\n### Documentation coverage\r\n- [ ] `rake yard:stats`\r\n- [ ] VERIFY no `[warn]`ings\r\n- [ ] VERIFY no undocumented objects","created_at":"2015-10-19T13:25:09Z","updated_at":"2015-11-10T15:51:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f267c456e35c7e9219b1254ffecc6028ef28bfff","assignee":{"login":"wchen-r7","id":1170914,"avatar_url":"https://avatars.githubusercontent.com/u/1170914?v=3","gravatar_id":"","url":"https://api.github.com/users/wchen-r7","html_url":"https://github.com/wchen-r7","followers_url":"https://api.github.com/users/wchen-r7/followers","following_url":"https://api.github.com/users/wchen-r7/following{/other_user}","gists_url":"https://api.github.com/users/wchen-r7/gists{/gist_id}","starred_url":"https://api.github.com/users/wchen-r7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wchen-r7/subscriptions","organizations_url":"https://api.github.com/users/wchen-r7/orgs","repos_url":"https://api.github.com/users/wchen-r7/repos","events_url":"https://api.github.com/users/wchen-r7/events{/privacy}","received_events_url":"https://api.github.com/users/wchen-r7/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88/commits","review_comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88/comments","review_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/88/comments","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/0731964a3f4962f3603c788b4215a073ea0d1625","head":{"label":"rapid7:feature/MSP-12461/load-by-reference-name-payload-staged-class","ref":"feature/MSP-12461/load-by-reference-name-payload-staged-class","sha":"0731964a3f4962f3603c788b4215a073ea0d1625","user":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"repo":{"id":27936087,"name":"metasploit-cache","full_name":"rapid7/metasploit-cache","owner":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rapid7/metasploit-cache","description":"Managing Metasploit content since 2015","fork":false,"url":"https://api.github.com/repos/rapid7/metasploit-cache","forks_url":"https://api.github.com/repos/rapid7/metasploit-cache/forks","keys_url":"https://api.github.com/repos/rapid7/metasploit-cache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapid7/metasploit-cache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapid7/metasploit-cache/teams","hooks_url":"https://api.github.com/repos/rapid7/metasploit-cache/hooks","issue_events_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/events{/number}","events_url":"https://api.github.com/repos/rapid7/metasploit-cache/events","assignees_url":"https://api.github.com/repos/rapid7/metasploit-cache/assignees{/user}","branches_url":"https://api.github.com/repos/rapid7/metasploit-cache/branches{/branch}","tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/tags","blobs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/{sha}","languages_url":"https://api.github.com/repos/rapid7/metasploit-cache/languages","stargazers_url":"https://api.github.com/repos/rapid7/metasploit-cache/stargazers","contributors_url":"https://api.github.com/repos/rapid7/metasploit-cache/contributors","subscribers_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscribers","subscription_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscription","commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/comments{/number}","contents_url":"https://api.github.com/repos/rapid7/metasploit-cache/contents/{+path}","compare_url":"https://api.github.com/repos/rapid7/metasploit-cache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapid7/metasploit-cache/merges","archive_url":"https://api.github.com/repos/rapid7/metasploit-cache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapid7/metasploit-cache/downloads","issues_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues{/number}","pulls_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls{/number}","milestones_url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones{/number}","notifications_url":"https://api.github.com/repos/rapid7/metasploit-cache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapid7/metasploit-cache/labels{/name}","releases_url":"https://api.github.com/repos/rapid7/metasploit-cache/releases{/id}","created_at":"2014-12-12T20:04:36Z","updated_at":"2015-10-14T14:16:24Z","pushed_at":"2015-11-10T15:50:01Z","git_url":"git://github.com/rapid7/metasploit-cache.git","ssh_url":"git@github.com:rapid7/metasploit-cache.git","clone_url":"https://github.com/rapid7/metasploit-cache.git","svn_url":"https://github.com/rapid7/metasploit-cache","homepage":"","size":19221,"stargazers_count":2,"watchers_count":2,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":2,"default_branch":"master"}},"base":{"label":"rapid7:master","ref":"master","sha":"52d7e896bb4c9340f5cb897521c962a577a64071","user":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"repo":{"id":27936087,"name":"metasploit-cache","full_name":"rapid7/metasploit-cache","owner":{"login":"rapid7","id":1013671,"avatar_url":"https://avatars.githubusercontent.com/u/1013671?v=3","gravatar_id":"","url":"https://api.github.com/users/rapid7","html_url":"https://github.com/rapid7","followers_url":"https://api.github.com/users/rapid7/followers","following_url":"https://api.github.com/users/rapid7/following{/other_user}","gists_url":"https://api.github.com/users/rapid7/gists{/gist_id}","starred_url":"https://api.github.com/users/rapid7/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rapid7/subscriptions","organizations_url":"https://api.github.com/users/rapid7/orgs","repos_url":"https://api.github.com/users/rapid7/repos","events_url":"https://api.github.com/users/rapid7/events{/privacy}","received_events_url":"https://api.github.com/users/rapid7/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rapid7/metasploit-cache","description":"Managing Metasploit content since 2015","fork":false,"url":"https://api.github.com/repos/rapid7/metasploit-cache","forks_url":"https://api.github.com/repos/rapid7/metasploit-cache/forks","keys_url":"https://api.github.com/repos/rapid7/metasploit-cache/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rapid7/metasploit-cache/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rapid7/metasploit-cache/teams","hooks_url":"https://api.github.com/repos/rapid7/metasploit-cache/hooks","issue_events_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/events{/number}","events_url":"https://api.github.com/repos/rapid7/metasploit-cache/events","assignees_url":"https://api.github.com/repos/rapid7/metasploit-cache/assignees{/user}","branches_url":"https://api.github.com/repos/rapid7/metasploit-cache/branches{/branch}","tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/tags","blobs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/refs{/sha}","trees_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/{sha}","languages_url":"https://api.github.com/repos/rapid7/metasploit-cache/languages","stargazers_url":"https://api.github.com/repos/rapid7/metasploit-cache/stargazers","contributors_url":"https://api.github.com/repos/rapid7/metasploit-cache/contributors","subscribers_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscribers","subscription_url":"https://api.github.com/repos/rapid7/metasploit-cache/subscription","commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/commits{/sha}","git_commits_url":"https://api.github.com/repos/rapid7/metasploit-cache/git/commits{/sha}","comments_url":"https://api.github.com/repos/rapid7/metasploit-cache/comments{/number}","issue_comment_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues/comments{/number}","contents_url":"https://api.github.com/repos/rapid7/metasploit-cache/contents/{+path}","compare_url":"https://api.github.com/repos/rapid7/metasploit-cache/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rapid7/metasploit-cache/merges","archive_url":"https://api.github.com/repos/rapid7/metasploit-cache/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rapid7/metasploit-cache/downloads","issues_url":"https://api.github.com/repos/rapid7/metasploit-cache/issues{/number}","pulls_url":"https://api.github.com/repos/rapid7/metasploit-cache/pulls{/number}","milestones_url":"https://api.github.com/repos/rapid7/metasploit-cache/milestones{/number}","notifications_url":"https://api.github.com/repos/rapid7/metasploit-cache/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rapid7/metasploit-cache/labels{/name}","releases_url":"https://api.github.com/repos/rapid7/metasploit-cache/releases{/id}","created_at":"2014-12-12T20:04:36Z","updated_at":"2015-10-14T14:16:24Z","pushed_at":"2015-11-10T15:50:01Z","git_url":"git://github.com/rapid7/metasploit-cache.git","ssh_url":"git@github.com:rapid7/metasploit-cache.git","clone_url":"https://github.com/rapid7/metasploit-cache.git","svn_url":"https://github.com/rapid7/metasploit-cache","homepage":"","size":19221,"stargazers_count":2,"watchers_count":2,"language":"Ruby","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88"},"html":{"href":"https://github.com/rapid7/metasploit-cache/pull/88"},"issue":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/issues/88"},"comments":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/issues/88/comments"},"review_comments":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88/comments"},"review_comment":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/pulls/88/commits"},"statuses":{"href":"https://api.github.com/repos/rapid7/metasploit-cache/statuses/0731964a3f4962f3603c788b4215a073ea0d1625"}}}}