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.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +34 -0
  3. data/NEWS.md +22 -0
  4. data/README.md +56 -40
  5. data/lib/wright/dsl.rb +1 -2
  6. data/lib/wright/provider/directory.rb +2 -9
  7. data/lib/wright/provider/file.rb +6 -13
  8. data/lib/wright/provider/group/darwin_directory_service.rb +61 -0
  9. data/lib/wright/provider/group/gnu_passwd.rb +42 -0
  10. data/lib/wright/provider/group.rb +111 -0
  11. data/lib/wright/provider/package/apt.rb +9 -43
  12. data/lib/wright/provider/package/homebrew.rb +68 -0
  13. data/lib/wright/provider/package.rb +26 -0
  14. data/lib/wright/provider/symlink.rb +4 -9
  15. data/lib/wright/provider/user/gnu_passwd.rb +55 -0
  16. data/lib/wright/provider/user.rb +137 -0
  17. data/lib/wright/provider.rb +40 -0
  18. data/lib/wright/resource/file.rb +1 -1
  19. data/lib/wright/resource/group.rb +64 -0
  20. data/lib/wright/resource/package.rb +6 -6
  21. data/lib/wright/resource/user.rb +76 -0
  22. data/lib/wright/util/recursive_autoloader.rb +1 -1
  23. data/lib/wright/util/stolen_from_activesupport.rb +2 -0
  24. data/lib/wright/util.rb +17 -2
  25. data/lib/wright/version.rb +1 -1
  26. data/lib/wright.rb +3 -2
  27. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.return +1 -0
  28. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stdout +0 -0
  29. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.return +1 -0
  30. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stderr +2 -0
  31. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_permission-denied-user.stdout +0 -0
  32. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.return +1 -0
  33. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stderr +0 -0
  34. data/spec/provider/group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership_user1_user2.stdout +0 -0
  35. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.return +1 -0
  36. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stderr +0 -0
  37. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_1234_newgroup.stdout +0 -0
  38. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.return +1 -0
  39. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stderr +0 -0
  40. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_499_newgroup.stdout +0 -0
  41. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.return +1 -0
  42. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stderr +0 -0
  43. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_create_-i_ERROR_newgroup.stdout +1 -0
  44. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.return +1 -0
  45. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stderr +1 -0
  46. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_bazqux.stdout +0 -0
  47. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.return +1 -0
  48. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stderr +1 -0
  49. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_delete_foobar.stdout +10 -0
  50. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.return +1 -0
  51. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stderr +0 -0
  52. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_52_foobar.stdout +0 -0
  53. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.return +1 -0
  54. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stderr +0 -0
  55. data/spec/provider/group/darwin_directory_service/dseditgroup_-o_edit_-i_ERROR_foobar.stdout +1 -0
  56. data/spec/provider/group/darwin_directory_service_spec.rb +381 -0
  57. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.return +1 -0
  58. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stderr +0 -0
  59. data/spec/provider/group/gnu_passwd/gpasswd_-M_''_foobar.stdout +0 -0
  60. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.return +1 -0
  61. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stderr +1 -0
  62. data/spec/provider/group/gnu_passwd/gpasswd_-M_'not-a-user'_foobar.stdout +0 -0
  63. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.return +1 -0
  64. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stderr +0 -0
  65. data/spec/provider/group/gnu_passwd/gpasswd_-M_'user1,user2'_foobar.stdout +0 -0
  66. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.return +1 -0
  67. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stderr +0 -0
  68. data/spec/provider/group/gnu_passwd/groupadd_--system_newgroup.stdout +0 -0
  69. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.return +1 -0
  70. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stderr +0 -0
  71. data/spec/provider/group/gnu_passwd/groupadd_-g_1234_newgroup.stdout +0 -0
  72. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.return +1 -0
  73. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stderr +1 -0
  74. data/spec/provider/group/gnu_passwd/groupadd_-g_ERROR_newgroup.stdout +0 -0
  75. data/spec/provider/group/gnu_passwd/groupdel_bazqux.return +1 -0
  76. data/spec/provider/group/gnu_passwd/groupdel_bazqux.stderr +1 -0
  77. data/spec/provider/group/gnu_passwd/groupdel_bazqux.stdout +0 -0
  78. data/spec/provider/group/gnu_passwd/groupdel_foobar.return +1 -0
  79. data/spec/provider/group/gnu_passwd/groupdel_foobar.stderr +0 -0
  80. data/spec/provider/group/gnu_passwd/groupdel_foobar.stdout +0 -0
  81. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.return +1 -0
  82. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stderr +0 -0
  83. data/spec/provider/group/gnu_passwd/groupmod_-g_52_foobar.stdout +0 -0
  84. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.return +1 -0
  85. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stderr +1 -0
  86. data/spec/provider/group/gnu_passwd/groupmod_-g_ERROR_foobar.stdout +0 -0
  87. data/spec/provider/group/gnu_passwd_spec.rb +382 -0
  88. data/spec/provider/group_spec.rb +132 -0
  89. data/spec/provider/package/apt/apt-get_install_-qy_not-a-real-package.stderr +1 -0
  90. data/spec/provider/package/apt/{dpkg-query_-s_unknown-package.stderr → dpkg-query_-s_not-a-real-package.stderr} +1 -1
  91. data/spec/provider/package/apt/dpkg-query_-s_not-a-real-package.stdout +0 -0
  92. data/spec/provider/package/apt_spec.rb +27 -15
  93. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.return +1 -0
  94. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stderr +0 -0
  95. data/spec/provider/package/homebrew/brew_info_--json=v1_cd-discid.stdout +1 -0
  96. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.return +1 -0
  97. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stderr +0 -0
  98. data/spec/provider/package/homebrew/brew_info_--json=v1_lame.stdout +1 -0
  99. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.return +1 -0
  100. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stderr +1 -0
  101. data/spec/provider/package/homebrew/brew_info_--json=v1_not-a-real-package.stdout +0 -0
  102. data/spec/provider/package/homebrew/brew_install_cd-discid.return +1 -0
  103. data/spec/provider/package/homebrew/brew_install_cd-discid.stderr +0 -0
  104. data/spec/provider/package/homebrew/brew_install_cd-discid.stdout +9 -0
  105. data/spec/provider/package/homebrew/brew_install_not-a-real-package.return +1 -0
  106. data/spec/provider/package/homebrew/brew_install_not-a-real-package.stderr +1 -0
  107. data/spec/provider/package/homebrew/brew_install_not-a-real-package.stdout +2 -0
  108. data/spec/provider/package/homebrew/brew_uninstall_lame.return +1 -0
  109. data/spec/provider/package/homebrew/brew_uninstall_lame.stderr +0 -0
  110. data/spec/provider/package/homebrew/brew_uninstall_lame.stdout +1 -0
  111. data/spec/provider/package/homebrew_spec.rb +268 -0
  112. data/spec/provider/user/gnu_passwd/useradd_johndoe.return +1 -0
  113. data/spec/provider/user/gnu_passwd/useradd_johndoe.stderr +0 -0
  114. data/spec/provider/user/gnu_passwd/useradd_johndoe.stdout +0 -0
  115. data/spec/provider/user/gnu_passwd/useradd_with_options.return +1 -0
  116. data/spec/provider/user/gnu_passwd/useradd_with_options.stderr +0 -0
  117. data/spec/provider/user/gnu_passwd/useradd_with_options.stdout +0 -0
  118. data/spec/provider/user/gnu_passwd/userdel_johndoe.return +1 -0
  119. data/spec/provider/user/gnu_passwd/userdel_johndoe.stderr +0 -0
  120. data/spec/provider/user/gnu_passwd/userdel_johndoe.stdout +0 -0
  121. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.return +1 -0
  122. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stderr +0 -0
  123. data/spec/provider/user/gnu_passwd/usermod_-u_42_johndoe.stdout +0 -0
  124. data/spec/provider/user/gnu_passwd_spec.rb +107 -0
  125. data/spec/provider/user_spec.rb +327 -0
  126. data/spec/resource/group_spec.rb +29 -0
  127. data/spec/resource/package_spec.rb +37 -0
  128. data/spec/resource/user_spec.rb +29 -0
  129. data/spec/spec_helper.rb +5 -11
  130. data/spec/spec_helpers/fake_capture3.rb +11 -7
  131. data/spec/spec_helpers/test_coverage.rb +26 -0
  132. data/spec/util/activesupport_spec.rb +1 -0
  133. data/spec/util/file_permissions_spec.rb +2 -2
  134. data/spec/util/file_spec.rb +1 -0
  135. data/spec/util/user_spec.rb +2 -0
  136. metadata +246 -23
  137. data/NEWS +0 -18
  138. data/spec/provider/package/apt/apt-get_install_-qy_unknown-package.stderr +0 -1
  139. /data/spec/provider/{package/apt/dpkg-query_-s_unknown-package.stdout → group/darwin_directory_service/dscl_._create_SLASHGroupsSLASHfoobar_GroupMembership.stderr} +0 -0
  140. /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.return → apt-get_install_-qy_not-a-real-package.return} +0 -0
  141. /data/spec/provider/package/apt/{apt-get_install_-qy_unknown-package.stdout → apt-get_install_-qy_not-a-real-package.stdout} +0 -0
  142. /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: 0005b749e54ff7904188cbd497f1757c460c0b4d
4
- data.tar.gz: b1fc596dc236a11f9a18c9de89823c91f0d20fee
3
+ metadata.gz: 6d159205080df87b4a9c8935b0486335c74ef84e
4
+ data.tar.gz: 35cdf663151ab32900d9be2566574cfc0648f980
5
5
  SHA512:
6
- metadata.gz: d9eaae5610049c8407782fd8089f789a9dbbe7208d08a46f5de4e8618b258824830c653f18c59bb0175d83b5d5661d90c276996fed278ebaa223ffce7748a706
7
- data.tar.gz: 0975e81800682d9e93ec0d365f20ef9a4effdab230c217b2b6661eb2ffc8e1ed7d2e1ec39933f30f46795c5a42ce01343eab154bb104e3009558ceb52552abc5
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 Version](http://img.shields.io/gem/v/wright.svg?style=flat-square)][gem]
5
- [![Build Status](http://img.shields.io/travis/sometimesfood/wright.svg?style=flat-square)][travis]
6
- [![Code Climate](http://img.shields.io/codeclimate/github/sometimesfood/wright.svg?style=flat-square)][codeclimate]
4
+ [![Gem Version](https://img.shields.io/gem/v/wright.svg?style=flat-square)][gem]
5
+ [![Build Status](https://img.shields.io/travis/sometimesfood/wright.svg?style=flat-square)][travis]
6
+ [![Code Climate](https://img.shields.io/codeclimate/github/sometimesfood/wright.svg?style=flat-square)][codeclimate]
7
+ [![Test Coverage](https://img.shields.io/codeclimate/coverage/github/sometimesfood/wright.svg?style=flat-square)][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 rake rdoc` to generate HTML docs for wright
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
- Getting Started
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
- foo_dir = Wright::Resource::Directory.new('/tmp/foo')
64
- foo_dir.create
65
- fstab = Wright::Resource::Symlink.new('/tmp/foo/fstab')
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 details.
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 [resource] the resource
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
- if Wright.dry_run?
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
@@ -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
- if Wright.dry_run?
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 Provider for
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 = "dpkg-query -s #{@resource.name}"
16
- cmd_stdout, _cmd_stderr, cmd_status = Open3.capture3(env, cmd)
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
- if Wright.dry_run?
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
- if Wright.dry_run?
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
- apt_cmd = "apt-get #{action} -qy #{package}#{package_version}"
78
- _cmd_stdout, cmd_stderr, cmd_status = Open3.capture3(env, apt_cmd)
79
- return if cmd_status.success?
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