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 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
@@ -0,0 +1,8 @@
1
+ require_relative 'ipdb/city'
2
+
3
+ class IPDB
4
+
5
+ def self.city(name)
6
+ City.new name
7
+ end
8
+ end
data/lib/ipdb/city.rb ADDED
@@ -0,0 +1,12 @@
1
+ require_relative 'reader'
2
+
3
+ class City
4
+
5
+ def initialize(name)
6
+ @db = Reader.new name
7
+ end
8
+
9
+ def find(ipx,lang)
10
+ @db.find ipx, lang
11
+ end
12
+ end
@@ -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: []