splice 0.3 → 0.5
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.
- data/Gemfile.lock +1 -1
- data/lib/execution_context.rb +14 -10
- data/lib/splice.rb +16 -9
- data/lib/splice/version.rb +1 -1
- metadata +2 -2
data/Gemfile.lock
CHANGED
data/lib/execution_context.rb
CHANGED
@@ -2,6 +2,7 @@ require 'openssl'
|
|
2
2
|
SEARCH_PATHS = ["local.dna","/tmp/ephemeral.dna", "/etc/system.dna"] #Search paths, in order of priority
|
3
3
|
require 'erb'
|
4
4
|
require 'yaml'
|
5
|
+
require 'digest/sha1'
|
5
6
|
|
6
7
|
module Splice
|
7
8
|
include OpenSSL
|
@@ -11,28 +12,31 @@ module Splice
|
|
11
12
|
def initialize(search_tmp = false)
|
12
13
|
@settings = Hash.new
|
13
14
|
|
14
|
-
SEARCH_PATHS.each do |path|
|
15
|
-
|
16
|
-
|
17
|
-
if File.exists?(path) and is_not_tmp
|
15
|
+
SEARCH_PATHS.each do |path|
|
16
|
+
if File.exists?(path)
|
18
17
|
begin
|
19
|
-
|
18
|
+
delim = "!)@(#*$*$&%^)"
|
19
|
+
dna_package = File.read(path)
|
20
|
+
dna_package = dna_package.split(delim)
|
20
21
|
rescue => e
|
21
|
-
puts "One or more dna files are invalid. Please check for corruption and try again."
|
22
|
+
puts "One or more dna files are invalid. Please check for corruption and try again.\n\n#{e.message}\n#{e.backtrace}"
|
22
23
|
exit 1
|
23
24
|
end
|
24
|
-
|
25
|
+
|
26
|
+
signature = Base64.decode64(dna_package[0])
|
25
27
|
payload = dna_package[1]
|
26
28
|
|
27
29
|
# First, we need to verify that the file
|
28
30
|
# has not been tampered with
|
29
31
|
|
30
32
|
begin
|
31
|
-
public_key = OpenSSL::PKey::RSA.new File.read("/etc/splice/bloodline
|
33
|
+
public_key = OpenSSL::PKey::RSA.new File.read("/etc/splice/bloodline")
|
34
|
+
throw "no bloodline" if public_key.nil?
|
32
35
|
rescue => e
|
33
|
-
puts "ERROR: Invalid or no bloodline file installed. Please install the bloodline
|
36
|
+
puts "ERROR: Invalid or no bloodline file installed. Please install the bloodline file generated when you ran splice --master at /etc/splice/bloodline"
|
37
|
+
exit 14
|
34
38
|
end
|
35
|
-
|
39
|
+
|
36
40
|
file_signed_correctly = public_key.verify(OpenSSL::Digest::SHA1.new,signature,payload)
|
37
41
|
|
38
42
|
if !file_signed_correctly
|
data/lib/splice.rb
CHANGED
@@ -2,11 +2,13 @@ require "splice/version"
|
|
2
2
|
require 'execution_context'
|
3
3
|
require 'pp'
|
4
4
|
require 'openssl'
|
5
|
+
require 'base64'
|
6
|
+
require 'digest/sha1'
|
5
7
|
|
6
8
|
module Splice
|
7
9
|
def parse_files
|
8
10
|
context = ExecutionContext.new
|
9
|
-
|
11
|
+
|
10
12
|
if context.settings["splice"] and context.settings["splice"]["files"] and context.settings["splice"]["files"].count > 0
|
11
13
|
context.settings["splice"]["files"].each {|p| context.parse(p); puts "Parsed and wrote file #{p}" }
|
12
14
|
else
|
@@ -23,9 +25,10 @@ module Splice
|
|
23
25
|
private_cert = private_key.to_pem
|
24
26
|
public_cert = public_key.to_pem
|
25
27
|
|
26
|
-
if !Dir.exists?("/etc/
|
28
|
+
if !Dir.exists?("/etc/splice/master/")
|
27
29
|
begin
|
28
|
-
Dir.mkdir("/etc/
|
30
|
+
Dir.mkdir("/etc/splice",0733) if !Dir.exists?("/etc/splice")
|
31
|
+
Dir.mkdir("/etc/splice/master/",0733)
|
29
32
|
rescue => e
|
30
33
|
puts "ERROR: could not write master key to disk. Check that you have permission to write to /etc/ and try again."
|
31
34
|
exit 4
|
@@ -33,27 +36,27 @@ module Splice
|
|
33
36
|
end
|
34
37
|
|
35
38
|
begin
|
36
|
-
File.open("/etc/
|
37
|
-
File.open("bloodline
|
39
|
+
File.open("/etc/splice/master/splice.pem",'w') {|f| f.write(private_key) }
|
40
|
+
File.open("bloodline",'w') {|f| f.write(public_key) }
|
38
41
|
rescue => e
|
39
42
|
puts "ERROR: Could not write master key to disk."
|
40
43
|
exit 2
|
41
44
|
end
|
42
45
|
|
43
46
|
puts "New master created"
|
44
|
-
puts "Bloodline file saved to './bloodline
|
47
|
+
puts "Bloodline file saved to './bloodline'"
|
45
48
|
exit 0
|
46
49
|
end
|
47
50
|
|
48
51
|
def sign_file(a_file)
|
49
52
|
puts "Signing file #{a_file}"
|
50
53
|
|
51
|
-
if !File.exists?("/etc/
|
54
|
+
if !File.exists?("/etc/splice/master/splice.pem")
|
52
55
|
puts "ERROR: No splice master key found. Run splice --master or import the correct key before you attempt to sign files."
|
53
56
|
exit 1
|
54
57
|
end
|
55
58
|
|
56
|
-
private_key = OpenSSL::PKey::RSA.new File.read('/etc/
|
59
|
+
private_key = OpenSSL::PKey::RSA.new File.read('/etc/splice/master/splice.pem')
|
57
60
|
file_contents = File.read(a_file)
|
58
61
|
sig = private_key.sign(OpenSSL::Digest::SHA1.new,file_contents)
|
59
62
|
new_file_name = File.basename(a_file)
|
@@ -62,7 +65,8 @@ module Splice
|
|
62
65
|
new_file_name = new_file_name.join(".")
|
63
66
|
new_file_name += ".dna"
|
64
67
|
|
65
|
-
|
68
|
+
delim = "!)@(#*$*$&%^)"
|
69
|
+
dna_payload = [Base64.encode64(sig),file_contents].join(delim)
|
66
70
|
|
67
71
|
begin
|
68
72
|
File.open(new_file_name,'w') { |f| f.write(dna_payload) }
|
@@ -72,6 +76,9 @@ module Splice
|
|
72
76
|
end
|
73
77
|
|
74
78
|
puts "Signed configuration file #{a_file} to #{new_file_name}"
|
79
|
+
puts "SHA1 Signatures:"
|
80
|
+
puts "Signature: " + Digest::SHA1.hexdigest(sig)
|
81
|
+
puts "Payload: " + Digest::SHA1.hexdigest(file_contents)
|
75
82
|
|
76
83
|
exit 0
|
77
84
|
end
|
data/lib/splice/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: splice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.5'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: A simple way to manage Linux server configurations.
|
15
15
|
email:
|