mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 08:39:10 +08:00 
			
		
		
		
	i18n: logs in rest pkgs
This commit is contained in:
		
							
								
								
									
										2
									
								
								assets
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								assets
									
									
									
									
									
								
							 Submodule assets updated: 02d93206cc...547078fa21
									
								
							
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @ -99,6 +99,7 @@ require ( | |||||||
| 	github.com/mattn/go-colorable v0.1.4 // indirect | 	github.com/mattn/go-colorable v0.1.4 // indirect | ||||||
| 	github.com/mattn/go-isatty v0.0.12 // indirect | 	github.com/mattn/go-isatty v0.0.12 // indirect | ||||||
| 	github.com/mattn/go-runewidth v0.0.12 // indirect | 	github.com/mattn/go-runewidth v0.0.12 // indirect | ||||||
|  | 	github.com/mattn/go-sqlite3 v1.14.7 // indirect | ||||||
| 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect | ||||||
| 	github.com/mitchellh/mapstructure v1.1.2 // indirect | 	github.com/mitchellh/mapstructure v1.1.2 // indirect | ||||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								main.go
									
									
									
									
									
								
							| @ -35,9 +35,9 @@ var staticZip string | |||||||
| var staticFS fs.FS | var staticFS fs.FS | ||||||
|  |  | ||||||
| func init() { | func init() { | ||||||
| 	flag.StringVar(&confPath, "c", util.RelativePath("conf.ini"), "配置文件路径") | 	flag.StringVar(&confPath, "c", util.RelativePath("conf.ini"), "Path to the config file.") | ||||||
| 	flag.BoolVar(&isEject, "eject", false, "导出内置静态资源") | 	flag.BoolVar(&isEject, "eject", false, "Eject all embedded static files.") | ||||||
| 	flag.StringVar(&scriptName, "database-script", "", "运行内置数据库助手脚本") | 	flag.StringVar(&scriptName, "database-script", "", "Name of database util script.") | ||||||
| 	flag.Parse() | 	flag.Parse() | ||||||
|  |  | ||||||
| 	staticFS = archiver.ArchiveFS{ | 	staticFS = archiver.ArchiveFS{ | ||||||
| @ -71,7 +71,7 @@ func main() { | |||||||
| 	signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) | 	signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) | ||||||
| 	go func() { | 	go func() { | ||||||
| 		sig := <-sigChan | 		sig := <-sigChan | ||||||
| 		util.Log().Info("收到信号 %s,开始关闭 server", sig) | 		util.Log().Info("Signal %s received, shutting down server...", sig) | ||||||
| 		ctx := context.Background() | 		ctx := context.Background() | ||||||
| 		if conf.SystemConfig.GracePeriod != 0 { | 		if conf.SystemConfig.GracePeriod != 0 { | ||||||
| 			var cancel context.CancelFunc | 			var cancel context.CancelFunc | ||||||
| @ -81,16 +81,16 @@ func main() { | |||||||
|  |  | ||||||
| 		err := server.Shutdown(ctx) | 		err := server.Shutdown(ctx) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			util.Log().Error("关闭 server 错误, %s", err) | 			util.Log().Error("Failed to shutdown server: %s", err) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
|  |  | ||||||
| 	// 如果启用了SSL | 	// 如果启用了SSL | ||||||
| 	if conf.SSLConfig.CertPath != "" { | 	if conf.SSLConfig.CertPath != "" { | ||||||
| 		util.Log().Info("开始监听 %s", conf.SSLConfig.Listen) | 		util.Log().Info("Listening to %q", conf.SSLConfig.Listen) | ||||||
| 		server.Addr = conf.SSLConfig.Listen | 		server.Addr = conf.SSLConfig.Listen | ||||||
| 		if err := server.ListenAndServeTLS(conf.SSLConfig.CertPath, conf.SSLConfig.KeyPath); err != nil { | 		if err := server.ListenAndServeTLS(conf.SSLConfig.CertPath, conf.SSLConfig.KeyPath); err != nil { | ||||||
| 			util.Log().Error("无法监听[%s],%s", conf.SSLConfig.Listen, err) | 			util.Log().Error("Failed to listen to %q: %s", conf.SSLConfig.Listen, err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| @ -100,23 +100,23 @@ func main() { | |||||||
| 		// delete socket file before listening | 		// delete socket file before listening | ||||||
| 		if _, err := os.Stat(conf.UnixConfig.Listen); err == nil { | 		if _, err := os.Stat(conf.UnixConfig.Listen); err == nil { | ||||||
| 			if err = os.Remove(conf.UnixConfig.Listen); err != nil { | 			if err = os.Remove(conf.UnixConfig.Listen); err != nil { | ||||||
| 				util.Log().Error("删除 socket 文件错误, %s", err) | 				util.Log().Error("Failed to delete socket file: %s", err) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		api.TrustedPlatform = conf.UnixConfig.ProxyHeader | 		api.TrustedPlatform = conf.UnixConfig.ProxyHeader | ||||||
| 		util.Log().Info("开始监听 %s", conf.UnixConfig.Listen) | 		util.Log().Info("Listening to %q", conf.UnixConfig.Listen) | ||||||
| 		if err := RunUnix(server); err != nil { | 		if err := RunUnix(server); err != nil { | ||||||
| 			util.Log().Error("无法监听[%s],%s", conf.UnixConfig.Listen, err) | 			util.Log().Error("Failed to listen to %q: %s", conf.UnixConfig.Listen, err) | ||||||
| 		} | 		} | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	util.Log().Info("开始监听 %s", conf.SystemConfig.Listen) | 	util.Log().Info("Listening to %q", conf.SystemConfig.Listen) | ||||||
| 	server.Addr = conf.SystemConfig.Listen | 	server.Addr = conf.SystemConfig.Listen | ||||||
| 	if err := server.ListenAndServe(); err != nil { | 	if err := server.ListenAndServe(); err != nil { | ||||||
| 		util.Log().Error("无法监听[%s],%s", conf.SystemConfig.Listen, err) | 		util.Log().Error("Failed to listen to %q: %s", conf.SystemConfig.Listen, err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ const ( | |||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	// ErrTypeNotMatch ID类型不匹配 | 	// ErrTypeNotMatch ID类型不匹配 | ||||||
| 	ErrTypeNotMatch = errors.New("ID类型不匹配") | 	ErrTypeNotMatch = errors.New("mismatched ID type.") | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // HashEncode 对给定数据计算HashID | // HashEncode 对给定数据计算HashID | ||||||
|  | |||||||
| @ -179,7 +179,7 @@ func (resp *Response) DecodeResponse() (*serializer.Response, error) { | |||||||
| 	var res serializer.Response | 	var res serializer.Response | ||||||
| 	err = json.Unmarshal([]byte(respString), &res) | 	err = json.Unmarshal([]byte(respString), &res) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		util.Log().Debug("无法解析回调服务端响应:%s", string(respString)) | 		util.Log().Debug("Failed to parse response: %s", string(respString)) | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	return &res, nil | 	return &res, nil | ||||||
| @ -251,7 +251,7 @@ func (instance NopRSCloser) Seek(offset int64, whence int) (int64, error) { | |||||||
| 			return instance.status.Size, nil | 			return instance.status.Size, nil | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return 0, errors.New("未实现") | 	return 0, errors.New("not implemented") | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -221,7 +221,7 @@ const ( | |||||||
| // DBErr 数据库操作失败 | // DBErr 数据库操作失败 | ||||||
| func DBErr(msg string, err error) Response { | func DBErr(msg string, err error) Response { | ||||||
| 	if msg == "" { | 	if msg == "" { | ||||||
| 		msg = "数据库操作失败" | 		msg = "Database operation failed." | ||||||
| 	} | 	} | ||||||
| 	return Err(CodeDBError, msg, err) | 	return Err(CodeDBError, msg, err) | ||||||
| } | } | ||||||
| @ -229,7 +229,7 @@ func DBErr(msg string, err error) Response { | |||||||
| // ParamErr 各种参数错误 | // ParamErr 各种参数错误 | ||||||
| func ParamErr(msg string, err error) Response { | func ParamErr(msg string, err error) Response { | ||||||
| 	if msg == "" { | 	if msg == "" { | ||||||
| 		msg = "参数错误" | 		msg = "Invalid parameters." | ||||||
| 	} | 	} | ||||||
| 	return Err(CodeParamErr, msg, err) | 	return Err(CodeParamErr, msg, err) | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ func NewResponseWithGobData(data interface{}) Response { | |||||||
| 	var w bytes.Buffer | 	var w bytes.Buffer | ||||||
| 	encoder := gob.NewEncoder(&w) | 	encoder := gob.NewEncoder(&w) | ||||||
| 	if err := encoder.Encode(data); err != nil { | 	if err := encoder.Encode(data); err != nil { | ||||||
| 		return Err(CodeInternalSetting, "无法编码返回结果", err) | 		return Err(CodeInternalSetting, "Failed to encode response content", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return Response{Data: w.Bytes()} | 	return Response{Data: w.Bytes()} | ||||||
|  | |||||||
| @ -13,7 +13,7 @@ import ( | |||||||
| func CheckLogin() Response { | func CheckLogin() Response { | ||||||
| 	return Response{ | 	return Response{ | ||||||
| 		Code: CodeCheckLogin, | 		Code: CodeCheckLogin, | ||||||
| 		Msg:  "未登录", | 		Msg:  "Login required", | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -69,7 +69,7 @@ func (job *CompressTask) SetError(err *JobError) { | |||||||
| func (job *CompressTask) removeZipFile() { | func (job *CompressTask) removeZipFile() { | ||||||
| 	if job.zipPath != "" { | 	if job.zipPath != "" { | ||||||
| 		if err := os.Remove(job.zipPath); err != nil { | 		if err := os.Remove(job.zipPath); err != nil { | ||||||
| 			util.Log().Warning("无法删除临时压缩文件 %s , %s", job.zipPath, err) | 			util.Log().Warning("Failed to delete temp zip file %q: %s", job.zipPath, err) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -93,7 +93,7 @@ func (job *CompressTask) Do() { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	util.Log().Debug("开始压缩文件") | 	util.Log().Debug("Starting compress file...") | ||||||
| 	job.TaskModel.SetProgress(CompressingProgress) | 	job.TaskModel.SetProgress(CompressingProgress) | ||||||
|  |  | ||||||
| 	// 创建临时压缩文件 | 	// 创建临时压缩文件 | ||||||
| @ -122,7 +122,7 @@ func (job *CompressTask) Do() { | |||||||
|  |  | ||||||
| 	job.zipPath = zipFilePath | 	job.zipPath = zipFilePath | ||||||
| 	zipFile.Close() | 	zipFile.Close() | ||||||
| 	util.Log().Debug("压缩文件存放至%s,开始上传", zipFilePath) | 	util.Log().Debug("Compressed file saved to %q, start uploading it...", zipFilePath) | ||||||
| 	job.TaskModel.SetProgress(TransferringProgress) | 	job.TaskModel.SetProgress(TransferringProgress) | ||||||
|  |  | ||||||
| 	// 上传文件 | 	// 上传文件 | ||||||
|  | |||||||
| @ -77,7 +77,7 @@ func (job *DecompressTask) Do() { | |||||||
| 	// 创建文件系统 | 	// 创建文件系统 | ||||||
| 	fs, err := filesystem.NewFileSystem(job.User) | 	fs, err := filesystem.NewFileSystem(job.User) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("无法创建文件系统", err) | 		job.SetErrorMsg("Failed to create filesystem.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -85,7 +85,7 @@ func (job *DecompressTask) Do() { | |||||||
|  |  | ||||||
| 	err = fs.Decompress(context.Background(), job.TaskProps.Src, job.TaskProps.Dst, job.TaskProps.Encoding) | 	err = fs.Decompress(context.Background(), job.TaskProps.Src, job.TaskProps.Dst, job.TaskProps.Encoding) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("解压缩失败", err) | 		job.SetErrorMsg("Failed to decompress file.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -4,5 +4,5 @@ import "errors" | |||||||
|  |  | ||||||
| var ( | var ( | ||||||
| 	// ErrUnknownTaskType 未知任务类型 | 	// ErrUnknownTaskType 未知任务类型 | ||||||
| 	ErrUnknownTaskType = errors.New("未知任务类型") | 	ErrUnknownTaskType = errors.New("unknown task type") | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -81,7 +81,7 @@ func (job *ImportTask) Do() { | |||||||
| 	// 查找存储策略 | 	// 查找存储策略 | ||||||
| 	policy, err := model.GetPolicyByID(job.TaskProps.PolicyID) | 	policy, err := model.GetPolicyByID(job.TaskProps.PolicyID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("找不到存储策略", err) | 		job.SetErrorMsg("Policy not exist.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -96,7 +96,7 @@ func (job *ImportTask) Do() { | |||||||
|  |  | ||||||
| 	fs.Policy = &policy | 	fs.Policy = &policy | ||||||
| 	if err := fs.DispatchHandler(); err != nil { | 	if err := fs.DispatchHandler(); err != nil { | ||||||
| 		job.SetErrorMsg("无法分发存储策略", err) | 		job.SetErrorMsg("Failed to dispatch policy.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -110,7 +110,7 @@ func (job *ImportTask) Do() { | |||||||
| 		true) | 		true) | ||||||
| 	objects, err := fs.Handler.List(ctx, job.TaskProps.Src, job.TaskProps.Recursive) | 	objects, err := fs.Handler.List(ctx, job.TaskProps.Src, job.TaskProps.Recursive) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("无法列取文件", err) | 		job.SetErrorMsg("Failed to list files.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -126,7 +126,7 @@ func (job *ImportTask) Do() { | |||||||
| 			virtualPath := path.Join(job.TaskProps.Dst, object.RelativePath) | 			virtualPath := path.Join(job.TaskProps.Dst, object.RelativePath) | ||||||
| 			folder, err := fs.CreateDirectory(coxIgnoreConflict, virtualPath) | 			folder, err := fs.CreateDirectory(coxIgnoreConflict, virtualPath) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				util.Log().Warning("导入任务无法创建用户目录[%s], %s", virtualPath, err) | 				util.Log().Warning("Importing task cannot create user directory %q: %s", virtualPath, err) | ||||||
| 			} else if folder.ID > 0 { | 			} else if folder.ID > 0 { | ||||||
| 				pathCache[virtualPath] = folder | 				pathCache[virtualPath] = folder | ||||||
| 			} | 			} | ||||||
| @ -152,7 +152,7 @@ func (job *ImportTask) Do() { | |||||||
| 			} else { | 			} else { | ||||||
| 				folder, err := fs.CreateDirectory(context.Background(), virtualPath) | 				folder, err := fs.CreateDirectory(context.Background(), virtualPath) | ||||||
| 				if err != nil { | 				if err != nil { | ||||||
| 					util.Log().Warning("导入任务无法创建用户目录[%s], %s", | 					util.Log().Warning("Importing task cannot create user directory %q: %s", | ||||||
| 						virtualPath, err) | 						virtualPath, err) | ||||||
| 					continue | 					continue | ||||||
| 				} | 				} | ||||||
| @ -163,10 +163,10 @@ func (job *ImportTask) Do() { | |||||||
| 			// 插入文件记录 | 			// 插入文件记录 | ||||||
| 			_, err := fs.AddFile(context.Background(), parentFolder, &fileHeader) | 			_, err := fs.AddFile(context.Background(), parentFolder, &fileHeader) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				util.Log().Warning("导入任务无法创插入文件[%s], %s", | 				util.Log().Warning("Importing task cannot insert user file %q: %s", | ||||||
| 					object.RelativePath, err) | 					object.RelativePath, err) | ||||||
| 				if err == filesystem.ErrInsufficientCapacity { | 				if err == filesystem.ErrInsufficientCapacity { | ||||||
| 					job.SetErrorMsg("容量不足", err) | 					job.SetErrorMsg("Insufficient storage capacity.", err) | ||||||
| 					return | 					return | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | |||||||
| @ -89,12 +89,12 @@ func Resume(p Pool) { | |||||||
| 	if len(tasks) == 0 { | 	if len(tasks) == 0 { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	util.Log().Info("从数据库中恢复 %d 个未完成任务", len(tasks)) | 	util.Log().Info("Resume %d unfinished task(s) from database.", len(tasks)) | ||||||
|  |  | ||||||
| 	for i := 0; i < len(tasks); i++ { | 	for i := 0; i < len(tasks); i++ { | ||||||
| 		job, err := GetJobFromModel(&tasks[i]) | 		job, err := GetJobFromModel(&tasks[i]) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			util.Log().Warning("无法恢复任务,%s", err) | 			util.Log().Warning("Failed to resume task: %s", err) | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | |||||||
| @ -44,11 +44,11 @@ func (pool *AsyncPool) freeWorker() { | |||||||
| // Submit 开始提交任务 | // Submit 开始提交任务 | ||||||
| func (pool *AsyncPool) Submit(job Job) { | func (pool *AsyncPool) Submit(job Job) { | ||||||
| 	go func() { | 	go func() { | ||||||
| 		util.Log().Debug("等待获取Worker") | 		util.Log().Debug("Waiting for Worker.") | ||||||
| 		worker := pool.obtainWorker() | 		worker := pool.obtainWorker() | ||||||
| 		util.Log().Debug("获取到Worker") | 		util.Log().Debug("Worker obtained.") | ||||||
| 		worker.Do(job) | 		worker.Do(job) | ||||||
| 		util.Log().Debug("释放Worker") | 		util.Log().Debug("Worker released.") | ||||||
| 		pool.freeWorker() | 		pool.freeWorker() | ||||||
| 	}() | 	}() | ||||||
| } | } | ||||||
| @ -60,7 +60,7 @@ func Init() { | |||||||
| 		idleWorker: make(chan int, maxWorker), | 		idleWorker: make(chan int, maxWorker), | ||||||
| 	} | 	} | ||||||
| 	TaskPoll.Add(maxWorker) | 	TaskPoll.Add(maxWorker) | ||||||
| 	util.Log().Info("初始化任务队列,WorkerNum = %d", maxWorker) | 	util.Log().Info("Initialize task queue with WorkerNum = %d", maxWorker) | ||||||
|  |  | ||||||
| 	if conf.SystemConfig.Mode == "master" { | 	if conf.SystemConfig.Mode == "master" { | ||||||
| 		Resume(TaskPoll) | 		Resume(TaskPoll) | ||||||
|  | |||||||
| @ -73,21 +73,21 @@ func (job *RecycleTask) GetError() *JobError { | |||||||
| func (job *RecycleTask) Do() { | func (job *RecycleTask) Do() { | ||||||
| 	download, err := model.GetDownloadByGid(job.TaskProps.DownloadGID, job.User.ID) | 	download, err := model.GetDownloadByGid(job.TaskProps.DownloadGID, job.User.ID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		util.Log().Warning("回收任务 %d 找不到下载记录", job.TaskModel.ID) | 		util.Log().Warning("Recycle task %d cannot found download record.", job.TaskModel.ID) | ||||||
| 		job.SetErrorMsg("无法找到下载任务", err) | 		job.SetErrorMsg("Cannot found download task.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	nodeID := download.GetNodeID() | 	nodeID := download.GetNodeID() | ||||||
| 	node := cluster.Default.GetNodeByID(nodeID) | 	node := cluster.Default.GetNodeByID(nodeID) | ||||||
| 	if node == nil { | 	if node == nil { | ||||||
| 		util.Log().Warning("回收任务 %d 找不到节点", job.TaskModel.ID) | 		util.Log().Warning("Recycle task %d cannot found node.", job.TaskModel.ID) | ||||||
| 		job.SetErrorMsg("从机节点不可用", nil) | 		job.SetErrorMsg("Invalid slave node.", nil) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	err = node.GetAria2Instance().DeleteTempFile(download) | 	err = node.GetAria2Instance().DeleteTempFile(download) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		util.Log().Warning("无法删除中转临时目录[%s], %s", download.Parent, err) | 		util.Log().Warning("Failed to delete transfer temp folder %q: %s", download.Parent, err) | ||||||
| 		job.SetErrorMsg("文件回收失败", err) | 		job.SetErrorMsg("Failed to recycle files.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -69,7 +69,7 @@ func (job *TransferTask) SetErrorMsg(msg string, err error) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err := cluster.DefaultController.SendNotification(job.MasterID, job.Req.Hash(job.MasterID), notifyMsg); err != nil { | 	if err := cluster.DefaultController.SendNotification(job.MasterID, job.Req.Hash(job.MasterID), notifyMsg); err != nil { | ||||||
| 		util.Log().Warning("无法发送转存失败通知到从机, %s", err) | 		util.Log().Warning("Failed to send transfer failure notification to master node: %s", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -82,26 +82,26 @@ func (job *TransferTask) GetError() *task.JobError { | |||||||
| func (job *TransferTask) Do() { | func (job *TransferTask) Do() { | ||||||
| 	fs, err := filesystem.NewAnonymousFileSystem() | 	fs, err := filesystem.NewAnonymousFileSystem() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("无法初始化匿名文件系统", err) | 		job.SetErrorMsg("Failed to initialize anonymous filesystem.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	fs.Policy = job.Req.Policy | 	fs.Policy = job.Req.Policy | ||||||
| 	if err := fs.DispatchHandler(); err != nil { | 	if err := fs.DispatchHandler(); err != nil { | ||||||
| 		job.SetErrorMsg("无法分发存储策略", err) | 		job.SetErrorMsg("Failed to dispatch policy.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	master, err := cluster.DefaultController.GetMasterInfo(job.MasterID) | 	master, err := cluster.DefaultController.GetMasterInfo(job.MasterID) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("找不到主机节点", err) | 		job.SetErrorMsg("Cannot found master node ID.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	fs.SwitchToShadowHandler(master.Instance, master.URL.String(), master.ID) | 	fs.SwitchToShadowHandler(master.Instance, master.URL.String(), master.ID) | ||||||
| 	file, err := os.Open(util.RelativePath(job.Req.Src)) | 	file, err := os.Open(util.RelativePath(job.Req.Src)) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("无法读取源文件", err) | 		job.SetErrorMsg("Failed to read source file.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -110,7 +110,7 @@ func (job *TransferTask) Do() { | |||||||
| 	// 获取源文件大小 | 	// 获取源文件大小 | ||||||
| 	fi, err := file.Stat() | 	fi, err := file.Stat() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("无法获取源文件大小", err) | 		job.SetErrorMsg("Failed to get source file size.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -122,7 +122,7 @@ func (job *TransferTask) Do() { | |||||||
| 		Size:     uint64(size), | 		Size:     uint64(size), | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		job.SetErrorMsg("文件上传失败", err) | 		job.SetErrorMsg("Upload failed.", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -133,6 +133,6 @@ func (job *TransferTask) Do() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if err := cluster.DefaultController.SendNotification(job.MasterID, job.Req.Hash(job.MasterID), msg); err != nil { | 	if err := cluster.DefaultController.SendNotification(job.MasterID, job.Req.Hash(job.MasterID), msg); err != nil { | ||||||
| 		util.Log().Warning("无法发送转存成功通知到从机, %s", err) | 		util.Log().Warning("Failed to send transfer success notification to master node: %s", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
| @ -109,7 +109,7 @@ func (job *TransferTask) Do() { | |||||||
| 			// 获取从机节点 | 			// 获取从机节点 | ||||||
| 			node := cluster.Default.GetNodeByID(job.TaskProps.NodeID) | 			node := cluster.Default.GetNodeByID(job.TaskProps.NodeID) | ||||||
| 			if node == nil { | 			if node == nil { | ||||||
| 				job.SetErrorMsg("从机节点不可用", nil) | 				job.SetErrorMsg("Invalid slave node.", nil) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			// 切换为从机节点处理上传 | 			// 切换为从机节点处理上传 | ||||||
| @ -127,7 +127,7 @@ func (job *TransferTask) Do() { | |||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			job.SetErrorMsg("文件转存失败", err) | 			job.SetErrorMsg("Failed to transfer file.", err) | ||||||
| 		} else { | 		} else { | ||||||
| 			successCount++ | 			successCount++ | ||||||
| 			job.TaskModel.SetProgress(successCount) | 			job.TaskModel.SetProgress(successCount) | ||||||
|  | |||||||
| @ -16,14 +16,14 @@ type GeneralWorker struct { | |||||||
|  |  | ||||||
| // Do 执行任务 | // Do 执行任务 | ||||||
| func (worker *GeneralWorker) Do(job Job) { | func (worker *GeneralWorker) Do(job Job) { | ||||||
| 	util.Log().Debug("开始执行任务") | 	util.Log().Debug("Start executing task.") | ||||||
| 	job.SetStatus(Processing) | 	job.SetStatus(Processing) | ||||||
|  |  | ||||||
| 	defer func() { | 	defer func() { | ||||||
| 		// 致命错误捕获 | 		// 致命错误捕获 | ||||||
| 		if err := recover(); err != nil { | 		if err := recover(); err != nil { | ||||||
| 			util.Log().Debug("任务执行出错,%s", err) | 			util.Log().Debug("Failed to execute task: %s", err) | ||||||
| 			job.SetError(&JobError{Msg: "致命错误", Error: fmt.Sprintf("%s", err)}) | 			job.SetError(&JobError{Msg: "Fatal error.", Error: fmt.Sprintf("%s", err)}) | ||||||
| 			job.SetStatus(Error) | 			job.SetStatus(Error) | ||||||
| 		} | 		} | ||||||
| 	}() | 	}() | ||||||
| @ -33,12 +33,12 @@ func (worker *GeneralWorker) Do(job Job) { | |||||||
|  |  | ||||||
| 	// 任务执行失败 | 	// 任务执行失败 | ||||||
| 	if err := job.GetError(); err != nil { | 	if err := job.GetError(); err != nil { | ||||||
| 		util.Log().Debug("任务执行出错") | 		util.Log().Debug("Failed to execute task.") | ||||||
| 		job.SetStatus(Error) | 		job.SetStatus(Error) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	util.Log().Debug("任务执行完成") | 	util.Log().Debug("Task finished.") | ||||||
| 	// 执行完成 | 	// 执行完成 | ||||||
| 	job.SetStatus(Complete) | 	job.SetStatus(Complete) | ||||||
| } | } | ||||||
|  | |||||||
| @ -45,7 +45,7 @@ func NewThumbFromFile(file io.Reader, name string) (*Thumb, error) { | |||||||
| 	case "png": | 	case "png": | ||||||
| 		img, err = png.Decode(file) | 		img, err = png.Decode(file) | ||||||
| 	default: | 	default: | ||||||
| 		return nil, errors.New("未知的图像类型") | 		return nil, errors.New("unknown image format") | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | |||||||
| @ -22,7 +22,7 @@ func CreatNestedFile(path string) (*os.File, error) { | |||||||
| 	if !Exists(basePath) { | 	if !Exists(basePath) { | ||||||
| 		err := os.MkdirAll(basePath, 0700) | 		err := os.MkdirAll(basePath, 0700) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			Log().Warning("无法创建目录,%s", err) | 			Log().Warning("Failed to create directory: %s", err) | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -16,10 +16,10 @@ import ( | |||||||
| // InitRouter 初始化路由 | // InitRouter 初始化路由 | ||||||
| func InitRouter() *gin.Engine { | func InitRouter() *gin.Engine { | ||||||
| 	if conf.SystemConfig.Mode == "master" { | 	if conf.SystemConfig.Mode == "master" { | ||||||
| 		util.Log().Info("当前运行模式:Master") | 		util.Log().Info("Current running mode: Master.") | ||||||
| 		return InitMasterRouter() | 		return InitMasterRouter() | ||||||
| 	} | 	} | ||||||
| 	util.Log().Info("当前运行模式:Slave") | 	util.Log().Info("Current running mode: Slave.") | ||||||
| 	return InitSlaveRouter() | 	return InitSlaveRouter() | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -108,7 +108,7 @@ func InitCORS(router *gin.Engine) { | |||||||
|  |  | ||||||
| 	// slave模式下未启动跨域的警告 | 	// slave模式下未启动跨域的警告 | ||||||
| 	if conf.SystemConfig.Mode == "slave" { | 	if conf.SystemConfig.Mode == "slave" { | ||||||
| 		util.Log().Warning("当前作为存储端(Slave)运行,但未启用跨域配置,可能会导致 Master 端无法正常上传文件") | 		util.Log().Warning("You are running Cloudreve as slave node, if you are using slave storage policy, please enable CORS feature in config file, otherwise file cannot be uploaded from Master site.") | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 HFO4
					HFO4