|
@@ -0,0 +1,177 @@
|
|
|
+package services
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "fmt"
|
|
|
+ "github.com/pkg/sftp"
|
|
|
+ "golang.org/x/crypto/ssh"
|
|
|
+ "hongze/hz_sync_logs/utils"
|
|
|
+ "io"
|
|
|
+ "log"
|
|
|
+ "os"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func SyncYesterdayLogsByCygx(cont context.Context) (err error) {
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ log.Printf(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "同步查研观向昨天日志失败 ErrMsg:"+err.Error())
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ serviceMap := make(map[string]string)
|
|
|
+
|
|
|
+ for host, pwd := range serviceMap {
|
|
|
+ serviceByCygx(host, pwd)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func serviceByCygx(host, pwd string) {
|
|
|
+ projectNameArr := []string{
|
|
|
+ "hongze_cygx", // 查研观向小程序
|
|
|
+ "hongze_cygxzs", // 查研观向小助手公众号
|
|
|
+ "hongze_mfyx_gzh", // 买方研选公众号
|
|
|
+ "hongze_web_mfyx", // 买方研选网页版
|
|
|
+ "hongze_mfyx", // 买方研选小程序
|
|
|
+ "hongze_clpt", // 查研观向网页版
|
|
|
+ }
|
|
|
+ sshHost := host //ssh的地址和端口(测试)
|
|
|
+
|
|
|
+ sshConfig := &ssh.ClientConfig{
|
|
|
+ User: "root",
|
|
|
+ Auth: []ssh.AuthMethod{
|
|
|
+ ssh.Password(pwd),
|
|
|
+ },
|
|
|
+ HostKeyCallback: ssh.InsecureIgnoreHostKey(),
|
|
|
+ ClientVersion: "",
|
|
|
+ Timeout: 10 * time.Second,
|
|
|
+ }
|
|
|
+
|
|
|
+ //建立与SSH服务器的链接
|
|
|
+ sshClient, err := ssh.Dial("tcp", sshHost, sshConfig)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("ssh.Dial Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer sshClient.Close()
|
|
|
+ sftpClient, err := sftp.NewClient(sshClient)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("sftp.NewClient Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer sftpClient.Close()
|
|
|
+ //获取当前目录
|
|
|
+ cwd, err := sftpClient.Getwd()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Getwd Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fmt.Println("当前目录:" + cwd)
|
|
|
+
|
|
|
+ //显示文件/目录详情
|
|
|
+ fi, err := sftpClient.Lstat(cwd)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("sftpClient.Lstat Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ fmt.Println(fi)
|
|
|
+ prefixDir := `/data/rdlucklog/hongze_cygx/`
|
|
|
+ //preSaveDirPath := `/Users/roc/go/src/hongze/hz_sync_logs/test/`
|
|
|
+ //dirCut := `/` //linux的目录分割符
|
|
|
+ preSaveDirPath := `F:\\cygxlogs\\`
|
|
|
+ if strings.Contains(host, "75") {
|
|
|
+ preSaveDirPath += "75" + "\\"
|
|
|
+ } else {
|
|
|
+ preSaveDirPath += "55" + "\\"
|
|
|
+ }
|
|
|
+ dirCut := `\\` //windows的目录分割符
|
|
|
+
|
|
|
+ yesterdayTime := time.Now().AddDate(0, 0, -1)
|
|
|
+
|
|
|
+ logNameArr := []string{
|
|
|
+ "apilog",
|
|
|
+ "binlog",
|
|
|
+ "datalog",
|
|
|
+ "filelog",
|
|
|
+ //"mongolog",
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, projectName := range projectNameArr {
|
|
|
+ for _, logFileName := range logNameArr {
|
|
|
+ for i := 1; i < 2; i++ {
|
|
|
+ serverFilePath := prefixDir + projectName + "/" + logFileName
|
|
|
+ localFilePath := preSaveDirPath + projectName + "\\" + logFileName
|
|
|
+ //下载文件
|
|
|
+ err = syncLogByCygx(sftpClient, yesterdayTime, serverFilePath, localFilePath, dirCut, logFileName, i)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(serverFilePath+"下载失败,ERR:", err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func syncLogByCygx(sftpClient *sftp.Client, dateTime time.Time, dataDirPath, saveDirPath, dirCut, logFileName string, i int) (err error) {
|
|
|
+ fileExt := `.log`
|
|
|
+
|
|
|
+ date := dateTime.Format(utils.FormatDate)
|
|
|
+
|
|
|
+ //服务器的文件路径
|
|
|
+ remoteFileName := dataDirPath + "/" + logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
|
|
|
+
|
|
|
+ remoteFile, err := sftpClient.Open(remoteFileName)
|
|
|
+ if err != nil {
|
|
|
+ if err.Error() == "file does not exist" {
|
|
|
+ fmt.Println(remoteFileName + " file does not exist")
|
|
|
+ err = nil
|
|
|
+ } else {
|
|
|
+ fmt.Println("sftpClient.Open err:" + err.Error() + " ;remoteFileName:" + remoteFileName)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer remoteFile.Close()
|
|
|
+
|
|
|
+ //本地文件路径
|
|
|
+ saveFileName := saveDirPath + dirCut
|
|
|
+ fmt.Println("saveFileName:" + saveFileName)
|
|
|
+
|
|
|
+ localFileName := logFileName + `.` + date + "." + fmt.Sprintf("%03d", i) + fileExt
|
|
|
+ if !utils.FileIsExist(saveFileName) {
|
|
|
+ err = os.MkdirAll(saveFileName, 0766)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("创建目录失败,Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ localFilePath := saveFileName + localFileName
|
|
|
+ fmt.Println("remoteFileName:" + remoteFileName)
|
|
|
+ fmt.Println("localFilePath:" + localFilePath)
|
|
|
+
|
|
|
+ localFile, err := os.Create(localFilePath)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("create file err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer localFile.Close()
|
|
|
+ n, err := io.Copy(localFile, remoteFile)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("copy err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //获取远程文件大小
|
|
|
+ remoteFileInfo, err := sftpClient.Stat(remoteFileName)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("sftpClient.Stat Err:" + err.Error())
|
|
|
+ log.Fatalln(err.Error())
|
|
|
+ }
|
|
|
+ log.Printf("文件下载成功[%s->%s]远程文件大小:%s,下载文件大小:%s", remoteFileName, localFilePath, formatFileSize(remoteFileInfo.Size()), formatFileSize(n))
|
|
|
+ //删除远程目录文件
|
|
|
+ err = sftpClient.Remove(remoteFileName)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("sftpClient.Remove Err:" + err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|