wright 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/wright/provider/user.rb
CHANGED
@@ -7,13 +7,18 @@ module Wright
|
|
7
7
|
# User provider. Used as a base class for {Resource::User}
|
8
8
|
# providers.
|
9
9
|
class User < Wright::Provider
|
10
|
-
#
|
10
|
+
# Creates or updates the user.
|
11
11
|
#
|
12
12
|
# @return [void]
|
13
13
|
def create
|
14
|
-
user
|
15
|
-
|
16
|
-
|
14
|
+
unless_uptodate(:create, "user already created: '#{user_name}'") do
|
15
|
+
unless_dry_run("create user: '#{user_name}'") do
|
16
|
+
if user_exists?
|
17
|
+
update_user
|
18
|
+
else
|
19
|
+
create_user
|
20
|
+
end
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -21,14 +26,47 @@ module Wright
|
|
21
26
|
#
|
22
27
|
# @return [void]
|
23
28
|
def remove
|
24
|
-
user
|
25
|
-
|
26
|
-
|
29
|
+
unless_uptodate(:remove, "user already removed: '#{user_name}'") do
|
30
|
+
unless_dry_run("remove user: '#{user_name}'") do
|
31
|
+
remove_user
|
32
|
+
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
36
|
private
|
31
37
|
|
38
|
+
def user_name
|
39
|
+
@resource.name
|
40
|
+
end
|
41
|
+
|
42
|
+
def uid
|
43
|
+
@resource.uid
|
44
|
+
end
|
45
|
+
|
46
|
+
def primary_group
|
47
|
+
@resource.primary_group
|
48
|
+
end
|
49
|
+
|
50
|
+
def full_name
|
51
|
+
@resource.full_name
|
52
|
+
end
|
53
|
+
|
54
|
+
def groups
|
55
|
+
@resource.groups
|
56
|
+
end
|
57
|
+
|
58
|
+
def shell
|
59
|
+
@resource.shell
|
60
|
+
end
|
61
|
+
|
62
|
+
def home
|
63
|
+
@resource.home
|
64
|
+
end
|
65
|
+
|
66
|
+
def system_user?
|
67
|
+
@resource.system
|
68
|
+
end
|
69
|
+
|
32
70
|
# @api public
|
33
71
|
# Checks if the user is up-to-date for a given action.
|
34
72
|
#
|
@@ -58,64 +96,43 @@ module Wright
|
|
58
96
|
primary_group_uptodate?
|
59
97
|
end
|
60
98
|
|
61
|
-
def create_user
|
62
|
-
unless_dry_run("create user: '#{@resource.name}'") do
|
63
|
-
if user_exists?
|
64
|
-
update_user
|
65
|
-
else
|
66
|
-
add_user
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def remove_user
|
72
|
-
unless_dry_run("remove user: '#{@resource.name}'") do
|
73
|
-
delete_user
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
99
|
def user_data
|
78
|
-
|
79
|
-
rescue ArgumentError
|
80
|
-
nil
|
100
|
+
Wright::Util::User.safe_getpwnam(user_name)
|
81
101
|
end
|
82
102
|
|
83
103
|
def uid_uptodate?
|
84
|
-
|
104
|
+
uid.nil? || user_data.uid == uid
|
85
105
|
end
|
86
106
|
|
87
107
|
def full_name_uptodate?
|
88
|
-
|
89
|
-
user_data.gecos.split(',').first == @resource.full_name
|
108
|
+
full_name.nil? || user_data.gecos.split(',').first == full_name
|
90
109
|
end
|
91
110
|
|
92
111
|
def groups_uptodate?
|
93
|
-
return true if
|
94
|
-
|
95
|
-
Etc.group { |g|
|
96
|
-
|
112
|
+
return true if groups.nil?
|
113
|
+
target_groups = []
|
114
|
+
Etc.group { |g| target_groups << g.name if g.mem.include?(user_name) }
|
115
|
+
target_groups.sort.uniq == groups.sort.uniq
|
97
116
|
end
|
98
117
|
|
99
118
|
def shell_uptodate?
|
100
|
-
|
119
|
+
shell.nil? || user_data.shell == shell
|
101
120
|
end
|
102
121
|
|
103
122
|
def home_uptodate?
|
104
|
-
|
123
|
+
home.nil? || user_data.dir == home
|
105
124
|
end
|
106
125
|
|
107
126
|
def primary_group_uptodate?
|
108
|
-
return true if
|
109
|
-
|
110
|
-
gid = Wright::Util::User.group_to_gid(@resource.primary_group)
|
111
|
-
user_data.gid == gid
|
127
|
+
return true if primary_group.nil?
|
128
|
+
user_data.gid == Wright::Util::User.group_to_gid(primary_group)
|
112
129
|
end
|
113
130
|
|
114
131
|
def user_exists?
|
115
132
|
!user_data.nil?
|
116
133
|
end
|
117
134
|
|
118
|
-
def
|
135
|
+
def create_user
|
119
136
|
fail NotImplementedError
|
120
137
|
end
|
121
138
|
|
@@ -123,7 +140,7 @@ module Wright
|
|
123
140
|
fail NotImplementedError
|
124
141
|
end
|
125
142
|
|
126
|
-
def
|
143
|
+
def remove_user
|
127
144
|
fail NotImplementedError
|
128
145
|
end
|
129
146
|
end
|
@@ -57,6 +57,7 @@ Wright::DSL.register_resource(Wright::Resource::Group)
|
|
57
57
|
|
58
58
|
group_providers = {
|
59
59
|
'debian' => 'Wright::Provider::Group::GnuPasswd',
|
60
|
+
'rhel' => 'Wright::Provider::Group::GnuPasswd',
|
60
61
|
'macosx' => 'Wright::Provider::Group::DarwinDirectoryService'
|
61
62
|
}
|
62
63
|
Wright::Config[:resources][:group] ||= {}
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
1
3
|
require 'wright/resource'
|
2
4
|
require 'wright/dsl'
|
3
5
|
|
@@ -20,22 +22,32 @@ module Wright
|
|
20
22
|
# htop.installed_versions
|
21
23
|
# # => []
|
22
24
|
class Package < Wright::Resource
|
25
|
+
extend Forwardable
|
26
|
+
|
23
27
|
# @return [String] the package version to install or remove
|
24
28
|
attr_accessor :version
|
25
29
|
|
30
|
+
# @return [String, Array<String>] the options passed to the
|
31
|
+
# package manager
|
32
|
+
attr_accessor :options
|
33
|
+
|
26
34
|
# Initializes a Package.
|
27
35
|
#
|
28
36
|
# @param name [String] the package's name
|
29
37
|
def initialize(name)
|
30
38
|
super
|
31
39
|
@version = nil
|
40
|
+
@options = nil
|
32
41
|
@action = :install
|
33
42
|
end
|
34
43
|
|
44
|
+
# @!method installed_versions
|
35
45
|
# @return [Array<String>] the installed package versions
|
36
|
-
|
37
|
-
|
38
|
-
|
46
|
+
def_delegator :@provider, :installed_versions
|
47
|
+
|
48
|
+
# @!method installed?
|
49
|
+
# @return [Bool] +true+ if the package is installed
|
50
|
+
def_delegator :@provider, :installed?
|
39
51
|
|
40
52
|
# Installs the Package.
|
41
53
|
#
|
@@ -66,6 +78,7 @@ Wright::DSL.register_resource(Wright::Resource::Package)
|
|
66
78
|
|
67
79
|
package_providers = {
|
68
80
|
'debian' => 'Wright::Provider::Package::Apt',
|
81
|
+
'rhel' => 'Wright::Provider::Package::Yum',
|
69
82
|
'macosx' => 'Wright::Provider::Package::Homebrew'
|
70
83
|
}
|
71
84
|
Wright::Config[:resources][:package] ||= {}
|
data/lib/wright/resource/user.rb
CHANGED
@@ -70,6 +70,7 @@ Wright::DSL.register_resource(Wright::Resource::User)
|
|
70
70
|
|
71
71
|
user_providers = {
|
72
72
|
'debian' => 'Wright::Provider::User::GnuPasswd',
|
73
|
+
'rhel' => 'Wright::Provider::User::GnuPasswd',
|
73
74
|
'macosx' => 'Wright::Provider::User::DarwinDirectoryService'
|
74
75
|
}
|
75
76
|
Wright::Config[:resources][:user] ||= {}
|
data/lib/wright/resource.rb
CHANGED
@@ -123,10 +123,12 @@ module Wright
|
|
123
123
|
def run_update_action
|
124
124
|
return if @on_update.nil?
|
125
125
|
|
126
|
+
resource = "#{@resource_name} '#{@name}'"
|
127
|
+
notification = "run update action for #{resource}"
|
126
128
|
if Wright.dry_run?
|
127
|
-
|
128
|
-
Wright.log.info "(would) run update action for #{resource}"
|
129
|
+
Wright.log.info "(would) #{notification}"
|
129
130
|
else
|
131
|
+
Wright.log.info notification
|
130
132
|
@on_update.call
|
131
133
|
end
|
132
134
|
end
|
data/lib/wright/util/user.rb
CHANGED
@@ -46,7 +46,7 @@ module Wright
|
|
46
46
|
end
|
47
47
|
private_class_method :to_id
|
48
48
|
|
49
|
-
# Returns the
|
49
|
+
# Returns the next free uid in a range.
|
50
50
|
#
|
51
51
|
# @param uid_range [Range] the uid range
|
52
52
|
#
|
@@ -60,7 +60,7 @@ module Wright
|
|
60
60
|
next_free_id(uid_range, :uid)
|
61
61
|
end
|
62
62
|
|
63
|
-
# Returns the
|
63
|
+
# Returns the next free gid in a range.
|
64
64
|
#
|
65
65
|
# @param gid_range [Range] the gid range
|
66
66
|
#
|
@@ -92,6 +92,38 @@ module Wright
|
|
92
92
|
id_type == :uid ? Etc.method(:passwd) : Etc.method(:group)
|
93
93
|
end
|
94
94
|
private_class_method :id_iterator
|
95
|
+
|
96
|
+
# Returns a user entry.
|
97
|
+
#
|
98
|
+
# @param username [String] the name of the user
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# Wright::Util::User.safe_getpwnam('this_user_does_not_exist')
|
102
|
+
# # => nil
|
103
|
+
#
|
104
|
+
# @return [Struct::Passwd, nil] the user entry or nil if the
|
105
|
+
# user does not exist
|
106
|
+
def self.safe_getpwnam(username)
|
107
|
+
Etc.getpwnam(username)
|
108
|
+
rescue ArgumentError
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns a group entry.
|
113
|
+
#
|
114
|
+
# @param groupname [String] the name of the group
|
115
|
+
#
|
116
|
+
# @example
|
117
|
+
# Wright::Util::User.safe_getgrnam('this_group_does_not_exist')
|
118
|
+
# # => nil
|
119
|
+
#
|
120
|
+
# @return [Struct::Group, nil] the group entry or nil if the
|
121
|
+
# group does not exist
|
122
|
+
def self.safe_getgrnam(groupname)
|
123
|
+
Etc.getgrnam(groupname)
|
124
|
+
rescue ArgumentError
|
125
|
+
nil
|
126
|
+
end
|
95
127
|
end
|
96
128
|
end
|
97
129
|
end
|
data/lib/wright/version.rb
CHANGED
data/man/wright.1
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
.\" Title: wright
|
3
3
|
.\" Author: [see the "AUTHOR" section]
|
4
4
|
.\" Generator: DocBook XSL Stylesheets v1.78.1 <http://docbook.sf.net/>
|
5
|
-
.\" Date:
|
5
|
+
.\" Date: 06/03/2015
|
6
6
|
.\" Manual: \ \&
|
7
7
|
.\" Source: \ \&
|
8
8
|
.\" Language: English
|
9
9
|
.\"
|
10
|
-
.TH "WRIGHT" "1" "
|
10
|
+
.TH "WRIGHT" "1" "06/03/2015" "\ \&" "\ \&"
|
11
11
|
.\" -----------------------------------------------------------------
|
12
12
|
.\" * Define some portability stuff
|
13
13
|
.\" -----------------------------------------------------------------
|
@@ -48,6 +48,18 @@ Run
|
|
48
48
|
as a wright script\&. When multiple commands are passed, they are joined and run in sequence\&.
|
49
49
|
.RE
|
50
50
|
.PP
|
51
|
+
\fB\-r\fR \fILIBRARY\fR
|
52
|
+
.RS 4
|
53
|
+
Require
|
54
|
+
\fILIBRARY\fR
|
55
|
+
before running the wright script\&. When multiple libraries are passed, they are loaded in sequence\&.
|
56
|
+
.RE
|
57
|
+
.PP
|
58
|
+
\fB\-n, \-\-dry\-run\fR
|
59
|
+
.RS 4
|
60
|
+
Enable dry\-run mode\&. In dry\-run mode, wright resources do not modify the system, but you still have to make sure your own code does not cause any unwanted changes\&.
|
61
|
+
.RE
|
62
|
+
.PP
|
51
63
|
\fB\-v, \-\-verbose\fR
|
52
64
|
.RS 4
|
53
65
|
Print debugging information\&.
|
@@ -143,15 +155,7 @@ To install tmux and update its config file from a wright script, create the foll
|
|
143
155
|
.\}
|
144
156
|
.nf
|
145
157
|
package \*(Aqtmux\*(Aq
|
146
|
-
|
147
|
-
.if n \{\
|
148
|
-
.RE
|
149
|
-
.\}
|
150
|
-
.sp
|
151
|
-
.if n \{\
|
152
|
-
.RS 4
|
153
|
-
.\}
|
154
|
-
.nf
|
158
|
+
|
155
159
|
file \*(Aq/etc/tmux\&.conf\*(Aq do |f|
|
156
160
|
f\&.content = <<EOF
|
157
161
|
unbind C\-b
|
data/spec/cli_spec.rb
CHANGED
@@ -21,6 +21,18 @@ describe Wright::CLI do
|
|
21
21
|
@cli.send(:commands).must_equal %w(foo bar)
|
22
22
|
end
|
23
23
|
|
24
|
+
it 'parses -r LIBRARY' do
|
25
|
+
argv = %w(-r library1 -r library2 -rlibrary3 file.rb)
|
26
|
+
@cli.parse(argv).must_equal %w(file.rb)
|
27
|
+
@cli.send(:requires).must_equal %w(library1 library2 library3)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'parses --dry-run' do
|
31
|
+
argv = %w(--dry-run file.rb)
|
32
|
+
@cli.parse(argv).must_equal %w(file.rb)
|
33
|
+
@cli.send(:dry_run).must_equal true
|
34
|
+
end
|
35
|
+
|
24
36
|
it 'parses --verbose' do
|
25
37
|
argv = ['--verbose']
|
26
38
|
@cli.parse(argv)
|
@@ -38,8 +50,14 @@ describe Wright::CLI do
|
|
38
50
|
it 'parses --version' do
|
39
51
|
argv = ['--version']
|
40
52
|
expected = "wright version #{Wright::VERSION}\n"
|
53
|
+
-> { @cli.run(argv) }.must_output expected
|
54
|
+
end
|
41
55
|
|
56
|
+
it 'enables dry-run mode when requested to do so' do
|
57
|
+
argv = ['--dry-run', '-e', 'print Wright.dry_run?']
|
58
|
+
expected = 'true'
|
42
59
|
-> { @cli.run(argv) }.must_output expected
|
60
|
+
Wright.instance_variable_set(:@dry_run, false)
|
43
61
|
end
|
44
62
|
|
45
63
|
it 'loads files' do
|