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