vagrant-trellis-sequel 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b3a285c74f4eac02b78eb50dc7f6dd1cf6d3313d
4
- data.tar.gz: a5f6b2886d51af5164ed47e97d073e9b30792655
3
+ metadata.gz: 5db09d310f510cfbd9bac485be68e65d9189d4b8
4
+ data.tar.gz: be3af33b7524317a2a0a1259ac4804b68e8f6c5b
5
5
  SHA512:
6
- metadata.gz: 44ac6679fd2bbc9fba3a70d5cd8f5958249adbf702d1ca7f89ef60630716c3c35d8fac4b29d997918b7adf831e66b60aab5632c9166e02f0bb6bed198e6e8a96
7
- data.tar.gz: e828a73f5d677bf8b97d6c779e31309f5b1f42197c828f68476f45a99baefad8b04b52516175388598b67b624581ceac45bf40838b68b03cbaed5e7aae242fee
6
+ metadata.gz: fea5685cb85b56925ec6d7b521bf4ee4e647f80352ddddb5dcd2c5132546f774ea43c3d0300de16b76666961ea755f7e92cd39e6b73b6829ebf9e00f8640e156
7
+ data.tar.gz: cbf19fa3dafb94f7d00b2d206d76b34dc93d85aab23e651e701e914d8bb58c1bb6e300eeca1a1e5b55875c9e65e3ade592ae2ba0567a6ad632c91f6c1f3fbf39
@@ -1,2 +1,2 @@
1
1
  unreleased=true
2
- future-release=v0.1.0
2
+ future-release=v0.2.0
@@ -1,5 +1,15 @@
1
- inherit_from:
2
- - .rubocop.rails.yml
3
-
4
1
  AllCops:
5
2
  TargetRubyVersion: 2.3
3
+
4
+ Naming/FileName:
5
+ Exclude:
6
+ - 'lib/vagrant-trellis-sequel.rb'
7
+
8
+ Metrics/LineLength:
9
+ Max: 120
10
+
11
+ Metrics/MethodLength:
12
+ Max: 12
13
+
14
+ Style/Documentation:
15
+ Enabled: false
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.2.0](https://github.com/TypistTech/vagrant-trellis-sequel/tree/v0.2.0) (2017-09-17)
4
+ [Full Changelog](https://github.com/TypistTech/vagrant-trellis-sequel/compare/v0.1.0...v0.2.0)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - Re-raise `StandardError` as `Vagrant::Errors::CLIInvalidUsage` [\#9](https://github.com/TypistTech/vagrant-trellis-sequel/pull/9) ([TangRufus](https://github.com/TangRufus))
9
+ - Refactor [\#8](https://github.com/TypistTech/vagrant-trellis-sequel/pull/8) ([TangRufus](https://github.com/TangRufus))
10
+ - Try harder to determine vault password by looking through more possible paths [\#7](https://github.com/TypistTech/vagrant-trellis-sequel/pull/7) ([TangRufus](https://github.com/TangRufus))
11
+ - Extract class `Spf` [\#6](https://github.com/TypistTech/vagrant-trellis-sequel/pull/6) ([TangRufus](https://github.com/TangRufus))
12
+ - Fix unable to open unencrypted vault file and refactor [\#5](https://github.com/TypistTech/vagrant-trellis-sequel/pull/5) ([TangRufus](https://github.com/TangRufus))
13
+ - Use default Rubocop style [\#4](https://github.com/TypistTech/vagrant-trellis-sequel/pull/4) ([TangRufus](https://github.com/TangRufus))
14
+ - Require ruby version `~\> 2.3` [\#3](https://github.com/TypistTech/vagrant-trellis-sequel/pull/3) ([TangRufus](https://github.com/TangRufus))
15
+ - Support Ansible vault encrypted config file [\#2](https://github.com/TypistTech/vagrant-trellis-sequel/pull/2) ([TangRufus](https://github.com/TangRufus))
16
+
17
+ ## [v0.1.0](https://github.com/TypistTech/vagrant-trellis-sequel/tree/v0.1.0) (2017-09-15)
18
+ **Merged pull requests:**
19
+
20
+ - first release [\#1](https://github.com/TypistTech/vagrant-trellis-sequel/pull/1) ([TangRufus](https://github.com/TangRufus))
21
+
3
22
 
4
23
 
5
24
  \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/Gemfile CHANGED
@@ -1,18 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source "https://rubygems.org"
3
+ source 'https://rubygems.org'
4
4
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
5
5
 
6
6
  # To make `$ bundle exec vagrant` works
7
7
  embedded_directories = %w[/Applications/Vagrant/embedded /opt/vagrant/embedded]
8
8
  embedded_directories.each do |path|
9
- ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"] = path if File.directory?(path)
9
+ ENV['VAGRANT_INSTALLER_EMBEDDED_DIR'] = path if File.directory?(path)
10
10
  end
11
11
 
12
- unless ENV.key?("VAGRANT_INSTALLER_EMBEDDED_DIR")
12
+ unless ENV.key?('VAGRANT_INSTALLER_EMBEDDED_DIR')
13
13
  $stderr.puts "Couldn't find a packaged install of vagrant, and we need this"
14
- $stderr.puts "in order to make use of the RubyEncoder libraries."
15
- $stderr.puts "I looked in:"
14
+ $stderr.puts 'in order to make use of the RubyEncoder libraries.'
15
+ $stderr.puts 'I looked in:'
16
16
  embedded_locations.each do |path|
17
17
  $stderr.puts " #{path}"
18
18
  end
@@ -22,7 +22,7 @@ group :development do
22
22
  # We depend on Vagrant for development, but we don't add it as a
23
23
  # gem dependency because we expect to be installed within the
24
24
  # Vagrant environment itself using `vagrant plugin`.
25
- gem "vagrant", github: "mitchellh/vagrant"
25
+ gem 'vagrant', github: 'hashicorp/vagrant'
26
26
  end
27
27
 
28
28
  group :plugins do
data/README.md CHANGED
@@ -15,9 +15,15 @@ Open Trellis databases in Sequel Pro with a single command
15
15
 
16
16
  - [Installation](#installation)
17
17
  - [Usage](#usage)
18
+ - [Noob](#noob)
19
+ - [Specify which site's database](#specify-which-sites-database)
20
+ - [Specify vault password file](#specify-vault-password-file)
21
+ - [Specify vault password](#specify-vault-password)
22
+ - [Common Errors](#common-errors)
23
+ - [DB password not found for `example_dev`](#db-password-not-found-for-example_dev)
24
+ - [HMAC encoded in the file does not match calculated one](#hmac-encoded-in-the-file-does-not-match-calculated-one)
18
25
  - [Connection Errors](#connection-errors)
19
26
  - [`key_load_public: No such file or directory`](#key_load_public-no-such-file-or-directory)
20
- - [Help Wanted!](#help-wanted)
21
27
  - [Support!](#support)
22
28
  - [Donate via PayPal *](#donate-via-paypal-)
23
29
  - [Why don't you hire me?](#why-dont-you-hire-me)
@@ -39,18 +45,89 @@ $ vagrant plugin install vagrant-trellis-sequel
39
45
  ## Usage
40
46
 
41
47
  ```bash
42
- #Usage: vagrant trellis-sequel open [options] [vm-id]
43
- #
44
- # -u, --user DB_USER Required. Database username.
45
- # -p, --password DB_PASSWORD Required. Value of db_password from group_vars/development/vault.yml
46
- # -h, --help Print this help
47
-
48
- # Example:
49
- $ vagrant trellis-sequel open -u example_com -p example_dbpassword
48
+ $ vagrant trellis-sequel open --help
49
+ Usage: vagrant trellis-sequel open [options] [vm-id]
50
+
51
+ --site [site] Site whose database going to be opened.
52
+ --vault-password-file [VAULT_PASSWORD_FILE]
53
+ Vault password file.
54
+ --vault-pass [VAULT_PASS] Vault password.
55
+ -h, --help Print this help
50
56
  ```
51
57
 
58
+ ### Noob
59
+
60
+ ```bash
61
+ $ vagrant trellis-sequel open
62
+ ```
63
+
64
+ This works for most of the cases:
65
+ - `vault.yml` is unencrypted
66
+ - `vault.yml` is encrypted and `.vault_pass` contains the vault password
67
+ - running from within the Trellis directory
68
+
69
+ ### Specify which site's database
70
+
71
+ ```
72
+ $ vagrant trellis-sequel open --site example.com
73
+ ```
74
+
75
+ Use the `--site` option to specify which site's database to open. By default, the first site's database will be opened.
76
+ Note: This is the site key of `vault_wordpress_sites` in `vault.yml`, usually ends with `.com`.
77
+
78
+ ### Specify vault password file
79
+
80
+ ```
81
+ $ vagrant trellis-sequel open --vault-password-file .my_vault_password_file
82
+ $ vagrant trellis-sequel open --vault-password-file /my/top/secret.txt
83
+ ```
84
+
85
+ Use the `--vault-password-file` option to specify path to the vault password file, either relative path from Trellis root or absolute path.
86
+ Default value is `.vault_pass` if `vault.yml` is encrypted.
87
+
88
+ ### Specify vault password
89
+
90
+ ```
91
+ $ vagrant trellis-sequel open --vault-pass my-top-secret
92
+ ```
93
+
94
+ Use the `--vault-pass` option to provide vault password if you encrypted `vault.yml` but don't have a vault password file.
95
+
96
+ ## Common Errors
97
+
98
+ ### DB password not found for `example_dev`
99
+
100
+ That means you passed wrong `--site` or `vault.yml` is malformed.
101
+
102
+ ```yaml
103
+ # group_vars/development/vault.yml
104
+
105
+ vault_wordpress_sites:
106
+ example.com:
107
+ admin_password: admin
108
+ env:
109
+ db_password: bye
110
+ www.typist.tech:
111
+ admin_password: admin
112
+ env:
113
+ db_password: hello
114
+ ```
115
+
116
+ For the above `vault.yml`, these 2 commands are valid:
117
+ ```bash
118
+ $ vagrant trellis-sequel open --site example.com
119
+ $ vagrant trellis-sequel open --site www.typist.tech
120
+ ```
121
+
122
+
123
+ ### HMAC encoded in the file does not match calculated one
124
+
125
+ That means vault password is incorrect.
126
+
52
127
  ## Connection Errors
53
128
 
129
+ (This part is stolen from from [Sequel Pro for Chassis](https://github.com/Chassis/SequelPro/tree/b3236ca5205e34f6c2e135a9f1b8aa0f1686717b#connection-errors).)
130
+
54
131
  If you get a connection error, the first thing to attempt to debug is to check the details that Sequel Pro gives you (under the Show Details button).
55
132
 
56
133
  ### `key_load_public: No such file or directory`
@@ -75,12 +152,6 @@ The simple solution is to add this to your `~/.ssh/config` file:
75
152
 
76
153
  This disables using system-level keys (both from the agent, and your regular SSH keys), and disables host checks (which are not necessary for localhost). This does not affect `vagrant ssh`, which already uses these options.
77
154
 
78
- ## Help Wanted!
79
-
80
- Pull requests are welcome.
81
-
82
- - Parse database passwords from config file.
83
-
84
155
  ## Support!
85
156
 
86
157
  ### Donate via PayPal [![Donate via PayPal](https://img.shields.io/badge/Donate-PayPal-blue.svg)](https://www.typist.tech/donate/vagrant-trellis-sequel/)
data/Rakefile CHANGED
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "bundler/gem_tasks"
3
+ require 'bundler/gem_tasks'
@@ -1,4 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "vagrant_plugins/trellis_sequel/identity"
4
- require "vagrant_plugins/trellis_sequel/plugin"
3
+ begin
4
+ require 'vagrant'
5
+ rescue LoadError
6
+ raise 'The Vagrant Trellis Sequel plugin must be run within Vagrant.'
7
+ end
8
+
9
+ # This is a sanity check to make sure no one is attempting to install
10
+ # this into an early Vagrant version.
11
+ # Requiring 1.9.6 or later because of Ruby 2.3
12
+ if Vagrant::VERSION < '1.9.6'
13
+ raise 'The Vagrant Trellis Sequel plugin is only compatible with Vagrant 1.9.6 or later'
14
+ end
15
+
16
+ require 'vagrant_plugins/trellis_sequel/identity'
17
+ require 'vagrant_plugins/trellis_sequel/plugin'
@@ -1,80 +1,72 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "erb"
4
- require "ostruct"
5
- require "optparse"
6
- require "vagrant"
3
+ require 'vagrant_plugins/trellis_sequel/spf'
4
+ require 'vagrant_plugins/trellis_sequel/vault'
5
+ require 'vagrant_plugins/trellis_sequel/vault_pass'
7
6
 
8
7
  module VagrantPlugins
9
8
  module TrellisSequel
10
9
  module Commands
11
- class Open < Vagrant.plugin("2", :command)
10
+ class Open < Vagrant.plugin('2', :command)
12
11
  def execute
12
+ options, argv = parse_options!
13
+
14
+ with_target_vms(argv) do |machine|
15
+ raise Vagrant::Errors::SSHNotReady unless machine.communicate.ready?
16
+
17
+ Spf.create_and_open(
18
+ data: {
19
+ database: database_for(machine_root_path: machine.env.root_path, **options),
20
+ ssh: ssh_for(machine)
21
+ },
22
+ path: machine.env.tmp_path
23
+ )
24
+ end
25
+
26
+ # Always exit with success
27
+ 0
28
+ end
29
+
30
+ private
31
+
32
+ # rubocop:disable Metrics/MethodLength
33
+ def parse_options!
13
34
  options = {}
14
35
  opts = OptionParser.new do |o|
15
- o.banner = "Usage: vagrant trellis-sequel open [options] [vm-id]"
16
- o.separator ""
36
+ o.banner = 'Usage: vagrant trellis-sequel open [options] [vm-id]'
37
+ o.separator ''
38
+
39
+ o.on('--site [site]', String, 'Site whose database going to be opened.') do |site|
40
+ options[:site] = site
41
+ end
17
42
 
18
- o.on("-u", "--user DB_USER", String, "Required. Database username.") do |user|
19
- options[:user] = user
43
+ o.on('--vault-password-file [VAULT_PASSWORD_FILE]', String, 'Vault password file.') do |vault_password_file|
44
+ options[:vault_password_file] = vault_password_file
20
45
  end
21
46
 
22
- o.on("-p", "--password DB_PASSWORD", String, "Required. Value of db_password from group_vars/development/vault.yml") do |password|
23
- options[:password] = password || "example_dbpassword"
47
+ o.on('--vault-pass [VAULT_PASS]', String, 'Vault password.') do |vault_pass|
48
+ options[:vault_pass] = vault_pass
24
49
  end
25
50
 
26
- o.on("-h", "--help", "Print this help") do
51
+ o.on('-h', '--help', 'Print this help') do
27
52
  @env.ui.info(opts)
28
53
  exit
29
54
  end
30
55
  end
31
- argv = parse_options(opts)
56
+ [options, parse_options(opts)]
57
+ end
58
+ # rubocop:enable Metrics/MethodLength
32
59
 
33
- # Check required options
34
- missing_required_options = [:user, :password].any? { |param| options[param].nil? }
35
- fail Vagrant::Errors::CLIInvalidOptions.new(help: "Missing required options.") if missing_required_options
60
+ def database_for(args)
61
+ Vault.build(**args)
62
+ .database_for(**args)
63
+ end
36
64
 
37
- @env.ui.info("Generating SPF file...")
38
-
39
- # Load the SPF template
40
- template_path = File.join(File.dirname(__FILE__), "/..", "template.spf")
41
- template = ERB.new(File.read(template_path), nil, "%<>")
42
-
43
- with_target_vms(argv) do |machine|
44
- # Collect data
45
- ssh_info = machine.ssh_info
46
- raise Vagrant::Errors::SSHNotReady if ssh_info.nil?
47
-
48
- data = {
49
- "database" => {
50
- "name" => "#{options[:user]}_development",
51
- "user" => options[:user],
52
- "password" => options[:password],
53
- },
54
- "ssh" => {
55
- "host" => ssh_info[:host],
56
- "port" => ssh_info[:port],
57
- "user" => ssh_info[:username],
58
- "private_key_path" => ssh_info[:private_key_path],
59
- }
60
- }
61
-
62
- # Output template
63
- content = template.result OpenStruct.new(data).instance_eval { binding }
64
-
65
- # Write it to the file
66
- path = File.join(@env.tmp_path, "#{data["database"]["name"]}.spf")
67
- file = File.open(path, "w")
68
- file.write(content)
69
- file.close()
70
-
71
- # And, open it
72
- system("open \"#{path}\"")
73
- end
74
-
75
- # Always exit with success
76
- 0
77
- end
65
+ def ssh_for(machine)
66
+ machine.ssh_info.select do |key, _value|
67
+ %i[host port username private_key_path].include?(key)
68
+ end
69
+ end
78
70
  end
79
71
  end
80
72
  end
@@ -1,14 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "optparse"
4
- require "vagrant"
3
+ require 'optparse'
5
4
 
6
5
  module VagrantPlugins
7
6
  module TrellisSequel
8
7
  module Commands
9
- class Root < Vagrant.plugin("2", :command)
8
+ class Root < Vagrant.plugin('2', :command)
10
9
  def self.synopsis
11
- "open Trellis databases in Sequel Pro"
10
+ 'open Trellis databases in Sequel Pro'
12
11
  end
13
12
 
14
13
  def initialize(argv, env)
@@ -19,39 +18,50 @@ module VagrantPlugins
19
18
  @subcommands = Vagrant::Registry.new
20
19
 
21
20
  @subcommands.register(:open) do
22
- require_relative "open"
21
+ require_relative 'open'
23
22
  Open
24
23
  end
25
24
  end
26
25
 
27
26
  def execute
28
- return help if (@main_args & %w[-h --help]).any?
29
-
30
- command_class = @subcommands.get(@sub_command&.to_sym)
31
- return help unless command_class
27
+ return help if help? || !sub_command?
32
28
 
33
29
  # Initialize and execute the command class
34
- command_class.new(@sub_args, @env).execute
30
+ @subcommands.get(@sub_command&.to_sym)
31
+ .new(@sub_args, @env)
32
+ .execute
33
+ rescue Vagrant::Errors::VagrantError => e
34
+ raise e
35
+ rescue StandardError => e
36
+ raise Vagrant::Errors::CLIInvalidUsage, help: e.message
35
37
  end
36
38
 
37
39
  private
38
40
 
39
- def help
40
- option_parser = OptionParser.new do |opts|
41
- opts.banner = "Usage: vagrant trellis-sequel <command> [<args>]"
42
- opts.separator ""
43
- opts.separator "Available subcommands:"
41
+ def help?
42
+ (@main_args & %w[-h --help]).any?
43
+ end
44
+
45
+ def sub_command?
46
+ @subcommands.key?(@sub_command&.to_sym)
47
+ end
44
48
 
45
- @subcommands.keys.sort.each do |key|
46
- opts.separator " #{key}"
47
- end
49
+ def help
50
+ option_parser = OptionParser.new do |opts|
51
+ opts.banner = 'Usage: vagrant trellis-sequel <command> [<args>]'
52
+ opts.separator ''
53
+ opts.separator 'Available subcommands:'
48
54
 
49
- opts.separator ""
50
- opts.separator "For help on any individual command run 'vagrant trellis-sequel COMMAND -h'"
55
+ @subcommands.keys.sort.each do |key|
56
+ opts.separator " #{key}"
51
57
  end
52
58
 
53
- @env.ui.info(option_parser.help, prefix: false)
59
+ opts.separator ''
60
+ opts.separator "For help on any individual command run 'vagrant trellis-sequel COMMAND -h'"
54
61
  end
62
+
63
+ @env.ui.info(option_parser.help, prefix: false)
64
+ end
55
65
  end
56
66
  end
57
67
  end
@@ -4,15 +4,15 @@ module VagrantPlugins
4
4
  module TrellisSequel
5
5
  module Identity
6
6
  def self.name
7
- "vagrant-trellis-sequel"
7
+ 'vagrant-trellis-sequel'
8
8
  end
9
9
 
10
10
  def self.version
11
- "0.1.0"
11
+ '0.2.0'
12
12
  end
13
13
 
14
14
  def self.description
15
- "Open Trellis databases in Sequel Pro with a single command"
15
+ 'Open Trellis databases in Sequel Pro with a single command'
16
16
  end
17
17
 
18
18
  def self.summary
@@ -1,16 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "vagrant"
4
-
5
3
  module VagrantPlugins
6
4
  module TrellisSequel
7
- class Plugin < Vagrant.plugin("2")
5
+ class Plugin < Vagrant.plugin('2')
8
6
  name Identity.name
9
7
 
10
8
  description Identity.description
11
9
 
12
- command "trellis-sequel" do
13
- require_relative "commands/root"
10
+ command 'trellis-sequel' do
11
+ require_relative 'commands/root'
14
12
  Commands::Root
15
13
  end
16
14
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erb'
4
+ require 'ostruct'
5
+
6
+ module VagrantPlugins
7
+ module TrellisSequel
8
+ class Spf
9
+ def self.create_and_open(args)
10
+ new(args).tap(&:write).open
11
+ end
12
+
13
+ def initialize(data:, path:)
14
+ db_name = data.dig(:database, :name).to_s.gsub(/\s+/, '')
15
+ raise 'You must provide data[:database][:name]' if db_name.empty?
16
+
17
+ @data = data
18
+ @path = File.join(path, "#{db_name}.spf")
19
+ end
20
+
21
+ def write
22
+ File.open(@path, 'w') do |file|
23
+ file.write(content)
24
+ end
25
+ end
26
+
27
+ def open
28
+ system("open \"#{@path}\"")
29
+ end
30
+
31
+ private
32
+
33
+ def content
34
+ template.result(OpenStruct.new(@data).instance_eval { binding })
35
+ end
36
+
37
+ def template
38
+ ERB.new(File.read(template_path), nil, '%<>')
39
+ end
40
+
41
+ def template_path
42
+ File.join(File.dirname(__FILE__), 'template.spf.erb')
43
+ end
44
+ end
45
+ end
46
+ end
@@ -11,25 +11,25 @@
11
11
  <key>connection</key>
12
12
  <dict>
13
13
  <key>database</key>
14
- <string><%= database["name"] %></string>
14
+ <string><%= database[:name] %></string>
15
15
  <key>host</key>
16
16
  <string>127.0.0.1</string>
17
17
  <key>password</key>
18
- <string><%= database["password"] %></string>
18
+ <string><%= database[:password] %></string>
19
19
  <key>ssh_host</key>
20
- <string><%= ssh["host"] %></string>
20
+ <string><%= ssh[:host] %></string>
21
21
  <key>ssh_keyLocation</key>
22
- <string><%= ssh["private_key_path"][0] %></string>
22
+ <string><%= ssh[:private_key_path][0] %></string>
23
23
  <key>ssh_keyLocationEnabled</key>
24
24
  <integer>1</integer>
25
25
  <key>ssh_port</key>
26
- <string><%= ssh["port"] %></string>
26
+ <string><%= ssh[:port] %></string>
27
27
  <key>ssh_user</key>
28
- <string><%= ssh["user"] %></string>
28
+ <string><%= ssh[:username] %></string>
29
29
  <key>type</key>
30
30
  <string>SPSSHTunnelConnection</string>
31
31
  <key>user</key>
32
- <string><%= database["user"] %></string>
32
+ <string><%= database[:user] %></string>
33
33
  </dict>
34
34
  </dict>
35
35
  <key>format</key>
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ansible/vault'
4
+
5
+ module VagrantPlugins
6
+ module TrellisSequel
7
+ class Vault
8
+ def self.build(machine_root_path:, vault_pass: nil, vault_password_file: nil, **_)
9
+ vault_path = File.join(machine_root_path, 'group_vars', 'development', 'vault.yml')
10
+
11
+ if ::Ansible::Vault.encrypted?(vault_path)
12
+ vault_pass ||= VaultPass.read_from_file(
13
+ file_path: vault_password_file,
14
+ machine_root_path: machine_root_path
15
+ )
16
+ end
17
+
18
+ Vault.new(path: vault_path, password: vault_pass)
19
+ end
20
+
21
+ def initialize(path:, password:)
22
+ @path = path
23
+ @password = password
24
+ end
25
+
26
+ def database_for(site: nil, **_)
27
+ site ||= first_wordpress_site
28
+
29
+ raise "DB password not found for #{site}" unless password_exist_for?(site)
30
+
31
+ {
32
+ name: db_name_for(site),
33
+ user: db_user_for(site),
34
+ password: db_password_for(site)
35
+ }
36
+ end
37
+
38
+ private
39
+
40
+ def first_wordpress_site
41
+ wordpress_sites&.keys&.first
42
+ end
43
+
44
+ def password_exist_for?(site)
45
+ !db_password_for(site).nil?
46
+ end
47
+
48
+ def db_name_for(site)
49
+ underscore(site) + '_development'
50
+ end
51
+
52
+ def db_user_for(site)
53
+ underscore(site)
54
+ end
55
+
56
+ def db_password_for(site)
57
+ content.dig('vault_wordpress_sites', site, 'env', 'db_password')
58
+ end
59
+
60
+ def wordpress_sites
61
+ content.dig('vault_wordpress_sites')
62
+ end
63
+
64
+ def content
65
+ @content ||= YAML.safe_load(content_raw)
66
+ end
67
+
68
+ def content_raw
69
+ @content_raw ||= ::Ansible::Vault.read(path: @path, password: @password, allow_blank_password: true)
70
+ end
71
+
72
+ def underscore(domain)
73
+ domain.downcase
74
+ .tr('.', '_')
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module TrellisSequel
5
+ class VaultPass
6
+ def self.read_from_file(args)
7
+ path = candidates(**args).find do |p|
8
+ File.file?(p)
9
+ end
10
+
11
+ if path.nil?
12
+ raise "Couldn't determine vault password. I looked in:\r\n * #{candidates(**args).join("\r\n * ")}\r\n"
13
+ end
14
+
15
+ File.read(path).chomp
16
+ end
17
+
18
+ def self.candidates(file_path:, machine_root_path:)
19
+ paths = []
20
+ paths << file_path unless file_path.nil?
21
+ paths << File.join(machine_root_path, file_path) unless file_path.nil? || machine_root_path.nil?
22
+ paths << File.join(machine_root_path, '.vault_pass') unless machine_root_path.nil?
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,29 +1,31 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path('../lib', __FILE__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require "vagrant_plugins/trellis_sequel/identity.rb"
5
+ require 'vagrant_plugins/trellis_sequel/identity.rb'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = VagrantPlugins::TrellisSequel::Identity.name
9
9
  spec.version = VagrantPlugins::TrellisSequel::Identity.version
10
- spec.authors = ["Tang Rufus", "Typist Tech"]
11
- spec.email = ["tangrufus@gmail.com", "vagrant-trellis-sequel@typist.tech"]
10
+ spec.authors = ['Tang Rufus', 'Typist Tech']
11
+ spec.email = ['tangrufus@gmail.com', 'vagrant-trellis-sequel@typist.tech']
12
12
 
13
13
  spec.summary = VagrantPlugins::TrellisSequel::Identity.summary
14
- spec.homepage = "https://www.typist.tech/projects/vagrant-trellis-sequel"
15
- spec.license = "MIT"
14
+ spec.homepage = 'https://www.typist.tech/projects/vagrant-trellis-sequel'
15
+ spec.license = 'MIT'
16
16
 
17
- spec.required_ruby_version = ">= 2.3.0"
17
+ spec.required_ruby_version = '~> 2.3'
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
20
  f.match(%r{^(test|spec|features)/})
21
21
  end
22
- spec.bindir = "exe"
22
+ spec.bindir = 'exe'
23
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
- spec.require_paths = ["lib"]
24
+ spec.require_paths = ['lib']
25
25
 
26
- spec.add_development_dependency "bundler", "~> 1.15"
27
- spec.add_development_dependency "rake", "~> 12.0"
28
- spec.add_development_dependency "rubocop", "~> 0.49"
26
+ spec.add_development_dependency 'ansible-vault', '~> 0.2.1'
27
+
28
+ spec.add_development_dependency 'bundler', '~> 1.15'
29
+ spec.add_development_dependency 'rake', '~> 12.0'
30
+ spec.add_development_dependency 'rubocop', '~> 0.49'
29
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-trellis-sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tang Rufus
@@ -9,8 +9,22 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2017-09-15 00:00:00.000000000 Z
12
+ date: 2017-09-17 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: ansible-vault
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 0.2.1
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 0.2.1
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: bundler
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -64,7 +78,6 @@ files:
64
78
  - ".github_changelog_generator"
65
79
  - ".gitignore"
66
80
  - ".hound.yml"
67
- - ".rubocop.rails.yml"
68
81
  - ".rubocop.yml"
69
82
  - CHANGELOG.md
70
83
  - CODE_OF_CONDUCT.md
@@ -77,7 +90,10 @@ files:
77
90
  - lib/vagrant_plugins/trellis_sequel/commands/root.rb
78
91
  - lib/vagrant_plugins/trellis_sequel/identity.rb
79
92
  - lib/vagrant_plugins/trellis_sequel/plugin.rb
80
- - lib/vagrant_plugins/trellis_sequel/template.spf
93
+ - lib/vagrant_plugins/trellis_sequel/spf.rb
94
+ - lib/vagrant_plugins/trellis_sequel/template.spf.erb
95
+ - lib/vagrant_plugins/trellis_sequel/vault.rb
96
+ - lib/vagrant_plugins/trellis_sequel/vault_pass.rb
81
97
  - vagrant-trellis-sequel.gemspec
82
98
  homepage: https://www.typist.tech/projects/vagrant-trellis-sequel
83
99
  licenses:
@@ -89,9 +105,9 @@ require_paths:
89
105
  - lib
90
106
  required_ruby_version: !ruby/object:Gem::Requirement
91
107
  requirements:
92
- - - ">="
108
+ - - "~>"
93
109
  - !ruby/object:Gem::Version
94
- version: 2.3.0
110
+ version: '2.3'
95
111
  required_rubygems_version: !ruby/object:Gem::Requirement
96
112
  requirements:
97
113
  - - ">="
@@ -1,137 +0,0 @@
1
- AllCops:
2
- TargetRubyVersion: 2.2
3
- # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
4
- # to ignore them, so only the ones explicitly set in this file are enabled.
5
- DisabledByDefault: true
6
- Exclude:
7
- - '**/templates/**/*'
8
- - '**/vendor/**/*'
9
- - 'actionpack/lib/action_dispatch/journey/parser.rb'
10
-
11
- # Prefer &&/|| over and/or.
12
- Style/AndOr:
13
- Enabled: true
14
-
15
- # Do not use braces for hash literals when they are the last argument of a
16
- # method call.
17
- Style/BracesAroundHashParameters:
18
- Enabled: true
19
- EnforcedStyle: context_dependent
20
-
21
- # Align `when` with `case`.
22
- Layout/CaseIndentation:
23
- Enabled: true
24
-
25
- # Align comments with method definitions.
26
- Layout/CommentIndentation:
27
- Enabled: true
28
-
29
- Layout/EmptyLineAfterMagicComment:
30
- Enabled: true
31
-
32
- # In a regular class definition, no empty lines around the body.
33
- Layout/EmptyLinesAroundClassBody:
34
- Enabled: true
35
-
36
- # In a regular method definition, no empty lines around the body.
37
- Layout/EmptyLinesAroundMethodBody:
38
- Enabled: true
39
-
40
- # In a regular module definition, no empty lines around the body.
41
- Layout/EmptyLinesAroundModuleBody:
42
- Enabled: true
43
-
44
- Layout/FirstParameterIndentation:
45
- Enabled: true
46
-
47
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
48
- Style/HashSyntax:
49
- Enabled: true
50
-
51
- # Method definitions after `private` or `protected` isolated calls need one
52
- # extra level of indentation.
53
- Layout/IndentationConsistency:
54
- Enabled: true
55
- EnforcedStyle: rails
56
-
57
- # Two spaces, no tabs (for indentation).
58
- Layout/IndentationWidth:
59
- Enabled: true
60
-
61
- Layout/SpaceAfterColon:
62
- Enabled: true
63
-
64
- Layout/SpaceAfterComma:
65
- Enabled: true
66
-
67
- Layout/SpaceAroundEqualsInParameterDefault:
68
- Enabled: true
69
-
70
- Layout/SpaceAroundKeyword:
71
- Enabled: true
72
-
73
- Layout/SpaceAroundOperators:
74
- Enabled: true
75
-
76
- Layout/SpaceBeforeFirstArg:
77
- Enabled: true
78
-
79
- # Defining a method with parameters needs parentheses.
80
- Style/MethodDefParentheses:
81
- Enabled: true
82
-
83
- Style/FrozenStringLiteralComment:
84
- Enabled: true
85
- EnforcedStyle: always
86
- Exclude:
87
- - 'actionview/test/**/*.builder'
88
- - 'actionview/test/**/*.ruby'
89
- - 'actionpack/test/**/*.builder'
90
- - 'actionpack/test/**/*.ruby'
91
- - 'activestorage/db/migrate/**/*.rb'
92
-
93
- # Use `foo {}` not `foo{}`.
94
- Layout/SpaceBeforeBlockBraces:
95
- Enabled: true
96
-
97
- # Use `foo { bar }` not `foo {bar}`.
98
- Layout/SpaceInsideBlockBraces:
99
- Enabled: true
100
-
101
- # Use `{ a: 1 }` not `{a:1}`.
102
- Layout/SpaceInsideHashLiteralBraces:
103
- Enabled: true
104
-
105
- Layout/SpaceInsideParens:
106
- Enabled: true
107
-
108
- # Check quotes usage according to lint rule below.
109
- Style/StringLiterals:
110
- Enabled: true
111
- EnforcedStyle: double_quotes
112
-
113
- # Detect hard tabs, no hard tabs.
114
- Layout/Tab:
115
- Enabled: true
116
-
117
- # Blank lines should not have any spaces.
118
- Layout/TrailingBlankLines:
119
- Enabled: true
120
-
121
- # No trailing whitespace.
122
- Layout/TrailingWhitespace:
123
- Enabled: true
124
-
125
- # Use quotes for string literals when they are enough.
126
- Style/UnneededPercentQ:
127
- Enabled: true
128
-
129
- # Align `end` with the matching keyword or starting expression except for
130
- # assignments, where it should be aligned with the LHS.
131
- Lint/EndAlignment:
132
- Enabled: true
133
- EnforcedStyleAlignWith: variable
134
-
135
- # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
136
- Lint/RequireParentheses:
137
- Enabled: true