class Aio::Parse::Parser
Attributes
device_manager[RW]
input_klass[RW]
重要!在分析前需要确定input_klass input_klass
的类为input模块的类 Aio::Module::InputStyle
parser_machine[RW]
Public Class Methods
new(device_manager, parser_machine)
click to toggle source
# File lib/aio/core/parse/parser.rb, line 15 def initialize(device_manager, parser_machine) self.device_manager = device_manager self.parser_machine = parser_machine @invalid_input = Aio::Base::Toolkit::Regexp.merge([ Aio::Device::Cisco::InvalidInput, Aio::Device::H3C::InvalidInput, Aio::Device::Huawei::InvalidInput, Aio::Device::Maipu::InvalidInput, Aio::Device::Juniper::InvalidInput, ]) end
Public Instance Methods
invalid?(context)
click to toggle source
判断 context 是否有效
# File lib/aio/core/parse/parser.rb, line 72 def invalid?(context) return true if context.empty? return true if @invalid_input.match(context[1]) return false end
parse_by_compare(compare_klass)
click to toggle source
通过output/compare_xml生成的XML文件解析,直接将结果保存 compare_klass 为比较模块 其中只比较useful的值,并不会去比较warning warning 有原本device中以及比较中共同得出
# File lib/aio/core/parse/parser.rb, line 82 def parse_by_compare(compare_klass) # device_hash 为提供比较文件的hash print_good "正在将比较文件转换为内部Hash表" device_hash = @input_klass.parse compare_klass.device_manager = device_manager compare_klass.input_benchmark = device_hash compare_hash = compare_klass.parse device_manager.merge_warning(compare_hash) end
parse_by_compare_with_device_manager(compare_klass, other_device_manager)
click to toggle source
按照两个 device_manager
来进行比较
# File lib/aio/core/parse/parser.rb, line 94 def parse_by_compare_with_device_manager(compare_klass, other_device_manager) print_good '正在导入device_manager信息' compare_klass.device_manager = device_manager compare_klass.input_benchmark = other_device_manager compare_hash = compare_klass.parse device_manager.merge_warning(compare_hash) end
parse_by_module()
click to toggle source
通过巡检文件的方式获得关键信息,并按cmd模块逐个解析
# File lib/aio/core/parse/parser.rb, line 29 def parse_by_module # 注意这里manager_ip可有可无, 没有的话默认为nil print_good "正在加载信息..." @input_klass.parse do |device_name, cmd, context, manager_ip| device_info = { :device_name => device_name, :cmd => cmd.strip, :context => Aio::Text::Context.new(context), :manager_ip => manager_ip } # 判断 context 是否有效 next if invalid?(context) # 所有判断交到状态机处理 self.parser_machine.get_device(device_info) self.parser_machine.get_full(device_info) end print_good "信息加载完成" # 获取所有设备数量 total = device_manager.devices_number #Aio::Ui::Logger.instance.info = {devices_number: total} print_good "总共 #{total} 台设备" print_good "正在对各个设备进行分析..." device_manager.each_devices_with_index do |name, klass, i| # 将解析命令后,并修改了自身类的实例覆盖掉原来父类 progress_bar(total, i+1, name) # Debug处 if name == "CIB41_CS_H5500SW01" #debugger end new_klass = klass.parse device_manager[name] = new_klass.instance end clear_line print_good "设备信息分析完成" end