工具类
This commit is contained in:
parent
66f7e843d0
commit
84b7ccf7b7
|
@ -0,0 +1,250 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"github.com/axgle/mahonia"
|
||||||
|
"github.com/fatih/color"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetOs 获取操作系统类型和CPU架构
|
||||||
|
func GetOs() (string, string) {
|
||||||
|
// 获取当前操作系统类型
|
||||||
|
osType := runtime.GOOS
|
||||||
|
// 获取当前CPU架构
|
||||||
|
archType := runtime.GOARCH
|
||||||
|
return osType, archType
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExecShell 执行shell命令
|
||||||
|
func ExecShell(command string) (string, int) {
|
||||||
|
osType, _ := GetOs()
|
||||||
|
var cmd *exec.Cmd
|
||||||
|
switch osType {
|
||||||
|
case "windows":
|
||||||
|
cmd = exec.Command("cmd", "/c", command)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
cmd = exec.Command("bash", "-c", command)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// 创建读写器来实时打印命令的标准输出
|
||||||
|
stdoutPipe, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("failed to create stdout pipe: %v", err), 106
|
||||||
|
}
|
||||||
|
stdoutReader := bufio.NewReader(stdoutPipe)
|
||||||
|
|
||||||
|
// 创建读写器来实时打印命令的错误输出
|
||||||
|
stderrPipe, err := cmd.StderrPipe()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Sprintf("failed to create stderr pipe: %v", err), 107
|
||||||
|
}
|
||||||
|
stderrReader := bufio.NewReader(stderrPipe)
|
||||||
|
|
||||||
|
// 启动命令
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
return fmt.Sprintf("failed to start command: %v", err), 108
|
||||||
|
}
|
||||||
|
|
||||||
|
var outStr bytes.Buffer
|
||||||
|
//var errStr bytes.Buffer
|
||||||
|
// 在两个独立的goroutine中读取并打印标准输出和错误输出
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
line, _, err := stdoutReader.ReadLine()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
color.Red("Error reading from stdout: %v\n", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
color.White("[STDOUT] %s\n", line)
|
||||||
|
outStr.Write(line)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
line, _, err := stderrReader.ReadLine()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
color.Red("Error reading from stderr: %v\n", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fmt.Printf("[STDERR] %s\n", line)
|
||||||
|
//errStr.Write(line)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// 等待命令执行完成
|
||||||
|
if err := cmd.Wait(); err != nil {
|
||||||
|
return fmt.Sprintf("command finished with errors: %v", err), 109
|
||||||
|
}
|
||||||
|
|
||||||
|
outputStr := outStr.String()
|
||||||
|
if osType == "windows" {
|
||||||
|
// 从标准输出读取GBK编码的字节流,并转为UTF-8字符串
|
||||||
|
decoder := mahonia.NewDecoder("gbk")
|
||||||
|
return decoder.ConvertString(outputStr), 0
|
||||||
|
}
|
||||||
|
return outputStr, 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsLinux 判断是否为Linux系统
|
||||||
|
func IsLinux() bool {
|
||||||
|
osType, _ := GetOs()
|
||||||
|
//if osType == "linux" && GetDistributionName() == "CentOS" {
|
||||||
|
if osType == "linux" || osType == "darwin" {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDistributionName 通过/etc/issue文件获取Linux发行版信息
|
||||||
|
func GetDistributionName() string {
|
||||||
|
// Linux发行版信息存放路径
|
||||||
|
filePath := "/etc/issue"
|
||||||
|
contentBytes, err := ioutil.ReadFile(filePath)
|
||||||
|
if err != nil {
|
||||||
|
color.Red("failed to read distribution name from file\n", err)
|
||||||
|
os.Exit(201)
|
||||||
|
}
|
||||||
|
distributionName := strings.TrimSpace(string(contentBytes))
|
||||||
|
return distributionName
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallMaven 判断是否安装Maven
|
||||||
|
func IsInstallMaven() bool {
|
||||||
|
// 检查常见的Maven环境变量路径
|
||||||
|
m2Home := os.Getenv("M2_HOME")
|
||||||
|
if m2Home != "" {
|
||||||
|
_, err := exec.LookPath(filepath.Join(m2Home, "bin", "mvn"))
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
mavenHome := os.Getenv("MAVEN_HOME")
|
||||||
|
if mavenHome != "" {
|
||||||
|
_, err := exec.LookPath(filepath.Join(mavenHome, "bin", "mvn"))
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果上述环境变量都未设置,则尝试直接查找系统的mvn命令
|
||||||
|
_, err := exec.LookPath("mvn")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallJdk 判断是否安装JDK
|
||||||
|
func IsInstallJdk() bool {
|
||||||
|
javaHome := os.Getenv("JAVA_HOME")
|
||||||
|
if javaHome != "" {
|
||||||
|
_, err := exec.LookPath(filepath.Join(javaHome, "bin", "java"))
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
_, err := exec.LookPath("java")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallNode 判断是否安装Node
|
||||||
|
func IsInstallNode() bool {
|
||||||
|
_, err := exec.LookPath("npm")
|
||||||
|
if err != nil {
|
||||||
|
_, err := exec.LookPath("node")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallGit 判断是否安装Git
|
||||||
|
func IsInstallGit() bool {
|
||||||
|
_, err := exec.LookPath("git")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallDocker 判断是否安装Docker
|
||||||
|
func IsInstallDocker() bool {
|
||||||
|
_, err := exec.LookPath("docker")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsInstallK8s 判断是否安装K8s
|
||||||
|
func IsInstallK8s() bool {
|
||||||
|
_, err := exec.LookPath("kubectl")
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPWD 获取当前工作目录
|
||||||
|
func GetPWD() string {
|
||||||
|
// 获取当前工作目录
|
||||||
|
dir, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
color.Red("failed to get current directory, %v\n", err)
|
||||||
|
os.Exit(202)
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return dir
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckFileExists 检查文件是否存在
|
||||||
|
func CheckFileExists(filename string) bool {
|
||||||
|
info, err := os.Stat(filename)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return !info.IsDir()
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteContentToFile 写入文件
|
||||||
|
func WriteContentToFile(filepath string, content string) {
|
||||||
|
// 创建或打开一个文件,如果不存在则创建
|
||||||
|
file, err := os.Create(filepath)
|
||||||
|
if err != nil {
|
||||||
|
color.Red("failed to create file, %v\n", err)
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
_, err = io.WriteString(file, content)
|
||||||
|
if err != nil {
|
||||||
|
color.Red("failed to write content, %v\n", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAppName 获取应用名称
|
||||||
|
func GetAppName(output string) string {
|
||||||
|
splits := strings.Split(output, string(os.PathSeparator))
|
||||||
|
split := splits[len(splits)-1]
|
||||||
|
return strings.Split(split, ".")[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetYmsHmsStr 获取时间戳
|
||||||
|
func GetYmsHmsStr() string {
|
||||||
|
// 获取当前时间
|
||||||
|
now := time.Now()
|
||||||
|
// 设置格式模板
|
||||||
|
layout := "20060102150405"
|
||||||
|
// 格式化时间为字符串
|
||||||
|
return now.Format(layout)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsBlank 检查字符串s是否只包含空白字符或为空
|
||||||
|
func IsBlank(s string) bool {
|
||||||
|
for _, r := range s {
|
||||||
|
if !unicode.IsSpace(r) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
Loading…
Reference in New Issue