Class: Hotwired::Core
- Inherits:
-
Object
- Object
- Hotwired::Core
- Defined in:
- lib/hotwired/core.rb
Overview
类对象方法属性
Instance Method Summary collapse
-
#initialize(opts = {}) ⇒ Core
constructor
类对象初始化函数入口.
-
#ip2name(ip) ⇒ Object
解析 IP 关联的主机名.
-
#make_record(opt) ⇒ Object
新增表记录.
-
#poll(ip) ⇒ Object
轮询单个 IP 设备信息.
-
#resolve_networks(cidr) ⇒ Object
解析 cidr.
-
#run ⇒ Object
类对象外部调用函数入口.
Constructor Details
Instance Method Details
#ip2name(ip) ⇒ Object
解析 IP 关联的主机名
139 140 141 |
# File 'lib/hotwired/core.rb', line 139 def ip2name(ip) Resolv.getname ip rescue ip end |
#make_record(opt) ⇒ Object
新增表记录
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'lib/hotwired/core.rb', line 144 def make_record(opt) # 判断是否存在 sysObjectID,不存在则设置为 nil sys_object_id = opt[:oids][:sysObjectID].empty? ? nil : opt[:oids][:sysObjectID].join(".") # 返回数据结构 { ip: opt[:ip].to_s, ptr: ip2name(opt[:ip].to_s), model: Model.map(opt[:oids][:sysDescr], opt[:oids][:sysObjectID]), oid_ifDescr: opt[:int], oid_sysName: opt[:oids][:sysName], oid_sysLocation: opt[:oids][:sysLocation], oid_sysDescr: opt[:oids][:sysDescr], oid_sysObjectID: sys_object_id } end |
#poll(ip) ⇒ Object
轮询单个 IP 设备信息
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/hotwired/core.rb', line 106 def poll(ip) result = nil # 实例化 SNMP 对象,批量获取相关监控数据 snmp = SNMP.new(ip.to_s, @community) # 如有异常则返回 false oids = snmp.dbget if oids # 早期异常拦截 Log.debug "SNMP::NoSuchObject #{ip}" if oids[:sysDescr] == ::SNMP::NoSuchObject return nil if oids[:sysDescr] == ::SNMP::NoSuchObject # 初始化变量,并尝试刷新接口描述信息 result = { oids: oids, ip: ip, int: "n/a" } # 联机查询数据 index = snmp.ip2index(ip.to_s) # 逻辑处理 if index.nil? Log.debug "no ifIndex for #{ip}" else int = snmp.ifdescr(index) if int.nil? Log.debug "no ifDescr for #{index} at #{ip}" else result[:int] = int.downcase end end end # 关闭 SNMP 会话并返回结果 snmp.close result end |
#resolve_networks(cidr) ⇒ Object
解析 cidr
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/hotwired/core.rb', line 84 def resolve_networks(cidr) # 如未接收外部变量则使用缺省值 cidr = cidr ? [cidr].flatten : CFG.poll # 从 CIDR 中剔除排除清单 # 支持数组以及文本形式,数据返回包含2个数组对象的数组 [cidr, CFG.ignore].map do |nets| if nets.respond_to? :each nets.map { |net| IPAddr.new net } else out = [] File.read(nets).each_line do |net| # 模糊的 IP 地址正则表达式 net = net.match(/^([\d.\/]+)$/) out << IPAddr.new(net[1]) if net end out end end end |
#run ⇒ Object
类对象外部调用函数入口
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/hotwired/core.rb', line 42 def run # 解析变量 cidr = @opts.delete(:cidr) # @output = @opts.delete :output # 设置缺省 logger 输出 # unless @output # @output = Logger.new $stdout # @output.formatter = proc { |_, _, _, msg| "#{msg}\n" } # end # 初始化变量及遍历 CIDR poll, ignores = resolve_networks(cidr) # 实例化线程和数据库联结 @mutex = Mutex.new @db = DB.new threads = [] # 线程遇到异常及时终止 Thread.abort_on_exception = false # 遍历待轮询的 IPAddr poll.each do |net| net.to_range.each do |ip| # 检查当前地址是否需要被忽略 next if ignores.any? { |ignore| ignore.include? ip } # 清除空闲线程 while threads.size >= CFG.threads threads.delete_if { |thread| not thread.alive? } sleep 0.02 end # 线程不够则主动添加线程 threads << Thread.new do result = poll(ip) @mutex.synchronize { process result } if result end end end # 激活线程,开始干活 threads.each { |thread| thread.join } end |