Merge pull request #261 from hamid-gh98/main

Support set db and bin folder path from env
This commit is contained in:
Ho3ein 2023-04-14 05:28:03 +03:30 committed by GitHub
commit b70ecc12b3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 121 additions and 103 deletions

View file

@ -45,6 +45,22 @@ func IsDebug() bool {
return os.Getenv("XUI_DEBUG") == "true"
}
func GetDBPath() string {
return fmt.Sprintf("/etc/%s/%s.db", GetName(), GetName())
func GetBinFolderPath() string {
binFolderPath := os.Getenv("XUI_BIN_FOLDER")
if binFolderPath == "" {
binFolderPath = "bin"
}
return binFolderPath
}
func GetDBFolderPath() string {
dbFolderPath := os.Getenv("XUI_DB_FOLDER")
if dbFolderPath == "" {
dbFolderPath = "/etc/x-ui"
}
return dbFolderPath
}
func GetDBPath() string {
return fmt.Sprintf("%s/%s.db", GetDBFolderPath(), GetName())
}

View file

@ -217,7 +217,7 @@ func main() {
v2uiCmd := flag.NewFlagSet("v2-ui", flag.ExitOnError)
var dbPath string
v2uiCmd.StringVar(&dbPath, "db", "/etc/v2-ui/v2-ui.db", "set v2-ui db file path")
v2uiCmd.StringVar(&dbPath, "db", fmt.Sprintf("%s/v2-ui.db", config.GetDBFolderPath()), "set v2-ui db file path")
settingCmd := flag.NewFlagSet("setting", flag.ExitOnError)
var port int

View file

@ -1,26 +1,28 @@
package job
import (
"x-ui/logger"
"x-ui/web/service"
"encoding/json"
"os"
"regexp"
ss "strings"
"x-ui/database"
"x-ui/database/model"
"os"
ss "strings"
"regexp"
"encoding/json"
"x-ui/logger"
"x-ui/web/service"
"x-ui/xray"
// "strconv"
"github.com/go-cmd/cmd"
"net"
"sort"
"strings"
"time"
"net"
"github.com/go-cmd/cmd"
"sort"
)
type CheckClientIpJob struct {
xrayService service.XrayService
inboundService service.InboundService
}
var job *CheckClientIpJob
var disAllowedIps []string
@ -34,15 +36,15 @@ func (j *CheckClientIpJob) Run() {
processLogFile()
// disAllowedIps = []string{"192.168.1.183","192.168.1.197"}
blockedIps := []byte(ss.Join(disAllowedIps,","))
err := os.WriteFile("./bin/blockedIPs", blockedIps, 0755)
blockedIps := []byte(ss.Join(disAllowedIps, ","))
err := os.WriteFile(xray.GetBlockedIPsPath(), blockedIps, 0755)
checkError(err)
}
func processLogFile() {
accessLogPath := GetAccessLogPath()
if(accessLogPath == "") {
if accessLogPath == "" {
logger.Warning("xray log not init in config.json")
return
}
@ -62,28 +64,26 @@ func processLogFile() {
emailRegx, _ := regexp.Compile(`email:.+`)
matchesIp := ipRegx.FindString(line)
if(len(matchesIp) > 0) {
if len(matchesIp) > 0 {
ip := string(matchesIp)
if( ip == "127.0.0.1" || ip == "1.1.1.1") {
if ip == "127.0.0.1" || ip == "1.1.1.1" {
continue
}
matchesEmail := emailRegx.FindString(line)
if(matchesEmail == "") {
if matchesEmail == "" {
continue
}
matchesEmail = ss.Split(matchesEmail, "email: ")[1]
if(InboundClientIps[matchesEmail] != nil) {
if(contains(InboundClientIps[matchesEmail],ip)){
if InboundClientIps[matchesEmail] != nil {
if contains(InboundClientIps[matchesEmail], ip) {
continue
}
InboundClientIps[matchesEmail] = append(InboundClientIps[matchesEmail],ip)
InboundClientIps[matchesEmail] = append(InboundClientIps[matchesEmail], ip)
}else{
InboundClientIps[matchesEmail] = append(InboundClientIps[matchesEmail],ip)
} else {
InboundClientIps[matchesEmail] = append(InboundClientIps[matchesEmail], ip)
}
}
@ -91,37 +91,36 @@ func processLogFile() {
disAllowedIps = []string{}
for clientEmail, ips := range InboundClientIps {
inboundClientIps,err := GetInboundClientIps(clientEmail)
inboundClientIps, err := GetInboundClientIps(clientEmail)
sort.Sort(sort.StringSlice(ips))
if(err != nil){
addInboundClientIps(clientEmail,ips)
if err != nil {
addInboundClientIps(clientEmail, ips)
}else{
updateInboundClientIps(inboundClientIps,clientEmail,ips)
} else {
updateInboundClientIps(inboundClientIps, clientEmail, ips)
}
}
// check if inbound connection is more than limited ip and drop connection
LimitDevice := func() { LimitDevice() }
stop := schedule(LimitDevice, 1000 *time.Millisecond)
stop := schedule(LimitDevice, 1000*time.Millisecond)
time.Sleep(10 * time.Second)
stop <- true
}
func GetAccessLogPath() string {
config, err := os.ReadFile("bin/config.json")
config, err := os.ReadFile(xray.GetConfigPath())
checkError(err)
jsonConfig := map[string]interface{}{}
err = json.Unmarshal([]byte(config), &jsonConfig)
checkError(err)
if(jsonConfig["log"] != nil) {
if jsonConfig["log"] != nil {
jsonLog := jsonConfig["log"].(map[string]interface{})
if(jsonLog["access"] != nil) {
if jsonLog["access"] != nil {
accessLogPath := jsonLog["access"].(string)
@ -182,7 +181,7 @@ func addInboundClientIps(clientEmail string, ips []string) error {
}
return nil
}
func updateInboundClientIps(inboundClientIps *model.InboundClientIps,clientEmail string,ips []string) error {
func updateInboundClientIps(inboundClientIps *model.InboundClientIps, clientEmail string, ips []string) error {
jsonIps, err := json.Marshal(ips)
checkError(err)
@ -195,7 +194,7 @@ func updateInboundClientIps(inboundClientIps *model.InboundClientIps,clientEmail
checkError(err)
if inbound.Settings == "" {
logger.Debug("wrong data ",inbound)
logger.Debug("wrong data ", inbound)
return nil
}
@ -208,13 +207,13 @@ func updateInboundClientIps(inboundClientIps *model.InboundClientIps,clientEmail
limitIp := client.LimitIP
if(limitIp < len(ips) && limitIp != 0 && inbound.Enable) {
if limitIp < len(ips) && limitIp != 0 && inbound.Enable {
disAllowedIps = append(disAllowedIps,ips[limitIp:]...)
disAllowedIps = append(disAllowedIps, ips[limitIp:]...)
}
}
}
logger.Debug("disAllowedIps ",disAllowedIps)
logger.Debug("disAllowedIps ", disAllowedIps)
sort.Sort(sort.StringSlice(disAllowedIps))
db := database.GetDB()
@ -224,13 +223,13 @@ func updateInboundClientIps(inboundClientIps *model.InboundClientIps,clientEmail
}
return nil
}
func DisableInbound(id int) error{
func DisableInbound(id int) error {
db := database.GetDB()
result := db.Model(model.Inbound{}).
Where("id = ? and enable = ?", id, true).
Update("enable", false)
err := result.Error
logger.Warning("disable inbound with id:",id)
logger.Warning("disable inbound with id:", id)
if err == nil {
job.xrayService.SetToNeedRestart()
@ -242,7 +241,7 @@ func DisableInbound(id int) error{
func GetInboundByEmail(clientEmail string) (*model.Inbound, error) {
db := database.GetDB()
var inbounds *model.Inbound
err := db.Model(model.Inbound{}).Where("settings LIKE ?", "%" + clientEmail + "%").Find(&inbounds).Error
err := db.Model(model.Inbound{}).Where("settings LIKE ?", "%"+clientEmail+"%").Find(&inbounds).Error
if err != nil {
return nil, err
}
@ -252,10 +251,10 @@ func GetInboundByEmail(clientEmail string) (*model.Inbound, error) {
func LimitDevice() {
var destIp, destPort, srcIp, srcPort string
localIp,err := LocalIP()
localIp, err := LocalIP()
checkError(err)
c := cmd.NewCmd("bash","-c","ss --tcp | grep -E '" + IPsToRegex(localIp) + "'| awk '{if($1==\"ESTAB\") print $4,$5;}'","| sort | uniq -c | sort -nr | head")
c := cmd.NewCmd("bash", "-c", "ss --tcp | grep -E '"+IPsToRegex(localIp)+"'| awk '{if($1==\"ESTAB\") print $4,$5;}'", "| sort | uniq -c | sort -nr | head")
<-c.Start()
if len(c.Status().Stdout) > 0 {
@ -264,7 +263,7 @@ func LimitDevice() {
for _, row := range c.Status().Stdout {
data := strings.Split(row," ")
data := strings.Split(row, " ")
if len(data) < 2 {
continue // Skip this row if it doesn't have at least two elements
@ -272,23 +271,22 @@ func LimitDevice() {
destIp = string(ipRegx.FindString(data[0]))
destPort = portRegx.FindString(data[0])
destPort = strings.Replace(destPort,":","",-1)
destPort = strings.Replace(destPort, ":", "", -1)
srcIp = string(ipRegx.FindString(data[1]))
srcPort = portRegx.FindString(data[1])
srcPort = strings.Replace(srcPort,":","",-1)
srcPort = strings.Replace(srcPort, ":", "", -1)
if contains(disAllowedIps,srcIp){
dropCmd := cmd.NewCmd("bash","-c","ss -K dport = " + srcPort)
if contains(disAllowedIps, srcIp) {
dropCmd := cmd.NewCmd("bash", "-c", "ss -K dport = "+srcPort)
dropCmd.Start()
logger.Debug("request droped : ",srcIp,srcPort,"to",destIp,destPort)
logger.Debug("request droped : ", srcIp, srcPort, "to", destIp, destPort)
}
}
}
}
func LocalIP() ([]string, error) {
// get machine ips
@ -312,17 +310,16 @@ func LocalIP() ([]string, error) {
ip = v.IP
}
ips = append(ips,ip.String())
ips = append(ips, ip.String())
}
}
logger.Debug("System IPs : ",ips)
logger.Debug("System IPs : ", ips)
return ips, nil
}
func IPsToRegex(ips []string) (string){
func IPsToRegex(ips []string) string {
regx := ""
for _, ip := range ips {

View file

@ -106,8 +106,8 @@
"expireDate" = "Expire date"
"resetTraffic" = "Reset traffic"
"addInbound" = "Add Inbound"
"addTo" = "Add To"
"revise" = "Revise"
"addTo" = "Create"
"revise" = "Update"
"modifyInbound" = "Modify InBound"
"deleteInbound" = "Delete Inbound"
"deleteInboundContent" = "Are you sure you want to delete inbound?"

View file

@ -14,6 +14,7 @@ import (
"runtime"
"strings"
"time"
"x-ui/config"
"x-ui/util/common"
"github.com/Workiva/go-datastructures/queue"
@ -29,19 +30,23 @@ func GetBinaryName() string {
}
func GetBinaryPath() string {
return "bin/" + GetBinaryName()
return config.GetBinFolderPath() + "/" + GetBinaryName()
}
func GetConfigPath() string {
return "bin/config.json"
return config.GetBinFolderPath() + "/config.json"
}
func GetGeositePath() string {
return "bin/geosite.dat"
return config.GetBinFolderPath() + "/geosite.dat"
}
func GetGeoipPath() string {
return "bin/geoip.dat"
return config.GetBinFolderPath() + "/geoip.dat"
}
func GetBlockedIPsPath() string {
return config.GetBinFolderPath() + "/blockedIPs"
}
func stopProcess(p *Process) {
@ -162,7 +167,7 @@ func (p *process) Start() (err error) {
return common.NewErrorf("Failed to write configuration file: %v", err)
}
cmd := exec.Command(GetBinaryPath(), "-c", configPath, "-restrictedIPsPath", "./bin/blockedIPs")
cmd := exec.Command(GetBinaryPath(), "-c", configPath, "-restrictedIPsPath", GetBlockedIPsPath())
p.cmd = cmd
stdReader, err := cmd.StdoutPipe()