# File lib/mcollective/config.rb, line 23
    def loadconfig(configfile)
      set_config_defaults(configfile)

      if File.exists?(configfile)
        File.readlines(configfile).each do |line|

          # strip blank spaces, tabs etc off the end of all lines
          line.gsub!(/\s*$/, "")

          unless line =~ /^#|^$/
            if (line =~ /(.+?)\s*=\s*(.+)/)
              key = $1
              val = $2

              case key
                when "registration"
                  @registration = val.capitalize
                when "registration_collective"
                  @registration_collective = val
                when "registerinterval"
                  @registerinterval = val.to_i
                when "collectives"
                  @collectives = val.split(",").map {|c| c.strip}
                when "main_collective"
                  @main_collective = val
                when "logfile"
                  @logfile = val
                when "keeplogs"
                  @keeplogs = val.to_i
                when "max_log_size"
                  @max_log_size = val.to_i
                when "loglevel"
                  @loglevel = val
                when "logfacility"
                  @logfacility = val
                when "libdir"
                  paths = val.split(File::PATH_SEPARATOR)
                  paths.each do |path|
                    raise("libdir paths should be absolute paths but '%s' is relative" % path) unless Util.absolute_path?(path)

                    @libdir << path
                    unless $LOAD_PATH.include?(path)
                      $LOAD_PATH << path
                    end
                  end
                when "identity"
                  @identity = val
                when "direct_addressing"
                  @direct_addressing = false unless val =~ /^1|y/i
                when "direct_addressing_threshold"
                  @direct_addressing_threshold = val.to_i
                when "color"
                  val =~ /^1|y/i ? @color = true : @color = false
                when "daemonize"
                  val =~ /^1|y/i ? @daemonize = true : @daemonize = false
                when "securityprovider"
                  @securityprovider = val.capitalize
                when "factsource"
                  @factsource = val.capitalize
                when "connector"
                  @connector = val.capitalize
                when "classesfile"
                  @classesfile = val
                when /^plugin.(.+)$/
                  @pluginconf[$1] = val
                when "rpcaudit"
                  val =~ /^1|y/i ? @rpcaudit = true : @rpcaudit = false
                when "rpcauditprovider"
                  @rpcauditprovider = val.capitalize
                when "rpcauthorization"
                  val =~ /^1|y/i ? @rpcauthorization = true : @rpcauthorization = false
                when "rpcauthprovider"
                  @rpcauthprovider = val.capitalize
                when "rpchelptemplate"
                  @rpchelptemplate = val
                when "rpclimitmethod"
                  @rpclimitmethod = val.to_sym
                when "logger_type"
                  @logger_type = val
                when "fact_cache_time"
                  @fact_cache_time = val.to_i
                when "ssl_cipher"
                  @ssl_cipher = val
                when "ttl"
                  @ttl = val.to_i
                when "helptemplatedir"
                  @helptemplatedir = val
                when "default_discovery_options"
                  @default_discovery_options << val
                when "default_discovery_method"
                  @default_discovery_method = val
                else
                  raise("Unknown config parameter #{key}")
              end
            end
          end
        end

        raise('The %s config file does not specify a libdir setting, cannot continue' % configfile) if @libdir.empty?

        I18n.load_path = Dir[File.expand_path(File.join(File.dirname(__FILE__), "locales", "*.yml"))]
        I18n.locale = :en

        read_plugin_config_dir("#{@configdir}/plugin.d")

        raise 'Identities can only match /\w\.\-/' unless @identity.match(/^[\w\.\-]+$/)

        @configured = true

        @libdir.each {|dir| Log.warn("Cannot find libdir: #{dir}") unless File.directory?(dir)}

        if @logger_type == "syslog"
          raise "The sylog logger is not usable on the Windows platform" if Util.windows?
        end

        PluginManager.loadclass("Mcollective::Facts::#{@factsource}_facts")
        PluginManager.loadclass("Mcollective::Connector::#{@connector}")
        PluginManager.loadclass("Mcollective::Security::#{@securityprovider}")
        PluginManager.loadclass("Mcollective::Registration::#{@registration}")
        PluginManager.loadclass("Mcollective::Audit::#{@rpcauditprovider}") if @rpcaudit
        PluginManager << {:type => "global_stats", :class => RunnerStats.new}

        Log.logmsg(:PLMC1, "The Marionette Collective version %{version} started by %{name} using config file %{config}", :info, :version => MCollective::VERSION, :name => $0, :config => configfile)
      else
        raise("Cannot find config file '#{configfile}'")
      end
    end