class Pencil::Config

Attributes

clusters[R]
dashboards[R]
global_config[R]
graphs[R]
hosts[R]

Public Class Methods

new() click to toggle source
# File lib/pencil/config.rb, line 14
def initialize
  port = 9292
  @rawconfig = {}
  @confdir = "."
  @recursive = false

  optparse = OptionParser.new do |o|
    o.on("-d", "--config-dir DIR",
      "location of the config directory (default .)") do |arg|
      @confdir = arg
      @recursive = true
    end
    o.on("-p", "--port PORT", "port to bind to (default 9292)") do |arg|
      port = arg.to_i
    end
  end

  optparse.parse!
  reload!
  @global_config[:port] = port
end

Public Instance Methods

reload!() click to toggle source
# File lib/pencil/config.rb, line 36
def reload!
  # only do a recursive search if "-d" is specified
  configs = Dir.glob("#{@confdir}/#{@recursive ? '**/' : ''}*.y{a,}ml")

  configs.each do |c|
    yml = YAML.load(File.read(c))
    next unless yml
    @rawconfig[:config] = yml[:config] if yml[:config]
    a = @rawconfig[:dashboards] 
    b = yml[:dashboards] 
    c = @rawconfig[:graphs]
    d = yml[:graphs]

    if a && b
      a.merge!(b)
    elsif b
      @rawconfig[:dashboards] = b
    end
    if c && d
      c.merge!(d)
    elsif d
      @rawconfig[:graphs] = d
    end
  end
  @rawconfig = Map(@rawconfig)

  [:graphs, :dashboards, :config].each do |c|
    if not @rawconfig[c.to_s]
      raise "Missing config name '#{c.to_s}'"
    end
  end

  @global_config = @rawconfig[:config]
  # do some sanity checking of other configuration parameters
  [:graphite_url, :url_opts].each do |c|
    if not @global_config[c]
      raise "Missing config name '#{c.to_s}'"
    end
  end

  # possibly check more url_opts here as well
  if @global_config[:url_opts][:start]
    if !ChronicDuration.parse(@global_config[:url_opts][:start])
      raise "bad default timespec in :url_opts"
    end
  end

  @global_config[:default_colors] ||=
    ["blue", "green", "yellow", "red", "purple", "brown", "aqua", "gold"]

  if @global_config[:refresh_rate]
    duration = ChronicDuration.parse(@global_config[:refresh_rate].to_s)
    if !duration
      raise "couldn't parse key :refresh_rate"
    end
    @global_config[:refresh_rate] = duration
  end

  @global_config[:metric_format] ||= "%m.%c.%h"
  if @global_config[:metric_format] !~ /%m/
    raise "missing metric (%m) in :metric_format"
  elsif @global_config[:metric_format] !~ /%c/
    raise "missing cluster (%c) in :metric_format"
  elsif @global_config[:metric_format] !~ /%h/
    raise "missing host (%h) in :metric_format"
  end

  graphs_new = []
  @rawconfig[:graphs].each do |name, config|
    graphs_new << Graph.new(name, config.merge(@global_config))
  end

  dashboards_new = []
  @rawconfig[:dashboards].each do |name, config|
    dashboards_new << Dashboard.new(name, config.merge(@global_config))
  end

  hosts_new = Set.new
  clusters_new = Set.new

  # generate host and cluster information at init time
  graphs_new.each do |g|
    hosts, clusters = g.hosts_clusters
    hosts.each { |h| hosts_new << h }
    clusters.each { |h| clusters_new << h }
  end

  @dashboards, @graphs = dashboards_new, graphs_new
  @hosts, @clusters = hosts_new, clusters_new
end