Remnawave_migrate/main.go
Alexey 6844e48b92
feat: add internal and external squad support for migrated users (#14)
* Add internal squad assignment for migrated users

Introduces the --internal-squad flag and config option to assign all migrated users to a specified internal squad. Updates user creation logic to include the squad UUID if provided, and documents the new feature in the README.

* Delete remnawave-migrate

* Add support for assigning users to multiple squads

Extended configuration and migration logic to allow assigning migrated users to multiple internal squads (comma-separated) and a single external squad. Updated documentation, config, migrator, and user creation request to support these new options.
2026-01-28 18:30:42 +05:00

69 lines
1.8 KiB
Go

package main
import (
"log"
"strings"
"remnawave-migrate/config"
"remnawave-migrate/migrator"
"remnawave-migrate/remnawave"
"remnawave-migrate/source"
"remnawave-migrate/util"
)
var version = "unknown"
func main() {
cfg := config.Parse(version)
cfg.SourceHeaders = util.ParseHeaderMap(cfg.SourceHeadersRaw)
cfg.DestHeaders = util.ParseHeaderMap(cfg.DestHeadersRaw)
if cfg.RemnawaveToken != "" {
if _, exists := cfg.DestHeaders["Authorization"]; !exists {
cfg.DestHeaders["Authorization"] = "Bearer " + cfg.RemnawaveToken
}
}
if cfg.PanelPassword == "" {
log.Fatal("Panel password is required")
}
if cfg.RemnawaveToken == "" {
log.Fatal("Remnawave token is required")
}
if cfg.PreferredStrategy != "" {
validStrategies := map[string]bool{
"NO_RESET": true,
"DAY": true,
"WEEK": true,
"MONTH": true,
}
strategy := strings.ToUpper(cfg.PreferredStrategy)
if !validStrategies[strategy] {
log.Fatalf("Invalid preferred-strategy value: %s. Must be one of: NO_RESET, DAY, WEEK, MONTH", cfg.PreferredStrategy)
}
cfg.PreferredStrategy = strategy
}
log.Printf("Starting migration from %s panel...", cfg.PanelType)
sourcePanel, err := source.Factory(cfg.PanelType, cfg.PanelURL, cfg.SourceHeaders)
if err != nil {
log.Fatalf("Failed to create source panel: %v", err)
}
if err := sourcePanel.Login(cfg.PanelUsername, cfg.PanelPassword); err != nil {
log.Fatalf("Login failed: %v", err)
}
remnaPanel := remnawave.NewPanel(cfg.RemnawaveURL, cfg.RemnawaveToken, cfg.DestHeaders)
m := migrator.New(sourcePanel, remnaPanel, cfg.PreferredStrategy, cfg.PreserveStatus, cfg.PreserveSubHash, cfg.InternalSquad, cfg.ExternalSquad)
if err := m.MigrateUsers(cfg.BatchSize, cfg.LastUsers); err != nil {
log.Fatalf("Migration failed: %v", err)
}
log.Println("Migration completed successfully!")
}