ftp_paradise 1.4.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +319 -0
- data/bin/create_remote_directory +9 -0
- data/bin/ftp_get +17 -0
- data/bin/ftp_gtk3 +7 -0
- data/bin/ftp_upload +42 -0
- data/bin/ftp_upload_binary +18 -0
- data/bin/iftp +7 -0
- data/bin/remote_remove +28 -0
- data/doc/README.gen +302 -0
- data/doc/todo/TODO_FOR_FTP_PARADISE_PROJECT.md +79 -0
- data/ftp_paradise.gemspec +122 -0
- data/lib/ftp_paradise.rb +5 -0
- data/lib/ftp_paradise/base/cliner.rb +23 -0
- data/lib/ftp_paradise/base/colours.rb +83 -0
- data/lib/ftp_paradise/base/prototype.rb +171 -0
- data/lib/ftp_paradise/base/reset.rb +29 -0
- data/lib/ftp_paradise/colours/colours.rb +141 -0
- data/lib/ftp_paradise/colours/use_colours.rb +76 -0
- data/lib/ftp_paradise/configuration/configuration.rb +49 -0
- data/lib/ftp_paradise/connection/README.md +1 -0
- data/lib/ftp_paradise/connection/connection.rb +35 -0
- data/lib/ftp_paradise/connection/constants.rb +46 -0
- data/lib/ftp_paradise/connection/data.rb +164 -0
- data/lib/ftp_paradise/connection/debug.rb +78 -0
- data/lib/ftp_paradise/connection/directory_handling.rb +271 -0
- data/lib/ftp_paradise/connection/do_login.rb +108 -0
- data/lib/ftp_paradise/connection/download.rb +86 -0
- data/lib/ftp_paradise/connection/file_handling.rb +174 -0
- data/lib/ftp_paradise/connection/ftp_object.rb +21 -0
- data/lib/ftp_paradise/connection/initialize.rb +88 -0
- data/lib/ftp_paradise/connection/initialize_a_new_net_ftp_object_with_this_url.rb +20 -0
- data/lib/ftp_paradise/connection/is_connected.rb +46 -0
- data/lib/ftp_paradise/connection/misc.rb +474 -0
- data/lib/ftp_paradise/connection/notify.rb +71 -0
- data/lib/ftp_paradise/connection/password.rb +47 -0
- data/lib/ftp_paradise/connection/port.rb +33 -0
- data/lib/ftp_paradise/connection/remote_pwd.rb +72 -0
- data/lib/ftp_paradise/connection/remote_url.rb +164 -0
- data/lib/ftp_paradise/connection/remove.rb +143 -0
- data/lib/ftp_paradise/connection/reset.rb +78 -0
- data/lib/ftp_paradise/connection/run.rb +18 -0
- data/lib/ftp_paradise/connection/set_array_available_hosts.rb +27 -0
- data/lib/ftp_paradise/connection/set_input.rb +18 -0
- data/lib/ftp_paradise/connection/show.rb +153 -0
- data/lib/ftp_paradise/connection/sync_ftp_object_onto_the_main_namespace.rb +24 -0
- data/lib/ftp_paradise/connection/transfer_mode.rb +163 -0
- data/lib/ftp_paradise/connection/upload.rb +253 -0
- data/lib/ftp_paradise/connection/use_default_dataset.rb +40 -0
- data/lib/ftp_paradise/connection/username.rb +42 -0
- data/lib/ftp_paradise/constants/constants.rb +19 -0
- data/lib/ftp_paradise/constants/misc.rb +57 -0
- data/lib/ftp_paradise/constants/namespace.rb +14 -0
- data/lib/ftp_paradise/constants/newline.rb +14 -0
- data/lib/ftp_paradise/constants/roebe.rb +31 -0
- data/lib/ftp_paradise/constants/roebe_ftp_constants.rb +233 -0
- data/lib/ftp_paradise/entry/entry.rb +300 -0
- data/lib/ftp_paradise/gui/gtk2/ftp_paradise.rb +34 -0
- data/lib/ftp_paradise/gui/gtk3/ftp_paradise.rb +34 -0
- data/lib/ftp_paradise/gui/shared_code/ftp_paradise/ftp_paradise_module.rb +709 -0
- data/lib/ftp_paradise/images/connection_image.png +0 -0
- data/lib/ftp_paradise/interactive_ftp/constants.rb +103 -0
- data/lib/ftp_paradise/interactive_ftp/directory_handling.rb +216 -0
- data/lib/ftp_paradise/interactive_ftp/help.rb +50 -0
- data/lib/ftp_paradise/interactive_ftp/initialize.rb +27 -0
- data/lib/ftp_paradise/interactive_ftp/interactive_ftp.rb +998 -0
- data/lib/ftp_paradise/interactive_ftp/main_loop.rb +51 -0
- data/lib/ftp_paradise/interactive_ftp/menu.rb +786 -0
- data/lib/ftp_paradise/interactive_ftp/misc.rb +208 -0
- data/lib/ftp_paradise/interactive_ftp/mode.rb +124 -0
- data/lib/ftp_paradise/interactive_ftp/readline.rb +113 -0
- data/lib/ftp_paradise/interactive_ftp/remove.rb +97 -0
- data/lib/ftp_paradise/interactive_ftp/reset.rb +90 -0
- data/lib/ftp_paradise/interactive_ftp/run.rb +22 -0
- data/lib/ftp_paradise/interactive_ftp/show.rb +184 -0
- data/lib/ftp_paradise/interactive_ftp/upload.rb +90 -0
- data/lib/ftp_paradise/interactive_ftp/user_input.rb +53 -0
- data/lib/ftp_paradise/project/project.rb +64 -0
- data/lib/ftp_paradise/requires/common_basic_requires.rb +14 -0
- data/lib/ftp_paradise/requires/common_external_requires.rb +9 -0
- data/lib/ftp_paradise/requires/require_the_constants.rb +7 -0
- data/lib/ftp_paradise/requires/require_the_ftp_paradise_project.rb +18 -0
- data/lib/ftp_paradise/requires/require_the_ftp_paradise_project_with_the_GUI_bindings.rb +10 -0
- data/lib/ftp_paradise/requires/require_the_toplevel_methods.rb +24 -0
- data/lib/ftp_paradise/toplevel_methods/can_connect_to_remote_site.rb +28 -0
- data/lib/ftp_paradise/toplevel_methods/clear_user_dataset.rb +28 -0
- data/lib/ftp_paradise/toplevel_methods/connect.rb +50 -0
- data/lib/ftp_paradise/toplevel_methods/data.rb +31 -0
- data/lib/ftp_paradise/toplevel_methods/determine_user_dataset_from_this_hash.rb +37 -0
- data/lib/ftp_paradise/toplevel_methods/directory_related_actions.rb +33 -0
- data/lib/ftp_paradise/toplevel_methods/e.rb +16 -0
- data/lib/ftp_paradise/toplevel_methods/file_related_actions.rb +49 -0
- data/lib/ftp_paradise/toplevel_methods/ftp_object.rb +270 -0
- data/lib/ftp_paradise/toplevel_methods/is_on_roebe.rb +20 -0
- data/lib/ftp_paradise/toplevel_methods/login_name.rb +49 -0
- data/lib/ftp_paradise/toplevel_methods/misc.rb +16 -0
- data/lib/ftp_paradise/toplevel_methods/opn.rb +24 -0
- data/lib/ftp_paradise/toplevel_methods/password.rb +50 -0
- data/lib/ftp_paradise/toplevel_methods/port.rb +41 -0
- data/lib/ftp_paradise/toplevel_methods/rds.rb +18 -0
- data/lib/ftp_paradise/toplevel_methods/remote_url.rb +57 -0
- data/lib/ftp_paradise/toplevel_methods/time.rb +45 -0
- data/lib/ftp_paradise/toplevel_methods/upload_and_download.rb +108 -0
- data/lib/ftp_paradise/version/version.rb +19 -0
- data/lib/ftp_paradise/www/public/css/style.css +3 -0
- data/lib/ftp_paradise/www/sinatra_web_interface.rb +242 -0
- data/lib/ftp_paradise/www/views/index.slim +3 -0
- data/lib/ftp_paradise/www/views/layout.slim +11 -0
- data/lib/ftp_paradise/www/web_interface.cgi +34 -0
- data/lib/ftp_paradise/yaml/automatically_connect_on_startup_of_the_interactive_ftp_shell.yml +1 -0
- data/lib/ftp_paradise/yaml/debug.yml +1 -0
- data/lib/ftp_paradise/yaml/open_in_default_editor.yml +1 -0
- data/lib/ftp_paradise/yaml/show_full_names.yml +1 -0
- data/lib/ftp_paradise/yaml/use_colours.yml +1 -0
- data/test/testing_ftp_paradise.rb +94 -0
- data/test/testing_minimal_pure_net_ftp_example_to_connect.rb +28 -0
- data/test/testing_the_ftp_connection_component.rb +70 -0
- data/test/testing_upload_a_local_directory.rb +10 -0
- metadata +336 -0
@@ -0,0 +1,271 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'ftp_paradise/connection/directory_handling.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module FtpParadise
|
8
|
+
|
9
|
+
class Connection
|
10
|
+
|
11
|
+
require 'ftp_paradise/connection/remote_pwd.rb'
|
12
|
+
require 'ftp_paradise/connection/file_handling.rb'
|
13
|
+
|
14
|
+
# ========================================================================= #
|
15
|
+
# === report_current_remote_dir
|
16
|
+
#
|
17
|
+
# Gives you the current dir.
|
18
|
+
# ========================================================================= #
|
19
|
+
def report_current_remote_dir(
|
20
|
+
be_verbose = be_verbose?
|
21
|
+
)
|
22
|
+
begin
|
23
|
+
if be_verbose
|
24
|
+
opnn; e 'The remote directory is:'
|
25
|
+
e " #{sdir(return_remote_pwd)}"
|
26
|
+
end
|
27
|
+
rescue Exception => error
|
28
|
+
opnn; e error.class
|
29
|
+
opnn; e error
|
30
|
+
end
|
31
|
+
end; alias report_remote_directory report_current_remote_dir # === report_remote_directory
|
32
|
+
alias dir? report_current_remote_dir # === dir?
|
33
|
+
alias report_remote_pwd report_current_remote_dir # === report_remote_pwd
|
34
|
+
|
35
|
+
# ========================================================================= #
|
36
|
+
# === remote_chdir (cd tag, chdir tag)
|
37
|
+
#
|
38
|
+
# This method allows us to cd to another remote directory, on the
|
39
|
+
# remote FTP server (our main connection).
|
40
|
+
#
|
41
|
+
# The method must be able to check whether we are connected to the
|
42
|
+
# remote host.
|
43
|
+
# ========================================================================= #
|
44
|
+
def remote_chdir(
|
45
|
+
i,
|
46
|
+
be_verbose = be_verbose?
|
47
|
+
)
|
48
|
+
i = i.dup if i.frozen?
|
49
|
+
# ======================================================================= #
|
50
|
+
# Sanitize odd entries ending with ':'
|
51
|
+
# ======================================================================= #
|
52
|
+
i[-1,1] = '/' if i.end_with? ':'
|
53
|
+
i = rds("#{i}/") # <- Always ensure that a '/' is the last character.
|
54
|
+
if be_verbose
|
55
|
+
notify_the_user_about(i, __method__)
|
56
|
+
end
|
57
|
+
if is_connected?
|
58
|
+
# ===================================================================== #
|
59
|
+
# If we cd to a non-existing target, the exception Net::FTPPermError
|
60
|
+
# will be raised.
|
61
|
+
# ===================================================================== #
|
62
|
+
begin
|
63
|
+
ftp_object?.chdir(i)
|
64
|
+
update_remote_file_listing
|
65
|
+
# ===================================================================== #
|
66
|
+
# The user may have insufficient permissions:
|
67
|
+
# ===================================================================== #
|
68
|
+
rescue Net::FTPPermError => error
|
69
|
+
pp error
|
70
|
+
rescue Net::ReadTimeout => error
|
71
|
+
opnn; e 'An error was encountered in the method '\
|
72
|
+
'remote_chdir().'
|
73
|
+
opnn; e 'The error-class was Net::ReadTimeout.'
|
74
|
+
e
|
75
|
+
opnn; e 'The specific error will be displayed next.'
|
76
|
+
e
|
77
|
+
pp error
|
78
|
+
end
|
79
|
+
else
|
80
|
+
opnn; e 'We are not connected to a remote host right now.'
|
81
|
+
opnn; e 'Thus we can not change the directory.'
|
82
|
+
end
|
83
|
+
report_current_remote_dir if be_verbose # right now mandatory
|
84
|
+
end; alias rcd remote_chdir # === rcd
|
85
|
+
alias remote_cd remote_chdir # === remote_cd
|
86
|
+
alias chdir remote_chdir # === chdir
|
87
|
+
alias cd remote_chdir # === cd
|
88
|
+
alias chdir remote_chdir # === chdir
|
89
|
+
alias rcd remote_chdir # === rcd
|
90
|
+
alias change_directory remote_chdir # === change_directory
|
91
|
+
alias change_remote_directory remote_chdir # === change_remote_directory
|
92
|
+
alias cd_into_this_remote_directory remote_chdir # === cd_into_this_remote_directory
|
93
|
+
alias remote_change_directory remote_chdir # === remote_change_directory
|
94
|
+
|
95
|
+
# ========================================================================= #
|
96
|
+
# === return_remote_directories
|
97
|
+
#
|
98
|
+
# Give us a list of (remote) directories - only directories, not
|
99
|
+
# files.
|
100
|
+
#
|
101
|
+
# An Array will be returned as a result.
|
102
|
+
# ========================================================================= #
|
103
|
+
def return_remote_directories
|
104
|
+
_ = []
|
105
|
+
update_file_listing # Populate the file listing anew, so we will always get proper results back.
|
106
|
+
raw_listing?.each {|entry|
|
107
|
+
entry = FtpParadise::Entry.new(entry)
|
108
|
+
_ << rds(entry.return_name) if entry.is_a_directory?
|
109
|
+
}
|
110
|
+
# ======================================================================= #
|
111
|
+
# Directories must end with '/'. Ensure this to be the case next.
|
112
|
+
# ======================================================================= #
|
113
|
+
_.map! {|entry|
|
114
|
+
entry << '/' unless entry.end_with? '/'
|
115
|
+
entry
|
116
|
+
}
|
117
|
+
return _
|
118
|
+
end; alias directories? return_remote_directories # === directories?
|
119
|
+
alias return_directories return_remote_directories # === return_directories
|
120
|
+
|
121
|
+
# ========================================================================= #
|
122
|
+
# === return_remote_directory_content
|
123
|
+
#
|
124
|
+
# This method will return ALL remote entries, no matter if file or
|
125
|
+
# directory.
|
126
|
+
# ========================================================================= #
|
127
|
+
def return_remote_directory_content
|
128
|
+
raw_entries = raw_entries?
|
129
|
+
if raw_entries.nil?
|
130
|
+
populate_raw_entries
|
131
|
+
raw_entries = raw_entries?
|
132
|
+
end
|
133
|
+
if raw_entries
|
134
|
+
_ = raw_entries.reject {|line|
|
135
|
+
line.empty?
|
136
|
+
}.map {|entry|
|
137
|
+
FtpParadise::Entry.new(entry).name?
|
138
|
+
}
|
139
|
+
end
|
140
|
+
return _
|
141
|
+
end; alias array_file_listing? return_remote_directory_content # === array_file_listing?
|
142
|
+
alias array_file_listing return_remote_directory_content # === array_file_listing
|
143
|
+
alias remote_directory_content return_remote_directory_content # === remote_directory_content
|
144
|
+
alias list? return_remote_directory_content # === list?
|
145
|
+
|
146
|
+
# ========================================================================= #
|
147
|
+
# === is_a_directory?
|
148
|
+
#
|
149
|
+
# This method queries whether the given input is a (remote) directory.
|
150
|
+
# For this to work, the given input must obviously exist as file or
|
151
|
+
# directory.
|
152
|
+
# ========================================================================= #
|
153
|
+
def is_a_directory?(i)
|
154
|
+
update_file_listing
|
155
|
+
candidates = file_listing_as_entries?.select {|entry|
|
156
|
+
entry.is_a_directory?
|
157
|
+
}.map(&:last)
|
158
|
+
candidates.include? i
|
159
|
+
end; alias is_directory? is_a_directory? # === is_directory?
|
160
|
+
alias is_a_directory? is_a_directory? # === is_a_directory?
|
161
|
+
alias this_remote_directory_exists? is_a_directory? # === this_remote_directory_exists?
|
162
|
+
alias is_dir? is_a_directory? # === is_dir?
|
163
|
+
|
164
|
+
# ========================================================================= #
|
165
|
+
# === remote_directory_is_empty?
|
166
|
+
#
|
167
|
+
# This method will return a Boolean - true if the remote directory
|
168
|
+
# is empty, and false otherwise.
|
169
|
+
# ========================================================================= #
|
170
|
+
def remote_directory_is_empty?
|
171
|
+
_ = return_remote_directory_content
|
172
|
+
_.reject! {|entry|
|
173
|
+
(entry == '.') or (entry == '..')
|
174
|
+
}
|
175
|
+
_.empty?
|
176
|
+
end
|
177
|
+
|
178
|
+
# ========================================================================= #
|
179
|
+
# === create_this_remote_directory (mkdir tag)
|
180
|
+
#
|
181
|
+
# This method will attempt to create a remote directory.
|
182
|
+
#
|
183
|
+
# A Net::FTPPermError may result if the permission does not allow for
|
184
|
+
# that action.
|
185
|
+
# ========================================================================= #
|
186
|
+
def create_this_remote_directory(
|
187
|
+
i, be_verbose = be_verbose?
|
188
|
+
)
|
189
|
+
if i.is_a? Array
|
190
|
+
i.each {|entry| create_this_remote_directory(entry, be_verbose) }
|
191
|
+
else
|
192
|
+
i = rds(i+'/')
|
193
|
+
if be_verbose
|
194
|
+
notify_the_user_about(i, __method__)
|
195
|
+
if is_directory?(i)
|
196
|
+
opnn; e swarn('Warning - the remote directory ')+
|
197
|
+
sdir(i)+swarn(' already exists.')
|
198
|
+
opnn; e swarn('We thus can not create a new directory.')
|
199
|
+
end
|
200
|
+
end
|
201
|
+
begin
|
202
|
+
ftp_object?.mkdir(i)
|
203
|
+
rescue Net::FTPConnectionError
|
204
|
+
opnn; e 'Not connected - is the network down/available?'
|
205
|
+
rescue Net::FTPPermError
|
206
|
+
opnn; e "Net::FTPPermError: Can not create the remote "\
|
207
|
+
"directory `#{remote_path?}#{sdir(i)}`"
|
208
|
+
opnn; e 'as it - or a file with the same name - already exists.'
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end; alias mkdir create_this_remote_directory # === mkdir
|
212
|
+
alias rmkdir create_this_remote_directory # === rmkdir
|
213
|
+
alias remote_mkdir create_this_remote_directory # === remote_mkdir
|
214
|
+
alias create_directory create_this_remote_directory # === create_directory
|
215
|
+
alias create_these_remote_directories create_this_remote_directory # === create_these_remote_directories
|
216
|
+
alias remote_create_directory create_this_remote_directory # === remote_create_directory
|
217
|
+
alias create_remote_directory create_this_remote_directory # === create_remote_directory
|
218
|
+
|
219
|
+
# ========================================================================= #
|
220
|
+
# === sanitize_remote_directory_content
|
221
|
+
#
|
222
|
+
# The purpose of this method is to clean up the remote dataset.
|
223
|
+
#
|
224
|
+
# Keep in mind that the output comes in something like:
|
225
|
+
#
|
226
|
+
# "-rw-rw-rw- 1 web netscape 6820 May 30 2011 AppendToCookbook.rb"
|
227
|
+
# "drwxrwxrwx 2 web netscape 8192 Oct 29 2007 CSS"
|
228
|
+
# "-rw-rw-rw- 1 web netscape 10548 May 30 2011 Chained.rb"
|
229
|
+
# "-rw-r--r-- 1 330 330 237904 Jun 9 14:24 11.03.2003_UniWien_Biologie_EinfuehrungInDieMikrobiologie.jpg",
|
230
|
+
#
|
231
|
+
# This should contain all the information that is needed.
|
232
|
+
# ========================================================================= #
|
233
|
+
def sanitize_remote_directory_content
|
234
|
+
_ = []
|
235
|
+
raw_entries?.each { |e|
|
236
|
+
next if e.empty?
|
237
|
+
entry = FtpParadise::Entry.new(e)
|
238
|
+
filesize = entry.filesize?
|
239
|
+
timestamp = entry.parsed_timestamp?
|
240
|
+
# ===================================================================== #
|
241
|
+
# === Exclude 3 entries next
|
242
|
+
# ===================================================================== #
|
243
|
+
next if e.include? 'total' or
|
244
|
+
entry.name? == '.' or
|
245
|
+
entry.name? == '..' # Batch next.
|
246
|
+
# ===================================================================== #
|
247
|
+
# === Build up the final Array
|
248
|
+
#
|
249
|
+
# Our Array will have four entries:
|
250
|
+
#
|
251
|
+
# (1) Filename
|
252
|
+
# (2) File or Directory (String)
|
253
|
+
# (3) Filesize
|
254
|
+
# (4) Timestamp
|
255
|
+
#
|
256
|
+
# ===================================================================== #
|
257
|
+
_ << [ rds(entry.filename?), entry.file_or_directory, filesize, timestamp ]
|
258
|
+
}
|
259
|
+
@internal_hash[:sanitized_remote_directory_content] = _ #.compact
|
260
|
+
end
|
261
|
+
|
262
|
+
# ========================================================================= #
|
263
|
+
# === sanitized_remote_directory_content?
|
264
|
+
# ========================================================================= #
|
265
|
+
def sanitized_remote_directory_content?
|
266
|
+
update_remote_file_listing
|
267
|
+
sanitize_remote_directory_content
|
268
|
+
@internal_hash[:sanitized_remote_directory_content]
|
269
|
+
end
|
270
|
+
|
271
|
+
end; end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'ftp_paradise/connection/do_login.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module FtpParadise
|
8
|
+
|
9
|
+
class Connection
|
10
|
+
|
11
|
+
require 'ftp_paradise/toplevel_methods/remote_url.rb'
|
12
|
+
|
13
|
+
require 'ftp_paradise/connection/initialize_a_new_net_ftp_object_with_this_url.rb'
|
14
|
+
require 'ftp_paradise/connection/is_connected.rb'
|
15
|
+
require 'ftp_paradise/connection/password.rb'
|
16
|
+
require 'ftp_paradise/connection/sync_ftp_object_onto_the_main_namespace.rb'
|
17
|
+
|
18
|
+
# ========================================================================= #
|
19
|
+
# === do_login
|
20
|
+
#
|
21
|
+
# This method is responsible for the login-action.
|
22
|
+
#
|
23
|
+
# The method signature for the net-ftp class' .login() is:
|
24
|
+
#
|
25
|
+
# login(user = "anonymous", passwd = nil, acct = nil)
|
26
|
+
#
|
27
|
+
# This method here accepts a Hash as first argument.
|
28
|
+
#
|
29
|
+
# For official information about .login(), see here:
|
30
|
+
#
|
31
|
+
# https://ruby-doc.org/stdlib/libdoc/net/ftp/rdoc/Net/FTP.html#method-i-login
|
32
|
+
#
|
33
|
+
# ========================================================================= #
|
34
|
+
def do_login(
|
35
|
+
to_this_url = nil, # The remote URL.
|
36
|
+
use_this_as_username = username?, # The login-name.
|
37
|
+
use_this_as_password = password?, # The password for that user.
|
38
|
+
be_verbose = be_verbose?
|
39
|
+
)
|
40
|
+
if to_this_url.nil?
|
41
|
+
to_this_url = FtpParadise.remote_url?
|
42
|
+
elsif to_this_url.is_a? Hash
|
43
|
+
end
|
44
|
+
# ======================================================================= #
|
45
|
+
# Rescue nil-passwords here.
|
46
|
+
# ======================================================================= #
|
47
|
+
if use_this_as_password.to_s.empty?
|
48
|
+
use_this_as_password = set_password(:try_to_use_a_default_password)
|
49
|
+
end
|
50
|
+
if be_verbose
|
51
|
+
# ===================================================================== #
|
52
|
+
# Display some info to the user here.
|
53
|
+
# ===================================================================== #
|
54
|
+
e; cliner
|
55
|
+
opnn; e "Using the URL #{royalblue(to_this_url)} (remote FTP host)."
|
56
|
+
e
|
57
|
+
e " Username: #{slateblue(use_this_as_username)}"
|
58
|
+
e " Password: #{slateblue(use_this_as_password)}"
|
59
|
+
e
|
60
|
+
report_transfer_mode_in_use
|
61
|
+
e
|
62
|
+
cliner
|
63
|
+
end
|
64
|
+
if ftp_object?.nil? and !to_this_url.nil?
|
65
|
+
initialize_a_new_net_ftp_object_with_this_url(to_this_url)
|
66
|
+
end
|
67
|
+
use_this_as_username = use_this_as_username.to_s
|
68
|
+
# ======================================================================= #
|
69
|
+
# The following code must be rescued because the login() method
|
70
|
+
# may fail in various ways.
|
71
|
+
# ======================================================================= #
|
72
|
+
begin
|
73
|
+
ftp_object?.login(
|
74
|
+
use_this_as_username,
|
75
|
+
use_this_as_password
|
76
|
+
)
|
77
|
+
# =================================================================== #
|
78
|
+
# Next, assign towards the toplevel reference to the ftp-connection.
|
79
|
+
# =================================================================== #
|
80
|
+
sync_ftp_object_onto_the_main_namespace if ftp_object?
|
81
|
+
if be_verbose and is_connected?
|
82
|
+
e
|
83
|
+
cliner {
|
84
|
+
e "- #{sfancy('Successfully')} logged into "\
|
85
|
+
"the remote FTP host at `#{simp(to_this_url)}`"
|
86
|
+
}
|
87
|
+
end
|
88
|
+
rescue Net::FTPPermError => error
|
89
|
+
opnn; e "We could not connect and login to `#{sfancy(to_this_url)}`."
|
90
|
+
opnn; e 'It may be that you lack the proper permissions.'
|
91
|
+
opnn; e 'This may happen because the user/password combination was'
|
92
|
+
opnn; e 'incorrect. User and password combination will be shown next:'
|
93
|
+
show_user_and_password
|
94
|
+
opnn; e "Feedbacking that error next, of class #{error.class.to_s}:"
|
95
|
+
opnn; e orange(error.to_s)
|
96
|
+
rescue Net::FTPConnectionError => error
|
97
|
+
opnn; e 'We do not seem to be connected. An error happened.'
|
98
|
+
pp error
|
99
|
+
pp error.class
|
100
|
+
end
|
101
|
+
end; alias do_connect do_login # === do_connect
|
102
|
+
alias connect_to do_login # === connect_to
|
103
|
+
alias connect do_login # === connect
|
104
|
+
alias login do_login # === login
|
105
|
+
alias login_to do_login # === login_to
|
106
|
+
alias reconnect do_login # === reconnect
|
107
|
+
|
108
|
+
end; end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/ruby -w
|
2
|
+
# Encoding: UTF-8
|
3
|
+
# frozen_string_literal: true
|
4
|
+
# =========================================================================== #
|
5
|
+
# require 'ftp_paradise/connection/download.rb'
|
6
|
+
# =========================================================================== #
|
7
|
+
module FtpParadise
|
8
|
+
|
9
|
+
class Connection
|
10
|
+
|
11
|
+
# ========================================================================= #
|
12
|
+
# === download_binary_file
|
13
|
+
#
|
14
|
+
# Use this method to download a binary file, by calling the method
|
15
|
+
# getbinaryfile(). You can download as many files as you want to
|
16
|
+
# through this method, but we expect this method to be a binary
|
17
|
+
# file.
|
18
|
+
#
|
19
|
+
# Specific usage example:
|
20
|
+
#
|
21
|
+
# ftp?.download_binary_file('photos_2009-03-29.zip', 'ftp_photos/photos.zip')
|
22
|
+
#
|
23
|
+
# ========================================================================= #
|
24
|
+
def download_binary_file(
|
25
|
+
i,
|
26
|
+
be_verbose = be_verbose?
|
27
|
+
)
|
28
|
+
if i.is_a? Array
|
29
|
+
i.each {|entry| download_binary_file(entry) }
|
30
|
+
else
|
31
|
+
ftp?.getbinaryfile(i) # Delegate towards .getbinaryfile()
|
32
|
+
if be_verbose
|
33
|
+
e "Downloaded file #{sfile(i)}."
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end; alias getbinaryfile download_binary_file # === getbinaryfile
|
37
|
+
|
38
|
+
# ========================================================================= #
|
39
|
+
# === download_remote_file (download tag)
|
40
|
+
#
|
41
|
+
# Use this method to download a remote file. If you are sure to have
|
42
|
+
# a binary file, the method download_binary_file() could be used
|
43
|
+
# instead.
|
44
|
+
#
|
45
|
+
# gettextfile(remotefile, localfile = File.basename(remotefile)) {|line| ...}
|
46
|
+
# ========================================================================= #
|
47
|
+
def download_remote_file(
|
48
|
+
i, be_verbose = be_verbose?
|
49
|
+
)
|
50
|
+
if i.is_a? Array # Handle arrays first.
|
51
|
+
i.each {|entry| download_remote_file(entry, be_verbose) }
|
52
|
+
else
|
53
|
+
if i =~ /^\d+$/ # if is a number
|
54
|
+
update_file_listing
|
55
|
+
i = return_remote_files[i.to_i - 1].first
|
56
|
+
end
|
57
|
+
if i == '*' # Here we want to download all files, as we passed in '*'.
|
58
|
+
i = []
|
59
|
+
update_file_listing
|
60
|
+
return_remote_files.each { |a,b| i << FtpParadise.rds(a) }
|
61
|
+
end
|
62
|
+
if be_verbose
|
63
|
+
notify_the_user_about(i, __method__)
|
64
|
+
end
|
65
|
+
set_file(i) # This assigns to @internal_hash[:file].
|
66
|
+
begin # We can use @file because we called set_file() before.
|
67
|
+
ftp_object?.gettextfile(file?)
|
68
|
+
basename = File.basename(file?)
|
69
|
+
e "Finished downloading `#{sandybrown(file?)}`"
|
70
|
+
e 'into `'+sdir(rds(Dir.pwd+'/'+basename))+'`.'
|
71
|
+
return file?
|
72
|
+
rescue Net::FTPPermError => error
|
73
|
+
pp error
|
74
|
+
e 'An exception occurred in the method '+sfancy('download()')+'.'
|
75
|
+
e 'The error was a '+sfancy('Permission Error')+', the input '\
|
76
|
+
'to the method was: `'+simp(i)+'`.'
|
77
|
+
e 'Is the file that you are trying to download really '\
|
78
|
+
'existing on the remote server?'
|
79
|
+
return false
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end; alias download download_remote_file # === download
|
83
|
+
alias download_this_remote_file download_remote_file # === download_this_remote_file
|
84
|
+
alias download_this_file download_remote_file # === download_this_file
|
85
|
+
|
86
|
+
end; end
|