star/httpreverse/cmd.go

105 lines
2.9 KiB
Go
Raw Normal View History

2023-04-04 14:11:09 +08:00
package httpreverse
import (
"b612.me/starlog"
"github.com/spf13/cobra"
"net/url"
"os"
"os/signal"
)
var remote, config string
var addr, key, cert, log string
var port int
2025-06-20 12:04:49 +08:00
var enablessl, skipsslverify, autogencert, allowHttpInTls bool
2023-04-04 14:11:09 +08:00
var host string
func init() {
Cmd.Flags().StringVarP(&host, "host", "H", "", "host字段")
Cmd.Flags().StringVarP(&remote, "remote", "r", "", "反向代理地址")
Cmd.Flags().StringVarP(&config, "config", "C", "", "配置文件地址")
Cmd.Flags().StringVarP(&addr, "addr", "a", "0.0.0.0", "监听地址")
Cmd.Flags().StringVarP(&key, "key", "k", "", "ssl key地址")
Cmd.Flags().StringVarP(&cert, "cert", "c", "", "ssl 证书地址")
Cmd.Flags().StringVarP(&log, "log", "l", "", "log日志地址")
Cmd.Flags().BoolVarP(&enablessl, "enable-ssl", "s", false, "启用ssl")
2024-02-04 13:17:47 +08:00
Cmd.Flags().BoolVarP(&skipsslverify, "skil-ssl-verify", "S", false, "跳过证书验证")
2023-04-04 14:11:09 +08:00
Cmd.Flags().IntVarP(&port, "port", "p", 8080, "监听端口")
2025-06-20 12:04:49 +08:00
Cmd.Flags().BoolVarP(&autogencert, "autogen-cert", "G", false, "自动生成证书,此时使用--ssl-cert和--ssl-key参数无效")
Cmd.Flags().BoolVarP(&allowHttpInTls, "allow-http-in-tls", "A", false, "允许在TLS下使用HTTP协议")
2023-04-04 14:11:09 +08:00
}
var Cmd = &cobra.Command{
Use: "hproxy",
Short: "Http Reverse Proxy(Http反向代理)",
Run: func(cmd *cobra.Command, args []string) {
if log != "" {
starlog.SetLogFile(log, starlog.Std, true)
}
if config != "" {
r, err := Parse(config)
if err != nil {
starlog.Errorln(err)
os.Exit(1)
}
go func() {
sig := make(chan os.Signal)
signal.Notify(sig, os.Kill, os.Interrupt)
starlog.Noticeln("Stop Due to Recv Siganl", <-sig)
r.Close()
}()
err = r.Run()
if err != nil {
starlog.Errorln("Http Reverse Proxy Exit Error", err)
os.Exit(2)
}
starlog.Infoln("Http Reverse Proxy Exit Normally")
return
}
if remote == "" {
starlog.Errorln("please enter the reverse url")
os.Exit(4)
}
u, err := url.Parse(remote)
if err != nil {
starlog.Errorln(err)
os.Exit(3)
}
cfg := &SingleReverseConfig{
2023-04-04 14:11:09 +08:00
Name: "web",
Host: host,
ReverseURL: map[string]any{
2023-04-04 14:11:09 +08:00
"/": u,
},
2025-06-20 12:04:49 +08:00
AllowHTTPWithHttps: allowHttpInTls,
AutoGenerateCert: autogencert,
UsingSSL: enablessl,
SkipSSLVerify: skipsslverify,
Key: key,
Cert: cert,
IPFilterMode: 1,
2023-04-04 14:11:09 +08:00
}
reverse := ReverseConfig{
Addr: addr,
Port: port,
Config: []*SingleReverseConfig{cfg},
routes: map[string]*SingleReverseConfig{
host: cfg,
},
}
2023-04-04 14:11:09 +08:00
go func() {
sig := make(chan os.Signal)
signal.Notify(sig, os.Kill, os.Interrupt)
starlog.Noticeln("Stop Due to Recv Siganl", <-sig)
reverse.Close()
}()
err = reverse.Run()
if err != nil {
starlog.Errorln("Http Reverse Proxy Exit Error", err)
os.Exit(2)
}
starlog.Infoln("Http Reverse Proxy Exit Normally")
return
},
}