ops_team 0.5.0 → 0.8.2

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
  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