feat: compatible with openrc and sysvinit (#10723)

This commit is contained in:
ssongliu
2025-10-22 18:32:42 +08:00
committed by GitHub
parent f462591e9c
commit c06ba18023
50 changed files with 1310 additions and 687 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ func (n NvidiaSMI) LoadGpuInfo() (*common.GpuInfo, error) {
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Second))
itemData, err := cmdMgr.RunWithStdoutBashC("nvidia-smi -q -x")
if err != nil {
return nil, fmt.Errorf("calling nvidia-smi failed, err: %w", err)
return nil, fmt.Errorf("calling nvidia-smi failed, %v", err)
}
data := []byte(itemData)
version := "v11"
+14 -14
View File
@@ -8,7 +8,7 @@ import (
"sync"
"time"
baseGlobal "github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
)
@@ -45,31 +45,31 @@ func (x XpuSMI) loadDeviceData(device Device, wg *sync.WaitGroup, res *[]XPUSimp
wgCmd.Wait()
if xpuErr != nil {
baseGlobal.LOG.Errorf("calling xpu-smi discovery failed for device %d, err: %v\n", device.DeviceID, xpuErr)
global.LOG.Errorf("calling xpu-smi discovery failed for device %d, %v", device.DeviceID, xpuErr)
return
}
var info Device
if err := json.Unmarshal([]byte(xpuData), &info); err != nil {
baseGlobal.LOG.Errorf("xpuData json unmarshal failed for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("xpuData json unmarshal failed for device %d, err: %v", device.DeviceID, err)
return
}
bytes, err := strconv.ParseInt(info.MemoryPhysicalSizeByte, 10, 64)
if err != nil {
baseGlobal.LOG.Errorf("Error parsing memory size for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("Error parsing memory size for device %d, err: %v", device.DeviceID, err)
return
}
xpu.Memory = fmt.Sprintf("%.1f MB", float64(bytes)/(1024*1024))
if statsErr != nil {
baseGlobal.LOG.Errorf("calling xpu-smi stats failed for device %d, err: %v\n", device.DeviceID, statsErr)
global.LOG.Errorf("calling xpu-smi stats failed for device %d, err: %v", device.DeviceID, statsErr)
return
}
var stats DeviceStats
if err := json.Unmarshal([]byte(statsData), &stats); err != nil {
baseGlobal.LOG.Errorf("statsData json unmarshal failed for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("statsData json unmarshal failed for device %d, err: %v", device.DeviceID, err)
return
}
@@ -95,7 +95,7 @@ func (x XpuSMI) LoadDashData() ([]XPUSimpleInfo, error) {
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Second))
data, err := cmdMgr.RunWithStdoutBashC("xpu-smi discovery -j")
if err != nil {
return nil, fmt.Errorf("calling xpu-smi failed, err: %w", err)
return nil, fmt.Errorf("calling xpu-smi failed, %v", err)
}
var deviceInfo DeviceInfo
@@ -124,7 +124,7 @@ func (x XpuSMI) LoadGpuInfo() (*XpuInfo, error) {
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(5 * time.Second))
data, err := cmdMgr.RunWithStdoutBashC("xpu-smi discovery -j")
if err != nil {
return nil, fmt.Errorf("calling xpu-smi failed, err: %w", err)
return nil, fmt.Errorf("calling xpu-smi failed, %v", err)
}
var deviceInfo DeviceInfo
if err := json.Unmarshal([]byte(data), &deviceInfo); err != nil {
@@ -146,7 +146,7 @@ func (x XpuSMI) LoadGpuInfo() (*XpuInfo, error) {
processData, err := cmdMgr.RunWithStdoutBashC("xpu-smi ps -j")
if err != nil {
return nil, fmt.Errorf("calling xpu-smi ps failed, err: %w", err)
return nil, fmt.Errorf("calling xpu-smi ps failed, %s", err)
}
var psList DeviceUtilByProcList
if err := json.Unmarshal([]byte(processData), &psList); err != nil {
@@ -205,13 +205,13 @@ func (x XpuSMI) loadDeviceInfo(device Device, wg *sync.WaitGroup, res *XpuInfo,
wgCmd.Wait()
if xpuErr != nil {
baseGlobal.LOG.Errorf("calling xpu-smi discovery failed for device %d, err: %v\n", device.DeviceID, xpuErr)
global.LOG.Errorf("calling xpu-smi discovery failed for device %d, %v", device.DeviceID, xpuErr)
return
}
var info Device
if err := json.Unmarshal([]byte(xpuData), &info); err != nil {
baseGlobal.LOG.Errorf("xpuData json unmarshal failed for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("xpuData json unmarshal failed for device %d, err: %v", device.DeviceID, err)
return
}
@@ -220,20 +220,20 @@ func (x XpuSMI) loadDeviceInfo(device Device, wg *sync.WaitGroup, res *XpuInfo,
bytes, err := strconv.ParseInt(info.MemoryPhysicalSizeByte, 10, 64)
if err != nil {
baseGlobal.LOG.Errorf("Error parsing memory size for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("Error parsing memory size for device %d, err: %v", device.DeviceID, err)
return
}
xpu.Basic.Memory = fmt.Sprintf("%.1f MB", float64(bytes)/(1024*1024))
xpu.Basic.FreeMemory = info.MemoryFreeSizeByte
if statsErr != nil {
baseGlobal.LOG.Errorf("calling xpu-smi stats failed for device %d, err: %v\n", device.DeviceID, statsErr)
global.LOG.Errorf("calling xpu-smi stats failed for device %d, err: %v", device.DeviceID, statsErr)
return
}
var stats DeviceStats
if err := json.Unmarshal([]byte(statsData), &stats); err != nil {
baseGlobal.LOG.Errorf("statsData json unmarshal failed for device %d, err: %v\n", device.DeviceID, err)
global.LOG.Errorf("statsData json unmarshal failed for device %d, err: %v", device.DeviceID, err)
return
}
+22 -27
View File
@@ -14,7 +14,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/i18n"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"github.com/1Panel-dev/1Panel/agent/utils/systemctl"
"github.com/1Panel-dev/1Panel/agent/utils/controller"
"github.com/robfig/cron/v3"
)
@@ -34,37 +34,13 @@ func AddScanTask(taskItem *task.Task, clam model.Clam, timeNow string) {
}
taskItem.Logf("clamdscan --fdpass %s %s", strategy, clam.Path)
mgr := cmd.NewCommandMgr(cmd.WithIgnoreExist1(), cmd.WithTimeout(time.Duration(clam.Timeout)*time.Second), cmd.WithTask(*taskItem))
stdout, err := mgr.RunWithStdoutBashCf("clamdscan --fdpass %s %s", strategy, clam.Path)
if err != nil {
return fmt.Errorf("clamdscan failed, stdout: %v, err: %v", stdout, err)
if err := mgr.RunBashCf("clamdscan --fdpass %s %s", strategy, clam.Path); err != nil {
return fmt.Errorf("clamdscan failed, %v", err)
}
return nil
}, nil)
}
func CheckClamIsActive(withCheck bool, clamRepo repo.IClamRepo) bool {
if withCheck {
isActive := false
exist1, _ := systemctl.IsExist(constant.ClamServiceNameCentOs)
if exist1 {
isActive, _ = systemctl.IsActive(constant.ClamServiceNameCentOs)
}
exist2, _ := systemctl.IsExist(constant.ClamServiceNameUbuntu)
if exist2 {
isActive, _ = systemctl.IsActive(constant.ClamServiceNameUbuntu)
}
if isActive {
return true
}
}
clams, _ := clamRepo.List(repo.WithByStatus(constant.StatusEnable))
for i := 0; i < len(clams); i++ {
global.Cron.Remove(cron.EntryID(clams[i].EntryID))
_ = clamRepo.Update(clams[i].ID, map[string]interface{}{"status": constant.StatusDisable, "entry_id": 0})
}
return false
}
func AnalysisFromLog(pathItem string, record *model.ClamRecord) {
file, err := os.ReadFile(pathItem)
if err != nil {
@@ -86,3 +62,22 @@ func AnalysisFromLog(pathItem string, record *model.ClamRecord) {
}
}
}
func StopAllClamJob(withCheck bool, clamRepo repo.IClamRepo) bool {
if withCheck {
isActive := false
isexist, _ := controller.CheckExist("clam")
if isexist {
isActive, _ = controller.CheckActive("clam")
}
if isActive {
return false
}
}
clams, _ := clamRepo.List(repo.WithByStatus(constant.StatusEnable))
for i := 0; i < len(clams); i++ {
global.Cron.Remove(cron.EntryID(clams[i].EntryID))
_ = clamRepo.Update(clams[i].ID, map[string]interface{}{"status": constant.StatusDisable, "entry_id": 0})
}
return true
}
+14 -16
View File
@@ -70,16 +70,14 @@ func (c *CommandHelper) RunBashCWithArgs(arg ...string) error {
}
func (c *CommandHelper) RunBashC(command string) error {
std, err := c.run("bash", "-c", command)
if err != nil {
return fmt.Errorf("handle failed, std: %s, err: %v", std, err)
if _, err := c.run("bash", "-c", command); err != nil {
return err
}
return nil
}
func (c *CommandHelper) RunBashCf(command string, arg ...interface{}) error {
std, err := c.run("bash", "-c", fmt.Sprintf(command, arg...))
if err != nil {
return fmt.Errorf("handle failed, std: %s, err: %v", std, err)
if _, err := c.run("bash", "-c", fmt.Sprintf(command, arg...)); err != nil {
return err
}
return nil
}
@@ -237,16 +235,16 @@ func handleErr(stdout, stderr bytes.Buffer, ignoreExist1 bool, err error) (strin
}
}
}
errMsg := ""
if len(stderr.String()) != 0 {
errMsg = fmt.Sprintf("stderr: %s", stderr.String())
outItem := stdout.String()
errItem := stderr.String()
if len(errItem) != 0 && len(outItem) != 0 {
return outItem, fmt.Errorf("stdout: %s; stderr: %s, err: %v", outItem, errItem, err)
}
if len(stdout.String()) != 0 {
if len(errMsg) != 0 {
errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String())
} else {
errMsg = fmt.Sprintf("stdout: %s", stdout.String())
}
if len(errItem) != 0 {
return outItem, fmt.Errorf("stderr: %s, err: %v", errItem, err)
}
return errMsg, err
if len(outItem) != 0 {
return outItem, fmt.Errorf("stdout: %s, err: %v", outItem, err)
}
return "", err
}
-23
View File
@@ -18,7 +18,6 @@ import (
"github.com/gin-gonic/gin"
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"golang.org/x/net/idna"
)
@@ -398,28 +397,6 @@ func HandleIPList(content string) ([]string, error) {
return res, nil
}
func RestartService(core, agent, reload bool) {
command := ""
if reload {
command = "systemctl daemon-reload && "
}
switch {
case core && agent:
command += "systemctl restart 1panel-core.service && systemctl restart 1panel-agent.service"
case core:
command += "systemctl restart 1panel-core.service"
case agent:
command += "systemctl restart 1panel-agent.service"
default:
return
}
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(1 * time.Second))
std, err := cmdMgr.RunWithStdoutBashC(command)
if err != nil {
global.LOG.Errorf("restart 1panel service failed, err: %v, std: %s", err, std)
}
}
func GetSystemVersion(versionString string) string {
re := regexp.MustCompile(`v(\d+\.\d+\.\d+)`)
match := re.FindStringSubmatch(versionString)
+197
View File
@@ -0,0 +1,197 @@
package controller
import (
"errors"
"fmt"
"os/exec"
"strings"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/controller/manager"
)
type Controller interface {
Name() string
IsActive(serviceName string) (bool, error)
IsEnable(serviceName string) (bool, error)
IsExist(serviceName string) (bool, error)
Status(serviceName string) (string, error)
Operate(operate, serviceName string) error
Reload() error
}
func New() (Controller, error) {
managerOptions := []string{"systemd", "openrc", "sysvinit"}
for _, item := range managerOptions {
if _, err := exec.LookPath(item); err != nil {
continue
}
switch item {
case "systemd":
return manager.NewSystemd(), nil
case "openrc":
return manager.NewOpenrc(), nil
case "sysvinit":
return manager.NewSysvinit(), nil
}
}
return nil, errors.New("not support such manager initializatio")
}
func Handle(operate, serviceName string) error {
service, err := LoadServiceName(serviceName)
if err != nil {
return err
}
client, err := New()
if err != nil {
return err
}
return client.Operate(operate, service)
}
func HandleStart(serviceName string) error {
service, err := LoadServiceName(serviceName)
if err != nil {
return err
}
return Handle("start", service)
}
func HandleStop(serviceName string) error {
service, err := LoadServiceName(serviceName)
if err != nil {
return err
}
return Handle("stop", service)
}
func HandleRestart(serviceName string) error {
service, err := LoadServiceName(serviceName)
if err != nil {
return err
}
return Handle("restart", service)
}
func CheckExist(serviceName string) (bool, error) {
service, err := LoadServiceName(serviceName)
if err != nil {
return false, err
}
client, err := New()
if err != nil {
return false, err
}
b, er := client.IsExist(service)
return b, er
}
func CheckActive(serviceName string) (bool, error) {
service, err := LoadServiceName(serviceName)
if err != nil {
return false, err
}
client, err := New()
if err != nil {
return false, err
}
return client.IsActive(service)
}
func CheckEnable(serviceName string) (bool, error) {
service, err := LoadServiceName(serviceName)
if err != nil {
return false, err
}
client, err := New()
if err != nil {
return false, err
}
return client.IsEnable(service)
}
func Reload() error {
client, err := New()
if err != nil {
return err
}
return client.Reload()
}
func RestartPanel(core, agent, reload bool) {
client, err := New()
if err != nil {
global.LOG.Errorf("load client for controller failed, err: %v", err)
return
}
if reload {
if err := client.Reload(); err != nil {
global.LOG.Errorf("restart 1panel service failed, err: %v", err)
return
}
}
if agent {
if err := client.Operate("restart", "1panel-agent"); err != nil {
global.LOG.Errorf("restart 1panel agent service failed, err: %v", err)
return
}
}
if core {
if err := client.Operate("restart", "1panel-core"); err != nil {
global.LOG.Errorf("restart 1panel core service failed, err: %v", err)
return
}
}
}
func LoadServiceName(keyword string) (string, error) {
client, err := New()
if err != nil {
return "", err
}
processedName := loadProcessedName(client.Name(), keyword)
exist, err := client.IsExist(processedName)
if exist {
return processedName, nil
}
alistName := loadFromPredefined(client, keyword)
if len(alistName) != 0 {
return alistName, nil
}
return "", fmt.Errorf("find such service for %s failed", keyword)
}
func loadProcessedName(mgr, keyword string) string {
keyword = strings.ToLower(keyword)
if strings.HasSuffix(keyword, ".service.socket") {
keyword = strings.TrimSuffix(keyword, ".service.socket") + ".socket"
}
if mgr != "systemd" {
keyword = strings.TrimSuffix(keyword, ".service")
return keyword
}
if !strings.HasSuffix(keyword, ".service") && !strings.HasSuffix(keyword, ".socket") {
keyword += ".service"
}
return keyword
}
func loadFromPredefined(mgr Controller, keyword string) string {
predefinedMap := map[string][]string{
"clam": {"clamav-daemon.service", "clamd@scan.service", "clamd"},
"freshclam": {"clamav-freshclam.service", "freshclam.service"},
"fail2ban": {"fail2ban.service", "fail2ban"},
"supervisor": {"supervisord.service", "supervisor.service", "supervisord", "supervisor"},
"ssh": {"sshd.service", "ssh.service", "sshd", "ssh"},
"1panel-core": {"1panel-core.service", "1panel-cored"},
"1panel-agent": {"1panel-agent.service", "1panel-agentd"},
"docker": {"docker.service", "dockerd"},
}
if val, ok := predefinedMap[keyword]; ok {
for _, item := range val {
if exist, _ := mgr.IsExist(item); exist {
return item
}
}
}
return ""
}
+25
View File
@@ -0,0 +1,25 @@
package manager
import (
"errors"
"strings"
"time"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
)
func handlerErr(out string, err error) error {
if err != nil {
if out != "" {
return errors.New(out)
}
return err
}
return nil
}
func run(name string, args ...string) (string, error) {
global.LOG.Debugf("handle with controller `%s %s`", name, strings.Join(args, " "))
return cmd.NewCommandMgr(cmd.WithTimeout(10*time.Second)).RunWithStdoutBashCf("LANGUAGE=en_US:en %s %s", name, strings.Join(args, " "))
}
+61
View File
@@ -0,0 +1,61 @@
package manager
import (
"fmt"
"os"
"path/filepath"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
)
type Openrc struct{ toolCmd string }
func NewOpenrc() *Openrc {
return &Openrc{toolCmd: "rc-service"}
}
func (s *Openrc) Name() string {
return "openrc"
}
func (s *Openrc) IsActive(serviceName string) (bool, error) {
out, err := cmd.RunDefaultWithStdoutBashCf("if service %s status >/dev/null 2>&1; then echo 'active'; else echo 'inactive'; fi", serviceName)
if err != nil {
return false, err
}
return out == "active\n", nil
}
func (s *Openrc) IsEnable(serviceName string) (bool, error) {
out, err := cmd.RunDefaultWithStdoutBashCf("if ls /etc/rc*.d/S*%s >/dev/null 2>&1; then echo 'enabled'; else echo 'disabled'; fi", serviceName)
if err != nil {
return false, err
}
return out == "enabled\n", nil
}
func (s *Openrc) IsExist(serviceName string) (bool, error) {
_, err := os.Stat(filepath.Join("/etc/init.d", serviceName))
if err != nil {
if os.IsNotExist(err) {
return false, nil
}
return false, fmt.Errorf("stat /etc/init.d/%s failed: %w", serviceName, err)
}
return true, nil
}
func (s *Openrc) Status(serviceName string) (string, error) {
return run(s.toolCmd, serviceName, "status")
}
func (s *Openrc) Operate(operate, serviceName string) error {
switch operate {
case "enable":
return handlerErr(run("rc-update", "add", serviceName, "default"))
case "disable":
return handlerErr(run("rc-update", "del", serviceName, "default"))
default:
return handlerErr(run(s.toolCmd, serviceName, operate))
}
}
func (s *Openrc) Reload() error {
return nil
}
+54
View File
@@ -0,0 +1,54 @@
package manager
import (
"strings"
)
type Snap struct{ toolCmd string }
func NewSnap() *Snap {
return &Snap{toolCmd: "snap"}
}
func (s *Snap) IsExist(serviceName string) bool {
out, err := run(s.toolCmd, "services")
if err != nil {
return false
}
return strings.Contains(out, serviceName)
}
func (s *Snap) IsActive(serviceName string) bool {
out, err := run(s.toolCmd, "services")
if err != nil {
return false
}
lines := strings.Split(out, "\n")
for _, line := range lines {
if strings.Contains(line, serviceName) && strings.Contains(line, "active") {
return true
}
}
return false
}
func (s *Snap) IsEnable(serviceName string) bool {
out, err := run(s.toolCmd, "services")
if err != nil {
return false
}
lines := strings.Split(out, "\n")
for _, line := range lines {
if strings.Contains(line, serviceName) && strings.Contains(line, "enabled") {
return true
}
}
return false
}
func (s *Snap) Operate(operate, serviceName string) error {
if s.IsExist(serviceName) {
return handlerErr(run(s.toolCmd, operate, serviceName))
}
return nil
}
+75
View File
@@ -0,0 +1,75 @@
package manager
import (
"strings"
)
type Systemd struct{ toolCmd string }
func NewSystemd() *Systemd {
return &Systemd{toolCmd: "systemctl"}
}
func (s *Systemd) Name() string {
return "systemd"
}
func (s *Systemd) IsActive(serviceName string) (bool, error) {
out, err := run(s.toolCmd, "is-active", serviceName)
if err != nil && out != "inactive\n" {
if NewSnap().IsActive(serviceName) {
return true, nil
}
return false, err
}
return out == "active\n", nil
}
func (s *Systemd) IsEnable(serviceName string) (bool, error) {
out, err := run(s.toolCmd, "is-enabled", serviceName)
if err != nil && out != "disabled\n" {
if serviceName == "sshd" && out == "alias\n" {
return s.IsEnable("ssh")
}
if NewSnap().IsEnable(serviceName) {
return true, nil
}
return false, err
}
return out == "enabled\n", nil
}
func (s *Systemd) IsExist(serviceName string) (bool, error) {
out, err := run(s.toolCmd, "is-enabled", serviceName)
if err != nil && out != "enabled\n" {
if strings.Contains(out, "disabled") {
return true, err
}
if NewSnap().IsExist(serviceName) {
return true, nil
}
return false, err
}
return true, err
}
func (s *Systemd) Status(serviceName string) (string, error) {
return run(s.toolCmd, "status", serviceName)
}
func (s *Systemd) Operate(operate, serviceName string) error {
out, err := run(s.toolCmd, operate, serviceName)
if err != nil {
if serviceName == "sshd" && strings.Contains(out, "alias name or linked unit file") {
return s.Operate(operate, "ssh")
}
if err := NewSnap().Operate(operate, serviceName); err == nil {
return nil
}
return handlerErr(run(s.toolCmd, operate, serviceName))
}
return nil
}
func (s *Systemd) Reload() error {
out, err := run(s.toolCmd, "daemon-reload")
return handlerErr(out, err)
}
@@ -0,0 +1,54 @@
package manager
import (
"fmt"
"os"
"path/filepath"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
)
type Sysvinit struct{ toolCmd string }
func NewSysvinit() *Sysvinit {
return &Sysvinit{toolCmd: "service"}
}
func (s *Sysvinit) Name() string {
return "sysvinit"
}
func (s *Sysvinit) IsActive(serviceName string) (bool, error) {
out, err := cmd.RunDefaultWithStdoutBashCf("if service %s status >/dev/null 2>&1; then echo 'active'; else echo 'inactive'; fi", serviceName)
if err != nil {
return false, err
}
return out == "active\n", nil
}
func (s *Sysvinit) IsEnable(serviceName string) (bool, error) {
out, err := cmd.RunDefaultWithStdoutBashCf("if ls /etc/rc*.d/S*%s >/dev/null 2>&1; then echo 'enabled'; else echo 'disabled'; fi", serviceName)
if err != nil {
return false, err
}
return out == "enabled\n", nil
}
func (s *Sysvinit) IsExist(serviceName string) (bool, error) {
_, err := os.Stat(filepath.Join("/etc/init.d", serviceName))
if err != nil {
if os.IsNotExist(err) {
return false, nil
}
return false, fmt.Errorf("stat /etc/init.d/%s failed: %w", serviceName, err)
}
return true, nil
}
func (s *Sysvinit) Status(serviceName string) (string, error) {
return run(s.toolCmd, serviceName, "status")
}
func (s *Sysvinit) Operate(operate, serviceName string) error {
return handlerErr(run(s.toolCmd, serviceName, operate))
}
func (s *Sysvinit) Reload() error {
return nil
}
+3 -13
View File
@@ -30,7 +30,6 @@ import (
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/mholt/archiver/v4"
"github.com/pkg/errors"
"github.com/spf13/afero"
)
@@ -178,10 +177,7 @@ func (f FileOp) ChownR(dst string, uid string, gid string, sub bool) error {
cmdStr = fmt.Sprintf(`chown -R %s:%s "%s"`, uid, gid, dst)
}
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(10 * time.Second))
if msg, err := cmdMgr.RunWithStdoutBashC(cmdStr); err != nil {
if msg != "" {
return errors.New(msg)
}
if err := cmdMgr.RunBashC(cmdStr); err != nil {
return err
}
return nil
@@ -193,10 +189,7 @@ func (f FileOp) ChmodR(dst string, mode int64, sub bool) error {
cmdStr = fmt.Sprintf(`%s chmod -R %v "%s"`, cmd.SudoHandleCmd(), fmt.Sprintf("%04o", mode), dst)
}
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(10 * time.Second))
if msg, err := cmdMgr.RunWithStdoutBashC(cmdStr); err != nil {
if msg != "" {
return errors.New(msg)
}
if err := cmdMgr.RunBashC(cmdStr); err != nil {
return err
}
return nil
@@ -208,10 +201,7 @@ func (f FileOp) ChmodRWithMode(dst string, mode fs.FileMode, sub bool) error {
cmdStr = fmt.Sprintf(`%s chmod -R %v "%s"`, cmd.SudoHandleCmd(), fmt.Sprintf("%o", mode.Perm()), dst)
}
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(10 * time.Second))
if msg, err := cmdMgr.RunWithStdoutBashC(cmdStr); err != nil {
if msg != "" {
return errors.New(msg)
}
if err := cmdMgr.RunBashC(cmdStr); err != nil {
return err
}
return nil
+22 -30
View File
@@ -9,6 +9,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/buserr"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"github.com/1Panel-dev/1Panel/agent/utils/controller"
)
var ForwardListRegex = regexp.MustCompile(`^port=(\d{1,5}):proto=(.+?):toport=(\d{1,5}):toaddr=(.*)$`)
@@ -31,39 +32,35 @@ func (f *Firewall) Status() (bool, error) {
func (f *Firewall) Version() (string, error) {
stdout, err := cmd.RunDefaultWithStdoutBashC("LANGUAGE=en_US:en firewall-cmd --version")
if err != nil {
return "", fmt.Errorf("load the firewall version failed, err: %s", stdout)
return "", fmt.Errorf("load the firewall version failed, %v", err)
}
return strings.ReplaceAll(stdout, "\n ", ""), nil
}
func (f *Firewall) Start() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl start firewalld")
if err != nil {
return fmt.Errorf("enable the firewall failed, err: %s", stdout)
if err := controller.HandleStart("firewalld"); err != nil {
return fmt.Errorf("enable the firewall failed, err: %v", err)
}
return nil
}
func (f *Firewall) Stop() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl stop firewalld")
if err != nil {
return fmt.Errorf("stop the firewall failed, err: %s", stdout)
if err := controller.HandleStop("firewalld"); err != nil {
return fmt.Errorf("stop the firewall failed, err: %v", err)
}
return nil
}
func (f *Firewall) Restart() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl restart firewalld")
if err != nil {
return fmt.Errorf("restart the firewall failed, err: %s", stdout)
if err := controller.HandleRestart("firewalld"); err != nil {
return fmt.Errorf("restart the firewall failed, err: %v", err)
}
return nil
}
func (f *Firewall) Reload() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("firewall-cmd --reload")
if err != nil {
return fmt.Errorf("reload firewall failed, err: %s", stdout)
if err := cmd.RunDefaultBashC("firewall-cmd --reload"); err != nil {
return fmt.Errorf("reload firewall failed, err: %v", err)
}
return nil
}
@@ -170,9 +167,8 @@ func (f *Firewall) Port(port FireInfo, operation string) error {
return buserr.New("ErrCmdIllegal")
}
stdout, err := cmd.RunDefaultWithStdoutBashCf("firewall-cmd --zone=public --%s-port=%s/%s --permanent", operation, port.Port, port.Protocol)
if err != nil {
return fmt.Errorf("%s (port: %s/%s strategy: %s) failed, err: %s", operation, port.Port, port.Protocol, port.Strategy, stdout)
if err := cmd.RunDefaultBashCf("firewall-cmd --zone=public --%s-port=%s/%s --permanent", operation, port.Port, port.Protocol); err != nil {
return fmt.Errorf("%s (port: %s/%s strategy: %s) failed, %v", operation, port.Port, port.Protocol, port.Strategy, err)
}
return nil
}
@@ -195,14 +191,12 @@ func (f *Firewall) RichRules(rule FireInfo, operation string) error {
ruleStr += fmt.Sprintf("protocol=%s ", rule.Protocol)
}
ruleStr += rule.Strategy
stdout, err := cmd.RunDefaultWithStdoutBashCf("firewall-cmd --zone=public --%s-rich-rule '%s' --permanent", operation, ruleStr)
if err != nil {
return fmt.Errorf("%s rich rules (%s) failed, err: %s", operation, ruleStr, stdout)
if err := cmd.RunDefaultBashCf("firewall-cmd --zone=public --%s-rich-rule '%s' --permanent", operation, ruleStr); err != nil {
return fmt.Errorf("%s rich rules (%s) failed, %v", operation, ruleStr, err)
}
if len(rule.Address) == 0 {
stdout1, err := cmd.RunDefaultWithStdoutBashCf("firewall-cmd --zone=public --%s-rich-rule '%s' --permanent", operation, strings.ReplaceAll(ruleStr, "family=ipv4 ", "family=ipv6 "))
if err != nil {
return fmt.Errorf("%s rich rules (%s) failed, err: %s", operation, strings.ReplaceAll(ruleStr, "family=ipv4 ", "family=ipv6 "), stdout1)
if err := cmd.RunDefaultBashCf("firewall-cmd --zone=public --%s-rich-rule '%s' --permanent", operation, strings.ReplaceAll(ruleStr, "family=ipv4 ", "family=ipv6 ")); err != nil {
return fmt.Errorf("%s rich rules (%s) failed, %v", operation, strings.ReplaceAll(ruleStr, "family=ipv4 ", "family=ipv6 "), err)
}
}
return nil
@@ -214,11 +208,10 @@ func (f *Firewall) PortForward(info Forward, operation string) error {
ruleStr = fmt.Sprintf("firewall-cmd --zone=public --%s-forward-port=port=%s:proto=%s:toaddr=%s:toport=%s --permanent", operation, info.Port, info.Protocol, info.TargetIP, info.TargetPort)
}
stdout, err := cmd.RunDefaultWithStdoutBashC(ruleStr)
if err != nil {
return fmt.Errorf("%s port forward failed, err: %s", operation, stdout)
if err := cmd.RunDefaultBashC(ruleStr); err != nil {
return fmt.Errorf("%s port forward failed, %s", operation, err)
}
if err = f.Reload(); err != nil {
if err := f.Reload(); err != nil {
return err
}
return nil
@@ -250,13 +243,12 @@ func (f *Firewall) EnableForward() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("firewall-cmd --zone=public --query-masquerade")
if err != nil {
if strings.HasSuffix(strings.TrimSpace(stdout), "no") {
stdout, err = cmd.RunDefaultWithStdoutBashC("firewall-cmd --zone=public --add-masquerade --permanent")
if err != nil {
return fmt.Errorf("%s: %s", err, stdout)
if err := cmd.RunDefaultBashC("firewall-cmd --zone=public --add-masquerade --permanent"); err != nil {
return err
}
return f.Reload()
}
return fmt.Errorf("%s: %s", err, stdout)
return err
}
return nil
+25 -30
View File
@@ -39,37 +39,32 @@ func NewIptables() (*Iptables, error) {
return iptables, nil
}
func (iptables *Iptables) outf(tab, rule string, a ...any) (stdout string, err error) {
func (iptables *Iptables) out(tab, rule string) (string, error) {
cmdMgr := cmd.NewCommandMgr(cmd.WithIgnoreExist1(), cmd.WithTimeout(20*time.Second))
stdout, err = cmdMgr.RunWithStdoutBashCf("%s iptables -t %s %s", iptables.CmdStr, tab, fmt.Sprintf(rule, a...))
if err != nil && stdout != "" {
global.LOG.Errorf("iptables failed, err: %s", stdout)
stdout, err := cmdMgr.RunWithStdoutBashCf("%s iptables -t %s %s", iptables.CmdStr, tab, rule)
if err != nil {
global.LOG.Errorf("iptables failed, %v", err)
}
return
return stdout, nil
}
func (iptables *Iptables) runf(tab, rule string, a ...any) error {
stdout, err := iptables.outf(tab, rule, a...)
if err != nil {
return fmt.Errorf("%s, %s", err, stdout)
func (iptables *Iptables) run(tab, rule string) error {
if _, err := iptables.out(tab, rule); err != nil {
return err
}
if stdout != "" {
return fmt.Errorf("iptables error: %s", stdout)
}
return nil
}
func (iptables *Iptables) Check() error {
stdout, err := cmd.RunDefaultWithStdoutBashC("cat /proc/sys/net/ipv4/ip_forward")
if err != nil {
return fmt.Errorf("check ip_forward error: %w, output: %s", err, stdout)
return fmt.Errorf("check ip_forward failed, %v", err)
}
if strings.TrimSpace(stdout) == "0" {
return fmt.Errorf("ipv4 forward disabled")
}
chain, err := iptables.outf(NatTab, "-L -n | grep 'Chain %s'", PreRoutingChain)
chain, err := iptables.out(NatTab, fmt.Sprintf("-L -n | grep 'Chain %s'", PreRoutingChain))
if err != nil {
return fmt.Errorf("failed to check chain: %w", err)
}
@@ -81,18 +76,18 @@ func (iptables *Iptables) Check() error {
}
func (iptables *Iptables) NewChain(tab, chain string) error {
return iptables.runf(tab, "-N %s", chain)
return iptables.run(tab, "-N "+chain)
}
func (iptables *Iptables) AppendChain(tab string, chain, chain1 string) error {
return iptables.runf(tab, "-A %s -j %s", chain, chain1)
return iptables.run(tab, fmt.Sprintf("-A %s -j %s", chain, chain1))
}
func (iptables *Iptables) NatList(chain ...string) ([]IptablesNatInfo, error) {
if len(chain) == 0 {
chain = append(chain, PreRoutingChain)
}
stdout, err := iptables.outf(NatTab, "-nvL %s --line-numbers", chain[0])
stdout, err := iptables.out(NatTab, fmt.Sprintf("-nvL %s --line-numbers", chain[0]))
if err != nil {
return nil, err
}
@@ -132,11 +127,11 @@ func (iptables *Iptables) NatAdd(protocol, srcPort, dest, destPort, iface string
iptablesArg += fmt.Sprintf(" -i %s", iface)
}
iptablesArg += fmt.Sprintf(" -p %s --dport %s -j DNAT --to-destination %s:%s", protocol, srcPort, dest, destPort)
if err := iptables.runf(NatTab, iptablesArg); err != nil {
if err := iptables.run(NatTab, iptablesArg); err != nil {
return err
}
if err := iptables.runf(NatTab, fmt.Sprintf(
if err := iptables.run(NatTab, fmt.Sprintf(
"-A %s -d %s -p %s --dport %s -j MASQUERADE",
PostRoutingChain,
dest,
@@ -146,7 +141,7 @@ func (iptables *Iptables) NatAdd(protocol, srcPort, dest, destPort, iface string
return err
}
if err := iptables.runf(FilterTab, fmt.Sprintf(
if err := iptables.run(FilterTab, fmt.Sprintf(
"-A %s -d %s -p %s --dport %s -j ACCEPT",
ForwardChain,
dest,
@@ -156,7 +151,7 @@ func (iptables *Iptables) NatAdd(protocol, srcPort, dest, destPort, iface string
return err
}
if err := iptables.runf(FilterTab, fmt.Sprintf(
if err := iptables.run(FilterTab, fmt.Sprintf(
"-A %s -s %s -p %s --sport %s -j ACCEPT",
ForwardChain,
dest,
@@ -171,7 +166,7 @@ func (iptables *Iptables) NatAdd(protocol, srcPort, dest, destPort, iface string
iptablesArg += fmt.Sprintf(" -i %s", iface)
}
iptablesArg += fmt.Sprintf(" -p %s --dport %s -j REDIRECT --to-port %s", protocol, srcPort, destPort)
if err := iptables.runf(NatTab, iptablesArg); err != nil {
if err := iptables.run(NatTab, iptablesArg); err != nil {
return err
}
}
@@ -189,12 +184,12 @@ func (iptables *Iptables) NatAdd(protocol, srcPort, dest, destPort, iface string
}
func (iptables *Iptables) NatRemove(num string, protocol, srcPort, dest, destPort, iface string) error {
if err := iptables.runf(NatTab, "-D %s %s", PreRoutingChain, num); err != nil {
if err := iptables.run(NatTab, fmt.Sprintf("-D %s %s", PreRoutingChain, num)); err != nil {
return err
}
if dest != "" && dest != "127.0.0.1" && dest != "localhost" {
if err := iptables.runf(NatTab, fmt.Sprintf(
if err := iptables.run(NatTab, fmt.Sprintf(
"-D %s -d %s -p %s --dport %s -j MASQUERADE",
PostRoutingChain,
dest,
@@ -204,7 +199,7 @@ func (iptables *Iptables) NatRemove(num string, protocol, srcPort, dest, destPor
return err
}
if err := iptables.runf(FilterTab, fmt.Sprintf(
if err := iptables.run(FilterTab, fmt.Sprintf(
"-D %s -d %s -p %s --dport %s -j ACCEPT",
ForwardChain,
dest,
@@ -214,7 +209,7 @@ func (iptables *Iptables) NatRemove(num string, protocol, srcPort, dest, destPor
return err
}
if err := iptables.runf(FilterTab, fmt.Sprintf(
if err := iptables.run(FilterTab, fmt.Sprintf(
"-D %s -s %s -p %s --sport %s -j ACCEPT",
ForwardChain,
dest,
@@ -238,13 +233,13 @@ func (iptables *Iptables) NatRemove(num string, protocol, srcPort, dest, destPor
}
func (iptables *Iptables) Reload() error {
if err := iptables.runf(NatTab, "-F %s", PreRoutingChain); err != nil {
if err := iptables.run(NatTab, "-F "+PreRoutingChain); err != nil {
return err
}
if err := iptables.runf(NatTab, "-F %s", PostRoutingChain); err != nil {
if err := iptables.run(NatTab, "-F "+PostRoutingChain); err != nil {
return err
}
if err := iptables.runf(FilterTab, "-F %s", ForwardChain); err != nil {
if err := iptables.run(FilterTab, "-F "+ForwardChain); err != nil {
return err
}
+10 -14
View File
@@ -38,24 +38,22 @@ func (f *Ufw) Status() (bool, error) {
func (f *Ufw) Version() (string, error) {
stdout, err := cmd.RunDefaultWithStdoutBashCf("%s version | grep ufw", f.CmdStr)
if err != nil {
return "", fmt.Errorf("load the firewall status failed, err: %s", stdout)
return "", fmt.Errorf("load the firewall status failed, %v", err)
}
info := strings.ReplaceAll(stdout, "\n", "")
return strings.ReplaceAll(info, "ufw ", ""), nil
}
func (f *Ufw) Start() error {
stdout, err := cmd.RunDefaultWithStdoutBashCf("echo y | %s enable", f.CmdStr)
if err != nil {
return fmt.Errorf("enable the firewall failed, err: %s", stdout)
if err := cmd.RunDefaultBashCf("echo y | %s enable", f.CmdStr); err != nil {
return fmt.Errorf("enable the firewall failed, %v", err)
}
return nil
}
func (f *Ufw) Stop() error {
stdout, err := cmd.RunDefaultWithStdoutBashCf("%s disable", f.CmdStr)
if err != nil {
return fmt.Errorf("stop the firewall failed, err: %s", stdout)
if err := cmd.RunDefaultBashCf("%s disable", f.CmdStr); err != nil {
return fmt.Errorf("stop the firewall failed, %v", err)
}
return nil
}
@@ -184,9 +182,8 @@ func (f *Ufw) Port(port FireInfo, operation string) error {
if len(port.Protocol) != 0 {
command += fmt.Sprintf("/%s", port.Protocol)
}
stdout, err := cmd.RunDefaultWithStdoutBashC(command)
if err != nil {
return fmt.Errorf("%s (%s) failed, err: %s", operation, command, stdout)
if err := cmd.RunDefaultBashC(command); err != nil {
return fmt.Errorf("%s (%s) failed, %v", operation, command, err)
}
return nil
}
@@ -224,13 +221,12 @@ func (f *Ufw) RichRules(rule FireInfo, operation string) error {
stdout, err := cmd.RunDefaultWithStdoutBashC(ruleStr)
if err != nil {
if strings.Contains(stdout, "ERROR: Invalid position") || strings.Contains(stdout, "ERROR: 无效位置") {
stdout, err := cmd.RunDefaultWithStdoutBashC(strings.ReplaceAll(ruleStr, "insert 1 ", ""))
if err != nil {
return fmt.Errorf("%s rich rules (%s), failed, err: %s", operation, ruleStr, stdout)
if err := cmd.RunDefaultBashC(strings.ReplaceAll(ruleStr, "insert 1 ", "")); err != nil {
return fmt.Errorf("%s rich rules (%s), failed, %v", operation, ruleStr, err)
}
return nil
}
return fmt.Errorf("%s rich rules (%s), failed, err: %s", operation, ruleStr, stdout)
return fmt.Errorf("%s rich rules (%s), failed, %v", operation, ruleStr, err)
}
return nil
}
+4 -6
View File
@@ -62,9 +62,8 @@ func GetRemoteTime(site string) (time.Time, error) {
func UpdateSystemTime(dateTime string) error {
system := runtime.GOOS
if system == "linux" {
stdout2, err := cmd.RunDefaultWithStdoutBashCf(`%s date -s "%s"`, cmd.SudoHandleCmd(), dateTime)
if err != nil {
return fmt.Errorf("update system time failed,stdout: %s, err: %v", stdout2, err)
if err := cmd.RunDefaultBashCf(`%s date -s "%s"`, cmd.SudoHandleCmd(), dateTime); err != nil {
return fmt.Errorf("update system time failed, %v", err)
}
return nil
}
@@ -74,9 +73,8 @@ func UpdateSystemTime(dateTime string) error {
func UpdateSystemTimeZone(timezone string) error {
system := runtime.GOOS
if system == "linux" {
stdout, err := cmd.RunDefaultWithStdoutBashCf(`%s timedatectl set-timezone "%s"`, cmd.SudoHandleCmd(), timezone)
if err != nil {
return fmt.Errorf("update system time zone failed, stdout: %s, err: %v", stdout, err)
if err := cmd.RunDefaultBashCf(`%s timedatectl set-timezone "%s"`, cmd.SudoHandleCmd(), timezone); err != nil {
return fmt.Errorf("update system time zone failed, %v", err)
}
return nil
}
-116
View File
@@ -1,116 +0,0 @@
package systemctl
import (
"bytes"
"fmt"
"github.com/pkg/errors"
"os/exec"
"strings"
)
func RunSystemCtl(args ...string) (string, error) {
cmd := exec.Command("systemctl", args...)
output, err := cmd.CombinedOutput()
if err != nil {
return string(output), fmt.Errorf("failed to run command: %w", err)
}
return string(output), nil
}
func isSnapService(serviceName string) bool {
cmd := exec.Command("snap", "services")
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return false
}
return strings.Contains(out.String(), serviceName)
}
func isSnapServiceActive(serviceName string) bool {
cmd := exec.Command("snap", "services")
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return false
}
lines := strings.Split(out.String(), "\n")
for _, line := range lines {
if strings.Contains(line, serviceName) && strings.Contains(line, "active") {
return true
}
}
return false
}
func IsActive(serviceName string) (bool, error) {
out, err := RunSystemCtl("is-active", serviceName)
if err == nil {
return strings.TrimSpace(out) == "active", nil
}
if isSnapServiceActive(serviceName) {
return true, nil
}
return false, fmt.Errorf("service %s is not active: %v", serviceName, err)
}
func IsEnable(serviceName string) (bool, error) {
out, err := RunSystemCtl("is-enabled", serviceName)
if err == nil {
return strings.TrimSpace(out) == "enabled", nil
}
if isSnapServiceActive(serviceName) {
return true, nil
}
return false, fmt.Errorf("failed to determine if service %s is enabled: %v", serviceName, err)
}
func IsExist(serviceName string) (bool, error) {
out, err := RunSystemCtl("is-enabled", serviceName)
if err == nil || strings.Contains(out, "disabled") {
return true, nil
}
if isSnapService(serviceName) {
return true, nil
}
return false, nil
}
func handlerErr(out string, err error) error {
if err != nil {
if out != "" {
return errors.New(out)
}
return err
}
return nil
}
func Restart(serviceName string) error {
out, err := RunSystemCtl("restart", serviceName)
if err == nil {
return nil
}
if isSnapService(serviceName) {
cmd := exec.Command("snap", "restart", serviceName)
output, snapErr := cmd.CombinedOutput()
return handlerErr(string(output), snapErr)
}
return handlerErr(out, err)
}
func Operate(operate, serviceName string) error {
out, err := RunSystemCtl(operate, serviceName)
if err == nil {
return nil
}
if isSnapService(serviceName) && (operate == "start" || operate == "stop" || operate == "restart") {
cmd := exec.Command("snap", operate, serviceName)
output, snapErr := cmd.CombinedOutput()
return handlerErr(string(output), snapErr)
}
return handlerErr(out, err)
}
+14 -17
View File
@@ -8,7 +8,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"github.com/1Panel-dev/1Panel/agent/utils/systemctl"
"github.com/1Panel-dev/1Panel/agent/utils/controller"
)
type Fail2ban struct{}
@@ -23,15 +23,14 @@ type FirewallClient interface {
}
func NewFail2Ban() (*Fail2ban, error) {
isExist, _ := systemctl.IsExist("fail2ban.service")
isExist, _ := controller.CheckExist("fail2ban.service")
if isExist {
if _, err := os.Stat(defaultPath); err != nil {
if err := initLocalFile(); err != nil {
return nil, err
}
stdout, err := cmd.RunDefaultWithStdoutBashC("systemctl restart fail2ban.service")
if err != nil {
global.LOG.Errorf("restart fail2ban failed, err: %s", stdout)
if err := controller.HandleRestart("fail2ban.service"); err != nil {
global.LOG.Errorf("restart fail2ban failed, err: %v", err)
return nil, err
}
}
@@ -40,9 +39,9 @@ func NewFail2Ban() (*Fail2ban, error) {
}
func (f *Fail2ban) Status() (bool, bool, bool) {
isEnable, _ := systemctl.IsEnable("fail2ban.service")
isActive, _ := systemctl.IsActive("fail2ban.service")
isExist, _ := systemctl.IsExist("fail2ban.service")
isEnable, _ := controller.CheckEnable("fail2ban.service")
isActive, _ := controller.CheckActive("fail2ban.service")
isExist, _ := controller.CheckExist("fail2ban.service")
return isEnable, isActive, isExist
}
@@ -50,7 +49,7 @@ func (f *Fail2ban) Status() (bool, bool, bool) {
func (f *Fail2ban) Version() string {
stdout, err := cmd.RunDefaultWithStdoutBashC("fail2ban-client version")
if err != nil {
global.LOG.Errorf("load the fail2ban version failed, err: %s", stdout)
global.LOG.Errorf("load the fail2ban version failed, %v", err)
return "-"
}
return strings.ReplaceAll(stdout, "\n", "")
@@ -59,15 +58,13 @@ func (f *Fail2ban) Version() string {
func (f *Fail2ban) Operate(operate string) error {
switch operate {
case "start", "restart", "stop", "enable", "disable":
stdout, err := cmd.RunDefaultWithStdoutBashCf("systemctl %s fail2ban.service", operate)
if err != nil {
return fmt.Errorf("%s the fail2ban.service failed, err: %s", operate, stdout)
if err := controller.Handle(operate, "fail2ban.service"); err != nil {
return fmt.Errorf("%s the fail2ban.service failed, err: %v", operate, err)
}
return nil
case "reload":
stdout, err := cmd.RunDefaultWithStdoutBashC("fail2ban-client reload")
if err != nil {
return fmt.Errorf("fail2ban-client reload, err: %s", stdout)
if err := cmd.RunDefaultBashC("fail2ban-client reload"); err != nil {
return fmt.Errorf("fail2ban-client reload, %v", err)
}
return nil
default:
@@ -159,9 +156,9 @@ action = %(action_mwl)s
logpath = $logpath`
banaction := ""
if active, _ := systemctl.IsActive("firewalld"); active {
if active, _ := controller.CheckActive("firewalld"); active {
banaction = "firewallcmd-ipset"
} else if active, _ := systemctl.IsActive("ufw"); active {
} else if active, _ := controller.CheckActive("ufw"); active {
banaction = "ufw"
} else {
banaction = "iptables-allports"
+26 -37
View File
@@ -2,7 +2,6 @@ package toolbox
import (
"bufio"
"errors"
"fmt"
"os"
"os/user"
@@ -13,7 +12,7 @@ import (
"github.com/1Panel-dev/1Panel/agent/constant"
"github.com/1Panel-dev/1Panel/agent/global"
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
"github.com/1Panel-dev/1Panel/agent/utils/systemctl"
"github.com/1Panel-dev/1Panel/agent/utils/controller"
"github.com/1Panel-dev/1Panel/agent/utils/toolbox/helper"
)
@@ -63,29 +62,26 @@ func NewFtpClient() (*Ftp, error) {
groupItem, err := user.LookupGroupId("1000")
if err == nil {
stdout2, err := cmd.RunDefaultWithStdoutBashCf("useradd -u 1000 -g %s %s", groupItem.Name, "1panel")
if err != nil {
return nil, errors.New(stdout2)
if err := cmd.RunDefaultBashCf("useradd -u 1000 -g %s %s", groupItem.Name, "1panel"); err != nil {
return nil, err
}
return &Ftp{DefaultUser: "1panel", DefaultGroup: groupItem.Name}, nil
}
if err.Error() != user.UnknownGroupIdError("1000").Error() {
return nil, err
}
stdout, err := cmd.RunDefaultWithStdoutBashC("groupadd -g 1000 1panel")
if err != nil {
return nil, errors.New(string(stdout))
if err := cmd.RunDefaultBashC("groupadd -g 1000 1panel"); err != nil {
return nil, err
}
stdout2, err := cmd.RunDefaultWithStdoutBashC("useradd -u 1000 -g 1panel 1panel")
if err != nil {
return nil, errors.New(stdout2)
if err := cmd.RunDefaultBashC("useradd -u 1000 -g 1panel 1panel"); err != nil {
return nil, err
}
return &Ftp{DefaultUser: "1panel", DefaultGroup: "1panel"}, nil
}
func (f *Ftp) Status() (bool, bool) {
isActive, _ := systemctl.IsActive("pure-ftpd.service")
isExist, _ := systemctl.IsExist("pure-ftpd.service")
isActive, _ := controller.CheckActive("pure-ftpd.service")
isExist, _ := controller.CheckExist("pure-ftpd.service")
return isActive, isExist
}
@@ -93,9 +89,8 @@ func (f *Ftp) Status() (bool, bool) {
func (f *Ftp) Operate(operate string) error {
switch operate {
case "start", "restart", "stop":
stdout, err := cmd.RunDefaultWithStdoutBashCf("systemctl %s pure-ftpd.service", operate)
if err != nil {
return fmt.Errorf("%s the pure-ftpd.service failed, err: %s", operate, stdout)
if err := controller.Handle(operate, "pure-ftpd.service"); err != nil {
return fmt.Errorf("%s the pure-ftpd.service failed, err: %v", operate, err)
}
return nil
default:
@@ -119,17 +114,15 @@ func (f *Ftp) UserAdd(username, passwd, path string) error {
return err
}
_ = f.Reload()
std2, err := cmd.RunDefaultWithStdoutBashCf("chown -R %s:%s %s", f.DefaultUser, f.DefaultGroup, path)
if err != nil {
return errors.New(std2)
if err := cmd.RunDefaultBashCf("chown -R %s:%s %s", f.DefaultUser, f.DefaultGroup, path); err != nil {
return err
}
return nil
}
func (f *Ftp) UserDel(username string) error {
std, err := cmd.RunDefaultWithStdoutBashCf("pure-pw userdel %s", username)
if err != nil {
return errors.New(std)
if err := cmd.RunDefaultBashCf("pure-pw userdel %s", username); err != nil {
return err
}
_ = f.Reload()
return nil
@@ -186,13 +179,11 @@ func (f *Ftp) SetPasswd(username, passwd string) error {
}
func (f *Ftp) SetPath(username, path string) error {
std, err := cmd.RunDefaultWithStdoutBashCf("pure-pw usermod %s -d %s", username, path)
if err != nil {
return errors.New(std)
if err := cmd.RunDefaultBashCf("pure-pw usermod %s -d %s", username, path); err != nil {
return err
}
std2, err := cmd.RunDefaultWithStdoutBashCf("chown -R %s:%s %s", f.DefaultUser, f.DefaultGroup, path)
if err != nil {
return errors.New(std2)
if err := cmd.RunDefaultBashCf("chown -R %s:%s %s", f.DefaultUser, f.DefaultGroup, path); err != nil {
return err
}
return nil
}
@@ -202,9 +193,8 @@ func (f *Ftp) SetStatus(username, status string) error {
if status == constant.StatusDisable {
statusItem = "1"
}
std, err := cmd.RunDefaultWithStdoutBashCf("pure-pw usermod %s -r %s", username, statusItem)
if err != nil {
return errors.New(std)
if err := cmd.RunDefaultBashCf("pure-pw usermod %s -r %s", username, statusItem); err != nil {
return err
}
return nil
}
@@ -212,7 +202,7 @@ func (f *Ftp) SetStatus(username, status string) error {
func (f *Ftp) LoadList() ([]FtpList, error) {
std, err := cmd.RunDefaultWithStdoutBashC("pure-pw list")
if err != nil {
return nil, errors.New(std)
return nil, err
}
var lists []FtpList
lines := strings.Split(std, "\n")
@@ -223,7 +213,7 @@ func (f *Ftp) LoadList() ([]FtpList, error) {
}
std2, err := cmd.RunDefaultWithStdoutBashCf("pure-pw show %s | grep 'Allowed client IPs :'", parts[0])
if err != nil {
global.LOG.Errorf("handle pure-pw show %s failed, err: %v", parts[0], std2)
global.LOG.Errorf("handle pure-pw show %s failed, %v", parts[0], err)
continue
}
status := constant.StatusDisable
@@ -237,9 +227,8 @@ func (f *Ftp) LoadList() ([]FtpList, error) {
}
func (f *Ftp) Reload() error {
std, err := cmd.RunDefaultWithStdoutBashC("pure-pw mkdb")
if err != nil {
return errors.New(std)
if err := cmd.RunDefaultBashC("pure-pw mkdb"); err != nil {
return err
}
return nil
}
@@ -296,7 +285,7 @@ func (f *Ftp) LoadLogs(user, operation string) ([]FtpLog, error) {
}
func handleGunzip(path string) error {
if _, err := cmd.RunDefaultWithStdoutBashCf("gunzip %s", path); err != nil {
if err := cmd.RunDefaultBashCf("gunzip %s", path); err != nil {
return err
}
return nil