mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-21 22:30:46 +08:00
feat: support deleting logs based on filtering results (#35)
* feat: support deleting logs based on filtering results * fix(record): fix the problem of wrong number of parameters when outputting delete logs
This commit is contained in:
Vendored
+1
-1
@@ -1 +1 @@
|
|||||||
.custom-icons-list[data-v-05a908c2] .anticon{margin-right:6px}body[data-v-1bc6d13e],html[data-v-1bc6d13e]{height:100%;margin:0}.fade-transform-enter-active[data-v-1bc6d13e],.fade-transform-leave-active[data-v-1bc6d13e]{transition:all .3s;opacity:0}.fade-transform-enter[data-v-1bc6d13e],.fade-transform-leave[data-v-1bc6d13e]{opacity:0}.fade-transform-enter-to[data-v-1bc6d13e]{opacity:0}.ant-menu-item>span>a[data-v-1bc6d13e]{color:hsla(0,0%,100%,.65)}.ant-menu-item-selected>span>a[data-v-1bc6d13e]{color:#fff}#app[data-v-1bc6d13e]{min-height:100%}#app .trigger[data-v-1bc6d13e]{font-size:18px;line-height:64px;padding:0 24px;cursor:pointer;transition:color .3s}#app .trigger[data-v-1bc6d13e]:hover{color:#1890ff}#app .logo[data-v-1bc6d13e]{height:32px;background:#0a1d2d;margin:16px;text-align:center;font-size:1.2rem;color:#fff;padding-bottom:5px;border-bottom:2px solid #b6befa}.copyright[data-v-1bc6d13e]{color:#888;text-align:right;margin-right:1rem}
|
.custom-icons-list[data-v-05a908c2] .anticon{margin-right:6px}body[data-v-3b44ba10],html[data-v-3b44ba10]{height:100%;margin:0}.fade-transform-enter-active[data-v-3b44ba10],.fade-transform-leave-active[data-v-3b44ba10]{transition:all .3s;opacity:0}.fade-transform-enter[data-v-3b44ba10],.fade-transform-leave[data-v-3b44ba10]{opacity:0}.fade-transform-enter-to[data-v-3b44ba10]{opacity:0}.ant-menu-item>span>a[data-v-3b44ba10]{color:hsla(0,0%,100%,.65)}.ant-menu-item-selected>span>a[data-v-3b44ba10]{color:#fff}#app[data-v-3b44ba10]{min-height:100%}#app .trigger[data-v-3b44ba10]{font-size:18px;line-height:64px;padding:0 24px;cursor:pointer;transition:color .3s}#app .trigger[data-v-3b44ba10]:hover{color:#1890ff}#app .logo[data-v-3b44ba10]{height:32px;background:#0a1d2d;margin:16px;text-align:center;font-size:1.2rem;color:#fff;padding-bottom:5px;border-bottom:2px solid #b6befa}.copyright[data-v-3b44ba10]{color:#888;text-align:right;margin-right:1rem}
|
||||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
Vendored
+1
-1
File diff suppressed because one or more lines are too long
+27
-4
@@ -62,7 +62,7 @@
|
|||||||
/>
|
/>
|
||||||
<div v-if="isLogMode" style="float: right; min-width:60% ;padding: 12px 0;line-height: 24px;">
|
<div v-if="isLogMode" style="float: right; min-width:60% ;padding: 12px 0;line-height: 24px;">
|
||||||
<a-row :gutter="24" type="flex">
|
<a-row :gutter="24" type="flex">
|
||||||
<a-col :span="21">
|
<a-col :span="20">
|
||||||
<a-form-model v-show="showSettings" ref="settings" layout="inline">
|
<a-form-model v-show="showSettings" ref="settings" layout="inline">
|
||||||
<a-row :gutter="24" type="flex">
|
<a-row :gutter="24" type="flex">
|
||||||
<a-col :span="9" :offset="2">
|
<a-col :span="9" :offset="2">
|
||||||
@@ -80,9 +80,23 @@
|
|||||||
</a-row>
|
</a-row>
|
||||||
</a-form-model>
|
</a-form-model>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="3">
|
<a-col :span="4">
|
||||||
|
<a-popconfirm
|
||||||
|
:title="showLogNum?`This will delete all logs in the current filtered state, a total of ${this.$refs.content.pagination.total}, are you sure?`:'This will delete all logs in the current filtered state, a total of 0, are you sure?'"
|
||||||
|
ok-text="Yes"
|
||||||
|
cancel-text="No"
|
||||||
|
@visibleChange="showLogNum?delayChangeShowLogNum():showLogNum=!showLogNum"
|
||||||
|
@confirm="deleteLogs"
|
||||||
|
>
|
||||||
|
<a-icon slot="icon" type="question-circle-o" style="color: red"/>
|
||||||
|
<a-icon
|
||||||
|
:style="'font-size: 18px;padding: 12px 0;'"
|
||||||
|
type="delete"
|
||||||
|
@click="()=>{}"
|
||||||
|
/>
|
||||||
|
</a-popconfirm>
|
||||||
<a-icon
|
<a-icon
|
||||||
:style="'font-size: 18px;padding: 12px 0;'+(showSettings?'color: #1b90ff;':'')"
|
:style="'font-size: 18px;padding:12px 15px;'+(showSettings?'color: #1b90ff;':'')"
|
||||||
type="setting"
|
type="setting"
|
||||||
@click="showSettings = !showSettings"
|
@click="showSettings = !showSettings"
|
||||||
/>
|
/>
|
||||||
@@ -123,6 +137,7 @@ export default {
|
|||||||
pageSize: store.pageSize,
|
pageSize: store.pageSize,
|
||||||
collapsed: false,
|
collapsed: false,
|
||||||
showSettings: false,
|
showSettings: false,
|
||||||
|
showLogNum: false,
|
||||||
openKeys: [],
|
openKeys: [],
|
||||||
version: "",
|
version: "",
|
||||||
};
|
};
|
||||||
@@ -130,7 +145,7 @@ export default {
|
|||||||
computed: {
|
computed: {
|
||||||
isLogMode() {
|
isLogMode() {
|
||||||
return this.$route.path.includes('logs')
|
return this.$route.path.includes('logs')
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
timing() {
|
timing() {
|
||||||
@@ -145,6 +160,14 @@ export default {
|
|||||||
getVersion().then(res => {
|
getVersion().then(res => {
|
||||||
this.version = res.data.result
|
this.version = res.data.result
|
||||||
})
|
})
|
||||||
|
},
|
||||||
|
deleteLogs() {
|
||||||
|
this.$refs.content.delete()
|
||||||
|
},
|
||||||
|
delayChangeShowLogNum() {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.showLogNum = !this.showLogNum
|
||||||
|
}, 1000)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
|||||||
@@ -9,6 +9,15 @@ export function getHttpRecord(params) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteHttpRecord(params) {
|
||||||
|
return request({
|
||||||
|
url: '/record/http',
|
||||||
|
params: params,
|
||||||
|
method: 'delete',
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getDnsRecord(params) {
|
export function getDnsRecord(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/record/dns',
|
url: '/record/dns',
|
||||||
@@ -17,6 +26,14 @@ export function getDnsRecord(params) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteDnsRecord(params) {
|
||||||
|
return request({
|
||||||
|
url: '/record/dns',
|
||||||
|
params: params,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getMysqlRecord(params) {
|
export function getMysqlRecord(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/record/mysql',
|
url: '/record/mysql',
|
||||||
@@ -25,6 +42,14 @@ export function getMysqlRecord(params) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteMysqlRecord(params) {
|
||||||
|
return request({
|
||||||
|
url: '/record/mysql',
|
||||||
|
params: params,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getRmiRecord(params) {
|
export function getRmiRecord(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/record/rmi',
|
url: '/record/rmi',
|
||||||
@@ -33,10 +58,26 @@ export function getRmiRecord(params) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deleteRmiRecord(params) {
|
||||||
|
return request({
|
||||||
|
url: '/record/rmi',
|
||||||
|
params: params,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function getFtpRecord(params) {
|
export function getFtpRecord(params) {
|
||||||
return request({
|
return request({
|
||||||
url: '/record/ftp',
|
url: '/record/ftp',
|
||||||
params: params,
|
params: params,
|
||||||
method: 'get'
|
method: 'get'
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteFtpRecord(params) {
|
||||||
|
return request({
|
||||||
|
url: '/record/ftp',
|
||||||
|
params: params,
|
||||||
|
method: 'delete'
|
||||||
|
})
|
||||||
}
|
}
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import {getDnsRecord} from '@/api/record'
|
import {deleteDnsRecord, getDnsRecord} from '@/api/record'
|
||||||
import {store} from '@/main'
|
import {store} from '@/main'
|
||||||
import FilterDropdown from '@/components/FilterDropdown'
|
import FilterDropdown from '@/components/FilterDropdown'
|
||||||
|
|
||||||
@@ -145,6 +145,21 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
delete: function () {
|
||||||
|
let params = {
|
||||||
|
...this.filters,
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
deleteDnsRecord(params).then(() => {
|
||||||
|
this.$message.success('Deleted successfully')
|
||||||
|
this.filters = {}
|
||||||
|
this.fetch()
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.response.status !== 403) {
|
||||||
|
this.$message.error('Failed to delete: ' + e.response.data.error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import {getFtpRecord} from '@/api/record'
|
import {deleteFtpRecord, getFtpRecord} from '@/api/record'
|
||||||
import {store} from '@/main'
|
import {store} from '@/main'
|
||||||
import FilterDropdown from '@/components/FilterDropdown'
|
import FilterDropdown from '@/components/FilterDropdown'
|
||||||
|
|
||||||
@@ -234,6 +234,21 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
delete: function () {
|
||||||
|
let params = {
|
||||||
|
...this.filters,
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
deleteFtpRecord(params).then(() => {
|
||||||
|
this.$message.success('Deleted successfully')
|
||||||
|
this.filters = {}
|
||||||
|
this.fetch()
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.response.status !== 403) {
|
||||||
|
this.$message.error('Failed to delete: ' + e.response.data.error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import {getHttpRecord} from '@/api/record'
|
import {getHttpRecord, deleteHttpRecord} from '@/api/record'
|
||||||
import {store} from '@/main'
|
import {store} from '@/main'
|
||||||
import FilterDropdown from '@/components/FilterDropdown'
|
import FilterDropdown from '@/components/FilterDropdown'
|
||||||
|
|
||||||
@@ -179,6 +179,21 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
delete: function () {
|
||||||
|
let params = {
|
||||||
|
...this.filters,
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
deleteHttpRecord(params).then(() => {
|
||||||
|
this.$message.success('Deleted successfully')
|
||||||
|
this.filters = {}
|
||||||
|
this.fetch()
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.response.status !== 403) {
|
||||||
|
this.$message.error('Failed to delete: ' + e.response.data.error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import {getMysqlRecord} from '@/api/record'
|
import {deleteMysqlRecord, getMysqlRecord} from '@/api/record'
|
||||||
import {store} from '@/main'
|
import {store} from '@/main'
|
||||||
import FilterDropdown from '@/components/FilterDropdown'
|
import FilterDropdown from '@/components/FilterDropdown'
|
||||||
|
|
||||||
@@ -231,6 +231,21 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
delete: function () {
|
||||||
|
let params = {
|
||||||
|
...this.filters,
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
deleteMysqlRecord(params).then(() => {
|
||||||
|
this.$message.success('Deleted successfully')
|
||||||
|
this.filters = {}
|
||||||
|
this.fetch()
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.response.status !== 403) {
|
||||||
|
this.$message.error('Failed to delete: ' + e.response.data.error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
</style>
|
</style>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import {getRmiRecord} from '@/api/record'
|
import {deleteRmiRecord, getRmiRecord} from '@/api/record'
|
||||||
import {store} from '@/main'
|
import {store} from '@/main'
|
||||||
import FilterDropdown from '@/components/FilterDropdown'
|
import FilterDropdown from '@/components/FilterDropdown'
|
||||||
|
|
||||||
@@ -110,7 +110,8 @@ export default {
|
|||||||
onShowSizeChange: (current, size) => {
|
onShowSizeChange: (current, size) => {
|
||||||
store.pageSize = size
|
store.pageSize = size
|
||||||
}
|
}
|
||||||
}, filters: {},
|
},
|
||||||
|
filters: {},
|
||||||
order: "desc",
|
order: "desc",
|
||||||
loading: false,
|
loading: false,
|
||||||
columns,
|
columns,
|
||||||
@@ -146,6 +147,21 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
delete: function () {
|
||||||
|
let params = {
|
||||||
|
...this.filters,
|
||||||
|
}
|
||||||
|
this.loading = true;
|
||||||
|
deleteRmiRecord(params).then(() => {
|
||||||
|
this.$message.success('Deleted successfully')
|
||||||
|
this.filters = {}
|
||||||
|
this.fetch()
|
||||||
|
}).catch(e => {
|
||||||
|
if (e.response.status !== 403) {
|
||||||
|
this.$message.error('Failed to delete: ' + e.response.data.error)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.fetch();
|
this.fetch();
|
||||||
|
|||||||
+11
-3
@@ -2,11 +2,19 @@ package database
|
|||||||
|
|
||||||
import "gorm.io/gorm"
|
import "gorm.io/gorm"
|
||||||
|
|
||||||
var DB *gorm.DB
|
var (
|
||||||
|
DB *gorm.DB
|
||||||
|
Driver DriverType
|
||||||
|
)
|
||||||
|
|
||||||
func InitDB(driver, dsn string) (err error) {
|
type DriverType = string
|
||||||
|
|
||||||
|
const Sqlite = "sqlite"
|
||||||
|
|
||||||
|
func InitDB(driver DriverType, dsn string) (err error) {
|
||||||
|
Driver = driver
|
||||||
switch driver {
|
switch driver {
|
||||||
case "sqlite":
|
case Sqlite:
|
||||||
DB, err = NewSqlite3(dsn)
|
DB, err = NewSqlite3(dsn)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|||||||
+29
-1
@@ -1,6 +1,7 @@
|
|||||||
package dns
|
package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -8,6 +9,8 @@ import (
|
|||||||
"github.com/li4n0/revsuit/internal/database"
|
"github.com/li4n0/revsuit/internal/database"
|
||||||
"github.com/li4n0/revsuit/internal/notice"
|
"github.com/li4n0/revsuit/internal/notice"
|
||||||
"github.com/li4n0/revsuit/internal/record"
|
"github.com/li4n0/revsuit/internal/record"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ record.Record = (*Record)(nil)
|
var _ record.Record = (*Record)(nil)
|
||||||
@@ -41,7 +44,7 @@ func newRecord(rule *Rule, flag, domain, remoteIp, ipArea string) (r *Record, er
|
|||||||
return r, database.DB.Create(r).Error
|
return r, database.DB.Create(r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRecords(c *gin.Context) {
|
func Records(c *gin.Context) {
|
||||||
var (
|
var (
|
||||||
dnsRecord Record
|
dnsRecord Record
|
||||||
res []Record
|
res []Record
|
||||||
@@ -80,6 +83,31 @@ func ListRecords(c *gin.Context) {
|
|||||||
db.Where("rule_name = ?", dnsRecord.RuleName)
|
db.Where("rule_name = ?", dnsRecord.RuleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delete records
|
||||||
|
if c.Request.Method == http.MethodDelete {
|
||||||
|
if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&res).Error; err != nil {
|
||||||
|
c.JSON(400, gin.H{
|
||||||
|
"status": "failed",
|
||||||
|
"error": err.Error(),
|
||||||
|
"data": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if database.Driver == database.Sqlite {
|
||||||
|
db.Exec("VACUUM")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "succeed",
|
||||||
|
"error": nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
log.Info("%d dns records deleted by %s", db.RowsAffected, c.Request.RemoteAddr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//List records
|
||||||
page, err := strconv.Atoi(c.Query("page"))
|
page, err := strconv.Atoi(c.Query("page"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(400, gin.H{
|
c.JSON(400, gin.H{
|
||||||
|
|||||||
+28
-1
@@ -1,6 +1,7 @@
|
|||||||
package ftp
|
package ftp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -10,6 +11,7 @@ import (
|
|||||||
"github.com/li4n0/revsuit/internal/ipinfo"
|
"github.com/li4n0/revsuit/internal/ipinfo"
|
||||||
"github.com/li4n0/revsuit/internal/notice"
|
"github.com/li4n0/revsuit/internal/notice"
|
||||||
"github.com/li4n0/revsuit/internal/record"
|
"github.com/li4n0/revsuit/internal/record"
|
||||||
|
"gorm.io/gorm"
|
||||||
log "unknwon.dev/clog/v2"
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -53,7 +55,7 @@ func NewRecord(rule *Rule, flag, user, password, method, path, ip, area string,
|
|||||||
return r, database.DB.Create(r).Error
|
return r, database.DB.Create(r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRecords(c *gin.Context) {
|
func Records(c *gin.Context) {
|
||||||
var (
|
var (
|
||||||
ftpRecord Record
|
ftpRecord Record
|
||||||
res []Record
|
res []Record
|
||||||
@@ -105,6 +107,31 @@ func ListRecords(c *gin.Context) {
|
|||||||
db.Where("rule_name = ?", ftpRecord.RuleName)
|
db.Where("rule_name = ?", ftpRecord.RuleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delete records
|
||||||
|
if c.Request.Method == http.MethodDelete {
|
||||||
|
if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&res).Error; err != nil {
|
||||||
|
c.JSON(400, gin.H{
|
||||||
|
"status": "failed",
|
||||||
|
"error": err.Error(),
|
||||||
|
"data": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if database.Driver == database.Sqlite {
|
||||||
|
db.Exec("VACUUM")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "succeed",
|
||||||
|
"error": nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
log.Info("%d ftp records deleted by %s", db.RowsAffected, c.Request.RemoteAddr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//List records
|
||||||
page, err := strconv.Atoi(c.Query("page"))
|
page, err := strconv.Atoi(c.Query("page"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(400, gin.H{
|
c.JSON(400, gin.H{
|
||||||
|
|||||||
+28
-1
@@ -1,6 +1,7 @@
|
|||||||
package mysql
|
package mysql
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -9,6 +10,8 @@ import (
|
|||||||
"github.com/li4n0/revsuit/internal/file"
|
"github.com/li4n0/revsuit/internal/file"
|
||||||
"github.com/li4n0/revsuit/internal/notice"
|
"github.com/li4n0/revsuit/internal/notice"
|
||||||
"github.com/li4n0/revsuit/internal/record"
|
"github.com/li4n0/revsuit/internal/record"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ record.Record = (*Record)(nil)
|
var _ record.Record = (*Record)(nil)
|
||||||
@@ -51,7 +54,7 @@ func newRecord(rule *Rule, flag, username, schema, clientName, clientOS, remoteI
|
|||||||
return r, database.DB.Create(r).Error
|
return r, database.DB.Create(r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRecords(c *gin.Context) {
|
func Records(c *gin.Context) {
|
||||||
var (
|
var (
|
||||||
mysqlRecord Record
|
mysqlRecord Record
|
||||||
res []Record
|
res []Record
|
||||||
@@ -103,6 +106,30 @@ func ListRecords(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delete records
|
||||||
|
if c.Request.Method == http.MethodDelete {
|
||||||
|
if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&res).Error; err != nil {
|
||||||
|
c.JSON(400, gin.H{
|
||||||
|
"status": "failed",
|
||||||
|
"error": err.Error(),
|
||||||
|
"data": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if database.Driver == database.Sqlite {
|
||||||
|
db.Exec("VACUUM")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "succeed",
|
||||||
|
"error": nil,
|
||||||
|
})
|
||||||
|
log.Info("%d mysql records deleted by %s", db.RowsAffected, c.Request.RemoteAddr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//List records
|
||||||
page, err := strconv.Atoi(c.Query("page"))
|
page, err := strconv.Atoi(c.Query("page"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(400, gin.H{
|
c.JSON(400, gin.H{
|
||||||
|
|||||||
+28
-1
@@ -1,6 +1,7 @@
|
|||||||
package rhttp
|
package rhttp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -8,6 +9,8 @@ import (
|
|||||||
"github.com/li4n0/revsuit/internal/database"
|
"github.com/li4n0/revsuit/internal/database"
|
||||||
"github.com/li4n0/revsuit/internal/notice"
|
"github.com/li4n0/revsuit/internal/notice"
|
||||||
"github.com/li4n0/revsuit/internal/record"
|
"github.com/li4n0/revsuit/internal/record"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ record.Record = (*Record)(nil)
|
var _ record.Record = (*Record)(nil)
|
||||||
@@ -44,7 +47,7 @@ func NewRecord(rule *Rule, flag, method, url, ip, area, raw string) (r *Record,
|
|||||||
return r, database.DB.Create(r).Error
|
return r, database.DB.Create(r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRecords(c *gin.Context) {
|
func Records(c *gin.Context) {
|
||||||
var (
|
var (
|
||||||
httpRecord Record
|
httpRecord Record
|
||||||
res []Record
|
res []Record
|
||||||
@@ -87,6 +90,30 @@ func ListRecords(c *gin.Context) {
|
|||||||
db.Where("rule_name = ?", httpRecord.RuleName)
|
db.Where("rule_name = ?", httpRecord.RuleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delete records
|
||||||
|
if c.Request.Method == http.MethodDelete {
|
||||||
|
if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&res).Error; err != nil {
|
||||||
|
c.JSON(400, gin.H{
|
||||||
|
"status": "failed",
|
||||||
|
"error": err.Error(),
|
||||||
|
"data": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if database.Driver == database.Sqlite {
|
||||||
|
db.Exec("VACUUM")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "succeed",
|
||||||
|
"error": nil,
|
||||||
|
})
|
||||||
|
log.Info("%d http records deleted by %s", db.RowsAffected, c.Request.RemoteAddr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//List records
|
||||||
page, err := strconv.Atoi(c.Query("page"))
|
page, err := strconv.Atoi(c.Query("page"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(400, gin.H{
|
c.JSON(400, gin.H{
|
||||||
|
|||||||
+29
-1
@@ -1,6 +1,7 @@
|
|||||||
package rmi
|
package rmi
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -8,6 +9,8 @@ import (
|
|||||||
"github.com/li4n0/revsuit/internal/database"
|
"github.com/li4n0/revsuit/internal/database"
|
||||||
"github.com/li4n0/revsuit/internal/notice"
|
"github.com/li4n0/revsuit/internal/notice"
|
||||||
"github.com/li4n0/revsuit/internal/record"
|
"github.com/li4n0/revsuit/internal/record"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ record.Record = (*Record)(nil)
|
var _ record.Record = (*Record)(nil)
|
||||||
@@ -40,7 +43,7 @@ func NewRecord(rule *Rule, flag, path, ip, area string) (r *Record, err error) {
|
|||||||
return r, database.DB.Create(r).Error
|
return r, database.DB.Create(r).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListRecords(c *gin.Context) {
|
func Records(c *gin.Context) {
|
||||||
var (
|
var (
|
||||||
rmiRecord Record
|
rmiRecord Record
|
||||||
res []Record
|
res []Record
|
||||||
@@ -80,6 +83,31 @@ func ListRecords(c *gin.Context) {
|
|||||||
db.Where("rule_name = ?", rmiRecord.RuleName)
|
db.Where("rule_name = ?", rmiRecord.RuleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Delete records
|
||||||
|
if c.Request.Method == http.MethodDelete {
|
||||||
|
if err := db.Session(&gorm.Session{AllowGlobalUpdate: true}).Delete(&res).Error; err != nil {
|
||||||
|
c.JSON(400, gin.H{
|
||||||
|
"status": "failed",
|
||||||
|
"error": err.Error(),
|
||||||
|
"data": nil,
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if database.Driver == database.Sqlite {
|
||||||
|
db.Exec("VACUUM")
|
||||||
|
}
|
||||||
|
|
||||||
|
c.JSON(200, gin.H{
|
||||||
|
"status": "succeed",
|
||||||
|
"error": nil,
|
||||||
|
})
|
||||||
|
|
||||||
|
log.Info("%d rmi records deleted by %s", db.RowsAffected, c.Request.RemoteAddr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
//List records
|
||||||
page, err := strconv.Atoi(c.Query("page"))
|
page, err := strconv.Atoi(c.Query("page"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(400, gin.H{
|
c.JSON(400, gin.H{
|
||||||
|
|||||||
+10
-5
@@ -77,19 +77,24 @@ func (revsuit *Revsuit) registerHttpRouter() {
|
|||||||
recordGroup := revsuit.http.ApiGroup.Group("/record")
|
recordGroup := revsuit.http.ApiGroup.Group("/record")
|
||||||
|
|
||||||
httpGroup := recordGroup.Group("/http")
|
httpGroup := recordGroup.Group("/http")
|
||||||
httpGroup.GET("", rhttp.ListRecords)
|
httpGroup.GET("", rhttp.Records)
|
||||||
|
httpGroup.DELETE("", rhttp.Records)
|
||||||
|
|
||||||
dnsGroup := recordGroup.Group("/dns")
|
dnsGroup := recordGroup.Group("/dns")
|
||||||
dnsGroup.GET("", dns.ListRecords)
|
dnsGroup.GET("", dns.Records)
|
||||||
|
dnsGroup.DELETE("", dns.Records)
|
||||||
|
|
||||||
mysqlGroup := recordGroup.Group("/mysql")
|
mysqlGroup := recordGroup.Group("/mysql")
|
||||||
mysqlGroup.GET("", mysql.ListRecords)
|
mysqlGroup.GET("", mysql.Records)
|
||||||
|
mysqlGroup.DELETE("", mysql.Records)
|
||||||
|
|
||||||
rmiGroup := recordGroup.Group("/rmi")
|
rmiGroup := recordGroup.Group("/rmi")
|
||||||
rmiGroup.GET("", rmi.ListRecords)
|
rmiGroup.GET("", rmi.Records)
|
||||||
|
rmiGroup.DELETE("", rmi.Records)
|
||||||
|
|
||||||
ftpGroup := recordGroup.Group("/ftp")
|
ftpGroup := recordGroup.Group("/ftp")
|
||||||
ftpGroup.GET("", ftp.ListRecords)
|
ftpGroup.GET("", ftp.Records)
|
||||||
|
ftpGroup.DELETE("", ftp.Records)
|
||||||
|
|
||||||
// init rule router group
|
// init rule router group
|
||||||
ruleGroup := revsuit.http.ApiGroup.Group("/rule")
|
ruleGroup := revsuit.http.ApiGroup.Group("/rule")
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
log "unknwon.dev/clog/v2"
|
log "unknwon.dev/clog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
const VERSION = "0.1.7"
|
const VERSION = "0.2.0"
|
||||||
|
|
||||||
type Revsuit struct {
|
type Revsuit struct {
|
||||||
config *Config
|
config *Config
|
||||||
@@ -60,7 +60,7 @@ func initDatabase(dsn string) {
|
|||||||
Level: log.LevelInfo,
|
Level: log.LevelInfo,
|
||||||
})
|
})
|
||||||
|
|
||||||
err := database.InitDB("sqlite", dsn)
|
err := database.InitDB(database.Sqlite, dsn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err.Error())
|
log.Fatal(err.Error())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user