sparoid 1.0.11 → 1.0.15

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b933d6729f0ce76259c272550548532b15a206218239b9f824cd58b0deec6ee3
4
- data.tar.gz: 61a1ec401ecebf13674e3b66e684df99ea5007f051e91b5bf98cc783e9f91c15
3
+ metadata.gz: a696807043c46908b4bbeeb6e8636e33cea95673930442bfc24a3151fc190d28
4
+ data.tar.gz: 5e2b64879d91183c6248e28f7fb6faf95ad8f249983f1d675ea17a4c74970758
5
5
  SHA512:
6
- metadata.gz: 173cb6c71c46ba88153306d5124879ade2f53eedda41da85b58475abc3fddc0e0d5dee00ab459e546ab0b283411044dbaa016369ccb74a791a22126dc5dc99dd
7
- data.tar.gz: 71318184eb58dbcbcc713aebd1c2e22375562af77ae29083b90f0933bc078991f1860fc00fbccad5e55396f37845b098f3c4494cae381c71e79b30a8e6a8124a
6
+ metadata.gz: a9a278830be195e3534b076860bd775406bfd338dae9f5e1083f0bf7f66c17d779c169b5dde140e54690b544363a64538f91f108b3178f053714a362d960d1a2
7
+ data.tar.gz: 32a8a77fb600b7f294b57a30f290e4fa9541ce27a94672173788db61211e2d9101ff7867476cbba08be3e38619cd5709534b2ad8caa896a6396e7280c6c03f51
data/CHANGELOG.md CHANGED
@@ -1,10 +1,27 @@
1
+ ## [1.0.15] - 2021-08-11
2
+
3
+ - Raise an exception, don't abort, when resolving hostname fails
4
+
5
+ ## [1.0.14] - 2021-07-26
6
+
7
+ - Send UDP packets to all resolved IPs for a hostname
8
+
9
+ ## [1.0.13] - 2021-06-30
10
+
11
+ - Do not warn on empty public ip cache file
12
+ - The public ip cache file path can be controlled using the `SPAROID_CACHE_PATH` environment variable
13
+
14
+ ## [1.0.12] - 2021-06-14
15
+
16
+ - Use file locking to prevent multiple processes/threads to write to the public ip cache file
17
+
1
18
  ## [1.0.11] - 2021-06-14
2
19
 
3
20
  - Log hostname when reporting unhandled exceptions
4
21
 
5
22
  ## [1.0.10] - 2021-06-09
6
23
 
7
- - Cache public IP in /tmp/.sparoid_public_ip for 1 min
24
+ - Cache public IP in `/tmp/.sparoid_public_ip` for 1 min
8
25
 
9
26
  ## [1.0.9] - 2021-05-23
10
27
 
data/Gemfile CHANGED
@@ -5,12 +5,9 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in sparoid.gemspec
6
6
  gemspec
7
7
 
8
- gem "rake", "~> 13.0"
9
-
10
8
  gem "minitest", "~> 5.0"
11
-
9
+ gem "minitest-stub-const"
10
+ gem "rake", "~> 13.0"
12
11
  gem "rubocop", "~> 1.7"
13
-
14
12
  gem "rubocop-minitest", require: false
15
-
16
13
  gem "rubocop-rake", require: false
data/lib/sparoid.rb CHANGED
@@ -9,6 +9,8 @@ require "resolv"
9
9
  module Sparoid
10
10
  extend self
11
11
 
12
+ SPAROID_CACHE_PATH = ENV.fetch("SPAROID_CACHE_PATH", "/tmp/.sparoid_public_ip")
13
+
12
14
  # Send an authorization packet
13
15
  def auth(key, hmac_key, host, port)
14
16
  msg = message(cached_public_ip)
@@ -39,11 +41,18 @@ module Sparoid
39
41
 
40
42
  private
41
43
 
42
- def sendmsg(host, port, data)
44
+ def sendmsg(host, port, data) # rubocop:disable Metrics/MethodLength
45
+ ok = false
43
46
  UDPSocket.open do |socket|
44
- socket.connect host, port
45
- socket.sendmsg data, 0
47
+ Resolv.each_address(host) do |ip|
48
+ ok = true
49
+ socket.connect ip, port
50
+ socket.sendmsg data, 0
51
+ rescue StandardError => e
52
+ warn "Sparoid error: #{e.message}"
53
+ end
46
54
  end
55
+ raise Error, "Sparoid failed to resolv #{host}" unless ok
47
56
  end
48
57
 
49
58
  def encrypt(key, data)
@@ -76,23 +85,42 @@ module Sparoid
76
85
  end
77
86
 
78
87
  def cached_public_ip
79
- File.open("/tmp/.sparoid_public_ip", "a+") do |f|
80
- if f.size.zero? || (Time.now - f.mtime) > 60 # cache for 1min max
81
- update_cache(f)
82
- else
83
- Resolv::IPv4.create f.read
84
- end
88
+ if up_to_date_cache?
89
+ read_cache
90
+ else
91
+ write_cache
85
92
  end
86
93
  rescue StandardError => e
87
94
  warn "Sparoid: #{e.inspect}"
88
95
  public_ip
89
96
  end
90
97
 
91
- def update_cache(file)
92
- ip = public_ip
93
- file.truncate(0)
94
- file.write ip.to_s
95
- ip
98
+ def up_to_date_cache?
99
+ mtime = File.mtime(SPAROID_CACHE_PATH)
100
+ (Time.now - mtime) <= 60 # cache is valid for 1 min
101
+ rescue Errno::ENOENT
102
+ false
103
+ end
104
+
105
+ def read_cache
106
+ File.open(SPAROID_CACHE_PATH, "r") do |f|
107
+ f.flock(File::LOCK_SH)
108
+ Resolv::IPv4.create f.read
109
+ end
110
+ rescue ArgumentError => e
111
+ return write_cache if e.message =~ /cannot interpret as IPv4 address/
112
+
113
+ raise e
114
+ end
115
+
116
+ def write_cache
117
+ File.open(SPAROID_CACHE_PATH, File::WRONLY | File::CREAT, 0o0644) do |f|
118
+ f.flock(File::LOCK_EX)
119
+ ip = public_ip
120
+ f.truncate(0)
121
+ f.write ip.to_s
122
+ ip
123
+ end
96
124
  end
97
125
 
98
126
  def public_ip
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sparoid
4
- VERSION = "1.0.11"
4
+ VERSION = "1.0.15"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sparoid
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.11
4
+ version: 1.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl Hörberg
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-14 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor