jeni 0.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +12 -0
- data/lib/jeni/actions.rb +1 -1
- data/lib/jeni/options.rb +5 -0
- data/lib/jeni/optparse.rb +9 -0
- data/lib/jeni/utils.rb +15 -2
- data/lib/jeni/version.rb +12 -9
- data/lib/jeni.rb +4 -0
- data/spec/jeni_utils_spec.rb +8 -2
- data/test/examples/target/jeni_template.rb +1 -1
- metadata +4 -15
- data/test/examples/target2/coati.conf +0 -36
- data/test/examples/target2/coati.haml.conf +0 -37
- data/test/examples/target2/executable +0 -3
- data/test/examples/target2/jeni-diff.rb +0 -64
- data/test/examples/target2/jeni.rb +0 -63
- data/test/examples/target2/jeni_link.rb +0 -63
- data/test/examples/target2/jeni_template.rb +0 -10
- data/test/examples/target2/jeni_test.rb +0 -63
- data/test/examples/target2/shebang.rb +0 -3
- data/test/examples/target2/std_template.rb +0 -12
- data/test/examples/target2/template.haml.rb +0 -10
data/History.txt
CHANGED
@@ -4,6 +4,18 @@
|
|
4
4
|
== History
|
5
5
|
|
6
6
|
|
7
|
+
[jeni-0.2.3 21-Nov-2012]
|
8
|
+
|
9
|
+
Generate templates to /tmp directory before transferring to target. Allow users to
|
10
|
+
generate to an alternative target directory, either with target= method or optparse.
|
11
|
+
Allow a block for optparse that passes through the optparse object to allow custom
|
12
|
+
options to be added. Add classify method so templates can convert e.g. project name
|
13
|
+
into a Ruby class (my_project -> MyProject).
|
14
|
+
|
15
|
+
[jeni-0.2.2 15-Nov-2012]
|
16
|
+
|
17
|
+
Ensure new users/groups are remember for subsequent user/group tests
|
18
|
+
|
7
19
|
[jeni-0.2.1 26-Oct-2012]
|
8
20
|
|
9
21
|
Added relative paths to targets that can take /usr/ or /usr/local as their root.
|
data/lib/jeni/actions.rb
CHANGED
@@ -153,7 +153,7 @@ module Jeni
|
|
153
153
|
puts target if @verbose
|
154
154
|
|
155
155
|
# and write it out to the target, but make it a temp
|
156
|
-
temp_file = target_file + "._temp"
|
156
|
+
temp_file = File.join('/tmp', File.basename(target_file) + "._temp")
|
157
157
|
File.open(temp_file, 'w') do |tfile|
|
158
158
|
target.each_line do |tline|
|
159
159
|
tfile.puts tline
|
data/lib/jeni/options.rb
CHANGED
data/lib/jeni/optparse.rb
CHANGED
@@ -73,6 +73,15 @@ module Jeni
|
|
73
73
|
@target_root = '/usr/'
|
74
74
|
end
|
75
75
|
|
76
|
+
opts.on('-t', '--target [PATH]', String, 'set the default target to value given') do |t|
|
77
|
+
@target_root = t
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
if block_given? then
|
82
|
+
yield(opts)
|
83
|
+
end
|
84
|
+
|
76
85
|
opts.on_tail('-h', '--help', 'you are looking at it') do
|
77
86
|
puts opts
|
78
87
|
exit 0
|
data/lib/jeni/utils.rb
CHANGED
@@ -79,13 +79,13 @@ module Jeni
|
|
79
79
|
def check_user(user)
|
80
80
|
Etc.getpwnam(user)
|
81
81
|
rescue ArgumentError
|
82
|
-
@errors[:no_user] = "User does not exist: #{user}"
|
82
|
+
@errors[:no_user] = "User does not exist: #{user}" unless @new_users.include?(user)
|
83
83
|
end
|
84
84
|
|
85
85
|
def check_group(group)
|
86
86
|
Etc.getgrnam(group)
|
87
87
|
rescue ArgumentError
|
88
|
-
@errors[:group] = "Group does not exist: #{group}"
|
88
|
+
@errors[:group] = "Group does not exist: #{group}" unless @new_groups.include?(group)
|
89
89
|
end
|
90
90
|
|
91
91
|
# check there is no user
|
@@ -114,6 +114,8 @@ module Jeni
|
|
114
114
|
return skip
|
115
115
|
rescue ArgumentError
|
116
116
|
# will get here if user does NOT exist
|
117
|
+
@new_users << user
|
118
|
+
@new_groups << user if opts.has_key?(:user_group)
|
117
119
|
return false # do not skip!
|
118
120
|
end
|
119
121
|
|
@@ -134,6 +136,7 @@ module Jeni
|
|
134
136
|
return skip
|
135
137
|
rescue ArgumentError
|
136
138
|
# will get here if user does NOT exist
|
139
|
+
@new_groups << group
|
137
140
|
return false
|
138
141
|
end
|
139
142
|
|
@@ -151,6 +154,16 @@ module Jeni
|
|
151
154
|
end
|
152
155
|
end
|
153
156
|
|
157
|
+
# convert a filename etc to a proper class name
|
158
|
+
# For example, converts 'my_service' to 'MyService'
|
159
|
+
#
|
160
|
+
# @param [String] string to convert to a classname
|
161
|
+
# @return [String] converted classname
|
162
|
+
def classify(string)
|
163
|
+
string = string.sub(/^[a-z\d]*/) { $&.capitalize }
|
164
|
+
string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
|
165
|
+
end
|
166
|
+
|
154
167
|
|
155
168
|
# helper to add commands for options
|
156
169
|
def process_options(opts, target)
|
data/lib/jeni/version.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
# Created by Jevoom
|
2
2
|
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
3
|
+
# 21-Nov-2012
|
4
|
+
# Generate templates to /tmp directory before transferring to target. Allow users to
|
5
|
+
# generate to an alternative target directory, either with target= method or optparse.
|
6
|
+
# Allow a block for optparse that passes through the optparse object to allow custom
|
7
|
+
# options to be added. Add classify method so templates can convert e.g. project name
|
8
|
+
# into a Ruby class (my_project -> MyProject).
|
6
9
|
|
7
10
|
module Jeni
|
8
|
-
# version set to 0.2.
|
9
|
-
Version = '0.2.
|
10
|
-
# date set to
|
11
|
-
Version_Date = '
|
12
|
-
#ident string set to: jeni-0.2.
|
13
|
-
Ident = 'jeni-0.2.
|
11
|
+
# version set to 0.2.3
|
12
|
+
Version = '0.2.3'
|
13
|
+
# date set to 21-Nov-2012
|
14
|
+
Version_Date = '21-Nov-2012'
|
15
|
+
#ident string set to: jeni-0.2.3 21-Nov-2012
|
16
|
+
Ident = 'jeni-0.2.3 21-Nov-2012'
|
14
17
|
end
|
data/lib/jeni.rb
CHANGED
@@ -70,6 +70,9 @@ module Jeni
|
|
70
70
|
@errors = {}
|
71
71
|
@owner = nil
|
72
72
|
@gem_dir = nil
|
73
|
+
# record any new users and groups requested
|
74
|
+
@new_users = Array.new
|
75
|
+
@new_groups = Array.new
|
73
76
|
if block_given? then
|
74
77
|
yield self
|
75
78
|
else
|
@@ -255,6 +258,7 @@ module Jeni
|
|
255
258
|
# @option opts [String] :home path to home directory for user, defaults to /home/$user
|
256
259
|
# @option opts [String] :shell path to shell for user, defaults to /bin/bash
|
257
260
|
# @option opts [Boolean] :skip set true to skip if user exists else fail
|
261
|
+
# @option opts [Boolean] :user_group to create a user group for this user
|
258
262
|
#
|
259
263
|
def user(name, opts={})
|
260
264
|
skip = opts[:skip]
|
data/spec/jeni_utils_spec.rb
CHANGED
@@ -29,6 +29,8 @@ class JeniUtils
|
|
29
29
|
@app_name = 'jeni'
|
30
30
|
@errors = {}
|
31
31
|
@commands = []
|
32
|
+
@new_users = Array.new
|
33
|
+
@new_groups = Array.new
|
32
34
|
@source_root = File.expand_path(File.dirname(__FILE__) + '/../test/examples')
|
33
35
|
end
|
34
36
|
attr_accessor :errors
|
@@ -238,9 +240,11 @@ describe Jeni do
|
|
238
240
|
puts err
|
239
241
|
end
|
240
242
|
@jeni.errors?.should be_false
|
241
|
-
@jeni.check_new_user("
|
243
|
+
@jeni.check_new_user("peppapiglet", {:uid=>10101}, false)
|
242
244
|
@jeni.errors?.should be_false
|
243
|
-
@jeni.check_new_user("
|
245
|
+
@jeni.check_new_user("peppapiglet", {:uid=>10101, :home=>'/home/peppa', :shell=>'/bin/bourne'}, false)
|
246
|
+
@jeni.errors?.should be_false
|
247
|
+
@jeni.check_user("peppapiglet")
|
244
248
|
@jeni.errors?.should be_false
|
245
249
|
end
|
246
250
|
|
@@ -268,6 +272,8 @@ describe Jeni do
|
|
268
272
|
@jeni.errors?.should be_false
|
269
273
|
@jeni.check_new_group("piglets", {:gid=>10101}, false)
|
270
274
|
@jeni.errors?.should be_false
|
275
|
+
@jeni.check_group("piglets")
|
276
|
+
@jeni.errors?.should be_false
|
271
277
|
end
|
272
278
|
|
273
279
|
it "should throw errors for invalid groups" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jeni
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 3
|
10
|
+
version: 0.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dr Robert
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-
|
18
|
+
date: 2012-11-21 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
type: :runtime
|
@@ -119,17 +119,6 @@ files:
|
|
119
119
|
- test/examples/target/jeni_template.rb
|
120
120
|
- test/examples/target/shebang.rb
|
121
121
|
- test/examples/target2/subfiles/subfile_1.rb
|
122
|
-
- test/examples/target2/jeni_test.rb
|
123
|
-
- test/examples/target2/jeni.rb
|
124
|
-
- test/examples/target2/shebang.rb
|
125
|
-
- test/examples/target2/executable
|
126
|
-
- test/examples/target2/template.haml.rb
|
127
|
-
- test/examples/target2/coati.haml.conf
|
128
|
-
- test/examples/target2/jeni-diff.rb
|
129
|
-
- test/examples/target2/jeni_template.rb
|
130
|
-
- test/examples/target2/coati.conf
|
131
|
-
- test/examples/target2/std_template.rb
|
132
|
-
- test/examples/target2/jeni_link.rb
|
133
122
|
homepage:
|
134
123
|
licenses:
|
135
124
|
- Open Software Licence v3.0
|
@@ -1,36 +0,0 @@
|
|
1
|
-
upstream coati {
|
2
|
-
server unix:/home/robert/dev/rails/coati/tmp/.sock fail_timeout=0;
|
3
|
-
}
|
4
|
-
|
5
|
-
|
6
|
-
server {
|
7
|
-
listen 192.168.0.20:80;
|
8
|
-
server_name coati.lucius.osburn-sharp.ath.cx;
|
9
|
-
|
10
|
-
access_log /home/robert/dev/rails/coati/log/access.log;
|
11
|
-
error_log /home/robert/dev/rails/coati/log/error.log;
|
12
|
-
|
13
|
-
root /home/robert/dev/rails/coati/public/;
|
14
|
-
index index.html;
|
15
|
-
|
16
|
-
location / {
|
17
|
-
proxy_set_header X-Real-IP $remote_addr;
|
18
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
19
|
-
proxy_set_header Host $http_host;
|
20
|
-
proxy_redirect off;
|
21
|
-
|
22
|
-
if (-f $request_filename/index.html) {
|
23
|
-
rewrite (.*) $1/index.html break;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (-f $request_filename.html) {
|
27
|
-
rewrite (.*) $1.html break;
|
28
|
-
}
|
29
|
-
|
30
|
-
if (!-f $request_filename) {
|
31
|
-
proxy_pass http://coati;
|
32
|
-
break;
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
}
|
@@ -1,37 +0,0 @@
|
|
1
|
-
upstream coati {
|
2
|
-
server unix:#{root}/tmp/.sock fail_timeout=0;
|
3
|
-
}
|
4
|
-
|
5
|
-
|
6
|
-
server {
|
7
|
-
listen 192.168.0.20:80;
|
8
|
-
server_name #{app_name}.lucius.osburn-sharp.ath.cx;
|
9
|
-
|
10
|
-
access_log #{root}/log/access.log;
|
11
|
-
error_log #{root}/log/error.log;
|
12
|
-
|
13
|
-
root #{root}/public/;
|
14
|
-
index index.html;
|
15
|
-
|
16
|
-
location / {
|
17
|
-
proxy_set_header X-Real-IP $remote_addr;
|
18
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
19
|
-
proxy_set_header Host $http_host;
|
20
|
-
proxy_redirect off;
|
21
|
-
|
22
|
-
if (-f $request_filename/index.html) {
|
23
|
-
rewrite (.*) $1/index.html break;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (-f $request_filename.html) {
|
27
|
-
rewrite (.*) $1.html break;
|
28
|
-
}
|
29
|
-
|
30
|
-
if (!-f $request_filename) {
|
31
|
-
proxy_pass http://coati;
|
32
|
-
break;
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
}
|
37
|
-
|
@@ -1,64 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
require 'jerbil'
|
16
|
-
|
17
|
-
# = Jeni
|
18
|
-
#
|
19
|
-
# [Description of the main module]
|
20
|
-
module Jeni
|
21
|
-
class Installer
|
22
|
-
|
23
|
-
def initialize(gem_name)
|
24
|
-
@gem_name = gem_name
|
25
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
26
|
-
@commands = []
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.construct(gem_name, options={}, &block)
|
30
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
31
|
-
installer = self.new(gem_name)
|
32
|
-
block.call(installer)
|
33
|
-
return self
|
34
|
-
end
|
35
|
-
|
36
|
-
def run!(pretent=false)
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
# copy a file from the source, relative to the gem home to the target
|
41
|
-
# which is absolute
|
42
|
-
def file(source, target, opts={})
|
43
|
-
@commands << {:file => {source => target}}
|
44
|
-
if opts.has_key?(:chown) then
|
45
|
-
@commands << {:chown => opts[:chown]}
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# copy all of the files in a directory
|
50
|
-
def directory(source, target, opts={})
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
# create a wrapper at target to call source
|
55
|
-
def wrapper(source, target)
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
def link(source, target)
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
#
|
2
|
-
# Author:: R.J.Sharp
|
3
|
-
# Email:: robert(a)osburn-sharp.ath.cx
|
4
|
-
# Copyright:: Copyright (c) 2012
|
5
|
-
# License:: Open Software Licence v3.0
|
6
|
-
#
|
7
|
-
# This software is licensed for use under the Open Software Licence v. 3.0
|
8
|
-
# The terms of this licence can be found at http://www.opensource.org/licenses/osl-3.0.php
|
9
|
-
# and in the file LICENCE. Under the terms of this licence, all derivative works
|
10
|
-
# must themselves be licensed under the Open Software Licence v. 3.0
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# [requires go here]
|
14
|
-
require 'rubygems'
|
15
|
-
|
16
|
-
# = Jeni
|
17
|
-
#
|
18
|
-
# [Description of the main module]
|
19
|
-
module Jeni
|
20
|
-
class Installer
|
21
|
-
|
22
|
-
def initialize(gem_name)
|
23
|
-
@gem_name = gem_name
|
24
|
-
@gem_spec = Gem::Specification.find_by_name(@gem_name)
|
25
|
-
@commands = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.construct(gem_name, options={}, &block)
|
29
|
-
@pretend = options[:pretend] || true # JUST FOR NOW!
|
30
|
-
installer = self.new(gem_name)
|
31
|
-
block.call(installer)
|
32
|
-
return self
|
33
|
-
end
|
34
|
-
|
35
|
-
def run!(pretent=false)
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
# copy a file from the source, relative to the gem home to the target
|
40
|
-
# which is absolute
|
41
|
-
def file(source, target, opts={})
|
42
|
-
@commands << {:file => {source => target}}
|
43
|
-
if opts.has_key?(:chown) then
|
44
|
-
@commands << {:chown => opts[:chown]}
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
# copy all of the files in a directory
|
49
|
-
def directory(source, target, opts={})
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# create a wrapper at target to call source
|
54
|
-
def wrapper(source, target)
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
def link(source, target)
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
end
|
63
|
-
end
|