frp/cmd/frps/root.go
OoyonghongoO 84d34c8298 UPLOAD
2024-10-05 10:25:11 +08:00

166 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright 2018 fatedier, fatedier@gmail.com
//
// 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 (
"context"
"fmt"
"io/ioutil"
"net/http"
"os"
"strconv"
"time"
"github.com/spf13/cobra"
"github.com/fatedier/frp/pkg/config"
v1 "github.com/fatedier/frp/pkg/config/v1"
"github.com/fatedier/frp/pkg/config/v1/validation"
"github.com/fatedier/frp/pkg/util/log"
"github.com/fatedier/frp/pkg/util/version"
"github.com/fatedier/frp/server"
)
var (
cfgFile string
showVersion bool
strictConfigMode bool
serverCfg v1.ServerConfig
)
func init() {
rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "config file of frps")
rootCmd.PersistentFlags().BoolVarP(&showVersion, "version", "v", false, "version of frps")
rootCmd.PersistentFlags().BoolVarP(&strictConfigMode, "strict_config", "", true, "strict config parsing mode, unknown fields will cause errors")
config.RegisterServerConfigFlags(rootCmd, &serverCfg)
}
var rootCmd = &cobra.Command{
Use: "frps",
Short: "frps is the server of frp (https://github.com/fatedier/frp)",
RunE: func(cmd *cobra.Command, args []string) error {
if showVersion {
fmt.Println(version.Full())
return nil
}
var (
svrCfg *v1.ServerConfig
isLegacyFormat bool
err error
)
if cfgFile != "" {
svrCfg, isLegacyFormat, err = config.LoadServerConfig(cfgFile, strictConfigMode)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if isLegacyFormat {
fmt.Printf("警告INI文件格式在未来将会不受支持并且移除反正目前HayFrps支持就行这行别管!\n")
}
} else {
serverCfg.Complete()
svrCfg = &serverCfg
}
warning, err := validation.ValidateServerConfig(svrCfg)
if warning != nil {
fmt.Printf("警告: %v\n", warning)
}
if err != nil {
fmt.Println(err)
os.Exit(1)
}
if err := runServer(svrCfg); err != nil {
fmt.Println(err)
os.Exit(1)
}
return nil
},
}
func Execute() {
rootCmd.SetGlobalNormalizationFunc(config.WordSepNormalizeFunc)
if err := rootCmd.Execute(); err != nil {
os.Exit(1)
}
}
func runServer(cfg *v1.ServerConfig) (err error) {
log.InitLogger(cfg.Log.To, cfg.Log.Level, int(cfg.Log.MaxDays), cfg.Log.DisablePrintColor)
log.Infof("[HayFrp] 欢迎使用全新的HayFrp服务端!")
log.Infof("[HayFrp] 服务端版本:" + version.Full() + "!")
log.Infof("[HayFrp] 本新版本在客户端链接时将介入HayFrp终端!")
log.Infof("[HayFrp] 各种链接协议已升级到现代协议!")
// 发起 GET 请求获取 API 返回的内容(节点名称)
resp, err := http.Get("https://api.hayfrp.org/NodeAPI?type=GetNodeName&token=" + cfg.ApiToken)
if err != nil {
return err
}
defer resp.Body.Close()
// 读取 API 返回的内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
// 将 API 返回的内容添加到 loginMsg.RunId 后面
log.Infof("[HayFrp] 欢迎节点" + string(body) + "上线!")
log.Infof("[HayFrp] 自检所有必要项中,请稍等......")
log.Infof("[HayFrp] HayFrp API启用状态: %s", strconv.FormatBool(cfg.EnableApi))
log.Infof("[HayFrp] HayFrp API URL: %s", cfg.ApiBaseUrl)
log.Infof("[HayFrp] HayFrp API Node Key: %s", cfg.ApiToken)
if cfgFile != "" {
log.Infof("[HayFrp] HayFrp服务端已引用配置文件: %s", cfgFile)
} else {
log.Infof("[HayFrp] HayFrp服务端已引用命令行参数")
}
svr, err := server.NewService(cfg)
if err != nil {
return err
}
log.Infof("[HayFrp] HayFrp服务端已成功启动")
go checkonline(cfg)
svr.Run(context.Background())
return
}
func checkonline(cfg *v1.ServerConfig) {
time.Sleep(2 * time.Second) // 延时2秒确保延时函数有足够的时间运行
log.Infof("[HayFrp] 检测到所有端口已成功启动,请稍等......")
log.Infof("[HayFrp] 即将请求HayFrp API授权本节点调用其他节点检查本节点状态......")
log.Infof("[HayFrp] 检测节点在线状态中,这将会更新云端状态......")
// 发起 GET 请求获取 API 返回的内容(节点状态)
resp, err := http.Get("https://api.hayfrp.org/NodeAPI?type=checkonline&token=" + cfg.ApiToken)
if err != nil {
return
}
defer resp.Body.Close()
// 读取 API 返回的内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return
}
// 将 API 返回的内容添加到 loginMsg.RunId 后面
log.Infof("[HayFrp] " + string(body))
}