527 lines
14 KiB
Diff
527 lines
14 KiB
Diff
|
|
From ef952b0443bdad7b149b6011fdf149bcfab0065a Mon Sep 17 00:00:00 2001
|
||
|
|
From: meilier <xingweizheng@huawei.com>
|
||
|
|
Date: Sat, 29 Jan 2022 14:33:43 +0800
|
||
|
|
Subject: [PATCH 16/20] refactor: move befor related func of daemon main to a
|
||
|
|
single file
|
||
|
|
|
||
|
|
---
|
||
|
|
cmd/daemon/before.go | 250 ++++++++++++++++++++
|
||
|
|
cmd/daemon/{main_test.go => before_test.go} | 0
|
||
|
|
cmd/daemon/main.go | 225 ------------------
|
||
|
|
3 files changed, 250 insertions(+), 225 deletions(-)
|
||
|
|
create mode 100644 cmd/daemon/before.go
|
||
|
|
rename cmd/daemon/{main_test.go => before_test.go} (100%)
|
||
|
|
|
||
|
|
diff --git a/cmd/daemon/before.go b/cmd/daemon/before.go
|
||
|
|
new file mode 100644
|
||
|
|
index 0000000..ac13303
|
||
|
|
--- /dev/null
|
||
|
|
+++ b/cmd/daemon/before.go
|
||
|
|
@@ -0,0 +1,250 @@
|
||
|
|
+// Copyright (c) Huawei Technologies Co., Ltd. 2020. All rights reserved.
|
||
|
|
+// isula-build licensed under the Mulan PSL v2.
|
||
|
|
+// You can use this software according to the terms and conditions of the Mulan PSL v2.
|
||
|
|
+// You may obtain a copy of Mulan PSL v2 at:
|
||
|
|
+// http://license.coscl.org.cn/MulanPSL2
|
||
|
|
+// THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
|
||
|
|
+// IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
|
||
|
|
+// PURPOSE.
|
||
|
|
+// See the Mulan PSL v2 for more details.
|
||
|
|
+// Author: Xiang Li
|
||
|
|
+// Create: 2022-01-30
|
||
|
|
+// Description: This file is used for isula-build daemon
|
||
|
|
+
|
||
|
|
+package main
|
||
|
|
+
|
||
|
|
+import (
|
||
|
|
+ "io/ioutil"
|
||
|
|
+ "os"
|
||
|
|
+ "path/filepath"
|
||
|
|
+
|
||
|
|
+ "github.com/BurntSushi/toml"
|
||
|
|
+ securejoin "github.com/cyphar/filepath-securejoin"
|
||
|
|
+ "github.com/pkg/errors"
|
||
|
|
+ "github.com/sirupsen/logrus"
|
||
|
|
+ "github.com/spf13/cobra"
|
||
|
|
+
|
||
|
|
+ constant "isula.org/isula-build"
|
||
|
|
+ "isula.org/isula-build/cmd/daemon/config"
|
||
|
|
+ "isula.org/isula-build/image"
|
||
|
|
+ "isula.org/isula-build/store"
|
||
|
|
+ "isula.org/isula-build/util"
|
||
|
|
+)
|
||
|
|
+
|
||
|
|
+// before parses input params for runDaemon()
|
||
|
|
+func before(cmd *cobra.Command) error {
|
||
|
|
+ if !util.SetUmask() {
|
||
|
|
+ return errors.New("setting umask failed")
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ logrus.SetOutput(os.Stdout)
|
||
|
|
+ logrus.SetFormatter(&logrus.TextFormatter{FullTimestamp: true})
|
||
|
|
+
|
||
|
|
+ if err := validateConfigFileAndMerge(cmd); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+ if err := setStoreAccordingToDaemonOpts(); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if err := initLogging(); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if err := setupWorkingDirectories(); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ image.SetSystemContext(daemonOpts.DataRoot)
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func validateConfigFileAndMerge(cmd *cobra.Command) error {
|
||
|
|
+ confFiles := []struct {
|
||
|
|
+ path string
|
||
|
|
+ needed bool
|
||
|
|
+ mergeConfig func(cmd *cobra.Command) error
|
||
|
|
+ }{
|
||
|
|
+ {path: constant.StorageConfigPath, needed: false, mergeConfig: mergeStorageConfig},
|
||
|
|
+ {path: constant.RegistryConfigPath, needed: false, mergeConfig: nil},
|
||
|
|
+ // policy.json file must exists
|
||
|
|
+ {path: constant.SignaturePolicyPath, needed: true, mergeConfig: nil},
|
||
|
|
+ // main configuration comes last for the final merge operation
|
||
|
|
+ {path: constant.ConfigurationPath, needed: false, mergeConfig: loadMainConfiguration},
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ for _, file := range confFiles {
|
||
|
|
+ if exist, err := util.IsExist(file.path); !exist {
|
||
|
|
+ if !file.needed {
|
||
|
|
+ logrus.Warnf("Config file %q missing, the default configuration is used", file.path)
|
||
|
|
+ continue
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if err != nil {
|
||
|
|
+ return errors.Wrapf(err, "check config file %q failed", file.path)
|
||
|
|
+ }
|
||
|
|
+ return errors.Errorf("config file %q is not exist", file.path)
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if err := util.CheckFileInfoAndSize(file.path, constant.MaxFileSize); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+ if file.mergeConfig == nil {
|
||
|
|
+ continue
|
||
|
|
+ }
|
||
|
|
+ if err := file.mergeConfig(cmd); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func mergeStorageConfig(cmd *cobra.Command) error {
|
||
|
|
+ store.SetDefaultConfigFilePath(constant.StorageConfigPath)
|
||
|
|
+ option, err := store.GetDefaultStoreOptions(true)
|
||
|
|
+ if err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if !cmd.Flag("runroot").Changed && option.RunRoot != "" {
|
||
|
|
+ daemonOpts.RunRoot = option.RunRoot
|
||
|
|
+ }
|
||
|
|
+ if !cmd.Flag("dataroot").Changed && option.GraphRoot != "" {
|
||
|
|
+ daemonOpts.DataRoot = option.GraphRoot
|
||
|
|
+ }
|
||
|
|
+ if !cmd.Flag("storage-driver").Changed && option.GraphDriverName != "" {
|
||
|
|
+ daemonOpts.StorageDriver = option.GraphDriverName
|
||
|
|
+ }
|
||
|
|
+ if !cmd.Flag("storage-opt").Changed && len(option.GraphDriverOptions) > 0 {
|
||
|
|
+ daemonOpts.StorageOpts = option.GraphDriverOptions
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func loadMainConfiguration(cmd *cobra.Command) error {
|
||
|
|
+ conf, err := loadConfig(constant.ConfigurationPath)
|
||
|
|
+ if err != nil {
|
||
|
|
+ logrus.Errorf("Load and parse main config file failed: %v", err)
|
||
|
|
+ os.Exit(constant.DefaultFailedCode)
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if err = mergeConfig(conf, cmd); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func loadConfig(path string) (config.TomlConfig, error) {
|
||
|
|
+ var conf config.TomlConfig
|
||
|
|
+ if err := util.CheckFileInfoAndSize(path, constant.MaxFileSize); err != nil {
|
||
|
|
+ return conf, err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ configData, err := ioutil.ReadFile(filepath.Clean(path))
|
||
|
|
+ if err != nil {
|
||
|
|
+ return conf, err
|
||
|
|
+ }
|
||
|
|
+ _, err = toml.Decode(string(configData), &conf)
|
||
|
|
+
|
||
|
|
+ return conf, err
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func mergeConfig(conf config.TomlConfig, cmd *cobra.Command) error {
|
||
|
|
+ if conf.Debug && !cmd.Flag("debug").Changed {
|
||
|
|
+ daemonOpts.Debug = true
|
||
|
|
+ }
|
||
|
|
+ if conf.Experimental && !cmd.Flag("experimental").Changed {
|
||
|
|
+ daemonOpts.Experimental = true
|
||
|
|
+ }
|
||
|
|
+ if conf.LogLevel != "" && !cmd.Flag("log-level").Changed {
|
||
|
|
+ daemonOpts.LogLevel = conf.LogLevel
|
||
|
|
+ }
|
||
|
|
+ if conf.Group != "" && !cmd.Flag("group").Changed {
|
||
|
|
+ daemonOpts.Group = conf.Group
|
||
|
|
+ }
|
||
|
|
+ if conf.Runtime != "" {
|
||
|
|
+ daemonOpts.RuntimePath = conf.Runtime
|
||
|
|
+ }
|
||
|
|
+ if conf.RunRoot != "" && !cmd.Flag("runroot").Changed {
|
||
|
|
+ daemonOpts.RunRoot = conf.RunRoot
|
||
|
|
+ }
|
||
|
|
+ if conf.DataRoot != "" && !cmd.Flag("dataroot").Changed {
|
||
|
|
+ daemonOpts.DataRoot = conf.DataRoot
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func setStoreAccordingToDaemonOpts() error {
|
||
|
|
+ runRoot, err := securejoin.SecureJoin(daemonOpts.RunRoot, "storage")
|
||
|
|
+ if err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+ dataRoot, err := securejoin.SecureJoin(daemonOpts.DataRoot, "storage")
|
||
|
|
+ if err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ store.SetDefaultStoreOptions(store.DaemonStoreOptions{
|
||
|
|
+ RunRoot: runRoot,
|
||
|
|
+ DataRoot: dataRoot,
|
||
|
|
+ Driver: daemonOpts.StorageDriver,
|
||
|
|
+ DriverOption: util.CopyStrings(daemonOpts.StorageOpts),
|
||
|
|
+ })
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func initLogging() error {
|
||
|
|
+ logrusLvl, err := logrus.ParseLevel(daemonOpts.LogLevel)
|
||
|
|
+ if err != nil {
|
||
|
|
+ return errors.Wrapf(err, "unable to parse log level")
|
||
|
|
+ }
|
||
|
|
+ logrus.SetLevel(logrusLvl)
|
||
|
|
+ if daemonOpts.Debug {
|
||
|
|
+ logrus.SetLevel(logrus.DebugLevel)
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
+func setupWorkingDirectories() error {
|
||
|
|
+ if daemonOpts.RunRoot == daemonOpts.DataRoot {
|
||
|
|
+ return errors.Errorf("runroot(%q) and dataroot(%q) must be different paths", daemonOpts.RunRoot, daemonOpts.DataRoot)
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ buildTmpDir, err := securejoin.SecureJoin(daemonOpts.DataRoot, constant.DataRootTmpDirPrefix)
|
||
|
|
+ if err != nil {
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+ dirs := []string{daemonOpts.DataRoot, daemonOpts.RunRoot, buildTmpDir}
|
||
|
|
+ for _, dir := range dirs {
|
||
|
|
+ if !filepath.IsAbs(dir) {
|
||
|
|
+ return errors.Errorf("%q not an absolute dir, the \"dataroot\" and \"runroot\" must be an absolute path", dir)
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ if exist, err := util.IsExist(dir); err != nil {
|
||
|
|
+ return err
|
||
|
|
+ } else if !exist {
|
||
|
|
+ if err := os.MkdirAll(dir, constant.DefaultRootDirMode); err != nil {
|
||
|
|
+ return errors.Wrapf(err, "create directory for %q failed", dir)
|
||
|
|
+ }
|
||
|
|
+ continue
|
||
|
|
+ }
|
||
|
|
+ if !util.IsDirectory(dir) {
|
||
|
|
+ return errors.Errorf("%q is not a directory", dir)
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ // change config root owner as group current defined
|
||
|
|
+ if err := util.ChangeGroup(constant.ConfigRoot, daemonOpts.Group); err != nil {
|
||
|
|
+ logrus.Errorf("Chown for %s failed: %v", constant.ConfigRoot, err)
|
||
|
|
+ return err
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+ return nil
|
||
|
|
+}
|
||
|
|
diff --git a/cmd/daemon/main_test.go b/cmd/daemon/before_test.go
|
||
|
|
similarity index 100%
|
||
|
|
rename from cmd/daemon/main_test.go
|
||
|
|
rename to cmd/daemon/before_test.go
|
||
|
|
diff --git a/cmd/daemon/main.go b/cmd/daemon/main.go
|
||
|
|
index 6deb9cb..5b6327d 100644
|
||
|
|
--- a/cmd/daemon/main.go
|
||
|
|
+++ b/cmd/daemon/main.go
|
||
|
|
@@ -15,22 +15,15 @@ package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
- "io/ioutil"
|
||
|
|
"os"
|
||
|
|
- "path/filepath"
|
||
|
|
|
||
|
|
- "github.com/BurntSushi/toml"
|
||
|
|
"github.com/containers/storage/pkg/reexec"
|
||
|
|
- securejoin "github.com/cyphar/filepath-securejoin"
|
||
|
|
- "github.com/pkg/errors"
|
||
|
|
"github.com/sirupsen/logrus"
|
||
|
|
"github.com/spf13/cobra"
|
||
|
|
|
||
|
|
constant "isula.org/isula-build"
|
||
|
|
- "isula.org/isula-build/cmd/daemon/config"
|
||
|
|
"isula.org/isula-build/daemon"
|
||
|
|
_ "isula.org/isula-build/exporter/register"
|
||
|
|
- "isula.org/isula-build/image"
|
||
|
|
"isula.org/isula-build/pkg/version"
|
||
|
|
"isula.org/isula-build/store"
|
||
|
|
"isula.org/isula-build/util"
|
||
|
|
@@ -132,221 +125,3 @@ func main() {
|
||
|
|
os.Exit(constant.DefaultFailedCode)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
-
|
||
|
|
-func initLogging() error {
|
||
|
|
- logrusLvl, err := logrus.ParseLevel(daemonOpts.LogLevel)
|
||
|
|
- if err != nil {
|
||
|
|
- return errors.Wrapf(err, "unable to parse log level")
|
||
|
|
- }
|
||
|
|
- logrus.SetLevel(logrusLvl)
|
||
|
|
- if daemonOpts.Debug {
|
||
|
|
- logrus.SetLevel(logrus.DebugLevel)
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-// before parses input params for runDaemon()
|
||
|
|
-func before(cmd *cobra.Command) error {
|
||
|
|
- if !util.SetUmask() {
|
||
|
|
- return errors.New("setting umask failed")
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- logrus.SetOutput(os.Stdout)
|
||
|
|
- logrus.SetFormatter(&logrus.TextFormatter{FullTimestamp: true})
|
||
|
|
-
|
||
|
|
- if err := validateConfigFileAndMerge(cmd); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
- if err := setStoreAccordingToDaemonOpts(); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if err := initLogging(); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if err := setupWorkingDirectories(); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- image.SetSystemContext(daemonOpts.DataRoot)
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func setStoreAccordingToDaemonOpts() error {
|
||
|
|
- runRoot, err := securejoin.SecureJoin(daemonOpts.RunRoot, "storage")
|
||
|
|
- if err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
- dataRoot, err := securejoin.SecureJoin(daemonOpts.DataRoot, "storage")
|
||
|
|
- if err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- store.SetDefaultStoreOptions(store.DaemonStoreOptions{
|
||
|
|
- RunRoot: runRoot,
|
||
|
|
- DataRoot: dataRoot,
|
||
|
|
- Driver: daemonOpts.StorageDriver,
|
||
|
|
- DriverOption: util.CopyStrings(daemonOpts.StorageOpts),
|
||
|
|
- })
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func loadConfig(path string) (config.TomlConfig, error) {
|
||
|
|
- var conf config.TomlConfig
|
||
|
|
- if err := util.CheckFileInfoAndSize(path, constant.MaxFileSize); err != nil {
|
||
|
|
- return conf, err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- configData, err := ioutil.ReadFile(filepath.Clean(path))
|
||
|
|
- if err != nil {
|
||
|
|
- return conf, err
|
||
|
|
- }
|
||
|
|
- _, err = toml.Decode(string(configData), &conf)
|
||
|
|
-
|
||
|
|
- return conf, err
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func mergeStorageConfig(cmd *cobra.Command) error {
|
||
|
|
- store.SetDefaultConfigFilePath(constant.StorageConfigPath)
|
||
|
|
- option, err := store.GetDefaultStoreOptions(true)
|
||
|
|
- if err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if !cmd.Flag("runroot").Changed && option.RunRoot != "" {
|
||
|
|
- daemonOpts.RunRoot = option.RunRoot
|
||
|
|
- }
|
||
|
|
- if !cmd.Flag("dataroot").Changed && option.GraphRoot != "" {
|
||
|
|
- daemonOpts.DataRoot = option.GraphRoot
|
||
|
|
- }
|
||
|
|
- if !cmd.Flag("storage-driver").Changed && option.GraphDriverName != "" {
|
||
|
|
- daemonOpts.StorageDriver = option.GraphDriverName
|
||
|
|
- }
|
||
|
|
- if !cmd.Flag("storage-opt").Changed && len(option.GraphDriverOptions) > 0 {
|
||
|
|
- daemonOpts.StorageOpts = option.GraphDriverOptions
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func mergeConfig(conf config.TomlConfig, cmd *cobra.Command) error {
|
||
|
|
- if conf.Debug && !cmd.Flag("debug").Changed {
|
||
|
|
- daemonOpts.Debug = true
|
||
|
|
- }
|
||
|
|
- if conf.Experimental && !cmd.Flag("experimental").Changed {
|
||
|
|
- daemonOpts.Experimental = true
|
||
|
|
- }
|
||
|
|
- if conf.LogLevel != "" && !cmd.Flag("log-level").Changed {
|
||
|
|
- daemonOpts.LogLevel = conf.LogLevel
|
||
|
|
- }
|
||
|
|
- if conf.Group != "" && !cmd.Flag("group").Changed {
|
||
|
|
- daemonOpts.Group = conf.Group
|
||
|
|
- }
|
||
|
|
- if conf.Runtime != "" {
|
||
|
|
- daemonOpts.RuntimePath = conf.Runtime
|
||
|
|
- }
|
||
|
|
- if conf.RunRoot != "" && !cmd.Flag("runroot").Changed {
|
||
|
|
- daemonOpts.RunRoot = conf.RunRoot
|
||
|
|
- }
|
||
|
|
- if conf.DataRoot != "" && !cmd.Flag("dataroot").Changed {
|
||
|
|
- daemonOpts.DataRoot = conf.DataRoot
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func setupWorkingDirectories() error {
|
||
|
|
- if daemonOpts.RunRoot == daemonOpts.DataRoot {
|
||
|
|
- return errors.Errorf("runroot(%q) and dataroot(%q) must be different paths", daemonOpts.RunRoot, daemonOpts.DataRoot)
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- buildTmpDir, err := securejoin.SecureJoin(daemonOpts.DataRoot, constant.DataRootTmpDirPrefix)
|
||
|
|
- if err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
- dirs := []string{daemonOpts.DataRoot, daemonOpts.RunRoot, buildTmpDir}
|
||
|
|
- for _, dir := range dirs {
|
||
|
|
- if !filepath.IsAbs(dir) {
|
||
|
|
- return errors.Errorf("%q not an absolute dir, the \"dataroot\" and \"runroot\" must be an absolute path", dir)
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if exist, err := util.IsExist(dir); err != nil {
|
||
|
|
- return err
|
||
|
|
- } else if !exist {
|
||
|
|
- if err := os.MkdirAll(dir, constant.DefaultRootDirMode); err != nil {
|
||
|
|
- return errors.Wrapf(err, "create directory for %q failed", dir)
|
||
|
|
- }
|
||
|
|
- continue
|
||
|
|
- }
|
||
|
|
- if !util.IsDirectory(dir) {
|
||
|
|
- return errors.Errorf("%q is not a directory", dir)
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- // change config root owner as group current defined
|
||
|
|
- if err := util.ChangeGroup(constant.ConfigRoot, daemonOpts.Group); err != nil {
|
||
|
|
- logrus.Errorf("Chown for %s failed: %v", constant.ConfigRoot, err)
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func validateConfigFileAndMerge(cmd *cobra.Command) error {
|
||
|
|
- confFiles := []struct {
|
||
|
|
- path string
|
||
|
|
- needed bool
|
||
|
|
- mergeConfig func(cmd *cobra.Command) error
|
||
|
|
- }{
|
||
|
|
- {path: constant.StorageConfigPath, needed: false, mergeConfig: mergeStorageConfig},
|
||
|
|
- {path: constant.RegistryConfigPath, needed: false, mergeConfig: nil},
|
||
|
|
- // policy.json file must exists
|
||
|
|
- {path: constant.SignaturePolicyPath, needed: true, mergeConfig: nil},
|
||
|
|
- // main configuration comes last for the final merge operation
|
||
|
|
- {path: constant.ConfigurationPath, needed: false, mergeConfig: loadMainConfiguration},
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- for _, file := range confFiles {
|
||
|
|
- if exist, err := util.IsExist(file.path); !exist {
|
||
|
|
- if !file.needed {
|
||
|
|
- logrus.Warnf("Config file %q missing, the default configuration is used", file.path)
|
||
|
|
- continue
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if err != nil {
|
||
|
|
- return errors.Wrapf(err, "check config file %q failed", file.path)
|
||
|
|
- }
|
||
|
|
- return errors.Errorf("config file %q is not exist", file.path)
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if err := util.CheckFileInfoAndSize(file.path, constant.MaxFileSize); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
- if file.mergeConfig == nil {
|
||
|
|
- continue
|
||
|
|
- }
|
||
|
|
- if err := file.mergeConfig(cmd); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
-
|
||
|
|
-func loadMainConfiguration(cmd *cobra.Command) error {
|
||
|
|
- conf, err := loadConfig(constant.ConfigurationPath)
|
||
|
|
- if err != nil {
|
||
|
|
- logrus.Errorf("Load and parse main config file failed: %v", err)
|
||
|
|
- os.Exit(constant.DefaultFailedCode)
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- if err = mergeConfig(conf, cmd); err != nil {
|
||
|
|
- return err
|
||
|
|
- }
|
||
|
|
-
|
||
|
|
- return nil
|
||
|
|
-}
|
||
|
|
--
|
||
|
|
2.27.0
|
||
|
|
|