itamae 1.0.0.beta32 → 1.0.0.beta33
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 +4 -4
- data/README.md +5 -1
- data/itamae.gemspec +1 -1
- data/lib/itamae/backend.rb +24 -22
- data/lib/itamae/logger.rb +28 -10
- data/lib/itamae/recipe.rb +9 -9
- data/lib/itamae/resource/base.rb +29 -26
- data/lib/itamae/resource/file.rb +4 -5
- data/lib/itamae/resource/link.rb +2 -2
- data/lib/itamae/resource/user.rb +18 -24
- data/lib/itamae/version.txt +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7789de3e2192706f3fbc070c21b4c8655ee069e
|
4
|
+
data.tar.gz: 53c079ad48be16240db72583dbd259789f13f18f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebe47750eca4115b24f816d646305df6b61eb370bb0955db711fc0fe522c20f6f72cdfb953d5029d67a8eda8ff367b20e027b39e7d94b9d81f71bab3bf156a97
|
7
|
+
data.tar.gz: fe8db93b2450cbd67a3038f482f3773cd8e6a77fd5d20fe2f3bfc983311cae8b612186645cd1b9203ef3642990e4c5ecc9eddfd593e18be33c85b0754bf1f7c7
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Itamae [](http://badge.fury.io/rb/itamae) [](https://app.wercker.com/project/bykey/d44df82d2f4529ff664f32fa54ce12f5)
|
1
|
+
# Itamae [](http://badge.fury.io/rb/itamae) [](https://codeclimate.com/github/ryotarai/itamae) [](https://app.wercker.com/project/bykey/d44df82d2f4529ff664f32fa54ce12f5)
|
2
2
|
|
3
3
|
Simple and lightweight configuration management tool inspired by Chef.
|
4
4
|
|
@@ -54,6 +54,10 @@ end
|
|
54
54
|
|
55
55
|
Further example is here: [spec/integration/recipes/default.rb](spec/integration/recipes/default.rb)
|
56
56
|
|
57
|
+
## Doc
|
58
|
+
|
59
|
+
https://github.com/ryotarai/itamae/wiki
|
60
|
+
|
57
61
|
## Run tests
|
58
62
|
|
59
63
|
Requirements: Vagrant
|
data/itamae.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_runtime_dependency "thor"
|
21
|
-
spec.add_runtime_dependency "specinfra", "2.0.0.
|
21
|
+
spec.add_runtime_dependency "specinfra", "2.0.0.beta43"
|
22
22
|
spec.add_runtime_dependency "hashie"
|
23
23
|
spec.add_runtime_dependency "ansi"
|
24
24
|
|
data/lib/itamae/backend.rb
CHANGED
@@ -60,37 +60,39 @@ module Itamae
|
|
60
60
|
command = "sudo -u #{Shellwords.escape(user)} -- /bin/sh -c #{Shellwords.escape(command)}"
|
61
61
|
end
|
62
62
|
|
63
|
-
Logger.debug "
|
63
|
+
Logger.debug "Executing `#{command}`..."
|
64
64
|
|
65
65
|
result = Specinfra::Runner.run_command(command)
|
66
66
|
exit_status = result.exit_status
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
68
|
+
Logger.formatter.indent do
|
69
|
+
if exit_status == 0 || !options[:error]
|
70
|
+
method = :debug
|
71
|
+
message = "exited with #{exit_status}"
|
72
|
+
else
|
73
|
+
method = :error
|
74
|
+
message = "Command `#{command}` failed. (exit status: #{exit_status})"
|
75
|
+
end
|
75
76
|
|
76
|
-
|
77
|
+
Logger.public_send(method, message)
|
77
78
|
|
78
|
-
|
79
|
-
|
79
|
+
{"stdout" => result.stdout, "stderr" => result.stderr}.each_pair do |name, value|
|
80
|
+
next unless value && value != ''
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
value.each_line do |line|
|
87
|
-
# remove control chars
|
88
|
-
case line.encoding
|
89
|
-
when Encoding::UTF_8
|
90
|
-
line = line.tr("\u0000-\u001f\u007f\u2028",'')
|
82
|
+
if value.bytesize > 1024 * 1024
|
83
|
+
Logger.public_send(method, "#{name} is suppressed because it's too large")
|
84
|
+
next
|
91
85
|
end
|
92
86
|
|
93
|
-
|
87
|
+
value.each_line do |line|
|
88
|
+
# remove control chars
|
89
|
+
case line.encoding
|
90
|
+
when Encoding::UTF_8
|
91
|
+
line = line.tr("\u0000-\u001f\u007f\u2028",'')
|
92
|
+
end
|
93
|
+
|
94
|
+
Logger.public_send(method, "#{name} | #{line}")
|
95
|
+
end
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
data/lib/itamae/logger.rb
CHANGED
@@ -6,23 +6,33 @@ module Itamae
|
|
6
6
|
module Logger
|
7
7
|
class Formatter
|
8
8
|
attr_accessor :colored
|
9
|
+
attr_accessor :depth
|
9
10
|
|
10
|
-
|
11
|
+
INDENT_LENGTH = 3
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
else
|
15
|
-
"%5s" % severity
|
16
|
-
end
|
13
|
+
def initialize(*args)
|
14
|
+
super
|
17
15
|
|
18
|
-
|
16
|
+
@depth = 0
|
19
17
|
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
def call(severity, datetime, progname, msg)
|
20
|
+
log = "%s : %s%s\n" % ["%5s" % severity, ' ' * INDENT_LENGTH * depth , msg2str(msg)]
|
21
|
+
if colored
|
22
|
+
color(log, severity)
|
23
|
+
else
|
24
|
+
log
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def indent
|
29
|
+
@depth += 1
|
30
|
+
yield
|
31
|
+
ensure
|
32
|
+
@depth -= 1
|
24
33
|
end
|
25
34
|
|
35
|
+
private
|
26
36
|
def msg2str(msg)
|
27
37
|
case msg
|
28
38
|
when ::String
|
@@ -64,6 +74,14 @@ module Itamae
|
|
64
74
|
def method_missing(method, *args, &block)
|
65
75
|
logger.public_send(method, *args, &block)
|
66
76
|
end
|
77
|
+
|
78
|
+
def depth
|
79
|
+
@depth || 0
|
80
|
+
end
|
81
|
+
|
82
|
+
def depth=(value)
|
83
|
+
@depth = value
|
84
|
+
end
|
67
85
|
end
|
68
86
|
end
|
69
87
|
end
|
data/lib/itamae/recipe.rb
CHANGED
@@ -25,15 +25,15 @@ module Itamae
|
|
25
25
|
def run(options = {})
|
26
26
|
Logger.info "Recipe: #{@path}"
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
notification
|
28
|
+
Logger.formatter.indent do
|
29
|
+
@children.run(options)
|
30
|
+
|
31
|
+
@delayed_notifications.uniq do |notification|
|
32
|
+
[notification.action, notification.action_resource]
|
33
|
+
end.each do |notification|
|
34
|
+
notification.run(options)
|
35
|
+
end
|
34
36
|
end
|
35
|
-
|
36
|
-
Logger.info "< Finished. (#{@path})"
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
@@ -56,7 +56,7 @@ module Itamae
|
|
56
56
|
target = candidate_paths.find {|path| File.exist?(path) }
|
57
57
|
|
58
58
|
unless target
|
59
|
-
raise NotFoundError, "
|
59
|
+
raise NotFoundError, "Recipe not found. (#{recipe})"
|
60
60
|
end
|
61
61
|
|
62
62
|
if runner.children.find_recipe_by_path(target)
|
data/lib/itamae/resource/base.rb
CHANGED
@@ -48,33 +48,36 @@ module Itamae
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def run(specific_action = nil, options = {})
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
attributes_without_action = attributes.dup.tap {|attr| attr.delete(:action) }
|
52
|
+
Logger.info "#{resource_type} (#{attributes_without_action})..."
|
53
|
+
|
54
|
+
Logger.formatter.indent do
|
55
|
+
if do_not_run_because_of_only_if?
|
56
|
+
Logger.info "Execution skipped because of only_if attribute"
|
57
|
+
return
|
58
|
+
elsif do_not_run_because_of_not_if?
|
59
|
+
Logger.info "Execution skipped because of not_if attribute"
|
60
|
+
return
|
61
|
+
end
|
60
62
|
|
61
|
-
|
63
|
+
pre_action
|
62
64
|
|
63
|
-
|
64
|
-
|
65
|
+
set_current_attributes
|
66
|
+
show_differences
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
|
68
|
+
unless options[:dry_run]
|
69
|
+
[action].flatten.each do |action|
|
70
|
+
Logger.info "action: #{action}"
|
71
|
+
Logger.formatter.indent do
|
72
|
+
public_send("#{specific_action || action}_action".to_sym, options)
|
73
|
+
end
|
74
|
+
end
|
69
75
|
end
|
70
|
-
end
|
71
|
-
|
72
|
-
updated! if different?
|
73
76
|
|
74
|
-
|
77
|
+
updated! if different?
|
75
78
|
|
76
|
-
|
77
|
-
|
79
|
+
notify(options) if updated?
|
80
|
+
end
|
78
81
|
rescue Backend::CommandExecutionError
|
79
82
|
Logger.error "Failed."
|
80
83
|
exit 2
|
@@ -132,11 +135,11 @@ module Itamae
|
|
132
135
|
if current_value.nil? && value.nil?
|
133
136
|
# ignore
|
134
137
|
elsif current_value.nil? && !value.nil?
|
135
|
-
Logger.info "
|
138
|
+
Logger.info "#{key} will be '#{value}'"
|
136
139
|
elsif current_value == value || value.nil?
|
137
|
-
Logger.
|
140
|
+
Logger.debug "#{key} will not change (current value is '#{current_value}')"
|
138
141
|
else
|
139
|
-
Logger.info "
|
142
|
+
Logger.info "#{key} will change from '#{current_value}' to '#{value}'"
|
140
143
|
end
|
141
144
|
end
|
142
145
|
end
|
@@ -162,7 +165,7 @@ module Itamae
|
|
162
165
|
end
|
163
166
|
|
164
167
|
def send_file(src, dst)
|
165
|
-
Logger.debug "
|
168
|
+
Logger.debug "Sending a file from '#{src}' to '#{dst}'..."
|
166
169
|
unless ::File.exist?(src)
|
167
170
|
raise Error, "The file '#{src}' doesn't exist."
|
168
171
|
end
|
@@ -227,7 +230,7 @@ module Itamae
|
|
227
230
|
|
228
231
|
def updated!
|
229
232
|
unless @updated
|
230
|
-
Logger.debug "
|
233
|
+
Logger.debug "This resource is updated."
|
231
234
|
end
|
232
235
|
@updated = true
|
233
236
|
end
|
data/lib/itamae/resource/file.rb
CHANGED
@@ -51,11 +51,11 @@ module Itamae
|
|
51
51
|
diff = run_command(["diff", "-u", path, @temppath], error: false)
|
52
52
|
if diff.exit_status == 0
|
53
53
|
# no change
|
54
|
-
Logger.
|
54
|
+
Logger.debug "file content will not change"
|
55
55
|
else
|
56
|
-
Logger.info "
|
56
|
+
Logger.info "diff:"
|
57
57
|
diff.stdout.each_line do |line|
|
58
|
-
Logger.info "
|
58
|
+
Logger.info "#{line.strip}"
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -78,8 +78,7 @@ module Itamae
|
|
78
78
|
|
79
79
|
def delete_action(options)
|
80
80
|
if run_specinfra(:check_file_is_file, path)
|
81
|
-
|
82
|
-
run_command(["rm", path])
|
81
|
+
run_specinfra(:remove_file, path)
|
83
82
|
end
|
84
83
|
end
|
85
84
|
end
|
data/lib/itamae/resource/link.rb
CHANGED
@@ -15,10 +15,10 @@ module Itamae
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def set_current_attributes
|
18
|
-
@current_attributes[:exist?] = (
|
18
|
+
@current_attributes[:exist?] = run_specinfra(:check_file_is_link, link)
|
19
19
|
|
20
20
|
if @current_attributes[:exist?]
|
21
|
-
@current_attributes[:to] =
|
21
|
+
@current_attributes[:to] = run_specinfra(:get_file_link_target, link).stdout.strip
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
data/lib/itamae/resource/user.rb
CHANGED
@@ -15,10 +15,9 @@ module Itamae
|
|
15
15
|
@current_attributes[:exist?] = exist?
|
16
16
|
|
17
17
|
if @current_attributes[:exist?]
|
18
|
-
|
19
|
-
@current_attributes[:
|
20
|
-
@current_attributes[:
|
21
|
-
@current_attributes[:home] = run_command("echo ~#{shell_escape(username)}").stdout.strip
|
18
|
+
@current_attributes[:uid] = run_specinfra(:get_user_uid, username).stdout.strip
|
19
|
+
@current_attributes[:gid] = run_specinfra(:get_user_gid, username).stdout.strip
|
20
|
+
@current_attributes[:home] = run_specinfra(:get_user_home_directory, username).stdout.strip
|
22
21
|
@current_attributes[:password] = current_password
|
23
22
|
end
|
24
23
|
end
|
@@ -26,32 +25,29 @@ module Itamae
|
|
26
25
|
def create_action(options)
|
27
26
|
if run_specinfra(:check_user_exists, username)
|
28
27
|
if uid && uid.to_s != @current_attributes[:uid]
|
29
|
-
|
30
|
-
run_command(["usermod", "-u", uid, username])
|
28
|
+
run_specinfra(:update_user_uid, username, uid)
|
31
29
|
updated!
|
32
30
|
end
|
33
31
|
|
34
32
|
if gid && gid.to_s != @current_attributes[:gid]
|
35
|
-
|
36
|
-
run_command(["usermod", "-g", gid, username])
|
33
|
+
run_specinfra(:update_user_gid, username, gid)
|
37
34
|
updated!
|
38
35
|
end
|
39
36
|
|
40
37
|
if password && password != current_password
|
41
|
-
|
42
|
-
run_command("echo #{shell_escape("#{username}:#{password}")} | chpasswd -e")
|
38
|
+
run_specinfra(:update_user_encrypted_password, username, password)
|
43
39
|
updated!
|
44
40
|
end
|
45
41
|
else
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
42
|
+
options = {
|
43
|
+
gid: gid,
|
44
|
+
home_directory: home,
|
45
|
+
password: password,
|
46
|
+
system_user: system_user,
|
47
|
+
uid: uid,
|
48
|
+
}
|
49
|
+
|
50
|
+
run_specinfra(:add_user, username, options)
|
55
51
|
|
56
52
|
updated!
|
57
53
|
end
|
@@ -63,11 +59,9 @@ module Itamae
|
|
63
59
|
end
|
64
60
|
|
65
61
|
def current_password
|
66
|
-
|
67
|
-
result
|
68
|
-
|
69
|
-
if result.exit_status == 0
|
70
|
-
result.stdout.split(":")[1]
|
62
|
+
result = run_specinfra(:get_user_encrypted_password, username)
|
63
|
+
if result.success?
|
64
|
+
result.stdout.strip
|
71
65
|
else
|
72
66
|
nil
|
73
67
|
end
|
data/lib/itamae/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.beta33
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: itamae
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta33
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryota Arai
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-08-
|
11
|
+
date: 2014-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 2.0.0.
|
33
|
+
version: 2.0.0.beta43
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 2.0.0.
|
40
|
+
version: 2.0.0.beta43
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: hashie
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|