mirror of
https://github.com/Li4n0/revsuit.git
synced 2026-09-22 06:40:43 +08:00
Support http,dns and mysql connection. Support custom http, dns response. Support dns rebinding. Support mysql load local files and jdbc deserialize exploit.
137 lines
2.6 KiB
Go
137 lines
2.6 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/li4n0/revsuit/internal/database"
|
|
"github.com/li4n0/revsuit/internal/notice"
|
|
"github.com/li4n0/revsuit/pkg/dns"
|
|
"github.com/li4n0/revsuit/pkg/mysql"
|
|
http "github.com/li4n0/revsuit/pkg/rhttp"
|
|
"gorm.io/gorm/logger"
|
|
log "unknwon.dev/clog/v2"
|
|
)
|
|
|
|
type Revsuit struct {
|
|
http *http.Server
|
|
dns *dns.Server
|
|
mysql *mysql.Server
|
|
}
|
|
|
|
func initDatabase(dsn string) {
|
|
err := database.InitDB("sqlite", dsn)
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
err = database.DB.AutoMigrate(&http.Record{})
|
|
err = database.DB.AutoMigrate(&dns.Record{})
|
|
err = database.DB.AutoMigrate(&mysql.Record{})
|
|
err = database.DB.AutoMigrate(&http.Rule{})
|
|
err = database.DB.AutoMigrate(&dns.Rule{})
|
|
err = database.DB.AutoMigrate(&mysql.Rule{})
|
|
err = database.DB.AutoMigrate(&mysql.File{})
|
|
if err != nil {
|
|
log.Fatal(err.Error())
|
|
}
|
|
|
|
}
|
|
|
|
func initLog(level string) {
|
|
var logLevel log.Level
|
|
|
|
switch level {
|
|
case "debug":
|
|
gin.SetMode(gin.DebugMode)
|
|
database.DB.Logger.LogMode(logger.Info)
|
|
logLevel = log.LevelTrace
|
|
case "info":
|
|
gin.SetMode(gin.DebugMode)
|
|
database.DB.Logger.LogMode(logger.Info)
|
|
logLevel = log.LevelInfo
|
|
case "warning":
|
|
gin.SetMode(gin.ReleaseMode)
|
|
database.DB.Logger.LogMode(logger.Warn)
|
|
logLevel = log.LevelWarn
|
|
case "error":
|
|
gin.SetMode(gin.ReleaseMode)
|
|
database.DB.Logger.LogMode(logger.Error)
|
|
logLevel = log.LevelError
|
|
case "fatal":
|
|
gin.SetMode(gin.ReleaseMode)
|
|
database.DB.Logger.LogMode(logger.Error)
|
|
logLevel = log.LevelFatal
|
|
}
|
|
_ = log.NewConsole(100,
|
|
log.ConsoleConfig{
|
|
Level: logLevel,
|
|
})
|
|
|
|
}
|
|
|
|
func initNotice(nc noticeConfig) {
|
|
n := notice.New()
|
|
if nc.DingTalk != "" {
|
|
n.AddBot(¬ice.DingTalk{
|
|
URL: nc.DingTalk,
|
|
})
|
|
}
|
|
if nc.Lark != "" {
|
|
n.AddBot(¬ice.Lark{
|
|
URL: nc.Lark,
|
|
})
|
|
}
|
|
if nc.WeiXin != "" {
|
|
n.AddBot(¬ice.Weixin{
|
|
URL: nc.WeiXin,
|
|
})
|
|
}
|
|
if nc.Slack != "" {
|
|
n.AddBot(¬ice.Slack{
|
|
URL: nc.Slack,
|
|
})
|
|
}
|
|
}
|
|
|
|
func New(c *Config) *Revsuit {
|
|
|
|
initDatabase(c.Database)
|
|
initLog(c.LogLevel)
|
|
initNotice(c.Notice)
|
|
|
|
s := &Revsuit{
|
|
http: http.GetServer(),
|
|
}
|
|
if c.DNS.Enable {
|
|
s.dns = dns.GetServer()
|
|
}
|
|
if c.Mysql.Enable {
|
|
s.mysql = mysql.GetServer()
|
|
s.mysql.Config = c.Mysql
|
|
}
|
|
|
|
if c.Addr != "" {
|
|
s.http.SetAddr(c.Addr)
|
|
}
|
|
if c.Token != "" {
|
|
s.http.SetToken(c.Token)
|
|
}
|
|
if c.IpHeader != "" {
|
|
s.http.SetIpHeader(c.IpHeader)
|
|
}
|
|
return s
|
|
}
|
|
|
|
func (revsuit *Revsuit) Run() {
|
|
defer log.Stop()
|
|
revsuit.registerRouter()
|
|
|
|
if revsuit.dns != nil {
|
|
go revsuit.dns.Run()
|
|
}
|
|
if revsuit.mysql != nil {
|
|
go revsuit.mysql.Run()
|
|
}
|
|
|
|
revsuit.http.Run()
|
|
}
|