github.com/xxf098/lite-proxy@v0.15.1-0.20230422081941-12c69f323218/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"os/signal"
     9  	"runtime"
    10  	"strings"
    11  	"syscall"
    12  
    13  	grpcServer "github.com/xxf098/lite-proxy/api/rpc/liteserver"
    14  	C "github.com/xxf098/lite-proxy/constant"
    15  	"github.com/xxf098/lite-proxy/core"
    16  	"github.com/xxf098/lite-proxy/utils"
    17  	webServer "github.com/xxf098/lite-proxy/web"
    18  )
    19  
    20  var (
    21  	port    = flag.Int("p", 8090, "set port")
    22  	test    = flag.String("test", "", "test from command line with subscription link or file")
    23  	conf    = flag.String("config", "", "command line options")
    24  	ping    = flag.Int("ping", 2, "retry times to ping link on startup")
    25  	grpc    = flag.Bool("grpc", false, "start grpc server")
    26  	version = flag.Bool("v", false, "show current version of clash")
    27  )
    28  
    29  func main() {
    30  	flag.Parse()
    31  	if *version {
    32  		fmt.Printf("LiteSpeedTest  %s %s %s with %s %s\n", C.Version, runtime.GOOS, runtime.GOARCH, runtime.Version(), C.BuildTime)
    33  		return
    34  	}
    35  	link := ""
    36  	for _, arg := range os.Args {
    37  		if strings.HasPrefix(arg, "-") {
    38  			continue
    39  		}
    40  		if _, err := utils.CheckLink(arg); err == nil {
    41  			link = arg
    42  			break
    43  		}
    44  	}
    45  	if *test != "" {
    46  		if err := webServer.TestFromCMD(*test, conf); err != nil {
    47  			log.Fatal(err)
    48  		}
    49  		return
    50  	}
    51  	// start grpc server
    52  	if *grpc {
    53  		if err := grpcServer.StartServer(uint16(*port)); err != nil {
    54  			log.Fatalln(err)
    55  		}
    56  		return
    57  	}
    58  	if link == "" {
    59  		if len(os.Args) < 2 {
    60  			*port = 10888
    61  		}
    62  		if err := webServer.ServeFile(*port); err != nil {
    63  			log.Fatalln(err)
    64  		}
    65  		return
    66  	}
    67  	c := core.Config{
    68  		LocalHost: "0.0.0.0",
    69  		LocalPort: *port,
    70  		Link:      link,
    71  		Ping:      *ping,
    72  	}
    73  	p, err := core.StartInstance(c)
    74  	if err != nil {
    75  		log.Fatalln(err)
    76  	}
    77  	sigs := make(chan os.Signal, 1)
    78  	signal.Notify(sigs, os.Interrupt, syscall.SIGTERM)
    79  	defer signal.Stop(sigs)
    80  	go func() {
    81  		<-sigs
    82  		p.Close()
    83  	}()
    84  	p.Run()
    85  }