/* * Copyright 2020 The Dragonfly Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package cmd import ( "fmt" "os" "path" "github.com/spf13/cobra" "gopkg.in/yaml.v3" "d7y.io/dragonfly/v2/cmd/dependency" logger "d7y.io/dragonfly/v2/internal/dflog" "d7y.io/dragonfly/v2/manager" "d7y.io/dragonfly/v2/manager/config" "d7y.io/dragonfly/v2/pkg/dfpath" "d7y.io/dragonfly/v2/version" ) var ( cfg *config.Config ) // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "manager", Short: "The central manager of dragonfly.", Long: `manager is a long-running process and is mainly responsible for managing schedulers and seed peers, offering http apis and portal, etc.`, Args: cobra.NoArgs, DisableAutoGenTag: true, SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { // Validate config if err := cfg.Validate(); err != nil { return err } // Initialize dfpath d, err := initDfpath(cfg.Server) if err != nil { return err } // Initialize logger if err := logger.InitManager(cfg.Verbose, cfg.Console, d.LogDir()); err != nil { return fmt.Errorf("init manager logger: %w", err) } logger.RedirectStdoutAndStderr(cfg.Console, path.Join(d.LogDir(), "manager")) return runManager(d) }, } // Execute adds all child commands to the root command and sets flags appropriately. // This is called by main.main(). It only needs to happen once to the rootCmd. func Execute() { if err := rootCmd.Execute(); err != nil { logger.Error(err) os.Exit(1) } } func init() { // Initialize default manager config cfg = config.New() // Initialize command and config dependency.InitCommandAndConfig(rootCmd, true, cfg) } func initDfpath(cfg *config.ServerConfig) (dfpath.Dfpath, error) { var options []dfpath.Option if cfg.LogDir != "" { options = append(options, dfpath.WithLogDir(cfg.LogDir)) } return dfpath.New(options...) } func runManager(d dfpath.Dfpath) error { logger.Infof("Version:\n%s", version.Version()) // manager config values s, err := yaml.Marshal(cfg) if err != nil { return err } logger.Infof("manager configuration:\n%s", string(s)) ff := dependency.InitMonitor(cfg.PProfPort, cfg.Telemetry) defer ff() svr, err := manager.New(cfg, d) if err != nil { return err } dependency.SetupQuitSignalHandler(func() { svr.Stop() }) return svr.Serve() }