From 813c5fef94654f310a6a0acd6eae4f9ddba87d42 Mon Sep 17 00:00:00 2001
From: nadoo <287492+nadoo@users.noreply.github.com>
Date: Wed, 16 Feb 2022 23:37:25 +0800
Subject: [PATCH] config: added new flag `example` to print usage examples
---
README.md | 133 ++++++++++++++++++++++-------------------
config.go | 78 ++++++++++++++++++------
proxy/dialer.go | 4 +-
proxy/server.go | 4 +-
proxy/trojan/trojan.go | 13 ++--
proxy/usage.go | 6 +-
6 files changed, 146 insertions(+), 92 deletions(-)
diff --git a/README.md b/README.md
index adcbe65..216d3ca 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ we can set up local listeners as proxy servers, and forward requests to internet
- Services:
- dhcpd: a simple dhcp server that can detect existing dhcp server and avoid conflicts
-## Supported Protocols
+## Protocols
click to see details
@@ -82,12 +82,21 @@ we can set up local listeners as proxy servers, and forward requests to internet
- Docker: `docker pull nadoo/glider`
- ArchLinux: `sudo pacman -S glider`
-## Usage
-
-#### Show help
+## Run
```bash
-glider -h
+glider -config CONFIG_PATH
+```
+```bash
+glider -verbose -listen :8443 -forward SCHEME://HOST:PORT
+```
+
+## Usage
+
+**Show help:**
+
+```bash
+glider -help
```
click to see details
@@ -137,6 +146,8 @@ OPTION:
remote dns server address
-dnstimeout int
timeout value used in multiple dnsservers switch(seconds) (default 3)
+ -example
+ show usage examples
-forward value
forward url, see the URL section below
-include value
@@ -156,7 +167,7 @@ OPTION:
-rules-dir string
rule file folder
-scheme string
- show help message of proxy scheme, use 'all' to see all
+ show help message of proxy scheme, use 'all' to see all schemes
-service value
run specified services, format: SERVICE_NAME[,SERVICE_CONFIG]
-strategy string
@@ -183,10 +194,10 @@ URL:
-forward socks5://serverA:1080,socks5://serverB:1080 (proxy chain)
SCHEME:
- listen : kcp,socks5,tls,smux,ss,vless,redir,tproxy,mixed,wss,redir6,http,pxyproto,tcp,trojan,trojanc,udp,ws,unix
- forward: trojanc,udp,vless,vmess,socks4,tcp,tls,trojan,http,kcp,smux,ws,simple-obfs,unix,ss,ssh,ssr,wss,direct,socks5,reject,socks4a
+ listen : http kcp mixed pxyproto redir redir6 smux socks5 ss tcp tls tproxy trojan trojanc udp unix vless ws wss
+ forward: direct http kcp reject simple-obfs smux socks4 socks4a socks5 ss ssh ssr tcp tls trojan trojanc udp unix vless vmess ws wss
- Note: use `glider -scheme all` or `glider -scheme SCHEME` to see help info for the scheme.
+ Note: use 'glider -scheme all' or 'glider -scheme SCHEME' to see help info for the scheme.
--
Forwarder Options: FORWARD_URL#OPTIONS
@@ -201,23 +212,20 @@ Services:
dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP,LEASE_MINUTES[,MAC=IP,MAC=IP...]
e.g. service=dhcpd,eth1,192.168.1.100,192.168.1.199,720
+--
+Help:
+ glider -help
+ glider -scheme all
+ glider -example
+
see README.md and glider.conf.example for more details.
--
-glider v0.16.0, https://github.com/nadoo/glider
+glider 0.16.0, https://github.com/nadoo/glider
```
-#### Run it
-
-```bash
-glider -config CONFIG_PATH
-```
-```bash
-glider -verbose -listen :8443 -forward SCHEME://HOST:PORT
-```
-
-#### Show Schemes
+**Show Schemes:**
```bash
glider -scheme all
@@ -335,6 +343,48 @@ TLS and Websocket with a specified proxy protocol:
+**Show Examples:**
+
+```bash
+glider -example
+```
+
+
+click to see details
+
+```bash
+Examples:
+ glider -config glider.conf
+ -run glider with specified config file.
+
+ glider -listen :8443 -verbose
+ -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode.
+
+ glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1
+ -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode.
+
+ glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose
+ -listen on :443 as a https(http over tls) proxy server.
+
+ glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080
+ -listen on :8080 as a http proxy server, forward all requests via forward chain.
+
+ glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10
+ -serverA will only be used when serverB and serverC are not available.
+
+ glider -listen tcp://:80 -forward tcp://serverA:80
+ -tcp tunnel: listen on :80 and forward all requests to serverA:80.
+
+ glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53
+ -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server.
+
+ glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4
+ -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server.
+```
+
+
+
+
## Config
- [ConfigFile](config)
@@ -420,49 +470,6 @@ TLS and Websocket with a specified proxy protocol:
-## Examples
-
-
-click to see details
-
-```bash
-Examples:
- glider -config glider.conf
- -run glider with specified config file.
-
- glider -listen :8443 -verbose
- -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode.
-
- glider -listen ss://AEAD_AES_128_GCM:pass@:8443 -verbose
- -listen on 0.0.0.0:8443 as a ss server.
-
- glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose
- -listen on :443 as a https(http over tls) proxy server.
-
- glider -listen http://:8080 -forward socks5://127.0.0.1:1080
- -listen on :8080 as a http proxy server, forward all requests via socks5 server.
-
- glider -listen socks5://:1080 -forward "tls://abc.com:443,vmess://security:uuid@?alterID=10"
- -listen on :1080 as a socks5 server, forward all requests via remote tls+vmess server.
-
- glider -listen socks5://:1080 -forward ss://method:pass@server1:port1 -forward ss://method:pass@server2:port2 -strategy rr
- -listen on :1080 as socks5 server, forward requests via server1 and server2 in round robin mode.
-
- glider -listen tcp://:80 -forward tcp://2.2.2.2:80
- -tcp tunnel: listen on :80 and forward all requests to 2.2.2.2:80.
-
- glider -listen udp://:53 -forward ss://method:pass@1.1.1.1:8443,udp://8.8.8.8:53
- -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote ss server.
-
- glider -listen socks5://:1080 -listen http://:8080 -forward ss://method:pass@1.1.1.1:8443
- -listen on :1080 as socks5 server, :8080 as http proxy server, forward all requests via remote ss server.
-
- glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward ss://method:pass@server:port -dnsrecord=www.example.com/1.2.3.4
- -listen on :53 as dns server, forward to 8.8.8.8:53 via ss server.
-```
-
-
-
## Links
- [ipset](https://github.com/nadoo/ipset): netlink ipset package for Go.
diff --git a/config.go b/config.go
index d297552..551cacd 100644
--- a/config.go
+++ b/config.go
@@ -43,7 +43,8 @@ func parseConfig() *Config {
flag.SetOutput(os.Stdout)
- scheme := flag.String("scheme", "", "show help message of proxy scheme, use 'all' to see all ")
+ scheme := flag.String("scheme", "", "show help message of proxy scheme, use 'all' to see all schemes")
+ example := flag.Bool("example", false, "show usage examples")
flag.BoolVar(&conf.Verbose, "verbose", false, "verbose mode")
flag.IntVar(&conf.LogFlags, "logflags", 19, "do not change it if you do not know what it is, ref: https://pkg.go.dev/log#pkg-constants")
@@ -98,7 +99,12 @@ check=disable: disable health check`)
}
if *scheme != "" {
- fmt.Fprintf(os.Stdout, proxy.Usage(*scheme))
+ fmt.Fprintf(flag.Output(), proxy.Usage(*scheme))
+ os.Exit(0)
+ }
+
+ if *example {
+ fmt.Fprintf(flag.Output(), examples)
os.Exit(0)
}
@@ -154,20 +160,21 @@ check=disable: disable health check`)
}
func usage() {
- w := flag.Output()
+ fmt.Fprint(flag.Output(), usage1)
+ flag.PrintDefaults()
+ fmt.Fprintf(flag.Output(), usage2, proxy.ServerSchemes(), proxy.DialerSchemes(), version)
+}
- fmt.Fprint(w, `
+var usage1 = `
Usage: glider [-listen URL]... [-forward URL]... [OPTION]...
e.g. glider -config /etc/glider/glider.conf
glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080 -verbose
-`)
+OPTION:
+`
- fmt.Fprintf(w, "OPTION:\n")
- flag.PrintDefaults()
-
- fmt.Fprint(w, `
+var usage2 = `
URL:
proxy: SCHEME://[USER:PASS@][HOST]:PORT
chain: proxy,proxy[,proxy]...
@@ -179,14 +186,12 @@ URL:
-forward tls://server.com:443,http:// (protocol chain)
-forward socks5://serverA:1080,socks5://serverB:1080 (proxy chain)
-`)
+SCHEME:
+ listen : %s
+ forward: %s
- fmt.Fprintf(w, "SCHEME:\n")
- fmt.Fprintf(w, " listen : %s\n", proxy.ServerSchemes())
- fmt.Fprintf(w, " forward: %s\n", proxy.DialerSchemes())
- fmt.Fprintf(w, "\n Note: use `glider -scheme all` or `glider -scheme SCHEME` to see help info for the scheme.\n")
+ Note: use 'glider -scheme all' or 'glider -scheme SCHEME' to see help info for the scheme.
- fmt.Fprint(w, `
--
Forwarder Options: FORWARD_URL#OPTIONS
priority : the priority of that forwarder, the larger the higher, default: 0
@@ -200,8 +205,43 @@ Services:
dhcpd: service=dhcpd,INTERFACE,START_IP,END_IP,LEASE_MINUTES[,MAC=IP,MAC=IP...]
e.g. service=dhcpd,eth1,192.168.1.100,192.168.1.199,720
-see README.md and glider.conf.example for more details.
-`)
+--
+Help:
+ glider -help
+ glider -scheme all
+ glider -example
- fmt.Fprintf(w, "--\nglider v%s, https://github.com/nadoo/glider\n\n", version)
-}
+see README.md and glider.conf.example for more details.
+--
+glider %s, https://github.com/nadoo/glider
+`
+
+var examples = `
+Examples:
+ glider -config glider.conf
+ -run glider with specified config file.
+
+ glider -listen :8443 -verbose
+ -listen on :8443, serve as http/socks5 proxy on the same port, in verbose mode.
+
+ glider -listen :8443 -forward direct://#interface=eth0 -forward direct://#interface=eth1
+ -listen on 8443 and forward requests via interface eth0 and eth1 in round robin mode.
+
+ glider -listen tls://:443?cert=crtFilePath&key=keyFilePath,http:// -verbose
+ -listen on :443 as a https(http over tls) proxy server.
+
+ glider -listen http://:8080 -forward socks5://serverA:1080,socks5://serverB:1080
+ -listen on :8080 as a http proxy server, forward all requests via forward chain.
+
+ glider -listen :8443 -forward socks5://serverA:1080 -forward socks5://serverB:1080#priority=10 -forward socks5://serverC:1080#priority=10
+ -serverA will only be used when serverB and serverC are not available.
+
+ glider -listen tcp://:80 -forward tcp://serverA:80
+ -tcp tunnel: listen on :80 and forward all requests to serverA:80.
+
+ glider -listen udp://:53 -forward socks5://serverA:1080,udp://8.8.8.8:53
+ -listen on :53 and forward all udp requests to 8.8.8.8:53 via remote socks5 server.
+
+ glider -verbose -listen -dns=:53 -dnsserver=8.8.8.8:53 -forward socks5://serverA:1080 -dnsrecord=www.example.com/1.2.3.4
+ -listen on :53 as dns server, forward to 8.8.8.8:53 via socks5 server.
+`
diff --git a/proxy/dialer.go b/proxy/dialer.go
index 4112468..753fa6a 100644
--- a/proxy/dialer.go
+++ b/proxy/dialer.go
@@ -3,6 +3,7 @@ package proxy
import (
"errors"
"net"
+ "sort"
"strings"
)
@@ -73,5 +74,6 @@ func DialerSchemes() string {
for name := range dialerCreators {
s = append(s, name)
}
- return strings.Join(s, ",")
+ sort.Strings(s)
+ return strings.Join(s, " ")
}
diff --git a/proxy/server.go b/proxy/server.go
index c674420..a0cf2f5 100644
--- a/proxy/server.go
+++ b/proxy/server.go
@@ -3,6 +3,7 @@ package proxy
import (
"errors"
"net"
+ "sort"
"strings"
)
@@ -58,5 +59,6 @@ func ServerSchemes() string {
for name := range serverCreators {
s = append(s, name)
}
- return strings.Join(s, ",")
+ sort.Strings(s)
+ return strings.Join(s, " ")
}
diff --git a/proxy/trojan/trojan.go b/proxy/trojan/trojan.go
index 6ee811c..cda4c64 100644
--- a/proxy/trojan/trojan.go
+++ b/proxy/trojan/trojan.go
@@ -51,12 +51,13 @@ func NewTrojan(s string, d proxy.Dialer, p proxy.Proxy) (*Trojan, error) {
fallback: query.Get("fallback"),
}
- if _, port, _ := net.SplitHostPort(t.addr); port == "" {
- t.addr = net.JoinHostPort(t.addr, "443")
- }
-
- if t.serverName == "" {
- t.serverName = t.addr[:strings.LastIndex(t.addr, ":")]
+ if t.addr != "" {
+ if _, port, _ := net.SplitHostPort(t.addr); port == "" {
+ t.addr = net.JoinHostPort(t.addr, "443")
+ }
+ if t.serverName == "" {
+ t.serverName = t.addr[:strings.LastIndex(t.addr, ":")]
+ }
}
// pass
diff --git a/proxy/usage.go b/proxy/usage.go
index f707fd6..d9a1241 100644
--- a/proxy/usage.go
+++ b/proxy/usage.go
@@ -2,8 +2,10 @@ package proxy
import "strings"
-var msg strings.Builder
-var usages = make(map[string]string)
+var (
+ msg strings.Builder
+ usages = make(map[string]string)
+)
// AddUsage adds help message for the named proxy.
func AddUsage(name, usage string) {