使用自定义 executils.LookPath() 代替 exec.LookPath() 避免因$PATH环境变量被破坏而无法工作

This commit is contained in:
刘祥超
2023-07-03 10:37:36 +08:00
parent d0bd7bb88d
commit 2c59ae4a5b
14 changed files with 95 additions and 33 deletions

View File

@@ -3,6 +3,7 @@ package apps
import ( import (
"fmt" "fmt"
teaconst "github.com/TeaOSLab/EdgeNode/internal/const" teaconst "github.com/TeaOSLab/EdgeNode/internal/const"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/logs"
"github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
@@ -215,7 +216,7 @@ func (this *AppCmd) runStop() {
// 从systemd中停止 // 从systemd中停止
if runtime.GOOS == "linux" { if runtime.GOOS == "linux" {
systemctl, _ := exec.LookPath("systemctl") systemctl, _ := executils.LookPath("systemctl")
if len(systemctl) > 0 { if len(systemctl) > 0 {
go func() { go func() {
// 有可能会长时间执行,这里不阻塞进程 // 有可能会长时间执行,这里不阻塞进程

View File

@@ -9,7 +9,6 @@ import (
"github.com/TeaOSLab/EdgeNode/internal/remotelogs" "github.com/TeaOSLab/EdgeNode/internal/remotelogs"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
"os/exec"
"strings" "strings"
"time" "time"
) )
@@ -32,7 +31,7 @@ func NewFirewalld() *Firewalld {
cmdQueue: make(chan *firewalldCmd, 4096), cmdQueue: make(chan *firewalldCmd, 4096),
} }
path, err := exec.LookPath("firewall-cmd") path, err := executils.LookPath("firewall-cmd")
if err == nil && len(path) > 0 { if err == nil && len(path) > 0 {
var cmd = executils.NewTimeoutCmd(3*time.Second, path, "--state") var cmd = executils.NewTimeoutCmd(3*time.Second, path, "--state")
err := cmd.Run() err := cmd.Run()

View File

@@ -6,12 +6,13 @@ package nftables_test
import ( import (
"github.com/TeaOSLab/EdgeNode/internal/firewalls/nftables" "github.com/TeaOSLab/EdgeNode/internal/firewalls/nftables"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"os/exec" "os/exec"
"testing" "testing"
) )
func TestConn_Test(t *testing.T) { func TestConn_Test(t *testing.T) {
_, err := exec.LookPath("nft") _, err := executils.LookPath("nft")
if err == nil { if err == nil {
t.Log("ok") t.Log("ok")
return return

View File

@@ -13,7 +13,6 @@ import (
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/iwind/TeaGo/logs" "github.com/iwind/TeaGo/logs"
"os" "os"
"os/exec"
"runtime" "runtime"
"time" "time"
) )
@@ -55,7 +54,7 @@ func init() {
// NftExePath 查找nftables可执行文件路径 // NftExePath 查找nftables可执行文件路径
func NftExePath() string { func NftExePath() string {
path, _ := exec.LookPath("nft") path, _ := executils.LookPath("nft")
if len(path) > 0 { if len(path) > 0 {
return path return path
} }
@@ -93,14 +92,14 @@ func (this *Installer) Install() error {
var cmd *executils.Cmd var cmd *executils.Cmd
// check dnf // check dnf
dnfExe, err := exec.LookPath("dnf") dnfExe, err := executils.LookPath("dnf")
if err == nil { if err == nil {
cmd = executils.NewCmd(dnfExe, "-y", "install", "nftables") cmd = executils.NewCmd(dnfExe, "-y", "install", "nftables")
} }
// check apt // check apt
if cmd == nil { if cmd == nil {
aptExe, err := exec.LookPath("apt") aptExe, err := executils.LookPath("apt")
if err == nil { if err == nil {
cmd = executils.NewCmd(aptExe, "install", "nftables") cmd = executils.NewCmd(aptExe, "install", "nftables")
} }
@@ -108,7 +107,7 @@ func (this *Installer) Install() error {
// check yum // check yum
if cmd == nil { if cmd == nil {
yumExe, err := exec.LookPath("yum") yumExe, err := executils.LookPath("yum")
if err == nil { if err == nil {
cmd = executils.NewCmd(yumExe, "-y", "install", "nftables") cmd = executils.NewCmd(yumExe, "-y", "install", "nftables")
} }

View File

@@ -6,7 +6,6 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"os/exec"
"runtime" "runtime"
"time" "time"
) )
@@ -82,7 +81,7 @@ func (this *FirewalldAction) runActionSingleIP(action string, listType IPListTyp
path := this.config.Path path := this.config.Path
var err error var err error
if len(path) == 0 { if len(path) == 0 {
path, err = exec.LookPath("firewall-cmd") path, err = executils.LookPath("firewall-cmd")
if err != nil { if err != nil {
if this.firewalldNotFound { if this.firewalldNotFound {
return nil return nil

View File

@@ -6,7 +6,6 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
"os/exec"
"runtime" "runtime"
"strconv" "strconv"
"strings" "strings"
@@ -55,7 +54,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro
// 创建ipset // 创建ipset
{ {
path, err := exec.LookPath("ipset") path, err := executils.LookPath("ipset")
if err != nil { if err != nil {
return err return err
} }
@@ -99,7 +98,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro
// firewalld // firewalld
if this.config.AutoAddToFirewalld { if this.config.AutoAddToFirewalld {
path, err := exec.LookPath("firewall-cmd") path, err := executils.LookPath("firewall-cmd")
if err != nil { if err != nil {
return err return err
} }
@@ -179,7 +178,7 @@ func (this *IPSetAction) Init(config *firewallconfigs.FirewallActionConfig) erro
// iptables // iptables
if this.config.AutoAddToIPTables { if this.config.AutoAddToIPTables {
path, err := exec.LookPath("iptables") path, err := executils.LookPath("iptables")
if err != nil { if err != nil {
return err return err
} }
@@ -311,7 +310,7 @@ func (this *IPSetAction) runActionSingleIP(action string, listType IPListType, i
var path = this.config.Path var path = this.config.Path
var err error var err error
if len(path) == 0 { if len(path) == 0 {
path, err = exec.LookPath("ipset") path, err = executils.LookPath("ipset")
if err != nil { if err != nil {
// 找不到ipset命令错误只提示一次 // 找不到ipset命令错误只提示一次
if this.ipsetNotfound { if this.ipsetNotfound {

View File

@@ -6,7 +6,6 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs"
"github.com/TeaOSLab/EdgeNode/internal/utils" "github.com/TeaOSLab/EdgeNode/internal/utils"
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"os/exec"
"runtime" "runtime"
"strings" "strings"
"time" "time"
@@ -87,7 +86,7 @@ func (this *IPTablesAction) runActionSingleIP(action string, listType IPListType
var path = this.config.Path var path = this.config.Path
var err error var err error
if len(path) == 0 { if len(path) == 0 {
path, err = exec.LookPath("iptables") path, err = executils.LookPath("iptables")
if err != nil { if err != nil {
if this.iptablesNotFound { if this.iptablesNotFound {
return nil return nil

View File

@@ -20,7 +20,6 @@ import (
"github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/Tea"
"github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/maps"
"net/url" "net/url"
"os/exec"
"regexp" "regexp"
"runtime" "runtime"
"strconv" "strconv"
@@ -336,7 +335,7 @@ func (this *APIStream) handleNewNodeTask(message *pb.NodeStreamMessage) error {
// 检查Systemd服务 // 检查Systemd服务
func (this *APIStream) handleCheckSystemdService(message *pb.NodeStreamMessage) error { func (this *APIStream) handleCheckSystemdService(message *pb.NodeStreamMessage) error {
systemctl, err := exec.LookPath("systemctl") systemctl, err := executils.LookPath("systemctl")
if err != nil { if err != nil {
this.replyFail(message.RequestId, "'systemctl' not found") this.replyFail(message.RequestId, "'systemctl' not found")
return nil return nil
@@ -378,7 +377,7 @@ func (this *APIStream) handleCheckLocalFirewall(message *pb.NodeStreamMessage) e
return nil return nil
} }
nft, err := exec.LookPath("nft") nft, err := executils.LookPath("nft")
if err != nil { if err != nil {
this.replyFail(message.RequestId, "'nft' not found: "+err.Error()) this.replyFail(message.RequestId, "'nft' not found: "+err.Error())
return nil return nil

View File

@@ -15,7 +15,6 @@ import (
"github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
"net/url" "net/url"
"os/exec"
"regexp" "regexp"
"runtime" "runtime"
"sort" "sort"
@@ -213,7 +212,7 @@ func (this *ListenerManager) findProcessNameWithPort(isUdp bool, port string) st
return "" return ""
} }
path, err := exec.LookPath("ss") path, err := executils.LookPath("ss")
if err != nil { if err != nil {
return "" return ""
} }

View File

@@ -13,7 +13,6 @@ import (
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
"github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/maps"
"os" "os"
"os/exec"
"runtime" "runtime"
"time" "time"
) )
@@ -84,7 +83,7 @@ func (this *SystemServiceManager) setupSystemd(params maps.Map) error {
} }
// 检查当前的service // 检查当前的service
systemctl, err := exec.LookPath("systemctl") systemctl, err := executils.LookPath("systemctl")
if err != nil { if err != nil {
return err return err
} }

View File

@@ -13,7 +13,6 @@ import (
executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec" executils "github.com/TeaOSLab/EdgeNode/internal/utils/exec"
timeutil "github.com/iwind/TeaGo/utils/time" timeutil "github.com/iwind/TeaGo/utils/time"
"net" "net"
"os/exec"
"runtime" "runtime"
"time" "time"
) )
@@ -86,7 +85,7 @@ func (this *ClockManager) Sync() error {
// check chrony // check chrony
if config.CheckChrony { if config.CheckChrony {
chronycExe, err := exec.LookPath("chronyc") chronycExe, err := executils.LookPath("chronyc")
if err == nil && len(chronycExe) > 0 { if err == nil && len(chronycExe) > 0 {
var chronyCmd = executils.NewTimeoutCmd(3*time.Second, chronycExe, "tracking") var chronyCmd = executils.NewTimeoutCmd(3*time.Second, chronycExe, "tracking")
err = chronyCmd.Run() err = chronyCmd.Run()
@@ -101,11 +100,11 @@ func (this *ClockManager) Sync() error {
server = "pool.ntp.org" server = "pool.ntp.org"
} }
ntpdate, err := exec.LookPath("ntpdate") ntpdate, err := executils.LookPath("ntpdate")
if err != nil { if err != nil {
// 使用 date 命令设置 // 使用 date 命令设置
// date --set TIME // date --set TIME
dateExe, err := exec.LookPath("date") dateExe, err := executils.LookPath("date")
if err == nil { if err == nil {
currentTime, err := this.ReadServer(server) currentTime, err := this.ReadServer(server)
if err != nil { if err != nil {

View File

@@ -0,0 +1,59 @@
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build linux
package executils
import (
"golang.org/x/sys/unix"
"io/fs"
"os"
"os/exec"
"syscall"
)
// LookPath customize our LookPath() function, to work in broken $PATH environment variable
func LookPath(file string) (string, error) {
result, err := exec.LookPath(file)
if err == nil && len(result) > 0 {
return result, nil
}
// add common dirs contains executable files these may be excluded in $PATH environment variable
var binPaths = []string{
"/usr/sbin",
"/usr/bin",
"/usr/local/sbin",
"/usr/local/bin",
}
for _, binPath := range binPaths {
var fullPath = binPath + string(os.PathSeparator) + file
stat, err := os.Stat(fullPath)
if err != nil {
continue
}
if stat.IsDir() {
return "", syscall.EISDIR
}
var mode = stat.Mode()
if mode.IsDir() {
return "", syscall.EISDIR
}
err = syscall.Faccessat(unix.AT_FDCWD, fullPath, unix.X_OK, unix.AT_EACCESS)
if err == nil || (err != syscall.ENOSYS && err != syscall.EPERM) {
return fullPath, err
}
if mode&0111 != 0 {
return fullPath, nil
}
return "", fs.ErrPermission
}
return "", &exec.Error{
Name: file,
Err: exec.ErrNotFound,
}
}

View File

@@ -0,0 +1,10 @@
// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
//go:build !linux
package executils
import "os/exec"
func LookPath(file string) (string, error) {
return exec.LookPath(file)
}

View File

@@ -24,7 +24,7 @@ func (this *ServiceManager) Install(exePath string, args []string) error {
return errors.New("only root users can install the service") return errors.New("only root users can install the service")
} }
systemd, err := exec.LookPath("systemctl") systemd, err := executils.LookPath("systemctl")
if err != nil { if err != nil {
return this.installInitService(exePath, args) return this.installInitService(exePath, args)
} }
@@ -39,7 +39,7 @@ func (this *ServiceManager) Start() error {
} }
if files.NewFile(systemdServiceFile).Exists() { if files.NewFile(systemdServiceFile).Exists() {
systemd, err := exec.LookPath("systemctl") systemd, err := executils.LookPath("systemctl")
if err != nil { if err != nil {
return err return err
} }
@@ -56,7 +56,7 @@ func (this *ServiceManager) Uninstall() error {
} }
if files.NewFile(systemdServiceFile).Exists() { if files.NewFile(systemdServiceFile).Exists() {
systemd, err := exec.LookPath("systemctl") systemd, err := executils.LookPath("systemctl")
if err != nil { if err != nil {
return err return err
} }
@@ -96,7 +96,7 @@ func (this *ServiceManager) installInitService(exePath string, args []string) er
return err return err
} }
chkCmd, err := exec.LookPath("chkconfig") chkCmd, err := executils.LookPath("chkconfig")
if err != nil { if err != nil {
return err return err
} }