Skip to content
This repository was archived by the owner on Jul 7, 2024. It is now read-only.

Commit be9b1b5

Browse files
author
dl0im
committed
feat: support local vendor and cli tests
1 parent 15d40dd commit be9b1b5

12 files changed

Lines changed: 242 additions & 43 deletions

File tree

cli.go

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,66 @@ import (
44
"flag"
55
"fmt"
66
"os"
7-
"strings"
7+
"path"
88

99
"github.com/miaokobot/miaospeed/utils"
1010
)
1111

12-
func InitConfig() *utils.GlobalConfig {
13-
gcfg := &utils.GCFG
12+
var cmdName string = "miaospeed"
1413

15-
flag.StringVar(&gcfg.Token, "token", "", "specify the token used to sign request")
16-
flag.StringVar(&gcfg.Binder, "bind", "", "bind a socket, can be format like 0.0.0.0:8080 or /tmp/unix_socket")
17-
flag.Uint64Var(&gcfg.SpeedLimit, "speedlimit", 0, "speed ratelimit (in Bytes per Second), default with no limits")
18-
flag.UintVar(&gcfg.PauseSecond, "pausesecond", 0, "pause such period after each speed job (seconds)")
19-
flag.BoolVar(&gcfg.MiaoKoSignedTLS, "mtls", false, "enable miaoko certs for tls verification")
20-
flag.BoolVar(&gcfg.NoSpeedFlag, "nospeed", false, "decline all speedtest requests")
14+
type SubCliType string
2115

22-
verboseMode := flag.Bool("verbose", false, "whether to print out systems log")
23-
versionOnly := flag.Bool("version", false, "display version and exit")
24-
whiteList := flag.String("whitelist", "", "bot id whitelist, can be format like 1111,2222,3333")
16+
const (
17+
SCTServer SubCliType = "server"
18+
SCTScriptTest SubCliType = "script"
19+
)
2520

26-
flag.Parse()
21+
func RunCli() {
22+
subCmd := SubCliType("")
23+
if len(os.Args) >= 2 {
24+
subCmd = SubCliType(os.Args[1])
25+
}
2726

28-
if *verboseMode {
29-
utils.VerboseLevel = utils.LTLog
27+
cmdName = path.Base(os.Args[0])
28+
switch subCmd {
29+
case SCTServer:
30+
RunCliServer()
31+
case SCTScriptTest:
32+
RunCliScriptTest()
33+
default:
34+
RunCliDefault()
3035
}
36+
}
37+
38+
func RunCliDefault() {
39+
sflag := flag.NewFlagSet(cmdName, flag.ExitOnError)
40+
41+
versionOnly := sflag.Bool("version", false, "display version and exit")
42+
sflag.Parse(os.Args[1:])
3143

3244
if *versionOnly {
3345
fmt.Println(utils.VERSION)
3446
os.Exit(0)
3547
}
3648

37-
gcfg.WhiteList = make([]string, 0)
38-
if *whiteList != "" {
39-
gcfg.WhiteList = strings.Split(*whiteList, ",")
40-
}
49+
sflag.Usage()
4150

42-
return gcfg
51+
fmt.Printf("\n")
52+
fmt.Printf("Subcommands of %s:\n", cmdName)
53+
fmt.Printf(" server\n")
54+
fmt.Printf(" start the miaospeed backend as a server.\n")
55+
fmt.Printf(" script\n")
56+
fmt.Printf(" run a temporary script test to test the correctness of your script.\n")
57+
58+
os.Exit(0)
59+
}
60+
61+
func parseFlag(sflag *flag.FlagSet) {
62+
verboseMode := sflag.Bool("verbose", false, "whether to print out systems log")
63+
64+
sflag.Parse(os.Args[2:])
65+
66+
if *verboseMode {
67+
utils.VerboseLevel = utils.LTLog
68+
}
4369
}

cli_script.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
8+
"github.com/miaokobot/miaospeed/interfaces"
9+
"github.com/miaokobot/miaospeed/service/macros/script"
10+
"github.com/miaokobot/miaospeed/utils"
11+
"github.com/miaokobot/miaospeed/vendors"
12+
)
13+
14+
type ScriptTestCliParams struct {
15+
ScriptName string
16+
}
17+
18+
func InitConfigScriptTest() *ScriptTestCliParams {
19+
stcp := &ScriptTestCliParams{}
20+
21+
sflag := flag.NewFlagSet(cmdName+" script", flag.ExitOnError)
22+
sflag.StringVar(&stcp.ScriptName, "file", "", "specify a script file to perform a test.")
23+
24+
parseFlag(sflag)
25+
26+
return stcp
27+
}
28+
29+
func RunCliScriptTest() {
30+
stcp := InitConfigScriptTest()
31+
32+
if stcp.ScriptName == "" {
33+
utils.DErrorf("Script Test | File name cannot be empty.")
34+
os.Exit(1)
35+
}
36+
37+
fileContent, err := os.ReadFile(stcp.ScriptName)
38+
if err != nil {
39+
utils.DErrorf("Script Test | Cannot read the file, path=%s", stcp.ScriptName)
40+
os.Exit(1)
41+
}
42+
43+
utils.VerboseLevel = utils.LTInfo
44+
utils.DWarnf("MiaoSpeed speedtesting client %s", utils.VERSION)
45+
46+
vendor := vendors.Find(interfaces.VendorLocal)
47+
utils.DInfof("Script Test | Using vendor %s", vendor.Type())
48+
scriptResult := script.ExecScript(vendor, &interfaces.Script{
49+
Content: string(fileContent),
50+
})
51+
52+
fmt.Println("\n" + utils.ToJSON(scriptResult))
53+
}

cli_server.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"strings"
6+
7+
"github.com/miaokobot/miaospeed/service"
8+
"github.com/miaokobot/miaospeed/utils"
9+
)
10+
11+
func InitConfigServer() *utils.GlobalConfig {
12+
gcfg := &utils.GCFG
13+
14+
sflag := flag.NewFlagSet(cmdName+" server", flag.ExitOnError)
15+
sflag.StringVar(&gcfg.Token, "token", "", "specify the token used to sign request")
16+
sflag.StringVar(&gcfg.Binder, "bind", "", "bind a socket, can be format like 0.0.0.0:8080 or /tmp/unix_socket")
17+
sflag.Uint64Var(&gcfg.SpeedLimit, "speedlimit", 0, "speed ratelimit (in Bytes per Second), default with no limits")
18+
sflag.UintVar(&gcfg.PauseSecond, "pausesecond", 0, "pause such period after each speed job (seconds)")
19+
sflag.BoolVar(&gcfg.MiaoKoSignedTLS, "mtls", false, "enable miaoko certs for tls verification")
20+
sflag.BoolVar(&gcfg.NoSpeedFlag, "nospeed", false, "decline all speedtest requests")
21+
22+
whiteList := sflag.String("whitelist", "", "bot id whitelist, can be format like 1111,2222,3333")
23+
parseFlag(sflag)
24+
25+
gcfg.WhiteList = make([]string, 0)
26+
if *whiteList != "" {
27+
gcfg.WhiteList = strings.Split(*whiteList, ",")
28+
}
29+
30+
return gcfg
31+
}
32+
33+
func RunCliServer() {
34+
InitConfigServer()
35+
utils.DWarnf("MiaoSpeed speedtesting client %s", utils.VERSION)
36+
37+
// start task server
38+
go service.StartTaskServer()
39+
40+
// start api server
41+
service.CleanUpServer()
42+
go service.InitServer()
43+
44+
<-utils.MakeSysChan()
45+
46+
// clean up
47+
service.CleanUpServer()
48+
utils.DLog("shutting down.")
49+
}

interfaces/vendor.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ import (
88
type VendorType string
99

1010
const (
11-
VenderClash VendorType = "Clash"
11+
VendorLocal VendorType = "Local"
12+
VendorClash VendorType = "Clash"
1213

13-
VenderInvalid VendorType = "Invalid"
14+
VendorInvalid VendorType = "Invalid"
1415
)
1516

1617
type VendorStatus uint

main.go

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"github.com/miaokobot/miaospeed/service"
54
"github.com/miaokobot/miaospeed/utils"
65
)
76

@@ -16,19 +15,5 @@ func main() {
1615
utils.COMMIT = COMMIT
1716
utils.BRAND = BRAND
1817

19-
InitConfig()
20-
utils.DInfof("MiaoSpeed speedtesting client %s", utils.VERSION)
21-
22-
// start task server
23-
go service.StartTaskServer()
24-
25-
// start api server
26-
service.CleanUpServer()
27-
go service.InitServer()
28-
29-
<-utils.MakeSysChan()
30-
31-
// clean up
32-
service.CleanUpServer()
33-
utils.DInfo("shutting down.")
18+
RunCli()
3419
}

service/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func InitServer() {
3737
os.Exit(1)
3838
}
3939

40-
utils.DInfof("MiaoSpeed Server | Start Listening, bind=%s", utils.GCFG.Binder)
40+
utils.DWarnf("MiaoSpeed Server | Start Listening, bind=%s", utils.GCFG.Binder)
4141

4242
wsHandler := WsHandler{
4343
Serve: func(rw http.ResponseWriter, r *http.Request) {

service/taskpoll/controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (tpc *TaskPollController) Start() {
126126
for {
127127
select {
128128
case <-sigTerm:
129-
utils.DInfo("task server shutted down.")
129+
utils.DLog("task server shutted down.")
130130
return
131131
default:
132132
if itemIdx, tpw := tpc.populate(); tpw != nil {

vendors/clash/vendor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type Clash struct {
1414
}
1515

1616
func (c *Clash) Type() interfaces.VendorType {
17-
return interfaces.VenderClash
17+
return interfaces.VendorClash
1818
}
1919

2020
func (c *Clash) Status() interfaces.VendorStatus {

vendors/invalid/vendor.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type Invalid struct {
1313
}
1414

1515
func (c *Invalid) Type() interfaces.VendorType {
16-
return interfaces.VenderInvalid
16+
return interfaces.VendorInvalid
1717
}
1818

1919
func (c *Invalid) Status() interfaces.VendorStatus {

vendors/local/metadata.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package local
2+
3+
import (
4+
"fmt"
5+
"net/url"
6+
"strconv"
7+
)
8+
9+
func urlToMetadata(rawURL string) (string, uint16, error) {
10+
u, err := url.Parse(rawURL)
11+
if err != nil {
12+
return "", 0, fmt.Errorf("cannot parse the url")
13+
}
14+
15+
port := u.Port()
16+
if port == "" {
17+
switch u.Scheme {
18+
case "https":
19+
port = "443"
20+
case "http":
21+
port = "80"
22+
default:
23+
return "", 0, fmt.Errorf("unknown url scheme")
24+
}
25+
}
26+
27+
portUint8, err := strconv.ParseUint(port, 10, 16)
28+
if err != nil {
29+
return "", 0, fmt.Errorf("cannot parse the port number")
30+
}
31+
32+
return u.Hostname(), uint16(portUint8), nil
33+
}

0 commit comments

Comments
 (0)