aio_elin 0.0.1

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 (134) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +675 -0
  3. data/README.md +9 -0
  4. data/config.rb +39 -0
  5. data/lib/aio/base/debug.rb +30 -0
  6. data/lib/aio/base/toolkit/array.rb +24 -0
  7. data/lib/aio/base/toolkit/date.rb +46 -0
  8. data/lib/aio/base/toolkit/deep_clone.rb +10 -0
  9. data/lib/aio/base/toolkit/diff.rb +104 -0
  10. data/lib/aio/base/toolkit/excel_office.rb +421 -0
  11. data/lib/aio/base/toolkit/excel_wps.rb +437 -0
  12. data/lib/aio/base/toolkit/excel_wps.rb.bak +299 -0
  13. data/lib/aio/base/toolkit/ipaddr.rb +28 -0
  14. data/lib/aio/base/toolkit/os.rb +26 -0
  15. data/lib/aio/base/toolkit/regexp.rb +32 -0
  16. data/lib/aio/base/toolkit/string.rb +28 -0
  17. data/lib/aio/base/toolkit/table.rb +441 -0
  18. data/lib/aio/base/toolkit/test_diff.rb +9 -0
  19. data/lib/aio/base/toolkit/test_excel.rb +118 -0
  20. data/lib/aio/base/toolkit/test_word.rb +58 -0
  21. data/lib/aio/base/toolkit/word_wps.rb +492 -0
  22. data/lib/aio/base/toolkit.rb +18 -0
  23. data/lib/aio/base.rb +10 -0
  24. data/lib/aio/core/device/cisco.rb +13 -0
  25. data/lib/aio/core/device/cmd_switch.rb +113 -0
  26. data/lib/aio/core/device/h3c.rb +12 -0
  27. data/lib/aio/core/device/huawei.rb +10 -0
  28. data/lib/aio/core/device/juniper.rb +10 -0
  29. data/lib/aio/core/device/maipu.rb +11 -0
  30. data/lib/aio/core/device/methods.rb +233 -0
  31. data/lib/aio/core/device/methods.rb.bak +199 -0
  32. data/lib/aio/core/device/parent_device.rb +275 -0
  33. data/lib/aio/core/device.rb +15 -0
  34. data/lib/aio/core/device_manager.rb +207 -0
  35. data/lib/aio/core/module/cmd.rb +160 -0
  36. data/lib/aio/core/module/description.rb +67 -0
  37. data/lib/aio/core/module/input_style.rb +98 -0
  38. data/lib/aio/core/module/output_style.rb +80 -0
  39. data/lib/aio/core/module/platform.rb +30 -0
  40. data/lib/aio/core/module/ranking.rb +24 -0
  41. data/lib/aio/core/module/special_style.rb +30 -0
  42. data/lib/aio/core/module/template.rb +13 -0
  43. data/lib/aio/core/module.rb +15 -0
  44. data/lib/aio/core/module_loader.rb +161 -0
  45. data/lib/aio/core/module_loader.rb.bak +148 -0
  46. data/lib/aio/core/module_manager.rb +112 -0
  47. data/lib/aio/core/module_manager.rb.bak +78 -0
  48. data/lib/aio/core/parse/file.rb +19 -0
  49. data/lib/aio/core/parse/parser.rb +91 -0
  50. data/lib/aio/core/parse/parser_machine/bak/has_cmd_state.rb +14 -0
  51. data/lib/aio/core/parse/parser_machine/bak/has_context_state.rb +11 -0
  52. data/lib/aio/core/parse/parser_machine/bak/no_cmd_state.rb +11 -0
  53. data/lib/aio/core/parse/parser_machine/bak/no_context_state.rb +11 -0
  54. data/lib/aio/core/parse/parser_machine/full_state.rb +12 -0
  55. data/lib/aio/core/parse/parser_machine/has_device_state.rb +44 -0
  56. data/lib/aio/core/parse/parser_machine/no_device_state.rb +12 -0
  57. data/lib/aio/core/parse/parser_machine/parent_state.rb +26 -0
  58. data/lib/aio/core/parse/parser_machine.rb +47 -0
  59. data/lib/aio/core/parse.rb +6 -0
  60. data/lib/aio/core/text/context.rb +211 -0
  61. data/lib/aio/core/text/line_string.rb +74 -0
  62. data/lib/aio/core/text/warning.rb +179 -0
  63. data/lib/aio/core/text.rb +7 -0
  64. data/lib/aio/core/warning/description.rb +47 -0
  65. data/lib/aio/core/warning/warning_summarize.rb +232 -0
  66. data/lib/aio/core/warning.rb +6 -0
  67. data/lib/aio/core.rb +32 -0
  68. data/lib/aio/license.rb +687 -0
  69. data/lib/aio/resource/cover_picture.png +0 -0
  70. data/lib/aio/resource/line.png +0 -0
  71. data/lib/aio/resource/logo.png +0 -0
  72. data/lib/aio/ui/banner.rb +85 -0
  73. data/lib/aio/ui/readable_text.rb +75 -0
  74. data/lib/aio/ui/verbose.rb +29 -0
  75. data/lib/aio/ui/version.rb +9 -0
  76. data/lib/aio/ui.rb +138 -0
  77. data/lib/aio.rb +13 -0
  78. data/lib/modules/cmd/cisco/show_clock.rb +32 -0
  79. data/lib/modules/cmd/cisco/show_cpu.rb +32 -0
  80. data/lib/modules/cmd/cisco/show_env.rb +71 -0
  81. data/lib/modules/cmd/cisco/show_failover.rb +39 -0
  82. data/lib/modules/cmd/cisco/show_interface_ip_brief.rb +24 -0
  83. data/lib/modules/cmd/cisco/show_interfaces.rb +177 -0
  84. data/lib/modules/cmd/cisco/show_inv.rb +43 -0
  85. data/lib/modules/cmd/cisco/show_ip_interface_brief.rb +42 -0
  86. data/lib/modules/cmd/cisco/show_ip_ospf_nei.rb +38 -0
  87. data/lib/modules/cmd/cisco/show_ip_route_summary.rb +81 -0
  88. data/lib/modules/cmd/cisco/show_memory.rb +27 -0
  89. data/lib/modules/cmd/cisco/show_process_cpu.rb +35 -0
  90. data/lib/modules/cmd/cisco/show_process_memory.rb +63 -0
  91. data/lib/modules/cmd/cisco/show_version.rb +97 -0
  92. data/lib/modules/cmd/h3c/display_clock.rb +32 -0
  93. data/lib/modules/cmd/h3c/display_cpu.rb +51 -0
  94. data/lib/modules/cmd/h3c/display_device_manuinfo.rb +45 -0
  95. data/lib/modules/cmd/h3c/display_fan.rb +91 -0
  96. data/lib/modules/cmd/h3c/display_interface.rb +203 -0
  97. data/lib/modules/cmd/h3c/display_ip_interface_brief.rb +34 -0
  98. data/lib/modules/cmd/h3c/display_ip_routing.rb +68 -0
  99. data/lib/modules/cmd/h3c/display_ip_routing_stat.rb +90 -0
  100. data/lib/modules/cmd/h3c/display_memory.rb +35 -0
  101. data/lib/modules/cmd/h3c/display_ospf_peer.rb +38 -0
  102. data/lib/modules/cmd/h3c/display_power.rb +90 -0
  103. data/lib/modules/cmd/h3c/display_version.rb +54 -0
  104. data/lib/modules/cmd/h3c/display_vrrp_verbose.rb +86 -0
  105. data/lib/modules/cmd/maipu/show_env.rb +34 -0
  106. data/lib/modules/cmd/maipu/show_ip_route.rb +74 -0
  107. data/lib/modules/cmd/maipu/show_ip_route_statistic.rb +36 -0
  108. data/lib/modules/cmd/maipu/show_memory.rb +31 -0
  109. data/lib/modules/cmd/maipu/show_system_fan.rb +66 -0
  110. data/lib/modules/cmd/maipu/show_system_power.rb +66 -0
  111. data/lib/modules/cmd/maipu/show_version.rb +50 -0
  112. data/lib/modules/description/style/crc.rb +22 -0
  113. data/lib/modules/description/style/input_errors.rb +22 -0
  114. data/lib/modules/description/style/overrun.rb +22 -0
  115. data/lib/modules/description/style/proc_ratio.rb +22 -0
  116. data/lib/modules/description/style/protocol.rb +22 -0
  117. data/lib/modules/description/style/register.rb +22 -0
  118. data/lib/modules/description/style/runts.rb +22 -0
  119. data/lib/modules/description/style/template.rb +22 -0
  120. data/lib/modules/description/style/total_output_drops.rb +22 -0
  121. data/lib/modules/input/style/compare_xml.rb +89 -0
  122. data/lib/modules/input/style/console.rb +222 -0
  123. data/lib/modules/input/style/console.rb.bak +114 -0
  124. data/lib/modules/input/style/xinhua_nat.rb +70 -0
  125. data/lib/modules/output/style/boc_day.rb +223 -0
  126. data/lib/modules/output/style/cmds.rb +77 -0
  127. data/lib/modules/output/style/compare_json.rb +26 -0
  128. data/lib/modules/output/style/compare_report.rb +31 -0
  129. data/lib/modules/output/style/compare_xml.rb +86 -0
  130. data/lib/modules/output/style/excel_table_office.rb +407 -0
  131. data/lib/modules/output/style/excel_table_wps.rb +400 -0
  132. data/lib/modules/output/style/summary_report.rb +563 -0
  133. data/lib/modules/special/style/compare.rb +110 -0
  134. metadata +176 -0
@@ -0,0 +1,223 @@
1
+ #coding=utf-8
2
+
3
+ require "aio/core"
4
+
5
+ class Aio::Module::OutputStyle::BocDay < Aio::Module::OutputStyle
6
+ include Aio::Ui::Verbose
7
+
8
+ def initialize
9
+ super({
10
+ :author => "Elin",
11
+ :description => "这个模块是中行每天日常早间巡检输出表格",
12
+ :file_suffix => "txt",
13
+ })
14
+ end
15
+
16
+ def generate
17
+ file = File.new(output_file, "w+")
18
+ $stdout = file
19
+
20
+
21
+ tables = {}
22
+ init(tables, "1#网省行地市骨干及地市下联")
23
+ tables["1#网省行地市骨干及地市下联"][:row] = [
24
+ ["地市联通7606", "A_HBWHC_WBN_DR"],
25
+ ["地市电信7606", "A_HBWHA_WBN_DR"],
26
+ ["地市电信H3C 8808", "A_HBWHA_MAN_DR"],
27
+ ]
28
+
29
+ init(tables, "2#网省行地市骨干及地市下联")
30
+ tables["2#网省行地市骨干及地市下联"][:row] = [
31
+ ["地市联通7606", "B_HBWHC_WBN_DR"],
32
+ ["地市电信7606", "B_HBWHA_WBN_DR"],
33
+ ["地市电信H3C 8808", "B_HBWHA_MAN_DR"],
34
+ ]
35
+
36
+ init(tables, "1#省行核心设备")
37
+ tables["1#省行核心设备"][:row] = [
38
+ ["核心-1", "A_HBWHA_COR_CS01"],
39
+ ["核心-2", "A_HBWHA_COR_CS02"],
40
+ ["楼层汇聚-1", "A_HBWHB_CAM_DS01"],
41
+ ["楼层汇聚-2", "A_HBWHB_CAM_DS02"],
42
+ ]
43
+
44
+ init(tables, "2#省行核心设备")
45
+ tables["2#省行核心设备"][:row] = [
46
+ ["澳门路4507R-1", "B_HBWHA_CAM_DS01"],
47
+ ["澳门路4507R-2", "B_HBWHA_CAM_DS02"],
48
+ ["6506-1", "B_HBWHA_COR_CS01"],
49
+ ["6506-2", "B_HBWHA_COR_CS02"],
50
+ ["同城7206-联通", "B_HBWHC_WBN_DR"],
51
+ ["同城7206-电信", "B_HBWHA_WBN_DR"],
52
+ ]
53
+
54
+ init(tables, "2#广电4507")
55
+ tables["2#广电4507"][:row] = [
56
+ ["广电4507-1", "B_HBWHB_CAM_DS01"],
57
+ ["广电4507-2", "B_HBWHB_CAM_DS02"],
58
+ ]
59
+
60
+ init(tables, "1#网地市上联路由器")
61
+ tables["1#网地市上联路由器"][:row] = [
62
+ ["鄂州1", "A_HBEZA_WBN_AR01"],
63
+ ["鄂州2", "A_HBEZA_WBN_AR02"],
64
+ ["恩施1", "A_HBESA_WBN_AR01"],
65
+ ["恩施2", "A_HBESA_WBN_AR02"],
66
+ ["黄冈1", "A_HBHGA_WBN_AR01"],
67
+ ["黄冈2", "A_HBHGA_WBN_AR02"],
68
+ ["黄石1", "A_HBHSA_WBN_AR01"],
69
+ ["黄石2", "A_HBHSA_WBN_AR02"],
70
+ ["荆门1", "A_HBJMA_WBN_AR01"],
71
+ ["荆门2", "A_HBJMA_WBN_AR02"],
72
+ ["荆州1", "A_HBJZA_WBN_AR01"],
73
+ ["荆州2", "A_HBJZA_WBN_AR02"],
74
+ ["潜江1", "A_HBQJA_WBN_AR01"],
75
+ ["潜江2", "A_HBQJA_WBN_AR02"],
76
+ ["三峡1", "A_HBSXA_WBN_AR01"],
77
+ ["三峡2", "A_HBSXA_WBN_AR02"],
78
+ ["十堰1", "A_HBSYA_WBN_AR01"],
79
+ ["十堰2", "A_HBSYA_WBN_AR02"],
80
+ ["随州1", "A_HBSZA_WBN_AR01"],
81
+ ["随州2", "A_HBSZA_WBN_AR02"],
82
+ ["天门1", "A_HBTMA_WBN_AR01"],
83
+ ["天门2", "A_HBTMA_WBN_AR02"],
84
+ ["仙桃1", "A_HBXTA_WBN_AR01"],
85
+ ["仙桃2", "A_HBXTA_WBN_AR02"],
86
+ ["咸宁1", "A_HBXNA_WBN_AR01"],
87
+ ["咸宁2", "A_HBXNA_WBN_AR02"],
88
+ ["襄樊1", "A_HBXFA_WBN_AR01"],
89
+ ["襄樊2", "A_HBXFA_WBN_AR02"],
90
+ ["孝感1", "A_HBXGA_WBN_AR01"],
91
+ ["孝感2", "A_HBXGA_WBN_AR02"],
92
+ ]
93
+
94
+ init(tables, "2#网地市上联路由器")
95
+ tables["2#网地市上联路由器"][:row] = [
96
+ ["鄂州1", "B_HBEZA_WBN_AR01"],
97
+ ["鄂州2", "B_HBEZA_WBN_AR02"],
98
+ ["恩施1", "B_HBESA_WBN_AR01"],
99
+ ["恩施2", "B_HBESA_WBN_AR02"],
100
+ ["黄冈1", "B_HBHGA_WBN_AR01"],
101
+ ["黄冈2", "B_HBHGA_WBN_AR02"],
102
+ ["黄石1", "B_HBHSA_WBN_AR01"],
103
+ ["黄石2", "B_HBHSA_WBN_AR02"],
104
+ ["荆门1", "B_HBJMA_WBN_AR01"],
105
+ ["荆门2", "B_HBJMA_WBN_AR02"],
106
+ ["荆州1", "B_HBJZA_WBN_AR01"],
107
+ ["荆州2", "B_HBJZA_WBN_AR02"],
108
+ ["潜江1", "B_HBQJA_WBN_AR01"],
109
+ ["潜江2", "B_HBQJA_WBN_AR02"],
110
+ ["三峡1", "B_HBSXA_WBN_AR01"],
111
+ ["三峡2", "B_HBSXA_WBN_AR02"],
112
+ ["十堰1", "B_HBSYA_WBN_AR01"],
113
+ ["十堰2", "B_HBSYA_WBN_AR02"],
114
+ ["随州1", "B_HBSZA_WBN_AR01"],
115
+ ["随州2", "B_HBSZA_WBN_AR02"],
116
+ ["天门1", "B_HBTMA_WBN_AR01"],
117
+ ["天门2", "B_HBTMA_WBN_AR02"],
118
+ ["仙桃1", "B_HBXTA_WBN_AR01"],
119
+ ["仙桃2", "B_HBXTA_WBN_AR02"],
120
+ ["咸宁1", "B_HBXNA_WBN_AR01"],
121
+ ["咸宁2", "B_HBXNA_WBN_AR02"],
122
+ ["襄樊1", "B_HBXFA_WBN_AR01"],
123
+ ["襄樊2", "B_HBXFA_WBN_AR02"],
124
+ ["孝感1", "B_HBXGA_WBN_AR01"],
125
+ ["孝感2", "B_HBXGA_WBN_AR02"],
126
+ ]
127
+
128
+ tidy_tables(tables)
129
+
130
+ res = %Q^
131
+
132
+ #{tables["1#网省行地市骨干及地市下联"][:klass].to_s}
133
+
134
+ #{tables["2#网省行地市骨干及地市下联"][:klass].to_s}
135
+
136
+ #{tables["1#省行核心设备"][:klass].to_s}
137
+
138
+ #{tables["2#省行核心设备"][:klass].to_s}
139
+
140
+ #{tables["2#广电4507"][:klass].to_s}
141
+
142
+ #{tables["1#网地市上联路由器"][:klass].to_s}
143
+
144
+ #{tables["2#网地市上联路由器"][:klass].to_s}
145
+
146
+ ^
147
+ file.write(res)
148
+ $stdout = STDOUT
149
+
150
+ end
151
+
152
+ def tidy_tables(tables)
153
+ tables.each_pair do |desc, info|
154
+ klass = info[:klass]
155
+ info[:row].each do |row|
156
+ device_name = row[1]
157
+
158
+ # 当没有这个设备的时候,还是正常输出
159
+ if device_manager[device_name].nil?
160
+ row << ""
161
+ row << ""
162
+ row << ""
163
+ next
164
+ end
165
+
166
+ output_warning(device_name)
167
+
168
+ type = device_manager[device_name].device_info[:device_model]
169
+ cpu = device_manager[device_name].cpu_percent + "%"
170
+ mem = device_manager[device_name].memory_percent + "%"
171
+
172
+ row << (type.nil? ? "" : type)
173
+ row << (cpu.nil? ? "" : cpu)
174
+ row << (mem.nil? ? "" : mem)
175
+
176
+ klass << row
177
+ end
178
+ end
179
+ end
180
+
181
+ # 初始化tables
182
+ def init(tables, name)
183
+ tables[name] = {}
184
+ tables[name][:row] = []
185
+ tables[name][:klass] = table_main(name)
186
+ end
187
+
188
+ def table_main(header = "")
189
+ col = ["设备用处", "设备名", "设备型号", "CPU(%)", "Memory(%)"]
190
+ table = Aio::Base::Toolkit::Table.new(
191
+ 'Header' => header,
192
+ 'HeaderIndent' => 2,
193
+ 'Columns' => col,
194
+ #'CellPad' => 10,
195
+ 'Indent' => 4)
196
+ end
197
+
198
+ def output_warning(device_name)
199
+ dn = device_manager[device_name]
200
+
201
+ if dn.has_warning?
202
+ print_error device_name
203
+
204
+ if dn.has_warning_serious?
205
+ print_error " 严重的警告信息"
206
+ dn.warning_info_serious.each_pair { |k, v| print_error " #{k} 出现的次数: #{v.size}" }
207
+ end
208
+
209
+ if dn.has_warning_ordinary?
210
+ print_error " 普通的警告信息"
211
+ dn.warning_info_ordinary.each_pair { |k, v| print_error " #{k} 出现的次数: #{v.size}" }
212
+ end
213
+
214
+ if dn.has_warning_compare?
215
+ print_error " 对比的警告信息"
216
+ dn.warning_info_compare.each_pair { |k, v| print_error " #{k} => "; pp v }
217
+ end
218
+
219
+ end
220
+ end
221
+
222
+ end
223
+
@@ -0,0 +1,77 @@
1
+ #coding=utf-8
2
+
3
+ require "aio/core"
4
+ require "pathname"
5
+
6
+ class Aio::Module::OutputStyle::Cmds < Aio::Module::OutputStyle
7
+
8
+ def initialize
9
+ super({
10
+ :author => "Elin",
11
+ :description => "这个模块将生成一个文件夹,其中每个文件为各种设备的巡检命令, 此模块不需要Input Module",
12
+ :file_suffix => "Null",
13
+ })
14
+ end
15
+
16
+ def generate
17
+ # 获得 cmds = {cmd_name => cmd_info}
18
+ cmds = module_manager.get_modules_by_type("cmd")
19
+
20
+ # 取得pf = {device => [cmd, ...]}
21
+ pf = {}
22
+ cmds.each_pair do |cmd, info|
23
+ device = info[:module_layer_2]
24
+ pf[device] = [] unless pf.has_key?(device)
25
+ pf[device] << info[:klass].cmd_full
26
+ end
27
+
28
+ # 各种设备的修改方法
29
+ terminal = {
30
+ "cisco" => ["ter leng 0", "ter leng 24"],
31
+ "h3c" => ["screen-length 0", "screen-length 24"],
32
+ "maipu" => ["more off", "more on"],
33
+ "juniper" => [" | no-more"],
34
+ }
35
+
36
+ text = {}
37
+ # 生成Terminal格式
38
+ pf.each_pair do |device, arr|
39
+ name = device + "_terminal"
40
+ text[name] = []
41
+
42
+ # 当是cisco, h3c, maipu 的时候使用一种方式
43
+ if device == "cisco" or device == "h3c" or device == "maipu"
44
+ text[name] << terminal[device][0]
45
+ arr.each do |cmd|
46
+ text[name] << cmd
47
+ end
48
+ text[name] << terminal[device][1]
49
+
50
+ # 当是 juniper 的时候使用cmd后面跟参数
51
+ elsif device == "juniper"
52
+ arr.each do |cmd|
53
+ text[name] << cmd + terminal[device][0]
54
+ end
55
+ end
56
+
57
+ # 最后将数组改为文本
58
+ text[name] = text[name].join("\r\n!\r\n")
59
+ end
60
+
61
+ # 生成空格的格式
62
+ pf.each_pair do |device, arr|
63
+ name = device + "_blank"
64
+ text[name] = arr.join("\r\n#{' '*10}\r\n!\r\n")
65
+ text[name] << "\r\n#{' '*10}\r\n!\r\n"
66
+ end
67
+
68
+ pn = Pathname.new(output_file)
69
+ Dir.mkdir(output_file) unless pn.directory?
70
+
71
+ text.each_pair do |name, text|
72
+ file = File.new(File.join(output_file, name), "w+")
73
+ file.write(text)
74
+ end
75
+ end
76
+ end
77
+
@@ -0,0 +1,26 @@
1
+ #coding=utf-8
2
+
3
+ require "aio/core"
4
+ require "json"
5
+
6
+
7
+ class Aio::Module::OutputStyle::CompareJson < Aio::Module::OutputStyle
8
+
9
+ def initialize
10
+ super({
11
+ :author => "Elin",
12
+ :description => "这个模块输出为json文件,用于和基准值比较。",
13
+ :file_suffix => "js",
14
+ })
15
+ end
16
+
17
+ def generate
18
+ file = File.new(output_file, "w+")
19
+ device_hash = {}
20
+ each_devices_with_useful do |device_name, useful|
21
+ device_hash[device_name] = useful
22
+ end
23
+ #puts device_hash.to_json
24
+ file.puts device_hash.to_json
25
+ end
26
+ end
@@ -0,0 +1,31 @@
1
+ #coding=utf-8
2
+
3
+ require "aio/core"
4
+ require "pp"
5
+
6
+ class Aio::Module::OutputStyle::CompareReport < 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
+ file = File.new(output_file, "w+")
20
+
21
+ $stdout = file
22
+ device_manager.each_devices do |device_name, klass|
23
+ pp device_name
24
+ pp klass.warning_klass
25
+ puts
26
+ end
27
+
28
+ $stdout = STDOUT
29
+ end
30
+
31
+ end # class
@@ -0,0 +1,86 @@
1
+ #coding=utf-8
2
+
3
+ require "aio/core"
4
+ require "rexml/document"
5
+
6
+ =begin
7
+ <CompareModule description='这个模块输出为XML文件,用于和基准值比较' author='Elin'>
8
+ <device device_name='COS_1'>
9
+ <cpu cmd='display cpu-usage'>
10
+ <slot_id val='1'>
11
+ <seonds_5 val='9%'>
12
+ <minute_1 val='9%'>
13
+ <minutes_5 val='9%'>
14
+ </cpu>
15
+ ...
16
+ </device>
17
+ ...
18
+ </CompareModule>
19
+ =end
20
+
21
+ class Aio::Module::OutputStyle::CompareXML < Aio::Module::OutputStyle
22
+
23
+ def initialize
24
+ super({
25
+ :author => "Elin",
26
+ :description => "这个模块输出为XML文件,用于和基准值比较。",
27
+ :file_suffix => "xml",
28
+ })
29
+ end
30
+
31
+ def generate
32
+ file = File.new(output_file, "w+")
33
+ doc = REXML::Document.new
34
+ root = doc.add_element("CompareModule",{
35
+ 'description' => self.output_info[:description],
36
+ 'author' => self.output_info[:author]}
37
+ )
38
+ # 第一层, device 节
39
+ each_devices_with_useful do |device_name, useful|
40
+ device_root = root.add_element('device', {'device_name' => device_name})
41
+ useful.each_pair do |cmd_name, info|
42
+ info.each_pair do |c, i|
43
+ cmd_root = device_root.add_element(c.to_s, {'cmd' => cmd_name})
44
+ if i.class == Hash
45
+ loop_element(device_root, cmd_root, i)
46
+ elsif i.kind_of? String
47
+ cmd_root.add_attribute('val', i)
48
+ else
49
+ # 这一段留作观察,很有可能没有作用
50
+ puts "output/style/compare_xml.rb# add_element"
51
+ cmd_root.add_element(c.to_s, {'val' => i.to_s})
52
+ end
53
+ end
54
+ end
55
+ end
56
+ #doc.write(STDOUT, 2); puts
57
+ doc.write(file, 2)
58
+ end
59
+
60
+ # 迭代方法
61
+ def loop_element(parent, son, info)
62
+ # 如果val为Hash,则继续循环
63
+ info.each_pair do |key, val|
64
+ if val.class == Hash
65
+ grandson = son.add_element(safe(key))
66
+ loop_element(son, grandson, val)
67
+ end
68
+ end
69
+
70
+ info.each_pair do |key, val|
71
+ next if val.class == Hash
72
+ son.add_element(safe(key), {'val' => val.to_s})
73
+ end
74
+ end
75
+
76
+ # 将可能的字符串问题转化为特殊安全字符,再在解析时恢复
77
+ # 恢复地方是 input/style/compare_xml# convert
78
+ # 1.接口中的 / 字符转化为两个下划线 __
79
+ # 2.路由表中以数字开头的在字符串前面加上 _i
80
+ def safe(key)
81
+ key = key.to_s
82
+ key.gsub!('/', '__') if /\//.match(key)
83
+ key.insert(0, "_i") if /^\d+/.match(key)
84
+ key
85
+ end
86
+ end