sffftp 0.0.1
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/.gitignore +18 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +20 -0
- data/README.md +7 -0
- data/Rakefile +1 -0
- data/example/sample.rb +30 -0
- data/example/sample_with_batchbase.rb +68 -0
- data/lib/sffftp.rb +5 -0
- data/lib/sffftp/sftp.rb +250 -0
- data/lib/sffftp/version.rb +3 -0
- data/sffftp.gemspec +26 -0
- data/test/test.rb +248 -0
- data/test/test_helper.rb +10 -0
- metadata +76 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
sffftp (0.0.1)
|
5
|
+
net-sftp
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: http://rubygems.org/
|
9
|
+
specs:
|
10
|
+
net-sftp (2.1.2)
|
11
|
+
net-ssh (>= 2.6.5)
|
12
|
+
net-ssh (2.6.6)
|
13
|
+
test-unit (2.5.2)
|
14
|
+
|
15
|
+
PLATFORMS
|
16
|
+
ruby
|
17
|
+
|
18
|
+
DEPENDENCIES
|
19
|
+
sffftp!
|
20
|
+
test-unit (= 2.5.2)
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/example/sample.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'sffftp'
|
2
|
+
|
3
|
+
REMOTE_HOST = 'localhost'
|
4
|
+
REMOTE_USER_NAME = 'paco'
|
5
|
+
REMOTE_USER_PASSWORD = nil
|
6
|
+
WORK_SPACE = '/tmp/test/sffftp_sample/'
|
7
|
+
REMOTE_PATH = WORK_SPACE + 'remote/'
|
8
|
+
QUEUE_FOLDER = WORK_SPACE + 'from/'
|
9
|
+
OK_FOLDER = WORK_SPACE + 'ok'
|
10
|
+
NG_FOLDER = WORK_SPACE + 'ng'
|
11
|
+
|
12
|
+
<<`MKDIR`
|
13
|
+
mkdir -p /tmp/test/sffftp_sample/from
|
14
|
+
mkdir -p /tmp/test/sffftp_sample/ok
|
15
|
+
mkdir -p /tmp/test/sffftp_sample/ng
|
16
|
+
mkdir -p /tmp/test/sffftp_sample/remote
|
17
|
+
touch /tmp/test/sffftp_sample/from/file1
|
18
|
+
touch /tmp/test/sffftp_sample/from/file2.tmp
|
19
|
+
touch /tmp/test/sffftp_sample/from/file3.ok
|
20
|
+
MKDIR
|
21
|
+
|
22
|
+
sffftp = sffftp::Scp.new
|
23
|
+
sffftp.remote_host = REMOTE_HOST
|
24
|
+
sffftp.remote_user_name = REMOTE_USER_NAME
|
25
|
+
sffftp.remote_user_password = REMOTE_USER_PASSWORD
|
26
|
+
sffftp.remote_path = REMOTE_PATH
|
27
|
+
sffftp.queue_folder = QUEUE_FOLDER
|
28
|
+
sffftp.ok_folder = OK_FOLDER
|
29
|
+
sffftp.ng_folder = NG_FOLDER
|
30
|
+
sffftp.proceed
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'sffftp'
|
4
|
+
|
5
|
+
require 'batchbase'
|
6
|
+
include Batchbase::Core
|
7
|
+
# https://github.com/pacojp/batchbase
|
8
|
+
#
|
9
|
+
# 2重起動防止
|
10
|
+
# シグナル管理
|
11
|
+
# デーモン化
|
12
|
+
#
|
13
|
+
|
14
|
+
#create_logger('/tmp/batchbase_test_sample1.log')
|
15
|
+
create_logger(STDOUT)
|
16
|
+
def receive_signal(signal)
|
17
|
+
logger.info("receive signal #{signal}")
|
18
|
+
@stop = true
|
19
|
+
end
|
20
|
+
set_signal_observer(:receive_signal,self)
|
21
|
+
@stop = false
|
22
|
+
|
23
|
+
REMOTE_HOST = 'localhost'
|
24
|
+
REMOTE_USER_NAME = 'paco'
|
25
|
+
REMOTE_USER_PASSWORD = nil
|
26
|
+
WORK_SPACE = '/tmp/test/sffftp_sample/'
|
27
|
+
REMOTE_PATH = WORK_SPACE + 'remote/'
|
28
|
+
QUEUE_FOLDER = WORK_SPACE + 'from/'
|
29
|
+
LOCKFILE = WORK_SPACE + '.sffftp.lock'
|
30
|
+
OK_FOLDER = WORK_SPACE + 'ok'
|
31
|
+
NG_FOLDER = WORK_SPACE + 'ng'
|
32
|
+
|
33
|
+
<<`MKDIR`
|
34
|
+
mkdir -p /tmp/test/sffftp_sample/from
|
35
|
+
mkdir -p /tmp/test/sffftp_sample/ok
|
36
|
+
mkdir -p /tmp/test/sffftp_sample/ng
|
37
|
+
mkdir -p /tmp/test/sffftp_sample/remote
|
38
|
+
touch /tmp/test/sffftp_sample/from/file1
|
39
|
+
touch /tmp/test/sffftp_sample/from/file2.tmp
|
40
|
+
touch /tmp/test/sffftp_sample/from/file3.ok
|
41
|
+
MKDIR
|
42
|
+
|
43
|
+
execute(:pid_file=>LOCKFILE) do
|
44
|
+
sffftp = Sffftp::Scp.new()
|
45
|
+
sffftp.logger = logger
|
46
|
+
sffftp.remote_host = REMOTE_HOST
|
47
|
+
sffftp.remote_user_name = REMOTE_USER_NAME
|
48
|
+
sffftp.remote_user_password = REMOTE_USER_PASSWORD
|
49
|
+
sffftp.remote_path = REMOTE_PATH
|
50
|
+
sffftp.queue_folder = QUEUE_FOLDER
|
51
|
+
sffftp.ok_folder = OK_FOLDER
|
52
|
+
sffftp.ng_folder = NG_FOLDER
|
53
|
+
set_signal_observer(:receive_signal,sffftp)
|
54
|
+
|
55
|
+
loop do
|
56
|
+
cnt = sffftp.proceed
|
57
|
+
logger.info "#{cnt} files uploaded"
|
58
|
+
break_loop = false
|
59
|
+
5.times do
|
60
|
+
sleep 1
|
61
|
+
if @stop
|
62
|
+
break_loop = true
|
63
|
+
break
|
64
|
+
end
|
65
|
+
end
|
66
|
+
break if break_loop
|
67
|
+
end
|
68
|
+
end
|
data/lib/sffftp.rb
ADDED
data/lib/sffftp/sftp.rb
ADDED
@@ -0,0 +1,250 @@
|
|
1
|
+
require 'net/sftp'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Sffftp
|
5
|
+
class Sftp
|
6
|
+
ATTRS = [
|
7
|
+
:remote_host,
|
8
|
+
:remote_user_name,
|
9
|
+
:remote_user_password,
|
10
|
+
:remote_path,
|
11
|
+
:remote_port,
|
12
|
+
:queue_folder,
|
13
|
+
:ok_folder,
|
14
|
+
:ng_folder,
|
15
|
+
:timeout,
|
16
|
+
:logger2ssh,
|
17
|
+
:logger
|
18
|
+
]
|
19
|
+
ATTRS.each do |_attr|
|
20
|
+
attr_accessor _attr
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_accessor :connection
|
24
|
+
|
25
|
+
def initialize(opts={})
|
26
|
+
self.remote_port = 22
|
27
|
+
self.logger = Logger.new(STDOUT)
|
28
|
+
opts.each do |k, v|
|
29
|
+
send("#{k}=", v)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def attrs_ok?
|
34
|
+
ATTRS.each do |attr|
|
35
|
+
#v = instance_variable_get("@#{attr.to_s}")
|
36
|
+
v = send(attr)
|
37
|
+
case attr
|
38
|
+
when :remote_user_name,:remote_user_password,:timeout,:logger2ssh
|
39
|
+
next
|
40
|
+
when :queue_folder,:ok_folder,:ng_folder
|
41
|
+
unless File.directory?(v)
|
42
|
+
raise "#{attr}:#{v} is not folder"
|
43
|
+
end
|
44
|
+
else
|
45
|
+
unless v
|
46
|
+
raise %|must set "#{attr}" at least|
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
true
|
51
|
+
end
|
52
|
+
|
53
|
+
def receive_signal(signal)
|
54
|
+
@killing = true
|
55
|
+
end
|
56
|
+
|
57
|
+
def connect(close_connected_instance=true)
|
58
|
+
if close_connected_instance
|
59
|
+
close if connection && connection.open?
|
60
|
+
end
|
61
|
+
if connection && connection.open?
|
62
|
+
unless close_connected_instance
|
63
|
+
return self.connection
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
opt = {}
|
68
|
+
opt[:port] = remote_port
|
69
|
+
if remote_user_password
|
70
|
+
opt[:password] = remote_user_password
|
71
|
+
end
|
72
|
+
if timeout
|
73
|
+
opt[:timeout] = timeout
|
74
|
+
end
|
75
|
+
if logger2ssh
|
76
|
+
opt[:logger] = logger
|
77
|
+
end
|
78
|
+
self.connection = Net::SFTP.start(remote_host, remote_user_name, opt)
|
79
|
+
end
|
80
|
+
|
81
|
+
def close
|
82
|
+
begin
|
83
|
+
if connection && connection.open?
|
84
|
+
connection.close
|
85
|
+
end
|
86
|
+
rescue
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def proceed
|
91
|
+
attrs_ok?
|
92
|
+
|
93
|
+
files = Dir::entries(queue_folder).map{|o|"#{queue_folder}/#{o}"}
|
94
|
+
files = files.select do |o|
|
95
|
+
File::ftype(o) == "file" &&
|
96
|
+
!(o =~ /\.(tmp|ok)$/)
|
97
|
+
end
|
98
|
+
|
99
|
+
unless @__not_first_time_to_proceed
|
100
|
+
logger.info("queue_folder: #{queue_folder}")
|
101
|
+
logger.info("target: #{remote_user_name}@#{remote_host}:#{remote_port}:#{remote_path}")
|
102
|
+
@__not_first_time_to_proceed = true
|
103
|
+
end
|
104
|
+
uploaded_count = 0
|
105
|
+
|
106
|
+
begin
|
107
|
+
connect
|
108
|
+
files.each do |file|
|
109
|
+
break if @killing
|
110
|
+
if upload!(file)
|
111
|
+
uploaded_count += 1
|
112
|
+
end
|
113
|
+
end
|
114
|
+
# ハンドルできないエラーは取り敢えず現状維持をモットーとする
|
115
|
+
rescue => e
|
116
|
+
logger.error e.message
|
117
|
+
logger.error e.backtrace.join("\n")
|
118
|
+
ensure
|
119
|
+
close
|
120
|
+
end
|
121
|
+
|
122
|
+
uploaded_count
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def upload!(file)
|
128
|
+
to_path = remote_path + '' + File.basename(file)
|
129
|
+
begin
|
130
|
+
logger.info "upload process start: #{file}"
|
131
|
+
# 既に同名ファイルがリモートに有る場合、対処できるならする
|
132
|
+
# 出来ないなら(okファイルもすでにある等)raiseする
|
133
|
+
erace_existed_file(to_path)
|
134
|
+
# リモートにファイルをアップする
|
135
|
+
return false unless upload_data_file(file,to_path)
|
136
|
+
# okファイルをリモートに作成する
|
137
|
+
return false unless create_ok_file(to_path)
|
138
|
+
# 処理終了フォルダにデータを移動する
|
139
|
+
FileUtils.mv(file,ok_folder)
|
140
|
+
logger.info "upload process finish: #{file}"
|
141
|
+
return true
|
142
|
+
rescue SocketError => socket_error
|
143
|
+
# 通信エラーの場合は取り敢えず現状を維持して
|
144
|
+
# 次の処理に移る
|
145
|
+
logger.warn socket_error
|
146
|
+
connect(true)
|
147
|
+
rescue => e
|
148
|
+
# 処理失敗フォルダに移動する
|
149
|
+
logger.error e
|
150
|
+
FileUtils.mv(file,ng_folder)
|
151
|
+
logger.error "upload process error: #{file}"
|
152
|
+
end
|
153
|
+
false
|
154
|
+
end
|
155
|
+
|
156
|
+
# アップロード先に既に同一ファイルが有る場合は
|
157
|
+
# 取り敢えず消してから作業を開始する
|
158
|
+
# が、okファイルがある場合エクセプションを投げて
|
159
|
+
# 諦める
|
160
|
+
def erace_existed_file(to)
|
161
|
+
oh_my_god = false
|
162
|
+
ok_file = to + ".ok"
|
163
|
+
begin
|
164
|
+
connection.stat!(to)
|
165
|
+
begin
|
166
|
+
connection.stat!(ok_file)
|
167
|
+
# ナンテコッタイ okファイルが有るよ、、、
|
168
|
+
logger.error "ok_file already exists remote: #{ok_file}"
|
169
|
+
oh_my_god = true
|
170
|
+
rescue
|
171
|
+
# okファイルが無いからファイルを消す
|
172
|
+
logger.warn "file already exists. so erace it: #{ok_file}"
|
173
|
+
connection.remove(to).wait
|
174
|
+
end
|
175
|
+
rescue
|
176
|
+
# エラーでOK = ファイルが無い
|
177
|
+
end
|
178
|
+
if oh_my_god
|
179
|
+
raise 'file and ok_file already exists on remote server!!!'
|
180
|
+
end
|
181
|
+
true
|
182
|
+
end
|
183
|
+
|
184
|
+
def upload_data_file(from,to)
|
185
|
+
upload_inner(from,to) rescue nil
|
186
|
+
unless file_size_check(from,to)
|
187
|
+
logger.info "upload error: #{from} => #{to}"
|
188
|
+
remove_uploaded_file(to)
|
189
|
+
return false
|
190
|
+
end
|
191
|
+
logger.info "uploaded: #{from} => #{to}"
|
192
|
+
true
|
193
|
+
end
|
194
|
+
|
195
|
+
def create_ok_file(to)
|
196
|
+
to_path = to + ".ok"
|
197
|
+
logger.info "create ok_file: #{to_path}"
|
198
|
+
connection.file.open(to_path,"w") do |file|
|
199
|
+
#file.write('')
|
200
|
+
end
|
201
|
+
|
202
|
+
# okファイルのあげミスは、OKファイルを消してエラーを上げてそれ以上は
|
203
|
+
# なにもしない
|
204
|
+
unless file_size_check(0,to_path)
|
205
|
+
logger.error "create ok_file error: #{to_path}"
|
206
|
+
return false
|
207
|
+
end
|
208
|
+
logger.info "created: #{to_path}"
|
209
|
+
true
|
210
|
+
end
|
211
|
+
|
212
|
+
def remove_uploaded_file(to)
|
213
|
+
logger.warn "removing: #{to}"
|
214
|
+
begin
|
215
|
+
connection.remove(to).wait
|
216
|
+
rescue => e
|
217
|
+
logger.error e.message
|
218
|
+
logger.error e.backtrace.join("\n")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
def file_size_check(from,to)
|
223
|
+
if from.kind_of?(Numeric)
|
224
|
+
ori_file_size = from
|
225
|
+
else
|
226
|
+
ori_file_size = File::Stat.new(from).size
|
227
|
+
end
|
228
|
+
remote_file_size = -1
|
229
|
+
begin
|
230
|
+
connection.file.open(to) do |file|
|
231
|
+
remote_file_size = file.stat.size
|
232
|
+
end
|
233
|
+
if ori_file_size == remote_file_size
|
234
|
+
logger.info "file size ok: #{ori_file_size}/#{remote_file_size}"
|
235
|
+
return true
|
236
|
+
end
|
237
|
+
logger.warn "file size ng: #{ori_file_size}/#{remote_file_size}"
|
238
|
+
rescue => e
|
239
|
+
logger.warn e.message
|
240
|
+
logger.warn e.backtrace.join("\n")
|
241
|
+
end
|
242
|
+
false
|
243
|
+
end
|
244
|
+
|
245
|
+
def upload_inner(from,to)
|
246
|
+
logger.info "upload: #{from} => #{to}"
|
247
|
+
connection.upload! from, to
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
data/sffftp.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "sffftp/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "sffftp"
|
7
|
+
s.version = Sffftp::VERSION
|
8
|
+
s.authors = ["pacojp"]
|
9
|
+
s.email = ["paco.jp@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{automatically scp files in a specified folder}
|
12
|
+
s.description = %q{automatically scp files in a specified folder}
|
13
|
+
s.rubyforge_project = "sffftp"
|
14
|
+
|
15
|
+
#s.add_dependency "batchbase",["0.0.4"]
|
16
|
+
s.add_dependency "net-sftp"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = ["lib"]
|
22
|
+
|
23
|
+
# specify any dependencies here; for example:
|
24
|
+
# s.add_development_dependency "rspec"
|
25
|
+
# s.add_runtime_dependency "rest-client"
|
26
|
+
end
|
data/test/test.rb
ADDED
@@ -0,0 +1,248 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
$: << File.dirname(__FILE__)
|
4
|
+
require 'test_helper'
|
5
|
+
require 'test/unit'
|
6
|
+
require "find"
|
7
|
+
|
8
|
+
require 'sffftp'
|
9
|
+
|
10
|
+
class TestSffftp < Test::Unit::TestCase
|
11
|
+
|
12
|
+
SFFFTP_WORKING_DIR = '/tmp/test/sffftp/'
|
13
|
+
QUEUE_FOLDER = "#{SFFFTP_WORKING_DIR}from/"
|
14
|
+
OK_FOLDER = "#{SFFFTP_WORKING_DIR}done/"
|
15
|
+
NG_FOLDER = "#{SFFFTP_WORKING_DIR}error/"
|
16
|
+
REMOTE_PATH = "#{SFFFTP_WORKING_DIR}remote/"
|
17
|
+
REMOTE_PORT = 22
|
18
|
+
LOCK_FILE = "#{SFFFTP_WORKING_DIR}test.lock"
|
19
|
+
REMOTE_USER_NAME = 'paco'
|
20
|
+
REMOTE_USER_PASSWORD = nil
|
21
|
+
REMOTE_HOST = "localhost"
|
22
|
+
|
23
|
+
def setup
|
24
|
+
FileUtils.mkdir_p(QUEUE_FOLDER)
|
25
|
+
FileUtils.mkdir_p(OK_FOLDER)
|
26
|
+
FileUtils.mkdir_p(REMOTE_PATH)
|
27
|
+
FileUtils.mkdir_p(NG_FOLDER)
|
28
|
+
delete_files(QUEUE_FOLDER)
|
29
|
+
delete_files(OK_FOLDER)
|
30
|
+
delete_files(NG_FOLDER)
|
31
|
+
delete_files(REMOTE_PATH)
|
32
|
+
files = [
|
33
|
+
@l_file = QUEUE_FOLDER + 'testfile',
|
34
|
+
@l_file1 = QUEUE_FOLDER + 'testfile1',
|
35
|
+
@l_file2 = QUEUE_FOLDER + 'testfile2',
|
36
|
+
@l_file_tmp = QUEUE_FOLDER + 'test.tmp',
|
37
|
+
@l_file_ok = QUEUE_FOLDER + 'test.ok'
|
38
|
+
]
|
39
|
+
files.each do |file|
|
40
|
+
File.write(file,'test_data')
|
41
|
+
end
|
42
|
+
|
43
|
+
@r_file = REMOTE_PATH + "testfile"
|
44
|
+
@ng_file = NG_FOLDER + "testfile"
|
45
|
+
end
|
46
|
+
|
47
|
+
def delete_files(dir)
|
48
|
+
raise 'safety net orz' unless dir =~ %r|/sffftp/|
|
49
|
+
Dir::entries(dir).each do |file|
|
50
|
+
file = "#{dir}/#{file}"
|
51
|
+
next unless File::ftype(file) == 'file'
|
52
|
+
File.delete(file) if File.exist?(file)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def attr
|
57
|
+
{
|
58
|
+
:logger => Logger.new('/dev/null'),
|
59
|
+
:remote_host => REMOTE_HOST,
|
60
|
+
:remote_user_name => REMOTE_USER_NAME,
|
61
|
+
:remote_user_password => REMOTE_USER_PASSWORD,
|
62
|
+
:remote_path => REMOTE_PATH,
|
63
|
+
:queue_folder => QUEUE_FOLDER,
|
64
|
+
:ok_folder => OK_FOLDER,
|
65
|
+
:ng_folder => NG_FOLDER
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_error
|
70
|
+
sffftp = Sffftp::Sftp.new(attr)
|
71
|
+
sffftp.remote_path = '/tmp/slefijseflislfjsliefjsief/'
|
72
|
+
sffftp.timeout = 3
|
73
|
+
#sffftp.logger2ssh = true
|
74
|
+
sffftp.proceed
|
75
|
+
|
76
|
+
assert_false File.exists?(NG_FOLDER + "testfile2")
|
77
|
+
end
|
78
|
+
|
79
|
+
# アップロードに5秒程度かかるように調整が必要
|
80
|
+
# スレッド立ててからsleep 1 (ロックファイルが出来る前に
|
81
|
+
# 後のプロセスが起動しないように)が良い感じで動くように
|
82
|
+
# 個々の値は将来調整しないといけないかもしれない
|
83
|
+
def prepare_heavy_test
|
84
|
+
(1..500).each do |i|
|
85
|
+
file = QUEUE_FOLDER + "#{i}.dat"
|
86
|
+
File.write(file,'test_data')
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_heavy
|
91
|
+
prepare_heavy_test
|
92
|
+
sffftp = Sffftp::Sftp.new(attr)
|
93
|
+
sffftp.proceed
|
94
|
+
# フォルダ含める
|
95
|
+
assert_equal (500 + 3 + 1), Find.find(OK_FOLDER).to_a.size
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_connection_error
|
99
|
+
sffftp = Sffftp::Sftp.new(attr)
|
100
|
+
sffftp.remote_host = 'sefisfejisfe.sefijsefij.esfij'
|
101
|
+
sffftp.timeout = 3
|
102
|
+
#sffftp.logger2ssh = true
|
103
|
+
sffftp.proceed
|
104
|
+
|
105
|
+
# コネクションエラーだとキューフォルダーをいじらない
|
106
|
+
assert_true File.exists?(QUEUE_FOLDER + "testfile2")
|
107
|
+
end
|
108
|
+
|
109
|
+
# メソッドの機能チェック
|
110
|
+
def test_file_size_check
|
111
|
+
sffftp = Sffftp::Sftp.new(attr)
|
112
|
+
sffftp.connect
|
113
|
+
assert_false sffftp.__send__ :file_size_check, @l_file,@r_file
|
114
|
+
assert_false File.exists?(@r_file)
|
115
|
+
end
|
116
|
+
|
117
|
+
# upload_data_fileをエミュレートして問題が出るか?のチェック
|
118
|
+
def test_upload_data_file_error
|
119
|
+
sffftp = Sffftp::Sftp.new(attr)
|
120
|
+
sffftp.connect
|
121
|
+
sffftp.__send__ :upload_inner,@l_file,@r_file
|
122
|
+
change_file_size(@r_file)
|
123
|
+
unless sffftp.__send__ :file_size_check,@l_file,@r_file
|
124
|
+
sffftp.__send__ :remove_uploaded_file, @r_file
|
125
|
+
end
|
126
|
+
assert_false File.exists?(@r_file)
|
127
|
+
end
|
128
|
+
|
129
|
+
def change_file_size(file)
|
130
|
+
f = File::open(file, "a")
|
131
|
+
f.write('plus line')
|
132
|
+
f.close
|
133
|
+
end
|
134
|
+
|
135
|
+
# リモートにファイルがすでにある
|
136
|
+
# が、okファイルはまだない!
|
137
|
+
# って時
|
138
|
+
def test_erace_existed_file_case_1
|
139
|
+
|
140
|
+
File.write(@r_file,'test_data')
|
141
|
+
|
142
|
+
sffftp = Sffftp::Sftp.new(attr)
|
143
|
+
sffftp.connect
|
144
|
+
|
145
|
+
assert_true sffftp.__send__ :erace_existed_file, @r_file
|
146
|
+
assert_false File.exists?(@r_file)
|
147
|
+
end
|
148
|
+
|
149
|
+
# リモートにファイルがすでにある
|
150
|
+
# okファイルもあるよ、、、
|
151
|
+
# って時
|
152
|
+
def test_erace_existed_file_case_2
|
153
|
+
|
154
|
+
File.write(@r_file,'test_data')
|
155
|
+
File.write(@r_file + ".ok",'test_data')
|
156
|
+
|
157
|
+
sffftp = Sffftp::Sftp.new(attr)
|
158
|
+
sffftp.connect
|
159
|
+
|
160
|
+
assert_raise do
|
161
|
+
assert_true sffftp.__send__ :erace_existed_file, @r_file
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# リモートにファイルが既にあるよ
|
166
|
+
def test_proceed_remote_file_exists_case_1
|
167
|
+
File.write(@r_file,'test_data')
|
168
|
+
sffftp = Sffftp::Sftp.new(attr)
|
169
|
+
sffftp.proceed
|
170
|
+
|
171
|
+
assert_false File.exists?(@ng_file)
|
172
|
+
end
|
173
|
+
|
174
|
+
# リモートにファイルが既にあるよ
|
175
|
+
# okファイルまであるよ!!!
|
176
|
+
def test_proceed_remote_file_exists_case_2
|
177
|
+
File.write(@r_file,'test_data')
|
178
|
+
File.write(@r_file + ".ok",'test_data')
|
179
|
+
sffftp = Sffftp::Sftp.new(attr)
|
180
|
+
sffftp.proceed
|
181
|
+
|
182
|
+
# okファイルまである場合はNGフォルダに
|
183
|
+
# データを移動する
|
184
|
+
assert_true File.exists?(@ng_file)
|
185
|
+
end
|
186
|
+
|
187
|
+
def set_attr_to_instance!(sffftp)
|
188
|
+
sffftp.logger = Logger.new('/dev/null')
|
189
|
+
sffftp.remote_host = REMOTE_HOST
|
190
|
+
sffftp.remote_user_name = REMOTE_USER_NAME
|
191
|
+
sffftp.remote_user_password = REMOTE_USER_PASSWORD
|
192
|
+
sffftp.remote_path = REMOTE_PATH
|
193
|
+
sffftp.ok_folder = OK_FOLDER
|
194
|
+
sffftp.ng_folder = NG_FOLDER
|
195
|
+
sffftp.queue_folder = QUEUE_FOLDER
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_sffftp
|
199
|
+
assert_true File.exists?(@l_file)
|
200
|
+
assert_true File.exists?(@l_file1)
|
201
|
+
|
202
|
+
sffftp = Sffftp::Sftp.new()
|
203
|
+
assert_raise do
|
204
|
+
sffftp.proceed
|
205
|
+
end
|
206
|
+
set_attr_to_instance!(sffftp)
|
207
|
+
|
208
|
+
# 取り敢えず無いフォルダ名で設定してみる
|
209
|
+
sffftp.queue_folder = 'hohogege'
|
210
|
+
assert_raise do
|
211
|
+
sffftp.proceed
|
212
|
+
end
|
213
|
+
sffftp.queue_folder = QUEUE_FOLDER
|
214
|
+
|
215
|
+
sffftp.proceed
|
216
|
+
assert_true File.exists?(REMOTE_PATH + "testfile2")
|
217
|
+
assert_true File.exists?(REMOTE_PATH + "testfile2.ok")
|
218
|
+
|
219
|
+
assert_true File.exists?(@l_file_tmp)
|
220
|
+
assert_true File.exists?(@l_file_ok)
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_socket_error
|
224
|
+
assert_true File.exists?(@l_file)
|
225
|
+
sffftp = Sffftp::Sftp.new()
|
226
|
+
set_attr_to_instance!(sffftp)
|
227
|
+
sffftp.remote_host = '255.255.255.255'
|
228
|
+
sffftp.proceed
|
229
|
+
assert_true File.exists?(@l_file)
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_sffftp_with_port
|
233
|
+
assert_true File.exists?(@l_file)
|
234
|
+
assert_true File.exists?(@l_file1)
|
235
|
+
sffftp = Sffftp::Sftp.new()
|
236
|
+
set_attr_to_instance!(sffftp)
|
237
|
+
# ここが増えただけ
|
238
|
+
sffftp.remote_port = REMOTE_PORT
|
239
|
+
sffftp.proceed
|
240
|
+
|
241
|
+
assert_true File.exists?(REMOTE_PATH + "testfile2")
|
242
|
+
assert_true File.exists?(REMOTE_PATH + "testfile2.ok")
|
243
|
+
|
244
|
+
assert_true File.exists?(@l_file_tmp)
|
245
|
+
assert_true File.exists?(@l_file_ok)
|
246
|
+
end
|
247
|
+
|
248
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sffftp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- pacojp
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: net-sftp
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: automatically scp files in a specified folder
|
31
|
+
email:
|
32
|
+
- paco.jp@gmail.com
|
33
|
+
executables: []
|
34
|
+
extensions: []
|
35
|
+
extra_rdoc_files: []
|
36
|
+
files:
|
37
|
+
- .gitignore
|
38
|
+
- Gemfile
|
39
|
+
- Gemfile.lock
|
40
|
+
- README.md
|
41
|
+
- Rakefile
|
42
|
+
- example/sample.rb
|
43
|
+
- example/sample_with_batchbase.rb
|
44
|
+
- lib/sffftp.rb
|
45
|
+
- lib/sffftp/sftp.rb
|
46
|
+
- lib/sffftp/version.rb
|
47
|
+
- sffftp.gemspec
|
48
|
+
- test/test.rb
|
49
|
+
- test/test_helper.rb
|
50
|
+
homepage: ''
|
51
|
+
licenses: []
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubyforge_project: sffftp
|
70
|
+
rubygems_version: 1.8.23
|
71
|
+
signing_key:
|
72
|
+
specification_version: 3
|
73
|
+
summary: automatically scp files in a specified folder
|
74
|
+
test_files:
|
75
|
+
- test/test.rb
|
76
|
+
- test/test_helper.rb
|