-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
ssonglius11
committed
Jun 21, 2024
1 parent
f59bea2
commit 4004493
Showing
10 changed files
with
724 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,230 @@ | ||
package v1 | ||
|
||
import ( | ||
"github.com/1Panel-dev/1Panel/backend/app/api/v1/helper" | ||
"github.com/1Panel-dev/1Panel/backend/app/dto" | ||
"github.com/1Panel-dev/1Panel/backend/constant" | ||
"github.com/gin-gonic/gin" | ||
) | ||
|
||
// @Tags Clam | ||
// @Summary Create clam | ||
// @Description 创建扫描规则 | ||
// @Accept json | ||
// @Param request body dto.ClamCreate true "request" | ||
// @Success 200 | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam [post] | ||
// @x-panel-log {"bodyKeys":["name","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"创建扫描规则 [name][path]","formatEN":"create clam [name][path]"} | ||
func (b *BaseApi) CreateClam(c *gin.Context) { | ||
var req dto.ClamCreate | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
if err := clamService.Create(req); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
helper.SuccessWithData(c, nil) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Update clam | ||
// @Description 修改扫描规则 | ||
// @Accept json | ||
// @Param request body dto.ClamUpdate true "request" | ||
// @Success 200 | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/update [post] | ||
// @x-panel-log {"bodyKeys":["name","path"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"修改扫描规则 [name][path]","formatEN":"update clam [name][path]"} | ||
func (b *BaseApi) UpdateClam(c *gin.Context) { | ||
var req dto.ClamUpdate | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
if err := clamService.Update(req); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
helper.SuccessWithData(c, nil) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Page clam | ||
// @Description 获取扫描规则列表分页 | ||
// @Accept json | ||
// @Param request body dto.SearchWithPage true "request" | ||
// @Success 200 {object} dto.PageResult | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/search [post] | ||
func (b *BaseApi) SearchClam(c *gin.Context) { | ||
var req dto.SearchWithPage | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
total, list, err := clamService.SearchWithPage(req) | ||
if err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
|
||
helper.SuccessWithData(c, dto.PageResult{ | ||
Items: list, | ||
Total: total, | ||
}) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Load clam base info | ||
// @Description 获取 Clam 基础信息 | ||
// @Accept json | ||
// @Success 200 {object} dto.ClamBaseInfo | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/base [get] | ||
func (b *BaseApi) LoadClamBaseInfo(c *gin.Context) { | ||
info, err := clamService.LoadBaseInfo() | ||
if err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
|
||
helper.SuccessWithData(c, info) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Operate Clam | ||
// @Description 修改 Clam 状态 | ||
// @Accept json | ||
// @Param request body dto.Operate true "request" | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/operate [post] | ||
// @x-panel-log {"bodyKeys":["operation"],"paramKeys":[],"BeforeFunctions":[],"formatZH":"[operation] Clam","formatEN":"[operation] FTP"} | ||
func (b *BaseApi) OperateClam(c *gin.Context) { | ||
var req dto.Operate | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
if err := clamService.Operate(req.Operation); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
|
||
helper.SuccessWithData(c, nil) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Page clam record | ||
// @Description 获取扫描结果列表分页 | ||
// @Accept json | ||
// @Param request body dto.ClamLogSearch true "request" | ||
// @Success 200 {object} dto.PageResult | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/log/search [post] | ||
func (b *BaseApi) SearchClamLog(c *gin.Context) { | ||
var req dto.ClamLogSearch | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
total, list, err := clamService.LoadRecords(req) | ||
if err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
|
||
helper.SuccessWithData(c, dto.PageResult{ | ||
Items: list, | ||
Total: total, | ||
}) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Load clam file | ||
// @Description 获取扫描文件 | ||
// @Accept json | ||
// @Param request body dto.OperationWithName true "request" | ||
// @Success 200 {object} dto.PageResult | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/file/search [post] | ||
func (b *BaseApi) SearchClamFile(c *gin.Context) { | ||
var req dto.OperationWithName | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
content, err := clamService.LoadFile(req) | ||
if err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
|
||
helper.SuccessWithData(c, content) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Update clam file | ||
// @Description 更新病毒扫描配置文件 | ||
// @Accept json | ||
// @Param request body dto.UpdateByNameAndFile true "request" | ||
// @Success 200 | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/file/update [post] | ||
func (b *BaseApi) UpdateFile(c *gin.Context) { | ||
var req dto.UpdateByNameAndFile | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
if err := clamService.UpdateFile(req); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
helper.SuccessWithOutData(c) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Delete clam | ||
// @Description 删除扫描规则 | ||
// @Accept json | ||
// @Param request body dto.BatchDeleteReq true "request" | ||
// @Success 200 | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/del [post] | ||
// @x-panel-log {"bodyKeys":["ids"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"ids","isList":true,"db":"clams","output_column":"name","output_value":"names"}],"formatZH":"删除扫描规则 [names]","formatEN":"delete clam [names]"} | ||
func (b *BaseApi) DeleteClam(c *gin.Context) { | ||
var req dto.BatchDeleteReq | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
if err := clamService.Delete(req.Ids); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
helper.SuccessWithData(c, nil) | ||
} | ||
|
||
// @Tags Clam | ||
// @Summary Handle clam scan | ||
// @Description 执行病毒扫描 | ||
// @Accept json | ||
// @Param request body dto.OperateByID true "request" | ||
// @Success 200 | ||
// @Security ApiKeyAuth | ||
// @Router /toolbox/clam/handle [post] | ||
// @x-panel-log {"bodyKeys":["id"],"paramKeys":[],"BeforeFunctions":[{"input_column":"id","input_value":"id","isList":true,"db":"clams","output_column":"name","output_value":"name"}],"formatZH":"执行病毒扫描 [name]","formatEN":"handle clam scan [name]"} | ||
func (b *BaseApi) HandleClamScan(c *gin.Context) { | ||
var req dto.OperateByID | ||
if err := helper.CheckBindAndValidate(&req, c); err != nil { | ||
return | ||
} | ||
|
||
if err := clamService.HandleOnce(req); err != nil { | ||
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) | ||
return | ||
} | ||
helper.SuccessWithData(c, nil) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
package dto | ||
|
||
import ( | ||
"time" | ||
) | ||
|
||
type ClamBaseInfo struct { | ||
Version string `json:"version"` | ||
IsActive bool `json:"isActive"` | ||
IsExist bool `json:"isExist"` | ||
} | ||
|
||
type ClamInfo struct { | ||
ID uint `json:"id"` | ||
CreatedAt time.Time `json:"createdAt"` | ||
|
||
Name string `json:"name"` | ||
Path string `json:"path"` | ||
LastHandleDate string `json:"lastHandleDate"` | ||
Description string `json:"description"` | ||
} | ||
|
||
type ClamLogSearch struct { | ||
PageInfo | ||
|
||
ClamID uint `json:"clamID"` | ||
StartTime time.Time `json:"startTime"` | ||
EndTime time.Time `json:"endTime"` | ||
Status string `json:"status"` | ||
} | ||
|
||
type ClamLog struct { | ||
Name string `json:"name"` | ||
ScanDate string `json:"scanDate"` | ||
ScanTime string `json:"scanTime"` | ||
InfectedFiles string `json:"infectedFiles"` | ||
Log string `json:"log"` | ||
Status string `json:"status"` | ||
} | ||
|
||
type ClamCreate struct { | ||
Name string `json:"name"` | ||
Path string `json:"path"` | ||
Description string `json:"description"` | ||
} | ||
|
||
type ClamUpdate struct { | ||
ID uint `json:"id"` | ||
|
||
Name string `json:"name"` | ||
Path string `json:"path"` | ||
Description string `json:"description"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package model | ||
|
||
type Clam struct { | ||
BaseModel | ||
|
||
Name string `gorm:"type:varchar(64);not null" json:"name"` | ||
Path string `gorm:"type:varchar(64);not null" json:"path"` | ||
Description string `gorm:"type:varchar(64);not null" json:"description"` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
package repo | ||
|
||
import ( | ||
"github.com/1Panel-dev/1Panel/backend/app/model" | ||
"github.com/1Panel-dev/1Panel/backend/global" | ||
) | ||
|
||
type ClamRepo struct{} | ||
|
||
type IClamRepo interface { | ||
Page(limit, offset int, opts ...DBOption) (int64, []model.Clam, error) | ||
Create(clam *model.Clam) error | ||
Update(id uint, vars map[string]interface{}) error | ||
Delete(opts ...DBOption) error | ||
Get(opts ...DBOption) (model.Clam, error) | ||
} | ||
|
||
func NewIClamRepo() IClamRepo { | ||
return &ClamRepo{} | ||
} | ||
|
||
func (u *ClamRepo) Get(opts ...DBOption) (model.Clam, error) { | ||
var clam model.Clam | ||
db := global.DB | ||
for _, opt := range opts { | ||
db = opt(db) | ||
} | ||
err := db.First(&clam).Error | ||
return clam, err | ||
} | ||
|
||
func (u *ClamRepo) Page(page, size int, opts ...DBOption) (int64, []model.Clam, error) { | ||
var users []model.Clam | ||
db := global.DB.Model(&model.Clam{}) | ||
for _, opt := range opts { | ||
db = opt(db) | ||
} | ||
count := int64(0) | ||
db = db.Count(&count) | ||
err := db.Limit(size).Offset(size * (page - 1)).Find(&users).Error | ||
return count, users, err | ||
} | ||
|
||
func (u *ClamRepo) Create(clam *model.Clam) error { | ||
return global.DB.Create(clam).Error | ||
} | ||
|
||
func (u *ClamRepo) Update(id uint, vars map[string]interface{}) error { | ||
return global.DB.Model(&model.Clam{}).Where("id = ?", id).Updates(vars).Error | ||
} | ||
|
||
func (u *ClamRepo) Delete(opts ...DBOption) error { | ||
db := global.DB | ||
for _, opt := range opts { | ||
db = opt(db) | ||
} | ||
return db.Delete(&model.Clam{}).Error | ||
} |
Oops, something went wrong.