---
title: Antタスクの定義をスクリプト言語を使用して行う
author: aterai
pubdate: 2017-02-15T13:41:06+09:00
description: スクリプト言語(Javascript)を使用して、FTPS(File Transfer Protocol over SSL/TLS)で通信するAntTaskを定義します。
---
#contents

* 概要 [#summary]
スクリプト言語(`Javascript`)を使用して、`FTPS`(`File Transfer Protocol over SSL/TLS`)で通信する`Ant Task`を定義します。

* サンプルコード [#sourcecode]
#code{{
<?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>
}}

* 解説 [#explanation]
- さくらレンタルサーバのライトプランでは、`scp`や`SFTP`が使用不可だが、`FTPS`は使用可能
- `Ant`の`ftp`タスクは、`FTPS`に対応していない?
- `ftp`タスクが使用する`Apache commons-net`には、`FTPSClient`が用意されているので、代わりにこれを使用するタスクを`Javascript`で作成する

* 参考リンク [#reference]
- [https://ant.apache.org/manual/Tasks/scriptdef.html Scriptdef Task]
- [https://commons.apache.org/net/examples/ftp/FTPClientExample.java FTPClientExample.java]

* コメント [#comment]
#comment
#comment