diff --git a/install.sh b/install.sh index df74a0cf..22ea186a 100644 --- a/install.sh +++ b/install.sh @@ -70,6 +70,7 @@ install_base() { #This function will be called when user installed x-ui out of sercurity config_after_install() { + /usr/local/x-ui/x-ui migrate echo -e "${yellow}Install/update finished! For security it's recommended to modify panel settings ${plain}" read -p "Do you want to continue with the modification [y/n]? ": config_confirm if [[ x"${config_confirm}" == x"y" || x"${config_confirm}" == x"Y" ]]; then diff --git a/main.go b/main.go index 710b80d4..54ff6bf3 100644 --- a/main.go +++ b/main.go @@ -204,6 +204,19 @@ func updateSetting(port int, username string, password string) { } } +func migrateDb() { + inboundService := service.InboundService{} + + err := database.InitDB(config.GetDBPath()) + if err != nil { + log.Fatal(err) + } + fmt.Println("Start migrating database...") + inboundService.MigrationRequirements() + inboundService.RemoveOrphanedTraffics() + fmt.Println("Migration done!") +} + func removeSecret() { err := database.InitDB(config.GetDBPath()) if err != nil { @@ -265,6 +278,7 @@ func main() { fmt.Println("Commands:") fmt.Println(" run run web panel") fmt.Println(" v2-ui migrate form v2-ui") + fmt.Println(" migrate migrate form other/old x-ui") fmt.Println(" setting set settings") } @@ -282,6 +296,8 @@ func main() { return } runWebServer() + case "migrate": + migrateDb() case "v2-ui": err := v2uiCmd.Parse(os.Args[2:]) if err != nil { diff --git a/web/service/inbound.go b/web/service/inbound.go index fac6fc47..3f736470 100644 --- a/web/service/inbound.go +++ b/web/service/inbound.go @@ -528,14 +528,17 @@ func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.Cl if err != nil { return nil, err } + inbounds[inbound_index].Settings = string(modifiedSettings) + } } err = tx.Save(inbounds).Error if err != nil { logger.Warning("AddClientTraffic update inbounds ", err) logger.Error(inbounds) - } + } } + return dbClientTraffics, nil } @@ -778,3 +781,43 @@ func (s *InboundService) SearchInbounds(query string) ([]*model.Inbound, error) } return inbounds, nil } +func (s *InboundService) MigrationRequirements() { + db := database.GetDB() + var inbounds []*model.Inbound + err := db.Model(model.Inbound{}).Where("protocol IN (?)", []string{"vmess", "vless", "trojan"}).Find(&inbounds).Error + if err != nil && err != gorm.ErrRecordNotFound { + return + } + for inbound_index := range inbounds { + settings := map[string]interface{}{} + json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) + clients, ok := settings["clients"].([]interface{}) + if ok { + var newClients []interface{} + for client_index := range clients { + c := clients[client_index].(map[string]interface{}) + + // Add email='' if it is not exists + if _, ok := c["email"]; !ok { + c["email"] = "" + } + + // Remove "flow": "xtls-rprx-direct" + if _, ok := c["flow"]; ok { + if c["flow"] == "xtls-rprx-direct" { + c["flow"] = "" + } + } + newClients = append(newClients, interface{}(c)) + } + settings["clients"] = newClients + modifiedSettings, err := json.MarshalIndent(settings, "", " ") + if err != nil { + return + } + + inbounds[inbound_index].Settings = string(modifiedSettings) + } + } + db.Save(inbounds) +} diff --git a/web/service/xray.go b/web/service/xray.go index 9c23f7a4..6008a493 100644 --- a/web/service/xray.go +++ b/web/service/xray.go @@ -69,7 +69,6 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { } s.inboundService.DisableInvalidClients() - s.inboundService.RemoveOrphanedTraffics() inbounds, err := s.inboundService.GetAllInbounds() if err != nil { @@ -124,7 +123,7 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { } settings["clients"] = final_clients - modifiedSettings, err := json.Marshal(settings) + modifiedSettings, err := json.MarshalIndent(settings, "", " ") if err != nil { return nil, err }