# All plugins should include this module. It defines the basic # operations that all plugins are supposed to support. module Plugin module Run # Module methods, meant to be extended. Includers can explicitly # extend this to get a run() method defined in terms of their own # runner() and dummy_runner() methods. def included(c) # Callback, called whenever another class or module includes this # one. The parameter given is the name of the class or module # that included us. @includers ||= [] @includers << c end def includers @includers ||= [] return @includers end def runner() # The Runner associated with this plugin. raise NotImplementedError end def dummy_runner() # The RummyRunner associated with this plugin. raise NotImplementedError end def run(cfg, *args) includers().each do |includer| plugin = includer.new(cfg) if cfg.i_mean_business then runner = runner().new() else runner = dummy_runner().new() end # The splat passes the correct (we hope) number of arguments to the # appropriate runner. The Rm(Dummy)Runner have splats on their # *target arguments as well, to turn ARGV back into an array. runner.run(plugin, *args) end end end def describe_domain(domain) # Provide a "description" of the domain. This is output along # with the domain name and can be anything of use to the system # administrator. raise NotImplementedError end def describe_user(user) # Provide a "description" of the user. This is output along # with the domain name and can be anything of use to the system # administrator. raise NotImplementedError end def list_users() # Return a list of all users managed by this plugin. raise NotImplementedError end def user_exists(username) # Does the given username exist for this plugin? We use a naive # implementation here based on list_users() which is required to # exist above. Plugins can override this with something fast. users = list_users() return users.include?(username) end def list_domains_users(domains) # Get all usernames belonging to the given domains. If a username # ends in @example.com, it belongs to the domain example.com # # This uses a naive loop, but relies only on the existence of a # list_users() method which is guaranteed above. More efficient # implementations can usually be made within the plugin. domains_users = [] usernames = list_users(); domains.each do |d| matches = usernames.select do |username| username =~ /@#{d}$/ end domains_users += matches end return domains_users end end