ksconnect 0.1.13 → 0.2.0
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 +4 -4
- data/lib/ksconnect/api/plugin/data.rb +49 -36
- data/lib/ksconnect/api/plugin/domain.rb +20 -11
- data/lib/ksconnect/api/plugin.rb +19 -16
- data/lib/ksconnect/helpers.rb +21 -11
- data/lib/ksconnect.rb +8 -2
- metadata +86 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06207d64b5e16054f9879283f9b3635d43486380
|
4
|
+
data.tar.gz: e716c4150e97ebb0f600a99dacbd27502b4d23b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1cd24055c673e2585f2dc362ffe2a456561f1934a72725ca342f26f5687c4423ae450cc50c3dbed8fde16ecd6e7ca08a8f916d5e774485c9afe7ca59720d2ac
|
7
|
+
data.tar.gz: 51c868da513607c93a184ae2e52ef8fe3da918a211400c3cefa9daffe3796dccb635dd1b0d5219df3348c54f3c9de6c449bd1cea16f65cc97856fa17ff9fac2a
|
@@ -19,46 +19,61 @@ class KSConnect
|
|
19
19
|
|
20
20
|
@cache = ActiveSupport::HashWithIndifferentAccess.new if @use_cache
|
21
21
|
@cache_uuid = nil
|
22
|
+
|
23
|
+
Redis.current ||= Redis.new(driver: :hiredis)
|
24
|
+
$redis ||= ConnectionPool.new(size: MAX_THREADS, timeout: 8) { Redis.current }
|
22
25
|
end
|
23
26
|
|
24
27
|
def []=(field, value)
|
25
28
|
@cache[field] = value if @use_cache
|
26
|
-
redis.
|
27
|
-
|
29
|
+
$redis.with { |redis|
|
30
|
+
redis.hset(key, field, value)
|
31
|
+
redis.publish("core:push", { plugin_name: @plugin_name, domain_name: @domain_name, request_type: 'update' }.to_json) if @auto_notify
|
32
|
+
}
|
28
33
|
end
|
29
34
|
|
30
35
|
def setall(hash)
|
31
36
|
@cache.merge!(hash) if @use_cache
|
32
|
-
redis.
|
33
|
-
|
37
|
+
$redis.with { |redis|
|
38
|
+
redis.mapped_hmset(key, hash)
|
39
|
+
redis.publish("core:push", { plugin_name: @plugin_name, domain_name: @domain_name, request_type: 'update' }.to_json) if @auto_notify
|
40
|
+
}
|
34
41
|
end
|
35
42
|
|
36
43
|
def [](field)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
44
|
+
$redis.with { |redis|
|
45
|
+
if @use_cache
|
46
|
+
@cache = redis.hgetall(key) if @cache.empty?
|
47
|
+
@cache[field]
|
48
|
+
else
|
49
|
+
redis.hget(key, field)
|
50
|
+
end
|
51
|
+
}
|
43
52
|
end
|
44
53
|
|
45
54
|
def getall
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
55
|
+
$redis.with { |redis|
|
56
|
+
if @use_cache
|
57
|
+
@cache = redis.hgetall(key) if @cache.empty?; @cache
|
58
|
+
else
|
59
|
+
redis.hgetall(key)
|
60
|
+
end
|
61
|
+
}
|
51
62
|
end
|
52
63
|
|
53
64
|
def reload
|
54
|
-
|
55
|
-
|
65
|
+
$redis.with { |redis|
|
66
|
+
@cache = redis.hgetall(key) if @use_cache
|
67
|
+
@cache
|
68
|
+
}
|
56
69
|
end
|
57
70
|
|
58
71
|
def delete(field)
|
59
|
-
|
60
|
-
|
61
|
-
|
72
|
+
$redis.with { |redis|
|
73
|
+
@cache.delete(field) if @use_cache
|
74
|
+
redis.hdel(key, field)
|
75
|
+
redis.publish("core:push", { plugin_name: @plugin_name, domain_name: @domain_name, request_type: 'update' }.to_json) if @auto_notify
|
76
|
+
}
|
62
77
|
end
|
63
78
|
|
64
79
|
def key
|
@@ -69,23 +84,21 @@ class KSConnect
|
|
69
84
|
private
|
70
85
|
|
71
86
|
def set_data_uuid
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
87
|
+
$redis.with { |redis|
|
88
|
+
begin
|
89
|
+
tries ||= 3
|
90
|
+
id = redis.hget("#{@plugin_name}:#{@type}", @domain_name)
|
91
|
+
if id
|
92
|
+
@cache_uuid = id
|
93
|
+
else
|
94
|
+
@cache_uuid = SecureRandom.uuid
|
95
|
+
raise "Race on setting data key failed." unless redis.hsetnx("#{@plugin_name}:#{@type}", @domain_name, @cache_uuid)
|
96
|
+
end
|
97
|
+
rescue Exception => e
|
98
|
+
logger.error e.message
|
99
|
+
retry unless (tries -= 1).zero?
|
80
100
|
end
|
81
|
-
|
82
|
-
logger.error e.message
|
83
|
-
retry unless (tries -= 1).zero?
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def redis
|
88
|
-
Redis.current
|
101
|
+
}
|
89
102
|
end
|
90
103
|
end
|
91
104
|
end
|
@@ -17,38 +17,47 @@ class KSConnect
|
|
17
17
|
@plugin_name = plugin_name
|
18
18
|
@data = Data.new(plugin_name, name, type: :data)
|
19
19
|
@private_data = Data.new(plugin_name, name, type: :private_data, auto_notify: true)
|
20
|
+
|
21
|
+
Redis.current ||= Redis.new(driver: :hiredis)
|
22
|
+
$redis ||= ConnectionPool.new(size: MAX_THREADS, timeout: 8) { Redis.current }
|
20
23
|
end
|
21
24
|
|
22
25
|
def update_ip_address
|
23
|
-
|
26
|
+
$redis.with { |redis|
|
27
|
+
@ip_address = redis.hget(domains_key, name)
|
28
|
+
}
|
24
29
|
end
|
25
30
|
|
26
31
|
def ip_address=(new_ip)
|
27
32
|
@ip_address = new_ip
|
28
|
-
redis.
|
29
|
-
|
33
|
+
$redis.with { |redis|
|
34
|
+
redis.hset(domains_key, name, new_ip)
|
35
|
+
redis.publish("core:push", { domain_name: name, plugin_name: "core", request_type: "update"}.to_json) if plugin_name == 'core'
|
36
|
+
}
|
30
37
|
end
|
31
38
|
|
32
39
|
def notify(data)
|
33
|
-
redis.
|
40
|
+
$redis.with { |redis|
|
41
|
+
redis.lpush("ks:notifications_push", data.merge({ domain_name: @name, plugin_name: @plugin_name }).to_json)
|
42
|
+
}
|
34
43
|
end
|
35
44
|
|
36
45
|
def add_issue(issue_type, data)
|
37
|
-
redis.
|
46
|
+
$redis.with { |redis|
|
47
|
+
redis.lpush("ks:issues_push", data.merge({ domain_name: @name, plugin_name: @plugin_name, issue_type: issue_type, request_type: 'add' }).to_json)
|
48
|
+
}
|
38
49
|
end
|
39
50
|
|
40
51
|
def clear_issue(issue_type)
|
41
|
-
redis.
|
52
|
+
$redis.with { |redis|
|
53
|
+
redis.lpush("ks:issues_push", { domain_name: @name, plugin_name: @plugin_name, issue_type: issue_type, request_type: 'remove' }.to_json)
|
54
|
+
}
|
42
55
|
end
|
43
56
|
|
44
57
|
private
|
45
58
|
|
46
|
-
def redis
|
47
|
-
Redis.current
|
48
|
-
end
|
49
|
-
|
50
59
|
def domains_key
|
51
|
-
@domain_list_uuid ||= redis.hget("#{plugin_name}:data", "domain_names")
|
60
|
+
@domain_list_uuid ||= $redis.with { |redis| redis.hget("#{plugin_name}:data", "domain_names") }
|
52
61
|
"kloudsec_data:#{@domain_list_uuid}"
|
53
62
|
end
|
54
63
|
end
|
data/lib/ksconnect/api/plugin.rb
CHANGED
@@ -15,6 +15,9 @@ class KSConnect
|
|
15
15
|
@main_plugin = main
|
16
16
|
@domains = {}
|
17
17
|
|
18
|
+
Redis.current ||= Redis.new(driver: :hiredis)
|
19
|
+
$redis ||= ConnectionPool.new(size: MAX_THREADS, timeout: 8) { Redis.current }
|
20
|
+
|
18
21
|
load_domains
|
19
22
|
subscribe_to_events
|
20
23
|
end
|
@@ -31,7 +34,7 @@ class KSConnect
|
|
31
34
|
# Note that it does not update the ip address of existing domains.
|
32
35
|
def load_domains
|
33
36
|
# load domain list
|
34
|
-
domain_to_ip = redis.hgetall(domains_key)
|
37
|
+
domain_to_ip = $redis.with { |redis| redis.hgetall(domains_key) }
|
35
38
|
|
36
39
|
# add new domains
|
37
40
|
new_domains = domain_to_ip.keys - @domains.values.map(&:name)
|
@@ -67,14 +70,16 @@ class KSConnect
|
|
67
70
|
|
68
71
|
def update_action(action_id, state, body="")
|
69
72
|
raise "Updating action with empty action_id" if action_id.nil? or action_id.empty?
|
70
|
-
redis.
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
73
|
+
$redis.with do |redis|
|
74
|
+
redis.multi do |redis_transaction|
|
75
|
+
redis_transaction.mapped_hmset "kloudsec_data:#{action_id}", {
|
76
|
+
plugin_name: @name,
|
77
|
+
uuid: action_id,
|
78
|
+
state: state,
|
79
|
+
response: body,
|
80
|
+
}
|
81
|
+
redis_transaction.expire "kloudsec_data:#{action_id}", 300
|
82
|
+
end
|
78
83
|
end
|
79
84
|
end
|
80
85
|
|
@@ -103,11 +108,13 @@ class KSConnect
|
|
103
108
|
raise "Invalid request type"
|
104
109
|
end
|
105
110
|
|
106
|
-
redis.
|
111
|
+
$redis.with { |redis|
|
112
|
+
redis.publish("core:push", { domain_name: domain_name, plugin_name: @name, request_type: request_type }.to_json) if should_repush?
|
113
|
+
}
|
107
114
|
end
|
108
115
|
|
109
116
|
def domains_key
|
110
|
-
@domain_list_uuid ||= redis.hget("#{@name}:data", "domain_names")
|
117
|
+
@domain_list_uuid ||= $redis.with { |redis| redis.hget("#{@name}:data", "domain_names") }
|
111
118
|
"kloudsec_data:#{@domain_list_uuid}"
|
112
119
|
end
|
113
120
|
|
@@ -118,11 +125,7 @@ class KSConnect
|
|
118
125
|
end
|
119
126
|
|
120
127
|
def get_ip_for(domain_name)
|
121
|
-
redis.hget(domains_key, domain_name)
|
122
|
-
end
|
123
|
-
|
124
|
-
def redis
|
125
|
-
Redis.current
|
128
|
+
$redis.with { |redis| redis.hget(domains_key, domain_name) }
|
126
129
|
end
|
127
130
|
end
|
128
131
|
end
|
data/lib/ksconnect/helpers.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
+
require 'active_support/core_ext/object/try'
|
2
|
+
|
1
3
|
class KSConnect
|
2
4
|
module Helpers
|
3
5
|
def ip_address_for(domain)
|
4
|
-
if all_domains[domain]
|
5
|
-
all_domains[domain].ip_address
|
6
|
+
if all_domains[domain.name]
|
7
|
+
all_domains[domain.name].ip_address
|
6
8
|
else
|
7
9
|
"kloudsec.com" # go to something safe if ip is invalid
|
8
10
|
end
|
@@ -14,32 +16,40 @@ class KSConnect
|
|
14
16
|
end
|
15
17
|
|
16
18
|
def https_redirect_enabled?(domain)
|
17
|
-
https_enabled?(domain) && plugins[:ssl].domains[domain].data['redirect'] == "true"
|
19
|
+
https_enabled?(domain) && plugins[:ssl].domains[domain.name].data['redirect'] == "true"
|
18
20
|
end
|
19
21
|
|
20
22
|
def https_rewriting_enabled?(domain)
|
21
|
-
https_enabled?(domain) && plugins[:ssl].domains[domain].data['rewriteHTTPS'] == "true"
|
23
|
+
https_enabled?(domain) && plugins[:ssl].domains[domain.name].data['rewriteHTTPS'] == "true"
|
22
24
|
end
|
23
25
|
|
24
26
|
def waf_enabled?(domain)
|
25
|
-
plugins[:web_shield].domains.
|
27
|
+
plugins[:web_shield].domains.has_key?(domain.name)
|
26
28
|
end
|
27
29
|
|
28
30
|
def waf_learning?(domain)
|
29
|
-
waf_enabled?(domain) && plugins[:web_shield].domains[domain].data['learning']
|
31
|
+
waf_enabled?(domain) && plugins[:web_shield].domains[domain.name].data['learning']
|
32
|
+
end
|
33
|
+
|
34
|
+
def waf_location_config(domain)
|
35
|
+
waf_enabled?(domain) ? plugins[:web_shield].domains[domain.name].private_data['location.conf'] : ""
|
36
|
+
end
|
37
|
+
|
38
|
+
def waf_server_config(domain)
|
39
|
+
waf_enabled?(domain) ? plugins[:web_shield].domains[domain.name].private_data['server.conf'] : ""
|
30
40
|
end
|
31
41
|
|
32
42
|
def pagespeed_enabled?(domain)
|
33
|
-
plugins[:mod_cache].domains.
|
43
|
+
plugins[:mod_cache].domains.has_key?(domain.name)
|
34
44
|
end
|
35
45
|
|
36
46
|
def pending_autossl?(domain)
|
37
47
|
p, k = autossl_verification_path_and_key_for(domain)
|
38
|
-
plugins[:autossl].domains.
|
48
|
+
plugins[:autossl].domains.has_key?(domain.name) && p && k
|
39
49
|
end
|
40
50
|
|
41
51
|
def autossl_verification_path_and_key_for(domain)
|
42
|
-
d = plugins[:autossl].domains[domain].private_data
|
52
|
+
d = plugins[:autossl].domains[domain.name].try(:private_data)
|
43
53
|
if d
|
44
54
|
return d['verify_endpoint'], d['verify_content']
|
45
55
|
else
|
@@ -48,8 +58,8 @@ class KSConnect
|
|
48
58
|
end
|
49
59
|
|
50
60
|
def ssl_key_and_cert_for(domain)
|
51
|
-
ssl = plugins[:ssl].domains[domain].private_data
|
52
|
-
autossl = plugins[:autossl].domains[domain].private_data
|
61
|
+
ssl = plugins[:ssl].domains[domain.name].try(:private_data)
|
62
|
+
autossl = plugins[:autossl].domains[domain.name].try(:private_data)
|
53
63
|
|
54
64
|
if ssl && ssl['key'] && ssl['cert']
|
55
65
|
return ssl['key'], ssl['cert']
|
data/lib/ksconnect.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'redis'
|
2
|
+
require 'thread/pool'
|
3
|
+
require 'connection_pool'
|
2
4
|
require 'ksconnect/api'
|
3
5
|
require 'ksconnect/api/plugin'
|
4
6
|
require 'ksconnect/api/plugin/config'
|
@@ -6,15 +8,19 @@ require 'ksconnect/api/plugin/data'
|
|
6
8
|
require 'ksconnect/api/plugin/domain'
|
7
9
|
require 'ksconnect/helpers'
|
8
10
|
require 'ksconnect/logs'
|
9
|
-
require 'thread/pool'
|
10
11
|
|
11
12
|
class KSConnect
|
12
13
|
include Logs
|
13
14
|
attr_reader :api
|
14
15
|
attr_reader :plugin
|
15
16
|
|
17
|
+
MIN_THREADS = ENV['MIN_THREADS'] || 5
|
18
|
+
MAX_THREADS = ENV['MAX_THREADS'] || 25
|
19
|
+
|
16
20
|
def initialize(*args)
|
17
21
|
Redis.current ||= Redis.new(driver: :hiredis)
|
22
|
+
$redis ||= ConnectionPool.new(size: MAX_THREADS, timeout: 8) { Redis.current }
|
23
|
+
|
18
24
|
plugins = args
|
19
25
|
|
20
26
|
additional_options = args.last.is_a?(Hash) ? args.last : nil
|
@@ -28,7 +34,7 @@ class KSConnect
|
|
28
34
|
end
|
29
35
|
|
30
36
|
def self.thread_pool
|
31
|
-
@@thread_pool ||= Thread.pool(
|
37
|
+
@@thread_pool ||= Thread.pool(MIN_THREADS, MAX_THREADS)
|
32
38
|
end
|
33
39
|
|
34
40
|
def self.channel(name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ksconnect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ivan Poon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -66,6 +66,90 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: connection_pool
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.2'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.2'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.4'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: redis-namespace
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: concurrent-ruby
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: mocha
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '1.1'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '1.1'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
69
153
|
description: |-
|
70
154
|
KSConnect provides a connection interface for Kloudsec plugins by exposing a simple to use
|
71
155
|
API for managing and synchronizing plugin data.
|