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
@@ -1,232 +1,249 @@
1
1
  # 用于收集汇总所有设备的警告信息
2
2
  module Aio::Warning
3
- class WarningSummarize
4
-
5
- # 按结构保存警告信息
6
- # summary = { :serious =>
7
- # { :crc =>
8
- # { device_name =>
9
- # { :klass =>device_klass] ,
10
- # :detail => device_klass.warning }} }
11
- attr_reader :summary
12
-
13
- # 设备的警告信息
14
- # device_warning = { device_name => device_warning_klass }
15
- attr_reader :device_warning
16
-
17
- def initialize(device_manager)
18
- @device_manager = device_manager
19
- @description = Description.new(device_manager.module_manager)
20
- clear
21
- end
22
-
23
- # 通过case获取描述模块的实例
24
- def get_desc(sym)
25
- @description.get_desc(sym)
26
- end
27
-
28
- # 整理警告信息
29
- # 改变结构变成
30
- def tidy_warning
31
- # 清除原先 summary
32
- clear
33
-
34
- devices.each_pair do |device, klass|
35
- warning_klass = klass.warning_klass
36
- @device_warning[device] = klass.warning_klass
37
-
38
- # 当有严重警告的时候
39
- if warning_klass.has_warning_serious?
40
- append_issue(warning_klass.warning_info_serious, :serious, device, klass)
41
- end
42
-
43
- # 当有一般信息的时候
44
- if warning_klass.has_warning_ordinary?
45
- append_issue(warning_klass.warning_info_ordinary, :ordinary, device, klass)
46
- end
47
-
48
- # 当有比较误差信息的时候
49
- if warning_klass.has_warning_compare?
50
- append_issue(warning_klass.warning_info_compare, :compare, device, klass)
51
- end
52
- end
53
-
54
- @summary
55
- end
56
-
57
- # 增加警告信息
58
- def append_issue(warning_info, level, device, klass)
59
- warning_info.each_pair do |issue, detail|
60
- # 如果没有, 则加入Hash
61
- unless summary[level].has_key?(issue)
62
- summary[level][issue] = {}
63
- end
64
-
65
- summary[level][issue][device] = { :klass => klass, :detail => detail }
66
- end
67
- end
68
-
69
- # 严重警告条数
70
- def serious_number
71
- number(summary[:serious])
72
- end
73
-
74
- # 一般警告信息条数
75
- def ordinary_number
76
- number(summary[:ordinary])
77
- end
78
-
79
- # 比较差异警告条数
80
- def compare_number
81
- number(summary[:compare])
82
- end
83
-
84
- # 全部警告条数
85
- def total_number
86
- serious_number + ordinary_number + compare_number
87
- end
88
-
89
- # 统计警告条目数
90
- def number(hash)
91
- num = 0
92
- hash.each_value do |v|
93
- num += v.size
94
- end
95
-
96
- return num
97
- end
98
-
99
- def has_serious?
100
- serious_number > 0 ? true : false
101
- end
102
-
103
- def has_ordinary?
104
- ordinary_number > 0 ? true : false
105
- end
106
-
107
- def has_compare?
108
- compare_number > 0 ? true : false
109
- end
110
-
111
- # 按照权重,对 device_warning 排序
112
- def device_warning_sort
113
- arr = device_warning.to_a
114
- arr.sort! do |x, y|
115
- x1 = x[1]
116
- y1 = y[1]
117
- x_wgt = (x1.serious_number*5) + (x1.ordinary_number) + (x1.compare_number*3)
118
- y_wgt = (y1.serious_number*5) + (y1.ordinary_number) + (y1.compare_number*3)
119
- y_wgt <=> x_wgt
120
- end
121
-
122
- return arr
123
- end
124
-
125
- # 按照设备分类取到的严重警告数
126
- def device_serious_sort
127
- st = []
128
- @device_warning.each_pair do |name, klass|
129
- st << [name, klass.serious_number]
130
- end
131
-
132
- st.sort! do |x, y|
133
- y[1] <=> x[1]
134
- end
135
-
136
- st.delete_if do |x|
137
- x[0].empty? or x[1] == 0
138
- end
139
- end
140
-
141
- # 按照设备分类取到的一般警告数
142
- def device_ordinary_sort
143
- st = []
144
- @device_warning.each_pair do |name, klass|
145
- st << [name, klass.ordinary_number]
146
- end
147
-
148
- st.sort! do |x, y|
149
- y[1] <=> x[1]
150
- end
151
-
152
- st.delete_if do |x|
153
- x[0].empty? or x[1] == 0
154
- end
155
- end
156
-
157
- # 发生频率高的问题
158
- def problem_frequency
159
- tmp = []
160
- summary.each_value do |info|
161
- info.each_pair do |prb, dvs|
162
- tmp << [prb, dvs.size]
163
- end
164
- end
165
-
166
- # 反向排序
167
- tmp.sort { |x, y| x[1] <=> y[1] }.reverse
168
- end
169
-
170
- # 取得严重信息的描述列表
171
- # 返回结构:
172
- # :crc => { :description => CRC描述类,
173
- # :devices => [[dev1, klass1], ...] }
174
- def serious_description
175
- res = {}
176
- serious_info.each_pair do |prb, dvs_info|
177
- res[prb] = { :description => @descripion.get(prb) }
178
- tmp = []
179
- dvs_info.each_pair do |device_name, info|
180
- tmp << [device_name, info[:klass]]
181
- end
182
- res[prb][:devices] = tmp
183
- end
184
-
185
- return res
186
- end
187
-
188
- # 严重信息
189
- def serious_info
190
- summary[:serious]
191
- end
192
-
193
- def ordinary_info
194
- summary[:ordinary]
195
- end
196
-
197
- def compare_info
198
- summary[:compare]
199
- end
200
-
201
- private
202
-
203
- # 清零变量
204
- def clear
205
- clear_summary
206
- clear_device_warning
207
- end
208
-
209
- def clear_summary
210
- @summary = {
211
- :serious => {},
212
- :ordinary => {},
213
- :compare => {}
214
- }
215
- end
216
-
217
- def clear_device_warning
218
- @device_warning = {}
219
- end
220
-
221
- # 方便使用
222
- def device_manager
223
- @device_manager
224
- end
225
-
226
- # 方便使用 devices
227
- def devices
228
- device_manager.devices
229
- end
230
-
231
- end
3
+ class WarningSummarize
4
+
5
+ # 按结构保存警告信息
6
+ # summary = { :serious =>
7
+ # { :crc =>
8
+ # { device_name =>
9
+ # { :klass =>device_klass] ,
10
+ # :detail => device_klass.warning }} }
11
+ attr_reader :summary
12
+
13
+ # 设备的警告信息
14
+ # device_warning = { device_name => device_warning_klass }
15
+ attr_reader :device_warning
16
+
17
+ def initialize(device_manager)
18
+ @device_manager = device_manager
19
+ @description = Description.new(device_manager.module_manager)
20
+ clear
21
+ end
22
+
23
+ # 通过case获取描述模块的实例
24
+ def get_desc(sym)
25
+ @description.get_desc(sym)
26
+ end
27
+
28
+ def inspect
29
+ "#<Aio::Warning::WarningSummarize @summary, @device_warning>"
30
+ end
31
+
32
+ # 整理警告信息
33
+ # 改变结构变成
34
+ def tidy_warning
35
+ # 清除原先 summary
36
+ clear
37
+
38
+ devices.each_pair do |device, klass|
39
+ warning_klass = klass.warning_klass
40
+ @device_warning[device] = klass.warning_klass
41
+
42
+ # 当有严重警告的时候
43
+ if warning_klass.has_warning_serious?
44
+ append_issue(warning_klass.warning_info_serious, :serious, device, klass)
45
+ end
46
+
47
+ # 当有一般信息的时候
48
+ if warning_klass.has_warning_ordinary?
49
+ append_issue(warning_klass.warning_info_ordinary, :ordinary, device, klass)
50
+ end
51
+
52
+ # 当有比较误差信息的时候
53
+ # NOTE 这个比较暂时去掉
54
+ if warning_klass.has_warning_compare?
55
+ # append_issue(warning_klass.warning_info_compare, :compare, device, klass)
56
+
57
+ append_issue_compare(warning_klass.warning_info_compare, device, klass)
58
+ end
59
+ end
60
+
61
+ @summary
62
+ end
63
+
64
+ # 增加警告信息
65
+ def append_issue(warning_info, level, device, klass)
66
+ warning_info.each_pair do |issue, detail|
67
+ # 如果没有, 则加入Hash
68
+ unless summary[level].has_key?(issue)
69
+ summary[level][issue] = {}
70
+ end
71
+
72
+ summary[level][issue][device] = { :klass => klass, :detail => detail }
73
+ end
74
+ end
75
+
76
+ # 针对compare添加警告信息
77
+ # 为了跟其他种类的警告信息一致,重复两次:compare
78
+ def append_issue_compare(warning_info, device, klass)
79
+ summary[:compare][:compare] = {}
80
+ summary[:compare][:compare][device] = {
81
+ klass: klass,
82
+ detail: warning_info
83
+ }
84
+ end
85
+
86
+ # 严重警告条数
87
+ def serious_number
88
+ number(summary[:serious])
89
+ end
90
+
91
+ # 一般警告信息条数
92
+ def ordinary_number
93
+ number(summary[:ordinary])
94
+ end
95
+
96
+ # 比较差异警告条数
97
+ def compare_number
98
+ number(summary[:compare])
99
+ end
100
+
101
+ # 全部警告条数
102
+ def total_number
103
+ serious_number + ordinary_number + compare_number
104
+ end
105
+
106
+ # 统计警告条目数
107
+ def number(hash)
108
+ num = 0
109
+ hash.each_value do |v|
110
+ num += v.size
111
+ end
112
+
113
+ return num
114
+ end
115
+
116
+ def has_serious?
117
+ serious_number > 0 ? true : false
118
+ end
119
+
120
+ def has_ordinary?
121
+ ordinary_number > 0 ? true : false
122
+ end
123
+
124
+ def has_compare?
125
+ compare_number > 0 ? true : false
126
+ end
127
+
128
+ # 按照权重,对 device_warning 排序
129
+ def device_warning_sort
130
+ arr = device_warning.to_a
131
+ arr.sort! do |x, y|
132
+ x1 = x[1]
133
+ y1 = y[1]
134
+ x_wgt = (x1.serious_number*5) + (x1.ordinary_number) + (x1.compare_number*3)
135
+ y_wgt = (y1.serious_number*5) + (y1.ordinary_number) + (y1.compare_number*3)
136
+ y_wgt <=> x_wgt
137
+ end
138
+
139
+ return arr
140
+ end
141
+
142
+ # 按照设备分类取到的严重警告数
143
+ def device_serious_sort
144
+ st = []
145
+ @device_warning.each_pair do |name, klass|
146
+ st << [name, klass.serious_number]
147
+ end
148
+
149
+ st.sort! do |x, y|
150
+ y[1] <=> x[1]
151
+ end
152
+
153
+ st.delete_if do |x|
154
+ x[0].empty? or x[1] == 0
155
+ end
156
+ end
157
+
158
+ # 按照设备分类取到的一般警告数
159
+ def device_ordinary_sort
160
+ st = []
161
+ @device_warning.each_pair do |name, klass|
162
+ st << [name, klass.ordinary_number]
163
+ end
164
+
165
+ st.sort! do |x, y|
166
+ y[1] <=> x[1]
167
+ end
168
+
169
+ st.delete_if do |x|
170
+ x[0].empty? or x[1] == 0
171
+ end
172
+ end
173
+
174
+ # 发生频率高的问题
175
+ def problem_frequency
176
+ tmp = []
177
+ summary.each_value do |info|
178
+ info.each_pair do |prb, dvs|
179
+ tmp << [prb, dvs.size]
180
+ end
181
+ end
182
+
183
+ # 反向排序
184
+ tmp.sort { |x, y| x[1] <=> y[1] }.reverse
185
+ end
186
+
187
+ # 取得严重信息的描述列表
188
+ # 返回结构:
189
+ # :crc => { :description => CRC描述类,
190
+ # :devices => [[dev1, klass1], ...] }
191
+ def serious_description
192
+ res = {}
193
+ serious_info.each_pair do |prb, dvs_info|
194
+ res[prb] = { :description => @descripion.get(prb) }
195
+ tmp = []
196
+ dvs_info.each_pair do |device_name, info|
197
+ tmp << [device_name, info[:klass]]
198
+ end
199
+ res[prb][:devices] = tmp
200
+ end
201
+
202
+ return res
203
+ end
204
+
205
+ # 严重信息
206
+ def serious_info
207
+ summary[:serious]
208
+ end
209
+
210
+ def ordinary_info
211
+ summary[:ordinary]
212
+ end
213
+
214
+ def compare_info
215
+ summary[:compare]
216
+ end
217
+
218
+ private
219
+
220
+ # 清零变量
221
+ def clear
222
+ clear_summary
223
+ clear_device_warning
224
+ end
225
+
226
+ def clear_summary
227
+ @summary = {
228
+ :serious => {},
229
+ :ordinary => {},
230
+ :compare => {}
231
+ }
232
+ end
233
+
234
+ def clear_device_warning
235
+ @device_warning = {}
236
+ end
237
+
238
+ # 方便使用
239
+ def device_manager
240
+ @device_manager
241
+ end
242
+
243
+ # 方便使用 devices
244
+ def devices
245
+ device_manager.devices
246
+ end
247
+
248
+ end
232
249
  end
data/lib/aio/core.rb CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  module Aio
4
4
 
5
+ # debugger
6
+ require 'byebug'
7
+
5
8
  # License
6
9
  require "aio/license"
7
10
 
@@ -0,0 +1,38 @@
1
+ module Aio::Ui
2
+
3
+ require 'singleton'
4
+
5
+ # 单例日志保存类
6
+ class Logger
7
+
8
+ include Singleton
9
+
10
+ def initialize
11
+ clear_log
12
+ end
13
+
14
+ def info=(msg)
15
+ @log[:info] << msg
16
+ end
17
+
18
+ def debug=(msg)
19
+ @log[:debug] << msg
20
+ end
21
+
22
+ def info
23
+ @log[:info]
24
+ end
25
+
26
+ def debug
27
+ @log[:info]
28
+ end
29
+
30
+ def clear_log
31
+ @log = {}
32
+ @log[:info] = []
33
+ @log[:debug] = []
34
+ end
35
+
36
+ end
37
+ end
38
+
@@ -13,11 +13,15 @@ module Aio::Ui
13
13
  end
14
14
 
15
15
  def print_good(str)
16
- puts "[+] " << str
16
+ res = "[+] " << str
17
+ Aio::Ui::Logger.instance.info = res
18
+ puts res
17
19
  end
18
20
 
19
21
  def print_error(str)
20
- puts "[-] " << str
22
+ res = "[-] " << str
23
+ Aio::Ui::Logger.instance.info = res
24
+ puts res
21
25
  end
22
26
 
23
27
  def clear_line