adminix 0.1.31 → 0.1.35
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/adminix.gemspec +23 -21
- data/exe/adminix +2 -2
- data/lib/adminix/config.rb +15 -2
- data/lib/adminix/errors.rb +7 -0
- data/lib/adminix/server_setup.rb +74 -0
- data/lib/adminix/version.rb +1 -1
- data/lib/adminix/watcher.rb +43 -27
- data/lib/adminix.rb +7 -6
- metadata +38 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 394f5bc9d28519303e33da4a2b6291c084e65114
|
4
|
+
data.tar.gz: 85c575b7aecf227c88540e294e30ef2f83c5ff95
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 510c728c69e178676d18dad4756faf6c058e5c687bf0bb6b76cd742ea0a6e4da83dec5c4dfbc2b80eae57e5bf5e4a9f1a480929227f81511197b971d364e0a55
|
7
|
+
data.tar.gz: ce4777e0982273ab8491ad99e54738169bb7ebbbb4fe7abcef2b1f8d0d9ddeac6f8b08a50f6f041889bf771214505ef06b25690ce8158d5be15f17c6035ec967
|
data/adminix.gemspec
CHANGED
@@ -4,39 +4,41 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'adminix/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'adminix'
|
8
8
|
spec.version = Adminix::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Christian Dyl']
|
10
|
+
spec.email = ['christian@adminix.io']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
15
|
-
spec.license =
|
12
|
+
spec.summary = 'Adminix'
|
13
|
+
spec.description = 'Adminix'
|
14
|
+
spec.homepage = 'https://adminix.io'
|
15
|
+
spec.license = 'MIT'
|
16
16
|
|
17
17
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
18
18
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
19
19
|
#if spec.respond_to?(:metadata)
|
20
|
-
#spec.metadata['allowed_push_host'] =
|
20
|
+
#spec.metadata['allowed_push_host'] = 'TODO: Set to 'http://mygemserver.com''
|
21
21
|
#else
|
22
|
-
#raise
|
23
|
-
#
|
22
|
+
#raise 'RubyGems 2.0 or newer is required to protect against ' \
|
23
|
+
#'public gem pushes.'
|
24
24
|
#end
|
25
25
|
|
26
|
-
spec.files
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
27
|
f.match(%r{^(test|spec|features)/})
|
28
28
|
end
|
29
|
-
spec.bindir =
|
29
|
+
spec.bindir = 'exe'
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
-
spec.require_paths = [
|
31
|
+
spec.require_paths = ['lib']
|
32
32
|
|
33
|
-
spec.add_dependency
|
34
|
-
spec.add_dependency
|
35
|
-
spec.add_dependency
|
33
|
+
spec.add_dependency 'eventmachine', '1.2.5'
|
34
|
+
spec.add_dependency 'action_cable_client', '2.0.2'
|
35
|
+
spec.add_dependency 'json', '2.1.0'
|
36
|
+
spec.add_dependency 'openssl', '2.1.0'
|
37
|
+
spec.add_dependency 'airbrake-ruby', '2.8.1'
|
36
38
|
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
39
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
40
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
41
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
42
|
+
spec.add_development_dependency 'byebug', '~> 9.0', '>= 9.0.6'
|
43
|
+
spec.add_development_dependency 'faker', '~> 1.7', '>= 1.7.2'
|
42
44
|
end
|
data/exe/adminix
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# encoding: utf-8
|
3
3
|
|
4
4
|
require 'optparse'
|
5
|
+
require_relative '../lib/adminix'
|
5
6
|
|
6
7
|
options = {
|
7
8
|
action: "help",
|
@@ -42,7 +43,6 @@ options[:action] = ARGV[0] || "help"
|
|
42
43
|
parsers[options[:action].to_sym].parse!(ARGV) rescue nil
|
43
44
|
|
44
45
|
unless options[:action] == "help"
|
45
|
-
require'adminix'
|
46
46
|
config = Adminix::Config.instance
|
47
47
|
|
48
48
|
config.secret_key = options[:secret_key]
|
@@ -60,7 +60,7 @@ case options[:action]
|
|
60
60
|
puts Adminix::Watcher.run!(options)
|
61
61
|
else
|
62
62
|
puts 'Credentials are not defined, running setup server'
|
63
|
-
require 'adminix/
|
63
|
+
require 'adminix/server_setup'
|
64
64
|
end
|
65
65
|
when "version"
|
66
66
|
puts "adminix version #{Adminix::VERSION}"
|
data/lib/adminix/config.rb
CHANGED
@@ -7,12 +7,13 @@ module Adminix
|
|
7
7
|
|
8
8
|
DEFAULT_HOST = 'https://api.adminix.io'.freeze
|
9
9
|
DEFAULT_WEBSOCKET_HOST = 'wss://websocket.adminix.io/cable'.freeze
|
10
|
-
DEFAULT_SETUP_SERVER_PORT = '8080'
|
10
|
+
DEFAULT_SETUP_SERVER_PORT = (ENV['ADMINIX_SETUP_SERVER_PORT'] || '8080').freeze
|
11
11
|
DEFAULT_WATCHER_SYNC_PERIOD = 10.freeze
|
12
12
|
DEFAULT_LOGS_SYNC_PERIOD = 3.freeze
|
13
13
|
DEFAULT_LOGS_ENABLED = true
|
14
14
|
|
15
|
-
attr_accessor :service_id, :secret_key, :host, :commands, :daemon, :setup_server_port, :scripts, :watch_log_files, :watcher_sync_period, :logs_sync_period, :logs_enabled, :websocket_path, :mode, :working_dir
|
15
|
+
attr_accessor :service_id, :secret_key, :host, :commands, :daemon, :setup_server_port, :scripts, :watch_log_files, :watcher_sync_period, :logs_sync_period, :logs_enabled, :websocket_path, :mode, :working_dir, :iv, :password
|
16
|
+
attr_reader :image_sname, :error_notifier_enabled
|
16
17
|
|
17
18
|
def initialize
|
18
19
|
@host = ENV['ADMINIX_HOST'] || DEFAULT_HOST
|
@@ -24,6 +25,7 @@ module Adminix
|
|
24
25
|
@websocket_path = ENV['ADMINIX_WEBSOCKET_HOST'] || DEFAULT_WEBSOCKET_HOST
|
25
26
|
@mode = 'classic'
|
26
27
|
@working_dir = `pwd`.split("\n").first
|
28
|
+
@iv = ENV['DECIPHER_IV'] || 'U7yfLthY77Yjtp9z'
|
27
29
|
@scripts = {
|
28
30
|
watcher_start: 'sudo systemctl start adminix.service',
|
29
31
|
watcher_stop: 'sudo systemctl stop adminix.service',
|
@@ -31,6 +33,7 @@ module Adminix
|
|
31
33
|
process_stop: 'sudo systemctl stop adminix_process.service'
|
32
34
|
}
|
33
35
|
@watch_log_files = []
|
36
|
+
@error_notifier_enabled = ENV['ADMINIX_ERROR_NOTIFIER'].nil? ? true : ENV['ADMINIX_ERROR_NOTIFIER'] == 'true'
|
34
37
|
|
35
38
|
@config_store_path = "#{ENV['HOME']}/.config"
|
36
39
|
@root_path = "#{@config_store_path}/adminix"
|
@@ -64,10 +67,14 @@ module Adminix
|
|
64
67
|
}
|
65
68
|
|
66
69
|
@watch_log_files = data['watch_logs'] || []
|
70
|
+
|
71
|
+
@image_sname = data['image']
|
67
72
|
end
|
68
73
|
end
|
69
74
|
|
70
75
|
def sync_remote_config
|
76
|
+
return if service_id.nil? || secret_key.nil?
|
77
|
+
|
71
78
|
uri = URI.parse("#{@host}/v1/services/#{@service_id}/watcher_config")
|
72
79
|
request = Net::HTTP::Get.new(uri)
|
73
80
|
request["Authorization"] = "Bearer #{@secret_key}"
|
@@ -80,6 +87,12 @@ module Adminix
|
|
80
87
|
data = JSON.parse(response.body)
|
81
88
|
result = data['result'] || {}
|
82
89
|
|
90
|
+
case response.code
|
91
|
+
when '401'
|
92
|
+
puts 'Incorrect credentials'
|
93
|
+
exit
|
94
|
+
end
|
95
|
+
|
83
96
|
@watcher_sync_period = result['sync_period'] || DEFAULT_WATCHER_SYNC_PERIOD
|
84
97
|
@logs_sync_period = result['logs_sync_period'] || DEFAULT_LOGS_SYNC_PERIOD
|
85
98
|
@logs_enables = result.key?('logs_enabled') ? result['logs_enabled'] == true : DEFAULT_LOGS_ENABLED
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'json'
|
3
|
+
require 'securerandom'
|
4
|
+
require 'base64'
|
5
|
+
require 'openssl'
|
6
|
+
# require 'digest'
|
7
|
+
|
8
|
+
module Adminix
|
9
|
+
class ServerSetup < Sinatra::Base
|
10
|
+
get '/' do
|
11
|
+
%{
|
12
|
+
<html>
|
13
|
+
<head>
|
14
|
+
<title>Adminix start</title>
|
15
|
+
</head>
|
16
|
+
<body>
|
17
|
+
<script type="text/javascript">
|
18
|
+
var host = window.location.protocol + '//' + window.location.host;
|
19
|
+
var newPath = "https://beta.adminix.io/setup-server/init?host=" + host;
|
20
|
+
window.location.href = newPath;
|
21
|
+
</script>
|
22
|
+
</body>
|
23
|
+
</html>
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
get '/ping' do
|
28
|
+
'pong'
|
29
|
+
end
|
30
|
+
|
31
|
+
post '/data' do
|
32
|
+
config = Adminix::Config.instance
|
33
|
+
config.password = SecureRandom.hex
|
34
|
+
|
35
|
+
content_type :json
|
36
|
+
{ password: config.password, image: config.image_sname }.to_json
|
37
|
+
end
|
38
|
+
|
39
|
+
post '/connect' do
|
40
|
+
content_type :json
|
41
|
+
|
42
|
+
data = {}
|
43
|
+
config = Adminix::Config.instance
|
44
|
+
|
45
|
+
begin
|
46
|
+
decoded = Base64.decode64 request.body.read.encode('ascii-8bit')
|
47
|
+
decipher = OpenSSL::Cipher::AES256.new :CBC
|
48
|
+
decipher.decrypt
|
49
|
+
decipher.key = config.password
|
50
|
+
decipher.iv = config.iv
|
51
|
+
decrypted_data = decipher.update(decoded) + decipher.final
|
52
|
+
data = JSON.parse(decrypted_data)['server_setup']
|
53
|
+
rescue
|
54
|
+
{ success: false }.to_json
|
55
|
+
end
|
56
|
+
|
57
|
+
config.password = ''
|
58
|
+
config.service_id = data['service_id']
|
59
|
+
config.secret_key = data['secret_key']
|
60
|
+
config.export_credentials
|
61
|
+
|
62
|
+
Thread.start do
|
63
|
+
sleep(2)
|
64
|
+
Adminix::Service.instance.restart!
|
65
|
+
end
|
66
|
+
|
67
|
+
{ success: true }.to_json
|
68
|
+
end
|
69
|
+
|
70
|
+
set :bind, '0.0.0.0'
|
71
|
+
set :port, Adminix::Config::DEFAULT_SETUP_SERVER_PORT
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
data/lib/adminix/version.rb
CHANGED
data/lib/adminix/watcher.rb
CHANGED
@@ -42,33 +42,8 @@ module Adminix
|
|
42
42
|
Adminix::Service.instance.count_logs_lines
|
43
43
|
|
44
44
|
EventMachine.run do
|
45
|
-
|
46
|
-
|
47
|
-
puts 'Service connection established'
|
48
|
-
end
|
49
|
-
@ws_client.disconnected do
|
50
|
-
system.log 'Service disconnected. Reconnecting...'
|
51
|
-
sleep(2)
|
52
|
-
@ws_client.connect!
|
53
|
-
end
|
54
|
-
@ws_client.received do |msg|
|
55
|
-
message = msg['message'] || {}
|
56
|
-
case message['type']
|
57
|
-
when 'restart' then @service.restart!
|
58
|
-
when 'sync' then @service.sync(@ws_client, message['data'])
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
@ws_logs_client = ActionCableClient.new(@ws_uri, @ws_logs_channel)
|
63
|
-
@ws_logs_client.connected do |msg|
|
64
|
-
puts 'Logs connection established'
|
65
|
-
end
|
66
|
-
@ws_logs_client.disconnected do
|
67
|
-
system.log 'Logs disconnected. Reconnecting...'
|
68
|
-
sleep(2)
|
69
|
-
@ws_logs_client.connect!
|
70
|
-
end
|
71
|
-
@ws_logs_client.received { |msg| }
|
45
|
+
initialize_ws
|
46
|
+
initialize_ws_logs
|
72
47
|
|
73
48
|
# Sync watcher
|
74
49
|
EventMachine.add_periodic_timer(config.watcher_sync_period) do
|
@@ -91,6 +66,47 @@ module Adminix
|
|
91
66
|
end
|
92
67
|
end
|
93
68
|
|
69
|
+
def initialize_ws
|
70
|
+
@ws_client = ActionCableClient.new(@ws_uri, @ws_channel)
|
71
|
+
@ws_client.connected do |msg|
|
72
|
+
puts 'Service connection established'
|
73
|
+
end
|
74
|
+
@ws_client.disconnected do
|
75
|
+
system.log 'Service disconnected. Reconnecting...'
|
76
|
+
sleep(2)
|
77
|
+
# @ws_client.connect!
|
78
|
+
initialize_ws
|
79
|
+
end
|
80
|
+
@ws_client.received do |msg|
|
81
|
+
message = msg['message'] || {}
|
82
|
+
case message['type']
|
83
|
+
when 'restart' then @service.restart!
|
84
|
+
when 'sync' then @service.sync(@ws_client, message['data'])
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# @ws_client.pinged do |_data|
|
89
|
+
# puts 'ping'
|
90
|
+
# end
|
91
|
+
end
|
92
|
+
|
93
|
+
def initialize_ws_logs
|
94
|
+
@ws_logs_client = ActionCableClient.new(@ws_uri, @ws_logs_channel)
|
95
|
+
@ws_logs_client.connected do |msg|
|
96
|
+
puts 'Logs connection established'
|
97
|
+
end
|
98
|
+
@ws_logs_client.disconnected do
|
99
|
+
system.log 'Logs disconnected. Reconnecting...'
|
100
|
+
sleep(2)
|
101
|
+
# @ws_logs_client.connect!
|
102
|
+
initialize_ws_logs
|
103
|
+
end
|
104
|
+
# @ws_logs_client.pinged do |_data|
|
105
|
+
# puts 'logs ping'
|
106
|
+
# end
|
107
|
+
@ws_logs_client.received { |msg| }
|
108
|
+
end
|
109
|
+
|
94
110
|
def get_pid
|
95
111
|
if File.exists?(@pid_full)
|
96
112
|
file = File.new(@pid_full, "r")
|
data/lib/adminix.rb
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require_relative 'adminix/version'
|
2
|
+
require_relative 'adminix/errors'
|
3
|
+
require_relative 'adminix/config'
|
4
|
+
require_relative 'adminix/service'
|
5
|
+
require_relative 'adminix/system'
|
6
|
+
require_relative 'adminix/log_watch_handler'
|
7
|
+
require_relative 'adminix/watcher'
|
7
8
|
|
8
9
|
module Adminix
|
9
10
|
def self.root
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adminix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.35
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Dyl
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eventmachine
|
@@ -39,19 +39,47 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 2.0.2
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: json
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
47
|
+
version: 2.1.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
54
|
+
version: 2.1.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: openssl
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.1.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.1.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: airbrake-ruby
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.8.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.8.1
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,7 +164,7 @@ dependencies:
|
|
136
164
|
version: 1.7.2
|
137
165
|
description: Adminix
|
138
166
|
email:
|
139
|
-
- christian
|
167
|
+
- christian@adminix.io
|
140
168
|
executables:
|
141
169
|
- adminix
|
142
170
|
extensions: []
|
@@ -157,7 +185,9 @@ files:
|
|
157
185
|
- lib/adminix.rb
|
158
186
|
- lib/adminix/.service.rb.swn
|
159
187
|
- lib/adminix/config.rb
|
188
|
+
- lib/adminix/errors.rb
|
160
189
|
- lib/adminix/log_watch_handler.rb
|
190
|
+
- lib/adminix/server_setup.rb
|
161
191
|
- lib/adminix/service.rb
|
162
192
|
- lib/adminix/setup.rb
|
163
193
|
- lib/adminix/setup/routes.rb
|
@@ -167,7 +197,7 @@ files:
|
|
167
197
|
- lib/adminix/version.rb
|
168
198
|
- lib/adminix/watcher.rb
|
169
199
|
- views/daemon_scripts/upstart.conf.erb
|
170
|
-
homepage:
|
200
|
+
homepage: https://adminix.io
|
171
201
|
licenses:
|
172
202
|
- MIT
|
173
203
|
metadata: {}
|
@@ -187,7 +217,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
217
|
version: '0'
|
188
218
|
requirements: []
|
189
219
|
rubyforge_project:
|
190
|
-
rubygems_version: 2.6.
|
220
|
+
rubygems_version: 2.6.11
|
191
221
|
signing_key:
|
192
222
|
specification_version: 4
|
193
223
|
summary: Adminix
|