delano-rye 0.8.6 → 0.8.7
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +11 -3
- data/lib/rye.rb +1 -1
- data/lib/rye/box.rb +31 -13
- data/lib/rye/cmd.rb +22 -9
- data/rye.gemspec +1 -1
- metadata +1 -1
data/CHANGES.txt
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
RYE, CHANGES
|
2
2
|
|
3
|
-
TODO
|
4
3
|
|
5
|
-
|
6
|
-
|
4
|
+
#### 0.8.7 (2009-08-11) #############################
|
5
|
+
|
6
|
+
* FIXED: Rye::Box info level output is cleaner
|
7
|
+
* FIXED: file_upload / download now expanding local tildas when safemode is disabled
|
8
|
+
* ADDED: Interactive handling for removing gems
|
9
|
+
* ADDED: dir_upload and dir_download
|
7
10
|
|
8
11
|
|
9
12
|
#### 0.8.6 (2009-08-04) #############################
|
@@ -277,3 +280,8 @@ Rye.shell and Rye::Box.run_command (SSH) commands.
|
|
277
280
|
|
278
281
|
Initial public release
|
279
282
|
|
283
|
+
|
284
|
+
#### TODO ###########################################
|
285
|
+
|
286
|
+
* Re-implement Rye::Rap as an Observable StringIO object for dynamic printing of output.
|
287
|
+
* Fingerprints: ssh-keygen -l -f id_rsa_repos.pub
|
data/lib/rye.rb
CHANGED
data/lib/rye/box.rb
CHANGED
@@ -169,7 +169,7 @@ module Rye
|
|
169
169
|
@rye_current_working_directory = fpath
|
170
170
|
end
|
171
171
|
end
|
172
|
-
|
172
|
+
debug "CWD: #{@rye_current_working_directory}"
|
173
173
|
self
|
174
174
|
end
|
175
175
|
# Like [] except it returns an empty Rye::Rap object to mimick
|
@@ -720,7 +720,7 @@ module Rye
|
|
720
720
|
## raise Rye::CommandNotFound unless self.can?(cmd)
|
721
721
|
|
722
722
|
begin
|
723
|
-
|
723
|
+
debug "COMMAND: #{cmd_internal}"
|
724
724
|
|
725
725
|
if !@rye_quiet && @rye_pre_command_hook.is_a?(Proc)
|
726
726
|
@rye_pre_command_hook.call(cmd_clean, user, host, nickname)
|
@@ -802,11 +802,11 @@ module Rye
|
|
802
802
|
#
|
803
803
|
def net_ssh_exec!(command)
|
804
804
|
|
805
|
-
block ||= Proc.new do |channel, type, data|
|
805
|
+
block ||= Proc.new do |channel, type, data, tt|
|
806
806
|
|
807
807
|
channel[:stdout] ||= ""
|
808
808
|
channel[:stderr] ||= ""
|
809
|
-
|
809
|
+
|
810
810
|
|
811
811
|
if type == :stderr
|
812
812
|
# NOTE: Use sudo to test this since it prompts for a passwords.
|
@@ -824,7 +824,15 @@ module Rye
|
|
824
824
|
# return the following error and appear to hang. We
|
825
825
|
# catch it and raise the appropriate exception.
|
826
826
|
raise Rye::NoPty if data =~ /Pseudo-terminal will not/
|
827
|
-
|
827
|
+
elsif type == :stdout
|
828
|
+
if data =~ /Select gem to uninstall/i
|
829
|
+
puts data
|
830
|
+
ret = Annoy.get_user_input('')
|
831
|
+
raise "No input given" if ret.nil?
|
832
|
+
channel.send_data "#{ret}\n"
|
833
|
+
else
|
834
|
+
channel[:stdout] << data
|
835
|
+
end
|
828
836
|
end
|
829
837
|
|
830
838
|
end
|
@@ -865,6 +873,7 @@ module Rye
|
|
865
873
|
|
866
874
|
|
867
875
|
# * +direction+ is one of :upload, :download
|
876
|
+
# * +recursive+ should be true for directories and false for files.
|
868
877
|
# * +files+ is an Array of file paths, the content is direction specific.
|
869
878
|
# For downloads, +files+ is a list of files to download. The last element
|
870
879
|
# must be the local directory to download to. If downloading a single file
|
@@ -878,14 +887,14 @@ module Rye
|
|
878
887
|
# parameters. An exception is raised and no files are transferred.
|
879
888
|
# Uploads always return nil. Downloads return nil or a StringIO object if
|
880
889
|
# one is specified for the target.
|
881
|
-
def net_scp_transfer!(direction, *files)
|
882
|
-
|
890
|
+
def net_scp_transfer!(direction, recursive, *files)
|
891
|
+
|
883
892
|
unless [:upload, :download].member?(direction.to_sym)
|
884
893
|
raise "Must be one of: upload, download"
|
885
894
|
end
|
886
895
|
|
887
896
|
if @rye_current_working_directory
|
888
|
-
|
897
|
+
debug "CWD (#{@rye_current_working_directory})"
|
889
898
|
end
|
890
899
|
|
891
900
|
files = [files].flatten.compact || []
|
@@ -911,7 +920,10 @@ module Rye
|
|
911
920
|
|
912
921
|
# Expand fileglobs (e.g. path/*.rb becomes [path/1.rb, path/2.rb]).
|
913
922
|
# This should happen after checking files.size to determine the target
|
914
|
-
|
923
|
+
unless @rye_safe
|
924
|
+
files.collect! { |file| Dir.glob File.expand_path(file) }
|
925
|
+
files.flatten!
|
926
|
+
end
|
915
927
|
end
|
916
928
|
|
917
929
|
# Fail early. We check whether the StringIO object is available to read
|
@@ -924,10 +936,10 @@ module Rye
|
|
924
936
|
end
|
925
937
|
end
|
926
938
|
|
927
|
-
info "#{direction.to_s
|
939
|
+
info "#{direction.to_s} to: #{target}"
|
928
940
|
debug "FILES: " << files.join(', ')
|
929
941
|
|
930
|
-
# Make sure the
|
942
|
+
# Make sure the target directory exists. We can do this only when
|
931
943
|
# there's more than one file because "target" could be a file name
|
932
944
|
if files.size > 1 && !target.is_a?(StringIO)
|
933
945
|
debug "CREATING TARGET DIRECTORY: #{target}"
|
@@ -936,14 +948,20 @@ module Rye
|
|
936
948
|
|
937
949
|
Net::SCP.start(@rye_host, @rye_opts[:user], @rye_opts || {}) do |scp|
|
938
950
|
transfers = []
|
951
|
+
prev = ""
|
939
952
|
files.each do |file|
|
940
953
|
debug file.to_s
|
941
|
-
|
942
|
-
|
954
|
+
prev = ""
|
955
|
+
transfers << scp.send(direction, file, target, :recursive => recursive) do |ch, n, s, t|
|
956
|
+
line = "%-50s %6d/%-6d bytes" % [n, s, t]
|
957
|
+
spaces = (prev.size > line.size) ? ' '*(prev.size - line.size) : ''
|
958
|
+
pinfo "%s %s \r" % [line, spaces] # update line: "file: sent/total"
|
943
959
|
@rye_info.flush if @rye_info # make sure every line is printed
|
960
|
+
prev = line
|
944
961
|
end
|
945
962
|
end
|
946
963
|
transfers.each { |t| t.wait } # Run file transfers in parallel
|
964
|
+
pinfo (' '*prev.size) << "\r"
|
947
965
|
info $/
|
948
966
|
end
|
949
967
|
|
data/lib/rye/cmd.rb
CHANGED
@@ -25,11 +25,11 @@ module Rye;
|
|
25
25
|
|
26
26
|
# NOTE: See Rye::Box for the implementation of cd
|
27
27
|
#def cd(*args); cmd('cd', args); end
|
28
|
+
#def rm(*args); cmd('rm', args); end
|
28
29
|
def wc(*args); cmd('wc', args); end
|
29
30
|
def cp(*args); cmd("cp", args); end
|
30
31
|
def mv(*args); cmd("mv", args); end
|
31
32
|
def ls(*args); cmd('ls', args); end
|
32
|
-
#def rm(*args); cmd('rm', args); end
|
33
33
|
def ps(*args); cmd('ps', args); end
|
34
34
|
def sh(*args); cmd('sh', args); end
|
35
35
|
def df(*args); cmd('df', args); end
|
@@ -47,6 +47,7 @@ module Rye;
|
|
47
47
|
def tar(*args); cmd('tar', args); end
|
48
48
|
|
49
49
|
#def kill(*args); cmd('kill', args); end
|
50
|
+
def rake(*args); cmd('sudo', args); end
|
50
51
|
def sudo(*args); cmd('sudo', args); end
|
51
52
|
def grep(*args); cmd('grep', args); end
|
52
53
|
def date(*args); cmd('date', args); end
|
@@ -83,11 +84,11 @@ module Rye;
|
|
83
84
|
def printenv(*args); cmd('printenv', args); end
|
84
85
|
def hostname(*args); cmd('hostname', args); end
|
85
86
|
def rudy_ec2(*args); cmd('rudy-ec2', args); end
|
86
|
-
def
|
87
|
+
def rudy_sdb(*args); cmd('rudy-sdb', args); end
|
87
88
|
def configure(*args); cmd('./configure', args); end
|
88
89
|
|
89
90
|
# Transfer files to a machine via Net::SCP.
|
90
|
-
# * +
|
91
|
+
# * +paths+ is an Array of files to upload. The last element is the
|
91
92
|
# directory to upload to. If uploading a single file, the last element
|
92
93
|
# can be a file path. The list of files can also include StringIO objects.
|
93
94
|
# The target directory will be created if it does not exist, but only
|
@@ -97,10 +98,10 @@ module Rye;
|
|
97
98
|
# Always return nil.
|
98
99
|
#
|
99
100
|
# NOTE: Changes to current working directory with +cd+ or +[]+ are ignored.
|
100
|
-
def file_upload(*
|
101
|
+
def file_upload(*paths); net_scp_transfer!(:upload, false, *paths); end
|
101
102
|
|
102
103
|
# Transfer files from a machine via Net::SCP.
|
103
|
-
# * +
|
104
|
+
# * +paths+ is an Array of files to download. The last element must be the
|
104
105
|
# local directory to download to. If downloading a single file the last
|
105
106
|
# element can be a file path. The target can also be a StringIO object.
|
106
107
|
# The target directory will be created if it does not exist, but only
|
@@ -110,13 +111,25 @@ module Rye;
|
|
110
111
|
# Return nil or a StringIO object, if specified as the target.
|
111
112
|
#
|
112
113
|
# NOTE: Changes to current working directory with +cd+ or +[]+ are ignored.
|
113
|
-
def file_download(*
|
114
|
+
def file_download(*paths); net_scp_transfer!(:download, false, *paths); end
|
115
|
+
|
116
|
+
# Same as file_upload except directories are processed recursively. If
|
117
|
+
# any supplied paths are directories you need to use this method and not
|
118
|
+
# file_upload.
|
119
|
+
def dir_upload(*paths); net_scp_transfer!(:upload, true, *paths); end
|
120
|
+
alias_method :directory_upload, :dir_upload
|
121
|
+
|
122
|
+
# Same as file_download except directories are processed recursively. If
|
123
|
+
# any supplied paths are directories you need to use this method and not
|
124
|
+
# file_download.
|
125
|
+
def dir_download(*paths); net_scp_transfer!(:download, true, *paths); end
|
126
|
+
alias_method :directory_download, :dir_download
|
114
127
|
|
115
128
|
# Shorthand for +file_download('remote/path').string+
|
116
129
|
#
|
117
|
-
# Returns a String containing the content of all remote *
|
118
|
-
def string_download(*
|
119
|
-
net_scp_transfer!(:download, *
|
130
|
+
# Returns a String containing the content of all remote *paths*.
|
131
|
+
def string_download(*paths)
|
132
|
+
net_scp_transfer!(:download, *paths).string
|
120
133
|
end
|
121
134
|
alias_method :str_download, :string_download
|
122
135
|
|
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.8.
|
4
|
+
s.version = "0.8.7"
|
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"
|