sffftp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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