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.
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