Ant/Scriptdef のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Ant/Scriptdef へ行く。
- title: Antタスクの定義をスクリプト言語を使用して行う author: aterai pubdate: 2017-02-15T13:41:06+09:00 description: スクリプト言語(Javascript)を使用して、FTPS(File Transfer Protocol over SSL/TLS)で通信するAntタスクを定義します。
概要
スクリプト言語(Javascript
)を使用して、FTPS
(File Transfer Protocol over SSL/TLS
)で通信するAnt
タスクを定義します。
サンプルコード
<?xml version="1.0" encoding="UTF-8"?>
<project name="example" default="ftp" basedir=".">
<property environment="env" />
<target name="ftp">
<echo message="ftp" />
<property name="ftp.userid" value="${env.FTP_USERID}" />
<property name="ftp.server" value="${env.FTP_SERVER}" />
<property name="ftp.remotedir" value="${env.FTP_BASEDIR}" />
<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="${env.FTP_BASEDIR}" />
<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>
<ftps server="${ftp.server}" remotedir="${ftp.remotedir}"
userid="${ftp.userid}" password="${ftp.password}">
<fileset refid="ftp.upload.fileset" />
</ftps>
</target>
<scriptdef name="ftps" language="javascript">
<attribute name="server" />
<attribute name="remotedir" />
<attribute name="userid" />
<attribute name="password" />
<element name="fileset" type="fileset" />
<![CDATA[
var server = attributes.get("server");
var remotedir = attributes.get("remotedir");
var username = attributes.get("userid");
var password = attributes.get("password");
try {
var ftps = new org.apache.commons.net.ftp.FTPSClient("SSL");
ftps.connect(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);
if (!ftps.login(username, password)) {
print("FTP server refused connection.");
} else {
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(remotedir + filename, input);
input.close();
}
}
}
ftps.logout();
} catch (ex) {
ex.printStackTrace();
}
ftps.disconnect();
]]>
</scriptdef>
</project>
解説
- さくらレンタルサーバのライトプランでは、
scp
やSFTP
が使用不可だが、FTPS
は使用可能 Ant
のftp
タスクは、FTPS
に対応していない?ftp
タスクが使用するApache commons-net
には、FTPSClient
が用意されているので、代わりにこれを使用するタスクをJavascript
で作成する