vipnet_parser 2.0.2 → 2.2.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/iplirconf.rb +53 -26
- data/lib/vipnet_parser/nodename.rb +19 -8
- data/lib/vipnet_parser/strings.rb +14 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0018f8a0e0d0d113c4e1e5c203a2a498e52575b6
|
4
|
+
data.tar.gz: 01d8e9fc145b3ea3ffa321ea8a5f5f99fa0df178
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93f780cb24ab89dbc740feadd338d97ff570cb13578f73dd0f7fa357363e3904f6cc30a1b821077098d821cf2cefdab2d2d501e73eb7242c6060f7489dbab3d1
|
7
|
+
data.tar.gz: fde5be2a5e48a79ee5bdc6d59bf99951c8df98143d9ad7c098355dddd3e7e651bfb57b90a7a5016031de5f61056e12ca211d2a74eb5b728e4e2d21cd00c7b3cf
|
@@ -8,25 +8,33 @@ module VipnetParser
|
|
8
8
|
@string = iplirconf_file
|
9
9
|
end
|
10
10
|
|
11
|
-
DEFAULT_PARSE_ARGS = {
|
11
|
+
DEFAULT_PARSE_ARGS = {
|
12
|
+
format: :hash,
|
13
|
+
encoding: "koi8-r",
|
14
|
+
normalize_names: false,
|
15
|
+
}
|
12
16
|
|
13
17
|
def parse(args = DEFAULT_PARSE_ARGS)
|
14
18
|
args = DEFAULT_PARSE_ARGS.merge(args)
|
15
|
-
format, encoding, normalize_names = args.values_at(
|
19
|
+
format, encoding, normalize_names = args.values_at(
|
20
|
+
:format, :encoding, :normalize_names,
|
21
|
+
)
|
16
22
|
|
17
|
-
#
|
23
|
+
# Change encoding to utf8 and remove comments.
|
18
24
|
string = self.string
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
25
|
+
.force_encoding(encoding)
|
26
|
+
.encode("utf-8")
|
27
|
+
.gsub(/^#.*\n/, "")
|
28
|
+
.gsub(/^;.*\n/, "")
|
23
29
|
|
24
30
|
# "[id]something[server]something".split(/(?=\[.+\])/)
|
25
|
-
# =>
|
31
|
+
# =>
|
32
|
+
# ["[id]something", "[server]something"]
|
26
33
|
string = string.split(/(?=\[.+\])/)
|
27
34
|
|
28
35
|
# ["[id]something1", "[server]something2"]
|
29
|
-
# =>
|
36
|
+
# =>
|
37
|
+
# [
|
30
38
|
# { name: :id, content: "something1" },
|
31
39
|
# { name: :server, content: "something2" },
|
32
40
|
# ]
|
@@ -40,7 +48,7 @@ module VipnetParser
|
|
40
48
|
|
41
49
|
case format
|
42
50
|
when :hash
|
43
|
-
@hash = {
|
51
|
+
@hash = {}
|
44
52
|
hash_keys = {
|
45
53
|
id: :id,
|
46
54
|
adapter: :name,
|
@@ -53,26 +61,44 @@ module VipnetParser
|
|
53
61
|
hash, current_key = _section_hash(section[:content], hash_key)
|
54
62
|
@hash[section[:name]][current_key] = hash
|
55
63
|
|
56
|
-
#
|
57
|
-
# (
|
64
|
+
# Normalize names.
|
65
|
+
# (Only available for [id] sections, which are processed with current_key == id.)
|
58
66
|
name = @hash[section[:name]][current_key][:name]
|
59
|
-
|
60
|
-
|
61
|
-
|
67
|
+
next unless name && normalize_names
|
68
|
+
name = VipnetParser.name(name, current_key)
|
69
|
+
@hash[section[:name]][current_key][:name] = name
|
62
70
|
else
|
63
71
|
hash, _ = _section_hash(section[:content])
|
64
72
|
@hash[section[:name]] = hash
|
65
73
|
end
|
66
74
|
end
|
67
75
|
|
76
|
+
# Reduce [servers] section.
|
68
77
|
# :servers => { :server => ["0x1a0e000a, coordinator1"] }
|
69
|
-
# =>
|
78
|
+
# =>
|
79
|
+
# :servers => ["0x1a0e000a, coordinator1"]
|
70
80
|
@hash[:servers] = @hash[:servers][:server] || nil
|
71
81
|
|
72
|
-
|
82
|
+
@hash
|
73
83
|
end
|
74
84
|
end
|
75
85
|
|
86
|
+
# Returns config version.
|
87
|
+
# If misc => config_version isn't present, put "3",
|
88
|
+
# otherwise, get major version:
|
89
|
+
# "4.2.3-3" => "4".
|
90
|
+
def version
|
91
|
+
self.parse(format: :hash) unless self.hash
|
92
|
+
config_version = self.hash[:misc][:config_version]
|
93
|
+
parsed_config_version = if config_version
|
94
|
+
config_version[0]
|
95
|
+
else
|
96
|
+
"3"
|
97
|
+
end
|
98
|
+
|
99
|
+
parsed_config_version
|
100
|
+
end
|
101
|
+
|
76
102
|
def _section_hash(section_content, hash_key = nil)
|
77
103
|
hash = {}
|
78
104
|
|
@@ -81,8 +107,11 @@ module VipnetParser
|
|
81
107
|
prop = Regexp.last_match(:prop).to_sym
|
82
108
|
value = Regexp.last_match(:value)
|
83
109
|
|
84
|
-
|
85
|
-
|
110
|
+
array_props = %i(
|
111
|
+
ip filterudp filtertcp server
|
112
|
+
exclude_from_tunnels accessiplist subnet_real subnet_virtual
|
113
|
+
)
|
114
|
+
if array_props.include?(prop)
|
86
115
|
if hash[prop]
|
87
116
|
hash[prop].push(value)
|
88
117
|
else
|
@@ -94,13 +123,11 @@ module VipnetParser
|
|
94
123
|
end
|
95
124
|
end
|
96
125
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
return hash
|
103
|
-
end
|
126
|
+
return hash unless hash_key && hash[hash_key]
|
127
|
+
current_key = hash[hash_key]
|
128
|
+
hash.delete(hash_key)
|
129
|
+
|
130
|
+
[hash, current_key]
|
104
131
|
end
|
105
132
|
|
106
133
|
private :_section_hash
|
@@ -8,17 +8,26 @@ module VipnetParser
|
|
8
8
|
@string = nodename_file
|
9
9
|
end
|
10
10
|
|
11
|
-
DEFAULT_PARSE_ARGS = {
|
11
|
+
DEFAULT_PARSE_ARGS = {
|
12
|
+
format: :hash,
|
13
|
+
encoding: "cp866",
|
14
|
+
normalize_names: false,
|
15
|
+
}
|
12
16
|
|
13
17
|
def parse(args = DEFAULT_PARSE_ARGS)
|
14
18
|
args = DEFAULT_PARSE_ARGS.merge(args)
|
15
|
-
format, encoding, normalize_names = args.values_at(
|
19
|
+
format, encoding, normalize_names = args.values_at(
|
20
|
+
:format, :encoding, :normalize_names,
|
21
|
+
)
|
16
22
|
|
17
|
-
#
|
23
|
+
# Change encoding to utf8.
|
18
24
|
string = self.string
|
19
25
|
.force_encoding(encoding)
|
20
26
|
.encode("utf-8", replace: nil)
|
21
27
|
|
28
|
+
enable_aliases = { "1" => true, "0" => false }
|
29
|
+
group_aliases = { "A" => :client, "S" => :server, "G" => :group }
|
30
|
+
|
22
31
|
case format
|
23
32
|
when :hash
|
24
33
|
@hash = { _meta: { version: "3" }, id: {} }
|
@@ -26,15 +35,17 @@ module VipnetParser
|
|
26
35
|
string.split("\r\n").each do |line|
|
27
36
|
record = _record_hash(line)
|
28
37
|
record[:name].rstrip!
|
29
|
-
record[:enabled] =
|
30
|
-
record[:category] =
|
38
|
+
record[:enabled] = enable_aliases[record[:enabled]]
|
39
|
+
record[:category] = group_aliases[record[:category]]
|
31
40
|
normal_id = VipnetParser.id(record[:id]).first
|
32
|
-
|
41
|
+
if normalize_names
|
42
|
+
record[:name] = VipnetParser.name(record[:name], normal_id)
|
43
|
+
end
|
33
44
|
record.delete(:id)
|
34
45
|
@hash[:id][normal_id] = record
|
35
46
|
end
|
36
47
|
|
37
|
-
|
48
|
+
@hash
|
38
49
|
end
|
39
50
|
end
|
40
51
|
|
@@ -52,7 +63,7 @@ module VipnetParser
|
|
52
63
|
names = match.names.map { |name| name.to_sym }
|
53
64
|
|
54
65
|
# https://gist.github.com/flarnie/6221219
|
55
|
-
|
66
|
+
Hash[names.zip(match.captures)]
|
56
67
|
end
|
57
68
|
|
58
69
|
private :_record_hash
|
@@ -6,7 +6,10 @@ module VipnetParser
|
|
6
6
|
elsif args.class == Hash
|
7
7
|
string, array, threshold = args.values_at(:string, :array, :threshold)
|
8
8
|
end
|
9
|
+
array ||= []
|
9
10
|
string = string.downcase
|
11
|
+
|
12
|
+
# Substitute cyrillic symbols.
|
10
13
|
cyrillic_sub = {
|
11
14
|
"а" => "a", "б" => "b", "В" => "b", "с" => "c", "д" => "d", "е" => "e", "ф" => "f",
|
12
15
|
"А" => "a", "Б" => "b", "в" => "b", "С" => "c", "Д" => "d", "Е" => "e", "Ф" => "f",
|
@@ -15,30 +18,28 @@ module VipnetParser
|
|
15
18
|
string = string.gsub(cyr, lat)
|
16
19
|
end
|
17
20
|
|
18
|
-
array = [] unless array
|
19
21
|
regexps = {
|
20
22
|
/(.*)(0x[0-9a-f]{1,8}-0x[0-9a-f]{1,8})(.*)/m => method(:id_parse_variant1),
|
21
23
|
/(.*)([0-9a-f]{8})(.*)/m => method(:id_parse_variant2),
|
22
24
|
/(.*)0x([0-9a-f]{1,8})(.*)/m => method(:id_parse_variant3),
|
23
25
|
}
|
26
|
+
|
24
27
|
string_matches_anything = false
|
25
28
|
regexps.each do |regexp, callback|
|
26
|
-
if
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
next if string_matches_anything
|
30
|
+
next unless string =~ regexp
|
31
|
+
string_matches_anything = true
|
32
|
+
|
33
|
+
array += callback.call(string: Regexp.last_match(2), threshold: threshold)
|
34
|
+
[Regexp.last_match(1), Regexp.last_match(3)].each do |side_match|
|
35
|
+
unless side_match.empty?
|
36
|
+
array += id(string: side_match, array: array, threshold: threshold)
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
40
|
+
return [] unless string_matches_anything
|
36
41
|
|
37
|
-
|
38
|
-
return array.uniq.sort
|
39
|
-
else
|
40
|
-
return []
|
41
|
-
end
|
42
|
+
array.uniq.sort
|
42
43
|
end
|
43
44
|
|
44
45
|
def self.id_parse_variant1(args)
|
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.0
|
4
|
+
version: 2.2.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: 2017-01-
|
11
|
+
date: 2017-01-25 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
|