Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5c79e4148 | ||
|
|
9a849a29e9 | ||
|
|
6b80861bd6 | ||
|
|
fa0e84382e | ||
|
|
1a11b28f8d | ||
|
|
bed13d7ef1 | ||
|
|
e7d76b180d | ||
|
|
dba8925eaa | ||
|
|
55da58eca4 | ||
|
|
76a1efccd9 | ||
|
|
980f084ad1 | ||
|
|
3bf1eb8565 | ||
|
|
b2ae433e18 | ||
|
|
aa0a41ee4e | ||
|
|
1ea1530b36 | ||
|
|
e0c45a1aca | ||
|
|
813c45f5c2 | ||
|
|
aa74dc4646 | ||
|
|
2406ecdfea | ||
|
|
8668fef136 | ||
|
|
ea62bc5a34 | ||
|
|
23bb76397a | ||
|
|
487c8d7c29 | ||
|
|
f480160e2d | ||
|
|
30c246c488 | ||
|
|
75f3bce04d | ||
|
|
adc3adc13b | ||
|
|
e62d9a5242 | ||
|
|
134a46c00b | ||
|
|
ae08811636 | ||
|
|
6451583e60 |
No files matched your search
@@ -2,7 +2,7 @@ export PATH := $(GOPATH)/bin:$(PATH)
|
||||
export GO111MODULE=on
|
||||
LDFLAGS := -s -w
|
||||
|
||||
os-archs=darwin:amd64 darwin:arm64 freebsd:386 freebsd:amd64 linux:386 linux:amd64 linux:arm windows:386 windows:amd64 linux:mips64 linux:mips64le linux:mips:softfloat linux:mipsle:softfloat
|
||||
os-archs=darwin:amd64 darwin:arm64 freebsd:386 freebsd:amd64 linux:386 linux:amd64 linux:arm linux:arm64 windows:386 windows:amd64 linux:mips64 linux:mips64le linux:mips:softfloat linux:mipsle:softfloat
|
||||
|
||||
all: build
|
||||
|
||||
|
||||
@@ -732,7 +732,7 @@ This feature is suitable for a large number of short connections.
|
||||
|
||||
Load balancing is supported by `group`.
|
||||
|
||||
This feature is only available for types `tcp` and `http` now.
|
||||
This feature is only available for types `tcp`, `http`, `tcpmux` now.
|
||||
|
||||
```ini
|
||||
# frpc.ini
|
||||
@@ -1006,7 +1006,7 @@ frpc will generate 8 proxies like `test_tcp_0`, `test_tcp_1`, ..., `test_tcp_7`.
|
||||
|
||||
frpc only forwards requests to local TCP or UDP ports by default.
|
||||
|
||||
Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file` and you can see [example usage](#example-usage).
|
||||
Plugins are used for providing rich features. There are built-in plugins such as `unix_domain_socket`, `http_proxy`, `socks5`, `static_file`, `http2https`, `https2http`, `https2https` and you can see [example usage](#example-usage).
|
||||
|
||||
Specify which plugin to use with the `plugin` parameter. Configuration parameters of plugin should be started with `plugin_`. `local_ip` and `local_port` are not used for plugin.
|
||||
|
||||
|
||||
@@ -5,6 +5,6 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xa5=9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\x07w\x0e`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xLine truncated
|
||||
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00w5vR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\xa2<X`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xc1\xa6Line truncated
|
||||
fs.Register(data)
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?b8b55d8156200869417b"></script><script type="text/javascript" src="vendor.js?3e078a9d741093b909de"></script></body> </html>
|
||||
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?782d7b1b910e824ac986"></script><script type="text/javascript" src="vendor.js?7f899297af075fb3b085"></script></body> </html>
|
||||
@@ -1 +1 @@
|
||||
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(r&&r(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=n(n.s=c[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var u=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=u;var c=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"3e078a9d741093b909de"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,c.appendChild(i),u},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
|
||||
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(r&&r(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=n(n.s=c[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var u=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=u;var c=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"7f899297af075fb3b085"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,c.appendChild(i),u},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
|
||||
@@ -1 +1 @@
|
||||
webpackJsonp([0],[function(e,t){function n(e,t){q[e]=t}function o(e){if(null==e||"object"!=typeof e)return e;var t=e,n=V.call(e);if("[object Array]"===n){t=[];for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}else if(F[n]){var a=e.constructor;if(e.constructor.from)t=a.from(e);else{t=new a(e.length);for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}}else if(!B[n]&&!D(e)&&!M(e)){t={};for(var l in e)e.hasOwnProperty(l)&&(t[l]=o(e[l]))}return t}function i(e,t,n){if(!k(t)||!k(e))return n?o(t):e;for(var r in t)if(t.hasOwnProperty(r)){var a=e[r],l=t[r];!k(l)||!k(a)||y(l)||y(a)||M(l)||M(a)||S(l)||S(a)||D(l)||D(a)?!n&&r in e||(e[r]=o(t[r],!0)):i(a,l,n)}return e}function r(e,t){for(var n=e[0],o=1,r=e.length;o<r;o++)n=i(n,e[o],t);return n}function a(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function l(e,t,n){for(var o in t)t.hasOwnProperty(o)&&(n?null!=t[o]:null==e[o])&&(e[o]=t[o]);return e}function s(){return Z||(Z=Y().getContext("2d")),Z}function c(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;n++)if(e[n]===t)return n}return-1}function u(e,t){function n(){}var o=e.prototype;n.prototype=t.prototype,e.prototype=new n;for(var i in o)e.prototype[i]=o[i];e.prototype.constructor=e,e.superClass=t}function d(e,t,n){e="prototype"in e?e.prototype:e,t="prototype"in t?t.prototype:t,l(e,t,n)}function f(e){if(e)return"string"!=typeof e&&"number"==typeof e.length}function p(e,t,n){if(e&&t)if(e.forEach&&e.forEach===$)e.forEach(t,n);else if(e.length===+e.length)for(var o=0,i=e.length;o<i;o++)t.call(n,e[o],o,e);else for(var r in e)e.hasOwnProperty(r)&&t.call(n,e[r],r,e)}function h(e,t,n){if(e&&t){if(e.map&&e.map===G)return e.map(t,n);for(var o=[],i=0,r=e.length;i<r;i++)o.push(t.call(n,e[i],i,e));return o}}function g(e,t,n,o){if(e&&t){if(e.reduce&&e.reduce===U)return e.reduce(t,n,o);for(var i=0,r=e.length;i<r;i++)n=t.call(o,n,e[i],i,e);return n}}function m(e,t,n){if(e&&t){if(e.filter&&e.filter===H)return e.filter(t,n);for(var o=[],i=0,r=e.length;i<r;i++)t.call(n,e[i],i,e)&&o.push(e[i]);return o}}function v(e,t,n){if(e&&t)for(var o=0,i=e.length;o<i;o++)if(t.call(n,e[o],o,e))return e[o]}function b(e,t){var n=W.call(arguments,2);return function(){return e.apply(t,n.concat(W.call(arguments)))}}function x(e){var t=W.call(arguments,1);return function(){return e.apply(this,t.concat(W.call(arguments)))}}function y(e){return"[object Array]"===V.call(e)}function _(e){return"function"==typeof e}function w(e){return"[object String]"===V.call(e)}function k(e){var t=typeof e;return"function"===t||!!e&&"object"==t}function S(e){return!!B[V.call(e)]}function M(e){return"object"==typeof e&&"number"==typeof e.nodeType&&"object"==typeof e.ownerDocument}function C(e){return e!==e}function A(e){for(var t=0,n=arguments.length;t<n;t++)if(null!=arguments[t])return arguments[t]}function T(e,t){return null!=e?e:t}function E(e,t,n){return null!=e?e:null!=t?t:n}function I(){return Function.call.apply(W,arguments)}function O(e){if("number"==typeof e)return[e,e,e,e];var t=e.length;return 2===t?[e[0],e[1],e[0],e[1]]:3===t?[e[0],e[1],e[2],e[1]]:e}function L(e,t){if(!e)throw new Error(t)}function P(e){e[X]=!0}function D(e){return e[X]}function z(e){e&&p(e,function(e,t){this.set(t,e)},this)}function R(e){return new z(e)}function N(){}var B={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},F={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},V=Object.prototype.toString,j=Array.prototype,$=j.forEach,H=j.filter,W=j.slice,G=j.map,U=j.reduce,q={},Y=function(){return q.createCanvas()};q.createCanvas=function(){return document.createElement("canvas")};var Z,X="__ec_primitive__";z.prototype={constructor:z,get:function(e){return this["_ec_"+e]},set:function(e,t){return this["_ec_"+e]=t,t},each:function(e,t){void 0!==t&&(e=b(e,t));for(var n in this)this.hasOwnProperty(n)&&e(this[n],n.slice(4))},removeKey:function(e){delete this["_ec_"+e]}},t.$override=n,t.clone=o,t.merge=i,t.mergeAll=r,t.extend=a,t.defaults=l,t.createCanvas=Y,t.getContext=s,t.indexOf=c,t.inherits=u,t.mixin=d,t.isArrayLike=f,t.each=p,t.map=h,t.reduce=g,t.filter=m,t.find=v,t.bind=b,t.curry=x,t.isArray=y,t.isFunction=_,t.isString=w,t.isObject=k,t.isBuiltInObject=S,t.isDom=M,t.eqNaN=C,t.retrieve=A,t.retrieve2=T,t.retrieve3=E,t.slice=I,t.normalizeCssArray=O,t.assert=L,t.setAsPrimitive=P,t.isPrimitive=D,t.createHashMap=R,t.noop=N},function(e,t,n){function o(e){return function(t,n,o){t=t&&t.toLowerCase(),J.prototype[e].call(this,t,n,o)}}function i(){J.call(this)}function r(e,t,n){function o(e,t){return e.prio-t.prio}n=n||{},"string"==typeof t&&(t=Pe[t]),this.id,this.group,this._dom=e;var r=this._zr=q.init(e,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.widthLine truncated
|
||||
webpackJsonp([0],[function(e,t){function n(e,t){q[e]=t}function o(e){if(null==e||"object"!=typeof e)return e;var t=e,n=V.call(e);if("[object Array]"===n){t=[];for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}else if(F[n]){var a=e.constructor;if(e.constructor.from)t=a.from(e);else{t=new a(e.length);for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}}else if(!B[n]&&!D(e)&&!M(e)){t={};for(var l in e)e.hasOwnProperty(l)&&(t[l]=o(e[l]))}return t}function i(e,t,n){if(!k(t)||!k(e))return n?o(t):e;for(var r in t)if(t.hasOwnProperty(r)){var a=e[r],l=t[r];!k(l)||!k(a)||y(l)||y(a)||M(l)||M(a)||S(l)||S(a)||D(l)||D(a)?!n&&r in e||(e[r]=o(t[r],!0)):i(a,l,n)}return e}function r(e,t){for(var n=e[0],o=1,r=e.length;o<r;o++)n=i(n,e[o],t);return n}function a(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function l(e,t,n){for(var o in t)t.hasOwnProperty(o)&&(n?null!=t[o]:null==e[o])&&(e[o]=t[o]);return e}function s(){return Z||(Z=Y().getContext("2d")),Z}function c(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;n++)if(e[n]===t)return n}return-1}function u(e,t){function n(){}var o=e.prototype;n.prototype=t.prototype,e.prototype=new n;for(var i in o)e.prototype[i]=o[i];e.prototype.constructor=e,e.superClass=t}function d(e,t,n){e="prototype"in e?e.prototype:e,t="prototype"in t?t.prototype:t,l(e,t,n)}function f(e){if(e)return"string"!=typeof e&&"number"==typeof e.length}function p(e,t,n){if(e&&t)if(e.forEach&&e.forEach===$)e.forEach(t,n);else if(e.length===+e.length)for(var o=0,i=e.length;o<i;o++)t.call(n,e[o],o,e);else for(var r in e)e.hasOwnProperty(r)&&t.call(n,e[r],r,e)}function h(e,t,n){if(e&&t){if(e.map&&e.map===G)return e.map(t,n);for(var o=[],i=0,r=e.length;i<r;i++)o.push(t.call(n,e[i],i,e));return o}}function g(e,t,n,o){if(e&&t){if(e.reduce&&e.reduce===U)return e.reduce(t,n,o);for(var i=0,r=e.length;i<r;i++)n=t.call(o,n,e[i],i,e);return n}}function m(e,t,n){if(e&&t){if(e.filter&&e.filter===H)return e.filter(t,n);for(var o=[],i=0,r=e.length;i<r;i++)t.call(n,e[i],i,e)&&o.push(e[i]);return o}}function v(e,t,n){if(e&&t)for(var o=0,i=e.length;o<i;o++)if(t.call(n,e[o],o,e))return e[o]}function b(e,t){var n=W.call(arguments,2);return function(){return e.apply(t,n.concat(W.call(arguments)))}}function x(e){var t=W.call(arguments,1);return function(){return e.apply(this,t.concat(W.call(arguments)))}}function y(e){return"[object Array]"===V.call(e)}function _(e){return"function"==typeof e}function w(e){return"[object String]"===V.call(e)}function k(e){var t=typeof e;return"function"===t||!!e&&"object"==t}function S(e){return!!B[V.call(e)]}function M(e){return"object"==typeof e&&"number"==typeof e.nodeType&&"object"==typeof e.ownerDocument}function C(e){return e!==e}function A(e){for(var t=0,n=arguments.length;t<n;t++)if(null!=arguments[t])return arguments[t]}function T(e,t){return null!=e?e:t}function E(e,t,n){return null!=e?e:null!=t?t:n}function I(){return Function.call.apply(W,arguments)}function O(e){if("number"==typeof e)return[e,e,e,e];var t=e.length;return 2===t?[e[0],e[1],e[0],e[1]]:3===t?[e[0],e[1],e[2],e[1]]:e}function L(e,t){if(!e)throw new Error(t)}function P(e){e[X]=!0}function D(e){return e[X]}function z(e){e&&p(e,function(e,t){this.set(t,e)},this)}function R(e){return new z(e)}function N(){}var B={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},F={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},V=Object.prototype.toString,j=Array.prototype,$=j.forEach,H=j.filter,W=j.slice,G=j.map,U=j.reduce,q={},Y=function(){return q.createCanvas()};q.createCanvas=function(){return document.createElement("canvas")};var Z,X="__ec_primitive__";z.prototype={constructor:z,get:function(e){return this["_ec_"+e]},set:function(e,t){return this["_ec_"+e]=t,t},each:function(e,t){void 0!==t&&(e=b(e,t));for(var n in this)this.hasOwnProperty(n)&&e(this[n],n.slice(4))},removeKey:function(e){delete this["_ec_"+e]}},t.$override=n,t.clone=o,t.merge=i,t.mergeAll=r,t.extend=a,t.defaults=l,t.createCanvas=Y,t.getContext=s,t.indexOf=c,t.inherits=u,t.mixin=d,t.isArrayLike=f,t.each=p,t.map=h,t.reduce=g,t.filter=m,t.find=v,t.bind=b,t.curry=x,t.isArray=y,t.isFunction=_,t.isString=w,t.isObject=k,t.isBuiltInObject=S,t.isDom=M,t.eqNaN=C,t.retrieve=A,t.retrieve2=T,t.retrieve3=E,t.slice=I,t.normalizeCssArray=O,t.assert=L,t.setAsPrimitive=P,t.isPrimitive=D,t.createHashMap=R,t.noop=N},function(e,t,n){function o(e){return function(t,n,o){t=t&&t.toLowerCase(),J.prototype[e].call(this,t,n,o)}}function i(){J.call(this)}function r(e,t,n){function o(e,t){return e.prio-t.prio}n=n||{},"string"==typeof t&&(t=Pe[t]),this.id,this.group,this._dom=e;var r=this._zr=q.init(e,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.widthLine truncated
|
||||
@@ -5,6 +5,6 @@ import (
|
||||
)
|
||||
|
||||
func init() {
|
||||
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xa5=9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\x07w\x0e`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xLine truncated
|
||||
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00w5vR\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\xa2<X`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xc1\xa6Line truncated
|
||||
fs.Register(data)
|
||||
}
|
||||
+7
-11
@@ -139,8 +139,10 @@ func parseClientCommonCfg(fileType int, source []byte) (cfg config.ClientCommonC
|
||||
return
|
||||
}
|
||||
|
||||
err = cfg.Check()
|
||||
cfg.Complete()
|
||||
err = cfg.Validate()
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Parse config error: %v", err)
|
||||
return
|
||||
}
|
||||
return
|
||||
@@ -167,11 +169,6 @@ func parseClientCommonCfgFromCmd() (cfg config.ClientCommonConf, err error) {
|
||||
cfg.LogLevel = logLevel
|
||||
cfg.LogFile = logFile
|
||||
cfg.LogMaxDays = int64(logMaxDays)
|
||||
if logFile == "console" {
|
||||
cfg.LogWay = "console"
|
||||
} else {
|
||||
cfg.LogWay = "file"
|
||||
}
|
||||
cfg.DisableLogColor = disableLogColor
|
||||
|
||||
// Only token authentication is supported in cmd mode
|
||||
@@ -186,21 +183,20 @@ func runClient(cfgFilePath string) (err error) {
|
||||
var content []byte
|
||||
content, err = config.GetRenderedConfFromFile(cfgFilePath)
|
||||
if err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
cfg, err := parseClientCommonCfg(CfgFileTypeIni, content)
|
||||
if err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
pxyCfgs, visitorCfgs, err := config.LoadAllProxyConfsFromIni(cfg.User, content, cfg.Start)
|
||||
if err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
err = startService(cfg, pxyCfgs, visitorCfgs, cfgFilePath)
|
||||
return
|
||||
return startService(cfg, pxyCfgs, visitorCfgs, cfgFilePath)
|
||||
}
|
||||
|
||||
func startService(
|
||||
|
||||
+10
-10
@@ -105,7 +105,6 @@ var rootCmd = &cobra.Command{
|
||||
var cfg config.ServerCommonConf
|
||||
var err error
|
||||
if cfgFile != "" {
|
||||
log.Info("frps uses config file: %s", cfgFile)
|
||||
var content []byte
|
||||
content, err = config.GetRenderedConfFromFile(cfgFile)
|
||||
if err != nil {
|
||||
@@ -113,7 +112,6 @@ var rootCmd = &cobra.Command{
|
||||
}
|
||||
cfg, err = parseServerCommonCfg(CfgFileTypeIni, content)
|
||||
} else {
|
||||
log.Info("frps uses command line arguments for config")
|
||||
cfg, err = parseServerCommonCfg(CfgFileTypeCmd, nil)
|
||||
}
|
||||
if err != nil {
|
||||
@@ -144,9 +142,10 @@ func parseServerCommonCfg(fileType int, source []byte) (cfg config.ServerCommonC
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = cfg.Check()
|
||||
cfg.Complete()
|
||||
err = cfg.Validate()
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Parse config error: %v", err)
|
||||
return
|
||||
}
|
||||
return
|
||||
@@ -190,18 +189,19 @@ func parseServerCommonCfgFromCmd() (cfg config.ServerCommonConf, err error) {
|
||||
}
|
||||
}
|
||||
cfg.MaxPortsPerClient = maxPortsPerClient
|
||||
|
||||
if logFile == "console" {
|
||||
cfg.LogWay = "console"
|
||||
} else {
|
||||
cfg.LogWay = "file"
|
||||
}
|
||||
cfg.DisableLogColor = disableLogColor
|
||||
return
|
||||
}
|
||||
|
||||
func runServer(cfg config.ServerCommonConf) (err error) {
|
||||
log.InitLog(cfg.LogWay, cfg.LogFile, cfg.LogLevel, cfg.LogMaxDays, cfg.DisableLogColor)
|
||||
|
||||
if cfgFile != "" {
|
||||
log.Info("frps uses config file: %s", cfgFile)
|
||||
} else {
|
||||
log.Info("frps uses command line arguments for config")
|
||||
}
|
||||
|
||||
svr, err := server.NewService(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
+16
-4
@@ -29,7 +29,7 @@ import (
|
||||
// recommended to use GetDefaultClientConf instead of creating this object
|
||||
// directly, so that all unspecified fields have reasonable default values.
|
||||
type ClientCommonConf struct {
|
||||
auth.ClientConfig `ini:",extends" json:"inline"`
|
||||
auth.ClientConfig `ini:",extends"`
|
||||
|
||||
// ServerAddr specifies the address of the server to connect to. By
|
||||
// default, this value is "0.0.0.0".
|
||||
@@ -173,13 +173,21 @@ func GetDefaultClientConf() ClientCommonConf {
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *ClientCommonConf) Check() error {
|
||||
func (cfg *ClientCommonConf) Complete() {
|
||||
if cfg.LogFile == "console" {
|
||||
cfg.LogWay = "console"
|
||||
} else {
|
||||
cfg.LogWay = "file"
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *ClientCommonConf) Validate() error {
|
||||
if cfg.HeartbeatInterval <= 0 {
|
||||
return fmt.Errorf("Parse conf error: invalid heartbeat_interval")
|
||||
return fmt.Errorf("invalid heartbeat_interval")
|
||||
}
|
||||
|
||||
if cfg.HeartbeatTimeout < cfg.HeartbeatInterval {
|
||||
return fmt.Errorf("Parse conf error: invalid heartbeat_timeout, heartbeat_timeout is less than heartbeat_interval")
|
||||
return fmt.Errorf("invalid heartbeat_timeout, heartbeat_timeout is less than heartbeat_interval")
|
||||
}
|
||||
|
||||
if cfg.TLSEnable == false {
|
||||
@@ -196,6 +204,10 @@ func (cfg *ClientCommonConf) Check() error {
|
||||
}
|
||||
}
|
||||
|
||||
if cfg.Protocol != "tcp" && cfg.Protocol != "kcp" && cfg.Protocol != "websocket" {
|
||||
return fmt.Errorf("invalid protocol")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
+13
-13
@@ -144,8 +144,8 @@ type BaseProxyConf struct {
|
||||
Metas map[string]string `ini:"-" json:"metas"`
|
||||
|
||||
// TODO: LocalSvrConf => LocalAppConf
|
||||
LocalSvrConf `ini:",extends" json:"inline"`
|
||||
HealthCheckConf `ini:",extends" json:"inline"`
|
||||
LocalSvrConf `ini:",extends"`
|
||||
HealthCheckConf `ini:",extends"`
|
||||
}
|
||||
|
||||
type DomainConf struct {
|
||||
@@ -155,8 +155,8 @@ type DomainConf struct {
|
||||
|
||||
// HTTP
|
||||
type HTTPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
DomainConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
DomainConf `ini:",extends"`
|
||||
|
||||
Locations []string `ini:"locations" json:"locations"`
|
||||
HTTPUser string `ini:"http_user" json:"http_user"`
|
||||
@@ -167,27 +167,27 @@ type HTTPProxyConf struct {
|
||||
|
||||
// HTTPS
|
||||
type HTTPSProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
DomainConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
DomainConf `ini:",extends"`
|
||||
}
|
||||
|
||||
// TCP
|
||||
type TCPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
RemotePort int `ini:"remote_port" json:"remote_port"`
|
||||
}
|
||||
|
||||
// TCPMux
|
||||
type TCPMuxProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
DomainConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
DomainConf `ini:",extends"`
|
||||
|
||||
Multiplexer string `ini:"multiplexer"`
|
||||
}
|
||||
|
||||
// STCP
|
||||
type STCPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
|
||||
Role string `ini:"role" json:"role"`
|
||||
Sk string `ini:"sk" json:"sk"`
|
||||
@@ -195,7 +195,7 @@ type STCPProxyConf struct {
|
||||
|
||||
// XTCP
|
||||
type XTCPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
|
||||
Role string `ini:"role" json:"role"`
|
||||
Sk string `ini:"sk" json:"sk"`
|
||||
@@ -203,14 +203,14 @@ type XTCPProxyConf struct {
|
||||
|
||||
// UDP
|
||||
type UDPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
|
||||
RemotePort int `ini:"remote_port" json:"remote_port"`
|
||||
}
|
||||
|
||||
// SUDP
|
||||
type SUDPProxyConf struct {
|
||||
BaseProxyConf `ini:",extends" json:"inline"`
|
||||
BaseProxyConf `ini:",extends"`
|
||||
|
||||
Role string `ini:"role" json:"role"`
|
||||
Sk string `ini:"sk" json:"sk"`
|
||||
|
||||
+24
-8
@@ -29,7 +29,7 @@ import (
|
||||
// recommended to use GetDefaultServerConf instead of creating this object
|
||||
// directly, so that all unspecified fields have reasonable default values.
|
||||
type ServerCommonConf struct {
|
||||
auth.ServerConfig `ini:",extends" json:"inline"`
|
||||
auth.ServerConfig `ini:",extends"`
|
||||
|
||||
// BindAddr specifies the address that the server binds to. By default,
|
||||
// this value is "0.0.0.0".
|
||||
@@ -46,7 +46,7 @@ type ServerCommonConf struct {
|
||||
// this value is 0.
|
||||
KCPBindPort int `ini:"kcp_bind_port" json:"kcp_bind_port"`
|
||||
// ProxyBindAddr specifies the address that the proxy binds to. This value
|
||||
// may be the same as BindAddr. By default, this value is "0.0.0.0".
|
||||
// may be the same as BindAddr.
|
||||
ProxyBindAddr string `ini:"proxy_bind_addr" json:"proxy_bind_addr"`
|
||||
// VhostHTTPPort specifies the port that the server listens for HTTP Vhost
|
||||
// requests. If this value is 0, the server will not listen for HTTP
|
||||
@@ -174,7 +174,7 @@ func GetDefaultServerConf() ServerCommonConf {
|
||||
BindPort: 7000,
|
||||
BindUDPPort: 0,
|
||||
KCPBindPort: 0,
|
||||
ProxyBindAddr: "0.0.0.0",
|
||||
ProxyBindAddr: "",
|
||||
VhostHTTPPort: 0,
|
||||
VhostHTTPSPort: 0,
|
||||
TCPMuxHTTPConnectPort: 0,
|
||||
@@ -208,10 +208,6 @@ func GetDefaultServerConf() ServerCommonConf {
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *ServerCommonConf) Check() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func UnmarshalServerConfFromIni(source interface{}) (ServerCommonConf, error) {
|
||||
|
||||
f, err := ini.LoadSources(ini.LoadOptions{
|
||||
@@ -242,7 +238,7 @@ func UnmarshalServerConfFromIni(source interface{}) (ServerCommonConf, error) {
|
||||
if allowPortStr != "" {
|
||||
allowPorts, err := util.ParseRangeNumbers(allowPortStr)
|
||||
if err != nil {
|
||||
return ServerCommonConf{}, fmt.Errorf("Parse conf error: allow_ports: %v", err)
|
||||
return ServerCommonConf{}, fmt.Errorf("invalid allow_ports: %v", err)
|
||||
}
|
||||
for _, port := range allowPorts {
|
||||
common.AllowPorts[int(port)] = struct{}{}
|
||||
@@ -269,6 +265,26 @@ func UnmarshalServerConfFromIni(source interface{}) (ServerCommonConf, error) {
|
||||
return common, nil
|
||||
}
|
||||
|
||||
func (cfg *ServerCommonConf) Complete() {
|
||||
if cfg.LogFile == "console" {
|
||||
cfg.LogWay = "console"
|
||||
} else {
|
||||
cfg.LogWay = "file"
|
||||
}
|
||||
|
||||
if cfg.ProxyBindAddr == "" {
|
||||
cfg.ProxyBindAddr = cfg.BindAddr
|
||||
}
|
||||
|
||||
if cfg.TLSTrustedCaFile != "" {
|
||||
cfg.TLSOnly = true
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *ServerCommonConf) Validate() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func loadHTTPPluginOpt(section *ini.Section) (*plugin.HTTPPluginOptions, error) {
|
||||
name := strings.TrimSpace(strings.TrimPrefix(section.Name(), "plugin."))
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/fatedier/frp/pkg/auth"
|
||||
"github.com/fatedier/frp/pkg/plugin/server"
|
||||
plugin "github.com/fatedier/frp/pkg/plugin/server"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
@@ -133,7 +133,7 @@ func Test_LoadServerCommonConf(t *testing.T) {
|
||||
},
|
||||
MaxPoolCount: 59,
|
||||
MaxPortsPerClient: 9,
|
||||
TLSOnly: false,
|
||||
TLSOnly: true,
|
||||
TLSCertFile: "server.crt",
|
||||
TLSKeyFile: "server.key",
|
||||
TLSTrustedCaFile: "ca.crt",
|
||||
@@ -177,7 +177,7 @@ func Test_LoadServerCommonConf(t *testing.T) {
|
||||
BindAddr: "0.0.0.9",
|
||||
BindPort: 7009,
|
||||
BindUDPPort: 7008,
|
||||
ProxyBindAddr: "0.0.0.0",
|
||||
ProxyBindAddr: "0.0.0.9",
|
||||
VhostHTTPTimeout: 60,
|
||||
DashboardAddr: "0.0.0.0",
|
||||
DashboardUser: "admin",
|
||||
@@ -202,6 +202,7 @@ func Test_LoadServerCommonConf(t *testing.T) {
|
||||
for _, c := range testcases {
|
||||
actual, err := UnmarshalServerConfFromIni(c.source)
|
||||
assert.NoError(err)
|
||||
actual.Complete()
|
||||
assert.Equal(c.expected, actual)
|
||||
}
|
||||
}
|
||||
@@ -52,15 +52,15 @@ type BaseVisitorConf struct {
|
||||
}
|
||||
|
||||
type SUDPVisitorConf struct {
|
||||
BaseVisitorConf `ini:",extends" json:"inline"`
|
||||
BaseVisitorConf `ini:",extends"`
|
||||
}
|
||||
|
||||
type STCPVisitorConf struct {
|
||||
BaseVisitorConf `ini:",extends" json:"inline"`
|
||||
BaseVisitorConf `ini:",extends"`
|
||||
}
|
||||
|
||||
type XTCPVisitorConf struct {
|
||||
BaseVisitorConf `ini:",extends" json:"inline"`
|
||||
BaseVisitorConf `ini:",extends"`
|
||||
}
|
||||
|
||||
// DefaultVisitorConf creates a empty VisitorConf object by visitorType.
|
||||
|
||||
@@ -19,7 +19,7 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
var version string = "0.36.1"
|
||||
var version string = "0.36.2"
|
||||
|
||||
func Full() string {
|
||||
return version
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
},
|
||||
methods: {
|
||||
fetchData() {
|
||||
fetch('/api/serverinfo', {credentials: 'include'})
|
||||
fetch('../api/serverinfo', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
return Humanize.fileSize(row.traffic_out)
|
||||
},
|
||||
fetchData() {
|
||||
fetch('/api/serverinfo', {credentials: 'include'})
|
||||
fetch('../api/serverinfo', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
@@ -125,7 +125,7 @@
|
||||
if (this.vhost_http_port == null || this.vhost_http_port == 0) {
|
||||
return
|
||||
} else {
|
||||
fetch('/api/proxy/http', {credentials: 'include'})
|
||||
fetch('../api/proxy/http', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
return Humanize.fileSize(row.traffic_out)
|
||||
},
|
||||
fetchData() {
|
||||
fetch('/api/serverinfo', {credentials: 'include'})
|
||||
fetch('../api/serverinfo', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
@@ -120,7 +120,7 @@
|
||||
if (this.vhost_https_port == null || this.vhost_https_port == 0) {
|
||||
return
|
||||
} else {
|
||||
fetch('/api/proxy/https', {credentials: 'include'})
|
||||
fetch('../api/proxy/https', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -95,7 +95,7 @@
|
||||
return Humanize.fileSize(row.traffic_out)
|
||||
},
|
||||
fetchData() {
|
||||
fetch('/api/proxy/stcp', {credentials: 'include'})
|
||||
fetch('../api/proxy/stcp', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
return Humanize.fileSize(row.traffic_out)
|
||||
},
|
||||
fetchData() {
|
||||
fetch('/api/proxy/tcp', {credentials: 'include'})
|
||||
fetch('../api/proxy/tcp', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
return Humanize.fileSize(row.traffic_out)
|
||||
},
|
||||
fetchData() {
|
||||
fetch('/api/proxy/udp', {credentials: 'include'})
|
||||
fetch('../api/proxy/udp', {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
}).then(json => {
|
||||
|
||||
@@ -14,7 +14,7 @@ export default {
|
||||
//},
|
||||
methods: {
|
||||
fetchData() {
|
||||
let url = '/api/traffic/' + this.proxy_name
|
||||
let url = '../api/traffic/' + this.proxy_name
|
||||
fetch(url, {credentials: 'include'})
|
||||
.then(res => {
|
||||
return res.json()
|
||||
|
||||
@@ -54,8 +54,8 @@ class HttpProxy extends BaseProxy {
|
||||
this.custom_domains = proxyStats.conf.custom_domains
|
||||
this.host_header_rewrite = proxyStats.conf.host_header_rewrite
|
||||
this.locations = proxyStats.conf.locations
|
||||
if (proxyStats.conf.sub_domain != "") {
|
||||
this.subdomain = proxyStats.conf.sub_domain + "." + subdomain_host
|
||||
if (proxyStats.conf.subdomain != "") {
|
||||
this.subdomain = proxyStats.conf.subdomain + "." + subdomain_host
|
||||
} else {
|
||||
this.subdomain = ""
|
||||
}
|
||||
@@ -75,8 +75,8 @@ class HttpsProxy extends BaseProxy {
|
||||
this.port = port
|
||||
if (proxyStats.conf != null) {
|
||||
this.custom_domains = proxyStats.conf.custom_domains
|
||||
if (proxyStats.conf.sub_domain != "") {
|
||||
this.subdomain = proxyStats.conf.sub_domain + "." + subdomain_host
|
||||
if (proxyStats.conf.subdomain != "") {
|
||||
this.subdomain = proxyStats.conf.subdomain + "." + subdomain_host
|
||||
} else {
|
||||
this.subdomain = ""
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user