src/Pure/Admin/remote_dmg.scala
author wenzelm
Sat, 15 Oct 2016 21:37:19 +0200
changeset 64233 ef6f7e8a018c
parent 64185 f4d5eb78b8a5
child 64256 c3197aeae90b
permissions -rw-r--r--
clarified signature: more static types;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
     1
/*  Title:      Pure/Admin/remote_dmg.scala
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     3
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     4
Build dmg on remote Mac OS X system.
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     5
*/
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     6
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     7
package isabelle
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     8
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
     9
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    10
object Remote_DMG
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    11
{
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    12
  def remote_dmg(session: SSH.Session, tar_gz_file: Path, dmg_file: Path, volume_name: String = "")
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    13
  {
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    14
    session.with_tmp_dir(remote_dir =>
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    15
      using(session.sftp())(sftp =>
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    16
        {
64233
ef6f7e8a018c clarified signature: more static types;
wenzelm
parents: 64185
diff changeset
    17
          val cd = "cd " + File.bash_string(sftp.remote_path(remote_dir)) + "; "
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    18
64233
ef6f7e8a018c clarified signature: more static types;
wenzelm
parents: 64185
diff changeset
    19
          sftp.write_file(remote_dir + Path.explode("dmg.tar.gz"), tar_gz_file)
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    20
          session.execute(cd + "mkdir root && tar -C root -xzf dmg.tar.gz").check
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    21
          session.execute(
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    22
            cd + "hdiutil create -srcfolder root" +
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    23
              (if (volume_name == "") "" else " -volname " + File.bash_string(volume_name)) +
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    24
              " dmg.dmg").check
64233
ef6f7e8a018c clarified signature: more static types;
wenzelm
parents: 64185
diff changeset
    25
          sftp.read_file(remote_dir + Path.explode("dmg.dmg"), dmg_file)
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    26
        }))
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    27
  }
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    28
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    29
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    30
  /* Isabelle tool wrapper */
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    31
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    32
  val isabelle_tool =
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    33
    Isabelle_Tool("remote_dmg", "build dmg on remote Mac OS X system", args =>
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    34
    {
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    35
      Command_Line.tool0 {
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    36
        var port = SSH.default_port
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    37
        var volume_name = ""
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    38
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    39
        val getopts = Getopts("""
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    40
Usage: isabelle remote_dmg [OPTIONS] USER@HOST TAR_GZ_FILE DMG_FILE
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    41
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    42
  Options are:
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    43
    -p PORT      alternative SSH port (default: """ + SSH.default_port + """)
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    44
    -V NAME      specify volume name
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    45
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    46
  Turn the contents of a tar.gz file into a dmg file -- produced on a remote
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    47
  Mac OS X system.
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    48
""",
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    49
          "p:" -> (arg => port = Value.Int.parse(arg)),
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    50
          "V:" -> (arg => volume_name = arg))
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    51
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    52
        val more_args = getopts(args)
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    53
        val (user, host, tar_gz_file, dmg_file) =
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    54
          more_args match {
64185
wenzelm
parents: 64161
diff changeset
    55
            case List(SSH.Target(user, host), tar_gz_file, dmg_file) =>
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    56
              (user, host, Path.explode(tar_gz_file), Path.explode(dmg_file))
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    57
            case _ => getopts.usage()
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    58
          }
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    59
64161
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    60
        val ssh = SSH.init(Options.init)
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    61
        using(ssh.open_session(user = user, host = host, port = port))(
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    62
          remote_dmg(_, tar_gz_file, dmg_file, volume_name))
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    63
      }
2b1128e95dfb explicit indication of Admin tools;
wenzelm
parents: 64143
diff changeset
    64
    }, admin = true)
64143
578e71c2c976 added isabelle remote_dmg tool;
wenzelm
parents:
diff changeset
    65
}