ops_team 0.5.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b5f3cafd5c8ea4f19149954f50d8f7cb9985ec6b8032497bfcb20865be3ca49a
4
- data.tar.gz: 2dc0e829aec00d936b497a47a44053ae54deab3158a900cdbe709496e323dbbf
3
+ metadata.gz: 8c91d50eeddf170724b335ec23089f3f5a452507f034e1edb8d9bce7fe419976
4
+ data.tar.gz: 9fa1b82f605e2342cfe01e6127849c41bae745ff68464afcb294f0796e5b9b82
5
5
  SHA512:
6
- metadata.gz: 8f9a772c8a2828b471c094d183e05f7d30421d809c6771a143bc758d2752f8d8677ff8ddcfceeef78b3356a4342701df2a6691a25309541c68e6b034eeda258b
7
- data.tar.gz: 98139f2f8b632891f8669719aae49aa71c71c2d2c71993b5311eba0a1a882ca4168d28e0a9e273cb5d86c9ec56a26739026d2eb8a2093a4661b9a420b035b374
6
+ metadata.gz: b1e9b52dcbcc50975dd2dd9e5369d4e1134822a7837a1132994c296fe32021c339d1457a1d9e92bbb6fdc5daa0581b761a13ce0f04ba92138821e41161f45209
7
+ data.tar.gz: 7b94c375bb4a1614aff89cbe83a530864b9c9aff8d597a0945fb499629833ff8dd099eb986df610d458a3a009d6ea00ac1eaf6c9c92e063892c15ee0290810d5
data/Gemfile CHANGED
@@ -4,7 +4,10 @@ source "https://rubygems.org"
4
4
 
5
5
  git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
6
 
7
+ gem "bcrypt_pbkdf"
7
8
  gem "colorize"
9
+ gem "ed25519"
10
+ gem "net-ssh"
8
11
  gem "require_all"
9
12
 
10
13
  group :test do
@@ -1,6 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class AppConfig
4
+ class << self
5
+ def load
6
+ new(app_config_path).load
7
+ end
8
+
9
+ private
10
+
11
+ def app_config_path
12
+ expand_path(Options.get("config.path"))
13
+ end
14
+
15
+ def expand_path(path)
16
+ `echo #{path}`.chomp
17
+ end
18
+ end
19
+
4
20
  def initialize(filename = "")
5
21
  @filename = filename.empty? ? default_filename : filename
6
22
  end
@@ -18,8 +34,8 @@ class AppConfig
18
34
  end
19
35
 
20
36
  def config
21
- @config ||= file_contents ? JSON.parse(file_contents) : {}
22
- rescue JSON::ParserError => e
37
+ @config ||= file_contents ? YAML.safe_load(file_contents) : {}
38
+ rescue YAML::SyntaxError => e
23
39
  Output.error("Error parsing config data: #{e}")
24
40
  {}
25
41
  end
@@ -35,7 +35,10 @@ module Builtins
35
35
 
36
36
  def actions
37
37
  @config["actions"].map do |name, value|
38
- format("%<name>-35s %<desc>s", name: name.yellow, desc: value["description"] || value["command"])
38
+ format("%<name>-35s %<desc>s",
39
+ name: name.yellow,
40
+ desc: value["description"] || value["command"]
41
+ )
39
42
  end
40
43
  end
41
44
  end
@@ -29,7 +29,7 @@ module Builtins
29
29
  def meet_dependencies
30
30
  dependency_handler.dependencies.each do |dependency|
31
31
  # don't even output anything for dependencies that shouldn't be considered on this machine
32
- next unless dependency.should_meet?
32
+ next unless dependency&.should_meet?
33
33
 
34
34
  Output.status("[#{dependency.type}] #{dependency.name}")
35
35
 
@@ -9,7 +9,7 @@ module Dependencies
9
9
  end
10
10
 
11
11
  def meet
12
- execute("#{sudo_string}#{meet_command}")
12
+ execute("#{sudo_string}apt-get install -y #{name}")
13
13
  end
14
14
 
15
15
  def unmeet
@@ -28,9 +28,5 @@ module Dependencies
28
28
 
29
29
  "sudo "
30
30
  end
31
-
32
- def meet_command
33
- "apt-get install -y #{name}"
34
- end
35
31
  end
36
32
  end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/ssh'
4
+
5
+ require 'dependency'
6
+
7
+ module Dependencies
8
+ class Sshkey < Dependency
9
+ DEFAULT_KEY_SIZE = 2048
10
+ DEFAULT_KEY_ALGO = "rsa"
11
+ DEFAULT_KEY_LIFETIME_S = 600
12
+
13
+ def met?
14
+ # we always need to at least update the key lifetime in the agent
15
+ false
16
+ end
17
+
18
+ def meet
19
+ Secrets.load
20
+
21
+ FileUtils.mkdir_p(dir_name) unless File.directory?(dir_name)
22
+
23
+ generate_key unless File.exist?(priv_key_name) && File.exist?(pub_key_name)
24
+ add_key if success? && ENV["SSH_AUTH_SOCK"]
25
+ end
26
+
27
+ def unmeet
28
+ true
29
+ end
30
+
31
+ def should_meet?
32
+ true
33
+ end
34
+
35
+ private
36
+
37
+ def generate_key
38
+ execute("ssh-keygen -b #{key_size} -t #{key_algo} -f #{priv_key_name} -q -N '#{passphrase}'")
39
+ end
40
+
41
+ def add_key
42
+ Net::SSH::Authentication::Agent.connect.add_identity(
43
+ unencrypted_key,
44
+ "ops",
45
+ lifetime: key_lifetime
46
+ )
47
+ end
48
+
49
+ def unencrypted_key
50
+ Net::SSH::KeyFactory.load_private_key(priv_key_name, passphrase)
51
+ end
52
+
53
+ def dir_name
54
+ `echo #{File.dirname(name)}`.chomp
55
+ end
56
+
57
+ def priv_key_name
58
+ `echo #{name}`.chomp
59
+ end
60
+
61
+ def pub_key_name
62
+ "#{priv_key_name}.pub"
63
+ end
64
+
65
+ def key_size
66
+ Options.get("sshkey.key_size") || DEFAULT_KEY_SIZE
67
+ end
68
+
69
+ def key_algo
70
+ DEFAULT_KEY_ALGO
71
+ end
72
+
73
+ def passphrase
74
+ `echo #{configured_passphrase}`.chomp
75
+ end
76
+
77
+ def configured_passphrase
78
+ Options.get("sshkey.passphrase")
79
+ end
80
+
81
+ def key_lifetime
82
+ Options.get("sshkey.key_lifetime") || DEFAULT_KEY_LIFETIME_S
83
+ end
84
+ end
85
+ end
@@ -30,7 +30,7 @@ class Environment
30
30
 
31
31
  def set_configured_variables
32
32
  @env_hash.each do |key, value|
33
- ENV[key] = value.to_s
33
+ ENV[key] = `echo #{value}`.chomp
34
34
  end
35
35
  end
36
36
  end
data/lib/ops.rb CHANGED
@@ -49,11 +49,11 @@ class Ops
49
49
 
50
50
  def run_action
51
51
  environment.set_variables
52
- app_config.load
52
+ AppConfig.load
53
53
 
54
54
  return builtin.run if builtin
55
55
 
56
- Output.warn("Running '#{action}' from #{CONFIG_FILE}...")
56
+ Output.warn("Running '#{action}' from #{CONFIG_FILE} in environment '#{ENV['environment']}'...")
57
57
  action.run
58
58
  end
59
59
 
@@ -106,12 +106,8 @@ class Ops
106
106
  @environment ||= Environment.new(env_vars)
107
107
  end
108
108
 
109
- def app_config_file
110
- `echo #{Options.get("config.path")}`.chomp
111
- end
112
-
113
109
  def app_config
114
- @app_config ||= AppConfig.new(app_config_file)
110
+ @app_config ||= AppConfig.new
115
111
  end
116
112
  end
117
113
 
@@ -8,19 +8,11 @@ require 'options'
8
8
 
9
9
  class Secrets < AppConfig
10
10
  class << self
11
- def load
12
- Secrets.new(secrets_path).load
13
- end
14
-
15
11
  private
16
12
 
17
- def secrets_path
13
+ def app_config_path
18
14
  expand_path(Options.get("secrets.path"))
19
15
  end
20
-
21
- def expand_path(path)
22
- `echo #{path}`.chomp
23
- end
24
16
  end
25
17
 
26
18
  def initialize(filename = "")
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'ops_team'
5
- s.version = '0.5.0'
5
+ s.version = '0.8.2'
6
6
  s.authors = [
7
7
  'nickthecook@gmail.com'
8
8
  ]
@@ -22,7 +22,10 @@ Gem::Specification.new do |s|
22
22
  ]
23
23
  s.executables << 'ops'
24
24
  s.required_ruby_version = '~> 2.5'
25
+ s.add_runtime_dependency 'bcrypt_pbkdf', '~> 1.0', '>= 1.0.1'
25
26
  s.add_runtime_dependency 'colorize', '~> 0.8', '>= 0.8.1'
27
+ s.add_runtime_dependency 'ed25519', '~> 1.2', '>= 1.2.4'
28
+ s.add_runtime_dependency 'net-ssh', '~> 6.1', '>= 6.1.0'
26
29
  s.add_runtime_dependency 'require_all', '~> 1.1', '>= 1.1.6'
27
30
  s.license = 'GPL-3.0-only'
28
31
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ops_team
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - nickthecook@gmail.com
@@ -10,6 +10,26 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2020-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bcrypt_pbkdf
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.0.1
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: colorize
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -30,6 +50,46 @@ dependencies:
30
50
  - - ">="
31
51
  - !ruby/object:Gem::Version
32
52
  version: 0.8.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: ed25519
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.2'
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 1.2.4
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1.2'
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 1.2.4
73
+ - !ruby/object:Gem::Dependency
74
+ name: net-ssh
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 6.1.0
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '6.1'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 6.1.0
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '6.1'
33
93
  - !ruby/object:Gem::Dependency
34
94
  name: require_all
35
95
  requirement: !ruby/object:Gem::Requirement
@@ -84,6 +144,7 @@ files:
84
144
  - lib/dependencies/dir.rb
85
145
  - lib/dependencies/docker.rb
86
146
  - lib/dependencies/gem.rb
147
+ - lib/dependencies/sshkey.rb
87
148
  - lib/dependency.rb
88
149
  - lib/environment.rb
89
150
  - lib/ops.rb