| | |
| | | package utils |
| | | |
| | | import ( |
| | | "archive/zip" |
| | | "basic.com/valib/logger.git" |
| | | "bufio" |
| | | "bytes" |
| | | "crypto/md5" |
| | | "errors" |
| | | "fmt" |
| | | "io" |
| | | "io/ioutil" |
| | | "os" |
| | | "os/exec" |
| | | "path" |
| | | "path/filepath" |
| | | "runtime" |
| | | ) |
| | | |
| | | func GetExePath() string { |
| | | dir, err := filepath.Abs(filepath.Dir(os.Args[0])) |
| | | if nil != err { |
| | | dir = "./" |
| | | } |
| | | |
| | | return dir |
| | | } |
| | | |
| | | func PathExists(path string) bool { |
| | | _, err := os.Stat(path) |
| | | if nil == err { |
| | | return true |
| | | } |
| | | |
| | | if os.IsNotExist(err) { |
| | | return false |
| | | } |
| | | |
| | | return false |
| | | } |
| | | |
| | | func ShellExecute(dir, exe string, args ...string) (string, error) { |
| | | cmd := exec.Command(exe, args...) |
| | | stdout, err := cmd.StdoutPipe() |
| | | if nil != err { |
| | | msg := fmt.Sprintf("ShellExecute cmd.StdoutPipe err:%v", err) |
| | | return "", errors.New(msg) |
| | | } |
| | | |
| | | cmd.Stderr = os.Stderr |
| | | if "" != dir { |
| | | cmd.Dir = dir |
| | | } |
| | | |
| | | err = cmd.Start() |
| | | if nil != err { |
| | | msg := fmt.Sprintf("ShellExecute cmd.Start err:%v", err) |
| | | return "", errors.New(msg) |
| | | } |
| | | |
| | | var buffer bytes.Buffer |
| | | reader := bufio.NewReader(stdout) |
| | | for { |
| | | line, err2 := reader.ReadString('\n') |
| | | if io.EOF == err2 { |
| | | break |
| | | } |
| | | |
| | | if nil != err2 { |
| | | msg := fmt.Sprintf("ShellExecute reader.ReadString err:%v", err2) |
| | | return "", errors.New(msg) |
| | | } |
| | | |
| | | buffer.WriteString(line) |
| | | } |
| | | |
| | | err = cmd.Wait() |
| | | if nil != err { |
| | | msg := fmt.Sprintf("ShellExecute cmd.Wait err:%v", err) |
| | | return "", errors.New(msg) |
| | | } |
| | | |
| | | return buffer.String(), nil |
| | | } |
| | | |
| | | func DeCompressZip(zipFile, dest string) error { |
| | | reader, err := zip.OpenReader(zipFile) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer reader.Close() |
| | | |
| | | for _, f := range reader.Reader.File { |
| | | if f.FileInfo().IsDir() { |
| | | fullPath := path.Join(dest, f.Name) |
| | | err = os.MkdirAll(fullPath, os.ModePerm) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | continue |
| | | } |
| | | |
| | | r, err := f.Open() |
| | | if err != nil { |
| | | return err |
| | | } |
| | | defer r.Close() |
| | | |
| | | fullPath := path.Join(dest, f.Name) |
| | | w, err := os.Create(fullPath) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | |
| | | defer w.Close() |
| | | _, err = io.Copy(w, r) |
| | | if err != nil { |
| | | return err |
| | | } |
| | | } |
| | | |
| | | return nil |
| | | } |
| | | |
| | | func Md5sum(filepath string) (string, error) { |
| | | f, err := os.Open(filepath) |
| | | if nil != err { |
| | | return "", err |
| | | } |
| | | defer f.Close() |
| | | |
| | | payload, err := ioutil.ReadAll(f) |
| | | if nil != err { |
| | | return "", err |
| | | } |
| | | |
| | | md5sum := fmt.Sprintf("%x", md5.Sum(payload)) |
| | | runtime.GC() |
| | | |
| | | return md5sum, nil |
| | | } |
| | | |
| | | //强制更新文件内容,(与copy命令有区别) |
| | | func CopyFileContents(src, dest string) (err error) { |
| | | in, err := os.Open(src) |
| | | if nil != err { |
| | | return |
| | | } |
| | | defer in.Close() |
| | | |
| | | if PathExists(dest) { //替换前重命名备份原来文件 |
| | | tmpDest := dest + "1" |
| | | os.Rename(dest, tmpDest) |
| | | } |
| | | out, err := os.Create(dest) |
| | | if nil != err { |
| | | return |
| | | } |
| | | defer func() { |
| | | cErr := out.Close() |
| | | if nil != cErr { |
| | | err = cErr |
| | | } |
| | | }() |
| | | |
| | | if _, err = io.Copy(out, in); err != nil { |
| | | return |
| | | } |
| | | |
| | | err = out.Sync() |
| | | |
| | | return |
| | | } |
| | | |
| | | func DeCompressTGZ(gzFile, dest string) (err error) { |
| | | logger.Info("开始解压" + gzFile + "到" + dest + "\n") |
| | | command := "tar -zxf " + gzFile + " -C " + dest |
| | | result, err := execCommand(command) |
| | | logger.Info("执行命令:", command) |
| | | logger.Info(string(result) + "\n") |
| | | logger.Info("解压" + gzFile + "到" + dest + "完成!") |
| | | return |
| | | } |
| | | |
| | | func CompressTGZ(gzFile, dest string) (err error) { |
| | | logger.Info("开始压缩" + gzFile + " " + dest + "\n") |
| | | command := "tar -zcf " + gzFile + " -C " + dest + " ." |
| | | result, err := execCommand(command) |
| | | if err != nil { |
| | | logger.Error("压缩失败"+gzFile+" "+dest+",error:", err) |
| | | return |
| | | } |
| | | logger.Info(string(result) + "\n") |
| | | logger.Info("压缩" + gzFile + " " + dest + "完成!") |
| | | return |
| | | } |
| | | |
| | | //执行命令 |
| | | func execCommand(cmd string) ([]byte, error) { |
| | | return exec.Command("/bin/bash", "-c", cmd).Output() |
| | | } |
| | | package utils
|
| | |
|
| | | import (
|
| | | "archive/zip"
|
| | | "basic.com/valib/logger.git"
|
| | | "bufio"
|
| | | "bytes"
|
| | | "crypto/md5"
|
| | | "errors"
|
| | | "fmt"
|
| | | "io"
|
| | | "io/ioutil"
|
| | | "os"
|
| | | "os/exec"
|
| | | "path"
|
| | | "path/filepath"
|
| | | "runtime"
|
| | | )
|
| | |
|
| | | func GetExePath() string {
|
| | | dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
|
| | | if nil != err {
|
| | | dir = "./"
|
| | | }
|
| | |
|
| | | return dir
|
| | | }
|
| | |
|
| | | func PathExists(path string) bool {
|
| | | _, err := os.Stat(path)
|
| | | if nil == err {
|
| | | return true
|
| | | }
|
| | |
|
| | | if os.IsNotExist(err) {
|
| | | return false
|
| | | }
|
| | |
|
| | | return false
|
| | | }
|
| | |
|
| | | func ShellExecute(dir, exe string, args ...string) (string, error) {
|
| | | cmd := exec.Command(exe, args...)
|
| | | stdout, err := cmd.StdoutPipe()
|
| | | if nil != err {
|
| | | msg := fmt.Sprintf("ShellExecute cmd.StdoutPipe err:%v", err)
|
| | | return "", errors.New(msg)
|
| | | }
|
| | |
|
| | | cmd.Stderr = os.Stderr
|
| | | if "" != dir {
|
| | | cmd.Dir = dir
|
| | | }
|
| | |
|
| | | err = cmd.Start()
|
| | | if nil != err {
|
| | | msg := fmt.Sprintf("ShellExecute cmd.Start err:%v", err)
|
| | | return "", errors.New(msg)
|
| | | }
|
| | |
|
| | | var buffer bytes.Buffer
|
| | | reader := bufio.NewReader(stdout)
|
| | | for {
|
| | | line, err2 := reader.ReadString('\n')
|
| | | if io.EOF == err2 {
|
| | | break
|
| | | }
|
| | |
|
| | | if nil != err2 {
|
| | | msg := fmt.Sprintf("ShellExecute reader.ReadString err:%v", err2)
|
| | | return "", errors.New(msg)
|
| | | }
|
| | |
|
| | | buffer.WriteString(line)
|
| | | }
|
| | |
|
| | | err = cmd.Wait()
|
| | | if nil != err {
|
| | | msg := fmt.Sprintf("ShellExecute cmd.Wait err:%v", err)
|
| | | return "", errors.New(msg)
|
| | | }
|
| | |
|
| | | return buffer.String(), nil
|
| | | }
|
| | |
|
| | | func DeCompressZip(zipFile, dest string) error {
|
| | | reader, err := zip.OpenReader(zipFile)
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | | defer reader.Close()
|
| | |
|
| | | for _, f := range reader.Reader.File {
|
| | | if f.FileInfo().IsDir() {
|
| | | fullPath := path.Join(dest, f.Name)
|
| | | err = os.MkdirAll(fullPath, os.ModePerm)
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | | continue
|
| | | }
|
| | |
|
| | | r, err := f.Open()
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | | defer r.Close()
|
| | |
|
| | | fullPath := path.Join(dest, f.Name)
|
| | | w, err := os.Create(fullPath)
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | |
|
| | | defer w.Close()
|
| | | _, err = io.Copy(w, r)
|
| | | if err != nil {
|
| | | return err
|
| | | }
|
| | | }
|
| | |
|
| | | return nil
|
| | | }
|
| | |
|
| | | func Md5sum(filepath string) (string, error) {
|
| | | f, err := os.Open(filepath)
|
| | | if nil != err {
|
| | | return "", err
|
| | | }
|
| | | defer f.Close()
|
| | |
|
| | | payload, err := ioutil.ReadAll(f)
|
| | | if nil != err {
|
| | | return "", err
|
| | | }
|
| | |
|
| | | md5sum := fmt.Sprintf("%x", md5.Sum(payload))
|
| | | runtime.GC()
|
| | |
|
| | | return md5sum, nil
|
| | | }
|
| | |
|
| | | //强制更新文件内容,(与copy命令有区别)
|
| | | func CopyFileContents(src, dest string) (err error) {
|
| | | in, err := os.Open(src)
|
| | | if nil != err {
|
| | | return
|
| | | }
|
| | | defer in.Close()
|
| | |
|
| | | if PathExists(dest) { //替换前重命名备份原来文件
|
| | | tmpDest := dest + "1"
|
| | | os.Rename(dest, tmpDest)
|
| | | }
|
| | | out, err := os.Create(dest)
|
| | | if nil != err {
|
| | | return
|
| | | }
|
| | | defer func() {
|
| | | cErr := out.Close()
|
| | | if nil != cErr {
|
| | | err = cErr
|
| | | }
|
| | | }()
|
| | |
|
| | | if _, err = io.Copy(out, in); err != nil {
|
| | | return
|
| | | }
|
| | |
|
| | | err = out.Sync()
|
| | |
|
| | | return
|
| | | }
|
| | |
|
| | | func DeCompressTGZ(gzFile, dest string) (err error) {
|
| | | logger.Info("开始解压" + gzFile + "到" + dest + "\n")
|
| | | command := "tar -zxf " + gzFile + " -C " + dest
|
| | | result, err := execCommand(command)
|
| | | logger.Info("执行命令:", command)
|
| | | logger.Info(string(result) + "\n")
|
| | | logger.Info("解压" + gzFile + "到" + dest + "完成!")
|
| | | return
|
| | | }
|
| | |
|
| | | func CompressTGZ(gzFile, dest string) (err error) {
|
| | | logger.Info("开始压缩" + gzFile + " " + dest + "\n")
|
| | | command := "tar -zcf " + gzFile + " -C " + dest + " ."
|
| | | result, err := execCommand(command)
|
| | | if err != nil {
|
| | | logger.Error("压缩失败"+gzFile+" "+dest+",error:", err)
|
| | | return
|
| | | }
|
| | | logger.Info(string(result) + "\n")
|
| | | logger.Info("压缩" + gzFile + " " + dest + "完成!")
|
| | | return
|
| | | }
|
| | |
|
| | | //执行命令
|
| | | func execCommand(cmd string) ([]byte, error) {
|
| | | return exec.Command("/bin/bash", "-c", cmd).Output()
|
| | | }
|