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,45 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayDeviceManuinfo < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display device manuinfo",
|
11
|
+
:cmd_short => "dis dev m",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display device manuinfo",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
context = self.context.dup
|
21
|
+
inv_info = {}
|
22
|
+
useful[:inventory] = inv_info
|
23
|
+
|
24
|
+
context.readline_range_loop(/:/, reg_blank) do |cont|
|
25
|
+
slot_info = {}
|
26
|
+
name = ""
|
27
|
+
pid = ""
|
28
|
+
|
29
|
+
cont.readline_match_block(/(?<name>[^:]+):/) do |block|
|
30
|
+
name = block[:name]
|
31
|
+
end
|
32
|
+
cont.readline_match_block(/DEVICE_NAME : (?<pid>.*)/) do |block|
|
33
|
+
pid = block[:pid]
|
34
|
+
end
|
35
|
+
cont.readline_match_block(/DEVICE_SERIAL_NUMBER : (?<sn>.*)/) do |block|
|
36
|
+
sn = block[:sn]
|
37
|
+
inv_info[sn.to_sym] = slot_info
|
38
|
+
block.update(slot_info, :name, name)
|
39
|
+
block.update(slot_info, :description, "H3C")
|
40
|
+
block.update(slot_info, :pid, pid)
|
41
|
+
block.update(slot_info, :sn)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayFan < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display fan",
|
11
|
+
:cmd_short => "dis fan",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display fan",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:fan_status => ["=~", /Normal/],
|
18
|
+
},
|
19
|
+
})
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse
|
23
|
+
cont = self.context.dup
|
24
|
+
useful[:fan] = {}
|
25
|
+
case device_template
|
26
|
+
when Template_1
|
27
|
+
cont.readline_range_loop(/Slot/, /Slot/) do |cont_layer|
|
28
|
+
parse_slot(cont_layer)
|
29
|
+
end
|
30
|
+
when Template_2
|
31
|
+
cont.readline_range_loop(/Unit/, /Unit/) do |cont_layer|
|
32
|
+
parse_unit(cont_layer)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
=begin
|
39
|
+
# 遇到的有两种情况,开头是Slot 或者是 Unit
|
40
|
+
def parse_def(context)
|
41
|
+
case context[0]
|
42
|
+
when /Slot/
|
43
|
+
parse_slot(context)
|
44
|
+
when /Unit/
|
45
|
+
parse_unit(context)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
=end
|
49
|
+
|
50
|
+
def parse_slot(context)
|
51
|
+
fan = {}
|
52
|
+
context.readline_match_block(/Slot (?<slot_id>\d+)/) do |block|
|
53
|
+
useful[:fan] = {}
|
54
|
+
useful[:fan]["slot_#{block[:slot_id]}"] = fan
|
55
|
+
block.update(fan, :slot_id)
|
56
|
+
end
|
57
|
+
context.readline_range_loop(/FAN \d+/, reg_blank) do |cont_layer|
|
58
|
+
parse_slot_2(cont_layer, fan)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_slot_2(context, fan)
|
63
|
+
fan_id = nil
|
64
|
+
context.readline_match_block(/FAN (?<fan_id>\d+)/) do |block|
|
65
|
+
fan_id = block[:fan_id]
|
66
|
+
fan["fan_#{fan_id}"] = {}
|
67
|
+
block.update(fan["fan_#{fan_id}"], :fan_id)
|
68
|
+
end
|
69
|
+
context.readline_match_block(/State : (?<fan_status>.*)/) do |block|
|
70
|
+
block.warning_serious(fan["fan_#{fan_id}"], :fan_status, self)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_unit(context)
|
75
|
+
fan = {}
|
76
|
+
context.readline_match_block(/Unit (?<slot_id>\d+)/) do |block|
|
77
|
+
useful[:fan]["slot_#{block[:slot_id]}"] = fan
|
78
|
+
block.update(fan, :slot_id)
|
79
|
+
end
|
80
|
+
context.readline_match_block_loop(/Fan (?<fan_id>\d+) State: (?<fan_status>.*)/, reg_blank) do |block|
|
81
|
+
fan_id = block[:fan_id]
|
82
|
+
fan["fan_#{fan_id}"] = {}
|
83
|
+
block.update(fan["fan_#{fan_id}"], :fan_id)
|
84
|
+
block.warning_serious(fan["fan_#{fan_id}"], :fan_status, self)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
|
@@ -0,0 +1,203 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayInterface < Aio::Module::Cmd::H3C
|
6
|
+
|
7
|
+
include Aio::Module
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super({
|
11
|
+
:cmd_full => "display interface",
|
12
|
+
:cmd_short => "dis inter",
|
13
|
+
:author => "Elin",
|
14
|
+
:description => "This is H3C Command# display interface",
|
15
|
+
:ranking => Ranking_1,
|
16
|
+
:platform => "switch",
|
17
|
+
:benchmark => {
|
18
|
+
:duplex => ["=~", /full/],
|
19
|
+
:input_errors => ["<", 10],
|
20
|
+
:output_errors => ["<", 10],
|
21
|
+
:runts => ["<", 10],
|
22
|
+
:giants => ["<", 10],
|
23
|
+
:throttles => ["<", 10],
|
24
|
+
:crc => ["<", 1000],
|
25
|
+
:frame => ["<", 10],
|
26
|
+
:overruns => ["<", 10],
|
27
|
+
:aborts => ["<", 10],
|
28
|
+
:underruns => ["<", 10],
|
29
|
+
:deferred => ["<", 10],
|
30
|
+
:carrier => ["<", 10],
|
31
|
+
:input_drops => ["<", 10],
|
32
|
+
:output_drops => ["<", 10],
|
33
|
+
:collisions => ["<", 10],
|
34
|
+
:last_collisions => ["<", 10],
|
35
|
+
:lost_carrier => ["<", 10],
|
36
|
+
}
|
37
|
+
})
|
38
|
+
end
|
39
|
+
|
40
|
+
Reg_Bridge_Aggregation = /Bridge-Aggregation/
|
41
|
+
Reg_Ethernet = /Ethernet/
|
42
|
+
Reg_Loopback = /LoopBack/
|
43
|
+
Reg_Vlanif = /Vlan/
|
44
|
+
|
45
|
+
def parse
|
46
|
+
cont = self.context.dup
|
47
|
+
useful[:interface] = {}
|
48
|
+
loop do
|
49
|
+
cont.readline_range(/.*/, reg_blank) do |cont_layer|
|
50
|
+
switch_iface(cont_layer)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def switch_iface(context)
|
56
|
+
i = 0
|
57
|
+
while(i < 5)
|
58
|
+
if context[i] =~ /current/
|
59
|
+
break
|
60
|
+
end
|
61
|
+
i += 1
|
62
|
+
end
|
63
|
+
case context[i]
|
64
|
+
when Reg_Bridge_Aggregation
|
65
|
+
parse_bridge(context)
|
66
|
+
when Reg_Ethernet
|
67
|
+
parse_eth(context)
|
68
|
+
when Reg_Loopback
|
69
|
+
parse_loopback(context)
|
70
|
+
when Reg_Vlanif
|
71
|
+
parse_vlanif(context)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def parse_bridge(context)
|
76
|
+
iface = {}
|
77
|
+
iface_id = nil
|
78
|
+
context.readline_match_block(/(?<iface_id>Bridge-Aggregation\d+) current state\s?:\s?(?<state>.*)/) do |block|
|
79
|
+
iface_id = block[:iface_id]
|
80
|
+
useful[:interface][iface_id] = iface
|
81
|
+
block.update(iface, :iface_id)
|
82
|
+
block.update(iface, :state)
|
83
|
+
end
|
84
|
+
context.readline_match_block(/IP Packet Frame Type: PKTFMT_ETHNT_2, Hardware Address: (?<mac>.*)/) do |block|
|
85
|
+
block.update(iface, :mac)
|
86
|
+
end
|
87
|
+
context.readline_match_block(/Description: (?<description>.*)/) do |block|
|
88
|
+
block.update(iface, :description)
|
89
|
+
end
|
90
|
+
context.readline_match_block(/(?<speed>.*) mode, (?<duplex>.*) mode/) do |block|
|
91
|
+
block.update(iface, :speed)
|
92
|
+
block.warning_serious(iface, :duplex, self) if iface[:state] =~ /UP/
|
93
|
+
end
|
94
|
+
context.readline_match_block(/Port link-type: (?<link_type>.*)/) do |block|
|
95
|
+
block.update(iface, :link_type)
|
96
|
+
end
|
97
|
+
same_line_1(context, iface, iface_id) if iface[:state] =~ /UP/
|
98
|
+
end
|
99
|
+
|
100
|
+
def parse_eth(context)
|
101
|
+
iface = {}
|
102
|
+
iface_id = nil
|
103
|
+
context.readline_match_block(/(?<iface_id>.*) current state\s?:\s?(?<state>.*)/) do |block|
|
104
|
+
iface_id = block[:iface_id].strip
|
105
|
+
useful[:interface][iface_id] = iface
|
106
|
+
block.update(iface, :iface_id)
|
107
|
+
block.update(iface, :state)
|
108
|
+
end
|
109
|
+
return if iface.nil?
|
110
|
+
context.readline_match_block(/Hardware Address: (?<mac>.*)/) do |block|
|
111
|
+
block.update(iface, :mac)
|
112
|
+
end
|
113
|
+
context.readline_match_block(/Description: (?<description>.*)/) do |block|
|
114
|
+
block.update(iface, :description)
|
115
|
+
end
|
116
|
+
context.readline_match_block(/(?<speed>.*) mode, (?<duplex>.*) mode/) do |block|
|
117
|
+
block.update(iface, :speed)
|
118
|
+
block.warning_serious(iface, :duplex, self) if iface[:state] =~ /UP/
|
119
|
+
end
|
120
|
+
same_line_1(context, iface, iface_id) if iface[:state] =~ /UP/
|
121
|
+
end
|
122
|
+
|
123
|
+
def same_line_1(context, iface, iface_id)
|
124
|
+
context.readline_match_block(/Input: (?<input_errors>\d+) input errors, (?<runts>\d+) runts, (?<giants>\d+) giants, (?<throttles>\d+) throttles/) do |block|
|
125
|
+
#####
|
126
|
+
block.warning_ordinary(iface, :input_errors, self)
|
127
|
+
block.warning_ordinary(iface, :runts, self)
|
128
|
+
block.warning_ordinary(iface, :giants, self)
|
129
|
+
block.warning_ordinary(iface, :throttles, self)
|
130
|
+
end
|
131
|
+
context.readline_match_block(/(?<crc>\d+) CRC, (?<frame>\d+) frame, - overruns, (?<aborts>\d+) aborts/) do |block|
|
132
|
+
block.warning_serious(iface, :crc, self)
|
133
|
+
block.warning_ordinary(iface, :frame, self)
|
134
|
+
block.warning_ordinary(iface, :aborts, self)
|
135
|
+
end
|
136
|
+
context.readline_match_block(/Output: (?<output_errors>\d+) output errors, - underruns, - buffer failures/) do |block|
|
137
|
+
block.warning_ordinary(iface, :output_errors, self)
|
138
|
+
end
|
139
|
+
context.readline_match_block(/(?<aborts>\d+) aborts, (?<deferred>\d+) deferred, (?<collisions>\d+) collisions, (?<last_collisions>\d+) late collisions/) do |block|
|
140
|
+
block.warning_ordinary(iface, :aborts, self)
|
141
|
+
block.warning_ordinary(iface, :deferred, self)
|
142
|
+
block.warning_ordinary(iface, :collisions, self)
|
143
|
+
block.warning_ordinary(iface, :last_collisions, self)
|
144
|
+
end
|
145
|
+
|
146
|
+
context.readline_match_block(/(?<lost_carrier>\d+) lost carrier/) do |block|
|
147
|
+
block.warning_ordinary(iface, :lost_carrier, self)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def parse_loopback(context)
|
152
|
+
iface = {}
|
153
|
+
iface_id = nil
|
154
|
+
context.readline_match_block(/(?<iface_id>LoopBack\d+) current state\s?:\s?(?<state>.*)/) do |block|
|
155
|
+
iface_id = block[:iface_id]
|
156
|
+
useful[:interface][iface_id] = iface
|
157
|
+
block.update(iface, :iface_id)
|
158
|
+
block.update(iface, :state)
|
159
|
+
end
|
160
|
+
same_line_2(context, iface, iface_id)
|
161
|
+
end
|
162
|
+
|
163
|
+
def parse_vlanif(context)
|
164
|
+
iface = {}
|
165
|
+
iface_id = nil
|
166
|
+
context.readline_match_block(/(?<iface_id>.*) current state: (?<state>.*)/) do |block|
|
167
|
+
iface_id = block[:iface_id]
|
168
|
+
useful[:interface][iface_id] = iface
|
169
|
+
block.update(iface, :iface_id)
|
170
|
+
block.update(iface, :state)
|
171
|
+
end
|
172
|
+
same_line_2(context, iface, iface_id)
|
173
|
+
end
|
174
|
+
|
175
|
+
def same_line_2(context, iface, iface_id)
|
176
|
+
context.readline_match_block(/Line protocol current state: (?<proto_state>.*)/) do |block|
|
177
|
+
block.update(iface, :proto_state)
|
178
|
+
end
|
179
|
+
context.readline_match_block(/Description: (?<description>.*)/) do |block|
|
180
|
+
block.update(iface, :description)
|
181
|
+
end
|
182
|
+
context.readline_match_block(/Internet (?<addr>.*)/) do |block|
|
183
|
+
if block[:addr] =~ /Address (.*) Primary/
|
184
|
+
block.update(iface, :ip_addr, $1)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
context.readline_match_block(/Hardware Address: (?<mac>.*)/) do |block|
|
188
|
+
block.update(iface, :mac)
|
189
|
+
end
|
190
|
+
|
191
|
+
if iface[:state] =~ /UP/
|
192
|
+
context.readline_match_block(/input, \d+ bytes, (?<input_drops>\d+) drops/) do |block|
|
193
|
+
block.warning_ordinary(iface, :input_drops, self)
|
194
|
+
end
|
195
|
+
context.readline_match_block(/output, \d+ bytes, (?<output_drops>\d+) drops/) do |block|
|
196
|
+
block.warning_ordinary(iface, :output_drops, self)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayIpInterfaceBrief < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display ip interface brief",
|
11
|
+
:cmd_short => "dis ip int b",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display ip interface brief",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
context = self.context.dup
|
21
|
+
useful[:interface_brief] = {}
|
22
|
+
context.readline_match_block(/Interface Physical Protocol IP Address/) {|b|b}
|
23
|
+
context.readline_match_block_loop(/(?<interface_id>[^\s]+) (?<status>[^\s]+) (?<protocol>[^\s]+) (?<ip>[^\s]+)/, reg_blank) do |block|
|
24
|
+
iface = {}
|
25
|
+
iface_id = block[:interface_id]
|
26
|
+
useful[:interface_brief][iface_id.to_sym] = iface
|
27
|
+
block.update(iface, :interface_id)
|
28
|
+
block.update(iface, :ip)
|
29
|
+
block.update(iface, :status)
|
30
|
+
block.update(iface, :protocol)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayIpRouting < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display ip routing-table",
|
11
|
+
:cmd_short => "dis ip rout",
|
12
|
+
:author => "Elin",
|
13
|
+
:ranking => Ranking_2,
|
14
|
+
:description => "This is H3C Command# display ip routing-table",
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {}
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
cont = self.context.dup
|
22
|
+
routing = {}
|
23
|
+
useful[:routing] = routing
|
24
|
+
|
25
|
+
cont.readline_match_block(/Destinations : (?<destinations>\d+) Routes : (?<routes>\d+)/) do |block|
|
26
|
+
block.update(routing, :destinations)
|
27
|
+
block.update(routing, :routes)
|
28
|
+
end
|
29
|
+
cont.readline_match_block(//)
|
30
|
+
cont.readline_match_block(/Destination\/Mask Proto Pre Cost NextHop Interface/)
|
31
|
+
cont.readline_match_block(//)
|
32
|
+
loop do
|
33
|
+
cont.readline_range_if(/^\d+/, /^\s+/) do |cont_layer|
|
34
|
+
parse_routing(cont_layer)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def parse_routing(context)
|
40
|
+
router = nil
|
41
|
+
context.readline_match_block(/(?<dest>[^\s]*) (?<proto>[^\s]*) (?<pre>\d+) (?<cost>\d+) (?<next_hop>.*) (?<iface>.*)/) do |block|
|
42
|
+
route = {}
|
43
|
+
router = block[:dest]
|
44
|
+
useful[:routing][router] = {}
|
45
|
+
useful[:routing][router][:first] = route
|
46
|
+
block.update(useful[:routing][router], :dest)
|
47
|
+
block.update(route, :proto)
|
48
|
+
block.update(route, :pre)
|
49
|
+
block.update(route, :cost)
|
50
|
+
block.update(route, :next_hop)
|
51
|
+
block.update(route, :iface)
|
52
|
+
end
|
53
|
+
|
54
|
+
if context.size == 2
|
55
|
+
context.readline_match_block(/ (?<proto>.*) (?<pre>\d+) (?<cost>\d+) (?<next_hop>.*) (?<iface>.*)/) do |block|
|
56
|
+
route = {}
|
57
|
+
router = block[:dest]
|
58
|
+
useful[:routing][router][:secend] = route
|
59
|
+
block.update(route, :proto)
|
60
|
+
block.update(route, :pre)
|
61
|
+
block.update(route, :cost)
|
62
|
+
block.update(route, :next_hop)
|
63
|
+
block.update(route, :iface)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,90 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayIpRoutingStat < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display ip routing-table statistics",
|
11
|
+
:cmd_short => "dis ip rout stat",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display ip routing-table statistics",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {}
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
cont = self.context.dup
|
22
|
+
stat = {}
|
23
|
+
useful[:route_summary] = stat
|
24
|
+
|
25
|
+
#cont.readline_match_block(/Proto route active added deleted freed/)
|
26
|
+
cont.readline_match_block(/DIRECT (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
27
|
+
stat_dir = {}
|
28
|
+
stat[:direct] = stat_dir
|
29
|
+
block.update(stat_dir, :route)
|
30
|
+
block.update(stat_dir, :active)
|
31
|
+
block.update(stat_dir, :added)
|
32
|
+
block.update(stat_dir, :deleted)
|
33
|
+
block.update(stat_dir, :freed)
|
34
|
+
end
|
35
|
+
cont.readline_match_block(/STATIC (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
36
|
+
stat_sta = {}
|
37
|
+
stat[:static] = stat_sta
|
38
|
+
block.update(stat_sta, :route)
|
39
|
+
block.update(stat_sta, :active)
|
40
|
+
block.update(stat_sta, :added)
|
41
|
+
block.update(stat_sta, :deleted)
|
42
|
+
block.update(stat_sta, :freed)
|
43
|
+
end
|
44
|
+
cont.readline_match_block(/RIP (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
45
|
+
stat_rip = {}
|
46
|
+
stat[:rip] = stat_rip
|
47
|
+
block.update(stat_rip, :route)
|
48
|
+
block.update(stat_rip, :active)
|
49
|
+
block.update(stat_rip, :added)
|
50
|
+
block.update(stat_rip, :deleted)
|
51
|
+
block.update(stat_rip, :freed)
|
52
|
+
end
|
53
|
+
cont.readline_match_block(/OSPF (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
54
|
+
stat_ospf = {}
|
55
|
+
stat[:ospf] = stat_ospf
|
56
|
+
block.update(stat_ospf, :route)
|
57
|
+
block.update(stat_ospf, :active)
|
58
|
+
block.update(stat_ospf, :added)
|
59
|
+
block.update(stat_ospf, :deleted)
|
60
|
+
block.update(stat_ospf, :freed)
|
61
|
+
end
|
62
|
+
cont.readline_match_block(/IS-IS (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
63
|
+
stat_isis = {}
|
64
|
+
stat[:isis] = stat_isis
|
65
|
+
block.update(stat_isis, :route)
|
66
|
+
block.update(stat_isis, :active)
|
67
|
+
block.update(stat_isis, :added)
|
68
|
+
block.update(stat_isis, :deleted)
|
69
|
+
block.update(stat_isis, :freed)
|
70
|
+
end
|
71
|
+
cont.readline_match_block(/BGP (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
72
|
+
stat_bgp = {}
|
73
|
+
stat[:bgp] = stat_bgp
|
74
|
+
block.update(stat_bgp, :route)
|
75
|
+
block.update(stat_bgp, :active)
|
76
|
+
block.update(stat_bgp, :added)
|
77
|
+
block.update(stat_bgp, :deleted)
|
78
|
+
block.update(stat_bgp, :freed)
|
79
|
+
end
|
80
|
+
cont.readline_match_block(/Total (?<route>\d+) (?<active>\d+) (?<added>\d+) (?<deleted>\d+) (?<freed>\d+)/) do |block|
|
81
|
+
stat_total = {}
|
82
|
+
stat[:total] = stat_total
|
83
|
+
block.update(stat_total, :route)
|
84
|
+
block.update(stat_total, :active)
|
85
|
+
block.update(stat_total, :added)
|
86
|
+
block.update(stat_total, :deleted)
|
87
|
+
block.update(stat_total, :freed)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayMemory < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display memory",
|
11
|
+
:cmd_short => "dis mem",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display memory",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {}
|
17
|
+
})
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse
|
21
|
+
cont = self.context.dup
|
22
|
+
memory = {}
|
23
|
+
useful[:memory] = memory
|
24
|
+
cont.readline_match_block(/System Total Memory\(bytes\): (?<total_memory>\d+)/) do |block|
|
25
|
+
#block.update(memory, :total_memory)
|
26
|
+
end
|
27
|
+
cont.readline_match_block(/Total Used Memory\(bytes\): (?<used_memory>\d+)/) do |block|
|
28
|
+
#block.update(memory, :used_memory)
|
29
|
+
end
|
30
|
+
cont.readline_match_block(/Used Rate: (?<used_rate>\d+)%/) do |block|
|
31
|
+
block.update(memory, :used_rate)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayOspfPeer < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display ospf peer",
|
11
|
+
:cmd_short => "dis ospf p",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display ospf peer",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all"
|
16
|
+
})
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
context = self.context.dup
|
21
|
+
useful[:ospf_neighbor] = {}
|
22
|
+
count = 0
|
23
|
+
context.readline_range_loop(/Route/, reg_blank) do |cont|
|
24
|
+
cont.readline_match_block(/Route/) {|b|b}
|
25
|
+
cont.readline_match_block_loop(/(?<neighbor_id>[^\s]+) (?<address>[^\s]+) (?<pri>\d+) (.*) (?<interface>.*) (?<state>.*)/, reg_blank) do |block|
|
26
|
+
nei = {}
|
27
|
+
nei_id = block[:neighbor_id]
|
28
|
+
useful[:ospf_neighbor][nei_id.to_sym] = nei
|
29
|
+
block.update(nei, :neighbor_id)
|
30
|
+
block.update(nei, :pri)
|
31
|
+
block.update(nei, :state)
|
32
|
+
block.update(nei, :address)
|
33
|
+
block.update(nei, :interface)
|
34
|
+
count += 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::H3C::DisplayPower < Aio::Module::Cmd::H3C
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "display power",
|
11
|
+
:cmd_short => "dis pow",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is H3C Command# display power",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:power_status => ["=~", /Normal/, /Absent/],
|
18
|
+
},
|
19
|
+
})
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse
|
23
|
+
cont = self.context.dup
|
24
|
+
useful[:power] = {}
|
25
|
+
case device_template
|
26
|
+
when Template_1
|
27
|
+
cont.readline_range_loop(/Slot/, /Slot/) do |cont_layer|
|
28
|
+
parse_slot(cont_layer)
|
29
|
+
end
|
30
|
+
when Template_2
|
31
|
+
cont.readline_range_loop(/Unit/, /Unit/) do |cont_layer|
|
32
|
+
parse_unit(cont_layer)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
=begin
|
38
|
+
def parse_def(context)
|
39
|
+
case context[0]
|
40
|
+
when /Slot/
|
41
|
+
parse_slot(context)
|
42
|
+
when /Unit/
|
43
|
+
parse_unit(context)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
=end
|
47
|
+
|
48
|
+
def parse_slot(context)
|
49
|
+
power = {}
|
50
|
+
context.readline_match_block(/Slot (?<slot_id>\d+)/) do |block|
|
51
|
+
useful[:power] = {}
|
52
|
+
useful[:power]["slot_#{block[:slot_id]}"] = power
|
53
|
+
block.update(power, :slot_id)
|
54
|
+
end
|
55
|
+
context.readline_range_loop(/Power/, reg_blank) do |cont_layer|
|
56
|
+
parse_power(cont_layer, power)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def parse_unit(context)
|
61
|
+
power = {}
|
62
|
+
context.readline_match_block(/Unit (?<slot_id>\d+)/) do |block|
|
63
|
+
useful[:power] = {}
|
64
|
+
useful[:power]["slot_#{block[:slot_id]}"] = power
|
65
|
+
block.update(power, :slot_id)
|
66
|
+
end
|
67
|
+
context.readline_range_loop(/power/, /power/, {:before=>true}) do |cont_layer|
|
68
|
+
parse_power(cont_layer, power)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_power(context, power)
|
73
|
+
power_id_info = {}
|
74
|
+
context.readline_match_block(/[Pp]ower (?<power_id>\d+)/) do |block|
|
75
|
+
power_id = block[:power_id]
|
76
|
+
power["power_#{power_id}"] = power_id_info
|
77
|
+
block.update(power_id_info, :power_id)
|
78
|
+
end
|
79
|
+
context.readline_match_block(/State : (?<power_status>.*)/) do |block|
|
80
|
+
block.warning_serious(power_id_info, :power_status, self)
|
81
|
+
end
|
82
|
+
|
83
|
+
context.readline_match_block(/Type : (?<type>.*)/) do |block|
|
84
|
+
block.update(power_id_info, :type)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
|