spc-site/buildSrc/src/main/kotlin/uploads.kt

81 lines
2.5 KiB
Kotlin

import com.jcraft.jsch.ChannelSftp
import com.jcraft.jsch.JSch
import com.jcraft.jsch.Session
import com.jcraft.jsch.SftpATTRS
import java.io.File
import java.io.FileInputStream
import java.util.*
/**
* https://kodehelp.com/java-program-uploading-folder-content-recursively-from-local-to-sftp-server/
*/
private fun ChannelSftp.recursiveFolderUpload(sourceFile: File, destinationPath: String) {
if (sourceFile.isFile) {
// copy if it is a file
cd(destinationPath)
if (!sourceFile.name.startsWith(".")) put(
FileInputStream(sourceFile),
sourceFile.getName(),
ChannelSftp.OVERWRITE
)
} else {
val files = sourceFile.listFiles()
if (files != null && !sourceFile.getName().startsWith(".")) {
cd(destinationPath)
var attrs: SftpATTRS? = null
// check if the directory is already existing
try {
attrs = stat(destinationPath + "/" + sourceFile.getName())
} catch (e: Exception) {
println(destinationPath + "/" + sourceFile.getName() + " not found")
}
// else create a directory
if (attrs != null) {
println("Directory exists IsDir=" + attrs.isDir())
} else {
println("Creating dir " + sourceFile.getName())
mkdir(sourceFile.getName())
}
for (f in files) {
recursiveFolderUpload(f, destinationPath + "/" + sourceFile.getName())
}
}
}
}
fun JSch.uploadDirectory(
file: File,
host: String,
user: String,
targetDirectory: String,
port: Int = 22,
) {
var session: Session? = null
var channel: ChannelSftp? = null
try {
session = getSession(user, host, port)
val config = Properties()
config["StrictHostKeyChecking"] = "no"
session.setConfig(config)
session.connect() // Create SFTP Session
channel = session.openChannel("sftp") as ChannelSftp // Open SFTP Channel
channel.connect()
channel.cd(targetDirectory) // Change Directory on SFTP Server
channel.recursiveFolderUpload(file, targetDirectory)
} finally {
channel?.disconnect()
session?.disconnect()
}
}
fun sshUploadDirectory(
file: File,
host: String,
user: String,
targetDirectory: String,
port: Int = 22,
shellConfig: JSch.() -> Unit,
) = JSch().apply(shellConfig).uploadDirectory(file, host, user, targetDirectory, port)