rouster 0.68 → 0.69
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/.reek +63 -0
- data/.travis.yml +11 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +36 -1
- data/README.md +2 -3
- data/Rakefile +45 -31
- data/lib/rouster.rb +1 -1
- data/lib/rouster/deltas.rb +53 -23
- data/lib/rouster/vagrant.rb +4 -4
- data/test/unit/test_parse_ls_string.rb +19 -0
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7b0d2cb460b4d6fad86880726845308f77c14cf8
|
|
4
|
+
data.tar.gz: 66319f2e227a7bbb4d51458ca3f6628ef281ddf0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c6854485af207e64f012b3d45a79e9f90844cf403b0dfbfa41915b6832e9678004e0b6d5b98fd6bdd6dd73da802de36490e7d06715a704d8a34c701b8428f1d2
|
|
7
|
+
data.tar.gz: 93b7c1a6577ced94ed8cc9bd31341ee90af333aa4a8759c73a5b418ef1281b548326640d1f1cb81ab47c4c777719d670cdb03314fad38d33fedf0bf5be9476b5
|
data/.reek
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
Attribute:
|
|
4
|
+
enabled: false
|
|
5
|
+
|
|
6
|
+
# so judgy.. and without context
|
|
7
|
+
BooleanParameter:
|
|
8
|
+
enabled: false
|
|
9
|
+
|
|
10
|
+
ControlParameter:
|
|
11
|
+
enabled: false
|
|
12
|
+
|
|
13
|
+
DataClump:
|
|
14
|
+
min_clump_size: 4
|
|
15
|
+
|
|
16
|
+
DuplicateMethodCall:
|
|
17
|
+
enabled: false
|
|
18
|
+
|
|
19
|
+
# this is not a real thing
|
|
20
|
+
FeatureEnvy:
|
|
21
|
+
enabled: false
|
|
22
|
+
|
|
23
|
+
# this should have understanding of non-required parameters
|
|
24
|
+
LongParameterList:
|
|
25
|
+
max_params: 5
|
|
26
|
+
|
|
27
|
+
NestedIterators:
|
|
28
|
+
max_allowed_nesting: 3
|
|
29
|
+
|
|
30
|
+
# you don't know my life
|
|
31
|
+
NilCheck:
|
|
32
|
+
enabled: false
|
|
33
|
+
|
|
34
|
+
# more lacking context judgement - when _would_ you be ok with '!' ?
|
|
35
|
+
PrimaDonnaMethod:
|
|
36
|
+
enabled: false
|
|
37
|
+
|
|
38
|
+
# this feels a bit arbitrary.. maybe would make more sense if was an average
|
|
39
|
+
TooManyStatements:
|
|
40
|
+
max_statements: 30
|
|
41
|
+
|
|
42
|
+
# see above
|
|
43
|
+
TooManyInstanceVariables:
|
|
44
|
+
max_instance_variables: 20
|
|
45
|
+
|
|
46
|
+
# see above
|
|
47
|
+
TooManyMethods:
|
|
48
|
+
max_methods: 20
|
|
49
|
+
|
|
50
|
+
# i don't name my exceptions specifically. that doesn't make me a bad person.
|
|
51
|
+
UncommunicativeVariableName:
|
|
52
|
+
accept: /^[a|b|e|f|g|h|i|j|k|l|m|p|r|s|u|v]$/
|
|
53
|
+
|
|
54
|
+
# or my comparators in ~sort() functions
|
|
55
|
+
## https://github.com/troessner/reek/issues/886
|
|
56
|
+
UncommunicativeParameterName:
|
|
57
|
+
accept:
|
|
58
|
+
- a
|
|
59
|
+
- b
|
|
60
|
+
|
|
61
|
+
# got dinged for using class variables.. how else would you use self.startup?
|
|
62
|
+
exclude_paths:
|
|
63
|
+
- test/
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
GEM
|
|
2
2
|
remote: https://rubygems.org/
|
|
3
3
|
specs:
|
|
4
|
+
ast (2.3.0)
|
|
5
|
+
axiom-types (0.1.1)
|
|
6
|
+
descendants_tracker (~> 0.0.4)
|
|
7
|
+
ice_nine (~> 0.11.0)
|
|
8
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
4
9
|
builder (3.2.2)
|
|
10
|
+
codeclimate-engine-rb (0.3.1)
|
|
11
|
+
virtus (~> 1.0)
|
|
12
|
+
coercible (1.0.0)
|
|
13
|
+
descendants_tracker (~> 0.0.1)
|
|
14
|
+
descendants_tracker (0.0.4)
|
|
15
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
|
16
|
+
equalizer (0.0.11)
|
|
5
17
|
excon (0.40.0)
|
|
6
18
|
fog (1.24.0)
|
|
7
19
|
fog-brightbox
|
|
@@ -39,6 +51,7 @@ GEM
|
|
|
39
51
|
fog-core
|
|
40
52
|
nokogiri (~> 1.5, >= 1.5.11)
|
|
41
53
|
formatador (0.2.5)
|
|
54
|
+
ice_nine (0.11.2)
|
|
42
55
|
inflecto (0.0.2)
|
|
43
56
|
ipaddress (0.8.0)
|
|
44
57
|
json (1.8.1)
|
|
@@ -51,17 +64,39 @@ GEM
|
|
|
51
64
|
net-ssh (2.9.1)
|
|
52
65
|
nokogiri (1.6.3.1)
|
|
53
66
|
mini_portile (= 0.6.0)
|
|
67
|
+
parser (2.3.3.0)
|
|
68
|
+
ast (~> 2.2)
|
|
54
69
|
power_assert (0.1.4)
|
|
70
|
+
rainbow (2.1.0)
|
|
71
|
+
rake (10.4.2)
|
|
72
|
+
reek (3.10.2)
|
|
73
|
+
codeclimate-engine-rb (~> 0.3.1)
|
|
74
|
+
parser (~> 2.3, >= 2.3.0.6)
|
|
75
|
+
rainbow (~> 2.0)
|
|
55
76
|
test-unit (3.0.2)
|
|
56
77
|
power_assert
|
|
78
|
+
thread_safe (0.3.5)
|
|
79
|
+
virtus (1.0.5)
|
|
80
|
+
axiom-types (~> 0.1)
|
|
81
|
+
coercible (~> 1.0)
|
|
82
|
+
descendants_tracker (~> 0.0, >= 0.0.3)
|
|
83
|
+
equalizer (~> 0.0, >= 0.0.9)
|
|
57
84
|
|
|
58
85
|
PLATFORMS
|
|
59
86
|
ruby
|
|
60
87
|
|
|
61
88
|
DEPENDENCIES
|
|
62
|
-
fog
|
|
89
|
+
fog (= 1.24.0)
|
|
63
90
|
json
|
|
64
91
|
log4r (~> 1.1.9)
|
|
65
92
|
net-scp
|
|
66
93
|
net-ssh
|
|
94
|
+
rake (= 10.4.2)
|
|
95
|
+
reek (= 3.10.2)
|
|
67
96
|
test-unit (~> 3.0.0)
|
|
97
|
+
|
|
98
|
+
RUBY VERSION
|
|
99
|
+
ruby 2.0.0p648
|
|
100
|
+
|
|
101
|
+
BUNDLED WITH
|
|
102
|
+
1.13.6
|
data/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
Rouster
|
|
2
2
|
======
|
|
3
3
|
|
|
4
|
+
[](https://travis-ci.org/chorankates/rouster) [](https://rubygems.org/gems/rouster)
|
|
5
|
+
|
|
4
6
|
```rb
|
|
5
7
|
Rouster.is_a?('abstraction layer for controlling Vagrant virtual machines')
|
|
6
8
|
=> true
|
|
@@ -61,9 +63,6 @@ irb(main):001:0> require 'rouster'
|
|
|
61
63
|
|
|
62
64
|
### pre-built gem installation (stable)
|
|
63
65
|
|
|
64
|
-
[RubyGems](http://rubygems.org/gems/rouster)
|
|
65
|
-
[](http://badge.fury.io/rb/rouster)
|
|
66
|
-
|
|
67
66
|
```sh
|
|
68
67
|
gem install rouster
|
|
69
68
|
```
|
data/Rakefile
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
require sprintf('%s/%s', File.dirname(File.expand_path(__FILE__)), 'path_helper')
|
|
2
2
|
require 'rubygems'
|
|
3
3
|
require 'rake/testtask'
|
|
4
|
+
require 'reek/rake/task'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
desc 'build the gem'
|
|
7
|
+
task :build do
|
|
6
8
|
sh 'gem build rouster.gemspec'
|
|
7
9
|
end
|
|
8
10
|
|
|
11
|
+
desc 'cleanup environment'
|
|
9
12
|
task :clean do
|
|
10
13
|
sh 'rm /tmp/rouster-*'
|
|
11
14
|
end
|
|
@@ -14,56 +17,67 @@ task :default do
|
|
|
14
17
|
sh 'ruby test/basic.rb'
|
|
15
18
|
end
|
|
16
19
|
|
|
20
|
+
desc 'run the example demo'
|
|
17
21
|
task :demo do
|
|
18
22
|
sh 'ruby examples/demo.rb'
|
|
19
23
|
end
|
|
20
24
|
|
|
25
|
+
desc 'rdoc generation'
|
|
21
26
|
task :doc do
|
|
22
27
|
sh 'rdoc --line-numbers lib/*'
|
|
23
28
|
end
|
|
24
29
|
|
|
25
30
|
task :examples do
|
|
26
31
|
Dir['examples/**/*.rb'].each do |example|
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
sh "ruby #{example}"
|
|
33
|
+
end
|
|
29
34
|
end
|
|
30
35
|
|
|
36
|
+
desc 'shortcut to vagrant destroy -f'
|
|
31
37
|
task :vdestroy do
|
|
32
38
|
sh 'vagrant destroy -f'
|
|
33
39
|
end
|
|
34
40
|
|
|
35
|
-
|
|
36
|
-
|
|
41
|
+
Reek::Rake::Task.new do |t|
|
|
42
|
+
t.config_file = sprintf('%s/.reek', File.dirname(__FILE__))
|
|
43
|
+
#t.source_files = FileList.new('lib/**/*.rb', 'plugins/**/*.rb')
|
|
44
|
+
t.source_files = FileList.new('lib/**/*.rb')
|
|
45
|
+
t.reek_opts = '--no-wiki-links'
|
|
46
|
+
t.fail_on_error = false
|
|
47
|
+
t.verbose = true
|
|
37
48
|
end
|
|
38
49
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
50
|
+
namespace :test do
|
|
51
|
+
Rake::TestTask.new(:all => :vdestroy) do |t|
|
|
52
|
+
t.description = 'run all tests'
|
|
53
|
+
t.libs << 'lib'
|
|
54
|
+
t.test_files = FileList['test/**/test_*.rb']
|
|
55
|
+
end
|
|
44
56
|
|
|
45
|
-
Rake::TestTask.new do |t|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
end
|
|
57
|
+
Rake::TestTask.new do |t|
|
|
58
|
+
t.name = 'unit'
|
|
59
|
+
t.description = 'run unit tests'
|
|
60
|
+
t.libs << 'lib'
|
|
61
|
+
t.test_files = FileList['test/unit/**/test_*.rb']
|
|
62
|
+
end
|
|
51
63
|
|
|
52
|
-
Rake::TestTask.new(:functional => :vdestroy) do |t|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
end
|
|
64
|
+
Rake::TestTask.new(:functional => :vdestroy) do |t|
|
|
65
|
+
t.description = 'run functional tests'
|
|
66
|
+
t.libs << 'lib'
|
|
67
|
+
t.test_files = FileList['test/functional/**/test_*.rb']
|
|
68
|
+
end
|
|
57
69
|
|
|
58
|
-
Rake::TestTask.new(:deltas => :vdestroy) do |t|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
end
|
|
70
|
+
Rake::TestTask.new(:deltas => :vdestroy) do |t|
|
|
71
|
+
t.description = 'run delta tests'
|
|
72
|
+
t.libs << 'lib'
|
|
73
|
+
t.test_files = FileList['test/functional/deltas/test_*.rb']
|
|
74
|
+
end
|
|
63
75
|
|
|
64
|
-
Rake::TestTask.new do |t|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
76
|
+
Rake::TestTask.new do |t|
|
|
77
|
+
t.name = 'puppet'
|
|
78
|
+
t.description = 'run puppet tests'
|
|
79
|
+
t.libs << 'lib'
|
|
80
|
+
t.test_files = FileList['test/puppet/test*.rb']
|
|
81
|
+
t.verbose = true
|
|
82
|
+
end
|
|
69
83
|
end
|
data/lib/rouster.rb
CHANGED
|
@@ -12,7 +12,7 @@ require 'rouster/vagrant'
|
|
|
12
12
|
class Rouster
|
|
13
13
|
|
|
14
14
|
# sporadically updated version number
|
|
15
|
-
VERSION = 0.
|
|
15
|
+
VERSION = 0.69
|
|
16
16
|
|
|
17
17
|
# custom exceptions -- what else do we want them to include/do?
|
|
18
18
|
class ArgumentError < StandardError; end # thrown by methods that take parameters from users
|
data/lib/rouster/deltas.rb
CHANGED
|
@@ -144,22 +144,33 @@ class Rouster
|
|
|
144
144
|
|
|
145
145
|
res = Hash.new()
|
|
146
146
|
|
|
147
|
-
|
|
147
|
+
{
|
|
148
|
+
:file => self.run('cat /etc/group'),
|
|
149
|
+
:dynamic => self.run('getent group', [0,127]),
|
|
150
|
+
}.each_pair do |source, raw|
|
|
148
151
|
|
|
149
|
-
|
|
150
|
-
|
|
152
|
+
raw.split("\n").each do |line|
|
|
153
|
+
next unless line.match(/\w+:\w+:\w+/)
|
|
154
|
+
|
|
155
|
+
data = line.split(':')
|
|
151
156
|
|
|
152
|
-
|
|
157
|
+
group = data[0]
|
|
158
|
+
gid = data[2]
|
|
153
159
|
|
|
154
|
-
|
|
155
|
-
|
|
160
|
+
# this works in some cases, deep functionality picks up the others
|
|
161
|
+
users = data[3].nil? ? ['NONE'] : data[3].split(',')
|
|
156
162
|
|
|
157
|
-
|
|
158
|
-
|
|
163
|
+
if res.has_key?(group)
|
|
164
|
+
@logger.debug(sprintf('for[%s] old GID[%s] new GID[%s]', group, gid, res[group][:users])) unless gid.eql?(res[group][:gid])
|
|
165
|
+
@logger.debug(sprintf('for[%s] old users[%s] new users[%s]', group, users)) unless users.eql?(res[group][:users])
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
res[group] = Hash.new() # i miss autovivification
|
|
169
|
+
res[group][:gid] = gid
|
|
170
|
+
res[group][:users] = users
|
|
171
|
+
res[group][:source] = source
|
|
172
|
+
end
|
|
159
173
|
|
|
160
|
-
res[group] = Hash.new() # i miss autovivification
|
|
161
|
-
res[group][:gid] = gid
|
|
162
|
-
res[group][:users] = users
|
|
163
174
|
end
|
|
164
175
|
|
|
165
176
|
groups = res
|
|
@@ -755,20 +766,39 @@ class Rouster
|
|
|
755
766
|
|
|
756
767
|
res = Hash.new()
|
|
757
768
|
|
|
758
|
-
|
|
769
|
+
{
|
|
770
|
+
:file => self.run('cat /etc/passwd'),
|
|
771
|
+
:dynamic => self.run('getent passwd', [0,127]),
|
|
772
|
+
}.each do |source, raw|
|
|
759
773
|
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
774
|
+
raw.split("\n").each do |line|
|
|
775
|
+
next if line.match(/(\w+)(?::\w+){3,}/).nil?
|
|
776
|
+
|
|
777
|
+
user = $1
|
|
778
|
+
data = line.split(':')
|
|
779
|
+
|
|
780
|
+
shell = data[-1]
|
|
781
|
+
home = data[-2]
|
|
782
|
+
home_exists = self.is_dir?(data[-2])
|
|
783
|
+
uid = data[2]
|
|
784
|
+
gid = data[3]
|
|
785
|
+
|
|
786
|
+
if res.has_key?(user)
|
|
787
|
+
@logger.info(sprintf('for[%s] old shell[%s], new shell[%s]', res[user][:shell], shell)) unless shell.eql?(res[user][:shell])
|
|
788
|
+
@logger.info(sprintf('for[%s] old home[%s], new home[%s]', res[user][:home], home)) unless home.eql?(res[user][:home])
|
|
789
|
+
@logger.info(sprintf('for[%s] old home_exists[%s], new home_exists[%s]', res[user][:home_exists], home_exists)) unless home_exists.eql?(res[user][:home_exists])
|
|
790
|
+
@logger.info(sprintf('for[%s] old UID[%s], new UID[%s]', res[user][:uid], uid)) unless uid.eql?(res[user][:uid])
|
|
791
|
+
@logger.info(sprintf('for[%s] old GID[%s], new GID[%s]', res[user][:gid], gid)) unless gid.eql?(res[user][:gid])
|
|
792
|
+
end
|
|
765
793
|
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
794
|
+
res[user] = Hash.new()
|
|
795
|
+
res[user][:shell] = shell
|
|
796
|
+
res[user][:home] = home
|
|
797
|
+
res[user][:home_exists] = home_exists
|
|
798
|
+
res[user][:uid] = uid
|
|
799
|
+
res[user][:gid] = gid
|
|
800
|
+
res[user][:source] = source
|
|
801
|
+
end
|
|
772
802
|
end
|
|
773
803
|
|
|
774
804
|
if cache
|
data/lib/rouster/vagrant.rb
CHANGED
|
@@ -48,7 +48,7 @@ class Rouster
|
|
|
48
48
|
@logger.info('up()')
|
|
49
49
|
|
|
50
50
|
# don't like putting this here, may be refactored
|
|
51
|
-
if self.is_passthrough?
|
|
51
|
+
if self.is_passthrough?
|
|
52
52
|
if (self.passthrough[:type].equal?(:aws) or self.passthrough[:type].equal?(:raiden))
|
|
53
53
|
self.aws_up()
|
|
54
54
|
elsif (self.passthrough[:type].equal?(:openstack))
|
|
@@ -87,7 +87,7 @@ class Rouster
|
|
|
87
87
|
@logger.info('destroy()')
|
|
88
88
|
|
|
89
89
|
# don't like putting this here, may be refactored
|
|
90
|
-
if self.is_passthrough?
|
|
90
|
+
if self.is_passthrough?
|
|
91
91
|
if (self.passthrough[:type].equal?(:aws) or self.passthrough[:type].equal?(:raiden))
|
|
92
92
|
self.aws_destroy()
|
|
93
93
|
elsif self.is_passthrough? and self.passthrough[:type].equal?(:openstack)
|
|
@@ -121,7 +121,7 @@ class Rouster
|
|
|
121
121
|
|
|
122
122
|
# don't like putting this here, may be refactored
|
|
123
123
|
@logger.info('status()')
|
|
124
|
-
if self.is_passthrough?
|
|
124
|
+
if self.is_passthrough?
|
|
125
125
|
if (self.passthrough[:type].equal?(:aws) or self.passthrough[:type].equal?(:raiden))
|
|
126
126
|
status = self.aws_status()
|
|
127
127
|
elsif self.passthrough[:type].equal?(:openstack)
|
|
@@ -167,7 +167,7 @@ class Rouster
|
|
|
167
167
|
def reload(no_provision = true)
|
|
168
168
|
|
|
169
169
|
if self.is_passthrough?
|
|
170
|
-
@logger.warn(
|
|
170
|
+
@logger.warn('calling [vagrant reload] on a passthrough host is a noop')
|
|
171
171
|
return nil
|
|
172
172
|
end
|
|
173
173
|
|
|
@@ -326,6 +326,25 @@ class TestParseLsString < Test::Unit::TestCase
|
|
|
326
326
|
assert_equal(expectation, res)
|
|
327
327
|
end
|
|
328
328
|
|
|
329
|
+
def test_uid_forced
|
|
330
|
+
uid = 501
|
|
331
|
+
str = "-rw-r--r-- 1 #{uid} root 0 Jun 13 09:35 foo\n"
|
|
332
|
+
|
|
333
|
+
res = @app.exposed_parse_ls_string(str)
|
|
334
|
+
|
|
335
|
+
assert_equal('501', res[:owner])
|
|
336
|
+
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
def test_gid_forced
|
|
340
|
+
gid = 10
|
|
341
|
+
str = "-rw-r--r-- 1 vagrant #{gid} 0 Jun 13 09:35 foo\n"
|
|
342
|
+
|
|
343
|
+
res = @app.exposed_parse_ls_string(str)
|
|
344
|
+
|
|
345
|
+
assert_equal('10', res[:group])
|
|
346
|
+
end
|
|
347
|
+
|
|
329
348
|
def test_dir_detection
|
|
330
349
|
dir_str = "drwxrwxrwt 5 root root 4096 May 28 00:26 /tmp/\n"
|
|
331
350
|
file_str = "-rw-r--r-- 1 root root 906 Oct 2 2012 grub.conf\n"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rouster
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '0.
|
|
4
|
+
version: '0.69'
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Conor Horan-Kates
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2017-01-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: json
|
|
@@ -116,6 +116,8 @@ extensions: []
|
|
|
116
116
|
extra_rdoc_files: []
|
|
117
117
|
files:
|
|
118
118
|
- .gitignore
|
|
119
|
+
- .reek
|
|
120
|
+
- .travis.yml
|
|
119
121
|
- Gemfile
|
|
120
122
|
- Gemfile.lock
|
|
121
123
|
- LICENSE
|