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.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+
15
+ # YARD artifacts
16
+ .yardoc
17
+ _yardoc
18
+ doc/
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
4
+ group :test do
5
+ gem "test-unit","2.5.2"
6
+ end
@@ -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)
@@ -0,0 +1,7 @@
1
+ sffftp
2
+ =====
3
+
4
+ automatically sftp files in a specified folder with some features
5
+
6
+ * create and send ok file.
7
+ * mv files to proper folder which moving process done.
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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
@@ -0,0 +1,5 @@
1
+ require "sffftp/version"
2
+ require "sffftp/sftp"
3
+
4
+ module Sffftp
5
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Sffftp
2
+ VERSION = "0.0.1"
3
+ end
@@ -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
@@ -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
@@ -0,0 +1,10 @@
1
+
2
+ require 'bundler'
3
+ Bundler.setup
4
+ Bundler.require(:test)
5
+
6
+ $: << File.dirname(__FILE__) + '/../lib'
7
+
8
+ require 'sffftp'
9
+ require 'sffftp/version'
10
+
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