fix bug in GetLocalIP(), refactor golang code.
This commit is contained in:
parent
e21bb4ab80
commit
7783a4c027
|
@ -0,0 +1,73 @@
|
||||||
|
package misc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ExecShellCommand ...
|
||||||
|
//
|
||||||
|
// return stdout
|
||||||
|
func ExecShellCommand(myCmd string) string {
|
||||||
|
cmd := exec.Command("bash", "-c", myCmd)
|
||||||
|
output, err := cmd.Output()
|
||||||
|
logrus.Infof("IN execCmd(), cmd=%s,stdout=%s\n", myCmd, string(output))
|
||||||
|
if err != nil {
|
||||||
|
logrus.Errorf("ERROR in execCmd(): cmd=%s,err=%v\n", myCmd, err)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// remove tail \n
|
||||||
|
return strings.Replace(string(output), "\n", "", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecShellCommandWithExitCode ...
|
||||||
|
// if timeout <= 0 then no timeout
|
||||||
|
func ExecShellCommandWithExitCode(command string, timeout int) (int, string, string) {
|
||||||
|
var cmd *exec.Cmd
|
||||||
|
if timeout > 0 {
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
cmd = exec.CommandContext(ctx, "/bin/bash", "-c", command)
|
||||||
|
} else {
|
||||||
|
cmd = exec.Command("/bin/bash", "-c", command)
|
||||||
|
}
|
||||||
|
|
||||||
|
var stdoutBuf, stderrBuf bytes.Buffer
|
||||||
|
cmd.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf)
|
||||||
|
cmd.Stderr = io.MultiWriter(os.Stderr, &stderrBuf)
|
||||||
|
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
errMsg := fmt.Sprintf("start command %s failed with error:%v\n", command, err)
|
||||||
|
logrus.Errorln(errMsg)
|
||||||
|
return 103, "", errMsg
|
||||||
|
}
|
||||||
|
exitCode := 0
|
||||||
|
var errMsg string
|
||||||
|
if err := cmd.Wait(); err != nil {
|
||||||
|
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||||
|
// timeout : exit_code = -1
|
||||||
|
errMsg = fmt.Sprintf("Exit Status: %d,exit err_message:%s\ncmd:%s.\n",
|
||||||
|
exitErr.ExitCode(), exitErr.Error(), command)
|
||||||
|
logrus.Warnln(errMsg)
|
||||||
|
exitCode = exitErr.ExitCode()
|
||||||
|
if exitCode == -1 {
|
||||||
|
// timeout !
|
||||||
|
exitCode = 100
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errMsg = fmt.Sprintf("wait command '%s' failed with error:%v\n", command, err)
|
||||||
|
logrus.Errorln(errMsg)
|
||||||
|
exitCode = 105
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return exitCode, string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()) + errMsg
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package misc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AppendToFile ...
|
||||||
|
func AppendToFile(fileName string, line string) {
|
||||||
|
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "open file %s error,err-info:%v\n", fileName, err)
|
||||||
|
fmt.Fprintln(os.Stderr, os.Args)
|
||||||
|
os.Exit(3)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
writer := bufio.NewWriter(file)
|
||||||
|
writer.WriteString(line + "\n")
|
||||||
|
writer.Flush()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTextFileLines ...
|
||||||
|
func GetTextFileLines(textFile string) ([]string, error) {
|
||||||
|
if _, err := os.Stat(textFile); err != nil {
|
||||||
|
_, ok := err.(*os.PathError)
|
||||||
|
if ok && strings.Contains(err.Error(), "no such file or directory") {
|
||||||
|
// file not exists
|
||||||
|
return []string{}, nil
|
||||||
|
}
|
||||||
|
return []string{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
fileContent, err := ioutil.ReadFile(textFile)
|
||||||
|
if err != nil {
|
||||||
|
return []string{}, fmt.Errorf("Read file error, filename:%s, err:%v", textFile, err)
|
||||||
|
}
|
||||||
|
var lines []string
|
||||||
|
for _, line := range strings.Split(string(fileContent), "\n") {
|
||||||
|
if strings.TrimSpace(line) != "" {
|
||||||
|
lines = append(lines, line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines, nil
|
||||||
|
}
|
|
@ -28,7 +28,7 @@ func GetLocalIP() string {
|
||||||
// remove '\n'
|
// remove '\n'
|
||||||
localIP = strings.Replace(localIP, "\n", "", -1)
|
localIP = strings.Replace(localIP, "\n", "", -1)
|
||||||
reIPv4 := regexp.MustCompile("^([0-9]+\\.){3}[0-9]+$")
|
reIPv4 := regexp.MustCompile("^([0-9]+\\.){3}[0-9]+$")
|
||||||
if reIPv4.MatchString(localIP) {
|
if !reIPv4.MatchString(localIP) {
|
||||||
logrus.Warnf("error get_local_ip, localIP=%s\n", localIP)
|
logrus.Warnf("error get_local_ip, localIP=%s\n", localIP)
|
||||||
}
|
}
|
||||||
return localIP
|
return localIP
|
||||||
|
|
|
@ -1,120 +1,12 @@
|
||||||
package misc
|
package misc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
|
||||||
"bytes"
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/sirupsen/logrus"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AppendToFile ...
|
|
||||||
func AppendToFile(fileName string, line string) {
|
|
||||||
file, err := os.OpenFile(fileName, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "open file %s error,err-info:%v\n", fileName, err)
|
|
||||||
fmt.Fprintln(os.Stderr, os.Args)
|
|
||||||
os.Exit(3)
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
writer := bufio.NewWriter(file)
|
|
||||||
writer.WriteString(line + "\n")
|
|
||||||
writer.Flush()
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExecShellCommand ...
|
|
||||||
//
|
|
||||||
// return stdout
|
|
||||||
func ExecShellCommand(myCmd string) string {
|
|
||||||
cmd := exec.Command("bash", "-c", myCmd)
|
|
||||||
output, err := cmd.Output()
|
|
||||||
logrus.Infof("IN execCmd(), cmd=%s,stdout=%s\n", myCmd, string(output))
|
|
||||||
if err != nil {
|
|
||||||
logrus.Errorf("ERROR in execCmd(): cmd=%s,err=%v\n", myCmd, err)
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
// 删除尾部的\n
|
|
||||||
return strings.Replace(string(output), "\n", "", -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExecShellCommandWithExitCode ...
|
|
||||||
// if timeout <= 0 then no timeout
|
|
||||||
func ExecShellCommandWithExitCode(command string, timeout int) (int, string, string) {
|
|
||||||
var cmd *exec.Cmd
|
|
||||||
if timeout > 0 {
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(timeout)*time.Second)
|
|
||||||
defer cancel()
|
|
||||||
cmd = exec.CommandContext(ctx, "/bin/bash", "-c", command)
|
|
||||||
} else {
|
|
||||||
cmd = exec.Command("/bin/bash", "-c", command)
|
|
||||||
}
|
|
||||||
|
|
||||||
var stdoutBuf, stderrBuf bytes.Buffer
|
|
||||||
cmd.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf)
|
|
||||||
cmd.Stderr = io.MultiWriter(os.Stderr, &stderrBuf)
|
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
|
||||||
errMsg := fmt.Sprintf("start command %s failed with error:%v\n", command, err)
|
|
||||||
logrus.Errorln(errMsg)
|
|
||||||
return 103, "", errMsg
|
|
||||||
}
|
|
||||||
exitCode := 0
|
|
||||||
var errMsg string
|
|
||||||
if err := cmd.Wait(); err != nil {
|
|
||||||
if exitErr, ok := err.(*exec.ExitError); ok {
|
|
||||||
// timeout : exit_code = -1
|
|
||||||
errMsg = fmt.Sprintf("Exit Status: %d,exit err_message:%s\ncmd:%s.\n",
|
|
||||||
exitErr.ExitCode(), exitErr.Error(), command)
|
|
||||||
logrus.Warnln(errMsg)
|
|
||||||
exitCode = exitErr.ExitCode()
|
|
||||||
if exitCode == -1 {
|
|
||||||
// timeout !
|
|
||||||
exitCode = 100
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
errMsg = fmt.Sprintf("wait command '%s' failed with error:%v\n", command, err)
|
|
||||||
logrus.Errorln(errMsg)
|
|
||||||
exitCode = 105
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return exitCode, string(stdoutBuf.Bytes()), string(stderrBuf.Bytes()) + errMsg
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetTextFileLines ...
|
|
||||||
func GetTextFileLines(textFile string) ([]string, error) {
|
|
||||||
if _, err := os.Stat(textFile); err != nil {
|
|
||||||
_, ok := err.(*os.PathError)
|
|
||||||
if ok && strings.Contains(err.Error(), "no such file or directory") {
|
|
||||||
// file not exists
|
|
||||||
return []string{}, nil
|
|
||||||
}
|
|
||||||
return []string{}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
fileContent, err := ioutil.ReadFile(textFile)
|
|
||||||
if err != nil {
|
|
||||||
return []string{}, fmt.Errorf("Read file error, filename:%s, err:%v", textFile, err)
|
|
||||||
}
|
|
||||||
var lines []string
|
|
||||||
for _, line := range strings.Split(string(fileContent), "\n") {
|
|
||||||
if strings.TrimSpace(line) != "" {
|
|
||||||
lines = append(lines, line)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return lines, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SplitCommaWithEscapeSupport ..
|
// SplitCommaWithEscapeSupport ..
|
||||||
func SplitCommaWithEscapeSupport(s string) []string {
|
func SplitCommaWithEscapeSupport(s string) []string {
|
||||||
var ret []string
|
var ret []string
|
||||||
|
|
Loading…
Reference in New Issue