When writing plugins, it is very important to be protected from unauthorized access. If you are using Magento 2, you can do magento 2 security updates in one place by true professionals. We advise you to update the security settings first, and then proceed to the tutorial below.
Lookup plugins are loaded as jerakia/lookup/plugin/pluginname
from the ruby load path, meaning they can be shipped as a rubygem or placed under jerakia/lookup/plugin
relative to the plugindir
option in the configuration file. The boilerplate template for a plugin is formed by creating a module with a name corresponding to your plugin name in the Jerakia::Lookup::Plugin class… in reality that looks a lot simpler than it sounds
class Jerakia::Lookup::Plugin
module Mystuff
end
end
We can now define methods inside this plugin that will be exposed to our lookups in the plugin.mystuff
namespace. For this example we are going to generate a dynamic hierarchy based on a top level variable role
. The variable contains a colon delimited string, and starting with the deepest level construct a hierarchy to the top. For example, if the role variable is set to web::frontend::application_foo
we want to generate a search hierarchy of;
/var/lib/jerakia/role/web/frontend/application_foo
/var/lib/jerakia/role/web/frontend
/var/lib/jerakia/role/web
To do this, we will write a method in our plugin class called role_hierarchy
and then use it in our lookup. First, let’s add the method;
class Jerakia::Lookup::Plugin
module Mystuff
def role_hierarchy
role = scope[:role].split(/::/)
tree = []
until role.empty?
tree << "role/#{role.join('/')}}"
role.pop
end
tree
end
end
end
We can now use this within our module by loading the mystuff plugin and calling our method as plugins.mystuff.role_hierarchy. Here is the final lookup policy using our new plugin;
lookup :default, :use => :mystuff do
datasource :file, {
format => :yaml
docroot => "/var/lib/jerakia",
searchpath => [
plugin.mystuff.role_hierarchy,
"host/#{scope[:hostname]",
"environment/#scope[:environment]",
"common",
]
}
end