serverkit 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +12 -11
- data/example/recipe.yml +3 -0
- data/example/template.erb +1 -0
- data/example/variables.yml +1 -0
- data/lib/serverkit/loaders/base_loader.rb +0 -2
- data/lib/serverkit/resource_builder.rb +10 -1
- data/lib/serverkit/resources/base.rb +8 -0
- data/lib/serverkit/resources/directory.rb +11 -54
- data/lib/serverkit/resources/entry.rb +107 -0
- data/lib/serverkit/resources/file.rb +11 -77
- data/lib/serverkit/resources/remote_file.rb +9 -52
- data/lib/serverkit/resources/template.rb +40 -0
- data/lib/serverkit/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6bc4285bf5a80516d782219e3e1c39e2293bd149
|
4
|
+
data.tar.gz: e5aa09260d3f3312d59387e4b6d5be6931194a08
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a8adc794c2315262a5bf14713fef1d36d069fe0c7776b64402de888a66bc364b22ee601205f0c13ff5144dd5561cf900959055faba6a8b5d5fb4a7afe658ef9
|
7
|
+
data.tar.gz: ed16eac1e8ba241522920ec7fd5137063588e1e78fd3993e1ffa9c802f2e3111f7663a3a0d3fb3be14140cbc1bcca406dd337f7fcd0673dfd47342095b1f35c2
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -194,17 +194,18 @@ By default, all types of resource can or must have the following attributes:
|
|
194
194
|
### Type
|
195
195
|
A resource must have a valid type attribute like:
|
196
196
|
|
197
|
-
- command
|
198
|
-
- directory
|
199
|
-
- file
|
200
|
-
- git
|
201
|
-
- nothing
|
202
|
-
- package
|
203
|
-
- recipe
|
204
|
-
- remote_file
|
205
|
-
- service
|
206
|
-
- symlink
|
207
|
-
-
|
197
|
+
- [command](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/command.rb)
|
198
|
+
- [directory](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/directory.rb)
|
199
|
+
- [file](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/file.rb)
|
200
|
+
- [git](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/git.rb)
|
201
|
+
- [nothing](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/nothing.rb)
|
202
|
+
- [package](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/package.rb)
|
203
|
+
- [recipe](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/recipe.rb)
|
204
|
+
- [remote_file](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/remote_file.rb)
|
205
|
+
- [service](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/service.rb)
|
206
|
+
- [symlink](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/symlink.rb)
|
207
|
+
- [template](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/template.rb)
|
208
|
+
- [user](https://github.com/r7kamura/serverkit/blob/master/lib/serverkit/resources/user.rb)
|
208
209
|
|
209
210
|
### Example
|
210
211
|
An example package resource that has type and name attributes.
|
data/example/recipe.yml
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
<%= message %>
|
@@ -0,0 +1 @@
|
|
1
|
+
message: test
|
@@ -10,6 +10,7 @@ require "serverkit/resources/recipe"
|
|
10
10
|
require "serverkit/resources/remote_file"
|
11
11
|
require "serverkit/resources/service"
|
12
12
|
require "serverkit/resources/symlink"
|
13
|
+
require "serverkit/resources/template"
|
13
14
|
require "serverkit/resources/unknown"
|
14
15
|
require "serverkit/resources/user"
|
15
16
|
|
@@ -29,8 +30,16 @@ module Serverkit
|
|
29
30
|
|
30
31
|
private
|
31
32
|
|
33
|
+
# @return [Array<Class>]
|
34
|
+
def available_resource_classes
|
35
|
+
Resources.constants.select do |constant_name|
|
36
|
+
constant = Resources.const_get(constant_name)
|
37
|
+
constant < Resources::Base && !constant.abstract_class?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
32
41
|
def has_known_type?
|
33
|
-
|
42
|
+
available_resource_classes.map(&:to_s).include?(resource_class_name)
|
34
43
|
end
|
35
44
|
|
36
45
|
# @return [Class]
|
@@ -9,6 +9,12 @@ module Serverkit
|
|
9
9
|
module Resources
|
10
10
|
class Base
|
11
11
|
class << self
|
12
|
+
attr_writer :abstract_class
|
13
|
+
|
14
|
+
def abstract_class?
|
15
|
+
!!@abstract_class
|
16
|
+
end
|
17
|
+
|
12
18
|
# @note DSL method to define attribute with its validations
|
13
19
|
def attribute(name, options = {})
|
14
20
|
default = options.delete(:default)
|
@@ -41,6 +47,8 @@ module Serverkit
|
|
41
47
|
to: :backend,
|
42
48
|
)
|
43
49
|
|
50
|
+
self.abstract_class = true
|
51
|
+
|
44
52
|
# @param [Serverkit::Recipe] recipe
|
45
53
|
# @param [Hash] attributes
|
46
54
|
def initialize(recipe, attributes)
|
@@ -1,68 +1,25 @@
|
|
1
|
-
require "serverkit/resources/
|
1
|
+
require "serverkit/resources/entry"
|
2
2
|
|
3
3
|
module Serverkit
|
4
4
|
module Resources
|
5
|
-
class Directory <
|
6
|
-
attribute :group, type: String
|
7
|
-
attribute :mode, type: [Integer, String]
|
8
|
-
attribute :owner, type: String
|
5
|
+
class Directory < Entry
|
9
6
|
attribute :path, required: true, type: String
|
10
7
|
|
11
|
-
# @note Override
|
12
|
-
def apply
|
13
|
-
create_directory unless has_correct_directory?
|
14
|
-
update_group unless has_correct_group?
|
15
|
-
update_mode unless has_correct_mode?
|
16
|
-
update_owner unless has_correct_owner?
|
17
|
-
end
|
18
|
-
|
19
|
-
# @note Override
|
20
|
-
def check
|
21
|
-
has_correct_directory? && has_correct_group? && has_correct_mode? && has_correct_owner?
|
22
|
-
end
|
23
|
-
|
24
8
|
private
|
25
9
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def has_correct_directory?
|
31
|
-
check_command_from_identifier(:check_file_is_directory, path)
|
32
|
-
end
|
33
|
-
|
34
|
-
def has_correct_group?
|
35
|
-
group.nil? || check_command_from_identifier(:check_file_is_grouped, path, group)
|
36
|
-
end
|
37
|
-
|
38
|
-
def has_correct_mode?
|
39
|
-
mode.nil? || check_command_from_identifier(:check_file_has_mode, path, mode_in_octal_notation)
|
40
|
-
end
|
41
|
-
|
42
|
-
def has_correct_owner?
|
43
|
-
owner.nil? || check_command_from_identifier(:check_file_is_owned_by, path, owner)
|
44
|
-
end
|
45
|
-
|
46
|
-
# @return [String]
|
47
|
-
# @example "755" # for 0755
|
48
|
-
def mode_in_octal_notation
|
49
|
-
if mode.is_a?(Integer)
|
50
|
-
mode.to_s(8)
|
51
|
-
else
|
52
|
-
mode
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def update_group
|
57
|
-
run_command_from_identifier(:change_file_group, path, group)
|
10
|
+
# @note Override
|
11
|
+
def destination
|
12
|
+
path
|
58
13
|
end
|
59
14
|
|
60
|
-
|
61
|
-
|
15
|
+
# @note Override
|
16
|
+
def has_correct_entry?
|
17
|
+
check_command_from_identifier(:check_file_is_directory, destination)
|
62
18
|
end
|
63
19
|
|
64
|
-
|
65
|
-
|
20
|
+
# @note Override
|
21
|
+
def update_entry
|
22
|
+
run_command_from_identifier(:create_file_as_directory, destination)
|
66
23
|
end
|
67
24
|
end
|
68
25
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "digest"
|
2
|
+
require "serverkit/resources/base"
|
3
|
+
require "tempfile"
|
4
|
+
|
5
|
+
module Serverkit
|
6
|
+
module Resources
|
7
|
+
# Abstract class for file and directory
|
8
|
+
class Entry < Base
|
9
|
+
attribute :group, type: String
|
10
|
+
attribute :mode, type: [Integer, String]
|
11
|
+
attribute :owner, type: String
|
12
|
+
|
13
|
+
self.abstract_class = true
|
14
|
+
|
15
|
+
# @note Override
|
16
|
+
def apply
|
17
|
+
update_entry unless has_correct_entry?
|
18
|
+
update_group unless has_correct_group?
|
19
|
+
update_mode unless has_correct_mode?
|
20
|
+
update_owner unless has_correct_owner?
|
21
|
+
end
|
22
|
+
|
23
|
+
# @note Override
|
24
|
+
def check
|
25
|
+
has_correct_entry? && has_correct_group? && has_correct_mode? && has_correct_owner?
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# @note Override me
|
31
|
+
# @return [String] Path to the entry on remote side
|
32
|
+
def destination
|
33
|
+
raise NotImplementedError
|
34
|
+
end
|
35
|
+
|
36
|
+
def has_correct_content?
|
37
|
+
content.nil? || remote_file_sha256sum == local_content_sha256sum
|
38
|
+
end
|
39
|
+
|
40
|
+
# @note Override me
|
41
|
+
def has_correct_entry?
|
42
|
+
raise NotImplementedError
|
43
|
+
end
|
44
|
+
|
45
|
+
def has_correct_group?
|
46
|
+
group.nil? || check_command_from_identifier(:check_file_is_grouped, destination, group)
|
47
|
+
end
|
48
|
+
|
49
|
+
def has_correct_mode?
|
50
|
+
mode.nil? || check_command_from_identifier(:check_file_has_mode, destination, mode_in_octal_notation)
|
51
|
+
end
|
52
|
+
|
53
|
+
def has_correct_owner?
|
54
|
+
owner.nil? || check_command_from_identifier(:check_file_is_owned_by, destination, owner)
|
55
|
+
end
|
56
|
+
|
57
|
+
def has_remote_file?
|
58
|
+
check_command_from_identifier(:check_file_is_file, destination)
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [String]
|
62
|
+
def local_content_sha256sum
|
63
|
+
::Digest::SHA256.hexdigest(content)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [String]
|
67
|
+
# @example "755" # for 0755
|
68
|
+
def mode_in_octal_notation
|
69
|
+
if mode.is_a?(Integer)
|
70
|
+
mode.to_s(8)
|
71
|
+
else
|
72
|
+
mode
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [String]
|
77
|
+
def remote_file_sha256sum
|
78
|
+
run_command_from_identifier(:get_file_sha256sum, destination).stdout.rstrip
|
79
|
+
end
|
80
|
+
|
81
|
+
def send_content_to_destination
|
82
|
+
::Tempfile.open("") do |file|
|
83
|
+
file.write(content || "")
|
84
|
+
file.close
|
85
|
+
backend.send_file(file.path, destination)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# @note Override me
|
90
|
+
def update_entry
|
91
|
+
raise NotImplementedError
|
92
|
+
end
|
93
|
+
|
94
|
+
def update_group
|
95
|
+
run_command_from_identifier(:change_file_group, destination, group)
|
96
|
+
end
|
97
|
+
|
98
|
+
def update_mode
|
99
|
+
run_command_from_identifier(:change_file_mode, destination, mode_in_octal_notation)
|
100
|
+
end
|
101
|
+
|
102
|
+
def update_owner
|
103
|
+
run_command_from_identifier(:change_file_owner, destination, owner)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -1,93 +1,27 @@
|
|
1
|
-
require "
|
2
|
-
require "serverkit/resources/base"
|
1
|
+
require "serverkit/resources/entry"
|
3
2
|
require "tempfile"
|
4
3
|
|
5
4
|
module Serverkit
|
6
5
|
module Resources
|
7
|
-
class File <
|
6
|
+
class File < Entry
|
8
7
|
attribute :content, type: String
|
9
|
-
attribute :group, type: String
|
10
|
-
attribute :mode, type: [Integer, String]
|
11
|
-
attribute :owner, type: String
|
12
8
|
attribute :path, required: true, type: String
|
13
9
|
|
14
|
-
# @note Override
|
15
|
-
def apply
|
16
|
-
update_file unless has_correct_file?
|
17
|
-
update_group unless has_correct_group?
|
18
|
-
update_mode unless has_correct_mode?
|
19
|
-
update_owner unless has_correct_owner?
|
20
|
-
end
|
21
|
-
|
22
|
-
# @note Override
|
23
|
-
def check
|
24
|
-
has_correct_file? && has_correct_group? && has_correct_mode? && has_correct_owner?
|
25
|
-
end
|
26
|
-
|
27
10
|
private
|
28
11
|
|
29
|
-
# @
|
30
|
-
def
|
31
|
-
|
32
|
-
end
|
33
|
-
|
34
|
-
# @return [String]
|
35
|
-
def file_sha256sum
|
36
|
-
run_command_from_identifier(:get_file_sha256sum, path).stdout.rstrip
|
37
|
-
end
|
38
|
-
|
39
|
-
def has_file?
|
40
|
-
check_command_from_identifier(:check_file_is_file, path)
|
41
|
-
end
|
42
|
-
|
43
|
-
def has_correct_content?
|
44
|
-
content.nil? || file_sha256sum == content_sha256sum
|
45
|
-
end
|
46
|
-
|
47
|
-
def has_correct_file?
|
48
|
-
has_file? && has_correct_content?
|
49
|
-
end
|
50
|
-
|
51
|
-
def has_correct_group?
|
52
|
-
group.nil? || check_command_from_identifier(:check_file_is_grouped, path, group)
|
53
|
-
end
|
54
|
-
|
55
|
-
def has_correct_mode?
|
56
|
-
mode.nil? || check_command_from_identifier(:check_file_has_mode, path, mode_in_octal_notation)
|
57
|
-
end
|
58
|
-
|
59
|
-
def has_correct_owner?
|
60
|
-
owner.nil? || check_command_from_identifier(:check_file_is_owned_by, path, owner)
|
61
|
-
end
|
62
|
-
|
63
|
-
# @return [String]
|
64
|
-
# @example "755" # for 0755
|
65
|
-
def mode_in_octal_notation
|
66
|
-
if mode.is_a?(Integer)
|
67
|
-
mode.to_s(8)
|
68
|
-
else
|
69
|
-
mode
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def update_file
|
74
|
-
::Tempfile.open("") do |file|
|
75
|
-
file.write(content || "")
|
76
|
-
file.close
|
77
|
-
backend.send_file(file.path, path)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def update_group
|
82
|
-
run_command_from_identifier(:change_file_group, path, group)
|
12
|
+
# @note Override
|
13
|
+
def destination
|
14
|
+
path
|
83
15
|
end
|
84
16
|
|
85
|
-
|
86
|
-
|
17
|
+
# @note Override
|
18
|
+
def has_correct_entry?
|
19
|
+
has_remote_file? && has_correct_content?
|
87
20
|
end
|
88
21
|
|
89
|
-
|
90
|
-
|
22
|
+
# @note Override
|
23
|
+
def update_entry
|
24
|
+
send_content_to_destination
|
91
25
|
end
|
92
26
|
end
|
93
27
|
end
|
@@ -1,67 +1,24 @@
|
|
1
|
-
require "
|
2
|
-
require "serverkit/resources/base"
|
1
|
+
require "serverkit/resources/entry"
|
3
2
|
|
4
3
|
module Serverkit
|
5
4
|
module Resources
|
6
|
-
class RemoteFile <
|
5
|
+
class RemoteFile < Entry
|
7
6
|
attribute :destination, required: true, type: String
|
8
|
-
attribute :group, type: String
|
9
|
-
attribute :owner, type: String
|
10
7
|
attribute :source, readable: true, required: true, type: String
|
11
8
|
|
12
|
-
# @note Override
|
13
|
-
def apply
|
14
|
-
send_file_from_source_to_destination if file_sendable?
|
15
|
-
change_group unless has_valid_group?
|
16
|
-
change_owner unless has_valid_owner?
|
17
|
-
end
|
18
|
-
|
19
|
-
# @note Override
|
20
|
-
def check
|
21
|
-
has_file? && has_same_content? && has_valid_group? && has_valid_owner?
|
22
|
-
end
|
23
|
-
|
24
9
|
private
|
25
10
|
|
26
|
-
def
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
def change_owner
|
31
|
-
run_command_from_identifier(:change_file_owner, destination, owner)
|
32
|
-
end
|
33
|
-
|
34
|
-
def file_sendable?
|
35
|
-
!has_file? || !has_same_content?
|
36
|
-
end
|
37
|
-
|
38
|
-
def has_file?
|
39
|
-
check_command_from_identifier(:check_file_is_file, destination)
|
40
|
-
end
|
41
|
-
|
42
|
-
def has_same_content?
|
43
|
-
remote_file_sha256sum == local_file_sha256sum
|
11
|
+
def content
|
12
|
+
@content ||= ::File.read(source)
|
44
13
|
end
|
45
14
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def has_valid_owner?
|
51
|
-
owner.nil? || check_command_from_identifier(:check_file_is_owned_by, destination, owner)
|
52
|
-
end
|
53
|
-
|
54
|
-
# @return [String]
|
55
|
-
def local_file_sha256sum
|
56
|
-
::Digest::SHA256.hexdigest(::File.read(source))
|
57
|
-
end
|
58
|
-
|
59
|
-
# @return [String]
|
60
|
-
def remote_file_sha256sum
|
61
|
-
run_command_from_identifier(:get_file_sha256sum, destination).stdout.rstrip
|
15
|
+
# @note Override
|
16
|
+
def has_correct_entry?
|
17
|
+
has_remote_file? && has_correct_content?
|
62
18
|
end
|
63
19
|
|
64
|
-
|
20
|
+
# @note Override
|
21
|
+
def update_entry
|
65
22
|
send_file(source, destination)
|
66
23
|
end
|
67
24
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "erb"
|
2
|
+
require "serverkit/loaders/variables_loader"
|
3
|
+
require "serverkit/resources/entry"
|
4
|
+
require "tempfile"
|
5
|
+
|
6
|
+
module Serverkit
|
7
|
+
module Resources
|
8
|
+
class Template < RemoteFile
|
9
|
+
DEFAULT_VARIABLES_DATA = {}
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# @note Override
|
14
|
+
def content
|
15
|
+
@content ||= ::ERB.new(template_content, nil, "-").result(variables.to_mash.binding)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [String] ERB content
|
19
|
+
def template_content
|
20
|
+
@template ||= ::File.read(source)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @note Override
|
24
|
+
def update_entry
|
25
|
+
send_content_to_destination
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Serverkit::Variables]
|
29
|
+
def variables
|
30
|
+
@variables ||= begin
|
31
|
+
if recipe.variables_path
|
32
|
+
Loaders::VariablesLoader.new(recipe.variables_path).load
|
33
|
+
else
|
34
|
+
Variables.new(DEFAULT_VARIABLES_DATA.dup)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/serverkit/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serverkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -212,6 +212,8 @@ files:
|
|
212
212
|
- Vagrantfile
|
213
213
|
- bin/serverkit
|
214
214
|
- example/recipe.yml
|
215
|
+
- example/template.erb
|
216
|
+
- example/variables.yml
|
215
217
|
- lib/readable_validator.rb
|
216
218
|
- lib/required_validator.rb
|
217
219
|
- lib/serverkit.rb
|
@@ -243,6 +245,7 @@ files:
|
|
243
245
|
- lib/serverkit/resources/base.rb
|
244
246
|
- lib/serverkit/resources/command.rb
|
245
247
|
- lib/serverkit/resources/directory.rb
|
248
|
+
- lib/serverkit/resources/entry.rb
|
246
249
|
- lib/serverkit/resources/file.rb
|
247
250
|
- lib/serverkit/resources/git.rb
|
248
251
|
- lib/serverkit/resources/missing.rb
|
@@ -252,6 +255,7 @@ files:
|
|
252
255
|
- lib/serverkit/resources/remote_file.rb
|
253
256
|
- lib/serverkit/resources/service.rb
|
254
257
|
- lib/serverkit/resources/symlink.rb
|
258
|
+
- lib/serverkit/resources/template.rb
|
255
259
|
- lib/serverkit/resources/unknown.rb
|
256
260
|
- lib/serverkit/resources/user.rb
|
257
261
|
- lib/serverkit/variables.rb
|