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.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/config.rb +32 -32
  3. data/lib/aio/base/toolkit/excel_wps.rb +1 -0
  4. data/lib/aio/base/toolkit/hash.rb +95 -0
  5. data/lib/aio/base/toolkit/myers.rb +161 -0
  6. data/lib/aio/base/toolkit.rb +2 -0
  7. data/lib/aio/core/device/cmd_switch.rb +1 -1
  8. data/lib/aio/core/device/h3c.rb +2 -0
  9. data/lib/aio/core/device/maipu.rb +8 -0
  10. data/lib/aio/core/device/methods.rb +230 -228
  11. data/lib/aio/core/device/parent_device.rb +270 -267
  12. data/lib/aio/core/device_manager.rb +255 -202
  13. data/lib/aio/core/module/cmd.rb +155 -150
  14. data/lib/aio/core/module/compare.rb +39 -0
  15. data/lib/aio/core/module/output_style.rb +2 -0
  16. data/lib/aio/core/module.rb +1 -0
  17. data/lib/aio/core/module_loader.rb +11 -0
  18. data/lib/aio/core/parse/file.rb +12 -14
  19. data/lib/aio/core/parse/parser.rb +99 -87
  20. data/lib/aio/core/parse/parser_machine/has_device_state.rb +42 -42
  21. data/lib/aio/core/parse/parser_machine.rb +44 -44
  22. data/lib/aio/core/text/block.rb +88 -0
  23. data/lib/aio/core/text/compare.rb +109 -0
  24. data/lib/aio/core/text/context.rb +206 -206
  25. data/lib/aio/core/text/line_string.rb +17 -62
  26. data/lib/aio/core/text/match_string_info.rb +73 -0
  27. data/lib/aio/core/text/warning.rb +175 -175
  28. data/lib/aio/core/text.rb +3 -0
  29. data/lib/aio/core/warning/warning_summarize.rb +246 -229
  30. data/lib/aio/core.rb +3 -0
  31. data/lib/aio/ui/logger.rb +38 -0
  32. data/lib/aio/ui/verbose.rb +6 -2
  33. data/lib/aio/ui.rb +135 -134
  34. data/lib/modules/cmd/cisco/show_version.rb +84 -84
  35. data/lib/modules/cmd/h3c/display_cpu.rb +41 -41
  36. data/lib/modules/cmd/h3c/display_version.rb +43 -43
  37. data/lib/modules/cmd/maipu/show_clock.rb +32 -0
  38. data/lib/modules/cmd/maipu/show_cpu.rb +36 -0
  39. data/lib/modules/cmd/maipu/show_ip_interface_brief.rb +44 -0
  40. data/lib/modules/cmd/maipu/show_memory.rb +22 -22
  41. data/lib/modules/cmd/maipu/show_version.rb +40 -40
  42. data/lib/modules/input/style/compare_xml.rb +73 -73
  43. data/lib/modules/output/style/cmds.rb +3 -3
  44. data/lib/modules/output/style/compare_diff.rb +23 -0
  45. data/lib/modules/output/style/excel_table_office.rb +1 -0
  46. data/lib/modules/output/style/excel_table_wps.rb +1 -0
  47. data/lib/modules/output/style/summary_report.rb +2 -1
  48. data/lib/modules/special/style/compare.rb +153 -103
  49. data/lib/modules/special/style/compare_old.rb +121 -0
  50. data/lib/modules/special/style/compare_with_device_manager.rb +227 -0
  51. 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
- include Aio::Module
6
+ include Aio::Module
7
7
 
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
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
- 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
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
- 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 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
- def parse
22
- cont = self.context.dup
23
- soft_info = {}
24
- useful[:software] = soft_info
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
- 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
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
- include Aio::Module
8
- include REXML
9
- include Aio::Ui::Verbose
7
+ include Aio::Module
8
+ include REXML
9
+ include Aio::Ui::Verbose
10
10
 
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
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
- 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 = {}
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
- index = 0
34
- total = root.elements.size
33
+ index = 0
34
+ total = root.elements.size
35
35
 
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
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
- progress_bar(total, index, device_name)
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
- # 还有一种情况是当<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
56
+ # 进度条
57
+ progress_bar(total, index, device_name)
65
58
 
66
- clear_line
67
- return device_hash
68
- end
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
- 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
66
+ clear_line
67
+ return device_hash
68
+ end
81
69
 
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
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 => "Null",
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, text|
71
+ text.each_pair do |name, content|
72
72
  file = File.new(File.join(output_file, name), "w+")
73
- file.write(text)
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
+
@@ -55,6 +55,7 @@ class Aio::Module::OutputStyle::ExcelTableOffice < Aio::Module::OutputStyle
55
55
  :author => "Elin",
56
56
  :description => "这个模块按照表格输出excel文件, 以Office运行",
57
57
  :file_suffix => "xls",
58
+ :platform => ['windows']
58
59
  })
59
60
  end
60
61
 
@@ -55,6 +55,7 @@ class Aio::Module::OutputStyle::ExcelTableWps < Aio::Module::OutputStyle
55
55
  :author => "Elin",
56
56
  :description => "这个模块按照表格输出excel文件, 以WPS运行",
57
57
  :file_suffix => "xls",
58
+ :platform => ['windows']
58
59
  })
59
60
  end
60
61
 
@@ -16,7 +16,8 @@ class Aio::Module::OutputStyle::SummaryReport < Aio::Module::OutputStyle
16
16
  :author => "Elin",
17
17
  :description => "输出巡检简要报告, 以WPS运行",
18
18
  :file_suffix => "doc",
19
- })
19
+ :platform => ['windows']
20
+ })
20
21
  end
21
22
 
22
23
  def generate