Ant/Scriptdef のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Ant/Scriptdef へ行く。
- title: Antタスクの定義をスクリプト言語を使用して行う author: aterai pubdate: 2017-02-15 description: スクリプト言語(Javascript)を使用して、FTPS(File Transfer Protocol over SSL/TLS)で通信するAntTaskを定義します。
概要
スクリプト言語(Javascript
)を使用して、FTPS
(File Transfer Protocol over SSL/TLS
)で通信するAnt Task
を定義します。
サンプルコード
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="ftp" basedir=".">
<property environment="env" />
<target name="ftp">
<property name="ftp.userid" value="${env.FTP_USERID}" />
<property name="ftp.server" value="${env.FTP_SERVER}" />
<property name="ftp.remotedir" value="/home/aterai/www/" />
<property name="ssh.inkey" value="${env.SSH_INKEY}" />
<property name="ssh.in" value="${env.SSH_IN}" />
<exec executable="openssl" outputproperty="ftp.password" failonerror="true">
<arg value="rsautl" />
<arg value="-decrypt" />
<arg value="-inkey" />
<arg value="${ssh.inkey}" />
<arg value="-in" />
<arg value="${ssh.in}" />
</exec>
<fileset id="ftp.upload.fileset" dir="${basedir}/_site">
<include name="*.html" />
<exclude name="404.html" />
</fileset>
<ftp server="${ftp.server}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}"
passive="yes" verbose="yes">
<fileset refid="ftp.upload.fileset" />
</ftp>
</target>
<target name="ftps">
<echo message="ftps" />
<property name="ftp.userid" value="${env.FTP_USERID}" />
<property name="ftp.server" value="${env.FTP_SERVER}" />
<property name="ftp.remotedir" value="/home/aterai/www/" />
<property name="ssh.inkey" value="${env.SSH_INKEY}" />
<property name="ssh.in" value="${env.SSH_IN}" />
<exec executable="openssl" outputproperty="ftp.password" failonerror="true">
<arg value="rsautl" />
<arg value="-decrypt" />
<arg value="-inkey" />
<arg value="${ssh.inkey}" />
<arg value="-in" />
<arg value="${ssh.in}" />
</exec>
<scriptdef name="ftps" language="javascript">
<element name="fileset" type="fileset" />
<![CDATA[
try {
print(project.getProperty("ftp.server"));
var ftps = new org.apache.commons.net.ftp.FTPSClient("SSL");
//ftps.addProtocolCommandListener(new org.apache.commons.net.PrintCommandListener(new java.io.PrintWriter(System.out)));
ftps.connect(project.getProperty("ftp.server"));
var reply = ftps.getReplyCode();
if (!org.apache.commons.net.ftp.FTPReply.isPositiveCompletion(reply)) {
ftps.disconnect();
print("FTP server refused connection.");
System.exit(1);
}
ftps.setBufferSize(1000);
var remote = project.getProperty("ftp.server");
var username = project.getProperty("ftp.userid");
var password = project.getProperty("ftp.password");
if (!ftps.login(username, password)) {
ftps.logout();
print("FTP server refused connection.");
System.exit(1);
}
print("Remote system is " + ftps.getSystemName());
//ftps.setFileType(FTP.BINARY_FILE_TYPE);
ftps.enterLocalPassiveMode();
var filesets = elements.get("fileset");
for (i = 0; i < filesets.size(); i++) {
var fileset = filesets.get(i);
var scanner = fileset.getDirectoryScanner(project);
scanner.scan();
var basedir = fileset.getDir(project);
var files = scanner.getIncludedFiles();
for(j = 0; j < files.length; j++) {
var filename = files[j];
var local = new java.io.File(basedir, filename);
print("file: " + local);
var input = new java.io.FileInputStream(local);
ftps.storeFile("/home/aterai/www/" + filename, input);
input.close();
}
}
ftps.logout();
} catch (ex) {
ex.printStackTrace();
}
ftps.disconnect();
]]>
</scriptdef>
<ftps>
<fileset id="ftp.upload.fileset" dir="${basedir}/_site">
<include name="*.html" />
<exclude name="404.html" />
</fileset>
</ftps>
</target>
</project>
解説
Ant
のftp
タスクは、FTPS
が使用できない?ftp
タスクが使用するApache commons-net
には、FTPSClient
が用意されているので、代わりにこれを使用するタスクをJavascript
で作成する