From 9cebfccb39aadf15d8be99f496ec33282e45e3bd Mon Sep 17 00:00:00 2001 From: fatedier Date: Wed, 12 May 2021 12:15:22 +0800 Subject: [PATCH] cmd: add verify command to verify if config file syntax is valid (#2389) --- cmd/frpc/sub/verify.go | 54 ++++++++++++++++++++++++++++++++++++++++++ cmd/frps/verify.go | 53 +++++++++++++++++++++++++++++++++++++++++ pkg/config/client.go | 6 ++--- pkg/config/proxy.go | 2 +- 4 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 cmd/frpc/sub/verify.go create mode 100644 cmd/frps/verify.go diff --git a/cmd/frpc/sub/verify.go b/cmd/frpc/sub/verify.go new file mode 100644 index 0000000..b0f5908 --- /dev/null +++ b/cmd/frpc/sub/verify.go @@ -0,0 +1,54 @@ +// Copyright 2021 The frp 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 sub + +import ( + "fmt" + "os" + + "github.com/fatedier/frp/pkg/config" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(verifyCmd) +} + +var verifyCmd = &cobra.Command{ + Use: "verify", + Short: "Verify that the configures is valid", + RunE: func(cmd *cobra.Command, args []string) error { + iniContent, err := config.GetRenderedConfFromFile(cfgFile) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + cfg, err := parseClientCommonCfg(CfgFileTypeIni, iniContent) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + _, _, err = config.LoadAllProxyConfsFromIni(cfg.User, iniContent, cfg.Start) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Printf("frpc: the configuration file %s syntax is ok\n", cfgFile) + return nil + }, +} diff --git a/cmd/frps/verify.go b/cmd/frps/verify.go new file mode 100644 index 0000000..35b2acd --- /dev/null +++ b/cmd/frps/verify.go @@ -0,0 +1,53 @@ +// Copyright 2021 The frp 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 main + +import ( + "fmt" + "os" + + "github.com/fatedier/frp/pkg/config" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(verifyCmd) +} + +var verifyCmd = &cobra.Command{ + Use: "verify", + Short: "Verify that the configures is valid", + RunE: func(cmd *cobra.Command, args []string) error { + if cfgFile == "" { + fmt.Println("no config file is specified") + return nil + } + iniContent, err := config.GetRenderedConfFromFile(cfgFile) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + _, err = parseServerCommonCfg(CfgFileTypeIni, iniContent) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + fmt.Printf("frps: the configuration file %s syntax is ok\n", cfgFile) + return nil + }, +} diff --git a/pkg/config/client.go b/pkg/config/client.go index bf53959..254afa0 100644 --- a/pkg/config/client.go +++ b/pkg/config/client.go @@ -290,7 +290,7 @@ func LoadAllProxyConfsFromIni( for _, section := range rangeSections { err = renderRangeProxyTemplates(f, section) if err != nil { - return nil, nil, fmt.Errorf("fail to render range-section[%s] with error: %v", section.Name(), err) + return nil, nil, fmt.Errorf("failed to render template for proxy %s: %v", section.Name(), err) } } @@ -315,7 +315,7 @@ func LoadAllProxyConfsFromIni( case "server": newConf, newErr := NewProxyConfFromIni(prefix, name, section) if newErr != nil { - return nil, nil, fmt.Errorf("fail to parse section[%s], err: %v", name, newErr) + return nil, nil, fmt.Errorf("failed to parse proxy %s, err: %v", name, newErr) } proxyConfs[prefix+name] = newConf case "visitor": @@ -325,7 +325,7 @@ func LoadAllProxyConfsFromIni( } visitorConfs[prefix+name] = newConf default: - return nil, nil, fmt.Errorf("section[%s] role should be 'server' or 'visitor'", name) + return nil, nil, fmt.Errorf("proxy %s role should be 'server' or 'visitor'", name) } } return proxyConfs, visitorConfs, nil diff --git a/pkg/config/proxy.go b/pkg/config/proxy.go index e108e6b..8aacece 100644 --- a/pkg/config/proxy.go +++ b/pkg/config/proxy.go @@ -274,7 +274,7 @@ func NewProxyConfFromIni(prefix, name string, section *ini.Section) (ProxyConf, conf := DefaultProxyConf(proxyType) if conf == nil { - return nil, fmt.Errorf("proxy [%s] type [%s] error", name, proxyType) + return nil, fmt.Errorf("proxy %s has invalid type [%s]", name, proxyType) } if err := conf.UnmarshalFromIni(prefix, name, section); err != nil {