diff --git a/pkg/aria2/common/common.go b/pkg/aria2/common/common.go index 8f281d8..bfb5fc1 100644 --- a/pkg/aria2/common/common.go +++ b/pkg/aria2/common/common.go @@ -50,9 +50,9 @@ const ( var ( // ErrNotEnabled 功能未开启错误 - ErrNotEnabled = serializer.NewError(serializer.CodeNoPermissionErr, "离线下载功能未开启", nil) + ErrNotEnabled = serializer.NewError(serializer.CodeFeatureNotEnabled, "", nil) // ErrUserNotFound 未找到下载任务创建者 - ErrUserNotFound = serializer.NewError(serializer.CodeNotFound, "无法找到任务创建者", nil) + ErrUserNotFound = serializer.NewError(serializer.CodeUserNotFound, "", nil) ) // DummyAria2 未开启Aria2功能时使用的默认处理器 diff --git a/pkg/aria2/monitor/monitor.go b/pkg/aria2/monitor/monitor.go index a515b66..32b86d8 100644 --- a/pkg/aria2/monitor/monitor.go +++ b/pkg/aria2/monitor/monitor.go @@ -45,7 +45,7 @@ func NewMonitor(task *model.Download, pool cluster.Pool, mqClient mq.MQ) { monitor.notifier = mqClient.Subscribe(monitor.Task.GID, 0) } else { - monitor.setErrorStatus(errors.New("节点不可用")) + monitor.setErrorStatus(errors.New("node not avaliable")) } } @@ -77,11 +77,12 @@ func (monitor *Monitor) Update() bool { if err != nil { monitor.retried++ - util.Log().Warning("无法获取下载任务[%s]的状态,%s", monitor.Task.GID, err) + util.Log().Warning("Cannot get status of download task %q: %s", monitor.Task.GID, err) // 十次重试后认定为任务失败 if monitor.retried > MAX_RETRY { - util.Log().Warning("无法获取下载任务[%s]的状态,超过最大重试次数限制,%s", monitor.Task.GID, err) + util.Log().Warning("Cannot get status of download task %q,exceed maximum retry threshold: %s", + monitor.Task.GID, err) monitor.setErrorStatus(err) monitor.RemoveTempFolder() return true @@ -93,7 +94,7 @@ func (monitor *Monitor) Update() bool { // 磁力链下载需要跟随 if len(status.FollowedBy) > 0 { - util.Log().Debug("离线下载[%s]重定向至[%s]", monitor.Task.GID, status.FollowedBy[0]) + util.Log().Debug("Redirected download task from %q to %q.", monitor.Task.GID, status.FollowedBy[0]) monitor.Task.GID = status.FollowedBy[0] monitor.Task.Save() return false @@ -101,13 +102,13 @@ func (monitor *Monitor) Update() bool { // 更新任务信息 if err := monitor.UpdateTaskInfo(status); err != nil { - util.Log().Warning("无法更新下载任务[%s]的任务信息[%s],", monitor.Task.GID, err) + util.Log().Warning("Failed to update status of download task %q: %s", monitor.Task.GID, err) monitor.setErrorStatus(err) monitor.RemoveTempFolder() return true } - util.Log().Debug("离线下载[%s]更新状态[%s]", status.Gid, status.Status) + util.Log().Debug("Remote download %q status updated to %q.", status.Gid, status.Status) switch status.Status { case "complete": @@ -122,7 +123,7 @@ func (monitor *Monitor) Update() bool { monitor.RemoveTempFolder() return true default: - util.Log().Warning("下载任务[%s]返回未知状态信息[%s],", monitor.Task.GID, status.Status) + util.Log().Warning("Download task %q returns unknown status %q.", monitor.Task.GID, status.Status) return true } } diff --git a/pkg/auth/auth.go b/pkg/auth/auth.go index 6b009d3..32a7e91 100644 --- a/pkg/auth/auth.go +++ b/pkg/auth/auth.go @@ -17,10 +17,10 @@ import ( ) var ( - ErrAuthFailed = serializer.NewError(serializer.CodeNoPermissionErr, "鉴权失败", nil) + ErrAuthFailed = serializer.NewError(serializer.CodeInvalidSign, "invalid sign", nil) ErrAuthHeaderMissing = serializer.NewError(serializer.CodeNoPermissionErr, "authorization header is missing", nil) ErrExpiresMissing = serializer.NewError(serializer.CodeNoPermissionErr, "expire timestamp is missing", nil) - ErrExpired = serializer.NewError(serializer.CodeSignExpired, "签名已过期", nil) + ErrExpired = serializer.NewError(serializer.CodeSignExpired, "signature expired", nil) ) const CrHeaderPrefix = "X-Cr-" @@ -136,7 +136,7 @@ func Init() { } else { secretKey = conf.SlaveConfig.Secret if secretKey == "" { - util.Log().Panic("未指定 SlaveSecret,请前往配置文件中指定") + util.Log().Panic("SlaveSecret is not set, please specify it in config file.") } } General = HMACAuth{ diff --git a/pkg/cache/driver.go b/pkg/cache/driver.go index 74c1219..5a919a7 100644 --- a/pkg/cache/driver.go +++ b/pkg/cache/driver.go @@ -24,7 +24,7 @@ func Init(isSlave bool) { if isSlave { err := Store.Sets(conf.OptionOverwrite, "setting_") if err != nil { - util.Log().Warning("无法覆盖数据库设置: %s", err) + util.Log().Warning("Failed to overwrite database setting: %s", err) } } } diff --git a/pkg/cache/memo.go b/pkg/cache/memo.go index 8b7522b..0c55ba5 100644 --- a/pkg/cache/memo.go +++ b/pkg/cache/memo.go @@ -53,7 +53,7 @@ func (store *MemoStore) GarbageCollect() { store.Store.Range(func(key, value interface{}) bool { if item, ok := value.(itemWithTTL); ok { if item.expires > 0 && item.expires < time.Now().Unix() { - util.Log().Debug("回收垃圾[%s]", key.(string)) + util.Log().Debug("Cache %q is garbage collected.", key.(string)) store.Store.Delete(key) } } diff --git a/pkg/cache/redis.go b/pkg/cache/redis.go index c2b9bb7..b9f7254 100644 --- a/pkg/cache/redis.go +++ b/pkg/cache/redis.go @@ -66,7 +66,7 @@ func NewRedisStore(size int, network, address, password, database string) *Redis redis.DialPassword(password), ) if err != nil { - util.Log().Warning("无法创建Redis连接:%s", err) + util.Log().Warning("Failed to create Redis connection: %s", err) return nil, err } return c, nil diff --git a/pkg/cluster/errors.go b/pkg/cluster/errors.go index 84b2ad8..acd21d3 100644 --- a/pkg/cluster/errors.go +++ b/pkg/cluster/errors.go @@ -8,5 +8,5 @@ import ( var ( ErrFeatureNotExist = errors.New("No nodes in nodepool match the feature specificed") ErrIlegalPath = errors.New("path out of boundary of setting temp folder") - ErrMasterNotFound = serializer.NewError(serializer.CodeMasterNotFound, "未知的主机节点", nil) + ErrMasterNotFound = serializer.NewError(serializer.CodeMasterNotFound, "Unknown master node id", nil) ) diff --git a/pkg/cluster/master.go b/pkg/cluster/master.go index 885e99a..9c3dc61 100644 --- a/pkg/cluster/master.go +++ b/pkg/cluster/master.go @@ -161,7 +161,7 @@ func (r *rpcService) Init() error { // 解析RPC服务地址 server, err := url.Parse(r.parent.Model.Aria2OptionsSerialized.Server) if err != nil { - util.Log().Warning("无法解析主机 Aria2 RPC 服务地址,%s", err) + util.Log().Warning("Failed to parse Aria2 RPC server URL: %s", err) return err } server.Path = "/jsonrpc" @@ -171,7 +171,7 @@ func (r *rpcService) Init() error { if r.parent.Model.Aria2OptionsSerialized.Options != "" { err = json.Unmarshal([]byte(r.parent.Model.Aria2OptionsSerialized.Options), &globalOptions) if err != nil { - util.Log().Warning("无法解析主机 Aria2 配置,%s", err) + util.Log().Warning("Failed to parse aria2 options: %s", err) return err } } @@ -221,7 +221,7 @@ func (r *rpcService) Status(task *model.Download) (rpc.StatusInfo, error) { res, err := r.Caller.TellStatus(task.GID) if err != nil { // 失败后重试 - util.Log().Debug("无法获取离线下载状态,%s,稍后重试", err) + util.Log().Debug("Failed to get download task status, please retry later: %s", err) time.Sleep(r.retryDuration) res, err = r.Caller.TellStatus(task.GID) } @@ -233,7 +233,7 @@ func (r *rpcService) Cancel(task *model.Download) error { // 取消下载任务 _, err := r.Caller.Remove(task.GID) if err != nil { - util.Log().Warning("无法取消离线下载任务[%s], %s", task.GID, err) + util.Log().Warning("Failed to cancel task %q: %s", task.GID, err) } return err @@ -264,7 +264,7 @@ func (s *rpcService) DeleteTempFile(task *model.Download) error { time.Sleep(d) err := os.RemoveAll(src) if err != nil { - util.Log().Warning("无法删除离线下载临时目录[%s], %s", src, err) + util.Log().Warning("Failed to delete temp download folder: %q: %s", src, err) } }(s.deletePaddingDuration, task.Parent) diff --git a/pkg/cluster/pool.go b/pkg/cluster/pool.go index 710b0a3..d6704b6 100644 --- a/pkg/cluster/pool.go +++ b/pkg/cluster/pool.go @@ -42,7 +42,7 @@ func Init() { Default = &NodePool{} Default.Init() if err := Default.initFromDB(); err != nil { - util.Log().Warning("节点池初始化失败, %s", err) + util.Log().Warning("Failed to initialize node pool: %s", err) } } @@ -83,7 +83,7 @@ func (pool *NodePool) GetNodeByID(id uint) Node { } func (pool *NodePool) nodeStatusChange(isActive bool, id uint) { - util.Log().Debug("从机节点 [ID=%d] 状态变更 [Active=%t]", id, isActive) + util.Log().Debug("Slave node [ID=%d] status changed to [Active=%t].", id, isActive) var node Node pool.lock.Lock() if n, ok := pool.inactive[id]; ok { diff --git a/pkg/cluster/slave.go b/pkg/cluster/slave.go index 79118b2..94d286b 100644 --- a/pkg/cluster/slave.go +++ b/pkg/cluster/slave.go @@ -172,7 +172,7 @@ func (node *SlaveNode) StartPingLoop() { recoverDuration := time.Duration(model.GetIntSetting("slave_recover_interval", 600)) * time.Second pingTicker := time.Duration(0) - util.Log().Debug("从机节点 [%s] 启动心跳循环", node.Model.Name) + util.Log().Debug("Slave node %q heartbeat loop started.", node.Model.Name) retry := 0 recoverMode := false isFirstLoop := true @@ -185,39 +185,39 @@ loop: pingTicker = tickDuration } - util.Log().Debug("从机节点 [%s] 发送Ping", node.Model.Name) + util.Log().Debug("Slave node %q send ping.", node.Model.Name) res, err := node.Ping(node.getHeartbeatContent(isFirstLoop)) isFirstLoop = false if err != nil { - util.Log().Debug("Ping从机节点 [%s] 时发生错误: %s", node.Model.Name, err) + util.Log().Debug("Error while ping slave node %q: %s", node.Model.Name, err) retry++ if retry >= model.GetIntSetting("slave_node_retry", 3) { - util.Log().Debug("从机节点 [%s] Ping 重试已达到最大限制,将从机节点标记为不可用", node.Model.Name) + util.Log().Debug("Retry threshold for pinging slave node %q exceeded, mark it as offline.", node.Model.Name) node.changeStatus(false) if !recoverMode { // 启动恢复监控循环 - util.Log().Debug("从机节点 [%s] 进入恢复模式", node.Model.Name) + util.Log().Debug("Slave node %q entered recovery mode.", node.Model.Name) pingTicker = recoverDuration recoverMode = true } } } else { if recoverMode { - util.Log().Debug("从机节点 [%s] 复活", node.Model.Name) + util.Log().Debug("Slave node %q recovered.", node.Model.Name) pingTicker = tickDuration recoverMode = false isFirstLoop = true } - util.Log().Debug("从机节点 [%s] 状态: %s", node.Model.Name, res) + util.Log().Debug("Status of slave node %q: %s", node.Model.Name, res) node.changeStatus(true) retry = 0 } case <-node.close: - util.Log().Debug("从机节点 [%s] 收到关闭信号", node.Model.Name) + util.Log().Debug("Slave node %q received shutdown signal.", node.Model.Name) break loop } } @@ -421,7 +421,7 @@ func RemoteCallback(url string, body serializer.UploadCallback) error { Data: body, }) if err != nil { - return serializer.NewError(serializer.CodeCallbackError, "无法编码回调正文", err) + return serializer.NewError(serializer.CodeCallbackError, "Failed to encode callback content", err) } resp := request.GeneralClient.Request( @@ -433,13 +433,13 @@ func RemoteCallback(url string, body serializer.UploadCallback) error { ) if resp.Err != nil { - return serializer.NewError(serializer.CodeCallbackError, "从机无法发起回调请求", resp.Err) + return serializer.NewError(serializer.CodeCallbackError, "Slave cannot send callback request", resp.Err) } // 解析回调服务端响应 response, err := resp.DecodeResponse() if err != nil { - msg := fmt.Sprintf("从机无法解析主机返回的响应 (StatusCode=%d)", resp.Response.StatusCode) + msg := fmt.Sprintf("Slave cannot parse callback response from master (StatusCode=%d).", resp.Response.StatusCode) return serializer.NewError(serializer.CodeCallbackError, msg, err) } diff --git a/pkg/serializer/error.go b/pkg/serializer/error.go index 118aa81..b18d6de 100644 --- a/pkg/serializer/error.go +++ b/pkg/serializer/error.go @@ -190,6 +190,8 @@ const ( CodeIncorrectPassword = 40069 // 分享无法预览 CodeDisabledSharePreview = 40070 + // 签名无效 + CodeInvalidSign = 40071 // CodeDBError 数据库操作失败 CodeDBError = 50001 // CodeEncryptError 加密失败