From a4568ba69de33f3c4bef7d477d9270be0615b4ff Mon Sep 17 00:00:00 2001 From: B4D_US3R Date: Mon, 5 May 2025 16:53:10 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D1=81=D0=B5=D1=85=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B8?= =?UTF-8?q?=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20Vless=20URL=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miku/main.go | 91 ++++++++++++++++++++++++++++++++++++++++++++++++-- users/users.go | 21 ++++++++++++ 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/miku/main.go b/miku/main.go index c742f4f..9b28c7d 100644 --- a/miku/main.go +++ b/miku/main.go @@ -41,7 +41,11 @@ func main() { var confFile map[string]any configPath, ok := c.Flags[0].Get().(string) if !ok { - return errors.New("не удалось преобразовать тип") + return errors.New("не удалось преобразовать тип пути до конфига") + } + domain, ok := c.Flags[1].Get().(string) + if !ok { + return errors.New("не удалось преобразовать тип доменного имени") } fullpath, err := filepath.Abs(configPath) if err != nil { @@ -74,7 +78,8 @@ func main() { return nil } fileToWrite.Write(newJson) - fmt.Printf("Пользователь %s добавлен в конфиг %s", c.Args().First(), fullpath) + fmt.Printf("Пользователь %s добавлен в конфиг %s\n", c.Args().First(), fullpath) + fmt.Printf("Vless URL: %s\n", vlessUsers.VlessURL(c.Args().First(), domain)) return nil }, }, @@ -134,6 +139,88 @@ func main() { return nil }, }, + { + Name: "list", + Aliases: []string{"l"}, + Usage: "Выводит всех пользователей в конфиге", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "config", + Aliases: []string{"c"}, + Value: "/etc/sing-box/config.json", + Usage: "Указывает местоположение конфига", + }, + }, + Action: func(ctx context.Context, c *cli.Command) error { + var confFile map[string]any + configPath, ok := c.Flags[0].Get().(string) + if !ok { + return errors.New("не удалось преобразовать тип") + } + fullpath, err := filepath.Abs(configPath) + if err != nil { + return nil + } + fmt.Println(fullpath) + file, err := os.ReadFile(fullpath) + if err != nil { + return err + } + json.Unmarshal(file, &confFile) + vlessUsers, err := supporter.MapToStruct(confFile) + if err != nil { + return err + } + fmt.Println(vlessUsers.List()) + return nil + }, + }, + { + Name: "url", + Aliases: []string{"u"}, + Usage: "Выводит Vless URL для определенного пользователя", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "config", + Aliases: []string{"c"}, + Value: "/etc/sing-box/config.json", + Usage: "Указывает местоположение конфига", + }, + &cli.StringFlag{ + Name: "domain", + Aliases: []string{"d"}, + Value: "vpn.catgirls.asia", + Usage: "Указывает доменное имя, по которому клиенты могут выполнять подключение", + }, + }, + Action: func(ctx context.Context, c *cli.Command) error { + var confFile map[string]any + configPath, ok := c.Flags[0].Get().(string) + if !ok { + return errors.New("не удалось преобразовать тип") + } + domain, ok := c.Flags[1].Get().(string) + if !ok { + return errors.New("не удалось преобразовать тип доменного имени") + } + fullpath, err := filepath.Abs(configPath) + if err != nil { + return nil + } + fmt.Println(fullpath) + file, err := os.ReadFile(fullpath) + if err != nil { + return err + } + json.Unmarshal(file, &confFile) + vlessUsers, err := supporter.MapToStruct(confFile) + if err != nil { + return err + } + fmt.Printf("Vless URL: %s\n", vlessUsers.VlessURL(c.Args().First(), domain)) + return nil + }, + }, }, } if err := cmd.Run(context.Background(), os.Args); err != nil { diff --git a/users/users.go b/users/users.go index 4b45aa3..d04a446 100644 --- a/users/users.go +++ b/users/users.go @@ -2,6 +2,8 @@ package users import ( "errors" + "fmt" + "strings" "github.com/google/uuid" ) @@ -48,3 +50,22 @@ func (u VLESSUsers) Add(userName string) (VLESSUsers, error) { } return append(u, newUser), nil } + +func (u VLESSUsers) List() string { + var b strings.Builder + for k, v := range u { + fmt.Fprintf(&b, "%d.\t%s\t%s\n", k, v.Name, v.UUID.String()) + } + return b.String() +} + +func (u VLESSUsers) VlessURL(username string, domain string) string { + var b strings.Builder + for _, v := range u { + if v.Name == username { + fmt.Fprintf(&b, "vless://%s@%s:53666?security=&type=tcp&encryption=none#%s", v.UUID.String(), domain, v.Name) + break + } + } + return b.String() +}