diff --git a/agent/app/service/nginx.go b/agent/app/service/nginx.go index 81e9e345d..a62735dcf 100644 --- a/agent/app/service/nginx.go +++ b/agent/app/service/nginx.go @@ -235,7 +235,7 @@ func (n NginxService) Build(req request.NginxBuildReq) error { return err } buildTask.AddSubTask("", func(t *task.Task) error { - if err = cmd2.ExecWithLogFile(fmt.Sprintf("docker compose -f %s build", nginxInstall.GetComposePath()), 15*time.Minute, t.Task.LogFile); err != nil { + if err = cmd2.ExecWithLogger(fmt.Sprintf("docker compose -f %s build", nginxInstall.GetComposePath()), t.Logger, 15*time.Minute); err != nil { return err } _, err = compose.DownAndUp(nginxInstall.GetComposePath()) diff --git a/agent/app/service/runtime.go b/agent/app/service/runtime.go index f71523899..c252c8613 100644 --- a/agent/app/service/runtime.go +++ b/agent/app/service/runtime.go @@ -739,7 +739,7 @@ func (r *RuntimeService) InstallPHPExtension(req request.PHPExtensionInstallReq) } installTask.AddSubTask("", func(t *task.Task) error { installCmd := fmt.Sprintf("docker exec -i %s %s %s", runtime.ContainerName, "install-ext", req.Name) - err = cmd2.ExecWithLogFile(installCmd, 15*time.Minute, t.Task.LogFile) + err = cmd2.ExecWithLogger(installCmd, t.Logger, 15*time.Minute) if err != nil { return err } @@ -751,7 +751,7 @@ func (r *RuntimeService) InstallPHPExtension(req request.PHPExtensionInstallReq) return err } commitCmd := fmt.Sprintf("docker commit %s %s", runtime.ContainerName, runtime.Image) - err = cmd2.ExecWithLogFile(commitCmd, 15*time.Minute, t.Task.LogFile) + err = cmd2.ExecWithLogger(commitCmd, t.Logger, 15*time.Minute) if err != nil { return err } diff --git a/agent/app/service/runtime_utils.go b/agent/app/service/runtime_utils.go index 7c297eeaf..b7ad8991e 100644 --- a/agent/app/service/runtime_utils.go +++ b/agent/app/service/runtime_utils.go @@ -574,7 +574,7 @@ func unInstallPHPExtension(runtime *model.Runtime, delExtensions []string) error delMap := make(map[string]struct{}) for _, ext := range phpExtensions { for _, del := range delExtensions { - if ext.Check == del { + if ext.Name == del { delMap[ext.Check] = struct{}{} _ = fileOP.DeleteFile(path.Join(dir, "extensions", ext.File)) _ = fileOP.DeleteFile(path.Join(dir, "conf", "conf.d", "docker-php-ext-"+ext.Check+".ini")) diff --git a/agent/utils/cmd/cmd.go b/agent/utils/cmd/cmd.go index 07af61fad..d6dc9c1cd 100644 --- a/agent/utils/cmd/cmd.go +++ b/agent/utils/cmd/cmd.go @@ -1,6 +1,7 @@ package cmd import ( + "bufio" "bytes" "context" "errors" @@ -100,6 +101,50 @@ func ExecWithLogFile(cmdStr string, timeout time.Duration, outputFile string) er return nil } +func ExecWithLogger(cmdStr string, logger *log.Logger, timeout time.Duration) error { + cmd := exec.Command("bash", "-c", cmdStr) + + stdoutPipe, err := cmd.StdoutPipe() + if err != nil { + return err + } + stderrPipe, err := cmd.StderrPipe() + if err != nil { + return err + } + + if err := cmd.Start(); err != nil { + return err + } + + go func() { + scanner := bufio.NewScanner(stdoutPipe) + for scanner.Scan() { + logger.Print(scanner.Text()) + } + }() + go func() { + scanner := bufio.NewScanner(stderrPipe) + for scanner.Scan() { + logger.Print(scanner.Text()) + } + }() + + done := make(chan error, 1) + go func() { + done <- cmd.Wait() + }() + + after := time.After(timeout) + select { + case <-after: + _ = cmd.Process.Kill() + return buserr.New("ErrCmdTimeout") + case err := <-done: + return err + } +} + func ExecContainerScript(containerName, cmdStr string, timeout time.Duration) error { cmdStr = fmt.Sprintf("docker exec -i %s bash -c '%s'", containerName, cmdStr) out, err := ExecWithTimeOut(cmdStr, timeout) diff --git a/frontend/src/views/website/runtime/php/create/index.vue b/frontend/src/views/website/runtime/php/create/index.vue index efcbe5f03..ad8deeaaa 100644 --- a/frontend/src/views/website/runtime/php/create/index.vue +++ b/frontend/src/views/website/runtime/php/create/index.vue @@ -127,13 +127,6 @@ {{ $t('runtime.extendHelper') }} - {{ ext }} +
+ +
{{ $t('runtime.popularExtension') }}
@@ -44,6 +47,8 @@ const extensions = ref([]); const supportExtensions = ref([]); const loading = ref(false); const taskLogRef = ref(); +const searchName = ref(''); +const data = ref([]); const handleClose = () => { open.value = false; @@ -113,10 +118,21 @@ const search = async () => { try { const res = await GetPHPExtensions(runtime.value.id); extensions.value = res.data.extensions; - supportExtensions.value = res.data.supportExtensions; + data.value = res.data.supportExtensions; + searchByName(); } catch (error) {} }; +const searchByName = () => { + if (searchName.value === '') { + supportExtensions.value = data.value; + return; + } + supportExtensions.value = data.value.filter((ext) => + ext.name.toLowerCase().includes(searchName.value.toLowerCase()), + ); +}; + const acceptParams = (req: Runtime.Runtime): void => { open.value = true; runtime.value = req; diff --git a/frontend/src/views/website/runtime/php/index.vue b/frontend/src/views/website/runtime/php/index.vue index 0a80c6775..8c21902d6 100644 --- a/frontend/src/views/website/runtime/php/index.vue +++ b/frontend/src/views/website/runtime/php/index.vue @@ -98,7 +98,7 @@ - +