wright 0.1.2 → 0.2.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/CONTRIBUTING.md +34 -0
- data/NEWS.md +22 -0
- data/README.md +56 -40
- data/lib/wright/dsl.rb +1 -2
- data/lib/wright/provider/directory.rb +2 -9
- data/lib/wright/provider/file.rb +6 -13
- data/lib/wright/provider/group/darwin_directory_service.rb +61 -0
- data/lib/wright/provider/group/gnu_passwd.rb +42 -0
- data/lib/wright/provider/group.rb +111 -0
- data/lib/wright/provider/package/apt.rb +9 -43
- data/lib/wright/provider/package/homebrew.rb +68 -0
- data/lib/wright/provider/package.rb +26 -0
- data/lib/wright/provider/symlink.rb +4 -9
- data/lib/wright/provider/user/gnu_passwd.rb +55 -0
- data/lib/wright/provider/user.rb +137 -0
- data/lib/wright/provider.rb +40 -0
- data/lib/wright/resource/file.rb +1 -1
- data/lib/wright/resource/group.rb +64 -0
- data/lib/wright/resource/package.rb +6 -6
- data/lib/wright/resource/user.rb +76 -0
- data/lib/wright/util/recursive_autoloader.rb +1 -1
- data/lib/wright/util/stolen_from_activesupport.rb +2 -0
- data/lib/wright/util.rb +17 -2
- data/lib/wright/version.rb +1 -1
- data/lib/wright.rb +3 -2
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stderr +2 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.return +1 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stdout +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stderr +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stderr +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stdout +10 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stdout +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.return +1 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stderr +0 -0
- data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stdout +1 -0
- data/spec/provider/group/darwin_directory_service_spec.rb +381 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stderr +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.return +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.return +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_bazqux.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupdel_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stderr +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.return +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stderr +1 -0
- data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stdout +0 -0
- data/spec/provider/group/gnu_passwd_spec.rb +382 -0
- data/spec/provider/group_spec.rb +132 -0
- data/spec/provider/package/apt/apt-get_install_-qy_not-a-real-package.stderr +1 -0
- data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.stderr → dpkg-query_-s_not-a-real-package.stderr} +1 -1
- data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stdout +0 -0
- data/spec/provider/package/apt_spec.rb +27 -15
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stderr +0 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stdout +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stderr +0 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stdout +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.return +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stderr +1 -0
- data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stdout +0 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.return +1 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.stderr +0 -0
- data/spec/provider/package/homebrew/brew_install_cd-discid.stdout +9 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.return +1 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.stderr +1 -0
- data/spec/provider/package/homebrew/brew_install_not-a-real-package.stdout +2 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.return +1 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.stderr +0 -0
- data/spec/provider/package/homebrew/brew_uninstall_lame.stdout +1 -0
- data/spec/provider/package/homebrew_spec.rb +268 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/useradd_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.return +1 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.stderr +0 -0
- data/spec/provider/user/gnu_passwd/useradd_with_options.stdout +0 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/userdel_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.return +1 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stderr +0 -0
- data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stdout +0 -0
- data/spec/provider/user/gnu_passwd_spec.rb +107 -0
- data/spec/provider/user_spec.rb +327 -0
- data/spec/resource/group_spec.rb +29 -0
- data/spec/resource/package_spec.rb +37 -0
- data/spec/resource/user_spec.rb +29 -0
- data/spec/spec_helper.rb +5 -11
- data/spec/spec_helpers/fake_capture3.rb +11 -7
- data/spec/spec_helpers/test_coverage.rb +26 -0
- data/spec/util/activesupport_spec.rb +1 -0
- data/spec/util/file_permissions_spec.rb +2 -2
- data/spec/util/file_spec.rb +1 -0
- data/spec/util/user_spec.rb +2 -0
- metadata +246 -23
- data/NEWS +0 -18
- data/spec/provider/package/apt/apt-get_install_-qy_unknown-package.stderr +0 -1
- /data/spec/provider/{package/apt/dpkg-query_-s_unknown-package.stdout → group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stderr} +0 -0
- /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.return → apt-get_install_-qy_not-a-real-package.return} +0 -0
- /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.stdout → apt-get_install_-qy_not-a-real-package.stdout} +0 -0
- /data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.return → dpkg-query_-s_not-a-real-package.return} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d159205080df87b4a9c8935b0486335c74ef84e
|
4
|
+
data.tar.gz: 35cdf663151ab32900d9be2566574cfc0648f980
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dd9b03ffecb5ca5bd6bbe272f672fcd8546fdeebc7df4ac307f94148ca10312734ab99afd78720ba1d56e458e6c277424b6479decadbd0181b528fa05451316
|
7
|
+
data.tar.gz: 61b6d41688576e1736bf63d9e75eb4fd25c3a5de1d480f7a546df90f8802b4e91387556b38cbcb1393a2a7094b5f72117a65ddf336a8022bb416008880009475
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
Contributing
|
2
|
+
============
|
3
|
+
|
4
|
+
Contributions to wright are greatly appreciated. Here's how you can
|
5
|
+
help.
|
6
|
+
|
7
|
+
Reporting issues
|
8
|
+
----------------
|
9
|
+
|
10
|
+
If you encounter any problems with wright, please take the time to
|
11
|
+
report them via the [issue tracker][github-issues].
|
12
|
+
|
13
|
+
[github-issues]: https://github.com/sometimesfood/wright/issues
|
14
|
+
|
15
|
+
- Make sure your problem has not already been reported.
|
16
|
+
- Explain how to reproduce your problem.
|
17
|
+
- Include your version of wright as well as your Ruby version and
|
18
|
+
operating system.
|
19
|
+
|
20
|
+
Submitting pull requests
|
21
|
+
------------------------
|
22
|
+
|
23
|
+
- Fork the project.
|
24
|
+
- Open a new feature branch (`git checkout -b hackety-hack`).
|
25
|
+
- Write [proper commit messages][commit-messages].
|
26
|
+
- If you add new features, please add tests and make sure all tests
|
27
|
+
are passing (`bundle exec rake test`).
|
28
|
+
- Please make sure that your code does not introduce any Rubocop
|
29
|
+
warnings (`bundle exec rubocop`).
|
30
|
+
- Squash or rebase your commits if necessary.
|
31
|
+
- Open a [pull request][pull-requests].
|
32
|
+
|
33
|
+
[commit-messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
34
|
+
[pull-requests]: https://help.github.com/articles/using-pull-requests/
|
data/NEWS.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# wright NEWS
|
2
|
+
## 0.2.0 (2015-03-13)
|
3
|
+
- Add Homebrew package provider for OS X
|
4
|
+
- Add group resource
|
5
|
+
- Add group provider for GNU systems
|
6
|
+
- Add group provider for OS X
|
7
|
+
- Add user resource (provider)
|
8
|
+
- Add user provider for GNU systems
|
9
|
+
- Fix name error in symlink provider
|
10
|
+
- Add `Provider#exec_or_fail`
|
11
|
+
- Pass arguments to `Open3::capture3` properly
|
12
|
+
|
13
|
+
## 0.1.2 (2015-01-31)
|
14
|
+
- Convert docs to YARD
|
15
|
+
- Fix color code for warnings
|
16
|
+
|
17
|
+
## 0.1.1 (2015-01-20)
|
18
|
+
- Remove hardcoded package provider config
|
19
|
+
- Specify Ruby version in gemspec
|
20
|
+
|
21
|
+
## 0.1.0 (2015-01-16)
|
22
|
+
- First public release
|
data/README.md
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
wright
|
2
2
|
======
|
3
3
|
|
4
|
-
[][gem]
|
5
|
+
[][travis]
|
6
|
+
[][codeclimate]
|
7
|
+
[][codeclimate]
|
7
8
|
|
8
9
|
[gem]: https://rubygems.org/gems/wright
|
9
10
|
[travis]: https://travis-ci.org/sometimesfood/wright
|
@@ -16,14 +17,57 @@ Requirements
|
|
16
17
|
|
17
18
|
- Ruby ≥1.9
|
18
19
|
|
20
|
+
Getting Started
|
21
|
+
---------------
|
22
|
+
|
23
|
+
To start a wright IRB session, simply run:
|
24
|
+
|
25
|
+
$ bundle console
|
26
|
+
|
27
|
+
In order to create some resources using the wright DSL:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
require 'wright'
|
31
|
+
extend Wright::DSL
|
32
|
+
|
33
|
+
foo_dir = directory '/tmp/foo'
|
34
|
+
fstab = symlink '/tmp/foo/fstab' do |s|
|
35
|
+
s.to = '/etc/fstab'
|
36
|
+
end
|
37
|
+
|
38
|
+
puts File.directory? '/tmp/foo'
|
39
|
+
puts File.symlink? '/tmp/foo/fstab'
|
40
|
+
|
41
|
+
fstab.remove
|
42
|
+
foo_dir.remove
|
43
|
+
```
|
44
|
+
|
45
|
+
If you don't want to use the DSL:
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
require 'wright'
|
49
|
+
|
50
|
+
foo_dir = Wright::Resource::Directory.new('/tmp/foo')
|
51
|
+
foo_dir.create
|
52
|
+
fstab = Wright::Resource::Symlink.new('/tmp/foo/fstab')
|
53
|
+
fstab.to = '/etc/fstab'
|
54
|
+
fstab.create
|
55
|
+
|
56
|
+
puts File.directory? '/tmp/foo'
|
57
|
+
puts File.symlink? '/tmp/foo/fstab'
|
58
|
+
|
59
|
+
fstab.remove
|
60
|
+
foo_dir.remove
|
61
|
+
```
|
62
|
+
|
19
63
|
Documentation
|
20
64
|
-------------
|
21
65
|
|
22
66
|
There is not too much useful documentation that is targeted towards
|
23
67
|
users at the moment.
|
24
68
|
|
25
|
-
Run `bundle exec
|
26
|
-
developers.
|
69
|
+
Run `bundle exec yard` to generate
|
70
|
+
[HTML docs for wright developers](http://rubydoc.info/gems/wright/).
|
27
71
|
|
28
72
|
Hacking
|
29
73
|
-------
|
@@ -36,43 +80,15 @@ dependencies via bundler:
|
|
36
80
|
|
37
81
|
All tests should pass.
|
38
82
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
To start a wright IRB session, simply run:
|
43
|
-
|
44
|
-
$ bundle console
|
45
|
-
|
46
|
-
In order to create some resources using the wright DSL:
|
47
|
-
|
48
|
-
extend Wright::DSL
|
49
|
-
|
50
|
-
foo_dir = directory '/tmp/foo'
|
51
|
-
fstab = symlink '/tmp/foo/fstab' do |s|
|
52
|
-
s.to = '/etc/fstab'
|
53
|
-
end
|
54
|
-
|
55
|
-
puts File.directory? '/tmp/foo'
|
56
|
-
puts File.symlink? '/tmp/foo/fstab'
|
57
|
-
|
58
|
-
fstab.remove
|
59
|
-
foo_dir.remove
|
60
|
-
|
61
|
-
If you don't want to use the DSL:
|
83
|
+
Contributing
|
84
|
+
------------
|
62
85
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
fstab.to = '/etc/fstab'
|
67
|
-
fstab.create
|
68
|
-
|
69
|
-
puts File.directory? '/tmp/foo'
|
70
|
-
puts File.symlink? '/tmp/foo/fstab'
|
71
|
-
|
72
|
-
fstab.remove
|
73
|
-
foo_dir.remove
|
86
|
+
Contributions to wright are greatly appreciated. If you would like to
|
87
|
+
contribute to wright, please have a look at the
|
88
|
+
[contribution guidelines](CONTRIBUTING.md).
|
74
89
|
|
75
90
|
Copyright
|
76
91
|
---------
|
77
92
|
|
78
|
-
Copyright (c) 2012-2015 Sebastian Boehm. See LICENSE for
|
93
|
+
Copyright (c) 2012-2015 Sebastian Boehm. See [LICENSE](LICENSE) for
|
94
|
+
details.
|
data/lib/wright/dsl.rb
CHANGED
@@ -52,8 +52,7 @@ module Wright
|
|
52
52
|
# Implicitly invoking a block from within another block does not
|
53
53
|
# work: http://blog.sidu.in/2007/11/ruby-blocks-gotchas.html
|
54
54
|
#
|
55
|
-
# @yield [
|
56
|
-
#
|
55
|
+
# @yield [Resource] the resource
|
57
56
|
# @return [void]
|
58
57
|
def self.yield_resource(resource_class, name)
|
59
58
|
r = resource_class.new(name)
|
@@ -47,21 +47,14 @@ module Wright
|
|
47
47
|
|
48
48
|
def create_directory
|
49
49
|
dir_permissions = permissions
|
50
|
-
|
51
|
-
if Wright.dry_run?
|
52
|
-
Wright.log.info "(would) create directory: '#{@resource.name}'"
|
53
|
-
else
|
54
|
-
Wright.log.info "create directory: '#{@resource.name}'"
|
50
|
+
unless_dry_run("create directory: '#{@resource.name}'") do
|
55
51
|
FileUtils.mkdir_p(dirname)
|
56
52
|
dir_permissions.update
|
57
53
|
end
|
58
54
|
end
|
59
55
|
|
60
56
|
def remove_directory
|
61
|
-
|
62
|
-
Wright.log.info "(would) remove directory: '#{@resource.name}'"
|
63
|
-
else
|
64
|
-
Wright.log.info "remove directory: '#{@resource.name}'"
|
57
|
+
unless_dry_run("remove directory: '#{@resource.name}'") do
|
65
58
|
FileUtils.rmdir(dirname)
|
66
59
|
end
|
67
60
|
end
|
data/lib/wright/provider/file.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'wright/provider'
|
2
|
-
require 'wright/util/file_permissions'
|
3
|
-
require 'wright/util/user'
|
4
1
|
require 'fileutils'
|
5
2
|
require 'digest'
|
6
3
|
require 'tempfile'
|
7
4
|
require 'tmpdir'
|
5
|
+
require 'wright/provider'
|
6
|
+
require 'wright/util/file_permissions'
|
7
|
+
require 'wright/util/user'
|
8
8
|
|
9
9
|
module Wright
|
10
10
|
class Provider
|
@@ -43,11 +43,7 @@ module Wright
|
|
43
43
|
|
44
44
|
def create_file
|
45
45
|
file_permissions = permissions
|
46
|
-
|
47
|
-
if Wright.dry_run?
|
48
|
-
Wright.log.info "(would) create file: '#{@resource.name}'"
|
49
|
-
else
|
50
|
-
Wright.log.info "create file: '#{@resource.name}'"
|
46
|
+
unless_dry_run("create file: '#{@resource.name}'") do
|
51
47
|
write_content_to_file
|
52
48
|
file_permissions.update
|
53
49
|
end
|
@@ -68,10 +64,7 @@ module Wright
|
|
68
64
|
end
|
69
65
|
|
70
66
|
def remove_file
|
71
|
-
|
72
|
-
Wright.log.info "(would) remove file: '#{@resource.name}'"
|
73
|
-
else
|
74
|
-
Wright.log.info "remove file: '#{@resource.name}'"
|
67
|
+
unless_dry_run("remove file: '#{@resource.name}'") do
|
75
68
|
FileUtils.rm(filename)
|
76
69
|
end
|
77
70
|
end
|
@@ -87,7 +80,7 @@ module Wright
|
|
87
80
|
def content_uptodate?
|
88
81
|
return false unless ::File.exist?(filename)
|
89
82
|
content = @resource.content || ''
|
90
|
-
target_checksum = checksum(content)
|
83
|
+
target_checksum = checksum(content.to_s)
|
91
84
|
current_checksum = checksum(::File.read(filename))
|
92
85
|
current_checksum == target_checksum
|
93
86
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'wright/dry_run'
|
2
|
+
require 'wright/provider'
|
3
|
+
require 'wright/provider/group'
|
4
|
+
|
5
|
+
module Wright
|
6
|
+
class Provider
|
7
|
+
class Group
|
8
|
+
# Darwin DirectoryService group provider. Used as a provider for
|
9
|
+
# {Resource::Group} on OS X systems.
|
10
|
+
class DarwinDirectoryService < Wright::Provider::Group
|
11
|
+
private
|
12
|
+
|
13
|
+
def add_group(group_name, gid, system)
|
14
|
+
gid ||= next_system_gid if system
|
15
|
+
options = gid.nil? ? [] : ['-i', gid.to_s]
|
16
|
+
cmd = 'dseditgroup'
|
17
|
+
args = ['-o', 'create', *options, group_name]
|
18
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete_group(group_name)
|
22
|
+
cmd = 'dseditgroup'
|
23
|
+
args = ['-o', 'delete', group_name]
|
24
|
+
exec_or_fail(cmd, args, "cannot remove group '#{group_name}'")
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_members(group_name, members)
|
28
|
+
options = ['GroupMembership', *members]
|
29
|
+
cmd = 'dscl'
|
30
|
+
args = ['.', 'create', "/Groups/#{group_name}", *options]
|
31
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_gid(group_name, gid)
|
35
|
+
cmd = 'dseditgroup'
|
36
|
+
args = ['-o', 'edit',
|
37
|
+
'-i', gid.to_s,
|
38
|
+
group_name]
|
39
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
40
|
+
end
|
41
|
+
|
42
|
+
# Overrides Provider::Group#group_data to work around caching
|
43
|
+
# issues with getgrnam(3) on OS X.
|
44
|
+
def group_data
|
45
|
+
Etc.group { |g| break g if g.name == @resource.name }
|
46
|
+
end
|
47
|
+
|
48
|
+
def next_system_gid
|
49
|
+
system_gid_range = (1...500)
|
50
|
+
used_system_gids = []
|
51
|
+
Etc.group do |g|
|
52
|
+
used_system_gids << g.gid if system_gid_range.include?(g.gid)
|
53
|
+
end
|
54
|
+
free_system_gids = system_gid_range.to_a - used_system_gids
|
55
|
+
fail 'No free gids in system gid range' if free_system_gids.empty?
|
56
|
+
free_system_gids.max
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'wright/dry_run'
|
2
|
+
require 'wright/provider'
|
3
|
+
require 'wright/provider/group'
|
4
|
+
|
5
|
+
module Wright
|
6
|
+
class Provider
|
7
|
+
class Group
|
8
|
+
# GNU passwd group provider. Used as a provider for
|
9
|
+
# {Resource::Group} on GNU systems.
|
10
|
+
class GnuPasswd < Wright::Provider::Group
|
11
|
+
private
|
12
|
+
|
13
|
+
def add_group(group_name, gid, system)
|
14
|
+
options = []
|
15
|
+
options << '--system' if system
|
16
|
+
options += ['-g', gid.to_s] if gid
|
17
|
+
cmd = 'groupadd'
|
18
|
+
args = [*options, group_name]
|
19
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete_group(group_name)
|
23
|
+
cmd = 'groupdel'
|
24
|
+
args = [group_name]
|
25
|
+
exec_or_fail(cmd, args, "cannot remove group '#{group_name}'")
|
26
|
+
end
|
27
|
+
|
28
|
+
def set_members(group_name, members)
|
29
|
+
cmd = 'gpasswd'
|
30
|
+
args = ['-M', "'#{members.join(',')}'", group_name]
|
31
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_gid(group_name, gid)
|
35
|
+
cmd = 'groupmod'
|
36
|
+
args = ['-g', gid.to_s, group_name]
|
37
|
+
exec_or_fail(cmd, args, "cannot create group '#{group_name}'")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'etc'
|
2
|
+
require 'wright/provider'
|
3
|
+
|
4
|
+
module Wright
|
5
|
+
class Provider
|
6
|
+
# Group provider. Used as a base class for {Resource::Group}
|
7
|
+
# providers.
|
8
|
+
class Group < Wright::Provider
|
9
|
+
# Adds the group.
|
10
|
+
#
|
11
|
+
# @return [void]
|
12
|
+
def create
|
13
|
+
if uptodate?(:create)
|
14
|
+
Wright.log.debug "group already created: '#{@resource.name}'"
|
15
|
+
return
|
16
|
+
end
|
17
|
+
|
18
|
+
create_group
|
19
|
+
@updated = true
|
20
|
+
end
|
21
|
+
|
22
|
+
# Removes the group.
|
23
|
+
#
|
24
|
+
# @return [void]
|
25
|
+
def remove
|
26
|
+
if uptodate?(:remove)
|
27
|
+
Wright.log.debug "group already removed: '#{@resource.name}'"
|
28
|
+
return
|
29
|
+
end
|
30
|
+
|
31
|
+
remove_group
|
32
|
+
@updated = true
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# @api public
|
38
|
+
# Checks if the group is up-to-date for a given action.
|
39
|
+
#
|
40
|
+
# @param action [Symbol] the action. Currently supports
|
41
|
+
# +:create+ and +:remove+.
|
42
|
+
#
|
43
|
+
# @return [Bool] +true+ if the group is up-to-date and +false+
|
44
|
+
# otherwise
|
45
|
+
# @raise [ArgumentError] if the action is invalid
|
46
|
+
def uptodate?(action)
|
47
|
+
case action
|
48
|
+
when :create
|
49
|
+
group_exists? && gid_uptodate? && members_uptodate?
|
50
|
+
when :remove
|
51
|
+
!group_exists?
|
52
|
+
else
|
53
|
+
fail ArgumentError, "invalid action '#{action}'"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def create_group
|
58
|
+
group = @resource.name
|
59
|
+
unless_dry_run("create group: '#{group}'") do
|
60
|
+
if group_exists?
|
61
|
+
set_gid(group, @resource.gid) unless gid_uptodate?
|
62
|
+
else
|
63
|
+
add_group(group, @resource.gid, @resource.system)
|
64
|
+
end
|
65
|
+
set_members(group, @resource.members) unless members_uptodate?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def remove_group
|
70
|
+
group = @resource.name
|
71
|
+
unless_dry_run("remove group: '#{group}'") do
|
72
|
+
delete_group(group)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def group_data
|
77
|
+
Etc.getgrnam(@resource.name)
|
78
|
+
rescue ArgumentError
|
79
|
+
nil
|
80
|
+
end
|
81
|
+
|
82
|
+
def gid_uptodate?
|
83
|
+
@resource.gid.nil? || group_data.gid == @resource.gid
|
84
|
+
end
|
85
|
+
|
86
|
+
def members_uptodate?
|
87
|
+
@resource.members.nil? || group_data.mem == @resource.members
|
88
|
+
end
|
89
|
+
|
90
|
+
def group_exists?
|
91
|
+
!group_data.nil?
|
92
|
+
end
|
93
|
+
|
94
|
+
def set_members
|
95
|
+
group = @resource.name
|
96
|
+
new_members = @resource.members - group_data.mem
|
97
|
+
unwanted_members = group_data.mem - @resource.members
|
98
|
+
new_members.each { |m| add_member(m, group) }
|
99
|
+
unwanted_members.each { |m| remove_member(m, group) }
|
100
|
+
end
|
101
|
+
|
102
|
+
def add_member(_member, _group)
|
103
|
+
fail NotImplementedError
|
104
|
+
end
|
105
|
+
|
106
|
+
def remove_member(_member, _group)
|
107
|
+
fail NotImplementedError
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -7,13 +7,14 @@ require 'wright/provider/package'
|
|
7
7
|
module Wright
|
8
8
|
class Provider
|
9
9
|
class Package
|
10
|
-
# Apt package provider. Used as a
|
10
|
+
# Apt package provider. Used as a provider for
|
11
11
|
# {Resource::Package} on Debian-based systems.
|
12
12
|
class Apt < Wright::Provider::Package
|
13
13
|
# @return [Array<String>] the installed package versions
|
14
14
|
def installed_versions
|
15
|
-
cmd =
|
16
|
-
|
15
|
+
cmd = 'dpkg-query'
|
16
|
+
args = ['-s', @resource.name]
|
17
|
+
cmd_stdout, _, cmd_status = Open3.capture3(env, cmd, *args)
|
17
18
|
installed_re = /^Status: install ok installed$/
|
18
19
|
|
19
20
|
if cmd_status.success? && installed_re =~ cmd_stdout
|
@@ -24,62 +25,27 @@ module Wright
|
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
27
|
-
# Installs the package.
|
28
|
-
#
|
29
|
-
# @return [void]
|
30
|
-
def install
|
31
|
-
if uptodate?(:install)
|
32
|
-
Wright.log.debug "package already installed: '#{@resource.name}'"
|
33
|
-
return
|
34
|
-
end
|
35
|
-
|
36
|
-
install_package
|
37
|
-
@updated = true
|
38
|
-
end
|
39
|
-
|
40
|
-
# Removes the package.
|
41
|
-
#
|
42
|
-
# @return [void]
|
43
|
-
def remove
|
44
|
-
if uptodate?(:remove)
|
45
|
-
Wright.log.debug "package already removed: '#{@resource.name}'"
|
46
|
-
return
|
47
|
-
end
|
48
|
-
|
49
|
-
remove_package
|
50
|
-
@updated = true
|
51
|
-
end
|
52
|
-
|
53
28
|
private
|
54
29
|
|
55
30
|
def install_package
|
56
31
|
package = @resource.name
|
57
|
-
|
58
|
-
Wright.log.info "(would) install package: '#{package}'"
|
59
|
-
else
|
60
|
-
Wright.log.info "install package: '#{package}'"
|
32
|
+
unless_dry_run("install package: '#{package}'") do
|
61
33
|
apt_get(:install, package, @resource.version)
|
62
34
|
end
|
63
35
|
end
|
64
36
|
|
65
37
|
def remove_package
|
66
38
|
package = @resource.name
|
67
|
-
|
68
|
-
Wright.log.info "(would) remove package: '#{package}'"
|
69
|
-
else
|
70
|
-
Wright.log.info "remove package: '#{package}'"
|
39
|
+
unless_dry_run("remove package: '#{package}'") do
|
71
40
|
apt_get(:remove, package)
|
72
41
|
end
|
73
42
|
end
|
74
43
|
|
75
44
|
def apt_get(action, package, version = nil)
|
76
45
|
package_version = version.nil? ? '' : "=#{version}"
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
apt_error = cmd_stderr.chomp
|
82
|
-
fail %(cannot #{action} package '#{package}': "#{apt_error}")
|
46
|
+
cmd = 'apt-get'
|
47
|
+
args = [action.to_s, '-qy', package + package_version]
|
48
|
+
exec_or_fail(cmd, args, "cannot #{action} package '#{package}'")
|
83
49
|
end
|
84
50
|
|
85
51
|
def env
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'open3'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
require 'wright/dry_run'
|
5
|
+
require 'wright/provider'
|
6
|
+
require 'wright/provider/package'
|
7
|
+
|
8
|
+
module Wright
|
9
|
+
class Provider
|
10
|
+
class Package
|
11
|
+
# Homebrew package provider. Used as a provider for
|
12
|
+
# {Resource::Package} on OS X systems.
|
13
|
+
class Homebrew < Wright::Provider::Package
|
14
|
+
# @return [Array<String>] the installed package versions
|
15
|
+
def installed_versions
|
16
|
+
cmd = 'brew'
|
17
|
+
args = ['info', '--json=v1', @resource.name]
|
18
|
+
cmd_stdout, _, cmd_status = Wright::Util.bundler_clean_env do
|
19
|
+
Open3.capture3(env, cmd, *args)
|
20
|
+
end
|
21
|
+
|
22
|
+
if cmd_status.success?
|
23
|
+
JSON[cmd_stdout].first['installed'].map { |v| v['version'] }
|
24
|
+
else
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def install_package
|
32
|
+
package = @resource.name
|
33
|
+
unless_dry_run("install package: '#{package}'") do
|
34
|
+
brew(:install, package, @resource.version)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_package
|
39
|
+
package = @resource.name
|
40
|
+
unless_dry_run("remove package: '#{package}'") do
|
41
|
+
brew(:uninstall, package)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def brew(action, package, version = nil)
|
46
|
+
ignore_version(version)
|
47
|
+
|
48
|
+
cmd = 'brew'
|
49
|
+
args = [action.to_s, package]
|
50
|
+
|
51
|
+
_, cmd_stderr, cmd_status = Wright::Util.bundler_clean_env do
|
52
|
+
Open3.capture3(env, cmd, *args)
|
53
|
+
end
|
54
|
+
return if cmd_status.success?
|
55
|
+
|
56
|
+
brew_error = cmd_stderr.chomp
|
57
|
+
fail %(cannot #{action} package '#{package}': "#{brew_error}")
|
58
|
+
end
|
59
|
+
|
60
|
+
def ignore_version(version)
|
61
|
+
return unless version
|
62
|
+
package_info = "#{@resource.name} (#{version})"
|
63
|
+
Wright.log.warn "ignoring package version: '#{package_info}'"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -5,6 +5,32 @@ module Wright
|
|
5
5
|
# Package provider. Used as a base class for Resource::Package
|
6
6
|
# providers.
|
7
7
|
class Package < Wright::Provider
|
8
|
+
# Installs the package.
|
9
|
+
#
|
10
|
+
# @return [void]
|
11
|
+
def install
|
12
|
+
if uptodate?(:install)
|
13
|
+
Wright.log.debug "package already installed: '#{@resource.name}'"
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
install_package
|
18
|
+
@updated = true
|
19
|
+
end
|
20
|
+
|
21
|
+
# Removes the package.
|
22
|
+
#
|
23
|
+
# @return [void]
|
24
|
+
def remove
|
25
|
+
if uptodate?(:remove)
|
26
|
+
Wright.log.debug "package already removed: '#{@resource.name}'"
|
27
|
+
return
|
28
|
+
end
|
29
|
+
|
30
|
+
remove_package
|
31
|
+
@updated = true
|
32
|
+
end
|
33
|
+
|
8
34
|
private
|
9
35
|
|
10
36
|
# @api public
|