lib/ring/sqa/nodes.rb in ring-sqa-0.0.19 vs lib/ring/sqa/nodes.rb in ring-sqa-0.0.20
- old
+ new
@@ -1,57 +1,91 @@
require 'rb-inotify'
require 'ipaddr'
+require 'json'
module Ring
class SQA
class Nodes
- FILE = '/etc/hosts'
- attr_reader :list
+ FILE = '/etc/hosts'
+ attr_reader :all
def run
Thread.new { @inotify.run }
end
+ def get node
+ (@all[node] or {})
+ end
+
private
def initialize
- @list = get_list
+ @all = read_nodes
@inotify = INotify::Notifier.new
@inotify.watch(File.dirname(FILE), :modify, :create) do |event|
- @list = get_list if event.name == FILE.split('/').last
+ @all = read_nodes if event.name == FILE.split('/').last
end
run
end
- def get_list
+ def read_nodes
Log.info "loading #{FILE}"
list = []
File.read(FILE).lines.each do |line|
entry = line.split(/\s+/)
next if entry_skip? entry
list << entry.first
end
- list.sort
+ nodes_hash list
+ rescue => error
+ Log.warn "#{error.class} raised with message '#{error.message}' while generating nodes list"
+ @all
end
+ def nodes_hash ips, file=CFG.nodes_json
+ nodes = {}
+ json = JSON.load File.read(file)
+ json['results']['nodes'].each do |node|
+ addr = CFG.ipv6? ? node['ipv6'] : node['ipv4']
+ next unless ips.include? addr
+ nodes[addr] = node
+ end
+ json_to_nodes_hash nodes
+ end
+
+ def json_to_nodes_hash from_json
+ nodes= {}
+ from_json.each do |ip, json|
+ node = {
+ name: json['hostname'],
+ ip: ip,
+ as: json['asn'],
+ cc: json['countrycode'],
+ }
+ next if CFG.host.name == node[:name]
+ nodes[ip] = node
+ end
+ nodes
+ end
+
+
def entry_skip? entry
return true unless entry.size > 2
- return true if entry.first.match /^\s*#/
+ return true if entry.first.match(/^\s*#/)
return true if CFG.hosts.ignore.any? { |re| entry[2].match Regexp.new(re) }
return true unless CFG.hosts.load.any? { |re| entry[2].match Regexp.new(re) }
address = IPAddr.new(entry.first) rescue (return true)
if CFG.ipv6?
return true if address.ipv4?
- return true if address == IPAddr.new(CFG.bind.ipv6)
+ return true if address == IPAddr.new(CFG.host.ipv6)
else
return true if address.ipv6?
- return true if address == IPAddr.new(CFG.bind.ipv4)
+ return true if address == IPAddr.new(CFG.host.ipv4)
end
false
end
-
end
end
end