github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/system/scripts/bind/execute.go (about)

     1  // This file is part of the Smart Home
     2  // Program complex distribution https://github.com/e154/smart-home
     3  // Copyright (C) 2016-2023, Filippov Alex
     4  //
     5  // This library is free software: you can redistribute it and/or
     6  // modify it under the terms of the GNU Lesser General Public
     7  // License as published by the Free Software Foundation; either
     8  // version 3 of the License, or (at your option) any later version.
     9  //
    10  // This library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13  // Library General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public
    16  // License along with this library.  If not, see
    17  // <https://www.gnu.org/licenses/>.
    18  
    19  package bind
    20  
    21  import (
    22  	"bytes"
    23  	"os/exec"
    24  	"strings"
    25  )
    26  
    27  // Response ...
    28  type Response struct {
    29  	Out string `json:"out"`
    30  	Err string `json:"err"`
    31  }
    32  
    33  // ExecuteSync "sh", "-c", "echo stdout; echo 1>&2 stderr"
    34  func ExecuteSync(name string, arg ...string) (r *Response) {
    35  
    36  	r = &Response{}
    37  
    38  	// https://golang.org/pkg/os/exec/#example_Cmd_Start
    39  	cmd := exec.Command(name, arg...)
    40  	var stdout, stderr bytes.Buffer
    41  	cmd.Stdout = &stdout
    42  	cmd.Stderr = &stderr
    43  	if err := cmd.Start(); err != nil {
    44  		r.Err = err.Error()
    45  		return
    46  	}
    47  
    48  	if err := cmd.Wait(); err != nil {
    49  		r.Err = err.Error()
    50  		return
    51  	}
    52  
    53  	r.Out = strings.TrimSuffix(stdout.String(), "\n")
    54  	r.Err = strings.TrimSuffix(stderr.String(), "\n")
    55  
    56  	return
    57  }
    58  
    59  // ExecuteAsync ...
    60  func ExecuteAsync(name string, arg ...string) (r *Response) {
    61  
    62  	r = &Response{}
    63  
    64  	go func() {
    65  		b, err := exec.Command(name, arg...).Output()
    66  		if err != nil {
    67  			r.Err = err.Error()
    68  			return
    69  		}
    70  
    71  		log.Infof("%s", b)
    72  	}()
    73  
    74  	return
    75  }