diff --git a/assets b/assets index 02d9320..547078f 160000 --- a/assets +++ b/assets @@ -1 +1 @@ -Subproject commit 02d93206cc5b943c34b5f5ac86c23dd96f5ef603 +Subproject commit 547078fa21bb5ff5109e40097103dd8090bba296 diff --git a/go.mod b/go.mod index 394b77a..988657e 100644 --- a/go.mod +++ b/go.mod @@ -99,6 +99,7 @@ require ( github.com/mattn/go-colorable v0.1.4 // indirect github.com/mattn/go-isatty 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/mitchellh/mapstructure v1.1.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect diff --git a/main.go b/main.go index b691f6e..b813c9e 100644 --- a/main.go +++ b/main.go @@ -35,9 +35,9 @@ var staticZip string var staticFS fs.FS func init() { - flag.StringVar(&confPath, "c", util.RelativePath("conf.ini"), "配置文件路径") - flag.BoolVar(&isEject, "eject", false, "导出内置静态资源") - flag.StringVar(&scriptName, "database-script", "", "运行内置数据库助手脚本") + flag.StringVar(&confPath, "c", util.RelativePath("conf.ini"), "Path to the config file.") + flag.BoolVar(&isEject, "eject", false, "Eject all embedded static files.") + flag.StringVar(&scriptName, "database-script", "", "Name of database util script.") flag.Parse() staticFS = archiver.ArchiveFS{ @@ -71,7 +71,7 @@ func main() { signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGHUP, syscall.SIGQUIT) go func() { sig := <-sigChan - util.Log().Info("收到信号 %s,开始关闭 server", sig) + util.Log().Info("Signal %s received, shutting down server...", sig) ctx := context.Background() if conf.SystemConfig.GracePeriod != 0 { var cancel context.CancelFunc @@ -81,16 +81,16 @@ func main() { err := server.Shutdown(ctx) if err != nil { - util.Log().Error("关闭 server 错误, %s", err) + util.Log().Error("Failed to shutdown server: %s", err) } }() // 如果启用了SSL 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 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 } } @@ -100,23 +100,23 @@ func main() { // delete socket file before listening if _, err := os.Stat(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 } } 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 { - util.Log().Error("无法监听[%s],%s", conf.UnixConfig.Listen, err) + util.Log().Error("Failed to listen to %q: %s", conf.UnixConfig.Listen, err) } return } - util.Log().Info("开始监听 %s", conf.SystemConfig.Listen) + util.Log().Info("Listening to %q", conf.SystemConfig.Listen) server.Addr = conf.SystemConfig.Listen 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) } } diff --git a/pkg/hashid/hash.go b/pkg/hashid/hash.go index 942c953..a236d50 100644 --- a/pkg/hashid/hash.go +++ b/pkg/hashid/hash.go @@ -19,7 +19,7 @@ const ( var ( // ErrTypeNotMatch ID类型不匹配 - ErrTypeNotMatch = errors.New("ID类型不匹配") + ErrTypeNotMatch = errors.New("mismatched ID type.") ) // HashEncode 对给定数据计算HashID diff --git a/pkg/request/request.go b/pkg/request/request.go index 6ee78bc..9a5d860 100644 --- a/pkg/request/request.go +++ b/pkg/request/request.go @@ -179,7 +179,7 @@ func (resp *Response) DecodeResponse() (*serializer.Response, error) { var res serializer.Response err = json.Unmarshal([]byte(respString), &res) if err != nil { - util.Log().Debug("无法解析回调服务端响应:%s", string(respString)) + util.Log().Debug("Failed to parse response: %s", string(respString)) return nil, err } return &res, nil @@ -251,7 +251,7 @@ func (instance NopRSCloser) Seek(offset int64, whence int) (int64, error) { return instance.status.Size, nil } } - return 0, errors.New("未实现") + return 0, errors.New("not implemented") } diff --git a/pkg/serializer/error.go b/pkg/serializer/error.go index b18d6de..326c0d8 100644 --- a/pkg/serializer/error.go +++ b/pkg/serializer/error.go @@ -221,7 +221,7 @@ const ( // DBErr 数据库操作失败 func DBErr(msg string, err error) Response { if msg == "" { - msg = "数据库操作失败" + msg = "Database operation failed." } return Err(CodeDBError, msg, err) } @@ -229,7 +229,7 @@ func DBErr(msg string, err error) Response { // ParamErr 各种参数错误 func ParamErr(msg string, err error) Response { if msg == "" { - msg = "参数错误" + msg = "Invalid parameters." } return Err(CodeParamErr, msg, err) } diff --git a/pkg/serializer/response.go b/pkg/serializer/response.go index 91aae47..ecfaec2 100644 --- a/pkg/serializer/response.go +++ b/pkg/serializer/response.go @@ -19,7 +19,7 @@ func NewResponseWithGobData(data interface{}) Response { var w bytes.Buffer encoder := gob.NewEncoder(&w) 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()} diff --git a/pkg/serializer/user.go b/pkg/serializer/user.go index 2df80bd..68e9940 100644 --- a/pkg/serializer/user.go +++ b/pkg/serializer/user.go @@ -13,7 +13,7 @@ import ( func CheckLogin() Response { return Response{ Code: CodeCheckLogin, - Msg: "未登录", + Msg: "Login required", } } diff --git a/pkg/task/compress.go b/pkg/task/compress.go index 5986e26..5e20a36 100644 --- a/pkg/task/compress.go +++ b/pkg/task/compress.go @@ -69,7 +69,7 @@ func (job *CompressTask) SetError(err *JobError) { func (job *CompressTask) removeZipFile() { if job.zipPath != "" { 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 } - util.Log().Debug("开始压缩文件") + util.Log().Debug("Starting compress file...") job.TaskModel.SetProgress(CompressingProgress) // 创建临时压缩文件 @@ -122,7 +122,7 @@ func (job *CompressTask) Do() { job.zipPath = zipFilePath zipFile.Close() - util.Log().Debug("压缩文件存放至%s,开始上传", zipFilePath) + util.Log().Debug("Compressed file saved to %q, start uploading it...", zipFilePath) job.TaskModel.SetProgress(TransferringProgress) // 上传文件 diff --git a/pkg/task/decompress.go b/pkg/task/decompress.go index 0db2ec5..9c6d88e 100644 --- a/pkg/task/decompress.go +++ b/pkg/task/decompress.go @@ -77,7 +77,7 @@ func (job *DecompressTask) Do() { // 创建文件系统 fs, err := filesystem.NewFileSystem(job.User) if err != nil { - job.SetErrorMsg("无法创建文件系统", err) + job.SetErrorMsg("Failed to create filesystem.", err) return } @@ -85,7 +85,7 @@ func (job *DecompressTask) Do() { err = fs.Decompress(context.Background(), job.TaskProps.Src, job.TaskProps.Dst, job.TaskProps.Encoding) if err != nil { - job.SetErrorMsg("解压缩失败", err) + job.SetErrorMsg("Failed to decompress file.", err) return } diff --git a/pkg/task/errors.go b/pkg/task/errors.go index ad9df0c..f1fca16 100644 --- a/pkg/task/errors.go +++ b/pkg/task/errors.go @@ -4,5 +4,5 @@ import "errors" var ( // ErrUnknownTaskType 未知任务类型 - ErrUnknownTaskType = errors.New("未知任务类型") + ErrUnknownTaskType = errors.New("unknown task type") ) diff --git a/pkg/task/import.go b/pkg/task/import.go index efc32e9..607b4d1 100644 --- a/pkg/task/import.go +++ b/pkg/task/import.go @@ -81,7 +81,7 @@ func (job *ImportTask) Do() { // 查找存储策略 policy, err := model.GetPolicyByID(job.TaskProps.PolicyID) if err != nil { - job.SetErrorMsg("找不到存储策略", err) + job.SetErrorMsg("Policy not exist.", err) return } @@ -96,7 +96,7 @@ func (job *ImportTask) Do() { fs.Policy = &policy if err := fs.DispatchHandler(); err != nil { - job.SetErrorMsg("无法分发存储策略", err) + job.SetErrorMsg("Failed to dispatch policy.", err) return } @@ -110,7 +110,7 @@ func (job *ImportTask) Do() { true) objects, err := fs.Handler.List(ctx, job.TaskProps.Src, job.TaskProps.Recursive) if err != nil { - job.SetErrorMsg("无法列取文件", err) + job.SetErrorMsg("Failed to list files.", err) return } @@ -126,7 +126,7 @@ func (job *ImportTask) Do() { virtualPath := path.Join(job.TaskProps.Dst, object.RelativePath) folder, err := fs.CreateDirectory(coxIgnoreConflict, virtualPath) 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 { pathCache[virtualPath] = folder } @@ -152,7 +152,7 @@ func (job *ImportTask) Do() { } else { folder, err := fs.CreateDirectory(context.Background(), virtualPath) if err != nil { - util.Log().Warning("导入任务无法创建用户目录[%s], %s", + util.Log().Warning("Importing task cannot create user directory %q: %s", virtualPath, err) continue } @@ -163,10 +163,10 @@ func (job *ImportTask) Do() { // 插入文件记录 _, err := fs.AddFile(context.Background(), parentFolder, &fileHeader) if err != nil { - util.Log().Warning("导入任务无法创插入文件[%s], %s", + util.Log().Warning("Importing task cannot insert user file %q: %s", object.RelativePath, err) if err == filesystem.ErrInsufficientCapacity { - job.SetErrorMsg("容量不足", err) + job.SetErrorMsg("Insufficient storage capacity.", err) return } } diff --git a/pkg/task/job.go b/pkg/task/job.go index e9d54d8..d480492 100644 --- a/pkg/task/job.go +++ b/pkg/task/job.go @@ -89,12 +89,12 @@ func Resume(p Pool) { if len(tasks) == 0 { 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++ { job, err := GetJobFromModel(&tasks[i]) if err != nil { - util.Log().Warning("无法恢复任务,%s", err) + util.Log().Warning("Failed to resume task: %s", err) continue } diff --git a/pkg/task/pool.go b/pkg/task/pool.go index 53e94a5..e37f179 100644 --- a/pkg/task/pool.go +++ b/pkg/task/pool.go @@ -44,11 +44,11 @@ func (pool *AsyncPool) freeWorker() { // Submit 开始提交任务 func (pool *AsyncPool) Submit(job Job) { go func() { - util.Log().Debug("等待获取Worker") + util.Log().Debug("Waiting for Worker.") worker := pool.obtainWorker() - util.Log().Debug("获取到Worker") + util.Log().Debug("Worker obtained.") worker.Do(job) - util.Log().Debug("释放Worker") + util.Log().Debug("Worker released.") pool.freeWorker() }() } @@ -60,7 +60,7 @@ func Init() { idleWorker: make(chan int, 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" { Resume(TaskPoll) diff --git a/pkg/task/recycle.go b/pkg/task/recycle.go index 17eaf3c..60cc97f 100644 --- a/pkg/task/recycle.go +++ b/pkg/task/recycle.go @@ -73,21 +73,21 @@ func (job *RecycleTask) GetError() *JobError { func (job *RecycleTask) Do() { download, err := model.GetDownloadByGid(job.TaskProps.DownloadGID, job.User.ID) if err != nil { - util.Log().Warning("回收任务 %d 找不到下载记录", job.TaskModel.ID) - job.SetErrorMsg("无法找到下载任务", err) + util.Log().Warning("Recycle task %d cannot found download record.", job.TaskModel.ID) + job.SetErrorMsg("Cannot found download task.", err) return } nodeID := download.GetNodeID() node := cluster.Default.GetNodeByID(nodeID) if node == nil { - util.Log().Warning("回收任务 %d 找不到节点", job.TaskModel.ID) - job.SetErrorMsg("从机节点不可用", nil) + util.Log().Warning("Recycle task %d cannot found node.", job.TaskModel.ID) + job.SetErrorMsg("Invalid slave node.", nil) return } err = node.GetAria2Instance().DeleteTempFile(download) if err != nil { - util.Log().Warning("无法删除中转临时目录[%s], %s", download.Parent, err) - job.SetErrorMsg("文件回收失败", err) + util.Log().Warning("Failed to delete transfer temp folder %q: %s", download.Parent, err) + job.SetErrorMsg("Failed to recycle files.", err) return } } diff --git a/pkg/task/slavetask/transfer.go b/pkg/task/slavetask/transfer.go index 818028e..bdc5926 100644 --- a/pkg/task/slavetask/transfer.go +++ b/pkg/task/slavetask/transfer.go @@ -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 { - 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() { fs, err := filesystem.NewAnonymousFileSystem() if err != nil { - job.SetErrorMsg("无法初始化匿名文件系统", err) + job.SetErrorMsg("Failed to initialize anonymous filesystem.", err) return } fs.Policy = job.Req.Policy if err := fs.DispatchHandler(); err != nil { - job.SetErrorMsg("无法分发存储策略", err) + job.SetErrorMsg("Failed to dispatch policy.", err) return } master, err := cluster.DefaultController.GetMasterInfo(job.MasterID) if err != nil { - job.SetErrorMsg("找不到主机节点", err) + job.SetErrorMsg("Cannot found master node ID.", err) return } fs.SwitchToShadowHandler(master.Instance, master.URL.String(), master.ID) file, err := os.Open(util.RelativePath(job.Req.Src)) if err != nil { - job.SetErrorMsg("无法读取源文件", err) + job.SetErrorMsg("Failed to read source file.", err) return } @@ -110,7 +110,7 @@ func (job *TransferTask) Do() { // 获取源文件大小 fi, err := file.Stat() if err != nil { - job.SetErrorMsg("无法获取源文件大小", err) + job.SetErrorMsg("Failed to get source file size.", err) return } @@ -122,7 +122,7 @@ func (job *TransferTask) Do() { Size: uint64(size), }) if err != nil { - job.SetErrorMsg("文件上传失败", err) + job.SetErrorMsg("Upload failed.", err) return } @@ -133,6 +133,6 @@ func (job *TransferTask) Do() { } 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) } } diff --git a/pkg/task/tranfer.go b/pkg/task/tranfer.go index f115e80..aee1ea5 100644 --- a/pkg/task/tranfer.go +++ b/pkg/task/tranfer.go @@ -109,7 +109,7 @@ func (job *TransferTask) Do() { // 获取从机节点 node := cluster.Default.GetNodeByID(job.TaskProps.NodeID) if node == nil { - job.SetErrorMsg("从机节点不可用", nil) + job.SetErrorMsg("Invalid slave node.", nil) } // 切换为从机节点处理上传 @@ -127,7 +127,7 @@ func (job *TransferTask) Do() { } if err != nil { - job.SetErrorMsg("文件转存失败", err) + job.SetErrorMsg("Failed to transfer file.", err) } else { successCount++ job.TaskModel.SetProgress(successCount) diff --git a/pkg/task/worker.go b/pkg/task/worker.go index 3e01f17..e40a3b5 100644 --- a/pkg/task/worker.go +++ b/pkg/task/worker.go @@ -16,14 +16,14 @@ type GeneralWorker struct { // Do 执行任务 func (worker *GeneralWorker) Do(job Job) { - util.Log().Debug("开始执行任务") + util.Log().Debug("Start executing task.") job.SetStatus(Processing) defer func() { // 致命错误捕获 if err := recover(); err != nil { - util.Log().Debug("任务执行出错,%s", err) - job.SetError(&JobError{Msg: "致命错误", Error: fmt.Sprintf("%s", err)}) + util.Log().Debug("Failed to execute task: %s", err) + job.SetError(&JobError{Msg: "Fatal error.", Error: fmt.Sprintf("%s", err)}) job.SetStatus(Error) } }() @@ -33,12 +33,12 @@ func (worker *GeneralWorker) Do(job Job) { // 任务执行失败 if err := job.GetError(); err != nil { - util.Log().Debug("任务执行出错") + util.Log().Debug("Failed to execute task.") job.SetStatus(Error) return } - util.Log().Debug("任务执行完成") + util.Log().Debug("Task finished.") // 执行完成 job.SetStatus(Complete) } diff --git a/pkg/thumb/image.go b/pkg/thumb/image.go index 69c73a3..cf851c3 100644 --- a/pkg/thumb/image.go +++ b/pkg/thumb/image.go @@ -45,7 +45,7 @@ func NewThumbFromFile(file io.Reader, name string) (*Thumb, error) { case "png": img, err = png.Decode(file) default: - return nil, errors.New("未知的图像类型") + return nil, errors.New("unknown image format") } if err != nil { return nil, err diff --git a/pkg/util/io.go b/pkg/util/io.go index 25b9dc9..fe3bd9a 100644 --- a/pkg/util/io.go +++ b/pkg/util/io.go @@ -22,7 +22,7 @@ func CreatNestedFile(path string) (*os.File, error) { if !Exists(basePath) { err := os.MkdirAll(basePath, 0700) if err != nil { - Log().Warning("无法创建目录,%s", err) + Log().Warning("Failed to create directory: %s", err) return nil, err } } diff --git a/routers/router.go b/routers/router.go index 0727fe6..07f40e3 100644 --- a/routers/router.go +++ b/routers/router.go @@ -16,10 +16,10 @@ import ( // InitRouter 初始化路由 func InitRouter() *gin.Engine { if conf.SystemConfig.Mode == "master" { - util.Log().Info("当前运行模式:Master") + util.Log().Info("Current running mode: Master.") return InitMasterRouter() } - util.Log().Info("当前运行模式:Slave") + util.Log().Info("Current running mode: Slave.") return InitSlaveRouter() } @@ -108,7 +108,7 @@ func InitCORS(router *gin.Engine) { // 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.") } }