mirror of
https://github.com/wyx2685/V2bX.git
synced 2025-01-23 10:28:13 -05:00
165 lines
5.2 KiB
Go
165 lines
5.2 KiB
Go
|
package controller
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/Yuzuki616/V2bX/api"
|
||
|
"github.com/Yuzuki616/V2bX/app/mydispatcher"
|
||
|
"github.com/xtls/xray-core/common/protocol"
|
||
|
"github.com/xtls/xray-core/core"
|
||
|
"github.com/xtls/xray-core/features/inbound"
|
||
|
"github.com/xtls/xray-core/features/outbound"
|
||
|
"github.com/xtls/xray-core/features/routing"
|
||
|
"github.com/xtls/xray-core/features/stats"
|
||
|
"github.com/xtls/xray-core/proxy"
|
||
|
)
|
||
|
|
||
|
func (c *Controller) removeInbound(tag string) error {
|
||
|
inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager)
|
||
|
err := inboundManager.RemoveHandler(context.Background(), tag)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) removeOutbound(tag string) error {
|
||
|
outboundManager := c.server.GetFeature(outbound.ManagerType()).(outbound.Manager)
|
||
|
err := outboundManager.RemoveHandler(context.Background(), tag)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) addInbound(config *core.InboundHandlerConfig) error {
|
||
|
inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager)
|
||
|
rawHandler, err := core.CreateObject(c.server, config)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
handler, ok := rawHandler.(inbound.Handler)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("not an InboundHandler: %s", err)
|
||
|
}
|
||
|
if err := inboundManager.AddHandler(context.Background(), handler); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *Controller) addOutbound(config *core.OutboundHandlerConfig) error {
|
||
|
outboundManager := c.server.GetFeature(outbound.ManagerType()).(outbound.Manager)
|
||
|
rawHandler, err := core.CreateObject(c.server, config)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
handler, ok := rawHandler.(outbound.Handler)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("not an InboundHandler: %s", err)
|
||
|
}
|
||
|
if err := outboundManager.AddHandler(context.Background(), handler); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *Controller) addUsers(users []*protocol.User, tag string) error {
|
||
|
inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager)
|
||
|
handler, err := inboundManager.GetHandler(context.Background(), tag)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("No such inbound tag: %s", err)
|
||
|
}
|
||
|
inboundInstance, ok := handler.(proxy.GetInbound)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("handler %s is not implement proxy.GetInbound", tag)
|
||
|
}
|
||
|
|
||
|
userManager, ok := inboundInstance.GetInbound().(proxy.UserManager)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("handler %s is not implement proxy.UserManager", err)
|
||
|
}
|
||
|
for _, item := range users {
|
||
|
mUser, err := item.ToMemoryUser()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
err = userManager.AddUser(context.Background(), mUser)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *Controller) removeUsers(users []string, tag string) error {
|
||
|
inboundManager := c.server.GetFeature(inbound.ManagerType()).(inbound.Manager)
|
||
|
handler, err := inboundManager.GetHandler(context.Background(), tag)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("No such inbound tag: %s", err)
|
||
|
}
|
||
|
inboundInstance, ok := handler.(proxy.GetInbound)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("handler %s is not implement proxy.GetInbound", tag)
|
||
|
}
|
||
|
|
||
|
userManager, ok := inboundInstance.GetInbound().(proxy.UserManager)
|
||
|
if !ok {
|
||
|
return fmt.Errorf("handler %s is not implement proxy.UserManager", err)
|
||
|
}
|
||
|
for _, email := range users {
|
||
|
err = userManager.RemoveUser(context.Background(), email)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (c *Controller) getTraffic(email string) (up int64, down int64) {
|
||
|
upName := "user>>>" + email + ">>>traffic>>>uplink"
|
||
|
downName := "user>>>" + email + ">>>traffic>>>downlink"
|
||
|
statsManager := c.server.GetFeature(stats.ManagerType()).(stats.Manager)
|
||
|
upCounter := statsManager.GetCounter(upName)
|
||
|
downCounter := statsManager.GetCounter(downName)
|
||
|
if upCounter != nil {
|
||
|
up = upCounter.Value()
|
||
|
upCounter.Set(0)
|
||
|
}
|
||
|
if downCounter != nil {
|
||
|
down = downCounter.Value()
|
||
|
downCounter.Set(0)
|
||
|
}
|
||
|
return up, down
|
||
|
|
||
|
}
|
||
|
|
||
|
func (c *Controller) AddInboundLimiter(tag string, nodeSpeedLimit uint64, userList *[]api.UserInfo) error {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
err := dispather.Limiter.AddInboundLimiter(tag, nodeSpeedLimit, userList)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) UpdateInboundLimiter(tag string, updatedUserList *[]api.UserInfo) error {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
err := dispather.Limiter.UpdateInboundLimiter(tag, updatedUserList)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) DeleteInboundLimiter(tag string) error {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
err := dispather.Limiter.DeleteInboundLimiter(tag)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) GetOnlineDevice(tag string) (*[]api.OnlineUser, error) {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
return dispather.Limiter.GetOnlineDevice(tag)
|
||
|
}
|
||
|
|
||
|
func (c *Controller) UpdateRule(tag string, newRuleList []api.DetectRule) error {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
err := dispather.RuleManager.UpdateRule(tag, newRuleList)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
func (c *Controller) GetDetectResult(tag string) (*[]api.DetectResult, error) {
|
||
|
dispather := c.server.GetFeature(routing.DispatcherType()).(*mydispatcher.DefaultDispatcher)
|
||
|
return dispather.RuleManager.GetDetectResult(tag)
|
||
|
}
|