wright 0.2.0 → 0.3.0
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/NEWS.md +8 -0
- data/README.md +2 -0
- data/Rakefile +6 -0
- data/bin/wright +6 -0
- data/lib/wright/cli.rb +68 -0
- data/lib/wright/dsl.rb +1 -1
- data/lib/wright/provider/directory.rb +17 -12
- data/lib/wright/provider/file.rb +24 -17
- data/lib/wright/provider/group/darwin_directory_service.rb +1 -8
- data/lib/wright/provider/group/gnu_passwd.rb +0 -1
- data/lib/wright/provider/group.rb +6 -12
- data/lib/wright/provider/package/apt.rb +9 -21
- data/lib/wright/provider/package/homebrew.rb +5 -18
- data/lib/wright/provider/package.rb +22 -11
- data/lib/wright/provider/symlink.rb +17 -22
- data/lib/wright/provider/user/darwin_directory_service.rb +65 -0
- data/lib/wright/provider/user/gnu_passwd.rb +6 -7
- data/lib/wright/provider/user.rb +6 -12
- data/lib/wright/provider.rb +20 -2
- data/lib/wright/resource/directory.rb +19 -20
- data/lib/wright/resource/file.rb +19 -15
- data/lib/wright/resource/symlink.rb +1 -0
- data/lib/wright/resource/user.rb +2 -1
- data/lib/wright/resource.rb +1 -1
- data/lib/wright/util/file_owner.rb +61 -0
- data/lib/wright/util/file_permissions.rb +21 -30
- data/lib/wright/util/stolen_from_activesupport.rb +1 -1
- data/lib/wright/util/user.rb +48 -23
- data/lib/wright/util.rb +10 -6
- data/lib/wright/version.rb +1 -1
- data/lib/wright.rb +1 -0
- data/man/wright.1 +202 -0
- data/spec/cli/shebang.rb +3 -0
- data/spec/cli_spec.rb +64 -0
- data/spec/dsl_spec.rb +8 -3
- data/spec/provider/group/darwin_directory_service_spec.rb +3 -2
- data/spec/provider/package/apt/apt-cache_policy_abcde.stdout +7 -0
- data/spec/provider/package/apt/apt-cache_policy_htop.stdout +6 -0
- data/spec/provider/package/apt/apt-cache_policy_not-a-real-package.return +1 -0
- data/spec/provider/package/apt_spec.rb +17 -211
- data/spec/provider/package/homebrew_spec.rb +11 -164
- data/spec/provider/package_spec.rb +151 -7
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-delete-user.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-full-name.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-home.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-password.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-primary-group.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-shell.stdout +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.return +1 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stderr +0 -0
- data/spec/provider/user/darwin_directory_service/dscl-new-user-uid.stdout +0 -0
- data/spec/provider/user/darwin_directory_service_spec.rb +167 -0
- data/spec/provider/user/gnu_passwd_spec.rb +5 -5
- data/spec/resource/directory_spec.rb +17 -15
- data/spec/resource/file_spec.rb +17 -15
- data/spec/resource_spec.rb +1 -1
- data/spec/spec_helpers/test_coverage.rb +1 -1
- data/spec/util/file_owner_spec.rb +36 -0
- data/spec/util/file_permissions_spec.rb +6 -6
- data/spec/util/user_spec.rb +0 -17
- data/spec/util_spec.rb +64 -5
- metadata +91 -41
- data/spec/provider/package/apt/dpkg-query_-s_abcde.stdout +0 -23
- data/spec/provider/package/apt/dpkg-query_-s_htop.stdout +0 -19
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.return +0 -1
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stderr +0 -3
- data/spec/provider/package/apt/dpkg-query_-s_vlc.return +0 -1
- data/spec/provider/package/apt/dpkg-query_-s_vlc.stderr +0 -3
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.return → dseditgroup_-o_create_-i_2_newgroup.return} +0 -0
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stderr → dseditgroup_-o_create_-i_2_newgroup.stderr} +0 -0
- /data/spec/provider/group/darwin_directory_service/{dseditgroup_-o_create_-i_499_newgroup.stdout → dseditgroup_-o_create_-i_2_newgroup.stdout} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_abcde.return → apt-cache_policy_abcde.return} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_abcde.stderr → apt-cache_policy_abcde.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_htop.return → apt-cache_policy_htop.return} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_htop.stderr → apt-cache_policy_htop.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_not-a-real-package.stdout → apt-cache_policy_not-a-real-package.stderr} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_vlc.stdout → apt-cache_policy_not-a-real-package.stdout} +0 -0
data/lib/wright/provider/user.rb
CHANGED
|
@@ -11,26 +11,20 @@ module Wright
|
|
|
11
11
|
#
|
|
12
12
|
# @return [void]
|
|
13
13
|
def create
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
user = @resource.name
|
|
15
|
+
unless_uptodate(:create, "user already created: '#{user}'") do
|
|
16
|
+
create_user
|
|
17
17
|
end
|
|
18
|
-
|
|
19
|
-
create_user
|
|
20
|
-
@updated = true
|
|
21
18
|
end
|
|
22
19
|
|
|
23
20
|
# Removes the user.
|
|
24
21
|
#
|
|
25
22
|
# @return [void]
|
|
26
23
|
def remove
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
user = @resource.name
|
|
25
|
+
unless_uptodate(:remove, "user already removed: '#{user}'") do
|
|
26
|
+
remove_user
|
|
30
27
|
end
|
|
31
|
-
|
|
32
|
-
remove_user
|
|
33
|
-
@updated = true
|
|
34
28
|
end
|
|
35
29
|
|
|
36
30
|
private
|
data/lib/wright/provider.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
|
|
1
3
|
require 'wright/config'
|
|
2
4
|
require 'wright/dry_run'
|
|
3
5
|
require 'wright/util/recursive_autoloader'
|
|
@@ -45,6 +47,22 @@ module Wright
|
|
|
45
47
|
end
|
|
46
48
|
end
|
|
47
49
|
|
|
50
|
+
# @api public
|
|
51
|
+
# Checks if the provider is up-to-date, runs a code block and sets
|
|
52
|
+
# `@updated` to `true` if it is not.
|
|
53
|
+
#
|
|
54
|
+
# @param action [String] the target action
|
|
55
|
+
# @param message [String] a log message that is displayed if the
|
|
56
|
+
# provider is up-to-date
|
|
57
|
+
def unless_uptodate(action, message)
|
|
58
|
+
if uptodate?(action)
|
|
59
|
+
Wright.log.debug message
|
|
60
|
+
else
|
|
61
|
+
yield
|
|
62
|
+
@updated = true
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
48
66
|
# @api public
|
|
49
67
|
# Runs a command or fails with an error message.
|
|
50
68
|
#
|
|
@@ -54,10 +72,10 @@ module Wright
|
|
|
54
72
|
# @param error_message [String] the error message to display in
|
|
55
73
|
# case of an error
|
|
56
74
|
# @raise [RuntimeError] if the command did not exit successfully
|
|
57
|
-
# @return [
|
|
75
|
+
# @return [String] the stdout output of the command
|
|
58
76
|
def exec_or_fail(command, args, error_message)
|
|
59
77
|
stdout, stderr, status = Open3.capture3(env, command, *args)
|
|
60
|
-
return if status.success?
|
|
78
|
+
return stdout if status.success?
|
|
61
79
|
|
|
62
80
|
error = stderr.chomp
|
|
63
81
|
error = stdout.chomp if error.empty?
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
1
3
|
require 'wright/resource'
|
|
2
4
|
require 'wright/dsl'
|
|
5
|
+
require 'wright/util/file_owner'
|
|
3
6
|
|
|
4
7
|
module Wright
|
|
5
8
|
class Resource
|
|
@@ -9,38 +12,34 @@ module Wright
|
|
|
9
12
|
# dir = Wright::Resource::Directory.new('/tmp/foobar')
|
|
10
13
|
# dir.create
|
|
11
14
|
class Directory < Wright::Resource
|
|
15
|
+
extend Forwardable
|
|
16
|
+
|
|
12
17
|
# Initializes a Directory.
|
|
13
18
|
#
|
|
14
19
|
# @param name [String] the directory's name
|
|
15
20
|
def initialize(name)
|
|
16
21
|
super
|
|
17
22
|
@mode = nil
|
|
18
|
-
@owner =
|
|
19
|
-
@group = nil
|
|
23
|
+
@owner = Wright::Util::FileOwner.new
|
|
20
24
|
@action = :create
|
|
21
25
|
end
|
|
22
26
|
|
|
23
|
-
# @return [String, Integer] the directory's mode
|
|
27
|
+
# @return [String, Integer] the directory's intended mode
|
|
24
28
|
attr_accessor :mode
|
|
25
29
|
|
|
26
|
-
#
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Wright::Util::User.owner_to_owner_group(owner)
|
|
33
|
-
@owner = target_owner unless target_owner.nil?
|
|
34
|
-
@group = target_group unless target_group.nil?
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# @return [String] the directory's group
|
|
38
|
-
attr_reader :group
|
|
30
|
+
# @!attribute owner
|
|
31
|
+
# @return [String, Integer] the directory's intended owner
|
|
32
|
+
# @!method owner=
|
|
33
|
+
# @see #owner
|
|
34
|
+
def_delegator :@owner, :user_and_group=, :owner=
|
|
35
|
+
def_delegator :@owner, :user, :owner
|
|
39
36
|
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
# @!attribute group
|
|
38
|
+
# @return [String, Integer] the directory's intended group
|
|
39
|
+
# @!method group=
|
|
40
|
+
# @see #group
|
|
41
|
+
def_delegator :@owner, :group
|
|
42
|
+
def_delegator :@owner, :group=
|
|
44
43
|
|
|
45
44
|
# Creates or updates the directory.
|
|
46
45
|
#
|
data/lib/wright/resource/file.rb
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
|
|
1
3
|
require 'wright/resource'
|
|
2
4
|
require 'wright/dsl'
|
|
5
|
+
require 'wright/util/file_owner'
|
|
3
6
|
|
|
4
7
|
module Wright
|
|
5
8
|
class Resource
|
|
@@ -10,17 +13,27 @@ module Wright
|
|
|
10
13
|
# file.content = 'bar'
|
|
11
14
|
# file.create
|
|
12
15
|
class File < Wright::Resource
|
|
16
|
+
extend Forwardable
|
|
17
|
+
|
|
13
18
|
# @return [String] the file's intended content
|
|
14
19
|
attr_accessor :content
|
|
15
20
|
|
|
16
|
-
# @return [String] the file's intended group
|
|
17
|
-
attr_accessor :group
|
|
18
|
-
|
|
19
21
|
# @return [String, Integer] the file's intended mode
|
|
20
22
|
attr_accessor :mode
|
|
21
23
|
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
+
# @!attribute owner
|
|
25
|
+
# @return [String, Integer] the directory's intended owner
|
|
26
|
+
# @!method owner=
|
|
27
|
+
# @see #owner
|
|
28
|
+
def_delegator :@owner, :user_and_group=, :owner=
|
|
29
|
+
def_delegator :@owner, :user, :owner
|
|
30
|
+
|
|
31
|
+
# @!attribute group
|
|
32
|
+
# @return [String, Integer] the directory's intended group
|
|
33
|
+
# @!method group=
|
|
34
|
+
# @see #group
|
|
35
|
+
def_delegator :@owner, :group=
|
|
36
|
+
def_delegator :@owner, :group
|
|
24
37
|
|
|
25
38
|
# Initializes a File.
|
|
26
39
|
#
|
|
@@ -29,19 +42,10 @@ module Wright
|
|
|
29
42
|
super
|
|
30
43
|
@content = nil
|
|
31
44
|
@mode = nil
|
|
32
|
-
@owner =
|
|
33
|
-
@group = nil
|
|
45
|
+
@owner = Wright::Util::FileOwner.new
|
|
34
46
|
@action = :create
|
|
35
47
|
end
|
|
36
48
|
|
|
37
|
-
# Sets the file's owner.
|
|
38
|
-
def owner=(owner)
|
|
39
|
-
target_owner, target_group =
|
|
40
|
-
Wright::Util::User.owner_to_owner_group(owner)
|
|
41
|
-
@owner = target_owner unless target_owner.nil?
|
|
42
|
-
@group = target_group unless target_group.nil?
|
|
43
|
-
end
|
|
44
|
-
|
|
45
49
|
# Creates or updates the file.
|
|
46
50
|
#
|
|
47
51
|
# @return [Bool] true if the file was updated and false
|
data/lib/wright/resource/user.rb
CHANGED
|
@@ -69,7 +69,8 @@ end
|
|
|
69
69
|
Wright::DSL.register_resource(Wright::Resource::User)
|
|
70
70
|
|
|
71
71
|
user_providers = {
|
|
72
|
-
'debian' => 'Wright::Provider::User::GnuPasswd'
|
|
72
|
+
'debian' => 'Wright::Provider::User::GnuPasswd',
|
|
73
|
+
'macosx' => 'Wright::Provider::User::DarwinDirectoryService'
|
|
73
74
|
}
|
|
74
75
|
Wright::Config[:resources][:user] ||= {}
|
|
75
76
|
Wright::Config[:resources][:user][:provider] ||=
|
data/lib/wright/resource.rb
CHANGED
|
@@ -125,7 +125,7 @@ module Wright
|
|
|
125
125
|
|
|
126
126
|
if Wright.dry_run?
|
|
127
127
|
resource = "#{@resource_name} '#{@name}'"
|
|
128
|
-
Wright.log.info "
|
|
128
|
+
Wright.log.info "(would) run update action for #{resource}"
|
|
129
129
|
else
|
|
130
130
|
@on_update.call
|
|
131
131
|
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Wright
|
|
2
|
+
module Util
|
|
3
|
+
# Helper class to support +user:group+ notation in file owner
|
|
4
|
+
# strings.
|
|
5
|
+
class FileOwner
|
|
6
|
+
# @return [String, Integer] the user's name or uid
|
|
7
|
+
attr_accessor :user
|
|
8
|
+
|
|
9
|
+
# @return [String, Integer] the group's name or gid
|
|
10
|
+
attr_accessor :group
|
|
11
|
+
|
|
12
|
+
# Sets user and group simultaneously.
|
|
13
|
+
#
|
|
14
|
+
# @param [String, Integer] user_and_group a user in +user:group+
|
|
15
|
+
# notation or a uid
|
|
16
|
+
#
|
|
17
|
+
# @example
|
|
18
|
+
# owner = FileOwner.new
|
|
19
|
+
#
|
|
20
|
+
# owner.user_and_group = 'user:group'
|
|
21
|
+
# owner.user
|
|
22
|
+
# # => "user"
|
|
23
|
+
# owner.group
|
|
24
|
+
# # => "group"
|
|
25
|
+
#
|
|
26
|
+
# owner.user_and_group = 'newuser'
|
|
27
|
+
# owner.user
|
|
28
|
+
# # => "newuser"
|
|
29
|
+
# owner.group
|
|
30
|
+
# # => "group"
|
|
31
|
+
#
|
|
32
|
+
# owner.user_and_group = 42
|
|
33
|
+
# owner.user
|
|
34
|
+
# # => 42
|
|
35
|
+
#
|
|
36
|
+
# @return [void]
|
|
37
|
+
# @raise [ArgumentError] if the owner string contains more than
|
|
38
|
+
# one colon
|
|
39
|
+
def user_and_group=(user_and_group)
|
|
40
|
+
user, group = split_user_and_group(user_and_group)
|
|
41
|
+
@user = user
|
|
42
|
+
@group = group if group
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
def split_user_and_group(user_and_group)
|
|
48
|
+
user = user_and_group
|
|
49
|
+
group = nil
|
|
50
|
+
return [user, group] unless user_and_group.is_a?(String)
|
|
51
|
+
|
|
52
|
+
if user_and_group.count(':') > 1
|
|
53
|
+
fail ArgumentError, "Invalid owner: '#{user_and_group}'"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
user, group = user_and_group.split(':')
|
|
57
|
+
[user, group]
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -14,26 +14,27 @@ module Wright
|
|
|
14
14
|
#
|
|
15
15
|
# @return [Wright::Util::FilePermissions] the FilePermissions
|
|
16
16
|
# object
|
|
17
|
+
# @raise [ArgumentError] if the user or group are invalid
|
|
17
18
|
def self.create_from_resource(resource, filetype)
|
|
18
19
|
filepath = ::File.expand_path(resource.name)
|
|
19
20
|
p = Wright::Util::FilePermissions.new(filepath, filetype)
|
|
20
|
-
p.
|
|
21
|
-
p.
|
|
21
|
+
p.uid = Wright::Util::User.user_to_uid(resource.owner)
|
|
22
|
+
p.gid = Wright::Util::User.group_to_gid(resource.group)
|
|
22
23
|
p.mode = resource.mode
|
|
23
24
|
p
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
# @return [String] the
|
|
27
|
+
# @return [String] the filename
|
|
27
28
|
attr_accessor :filename
|
|
28
29
|
|
|
29
|
-
# @return [Integer] the file's
|
|
30
|
-
|
|
30
|
+
# @return [Integer] the file's intended uid
|
|
31
|
+
attr_accessor :uid
|
|
31
32
|
|
|
32
|
-
# @return [Integer] the file's
|
|
33
|
-
|
|
33
|
+
# @return [Integer] the file's intended gid
|
|
34
|
+
attr_accessor :gid
|
|
34
35
|
|
|
35
|
-
# @return [Integer] the file's
|
|
36
|
-
attr_reader :
|
|
36
|
+
# @return [Integer] the file's intended mode
|
|
37
|
+
attr_reader :mode
|
|
37
38
|
|
|
38
39
|
VALID_FILETYPES = [:file, :directory]
|
|
39
40
|
private_constant :VALID_FILETYPES
|
|
@@ -50,17 +51,7 @@ module Wright
|
|
|
50
51
|
@filetype = filetype
|
|
51
52
|
end
|
|
52
53
|
|
|
53
|
-
#
|
|
54
|
-
def owner=(owner)
|
|
55
|
-
@owner = Util::User.user_to_uid(owner)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Sets the file's group
|
|
59
|
-
def group=(group)
|
|
60
|
-
@group = Util::User.group_to_gid(group)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Sets the file's mode
|
|
54
|
+
# @return [Integer] the file's target mode
|
|
64
55
|
def mode=(mode)
|
|
65
56
|
if mode.nil?
|
|
66
57
|
@mode = nil
|
|
@@ -75,23 +66,23 @@ module Wright
|
|
|
75
66
|
@mode = mode_i
|
|
76
67
|
end
|
|
77
68
|
|
|
78
|
-
# Checks if the file's
|
|
69
|
+
# Checks if the file's uid, gid and mode are up-to-date
|
|
79
70
|
# @return [Bool] +true+ if the file is up to date, +false+
|
|
80
71
|
# otherwise
|
|
81
72
|
def uptodate?
|
|
82
73
|
if ::File.exist?(@filename)
|
|
83
|
-
|
|
74
|
+
uid_uptodate? && gid_uptodate? && mode_uptodate?
|
|
84
75
|
else
|
|
85
76
|
false
|
|
86
77
|
end
|
|
87
78
|
end
|
|
88
79
|
|
|
89
|
-
# Updates the file's
|
|
80
|
+
# Updates the file's uid, gid and mode.
|
|
90
81
|
#
|
|
91
82
|
# @return [void]
|
|
92
83
|
def update
|
|
93
84
|
::File.chmod(@mode, @filename) if @mode
|
|
94
|
-
::File.chown(@
|
|
85
|
+
::File.chown(@uid, @gid, @filename) if @uid || @gid
|
|
95
86
|
end
|
|
96
87
|
|
|
97
88
|
# @return [Integer] the file's current mode
|
|
@@ -100,23 +91,23 @@ module Wright
|
|
|
100
91
|
end
|
|
101
92
|
|
|
102
93
|
# @return [Integer] the file's current owner's uid
|
|
103
|
-
def
|
|
94
|
+
def current_uid
|
|
104
95
|
Wright::Util::File.file_owner(@filename)
|
|
105
96
|
end
|
|
106
97
|
|
|
107
98
|
# @return [Integer] the file's current group's gid
|
|
108
|
-
def
|
|
99
|
+
def current_gid
|
|
109
100
|
Wright::Util::File.file_group(@filename)
|
|
110
101
|
end
|
|
111
102
|
|
|
112
103
|
private
|
|
113
104
|
|
|
114
|
-
def
|
|
115
|
-
@
|
|
105
|
+
def uid_uptodate?
|
|
106
|
+
@uid.nil? || current_uid == @uid
|
|
116
107
|
end
|
|
117
108
|
|
|
118
|
-
def
|
|
119
|
-
@
|
|
109
|
+
def gid_uptodate?
|
|
110
|
+
@gid.nil? || current_gid == @gid
|
|
120
111
|
end
|
|
121
112
|
|
|
122
113
|
def mode_uptodate?
|
|
@@ -85,7 +85,7 @@ module Wright
|
|
|
85
85
|
# @return [String] the camelized string
|
|
86
86
|
def self.camelize(s)
|
|
87
87
|
s.to_s
|
|
88
|
-
.gsub(
|
|
88
|
+
.gsub(%r{/(.?)}) { "::#{Regexp.last_match[1].upcase}" }
|
|
89
89
|
.gsub(/(?:^|_)(.)/) { Regexp.last_match[1].upcase }
|
|
90
90
|
end
|
|
91
91
|
|
data/lib/wright/util/user.rb
CHANGED
|
@@ -18,8 +18,7 @@ module Wright
|
|
|
18
18
|
# @return [Integer] the integer uid of the given user or nil if
|
|
19
19
|
# user was nil
|
|
20
20
|
def self.user_to_uid(user)
|
|
21
|
-
|
|
22
|
-
user.is_a?(String) ? Etc.getpwnam(user).uid : user.to_i
|
|
21
|
+
to_id(user, :user)
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
# Returns a group's gid.
|
|
@@ -36,37 +35,63 @@ module Wright
|
|
|
36
35
|
# @return [Integer] the integer gid of the given group or nil if
|
|
37
36
|
# group was nil
|
|
38
37
|
def self.group_to_gid(group)
|
|
39
|
-
|
|
40
|
-
group.is_a?(String) ? Etc.getgrnam(group).gid : group.to_i
|
|
38
|
+
to_id(group, :group)
|
|
41
39
|
end
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
def self.to_id(object, type)
|
|
42
|
+
fail ArgumentError unless [:group, :user].include?(type)
|
|
43
|
+
return nil if object.nil?
|
|
44
|
+
return object.to_i unless object.is_a?(String)
|
|
45
|
+
type == :user ? Etc.getpwnam(object).uid : Etc.getgrnam(object).gid
|
|
46
|
+
end
|
|
47
|
+
private_class_method :to_id
|
|
48
|
+
|
|
49
|
+
# Returns the the next free uid in a range.
|
|
44
50
|
#
|
|
45
|
-
# @param
|
|
51
|
+
# @param uid_range [Range] the uid range
|
|
46
52
|
#
|
|
47
53
|
# @example
|
|
48
|
-
# Wright::Util::User.
|
|
49
|
-
# # =>
|
|
54
|
+
# Wright::Util::User.next_free_uid(1...500)
|
|
55
|
+
# # => 2
|
|
50
56
|
#
|
|
51
|
-
#
|
|
52
|
-
#
|
|
57
|
+
# @return [Integer] the next free uid
|
|
58
|
+
# @raise [RuntimeError] if there are no free uids in the range
|
|
59
|
+
def self.next_free_uid(uid_range)
|
|
60
|
+
next_free_id(uid_range, :uid)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Returns the the next free gid in a range.
|
|
53
64
|
#
|
|
54
|
-
#
|
|
55
|
-
# # => [23, nil]
|
|
65
|
+
# @param gid_range [Range] the gid range
|
|
56
66
|
#
|
|
57
|
-
# @
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
# @example
|
|
68
|
+
# Wright::Util::User.next_free_gid(1...500)
|
|
69
|
+
# # => 11
|
|
70
|
+
#
|
|
71
|
+
# @return [Integer] the next free gid
|
|
72
|
+
# @raise [RuntimeError] if there are no free gids in the range
|
|
73
|
+
def self.next_free_gid(gid_range)
|
|
74
|
+
next_free_id(gid_range, :gid)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def self.next_free_id(id_range, id_type)
|
|
78
|
+
iterator = id_iterator(id_type)
|
|
79
|
+
used_ids = []
|
|
80
|
+
iterator.call do |o|
|
|
81
|
+
id = o.method(id_type).call
|
|
82
|
+
used_ids << id if id_range.include?(id)
|
|
83
|
+
end
|
|
84
|
+
free_ids = id_range.to_a - used_ids
|
|
85
|
+
fail "No free #{id_type} in range #{id_range}" if free_ids.empty?
|
|
86
|
+
free_ids.min
|
|
87
|
+
end
|
|
88
|
+
private_class_method(:next_free_id)
|
|
65
89
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
90
|
+
def self.id_iterator(id_type)
|
|
91
|
+
fail ArgumentError unless [:uid, :gid].include?(id_type)
|
|
92
|
+
id_type == :uid ? Etc.method(:passwd) : Etc.method(:group)
|
|
69
93
|
end
|
|
94
|
+
private_class_method :id_iterator
|
|
70
95
|
end
|
|
71
96
|
end
|
|
72
97
|
end
|
data/lib/wright/util.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
require 'wright/util/stolen_from_activesupport'
|
|
2
|
-
require 'open3'
|
|
3
2
|
|
|
4
3
|
module Wright
|
|
5
4
|
# @api private
|
|
@@ -43,9 +42,10 @@ module Wright
|
|
|
43
42
|
return default unless ::File.exist?(release_file)
|
|
44
43
|
|
|
45
44
|
os_release = ::File.read(release_file)
|
|
46
|
-
/^ID_LIKE=(?<id_like
|
|
47
|
-
/^ID=(?<id
|
|
48
|
-
id_like
|
|
45
|
+
/^ID_LIKE="?(?<id_like>[^"]*)"?$/ =~ os_release
|
|
46
|
+
/^ID="?(?<id>[^"]*)"?$/ =~ os_release
|
|
47
|
+
return id_like.split(' ').first if id_like
|
|
48
|
+
id || default
|
|
49
49
|
end
|
|
50
50
|
private_class_method :distro
|
|
51
51
|
|
|
@@ -72,7 +72,12 @@ module Wright
|
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
#
|
|
75
|
+
# Runs a code block in a clean bundler environment.
|
|
76
|
+
#
|
|
77
|
+
# @example
|
|
78
|
+
# Wright::Util.bundler_clean_env { `brew search /^git$/` }
|
|
79
|
+
# # => "git\n"
|
|
80
|
+
# @return [Object] the return value of the code block
|
|
76
81
|
def self.bundler_clean_env
|
|
77
82
|
if defined?(Bundler)
|
|
78
83
|
Bundler.with_clean_env { yield }
|
|
@@ -80,6 +85,5 @@ module Wright
|
|
|
80
85
|
yield
|
|
81
86
|
end
|
|
82
87
|
end
|
|
83
|
-
# :nocov:
|
|
84
88
|
end
|
|
85
89
|
end
|
data/lib/wright/version.rb
CHANGED