aio_elin 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config.rb +32 -32
- data/lib/aio/base/toolkit/excel_wps.rb +1 -0
- data/lib/aio/base/toolkit/hash.rb +95 -0
- data/lib/aio/base/toolkit/myers.rb +161 -0
- data/lib/aio/base/toolkit.rb +2 -0
- data/lib/aio/core/device/cmd_switch.rb +1 -1
- data/lib/aio/core/device/h3c.rb +2 -0
- data/lib/aio/core/device/maipu.rb +8 -0
- data/lib/aio/core/device/methods.rb +230 -228
- data/lib/aio/core/device/parent_device.rb +270 -267
- data/lib/aio/core/device_manager.rb +255 -202
- data/lib/aio/core/module/cmd.rb +155 -150
- data/lib/aio/core/module/compare.rb +39 -0
- data/lib/aio/core/module/output_style.rb +2 -0
- data/lib/aio/core/module.rb +1 -0
- data/lib/aio/core/module_loader.rb +11 -0
- data/lib/aio/core/parse/file.rb +12 -14
- data/lib/aio/core/parse/parser.rb +99 -87
- data/lib/aio/core/parse/parser_machine/has_device_state.rb +42 -42
- data/lib/aio/core/parse/parser_machine.rb +44 -44
- data/lib/aio/core/text/block.rb +88 -0
- data/lib/aio/core/text/compare.rb +109 -0
- data/lib/aio/core/text/context.rb +206 -206
- data/lib/aio/core/text/line_string.rb +17 -62
- data/lib/aio/core/text/match_string_info.rb +73 -0
- data/lib/aio/core/text/warning.rb +175 -175
- data/lib/aio/core/text.rb +3 -0
- data/lib/aio/core/warning/warning_summarize.rb +246 -229
- data/lib/aio/core.rb +3 -0
- data/lib/aio/ui/logger.rb +38 -0
- data/lib/aio/ui/verbose.rb +6 -2
- data/lib/aio/ui.rb +135 -134
- data/lib/modules/cmd/cisco/show_version.rb +84 -84
- data/lib/modules/cmd/h3c/display_cpu.rb +41 -41
- data/lib/modules/cmd/h3c/display_version.rb +43 -43
- data/lib/modules/cmd/maipu/show_clock.rb +32 -0
- data/lib/modules/cmd/maipu/show_cpu.rb +36 -0
- data/lib/modules/cmd/maipu/show_ip_interface_brief.rb +44 -0
- data/lib/modules/cmd/maipu/show_memory.rb +22 -22
- data/lib/modules/cmd/maipu/show_version.rb +40 -40
- data/lib/modules/input/style/compare_xml.rb +73 -73
- data/lib/modules/output/style/cmds.rb +3 -3
- data/lib/modules/output/style/compare_diff.rb +23 -0
- data/lib/modules/output/style/excel_table_office.rb +1 -0
- data/lib/modules/output/style/excel_table_wps.rb +1 -0
- data/lib/modules/output/style/summary_report.rb +2 -1
- data/lib/modules/special/style/compare.rb +153 -103
- data/lib/modules/special/style/compare_old.rb +121 -0
- data/lib/modules/special/style/compare_with_device_manager.rb +227 -0
- metadata +16 -3
@@ -0,0 +1,32 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Maipu::ShowClock < Aio::Module::Cmd::Maipu
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show clock",
|
11
|
+
:cmd_short => "sh clo",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Maipu Command# show 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(/(?<zone>.*)\.\d+ (?<week>[^\s]+) (?<month>[^\s]+) (?<day>[^\s]+) (?<time>[^\s]+) (?<year>[^\s]+)/) 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, Aio::Base::Toolkit::Date.month_to_i(block[:month]))
|
29
|
+
block.update(clock, :day)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Maipu::ShowCpu < Aio::Module::Cmd::Maipu
|
6
|
+
include Aio::Module
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show cpu",
|
11
|
+
:cmd_short => "sh cpu",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Maipu Command# show cpu",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:used_percent => ["<", 70.0],
|
18
|
+
}
|
19
|
+
})
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse
|
23
|
+
cont = self.context.dup
|
24
|
+
useful[:cpu] = {}
|
25
|
+
|
26
|
+
idle = 0
|
27
|
+
cont.readline_match_block(/IDLE (?<cpu_idle>\d+)%/) do |block|
|
28
|
+
idle = block[:cpu_idle].to_i
|
29
|
+
end
|
30
|
+
|
31
|
+
cont.readline_match_block(/TOTAL (?<cpu_total>\d+)%/) do |block|
|
32
|
+
used = block[:cpu_total].to_i - idle
|
33
|
+
block.warning_serious(useful[:cpu], :used_percent, self, string: used.to_s)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
|
5
|
+
class Aio::Module::Cmd::Maipu::ShowIpInterfaceBrief < Aio::Module::Cmd::Maipu
|
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 Maipu 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 Status Protocol Description/) {|b|b}
|
24
|
+
context.readline_match_block_loop(/(?<interface_id>[^\s]+) (?<ip>[^\s]+) (?<status>[^\s]+) (?<protocol_description>[^\s].*)/, reg_blank) do |block|
|
25
|
+
iface = {}
|
26
|
+
iface_id = block[:interface_id]
|
27
|
+
useful[:interface_brief][iface_id.to_sym] = iface
|
28
|
+
|
29
|
+
protocol, description = block[:protocol_description].split(' ', 2)
|
30
|
+
block.update(iface, :interface_id)
|
31
|
+
block.update(iface, :ip)
|
32
|
+
block.update(iface, :status)
|
33
|
+
block.update(iface, :protocol, protocol)
|
34
|
+
block.update(iface, :description, description.to_s)
|
35
|
+
# 当状态是起来的,但是协议为Down,则纳入警告
|
36
|
+
if (block[:status] =~ /up/) and !(protocol =~ /up/)
|
37
|
+
block.warning_serious(iface, :protocol, self, {string: protocol, force: true})
|
38
|
+
else
|
39
|
+
block.warning_serious(iface, :protocol, self, {string: protocol, force: false})
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
@@ -3,29 +3,29 @@
|
|
3
3
|
require "aio/core"
|
4
4
|
|
5
5
|
class Aio::Module::Cmd::Maipu::ShowMemory < Aio::Module::Cmd::Maipu
|
6
|
-
|
6
|
+
include Aio::Module
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show memory",
|
11
|
+
:cmd_short => "sh mem",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Maipu Command# show memory",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:benchmark => {
|
17
|
+
:used_percent => ["<", 70.0],
|
18
|
+
}
|
19
|
+
})
|
20
|
+
end
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
22
|
+
def parse
|
23
|
+
cont = self.context.dup
|
24
|
+
useful[:memory] = {}
|
25
|
+
cont.readline_match_block(/STATISTICS/) {|b|b}
|
26
|
+
cont.readline_match_block(/(?<used_percent>\d+[\.]\d+)%/) do |block|
|
27
|
+
block.warning_serious(useful[:memory], :used_percent, self)
|
28
|
+
end
|
29
|
+
end
|
30
30
|
end
|
31
31
|
|
@@ -3,48 +3,48 @@
|
|
3
3
|
require "aio/core"
|
4
4
|
|
5
5
|
class Aio::Module::Cmd::Maipu::ShowVersion < Aio::Module::Cmd::Maipu
|
6
|
-
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
super({
|
10
|
-
:cmd_full => "show version",
|
11
|
-
:cmd_short => "sh ver",
|
12
|
-
:author => "Elin",
|
13
|
-
:description => "This is Maipu Command# show version",
|
14
|
-
:ranking => Ranking_1,
|
15
|
-
:platform => "all",
|
16
|
-
:key_stand => true,
|
17
|
-
:benchmark => {}
|
18
|
-
})
|
19
|
-
end
|
6
|
+
include Aio::Module
|
20
7
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
8
|
+
def initialize
|
9
|
+
super({
|
10
|
+
:cmd_full => "show version",
|
11
|
+
:cmd_short => "sh ver",
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "This is Maipu Command# show version",
|
14
|
+
:ranking => Ranking_1,
|
15
|
+
:platform => "all",
|
16
|
+
:key_stand => true,
|
17
|
+
:benchmark => {}
|
18
|
+
})
|
19
|
+
end
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
21
|
+
def parse
|
22
|
+
cont = self.context.dup
|
23
|
+
soft_info = {}
|
24
|
+
useful[:software] = soft_info
|
25
|
+
|
26
|
+
cont.readline_match_block(/MyPower \(R\) Operating System Software/) do |block|
|
27
|
+
key_stand_maipu
|
28
|
+
end
|
29
|
+
cont.readline_match_block(/(?<device_model>.*) Version Information/) do |block|
|
30
|
+
block.update(soft_info, :device_model)
|
31
|
+
end
|
32
|
+
cont.readline_match_block(/System ID : (?<board_id>.*)/) do |block|
|
33
|
+
block.update(soft_info, :board_id)
|
34
|
+
end
|
35
|
+
cont.readline_match_block(/Hardware Model : (?<hw_info>.*)/) do |block|
|
36
|
+
block.update(soft_info, :hw_info)
|
37
|
+
end
|
38
|
+
cont.readline_match_block(/Software Version : (?<version>.*)/) do |block|
|
39
|
+
block.update(soft_info, :version)
|
40
|
+
end
|
41
|
+
cont.readline_match_block(/Software Image File : (?<soft_image>.*)/) do |block|
|
42
|
+
block.update(soft_info, :soft_image)
|
43
|
+
end
|
44
|
+
cont.readline_match_block(/System Uptime is (?<uptime>.*)/) do |block|
|
45
|
+
block.update(soft_info, :uptime)
|
46
|
+
end
|
47
|
+
end
|
48
48
|
|
49
49
|
end
|
50
50
|
|
@@ -4,86 +4,86 @@ require "aio/core"
|
|
4
4
|
require "rexml/document"
|
5
5
|
|
6
6
|
class Aio::Module::InputStyle::CompareXML < Aio::Module::InputStyle
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
include Aio::Module
|
8
|
+
include REXML
|
9
|
+
include Aio::Ui::Verbose
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
11
|
+
def initialize
|
12
|
+
super({
|
13
|
+
:author => "Elin",
|
14
|
+
:description => "这个模块用于分析由output/out_compare_xml模块生成的xml文件",
|
15
|
+
:platform => "all",
|
16
|
+
:file_suffix => Regexp.new('\.xml$'),
|
17
|
+
:pass_file => [],
|
18
|
+
})
|
19
|
+
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
21
|
+
def parse
|
22
|
+
# dir 为 Pathname 类
|
23
|
+
print_good "正在打开文件 #{self.input_file}"
|
24
|
+
file = File.open(self.input_file)
|
25
|
+
print_good "打开文件完成"
|
26
|
+
print_good "正在载入到XML模块..."
|
27
|
+
atime = Time.now
|
28
|
+
doc = Document.new(file)
|
29
|
+
root = doc.root
|
30
|
+
print_good "载入完成。载入用时 #{format("%.2fs", Time.now.to_f - atime.to_f)}"
|
31
|
+
device_hash = {}
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
index = 0
|
34
|
+
total = root.elements.size
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# 按照每个cmd解析XML
|
45
|
-
device.elements.each do |cmd|
|
46
|
-
i = {}
|
47
|
-
ch = cmd.name
|
48
|
-
cmd_name = cmd.attributes['cmd']
|
49
|
-
# 当同一个cmd有两个symbol时
|
50
|
-
if info[cmd_name].nil?
|
51
|
-
info[cmd_name] = {ch.to_sym => i}
|
52
|
-
else
|
53
|
-
info[cmd_name][ch.to_sym] = i
|
54
|
-
end
|
36
|
+
print_good "开始比对分析..."
|
37
|
+
# 按每台设备解析XML
|
38
|
+
root.elements.each do |device|
|
39
|
+
index += 1
|
40
|
+
info = {}
|
41
|
+
device_name = device.attributes['device_name']
|
42
|
+
device_hash[device_name] = info
|
55
43
|
|
56
|
-
|
57
|
-
|
44
|
+
# 按照每个cmd解析XML
|
45
|
+
device.elements.each do |cmd|
|
46
|
+
i = {}
|
47
|
+
ch = cmd.name
|
48
|
+
cmd_name = cmd.attributes['cmd']
|
49
|
+
# 当同一个cmd有两个symbol时
|
50
|
+
if info[cmd_name].nil?
|
51
|
+
info[cmd_name] = {ch.to_sym => i}
|
52
|
+
else
|
53
|
+
info[cmd_name][ch.to_sym] = i
|
54
|
+
end
|
58
55
|
|
59
|
-
|
60
|
-
|
61
|
-
attr_val = cmd.attributes['val']
|
62
|
-
attr_val ? info[cmd_name][ch.to_sym] = attr_val : to_h(cmd, i)
|
63
|
-
end
|
64
|
-
end
|
56
|
+
# 进度条
|
57
|
+
progress_bar(total, index, device_name)
|
65
58
|
|
66
|
-
|
67
|
-
|
68
|
-
|
59
|
+
# 还有一种情况是当<attr cmd='show' val='var'/>
|
60
|
+
# 此时就可以直接将val填入
|
61
|
+
attr_val = cmd.attributes['val']
|
62
|
+
attr_val ? info[cmd_name][ch.to_sym] = attr_val : to_h(cmd, i)
|
63
|
+
end
|
64
|
+
end
|
69
65
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
son = {}
|
74
|
-
hash[convert(e.name)] = son
|
75
|
-
to_h(e, son)
|
76
|
-
else
|
77
|
-
hash[convert(e.name)] = e.attributes['val']
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
66
|
+
clear_line
|
67
|
+
return device_hash
|
68
|
+
end
|
81
69
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
70
|
+
def to_h(xml, hash)
|
71
|
+
xml.elements.each do |e|
|
72
|
+
if e.has_elements?
|
73
|
+
son = {}
|
74
|
+
hash[convert(e.name)] = son
|
75
|
+
to_h(e, son)
|
76
|
+
else
|
77
|
+
hash[convert(e.name)] = e.attributes['val']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# 转换恢复会出错字符串
|
83
|
+
def convert(e)
|
84
|
+
#/__/.match(e) ? e.gsub!('__', '/').to_sym : e.to_sym
|
85
|
+
e.gsub!('__', '/') if /__/.match(e)
|
86
|
+
e.gsub!(/^_i/, '') if /^_i/.match(e)
|
87
|
+
e.to_sym
|
88
|
+
end
|
89
89
|
end
|
@@ -9,7 +9,7 @@ class Aio::Module::OutputStyle::Cmds < Aio::Module::OutputStyle
|
|
9
9
|
super({
|
10
10
|
:author => "Elin",
|
11
11
|
:description => "这个模块将生成一个文件夹,其中每个文件为各种设备的巡检命令, 此模块不需要Input Module",
|
12
|
-
:file_suffix => "
|
12
|
+
:file_suffix => "txt"
|
13
13
|
})
|
14
14
|
end
|
15
15
|
|
@@ -68,9 +68,9 @@ class Aio::Module::OutputStyle::Cmds < Aio::Module::OutputStyle
|
|
68
68
|
pn = Pathname.new(output_file)
|
69
69
|
Dir.mkdir(output_file) unless pn.directory?
|
70
70
|
|
71
|
-
text.each_pair do |name,
|
71
|
+
text.each_pair do |name, content|
|
72
72
|
file = File.new(File.join(output_file, name), "w+")
|
73
|
-
file.write(
|
73
|
+
file.write(content)
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
#coding=utf-8
|
2
|
+
|
3
|
+
require "aio/core"
|
4
|
+
require "pp"
|
5
|
+
|
6
|
+
class Aio::Module::OutputStyle::CompareDiff < Aio::Module::OutputStyle
|
7
|
+
|
8
|
+
include Aio::Ui::Verbose
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super({
|
12
|
+
:author => "Elin",
|
13
|
+
:description => "这个模块用来输出比较信息报告",
|
14
|
+
:file_suffix => "txt",
|
15
|
+
})
|
16
|
+
end
|
17
|
+
|
18
|
+
def generate
|
19
|
+
debugger
|
20
|
+
device_manager
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|