#coding=utf-8 require "aio/core" class Aio::Module::Cmd::Cisco::ShowIpRouteSummary < Aio::Module::Cmd::Cisco include Aio::Module def initialize super({ :cmd_full => "show ip route summary", :cmd_short => "sh ip rou sum", :author => "Elin", :description => "This is Cisco Command# show ip route summary", :platform => "all", :benchmark => {} }) end def parse cont = self.context.dup summary = {} useful[:route_summary] = summary cont.readline_match_block(/Route Source Networks Subnets Replicates Overhead/) cont.readline_match_block(/connected (?\d+) (?\d+) (?\d+)/) do |block| summary_conn = {} summary[:connected] = summary_conn block.update(summary_conn, :networks) block.update(summary_conn, :subnets) block.update(summary_conn, :replicates) end cont.readline_match_block(/static (?\d+) (?\d+) (?\d+)/) do |block| summary_static = {} summary[:static] = summary_static block.update(summary_static, :networks) block.update(summary_static, :subnets) block.update(summary_static, :replicates) end loop do # 当出现 internal 则代表循环结束 if cont.count_line =~ /internal/ cont.readline_match_block(/internal (?\d+)/) do |block| summary[:internal] = {} block.update(summary[:internal], :networks) end break end # 当出现不是预想情况,则跳过 unless cont.count_line =~ /.*\s+\d+\s+\d+\s+\d+\s+\d+/ cont.next next end # 有的多一个Replicates,整个数值有可能是5,也有可能是4 # 但是后面的 Replicates Overhead Memory 不做考虑,直接忽略 cont.readline_match_block(/(?[^\d\s]+) (?\d+) (?\d+) (?\d+) (?\d+) .*/) do |block| proto = block[:proto] proto_id = block[:proto_id] summary_proto = {} summary["#{proto}_#{proto_id}".to_sym] = summary_proto block.update(summary_proto, :proto, proto) block.update(summary_proto, :proto_id) block.update(summary_proto, :networks) block.update(summary_proto, :subnets) block.update(summary_proto, :replicates) end end cont.readline_match_block(/Total (?\d+) (?\d+) (?\d+)/) do |block| summary_total = {} summary[:total] = summary_total block.update(summary_total, :networks) block.update(summary_total, :subnets) block.update(summary_total, :replicates) end end end