module Publisher class Sftp attr_accessor :remote_host attr_accessor :remote_user attr_accessor :ssh_key_file def copy(source, target, _options = {}) Helper.validates_presence_of remote_host, 'Remote Host not set' Helper.validates_presence_of remote_user, 'Remote User not set' Helper.validates_presence_of ssh_key_file, 'SSH-Keyfile not set' # check ssh keyfile unless File.file? ssh_key_file $log.writer.error "Can not find SSH keyfile #{ssh_key_file}" exit 1 end source_last = source.split('/').last target_last = target.split('/').last unless source_last == target_last if not target.end_with?('/') target = target + '/' + source_last else target = target + source_last end end begin ### delete directory if File.directory?(source) Net::SFTP.start(remote_host, remote_user, \ auth_methods: ['publickey'], \ forward_agent: false, \ keys: ssh_key_file, \ timeout: 90) do |sftp| # delete all files in target, but not the target-dir itself $log.writer.debug "Cleaning remote directory #{target}" sftp.rm_r!(target, delete_root: true) end end ### copy files Net::SFTP.start(remote_host, remote_user, \ auth_methods: ['publickey'], \ forward_agent: false, \ keys: ssh_key_file, \ timeout: 90) do |sftp| sftp.upload!(source, target) end rescue => e $log.writer.error "Can not upload files to #{target}" $log.writer.error e.message # $log.writer.error e.backtrace.join("\n") exit 1 end end def chmod(path, permissions, options = {}) Helper.validates_presence_of remote_host, 'Remote Host not set' Helper.validates_presence_of remote_user, 'Remote User not set' Helper.validates_presence_of ssh_key_file, 'SSH-Keyfile not set' # check ssh keyfile unless File.file? ssh_key_file $log.writer.error "Can not find SSH keyfile #{ssh_key_file}" exit 1 end Net::SFTP.start(remote_host, remote_user, \ auth_methods: ['publickey'], \ forward_agent: false, \ keys: ssh_key_file, \ timeout: 90) do |sftp| $log.writer.debug 'Set permissions' if options[:recursive] sftp.dir.entries(path).each do |entry| next if entry.name == '.' or entry.name == '..' child_path = File.join(path, entry.name) sftp.setstat!(child_path, permissions: permissions) end sftp.setstat!(path, permissions: permissions) else sftp.setstat!(path, permissions: permissions) end end end end end