wright 0.3.2 → 0.4.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 +7 -0
- data/README.md +60 -54
- data/lib/wright/cli.rb +44 -18
- data/lib/wright/dry_run.rb +7 -0
- data/lib/wright/provider/directory.rb +26 -30
- data/lib/wright/provider/file.rb +34 -34
- data/lib/wright/provider/group/darwin_directory_service.rb +8 -7
- data/lib/wright/provider/group/gnu_passwd.rb +5 -5
- data/lib/wright/provider/group.rb +53 -36
- data/lib/wright/provider/package/apt.rb +32 -8
- data/lib/wright/provider/package/homebrew.rb +6 -5
- data/lib/wright/provider/package/yum.rb +39 -0
- data/lib/wright/provider/package.rb +30 -16
- data/lib/wright/provider/symlink.rb +32 -33
- data/lib/wright/provider/user/darwin_directory_service.rb +14 -17
- data/lib/wright/provider/user/gnu_passwd.rb +20 -21
- data/lib/wright/provider/user.rb +58 -41
- data/lib/wright/resource/group.rb +1 -0
- data/lib/wright/resource/package.rb +16 -3
- data/lib/wright/resource/user.rb +1 -0
- data/lib/wright/resource.rb +4 -2
- data/lib/wright/util/user.rb +34 -2
- data/lib/wright/version.rb +1 -1
- data/man/wright.1 +15 -11
- data/spec/cli_spec.rb +18 -0
- data/spec/provider/group/darwin_directory_service_spec.rb +76 -220
- data/spec/provider/group/gnu_passwd_spec.rb +36 -189
- data/spec/provider/group_spec.rb +180 -27
- data/spec/provider/package/apt/apt-cache_policy_dmenu.return +1 -0
- data/spec/provider/package/apt/apt-cache_policy_dmenu.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_policy_dmenu.stdout +4 -0
- data/spec/provider/package/apt/apt-cache_policy_htop.stdout +3 -3
- data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.return +1 -0
- data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_policy_linux-image-3.2.0-4-amd64.stdout +6 -0
- data/spec/provider/package/apt/apt-cache_policy_linux-image.return +1 -0
- data/spec/provider/package/apt/apt-cache_policy_linux-image.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_policy_linux-image.stdout +4 -0
- data/spec/provider/package/apt/apt-cache_policy_suckless-tools.return +1 -0
- data/spec/provider/package/apt/apt-cache_policy_suckless-tools.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_policy_suckless-tools.stdout +6 -0
- data/spec/provider/package/apt/apt-cache_showpkg_dmenu.return +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_dmenu.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_showpkg_dmenu.stdout +9 -0
- data/spec/provider/package/apt/apt-cache_showpkg_htop.return +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_htop.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_showpkg_htop.stdout +20 -0
- data/spec/provider/package/apt/apt-cache_showpkg_linux-image.return +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_linux-image.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_showpkg_linux-image.stdout +11 -0
- data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.return +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_showpkg_not-a-real-package.stdout +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.return +1 -0
- data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.stderr +0 -0
- data/spec/provider/package/apt/apt-cache_showpkg_suckless-tools.stdout +26 -0
- data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.return +1 -0
- data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.stderr +0 -0
- data/spec/provider/package/apt/apt-get_--purge_remove_-qy_abcde.stdout +15 -0
- data/spec/provider/package/apt_spec.rb +82 -14
- data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.return +1 -0
- data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.stderr +0 -0
- data/spec/provider/package/homebrew/brew_install_--with-default-names_gnu-units.stdout +7 -0
- data/spec/provider/package/homebrew/brew_uninstall_--force_lame.return +1 -0
- data/spec/provider/package/homebrew/brew_uninstall_--force_lame.stderr +0 -0
- data/spec/provider/package/homebrew/brew_uninstall_--force_lame.stdout +1 -0
- data/spec/provider/package/homebrew_spec.rb +33 -6
- data/spec/provider/package/yum/rpm_-q_httpd.return +1 -0
- data/spec/provider/package/yum/rpm_-q_httpd.stderr +0 -0
- data/spec/provider/package/yum/rpm_-q_httpd.stdout +1 -0
- data/spec/provider/package/yum/rpm_-q_zsh.return +1 -0
- data/spec/provider/package/yum/rpm_-q_zsh.stderr +0 -0
- data/spec/provider/package/yum/rpm_-q_zsh.stdout +1 -0
- data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.return +1 -0
- data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.stderr +0 -0
- data/spec/provider/package/yum/yum_install_-y_mc-4.8.7-8.el7.stdout +37 -0
- data/spec/provider/package/yum/yum_install_-y_nano.return +1 -0
- data/spec/provider/package/yum/yum_install_-y_nano.stderr +0 -0
- data/spec/provider/package/yum/yum_install_-y_nano.stdout +36 -0
- data/spec/provider/package/yum/yum_install_-y_not-a-real-package.return +1 -0
- data/spec/provider/package/yum/yum_install_-y_not-a-real-package.stderr +1 -0
- data/spec/provider/package/yum/yum_install_-y_not-a-real-package.stdout +6 -0
- data/spec/provider/package/yum/yum_install_with_options.return +1 -0
- data/spec/provider/package/yum/yum_install_with_options.stderr +0 -0
- data/spec/provider/package/yum/yum_install_with_options.stdout +53 -0
- data/spec/provider/package/yum/yum_remove_-y_screen.return +1 -0
- data/spec/provider/package/yum/yum_remove_-y_screen.stderr +0 -0
- data/spec/provider/package/yum/yum_remove_-y_screen.stdout +31 -0
- data/spec/provider/package/yum/yum_remove_with_options.return +1 -0
- data/spec/provider/package/yum/yum_remove_with_options.stderr +0 -0
- data/spec/provider/package/yum/yum_remove_with_options.stdout +30 -0
- data/spec/provider/package/yum_spec.rb +130 -0
- data/spec/provider/user/darwin_directory_service_spec.rb +12 -10
- data/spec/provider/user/gnu_passwd_spec.rb +9 -9
- data/spec/provider/user_spec.rb +26 -18
- data/spec/resource/package_spec.rb +8 -0
- data/spec/resource_spec.rb +17 -9
- metadata +153 -16
|
@@ -6,13 +6,15 @@ module Wright
|
|
|
6
6
|
# Group provider. Used as a base class for {Resource::Group}
|
|
7
7
|
# providers.
|
|
8
8
|
class Group < Wright::Provider
|
|
9
|
-
#
|
|
9
|
+
# Creates or updates the group.
|
|
10
10
|
#
|
|
11
11
|
# @return [void]
|
|
12
12
|
def create
|
|
13
|
-
group
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
unless_uptodate(:create, "group already created: '#{group_name}'") do
|
|
14
|
+
unless_dry_run("create group: '#{group_name}'") do
|
|
15
|
+
ensure_group_exists
|
|
16
|
+
set_members unless members_uptodate?
|
|
17
|
+
end
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
|
|
@@ -20,14 +22,39 @@ module Wright
|
|
|
20
22
|
#
|
|
21
23
|
# @return [void]
|
|
22
24
|
def remove
|
|
23
|
-
group
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
unless_uptodate(:remove, "group already removed: '#{group_name}'") do
|
|
26
|
+
unless_dry_run("remove group: '#{group_name}'") do
|
|
27
|
+
remove_group
|
|
28
|
+
end
|
|
26
29
|
end
|
|
27
30
|
end
|
|
28
31
|
|
|
29
32
|
private
|
|
30
33
|
|
|
34
|
+
def group_name
|
|
35
|
+
@resource.name
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def gid
|
|
39
|
+
@resource.gid
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def members
|
|
43
|
+
@resource.members
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def system_group?
|
|
47
|
+
@resource.system
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def ensure_group_exists
|
|
51
|
+
if group_exists?
|
|
52
|
+
set_gid unless gid_uptodate?
|
|
53
|
+
else
|
|
54
|
+
create_group
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
31
58
|
# @api public
|
|
32
59
|
# Checks if the group is up-to-date for a given action.
|
|
33
60
|
#
|
|
@@ -48,37 +75,16 @@ module Wright
|
|
|
48
75
|
end
|
|
49
76
|
end
|
|
50
77
|
|
|
51
|
-
def create_group
|
|
52
|
-
group = @resource.name
|
|
53
|
-
unless_dry_run("create group: '#{group}'") do
|
|
54
|
-
if group_exists?
|
|
55
|
-
set_gid(group, @resource.gid) unless gid_uptodate?
|
|
56
|
-
else
|
|
57
|
-
add_group(group, @resource.gid, @resource.system)
|
|
58
|
-
end
|
|
59
|
-
set_members(group, @resource.members) unless members_uptodate?
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def remove_group
|
|
64
|
-
group = @resource.name
|
|
65
|
-
unless_dry_run("remove group: '#{group}'") do
|
|
66
|
-
delete_group(group)
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
78
|
def group_data
|
|
71
|
-
|
|
72
|
-
rescue ArgumentError
|
|
73
|
-
nil
|
|
79
|
+
Wright::Util::User.safe_getgrnam(group_name)
|
|
74
80
|
end
|
|
75
81
|
|
|
76
82
|
def gid_uptodate?
|
|
77
|
-
|
|
83
|
+
gid.nil? || group_data.gid == gid
|
|
78
84
|
end
|
|
79
85
|
|
|
80
86
|
def members_uptodate?
|
|
81
|
-
|
|
87
|
+
members.nil? || group_data.mem == members
|
|
82
88
|
end
|
|
83
89
|
|
|
84
90
|
def group_exists?
|
|
@@ -86,11 +92,22 @@ module Wright
|
|
|
86
92
|
end
|
|
87
93
|
|
|
88
94
|
def set_members
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
new_members = members - group_data.mem
|
|
96
|
+
unwanted_members = group_data.mem - members
|
|
97
|
+
new_members.each { |m| add_member(m, group_name) }
|
|
98
|
+
unwanted_members.each { |m| remove_member(m, group_name) }
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def create_group
|
|
102
|
+
fail NotImplementedError
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def remove_group
|
|
106
|
+
fail NotImplementedError
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def set_gid
|
|
110
|
+
fail NotImplementedError
|
|
94
111
|
end
|
|
95
112
|
|
|
96
113
|
def add_member(_member, _group)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'ostruct'
|
|
2
|
+
|
|
1
3
|
require 'wright/provider'
|
|
2
4
|
require 'wright/provider/package'
|
|
3
5
|
|
|
@@ -9,33 +11,55 @@ module Wright
|
|
|
9
11
|
class Apt < Wright::Provider::Package
|
|
10
12
|
# @return [Array<String>] the installed package versions
|
|
11
13
|
def installed_versions
|
|
12
|
-
package =
|
|
13
|
-
err = "Cannot determine installed versions for
|
|
14
|
-
apt_policy = exec_or_fail('apt-cache', ['policy',
|
|
14
|
+
package = "package '#{package_name}'"
|
|
15
|
+
err = "Cannot determine installed versions for #{package}"
|
|
16
|
+
apt_policy = exec_or_fail('apt-cache', ['policy', package_name], err)
|
|
15
17
|
|
|
16
18
|
version_re = /(?!\(none\)).*/
|
|
17
19
|
installed_re = /^ Installed: (?<version>#{version_re})$/
|
|
18
20
|
match = installed_re.match(apt_policy)
|
|
19
|
-
match ? [match['version']] :
|
|
21
|
+
match ? [match['version']] : virtual_package_versions
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
private
|
|
23
25
|
|
|
24
26
|
def install_package
|
|
25
|
-
apt_get(:install,
|
|
27
|
+
apt_get(:install, package_options, package_name, package_version)
|
|
26
28
|
end
|
|
27
29
|
|
|
28
30
|
def remove_package
|
|
29
|
-
apt_get(:remove,
|
|
31
|
+
apt_get(:remove, package_options, package_name)
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
def apt_get(action, package, version = nil)
|
|
34
|
+
def apt_get(action, options, package, version = nil)
|
|
33
35
|
package_version = version.nil? ? '' : "=#{version}"
|
|
34
36
|
cmd = 'apt-get'
|
|
35
|
-
args = [action.to_s, '-qy', package + package_version]
|
|
37
|
+
args = [*options, action.to_s, '-qy', package + package_version]
|
|
36
38
|
exec_or_fail(cmd, args, "cannot #{action} package '#{package}'")
|
|
37
39
|
end
|
|
38
40
|
|
|
41
|
+
def virtual_package_versions
|
|
42
|
+
virtual_package_installed? ? ['virtual'] : []
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @todo replace the OpenStruct hack below by a direct
|
|
46
|
+
# instantiation of {Wright::Resource::Package} as soon as
|
|
47
|
+
# the resource-provider mapping can be changed more easily
|
|
48
|
+
def virtual_package_installed?
|
|
49
|
+
reverse_provides.any? do |name, version|
|
|
50
|
+
resource = OpenStruct.new(name: name, version: version)
|
|
51
|
+
package = Wright::Provider::Package::Apt.new(resource)
|
|
52
|
+
package.installed?
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def reverse_provides
|
|
57
|
+
err = 'Error executing apt-cache'
|
|
58
|
+
showpkg = exec_or_fail('apt-cache', ['showpkg', package_name], err)
|
|
59
|
+
packages = showpkg.partition("Reverse Provides: \n").last.split("\n")
|
|
60
|
+
Hash[packages.map { |p| p.split(' ', 2) }]
|
|
61
|
+
end
|
|
62
|
+
|
|
39
63
|
def env
|
|
40
64
|
{ 'DEBIAN_FRONTEND' => 'noninteractive' }
|
|
41
65
|
end
|
|
@@ -13,7 +13,7 @@ module Wright
|
|
|
13
13
|
# @return [Array<String>] the installed package versions
|
|
14
14
|
def installed_versions
|
|
15
15
|
cmd = 'brew'
|
|
16
|
-
args = ['info', '--json=v1',
|
|
16
|
+
args = ['info', '--json=v1', package_name]
|
|
17
17
|
cmd_stdout, _, cmd_status = Wright::Util.bundler_clean_env do
|
|
18
18
|
Open3.capture3(env, cmd, *args)
|
|
19
19
|
end
|
|
@@ -28,11 +28,11 @@ module Wright
|
|
|
28
28
|
private
|
|
29
29
|
|
|
30
30
|
def install_package
|
|
31
|
-
brew(:install,
|
|
31
|
+
brew(:install, package_name, package_version)
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def remove_package
|
|
35
|
-
brew(:uninstall,
|
|
35
|
+
brew(:uninstall, package_name)
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def brew(action, package, version = nil)
|
|
@@ -40,13 +40,14 @@ module Wright
|
|
|
40
40
|
|
|
41
41
|
Wright::Util.bundler_clean_env do
|
|
42
42
|
error_message = "cannot #{action} package '#{package}'"
|
|
43
|
-
|
|
43
|
+
args = [action.to_s, *package_options, package]
|
|
44
|
+
exec_or_fail('brew', args, error_message)
|
|
44
45
|
end
|
|
45
46
|
end
|
|
46
47
|
|
|
47
48
|
def ignore_version(version)
|
|
48
49
|
return unless version
|
|
49
|
-
package_info = "#{
|
|
50
|
+
package_info = "#{package_name} (#{version})"
|
|
50
51
|
Wright.log.warn "ignoring package version: '#{package_info}'"
|
|
51
52
|
end
|
|
52
53
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'open3'
|
|
2
|
+
|
|
3
|
+
require 'wright/provider'
|
|
4
|
+
require 'wright/provider/package'
|
|
5
|
+
|
|
6
|
+
module Wright
|
|
7
|
+
class Provider
|
|
8
|
+
class Package
|
|
9
|
+
# Yum package provider. Used as a provider for
|
|
10
|
+
# {Resource::Package} on Fedora-based systems.
|
|
11
|
+
class Yum < Wright::Provider::Package
|
|
12
|
+
# @return [Array<String>] the installed package versions
|
|
13
|
+
def installed_versions
|
|
14
|
+
version_format = '%{VERSION}-%{RELEASE}'
|
|
15
|
+
rpm_args = %W(-q #{package_name} --qf #{version_format})
|
|
16
|
+
stdout, _, status = Open3.capture3(env, 'rpm', *rpm_args)
|
|
17
|
+
status.success? ? [stdout] : []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def install_package
|
|
23
|
+
yum(:install, package_options, package_name, package_version)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def remove_package
|
|
27
|
+
yum(:remove, package_options, package_name)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def yum(action, options, package, version = nil)
|
|
31
|
+
cmd = 'yum'
|
|
32
|
+
package_version = version.nil? ? '' : "-#{version}"
|
|
33
|
+
args = [*options, action.to_s, '-y', package + package_version]
|
|
34
|
+
exec_or_fail(cmd, args, "cannot #{action} package '#{package}'")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -9,9 +9,9 @@ module Wright
|
|
|
9
9
|
#
|
|
10
10
|
# @return [void]
|
|
11
11
|
def install
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
unless_dry_run("install package: '#{
|
|
12
|
+
unless_uptodate(:install,
|
|
13
|
+
"package already installed: '#{package_name}'") do
|
|
14
|
+
unless_dry_run("install package: '#{package_name}'") do
|
|
15
15
|
install_package
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -21,9 +21,9 @@ module Wright
|
|
|
21
21
|
#
|
|
22
22
|
# @return [void]
|
|
23
23
|
def remove
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
unless_dry_run("remove package: '#{
|
|
24
|
+
unless_uptodate(:remove,
|
|
25
|
+
"package already removed: '#{package_name}'") do
|
|
26
|
+
unless_dry_run("remove package: '#{package_name}'") do
|
|
27
27
|
remove_package
|
|
28
28
|
end
|
|
29
29
|
end
|
|
@@ -34,8 +34,30 @@ module Wright
|
|
|
34
34
|
fail NotImplementedError
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
+
# @return [Bool] true if the package is installed, false
|
|
38
|
+
# otherwise
|
|
39
|
+
def installed?
|
|
40
|
+
if package_version
|
|
41
|
+
installed_versions.include?(package_version)
|
|
42
|
+
else
|
|
43
|
+
!installed_versions.empty?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
37
47
|
private
|
|
38
48
|
|
|
49
|
+
def package_name
|
|
50
|
+
@resource.name
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def package_version
|
|
54
|
+
@resource.version
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def package_options
|
|
58
|
+
@resource.options
|
|
59
|
+
end
|
|
60
|
+
|
|
39
61
|
# @api public
|
|
40
62
|
# Checks if the package is up-to-date for a given action.
|
|
41
63
|
#
|
|
@@ -48,22 +70,14 @@ module Wright
|
|
|
48
70
|
def uptodate?(action)
|
|
49
71
|
case action
|
|
50
72
|
when :install
|
|
51
|
-
|
|
73
|
+
installed?
|
|
52
74
|
when :remove
|
|
53
|
-
!
|
|
75
|
+
!installed?
|
|
54
76
|
else
|
|
55
77
|
fail ArgumentError, "invalid action '#{action}'"
|
|
56
78
|
end
|
|
57
79
|
end
|
|
58
80
|
|
|
59
|
-
def package_installed?
|
|
60
|
-
if @resource.version
|
|
61
|
-
installed_versions.include?(@resource.version)
|
|
62
|
-
else
|
|
63
|
-
!installed_versions.empty?
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
81
|
def install_package
|
|
68
82
|
fail NotImplementedError
|
|
69
83
|
end
|
|
@@ -10,11 +10,13 @@ module Wright
|
|
|
10
10
|
#
|
|
11
11
|
# @return [void]
|
|
12
12
|
def create
|
|
13
|
-
fail Errno::EEXIST,
|
|
13
|
+
fail Errno::EEXIST, link_name_expanded if regular_file?
|
|
14
14
|
|
|
15
|
-
symlink = symlink_to_s
|
|
15
|
+
symlink = symlink_to_s
|
|
16
16
|
unless_uptodate(:create, "symlink already created: #{symlink}") do
|
|
17
|
-
|
|
17
|
+
unless_dry_run("create symlink: #{symlink}") do
|
|
18
|
+
Wright::Util::File.ln_sfn(link_to_expanded, link_name_expanded)
|
|
19
|
+
end
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
22
|
|
|
@@ -22,54 +24,51 @@ module Wright
|
|
|
22
24
|
#
|
|
23
25
|
# @return [void]
|
|
24
26
|
def remove
|
|
25
|
-
fail "'#{
|
|
27
|
+
fail "'#{link_name_expanded}' is not a symlink" if regular_file?
|
|
26
28
|
|
|
27
|
-
symlink
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
unless_uptodate(:remove, "symlink already removed: '#{link_name}'") do
|
|
30
|
+
unless_dry_run("remove symlink: '#{link_name}'") do
|
|
31
|
+
FileUtils.rm(link_name_expanded)
|
|
32
|
+
end
|
|
30
33
|
end
|
|
31
34
|
end
|
|
32
35
|
|
|
33
36
|
private
|
|
34
37
|
|
|
35
|
-
def
|
|
36
|
-
|
|
37
|
-
when :create
|
|
38
|
-
::File.symlink?(link_name) &&
|
|
39
|
-
::File.readlink(link_name) == link_to
|
|
40
|
-
when :remove
|
|
41
|
-
!::File.symlink?(link_name)
|
|
42
|
-
end
|
|
38
|
+
def link_name
|
|
39
|
+
@resource.name
|
|
43
40
|
end
|
|
44
41
|
|
|
45
|
-
def
|
|
46
|
-
|
|
47
|
-
unless_dry_run("create symlink: #{symlink}") do
|
|
48
|
-
Wright::Util::File.ln_sfn(link_to, link_name)
|
|
49
|
-
end
|
|
42
|
+
def link_to
|
|
43
|
+
@resource.to
|
|
50
44
|
end
|
|
51
45
|
|
|
52
|
-
def
|
|
53
|
-
|
|
46
|
+
def link_to_expanded
|
|
47
|
+
return nil if link_to.nil?
|
|
48
|
+
Wright::Util::File.expand_tilde_path(link_to)
|
|
54
49
|
end
|
|
55
50
|
|
|
56
|
-
def
|
|
57
|
-
|
|
58
|
-
FileUtils.rm(link_name)
|
|
59
|
-
end
|
|
51
|
+
def link_name_expanded
|
|
52
|
+
Wright::Util::File.expand_tilde_path(link_name)
|
|
60
53
|
end
|
|
61
54
|
|
|
62
|
-
def
|
|
63
|
-
|
|
55
|
+
def symlink_to_s
|
|
56
|
+
"'#{link_name}' -> '#{link_to}'"
|
|
64
57
|
end
|
|
65
58
|
|
|
66
|
-
def
|
|
67
|
-
|
|
68
|
-
|
|
59
|
+
def uptodate?(action)
|
|
60
|
+
case action
|
|
61
|
+
when :create
|
|
62
|
+
::File.symlink?(link_name_expanded) &&
|
|
63
|
+
::File.readlink(link_name_expanded) == link_to_expanded
|
|
64
|
+
when :remove
|
|
65
|
+
!::File.symlink?(link_name_expanded)
|
|
66
|
+
end
|
|
69
67
|
end
|
|
70
68
|
|
|
71
|
-
def
|
|
72
|
-
|
|
69
|
+
def regular_file?
|
|
70
|
+
::File.exist?(link_name_expanded) &&
|
|
71
|
+
!::File.symlink?(link_name_expanded)
|
|
73
72
|
end
|
|
74
73
|
end
|
|
75
74
|
end
|
|
@@ -9,53 +9,50 @@ module Wright
|
|
|
9
9
|
class DarwinDirectoryService < User
|
|
10
10
|
private
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
user = @resource.name
|
|
12
|
+
def create_user
|
|
14
13
|
attributes = default_attributes.merge(resource_attributes)
|
|
15
14
|
attributes.each do |k, v|
|
|
16
15
|
args = dscl_args(:create, k, v)
|
|
17
|
-
exec_or_fail('dscl', args, "cannot create user '#{
|
|
16
|
+
exec_or_fail('dscl', args, "cannot create user '#{user_name}'")
|
|
18
17
|
end
|
|
19
18
|
end
|
|
20
19
|
|
|
21
20
|
def update_user
|
|
22
|
-
user = @resource.name
|
|
23
21
|
resource_attributes.each do |k, v|
|
|
24
22
|
args = dscl_args(:create, k, v)
|
|
25
|
-
exec_or_fail('dscl', args, "cannot create user '#{
|
|
23
|
+
exec_or_fail('dscl', args, "cannot create user '#{user_name}'")
|
|
26
24
|
end
|
|
27
25
|
end
|
|
28
26
|
|
|
29
|
-
def
|
|
30
|
-
user = @resource.name
|
|
27
|
+
def remove_user
|
|
31
28
|
exec_or_fail('dscl',
|
|
32
|
-
%W(. -delete /Users/#{
|
|
33
|
-
"cannot remove user '#{
|
|
29
|
+
%W(. -delete /Users/#{user_name}),
|
|
30
|
+
"cannot remove user '#{user_name}'")
|
|
34
31
|
end
|
|
35
32
|
|
|
36
33
|
def dscl_args(cmd, key, value)
|
|
37
|
-
%W(. -#{cmd} /Users/#{
|
|
34
|
+
%W(. -#{cmd} /Users/#{user_name} #{key} #{value})
|
|
38
35
|
end
|
|
39
36
|
|
|
40
37
|
def default_attributes
|
|
41
|
-
uid_range =
|
|
38
|
+
uid_range = system_user? ? 1...500 : 500...1000
|
|
42
39
|
{
|
|
43
40
|
'UniqueID' => Wright::Util::User.next_free_uid(uid_range),
|
|
44
41
|
'UserShell' => '/bin/bash',
|
|
45
42
|
'RealName' => '',
|
|
46
|
-
'NFSHomeDirectory' => "/Users/#{
|
|
43
|
+
'NFSHomeDirectory' => "/Users/#{user_name}",
|
|
47
44
|
'PrimaryGroupID' => Wright::Util::User.group_to_gid('staff'),
|
|
48
45
|
'Password' => '*'
|
|
49
46
|
}
|
|
50
47
|
end
|
|
51
48
|
|
|
52
49
|
def resource_attributes
|
|
53
|
-
gid = Wright::Util::User.group_to_gid(
|
|
50
|
+
gid = Wright::Util::User.group_to_gid(primary_group)
|
|
54
51
|
{
|
|
55
|
-
'UniqueID' =>
|
|
56
|
-
'UserShell' =>
|
|
57
|
-
'RealName' =>
|
|
58
|
-
'NFSHomeDirectory' =>
|
|
52
|
+
'UniqueID' => uid,
|
|
53
|
+
'UserShell' => shell,
|
|
54
|
+
'RealName' => full_name,
|
|
55
|
+
'NFSHomeDirectory' => home,
|
|
59
56
|
'PrimaryGroupID' => gid
|
|
60
57
|
}.reject { |_k, v| v.nil? }
|
|
61
58
|
end
|
|
@@ -9,44 +9,43 @@ module Wright
|
|
|
9
9
|
class GnuPasswd < Wright::Provider::User
|
|
10
10
|
private
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
user = @resource.name
|
|
12
|
+
def create_user
|
|
14
13
|
exec_or_fail('useradd',
|
|
15
|
-
[*user_options,
|
|
16
|
-
"cannot create user '#{
|
|
14
|
+
[*user_options, user_name],
|
|
15
|
+
"cannot create user '#{user_name}'")
|
|
17
16
|
end
|
|
18
17
|
|
|
19
18
|
def update_user
|
|
20
|
-
user = @resource.name
|
|
21
19
|
exec_or_fail('usermod',
|
|
22
|
-
[*user_options,
|
|
23
|
-
"cannot create user '#{
|
|
20
|
+
[*user_options, user_name],
|
|
21
|
+
"cannot create user '#{user_name}'")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def remove_user
|
|
25
|
+
exec_or_fail('userdel',
|
|
26
|
+
[user_name],
|
|
27
|
+
"cannot remove user '#{user_name}'")
|
|
24
28
|
end
|
|
25
29
|
|
|
26
30
|
def user_options
|
|
27
31
|
options = {
|
|
28
|
-
'-u' =>
|
|
29
|
-
'-g' =>
|
|
32
|
+
'-u' => uid,
|
|
33
|
+
'-g' => primary_group,
|
|
30
34
|
'-c' => comment,
|
|
31
|
-
'-G' =>
|
|
32
|
-
'-s' =>
|
|
33
|
-
'-d' =>
|
|
35
|
+
'-G' => group_list,
|
|
36
|
+
'-s' => shell,
|
|
37
|
+
'-d' => home
|
|
34
38
|
}.reject { |_k, v| v.nil? }.flatten
|
|
35
|
-
options << '-r' if
|
|
39
|
+
options << '-r' if system_user?
|
|
36
40
|
options.map(&:to_s)
|
|
37
41
|
end
|
|
38
42
|
|
|
39
43
|
def comment
|
|
40
|
-
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def groups
|
|
44
|
-
@resource.groups.nil? ? nil : @resource.groups.join(',')
|
|
44
|
+
full_name.nil? ? nil : "#{full_name},,,"
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def
|
|
48
|
-
|
|
49
|
-
exec_or_fail('userdel', [user], "cannot remove user '#{user}'")
|
|
47
|
+
def group_list
|
|
48
|
+
groups.nil? ? nil : groups.join(',')
|
|
50
49
|
end
|
|
51
50
|
end
|
|
52
51
|
end
|