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.
- checksums.yaml +4 -4
- data/config.rb +32 -32
- data/lib/aio/base/toolkit/excel_wps.rb +1 -0
- data/lib/aio/base/toolkit/hash.rb +95 -0
- data/lib/aio/base/toolkit/myers.rb +161 -0
- data/lib/aio/base/toolkit.rb +2 -0
- data/lib/aio/core/device/cmd_switch.rb +1 -1
- data/lib/aio/core/device/h3c.rb +2 -0
- data/lib/aio/core/device/maipu.rb +8 -0
- data/lib/aio/core/device/methods.rb +230 -228
- data/lib/aio/core/device/parent_device.rb +270 -267
- data/lib/aio/core/device_manager.rb +255 -202
- data/lib/aio/core/module/cmd.rb +155 -150
- data/lib/aio/core/module/compare.rb +39 -0
- data/lib/aio/core/module/output_style.rb +2 -0
- data/lib/aio/core/module.rb +1 -0
- data/lib/aio/core/module_loader.rb +11 -0
- data/lib/aio/core/parse/file.rb +12 -14
- data/lib/aio/core/parse/parser.rb +99 -87
- data/lib/aio/core/parse/parser_machine/has_device_state.rb +42 -42
- data/lib/aio/core/parse/parser_machine.rb +44 -44
- data/lib/aio/core/text/block.rb +88 -0
- data/lib/aio/core/text/compare.rb +109 -0
- data/lib/aio/core/text/context.rb +206 -206
- data/lib/aio/core/text/line_string.rb +17 -62
- data/lib/aio/core/text/match_string_info.rb +73 -0
- data/lib/aio/core/text/warning.rb +175 -175
- data/lib/aio/core/text.rb +3 -0
- data/lib/aio/core/warning/warning_summarize.rb +246 -229
- data/lib/aio/core.rb +3 -0
- data/lib/aio/ui/logger.rb +38 -0
- data/lib/aio/ui/verbose.rb +6 -2
- data/lib/aio/ui.rb +135 -134
- data/lib/modules/cmd/cisco/show_version.rb +84 -84
- data/lib/modules/cmd/h3c/display_cpu.rb +41 -41
- data/lib/modules/cmd/h3c/display_version.rb +43 -43
- data/lib/modules/cmd/maipu/show_clock.rb +32 -0
- data/lib/modules/cmd/maipu/show_cpu.rb +36 -0
- data/lib/modules/cmd/maipu/show_ip_interface_brief.rb +44 -0
- data/lib/modules/cmd/maipu/show_memory.rb +22 -22
- data/lib/modules/cmd/maipu/show_version.rb +40 -40
- data/lib/modules/input/style/compare_xml.rb +73 -73
- data/lib/modules/output/style/cmds.rb +3 -3
- data/lib/modules/output/style/compare_diff.rb +23 -0
- data/lib/modules/output/style/excel_table_office.rb +1 -0
- data/lib/modules/output/style/excel_table_wps.rb +1 -0
- data/lib/modules/output/style/summary_report.rb +2 -1
- data/lib/modules/special/style/compare.rb +153 -103
- data/lib/modules/special/style/compare_old.rb +121 -0
- data/lib/modules/special/style/compare_with_device_manager.rb +227 -0
- metadata +16 -3
@@ -1,44 +1,44 @@
|
|
1
1
|
module Aio::Parse
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
2
|
+
class HasDeviceState < ParentState
|
3
|
+
|
4
|
+
def get_device(opts)
|
5
|
+
self.device_manager.add_device(opts)
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_full(opts)
|
9
|
+
|
10
|
+
if ! check_full(opts)
|
11
|
+
no_full
|
12
|
+
elsif
|
13
|
+
@machine.to_full_state
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def no_full
|
19
|
+
end
|
20
|
+
|
21
|
+
# 验证是否有cmd和context了
|
22
|
+
def check_full(opts={})
|
23
|
+
device_name = opts[:device_name]
|
24
|
+
device_klass = self.device_manager.devices[device_name]
|
25
|
+
|
26
|
+
org_cmd = opts[:cmd]
|
27
|
+
org_context = opts[:context]
|
28
|
+
org_cmd_reg = Aio::Base::Toolkit::Regexp.to_reg(org_cmd)
|
29
|
+
device_klass.cmds_context.each_pair do |cmd, context|
|
30
|
+
|
31
|
+
# 只有当有cmd, 并且context不为空的时候才算有
|
32
|
+
# FIXME 可以在这里的context类加入.check_avlid? 查看是否有效
|
33
|
+
if org_cmd_reg.match(cmd)
|
34
|
+
if ! context.empty?
|
35
|
+
return true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
44
|
end
|
@@ -1,47 +1,47 @@
|
|
1
1
|
module Aio::Parse
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
2
|
+
|
3
|
+
require "aio/core/parse/parser_machine/parent_state"
|
4
|
+
require "aio/core/parse/parser_machine/no_device_state"
|
5
|
+
require "aio/core/parse/parser_machine/has_device_state"
|
6
|
+
require "aio/core/parse/parser_machine/full_state"
|
7
|
+
|
8
|
+
class ParserMachine
|
9
|
+
# 保存状态机的状态
|
10
|
+
attr_reader :state
|
11
|
+
|
12
|
+
# device_manager
|
13
|
+
attr_reader :device_manager
|
14
|
+
|
15
|
+
def initialize(device_manager)
|
16
|
+
@device_manager = device_manager
|
17
|
+
|
18
|
+
@no_device_state = Aio::Parse::NoDeviceState.new(self)
|
19
|
+
@has_device_state = Aio::Parse::HasDeviceState.new(self)
|
20
|
+
@full_state = Aio::Parse::FullState.new(self)
|
21
|
+
|
22
|
+
@state = @no_device_state
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_device(opts)
|
26
|
+
@state.get_device(opts)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_full(opts)
|
30
|
+
@state.get_full(opts)
|
31
|
+
end
|
32
|
+
|
33
|
+
# 状态的切换
|
34
|
+
def to_no_device_state
|
35
|
+
@state = @no_device_state
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_has_device_state
|
39
|
+
@state = @has_device_state
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_full_state
|
43
|
+
@state = @full_state
|
44
|
+
end
|
45
|
+
end
|
46
46
|
end
|
47
47
|
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Aio::Text
|
2
|
+
class Block
|
3
|
+
attr_accessor :content, :line
|
4
|
+
|
5
|
+
def initialize(block)
|
6
|
+
@block = block
|
7
|
+
end
|
8
|
+
|
9
|
+
def inspect
|
10
|
+
@block.inspect
|
11
|
+
end
|
12
|
+
|
13
|
+
def nil?
|
14
|
+
@block.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](sym)
|
18
|
+
@block[sym]
|
19
|
+
end
|
20
|
+
|
21
|
+
# 有两种更新的方式,不加str 那么就是从block中的提取
|
22
|
+
# 如果有str, 则直接使用str
|
23
|
+
def update(info, sym, str=nil)
|
24
|
+
sym = sym.to_sym
|
25
|
+
if info.nil?
|
26
|
+
print_error "请检查update中的第一个参数是否定义"
|
27
|
+
pp caller
|
28
|
+
end
|
29
|
+
|
30
|
+
if str.nil?
|
31
|
+
info[sym] = match_string(self[sym].strip)
|
32
|
+
else
|
33
|
+
info[sym] = match_string(str.to_s.strip)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def update_arr(info, sym)
|
38
|
+
sym = sym.to_sym
|
39
|
+
info[sym] ||= []
|
40
|
+
info[sym] << match_string(self[sym].strip)
|
41
|
+
end
|
42
|
+
|
43
|
+
def update_hash(info, sym, key, val)
|
44
|
+
sym = sym.to_sym
|
45
|
+
info[sym] ||= {}
|
46
|
+
info[sym][key] = match_string(val.strip)
|
47
|
+
end
|
48
|
+
|
49
|
+
# 参数info 放置useful
|
50
|
+
# 参数sym 为Symbol类型的标示
|
51
|
+
# 参数level 为 :serious 或 :ordinary
|
52
|
+
# 参数mod 一般为self
|
53
|
+
# 参数opt[:string] 当block中没有sym项时使用
|
54
|
+
def warning(info, sym, level, mod, opt={})
|
55
|
+
sym = sym.to_sym
|
56
|
+
self.update(info, sym, opt[:string])
|
57
|
+
# Aio::Text::Warning 类中的warning方法
|
58
|
+
mod.warning_klass.warning(info, sym, level, mod, opt[:force])
|
59
|
+
end
|
60
|
+
|
61
|
+
def warning_serious(info, sym, mod, opt={})
|
62
|
+
sym = sym.to_sym
|
63
|
+
self.update(info, sym, opt[:string])
|
64
|
+
mod.warning_klass.warning_serious(info, sym, mod, opt[:force])
|
65
|
+
end
|
66
|
+
|
67
|
+
def warning_ordinary(info, sym, mod, opt={})
|
68
|
+
sym = sym.to_sym
|
69
|
+
self.update(info, sym, opt[:string])
|
70
|
+
mod.warning_klass.warning_ordinary(info, sym, mod, opt[:force])
|
71
|
+
end
|
72
|
+
|
73
|
+
# 加入content和行数信息
|
74
|
+
def match_string(str)
|
75
|
+
MatchStringInfo.new(str, content, line)
|
76
|
+
end
|
77
|
+
|
78
|
+
def method_missing(m, *args)
|
79
|
+
if @block.respond_to? m
|
80
|
+
@block.send(m, args)
|
81
|
+
|
82
|
+
else
|
83
|
+
super
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# 对Compare信息进行处理
|
2
|
+
module Aio::Text
|
3
|
+
class Compare
|
4
|
+
|
5
|
+
attr_accessor :cmd
|
6
|
+
|
7
|
+
# 比较和被比较的差异值
|
8
|
+
def initialize
|
9
|
+
@cmd = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
# 以每个cmd分类比较信息
|
13
|
+
def <<(info)
|
14
|
+
cmd_name = info[:e].shift
|
15
|
+
|
16
|
+
cmd[cmd_name] ||= CompareDiff.new
|
17
|
+
cmd[cmd_name] << info
|
18
|
+
end
|
19
|
+
|
20
|
+
def clear
|
21
|
+
@cmd = {}
|
22
|
+
end
|
23
|
+
|
24
|
+
def size
|
25
|
+
res = 0
|
26
|
+
cmd.values do |cd|
|
27
|
+
res += cd.size
|
28
|
+
end
|
29
|
+
res
|
30
|
+
end
|
31
|
+
|
32
|
+
def empty?
|
33
|
+
cmd.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def each_cmd_with_diff
|
37
|
+
@cmd.each_pair do |c, e|
|
38
|
+
yield c, e
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class CompareDiff
|
44
|
+
|
45
|
+
# cm1 = [ MatchStringInfo_A, MatchStringInfo_A, .. ]
|
46
|
+
attr_accessor :cm1, :cm2
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
@cm1 = []
|
50
|
+
@cm2 = []
|
51
|
+
end
|
52
|
+
|
53
|
+
# info #=> { :cm => :cm1, :e => [cmd, key, match_string_info] }
|
54
|
+
def <<(info)
|
55
|
+
case info[:cm]
|
56
|
+
when :cm1
|
57
|
+
@cm1 << info[:e].pop
|
58
|
+
when :cm2
|
59
|
+
@cm2 << info[:e].pop
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# 两个文本集合
|
64
|
+
def content_muster
|
65
|
+
{ cm1: content, cm2: compare_content }
|
66
|
+
end
|
67
|
+
|
68
|
+
# 文本
|
69
|
+
def content
|
70
|
+
return [""] if cm1.first.nil?
|
71
|
+
cm1.first.content
|
72
|
+
end
|
73
|
+
|
74
|
+
# 比较的文本
|
75
|
+
def content_compare
|
76
|
+
return [""] if cm2.first.nil?
|
77
|
+
cm2.first.content
|
78
|
+
end
|
79
|
+
|
80
|
+
def size
|
81
|
+
cm1.size
|
82
|
+
end
|
83
|
+
|
84
|
+
def lines
|
85
|
+
res = []
|
86
|
+
cm1.each do |e|
|
87
|
+
res << e.line
|
88
|
+
end
|
89
|
+
|
90
|
+
res.uniq
|
91
|
+
end
|
92
|
+
|
93
|
+
def lines_compare
|
94
|
+
res = []
|
95
|
+
cm2.each do |e|
|
96
|
+
res << e.line
|
97
|
+
end
|
98
|
+
|
99
|
+
res.uniq
|
100
|
+
end
|
101
|
+
|
102
|
+
# 所有不同行的集合
|
103
|
+
def lines_muster
|
104
|
+
{ cm1: lines, cm2: lines_compare }
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|