// installDockerCerts saves the configured certs to the specified dir // if and only if the certs are not already placed there. If no certs // are provided or some certs already exist, nothing is written. func installDockerCerts(s DockerHandlerSettings, dstDir string) error { m := []struct { src string dst string }{ {s.Certs.CABase64, filepath.Join(dstDir, dockerCaCert)}, {s.Certs.ServerCertBase64, filepath.Join(dstDir, dockerSrvCert)}, {s.Certs.ServerKeyBase64, filepath.Join(dstDir, dockerSrvKey)}, } // Check if certs pre rovided for _, v := range m { if len(v.src) == 0 { log.Printf("Docker certificate %s is not provided in the extension settings, skipping docker certs installation", v.dst) return nil } } // Check if certificate files already exist for _, v := range m { if ok, err := util.PathExists(v.dst); err != nil { return fmt.Errorf("error examining path %s: %v", v.dst, err) } else if ok { log.Printf("%s already exists, skipping installing certificates", v.dst) return nil } } // Check the target directory, if not create if ok, err := util.PathExists(dstDir); err != nil { return fmt.Errorf("error checking cert dir: %v", err) } else if !ok { if err := os.MkdirAll(dstDir, 0755); err != nil { return err } } // Write the certs for _, v := range m { // Decode base64 f, err := base64.StdEncoding.DecodeString(strings.TrimSpace(v.src)) if err != nil { return fmt.Errorf("error decoding base64 cert contents: %v", err) } if err := ioutil.WriteFile(v.dst, f, 0600); err != nil { return fmt.Errorf("error writing certificate: %v", err) } } return nil }
// installCompose download docker-compose and saves to a predetermined path. func installCompose(dir string) error { // Create dir if not exists ok, err := util.PathExists(dir) if err != nil { return err } else if !ok { if err := os.MkdirAll(dir, 755); err != nil { return err } } log.Printf("Downloading compose from %s", composeUrl) resp, err := http.Get(composeUrl) if err != nil { return fmt.Errorf("error downloading docker-compose: %v", err) } if resp.StatusCode/100 != 2 { return fmt.Errorf("response status code from %s: %s", composeUrl, resp.Status) } defer resp.Body.Close() fp := filepath.Join(dir, composeBin) f, err := os.OpenFile(fp, os.O_RDWR|os.O_CREATE, 0777) if err != nil { return fmt.Errorf("error creating %s: %v", fp, err) } defer f.Close() if _, err := io.Copy(f, resp.Body); err != nil { return fmt.Errorf("failed to save response body to %s: %v", fp, err) } return nil }