Ant/Scriptdef のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Ant/Scriptdef へ行く。
  - 1 (2017-02-15 (水) 13:41:10)
- 2 (2017-02-15 (水) 15:29:12)
- 3 (2018-10-30 (火) 16:48:31)
- 4 (2018-12-20 (木) 14:56:38)
- 5 (2019-04-10 (水) 13:42:40)
- 6 (2022-10-03 (月) 15:03:11)
- 7 (2024-09-01 (日) 04:07:25)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- 13 (2025-06-19 (木) 12:41:37)
- 14 (2025-06-19 (木) 12:43:47)
 
- 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で作成する