Browse Source

[Feature] Include RunId in FRP Server Plugin NewProxy message (#1700)

* feat: include RunId in FRP Server Plugin NewProxy message

* doc: rewrite server plugin documentation
Guy Lewin 5 years ago
parent
commit
10acf638f8
3 changed files with 37 additions and 22 deletions
  1. 35 22
      doc/server_plugin.md
  2. 1 0
      models/plugin/server/types.go
  3. 1 0
      server/control.go

+ 35 - 22
doc/server_plugin.md

@@ -1,24 +1,25 @@
-### Manage Plugin
+### Server Plugin
 
 
-frp manage plugin is aim to extend frp's ability without modifing self code.
+frp server plugin is aimed to extend frp's ability without modifying the Golang code.
 
 
-It runs as a process and listen on a port to provide RPC interface. Before frps doing some operations, frps will send RPC requests to manage plugin and do operations by it's response.
+An external server should run in a different process receiving RPC calls from frps.
+Before frps is doing some operations, it will send RPC requests to notify the external RPC server and act according to its response.
 
 
 ### RPC request
 ### RPC request
 
 
-Support HTTP first.
+RPC requests are based on JSON over HTTP.
 
 
-When manage plugin accept the operation request, it can give three different responses.
+When a server plugin accepts an operation request, it can respond with three different responses:
 
 
-* Reject operation and return the reason.
+* Reject operation and return a reason.
 * Allow operation and keep original content.
 * Allow operation and keep original content.
 * Allow operation and return modified content.
 * Allow operation and return modified content.
 
 
 ### Interface
 ### Interface
 
 
-HTTP path can be configured for each manage plugin in frps. Assume here is `/handler`.
+HTTP path can be configured for each manage plugin in frps. We'll assume for this example that it's `/handler`.
 
 
-Request
+A request to the RPC server will look like:
 
 
 ```
 ```
 POST /handler
 POST /handler
@@ -30,15 +31,15 @@ POST /handler
     }
     }
 }
 }
 
 
-Request Header
+Request Header:
 X-Frp-Reqid: for tracing
 X-Frp-Reqid: for tracing
 ```
 ```
 
 
-Response
+The response can look like any of the following:
 
 
-Error if not return 200 http code.
+* Non-200 HTTP response status code (this will automatically tell frps that the request should fail)
 
 
-Reject opeartion
+* Reject operation:
 
 
 ```
 ```
 {
 {
@@ -47,7 +48,7 @@ Reject opeartion
 }
 }
 ```
 ```
 
 
-Allow operation and keep original content
+* Allow operation and keep original content:
 
 
 ```
 ```
 {
 {
@@ -56,7 +57,7 @@ Allow operation and keep original content
 }
 }
 ```
 ```
 
 
-Allow opeartion and modify content
+* Allow operation and modify content
 
 
 ```
 ```
 {
 {
@@ -69,7 +70,7 @@ Allow opeartion and modify content
 
 
 ### Operation
 ### Operation
 
 
-Now it supports `Login` and `NewProxy`.
+Currently `Login` and `NewProxy` operations are supported.
 
 
 #### Login
 #### Login
 
 
@@ -102,6 +103,7 @@ Create new proxy
         "user": {
         "user": {
             "user": <string>,
             "user": <string>,
             "metas": map<string>string
             "metas": map<string>string
+            "run_id": <string>
         },
         },
         "proxy_name": <string>,
         "proxy_name": <string>,
         "proxy_type": <string>,
         "proxy_type": <string>,
@@ -122,14 +124,21 @@ Create new proxy
         "host_header_rewrite": <string>,
         "host_header_rewrite": <string>,
         "headers": map<string>string,
         "headers": map<string>string,
 
 
+        // stcp only
+        "sk": <string>,
+
+        // tcpmux only
+        "multiplexer": <string>
+
         "metas": map<string>string
         "metas": map<string>string
     }
     }
 }
 }
 ```
 ```
 
 
-### manage plugin configure
+### Server Plugin Configuration
 
 
 ```ini
 ```ini
+# frps.ini
 [common]
 [common]
 bind_port = 7000
 bind_port = 7000
 
 
@@ -144,15 +153,19 @@ path = /handler
 ops = NewProxy
 ops = NewProxy
 ```
 ```
 
 
-addr: plugin listen on.
-path: http request url path.
-ops: opeartions plugin needs handle.
+addr: the address where the external RPC service listens on.
+path: http request url path for the POST request.
+ops: operations plugin needs to handle (e.g. "Login", "NewProxy").
+
+### Metadata
 
 
-### meta data
+Metadata will be sent to the server plugin in each RPC request.
 
 
-Meta data will be sent to manage plugin in each RCP request.
+There are 2 types of metadata entries - 1 under `[common]` and the other under each proxy configuration.
+Metadata entries under `[common]` will be sent in `Login` under the key `metas`, and in any other RPC request under `user.metas`.
+Metadata entries under each proxy configuration will be sent in `NewProxy` op only, under `metas`.
 
 
-Meta data start with `meta_`. It can be configured in `common` and each proxy.
+Metadata entries start with `meta_`. This is an example of metadata entries in `[common]` and under the proxy named `[ssh]`:
 
 
 ```
 ```
 # frpc.ini
 # frpc.ini

+ 1 - 0
models/plugin/server/types.go

@@ -38,6 +38,7 @@ type LoginContent struct {
 type UserInfo struct {
 type UserInfo struct {
 	User  string            `json:"user"`
 	User  string            `json:"user"`
 	Metas map[string]string `json:"metas"`
 	Metas map[string]string `json:"metas"`
+	RunId string            `json:"run_id"`
 }
 }
 
 
 type NewProxyContent struct {
 type NewProxyContent struct {

+ 1 - 0
server/control.go

@@ -422,6 +422,7 @@ func (ctl *Control) manager() {
 					User: plugin.UserInfo{
 					User: plugin.UserInfo{
 						User:  ctl.loginMsg.User,
 						User:  ctl.loginMsg.User,
 						Metas: ctl.loginMsg.Metas,
 						Metas: ctl.loginMsg.Metas,
+						RunId: ctl.loginMsg.RunId,
 					},
 					},
 					NewProxy: *m,
 					NewProxy: *m,
 				}
 				}