aio_elin 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5dc376260ef7b6941766c63d9065a5dfdca7ab8b331f5b6c7d261b536e2899c9
4
- data.tar.gz: bb4e56cbcd6dfa81f724fe03d845f6b0fa3b8d35d3d18c4b9a2ae10b76cb288e
3
+ metadata.gz: ec78b85511d7bf50150105a4a9c4668ce103ea9f4440b5536e1af0c2be9d309f
4
+ data.tar.gz: ca257da733025cf4ccb5dc2297da2ea088b286bf27375fb8c2e53e58c0575020
5
5
  SHA512:
6
- metadata.gz: 8c589c05598e29ab273e5d886acbdc48f6876b4b1f0d421f38be29045aaf6b1391c6f04a8dd71f7268917b3064d6cde80d05f6a14c1565897c3ae4823ce1e6c9
7
- data.tar.gz: f7a265cc7c2d00d6d2340e0df5ae29712241061543305555fed0d4cef9fc3111003c2266d53b897980050323d7ce02648aa11134ebacaa88b08111f770c3f302
6
+ metadata.gz: f90bd170d42af4e816ab04fc345a9b54bee66ea65c757c432290ca692997b4713299f1b0f8b2f18e83707774790a0a7e0460891b41e2c48c0629329d781d943a
7
+ data.tar.gz: ee6f3299b774d705de437a1a7fcadd4428e665630a9656ad80860e954e1a21d2198a982d7314c19ca2ffd3fab2870eef06ff7d8b9192894018d1ba5834a5ba18
@@ -138,6 +138,14 @@ module Aio::Base::Toolkit
138
138
  (old_line || new_line).text
139
139
  end
140
140
 
141
+ def old_text
142
+ old_line.text
143
+ end
144
+
145
+ def new_text
146
+ new_line.text
147
+ end
148
+
141
149
  def empty?
142
150
  (old_line.empty? and new_line.empty?)
143
151
  end
@@ -3,220 +3,221 @@
3
3
  require "aio/core"
4
4
 
5
5
  class Aio::Module::InputStyle::Console < Aio::Module::InputStyle
6
- include Aio::Module
7
- include Aio::Ui::Verbose
8
-
9
- class Machine
10
-
11
- attr_accessor :regs, :state
12
-
13
- def initialize
14
- @cmd_state = CmdState.new(self)
15
- @context_state = ContextState.new(self)
16
- @empty_state = EmptyState.new(self)
17
- @cmd_context = CmdContext.new
18
-
19
- @state = @empty_state
20
- end
21
-
22
- def state
23
- @state.class
24
- end
25
-
26
- def cmd_context
27
- @cmd_context
28
- end
29
-
30
- def to_cmd_state
31
- @state = @cmd_state
32
- end
33
-
34
- def to_context_state
35
- @state = @context_state
36
- end
37
-
38
- def to_empty_state
39
- @state = @empty_state
40
- end
41
-
42
- def parse_line(line)
43
- @state.parse_line(line)
44
- end
45
- end
46
-
47
- class CmdContext
48
-
49
- attr_accessor :device_name, :cmd, :context
50
-
51
- # all_info = [[device_name, cmd, context] ... ]
52
- attr_accessor :all_info
53
-
54
- def initialize
55
- @device_name = ""
56
- @cmd = ""
57
- @context = []
58
- @all_info = []
59
- end
60
-
61
- def done
62
- # 当之前有cmd内容的时候,比较两个的长度
63
- # 长的保留
64
- info_idx = has_cmd?
65
- if info_idx
66
- if @all_info[info_idx][2].size < context.size
67
- @all_info[info_idx][2] = context
68
- end
69
- else
70
-
71
- # 如果都没有,那么就直接添加
72
- @all_info << [device_name, cmd, context]
73
- end
74
- self.clear
75
- end
76
-
77
- def has_cmd?
78
- @all_info.each_with_index do |info, idx|
79
- next unless info[1] == device_name
80
- return idx if info[2] == cmd
81
- end
82
-
83
- return nil
84
- end
85
-
86
- def clear
87
- @device_name = ""
88
- @cmd = ""
89
- @context = []
90
- end
91
- end
92
-
93
- class State
94
-
95
- include Aio::Ui::Verbose
96
-
97
- def initialize(machine)
98
- @machine = machine
99
- end
100
-
101
- def cmd_context
102
- @machine.cmd_context
103
- end
104
- end
105
-
106
- class EmptyState < State
107
- def parse_line(line)
108
-
109
- # 当前是空的状态
110
- # 判断当前行有没有模块中的命令
111
- line = Aio::Base::Toolkit::String.safe(line)
112
- return unless @machine.regs.match(line)
113
-
114
- @machine.to_cmd_state
115
- @machine.parse_line(line)
116
- end
117
- end
118
-
119
- class CmdState < State
120
- def parse_line(line)
121
- # 判断是不是cmd命令行
122
- res = /^[\[|<]?(?<name>.*)(#|>|\])(?<cmd>.*)/.match(line)
123
- if res.nil?
124
- @machine.to_empty_state
125
- return
126
- end
127
-
128
- # 当已经发现了是cmd行,那么紧接下来就是收集文本内容
129
- cmd_context.device_name = res[:name]
130
- cmd_context.cmd = res[:cmd]
131
- @machine.to_context_state
132
- end
133
- end
134
-
135
- class ContextState < State
136
-
137
- def parse_line(line)
138
- # 如果这行是命令行格式,那么就代表上一个cmd内容结束
139
- tmp_reg = ::Regexp.new "^[\\[|<]?#{cmd_context.device_name}(#|>|\\])"
140
-
141
- # 可能会出现UTF-8识别不出摄氏度符号的问题
142
- # 已经通过安全字符解决
143
- begin
144
- if tmp_reg.match(line)
145
- cmd_context.done
146
-
147
- # 完成后将状态设置为空,并且重新分析这一行
148
- # 毕竟如果这行也cmd行呢
149
- @machine.to_empty_state
150
- return @machine.parse_line(line)
151
- end
152
- rescue => e
153
- print_error cmd_context.device_name + " 设备巡检信息编码出现问题"
154
- print_error line + " : " + e.message
155
- end
156
-
157
-
158
- cmd_context.context << line
159
- end
160
- end
161
-
162
- def initialize
163
- super({
164
- :author => "Elin",
165
- :description => "这个模块用于对命令行格式的输入处理",
166
- :platform => "all",
167
- })
168
- @machine = Machine.new
169
- end
170
-
171
- def parse
172
- dir = self.input_file
173
- dir_pn = Pathname.new(dir)
174
-
175
- # 加载所有的cmd正则表达式
176
- @machine.regs = merge_regs(ext_info[:cmds_reg])
177
-
178
- # 如果是单个文件的话,直接进入文件解析模式
179
- if dir_pn.file?
180
- parse_file(dir_pn)
181
- else
182
-
183
- # 如果是文件夹的话,那么就对每个文件进行解析
184
- Find.find(dir) do |file|
185
- fn = Pathname.new(file)
186
- parse_file(file) if fn.file?
187
- end
188
- end
189
-
190
- @machine.cmd_context.all_info.each do |info|
191
- yield info[0], info[1], info[2]
192
- end
193
- end
194
-
195
- def parse_file(file)
196
- fo = File.open(file, "r+", :encoding => "utf-8")
197
-
198
- fo.each_line do |line|
199
- begin
200
- line = Aio::Base::Toolkit::String.safe(line)
201
- line = line.strip
202
- rescue => e
203
- print_error line + " : " + e.message
204
- end
205
-
206
- @machine.parse_line(line)
207
- end
208
-
209
- # 如果最后没有done结束,则手动结束
210
- if @machine.state == ContextState
211
- @machine.cmd_context.done
212
- end
213
- end
214
-
215
- def merge_regs(arr_regs)
216
- regs = Aio::Base::Toolkit::Regexp.merge(arr_regs).to_s
217
- regs.gsub!('(^', '(')
218
- ::Regexp.new(regs)
219
- end
6
+ include Aio::Module
7
+ include Aio::Ui::Verbose
8
+
9
+ class Machine
10
+
11
+ attr_accessor :regs, :state
12
+
13
+ def initialize
14
+ @cmd_state = CmdState.new(self)
15
+ @context_state = ContextState.new(self)
16
+ @empty_state = EmptyState.new(self)
17
+ @cmd_context = CmdContext.new
18
+
19
+ @state = @empty_state
20
+ end
21
+
22
+ def state
23
+ @state.class
24
+ end
25
+
26
+ def cmd_context
27
+ @cmd_context
28
+ end
29
+
30
+ def to_cmd_state
31
+ @state = @cmd_state
32
+ end
33
+
34
+ def to_context_state
35
+ @state = @context_state
36
+ end
37
+
38
+ def to_empty_state
39
+ @state = @empty_state
40
+ end
41
+
42
+ def parse_line(line)
43
+ @state.parse_line(line)
44
+ end
45
+ end
46
+
47
+ class CmdContext
48
+
49
+ attr_accessor :device_name, :cmd, :context
50
+
51
+ # all_info = [[device_name, cmd, context] ... ]
52
+ attr_accessor :all_info
53
+
54
+ def initialize
55
+ @device_name = ""
56
+ @cmd = ""
57
+ @context = []
58
+ @all_info = []
59
+ end
60
+
61
+ def done
62
+ # 当之前有cmd内容的时候,比较两个的长度
63
+ # 长的保留
64
+ info_idx = has_cmd?
65
+ if info_idx
66
+ if @all_info[info_idx][2].size < context.size
67
+ @all_info[info_idx][2] = context
68
+ end
69
+ else
70
+
71
+ # 如果都没有,那么就直接添加
72
+ @all_info << [device_name, cmd, context]
73
+ end
74
+ self.clear
75
+ end
76
+
77
+ def has_cmd?
78
+ @all_info.each_with_index do |info, idx|
79
+ next unless info[0] == device_name
80
+ return idx if info[1] == cmd
81
+ end
82
+
83
+ return nil
84
+ end
85
+
86
+ def clear
87
+ @device_name = ""
88
+ @cmd = ""
89
+ @context = []
90
+ end
91
+ end
92
+
93
+ class State
94
+
95
+ include Aio::Ui::Verbose
96
+
97
+ def initialize(machine)
98
+ @machine = machine
99
+ end
100
+
101
+ def cmd_context
102
+ @machine.cmd_context
103
+ end
104
+ end
105
+
106
+ class EmptyState < State
107
+ def parse_line(line)
108
+
109
+ # 当前是空的状态
110
+ # 判断当前行有没有模块中的命令
111
+ line = Aio::Base::Toolkit::String.safe(line)
112
+ return unless @machine.regs.match(line)
113
+
114
+ @machine.to_cmd_state
115
+ @machine.parse_line(line)
116
+ end
117
+ end
118
+
119
+ class CmdState < State
120
+ def parse_line(line)
121
+ # 判断是不是cmd命令行
122
+ res = /^[\[|<]?(?<name>.*)(#|>|\])(?<cmd>.*)/.match(line)
123
+ if res.nil?
124
+ @machine.to_empty_state
125
+ return
126
+ end
127
+
128
+ # 当已经发现了是cmd行,那么紧接下来就是收集文本内容
129
+ cmd_context.device_name = res[:name]
130
+ cmd_context.cmd = res[:cmd]
131
+ @machine.to_context_state
132
+ end
133
+ end
134
+
135
+ class ContextState < State
136
+
137
+ def parse_line(line)
138
+ # 如果这行是命令行格式,那么就代表上一个cmd内容结束
139
+ tmp_reg = ::Regexp.new "^[\\[|<]?#{cmd_context.device_name}(#|>|\\])"
140
+
141
+ # 可能会出现UTF-8识别不出摄氏度符号的问题
142
+ # 已经通过安全字符解决
143
+ begin
144
+ if tmp_reg.match(line)
145
+ cmd_context.done
146
+
147
+ # 完成后将状态设置为空,并且重新分析这一行
148
+ # 毕竟如果这行也cmd行呢
149
+ @machine.to_empty_state
150
+ return @machine.parse_line(line)
151
+ end
152
+ rescue => e
153
+ print_error cmd_context.device_name + " 设备巡检信息编码出现问题"
154
+ print_error line + " : " + e.message
155
+ end
156
+
157
+
158
+ cmd_context.context << line
159
+ end
160
+ end
161
+
162
+ def initialize
163
+ super({
164
+ :author => "Elin",
165
+ :description => "这个模块用于对命令行格式的输入处理",
166
+ :platform => "all",
167
+ })
168
+ @machine = Machine.new
169
+ end
170
+
171
+ def parse
172
+ dir = self.input_file
173
+ dir_pn = Pathname.new(dir)
174
+
175
+ # 加载所有的cmd正则表达式
176
+ @machine.regs = merge_regs(ext_info[:cmds_reg])
177
+
178
+ # 如果是单个文件的话,直接进入文件解析模式
179
+ if dir_pn.file?
180
+ parse_file(dir_pn)
181
+ else
182
+
183
+ # 如果是文件夹的话,那么就对每个文件进行解析
184
+ Find.find(dir) do |file|
185
+ fn = Pathname.new(file)
186
+ parse_file(file) if fn.file?
187
+ end
188
+ end
189
+
190
+ @machine.cmd_context.all_info.each do |info|
191
+ yield info[0], info[1], info[2]
192
+ end
193
+ end
194
+
195
+ def parse_file(file)
196
+ fo = File.open(file, "r+", :encoding => "utf-8")
197
+
198
+ fo.each_line do |line|
199
+ begin
200
+ line = Aio::Base::Toolkit::String.safe(line)
201
+ line = line.strip
202
+ rescue => e
203
+ print_error line + " : " + e.message
204
+ end
205
+
206
+ @machine.parse_line(line)
207
+ end
208
+
209
+ # 如果最后没有done结束,则手动结束
210
+ if @machine.state == ContextState
211
+ @machine.cmd_context.done
212
+ @machine.to_cmd_state
213
+ end
214
+ end
215
+
216
+ def merge_regs(arr_regs)
217
+ regs = Aio::Base::Toolkit::Regexp.merge(arr_regs).to_s
218
+ regs.gsub!('(^', '(')
219
+ ::Regexp.new(regs)
220
+ end
220
221
  end
221
222
 
222
223
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aio_elin
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-28 00:00:00.000000000 Z
11
+ date: 2018-12-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 网络设备巡检工具
14
14
  email: 365433079@qq.com