diff --git a/internal/caches/list_file_db.go b/internal/caches/list_file_db.go index 9bd2c64..0cf2d4d 100644 --- a/internal/caches/list_file_db.go +++ b/internal/caches/list_file_db.go @@ -4,6 +4,7 @@ package caches import ( "errors" + "fmt" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" @@ -83,7 +84,7 @@ func (this *FileListDB) Open(dbPath string) error { // 这里不能加 EXCLUSIVE 锁,不然异步事务可能会失败 writeDB, err := dbs.OpenWriter("file:" + dbPath + "?cache=private&mode=rwc&_journal_mode=WAL&_sync=OFF&_cache_size=" + types.String(cacheSize) + "&_secure_delete=FAST") if err != nil { - return errors.New("open write database failed: " + err.Error()) + return fmt.Errorf("open write database failed: %w", err) } writeDB.SetMaxOpenConns(1) @@ -125,7 +126,7 @@ func (this *FileListDB) Open(dbPath string) error { // read db readDB, err := dbs.OpenReader("file:" + dbPath + "?cache=private&mode=ro&_journal_mode=WAL&_sync=OFF&_cache_size=" + types.String(cacheSize)) if err != nil { - return errors.New("open read database failed: " + err.Error()) + return fmt.Errorf("open read database failed: %w", err) } readDB.SetMaxOpenConns(runtime.NumCPU()) @@ -146,7 +147,7 @@ func (this *FileListDB) Init() error { // 创建 var err = this.initTables(1) if err != nil { - return errors.New("init tables failed: " + err.Error()) + return fmt.Errorf("init tables failed: %w", err) } // 常用语句 diff --git a/internal/caches/reader_partial_file.go b/internal/caches/reader_partial_file.go index 96dcc81..6f03c63 100644 --- a/internal/caches/reader_partial_file.go +++ b/internal/caches/reader_partial_file.go @@ -3,6 +3,7 @@ package caches import ( "encoding/binary" "errors" + "fmt" rangeutils "github.com/TeaOSLab/EdgeNode/internal/utils/ranges" "github.com/iwind/TeaGo/types" "io" @@ -46,7 +47,7 @@ func (this *PartialFileReader) InitAutoDiscard(autoDiscard bool) error { // 读取Range ranges, err := NewPartialRangesFromFile(this.rangePath) if err != nil { - return errors.New("read ranges failed: " + err.Error()) + return fmt.Errorf("read ranges failed: %w", err) } this.ranges = ranges diff --git a/internal/caches/storage_file.go b/internal/caches/storage_file.go index e99d04c..e880dc9 100644 --- a/internal/caches/storage_file.go +++ b/internal/caches/storage_file.go @@ -259,7 +259,7 @@ func (this *FileStorage) Init() error { } else { err = os.MkdirAll(dir, 0777) if err != nil { - return errors.New("[CACHE]can not create dir:" + err.Error()) + return fmt.Errorf("[CACHE]can not create dir: %w", err) } } } diff --git a/internal/firewalls/ddos_protection.go b/internal/firewalls/ddos_protection.go index aa9fa18..5fbb8b0 100644 --- a/internal/firewalls/ddos_protection.go +++ b/internal/firewalls/ddos_protection.go @@ -7,6 +7,7 @@ import ( "bytes" "encoding/json" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ddosconfigs" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" @@ -92,7 +93,7 @@ func (this *DDoSProtectionManager) Apply(config *ddosconfigs.ProtectionConfig) e // 对比配置 configJSON, err := json.Marshal(config) if err != nil { - return errors.New("encode config to json failed: " + err.Error()) + return fmt.Errorf("encode config to json failed: %w", err) } if !allowIPListChanged && bytes.Equal(this.lastConfig, configJSON) { return nil @@ -188,7 +189,7 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) for _, filter := range nftablesFilters { chain, oldRules, err := this.getRules(filter) if err != nil { - return errors.New("get old rules failed: " + err.Error()) + return fmt.Errorf("get old rules failed: %w", err) } var protocol = filter.protocol() @@ -273,7 +274,7 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) // 先清空所有相关规则 err = this.removeOldTCPRules(chain, oldRules) if err != nil { - return errors.New("delete old rules failed: " + err.Error()) + return fmt.Errorf("delete old rules failed: %w", err) } // 添加新规则 @@ -281,9 +282,9 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) if maxConnections > 0 { var cmd = executils.NewTimeoutCmd(10*time.Second, nftExe, "add", "rule", protocol, filter.Name, nftablesChainName, "tcp", "dport", types.String(port), "ct", "count", "over", types.String(maxConnections), "counter", "drop", "comment", this.encodeUserData([]string{"tcp", types.String(port), "maxConnections", types.String(maxConnections)})) cmd.WithStderr() - err := cmd.Run() + err = cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } @@ -293,7 +294,7 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } @@ -305,14 +306,14 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } else { var cmd = executils.NewTimeoutCmd(10*time.Second, nftExe, "add", "rule", protocol, filter.Name, nftablesChainName, "tcp", "dport", types.String(port), "ct", "state", "new", "meter", "meter-"+protocol+"-"+types.String(port)+"-new-connections-rate", "{ "+protocol+" saddr limit rate over "+types.String(newConnectionsMinutelyRate)+"/minute burst "+types.String(newConnectionsMinutelyRate+3)+" packets }" /**"add", "@deny_set", "{"+protocol+" saddr}",**/, "counter", "drop", "comment", this.encodeUserData([]string{"tcp", types.String(port), "newConnectionsRate", "0"})) cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } } @@ -325,14 +326,14 @@ func (this *DDoSProtectionManager) addTCPRules(tcpConfig *ddosconfigs.TCPConfig) cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } else { var cmd = executils.NewTimeoutCmd(10*time.Second, nftExe, "add", "rule", protocol, filter.Name, nftablesChainName, "tcp", "dport", types.String(port), "ct", "state", "new", "meter", "meter-"+protocol+"-"+types.String(port)+"-new-connections-secondly-rate", "{ "+protocol+" saddr limit rate over "+types.String(newConnectionsSecondlyRate)+"/second burst "+types.String(newConnectionsSecondlyRate+3)+" packets }" /**"add", "@deny_set", "{"+protocol+" saddr}",**/, "counter", "drop", "comment", this.encodeUserData([]string{"tcp", types.String(port), "newConnectionsSecondlyRate", "0"})) cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("add nftables rule '" + cmd.String() + "' failed: " + err.Error() + " (" + cmd.Stderr() + ")") + return fmt.Errorf("add nftables rule '%s' failed: %w (%s)", cmd.String(), err, cmd.Stderr()) } } } @@ -498,11 +499,11 @@ func (this *DDoSProtectionManager) getTable(filter *nftablesTableDefinition) (*n func (this *DDoSProtectionManager) getRules(filter *nftablesTableDefinition) (*nftables.Chain, []*nftables.Rule, error) { table, err := this.getTable(filter) if err != nil { - return nil, nil, errors.New("get table failed: " + err.Error()) + return nil, nil, fmt.Errorf("get table failed: %w", err) } chain, err := table.GetChain(nftablesChainName) if err != nil { - return nil, nil, errors.New("get chain failed: " + err.Error()) + return nil, nil, fmt.Errorf("get chain failed: %w", err) } rules, err := chain.GetRules() return chain, rules, err @@ -538,7 +539,7 @@ func (this *DDoSProtectionManager) updateAllowIPList(allIPList []string) error { // 不存在则删除 err = set.DeleteIPElement(ip) if err != nil { - return errors.New("delete ip element '" + ip + "' failed: " + err.Error()) + return fmt.Errorf("delete ip element '%s' failed: %w", ip, err) } } } @@ -556,7 +557,7 @@ func (this *DDoSProtectionManager) updateAllowIPList(allIPList []string) error { // 不存在则添加 err = set.AddIPElement(ip, nil, false) if err != nil { - return errors.New("add ip '" + ip + "' failed: " + err.Error()) + return fmt.Errorf("add ip '%s' failed: %w", ip, err) } } } diff --git a/internal/firewalls/firewall_firewalld.go b/internal/firewalls/firewall_firewalld.go index 0e35ddb..b5c4d85 100644 --- a/internal/firewalls/firewall_firewalld.go +++ b/internal/firewalls/firewall_firewalld.go @@ -3,7 +3,7 @@ package firewalls import ( - "errors" + "fmt" "github.com/TeaOSLab/EdgeNode/internal/conns" "github.com/TeaOSLab/EdgeNode/internal/goman" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" @@ -194,7 +194,7 @@ func (this *Firewalld) DropSourceIP(ip string, timeoutSeconds int, async bool) e err := cmd.Run() if err != nil { - return errors.New("run command failed '" + cmd.String() + "': " + err.Error()) + return fmt.Errorf("run command failed '%s': %w", cmd.String(), err) } return nil } diff --git a/internal/firewalls/firewall_nftables.go b/internal/firewalls/firewall_nftables.go index 8061b55..938d16d 100644 --- a/internal/firewalls/firewall_nftables.go +++ b/internal/firewalls/firewall_nftables.go @@ -5,6 +5,7 @@ package firewalls import ( "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/configutils" "github.com/TeaOSLab/EdgeNode/internal/conns" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" @@ -149,10 +150,10 @@ func (this *NFTablesFirewall) init() error { table, err = this.conn.AddIPv6Table(tableDef.Name) } if err != nil { - return errors.New("create table '" + tableDef.Name + "' failed: " + err.Error()) + return fmt.Errorf("create table '%s' failed: %w", tableDef.Name, err) } } else { - return errors.New("get table '" + tableDef.Name + "' failed: " + err.Error()) + return fmt.Errorf("get table '%s' failed: %w", tableDef.Name, err) } } if table == nil { @@ -166,10 +167,10 @@ func (this *NFTablesFirewall) init() error { if nftables.IsNotFound(err) { chain, err = table.AddAcceptChain(chainName) if err != nil { - return errors.New("create chain '" + chainName + "' failed: " + err.Error()) + return fmt.Errorf("create chain '%s' failed: %w", chainName, err) } } else { - return errors.New("get chain '" + chainName + "' failed: " + err.Error()) + return fmt.Errorf("get chain '%s' failed: %w", chainName, err) } } if chain == nil { @@ -184,7 +185,7 @@ func (this *NFTablesFirewall) init() error { _, err = chain.AddAcceptInterfaceRule("lo", loRuleName) } if err != nil { - return errors.New("add 'lo' rule failed: " + err.Error()) + return fmt.Errorf("add 'lo' rule failed: %w", err) } } @@ -207,10 +208,10 @@ func (this *NFTablesFirewall) init() error { HasTimeout: true, }) if err != nil { - return errors.New("create set '" + setName + "' failed: " + err.Error()) + return fmt.Errorf("create set '%s' failed: %w", setName, err) } } else { - return errors.New("get set '" + setName + "' failed: " + err.Error()) + return fmt.Errorf("get set '%s' failed: %w", setName, err) } } if set == nil { @@ -259,10 +260,10 @@ func (this *NFTablesFirewall) init() error { } } if err != nil { - return errors.New("add rule failed: " + err.Error()) + return fmt.Errorf("add rule failed: %w", err) } } else { - return errors.New("get rule failed: " + err.Error()) + return fmt.Errorf("get rule failed: %w", err) } } if rule == nil { diff --git a/internal/iplibrary/action_ipset.go b/internal/iplibrary/action_ipset.go index 7169893..fd52915 100644 --- a/internal/iplibrary/action_ipset.go +++ b/internal/iplibrary/action_ipset.go @@ -2,6 +2,7 @@ package iplibrary import ( "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" @@ -70,7 +71,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro if err != nil { var output = cmd.Stderr() if !strings.Contains(output, "already exists") { - return errors.New("create ipset '" + listName + "': " + err.Error() + ", output: " + output) + return fmt.Errorf("create ipset '%s': %w, output: %s", listName, err, output) } else { err = nil } @@ -88,7 +89,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro if err != nil { var output = cmd.Stderr() if !strings.Contains(output, "already exists") { - return errors.New("create ipset '" + listName + "': " + err.Error() + ", output: " + output) + return fmt.Errorf("create ipset '%s': %w, output: %s", listName, err, output) } else { err = nil } @@ -116,7 +117,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro if strings.Contains(output, "NAME_CONFLICT") { err = nil } else { - return errors.New("firewall-cmd add ipset '" + listName + "': " + err.Error() + ", output: " + output) + return fmt.Errorf("firewall-cmd add ipset '%s': %w, output: %s", listName, err, output) } } } @@ -134,7 +135,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro if strings.Contains(output, "NAME_CONFLICT") { err = nil } else { - return errors.New("firewall-cmd add ipset '" + listName + "': " + err.Error() + ", output: " + output) + return fmt.Errorf("firewall-cmd add ipset '%s': %w, output: %s", listName, err, output) } } } @@ -148,7 +149,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("firewall-cmd add rich rule '" + listName + "': " + err.Error() + ", output: " + cmd.Stderr()) + return fmt.Errorf("firewall-cmd add rich rule '%s': %w, output: %s", listName, err, cmd.Stderr()) } } @@ -161,7 +162,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("firewall-cmd add rich rule '" + listName + "': " + err.Error() + ", output: " + cmd.Stderr()) + return fmt.Errorf("firewall-cmd add rich rule '%s': %w, output: %s", listName, err, cmd.Stderr()) } } @@ -171,7 +172,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("firewall-cmd reload: " + err.Error() + ", output: " + cmd.Stderr()) + return fmt.Errorf("firewall-cmd reload: %w, output: %s", err, cmd.Stderr()) } } } @@ -200,7 +201,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("iptables add rule: " + err.Error() + ", output: " + cmd.Stderr()) + return fmt.Errorf("iptables add rule: %w, output: %s", err, cmd.Stderr()) } } } @@ -221,7 +222,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro cmd.WithStderr() err := cmd.Run() if err != nil { - return errors.New("iptables add rule: " + err.Error() + ", output: " + cmd.Stderr()) + return fmt.Errorf("iptables add rule: %w, output: %s", err, cmd.Stderr()) } } } diff --git a/internal/nodes/client_conn.go b/internal/nodes/client_conn.go index dfda90d..e6d88ec 100644 --- a/internal/nodes/client_conn.go +++ b/internal/nodes/client_conn.go @@ -3,7 +3,7 @@ package nodes import ( - "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeNode/internal/conns" @@ -98,7 +98,7 @@ func (this *ClientConn) Read(b []byte) (n int, err error) { defer func() { if err != nil { - this.lastErr = errors.New("read error: " + err.Error()) + this.lastErr = fmt.Errorf("read error: %w", err) } else { this.lastErr = nil } @@ -163,7 +163,7 @@ func (this *ClientConn) Write(b []byte) (n int, err error) { defer func() { if err != nil { - this.lastErr = errors.New("write error: " + err.Error()) + this.lastErr = fmt.Errorf("write error: %w", err) } else { this.lastErr = nil } diff --git a/internal/nodes/http_cache_task_manager.go b/internal/nodes/http_cache_task_manager.go index 675eaf2..07fbff9 100644 --- a/internal/nodes/http_cache_task_manager.go +++ b/internal/nodes/http_cache_task_manager.go @@ -6,6 +6,7 @@ import ( "context" "crypto/tls" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeNode/internal/caches" @@ -221,7 +222,7 @@ func (this *HTTPCacheTaskManager) fetchKey(key *pb.HTTPCacheTaskKey) error { req, err := http.NewRequest(http.MethodGet, fullKey, nil) if err != nil { - return errors.New("invalid url: " + fullKey + ": " + err.Error()) + return fmt.Errorf("invalid url: '%s': %w", fullKey, err) } // TODO 可以在管理界面自定义Header @@ -231,7 +232,7 @@ func (this *HTTPCacheTaskManager) fetchKey(key *pb.HTTPCacheTaskKey) error { resp, err := this.httpClient().Do(req) if err != nil { err = this.simplifyErr(err) - return errors.New("request failed: " + fullKey + ": " + err.Error()) + return fmt.Errorf("request failed: '%s': %w", fullKey, err) } defer func() { @@ -248,7 +249,7 @@ func (this *HTTPCacheTaskManager) fetchKey(key *pb.HTTPCacheTaskKey) error { if err != nil { if err != io.EOF { err = this.simplifyErr(err) - return errors.New("request failed: " + fullKey + ": " + err.Error()) + return fmt.Errorf("request failed: '%s': %w", fullKey, err) } else { err = nil } diff --git a/internal/nodes/http_writer.go b/internal/nodes/http_writer.go index 44d4083..334259d 100644 --- a/internal/nodes/http_writer.go +++ b/internal/nodes/http_writer.go @@ -6,6 +6,7 @@ import ( "bufio" "bytes" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeNode/internal/caches" @@ -863,7 +864,7 @@ func (this *HTTPWriter) SendFile(status int, path string) (int64, error) { fp, err := os.OpenFile(path, os.O_RDONLY, 0444) if err != nil { - return 0, errors.New("open file '" + path + "' failed: " + err.Error()) + return 0, fmt.Errorf("open file '%s' failed: %w", path, err) } defer func() { _ = fp.Close() diff --git a/internal/nodes/node.go b/internal/nodes/node.go index e045cdf..845fc1c 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/configutils" iplib "github.com/TeaOSLab/EdgeCommon/pkg/iplibrary" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" @@ -96,11 +97,11 @@ func (this *Node) Test() error { // 检查是否能连接API rpcClient, err := rpc.SharedRPC() if err != nil { - return errors.New("test rpc failed: " + err.Error()) + return fmt.Errorf("test rpc failed: %w", err) } _, err = rpcClient.APINodeRPC.FindCurrentAPINodeVersion(rpcClient.Context(), &pb.FindCurrentAPINodeVersionRequest{}) if err != nil { - return errors.New("test rpc failed: " + err.Error()) + return fmt.Errorf("test rpc failed: %w", err) } return nil @@ -332,7 +333,7 @@ func (this *Node) syncConfig(taskVersion int64) error { rpcClient, err := rpc.SharedRPC() if err != nil { - return errors.New("create rpc client failed: " + err.Error()) + return fmt.Errorf("create rpc client failed: %w", err) } // 获取同步任务 @@ -344,7 +345,7 @@ func (this *Node) syncConfig(taskVersion int64) error { UseDataMap: true, }) if err != nil { - return errors.New("read config from rpc failed: " + err.Error()) + return fmt.Errorf("read config from rpc failed: %w", err) } if !configResp.IsChanged { return nil @@ -372,7 +373,7 @@ func (this *Node) syncConfig(taskVersion int64) error { var nodeConfig = &nodeconfigs.NodeConfig{} err = json.Unmarshal(configJSON, nodeConfig) if err != nil { - return errors.New("decode config failed: " + err.Error()) + return fmt.Errorf("decode config failed: %w", err) } teaconst.NodeId = nodeConfig.Id teaconst.NodeIdString = types.String(teaconst.NodeId) diff --git a/internal/nodes/node_tasks.go b/internal/nodes/node_tasks.go index 78cb84e..84c09a6 100644 --- a/internal/nodes/node_tasks.go +++ b/internal/nodes/node_tasks.go @@ -4,7 +4,7 @@ package nodes import ( "encoding/json" - "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" @@ -35,7 +35,7 @@ func (this *Node) loopTasks() error { rpcClient, err := rpc.SharedRPC() if err != nil { - return errors.New("create rpc client failed: " + err.Error()) + return fmt.Errorf("create rpc client failed: %w", err) } tasksResp, err := rpcClient.NodeTaskRPC.FindNodeTasks(rpcClient.Context(), &pb.FindNodeTasksRequest{ @@ -45,7 +45,7 @@ func (this *Node) loopTasks() error { if rpc.IsConnError(err) && !Tea.IsTesting() { return nil } - return errors.New("read node tasks failed: " + err.Error()) + return fmt.Errorf("read node tasks failed: %w", err) } for _, task := range tasksResp.NodeTasks { err := this.execTask(rpcClient, task) @@ -147,7 +147,7 @@ func (this *Node) execNodeLevelChangedTask(rpcClient *rpc.RPCClient) error { if len(levelInfoResp.ParentNodesMapJSON) > 0 { err = json.Unmarshal(levelInfoResp.ParentNodesMapJSON, &parentNodes) if err != nil { - return errors.New("decode level info failed: " + err.Error()) + return fmt.Errorf("decode level info failed: %w", err) } } @@ -174,7 +174,7 @@ func (this *Node) execDDoSProtectionChangedTask(rpcClient *rpc.RPCClient) error var ddosProtectionConfig = &ddosconfigs.ProtectionConfig{} err = json.Unmarshal(resp.DdosProtectionJSON, ddosProtectionConfig) if err != nil { - return errors.New("decode DDoS protection config failed: " + err.Error()) + return fmt.Errorf("decode DDoS protection config failed: %w", err) } if ddosProtectionConfig != nil && sharedNodeConfig != nil { @@ -202,13 +202,13 @@ func (this *Node) execGlobalServerConfigChangedTask(rpcClient *rpc.RPCClient) er var globalServerConfig = serverconfigs.NewGlobalServerConfig() err = json.Unmarshal(resp.GlobalServerConfigJSON, globalServerConfig) if err != nil { - return errors.New("decode global server config failed: " + err.Error()) + return fmt.Errorf("decode global server config failed: %w", err) } if globalServerConfig != nil { err = globalServerConfig.Init() if err != nil { - return errors.New("validate global server config failed: " + err.Error()) + return fmt.Errorf("validate global server config failed: %w", err) } if sharedNodeConfig != nil { sharedNodeConfig.GlobalServerConfig = globalServerConfig @@ -256,7 +256,7 @@ func (this *Node) execUpdatingServersTask(rpcClient *rpc.RPCClient) error { var serverConfigs = []*serverconfigs.ServerConfig{} err = json.Unmarshal(resp.ServersJSON, &serverConfigs) if err != nil { - return errors.New("decode server configs failed: " + err.Error()) + return fmt.Errorf("decode server configs failed: %w", err) } if resp.MaxId > this.lastUpdatingServerListId { diff --git a/internal/rpc/rpc_client.go b/internal/rpc/rpc_client.go index 7c9ab7c..ec32b60 100644 --- a/internal/rpc/rpc_client.go +++ b/internal/rpc/rpc_client.go @@ -5,6 +5,7 @@ import ( "crypto/tls" "encoding/base64" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeNode/internal/configs" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" @@ -231,7 +232,7 @@ func (this *RPCClient) init() error { for _, endpoint := range this.apiConfig.RPC.Endpoints { u, err := url.Parse(endpoint) if err != nil { - return errors.New("parse endpoint failed: " + err.Error()) + return fmt.Errorf("parse endpoint failed: %w", err) } var conn *grpc.ClientConn var callOptions = grpc.WithDefaultCallOptions( diff --git a/internal/utils/clock/manager.go b/internal/utils/clock/manager.go index edad01c..4ef4dd5 100644 --- a/internal/utils/clock/manager.go +++ b/internal/utils/clock/manager.go @@ -5,6 +5,7 @@ package clock import ( "encoding/binary" "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/nodeconfigs" teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/TeaOSLab/EdgeNode/internal/events" @@ -108,7 +109,7 @@ func (this *ClockManager) Sync() error { if err == nil { currentTime, err := this.ReadServer(server) if err != nil { - return errors.New("read server failed: " + err.Error()) + return fmt.Errorf("read server failed: %w", err) } var delta = time.Now().Unix() - currentTime.Unix() @@ -145,7 +146,7 @@ func (this *ClockManager) syncNtpdate(ntpdate string, server string) error { func (this *ClockManager) ReadServer(server string) (time.Time, error) { conn, err := net.Dial("udp", server+":123") if err != nil { - return time.Time{}, errors.New("connect to server failed: " + err.Error()) + return time.Time{}, fmt.Errorf("connect to server failed: %w", err) } defer func() { _ = conn.Close() @@ -164,13 +165,13 @@ func (this *ClockManager) ReadServer(server string) (time.Time, error) { var req = &NTPPacket{Settings: 0x1B} err = binary.Write(conn, binary.BigEndian, req) if err != nil { - return time.Time{}, errors.New("write request failed: " + err.Error()) + return time.Time{}, fmt.Errorf("write request failed: %w", err) } var resp = &NTPPacket{} err = binary.Read(conn, binary.BigEndian, resp) if err != nil { - return time.Time{}, errors.New("write server response failed: " + err.Error()) + return time.Time{}, fmt.Errorf("write server response failed: %w", err) } const ntpEpochOffset = 2208988800 diff --git a/internal/utils/service_windows.go b/internal/utils/service_windows.go index 8faabb4..da7c642 100644 --- a/internal/utils/service_windows.go +++ b/internal/utils/service_windows.go @@ -1,9 +1,11 @@ +//go:build windows // +build windows package utils import ( "fmt" + teaconst "github.com/TeaOSLab/EdgeNode/internal/const" "github.com/iwind/TeaGo/Tea" "golang.org/x/sys/windows" "golang.org/x/sys/windows/svc" @@ -15,7 +17,7 @@ import ( func (this *ServiceManager) Install(exePath string, args []string) error { m, err := mgr.Connect() if err != nil { - return fmt.Errorf("connecting: %s please 'Run as administrator' again", err.Error()) + return fmt.Errorf("connecting: %w please 'Run as administrator' again", err) } defer m.Disconnect() s, err := m.OpenService(this.Name) @@ -30,7 +32,7 @@ func (this *ServiceManager) Install(exePath string, args []string) error { StartType: windows.SERVICE_AUTO_START, }, args...) if err != nil { - return fmt.Errorf("creating: %s", err.Error()) + return fmt.Errorf("creating: %w", err) } defer s.Close() @@ -46,12 +48,12 @@ func (this *ServiceManager) Start() error { defer m.Disconnect() s, err := m.OpenService(this.Name) if err != nil { - return fmt.Errorf("could not access service: %v", err) + return fmt.Errorf("could not access service: %w", err) } defer s.Close() err = s.Start("service") if err != nil { - return fmt.Errorf("could not start service: %v", err) + return fmt.Errorf("could not start service: %w", err) } return nil @@ -61,12 +63,12 @@ func (this *ServiceManager) Start() error { func (this *ServiceManager) Uninstall() error { m, err := mgr.Connect() if err != nil { - return fmt.Errorf("connecting: %s please 'Run as administrator' again", err.Error()) + return fmt.Errorf("connecting: %w please 'Run as administrator' again", err) } defer m.Disconnect() s, err := m.OpenService(this.Name) if err != nil { - return fmt.Errorf("open service: %s", err.Error()) + return fmt.Errorf("open service: %w", err) } // shutdown service @@ -78,7 +80,7 @@ func (this *ServiceManager) Uninstall() error { defer s.Close() err = s.Delete() if err != nil { - return fmt.Errorf("deleting: %s", err.Error()) + return fmt.Errorf("deleting: %w", err) } return nil } diff --git a/internal/waf/rule_group.go b/internal/waf/rule_group.go index a0e8926..f21ae67 100644 --- a/internal/waf/rule_group.go +++ b/internal/waf/rule_group.go @@ -1,9 +1,8 @@ package waf import ( - "errors" + "fmt" "github.com/TeaOSLab/EdgeNode/internal/waf/requests" - "github.com/iwind/TeaGo/types" ) // rule group @@ -32,7 +31,7 @@ func (this *RuleGroup) Init(waf *WAF) error { for _, set := range this.RuleSets { err := set.Init(waf) if err != nil { - return errors.New("init set '" + types.String(set.Id) + "' failed: " + err.Error()) + return fmt.Errorf("init set '%d' failed: %w", set.Id, err) } } } diff --git a/internal/waf/rule_set.go b/internal/waf/rule_set.go index 49cdd00..d4ad993 100644 --- a/internal/waf/rule_set.go +++ b/internal/waf/rule_set.go @@ -1,7 +1,7 @@ package waf import ( - "errors" + "fmt" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/utils" @@ -49,7 +49,7 @@ func (this *RuleSet) Init(waf *WAF) error { for _, rule := range this.Rules { err := rule.Init() if err != nil { - return errors.New("init rule '" + rule.Param + " " + rule.Operator + " " + types.String(rule.Value) + "' failed: " + err.Error()) + return fmt.Errorf("init rule '%s %s %s' failed: %w", rule.Param, rule.Operator, types.String(rule.Value), err) } }