rest-ftp-daemon-remote-sftp 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3bb96f905d1eb45cc56f7c8a8a62ef3e71eaf0ab
4
+ data.tar.gz: 1c4080c35b01ed4e06566a141baa14dce2518c36
5
+ SHA512:
6
+ metadata.gz: ff8c7a982685dae01ee53cd9aee901cf6a777b21278e217fd80f66361e2c8f729ccc08bec8f224276fbfcc3ea4a5105689c2a775a10a641d116fb0b3198bad76
7
+ data.tar.gz: 2d2a2046f30da6b2e2aa93012f7253626b222bf40e7405f6f2b0f88727e76df78519ce67278e67d2d8cdcd3cc02dca3453cc1158b15583707207cc48c05ccf7e
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # rest-ftp-daemon-remote-sftp
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ # encoding: utf-8
2
+ require "bundler/gem_tasks"
3
+ require "rubygems"
4
+
5
+ require "rspec/core/rake_task"
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+ RuboCop::RakeTask.new(:rubocop) do |task|
10
+ task.fail_on_error = false
11
+ end
12
+
13
+ # Load my own tasks
14
+ Dir.glob('lib/tasks/*.rake').each { |r| import r }
15
+
16
+ # Run specs by default
17
+ desc "Run all tests"
18
+ task default: [:spec, :rubocop]
@@ -0,0 +1,158 @@
1
+ # Dependencies
2
+ require "net/sftp"
3
+ require "rbnacl"
4
+ require "bcrypt_pbkdf"
5
+
6
+ # Register this handler
7
+ module URI
8
+ class SFTP < Generic
9
+ DEFAULT_PORT = 22
10
+ end
11
+ @@schemes["SFTP"] = SFTP
12
+ end
13
+
14
+ # Handle sFTP transfers for Remote class
15
+ module RestFtpDaemon::Remote
16
+ class RemoteSFTP < RemoteBase
17
+
18
+ # Class options
19
+ attr_reader :sftp
20
+
21
+ # URI schemes handled by this plugin
22
+ def self.handles
23
+ [URI::SFTP]
24
+ end
25
+
26
+ def initialize target, job, config
27
+ # Call daddy's initialize() first
28
+ super
29
+ end
30
+
31
+ def connect
32
+ super
33
+
34
+ # Debug level
35
+ if debug_enabled
36
+ verbosity = Logger::DEBUG
37
+ else
38
+ verbosity = false
39
+ end
40
+
41
+ # Connect remote server
42
+ @sftp = Net::SFTP.start(@target.host.to_s, @target.user.to_s,
43
+ password: @target.password.to_s,
44
+ verbose: verbosity,
45
+ port: @target.port,
46
+ non_interactive: true,
47
+ timeout: DEFAULT_SFTP_TIMEOUT
48
+ )
49
+ # rescue NotImplementedError => exception
50
+ # raise RemoteConnectError, "RemoteConnectError: #{exception.class}: #{exception.message}"
51
+
52
+ rescue Exception => exception
53
+ raise RemoteConnectError, "#{exception.class}: #{exception.message}"
54
+ end
55
+
56
+ def size_if_exists target
57
+ log_debug "size_if_exists [#{target.name}]"
58
+ stat = @sftp.stat! target.path_abs
59
+
60
+ rescue Net::SFTP::StatusException
61
+ return false
62
+ else
63
+ return stat.size
64
+ end
65
+
66
+ def remote_try_delete target
67
+ log_debug "remote_try_delete [#{target.name}]"
68
+ @sftp.remove target.path_abs
69
+
70
+ rescue Net::SFTP::StatusException
71
+ log_debug "#{LOG_INDENT}[#{target.name}] file not found"
72
+ else
73
+ log_debug "#{LOG_INDENT}[#{target.name}] removed"
74
+ end
75
+
76
+ def mkdir directory
77
+ log_debug "mkdir [#{directory}]"
78
+ @sftp.mkdir! directory
79
+
80
+ rescue StandardError => ex
81
+ raise TargetPermissionError, ex.message
82
+ end
83
+
84
+ def chdir_or_create directory, mkdir = false
85
+ # Init, extract my parent name and my own name
86
+ log_debug "chdir_or_create mkdir[#{mkdir}] dir[#{directory}]"
87
+ parent, _current = split_path(directory)
88
+
89
+ # Access this directory
90
+ begin
91
+ @sftp.opendir! directory
92
+
93
+ rescue Net::SFTP::StatusException => _e
94
+ # If not allowed to create path, that's over, we're stuck
95
+ return false unless mkdir
96
+
97
+ # Recurse upward
98
+ chdir_or_create parent, mkdir
99
+
100
+ # Now I was able to chdir into my parent, create the current directory
101
+ mkdir directory
102
+
103
+ # Finally retry the chdir
104
+ retry
105
+ else
106
+ return true
107
+ end
108
+
109
+ # We should never get here
110
+ raise JobTargetShouldBeDirectory
111
+ end
112
+
113
+ def push source, target, &callback
114
+ # Push init
115
+ raise RestFtpDaemon::AssertionFailed, "push/sftp" if @sftp.nil?
116
+
117
+ # Do the transfer
118
+ @sftp.upload! source.path_abs, target.path_abs do |event, _uploader, *args|
119
+ case event
120
+ when :open then
121
+ # args[0] : file metadata
122
+ when :put then
123
+ # args[0] : file metadata
124
+ # args[1] : byte offset in remote file
125
+ # args[2] : data being written (as string)
126
+ # puts "writing #{args[2].length} bytes to #{args[0].remote} starting at #{args[1]}"
127
+
128
+ # Update job status after this block transfer
129
+ yield args[2].length, target.name
130
+
131
+ when :close then
132
+ # args[0] : file metadata
133
+ when :mkdir
134
+ # args[0] : remote path name
135
+ when :finish
136
+ end
137
+
138
+ end
139
+ end
140
+
141
+ def move source, target
142
+ @sftp.rename! source.path_abs, target.path_abs, 0x00000001
143
+ end
144
+
145
+ def close
146
+ log_debug "remote close"
147
+ end
148
+
149
+ def connected?
150
+ @sftp && !@sftp.closed?
151
+ end
152
+
153
+ def debug_enabled
154
+ @config[:debug_sftp]
155
+ end
156
+
157
+ end
158
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ Gem::Specification.new do |spec|
3
+
4
+ # Project version
5
+ spec.version = "0.0.1"
6
+
7
+ # Project description
8
+ spec.name = "rest-ftp-daemon-remote-sftp"
9
+ spec.authors = ["Bruno MEDICI"]
10
+ spec.email = "rftpd-project@bmconseil.com"
11
+ spec.description = "rest-ftp-daemon plugin: sFTP"
12
+ spec.summary = "rest-ftp-daemon plugin: transfer files with sFTP"
13
+ spec.homepage = "http://github.com/bmedici/#{spec.name}"
14
+ spec.licenses = ["MIT"]
15
+ spec.date = Time.now.strftime("%Y-%m-%d")
16
+
17
+ # List files and executables
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.require_paths = ["lib"]
21
+ spec.required_ruby_version = ">= 2.3"
22
+
23
+ # Runtime dependencies
24
+ spec.add_runtime_dependency "net-sftp"
25
+ spec.add_runtime_dependency "rbnacl", '>= 3.2', '< 5.0'
26
+ spec.add_runtime_dependency "rbnacl-libsodium"
27
+ spec.add_runtime_dependency "bcrypt_pbkdf"
28
+
29
+ # Development dependencies
30
+ spec.add_development_dependency "bundler", "~> 1.6"
31
+ spec.add_development_dependency "rake"
32
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rest-ftp-daemon-remote-sftp
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Bruno MEDICI
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: net-sftp
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rbnacl
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '5.0'
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '3.2'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: rbnacl-libsodium
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: bcrypt_pbkdf
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: bundler
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '1.6'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.6'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rake
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: 'rest-ftp-daemon plugin: sFTP'
104
+ email: rftpd-project@bmconseil.com
105
+ executables: []
106
+ extensions: []
107
+ extra_rdoc_files: []
108
+ files:
109
+ - Gemfile
110
+ - README.md
111
+ - Rakefile
112
+ - lib/plugins/rest-ftp-daemon/remote/remote_sftp.rb
113
+ - rest-ftp-daemon-remote-s3.gemspec
114
+ homepage: http://github.com/bmedici/rest-ftp-daemon-remote-sftp
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '2.3'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.5.1
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: 'rest-ftp-daemon plugin: transfer files with sFTP'
138
+ test_files: []