src/Pure/Tools/phabricator.scala
author wenzelm
Wed, 06 Nov 2019 22:51:54 +0100
changeset 71066 114db2b5a5f8
parent 71058 6ca9e8377613
child 71068 510b89906d86
permissions -rw-r--r--
support for Phabricator mail configuration; discontinued template for "isabelle phabricator_update" -- is likely to become a plain shell script;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/Tools/phabricator.scala
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     3
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     4
Support for Phabricator server. See also:
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     5
  - https://www.phacility.com/phabricator
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     6
  - https://secure.phabricator.com/book/phabricator
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     7
*/
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     8
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
     9
package isabelle
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    10
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    11
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    12
import scala.util.matching.Regex
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    13
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    14
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    15
object Phabricator
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    16
{
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    17
  /** defaults **/
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    18
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    19
  /* required packages */
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    20
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    21
  val packages: List[String] =
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    22
    Build_Docker.packages :::
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    23
    List(
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    24
      // https://secure.phabricator.com/source/phabricator/browse/master/scripts/install/install_ubuntu.sh 15e6e2adea61
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    25
      "git", "mysql-server", "apache2", "libapache2-mod-php", "php", "php-mysql",
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    26
      "php-gd", "php-curl", "php-apcu", "php-cli", "php-json", "php-mbstring",
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    27
      // more packages
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    28
      "php-zip", "python-pygments", "ssh")
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    29
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    30
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    31
  /* global system resources */
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    32
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    33
  val daemon_user = "phabricator"
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    34
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    35
  val ssh_standard = 22
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    36
  val ssh_alternative1 = 222
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    37
  val ssh_alternative2 = 2222
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    38
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    39
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    40
  /* installation parameters */
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
    41
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    42
  val default_name = "vcs"
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    43
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    44
  def phabricator_name(name: String = "", ext: String = ""): String =
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    45
    "phabricator" + (if (name.isEmpty) "" else "-" + name) + (if (ext.isEmpty) "" else "." + ext)
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    46
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    47
  def isabelle_phabricator_name(name: String = "", ext: String = ""): String =
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    48
    "isabelle-" + phabricator_name(name = name, ext = ext)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    49
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    50
  def default_root(options: Options, name: String): Path =
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    51
    Path.explode(options.string("phabricator_www_root")) +
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    52
    Path.basic(phabricator_name(name = name))
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    53
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    54
  def default_repo(options: Options, name: String): Path =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    55
    default_root(options, name) + Path.basic("repo")
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    56
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    57
  val mailers_path: Path = Path.explode("mailers.json")
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    58
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    59
  val mailers_template: String =
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    60
"""[
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    61
  {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    62
    "key": "example.org",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    63
    "type": "smtp",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    64
    "options": {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    65
      "host": "mail.example.org",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    66
      "port": 465,
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    67
      "user": "phabricator@example.org",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    68
      "password": "********",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    69
      "protocol": "ssl",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    70
      "message-id": true
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    71
    }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    72
  }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    73
]"""
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
    74
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    75
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    76
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    77
  /** global configuration **/
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    78
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    79
  val global_config = Path.explode("/etc/" + isabelle_phabricator_name(ext = "conf"))
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    80
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    81
  sealed case class Config(name: String, root: Path)
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
    82
  {
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
    83
    def home: Path = root + Path.explode(phabricator_name())
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    84
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    85
    def execute(command: String): Process_Result =
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
    86
      Isabelle_System.bash("./bin/" + command, cwd = home.file).check
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
    87
  }
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    88
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    89
  def read_config(): List[Config] =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    90
  {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    91
    if (global_config.is_file) {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    92
      for (entry <- Library.trim_split_lines(File.read(global_config)) if entry.nonEmpty)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    93
      yield {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    94
        space_explode(':', entry) match {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    95
          case List(name, root) => Config(name, Path.explode(root))
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    96
          case _ => error("Malformed config file " + global_config + "\nentry " + quote(entry))
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    97
        }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    98
      }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
    99
    }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   100
    else Nil
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   101
  }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   102
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   103
  def write_config(configs: List[Config])
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   104
  {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   105
    File.write(global_config,
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   106
      configs.map(config => config.name + ":" + config.root.implode).mkString("", "\n", "\n"))
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   107
  }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   108
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   109
  def get_config(name: String): Config =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   110
    read_config().find(config => config.name == name) getOrElse
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   111
      error("Bad Isabelle/Phabricator installation " + quote(name))
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   112
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   113
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   114
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   115
  /** setup **/
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   116
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   117
  def user_setup(name: String, description: String, ssh_setup: Boolean = false)
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   118
  {
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   119
    if (!Linux.user_exists(name)) {
71054
b64fc38327ae prefer system user setup, e.g. avoid occurrence on login screen;
wenzelm
parents: 71053
diff changeset
   120
      Linux.user_add(name, description = description, system = true, ssh_setup = ssh_setup)
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   121
    }
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   122
    else if (Linux.user_description(name) != description) {
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   123
      error("User " + quote(name) + " already exists --" +
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   124
        " for Phabricator it should have the description:\n  " + quote(description))
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   125
    }
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   126
  }
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   127
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   128
  def phabricator_setup(
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   129
    options: Options,
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   130
    name: String = default_name,
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   131
    root: String = "",
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   132
    repo: String = "",
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   133
    package_update: Boolean = false,
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   134
    progress: Progress = No_Progress)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   135
  {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   136
    /* system environment */
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   137
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   138
    Linux.check_system_root()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   139
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   140
    if (package_update) {
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   141
      Linux.package_update(progress = progress)
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   142
      Linux.check_reboot_required()
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   143
    }
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   144
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   145
    Linux.package_install(packages, progress = progress)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   146
    Linux.check_reboot_required()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   147
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   148
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   149
    /* users */
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   150
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   151
    if (name == daemon_user) {
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   152
      error("Clash of installation name with daemon user " + quote(daemon_user))
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   153
    }
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   154
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   155
    user_setup(daemon_user, "Phabricator Daemon User", ssh_setup = true)
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   156
    user_setup(name, "Phabricator SSH User")
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   157
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   158
    val www_user = options.string("phabricator_www_user")
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   159
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   160
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   161
    /* basic installation */
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   162
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   163
    val root_path = if (root.nonEmpty) Path.explode(root) else default_root(options, name)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   164
    val repo_path = if (repo.nonEmpty) Path.explode(repo) else default_repo(options, name)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   165
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   166
    val configs = read_config()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   167
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   168
    for (config <- configs if config.name == name) {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   169
      error("Duplicate Phabricator installation " + quote(name) + " in " + config.root)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   170
    }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   171
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   172
    if (!Isabelle_System.bash("mkdir -p " + File.bash_path(root_path)).ok) {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   173
      error("Failed to create root directory " + root_path)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   174
    }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   175
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   176
    progress.bash(cwd = root_path.file, echo = true,
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   177
      script = """
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   178
        set -e
71050
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   179
        chown """ + Bash.string(www_user) + ":" + Bash.string(www_user) + """ .
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   180
        chmod 755 .
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   181
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   182
        git clone https://github.com/phacility/libphutil.git
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   183
        git clone https://github.com/phacility/arcanist.git
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   184
        git clone https://github.com/phacility/phabricator.git
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   185
      """).check
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   186
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   187
    val config = Config(name, root_path)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   188
    write_config(configs ::: List(config))
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   189
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   190
    config.execute("config set pygments.enabled true")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   191
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   192
71050
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   193
    /* local repository directory */
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   194
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   195
    if (!Isabelle_System.bash("mkdir -p " + File.bash_path(repo_path)).ok) {
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   196
      error("Failed to create local repository directory " + repo_path)
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   197
    }
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   198
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   199
    Isabelle_System.bash(cwd = repo_path.file,
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   200
      script = """
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   201
        set -e
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   202
        chown -R """ + Bash.string(daemon_user) + ":" + Bash.string(daemon_user) + """ .
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   203
        chmod 755 .
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   204
      """).check
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   205
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   206
    config.execute("config set repository.default-local-path " + File.bash_path(repo_path))
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   207
8198ceef0301 more phabricator setup;
wenzelm
parents: 71049
diff changeset
   208
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   209
    /* MySQL setup */
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   210
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   211
    progress.echo("MySQL setup...")
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   212
71055
27a998cdc0f4 back to plain name, to have it accepted my mysql;
wenzelm
parents: 71054
diff changeset
   213
    File.write(Path.explode("/etc/mysql/mysql.conf.d/" + phabricator_name(ext = "cnf")),
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   214
"""[mysqld]
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   215
max_allowed_packet = 32M
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   216
innodb_buffer_pool_size = 1600M
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   217
local_infile = 0
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   218
""")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   219
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   220
    Linux.service_restart("mysql")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   221
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   222
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   223
    def mysql_conf(R: Regex): Option[String] =
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   224
      split_lines(File.read(Path.explode(options.string("phabricator_mysql_config")))).
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   225
        collectFirst({ case R(a) => a })
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   226
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   227
    for (user <- mysql_conf("""^user\s*=\s*(\S*)\s*$""".r)) {
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   228
      config.execute("config set mysql.user " + Bash.string(user))
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   229
    }
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   230
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   231
    for (pass <- mysql_conf("""^password\s*=\s*(\S*)\s*$""".r)) {
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   232
      config.execute("config set mysql.pass " + Bash.string(pass))
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   233
    }
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   234
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   235
    config.execute("config set storage.default-namespace " +
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   236
      Bash.string(phabricator_name(name = name).replace("-", "_")))
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   237
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   238
    config.execute("config set storage.mysql-engine.max-size 8388608")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   239
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   240
    config.execute("storage upgrade --force")
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   241
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   242
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   243
    /* SSH hosting */
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   244
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   245
    progress.echo("SSH hosting setup...")
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   246
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   247
    val ssh_port = ssh_alternative2
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   248
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   249
    config.execute("config set diffusion.ssh-user " + Bash.string(name))
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   250
    config.execute("config set diffusion.ssh-port " + ssh_port)
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   251
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   252
    val sudoers_file = Path.explode("/etc/sudoers.d") + Path.basic(isabelle_phabricator_name())
71049
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   253
    File.write(sudoers_file,
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   254
      www_user + " ALL=(" + daemon_user + ") SETENV: NOPASSWD: /usr/bin/git, /usr/bin/hg, /usr/bin/ssh, /usr/bin/id\n" +
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   255
      name + " ALL=(" + daemon_user + ") SETENV: NOPASSWD: /usr/bin/git, /usr/bin/git-upload-pack, /usr/bin/git-receive-pack, /usr/bin/hg, /usr/bin/svnserve, /usr/bin/ssh, /usr/bin/id\n")
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   256
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   257
    Isabelle_System.bash("chmod 0440 " + File.bash_path(sudoers_file)).check
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   258
f4b9dd5ab0cc more phabricator setup;
wenzelm
parents: 71047
diff changeset
   259
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   260
    /* PHP setup */
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   261
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   262
    val php_version =
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   263
      Isabelle_System.bash("""php --run 'echo PHP_MAJOR_VERSION . "." . PHP_MINOR_VERSION;'""")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   264
        .check.out
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   265
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   266
    val php_conf =
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   267
      Path.explode("/etc/php") + Path.basic(php_version) +  // educated guess
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   268
        Path.explode("apache2/conf.d") +
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   269
        Path.basic(isabelle_phabricator_name(ext = "ini"))
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   270
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   271
    File.write(php_conf,
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   272
      "post_max_size = 32M\n" +
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   273
      "opcache.validate_timestamps = 0\n" +
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   274
      "memory_limit = 512M\n")
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   275
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   276
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   277
    /* Apache setup */
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   278
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   279
    progress.echo("Apache setup...")
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   280
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   281
    val apache_root = Path.explode(options.string("phabricator_apache_root"))
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   282
    val apache_sites = apache_root + Path.explode("sites-available")
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   283
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   284
    if (!apache_sites.is_dir) error("Bad Apache sites directory " + apache_sites)
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   285
71058
6ca9e8377613 proper names for multiple installations;
wenzelm
parents: 71057
diff changeset
   286
    val server_name = phabricator_name(name = name, ext = "lvh.me")  // alias for "localhost" for testing
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   287
    val server_url = "http://" + server_name
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   288
71058
6ca9e8377613 proper names for multiple installations;
wenzelm
parents: 71057
diff changeset
   289
    File.write(apache_sites + Path.basic(isabelle_phabricator_name(name = name, ext = "conf")),
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   290
"""<VirtualHost *:80>
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   291
    ServerName """ + server_name + """
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   292
    ServerAdmin webmaster@localhost
70969
a48112873f81 MySQL setup;
wenzelm
parents: 70968
diff changeset
   293
    DocumentRoot """ + config.home.implode + """/webroot
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   294
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   295
    ErrorLog ${APACHE_LOG_DIR}/error.log
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   296
    RewriteEngine on
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   297
    RewriteRule ^(.*)$  /index.php?__path__=$1  [B,L,QSA]
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   298
</VirtualHost>
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   299
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   300
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   301
""")
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   302
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   303
    Isabelle_System.bash( """
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   304
      set -e
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   305
      a2enmod rewrite
71058
6ca9e8377613 proper names for multiple installations;
wenzelm
parents: 71057
diff changeset
   306
      a2ensite """ + Bash.string(isabelle_phabricator_name(name = name))).check
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   307
71057
2965304143d8 more phabricator setup;
wenzelm
parents: 71056
diff changeset
   308
    config.execute("config set phabricator.base-uri " + Bash.string(server_url))
2965304143d8 more phabricator setup;
wenzelm
parents: 71056
diff changeset
   309
71051
4eeff87c5072 more phabricator setup;
wenzelm
parents: 71050
diff changeset
   310
    Linux.service_restart("apache2")
70968
46847076477c Apache setup;
wenzelm
parents: 70967
diff changeset
   311
71053
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   312
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   313
    /* PHP daemon */
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   314
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   315
    progress.echo("PHP daemon setup...")
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   316
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   317
    config.execute("config set phd.user " + Bash.string(daemon_user))
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   318
71056
ee3c43eb79ae proper service name (again): it is specific to each installation;
wenzelm
parents: 71055
diff changeset
   319
    Linux.service_install(isabelle_phabricator_name(name = name),
71053
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   320
"""[Unit]
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   321
Description=PHP daemon for Isabelle/Phabricator """ + quote(name) + """
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   322
After=syslog.target network.target apache2.service mysql.service
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   323
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   324
[Service]
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   325
Type=oneshot
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   326
User=""" + daemon_user + """
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   327
Group=""" + daemon_user + """
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   328
Environment=PATH=/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   329
ExecStart=""" + config.home.implode + """/bin/phd start
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   330
ExecStop=""" + config.home.implode + """/bin/phd stop
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   331
RemainAfterExit=yes
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   332
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   333
[Install]
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   334
WantedBy=multi-user.target
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   335
""")
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   336
ba14aa0b5a5d more robust: install PHP daemon after Apache;
wenzelm
parents: 71052
diff changeset
   337
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   338
    /* mail configuration */
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   339
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   340
    val mail_config = config.home + mailers_path
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   341
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   342
    progress.echo("Template for mail configuration: " + mail_config)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   343
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   344
    File.write(mail_config, mailers_template)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   345
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   346
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   347
    progress.echo("\nDONE\nWeb configuration via " + server_url)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   348
  }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   349
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   350
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   351
  /* Isabelle tool wrapper */
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   352
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   353
  val isabelle_tool1 =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   354
    Isabelle_Tool("phabricator_setup", "setup Phabricator server on Ubuntu Linux", args =>
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   355
    {
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   356
      var repo = ""
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   357
      var package_update = false
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   358
      var options = Options.init()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   359
      var root = ""
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   360
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   361
      val getopts =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   362
        Getopts("""
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   363
Usage: isabelle phabricator_setup [OPTIONS] [NAME]
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   364
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   365
  Options are:
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   366
    -R DIR       repository directory (default: """ + default_repo(options, "NAME") + """)
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   367
    -U           full update of system packages before installation
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   368
    -o OPTION    override Isabelle system OPTION (via NAME=VAL or NAME)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   369
    -r DIR       installation root directory (default: """ + default_root(options, "NAME") + """)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   370
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   371
  Install Phabricator as Ubuntu LAMP application (Linux, Apache, MySQL, PHP).
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   372
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   373
  Slogan: "Discuss. Plan. Code. Review. Test.
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   374
  Every application your project needs, all in one tool."
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   375
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   376
  The installation NAME (default: """ + quote(default_name) + """) is mapped to
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   377
  a regular Unix user and used for public SSH access.
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   378
""",
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   379
          "R:" -> (arg => repo = arg),
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   380
          "U" -> (_ => package_update = true),
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   381
          "o:" -> (arg => options = options + arg),
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   382
          "r:" -> (arg => root = arg))
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   383
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   384
      val more_args = getopts(args)
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   385
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   386
      val name =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   387
        more_args match {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   388
          case Nil => default_name
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   389
          case List(name) => name
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   390
          case _ => getopts.usage()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   391
        }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   392
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   393
      val progress = new Console_Progress
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   394
71052
6bf53035baf0 clarified name prefixes: global config always uses "isabelle-phabricator";
wenzelm
parents: 71051
diff changeset
   395
      phabricator_setup(options, name, root = root, repo = repo,
71047
87c132cf5860 more options;
wenzelm
parents: 70970
diff changeset
   396
        package_update = package_update, progress = progress)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   397
    })
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   398
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   399
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   400
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   401
  /** setup mail **/
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   402
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   403
  def phabricator_setup_mail(
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   404
    name: String = default_name,
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   405
    config_file: Option[Path] = None,
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   406
    test_user: String = "",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   407
    progress: Progress = No_Progress)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   408
  {
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   409
    Linux.check_system_root()
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   410
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   411
    val config = get_config(name)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   412
    val default_config_file = config.home + mailers_path
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   413
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   414
    val mail_config = config_file getOrElse default_config_file
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   415
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   416
    def setup_mail
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   417
    {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   418
      progress.echo("Using mail configuration from " + mail_config)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   419
      config.execute("config set cluster.mailers --stdin < " + File.bash_path(mail_config))
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   420
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   421
      if (test_user.nonEmpty) {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   422
        progress.echo("Sending test mail to " + quote(test_user))
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   423
        progress.bash(cwd = config.home.file, echo = true,
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   424
          script = """echo "Test from Phabricator ($(date))" | ./bin/mail send-test --subject "Test" --to """ +
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   425
            Bash.string(test_user)).check
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   426
      }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   427
    }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   428
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   429
    if (config_file.isEmpty) {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   430
      if (!default_config_file.is_file) File.write(default_config_file, mailers_template)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   431
      if (File.read(default_config_file) == mailers_template) {
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   432
        progress.echo(
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   433
          "Please invoke the tool again, after providing details in\n  " + default_config_file)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   434
      }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   435
      else setup_mail
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   436
    }
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   437
    else setup_mail
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   438
  }
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   439
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   440
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   441
  /* Isabelle tool wrapper */
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   442
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   443
  val isabelle_tool2 =
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   444
    Isabelle_Tool("phabricator_setup_mail",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   445
      "setup mail configuration for existing Phabricator server", args =>
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   446
    {
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   447
      var test_user = ""
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   448
      var name = default_name
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   449
      var config_file: Option[Path] = None
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   450
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   451
      val getopts =
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   452
        Getopts("""
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   453
Usage: isabelle phabricator_setup_mail [OPTIONS]
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   454
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   455
  Options are:
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   456
    -T USER      send test mail to Phabricator user
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   457
    -f FILE      config file (default: """ + mailers_path + """ within installation home)
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   458
    -n NAME      Phabricator installation name (default: """ + quote(default_name) + """)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   459
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   460
  Provide mail configuration for existing Phabricator installation. See also
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   461
  https://secure.phabricator.com/book/phabricator/article/configuring_outbound_email
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   462
  (notably section "Mailer: SMTP").
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   463
""",
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   464
          "T:" -> (arg => test_user = arg),
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   465
          "f:" -> (arg => config_file = Some(Path.explode(arg))),
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   466
          "n:" -> (arg => name = arg))
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   467
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   468
      val more_args = getopts(args)
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   469
      if (more_args.nonEmpty) getopts.usage()
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   470
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   471
      val progress = new Console_Progress
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   472
71066
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   473
      phabricator_setup_mail(name = name, config_file = config_file,
114db2b5a5f8 support for Phabricator mail configuration;
wenzelm
parents: 71058
diff changeset
   474
        test_user = test_user, progress = progress)
70967
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   475
    })
79736ffe77c3 some support for Phabricator server;
wenzelm
parents:
diff changeset
   476
}