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