rye 0.6.3 → 0.6.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/CHANGES.txt +8 -0
- data/README.rdoc +1 -1
- data/lib/rye/box.rb +79 -18
- data/lib/rye/cmd.rb +2 -1
- data/rye.gemspec +1 -1
- metadata +2 -2
data/CHANGES.txt
CHANGED
@@ -6,6 +6,14 @@ TODO
|
|
6
6
|
* Fingerprints: ssh-keygen -l -f id_rsa_repos.pub
|
7
7
|
|
8
8
|
|
9
|
+
#### 0.6.4 (2009-05-04) #############################
|
10
|
+
|
11
|
+
* FIXED: authorize_remote was not returning to the directory it started with.
|
12
|
+
* ADDED: pre and post command hooks to Rye::Box
|
13
|
+
* ADDED: Rye::Box.batch
|
14
|
+
* ADDED: Support for OS X for Rye::Box.guess_user_home
|
15
|
+
|
16
|
+
|
9
17
|
#### 0.6.3 (2009-05-02) #############################
|
10
18
|
|
11
19
|
* FIXED: Rye::Box.guess_user_home wasn't handling the username arg (only using default name)
|
data/README.rdoc
CHANGED
data/lib/rye/box.rb
CHANGED
@@ -46,6 +46,9 @@ module Rye
|
|
46
46
|
# The most recent valud for umask (or 0022)
|
47
47
|
attr_reader :current_umask
|
48
48
|
|
49
|
+
attr_writer :post_command_hook
|
50
|
+
attr_writer :pre_command_hook
|
51
|
+
|
49
52
|
# * +host+ The hostname to connect to. The default is localhost.
|
50
53
|
# * +opts+ a hash of optional arguments.
|
51
54
|
#
|
@@ -267,19 +270,14 @@ module Rye
|
|
267
270
|
end
|
268
271
|
alias :add_env :setenv # deprecated?
|
269
272
|
|
270
|
-
|
271
|
-
|
272
|
-
end
|
273
|
+
# The name of the user that opened the SSH connection
|
274
|
+
def user; (@opts || {})[:user]; end
|
273
275
|
|
274
276
|
# See Rye.keys
|
275
|
-
def keys
|
276
|
-
Rye.keys
|
277
|
-
end
|
277
|
+
def keys; Rye.keys; end
|
278
278
|
|
279
|
-
# Returns
|
280
|
-
def to_s
|
281
|
-
@host
|
282
|
-
end
|
279
|
+
# Returns +user@host+
|
280
|
+
def to_s; '%s@%s' % [user, @host]; end
|
283
281
|
|
284
282
|
def inspect
|
285
283
|
%q{#<%s:%s cwd=%s umask=%s env=%s safe=%s opts=%s>} %
|
@@ -301,7 +299,6 @@ module Rye
|
|
301
299
|
Rye.remote_host_keys(@host)
|
302
300
|
end
|
303
301
|
|
304
|
-
|
305
302
|
# Uses the output of "useradd -D" to determine the default home
|
306
303
|
# directory. This returns a GUESS rather than the a user's real
|
307
304
|
# home directory. Currently used only by authorize_keys_remote.
|
@@ -320,9 +317,10 @@ module Rye
|
|
320
317
|
# /etc/adduser.config, DHOME=/home OR ??
|
321
318
|
user_defaults = {}
|
322
319
|
raw = self.useradd(:D) rescue ["HOME=/home"]
|
320
|
+
ostmp = self.ostype
|
323
321
|
raw.each do |nv|
|
324
322
|
|
325
|
-
if
|
323
|
+
if ostmp == "sunos"
|
326
324
|
#nv.scan(/([\w_-]+?)=(.+?)\s/).each do |n, v|
|
327
325
|
# n = 'HOME' if n == 'basedir'
|
328
326
|
# user_defaults[n.upcase] = v.strip
|
@@ -330,6 +328,8 @@ module Rye
|
|
330
328
|
# In Solaris, useradd -D says the default home path is /home
|
331
329
|
# but that directory is not writable. See: http://bit.ly/IJDD0
|
332
330
|
user_defaults['HOME'] = '/export/home'
|
331
|
+
elsif ostmp == "darwin"
|
332
|
+
user_defaults['HOME'] = '/Users'
|
333
333
|
else
|
334
334
|
n, v = nv.scan(/\A([\w_-]+?)=(.+)\z/).flatten
|
335
335
|
user_defaults[n] = v
|
@@ -353,6 +353,8 @@ module Rye
|
|
353
353
|
added_keys = []
|
354
354
|
rap = Rye::Rap.new(self)
|
355
355
|
|
356
|
+
prevdir = self.current_working_directory
|
357
|
+
|
356
358
|
# The homedir path is important b/c this is where we're going to
|
357
359
|
# look for the .ssh directory. That's where auth love is stored.
|
358
360
|
homedir = self.guess_user_home(this_user)
|
@@ -395,6 +397,8 @@ module Rye
|
|
395
397
|
self.chown(:R, this_user.to_s, File.dirname(akey_path))
|
396
398
|
end
|
397
399
|
|
400
|
+
# And let's return to the directory we came from.
|
401
|
+
self.cd prevdir
|
398
402
|
|
399
403
|
rap.add_exit_code(0)
|
400
404
|
rap
|
@@ -423,10 +427,50 @@ module Rye
|
|
423
427
|
def method_missing(meth, *args, &block)
|
424
428
|
raise Rye::CommandNotFound, "#{meth.to_s}"
|
425
429
|
end
|
430
|
+
|
431
|
+
# Returns the command an arguments as a String.
|
426
432
|
def preview_command(*args)
|
427
433
|
prep_args(*args).join(' ')
|
428
434
|
end
|
429
435
|
|
436
|
+
|
437
|
+
# Supply a block to be called before every command. It's called
|
438
|
+
# with three arguments: command name, an Array of arguments, user name
|
439
|
+
#
|
440
|
+
def pre_command_hook(&block)
|
441
|
+
@pre_command_hook = block if block
|
442
|
+
@pre_command_hook
|
443
|
+
end
|
444
|
+
|
445
|
+
# Execute a block in the context of an instance of Rye::Box.
|
446
|
+
#
|
447
|
+
# rbox = Rye::Box.new
|
448
|
+
#
|
449
|
+
# rbox.batch do
|
450
|
+
# ls :l
|
451
|
+
# uname :a
|
452
|
+
# end
|
453
|
+
# OR
|
454
|
+
# rbox.batch(&block)
|
455
|
+
#
|
456
|
+
#
|
457
|
+
def batch(&block)
|
458
|
+
instance_eval &block
|
459
|
+
end
|
460
|
+
|
461
|
+
# Supply a block to be called after every command. It's called
|
462
|
+
# with one argument: an instance of Rye::Rap.
|
463
|
+
#
|
464
|
+
# When this block is supplied, the command does not raise an
|
465
|
+
# exception when the exit code is greater than 0 (the typical
|
466
|
+
# behavior) so the block needs to check the Rye::Rap object to
|
467
|
+
# determine whether an exception should be raised.
|
468
|
+
def post_command_hook(&block)
|
469
|
+
@post_command_hook = block if block
|
470
|
+
@post_command_hook
|
471
|
+
end
|
472
|
+
|
473
|
+
|
430
474
|
private
|
431
475
|
|
432
476
|
def debug(msg="unknown debug msg"); @debug.puts msg if @debug; end
|
@@ -491,6 +535,19 @@ module Rye
|
|
491
535
|
info "COMMAND: #{cmd_clean}"
|
492
536
|
debug "Executing: %s" % cmd_clean
|
493
537
|
|
538
|
+
if @pre_command_hook.is_a?(Proc)
|
539
|
+
@pre_command_hook.call(cmd, args, opts[:user])
|
540
|
+
end
|
541
|
+
|
542
|
+
## NOTE: Do not raise a CommandNotFound exception in this method.
|
543
|
+
# We want it to be possible to define methods to a single instance
|
544
|
+
# of Rye::Box. i.e. def rbox.rm()...
|
545
|
+
# can? returns the methods in Rye::Cmd so it would incorrectly
|
546
|
+
# return false. We could use self.respond_to? but it's possible
|
547
|
+
# to get a name collision. I could write a work around but I think
|
548
|
+
# this is good enough for now.
|
549
|
+
## raise Rye::CommandNotFound unless self.can?(cmd)
|
550
|
+
|
494
551
|
stdout, stderr, ecode, esignal = net_ssh_exec!(cmd_clean)
|
495
552
|
|
496
553
|
rap = Rye::Rap.new(self)
|
@@ -500,11 +557,15 @@ module Rye
|
|
500
557
|
rap.exit_signal = esignal
|
501
558
|
rap.cmd = cmd
|
502
559
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
560
|
+
if @post_command_hook.is_a?(Proc)
|
561
|
+
@post_command_hook.call(rap)
|
562
|
+
else
|
563
|
+
# It seems a convention for various commands to return -1
|
564
|
+
# when something only mildly concerning happens. ls even
|
565
|
+
# returns -1 for apparently no reason sometimes. In any
|
566
|
+
# case, the real errors are the ones greater than zero
|
567
|
+
raise Rye::CommandError.new(rap) if ecode > 0
|
568
|
+
end
|
508
569
|
|
509
570
|
rap
|
510
571
|
end
|
@@ -594,7 +655,7 @@ module Rye
|
|
594
655
|
end
|
595
656
|
|
596
657
|
if @current_working_directory
|
597
|
-
info "CWD (#{@current_working_directory})
|
658
|
+
info "CWD (#{@current_working_directory})"
|
598
659
|
end
|
599
660
|
|
600
661
|
files = [files].flatten.compact || []
|
data/lib/rye/cmd.rb
CHANGED
@@ -23,7 +23,8 @@ module Rye;
|
|
23
23
|
# TODO: Clean this trite mess up!
|
24
24
|
#++
|
25
25
|
|
26
|
-
|
26
|
+
# NOTE: See Rye::Box for the implementation of cd
|
27
|
+
#def cd(*args); cmd('cd', args); end
|
27
28
|
def wc(*args); cmd('wc', args); end
|
28
29
|
def cp(*args); cmd("cp", args); end
|
29
30
|
def mv(*args); cmd("mv", args); end
|
data/rye.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
@spec = Gem::Specification.new do |s|
|
2
2
|
s.name = "rye"
|
3
3
|
s.rubyforge_project = "rye"
|
4
|
-
s.version = "0.6.
|
4
|
+
s.version = "0.6.4"
|
5
5
|
s.summary = "Rye: Safely run SSH commands on a bunch of machines at the same time (from Ruby)."
|
6
6
|
s.description = s.summary
|
7
7
|
s.author = "Delano Mandelbaum"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rye
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Delano Mandelbaum
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-05-
|
12
|
+
date: 2009-05-03 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|