1ba991379Sopenharmony_ci/*
2ba991379Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3ba991379Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4ba991379Sopenharmony_ci * you may not use this file except in compliance with the License.
5ba991379Sopenharmony_ci * You may obtain a copy of the License at
6ba991379Sopenharmony_ci *
7ba991379Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8ba991379Sopenharmony_ci *
9ba991379Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10ba991379Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11ba991379Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12ba991379Sopenharmony_ci * See the License for the specific language governing permissions and
13ba991379Sopenharmony_ci * limitations under the License.
14ba991379Sopenharmony_ci */
15ba991379Sopenharmony_ci
16ba991379Sopenharmony_cipackage utils
17ba991379Sopenharmony_ci
18ba991379Sopenharmony_ciimport (
19ba991379Sopenharmony_ci	"context"
20ba991379Sopenharmony_ci	"errors"
21ba991379Sopenharmony_ci	"fmt"
22ba991379Sopenharmony_ci	"github.com/sirupsen/logrus"
23ba991379Sopenharmony_ci	"io"
24ba991379Sopenharmony_ci	"os"
25ba991379Sopenharmony_ci	"os/exec"
26ba991379Sopenharmony_ci	"time"
27ba991379Sopenharmony_ci)
28ba991379Sopenharmony_ci
29ba991379Sopenharmony_cifunc ExecContext(ctx context.Context, name string, args ...string) error {
30ba991379Sopenharmony_ci	ctx, fn := context.WithTimeout(ctx, 6*time.Hour)
31ba991379Sopenharmony_ci	defer fn()
32ba991379Sopenharmony_ci	if err := execContext(ctx, name, args...); err != nil {
33ba991379Sopenharmony_ci		if errors.Is(err, context.Canceled) {
34ba991379Sopenharmony_ci			return err
35ba991379Sopenharmony_ci		}
36ba991379Sopenharmony_ci		logrus.Errorf("exec failed: %v, try again...", err)
37ba991379Sopenharmony_ci		return execContext(ctx, name, args...)
38ba991379Sopenharmony_ci	}
39ba991379Sopenharmony_ci	return nil
40ba991379Sopenharmony_ci}
41ba991379Sopenharmony_ci
42ba991379Sopenharmony_cifunc execContext(ctx context.Context, name string, args ...string) error {
43ba991379Sopenharmony_ci	cmdStr := append([]string{name}, args...)
44ba991379Sopenharmony_ci	logrus.Infof("cmd: %s", cmdStr)
45ba991379Sopenharmony_ci	cmd := exec.CommandContext(ctx, name, args...)
46ba991379Sopenharmony_ci	stdout, err := cmd.StdoutPipe()
47ba991379Sopenharmony_ci	if err != nil {
48ba991379Sopenharmony_ci		return err
49ba991379Sopenharmony_ci	}
50ba991379Sopenharmony_ci	stderr, err := cmd.StderrPipe()
51ba991379Sopenharmony_ci	if err != nil {
52ba991379Sopenharmony_ci		return err
53ba991379Sopenharmony_ci	}
54ba991379Sopenharmony_ci	if err := cmd.Start(); err != nil {
55ba991379Sopenharmony_ci		return err
56ba991379Sopenharmony_ci	}
57ba991379Sopenharmony_ci	fmt.Printf("[%s] exec %s :\n", time.Now(), cmdStr)
58ba991379Sopenharmony_ci	go io.Copy(os.Stdout, stdout)
59ba991379Sopenharmony_ci	go io.Copy(os.Stderr, stderr)
60ba991379Sopenharmony_ci	return cmd.Wait()
61ba991379Sopenharmony_ci}
62ba991379Sopenharmony_ci
63ba991379Sopenharmony_cifunc ExecCombinedOutputContext(ctx context.Context, name string, args ...string) ([]byte, error) {
64ba991379Sopenharmony_ci	ctx, fn := context.WithTimeout(ctx, 6*time.Hour)
65ba991379Sopenharmony_ci	defer fn()
66ba991379Sopenharmony_ci	out, err := execCombinedOutputContext(ctx, name, args...)
67ba991379Sopenharmony_ci	if err != nil {
68ba991379Sopenharmony_ci		if errors.Is(err, context.Canceled) {
69ba991379Sopenharmony_ci			return out, err
70ba991379Sopenharmony_ci		}
71ba991379Sopenharmony_ci		logrus.Errorf("exec failed: %v, try again...", err)
72ba991379Sopenharmony_ci		return execCombinedOutputContext(ctx, name, args...)
73ba991379Sopenharmony_ci	}
74ba991379Sopenharmony_ci	return out, nil
75ba991379Sopenharmony_ci}
76ba991379Sopenharmony_ci
77ba991379Sopenharmony_cifunc execCombinedOutputContext(ctx context.Context, name string, args ...string) ([]byte, error) {
78ba991379Sopenharmony_ci	cmdStr := append([]string{name}, args...)
79ba991379Sopenharmony_ci	logrus.Infof("cmd: %s", cmdStr)
80ba991379Sopenharmony_ci	out, err := exec.CommandContext(ctx, name, args...).CombinedOutput()
81ba991379Sopenharmony_ci	fmt.Printf("[%s] exec %s :\n", time.Now(), cmdStr)
82ba991379Sopenharmony_ci	return out, err
83ba991379Sopenharmony_ci}
84ba991379Sopenharmony_ci
85ba991379Sopenharmony_cifunc SleepContext(duration time.Duration, ctx context.Context) {
86ba991379Sopenharmony_ci	select {
87ba991379Sopenharmony_ci	case <-time.NewTimer(duration).C:
88ba991379Sopenharmony_ci	case <-ctx.Done():
89ba991379Sopenharmony_ci	}
90ba991379Sopenharmony_ci}
91