aio_elin 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
|