aio_elin 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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