ipip-ipdb 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/ipdb.rb +8 -0
- data/lib/ipdb/city.rb +12 -0
- data/lib/ipdb/reader.rb +83 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 27f36a277082ec338aad13b001e427b250957bebecf31fee1f885756d62c21d2
|
4
|
+
data.tar.gz: 02bdff9b4e7a6533b9e20bcd442c4c80a10bfc1fb92b9a4787b8d4b7c8e7480a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7e4f89e8bf0902cf4750d850df972139ea358f2c2c26cdeb2381532f8147802149e1453765945a8fa57797375ab8449df55a26a8973c40966ea92fb608f40322
|
7
|
+
data.tar.gz: bb81fdae35ed2462210193d8ca022277752b75e24283c9586b305f4073451ac14adfecc1628596fdd30c39c54f7f86b941665c4a81090fb20fe3f20be99ecef9
|
data/lib/ipdb.rb
ADDED
data/lib/ipdb/city.rb
ADDED
data/lib/ipdb/reader.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'ipaddr'
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
class Reader
|
5
|
+
def initialize(name)
|
6
|
+
|
7
|
+
if name.nil? || !File.exists?(name)
|
8
|
+
raise "You must specify 'database => ...' in your ipip filter (I looked for '#{name}')"
|
9
|
+
end
|
10
|
+
if !File.readable? name
|
11
|
+
raise "ip database is not readable."
|
12
|
+
end
|
13
|
+
|
14
|
+
@data = File.binread name
|
15
|
+
|
16
|
+
meta_len = @data[0 ... 4].unpack('N')[0]
|
17
|
+
meta_buf = @data[4 ... 4+meta_len]
|
18
|
+
|
19
|
+
@meta = JSON.parse(meta_buf)
|
20
|
+
|
21
|
+
if @data.length != (4 + meta_len + @meta['total_size'])
|
22
|
+
raise "ip database file size error."
|
23
|
+
end
|
24
|
+
|
25
|
+
@node_count = @meta['node_count']
|
26
|
+
@cache = {}
|
27
|
+
@body = @data[4+meta_len ... @data.length]
|
28
|
+
end
|
29
|
+
|
30
|
+
def read_node(node, idx)
|
31
|
+
off = node * 8 + idx * 4
|
32
|
+
@body[off..off+3].unpack('N')[0]
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
def find_node(ipv)
|
37
|
+
addr = ipv.hton
|
38
|
+
node = ipv.ipv4? ? 96 : 0
|
39
|
+
|
40
|
+
idx = 0
|
41
|
+
key = addr[0...16]
|
42
|
+
val = @cache[key]
|
43
|
+
if !val.nil?
|
44
|
+
node = val
|
45
|
+
idx = 16
|
46
|
+
end
|
47
|
+
|
48
|
+
if node < @node_count
|
49
|
+
while idx < 128 do
|
50
|
+
bin = addr[idx >> 3].unpack("C")[0]
|
51
|
+
flag = (1 & (bin >> 7 - (idx % 8)))
|
52
|
+
node = self.read_node(node, flag)
|
53
|
+
idx += 1
|
54
|
+
if idx == 16
|
55
|
+
@cache[key] = node
|
56
|
+
end
|
57
|
+
if node > @node_count
|
58
|
+
break
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
node
|
64
|
+
end
|
65
|
+
|
66
|
+
def find(ipx,lang)
|
67
|
+
begin
|
68
|
+
ipv = IPAddr.new ipx
|
69
|
+
rescue => e
|
70
|
+
return e.message
|
71
|
+
end
|
72
|
+
node = self.find_node ipv
|
73
|
+
resolved = node - @node_count + @node_count * 8
|
74
|
+
size = @body[resolved..resolved+1].unpack('n')[0]
|
75
|
+
|
76
|
+
temp = @body[resolved+2..resolved+1+size]
|
77
|
+
loc = temp.encode("UTF-8", "UTF-8").split("\t", @meta['fields'].length * @meta['languages'].length)
|
78
|
+
|
79
|
+
off = @meta['languages'][lang]
|
80
|
+
|
81
|
+
loc[off ... @meta['fields'].length+off]
|
82
|
+
end
|
83
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ipip-ipdb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.6
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- frk
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-02-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: IPIP.net
|
14
|
+
email: frk@ipip.net
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/ipdb.rb
|
20
|
+
- lib/ipdb/city.rb
|
21
|
+
- lib/ipdb/reader.rb
|
22
|
+
homepage: https://github.com/ipipdotnet/ipdb-ruby
|
23
|
+
licenses:
|
24
|
+
- Apache License 2.0
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubyforge_project:
|
42
|
+
rubygems_version: 2.7.6
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: IPIP.net
|
46
|
+
test_files: []
|