soar_sc_core 0.1.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 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: