conf_conf 1.0.2 → 2.0.2
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/.gitignore +4 -0
- data/README.md +227 -39
- data/bin/conf_conf +136 -0
- data/conf_conf.gemspec +18 -10
- data/lib/conf_conf.rb +51 -42
- data/lib/conf_conf/cli.rb +9 -0
- data/lib/conf_conf/cli/developers.rb +48 -0
- data/lib/conf_conf/cli/environments.rb +61 -0
- data/lib/conf_conf/cli/root.rb +72 -0
- data/lib/conf_conf/cli/variables.rb +85 -0
- data/lib/conf_conf/configuration.rb +57 -0
- data/lib/conf_conf/project.rb +20 -0
- data/lib/conf_conf/project/developer.rb +38 -0
- data/lib/conf_conf/project/developers.rb +48 -0
- data/lib/conf_conf/project/environment.rb +53 -0
- data/lib/conf_conf/project/environment/storage.rb +58 -0
- data/lib/conf_conf/project/environments.rb +24 -0
- data/lib/conf_conf/remote.rb +40 -0
- data/lib/conf_conf/user.rb +38 -0
- data/spec/project/developers_spec.rb +25 -0
- data/spec/project/environment/storage_spec.rb +91 -0
- data/spec/project/environment_spec.rb +21 -0
- data/spec/spec_helper.rb +163 -0
- metadata +126 -9
- data/spec/conf_conf_spec.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6266749f82f44ef3b88a7d50bfb5ad35f2ecbedc
|
4
|
+
data.tar.gz: c9d7fa66ba405015c4546d4f36777d3b1494b19f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a90bb66f10350795befb7573066f7f7883fd3c28028860aaceea3ebc05b45d7110e4d187ec6ea03da7039020fda67c02a14ec6d9c162772b6eb4f6ed0e47a504
|
7
|
+
data.tar.gz: 8325c29e6630c1a2589a665ce82ced86914999b22ea323ab3f417cc94131894dd9859344c78650f9ad996a80ec86082b4efc76a780cadcbb9e30e71a32d73bc7
|
data/.gitignore
ADDED
data/README.md
CHANGED
@@ -1,83 +1,271 @@
|
|
1
1
|
# ConfConf
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
boot to prevent exceptions and unexpected behavior during
|
6
|
-
run time.
|
3
|
+
Securely store, manage, and verify availability of environment variables for your
|
4
|
+
application over multiple environments.
|
7
5
|
|
8
|
-
ConfConf
|
9
|
-
|
10
|
-
we can fail fast when there's a configuration problem.
|
6
|
+
ConfConf encrypts the configuration values it stores, and intends to allow this
|
7
|
+
configuration to contain sensitive information while living in source control.
|
11
8
|
|
12
|
-
|
9
|
+
Set a variable:
|
13
10
|
|
14
|
-
|
11
|
+
```
|
12
|
+
$ conf_conf variables set --env=development MANDRILL_SECRET=XYZ
|
13
|
+
```
|
14
|
+
|
15
|
+
Check environment consistency:
|
16
|
+
|
17
|
+
```
|
18
|
+
$ conf_conf environments check
|
19
|
+
{
|
20
|
+
"production":{
|
21
|
+
"missing":[
|
22
|
+
"MANDRILL_SECRET"
|
23
|
+
]
|
24
|
+
}
|
25
|
+
}
|
26
|
+
```
|
27
|
+
|
28
|
+
Export a .env file:
|
29
|
+
|
30
|
+
```
|
31
|
+
$ conf_conf export development > .env
|
32
|
+
MANDRILL_SECRET=XYZ
|
33
|
+
```
|
34
|
+
|
35
|
+
Fail fast:
|
36
|
+
|
37
|
+
```
|
38
|
+
$ bundle exec rails c
|
39
|
+
fail: ConfConf::InconsistentConfigurationError
|
40
|
+
```
|
41
|
+
|
42
|
+
## Install ConfConf
|
43
|
+
|
44
|
+
```
|
45
|
+
$ gem install conf_conf
|
46
|
+
$ conf_conf --help
|
47
|
+
```
|
48
|
+
|
49
|
+
ConfConf can manage configuration variables as a standalone application, but if
|
50
|
+
you're using Ruby, ConfConf can load yoru configuration directly from the
|
51
|
+
encrypted files.
|
52
|
+
|
53
|
+
Add `gem 'conf_conf'` to your application's Gemfile and `bundle install`
|
54
|
+
|
55
|
+
Better yet, go to https://rubygems.org/gems/conf_conf and configure a specific version requirement.
|
15
56
|
|
16
57
|
## Usage
|
17
58
|
|
18
|
-
|
19
|
-
|
20
|
-
|
59
|
+
Initialize storage and key management:
|
60
|
+
|
61
|
+
```
|
62
|
+
$ conf_conf init
|
63
|
+
```
|
64
|
+
|
65
|
+
This creates the `config/conf_conf` directory, where environments are encrypted
|
66
|
+
and subsequently stored. Additionally, if ~/.conf_conf.json was not present,
|
67
|
+
init will write a keypair to the file.
|
68
|
+
|
69
|
+
## Initialize Environments
|
70
|
+
|
71
|
+
For each of the environments your application runs under, add an environment to
|
72
|
+
ConfConf:
|
73
|
+
|
74
|
+
```
|
75
|
+
$ conf_conf environments add development
|
76
|
+
$ conf_conf environments add production
|
77
|
+
$ conf_conf environments list
|
78
|
+
[
|
79
|
+
"development",
|
80
|
+
"production"
|
81
|
+
]
|
82
|
+
```
|
83
|
+
|
84
|
+
## Load Configuration
|
85
|
+
|
86
|
+
Set up two variables that should be available for both the production and
|
87
|
+
development environments:
|
88
|
+
|
89
|
+
```
|
90
|
+
$ conf_conf variables set USE_HEADER_BLOCK=true ENABLE_JSON_RESPONSES=true
|
91
|
+
```
|
92
|
+
|
93
|
+
Check that they're in place:
|
94
|
+
|
95
|
+
```
|
96
|
+
$ conf_conf info
|
97
|
+
{
|
98
|
+
"environments":[
|
99
|
+
"development",
|
100
|
+
"production"
|
101
|
+
],
|
102
|
+
"variables":{
|
103
|
+
"USE_HEADER_BLOCK":[
|
104
|
+
"development",
|
105
|
+
"production"
|
106
|
+
],
|
107
|
+
"ENABLE_JSON_RESPONSES":[
|
108
|
+
"development",
|
109
|
+
"production"
|
110
|
+
]
|
111
|
+
}
|
112
|
+
}
|
113
|
+
```
|
114
|
+
|
115
|
+
Disable JSON responses in production:
|
116
|
+
|
117
|
+
```
|
118
|
+
$ conf_conf variables set --env=production ENABLE_JSON_RESPONSES=false
|
119
|
+
```
|
120
|
+
|
121
|
+
## Importing .env
|
122
|
+
|
123
|
+
If a dotenv file (.env) exists, variables defined there can be merged into the
|
124
|
+
ConfConf container:
|
125
|
+
|
126
|
+
```
|
127
|
+
$ cat .env
|
128
|
+
USE_FOOTER_BLOCK=true
|
129
|
+
|
130
|
+
$ conf_conf import development
|
131
|
+
{
|
132
|
+
"USE_HEADER_BLOCK":"true",
|
133
|
+
"ENABLE_JSON_RESPONSES":"true",
|
134
|
+
"USE_FOOTER_BLOCK":"true"
|
135
|
+
}
|
136
|
+
```
|
137
|
+
|
138
|
+
## Exporting .env
|
139
|
+
|
140
|
+
The development environment:
|
141
|
+
|
142
|
+
```
|
143
|
+
$ conf_conf export development > .env
|
144
|
+
$ cat .env
|
145
|
+
USE_HEADER_BLOCK=true
|
146
|
+
ENABLE_JSON_RESPONSES=true
|
147
|
+
USE_FOOTER_BLOCK=true
|
148
|
+
```
|
149
|
+
|
150
|
+
And the production environment:
|
151
|
+
|
152
|
+
```
|
153
|
+
$ conf_conf export production > .env
|
154
|
+
$ cat .env
|
155
|
+
USE_HEADER_BLOCK=true
|
156
|
+
ENABLE_JSON_RESPONSES=false
|
157
|
+
```
|
158
|
+
|
159
|
+
## Detecting Configuration Inconsistencies
|
160
|
+
|
161
|
+
An application running in the development environment has access to the
|
162
|
+
USE_FOOTER_BLOCK variable. When the application runs in production, it may not
|
163
|
+
have access to the proper configuration:
|
164
|
+
|
165
|
+
```
|
166
|
+
$ conf_conf environments check
|
167
|
+
{
|
168
|
+
"production":{
|
169
|
+
"missing":[
|
170
|
+
"USE_FOOTER_BLOCK"
|
171
|
+
]
|
172
|
+
}
|
173
|
+
}
|
174
|
+
```
|
175
|
+
|
176
|
+
## Multiple Developers / Keys
|
177
|
+
|
178
|
+
Additional access keys can be configured to allow access to the encrypted
|
179
|
+
configuration. Given the other developers public key from the ~/.conf_conf.json
|
180
|
+
file (or by running `conf_conf developers key`). Permit two other developers
|
181
|
+
access to the environment configurations:
|
182
|
+
|
183
|
+
```
|
184
|
+
$ conf_conf developers permit <developer-key>
|
185
|
+
$ conf_conf developers permit <developer-key2>
|
186
|
+
```
|
187
|
+
|
188
|
+
Revoke access:
|
189
|
+
|
190
|
+
```
|
191
|
+
$ conf_conf developers revoke <developer-key2>
|
192
|
+
```
|
193
|
+
|
194
|
+
Revoking a key will update all environments, and the key will no longer be able
|
195
|
+
to access any content within them. The key still had access to the values at one
|
196
|
+
point, so they should be changed promptly.
|
197
|
+
|
198
|
+
ConfConf tracks variable values that have not changed since the revokation. An
|
199
|
+
interface for viewing these variables is planned.
|
200
|
+
|
201
|
+
## Add ConfConf to your Rails/Ruby Project
|
202
|
+
|
203
|
+
You don't need an application to use ConfConf, but if you're using Ruby,
|
204
|
+
ConfConf can load your environment variables directly from the encrypted
|
205
|
+
files.
|
206
|
+
|
207
|
+
Add `gem 'conf_conf'` to your application's Gemfile and `bundle install`
|
208
|
+
|
209
|
+
Better yet, go to https://rubygems.org/gems/conf_conf and configure a specific version requirement.
|
210
|
+
|
211
|
+
|
212
|
+
## Loading Environments with Ruby
|
213
|
+
|
214
|
+
Add a new initializer and within it a ConfConf configuration block:
|
21
215
|
|
22
216
|
```ruby
|
23
217
|
# config/initializers/conf_conf.rb
|
24
|
-
|
25
|
-
|
26
|
-
config :secret_key
|
27
|
-
end
|
218
|
+
environment = Rails.env
|
219
|
+
ConfConf.configuration(environment)
|
28
220
|
```
|
29
221
|
|
30
|
-
|
31
|
-
`ConfConf::MissingConfigurationValueError` is raised:
|
222
|
+
To access configuration values through a configuration object and not ENV:
|
32
223
|
|
33
|
-
```
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
(ConfConf::MissingConfigurationValueError)
|
39
|
-
from conf_conf/lib/conf_conf.rb:42
|
40
|
-
...
|
224
|
+
```ruby
|
225
|
+
# config/initializers/conf_conf.rb
|
226
|
+
$configuration = ConfConf.configuration('production') do
|
227
|
+
config :secret_key
|
228
|
+
end
|
41
229
|
```
|
42
230
|
|
231
|
+
In the case above, if `SECRET_KEY` is not present, `ConfConf::MissingConfigurationValueError` is raised. If it is, then $configuration.secret_key will contain the value from `ENV["SECRET_KEY"]`.
|
232
|
+
|
43
233
|
### Default Values
|
44
234
|
|
235
|
+
Pass an options hash with the `:default` key set to a default value to prevent
|
236
|
+
the boot from raising an error when the value isn't available from the
|
237
|
+
environment. This will prevent inconsistency exceptions.
|
238
|
+
|
45
239
|
```ruby
|
46
|
-
# Sets $configuration.public_key from ENV["PUBLIC_KEY"], or uses the default if not available in ENV
|
47
240
|
config :public_key, default: "XYZ123"
|
48
241
|
```
|
49
242
|
|
50
243
|
### Casting
|
51
244
|
|
52
|
-
You can adjust the value from the environment and typecast it or perform
|
53
|
-
additional validation by passing a block to `config`:
|
245
|
+
You can adjust the value from the environment and typecast it or perform additional validation by passing a block to `config`:
|
54
246
|
|
55
247
|
```ruby
|
56
|
-
|
57
|
-
|
58
|
-
admin ? true : false
|
248
|
+
config(:admin) { |admin|
|
249
|
+
admin ? true : false
|
59
250
|
}
|
60
251
|
```
|
61
252
|
|
62
253
|
### Varying Names
|
63
254
|
|
64
|
-
If you'd like to reference a configuration value with a different name, you can
|
65
|
-
use the `from` key as an option to `config` and pass it the name to expect from
|
66
|
-
the environment.
|
255
|
+
If you'd like to reference a configuration value with a different name, you can use the `:from` key as an option to `config` and pass it the name to expect from the environment.
|
67
256
|
|
68
257
|
```ruby
|
69
|
-
# Sets $configuration.public_key from ENV["PUBLIC_KEY_WITH_ALT_NAME"]
|
70
258
|
config :public_key, from: "PUBLIC_KEY_WITH_ALT_NAME"
|
71
259
|
```
|
72
260
|
|
73
261
|
## Rails.configuration
|
74
262
|
|
75
|
-
To assign directly to Rails.configuration instead of
|
76
|
-
use `ConfConf.rails_configuration` method.
|
263
|
+
To assign directly to Rails.configuration instead of $configuration, you can use `ConfConf.rails_configuration` method.
|
77
264
|
|
78
265
|
```ruby
|
79
266
|
# config/initializers/conf_conf.rb
|
80
|
-
ConfConf
|
267
|
+
environment = ENV['RAILS_ENV'] # ConfConf values are merged, so this can still be part of the system's environment
|
268
|
+
ConfConf.rails_configuration(environment) do
|
81
269
|
# Sets Rails.configuration.secret_key
|
82
270
|
config :secret_key
|
83
271
|
end
|
data/bin/conf_conf
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
4
|
+
|
5
|
+
require 'rubygems'
|
6
|
+
require 'thor'
|
7
|
+
require 'highline/import'
|
8
|
+
require 'fileutils'
|
9
|
+
require 'conf_conf'
|
10
|
+
|
11
|
+
##
|
12
|
+
# Domain Language:
|
13
|
+
# Instance A running version of the Project with its own Environment
|
14
|
+
# Environment A set of Environment Variables
|
15
|
+
# Environment Name The name of an Environment (production/development/staging,etc)
|
16
|
+
# Environment Variable A combination of a Config Key and a config Value
|
17
|
+
# Variable Name The name of an Environment Variable
|
18
|
+
# Variable Value The value of an Environment Variable
|
19
|
+
# Project An application that can can run under multiple Environments
|
20
|
+
#
|
21
|
+
# State Files:
|
22
|
+
# User Key Keypair for the current system user
|
23
|
+
# User Key File ~/.conf_conf.json
|
24
|
+
#
|
25
|
+
# {
|
26
|
+
# public_key: '',
|
27
|
+
# private_key: ''
|
28
|
+
# }
|
29
|
+
#
|
30
|
+
# Config Directory ./config/conf_conf
|
31
|
+
#
|
32
|
+
# Developer Keys ./config/conf_conf/developers.json
|
33
|
+
# [<public_key1>, <public_key2>, <public_key3>]
|
34
|
+
#
|
35
|
+
# Environment Config File ./config/conf_conf/environments/#{environment}.json
|
36
|
+
# {
|
37
|
+
# author_public_key: { author_pretty_public_key },
|
38
|
+
#
|
39
|
+
# encrypted_environment_secret_key: {
|
40
|
+
# public_key1: encrypted(environment_secret_key),
|
41
|
+
# public_key2: encrypted(environment_secret_key),
|
42
|
+
# public_key3: encrypted(environment_secret_key)
|
43
|
+
# },
|
44
|
+
#
|
45
|
+
# schema: {
|
46
|
+
# 'RAILS_ENV': { access: [<public_key1>,<public_key2>,<public_key3>,<public_key5>] },
|
47
|
+
# 'SUPER_SECRET': { access: [<public_key1>,<public_key2>,<public_key3>] }
|
48
|
+
# },
|
49
|
+
#
|
50
|
+
# encrypted_environment: encrypted(environment, with: environment_secret_key)
|
51
|
+
# }
|
52
|
+
#
|
53
|
+
# ConfConf::Developer
|
54
|
+
# #public_key
|
55
|
+
# #secret_key
|
56
|
+
# #pretty_public_key
|
57
|
+
# .current
|
58
|
+
#
|
59
|
+
# ConfConf::Project
|
60
|
+
# - developers => [ConfConf::developer,...]
|
61
|
+
# - environments => ConfConf::Project::environments
|
62
|
+
#
|
63
|
+
# ConfConf::Project::Developers
|
64
|
+
# - new(project) => ConfConf::Project::developers
|
65
|
+
# - add(developer) => ConfConf::Project::developer
|
66
|
+
# - remove(developer) => ConfConf::Project::developer
|
67
|
+
#
|
68
|
+
# ConfConf::Project::Environments
|
69
|
+
# - length
|
70
|
+
# - [](name)
|
71
|
+
#
|
72
|
+
# ConfConf::Project::Environment
|
73
|
+
# - new(project, name, variables)
|
74
|
+
# - set(variable_name, variable_value)
|
75
|
+
# - get(variable_name)
|
76
|
+
# - remove(variable_name)
|
77
|
+
# - variables => Hash
|
78
|
+
# - save
|
79
|
+
#
|
80
|
+
# System:
|
81
|
+
#
|
82
|
+
# Securely stores Environment Variables for each Environment, encrypted with multi-user
|
83
|
+
# access.
|
84
|
+
#
|
85
|
+
# Each Developer is a User on their development system. This User has a public key and
|
86
|
+
# a private key.
|
87
|
+
#
|
88
|
+
# When an environment is changed:
|
89
|
+
# 1) Choose a random Secret Key, K
|
90
|
+
# 2) Encrypt the key for all Developers with access to the Project.
|
91
|
+
# 3) Store a map of Developer Keys to the Encrypted Secret Key in the Secret Key File
|
92
|
+
# 4) Encrypt the changed environment, store or replace it in the Environments File
|
93
|
+
#
|
94
|
+
# When an environment is loaded:
|
95
|
+
# 1) Find the Encrypted Key from the Secret Key File with User Public Key
|
96
|
+
# 2) Decrypt the Encrypted Secret Key to get the Secret Key
|
97
|
+
# 3) Decrypt the environment file with the Secret Key
|
98
|
+
#
|
99
|
+
# Features:
|
100
|
+
# 1) Initialize conf_conf for the Project
|
101
|
+
# $ conf_conf init
|
102
|
+
#
|
103
|
+
# 2) Configure Environments
|
104
|
+
# $ conf_conf env add production development staging
|
105
|
+
# $ conf_conf env remove production
|
106
|
+
#
|
107
|
+
# 3) Defining Config Values
|
108
|
+
# $ conf_conf set RAILS_ADMIN=true
|
109
|
+
# $ conf_conf set --env=production PRIVATE_KEY=xyz
|
110
|
+
# $ conf_conf set --env=development PRIVATE_KEY=xyz
|
111
|
+
# $ conf_conf remove --env=production RAILS_ADMIN
|
112
|
+
#
|
113
|
+
# 4) Checking Environment for consistency with all environments
|
114
|
+
# $ conf_conf check
|
115
|
+
# [ERROR]: RAILS_ADMIN not set in production.
|
116
|
+
# > Run `conf_conf set --env=production RAILS_ADMIN=X` to set it
|
117
|
+
# [WARN]: RAILS_SESSION_SECRET not changed since revoking XYZ's access
|
118
|
+
|
119
|
+
# 5) Developers
|
120
|
+
# Print current key
|
121
|
+
# $ conf_conf key
|
122
|
+
#
|
123
|
+
# Permit the key
|
124
|
+
# $ conf_conf permit <key>
|
125
|
+
#
|
126
|
+
# Revoke the key
|
127
|
+
# $ conf_conf revoke <key>
|
128
|
+
#
|
129
|
+
# 6) Loading Environments
|
130
|
+
# $ conf_conf dump development > .env
|
131
|
+
#
|
132
|
+
# conf_conf/capistrano provides utilities to check for configuration
|
133
|
+
# errors prior to deployment.
|
134
|
+
|
135
|
+
require 'conf_conf/cli'
|
136
|
+
ConfConf::CLI::Root.start(ARGV)
|