gpgenv 0.1.7 → 0.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f53c68a5984ba9f9b5e583242c21319cd8b378fb
4
- data.tar.gz: 117960f3ebbccd6744e3afabb7dae6a519e40638
3
+ metadata.gz: 4134e591d0fa638a7abbdb84f88cc52b356d16ea
4
+ data.tar.gz: 908031007c8d67fa59ceea449d390de988b3e35e
5
5
  SHA512:
6
- metadata.gz: de27f8b06e937383264654be602747a3281aba890bb65c3a775b4de4ae6605ee929659868c19230e7c504a36aba8ee844c884f4f876d9fed46881040def87754
7
- data.tar.gz: 4ca93d6e4ffd4a1134708107b79f586797baa28ebe15517eae860d30c2c71c24eab8d5d7d5b5b9792b9120438d2b172864a32f1e8b55930b0c6ed8d6f35fb2ac
6
+ metadata.gz: 41df5b4c20ed2e4d84ea414374d5d4ca243f459d9ae04fd392fbc2212b32301dcb3119250b70c96913ff6f00d6acb1b54857c5bfb1b5dc2973d1d73e84004dd0
7
+ data.tar.gz: 979419629cbc17df4052bdffb11780b5dc7d1faf639414c327c5f0c249d7d41c33c3c3210f4c86926ce91e3257c66c02c10d270031693ee6defda593d1d523c9
data/README.md CHANGED
@@ -14,38 +14,56 @@ export them as environment variables, and never store sensitive information in p
14
14
  I hope that you find `gpgenv` useful, and you use it to avoid security sins.
15
15
 
16
16
  ## Installation
17
- ```gem install gpgenv```
17
+ `gem install gpgenv`
18
18
 
19
19
  ## Usage
20
20
 
21
21
  ### Setup
22
22
  ```bash
23
- # You might want to add this to your profile.
23
+ # Add this to your profile:
24
24
  export GPGENV_KEY_ID=<key-id-to-use-to-encrypt-stuff>
25
25
  ```
26
26
 
27
27
  ### Create or update files in a .gpgenv directory
28
28
 
29
29
  Gpgenv can create a .gpgenv directory without you ever needing to store plaintext
30
- files permanently on disk. Simply run `gpgedit` to create a new .gpgenv
31
- directory or edit the keys and values in an existing one.
30
+ files permanently on disk. Use `gpgenv edit` to edit a `yaml` file using `$EDITOR`.
31
+ When you are done editing the file, it will be parsed and saved to your `.gpgenv` directory.
32
32
 
33
- Alternatively, if you have a .env file and you'd like to switch to gpgenv, run
34
- `dotenv2gpg`. You can switch back by running `gpg2dotenv`, if you choose.
33
+ You can also use `gpgenv import` to convert a `.env` file in the current directory to a `.gpgenv`
34
+ directory.
35
35
 
36
36
  ### Run a process
37
37
  Gpgenv can spawn a child process that inherits environment variables like so:
38
38
  ```bash
39
- gpgenv "process_to_run argument1 argument2"
39
+ gpgenv exec <command> arg1 arg2 ...
40
40
  ```
41
41
 
42
42
  ### Export environment variables
43
43
  Gpgenv can export environment variables in your current shell session, like so:
44
+
44
45
  ```bash
45
46
  cd /dir/that/contains/.gpgenv
46
47
  eval `gpgshell`
47
48
  ```
48
49
 
50
+ ### Profiles
51
+
52
+ Gpgenv supports profiles. Create a ~/.gpgenvrc file like this:
53
+
54
+ ```yaml
55
+ ---
56
+ profile1:
57
+ - /home/YOU/.gpgenv/dir1
58
+ - /home/YOU/.gpgenv/extra_stuff
59
+ profile2:
60
+ - /home/YOU/.gpgenv/dir1
61
+ ```
62
+
63
+ You can then pass a `-p` parameter to `gpenv exec` or `gpgenv shell` specifying
64
+ which profile to use, rather than using the `.gpgenv` directory relative to the current path.
65
+ All of the directories specified in the profile will be loaded sequentially.
66
+
49
67
  ## Contributing
50
68
 
51
69
  1. Fork it ( https://github.com/[my-github-username]/gpgenv/fork )
@@ -2,7 +2,7 @@ require 'clamp'
2
2
  class Gpgenv
3
3
  class BaseCommand < Clamp::Command
4
4
 
5
- option ['-d', '--dir'], "DIR", "Directory to read env files from", default: "#{Dir.pwd}/.gpgenv"
5
+ option ['-d', '--dir'], "DIR", "Directory to read env files from", default: "./.gpgenv"
6
6
 
7
7
  def gpgenv
8
8
  @gpgenv ||= Gpgenv.new(dir: dir)
@@ -1,45 +1,57 @@
1
- require 'fileutils'
2
1
  require 'clamp'
2
+ require 'fileutils'
3
3
  require 'gpgenv'
4
4
  require 'gpgenv/base_command'
5
5
  require 'tempfile'
6
-
6
+ require 'yaml'
7
7
 
8
8
  class Gpgenv
9
9
  class EditCommand < Gpgenv::BaseCommand
10
10
 
11
11
  def execute
12
- env = Hash[gpgenv.read_files.map{|k,v| [ k, to_editable(v) ] }]
13
- Tempfile.open('.env', ENV.fetch('TMPDIR', '/tmp')) do |f|
14
- env.each do |k,v|
15
- f.write("#{k}=#{v}\n")
16
- end
12
+ env = gpgenv.read_files
13
+ Tempfile.open(['env', '.yaml'], ENV.fetch('TMPDIR', '/tmp')) do |f|
14
+ f.write(env.to_yaml)
17
15
 
18
- f.close
19
- system("#{ENV['EDITOR']} #{f.path}")
20
- f.open
16
+ done = false
17
+ new_env = nil
18
+ begin
19
+ # Write out current env to the file, as yaml.
20
+ f.close
21
21
 
22
- f.rewind
23
- lines = f.read.split("\n")
22
+ # Run the user's choice of editor on the file, wait until they're done.
23
+ system("#{ENV['EDITOR']} #{f.path}")
24
24
 
25
- ::FileUtils.mkdir_p(gpgenv.dir)
26
- new_env = {}
27
- lines.each_with_index do |line, index|
28
- i = line.index('=')
29
- fail("Line #{index+1} is invalid") unless i
30
- key = line[0..i-1]
31
- value = line[i+1..-1]
32
- new_env[key] = value
33
- end
25
+ # Reopen the file, return to the start, load yaml from it.
26
+ f.open
27
+ f.rewind
28
+
29
+ file_contents = f.read
34
30
 
31
+ begin
32
+ new_env = YAML.load(file_contents)
33
+ rescue Psych::SyntaxError => e
34
+ puts e.message
35
+ STDOUT.write "Invalid yaml file. Try again (y/n)? "
36
+ fail("Aborted") unless STDIN.gets.downcase.strip == 'y'
37
+ f.rewind
38
+ end
39
+
40
+ # Keep looping until we get valid yaml.
41
+ end until new_env
42
+
43
+ # Write out yaml to gpgenv.
44
+ ::FileUtils.mkdir_p(gpgenv.dir)
35
45
  new_env.each do |key, value|
36
- gpgenv.set(key, from_editable(value))
46
+ gpgenv.set(key, value)
37
47
  end
38
48
 
49
+ # Calculate missing keys
39
50
  missing_keys = env.keys.select do |k|
40
51
  !new_env.keys.include?(k)
41
52
  end
42
53
 
54
+ # Delete missing keys.
43
55
  missing_keys.each do |missing_key|
44
56
  gpgenv.set(missing_key, nil)
45
57
  end
@@ -59,16 +71,6 @@ class Gpgenv
59
71
  end
60
72
  end
61
73
 
62
- # Convert from editable back to the format to write to the file.
63
- # Replace literal \n with newines, strip quotes.
64
- def from_editable(str)
65
- if str =~ /\\n/
66
- str.gsub(/\\n/, "\n")
67
- else
68
- str
69
- end
70
- end
71
-
72
74
  end
73
75
 
74
76
  end
@@ -1,10 +1,12 @@
1
1
  require 'clamp'
2
+ require 'gpgenv'
2
3
  require 'gpgenv/base_command'
4
+ require 'gpgenv/executor_provider'
3
5
  require 'gpgenv/profile'
4
- require 'gpgenv'
5
6
 
6
7
  class Gpgenv
7
8
  class ExecCommand < Gpgenv::BaseCommand
9
+ include ExecutorProvider
8
10
 
9
11
  option ['-p', '--profile'], "PROFILE", "Profile to use, from ~/.gpgenvrc", attribute_name: :profile
10
12
  parameter "ARGUMENTS ...", "arguments", :attribute_name => :args
@@ -13,19 +15,5 @@ class Gpgenv
13
15
  executor.exec_command args[0..-1].join(' ')
14
16
  end
15
17
 
16
- def executor
17
- # If GPGENV_PRPOFILE is set or a profile is passed on the CLI, use the given profile
18
- # Otherwise use a standard Gpgenv object to execute.
19
- if prof
20
- Profile.new("#{ENV['HOME']}/.gpgenvrc", prof)
21
- else
22
- gpgenv
23
- end
24
- end
25
-
26
- def prof
27
- profile || ENV['GPGENV_PROFILE']
28
- end
29
-
30
18
  end
31
19
  end
@@ -0,0 +1,18 @@
1
+ require 'gpgenv/profile'
2
+ class Gpgenv
3
+ module ExecutorProvider
4
+ def executor
5
+ # If GPGENV_PRPOFILE is set or a profile is passed on the CLI, use the given profile
6
+ # Otherwise use a standard Gpgenv object to execute.
7
+ if prof
8
+ Profile.new("#{ENV['HOME']}/.gpgenvrc", prof)
9
+ else
10
+ gpgenv
11
+ end
12
+ end
13
+
14
+ def prof
15
+ profile || ENV['GPGENV_PROFILE']
16
+ end
17
+ end
18
+ end
@@ -12,8 +12,6 @@ class Gpgenv
12
12
  exec(read_files, cmd)
13
13
  end
14
14
 
15
- private
16
-
17
15
  def read_files
18
16
  hash = {}
19
17
  gpgenvs.each do |gpgenv|
@@ -22,10 +20,14 @@ class Gpgenv
22
20
  hash
23
21
  end
24
22
 
23
+ private
24
+
25
25
  def gpgenvs
26
26
  fail(".gpgenvrc file does not exist") unless File.exist?(file)
27
+
27
28
  yaml = YAML.load(File.read(file))
28
29
  fail("Invalid .gpgenvrc file") unless yaml.is_a?(Hash)
30
+
29
31
  value = yaml[name]
30
32
 
31
33
  fail("No such profile: #{name} in .gpgenvrc") unless value
@@ -1,16 +1,23 @@
1
- require 'gpgenv'
2
- require 'shellwords'
3
1
  require 'clamp'
2
+ require 'gpgenv'
4
3
  require 'gpgenv/base_command'
4
+ require 'gpgenv/executor_provider'
5
+ require 'shellwords'
5
6
 
6
7
  class Gpgenv
8
+
7
9
  class ShellCommand < Gpgenv::BaseCommand
8
10
 
11
+ include ExecutorProvider
12
+
13
+ option ['-p', '--profile'], "PROFILE", "Profile to use, from ~/.gpgenvrc", attribute_name: :profile
14
+
9
15
  def execute
10
- gpgenv.read_files.each do |k, v|
11
- puts "export #{k}=#{Shellwords.escape(v)}"
16
+ executor.read_files.each do |k, v|
17
+ puts "export #{k}='#{v.gsub("'", "\'").gsub("\n", "\\n")}'"
12
18
  end
13
19
  end
14
20
 
15
21
  end
22
+
16
23
  end
@@ -1,3 +1,3 @@
1
1
  class Gpgenv
2
- VERSION = "0.1.7"
2
+ VERSION = "0.1.8"
3
3
  end
data/lib/gpgenv.rb CHANGED
@@ -16,7 +16,6 @@ class Gpgenv
16
16
  fail("#{dir} does not exist.") unless File.exist?(dir)
17
17
  fail("#{dir} is not a directory.") unless File.directory?(dir)
18
18
 
19
-
20
19
  Dir.glob("#{dir}/*.gpg").each do |f|
21
20
  ext = File.extname(f)
22
21
  var = File.basename(f, ext)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gpgenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Shea
@@ -141,6 +141,7 @@ files:
141
141
  - lib/gpgenv/edit_command.rb
142
142
  - lib/gpgenv/error.rb
143
143
  - lib/gpgenv/exec_command.rb
144
+ - lib/gpgenv/executor_provider.rb
144
145
  - lib/gpgenv/export_command.rb
145
146
  - lib/gpgenv/gpgenv_command.rb
146
147
  - lib/gpgenv/import_command.rb