Posted on

Grails Service to do file system, sftp, and ftp file operations

So I’ve been preparing this module to do sftp / ftp / and file system manipulations in groovy.

I’ve got it running as a service in grails, with a page setup for testing.

Its really important that if your testing this class out in windows, you turn off your firewall.

I wasted like 2 hours trying to figure out why I kept getting errors.

Now I would like to turn this functionality into a .jar for standalone execution and injection into other projects.

You will need the ant-jsch.jar and jsch-0.1.33.jar, google guave, and apache commons net.

I some how automagically installed the ant-jsch and jsch jars in a way that doesn’t require import statements.

Credit due to
https://gist.github.com/1135043 for FTP code.
http://groovy-almanac.org/scp-with-groovy-and-antbuilder/ for SCP with ANT trick.
and an article I don’t recall the URL to on google guava for file system manipulation

import groovy.util.AntBuilder
import com.google.common.io.*
import org.apache.commons.net.ftp.FTPClient

class FileService {
def boolean fileSystemMove(String from, String to){

try{
	
	Files.move( new File(from), new File(to) )
	
}catch(Throwable t){

	println 'filesystem error' + t;
	return false
	
}

return true;
		
}


def boolean fileSystemCopy(String from, String to){

try{
	Files.copy( new File(from), new File(to) )
}catch(Throwable t){
	return false
}

return true;

		
}



def boolean sftpCopyTo( String host, String user, String passwd, String destination, String fileurl ){		

def ant = new AntBuilder();

ant.scp(				
	file: fileurl,
	todir:"${user}@${host}:${destination}",
	trust:true,
	verbose:true,						
	password:passwd)
}



def boolean sftpCopyFrom( String host, String user, String passwd, String destination, String fileurl ){
def ant = new AntBuilder();

ant.scp(				
	file: "${user}@${host}:${fileurl}" ,
	todir: destination,
	verbose:true,
	trust:true,
	password:passwd)
}

	
def boolean ftpCopyFrom( String host, String user, String passwd, String destination, String fileurl  ){
try{
	def String fileName = fileurl.split('/')[-1];
	new FTPClient().with {
		connect host
		//enterLocalPassiveMode()
		type(BINARY_FILE_TYPE)
		login user, passwd
		changeWorkingDirectory destination
		def incomingFile = new File(fileurl)
		incomingFile.withOutputStream { ostream -> retrieveFile fileName, ostream }
		disconnect()
	}
	true
}catch (Throwable t) {
	false
}
}

def boolean ftpCopyTo( String host, String user, String passwd, String destination, String fileurl  ){

try{	
	def String fileName = fileurl.split('/')[-1];
	def FTPClient ftp = new FTPClient();
	ftp.connect host
	ftp.type(ftp.BINARY_FILE_TYPE)
	ftp.login user, passwd
	ftp.changeWorkingDirectory destination				
	def InputStream input = new FileInputStream(fileurl);
	ftp.storeFile(fileName , input)
	
	ftp.disconnect()
	true
} catch ( Throwable t ) {
	false
}


}

		
			
	
}