1/*  Title:      Pure/Admin/remote_dmg.scala
2    Author:     Makarius
3
4Build dmg on remote Mac OS X system.
5*/
6
7package isabelle
8
9
10object Remote_DMG
11{
12  def remote_dmg(ssh: SSH.Session, tar_gz_file: Path, dmg_file: Path, volume_name: String = "")
13  {
14    ssh.with_tmp_dir(remote_dir =>
15      {
16        val cd = "cd " + ssh.bash_path(remote_dir) + "; "
17
18        ssh.write_file(remote_dir + Path.explode("dmg.tar.gz"), tar_gz_file)
19        ssh.execute(cd + "mkdir root && tar -C root -xzf dmg.tar.gz").check
20        ssh.execute(
21          cd + "hdiutil create -srcfolder root" +
22            (if (volume_name == "") "" else " -volname " + Bash.string(volume_name)) +
23            " dmg.dmg").check
24        ssh.read_file(remote_dir + Path.explode("dmg.dmg"), dmg_file)
25      })
26  }
27
28
29  /* Isabelle tool wrapper */
30
31  val isabelle_tool =
32    Isabelle_Tool("remote_dmg", "build dmg on remote Mac OS X system", args =>
33    {
34      Command_Line.tool0 {
35        var port = 0
36        var volume_name = ""
37
38        val getopts = Getopts("""
39Usage: isabelle remote_dmg [OPTIONS] USER@HOST TAR_GZ_FILE DMG_FILE
40
41  Options are:
42    -p PORT      alternative SSH port
43    -V NAME      specify volume name
44
45  Turn the contents of a tar.gz file into a dmg file -- produced on a remote
46  Mac OS X system.
47""",
48          "p:" -> (arg => port = Value.Int.parse(arg)),
49          "V:" -> (arg => volume_name = arg))
50
51        val more_args = getopts(args)
52        val (user, host, tar_gz_file, dmg_file) =
53          more_args match {
54            case List(SSH.Target(user, host), tar_gz_file, dmg_file) =>
55              (user, host, Path.explode(tar_gz_file), Path.explode(dmg_file))
56            case _ => getopts.usage()
57          }
58
59        val options = Options.init()
60        using(SSH.open_session(options, host = host, user = user, port = port))(
61          remote_dmg(_, tar_gz_file, dmg_file, volume_name))
62      }
63    }, admin = true)
64}
65