# class Puppet::Network::HTTP::WEBrick

### Public Class Methods

new() click to toggle source

    # File lib/puppet/network/http/webrick.rb, line 11
    def initialize
      @listening = false
      @mutex = Mutex.new
    end

### Public Instance Methods

listen(address, port) click to toggle source

    # File lib/puppet/network/http/webrick.rb, line 16
    def listen(address, port)
      arguments = {:BindAddress => address, :Port => port}
      arguments.merge!(setup_logger)
      arguments.merge!(setup_ssl)

      @server = WEBrick::HTTPServer.new(arguments)
      @server.listeners.each { |l| l.start_immediately = false }

      @server.mount('/', Puppet::Network::HTTP::WEBrickREST, :this_value_is_apparently_necessary_but_unused)

      @mutex.synchronize do
        raise "WEBrick server is already listening" if @listening
        @listening = true
        @thread = Thread.new {
          @server.start { |sock|
            raise "Client disconnected before connection could be established" unless IO.select([sock],nil,nil,6.2)
            sock.accept
            @server.run(sock)
          }
        }
        sleep 0.1 until @server.status == :Running
      end
    end

listening?() click to toggle source

    # File lib/puppet/network/http/webrick.rb, line 50
    def listening?
      @mutex.synchronize do
        @listening
      end
    end

setup_logger() click to toggle source

Configure our http log file.

    # File lib/puppet/network/http/webrick.rb, line 57
    def setup_logger
      # Make sure the settings are all ready for us.
      Puppet.settings.use(:main, :ssl, :application)

      if Puppet.run_mode.master?
        file = Puppet[:masterhttplog]
      else
        file = Puppet[:httplog]
      end

      # open the log manually to prevent file descriptor leak
      file_io = ::File.open(file, "a+")
      file_io.sync = true
      if defined?(Fcntl::FD_CLOEXEC)
        file_io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
      end

      args = [file_io]
      args << WEBrick::Log::DEBUG if Puppet::Util::Log.level == :debug

      logger = WEBrick::Log.new(*args)
      return :Logger => logger, :AccessLog => [
        [logger, WEBrick::AccessLog::COMMON_LOG_FORMAT ],
        [logger, WEBrick::AccessLog::REFERER_LOG_FORMAT ]
      ]
    end

setup_ssl() click to toggle source

Add all of the ssl cert information.

    # File lib/puppet/network/http/webrick.rb, line 85
    def setup_ssl
      results = {}

      # Get the cached copy.  We know it's been generated, too.
      host = Puppet::SSL::Host.localhost

      raise Puppet::Error, "Could not retrieve certificate for #{host.name} and not running on a valid certificate authority" unless host.certificate

      results[:SSLPrivateKey] = host.key.content
      results[:SSLCertificate] = host.certificate.content
      results[:SSLStartImmediately] = true
      results[:SSLEnable] = true
      results[:SSLOptions] = OpenSSL::SSL::OP_NO_SSLv2

      raise Puppet::Error, "Could not find CA certificate" unless Puppet::SSL::Certificate.indirection.find(Puppet::SSL::CA_NAME)

      results[:SSLCACertificateFile] = ssl_configuration.ca_auth_file
      results[:SSLVerifyClient] = OpenSSL::SSL::VERIFY_PEER

      results[:SSLCertificateStore] = host.ssl_store

      results
    end

unlisten() click to toggle source

    # File lib/puppet/network/http/webrick.rb, line 40
    def unlisten
      @mutex.synchronize do
        raise "WEBrick server is not listening" unless @listening
        @server.shutdown
        @thread.join
        @server = nil
        @listening = false
      end
    end