rbcm 0.0.6 → 0.0.7

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: 64d207b634e0ea0dea136b1a4820fa19e33254699e896bc3eebf8a61a4eb1a04
4
- data.tar.gz: 36436444ed968488cba4243f18a163b4573453794b1278ff0253b460cb2247ba
3
+ metadata.gz: a1a68a0e5a325249bc9310561d60a14f4ddd52e741132331efc2f439fdc69975
4
+ data.tar.gz: d607019aa164ff558f7e61ca5d57689ec28c60b0a4f08ae6219a0b090938fb22
5
5
  SHA512:
6
- metadata.gz: b470619274cb34f5137ea472ba16f07c2e920cd4795b8ef38a5b9353a20343dd7c71892f38a21f7b0ac3e3f930bcc7836cce9652a765e22c8140775434826c26
7
- data.tar.gz: 5e7d084273719ba5b2a25fdc54e295628f8890aab503f200dd00c81793768a17c04ac0976818838ba5bb294a37290bf77c15cf3ae5a840e7bc1043b6fbcddb00
6
+ metadata.gz: cc259820fea552552fb195d63b1af2159a1a31f31897589da79ad246faa161834b671b38962cf44b762564ca458068dc7cf9557eddbd12e4fdb54b745ac91709
7
+ data.tar.gz: ef8b76d2063c9ec15df6b1a295c57c2323972e5c5eb0f64539dbc9a0981e0ed62b68221ea73f0b6944419b15fd07d12a4e384dc9bc6ff967c9a2c7e6ae3db2fe
@@ -0,0 +1,83 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ # The encrypt_data and decrypt_data methods are Copyright (c) 2007 Brent Sowers
4
+ # and have been included with prior permission.
5
+ #
6
+ # Copyright (c) 2012 Gurpartap Singh
7
+ #
8
+ # MIT License
9
+ #
10
+ # Permission is hereby granted, free of charge, to any person obtaining
11
+ # a copy of this software and associated documentation files (the
12
+ # "Software"), to deal in the Software without restriction, including
13
+ # without limitation the rights to use, copy, modify, merge, publish,
14
+ # distribute, sublicense, and/or sell copies of the Software, and to
15
+ # permit persons to whom the Software is furnished to do so, subject to
16
+ # the following conditions:
17
+ #
18
+ # The above copyright notice and this permission notice shall be
19
+ # included in all copies or substantial portions of the Software.
20
+ #
21
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+
29
+ require 'openssl'
30
+ require 'base64'
31
+
32
+ module AESCrypt
33
+ def self.encrypt(message, password)
34
+ Base64.encode64(self.encrypt_data(message.to_s.strip, self.key_digest(password), nil, "AES-256-CBC")).chomp
35
+ end
36
+
37
+ def self.decrypt(message, password)
38
+ base64_decoded = Base64.decode64(message.to_s.strip)
39
+ self.decrypt_data(base64_decoded, self.key_digest(password), nil, "AES-256-CBC")
40
+ end
41
+
42
+ def self.key_digest(password)
43
+ OpenSSL::Digest::SHA256.new(password).digest
44
+ end
45
+
46
+ # Decrypts a block of data (encrypted_data) given an encryption key
47
+ # and an initialization vector (iv). Keys, iv's, and the data
48
+ # returned are all binary strings. Cipher_type should be
49
+ # "AES-256-CBC", "AES-256-ECB", or any of the cipher types
50
+ # supported by OpenSSL. Pass nil for the iv if the encryption type
51
+ # doesn't use iv's (like ECB).
52
+ #:return: => String
53
+ #:arg: encrypted_data => String
54
+ #:arg: key => String
55
+ #:arg: iv => String
56
+ #:arg: cipher_type => String
57
+ def self.decrypt_data(encrypted_data, key, iv, cipher_type)
58
+ aes = OpenSSL::Cipher.new(cipher_type)
59
+ aes.decrypt
60
+ aes.key = key
61
+ aes.iv = iv if iv != nil
62
+ aes.update(encrypted_data) + aes.final
63
+ end
64
+
65
+ # Encrypts a block of data given an encryption key and an
66
+ # initialization vector (iv). Keys, iv's, and the data returned
67
+ # are all binary strings. Cipher_type should be "AES-256-CBC",
68
+ # "AES-256-ECB", or any of the cipher types supported by OpenSSL.
69
+ # Pass nil for the iv if the encryption type doesn't use iv's (like
70
+ # ECB).
71
+ #:return: => String
72
+ #:arg: data => String
73
+ #:arg: key => String
74
+ #:arg: iv => String
75
+ #:arg: cipher_type => String
76
+ def self.encrypt_data(data, key, iv, cipher_type)
77
+ aes = OpenSSL::Cipher.new(cipher_type)
78
+ aes.encrypt
79
+ aes.key = key
80
+ aes.iv = iv if iv != nil
81
+ aes.update(data) + aes.final
82
+ end
83
+ end
data/app/lib/lib.rb CHANGED
@@ -28,7 +28,7 @@ class Array
28
28
  end
29
29
  end
30
30
 
31
- class Fixnum
31
+ class Integer
32
32
  # backport
33
33
  unless defined? digits
34
34
  def digits
data/app/node/file.rb CHANGED
@@ -1,4 +1,4 @@
1
- class Node::File
1
+ class Node::NodeFile
2
2
  def initialize path:, filesystem:
3
3
  @path = path
4
4
  @filesystem = filesystem
@@ -1,4 +1,4 @@
1
- class Node::Filesystem
1
+ class Node::NodeFilesystem
2
2
  def initialize node, overlays: false
3
3
  @node = node
4
4
  @underlying = overlays
@@ -11,7 +11,7 @@ class Node::Filesystem
11
11
  if @underlying
12
12
  @files[path] || @underlying[path]
13
13
  else
14
- @files[path] ||= Node::File.new path: path, filesystem: self
14
+ @files[path] ||= Node::NodeFile.new path: path, filesystem: self
15
15
  end
16
16
  end
17
17
  end
data/app/node/node.rb CHANGED
@@ -8,7 +8,7 @@ class Node
8
8
  @definitions = []
9
9
  @sandbox = Node::Sandbox.new self
10
10
  @remote = Node::Remote.new self
11
- @files = Node::Filesystem.new self, overlays: @remote.files
11
+ @files = Node::NodeFilesystem.new self, overlays: @remote.files
12
12
  @actions = ActionList.new
13
13
  @memberships = []
14
14
  @jobs = []
data/app/node/remote.rb CHANGED
@@ -3,7 +3,7 @@ class Node::Remote
3
3
 
4
4
  def initialize node
5
5
  @host = node.name
6
- @files = Node::Filesystem.new node
6
+ @files = Node::NodeFilesystem.new node
7
7
  end
8
8
 
9
9
  def execute action
data/app/node/sandbox.rb CHANGED
@@ -113,6 +113,10 @@ class Node::Sandbox
113
113
  )
114
114
  end
115
115
 
116
+ def decrypt secret
117
+ AESCrypt.decrypt secret, File.read(File.expand_path("~/.rbcm.secret")).chomp
118
+ end
119
+
116
120
  # handle getter method calls
117
121
  def method_missing name, *named, **ordered, &block
118
122
  #log "method #{name} missing on #{@name}"
@@ -171,7 +175,7 @@ class Node::Sandbox
171
175
  @cache[:trigger] << trigger if trigger
172
176
  @cache[:triggered_by] << triggered_by if triggered_by
173
177
  @cache[:check] << check if check
174
- yield if block_given?
178
+ r = yield if block_given?
175
179
  @cache[:source].pop if chain
176
180
  @cache[:chain].pop if chain
177
181
  @cache[:tag].pop if tag
@@ -179,6 +183,7 @@ class Node::Sandbox
179
183
  @cache[:triggered_by].pop if triggered_by
180
184
  @cache[:check].pop if check
181
185
  @cache[reset] = [] if reset
186
+ r
182
187
  end
183
188
 
184
189
  def __add_capability capability
@@ -191,19 +196,21 @@ class Node::Sandbox
191
196
  params = Params.new ordered, named
192
197
  @node.jobs.append Node::Job.new @node, capability.name, params
193
198
  @node.triggered.append capability.name
194
- __cache trigger: params[:trigger],
199
+ r = __cache trigger: params[:trigger],
195
200
  triggered_by: params[:triggered_by],
196
201
  chain: capability.name do
197
202
  send "__#{__method__}", *params.delete(:trigger, :triggered_by).sendable
198
203
  end
199
204
  @dependency_cache = [:file]
205
+ r
200
206
  end
201
207
  else # capability.type == :final
202
208
  define_singleton_method capability.name do
203
- __cache chain: __method__ do
209
+ r = __cache chain: __method__ do
204
210
  send "__#{__method__}"
205
211
  end
206
212
  @dependency_cache = [:file]
213
+ r
207
214
  end
208
215
  end
209
216
  end
data/app/project/file.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # extracts capabilities and definitions from project files
2
2
 
3
- class Project::File
3
+ class Project::ProjectFile
4
4
  def initialize project_file_path
5
5
  @path = project_file_path
6
6
  @definitions = []
@@ -1,9 +1,13 @@
1
1
  class Project
2
2
  def initialize path
3
3
  @path = path
4
- @files = Dir["#{path}/**/*.rb"].collect{ |project_file_path|
5
- Project::File.new project_file_path
6
- }
4
+ if File.directory? path
5
+ @files = Dir["#{path}/**/*.rb"].collect{ |project_file_path|
6
+ Project::ProjectFile.new project_file_path
7
+ }
8
+ else
9
+ @files = [Project::ProjectFile.new(path)]
10
+ end
7
11
  end
8
12
 
9
13
  attr_reader :path, :files
data/app/rbcm.rb CHANGED
@@ -12,7 +12,7 @@ APPDIR = File.expand_path File.dirname(__FILE__)
12
12
  "node/template",
13
13
  "lib/lib", "lib/array_hash",
14
14
  "lib/options", "lib/quick_each",
15
- "lib/params",
15
+ "lib/params", "lib/aescrypt",
16
16
  "project/project", "project/definition",
17
17
  "project/file", "project/capability",
18
18
  "project/sandbox",
@@ -67,4 +67,19 @@ class RBCM
67
67
  node.capabilities.each{|capability| node.sandbox.send "#{capability}!"}
68
68
  end
69
69
  end
70
+
71
+ def check! &block
72
+ Net::SSH::Multi.start do |session|
73
+ session.via 'gateway', 'gateway-user'
74
+ @nodes.each do |name, node|
75
+ session.group name.to_sym do
76
+ session.use "root@#{name}"
77
+ end
78
+ end
79
+ actions.checkable.each do |action|
80
+ session.with(action.node.name.to_sym).exec action.check &block
81
+ end
82
+ session.loop
83
+ end
84
+ end
70
85
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbcm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Wiegand
@@ -64,6 +64,7 @@ files:
64
64
  - app/action/file.rb
65
65
  - app/action/list.rb
66
66
  - app/cli.rb
67
+ - app/lib/aescrypt.rb
67
68
  - app/lib/array_hash.rb
68
69
  - app/lib/lib.rb
69
70
  - app/lib/options.rb