自动更新管控端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

107 lines
2.6 KiB

package core
import (
"io"
"os"
"path/filepath"
"scagent/util"
"go.uber.org/zap"
)
type UpFileService struct{}
// FileInfo 包含文件的元信息
type FileInfo struct {
FileName string
FileSize int64
}
// FileChunk 表示文件的一部分
type FileChunk struct {
Data []byte
FileName string
DirPath string
Offset int64
IsLast bool
}
// 发送文件的RPC
// SendFile 接收文件信息(名称和大小)
func (f *UpFileService) SendFileInfo(info FileInfo, reply *string) error {
logger := util.NewProductionLogger()
defer logger.Sync()
// 创建保存文件的目录
// if err := os.MkdirAll("received_files", 0755); err != nil {
// return err
// }
// 提取路径 /www/wwwroot/bidemo.com/BIU_20250918_183144.zip
dirPath := filepath.Dir(info.FileName)
logger.Info("SendFileInfo", zap.String("dirPath", dirPath))
// 检查文件夹是否存在
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
// 文件夹不存在,创建它
if err := os.MkdirAll(dirPath, 0755); err != nil {
logger.Error("SendFileInfo mkdir failed", zap.Error(err))
}
}
// 返回true的字符串
*reply = "true"
return nil
}
// SendFileChunk 接收文件块并写入文件
func (f *UpFileService) SendFileChunk(chunk FileChunk, reply *bool) error {
// 日志
logger := util.NewProductionLogger()
defer logger.Sync()
// filePath := filepath.Join("/www/afs/logs/00", chunk.FileName)
// fmt.Printf("recive file :%s", chunk.FileName)
// 合并为实际路径
filePath := filepath.Join(chunk.DirPath, chunk.FileName)
// filePath := chunk.FileName
// 打开文件,使用追加模式
file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0644)
if err != nil {
logger.Error("SendFileChunk OpenFile failed", zap.Error(err))
}
defer file.Close()
// 移动到指定偏移量
if _, err := file.Seek(chunk.Offset, io.SeekStart); err != nil {
logger.Error("SendFileChunk Seek failed", zap.Error(err))
}
// 写入数据
if _, err := file.Write(chunk.Data); err != nil {
logger.Error("SendFileChunk Write failed", zap.Error(err))
}
*reply = true
return nil
}
// 解压缩文件
// info.FileName 压缩包全路径
func (f *UpFileService) UnzipArchive(info FileInfo, reply *string) error {
// 日志
logger := util.NewProductionLogger()
defer logger.Sync()
logger.Info("UnzipArchive", zap.String("filename", info.FileName))
// 解压到的目录
dirpath := filepath.Dir(info.FileName)
// 解压缩文件
ret := make(chan string)
go func() {
util.DecompressZip(info.FileName, dirpath)
ret <- "uzok"
}()
// 返回true的字符串
if retMsg := <-ret; retMsg == "uzok" {
*reply = retMsg
}
return nil
}