From 59af75a7858d76659028542ce3b42749989d5629 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E9=BB=84=E6=9E=97?= Date: Sun, 17 Sep 2023 11:35:06 +0800 Subject: [PATCH] update readme; optimize logic code; --- README.md | 92 ++++++++++++++--------------- README_zh.md | 92 ++++++++++++++--------------- assets/static/css/color.css | 14 ++++- assets/static/js/index-user-list.js | 56 +++++++++++++----- assets/templates/index.html | 24 ++++---- assets/templates/login.html | 12 ++-- cmd/frps-panel/cmd.go | 9 ++- config/frps-tokens.toml | 17 ------ pkg/server/controller/controller.go | 10 ++-- pkg/server/controller/handler.go | 58 ++++++++++-------- pkg/server/controller/utils.go | 35 ++++++++--- pkg/server/controller/variables.go | 4 +- 12 files changed, 233 insertions(+), 190 deletions(-) delete mode 100644 config/frps-tokens.toml diff --git a/README.md b/README.md index df77fd9..c0e48c6 100644 --- a/README.md +++ b/README.md @@ -36,62 +36,60 @@ frp version >= v0.31.0 ### Usage -1. Create file `frps-panel.ini` including all support usernames and tokens. +1. Create file `frps-panel.toml` including common config. -```ini +```toml +#frps-panel.toml [common] -;plugin listen ip -plugin_addr = 127.0.0.1 -;plugin listen port +# frps panel config info +plugin_addr = "127.0.0.1" #aadr plugin_port = 7200 -;the username of manage ui,optional -admin_user = admin -;the password of manage ui,optional -admin_pwd = admin -;specified login state keep time in seconds.0 - before the browser completely exit, don't need to re-login,greater than 0: when Idle time exceeds this value,you should re-login +#admin_user = "admin" +#admin_pwd = "admin" +# specified login state keep time admin_keep_time = 0 -; enable tls +# enable tls tls_mode = false -; tls_cert_file = cert.crt -; tls_key_file = cert.key +# tls_cert_file = cert.crt +# tls_key_file = cert.key -; frp dashboard info -dashboard_addr = 127.0.0.1 +# frp dashboard info +dashboard_addr = "127.0.0.1" dashboard_port = 7500 -dashboard_user = admin -dashboard_pwd = admin - -[users] -;user user1 with meta_token 123 -user1 = 123 -;user user2 with meta_token abc -user2 = abc - -[ports] -;user1 can only use ports 8080,9090 to 9010 ,other ports will fail to create proxy (frpc can normally startup) -user1=8080,9090-9010 - -[domains] -;user1 can only use domain web01.user1.com ,other domain will fail to create proxy (frpc can normally startup) -user1=web01.user1.com - -[subdomains] -;user1 can only use subdomain web01 ,other subdomain will fail to create proxy (frpc can normally startup) -user1=web01 - -[disabled] -;user2 is disabled,when frpc use this user to connect with frps,if frpc is not startup,it cannot startup,if it's already startup,it will always show error logs on console -user2 = disable +dashboard_user = "admin" +dashboard_pwd = "admin" ``` - One user each line. Username and token are split by `=`. +2. Create file `frps-tokens.toml` to save users,it should be the same place with `frps-panel.toml`.this file will auto create by system. -2. Run frps-panel: +```toml +#frps-tokens.toml +[tokens] + [tokens.user1] + user = "user1" + token = "token1" + comment = "user1 with token1" + ports = [8080, "10000-10200"] + domains = ["web01.domain.com", "web02.domain.com"] + subdomains = ["web01", "web02"] + enable = true + [tokens.user2] + user = "user2" + token = "token2" + comment = "user2 with token2" + ports = [9080] + domains = ["web11.domain.com", "web12.domain.com"] + subdomains = ["web11", "web12"] + enable = false +``` - `./frps-panel -c ./frps-panel.ini` -3. Register plugin in frps. +3. Run frps-panel: + + `./frps-panel -c ./frps-panel.toml` + +4. Register plugin in frps. ```ini # frps.ini @@ -105,7 +103,7 @@ path = /handler ops = Login,NewWorkConn,NewUserConn,NewProxy,Ping ``` -4. Specify username and meta_token in frpc configure file. +5. Specify username and meta_token in frpc configure file. For user1: @@ -139,7 +137,7 @@ local_port = 22 remote_port = 6000 ``` -5. Manage your users in browser via: http://127.0.0.1:7200 or https://127.0.0.1:7200 +6. Manage your users in browser via: http://127.0.0.1:7200 or https://127.0.0.1:7200 ## Run as service @@ -155,8 +153,8 @@ Wants = network.target [Service] Type = simple -# config of frps-panel.ini,you should change the file path -Environment=FRPS_PANEL_OPTS="-c /root/frps-panel/frps-panel.ini" +# config of frps-panel.toml,you should change the file path +Environment=FRPS_PANEL_OPTS="-c /root/frps-panel/frps-panel.toml" # command of run frps-panel,you should change the file path ExecStart = /root/frps-panel/frps-panel $FRPS_PANEL_OPTS diff --git a/README_zh.md b/README_zh.md index e0b493a..85b06b1 100644 --- a/README_zh.md +++ b/README_zh.md @@ -37,63 +37,59 @@ frps-panel 会以一个单独的进程运行,并接收 frps 发送过来的 HT ### 使用示例 -1. 创建 `frps-panel.ini` 文件,内容为所有支持的用户名和 token。 +1. 创建 `frps-panel.toml` 文件,内容为基础配置。 -```ini +```toml +# frps-panel.toml [common] -;插件监听地址 -;如果上面配置中 tls_mode = true, 则把plugin_addr的值改为 https://127.0.0.1:7200 -plugin_addr = 127.0.0.1 -;插件端口 +# frps panel config info +plugin_addr = "127.0.0.1" #aadr plugin_port = 7200 -;插件管理页面账号,可选 -admin_user = admin -;插件管理页面密码,与账号一起进行鉴权,可选 -admin_pwd = admin -;登录状态空闲时间(秒):0-浏览器完全退出前不用重新登录,大于0-空闲超过此时间则需要重新登录. +#admin_user = "admin" +#admin_pwd = "admin" +# specified login state keep time admin_keep_time = 0 -; frps 面板页面是否启用https访问,如果为true,则只能通过https访问 +# enable tls tls_mode = false -; tls_cert_file = cert.crt -; tls_key_file = cert.key +# tls_cert_file = cert.crt +# tls_key_file = cert.key -; frp服务器的看板页面信息,必须配置,且与frp服务器一致,否则无法获取服务器信息 -dashboard_addr = 127.0.0.1 +# frp dashboard info +dashboard_addr = "127.0.0.1" dashboard_port = 7500 -dashboard_user = admin -dashboard_pwd = admin - -[users] -;user1的meta_token为123 -user1 = 123 -;user2的meta_token为abc -user2 = abc - -[ports] -;user1只能使用8080,9090到9010端口,其他端口则建立连接时返回失败(不影响客户端启动) -user1=8080,9090-9010 - -[domains] -;user1只能使用web01.yyy.zzz域名,配置了其他域名则建立连接时返回失败(不影响客户端启动) -user1=web01.user1.com - -[subdomains] -;user1只能使用web01.xxx.yyy.zzz域名,配置了其他三级域名则建立连接时返回失败(不影响客户端启动) -user1=web01 - -[disabled] -;user2被禁用,frpc使用此账户与frps通信时,如果未启动则无法启动,如果已启动,则会一直打印错误日志 -user2 = disable +dashboard_user = "admin" +dashboard_pwd = "admin" ``` - 每一个用户占一行,用户名和 token 之间以 `=` 号分隔。 +2. 创建`frps-tokens.toml`文件,其内容为系统中的用户,该文件位置和`frps-panel.toml`相同。如不创建此文件,在增加用户时会自动创建。 -2. 运行 frps-panel,指定监听地址以及 token 存储文件路径。 +```toml +#frps-tokens.toml +[tokens] + [tokens.user1] + user = "user1" + token = "token1" + comment = "user1 with token1" + ports = [8080, "10000-10200"] + domains = ["web01.domain.com", "web02.domain.com"] + subdomains = ["web01", "web02"] + enable = true + [tokens.user2] + user = "user2" + token = "token2" + comment = "user2 with token2" + ports = [9080] + domains = ["web11.domain.com", "web12.domain.com"] + subdomains = ["web11", "web12"] + enable = false +``` - `./frps-panel -c ./frps-panel.ini` +3. 运行 frps-panel,指定监听地址以及 token 存储文件路径。 -3. 在 frps 的配置文件中注册插件,并启动。 + `./frps-panel -c ./frps-panel.toml` + +4. 在 frps 的配置文件中注册插件,并启动。 ```ini # frps.ini @@ -106,7 +102,7 @@ path = /handler ops = Login,NewWorkConn,NewUserConn,NewProxy,Ping ``` -4. 在 frpc 中指定用户名,在 meta 中指定 token,用户名以及 `meta_token` 的内容需要和之前创建的 token 文件匹配。 +5. 在 frpc 中指定用户名,在 meta 中指定 token,用户名以及 `meta_token` 的内容需要和之前创建的 token 文件匹配。 user1 的配置: @@ -140,7 +136,7 @@ local_port = 22 remote_port = 6000 ``` -5.浏览器中输入地址: http://127.0.0.1:7200 或 https://127.0.0.1:7200 进入管理页面进行用户管理 +6.浏览器中输入地址: http://127.0.0.1:7200 或 https://127.0.0.1:7200 进入管理页面进行用户管理 ## 以服务的形式运行 @@ -156,8 +152,8 @@ Wants = network.target [Service] Type = simple -# 启动frps-panel的配置文件路径,需修改为您的frps-panel.ini的路径 -Environment=FRPS_PANEL_OPTS="-c /root/frps-panel/frps-panel.ini" +# 启动frps-panel的配置文件路径,需修改为您的frps-panel.toml的路径 +Environment=FRPS_PANEL_OPTS="-c /root/frps-panel/frps-panel.toml" # 启动frps-panel的命令,需修改为您的frps-panel的安装路径 ExecStart = /root/frps-panel/frps-panel $FRPS_PANEL_OPTS diff --git a/assets/static/css/color.css b/assets/static/css/color.css index a637f31..42ca296 100644 --- a/assets/static/css/color.css +++ b/assets/static/css/color.css @@ -50,7 +50,7 @@ background-color: #79bbff; } -.layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{ +.layui-form-checkbox[lay-skin=primary] > .layui-icon-indeterminate { border-color: #79bbff; } @@ -71,6 +71,11 @@ border-color: #79bbff; } +.layui-table-checked.layui-table-click, +.layui-table-checked.layui-table-hover { + background-color: #d9ecff; +} + .layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, @@ -185,7 +190,7 @@ section.proxy-list .proxy-info .layui-row .layui-row > div:first-child { background-color: #5f5f60; } - .layui-form-checkbox[lay-skin=primary]>.layui-icon-indeterminate{ + .layui-form-checkbox[lay-skin=primary] > .layui-icon-indeterminate { border-color: #5f5f60; } @@ -206,6 +211,11 @@ section.proxy-list .proxy-info .layui-row .layui-row > div:first-child { border-color: #5f5f60; } + .layui-table-checked.layui-table-click, + .layui-table-checked.layui-table-hover { + background-color: #5f5f60; + } + .layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, diff --git a/assets/static/js/index-user-list.js b/assets/static/js/index-user-list.js index c317f10..0b5ae3e 100644 --- a/assets/static/js/index-user-list.js +++ b/assets/static/js/index-user-list.js @@ -97,7 +97,7 @@ var loadUserList = (function ($) { } return { valid: valid, - trim: username + trim: username.trim() }; } @@ -129,7 +129,7 @@ var loadUserList = (function ($) { } return { valid: valid, - trim: comment.replace(/[\n\t\r]/g, '') + trim: comment.trim().replace(/[\n\t\r]/g, '') }; } @@ -227,7 +227,7 @@ var loadUserList = (function ($) { * set verify rule of layui.form */ (function setFormVerifyRule() { - // layui.form.verify(verifyRules); + layui.form.verify(verifyRules); })(); /** @@ -265,10 +265,10 @@ var loadUserList = (function ($) { {field: 'domains', title: i18n['AllowedDomains'], sort: true, edit: 'textarea'}, {field: 'subdomains', title: i18n['AllowedSubdomains'], sort: true, edit: 'textarea'}, { - field: 'status', + field: 'enable', title: i18n['Status'], width: 100, - templet: '{{d.status? "' + i18n['Enable'] + '":"' + i18n['Disable'] + '"}}', + templet: '{{d.enable? "' + i18n['Enable'] + '":"' + i18n['Disable'] + '"}}', sort: true }, {title: i18n['Operation'], width: 150, toolbar: '#userListOperationTemplate'} @@ -371,6 +371,12 @@ var loadUserList = (function ($) { data.forEach(function (temp) { temp.ports = temp.ports.split(',') + temp.ports.forEach(function (port, index) { + if (/^\d+$/.test(String(port))) { + temp.ports[index] = parseInt(String(port)); + } + }); + temp.domains = temp.domains.split(',') temp.subdomains = temp.subdomains.split(',') }); @@ -395,6 +401,11 @@ var loadUserList = (function ($) { var data = obj.data; data.ports = data.ports.split(',') + data.ports.forEach(function (port, index) { + if (/^\d+$/.test(String(port))) { + data.ports[index] = parseInt(String(port)); + } + }); data.domains = data.domains.split(',') data.subdomains = data.subdomains.split(',') switch (obj.event) { @@ -438,6 +449,11 @@ var loadUserList = (function ($) { var formData = layui.form.val('addUserForm'); if (formData.ports != null) { formData.ports = formData.ports.split(',') + formData.ports.forEach(function (port, index) { + if (/^\d+$/.test(String(port))) { + formData.ports[index] = parseInt(String(port)); + } + }) } if (formData.domains != null) { formData.domains = formData.domains.split(',') @@ -456,7 +472,7 @@ var loadUserList = (function ($) { /** * add user action - * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data + * @param data {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} user data * @param index popup index */ function add(data, index) { @@ -485,10 +501,20 @@ var loadUserList = (function ($) { /** * update user action - * @param before {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} data before update - * @param after {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} data after update + * @param before {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} data before update + * @param after {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} data after update */ function update(before, after) { + before.ports.forEach(function (port, index) { + if (/^\d+$/.test(String(port))) { + before.ports[index] = parseInt(String(port)); + } + }); + after.ports.forEach(function (port, index) { + if (/^\d+$/.test(String(port)) && typeof port === "string") { + after.ports[index] = parseInt(String(port)); + } + }); var loading = layui.layer.load(); $.ajax({ url: '/update', @@ -513,7 +539,7 @@ var loadUserList = (function ($) { /** * batch remove user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list + * @param data {[{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}]} user data list */ function batchRemovePopup(data) { if (data.length === 0) { @@ -530,7 +556,7 @@ var loadUserList = (function ($) { /** * batch disable user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list + * @param data {[{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}]} user data list */ function batchDisablePopup(data) { if (data.length === 0) { @@ -547,7 +573,7 @@ var loadUserList = (function ($) { /** * batch enable user popup - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list + * @param data {[{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}]} user data list */ function batchEnablePopup(data) { if (data.length === 0) { @@ -564,7 +590,7 @@ var loadUserList = (function ($) { /** * remove one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data + * @param data {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} user data */ function removePopup(data) { layui.layer.confirm(i18n['ConfirmRemoveUser'], { @@ -577,7 +603,7 @@ var loadUserList = (function ($) { /** * disable one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data + * @param data {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} user data */ function disablePopup(data) { layui.layer.confirm(i18n['ConfirmDisableUser'], { @@ -590,7 +616,7 @@ var loadUserList = (function ($) { /** * enable one user popup - * @param data {{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}} user data + * @param data {{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}} user data */ function enablePopup(data) { layui.layer.confirm(i18n['ConfirmEnableUser'], { @@ -604,7 +630,7 @@ var loadUserList = (function ($) { /** * operate actions * @param type {apiType} action type - * @param data {[{user:string, token:string, comment:string, status:boolean, ports:[string], domains:[string], subdomains:[string]}]} user data list + * @param data {[{user:string, token:string, comment:string, enable:boolean, ports:[string|number], domains:[string], subdomains:[string]}]} user data list * @param index popup index */ function operate(type, data, index) { diff --git a/assets/templates/index.html b/assets/templates/index.html index 5953d21..5230198 100644 --- a/assets/templates/index.html +++ b/assets/templates/index.html @@ -2,17 +2,17 @@ ${ .FrpsPanel } - - - - - - - - - - - + + + + + + + + + + +