Files
v2ray_simple/cmd/verysimple/cmd_utils.go
2022-12-28 11:38:50 +08:00

107 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//go:build !noutils
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
"github.com/e1732a364fed/v2ray_simple/configAdapter"
"github.com/e1732a364fed/v2ray_simple/proxy"
"github.com/e1732a364fed/v2ray_simple/utils"
"github.com/mdp/qrterminal"
)
// 本文件存放一些与vs核心功能无关但是比较有用的工具命令
func init() {
extraExitCmds := []exitCmd{
{name: "gu", desc: "automatically generate a uuid for you", f: generateAndPrintUUID},
{name: "gc", desc: "automatically generate random certificate for you", f: generateRandomSSlCert},
{name: "cvqxtvs", isStr: true, desc: "if given, convert qx server config string to vs toml config", fs: convertQxToVs},
{name: "eqxrs", isStr: true, desc: "if given, automatically extract remote servers from quantumultX config for you", fs: extractQxRemoteServers},
{name: "qr", isStr: true, desc: "show qrcode in terminal for given string", fs: func(str string) {
config := qrterminal.Config{ //与直接调用 GenerateHalfBlock 的区别是, 取消了QuiteZone
HalfBlocks: true,
Level: qrterminal.M,
Writer: os.Stdout,
BlackChar: qrterminal.BLACK_BLACK,
WhiteChar: qrterminal.WHITE_WHITE,
BlackWhiteChar: qrterminal.BLACK_WHITE,
WhiteBlackChar: qrterminal.WHITE_BLACK,
}
qrterminal.GenerateWithConfig(str, config)
}},
// {name: "test", desc: "test", f: func() {
// // utils.InitLog("")
// // dns := netLayer.GetSystemDNS()
// // log.Println(len(dns), dns)
// log.Println(machine.NewApiServerConf())
// }},
}
exitCmds = append(exitCmds, extraExitCmds...)
}
func convertQxToVs(str string) {
dc := configAdapter.FromQX(str)
gstr, e := utils.GetPurgedTomlStr(proxy.StandardConf{
Dial: []*proxy.DialConf{&dc},
})
if e != nil {
fmt.Println(e.Error())
} else {
fmt.Println(gstr)
}
}
func extractQxRemoteServers(str string) {
var bs []byte
var readE error
if strings.HasPrefix(str, "http") {
fmt.Printf("downloading %s\n", str)
resp, err := http.DefaultClient.Get(str)
if err != nil {
fmt.Printf("Download failed %s\n", err.Error())
return
}
defer resp.Body.Close()
counter := &utils.DownloadPrintCounter{}
bs, readE = io.ReadAll(io.TeeReader(resp.Body, counter))
fmt.Printf("\n")
} else {
if utils.FileExist(str) {
path := utils.GetFilePath(str)
f, e := os.Open(path)
if e != nil {
fmt.Printf("Download failed %s\n", e.Error())
return
}
bs, readE = io.ReadAll(f)
} else {
fmt.Printf("file not exist %s\n", str)
return
}
}
if readE != nil {
fmt.Printf("read failed %s\n", readE.Error())
return
}
configAdapter.ExtractQxRemoteServers(string(bs))
}