frpc: update admin_api

This commit is contained in:
fatedier 2019-02-11 11:26:06 +08:00
parent 66555dbb00
commit fe403ab328
7 changed files with 57 additions and 78 deletions

View File

@ -1 +1 @@
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frp client admin UI</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?eb6e6e7683a17c61011d"></script><script type="text/javascript" src="vendor.js?1fbc6539feeed727105b"></script></body> </html> <!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frp client admin UI</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?9b7dd6f843b02e4142ac"></script><script type="text/javascript" src="vendor.js?f837702123a3b4f7a651"></script></body> </html>

View File

@ -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,c,u){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 c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[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 c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=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:"1fbc6539feeed727105b"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},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:"f837702123a3b4f7a651"}[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}}([]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -29,57 +29,53 @@ import (
) )
type GeneralResponse struct { type GeneralResponse struct {
Code int64 `json:"code"` Code int
Msg string `json:"msg"` Msg string
} }
// GET api/reload // GET api/reload
type ReloadResp struct {
GeneralResponse
}
func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiReload(w http.ResponseWriter, r *http.Request) {
var ( res := GeneralResponse{Code: 200}
buf []byte
res ReloadResp
)
log.Info("Http request: [/api/reload]") log.Info("Http request [/api/reload]")
defer func() { defer func() {
log.Info("Http response [/api/reload]: code [%d]", res.Code) log.Info("Http response [/api/reload], code [%d]", res.Code)
buf, _ = json.Marshal(&res) w.WriteHeader(res.Code)
w.Write(buf) if len(res.Msg) > 0 {
w.Write([]byte(res.Msg))
}
}() }()
content, err := config.GetRenderedConfFromFile(g.GlbClientCfg.CfgFile) content, err := config.GetRenderedConfFromFile(g.GlbClientCfg.CfgFile)
if err != nil { if err != nil {
res.Code = 1 res.Code = 400
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("reload frpc config file error: %v", err) log.Warn("reload frpc config file error: %s", res.Msg)
return return
} }
newCommonCfg, err := config.UnmarshalClientConfFromIni(nil, content) newCommonCfg, err := config.UnmarshalClientConfFromIni(nil, content)
if err != nil { if err != nil {
res.Code = 2 res.Code = 400
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("reload frpc common section error: %v", err) log.Warn("reload frpc common section error: %s", res.Msg)
return return
} }
pxyCfgs, visitorCfgs, err := config.LoadAllConfFromIni(g.GlbClientCfg.User, content, newCommonCfg.Start) pxyCfgs, visitorCfgs, err := config.LoadAllConfFromIni(g.GlbClientCfg.User, content, newCommonCfg.Start)
if err != nil { if err != nil {
res.Code = 3 res.Code = 400
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("reload frpc proxy config error: %v", err) log.Warn("reload frpc proxy config error: %s", res.Msg)
return return
} }
err = svr.ReloadConf(pxyCfgs, visitorCfgs) err = svr.ReloadConf(pxyCfgs, visitorCfgs)
if err != nil { if err != nil {
res.Code = 4 res.Code = 500
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("reload frpc proxy config error: %v", err) log.Warn("reload frpc proxy config error: %s", res.Msg)
return return
} }
log.Info("success reload conf") log.Info("success reload conf")
@ -177,7 +173,7 @@ func (svr *Service) apiStatus(w http.ResponseWriter, r *http.Request) {
res.Stcp = make([]ProxyStatusResp, 0) res.Stcp = make([]ProxyStatusResp, 0)
res.Xtcp = make([]ProxyStatusResp, 0) res.Xtcp = make([]ProxyStatusResp, 0)
log.Info("Http request: [/api/status]") log.Info("Http request [/api/status]")
defer func() { defer func() {
log.Info("Http response [/api/status]") log.Info("Http response [/api/status]")
buf, _ = json.Marshal(&res) buf, _ = json.Marshal(&res)
@ -212,36 +208,29 @@ func (svr *Service) apiStatus(w http.ResponseWriter, r *http.Request) {
// GET api/config // GET api/config
func (svr *Service) apiGetConfig(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiGetConfig(w http.ResponseWriter, r *http.Request) {
var ( res := GeneralResponse{Code: 200}
buf []byte
res GeneralResponse
)
log.Info("Http get request: [/api/config]") log.Info("Http get request [/api/config]")
defer func() { defer func() {
log.Info("Http get response [/api/config]") log.Info("Http get response [/api/config], code [%d]", res.Code)
if len(buf) > 0 { w.WriteHeader(res.Code)
w.Write(buf) if len(res.Msg) > 0 {
} else { w.Write([]byte(res.Msg))
buf, _ = json.Marshal(&res)
w.Write(buf)
} }
}() }()
if g.GlbClientCfg.CfgFile == "" { if g.GlbClientCfg.CfgFile == "" {
w.WriteHeader(400) res.Code = 400
res.Code = 1 res.Msg = "frpc has no config file path"
res.Msg = "frpc don't configure a config file path"
log.Warn("%s", res.Msg) log.Warn("%s", res.Msg)
return return
} }
content, err := config.GetRenderedConfFromFile(g.GlbClientCfg.CfgFile) content, err := config.GetRenderedConfFromFile(g.GlbClientCfg.CfgFile)
if err != nil { if err != nil {
w.WriteHeader(400) res.Code = 400
res.Code = 2
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("load frpc config file error: %v", err) log.Warn("load frpc config file error: %s", res.Msg)
return return
} }
@ -254,34 +243,33 @@ func (svr *Service) apiGetConfig(w http.ResponseWriter, r *http.Request) {
} }
newRows = append(newRows, row) newRows = append(newRows, row)
} }
buf = []byte(strings.Join(newRows, "\n")) res.Msg = strings.Join(newRows, "\n")
} }
// PUT api/config // PUT api/config
func (svr *Service) apiPutConfig(w http.ResponseWriter, r *http.Request) { func (svr *Service) apiPutConfig(w http.ResponseWriter, r *http.Request) {
var ( res := GeneralResponse{Code: 200}
buf []byte
res GeneralResponse
)
log.Info("Http put request: [/api/config]") log.Info("Http put request [/api/config]")
defer func() { defer func() {
log.Info("Http put response: [/api/config]") log.Info("Http put response [/api/config], code [%d]", res.Code)
buf, _ = json.Marshal(&res) w.WriteHeader(res.Code)
w.Write(buf) if len(res.Msg) > 0 {
w.Write([]byte(res.Msg))
}
}() }()
// get new config content // get new config content
body, err := ioutil.ReadAll(r.Body) body, err := ioutil.ReadAll(r.Body)
if err != nil { if err != nil {
res.Code = 1 res.Code = 400
res.Msg = fmt.Sprintf("read request body error: %v", err) res.Msg = fmt.Sprintf("read request body error: %v", err)
log.Warn("%s", res.Msg) log.Warn("%s", res.Msg)
return return
} }
if len(body) == 0 { if len(body) == 0 {
res.Code = 2 res.Code = 400
res.Msg = "body can't be empty" res.Msg = "body can't be empty"
log.Warn("%s", res.Msg) log.Warn("%s", res.Msg)
return return
@ -291,9 +279,9 @@ func (svr *Service) apiPutConfig(w http.ResponseWriter, r *http.Request) {
token := "" token := ""
b, err := ioutil.ReadFile(g.GlbClientCfg.CfgFile) b, err := ioutil.ReadFile(g.GlbClientCfg.CfgFile)
if err != nil { if err != nil {
res.Code = 3 res.Code = 400
res.Msg = err.Error() res.Msg = err.Error()
log.Warn("load frpc config file error: %v", err) log.Warn("load frpc config file error: %s", res.Msg)
return return
} }
content := string(b) content := string(b)
@ -328,7 +316,7 @@ func (svr *Service) apiPutConfig(w http.ResponseWriter, r *http.Request) {
err = ioutil.WriteFile(g.GlbClientCfg.CfgFile, []byte(content), 0644) err = ioutil.WriteFile(g.GlbClientCfg.CfgFile, []byte(content), 0644)
if err != nil { if err != nil {
res.Code = 4 res.Code = 500
res.Msg = fmt.Sprintf("write content to frpc config file error: %v", err) res.Msg = fmt.Sprintf("write content to frpc config file error: %v", err)
log.Warn("%s", res.Msg) log.Warn("%s", res.Msg)
return return

View File

@ -57,30 +57,21 @@
}).then(res => { }).then(res => {
return res.json() return res.json()
}).then(json => { }).then(json => {
console.log(json) fetch('/api/reload', {credentials: 'include'})
if (json.code != 0) { .then(res => {
return res.json()
}).then(json => {
this.$message({
type: 'success',
message: 'Success'
})
}).catch(err => {
this.$message({ this.$message({
showClose: true, showClose: true,
message: 'Put config to frpc and hot reload failed!', message: 'Reload frpc configure file error!',
type: 'warning' type: 'warning'
}) })
} else { })
fetch('/api/reload', {credentials: 'include'})
.then(res => {
return res.json()
}).then(json => {
this.$message({
type: 'success',
message: 'Success'
})
}).catch(err => {
this.$message({
showClose: true,
message: 'Reload frpc configure file error!',
type: 'warning'
})
})
}
}).catch(err => { }).catch(err => {
this.$message({ this.$message({
showClose: true, showClose: true,