diff --git a/agent/app/dto/database.go b/agent/app/dto/database.go index 17b71402b..3ec0d36dc 100644 --- a/agent/app/dto/database.go +++ b/agent/app/dto/database.go @@ -11,7 +11,7 @@ type DBConfUpdateByFile struct { type ChangeDBInfo struct { ID uint `json:"id"` From string `json:"from" validate:"required,oneof=local remote"` - Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql mysql-cluster postgresql-cluster redis-cluster"` + Type string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mysql-cluster postgresql-cluster redis-cluster"` Database string `json:"database" validate:"required"` Value string `json:"value" validate:"required"` } diff --git a/agent/app/dto/database_postgresql.go b/agent/app/dto/database_postgresql.go index e468448f9..6d4c2196e 100644 --- a/agent/app/dto/database_postgresql.go +++ b/agent/app/dto/database_postgresql.go @@ -60,26 +60,20 @@ type PostgresqlPrivileges struct { type PostgresqlLoadDB struct { From string `json:"from" validate:"required,oneof=local remote"` - Type string `json:"type" validate:"required,oneof=postgresql"` + Type string `json:"type" validate:"required,oneof=postgresql postgresql-cluster"` Database string `json:"database" validate:"required"` } type PostgresqlDBDeleteCheck struct { ID uint `json:"id" validate:"required"` - Type string `json:"type" validate:"required,oneof=postgresql"` + Type string `json:"type" validate:"required,oneof=postgresql postgresql-cluster"` Database string `json:"database" validate:"required"` } type PostgresqlDBDelete struct { ID uint `json:"id" validate:"required"` - Type string `json:"type" validate:"required,oneof=postgresql"` + Type string `json:"type" validate:"required,oneof=postgresql postgresql-cluster"` Database string `json:"database" validate:"required"` ForceDelete bool `json:"forceDelete"` DeleteBackup bool `json:"deleteBackup"` } - -type PostgresqlConfUpdateByFile struct { - Type string `json:"type" validate:"required,oneof=postgresql mariadb"` - Database string `json:"database" validate:"required"` - File string `json:"file"` -} diff --git a/agent/app/service/database_redis.go b/agent/app/service/database_redis.go index d076ffba2..894b28447 100644 --- a/agent/app/service/database_redis.go +++ b/agent/app/service/database_redis.go @@ -244,6 +244,10 @@ func confSet(redisName string, redisType string, updateType string, changeConf [ } newFiles = append(newFiles, files[i]) } + if startIndex == 0 { + newFiles = append(newFiles, "# Redis configuration rewrite by 1Panel") + startIndex = len(newFiles) - 1 + } endIndex = endIndex - emptyLine for _, item := range changeConf { if item.key == "save" { diff --git a/agent/utils/mysql/client/local.go b/agent/utils/mysql/client/local.go index ec89a9e6b..479a84c7a 100644 --- a/agent/utils/mysql/client/local.go +++ b/agent/utils/mysql/client/local.go @@ -234,7 +234,10 @@ func (r *Local) Backup(info BackupInfo) error { dumpCmd = "mariadb-dump" } global.LOG.Infof("start to %s | gzip > %s.gzip", dumpCmd, info.TargetDir+"/"+info.FileName) - cmd := exec.Command("docker", "exec", r.ContainerName, dumpCmd, "--routines", "-uroot", "-p"+r.Password, "--default-character-set="+info.Format, info.Name) + + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(info.Timeout*uint(time.Second))) + defer cancel() + cmd := exec.CommandContext(ctx, "docker", "exec", r.ContainerName, dumpCmd, "--routines", "-uroot", "-p"+r.Password, "--default-character-set="+info.Format, info.Name) var stderr bytes.Buffer cmd.Stderr = &stderr @@ -258,7 +261,9 @@ func (r *Local) Recover(info RecoverInfo) error { mysqlCli = "mysql" } - cmd := exec.Command("docker", "exec", "-i", r.ContainerName, mysqlCli, "-uroot", "-p"+r.Password, "--default-character-set="+info.Format, info.Name) + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(info.Timeout*uint(time.Second))) + defer cancel() + cmd := exec.CommandContext(ctx, "docker", "exec", "-i", r.ContainerName, mysqlCli, "-uroot", "-p"+r.Password, "--default-character-set="+info.Format, info.Name) if strings.HasSuffix(info.SourceFile, ".gz") { gzipFile, err := os.Open(info.SourceFile) if err != nil { diff --git a/agent/utils/postgresql/client/local.go b/agent/utils/postgresql/client/local.go index 630c155a3..9e1a26705 100644 --- a/agent/utils/postgresql/client/local.go +++ b/agent/utils/postgresql/client/local.go @@ -136,7 +136,11 @@ func (r *Local) Backup(info BackupInfo) error { } defer outfile.Close() global.LOG.Infof("start to pg_dump | gzip > %s.gzip", info.TargetDir+"/"+info.FileName) - cmd := exec.Command( + + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(info.Timeout*uint(time.Second))) + defer cancel() + cmd := exec.CommandContext( + ctx, "docker", "exec", "-i", r.ContainerName, "sh", "-c", fmt.Sprintf("PGPASSWORD=%s pg_dump -F c -U %s -d %s", r.Password, r.Username, info.Name), @@ -159,8 +163,11 @@ func (r *Local) Backup(info BackupInfo) error { func (r *Local) Recover(info RecoverInfo) error { fi, _ := os.Open(info.SourceFile) defer fi.Close() - cmd := exec.Command("docker", "exec", r.ContainerName, "sh", "-c", - fmt.Sprintf("PGPASSWORD=%s pg_dump -F c -U %s -d %s", r.Password, r.Username, info.Name), + + ctx, cancel := context.WithTimeout(context.Background(), time.Duration(info.Timeout*uint(time.Second))) + defer cancel() + cmd := exec.CommandContext(ctx, "docker", "exec", "-i", r.ContainerName, "sh", "-c", + fmt.Sprintf("PGPASSWORD=%s pg_restore -F c -U %s -d %s", r.Password, r.Username, info.Name), ) if strings.HasSuffix(info.SourceFile, ".gz") { gzipFile, err := os.Open(info.SourceFile)