gluez 0.3 → 0.4
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.
- data/lib/gluez/context.rb +105 -19
- data/lib/gluez/resource.rb +15 -1
- data/lib/gluez/resources/{group.rb → create_group.rb} +1 -1
- data/lib/gluez/resources/{user.rb → create_user.rb} +1 -1
- data/lib/gluez/resources/path.rb +2 -2
- data/lib/gluez/templates/profile.erb +33 -0
- data/lib/gluez.rb +3 -0
- metadata +6 -5
data/lib/gluez/context.rb
CHANGED
@@ -8,16 +8,22 @@ module Gluez
|
|
8
8
|
attr_reader :resources
|
9
9
|
|
10
10
|
# A reference to the outer context
|
11
|
-
attr_reader :parent
|
11
|
+
attr_reader :parent, :included_user_contexts
|
12
12
|
|
13
|
-
def initialize(parent=nil, name=nil, &block)
|
13
|
+
def initialize(parent=nil, name=nil, user=nil, &block)
|
14
14
|
@parent = parent
|
15
15
|
@name = name
|
16
|
+
@user = user
|
16
17
|
|
17
18
|
@resources = []
|
18
19
|
@properties = {}
|
19
20
|
|
21
|
+
@included_user_contexts = []
|
22
|
+
|
20
23
|
$gluez = self
|
24
|
+
|
25
|
+
self.include_user! "root" if self == self.root
|
26
|
+
|
21
27
|
instance_eval(&block) if block
|
22
28
|
|
23
29
|
if self.root == self
|
@@ -32,6 +38,18 @@ module Gluez
|
|
32
38
|
self.parent ? self.parent.root : self
|
33
39
|
end
|
34
40
|
|
41
|
+
def user
|
42
|
+
if @user
|
43
|
+
@user
|
44
|
+
else
|
45
|
+
@parent ? @parent.user : nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def home_dir
|
50
|
+
self.user == "root" ? "/root" : "/home/#{self.user}"
|
51
|
+
end
|
52
|
+
|
35
53
|
def default(name, name2)
|
36
54
|
unless @properties.key?(name)
|
37
55
|
if name2.is_a?(Symbol)
|
@@ -64,18 +82,98 @@ module Gluez
|
|
64
82
|
@properties[name]
|
65
83
|
end
|
66
84
|
|
67
|
-
|
68
|
-
|
69
|
-
Gluez::Context.new(self, name) do |c|
|
85
|
+
def include_library_recipe(library_dir, name, &block)
|
86
|
+
raise "include_recipe is only allowed in user context" if self == self.root
|
87
|
+
Gluez::Context.new(self, name, nil) do |c|
|
70
88
|
c.instance_eval(&block) if block
|
71
|
-
load "#{
|
89
|
+
load "#{library_dir}/recipes/#{name}/#{name}.rb"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Includes a recipe. A new context will be created. The passed block will be executed in the scope of the new context.
|
94
|
+
def include_recipe(name, &block)
|
95
|
+
self.include_library_recipe(File.dirname($0), name, &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
def include_user!(name, &block)
|
99
|
+
self.include_user(name, true, &block)
|
100
|
+
end
|
101
|
+
|
102
|
+
def include_user(name, failsafe=false, &block)
|
103
|
+
raise "include_user is only allowed in root context" unless self == self.root
|
104
|
+
Gluez::Context.new(self, name, name) do |c|
|
105
|
+
if block
|
106
|
+
c.instance_eval(&block)
|
107
|
+
end
|
108
|
+
|
109
|
+
c.root.included_user_contexts << c
|
110
|
+
|
111
|
+
f = "#{File.dirname($0)}/users/#{name}.rb"
|
112
|
+
|
113
|
+
if File.exist?(f)
|
114
|
+
load(f)
|
115
|
+
else
|
116
|
+
raise "could not find user context file #{f}" unless failsafe
|
117
|
+
end
|
118
|
+
|
72
119
|
end
|
73
120
|
end
|
74
121
|
|
75
122
|
# Loops through all resources, collect their generated code, format and return it.
|
76
123
|
def generate(simulate)
|
77
124
|
code = "#!/bin/bash"
|
125
|
+
|
126
|
+
root_user_context = @included_user_contexts.detect{|ctx| ctx.user == "root"}
|
127
|
+
raise "no root user context could be found" unless root_user_context
|
128
|
+
|
129
|
+
user_contexts = @included_user_contexts - [root_user_context]
|
130
|
+
|
131
|
+
existing_resources = Array.new(@resources)
|
132
|
+
|
133
|
+
root_user_context.instance_eval do |ctx|
|
134
|
+
user_contexts.each do |user_ctx|
|
135
|
+
create_group(user_ctx.user) do
|
136
|
+
gid user_ctx.get(:uid)
|
137
|
+
end
|
138
|
+
|
139
|
+
create_user(user_ctx.user) do
|
140
|
+
uid user_ctx.get(:uid)
|
141
|
+
gid user_ctx.get(:uid)
|
142
|
+
end
|
143
|
+
|
144
|
+
['.gluez', '.gluez/path', 'tmp', 'backup', 'bin', '.ssh'].each do |dir_name|
|
145
|
+
dir(dir_name) do
|
146
|
+
as_user user_ctx.user
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
if user_ctx.get(:authorized_keys)
|
151
|
+
transfer "~/.ssh/authorized_keys" do
|
152
|
+
as_user user_ctx.user
|
153
|
+
chmod 400
|
154
|
+
content user_ctx.get(:authorized_keys).join("\n")
|
155
|
+
end
|
156
|
+
end
|
78
157
|
|
158
|
+
transfer "~/.profile" do
|
159
|
+
as_user user_ctx.user
|
160
|
+
chmod 644
|
161
|
+
content File.read("#{File.dirname(__FILE__)}/templates/profile.erb")
|
162
|
+
end
|
163
|
+
|
164
|
+
if user_ctx.get(:sudo)
|
165
|
+
transfer "/etc/sudoers.d/#{user_ctx.user}" do
|
166
|
+
chmod 440
|
167
|
+
content "#{user_ctx.user} ALL=(ALL) NOPASSWD: ALL"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
# sort resources to always create users/groups first
|
175
|
+
@resources = (@resources - existing_resources) + existing_resources
|
176
|
+
|
79
177
|
code += "\n" + @resources.collect do |res|
|
80
178
|
res.generate(simulate).join("\n")
|
81
179
|
end.join("\n")
|
@@ -84,19 +182,7 @@ module Gluez
|
|
84
182
|
res.function_name
|
85
183
|
end.join("\n")
|
86
184
|
|
87
|
-
|
88
|
-
|
89
|
-
if Gluez.options.include?("--ssh")
|
90
|
-
code64 = Base64.encode64(code)
|
91
|
-
|
92
|
-
cmd = %(code=\\"#{code64.strip}\\" && echo \\\$code | base64 -i -d - | /bin/bash)
|
93
|
-
ssh = "ssh -t whale01 \"sudo su -l root -c '#{cmd}'\""
|
94
|
-
|
95
|
-
puts ssh
|
96
|
-
else
|
97
|
-
puts code
|
98
|
-
end
|
99
|
-
|
185
|
+
puts Gluez::format(code)
|
100
186
|
end
|
101
187
|
|
102
188
|
def self.load_resources
|
data/lib/gluez/resource.rb
CHANGED
@@ -35,18 +35,32 @@ module Gluez
|
|
35
35
|
@name = name
|
36
36
|
@steps = []
|
37
37
|
|
38
|
+
@as_user = nil
|
39
|
+
|
38
40
|
@notifies = []
|
39
41
|
@subscriptions = []
|
40
42
|
|
41
43
|
@mandatories = []
|
42
44
|
@optionals = []
|
43
45
|
|
44
|
-
self.optional :user, :default => "root"
|
46
|
+
# self.optional :user, :default => "root"
|
45
47
|
self.optional :lazy, :default => false
|
46
48
|
|
47
49
|
self.accessor :setup
|
48
50
|
end
|
49
51
|
|
52
|
+
def as_user(user)
|
53
|
+
@as_user = user
|
54
|
+
end
|
55
|
+
|
56
|
+
def user
|
57
|
+
@as_user || @context.user
|
58
|
+
end
|
59
|
+
|
60
|
+
def home_dir
|
61
|
+
self.user == "root" ? "/root" : "/home/#{self.user}"
|
62
|
+
end
|
63
|
+
|
50
64
|
def validate!
|
51
65
|
@mandatories.each do |it|
|
52
66
|
raise "no value for mandatory attribute #{it}" if self.send(it).nil?
|
data/lib/gluez/resources/path.rb
CHANGED
@@ -2,8 +2,8 @@ resource :path do
|
|
2
2
|
ready!
|
3
3
|
|
4
4
|
steps do |step|
|
5
|
-
link = self.name.gsub('/', '_').gsub('~', "
|
6
|
-
target = self.name.gsub('~',
|
5
|
+
link = self.name.gsub('/', '_').gsub('~', "#{home_dir}/.gluez/path/")
|
6
|
+
target = self.name.gsub('~', home_dir)
|
7
7
|
|
8
8
|
step.checks << "-L #{link}"
|
9
9
|
step.checks << "\\$(ls -al #{link} | awk '{print \\$10}' | grep #{target} | wc -l) -eq 1"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# ~/.profile: executed by the command interpreter for login shells.
|
2
|
+
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
|
3
|
+
# exists.
|
4
|
+
# see /usr/share/doc/bash/examples/startup-files for examples.
|
5
|
+
# the files are located in the bash-doc package.
|
6
|
+
|
7
|
+
# the default umask is set in /etc/profile; for setting the umask
|
8
|
+
# for ssh logins, install and configure the libpam-umask package.
|
9
|
+
#umask 022
|
10
|
+
|
11
|
+
# if running bash
|
12
|
+
if [ -n "$BASH_VERSION" ]; then
|
13
|
+
# include .bashrc if it exists
|
14
|
+
if [ -f "$HOME/.bashrc" ]; then
|
15
|
+
. "$HOME/.bashrc"
|
16
|
+
fi
|
17
|
+
fi
|
18
|
+
|
19
|
+
# set PATH so it includes user's private bin if it exists
|
20
|
+
if [ -d "$HOME/bin" ] ; then
|
21
|
+
PATH="$HOME/bin:$PATH"
|
22
|
+
fi
|
23
|
+
|
24
|
+
if [ -d "$HOME/.gluez/path" ]; then
|
25
|
+
for entry in `ls $HOME/.gluez/path`; do
|
26
|
+
dir="$HOME/.gluez/path/$entry"
|
27
|
+
if [ -d "$dir" ]; then
|
28
|
+
PATH="${dir}:$PATH"
|
29
|
+
fi
|
30
|
+
done
|
31
|
+
fi
|
32
|
+
|
33
|
+
export PATH
|
data/lib/gluez.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gluez
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-11-30 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: a server configuration toolkit
|
15
15
|
email: jan.zimmek@web.de
|
@@ -21,12 +21,13 @@ files:
|
|
21
21
|
- lib/gluez/resource.rb
|
22
22
|
- lib/gluez/resources/bash.rb
|
23
23
|
- lib/gluez/resources/bash_once.rb
|
24
|
+
- lib/gluez/resources/create_group.rb
|
25
|
+
- lib/gluez/resources/create_user.rb
|
24
26
|
- lib/gluez/resources/dir.rb
|
25
27
|
- lib/gluez/resources/disable.rb
|
26
28
|
- lib/gluez/resources/enable.rb
|
27
29
|
- lib/gluez/resources/file.rb
|
28
30
|
- lib/gluez/resources/gem.rb
|
29
|
-
- lib/gluez/resources/group.rb
|
30
31
|
- lib/gluez/resources/link.rb
|
31
32
|
- lib/gluez/resources/mount.rb
|
32
33
|
- lib/gluez/resources/package.rb
|
@@ -37,7 +38,7 @@ files:
|
|
37
38
|
- lib/gluez/resources/stop.rb
|
38
39
|
- lib/gluez/resources/transfer.rb
|
39
40
|
- lib/gluez/resources/umount.rb
|
40
|
-
- lib/gluez/
|
41
|
+
- lib/gluez/templates/profile.erb
|
41
42
|
- lib/gluez.rb
|
42
43
|
homepage:
|
43
44
|
licenses: []
|
@@ -59,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
59
60
|
version: '0'
|
60
61
|
requirements: []
|
61
62
|
rubyforge_project:
|
62
|
-
rubygems_version: 1.8.
|
63
|
+
rubygems_version: 1.8.10
|
63
64
|
signing_key:
|
64
65
|
specification_version: 3
|
65
66
|
summary: a system configuration toolkit
|