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,233 +1,235 @@
1
+ require 'byebug'
1
2
  #
2
3
  # 这个模块用于统一命令方法,方便一起管理
3
4
  #
4
5
  module Aio::Device
5
- module Methods
6
-
7
- class << self
8
- include Aio::Ui::Verbose
9
-
10
- def klass=(klass)
11
- @@klass = klass
12
- end
13
-
14
- def klass
15
- @@klass
16
- end
17
-
18
- # CPU 利用率百分比
19
- def cpu_percent
20
- begin
21
- cmd = CmdSwitch.cpu(klass)
22
- return klass.cmds_useful[cmd][:cpu][:minutes_5] if kind_of?(Cisco, H3C)
23
- return 0 if klass.kind_of? Maipu
24
- rescue Exception
25
- puts_error
26
- return ""
27
- end
28
- end
29
-
30
- # Memory 利用率百分比
31
- def memory_percent
32
- begin
33
- cmd = CmdSwitch.memory(klass)
34
- return klass.cmds_useful[cmd][:memory][:used_rate] if klass.kind_of? H3C
35
- return klass.cmds_useful[cmd][:memory][:proc_ratio] if klass.kind_of? Cisco
36
- return klass.cmds_useful[cmd][:memory][:used_percent] if klass.kind_of? Maipu
37
- rescue Exception
38
- puts_error
39
- return ""
40
- end
41
- end
42
-
43
- # IOS 版本
44
- def ios_version
45
- begin
46
- cmd = CmdSwitch.version(klass)
47
- return klass.cmds_useful[cmd][:software][:version] if kind_of?(Cisco, H3C, Maipu)
48
- rescue Exception
49
- puts_error
50
- return ""
51
- end
52
- end
53
-
54
- # IOS 特性集
55
- def soft_image
56
- begin
57
- cmd = CmdSwitch.version(klass)
58
- return klass.cmds_useful[cmd][:software][:soft_image] if kind_of?(Cisco, H3C, Maipu)
59
- rescue Exception
60
- puts_error
61
- return ""
62
- end
63
- end
64
-
65
- # 运行时间
66
- def uptime
67
- begin
68
- cmd = CmdSwitch.version(klass)
69
- return klass.cmds_useful[cmd][:software][:uptime] if kind_of?(Cisco, H3C, Maipu)
70
- rescue Exception
71
- puts_error
72
- return ""
73
- end
74
- end
75
-
76
- # 判断温度是否有警告
77
- def warning_env?
78
- begin
79
- if klass.kind_of? Maipu
80
- return (klass.include_warning?(:mainboard_temperature) and klass.include_warning?(:cpu_temperature))
81
- end
82
- return klass.include_warning?(:cpu_status) if klass.kind_of? Cisco
83
- rescue Exception
84
- puts_error
85
- end
86
- end
87
-
88
-
89
- # 判断电源是否有警告
90
- def warning_power?
91
- begin
92
- return klass.include_warning?(:power_status) if kind_of?(Cisco, H3C, Maipu)
93
- rescue Exception
94
- puts_error
95
- end
96
- end
97
-
98
- # 判断风扇是否有警告
99
- def warning_fan?
100
- begin
101
- return klass.include_warning?(:fan_status) if kind_of?(Cisco, H3C, Maipu)
102
- rescue Exception
103
- puts_error
104
- end
105
- end
106
-
107
- # 只判断最关键的三个信息
108
- def warning_interface?
109
- begin
110
- if kind_of?(Cisco, Maipu, H3C)
111
- tmp = klass.include_warning?(:input_errors)
112
- tmp = tmp or klass.include_warning(:crc)
113
- tmp = tmp or klass.include_warning(:output_errors)
114
- return tmp
115
- end
116
- rescue Exception
117
- puts_error
118
- end
119
- end
120
-
121
- # 板卡序列号信息
122
- # 返回数组: [{:name, :pid, :sn, :description}]
123
- def inventory
124
- cmd = CmdSwitch.inventory(klass)
125
- begin
126
- if kind_of?(Cisco, H3C)
127
- keys = klass.cmds_useful[cmd][:inventory].keys
128
- res = []
129
- keys.each do |sn|
130
- res << klass.cmds_useful[cmd][:inventory][sn.to_sym]
131
- end
132
- return res
133
- else
134
- return [{:name => "", :pid => "", :sn => "", :description => ""}]
135
- end
136
-
137
- rescue Exception => e
138
- puts_error
139
- return [{:name => "", :pid => "", :sn => "", :description => ""}]
140
- end
141
- end
142
-
143
- def clock
144
- begin
145
- cmd = CmdSwitch.clock(klass)
146
- pool = ["time", "zone", "week", "year", "month", "day"]
147
- res = []
148
- pool.each do |key|
149
- res << klass.cmds_useful[cmd][:clock][key.to_sym]
150
- end
151
- return res
152
- rescue Exception
153
- puts_error
154
- return ["", "", "", "", "", ""]
155
- end
156
- end
157
-
158
- def get_manager_ip
159
- return klass.manager_ip unless klass.manager_ip.nil?
160
-
161
- begin
162
- cmd = []
163
- cmd[0] = CmdSwitch.interface(klass)
164
- cmd[1] = CmdSwitch.interface_brief(klass)
165
-
166
- total = []
167
- manager = ""
168
-
169
- return unless kind_of?(Cisco, H3C)
170
-
171
- # 如果是 show interfaces
172
- if klass.has_cmd?(cmd[0])
173
- total = klass.cmds_useful[cmd[0]][:interface]
174
-
175
- total.each_value do |info|
176
- if (info[:iface_id] == (klass.interface[:loopback] + "0")) and info[:state] =~ /(?i)up/
177
- manager = info[:addr]
178
- end
179
- end
180
-
181
- # 如果是 show ip interface brief
182
- elsif klass.has_cmd?(cmd[1])
183
- total = klass.cmds_useful[cmd[1]][:interface_brief]
184
-
185
- total.each_value do |info|
186
- # 如果有环回口,那么就直接输出
187
- if (info[:interface_id] == klass.interface[:loopback] + "0") and (info[:status] =~ /(?i)up/)
188
- manager = info[:ip]
189
- end
190
- end
191
- end
192
- return manager
193
-
194
- rescue Exception
195
- puts_error
196
- return ""
197
- end
198
- end
199
-
200
-
201
-
202
- private
203
-
204
- # 判断klass是否是指定的Device类型
205
- def kind_of?(*type)
206
- type.each do |t|
207
- return true if klass.kind_of?(t)
208
- end
209
- return false
210
- end
211
-
212
- # 统一的错误回显
213
- def puts_error
214
- res = /`(?<method>.*)'/.match(caller[1])
215
- print_error "<#{res[:method]}>方法未执行成功 #{klass.class} : #{klass.device_name}"
216
- end
217
-
218
- # 对于有相同路径的cmds_useful,可以使用此方法
219
- # 将按照给出的设备类型返回cmds_useful
220
- # 方便命令的统一管理
221
- def type_send(*types)
222
- types.each do |type|
223
- if klass.kind_of?(type)
224
- yield klass.cmds_useful
225
- else
226
- next
227
- end
228
- end
229
- end
230
-
231
- end
232
- end
6
+ module Methods
7
+
8
+ class << self
9
+ include Aio::Ui::Verbose
10
+
11
+ def klass=(klass)
12
+ @@klass = klass
13
+ end
14
+
15
+ def klass
16
+ @@klass
17
+ end
18
+
19
+ # CPU 利用率百分比
20
+ def cpu_percent
21
+ begin
22
+ cmd = CmdSwitch.cpu(klass)
23
+ return klass.cmds_useful[cmd][:cpu][:minutes_5] if kind_of?(Cisco, H3C)
24
+ return klass.cmds_useful[cmd][:cpu][:used_percent] if klass.kind_of? Maipu
25
+ rescue Exception
26
+ puts_error
27
+ return ""
28
+ end
29
+ end
30
+
31
+ # Memory 利用率百分比
32
+ def memory_percent
33
+ begin
34
+ cmd = CmdSwitch.memory(klass)
35
+ return klass.cmds_useful[cmd][:memory][:used_rate] if klass.kind_of? H3C
36
+ return klass.cmds_useful[cmd][:memory][:proc_ratio] if klass.kind_of? Cisco
37
+ return klass.cmds_useful[cmd][:memory][:used_percent] if klass.kind_of? Maipu
38
+ rescue Exception
39
+ puts_error
40
+ return ""
41
+ end
42
+ end
43
+
44
+ # IOS 版本
45
+ def ios_version
46
+ begin
47
+ cmd = CmdSwitch.version(klass)
48
+ return klass.cmds_useful[cmd][:software][:version] if kind_of?(Cisco, H3C, Maipu)
49
+ rescue Exception
50
+ puts_error
51
+ return ""
52
+ end
53
+ end
54
+
55
+ # IOS 特性集
56
+ def soft_image
57
+ begin
58
+ cmd = CmdSwitch.version(klass)
59
+ return klass.cmds_useful[cmd][:software][:soft_image] if kind_of?(Cisco, Maipu)
60
+
61
+ # H3C 不是在version中查看
62
+ rescue Exception
63
+ puts_error
64
+ return ""
65
+ ensure
66
+ end
67
+ end
68
+
69
+ # 运行时间
70
+ def uptime
71
+ begin
72
+ cmd = CmdSwitch.version(klass)
73
+ return klass.cmds_useful[cmd][:software][:uptime] if kind_of?(Cisco, H3C, Maipu)
74
+ rescue Exception
75
+ puts_error
76
+ return ""
77
+ end
78
+ end
79
+
80
+ # 判断温度是否有警告
81
+ def warning_env?
82
+ begin
83
+ if klass.kind_of? Maipu
84
+ return (klass.include_warning?(:mainboard_temperature) and klass.include_warning?(:cpu_temperature))
85
+ end
86
+ return klass.include_warning?(:cpu_status) if klass.kind_of? Cisco
87
+ rescue Exception
88
+ puts_error
89
+ end
90
+ end
91
+
92
+
93
+ # 判断电源是否有警告
94
+ def warning_power?
95
+ begin
96
+ return klass.include_warning?(:power_status) if kind_of?(Cisco, H3C, Maipu)
97
+ rescue Exception
98
+ puts_error
99
+ end
100
+ end
101
+
102
+ # 判断风扇是否有警告
103
+ def warning_fan?
104
+ begin
105
+ return klass.include_warning?(:fan_status) if kind_of?(Cisco, H3C, Maipu)
106
+ rescue Exception
107
+ puts_error
108
+ end
109
+ end
110
+
111
+ # 只判断最关键的三个信息
112
+ def warning_interface?
113
+ begin
114
+ if kind_of?(Cisco, Maipu, H3C)
115
+ tmp = klass.include_warning?(:input_errors)
116
+ tmp = tmp or klass.include_warning(:crc)
117
+ tmp = tmp or klass.include_warning(:output_errors)
118
+ return tmp
119
+ end
120
+ rescue Exception
121
+ puts_error
122
+ end
123
+ end
124
+
125
+ # 板卡序列号信息
126
+ # 返回数组: [{:name, :pid, :sn, :description}]
127
+ def inventory
128
+ cmd = CmdSwitch.inventory(klass)
129
+ begin
130
+ if kind_of?(Cisco, H3C)
131
+ keys = klass.cmds_useful[cmd][:inventory].keys
132
+ res = []
133
+ keys.each do |sn|
134
+ res << klass.cmds_useful[cmd][:inventory][sn.to_sym]
135
+ end
136
+ return res
137
+ else
138
+ return [{:name => "", :pid => "", :sn => "", :description => ""}]
139
+ end
140
+
141
+ rescue Exception
142
+ puts_error
143
+ return [{:name => "", :pid => "", :sn => "", :description => ""}]
144
+ end
145
+ end
146
+
147
+ def clock
148
+ begin
149
+ cmd = CmdSwitch.clock(klass)
150
+ pool = ["time", "zone", "week", "year", "month", "day"]
151
+ res = []
152
+ pool.each do |key|
153
+ res << klass.cmds_useful[cmd][:clock][key.to_sym]
154
+ end
155
+ return res
156
+ rescue Exception
157
+ puts_error
158
+ return ["", "", "", "", "", ""]
159
+ end
160
+ end
161
+
162
+ def get_manager_ip
163
+ return klass.manager_ip unless klass.manager_ip.nil?
164
+
165
+ begin
166
+ cmd = []
167
+ cmd[0] = CmdSwitch.interface(klass)
168
+ cmd[1] = CmdSwitch.interface_brief(klass)
169
+
170
+ total = []
171
+ manager = ""
172
+
173
+ return unless kind_of?(Cisco, H3C, Maipu)
174
+
175
+ # 如果是 show interfaces
176
+ if klass.has_cmd?(cmd[0])
177
+ total = klass.cmds_useful[cmd[0]][:interface]
178
+
179
+ total.each_value do |info|
180
+ if (info[:iface_id] == (klass.interface[:loopback] + "0")) and info[:state] =~ /(?i)up/
181
+ manager = info[:addr]
182
+ end
183
+ end
184
+
185
+ # 如果是 show ip interface brief
186
+ elsif klass.has_cmd?(cmd[1])
187
+ total = klass.cmds_useful[cmd[1]][:interface_brief]
188
+
189
+ total.each_value do |info|
190
+ # 如果有环回口,那么就直接输出
191
+ if (info[:interface_id].downcase == klass.interface[:loopback].downcase + "0") and (info[:status] =~ /(?i)up/)
192
+ manager = info[:ip]
193
+ end
194
+ end
195
+ end
196
+ return manager
197
+
198
+ rescue Exception
199
+ puts_error
200
+ return ""
201
+ end
202
+ end
203
+
204
+ private
205
+
206
+ # 判断klass是否是指定的Device类型
207
+ def kind_of?(*type)
208
+ type.each do |t|
209
+ return true if klass.kind_of?(t)
210
+ end
211
+ return false
212
+ end
213
+
214
+ # 统一的错误回显
215
+ def puts_error
216
+ res = /`(?<method>.*)'/.match(caller[1])
217
+ print_error "<#{res[:method]}>方法未执行成功 #{klass.class} : #{klass.device_name}"
218
+ end
219
+
220
+ # 对于有相同路径的cmds_useful,可以使用此方法
221
+ # 将按照给出的设备类型返回cmds_useful
222
+ # 方便命令的统一管理
223
+ def type_send(*types)
224
+ types.each do |type|
225
+ if klass.kind_of?(type)
226
+ yield klass.cmds_useful
227
+ else
228
+ next
229
+ end
230
+ end
231
+ end
232
+
233
+ end
234
+ end
233
235
  end