Skip to content

Commit

Permalink
update cron
Browse files Browse the repository at this point in the history
  • Loading branch information
uubulb committed Feb 20, 2025
1 parent bf1af27 commit 5bbbec5
Show file tree
Hide file tree
Showing 23 changed files with 298 additions and 330 deletions.
10 changes: 3 additions & 7 deletions cmd/dashboard/controller/alertrule.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"maps"
"strconv"
"time"

Expand Down Expand Up @@ -167,14 +168,9 @@ func batchDeleteAlertRule(c *gin.Context) (any, error) {

func validateRule(c *gin.Context, r *model.AlertRule) error {
if len(r.Rules) > 0 {
m := singleton.ServerShared.GetList()
for _, rule := range r.Rules {
for s := range rule.Ignore {
if server, ok := m[s]; ok {
if !server.HasPermission(c) {
return singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, maps.Keys(rule.Ignore)) {
return singleton.Localizer.ErrorT("permission denied")
}

if !rule.IsTransferDurationRule() {
Expand Down
53 changes: 15 additions & 38 deletions cmd/dashboard/controller/cron.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"slices"
"strconv"

"github.com/gin-gonic/gin"
Expand All @@ -21,11 +22,10 @@ import (
// @Success 200 {object} model.CommonResponse[[]model.Cron]
// @Router /cron [get]
func listCron(c *gin.Context) ([]*model.Cron, error) {
singleton.CronLock.RLock()
defer singleton.CronLock.RUnlock()
slist := singleton.CronShared.GetSortedList()

var cr []*model.Cron
if err := copier.Copy(&cr, &singleton.CronList); err != nil {
if err := copier.Copy(&cr, &slist); err != nil {
return nil, err
}
return cr, nil
Expand All @@ -50,13 +50,8 @@ func createCron(c *gin.Context) (uint64, error) {
return 0, err
}

m := singleton.ServerShared.GetList()
for _, sid := range cf.Servers {
if server, ok := m[sid]; ok {
if !server.HasPermission(c) {
return 0, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, slices.Values(cf.Servers)) {
return 0, singleton.Localizer.ErrorT("permission denied")
}

cr.UserID = getUid(c)
Expand All @@ -76,7 +71,7 @@ func createCron(c *gin.Context) (uint64, error) {
// 对于计划任务类型,需要更新CronJob
var err error
if cf.TaskType == model.CronTypeCronTask {
if cr.CronJobID, err = singleton.Cron.AddFunc(cr.Scheduler, singleton.CronTrigger(&cr)); err != nil {
if cr.CronJobID, err = singleton.CronShared.AddFunc(cr.Scheduler, singleton.CronTrigger(&cr)); err != nil {
return 0, err
}
}
Expand All @@ -85,8 +80,7 @@ func createCron(c *gin.Context) (uint64, error) {
return 0, newGormError("%v", err)
}

singleton.OnRefreshOrAddCron(&cr)
singleton.UpdateCronList()
singleton.CronShared.Update(&cr)
return cr.ID, nil
}

Expand Down Expand Up @@ -114,13 +108,8 @@ func updateCron(c *gin.Context) (any, error) {
return 0, err
}

m := singleton.ServerShared.GetList()
for _, sid := range cf.Servers {
if server, ok := m[sid]; ok {
if !server.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, slices.Values(cf.Servers)) {
return 0, singleton.Localizer.ErrorT("permission denied")
}

var cr model.Cron
Expand All @@ -147,7 +136,7 @@ func updateCron(c *gin.Context) (any, error) {

// 对于计划任务类型,需要更新CronJob
if cf.TaskType == model.CronTypeCronTask {
if cr.CronJobID, err = singleton.Cron.AddFunc(cr.Scheduler, singleton.CronTrigger(&cr)); err != nil {
if cr.CronJobID, err = singleton.CronShared.AddFunc(cr.Scheduler, singleton.CronTrigger(&cr)); err != nil {
return nil, err
}
}
Expand All @@ -156,8 +145,7 @@ func updateCron(c *gin.Context) (any, error) {
return nil, newGormError("%v", err)
}

singleton.OnRefreshOrAddCron(&cr)
singleton.UpdateCronList()
singleton.CronShared.Update(&cr)
return nil, nil
}

Expand All @@ -179,13 +167,10 @@ func manualTriggerCron(c *gin.Context) (any, error) {
return nil, err
}

singleton.CronLock.RLock()
cr, ok := singleton.Crons[id]
cr, ok := singleton.CronShared.Get(id)
if !ok {
singleton.CronLock.RUnlock()
return nil, singleton.Localizer.ErrorT("task id %d does not exist", id)
}
singleton.CronLock.RUnlock()

if !cr.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
Expand All @@ -212,22 +197,14 @@ func batchDeleteCron(c *gin.Context) (any, error) {
return nil, err
}

singleton.CronLock.RLock()
for _, crID := range cr {
if crn, ok := singleton.Crons[crID]; ok {
if !crn.HasPermission(c) {
singleton.CronLock.RUnlock()
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.CronShared.CheckPermission(c, slices.Values(cr)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
singleton.CronLock.RUnlock()

if err := singleton.DB.Unscoped().Delete(&model.Cron{}, "id in (?)", cr).Error; err != nil {
return nil, newGormError("%v", err)
}

singleton.OnDeleteCron(cr)
singleton.UpdateCronList()
singleton.CronShared.Delete(cr)
return nil, nil
}
10 changes: 3 additions & 7 deletions cmd/dashboard/controller/ddns.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"slices"
"strconv"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -179,13 +180,8 @@ func batchDeleteDDNS(c *gin.Context) (any, error) {
return nil, err
}

m := singleton.DDNSShared.GetList()
for _, pid := range ddnsConfigs {
if p, ok := m[pid]; ok {
if !p.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.DDNSShared.CheckPermission(c, slices.Values(ddnsConfigs)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

if err := singleton.DB.Unscoped().Delete(&model.DDNSProfile{}, "id in (?)", ddnsConfigs).Error; err != nil {
Expand Down
16 changes: 8 additions & 8 deletions cmd/dashboard/controller/nat.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package controller

import (
"slices"
"strconv"

"github.com/gin-gonic/gin"
"github.com/jinzhu/copier"

"github.com/nezhahq/nezha/model"
"github.com/nezhahq/nezha/pkg/utils"
"github.com/nezhahq/nezha/service/singleton"
)

Expand All @@ -23,7 +25,7 @@ import (
func listNAT(c *gin.Context) ([]*model.NAT, error) {
var n []*model.NAT

slist := singleton.NATShared.GetList()
slist := singleton.NATShared.GetSortedList()

if err := copier.Copy(&n, &slist); err != nil {
return nil, err
Expand Down Expand Up @@ -145,13 +147,11 @@ func batchDeleteNAT(c *gin.Context) (any, error) {
return nil, err
}

m := singleton.NATShared.GetList()
for _, id := range n {
if p, ok := m[singleton.NATShared.GetDomain(id)]; ok {
if !p.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.NATShared.CheckPermission(c, utils.ConvertSeq(slices.Values(n),
func(id uint64) string {
return singleton.NATShared.GetDomain(id)
})) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

if err := singleton.DB.Unscoped().Delete(&model.NAT{}, "id in (?)", n).Error; err != nil {
Expand Down
11 changes: 3 additions & 8 deletions cmd/dashboard/controller/notification.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"slices"
"strconv"

"github.com/gin-gonic/gin"
Expand Down Expand Up @@ -157,14 +158,8 @@ func batchDeleteNotification(c *gin.Context) (any, error) {
return nil, err
}

m := singleton.NotificationShared.GetList()
for _, nid := range n {
if ns, ok := m[nid]; ok {
if !ns.HasPermission(c) {
singleton.NotificationsLock.RUnlock()
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.NotificationShared.CheckPermission(c, slices.Values(n)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

err := singleton.DB.Transaction(func(tx *gorm.DB) error {
Expand Down
18 changes: 4 additions & 14 deletions cmd/dashboard/controller/notification_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,8 @@ func createNotificationGroup(c *gin.Context) (uint64, error) {
}
ngf.Notifications = slices.Compact(ngf.Notifications)

m := singleton.NotificationShared.GetList()
for _, nid := range ngf.Notifications {
if n, ok := m[nid]; ok {
if !n.HasPermission(c) {
return 0, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.NotificationShared.CheckPermission(c, slices.Values(ngf.Notifications)) {
return 0, singleton.Localizer.ErrorT("permission denied")
}

uid := getUid(c)
Expand Down Expand Up @@ -142,13 +137,8 @@ func updateNotificationGroup(c *gin.Context) (any, error) {
return nil, err
}

m := singleton.NotificationShared.GetList()
for _, nid := range ngf.Notifications {
if n, ok := m[nid]; ok {
if !n.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.NotificationShared.CheckPermission(c, slices.Values(ngf.Notifications)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

var ngDB model.NotificationGroup
Expand Down
22 changes: 6 additions & 16 deletions cmd/dashboard/controller/server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package controller

import (
"slices"
"strconv"
"sync"
"time"
Expand Down Expand Up @@ -58,13 +59,8 @@ func updateServer(c *gin.Context) (any, error) {
return nil, err
}

m := singleton.DDNSShared.GetList()
for _, pid := range sf.DDNSProfiles {
if p, ok := m[pid]; ok {
if !p.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.DDNSShared.CheckPermission(c, slices.Values(sf.DDNSProfiles)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

var s model.Server
Expand Down Expand Up @@ -125,13 +121,8 @@ func batchDeleteServer(c *gin.Context) (any, error) {
return nil, err
}

slist := singleton.ServerShared.GetList()
for _, sid := range servers {
if s, ok := slist[sid]; ok {
if !s.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, slices.Values(servers)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

err := singleton.DB.Transaction(func(tx *gorm.DB) error {
Expand Down Expand Up @@ -184,9 +175,8 @@ func forceUpdateServer(c *gin.Context) (*model.ServerTaskResponse, error) {

forceUpdateResp := new(model.ServerTaskResponse)

slist := singleton.ServerShared.GetList()
for _, sid := range forceUpdateServers {
server := slist[sid]
server, _ := singleton.ServerShared.Get(sid)
if server != nil && server.TaskStream != nil {
if !server.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
Expand Down
18 changes: 4 additions & 14 deletions cmd/dashboard/controller/server_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,8 @@ func createServerGroup(c *gin.Context) (uint64, error) {
}
sgf.Servers = slices.Compact(sgf.Servers)

m := singleton.ServerShared.GetList()
for _, sid := range sgf.Servers {
if server, ok := m[sid]; ok {
if !server.HasPermission(c) {
return 0, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, slices.Values(sgf.Servers)) {
return 0, singleton.Localizer.ErrorT("permission denied")
}

uid := getUid(c)
Expand Down Expand Up @@ -140,13 +135,8 @@ func updateServerGroup(c *gin.Context) (any, error) {
}
sg.Servers = slices.Compact(sg.Servers)

m := singleton.ServerShared.GetList()
for _, sid := range sg.Servers {
if server, ok := m[sid]; ok {
if !server.HasPermission(c) {
return nil, singleton.Localizer.ErrorT("permission denied")
}
}
if !singleton.ServerShared.CheckPermission(c, slices.Values(sg.Servers)) {
return nil, singleton.Localizer.ErrorT("permission denied")
}

var sgDB model.ServerGroup
Expand Down
Loading

0 comments on commit 5bbbec5

Please sign in to comment.