18995: Merge branch 'main' into 18995-code-cleanup-1
[arvados.git] / lib / boot / supervisor.go
index 8746183e6c0a11dd06b751cc549de82c3587fe6c..762581e54e09dcf11008f6f43d15edb03202c29b 100644 (file)
@@ -44,6 +44,7 @@ type Supervisor struct {
        ControllerAddr       string // e.g., 127.0.0.1:8000
        Workbench2Source     string // e.g., /home/username/src/arvados-workbench2
        NoWorkbench1         bool
+       NoWorkbench2         bool
        OwnTemporaryDatabase bool
        Stderr               io.Writer
 
@@ -59,8 +60,8 @@ type Supervisor struct {
        waitShutdown  sync.WaitGroup
 
        bindir     string
-       tempdir    string
-       wwwtempdir string
+       tempdir    string // in production mode, this is accessible only to root
+       wwwtempdir string // in production mode, this is accessible only to www-data
        configfile string
        environ    []string // for child processes
 }
@@ -245,13 +246,12 @@ func (super *Supervisor) run(cfg *arvados.Config) error {
                runServiceCommand{name: "controller", svc: super.cluster.Services.Controller, depends: []supervisedTask{seedDatabase{}}},
                runGoProgram{src: "services/arv-git-httpd", svc: super.cluster.Services.GitHTTP},
                runGoProgram{src: "services/health", svc: super.cluster.Services.Health},
-               runGoProgram{src: "services/keepproxy", svc: super.cluster.Services.Keepproxy, depends: []supervisedTask{runPassenger{src: "services/api"}}},
+               runServiceCommand{name: "keepproxy", svc: super.cluster.Services.Keepproxy, depends: []supervisedTask{runPassenger{src: "services/api"}}},
                runServiceCommand{name: "keepstore", svc: super.cluster.Services.Keepstore},
                runGoProgram{src: "services/keep-web", svc: super.cluster.Services.WebDAV},
                runServiceCommand{name: "ws", svc: super.cluster.Services.Websocket, depends: []supervisedTask{seedDatabase{}}},
                installPassenger{src: "services/api"},
                runPassenger{src: "services/api", varlibdir: "railsapi", svc: super.cluster.Services.RailsAPI, depends: []supervisedTask{createCertificates{}, seedDatabase{}, installPassenger{src: "services/api"}}},
-               runWorkbench2{svc: super.cluster.Services.Workbench2},
                seedDatabase{},
        }
        if !super.NoWorkbench1 {
@@ -260,6 +260,11 @@ func (super *Supervisor) run(cfg *arvados.Config) error {
                        runPassenger{src: "apps/workbench", varlibdir: "workbench1", svc: super.cluster.Services.Workbench1, depends: []supervisedTask{installPassenger{src: "apps/workbench"}}},
                )
        }
+       if !super.NoWorkbench2 {
+               tasks = append(tasks,
+                       runWorkbench2{svc: super.cluster.Services.Workbench2},
+               )
+       }
        if super.ClusterType != "test" {
                tasks = append(tasks,
                        runServiceCommand{name: "dispatch-cloud", svc: super.cluster.Services.DispatchCloud},
@@ -664,10 +669,8 @@ func (super *Supervisor) autofillConfig(cfg *arvados.Config) error {
                }
                cluster.Services.Controller.ExternalURL = arvados.URL{Scheme: "https", Host: net.JoinHostPort(h, p), Path: "/"}
        }
-       defaultExtHost, _, err := net.SplitHostPort(cluster.Services.Controller.ExternalURL.Host)
-       if err != nil {
-               return fmt.Errorf("SplitHostPort(Controller.ExternalURL.Host): %w", err)
-       }
+       u := url.URL(cluster.Services.Controller.ExternalURL)
+       defaultExtHost := u.Hostname()
        for _, svc := range []*arvados.Service{
                &cluster.Services.Controller,
                &cluster.Services.DispatchCloud,
@@ -704,7 +707,8 @@ func (super *Supervisor) autofillConfig(cfg *arvados.Config) error {
                                svc.ExternalURL = arvados.URL{Scheme: "wss", Host: host, Path: "/websocket"}
                        }
                }
-               if super.NoWorkbench1 && svc == &cluster.Services.Workbench1 {
+               if super.NoWorkbench1 && svc == &cluster.Services.Workbench1 ||
+                       super.NoWorkbench2 && svc == &cluster.Services.Workbench2 {
                        // When workbench1 is disabled, it gets an
                        // ExternalURL (so we have a valid listening
                        // port to write in our Nginx config) but no
@@ -805,7 +809,6 @@ func (super *Supervisor) autofillConfig(cfg *arvados.Config) error {
 }
 
 func addrIsLocal(addr string) (bool, error) {
-       return true, nil
        listener, err := net.Listen("tcp", addr)
        if err == nil {
                listener.Close()