vipnet_parser 2.4.6 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vipnet_parser/struct.rb +136 -0
- data/lib/vipnet_parser.rb +1 -0
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd4aac8bf2f2cea3f9bb09767fdff61ee56cd4f5
|
4
|
+
data.tar.gz: 26457db935a0e9f58b7ae5a2a25008d22ea90760
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1966c6bc0f4b30eb88a80d5954fa0d74068538038f4409711ead9ca6a4617302a3fe6f648d9c847f68e91a2417f626ed51c84b9e447e6f2a03ce4adb7b2845b6
|
7
|
+
data.tar.gz: 4cdee64d7a7e96926eac5e9a14fb4c410c3f2a13196b7b2b04064ec313163dc2ecd48c510a6fc23570ea4c44318e95f7a1374331b5df4b3c3c6aebc0110a8827
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require "vipnet_parser/vipnet_config"
|
2
|
+
|
3
|
+
module VipnetParser
|
4
|
+
class Struct < VipnetConfig
|
5
|
+
attr_accessor :string, :hash
|
6
|
+
|
7
|
+
DEFAULT_PARSE_ARGS = {
|
8
|
+
format: :hash,
|
9
|
+
encoding: "cp866",
|
10
|
+
}
|
11
|
+
|
12
|
+
def parse(args = DEFAULT_PARSE_ARGS)
|
13
|
+
args = DEFAULT_PARSE_ARGS.merge(args)
|
14
|
+
format, encoding = args.values_at(
|
15
|
+
:format, :encoding, :normalize_names,
|
16
|
+
)
|
17
|
+
|
18
|
+
# Change encoding to utf8.
|
19
|
+
string = self.string
|
20
|
+
.force_encoding(encoding)
|
21
|
+
.encode("utf-8", replace: nil)
|
22
|
+
|
23
|
+
sign_aliases = { "+" => true, "-" => false }
|
24
|
+
|
25
|
+
case format
|
26
|
+
when :hash
|
27
|
+
@hash = { nodes: [] }
|
28
|
+
|
29
|
+
current_node_id = nil
|
30
|
+
previous_node = nil
|
31
|
+
current_usergroups = []
|
32
|
+
current_users = []
|
33
|
+
lines = string.split("\r\n")
|
34
|
+
lines.each_with_index do |line, line_index|
|
35
|
+
line_hash = _line_hash(line)
|
36
|
+
next unless line_hash
|
37
|
+
|
38
|
+
# Normalize data.
|
39
|
+
line_hash.each do |_, higher_name_hash|
|
40
|
+
next unless higher_name_hash.class == Hash
|
41
|
+
|
42
|
+
parsed_ids = VipnetParser.id(higher_name_hash[:id])
|
43
|
+
id =
|
44
|
+
if parsed_ids.size > 0
|
45
|
+
parsed_ids.first
|
46
|
+
else
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
higher_name_hash[:id] = id
|
50
|
+
|
51
|
+
higher_name_hash[:name].rstrip!
|
52
|
+
if higher_name_hash[:name].size == 0
|
53
|
+
higher_name_hash[:name] = nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
line_hash[:node][:network_address].rstrip!
|
57
|
+
line_hash[:user][:sign] = sign_aliases[line_hash[:user][:sign]]
|
58
|
+
line_hash[:usergroup] = nil if (!line_hash[:usergroup][:id] && !line_hash[:usergroup][:name])
|
59
|
+
|
60
|
+
# first id
|
61
|
+
if !current_node_id && line_hash[:node][:id]
|
62
|
+
current_node_id = line_hash[:node][:id]
|
63
|
+
end
|
64
|
+
|
65
|
+
# initial previous node
|
66
|
+
if !previous_node
|
67
|
+
previous_node = line_hash[:node]
|
68
|
+
end
|
69
|
+
|
70
|
+
next_node_appears = (line_hash[:node][:id] && current_node_id != line_hash[:node][:id])
|
71
|
+
this_is_the_last_line = (line_index == lines.size - 1)
|
72
|
+
|
73
|
+
if this_is_the_last_line
|
74
|
+
current_usergroups.push(line_hash[:usergroup]) if line_hash[:usergroup]
|
75
|
+
current_users.push(line_hash[:user])
|
76
|
+
end
|
77
|
+
|
78
|
+
if next_node_appears || this_is_the_last_line
|
79
|
+
final_hash = previous_node
|
80
|
+
final_hash[:usergroups] = current_usergroups.dup
|
81
|
+
final_hash[:users] = current_users.dup
|
82
|
+
@hash[:nodes].push(final_hash)
|
83
|
+
end
|
84
|
+
|
85
|
+
if next_node_appears
|
86
|
+
current_node_id = line_hash[:node][:id]
|
87
|
+
previous_node = line_hash[:node]
|
88
|
+
current_usergroups = []
|
89
|
+
current_users = []
|
90
|
+
end
|
91
|
+
|
92
|
+
current_usergroups.push(line_hash[:usergroup]) if line_hash[:usergroup]
|
93
|
+
current_users.push(line_hash[:user])
|
94
|
+
end
|
95
|
+
|
96
|
+
@hash
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def _line_hash(line)
|
101
|
+
# NOTE: could be done without regexp, but it seems easier with.
|
102
|
+
line_regexp = /^
|
103
|
+
(?<node>.{#{15 + 1 + 50 + 1 + 8}})│
|
104
|
+
(?<usergroup>.{#{50 + 1 + 8}})│
|
105
|
+
(?<user>.{#{56 + 1 + 8 + 1 + 1}})
|
106
|
+
$/x
|
107
|
+
node_regexp = /(?<network_address>.{15})│(?<name>.{50})│(?<id>.{8})/
|
108
|
+
usergroup_regexp = /(?<name>.{50})│(?<id>.{8})/
|
109
|
+
user_regexp = /(?<name>.{56})│(?<id>.{8})│(?<sign>.{1})/
|
110
|
+
regexps_map = {
|
111
|
+
node: node_regexp,
|
112
|
+
usergroup: usergroup_regexp,
|
113
|
+
user: user_regexp,
|
114
|
+
}
|
115
|
+
|
116
|
+
line_match = line_regexp.match(line)
|
117
|
+
return unless line_match
|
118
|
+
line_names = line_match.names.map { |name| name.to_sym }
|
119
|
+
line_hash = Hash[line_names.zip(line_match.captures)]
|
120
|
+
|
121
|
+
hash = {}
|
122
|
+
regexps_map.each do |higher_name_component, regexp|
|
123
|
+
match = regexp.match(line_hash[higher_name_component])
|
124
|
+
next unless match
|
125
|
+
names = match.names.map { |name| name.to_sym }
|
126
|
+
higher_name_hash = Hash[names.zip(match.captures)]
|
127
|
+
|
128
|
+
hash[higher_name_component] = higher_name_hash
|
129
|
+
end
|
130
|
+
|
131
|
+
hash
|
132
|
+
end
|
133
|
+
|
134
|
+
private :_line_hash
|
135
|
+
end
|
136
|
+
end
|
data/lib/vipnet_parser.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vipnet_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Morozov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Parses ViPNet™ IDs, iplir.conf and other files
|
14
14
|
email: ntcomp12@gmail.com
|
@@ -20,6 +20,7 @@ files:
|
|
20
20
|
- lib/vipnet_parser/iplirconf.rb
|
21
21
|
- lib/vipnet_parser/nodename.rb
|
22
22
|
- lib/vipnet_parser/strings.rb
|
23
|
+
- lib/vipnet_parser/struct.rb
|
23
24
|
- lib/vipnet_parser/vipnet_config.rb
|
24
25
|
homepage: https://github.com/kengho/vipnet_parser
|
25
26
|
licenses:
|
@@ -41,7 +42,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
42
|
version: '0'
|
42
43
|
requirements: []
|
43
44
|
rubyforge_project:
|
44
|
-
rubygems_version: 2.
|
45
|
+
rubygems_version: 2.5.2.2
|
45
46
|
signing_key:
|
46
47
|
specification_version: 4
|
47
48
|
summary: ViPNet™ strings parser
|