soar_sc_core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0eddb946892d4292b499de7e390bbc65718df8fd
4
+ data.tar.gz: eae0a157ea38811a883a4c892444859234c2e6e3
5
+ SHA512:
6
+ metadata.gz: e5ac4b0c326097dc241650016e9375119c1d7f30b81ed1ae41d6af225943df8493861a8249826e615ebf19dd3455f080b50900d763029b87fecb2ef5496f94f2
7
+ data.tar.gz: 889193ec98f48f1571a690566e00211685cf6ae2f111edd93397614bfd3af99f2624a46c05bdd69f1e7c874a0a6eb9eaf0ffc5d3402a5fa9c12a3739245438f9
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.2.1
5
+ before_install: gem install bundler -v 1.12.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in soar_sc_core.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Ernst Van Graan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # SoarScCore
2
+
3
+ This is the core SOAR service component library, aggregating SOAR libraries.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'soar_sc_core'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install soar_sc_core
20
+
21
+ ## Usage
22
+
23
+ require 'soar_sc_core' and define a router. Also require your specific authentication technology. Then use the various SOAR middleware libraries as required. An example from soar_sc below:
24
+
25
+ ```ruby
26
+ require 'soar_sc.rb'
27
+ require 'rack'
28
+ require 'rack/builder'
29
+ require 'bundler'
30
+ require 'kh_signon'
31
+
32
+ Bundler.require(:default)
33
+
34
+ SoarSc::configuration = SoarSc::load_environment_and_configuration
35
+ SoarSc::configuration = SoarSc::Providers::Auditing::bootstrap(SoarSc::configuration)
36
+ SoarSc::Providers::ServiceRegistry::bootstrap(SoarSc::configuration)
37
+ dependencies = SoarSc::inject_dependencies(SoarSc::configuration)
38
+ authenticated_meta = SoarSc::Web::AuthenticatedRouterMeta.new(SoarSc::configuration)
39
+ unauthenticated_meta = SoarSc::Web::UnauthenticatedRouterMeta.new(SoarSc::configuration)
40
+ lexicon = authenticated_meta.lexicon.merge(unauthenticated_meta.lexicon)
41
+ SoarSc::bootstrap_aspects(SoarSc::configuration, authenticated_meta, lexicon)
42
+
43
+ use SoarFlow::ID
44
+ use SoarAspects::Aspects
45
+ use SoarLexicon::Lexicon
46
+ use SoarWadlValidation::Validator
47
+
48
+ authenticated_router = SoarSc::SoarScRouter.new(authenticated_meta)
49
+ unauthenticated_router = SoarSc::SoarScRouter.new(unauthenticated_meta)
50
+
51
+ unauthenticated = Rack::Builder.new do
52
+ use Rack::Static, SoarSc::static_options
53
+ use Rack::ContentLength
54
+
55
+ app = lambda do |env|
56
+ request = Rack::Request.new(env)
57
+ unauthenticated_router.route(request)
58
+ end
59
+ run app
60
+ end
61
+
62
+ authenticated = Rack::Builder.new do
63
+ SoarSc::bootstrap_sessions self
64
+ SoarSc::bootstrap_authentication self
65
+ use SoarAuthentication::Authenticate
66
+ use SoarAuthorization::Authorize
67
+ use Rack::Static, SoarSc::static_options
68
+ use Rack::ContentLength
69
+ use SoarSmaak::Router
70
+
71
+ app = lambda do |env|
72
+ request = Rack::Request.new(env)
73
+ authenticated_router.route(request)
74
+ end
75
+ run app
76
+ end
77
+
78
+ SoarSc::auditing.info("Your launchpad is designated SoarSc #{SoarSc::VERSION}",SoarSc::startup_flow_id)
79
+
80
+ run Rack::Cascade.new([unauthenticated, authenticated])
81
+ ```
82
+
83
+ ## Contributing
84
+
85
+ Bug reports and feature requests are welcome by email to ernst dot van dot graan at hetzner dot co dot za. This gem is sponsored by Hetzner (Pty) Ltd (http://hetzner.co.za)
86
+
87
+ ## License
88
+
89
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "soar_sc_core"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,77 @@
1
+ require 'soar_xt'
2
+ require 'soar_flow'
3
+ require 'soar_auditing_provider'
4
+ require 'log4r_auditor'
5
+
6
+ module SoarSc
7
+ module Providers
8
+ class Auditing
9
+ DEFAULT_AUDITING_CONFIGURATION = {
10
+ 'auditing' => {
11
+ 'provider' => 'SoarAuditingProvider::AuditingProvider',
12
+ 'level' => 'debug',
13
+ 'install_exit_handler' => 'true',
14
+ 'queue_worker' => {
15
+ 'queue_size' => 1000,
16
+ 'initial_back_off_in_seconds' => 1,
17
+ 'back_off_multiplier' => 2,
18
+ 'back_off_attempts' => 5
19
+ },
20
+ 'default_nfrs' => {
21
+ 'accessibility' => 'local',
22
+ 'privacy' => 'not encrypted',
23
+ 'reliability' => 'instance',
24
+ 'performance' => 'high'
25
+ },
26
+ 'auditors' => {
27
+ 'log4r' => {
28
+ 'adaptor' => 'Log4rAuditor::Log4rAuditor',
29
+ 'file_name' => 'soar_sc.log',
30
+ 'standard_stream' => 'stdout',
31
+ 'nfrs' => {
32
+ 'accessibility' => 'local',
33
+ 'privacy' => 'not encrypted',
34
+ 'reliability' => 'instance',
35
+ 'performance' => 'high'
36
+ }
37
+ }
38
+ }
39
+ }
40
+ } unless defined? DEFAULT_AUDITING_CONFIGURATION; DEFAULT_AUDITING_CONFIGURATION.freeze
41
+
42
+ def self.bootstrap(configuration)
43
+ begin
44
+ merged_configuration = self.merge_configuration_with_auditing_defaults(configuration)
45
+ self.validate_auditing_provider_configuration(merged_configuration['auditing'])
46
+ SoarSc::auditing = SoarSc::Providers.const_get(merged_configuration['auditing']['provider']).new(merged_configuration['auditing'])
47
+ self.generate_instance_flow_id
48
+ SoarSc::auditing.service_identifier = SoarSc::environment['IDENTIFIER']
49
+ merged_configuration
50
+ rescue
51
+ $stderr.puts 'Failure initializing auditing provider'
52
+ raise
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def self.generate_instance_flow_id
59
+ SoarSc::startup_flow_id = SoarFlow::ID::generate_flow_id
60
+ SoarSc::auditing.instance_flow_identifier = SoarSc::startup_flow_id
61
+ end
62
+
63
+ def self.merge_configuration_with_auditing_defaults(configuration)
64
+ Hash.deep_merge(DEFAULT_AUDITING_CONFIGURATION,SoarSc::configuration)
65
+ end
66
+
67
+ def self.validate_auditing_provider_configuration(configuration)
68
+ begin
69
+ SoarSc::Providers.const_get(configuration['provider'])
70
+ rescue
71
+ $stderr.puts 'Invalid auditing provider configuration'
72
+ raise
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,74 @@
1
+ module SoarSc
2
+ module Providers
3
+ class ServiceRegistry
4
+ def self.bootstrap(config)
5
+ begin
6
+ credentials = { 'username' => 'uddi', 'password' => 'read-only' }
7
+ registry = config['service_registry']['uri'] if config['service_registry']
8
+ registry = SoarSc::environment['SERVICE_REGISTRY'] if SoarSc::environment['SERVICE_REGISTRY']
9
+ SoarSc::auditing.info("Using registry at [#{registry}]",SoarSc::startup_flow_id)
10
+ SoarSc::auditing.error("No service registry! Missing service registry URI",SoarSc::startup_flow_id) if ((registry.nil?) or ('' == registry))
11
+ freshness = 3600
12
+ freshness = config['service_registry']['freshness'] if config['service_registry'] and config['service_registry']['freshness']
13
+ SoarSc::service_registry = SoarSr::ServiceRegistry.new(registry, 'hetzner.co.za', 'hetzner', credentials, freshness)
14
+ config['service_registry']['warm_up'].each do |service_identifier|
15
+ SoarSc::auditing.info("SoarSc::Provider::ServiceRegistry Warming up #{service_identifier}",SoarSc::startup_flow_id)
16
+ SoarSc::service_registry.services.service_by_name(service_identifier)
17
+ SoarSc::service_registry.services.meta_for_service(service_identifier)
18
+ end if config['service_registry'] and config['service_registry']['warm_up']
19
+ rescue
20
+ SoarSc::auditing.fatal("Service registry client failure",SoarSc::startup_flow_id)
21
+ raise
22
+ end
23
+ end
24
+
25
+ def self.find_first_service_uri(identifier)
26
+ result = SoarSc::service_registry.services.service_by_name(identifier)
27
+ SoarSc::auditing.error("Failure to look up service in service registry",SoarSc::startup_flow_id) if not result['status'] == 'success'
28
+ return nil if not result['status'] == 'success'
29
+ return nil if result['data']['services'].nil? or result['data']['services'].first.nil?
30
+ service = result['data']['services'].first
31
+ return nil if service[1].nil? or service[1]['uris'].nil?
32
+ access = service[1]['uris'].first
33
+ return nil if access.nil? or access[1].nil? or access[1]['access_point'].nil?
34
+ access[1]['access_point']
35
+ end
36
+
37
+ def self.find_best_service_uri(identifier)
38
+ status_map = {}
39
+ result = SoarSc::service_registry.services.service_by_name(identifier)
40
+ SoarSc::auditing.error("Failure to look up service in service registry",SoarSc::startup_flow_id) if not result['status'] == 'success'
41
+ return nil if not result['status'] == 'success'
42
+ return nil if result['data']['services'].nil? or result['data']['services'].first.nil?
43
+ result['data']['services'].each do |service|
44
+ next if service[1].nil? or service[1]['uris'].nil?
45
+ access = service[1]['uris']
46
+ next if access.nil?
47
+ access.each do |access_point|
48
+ next if access_point[1].nil? or access_point[1]['access_point'].nil?
49
+ uri = access_point[1]['access_point']
50
+ url = URI.parse(uri)
51
+ components = url.path.split('/')
52
+ status = "#{url.path.split('/')[0..(components.size - 2)].join('/')}/status"
53
+ url.path = status
54
+ health = -2
55
+ begin
56
+ res = Net::HTTP.get(url)
57
+ rescue => ex
58
+ health = -1
59
+ end
60
+ begin
61
+ health = res.to_i
62
+ rescue => ex
63
+ health = 0
64
+ end
65
+ status_map[uri] = health
66
+ end
67
+ end
68
+
69
+ best_uri = (status_map.sort_by { |uri, health| health })[-1]
70
+ best_uri.nil? ? nil : best_uri[0]
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,38 @@
1
+ module SoarSc
2
+ module Providers
3
+ class Sessions
4
+ def bootstrap_sessions(stack)
5
+ validate_session_configuration(SoarSc::environment)
6
+
7
+ if 'true' == SoarSc::environment['USE_SESSIONS'] then
8
+ stack.use Rack::Session::Cookie, key: SoarSc::environment['SESSION_KEY'], secret: SoarSc::environment['SESSION_SECRET']
9
+ else
10
+ SoarSc.auditing.warn('Not using sessions', SoarSc::startup_flow_id)
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def validate_session_configuration(environment)
17
+ validate_session_use(environment['USE_SESSIONS']) if not environment['USE_SESSIONS'].nil?
18
+ validate_session_key(environment['SESSION_KEY']) if 'true' == environment['USE_SESSIONS']
19
+ validate_session_secret(environment['SESSION_SECRET']) if 'true' == environment['USE_SESSIONS']
20
+ end
21
+
22
+ def validate_session_use(value)
23
+ raise ArgumentError.new "Undefined USE_SESSIONS value" if value.nil? or (value.strip == '')
24
+ raise ArgumentError.new "Invalid USE_SESSIONS value" if not ['true','false'].include? value
25
+ end
26
+
27
+ def validate_session_key(value)
28
+ raise ArgumentError.new "Missing session key SESSION_KEY" if value.nil? or (value.strip == '')
29
+ raise ArgumentError.new "Invalid session key SESSION_KEY" if /[^!#$%&'*+\-.0-9A-Z^_`a-z|~]+/.match(value)
30
+ end
31
+
32
+ def validate_session_secret(value)
33
+ raise ArgumentError.new "Missing session secret SESSION_SECRET" if value.nil? or (value.strip == '')
34
+ raise ArgumentError.new "Invalid session secret SESSION_SECRET" if value.length < 32
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,242 @@
1
+ require 'pathname'
2
+ $: << Pathname('.') + 'lib'
3
+
4
+ def require_technology
5
+ require 'byebug' if ENV['SOAR_TECH'] == 'debug'
6
+ require 'rack'
7
+ require 'net/http'
8
+ end
9
+
10
+ def require_configuration
11
+ require 'soar_configuration'
12
+ end
13
+
14
+ def require_environment
15
+ require 'soar_aspects'
16
+ require 'soar_environment'
17
+ end
18
+
19
+ def require_routing
20
+ require 'soar_sc_routing'
21
+ require 'web/soar_sc_router'
22
+ end
23
+
24
+ def require_web
25
+ require 'soar_sc_views'
26
+ require 'haml'
27
+ require 'soar_wadl_validation'
28
+ require 'soar_lexicon'
29
+ require 'soar_sc_mvc'
30
+ Dir["#{Dir.pwd}/lib/web/controllers/*.rb"].each {|file| require file }
31
+ Dir["#{Dir.pwd}/lib/web/views/*.rb"].each {|file| require file }
32
+ Dir["#{Dir.pwd}/lib/web/validators/*.rb"].each {|file| require file }
33
+ end
34
+
35
+ def require_auth
36
+ require 'soar_smaak'
37
+ require 'soar_authentication'
38
+ require 'soar_authentication_cas'
39
+ Dir["#{Dir.pwd}/lib/authorization/*.rb"].each {|file| require file }
40
+ end
41
+
42
+ def require_models
43
+ require 'soar_configured_factory'
44
+ Dir["#{Dir.pwd}/lib/web/models/*.rb"].each {|file| require file }
45
+ end
46
+
47
+ def require_database_adaptors
48
+ Dir["#{Dir.pwd}/lib/providers/storage/*.rb"].each {|file| require file }
49
+ end
50
+
51
+ def require_providers
52
+ require 'soar_sr'
53
+ Dir["#{Dir.pwd}/lib/providers/**/*.rb"].each {|file| require file }
54
+ Dir["#{Dir.pwd}/lib/providers/*.rb"].each {|file| require file }
55
+ end
56
+
57
+ def require_core
58
+ require 'soar_sc_core'
59
+ end
60
+
61
+ require_technology
62
+ require_routing
63
+ require_environment
64
+ require_configuration
65
+ require_web
66
+ require_models
67
+ require_database_adaptors
68
+ require_providers
69
+ require_auth
70
+ require_core
71
+
72
+ module SoarSc
73
+ @service_registry = nil
74
+ @configuration = nil
75
+ @environment = {}
76
+ @auditing = nil
77
+ @dependencies = nil
78
+ @startup_flow_id = nil
79
+
80
+ def self.load_environment_and_configuration
81
+ environment_file = 'config/environment.yml'
82
+ if File.exists?(environment_file)
83
+ environment_loader = SoarEnvironment::Environment.new(environment_file)
84
+ else
85
+ environment_loader = SoarEnvironment::Environment.new
86
+ end
87
+ SoarSc::environment = environment_loader.load_environment
88
+ config = SoarSc::load_configuration
89
+ SoarSc::environment = environment_loader.supplement_with_configuration(config)
90
+ validator = SoarEnvironment::EnvironmentValidator.new
91
+ errors = validator.validate(SoarSc::environment)
92
+ raise ArgumentError.new(errors) if (errors) and (not (errors.empty?))
93
+ config
94
+ rescue Exception
95
+ $stderr.puts 'Failure retrieving environment from file'
96
+ raise
97
+ end
98
+
99
+ def self.load_configuration
100
+ configuration = SoarConfiguration::Configuration.new
101
+ if SoarSc::environment['CFGSRV_IDENTIFIER']
102
+ self.validate_configuration_service_token
103
+ config, errors = configuration.load_from_configuration_service(SoarSc::environment)
104
+ self.adapt_configuration_service_errors(errors)
105
+ else
106
+ config, errors = configuration.load_from_yaml("config/config.yml")
107
+ errors << 'Failure retrieving configuration from file' if not errors.empty?
108
+ errors << 'Invalid configuration file' if not config.is_a?(::Hash)
109
+ end
110
+ errors << 'missing configuration' if config.nil?
111
+ errors = configuration.validate(config) if (errors) and (errors.empty?)
112
+ raise ArgumentError.new(errors) if (errors) and (not (errors.empty?))
113
+
114
+ SoarSc::configuration = config
115
+ config
116
+ end
117
+
118
+ def self.adapt_configuration_service_errors(errors)
119
+ errors << 'missing configuration service URI' if errors.include?('missing key address')
120
+ errors << 'incorrect configuration service token' if errors.include?('permission denied')
121
+ errors << 'failure retrieving configuration from configuration service' if not errors.empty?
122
+ end
123
+
124
+ def self.validate_configuration_service_token
125
+ raise ArgumentError.new('missing configuration service token') if SoarSc::environment['CFGSRV_TOKEN'].nil?
126
+ raise ArgumentError.new('invalid configuration service token') if SoarSc::environment['CFGSRV_TOKEN'].length < 12
127
+ end
128
+
129
+ def self.inject_dependencies(configuration)
130
+ if configuration and configuration['dependency_injector']
131
+ injector = Object::const_get(configuration['dependency_injector']).new
132
+ @dependencies = injector.inject_dependencies(configuration)
133
+ end
134
+
135
+ @dependencies
136
+ rescue
137
+ return nil
138
+ end
139
+
140
+ def self.bootstrap_sessions(stack)
141
+ if (SoarSc::environment['SESSION_KEY'] or SoarSc::environment['SESSION_SECRET'])
142
+ session_provider = SoarSc::Providers::Sessions.new
143
+ session_provider.bootstrap_sessions(stack)
144
+ end
145
+ end
146
+
147
+ def self.bootstrap_authentication(stack)
148
+ if SoarSc::environment['CAS_SERVER']
149
+ SoarSc::auditing.info("Using CAS_SERVER=#{SoarSc::environment['CAS_SERVER']} for authentication",SoarSc::startup_flow_id)
150
+ options = SoarAuthenticationCas::configure(SoarSc::environment)
151
+ stack.use KhSignon::RackMiddleware, options if options
152
+ elsif SoarSc::environment['BASIC_AUTH_USER']
153
+ SoarSc::auditing.warn("BASIC_AUTH_USER specified, using basic auth for authentication. Basic auth is not recommended for production",SoarSc::startup_flow_id)
154
+ stack.use Rack::Auth::Basic, "Restricted Area" do |username, password|
155
+ [username, password] == [SoarSc::environment['BASIC_AUTH_USER'], SoarSc::environment['BASIC_AUTH_PASSWORD']]
156
+ end if SoarSc::environment['BASIC_AUTH_USER']
157
+ else
158
+ SoarSc::auditing.warn("Neither CAS_SERVER or BASIC_AUTH_USER specified. Having no authentication is not recommended for production",SoarSc::startup_flow_id)
159
+ end
160
+ end
161
+
162
+ def self.bootstrap_aspects(config, authenticated_meta, lexicon)
163
+ SoarAspects::Aspects::configuration = config
164
+ SoarAspects::Aspects::signed_routes = authenticated_meta.signed_routes
165
+ SoarAspects::Aspects::auditing = SoarSc::auditing
166
+ SoarAspects::Aspects::lexicon = lexicon
167
+ end
168
+
169
+ def self.static_options
170
+ { :urls => ["/wadl", "/fonts", "/css", "/img", "/modernizr", "/jquery", "/foundation", "/js", "/favicon.ico"],
171
+ :root => "public" }
172
+ end
173
+
174
+ def self.self_test
175
+ Thread.new do |thread|
176
+ sleep 1
177
+ url = URI.parse('http://localhost:9393/status')
178
+ res = Net::HTTP.get(url)
179
+ puts "SELF-TEST: #{res}"
180
+
181
+ if RUBY_PLATFORM =~ /java/
182
+ java.lang.System.exit(1)
183
+ else
184
+ exit 0
185
+ end
186
+ end
187
+ end
188
+
189
+ def self.dependencies
190
+ @dependencies
191
+ end
192
+
193
+ def self.service_registry
194
+ @service_registry
195
+ end
196
+
197
+ def self.configuration
198
+ @configuration
199
+ end
200
+
201
+ def self.environment
202
+ @environment
203
+ end
204
+
205
+ def self.environment=(environment)
206
+ @environment = environment
207
+ end
208
+
209
+ def self.auditing
210
+ @auditing
211
+ end
212
+
213
+ def self.auditing=(auditing)
214
+ @auditing = auditing
215
+ end
216
+
217
+ def self.startup_flow_id
218
+ @startup_flow_id
219
+ end
220
+
221
+ def self.startup_flow_id=(startup_flow_id)
222
+ @startup_flow_id = startup_flow_id
223
+ end
224
+
225
+ def self.service_registry=(service_registry)
226
+ @service_registry = service_registry
227
+ end
228
+
229
+ def self.configuration=(configuration)
230
+ @configuration = configuration
231
+ end
232
+ end
233
+
234
+ require "providers/auditing"
235
+ require "web/renderer"
236
+ require "web/soar_sc_router"
237
+ require "providers/service_registry"
238
+ require "providers/sessions"
239
+ require "soar_sc_core/version"
240
+
241
+ module SoarScCore
242
+ end
@@ -0,0 +1,3 @@
1
+ module SoarScCore
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,23 @@
1
+ Dir["web/views/*.rb"].each {|file| require file }
2
+
3
+ module SoarSc
4
+ module Web
5
+ class Renderer
6
+ def render_view(detail, http_code, body)
7
+ if detail['view']['renderer'] == 'haml'
8
+ SoarSc::Web::Views::Default.render(http_code, SoarSc::Web::Views::HamlLoader::load(detail['view']['name'], body))
9
+ elsif detail['view']['renderer'] == 'erb'
10
+ SoarSc::Web::Views::Default.render(http_code, SoarSc::Web::Views::ERBLoader::load(detail['view']['name'], body))
11
+ elsif detail['view']['renderer'] == 'html'
12
+ SoarSc::Web::Views::Default.render(http_code, body)
13
+ elsif detail['view']['renderer'] == 'json'
14
+ SoarSc::Web::Views::JSON.render(http_code, body)
15
+ elsif detail['view']['renderer'] == 'xml'
16
+ SoarSc::Web::Views::XML.render(http_code, body)
17
+ else
18
+ Object::const_get(detail['view']['renderer']).new(@configuration).render(http_code, body)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ module SoarSc
2
+ class SoarScRouter < SoarScRouting::BaseRouter
3
+ def not_found
4
+ SoarSc::Web::Views::Default.not_found
5
+ end
6
+
7
+ def excepted(ex)
8
+ SoarSc::Web::Views::Default.error(ex)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,64 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'soar_sc_core/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "soar_sc_core"
8
+ spec.version = SoarScCore::VERSION
9
+ spec.authors = ["Ernst Van Graan"]
10
+ spec.email = ["ernst.van.graan@hetzner.co.za"]
11
+
12
+ spec.summary = %q{Service component core aggregations}
13
+ spec.description = %q{Service component core aggregations}
14
+ spec.homepage = "https://github.com/hetznerZA/soar_sc_core"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_dependency "haml", "~> 4.0.7"
31
+ spec.add_dependency 'jsender', "~> 0.2.0"
32
+ spec.add_dependency 'soar_sc_views', "~> 0.1.1"
33
+ spec.add_dependency "soar_aspects", "~> 0.1.2"
34
+ spec.add_dependency "soar_flow", "~> 0.1.1"
35
+ spec.add_dependency "soar_lexicon", "~> 0.1.3"
36
+ spec.add_dependency "soar_environment", "~> 0.2.0"
37
+ spec.add_dependency "soar_configuration", "~> 0.1.1"
38
+ spec.add_dependency "soar_wadl_validation", "~> 0.1.3"
39
+ spec.add_dependency "soar_auditing_provider", "~> 0.9.3"
40
+ spec.add_dependency "soar_authentication", "~>0.1.3"
41
+ spec.add_dependency "soar_authentication_cas", "~> 0.1.2"
42
+ spec.add_dependency "soar_am", "~>0.1.2"
43
+ spec.add_dependency "soar_policy_access_manager", "~>0.2.1"
44
+ spec.add_dependency "soar_authorization", "~> 0.1.4"
45
+ spec.add_dependency 'soar_configured_factory', '~> 0.1.0'
46
+ spec.add_dependency 'soar_sc_routing', "~> 0.1.6"
47
+ spec.add_dependency "logstash_auditor", "~> 0.0.19"
48
+ spec.add_dependency "log4r_auditor", "~> 0.0.4"
49
+ spec.add_dependency 'smaak', "~> 0.2.2"
50
+ spec.add_dependency 'soar_smaak', "~> 0.1.16"
51
+ spec.add_dependency 'wadling', "~> 0.1.9"
52
+ spec.add_dependency 'soar_sr', "~> 1.1.24"
53
+ spec.add_dependency 'soar_pl', "~> 0.0.12"
54
+ spec.add_dependency 'google_drive', "1.0.6"
55
+ spec.add_dependency 'soar_idm', "~> 0.0.2"
56
+ spec.add_dependency 'idr_client', "~> 0.0.3"
57
+ spec.add_dependency 'workflow', "~> 1.2.0"
58
+ spec.add_dependency 'soar_sc_mvc', "~> 0.1.1"
59
+
60
+ spec.add_development_dependency "bundler", "~> 1.12"
61
+ spec.add_development_dependency "rake", "~> 10.0"
62
+ spec.add_development_dependency "rspec", "~> 3.0"
63
+ spec.add_development_dependency "byebug"
64
+ end
metadata ADDED
@@ -0,0 +1,524 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: soar_sc_core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ernst Van Graan
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-08-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: haml
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: jsender
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.2.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: soar_sc_views
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.1.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.1.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: soar_aspects
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: soar_flow
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.1.1
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.1.1
83
+ - !ruby/object:Gem::Dependency
84
+ name: soar_lexicon
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.1.3
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.1.3
97
+ - !ruby/object:Gem::Dependency
98
+ name: soar_environment
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.2.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.2.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: soar_configuration
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: 0.1.1
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: 0.1.1
125
+ - !ruby/object:Gem::Dependency
126
+ name: soar_wadl_validation
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.1.3
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.1.3
139
+ - !ruby/object:Gem::Dependency
140
+ name: soar_auditing_provider
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.9.3
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.9.3
153
+ - !ruby/object:Gem::Dependency
154
+ name: soar_authentication
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.1.3
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.1.3
167
+ - !ruby/object:Gem::Dependency
168
+ name: soar_authentication_cas
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: 0.1.2
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: 0.1.2
181
+ - !ruby/object:Gem::Dependency
182
+ name: soar_am
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: 0.1.2
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: 0.1.2
195
+ - !ruby/object:Gem::Dependency
196
+ name: soar_policy_access_manager
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: 0.2.1
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: 0.2.1
209
+ - !ruby/object:Gem::Dependency
210
+ name: soar_authorization
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: 0.1.4
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: 0.1.4
223
+ - !ruby/object:Gem::Dependency
224
+ name: soar_configured_factory
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: 0.1.0
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: 0.1.0
237
+ - !ruby/object:Gem::Dependency
238
+ name: soar_sc_routing
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - "~>"
242
+ - !ruby/object:Gem::Version
243
+ version: 0.1.6
244
+ type: :runtime
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - "~>"
249
+ - !ruby/object:Gem::Version
250
+ version: 0.1.6
251
+ - !ruby/object:Gem::Dependency
252
+ name: logstash_auditor
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - "~>"
256
+ - !ruby/object:Gem::Version
257
+ version: 0.0.19
258
+ type: :runtime
259
+ prerelease: false
260
+ version_requirements: !ruby/object:Gem::Requirement
261
+ requirements:
262
+ - - "~>"
263
+ - !ruby/object:Gem::Version
264
+ version: 0.0.19
265
+ - !ruby/object:Gem::Dependency
266
+ name: log4r_auditor
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - "~>"
270
+ - !ruby/object:Gem::Version
271
+ version: 0.0.4
272
+ type: :runtime
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - "~>"
277
+ - !ruby/object:Gem::Version
278
+ version: 0.0.4
279
+ - !ruby/object:Gem::Dependency
280
+ name: smaak
281
+ requirement: !ruby/object:Gem::Requirement
282
+ requirements:
283
+ - - "~>"
284
+ - !ruby/object:Gem::Version
285
+ version: 0.2.2
286
+ type: :runtime
287
+ prerelease: false
288
+ version_requirements: !ruby/object:Gem::Requirement
289
+ requirements:
290
+ - - "~>"
291
+ - !ruby/object:Gem::Version
292
+ version: 0.2.2
293
+ - !ruby/object:Gem::Dependency
294
+ name: soar_smaak
295
+ requirement: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - "~>"
298
+ - !ruby/object:Gem::Version
299
+ version: 0.1.16
300
+ type: :runtime
301
+ prerelease: false
302
+ version_requirements: !ruby/object:Gem::Requirement
303
+ requirements:
304
+ - - "~>"
305
+ - !ruby/object:Gem::Version
306
+ version: 0.1.16
307
+ - !ruby/object:Gem::Dependency
308
+ name: wadling
309
+ requirement: !ruby/object:Gem::Requirement
310
+ requirements:
311
+ - - "~>"
312
+ - !ruby/object:Gem::Version
313
+ version: 0.1.9
314
+ type: :runtime
315
+ prerelease: false
316
+ version_requirements: !ruby/object:Gem::Requirement
317
+ requirements:
318
+ - - "~>"
319
+ - !ruby/object:Gem::Version
320
+ version: 0.1.9
321
+ - !ruby/object:Gem::Dependency
322
+ name: soar_sr
323
+ requirement: !ruby/object:Gem::Requirement
324
+ requirements:
325
+ - - "~>"
326
+ - !ruby/object:Gem::Version
327
+ version: 1.1.24
328
+ type: :runtime
329
+ prerelease: false
330
+ version_requirements: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - "~>"
333
+ - !ruby/object:Gem::Version
334
+ version: 1.1.24
335
+ - !ruby/object:Gem::Dependency
336
+ name: soar_pl
337
+ requirement: !ruby/object:Gem::Requirement
338
+ requirements:
339
+ - - "~>"
340
+ - !ruby/object:Gem::Version
341
+ version: 0.0.12
342
+ type: :runtime
343
+ prerelease: false
344
+ version_requirements: !ruby/object:Gem::Requirement
345
+ requirements:
346
+ - - "~>"
347
+ - !ruby/object:Gem::Version
348
+ version: 0.0.12
349
+ - !ruby/object:Gem::Dependency
350
+ name: google_drive
351
+ requirement: !ruby/object:Gem::Requirement
352
+ requirements:
353
+ - - '='
354
+ - !ruby/object:Gem::Version
355
+ version: 1.0.6
356
+ type: :runtime
357
+ prerelease: false
358
+ version_requirements: !ruby/object:Gem::Requirement
359
+ requirements:
360
+ - - '='
361
+ - !ruby/object:Gem::Version
362
+ version: 1.0.6
363
+ - !ruby/object:Gem::Dependency
364
+ name: soar_idm
365
+ requirement: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - "~>"
368
+ - !ruby/object:Gem::Version
369
+ version: 0.0.2
370
+ type: :runtime
371
+ prerelease: false
372
+ version_requirements: !ruby/object:Gem::Requirement
373
+ requirements:
374
+ - - "~>"
375
+ - !ruby/object:Gem::Version
376
+ version: 0.0.2
377
+ - !ruby/object:Gem::Dependency
378
+ name: idr_client
379
+ requirement: !ruby/object:Gem::Requirement
380
+ requirements:
381
+ - - "~>"
382
+ - !ruby/object:Gem::Version
383
+ version: 0.0.3
384
+ type: :runtime
385
+ prerelease: false
386
+ version_requirements: !ruby/object:Gem::Requirement
387
+ requirements:
388
+ - - "~>"
389
+ - !ruby/object:Gem::Version
390
+ version: 0.0.3
391
+ - !ruby/object:Gem::Dependency
392
+ name: workflow
393
+ requirement: !ruby/object:Gem::Requirement
394
+ requirements:
395
+ - - "~>"
396
+ - !ruby/object:Gem::Version
397
+ version: 1.2.0
398
+ type: :runtime
399
+ prerelease: false
400
+ version_requirements: !ruby/object:Gem::Requirement
401
+ requirements:
402
+ - - "~>"
403
+ - !ruby/object:Gem::Version
404
+ version: 1.2.0
405
+ - !ruby/object:Gem::Dependency
406
+ name: soar_sc_mvc
407
+ requirement: !ruby/object:Gem::Requirement
408
+ requirements:
409
+ - - "~>"
410
+ - !ruby/object:Gem::Version
411
+ version: 0.1.1
412
+ type: :runtime
413
+ prerelease: false
414
+ version_requirements: !ruby/object:Gem::Requirement
415
+ requirements:
416
+ - - "~>"
417
+ - !ruby/object:Gem::Version
418
+ version: 0.1.1
419
+ - !ruby/object:Gem::Dependency
420
+ name: bundler
421
+ requirement: !ruby/object:Gem::Requirement
422
+ requirements:
423
+ - - "~>"
424
+ - !ruby/object:Gem::Version
425
+ version: '1.12'
426
+ type: :development
427
+ prerelease: false
428
+ version_requirements: !ruby/object:Gem::Requirement
429
+ requirements:
430
+ - - "~>"
431
+ - !ruby/object:Gem::Version
432
+ version: '1.12'
433
+ - !ruby/object:Gem::Dependency
434
+ name: rake
435
+ requirement: !ruby/object:Gem::Requirement
436
+ requirements:
437
+ - - "~>"
438
+ - !ruby/object:Gem::Version
439
+ version: '10.0'
440
+ type: :development
441
+ prerelease: false
442
+ version_requirements: !ruby/object:Gem::Requirement
443
+ requirements:
444
+ - - "~>"
445
+ - !ruby/object:Gem::Version
446
+ version: '10.0'
447
+ - !ruby/object:Gem::Dependency
448
+ name: rspec
449
+ requirement: !ruby/object:Gem::Requirement
450
+ requirements:
451
+ - - "~>"
452
+ - !ruby/object:Gem::Version
453
+ version: '3.0'
454
+ type: :development
455
+ prerelease: false
456
+ version_requirements: !ruby/object:Gem::Requirement
457
+ requirements:
458
+ - - "~>"
459
+ - !ruby/object:Gem::Version
460
+ version: '3.0'
461
+ - !ruby/object:Gem::Dependency
462
+ name: byebug
463
+ requirement: !ruby/object:Gem::Requirement
464
+ requirements:
465
+ - - ">="
466
+ - !ruby/object:Gem::Version
467
+ version: '0'
468
+ type: :development
469
+ prerelease: false
470
+ version_requirements: !ruby/object:Gem::Requirement
471
+ requirements:
472
+ - - ">="
473
+ - !ruby/object:Gem::Version
474
+ version: '0'
475
+ description: Service component core aggregations
476
+ email:
477
+ - ernst.van.graan@hetzner.co.za
478
+ executables: []
479
+ extensions: []
480
+ extra_rdoc_files: []
481
+ files:
482
+ - ".gitignore"
483
+ - ".rspec"
484
+ - ".travis.yml"
485
+ - Gemfile
486
+ - LICENSE.txt
487
+ - README.md
488
+ - Rakefile
489
+ - bin/console
490
+ - bin/setup
491
+ - lib/providers/auditing.rb
492
+ - lib/providers/service_registry.rb
493
+ - lib/providers/sessions.rb
494
+ - lib/soar_sc_core.rb
495
+ - lib/soar_sc_core/version.rb
496
+ - lib/web/renderer.rb
497
+ - lib/web/soar_sc_router.rb
498
+ - soar_sc_core.gemspec
499
+ homepage: https://github.com/hetznerZA/soar_sc_core
500
+ licenses:
501
+ - MIT
502
+ metadata: {}
503
+ post_install_message:
504
+ rdoc_options: []
505
+ require_paths:
506
+ - lib
507
+ required_ruby_version: !ruby/object:Gem::Requirement
508
+ requirements:
509
+ - - ">="
510
+ - !ruby/object:Gem::Version
511
+ version: '0'
512
+ required_rubygems_version: !ruby/object:Gem::Requirement
513
+ requirements:
514
+ - - ">="
515
+ - !ruby/object:Gem::Version
516
+ version: '0'
517
+ requirements: []
518
+ rubyforge_project:
519
+ rubygems_version: 2.4.8
520
+ signing_key:
521
+ specification_version: 4
522
+ summary: Service component core aggregations
523
+ test_files: []
524
+ has_rdoc: