vipnet_parser 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/vipnet_parser.rb +148 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 412976a93107392b94f27890186cc98f02930536
|
4
|
+
data.tar.gz: 1717777e8beb43cd21e4853011b3901dffd38e48
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f242154edba17fce0881e5a9647ead0282ab7be9847f7c0544e3e98cf7b5406035b2a1c2beade5fac983c530e53b0980194c2eee528fea28c524a9e74126b396
|
7
|
+
data.tar.gz: 1b90c4dacb6b683cb2944d146f85ca89833e794d571f0d8e7212e0557d37b66cca632b1c15be9d6cec8583af324e19fc93d98a6914346cb05cc1ccdedc1fe8ef
|
@@ -0,0 +1,148 @@
|
|
1
|
+
class VipnetParser
|
2
|
+
def ==(other)
|
3
|
+
res = true
|
4
|
+
@props.each do |prop|
|
5
|
+
res = res && self.send(prop.to_s) == other.send(prop.to_s)
|
6
|
+
end
|
7
|
+
res
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.id(string)
|
11
|
+
if string =~ /(.*)0x([0-9a-f]{1,8})-0x([0-9a-f]{1,8})(.*)/
|
12
|
+
interval_begin = Regexp.last_match(2).to_i(16)
|
13
|
+
interval_end = Regexp.last_match(3).to_i(16)
|
14
|
+
return [] if interval_end < interval_begin
|
15
|
+
vipnet_ids = Array.new
|
16
|
+
(interval_end - interval_begin + 1).times do |n|
|
17
|
+
vipnet_ids.push("0x#{(interval_begin + n).to_s(16).rjust(8, '0')}")
|
18
|
+
end
|
19
|
+
return vipnet_ids
|
20
|
+
end
|
21
|
+
if string =~ /(.*)([0-9A-F]{8})(.*)/
|
22
|
+
return ["0x" + Regexp.last_match(2).downcase]
|
23
|
+
end
|
24
|
+
if string =~ /(.*)0x([0-9a-f]{1,8})(.*)/
|
25
|
+
return ["0x" + Regexp.last_match(2).to_s.rjust(8, "0")]
|
26
|
+
end
|
27
|
+
false
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.network(id)
|
31
|
+
normal_ids = id(id)
|
32
|
+
if normal_ids
|
33
|
+
normal_id = normal_ids[0]
|
34
|
+
return id[2..5].to_i(16).to_s(10)
|
35
|
+
end
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class Iplirconf < VipnetParser
|
41
|
+
PROPS = [:content, :id, :sections]
|
42
|
+
attr_accessor *PROPS, :last_error
|
43
|
+
private_constant :PROPS
|
44
|
+
|
45
|
+
def initialize(*args)
|
46
|
+
@props = PROPS
|
47
|
+
unless args.size == 1
|
48
|
+
return false
|
49
|
+
end
|
50
|
+
@content = args[0]
|
51
|
+
# remove comments
|
52
|
+
content_nc = @content.gsub(/^#.*\n/, "")
|
53
|
+
# remove ending
|
54
|
+
@sections = Hash.new
|
55
|
+
adapter_position = content_nc.index("[adapter]")
|
56
|
+
unless adapter_position
|
57
|
+
@last_error = "unable to parse iplirconf (no [adapter] section)"
|
58
|
+
return false
|
59
|
+
end
|
60
|
+
# prepare for split
|
61
|
+
content_nc = content_nc[0..(adapter_position - 2)]
|
62
|
+
content_nc = "\n" + content_nc
|
63
|
+
content_nc.split("\n[id]\n").reject{ |t| t.empty? }.each_with_index do |section_content, i|
|
64
|
+
tmp_section = Hash.new
|
65
|
+
props = {
|
66
|
+
:single => [
|
67
|
+
:id, :name, :filterdefault, :tunnel,
|
68
|
+
:firewallip, :port, :proxyid, :dynamic_timeout, :accessip,
|
69
|
+
:usefirewall, :fixfirewall, :virtualip, :version,
|
70
|
+
],
|
71
|
+
:multi => [:ip, :filterudp, :filtertcp]
|
72
|
+
}
|
73
|
+
props.each do |type, props|
|
74
|
+
props.each do |prop|
|
75
|
+
get_section_param({ prop: prop, section: tmp_section, content: section_content, type: type })
|
76
|
+
end
|
77
|
+
end
|
78
|
+
# self section id
|
79
|
+
@id = tmp_section[:id] if i == 0
|
80
|
+
@sections[tmp_section[:id]] = tmp_section
|
81
|
+
end
|
82
|
+
true
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_section_param(args)
|
86
|
+
value_regexp = Regexp.new("^#{args[:prop].to_s}=\s(.*)$")
|
87
|
+
if args[:type] == :multi
|
88
|
+
tmp_array = Array.new
|
89
|
+
args[:content].each_line do |line|
|
90
|
+
value = line[value_regexp, 1]
|
91
|
+
tmp_array.push(value) if value
|
92
|
+
end
|
93
|
+
args[:section][args[:prop]] = tmp_array unless tmp_array.empty?
|
94
|
+
elsif args[:type] == :single
|
95
|
+
value = args[:content][value_regexp, 1]
|
96
|
+
args[:section][args[:prop]] = value if value
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
private :get_section_param
|
101
|
+
end
|
102
|
+
|
103
|
+
class Nodename < VipnetParser
|
104
|
+
PROPS = [:content, :records]
|
105
|
+
attr_accessor *PROPS, :last_error
|
106
|
+
private_constant :PROPS
|
107
|
+
|
108
|
+
def initialize(*args)
|
109
|
+
@props = PROPS
|
110
|
+
unless args.size == 1
|
111
|
+
return false
|
112
|
+
end
|
113
|
+
@content = args[0]
|
114
|
+
lines = content.force_encoding("cp866").encode("utf-8", replace: nil).split("\r\n")
|
115
|
+
if lines.size == 0
|
116
|
+
@last_error = "error parsing nodename"
|
117
|
+
return false
|
118
|
+
end
|
119
|
+
@records = Hash.new
|
120
|
+
lines.each do |line|
|
121
|
+
tmp_record = Hash.new
|
122
|
+
tmp_record = get_record_params(line)
|
123
|
+
tmp_record[:name].rstrip!
|
124
|
+
tmp_record[:enabled] = { "1" => true, "0" => false }[tmp_record[:enabled]]
|
125
|
+
tmp_record[:category] = { "A" => :client, "S" => :server, "G" => :group }[tmp_record[:category]]
|
126
|
+
@records[tmp_record[:id]] = tmp_record
|
127
|
+
end
|
128
|
+
true
|
129
|
+
end
|
130
|
+
|
131
|
+
def get_record_params(line)
|
132
|
+
record_regexp = /^
|
133
|
+
(?<name>.{50})\s
|
134
|
+
(?<enabled>[01])\s
|
135
|
+
(?<category>[ASG])\s
|
136
|
+
[0-9A-F]{8}
|
137
|
+
(?<server_number>[0-9A-F]{4})
|
138
|
+
(?<abonent_number>[0-9A-F]{4})\s
|
139
|
+
(?<id>[0-9A-F]{8})
|
140
|
+
$/x
|
141
|
+
match = record_regexp.match(line)
|
142
|
+
names = match.names.map { |name| name.to_sym }
|
143
|
+
# https://gist.github.com/flarnie/6221219
|
144
|
+
return Hash[names.zip(match.captures)]
|
145
|
+
end
|
146
|
+
|
147
|
+
private :get_record_params
|
148
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vipnet_parser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alexander Morozov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-29 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Parses ViPNet strings like 'something 1A0EABCD something' and returns
|
14
|
+
0x1a0eabcd (and stuff).
|
15
|
+
email: ntcomp12@gmail.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/vipnet_parser.rb
|
21
|
+
homepage: https://github.com/kengho/vipnet_parser
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.5.1
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: ViPNet strings parser
|
45
|
+
test_files: []
|