aio_elin 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +675 -0
- data/README.md +9 -0
- data/config.rb +39 -0
- data/lib/aio/base/debug.rb +30 -0
- data/lib/aio/base/toolkit/array.rb +24 -0
- data/lib/aio/base/toolkit/date.rb +46 -0
- data/lib/aio/base/toolkit/deep_clone.rb +10 -0
- data/lib/aio/base/toolkit/diff.rb +104 -0
- data/lib/aio/base/toolkit/excel_office.rb +421 -0
- data/lib/aio/base/toolkit/excel_wps.rb +437 -0
- data/lib/aio/base/toolkit/excel_wps.rb.bak +299 -0
- data/lib/aio/base/toolkit/ipaddr.rb +28 -0
- data/lib/aio/base/toolkit/os.rb +26 -0
- data/lib/aio/base/toolkit/regexp.rb +32 -0
- data/lib/aio/base/toolkit/string.rb +28 -0
- data/lib/aio/base/toolkit/table.rb +441 -0
- data/lib/aio/base/toolkit/test_diff.rb +9 -0
- data/lib/aio/base/toolkit/test_excel.rb +118 -0
- data/lib/aio/base/toolkit/test_word.rb +58 -0
- data/lib/aio/base/toolkit/word_wps.rb +492 -0
- data/lib/aio/base/toolkit.rb +18 -0
- data/lib/aio/base.rb +10 -0
- data/lib/aio/core/device/cisco.rb +13 -0
- data/lib/aio/core/device/cmd_switch.rb +113 -0
- data/lib/aio/core/device/h3c.rb +12 -0
- data/lib/aio/core/device/huawei.rb +10 -0
- data/lib/aio/core/device/juniper.rb +10 -0
- data/lib/aio/core/device/maipu.rb +11 -0
- data/lib/aio/core/device/methods.rb +233 -0
- data/lib/aio/core/device/methods.rb.bak +199 -0
- data/lib/aio/core/device/parent_device.rb +275 -0
- data/lib/aio/core/device.rb +15 -0
- data/lib/aio/core/device_manager.rb +207 -0
- data/lib/aio/core/module/cmd.rb +160 -0
- data/lib/aio/core/module/description.rb +67 -0
- data/lib/aio/core/module/input_style.rb +98 -0
- data/lib/aio/core/module/output_style.rb +80 -0
- data/lib/aio/core/module/platform.rb +30 -0
- data/lib/aio/core/module/ranking.rb +24 -0
- data/lib/aio/core/module/special_style.rb +30 -0
- data/lib/aio/core/module/template.rb +13 -0
- data/lib/aio/core/module.rb +15 -0
- data/lib/aio/core/module_loader.rb +161 -0
- data/lib/aio/core/module_loader.rb.bak +148 -0
- data/lib/aio/core/module_manager.rb +112 -0
- data/lib/aio/core/module_manager.rb.bak +78 -0
- data/lib/aio/core/parse/file.rb +19 -0
- data/lib/aio/core/parse/parser.rb +91 -0
- data/lib/aio/core/parse/parser_machine/bak/has_cmd_state.rb +14 -0
- data/lib/aio/core/parse/parser_machine/bak/has_context_state.rb +11 -0
- data/lib/aio/core/parse/parser_machine/bak/no_cmd_state.rb +11 -0
- data/lib/aio/core/parse/parser_machine/bak/no_context_state.rb +11 -0
- data/lib/aio/core/parse/parser_machine/full_state.rb +12 -0
- data/lib/aio/core/parse/parser_machine/has_device_state.rb +44 -0
- data/lib/aio/core/parse/parser_machine/no_device_state.rb +12 -0
- data/lib/aio/core/parse/parser_machine/parent_state.rb +26 -0
- data/lib/aio/core/parse/parser_machine.rb +47 -0
- data/lib/aio/core/parse.rb +6 -0
- data/lib/aio/core/text/context.rb +211 -0
- data/lib/aio/core/text/line_string.rb +74 -0
- data/lib/aio/core/text/warning.rb +179 -0
- data/lib/aio/core/text.rb +7 -0
- data/lib/aio/core/warning/description.rb +47 -0
- data/lib/aio/core/warning/warning_summarize.rb +232 -0
- data/lib/aio/core/warning.rb +6 -0
- data/lib/aio/core.rb +32 -0
- data/lib/aio/license.rb +687 -0
- data/lib/aio/resource/cover_picture.png +0 -0
- data/lib/aio/resource/line.png +0 -0
- data/lib/aio/resource/logo.png +0 -0
- data/lib/aio/ui/banner.rb +85 -0
- data/lib/aio/ui/readable_text.rb +75 -0
- data/lib/aio/ui/verbose.rb +29 -0
- data/lib/aio/ui/version.rb +9 -0
- data/lib/aio/ui.rb +138 -0
- data/lib/aio.rb +13 -0
- data/lib/modules/cmd/cisco/show_clock.rb +32 -0
- data/lib/modules/cmd/cisco/show_cpu.rb +32 -0
- data/lib/modules/cmd/cisco/show_env.rb +71 -0
- data/lib/modules/cmd/cisco/show_failover.rb +39 -0
- data/lib/modules/cmd/cisco/show_interface_ip_brief.rb +24 -0
- data/lib/modules/cmd/cisco/show_interfaces.rb +177 -0
- data/lib/modules/cmd/cisco/show_inv.rb +43 -0
- data/lib/modules/cmd/cisco/show_ip_interface_brief.rb +42 -0
- data/lib/modules/cmd/cisco/show_ip_ospf_nei.rb +38 -0
- data/lib/modules/cmd/cisco/show_ip_route_summary.rb +81 -0
- data/lib/modules/cmd/cisco/show_memory.rb +27 -0
- data/lib/modules/cmd/cisco/show_process_cpu.rb +35 -0
- data/lib/modules/cmd/cisco/show_process_memory.rb +63 -0
- data/lib/modules/cmd/cisco/show_version.rb +97 -0
- data/lib/modules/cmd/h3c/display_clock.rb +32 -0
- data/lib/modules/cmd/h3c/display_cpu.rb +51 -0
- data/lib/modules/cmd/h3c/display_device_manuinfo.rb +45 -0
- data/lib/modules/cmd/h3c/display_fan.rb +91 -0
- data/lib/modules/cmd/h3c/display_interface.rb +203 -0
- data/lib/modules/cmd/h3c/display_ip_interface_brief.rb +34 -0
- data/lib/modules/cmd/h3c/display_ip_routing.rb +68 -0
- data/lib/modules/cmd/h3c/display_ip_routing_stat.rb +90 -0
- data/lib/modules/cmd/h3c/display_memory.rb +35 -0
- data/lib/modules/cmd/h3c/display_ospf_peer.rb +38 -0
- data/lib/modules/cmd/h3c/display_power.rb +90 -0
- data/lib/modules/cmd/h3c/display_version.rb +54 -0
- data/lib/modules/cmd/h3c/display_vrrp_verbose.rb +86 -0
- data/lib/modules/cmd/maipu/show_env.rb +34 -0
- data/lib/modules/cmd/maipu/show_ip_route.rb +74 -0
- data/lib/modules/cmd/maipu/show_ip_route_statistic.rb +36 -0
- data/lib/modules/cmd/maipu/show_memory.rb +31 -0
- data/lib/modules/cmd/maipu/show_system_fan.rb +66 -0
- data/lib/modules/cmd/maipu/show_system_power.rb +66 -0
- data/lib/modules/cmd/maipu/show_version.rb +50 -0
- data/lib/modules/description/style/crc.rb +22 -0
- data/lib/modules/description/style/input_errors.rb +22 -0
- data/lib/modules/description/style/overrun.rb +22 -0
- data/lib/modules/description/style/proc_ratio.rb +22 -0
- data/lib/modules/description/style/protocol.rb +22 -0
- data/lib/modules/description/style/register.rb +22 -0
- data/lib/modules/description/style/runts.rb +22 -0
- data/lib/modules/description/style/template.rb +22 -0
- data/lib/modules/description/style/total_output_drops.rb +22 -0
- data/lib/modules/input/style/compare_xml.rb +89 -0
- data/lib/modules/input/style/console.rb +222 -0
- data/lib/modules/input/style/console.rb.bak +114 -0
- data/lib/modules/input/style/xinhua_nat.rb +70 -0
- data/lib/modules/output/style/boc_day.rb +223 -0
- data/lib/modules/output/style/cmds.rb +77 -0
- data/lib/modules/output/style/compare_json.rb +26 -0
- data/lib/modules/output/style/compare_report.rb +31 -0
- data/lib/modules/output/style/compare_xml.rb +86 -0
- data/lib/modules/output/style/excel_table_office.rb +407 -0
- data/lib/modules/output/style/excel_table_wps.rb +400 -0
- data/lib/modules/output/style/summary_report.rb +563 -0
- data/lib/modules/special/style/compare.rb +110 -0
- metadata +176 -0
@@ -0,0 +1,177 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowInterfaces < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show interfaces",
|
11
|
+
:cmd_short => "sh int",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show interfaces",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:input_queue_drops => ["<=", 10],
|
18
|
+
:total_output_drops => ["<=", 10],
|
19
|
+
:output_queue_drops => ["<=", 10],
|
20
|
+
:runts => ["<=", 10],
|
21
|
+
:giants => ["<=", 10],
|
22
|
+
:throttles => ["<=", 10],
|
23
|
+
:input_errors => ["<=", 10],
|
24
|
+
:crc => ["<=", 1000],
|
25
|
+
:frame => ["<=", 10],
|
26
|
+
:overrun => ["<=", 10],
|
27
|
+
:ignored => ["<=", 10],
|
28
|
+
:output_errors => ["<=", 10],
|
29
|
+
:collisions => ["<=", 10],
|
30
|
+
:iface_resets => ["<=", 10],
|
31
|
+
}
|
32
|
+
})
|
33
|
+
end
|
34
|
+
|
35
|
+
Reg_Ethernet = /Ethernet[^\.]+/
|
36
|
+
Reg_Loopback = /Loopback/
|
37
|
+
Reg_SubIface = /Ethernet.*[\.]/
|
38
|
+
|
39
|
+
def parse
|
40
|
+
cont = self.context.dup
|
41
|
+
useful[:interface] = {}
|
42
|
+
cont.readline_range_loop(/, line protocol/, /, line protocol/,
|
43
|
+
{:before => true}) do |cont_layer|
|
44
|
+
case device_template
|
45
|
+
when Template_3 # 当是ASA的时候
|
46
|
+
parse_asa(cont_layer)
|
47
|
+
else
|
48
|
+
switch_iface(cont_layer)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def switch_iface(context)
|
54
|
+
case context[0]
|
55
|
+
when Reg_Ethernet
|
56
|
+
parse_eth(context)
|
57
|
+
when Reg_Loopback
|
58
|
+
parse_eth(context)
|
59
|
+
when Reg_SubIface
|
60
|
+
parse_subiface(context)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def parse_asa(context)
|
65
|
+
iface = {}
|
66
|
+
iface_id = nil
|
67
|
+
|
68
|
+
context.readline_match_block(/Interface (?<iface_id>.*) "(?<side>.*)", is (?<state>.*), line protocol is (?<proto_state>.*)/) do |block|
|
69
|
+
iface_id = block[:iface_id].strip
|
70
|
+
useful[:interface][iface_id] = iface
|
71
|
+
block.update(iface, :iface_id)
|
72
|
+
block.update(iface, :side)
|
73
|
+
block.update(iface, :state)
|
74
|
+
block.update(iface, :proto_state)
|
75
|
+
end
|
76
|
+
|
77
|
+
return if iface.empty?
|
78
|
+
context.readline_match_block(/MAC address (?<mac>[^,]*)/) do |block|
|
79
|
+
block.update(iface, :mac)
|
80
|
+
end
|
81
|
+
context.readline_match_block(/IP address (?<addr>.*), subnet mask (?<mask>.*)/) do |block|
|
82
|
+
block.update(iface, :addr)
|
83
|
+
block.update(iface, :mask, Aio::Base::Toolkit::IPAddr.mask_dotted_to_i(block[:mask]).to_s)
|
84
|
+
end
|
85
|
+
iface_stat(context, iface)
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse_eth(context)
|
89
|
+
iface = {}
|
90
|
+
iface_id = nil
|
91
|
+
|
92
|
+
context.readline_match_block(/(?<iface_id>.*) is (?<state>.*), line protocol is (?<proto_state>.*)/) do |block|
|
93
|
+
iface_id = block[:iface_id].strip
|
94
|
+
useful[:interface][iface_id] = iface
|
95
|
+
block.update(iface, :iface_id)
|
96
|
+
block.update(iface, :state)
|
97
|
+
block.update(iface, :proto_state)
|
98
|
+
end
|
99
|
+
|
100
|
+
context.readline_match_block(/Hardware .* address is (?<mac>[^\s]*) /) do |block|
|
101
|
+
block.update(iface, :mac)
|
102
|
+
end
|
103
|
+
context.readline_match_block(/Description: (?<description>.*)/) do |block|
|
104
|
+
block.update(iface, :description)
|
105
|
+
end
|
106
|
+
context.readline_match_block(/Internet address is (?<addr>[^\/]+)\/(?<mask>\d+)/) do |block|
|
107
|
+
block.update(iface, :addr)
|
108
|
+
block.update(iface, :mask)
|
109
|
+
end
|
110
|
+
context.readline_match_block(/Encapsulation (?<encapsulation>[^\s]*)/) do |block|
|
111
|
+
block.update(iface, :encapsulation)
|
112
|
+
end
|
113
|
+
context.readline_match_block(/(?<duplex>.*[Dd]uplex), (?<speed>.*), /) do |block|
|
114
|
+
block.update(iface, :duplex)
|
115
|
+
block.update(iface, :speed)
|
116
|
+
end
|
117
|
+
iface_stat(context, iface)
|
118
|
+
end
|
119
|
+
|
120
|
+
# 接口的计数
|
121
|
+
def iface_stat(context, iface)
|
122
|
+
#只有当:state 为UP的才会进行下面的操作
|
123
|
+
if iface[:state] =~ /up/
|
124
|
+
context.readline_match_block(/Input queue: \d+\/\d+\/(?<input_queue_drops>\d+)\/\d+ \(size\/max\/drops\/flushes\); Total output drops: (?<total_output_drops>\d+)/) do |block|
|
125
|
+
block.warning_ordinary(iface, :input_queue_drops, self)
|
126
|
+
block.warning_ordinary(iface, :total_output_drops, self)
|
127
|
+
end
|
128
|
+
context.readline_match_block(/Output queue: \d+\/\d+\/(?<output_queue_drops>\d+) \(size\/max total\/drops\)/) do |block|
|
129
|
+
block.warning_ordinary(iface, :output_queue_drops, self)
|
130
|
+
end
|
131
|
+
context.readline_match_block(/(?<runts>\d+) runts, (?<giants>\d+) giants, (?<throttles>\d+) throttles/) do |block|
|
132
|
+
block.warning_ordinary(iface, :runts, self)
|
133
|
+
block.warning_ordinary(iface, :giants, self)
|
134
|
+
block.warning_ordinary(iface, :throttles, self)
|
135
|
+
end
|
136
|
+
context.readline_match_block(/(?<input_errors>\d+) input errors, (?<crc>\d+) CRC, (?<frame>\d+) frame, (?<overrun>\d+) overrun, (?<ignored>\d+) ignored/) do |block|
|
137
|
+
block.warning_serious(iface, :input_errors, self)
|
138
|
+
block.warning_serious(iface, :crc, self)
|
139
|
+
block.warning_ordinary(iface, :frame, self)
|
140
|
+
block.warning_ordinary(iface, :overrun, self)
|
141
|
+
block.warning_ordinary(iface, :ignored, self)
|
142
|
+
end
|
143
|
+
context.readline_match_block(/(?<output_errors>\d+) output errors, (?<collisions>\d+) collisions, (?<iface_resets>\d+) interface resets/) do |block|
|
144
|
+
block.warning_serious(iface, :output_errors, self)
|
145
|
+
block.warning_ordinary(iface, :collisions, self)
|
146
|
+
block.warning_ordinary(iface, :iface_resets, self)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def parse_subiface(context)
|
152
|
+
iface = {}
|
153
|
+
iface_id = nil
|
154
|
+
context.readline_match_block(/(?<iface_id>.*) is (?<state>.*), line protocol is (?<proto_state>.*)/) do |block|
|
155
|
+
iface_id = block[:iface_id]
|
156
|
+
useful[:interface][iface_id] = iface
|
157
|
+
update(iface, :iface_id)
|
158
|
+
update(iface, :state)
|
159
|
+
update(iface, :proto_state)
|
160
|
+
end
|
161
|
+
context.readline_match_block(/Hardware .* address is (?<mac>.*) /) do |block|
|
162
|
+
update(iface, :mac)
|
163
|
+
end
|
164
|
+
context.readline_match_block(/Description: (?<description>.*)/) do |block|
|
165
|
+
update(iface, :description)
|
166
|
+
end
|
167
|
+
context.readline_match_block(/Internet address is (?<addr>.*)/) do |block|
|
168
|
+
update(iface, :addr)
|
169
|
+
end
|
170
|
+
context.readline_match_block(/Encapsulation (?<encapsulation>.*) Virtual LAN, Vlan ID (?<vlan_id>.*)/) do |block|
|
171
|
+
update(iface, :encapsulation)
|
172
|
+
update(iface, :vlan_id)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowInv < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show inventory",
|
11
|
+
:cmd_short => "sh inv",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show inventory",
|
14
|
+
:platform => "all",
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse
|
19
|
+
context = self.context.dup
|
20
|
+
inv_info = {}
|
21
|
+
useful[:inventory] = inv_info
|
22
|
+
|
23
|
+
context.readline_range_loop(/NAME:/, reg_blank) do |cont|
|
24
|
+
slot_info = {}
|
25
|
+
name = ""
|
26
|
+
description = ""
|
27
|
+
|
28
|
+
cont.readline_match_block(/NAME: "(?<name>.*)", DESCR: "(?<description>.*)"/) do |block|
|
29
|
+
name = block[:name]
|
30
|
+
description = block[:description]
|
31
|
+
end
|
32
|
+
cont.readline_match_block(/PID: (?<pid>[^\s]+).*SN: (?<sn>[^\s]+)/) do |block|
|
33
|
+
sn = block[:sn]
|
34
|
+
inv_info[sn.to_sym] = slot_info
|
35
|
+
block.update(slot_info, :name, name)
|
36
|
+
block.update(slot_info, :description, description)
|
37
|
+
block.update(slot_info, :pid)
|
38
|
+
block.update(slot_info, :sn)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowIpInterfaceBrief < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show ip interface brief",
|
11
|
+
:cmd_short => "sh ip int b",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show ip interface brief",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => RS,
|
16
|
+
:benchmark => { }
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
context = self.context.dup
|
22
|
+
useful[:interface_brief] = {}
|
23
|
+
context.readline_match_block(/Interface IP-Address OK\? Method Status Protocol/) {|b|b}
|
24
|
+
context.readline_match_block_loop(/(?<interface_id>[^\s]+) (?<ip>[^\s]+) (?<ok>[^\s]+) (?<method>[^\s]+) (?<status>(?:administratively\s)?[^\s]+) (?<protocol>[^\s]+)/, reg_blank) do |block|
|
25
|
+
iface = {}
|
26
|
+
iface_id = block[:interface_id]
|
27
|
+
useful[:interface_brief][iface_id.to_sym] = iface
|
28
|
+
block.update(iface, :interface_id)
|
29
|
+
block.update(iface, :ip)
|
30
|
+
block.update(iface, :ok)
|
31
|
+
block.update(iface, :method)
|
32
|
+
block.update(iface, :status)
|
33
|
+
# 当状态是起来的,但是协议为Down,则纳入警告
|
34
|
+
if (block[:status] =~ /up/) and !(block[:protocol] =~ /up/)
|
35
|
+
block.warning_serious(iface, :protocol, self, {:force => true})
|
36
|
+
else
|
37
|
+
block.warning_serious(iface, :protocol, self, {:force => false})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowIpOspfNeighbor < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show ip ospf neighbor",
|
11
|
+
:cmd_short => "sh ip o n",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show ip ospf neighbor",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
context = self.context.dup
|
21
|
+
useful[:ospf_neighbor] = {}
|
22
|
+
context.readline_match_block(/Neighbor ID/) {|b|b}
|
23
|
+
count = 0
|
24
|
+
context.readline_match_block_loop(/(?<neighbor_id>[^\s]+) (?<pri>\d+) (?<state>[^\s]+) (.*) (?<address>[^\s]+) (?<interface>.*)/, reg_blank) do |block|
|
25
|
+
nei = {}
|
26
|
+
nei_id = block[:neighbor_id]
|
27
|
+
useful[:ospf_neighbor][nei_id.to_sym] = nei
|
28
|
+
block.update(nei, :neighbor_id)
|
29
|
+
block.update(nei, :pri)
|
30
|
+
block.update(nei, :state)
|
31
|
+
block.update(nei, :address)
|
32
|
+
block.update(nei, :interface)
|
33
|
+
count += 1
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowIpRouteSummary < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show ip route summary",
|
11
|
+
:cmd_short => "sh ip rou sum",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show ip route summary",
|
14
|
+
:platform => "all",
|
15
|
+
:benchmark => {}
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
cont = self.context.dup
|
21
|
+
summary = {}
|
22
|
+
useful[:route_summary] = summary
|
23
|
+
|
24
|
+
cont.readline_match_block(/Route Source Networks Subnets Replicates Overhead/)
|
25
|
+
cont.readline_match_block(/connected (?<networks>\d+) (?<subnets>\d+) (?<replicates>\d+)/) do |block|
|
26
|
+
summary_conn = {}
|
27
|
+
summary[:connected] = summary_conn
|
28
|
+
block.update(summary_conn, :networks)
|
29
|
+
block.update(summary_conn, :subnets)
|
30
|
+
block.update(summary_conn, :replicates)
|
31
|
+
end
|
32
|
+
|
33
|
+
cont.readline_match_block(/static (?<networks>\d+) (?<subnets>\d+) (?<replicates>\d+)/) do |block|
|
34
|
+
summary_static = {}
|
35
|
+
summary[:static] = summary_static
|
36
|
+
block.update(summary_static, :networks)
|
37
|
+
block.update(summary_static, :subnets)
|
38
|
+
block.update(summary_static, :replicates)
|
39
|
+
end
|
40
|
+
|
41
|
+
loop do
|
42
|
+
# 当出现 internal 则代表循环结束
|
43
|
+
if cont.count_line =~ /internal/
|
44
|
+
cont.readline_match_block(/internal (?<networks>\d+)/) do |block|
|
45
|
+
summary[:internal] = {}
|
46
|
+
block.update(summary[:internal], :networks)
|
47
|
+
end
|
48
|
+
break
|
49
|
+
end
|
50
|
+
|
51
|
+
# 当出现不是预想情况,则跳过
|
52
|
+
unless cont.count_line =~ /.*\s+\d+\s+\d+\s+\d+\s+\d+/
|
53
|
+
cont.next
|
54
|
+
next
|
55
|
+
end
|
56
|
+
|
57
|
+
# 有的多一个Replicates,整个数值有可能是5,也有可能是4
|
58
|
+
# 但是后面的 Replicates Overhead Memory 不做考虑,直接忽略
|
59
|
+
cont.readline_match_block(/(?<proto>[^\d\s]+) (?<proto_id>\d+) (?<networks>\d+) (?<subnets>\d+) (?<replicates>\d+) .*/) do |block|
|
60
|
+
proto = block[:proto]
|
61
|
+
proto_id = block[:proto_id]
|
62
|
+
summary_proto = {}
|
63
|
+
summary["#{proto}_#{proto_id}".to_sym] = summary_proto
|
64
|
+
block.update(summary_proto, :proto, proto)
|
65
|
+
block.update(summary_proto, :proto_id)
|
66
|
+
block.update(summary_proto, :networks)
|
67
|
+
block.update(summary_proto, :subnets)
|
68
|
+
block.update(summary_proto, :replicates)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
cont.readline_match_block(/Total (?<networks>\d+) (?<subnets>\d+) (?<replicates>\d+)/) do |block|
|
73
|
+
summary_total = {}
|
74
|
+
summary[:total] = summary_total
|
75
|
+
block.update(summary_total, :networks)
|
76
|
+
block.update(summary_total, :subnets)
|
77
|
+
block.update(summary_total, :replicates)
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
class Aio::Module::Cmd::Cisco::ShowMemory < Aio::Module::Cmd::Cisco
|
4
|
+
include Aio::Module
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
super({
|
8
|
+
:cmd_full => "show memory",
|
9
|
+
:cmd_short => "sh mem",
|
10
|
+
:author => "Elin",
|
11
|
+
:description => "This is Cisco ASA Command# show memory",
|
12
|
+
:ranking => Ranking_1,
|
13
|
+
:platform => "asa",
|
14
|
+
:benchmark => {
|
15
|
+
:proc_ratio => ["<", 70.0],
|
16
|
+
}
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
cont = self.context.dup
|
22
|
+
useful[:memory] = {}
|
23
|
+
cont.readline_match_block(/Used memory: .* bytes \((?<proc_ratio>\d+)%/) do |block|
|
24
|
+
block.warning_serious(useful[:memory], :proc_ratio, self, {:string => block[:proc_ratio]})
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowProcessCPU < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show process cpu",
|
11
|
+
:cmd_short => "sh pro cpu",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show process cpu",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:seconds_5 => ["<", 50],
|
18
|
+
:minute_1 => ["<", 50],
|
19
|
+
:minutes_5 => ["<", 50],
|
20
|
+
}
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse
|
25
|
+
cont = self.context.dup
|
26
|
+
cpu = {}
|
27
|
+
useful[:cpu] = cpu
|
28
|
+
|
29
|
+
cont.readline_match_block(/one minute: (?<minute_1>\d+)%; five minutes: (?<minutes_5>\d+)%/) do |block|
|
30
|
+
#block.warning_serious(cpu, :seconds_5, self)
|
31
|
+
#block.warning_serious(cpu, :minute_1, self)
|
32
|
+
block.warning_serious(cpu, :minutes_5, self)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowProcessMemory < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show process memory",
|
11
|
+
:cmd_short => "sh pro m",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show process memory",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:proc_ratio => ["<", 70.0],
|
18
|
+
:io_ratio => ["<", 70.0]
|
19
|
+
}
|
20
|
+
})
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse
|
24
|
+
cont = self.context.dup
|
25
|
+
useful[:memory] = {}
|
26
|
+
|
27
|
+
case device_template
|
28
|
+
when Template_1
|
29
|
+
parse_def(cont)
|
30
|
+
when Template_2
|
31
|
+
if device_version =~ /12.2\(33\)/ # 当是Cisco7606 的时候,即使是12.2(17r)S4,Memory的模板也是默认模板
|
32
|
+
parse_def(cont)
|
33
|
+
else
|
34
|
+
parse_tmp_2(cont)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_tmp_2(cont)
|
40
|
+
cont.readline_match_block(/System Memory : (?<proc_total>\d+)K total, (?<proc_used>\d+)K used/) do |block|
|
41
|
+
proc_ratio = ratio(block[:proc_used], block[:proc_total])
|
42
|
+
block.warning_serious(useful[:memory], :proc_ratio, self, {:string => proc_ratio})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_def(cont)
|
47
|
+
cont.readline_match_block(/Processor Pool Total: (?<proc_total>\d+) Used: (?<proc_used>\d+)/) do |block|
|
48
|
+
proc_ratio = ratio(block[:proc_used], block[:proc_total])
|
49
|
+
block.warning_serious(useful[:memory], :proc_ratio, self, {:string => proc_ratio})
|
50
|
+
end
|
51
|
+
cont.readline_match_block(/I\/O Pool Total: (?<io_total>\d+) Used: (?<io_used>\d+)/) do |block|
|
52
|
+
io_ratio = ratio(block[:io_used], block[:io_total])
|
53
|
+
#block.warning_serious(useful[:memory], :io_ratio, self, io_ratio)
|
54
|
+
block.update(useful[:memory], :io_ratio, io_ratio)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# 返回为String
|
59
|
+
def ratio(fir, sec)
|
60
|
+
format("%.2f", ((fir.to_f / sec.to_f) * 100))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
@@ -0,0 +1,97 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Cisco::ShowVersion < Aio::Module::Cmd::Cisco
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show version",
|
11
|
+
:cmd_short => "sh ver",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Cisco Command# show version",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:key_stand => true,
|
16
|
+
:platform => "all",
|
17
|
+
:benchmark => {
|
18
|
+
:register => ["==", "0x2102", "0xF", "0x1", "0x10F"],
|
19
|
+
},
|
20
|
+
:license => Aio::AIO_LICENSE})
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse
|
24
|
+
cont = self.context.dup
|
25
|
+
soft_info = {}
|
26
|
+
useful[:software] = soft_info
|
27
|
+
|
28
|
+
cont.readline_match_block(/Cisco (?<info>.*)/) do |block|
|
29
|
+
key_stand_cisco
|
30
|
+
case block[:info]
|
31
|
+
when /Adaptive Security Appliance/
|
32
|
+
ver = /Software Version (?<version>.*)/.match(block[:info])
|
33
|
+
block.update(soft_info, :version, ver[:version])
|
34
|
+
key_stand_version(ver[:version])
|
35
|
+
parse_asa(cont, soft_info)
|
36
|
+
else
|
37
|
+
parse_def(cont, soft_info)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# ASA 系列
|
43
|
+
def parse_asa(cont, soft_info)
|
44
|
+
cont.readline_match_block(/System image file is "(?<soft_image>)"/) do |block|
|
45
|
+
block.update(soft_info, :soft_image)
|
46
|
+
end
|
47
|
+
cont.readline_match_block(/up (?<uptime>.*)/) do |block|
|
48
|
+
block.update(soft_info, :uptime)
|
49
|
+
end
|
50
|
+
cont.readline_match_block(/failover cluster up (?<uptime_failover>.*)/) do |block|
|
51
|
+
block.update(soft_info, :uptime_failover)
|
52
|
+
end
|
53
|
+
cont.readline_match_block(/Hardware: (?<device_model>.[^,]+),/) do |block|
|
54
|
+
block.update(soft_info, :device_model)
|
55
|
+
key_stand_model(block[:device_model])
|
56
|
+
key_stand_template Template_3 # 当是asa时使用模板3
|
57
|
+
end
|
58
|
+
cont.readline_match_block(/Serial Number: (?<sn>.*)/) do |block|
|
59
|
+
block.update(soft_info, :sn)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# 包括了一般的以及 7600 系列
|
64
|
+
def parse_def(cont, soft_info)
|
65
|
+
cont.readline_match_block(/Version (?<version>.*),/) do |block|
|
66
|
+
block.update(soft_info, :version)
|
67
|
+
key_stand_version(block[:version])
|
68
|
+
end
|
69
|
+
cont.readline_match_block(/(?<device_name>.*) uptime is (?<uptime>.*)/) do |block|
|
70
|
+
block.update(soft_info, :device_name)
|
71
|
+
block.update(soft_info, :uptime)
|
72
|
+
end
|
73
|
+
cont.readline_match_block(/System image file is "(?<soft_image>.*)"/) do |block|
|
74
|
+
block.update(soft_info, :soft_image)
|
75
|
+
end
|
76
|
+
cont.readline_match_block(//)
|
77
|
+
cont.readline_match_block(/^[Cc]isco (?<device_model>[^\s]+)/) do |block|
|
78
|
+
block.update(soft_info, :device_model)
|
79
|
+
key_stand_model(block[:device_model])
|
80
|
+
case block[:device_model]
|
81
|
+
when /76|65/ # 当是7600的时候,使用模板2
|
82
|
+
key_stand_template Template_2
|
83
|
+
else
|
84
|
+
key_stand_template Template_1
|
85
|
+
end
|
86
|
+
end
|
87
|
+
cont.readline_match_block(/Processor board ID (?<board_id>.*)/) do |block|
|
88
|
+
block.update(soft_info, :board_id)
|
89
|
+
end
|
90
|
+
cont.readline_match_block(/Configuration register is (?<register>.*)/) do |block|
|
91
|
+
block.warning_serious(soft_info, :register, self)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayClock < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display clock",
|
11
|
+
:cmd_short => "dis clo",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display clock",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
context = self.context.dup
|
21
|
+
clock = {}
|
22
|
+
useful[:clock] = clock
|
23
|
+
context.readline_match_block(/(?<time>[^\s]+) (?<zone>[^\s]+) (?<week>[^\s]+) (?<month>\d+)\/(?<day>\d+)\/(?<year>\d+)/) do |block|
|
24
|
+
block.update(clock, :time)
|
25
|
+
block.update(clock, :zone)
|
26
|
+
block.update(clock, :week)
|
27
|
+
block.update(clock, :year)
|
28
|
+
block.update(clock, :month)
|
29
|
+
block.update(clock, :day)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayCpu < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display cpu-usage",
|
11
|
+
:cmd_short => "dis cpu",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display cpu-usage",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:seconds_5 => ["<", 50],
|
18
|
+
:minute_1 => ["<", 50],
|
19
|
+
:minutes_5 => ["<", 50],
|
20
|
+
},
|
21
|
+
})
|
22
|
+
end
|
23
|
+
|
24
|
+
def parse
|
25
|
+
cont = self.context.dup
|
26
|
+
useful[:cpu] = {}
|
27
|
+
loop do
|
28
|
+
cont.readline_range(/Slot \d+ CPU usage/, reg_blank) do |cont_layer|
|
29
|
+
parse_cpu(cont_layer)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_cpu(context)
|
35
|
+
cpu = {}
|
36
|
+
useful[:cpu] = cpu
|
37
|
+
context.readline_match_block(/Slot (?<slot_id>\d+) CPU/) do |block|
|
38
|
+
block.update(cpu, :slot_id)
|
39
|
+
end
|
40
|
+
context.readline_match_block(/(?<seconds_5>\d+)% in last 5 seconds/) do |block|
|
41
|
+
block.warning_serious(cpu, :seconds_5, self)
|
42
|
+
end
|
43
|
+
context.readline_match_block(/(?<minute_1>\d+)% in last 1 minute/) do |block|
|
44
|
+
block.warning_serious(cpu, :minute_1, self)
|
45
|
+
end
|
46
|
+
context.readline_match_block(/(?<minutes_5>\d+)% in last 5 minutes/) do |block|
|
47
|
+
block.warning_serious(cpu, :minutes_5, self)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|