diff --git a/frpc/backup.sh b/frpc/backup.sh new file mode 100644 index 0000000..8ddcd3c --- /dev/null +++ b/frpc/backup.sh @@ -0,0 +1,34 @@ +#! /bin/bash +MD5='md5sum' +unamestr=`uname` + +if [[ "$unamestr" == 'Darwin' ]]; then + MD5='md5' +fi +# you can do something here +# this shell scripts will run at the end of build.py scripts +MODULE=frpc + + +mkdir -p history +if [ ! -f ./history/version ];then + touch ./history/version +fi + +version_old=`cat history/version | awk '{print $1}' | sort -rn |sed -n 1p` +version_new=`cat config.json.js |grep "version"|cut -d"\"" -f 4` +md5_old=`cat history/version | sort -nk1 | awk '{print $1}' |sed -n 1p` +if [[ "$unamestr" == 'Darwin' ]]; then + md5_new=`${MD5} $MODULE.tar.gz | awk '{print $4}'` +else + md5_new=`${MD5} $MODULE.tar.gz | awk '{print $1}'` +fi + +if [ -f ./$MODULE.tar.gz ];then + if [ "$version_old" != "$version_new" ];then + mkdir ./history/$version_new/ + cp ./$MODULE.tar.gz ./history/$version_new/ + echo $version_new $md5_new >> ./history/version + fi +fi + diff --git a/frpc/build.sh b/frpc/build.sh new file mode 100755 index 0000000..5775bef --- /dev/null +++ b/frpc/build.sh @@ -0,0 +1,32 @@ +#!/bin/sh + + +MODULE=frpc +VERSION=2.1.15 +TITLE=frpc穿透 +DESCRIPTION=内网穿透利器,谁用谁知道。 +HOME_URL=Module_frpc.asp + +# Check and include base +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +if [ "$MODULE" == "" ]; then + echo "module not found" + exit 1 +fi + +if [ -f "$DIR/$MODULE/$MODULE/install.sh" ]; then + echo "install script not found" + exit 2 +fi + +# now include build_base.sh +. $DIR/../softcenter/build_base.sh + +# change to module directory +cd $DIR + +# do something here + +do_build_result + +sh backup.sh $MODULE diff --git a/frpc/config.json.js b/frpc/config.json.js new file mode 100644 index 0000000..a91882a --- /dev/null +++ b/frpc/config.json.js @@ -0,0 +1,8 @@ +{ +"version":"2.1.15", +"md5":"6ad0d26c66249eb415af1f9c72a8e986", +"home_url":"Module_frpc.asp", +"title":"frpc穿透", +"description":"内网穿透利器,谁用谁知道。", +"build_date":"2019-01-16_20:01:32" +} diff --git a/frpc/frpc.tar.gz b/frpc/frpc.tar.gz new file mode 100644 index 0000000..ac328a7 Binary files /dev/null and b/frpc/frpc.tar.gz differ diff --git a/frpc/frpc/bin/base64_encode b/frpc/frpc/bin/base64_encode new file mode 100755 index 0000000..5dd96f0 Binary files /dev/null and b/frpc/frpc/bin/base64_encode differ diff --git a/frpc/frpc/bin/frpc b/frpc/frpc/bin/frpc new file mode 100755 index 0000000..8101500 Binary files /dev/null and b/frpc/frpc/bin/frpc differ diff --git a/frpc/frpc/init.d/S98frpc.sh b/frpc/frpc/init.d/S98frpc.sh new file mode 100644 index 0000000..8b08559 --- /dev/null +++ b/frpc/frpc/init.d/S98frpc.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sh /jffs/softcenter/scripts/config-frpc.sh diff --git a/frpc/frpc/install.sh b/frpc/frpc/install.sh new file mode 100644 index 0000000..3c49481 --- /dev/null +++ b/frpc/frpc/install.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +MODULE=frpc +VERSION="2.1.15" +cd /tmp +rm -f /jffs/softcenter/init.d/S98frpc.sh +if [ ! -x /jffs/softcenter/bin/base64_encode ]; then + cp -f /tmp/frpc/bin/base64_encode /jffs/softcenter/bin/base64_encode + chmod +x /jffs/softcenter/bin/base64_encode + [ ! -e /jffs/softcenter/bin/base64_decode ] && cp -f /jffs/softcenter/bin/base64_encode /jffs/softcenter/bin/base64_decode +fi +cp -f /tmp/${MODULE}/bin/frpc /jffs/softcenter/bin/frpc +cp -f /tmp/${MODULE}/scripts/* /jffs/softcenter/scripts/ +cp -f /tmp/${MODULE}/res/* /jffs/softcenter/res/ +cp -f /tmp/${MODULE}/webs/* /jffs/softcenter/webs/ +cp -f /tmp/${MODULE}/init.d/* /jffs/softcenter/init.d/ +[ ! -d /jffs/softcenter/res/layer ] && ( mkdir -p /jffs/softcenter/res/layer/; cp -rf /tmp/frpc/res/layer/* /jffs/softcenter/res/layer/ ) +rm -fr /tmp/frp* >/dev/null 2>&1 +killall ${MODULE} +chmod +x /jffs/softcenter/bin/frpc +chmod +x /jffs/softcenter/scripts/config-frpc.sh +chmod +x /jffs/softcenter/scripts/frpc_status.sh +chmod +x /jffs/softcenter/scripts/uninstall_frpc.sh +chmod +x /jffs/softcenter/init.d/S98frpc.sh +sleep 1 +dbus set frpc_client_version=`/jffs/softcenter/bin/frpc --version` +#if [ "`dbus get frpc_version`"x = "2.1.4"x ]; then +# dbus set frpc_customize_conf="1" +#fi +if [ "`dbus get frpc_common_ddns`"x = ""x ] && [ "`dbus get frpc_ddns`"x = ""x ]; then + dbus set frpc_common_ddns="2" +elif [ "`dbus get frpc_common_ddns`"x = "1"x ] || [ "`dbus get frpc_ddns`"x = "1"x ]; then + dbus set frpc_domain=`nvram get ddns_hostname_x` + dbus set frpc_common_ddns="1" + dbus remove frpc_ddns +elif [ "`dbus get frpc_ddns`"x = "2"x ]; then + dbus set frpc_common_ddns="2" + dbus remove frpc_ddns +fi +if [ "`dbus get frpc_cron_hour_min`"x != ""x ] && [ "`dbus get frpc_cron_time`"x != ""x ]; then + dbus set frpc_common_cron_hour_min="`dbus get frpc_cron_hour_min`" + dbus set frpc_common_cron_time="`dbus get frpc_cron_time`" + dbus remove frpc_cron_hour_min + dbus remove frpc_cron_time +elif [ "`dbus get frpc_cron_hour_min`"x != ""x ] && [ "`dbus get frpc_cron_time`"x != ""x ]; then + dbus set frpc_common_cron_hour_min="hour" + dbus set frpc_common_cron_time="1" +fi +dbus set softcenter_module_frpc_install=1 +dbus set softcenter_module_frpc_name=${MODULE} +dbus set softcenter_module_frpc_title="Frpc内网穿透" +dbus set softcenter_module_frpc_description="内网穿透利器,谁用谁知道。" +dbus set softcenter_module_frpc_version="${VERSION}" +dbus set ${MODULE}_version="${VERSION}" +rm -fr /tmp/frp* >/dev/null 2>&1 +en=`dbus get frpc_enable` +if [ "${en}"x = "1"x ]; then + sh /jffs/softcenter/scripts/config-frpc.sh +fi diff --git a/frpc/frpc/res/frpc-menu.js b/frpc/frpc/res/frpc-menu.js new file mode 100644 index 0000000..42a9a07 --- /dev/null +++ b/frpc/frpc/res/frpc-menu.js @@ -0,0 +1,122 @@ +function openssHint(itemNum){ + statusmenu = ""; + width="350px"; + + if(itemNum == 0){ + statusmenu ="如果发现开关不能开启,那么请检查系统管理 -- 系统设置页面内Enable JFFS custom scripts and configs是否开启。"; + _caption = "服务器说明"; + } + else if(itemNum == 1){ + statusmenu ="此处填入你的frp服务器的地址。建议优先填入IP地址。填入域名,特别是一些服务商给的复杂域名,有时遇到无法解析会导致无法连接!"; + _caption = "服务器"; + } + else if(itemNum == 2){ + statusmenu ="此处填入你的frp服务器的端口,对应服务器配置文件中的节[common]下的bind_port字段"; + _caption = "服务器端口"; + } + else if(itemNum == 3){ + statusmenu ="此处填入你的frp服务器的特权授权码。对应服务器配置文件中的节[common]下的privilege_token字段。注意:使用带有特殊字符的密码,可能会导致frpc链接不上服务器。"; + _caption = "Privilege Token"; + } + else if(itemNum == 4){ + statusmenu ="此处填入你的frp服务器HTTP穿透服务的端口,对应服务器配置文件中的节[common]下的vhost_http_port字段"; + _caption = "HTTP穿透服务端口"; + } + else if(itemNum == 5){ + statusmenu ="此处填入你的frp服务器HTTPS穿透服务的端口,对应服务器配置文件中的节[common]下的vhost_https_port字段"; + _caption = "HTTPS穿透服务端口"; + } + else if(itemNum == 6){ + statusmenu ="此处是否开启frpc客户端日志。注意:默认不开启,开启后日志路径为/tmp/frpc.log"; + _caption = "日志记录"; + } + else if(itemNum == 7){ + statusmenu ="此处选择日志记录等级。可选内容:info、warn、error、debug。"; + _caption = "日志等级"; + } + else if(itemNum == 8){ + statusmenu ="此处选择要保留的日志天数。"; + _caption = "日志记录天数"; + } + else if(itemNum == 9){ + statusmenu ="要穿透的协议类型,目前有http和tcp两种方式。"; + _caption = "协议类型"; + } + else if(itemNum == 10){ + statusmenu ="此处输入穿透内容的命名(描述),如:ac68u-web或ac68u-webshell,对应客户端配置文件中的节名称。注意:frp服务器上的所有命名不能重复!"; + _caption = "代理名称"; + } + else if(itemNum == 11){ + statusmenu ="此处输入穿透内容的域名,如:ac68u.frp.com,对应客户端配置文件中节下的custom_domains字段。注意:frp上运行的域名不能重复!"; + _caption = "域名配置"; + } + else if(itemNum == 12){ + statusmenu ="此处输入要穿透的内部主机IP地址,如:192.168.1.1"; + _caption = "内网主机地址"; + } + else if(itemNum == 13){ + statusmenu ="此处输入要穿透的内部主机的端口,如:80或22"; + _caption = "内网主机端口"; + } + else if(itemNum == 14){ + statusmenu ="此处输入服务器端端口用来映射内部主机端口,如:80或8080注意:"; + statusmenu +="http协议:选择http协议时,远程主机端口对应服务器配置文件中的节[common]下的vhost_http_port字段值。"; + statusmenu +="https协议:选择https协议时,远程主机端口对应服务器配置文件中的节[common]下的vhost_https_port字段值。https协议只能对应穿透内网https协议。"; + statusmenu +="tcp协议:选择tcp协议时,远程主机端口应在服务器配置文件中的节[common]下的privilege_allow_ports字段值范围内。"; + _caption = "远程主机端口"; + } + else if(itemNum == 15){ + statusmenu ="如果公司内网防火墙对外网访问进行了流量识别与屏蔽,例如禁止了 ssh 协议等,通过设置加密,将 frpc 与 frps 之间的通信内容加密传输,将会有效防止流量被拦截。"; + _caption = "加密"; + } + else if(itemNum == 16){ + statusmenu ="如果传输的报文长度较长,通过设置对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源。"; + _caption = "压缩"; + } + else if(itemNum == 17){ + statusmenu ="定时到Frp服务器上重新注册服务,以便Frp提供持续的服务。注意:填写内容为0时关闭该功能!"; + _caption = "定时注册服务"; + } + else if(itemNum == 18){ + statusmenu ="如果穿透服务配置中内网主机地址是路由器管理地址,并且内网主机端口为80时,在网络地图DDNS处显示相应的域名配置。注意:此功能与路由系统自带的DDNS功能冲突,frp的DDNS显示设置会覆盖系统自带的DDNS设置!"; + _caption = "DDNS显示设置"; + } + else if(itemNum == 19){ + statusmenu ="穿透服务的用户名称,如AC68U 配置结果为 {用户名称}.{代理名称}"; + _caption = "Frpc用户名称"; + } + else if(itemNum == 20){ + statusmenu ="从 v0.12.0 版本开始,底层通信协议支持选择 kcp 协议,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗"; + _caption = "底层通信协议"; + } + else if(itemNum == 21){ + statusmenu ="从 v0.10.0 版本开始,客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 frp 可以承载更高的并发数。该功能默认启用,如需关闭,可以在 frps.ini 和 frpc.ini 中配置,该配置项在服务端和客户端必须一致."; + _caption = "TCP 多路复用"; + } + else if(itemNum == 22){ + statusmenu ="当客户端连接服务器失败后的动作:失败后重复连接失败后退出客户端"; + _caption = "连接设置"; + } + else if(itemNum == 23){ + statusmenu ="按照官方教程自己编写配置文件"; + _caption = "自定义配置"; + } + //return overlib(statusmenu, OFFSETX, -160, LEFT, DELAY, 200); + //return overlib(statusmenu, OFFSETX, -160, LEFT, STICKY, WIDTH, 'width', CAPTION, " ", FGCOLOR, "#4D595D", CAPCOLOR, "#000000", CLOSECOLOR, "#000000", MOUSEOFF, "1",TEXTCOLOR, "#FFF", CLOSETITLE, ''); + return overlib(statusmenu, OFFSETX, -160, LEFT, STICKY, WIDTH, 'width', CAPTION, _caption, CLOSETITLE, ''); + + var tag_name= document.getElementsByTagName('a'); + for (var i=0;i helpcontent.length) + return overlib('<#defaultHint#>', HAUTO, VAUTO); + else if(hint_array_id == 0 && hint_show_id > 21 && hint_show_id < 24) + return overlib(helpcontent[hint_array_id][hint_show_id], FIXX, 270, FIXY, 30); + else{ + if(hint_show_id > helpcontent[hint_array_id].length) + return overlib('<#defaultHint#>', HAUTO, VAUTO); + else + return overlib(helpcontent[hint_array_id][hint_show_id], HAUTO, VAUTO); + } +} diff --git a/frpc/frpc/res/frpc.css b/frpc/frpc/res/frpc.css new file mode 100644 index 0000000..0bd52a3 --- /dev/null +++ b/frpc/frpc/res/frpc.css @@ -0,0 +1,135 @@ +.Bar_container { + width:85%; + height:20px; + border:1px inset #999; + margin:0 auto; + margin-top:20px \9; + background-color:#FFFFFF; + z-index:100; +} +#proceeding_img_text { + position:absolute; + z-index:101; + font-size:11px; + color:#000000; + line-height:21px; + width: 83%; +} +#proceeding_img { + height:21px; + background:#C0D1D3 url(/images/ss_proceding.gif); +} +#ClientList_Block_PC{ + border:1px outset #999; + background-color:#576D73; + position:absolute; + *margin-top:26px; + margin-left:2px; + *margin-left:-353px; + width:346px; + text-align:left; + height:auto; + overflow-y:auto; + z-index:200; + padding: 1px; + display:none; +} +#ClientList_Block_PC div{ + background-color:#576D73; + height:auto; + *height:20px; + line-height:20px; + text-decoration:none; + font-family: Lucida Console; + padding-left:2px; +} +#ClientList_Block_PC a{ + background-color:#EFEFEF; + color:#FFF; + font-size:12px; + font-family:Arial, Helvetica, sans-serif; + text-decoration:none; +} +#ClientList_Block_PC div:hover, #ClientList_Block a:hover { + background-color:#3366FF; + color:#FFFFFF; + cursor:default; +} +.show-btn1, .show-btn2 { + border: 1px solid #222; + background: #576d73; + font-size:10pt; + color: #fff; + padding: 10px 3.75px; + border-radius: 5px 5px 0px 0px; + width:15%; + } +.active { + background: #2f3a3e; +} +.close { + background: red; + color: black; + border-radius: 12px; + line-height: 18px; + text-align: center; + height: 18px; + width: 18px; + font-size: 16px; + padding: 1px; + top: -10px; + right: -10px; + position: absolute; +} +/* use cross as close button */ +.close::before { + content: "\2716"; +} +.contentM_qis { + position: fixed; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius:10px; + z-index: 10; + background-color:#2B373B; + margin-left: -100px; + top: 10px; + width:720px; + return height:auto; + box-shadow: 3px 3px 10px #000; + background: rgba(0,0,0,0.85); + display:none; +} + +.user_title{ + text-align:center; + font-size:18px; + color:#99FF00; + padding:10px; + font-weight:bold; +} +.frpc_btn { + border: 1px solid #222; + background: linear-gradient(to bottom, #003333 0%, #000000 100%); /* W3C */ + font-size:10pt; + color: #fff; + padding: 5px 5px; + border-radius: 5px 5px 5px 5px; + width:16%; +} +.frpc_btn:hover { + border: 1px solid #222; + background: linear-gradient(to bottom, #27c9c9 0%, #279fd9 100%); /* W3C */ + font-size:10pt; + color: #fff; + padding: 5px 5px; + border-radius: 5px 5px 5px 5px; + width:16%; +} +.formbottomdesc { + margin-top:10px; + margin-left:10px; +} +input[type=button]:focus { + outline: none; +} diff --git a/frpc/frpc/res/frpc_check.html b/frpc/frpc/res/frpc_check.html new file mode 100644 index 0000000..c603cdd --- /dev/null +++ b/frpc/frpc/res/frpc_check.html @@ -0,0 +1 @@ +<% nvram_dump(".frpc.log",""); %> diff --git a/frpc/frpc/res/frpc_conf.html b/frpc/frpc/res/frpc_conf.html new file mode 100644 index 0000000..01ed13c --- /dev/null +++ b/frpc/frpc/res/frpc_conf.html @@ -0,0 +1 @@ +<% nvram_dump(".frpc.ini",""); %> diff --git a/frpc/frpc/res/frpc_stcp_conf.html b/frpc/frpc/res/frpc_stcp_conf.html new file mode 100644 index 0000000..16d12ed --- /dev/null +++ b/frpc/frpc/res/frpc_stcp_conf.html @@ -0,0 +1 @@ +<% nvram_dump(".frpc_stcp.ini",""); %> diff --git a/frpc/frpc/res/icon-frpc.png b/frpc/frpc/res/icon-frpc.png new file mode 100644 index 0000000..b508d24 Binary files /dev/null and b/frpc/frpc/res/icon-frpc.png differ diff --git a/frpc/frpc/res/layer/layer.js b/frpc/frpc/res/layer/layer.js new file mode 100644 index 0000000..5998678 --- /dev/null +++ b/frpc/frpc/res/layer/layer.js @@ -0,0 +1,652 @@ +/*! layer-v3.1.0 Web弹层组件 MIT License http://layer.layui.com/ By 贤心 */ ; +! function(e, t) { + "use strict"; + var i, n, a = e.layui && layui.define, + o = { + getPath: function() { + var e = document.scripts, + t = e[e.length - 1], + i = t.src; + if (!t.getAttribute("merge")) return i.substring(0, i.lastIndexOf("/") + 1) + }(), + config: {}, + end: {}, + minIndex: 0, + minLeft: [], + btn: ["确定", "取消"], + type: ["dialog", "page", "iframe", "loading", "tips"], + getStyle: function(t, i) { + var n = t.currentStyle ? t.currentStyle : e.getComputedStyle(t, null); + return n[n.getPropertyValue ? "getPropertyValue" : "getAttribute"](i) + }, + link: function(t, i, n) { + if (r.path) { + var a = document.getElementsByTagName("head")[0], + s = document.createElement("link"); + "string" == typeof i && (n = i); + var l = (n || t).replace(/\.|\//g, ""), + f = "layuicss-" + l, + c = 0; + s.rel = "stylesheet", s.href = r.path + t, s.id = f, document.getElementById(f) || a.appendChild(s), "function" == typeof i && ! function u() { + return ++c > 80 ? e.console && console.error("layer.css: Invalid") : void(1989 === parseInt(o.getStyle(document.getElementById(f), "width")) ? i() : setTimeout(u, 100)) + }() + } + } + }, + r = { + v: "3.1.0", + ie: function() { + var t = navigator.userAgent.toLowerCase(); + return !!(e.ActiveXObject || "ActiveXObject" in e) && ((t.match(/msie\s(\d+)/) || [])[1] || "11") + }(), + index: e.layer && e.layer.v ? 1e5 : 0, + path: o.getPath, + config: function(e, t) { + return e = e || {}, r.cache = o.config = i.extend({}, o.config, e), r.path = o.config.path || r.path, "string" == typeof e.extend && (e.extend = [e.extend]), o.config.path && r.ready(), e.extend ? (a ? layui.addcss("modules/layer/" + e.extend) : o.link("theme/" + e.extend), this) : this + }, + ready: function(e) { + var t = "layer", + i = "", + n = (a ? "modules/layer/" : "theme/") + "default/layer.css?v=" + r.v + i; + return a ? layui.addcss(n, e, t) : o.link(n, e, t), this + }, + alert: function(e, t, n) { + var a = "function" == typeof t; + return a && (n = t), r.open(i.extend({ + content: e, + yes: n + }, a ? {} : t)) + }, + confirm: function(e, t, n, a) { + var s = "function" == typeof t; + return s && (a = n, n = t), r.open(i.extend({ + content: e, + btn: o.btn, + yes: n, + btn2: a + }, s ? {} : t)) + }, + msg: function(e, n, a) { + var s = "function" == typeof n, + f = o.config.skin, + c = (f ? f + " " + f + "-msg" : "") || "layui-layer-msg", + u = l.anim.length - 1; + return s && (a = n), r.open(i.extend({ + content: e, + time: 3e3, + shade: !1, + skin: c, + title: !1, + closeBtn: !1, + btn: !1, + resize: !1, + end: a + }, s && !o.config.skin ? { + skin: c + " layui-layer-hui", + anim: u + } : function() { + return n = n || {}, (n.icon === -1 || n.icon === t && !o.config.skin) && (n.skin = c + " " + (n.skin || "layui-layer-hui")), n + }())) + }, + load: function(e, t) { + return r.open(i.extend({ + type: 3, + icon: e || 0, + resize: !1, + shade: .01 + }, t)) + }, + tips: function(e, t, n) { + return r.open(i.extend({ + type: 4, + content: [e, t], + closeBtn: !1, + time: 3e3, + shade: !1, + resize: !1, + fixed: !1, + maxWidth: 210 + }, n)) + } + }, + s = function(e) { + var t = this; + t.index = ++r.index, t.config = i.extend({}, t.config, o.config, e), document.body ? t.creat() : setTimeout(function() { + t.creat() + }, 30) + }; + s.pt = s.prototype; + var l = ["layui-layer", ".layui-layer-title", ".layui-layer-main", ".layui-layer-dialog", "layui-layer-iframe", "layui-layer-content", "layui-layer-btn", "layui-layer-close"]; + l.anim = ["layer-anim-00", "layer-anim-01", "layer-anim-02", "layer-anim-03", "layer-anim-04", "layer-anim-05", "layer-anim-06"], s.pt.config = { + type: 0, + shade: .3, + fixed: !0, + move: l[1], + title: "信息", + offset: "auto", + area: "auto", + closeBtn: 1, + time: 0, + zIndex: 19891014, + maxWidth: 360, + anim: 0, + isOutAnim: !0, + icon: -1, + moveType: 1, + resize: !0, + scrollbar: !0, + tips: 2 + }, s.pt.vessel = function(e, t) { + var n = this, + a = n.index, + r = n.config, + s = r.zIndex + a, + f = "object" == typeof r.title, + c = r.maxmin && (1 === r.type || 2 === r.type), + u = r.title ? '' + (f ? r.title[0] : r.title) + "" : ""; + return r.zIndex = s, t([r.shade ? '' : "", '' + (e && 2 != r.type ? "" : u) + '' + (0 == r.type && r.icon !== -1 ? '' : "") + (1 == r.type && e ? "" : r.content || "") + '' + function() { + var e = c ? '' : ""; + return r.closeBtn && (e += ''), e + }() + "" + (r.btn ? function() { + var e = ""; + "string" == typeof r.btn && (r.btn = [r.btn]); + for (var t = 0, i = r.btn.length; t < i; t++) e += '' + r.btn[t] + ""; + return '' + e + "" + }() : "") + (r.resize ? '' : "") + ""], u, i('')), n + }, s.pt.creat = function() { + var e = this, + t = e.config, + a = e.index, + s = t.content, + f = "object" == typeof s, + c = i("body"); + if (!t.id || !i("#" + t.id)[0]) { + switch ("string" == typeof t.area && (t.area = "auto" === t.area ? ["", ""] : [t.area, ""]), t.shift && (t.anim = t.shift), 6 == r.ie && (t.fixed = !1), t.type) { + case 0: + t.btn = "btn" in t ? t.btn : o.btn[0], r.closeAll("dialog"); + break; + case 2: + var s = t.content = f ? t.content : [t.content || "http://layer.layui.com", "auto"]; + t.content = ''; + break; + case 3: + delete t.title, delete t.closeBtn, t.icon === -1 && 0 === t.icon, r.closeAll("loading"); + break; + case 4: + f || (t.content = [t.content, "body"]), t.follow = t.content[1], t.content = t.content[0] + '', delete t.title, t.tips = "object" == typeof t.tips ? t.tips : [t.tips, !0], t.tipsMore || r.closeAll("tips") + } + if (e.vessel(f, function(n, r, u) { + c.append(n[0]), f ? function() { + 2 == t.type || 4 == t.type ? function() { + i("body").append(n[1]) + }() : function() { + s.parents("." + l[0])[0] || (s.data("display", s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]), i("#" + l[0] + a).find("." + l[5]).before(r)) + }() + }() : c.append(n[1]), i(".layui-layer-move")[0] || c.append(o.moveElem = u), e.layero = i("#" + l[0] + a), t.scrollbar || l.html.css("overflow", "hidden").attr("layer-full", a) + }).auto(a), i("#layui-layer-shade" + e.index).css({ + "background-color": t.shade[1] || "#000", + opacity: t.shade[0] || t.shade + }), 2 == t.type && 6 == r.ie && e.layero.find("iframe").attr("src", s[0]), 4 == t.type ? e.tips() : e.offset(), t.fixed && n.on("resize", function() { + e.offset(), (/^\d+%$/.test(t.area[0]) || /^\d+%$/.test(t.area[1])) && e.auto(a), 4 == t.type && e.tips() + }), t.time <= 0 || setTimeout(function() { + r.close(e.index) + }, t.time), e.move().callback(), l.anim[t.anim]) { + var u = "layer-anim " + l.anim[t.anim]; + e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend", function() { + i(this).removeClass(u) + }) + } + t.isOutAnim && e.layero.data("isOutAnim", !0) + } + }, s.pt.auto = function(e) { + var t = this, + a = t.config, + o = i("#" + l[0] + e); + "" === a.area[0] && a.maxWidth > 0 && (r.ie && r.ie < 8 && a.btn && o.width(o.innerWidth()), o.outerWidth() > a.maxWidth && o.width(a.maxWidth)); + var s = [o.innerWidth(), o.innerHeight()], + f = o.find(l[1]).outerHeight() || 0, + c = o.find("." + l[6]).outerHeight() || 0, + u = function(e) { + e = o.find(e), e.height(s[1] - f - c - 2 * (0 | parseFloat(e.css("padding-top")))) + }; + switch (a.type) { + case 2: + u("iframe"); + break; + default: + "" === a.area[1] ? a.maxHeight > 0 && o.outerHeight() > a.maxHeight ? (s[1] = a.maxHeight, u("." + l[5])) : a.fixed && s[1] >= n.height() && (s[1] = n.height(), u("." + l[5])) : u("." + l[5]) + } + return t + }, s.pt.offset = function() { + var e = this, + t = e.config, + i = e.layero, + a = [i.outerWidth(), i.outerHeight()], + o = "object" == typeof t.offset; + e.offsetTop = (n.height() - a[1]) / 2, e.offsetLeft = (n.width() - a[0]) / 2, o ? (e.offsetTop = t.offset[0], e.offsetLeft = t.offset[1] || e.offsetLeft) : "auto" !== t.offset && ("t" === t.offset ? e.offsetTop = 0 : "r" === t.offset ? e.offsetLeft = n.width() - a[0] : "b" === t.offset ? e.offsetTop = n.height() - a[1] : "l" === t.offset ? e.offsetLeft = 0 : "lt" === t.offset ? (e.offsetTop = 0, e.offsetLeft = 0) : "lb" === t.offset ? (e.offsetTop = n.height() - a[1], e.offsetLeft = 0) : "rt" === t.offset ? (e.offsetTop = 0, e.offsetLeft = n.width() - a[0]) : "rb" === t.offset ? (e.offsetTop = n.height() - a[1], e.offsetLeft = n.width() - a[0]) : e.offsetTop = t.offset), t.fixed || (e.offsetTop = /%$/.test(e.offsetTop) ? n.height() * parseFloat(e.offsetTop) / 100 : parseFloat(e.offsetTop), e.offsetLeft = /%$/.test(e.offsetLeft) ? n.width() * parseFloat(e.offsetLeft) / 100 : parseFloat(e.offsetLeft), e.offsetTop += n.scrollTop(), e.offsetLeft += n.scrollLeft()), i.attr("minLeft") && (e.offsetTop = n.height() - (i.find(l[1]).outerHeight() || 0), e.offsetLeft = i.css("left")), i.css({ + top: e.offsetTop, + left: e.offsetLeft + }) + }, s.pt.tips = function() { + var e = this, + t = e.config, + a = e.layero, + o = [a.outerWidth(), a.outerHeight()], + r = i(t.follow); + r[0] || (r = i("body")); + var s = { + width: r.outerWidth(), + height: r.outerHeight(), + top: r.offset().top, + left: r.offset().left + }, + f = a.find(".layui-layer-TipsG"), + c = t.tips[0]; + t.tips[1] || f.remove(), s.autoLeft = function() { + s.left + o[0] - n.width() > 0 ? (s.tipLeft = s.left + s.width - o[0], f.css({ + right: 12, + left: "auto" + })) : s.tipLeft = s.left + }, s.where = [ + function() { + s.autoLeft(), s.tipTop = s.top - o[1] - 10, f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color", t.tips[1]) + }, + function() { + s.tipLeft = s.left + s.width + 10, s.tipTop = s.top, f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color", t.tips[1]) + }, + function() { + s.autoLeft(), s.tipTop = s.top + s.height + 10, f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color", t.tips[1]) + }, + function() { + s.tipLeft = s.left - o[0] - 10, s.tipTop = s.top, f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color", t.tips[1]) + } + ], s.where[c - 1](), 1 === c ? s.top - (n.scrollTop() + o[1] + 16) < 0 && s.where[2]() : 2 === c ? n.width() - (s.left + s.width + o[0] + 16) > 0 || s.where[3]() : 3 === c ? s.top - n.scrollTop() + s.height + o[1] + 16 - n.height() > 0 && s.where[0]() : 4 === c && o[0] + 16 - s.left > 0 && s.where[1](), a.find("." + l[5]).css({ + "background-color": t.tips[1], + "padding-right": t.closeBtn ? "30px" : "" + }), a.css({ + left: s.tipLeft - (t.fixed ? n.scrollLeft() : 0), + top: s.tipTop - (t.fixed ? n.scrollTop() : 0) + }) + }, s.pt.move = function() { + var e = this, + t = e.config, + a = i(document), + s = e.layero, + l = s.find(t.move), + f = s.find(".layui-layer-resize"), + c = {}; + return t.move && l.css("cursor", "move"), l.on("mousedown", function(e) { + e.preventDefault(), t.move && (c.moveStart = !0, c.offset = [e.clientX - parseFloat(s.css("left")), e.clientY - parseFloat(s.css("top"))], o.moveElem.css("cursor", "move").show()) + }), f.on("mousedown", function(e) { + e.preventDefault(), c.resizeStart = !0, c.offset = [e.clientX, e.clientY], c.area = [s.outerWidth(), s.outerHeight()], o.moveElem.css("cursor", "se-resize").show() + }), a.on("mousemove", function(i) { + if (c.moveStart) { + var a = i.clientX - c.offset[0], + o = i.clientY - c.offset[1], + l = "fixed" === s.css("position"); + if (i.preventDefault(), c.stX = l ? 0 : n.scrollLeft(), c.stY = l ? 0 : n.scrollTop(), !t.moveOut) { + var f = n.width() - s.outerWidth() + c.stX, + u = n.height() - s.outerHeight() + c.stY; + a < c.stX && (a = c.stX), a > f && (a = f), o < c.stY && (o = c.stY), o > u && (o = u) + } + s.css({ + left: a, + top: o + }) + } + if (t.resize && c.resizeStart) { + var a = i.clientX - c.offset[0], + o = i.clientY - c.offset[1]; + i.preventDefault(), r.style(e.index, { + width: c.area[0] + a, + height: c.area[1] + o + }), c.isResize = !0, t.resizing && t.resizing(s) + } + }).on("mouseup", function(e) { + c.moveStart && (delete c.moveStart, o.moveElem.hide(), t.moveEnd && t.moveEnd(s)), c.resizeStart && (delete c.resizeStart, o.moveElem.hide()) + }), e + }, s.pt.callback = function() { + function e() { + var e = a.cancel && a.cancel(t.index, n); + e === !1 || r.close(t.index) + } + var t = this, + n = t.layero, + a = t.config; + t.openLayer(), a.success && (2 == a.type ? n.find("iframe").on("load", function() { + a.success(n, t.index) + }) : a.success(n, t.index)), 6 == r.ie && t.IE6(n), n.find("." + l[6]).children("a").on("click", function() { + var e = i(this).index(); + if (0 === e) a.yes ? a.yes(t.index, n) : a.btn1 ? a.btn1(t.index, n) : r.close(t.index); + else { + var o = a["btn" + (e + 1)] && a["btn" + (e + 1)](t.index, n); + o === !1 || r.close(t.index) + } + }), n.find("." + l[7]).on("click", e), a.shadeClose && i("#layui-layer-shade" + t.index).on("click", function() { + r.close(t.index) + }), n.find(".layui-layer-min").on("click", function() { + var e = a.min && a.min(n); + e === !1 || r.min(t.index, a) + }), n.find(".layui-layer-max").on("click", function() { + i(this).hasClass("layui-layer-maxmin") ? (r.restore(t.index), a.restore && a.restore(n)) : (r.full(t.index, a), setTimeout(function() { + a.full && a.full(n) + }, 100)) + }), a.end && (o.end[t.index] = a.end) + }, o.reselect = function() { + i.each(i("select"), function(e, t) { + var n = i(this); + n.parents("." + l[0])[0] || 1 == n.attr("layer") && i("." + l[0]).length < 1 && n.removeAttr("layer").show(), n = null + }) + }, s.pt.IE6 = function(e) { + i("select").each(function(e, t) { + var n = i(this); + n.parents("." + l[0])[0] || "none" === n.css("display") || n.attr({ + layer: "1" + }).hide(), n = null + }) + }, s.pt.openLayer = function() { + var e = this; + r.zIndex = e.config.zIndex, r.setTop = function(e) { + var t = function() { + r.zIndex++, e.css("z-index", r.zIndex + 1) + }; + return r.zIndex = parseInt(e[0].style.zIndex), e.on("mousedown", t), r.zIndex + } + }, o.record = function(e) { + var t = [e.width(), e.height(), e.position().top, e.position().left + parseFloat(e.css("margin-left"))]; + e.find(".layui-layer-max").addClass("layui-layer-maxmin"), e.attr({ + area: t + }) + }, o.rescollbar = function(e) { + l.html.attr("layer-full") == e && (l.html[0].style.removeProperty ? l.html[0].style.removeProperty("overflow") : l.html[0].style.removeAttribute("overflow"), l.html.removeAttr("layer-full")) + }, e.layer = r, r.getChildFrame = function(e, t) { + return t = t || i("." + l[4]).attr("times"), i("#" + l[0] + t).find("iframe").contents().find(e) + }, r.getFrameIndex = function(e) { + return i("#" + e).parents("." + l[4]).attr("times") + }, r.iframeAuto = function(e) { + if (e) { + var t = r.getChildFrame("html", e).outerHeight(), + n = i("#" + l[0] + e), + a = n.find(l[1]).outerHeight() || 0, + o = n.find("." + l[6]).outerHeight() || 0; + n.css({ + height: t + a + o + }), n.find("iframe").css({ + height: t + }) + } + }, r.iframeSrc = function(e, t) { + i("#" + l[0] + e).find("iframe").attr("src", t) + }, r.style = function(e, t, n) { + var a = i("#" + l[0] + e), + r = a.find(".layui-layer-content"), + s = a.attr("type"), + f = a.find(l[1]).outerHeight() || 0, + c = a.find("." + l[6]).outerHeight() || 0; + a.attr("minLeft"); + s !== o.type[3] && s !== o.type[4] && (n || (parseFloat(t.width) <= 260 && (t.width = 260), parseFloat(t.height) - f - c <= 64 && (t.height = 64 + f + c)), a.css(t), c = a.find("." + l[6]).outerHeight(), s === o.type[2] ? a.find("iframe").css({ + height: parseFloat(t.height) - f - c + }) : r.css({ + height: parseFloat(t.height) - f - c - parseFloat(r.css("padding-top")) - parseFloat(r.css("padding-bottom")) + })) + }, r.min = function(e, t) { + var a = i("#" + l[0] + e), + s = a.find(l[1]).outerHeight() || 0, + f = a.attr("minLeft") || 181 * o.minIndex + "px", + c = a.css("position"); + o.record(a), o.minLeft[0] && (f = o.minLeft[0], o.minLeft.shift()), a.attr("position", c), r.style(e, { + width: 180, + height: s, + left: f, + top: n.height() - s, + position: "fixed", + overflow: "hidden" + }, !0), a.find(".layui-layer-min").hide(), "page" === a.attr("type") && a.find(l[4]).hide(), o.rescollbar(e), a.attr("minLeft") || o.minIndex++, a.attr("minLeft", f) + }, r.restore = function(e) { + var t = i("#" + l[0] + e), + n = t.attr("area").split(","); + t.attr("type"); + r.style(e, { + width: parseFloat(n[0]), + height: parseFloat(n[1]), + top: parseFloat(n[2]), + left: parseFloat(n[3]), + position: t.attr("position"), + overflow: "visible" + }, !0), t.find(".layui-layer-max").removeClass("layui-layer-maxmin"), t.find(".layui-layer-min").show(), "page" === t.attr("type") && t.find(l[4]).show(), o.rescollbar(e) + }, r.full = function(e) { + var t, a = i("#" + l[0] + e); + o.record(a), l.html.attr("layer-full") || l.html.css("overflow", "hidden").attr("layer-full", e), clearTimeout(t), t = setTimeout(function() { + var t = "fixed" === a.css("position"); + r.style(e, { + top: t ? 0 : n.scrollTop(), + left: t ? 0 : n.scrollLeft(), + width: n.width(), + height: n.height() + }, !0), a.find(".layui-layer-min").hide() + }, 100) + }, r.title = function(e, t) { + var n = i("#" + l[0] + (t || r.index)).find(l[1]); + n.html(e) + }, r.close = function(e) { + var t = i("#" + l[0] + e), + n = t.attr("type"), + a = "layer-anim-close"; + if (t[0]) { + var s = "layui-layer-wrap", + f = function() { + if (n === o.type[1] && "object" === t.attr("conType")) { + t.children(":not(." + l[5] + ")").remove(); + for (var a = t.find("." + s), r = 0; r < 2; r++) a.unwrap(); + a.css("display", a.data("display")).removeClass(s) + } else { + if (n === o.type[2]) try { + var f = i("#" + l[4] + e)[0]; + f.contentWindow.document.write(""), f.contentWindow.close(), t.find("." + l[5])[0].removeChild(f) + } catch (c) {} + t[0].innerHTML = "", t.remove() + } + "function" == typeof o.end[e] && o.end[e](), delete o.end[e] + }; + t.data("isOutAnim") && t.addClass("layer-anim " + a), i("#layui-layer-moves, #layui-layer-shade" + e).remove(), 6 == r.ie && o.reselect(), o.rescollbar(e), t.attr("minLeft") && (o.minIndex--, o.minLeft.push(t.attr("minLeft"))), r.ie && r.ie < 10 || !t.data("isOutAnim") ? f() : setTimeout(function() { + f() + }, 200) + } + }, r.closeAll = function(e) { + i.each(i("." + l[0]), function() { + var t = i(this), + n = e ? t.attr("type") === e : 1; + n && r.close(t.attr("times")), n = null + }) + }; + var f = r.cache || {}, + c = function(e) { + return f.skin ? " " + f.skin + " " + f.skin + "-" + e : "" + }; + r.prompt = function(e, t) { + var a = ""; + if (e = e || {}, "function" == typeof e && (t = e), e.area) { + var o = e.area; + a = 'style="width: ' + o[0] + "; height: " + o[1] + ';"', delete e.area + } + var s, l = 2 == e.formType ? '" + (e.value || "") + "" : function() { + return '' + }(), + f = e.success; + return delete e.success, r.open(i.extend({ + type: 1, + btn: ["确定", "取消"], + content: l, + skin: "layui-layer-prompt" + c("prompt"), + maxWidth: n.width(), + success: function(e) { + s = e.find(".layui-layer-input"), s.focus(), "function" == typeof f && f(e) + }, + resize: !1, + yes: function(i) { + var n = s.val(); + "" === n ? s.focus() : n.length > (e.maxlength || 500) ? r.tips("最多输入" + (e.maxlength || 500) + "个字数", s, { + tips: 1 + }) : t && t(n, i, s) + } + }, e)) + }, r.tab = function(e) { + e = e || {}; + var t = e.tab || {}, + n = "layui-this", + a = e.success; + return delete e.success, r.open(i.extend({ + type: 1, + skin: "layui-layer-tab" + c("tab"), + resize: !1, + title: function() { + var e = t.length, + i = 1, + a = ""; + if (e > 0) + for (a = '' + t[0].title + ""; i < e; i++) a += "" + t[i].title + ""; + return a + }(), + content: '' + function() { + var e = t.length, + i = 1, + a = ""; + if (e > 0) + for (a = '' + (t[0].content || "no content") + ""; i < e; i++) a += '' + (t[i].content || "no content") + ""; + return a + }() + "", + success: function(t) { + var o = t.find(".layui-layer-title").children(), + r = t.find(".layui-layer-tabmain").children(); + o.on("mousedown", function(t) { + t.stopPropagation ? t.stopPropagation() : t.cancelBubble = !0; + var a = i(this), + o = a.index(); + a.addClass(n).siblings().removeClass(n), r.eq(o).show().siblings().hide(), "function" == typeof e.change && e.change(o) + }), "function" == typeof a && a(t) + } + }, e)) + }, r.photos = function(t, n, a) { + function o(e, t, i) { + var n = new Image; + return n.src = e, n.complete ? t(n) : (n.onload = function() { + n.onload = null, t(n) + }, void(n.onerror = function(e) { + n.onerror = null, i(e) + })) + } + var s = {}; + if (t = t || {}, t.photos) { + var l = t.photos.constructor === Object, + f = l ? t.photos : {}, + u = f.data || [], + d = f.start || 0; + s.imgIndex = (0 | d) + 1, t.img = t.img || "img"; + var y = t.success; + if (delete t.success, l) { + if (0 === u.length) return r.msg("没有图片") + } else { + var p = i(t.photos), + h = function() { + u = [], p.find(t.img).each(function(e) { + var t = i(this); + t.attr("layer-index", e), u.push({ + alt: t.attr("alt"), + pid: t.attr("layer-pid"), + src: t.attr("layer-src") || t.attr("src"), + thumb: t.attr("src") + }) + }) + }; + if (h(), 0 === u.length) return; + if (n || p.on("click", t.img, function() { + var e = i(this), + n = e.attr("layer-index"); + r.photos(i.extend(t, { + photos: { + start: n, + data: u, + tab: t.tab + }, + full: t.full + }), !0), h() + }), !n) return + } + s.imgprev = function(e) { + s.imgIndex--, s.imgIndex < 1 && (s.imgIndex = u.length), s.tabimg(e) + }, s.imgnext = function(e, t) { + s.imgIndex++, s.imgIndex > u.length && (s.imgIndex = 1, t) || s.tabimg(e) + }, s.keyup = function(e) { + if (!s.end) { + var t = e.keyCode; + e.preventDefault(), 37 === t ? s.imgprev(!0) : 39 === t ? s.imgnext(!0) : 27 === t && r.close(s.index) + } + }, s.tabimg = function(e) { + if (!(u.length <= 1)) return f.start = s.imgIndex - 1, r.close(s.index), r.photos(t, !0, e) + }, s.event = function() { + s.bigimg.hover(function() { + s.imgsee.show() + }, function() { + s.imgsee.hide() + }), s.bigimg.find(".layui-layer-imgprev").on("click", function(e) { + e.preventDefault(), s.imgprev() + }), s.bigimg.find(".layui-layer-imgnext").on("click", function(e) { + e.preventDefault(), s.imgnext() + }), i(document).on("keyup", s.keyup) + }, s.loadi = r.load(1, { + shade: !("shade" in t) && .9, + scrollbar: !1 + }), o(u[d].src, function(n) { + r.close(s.loadi), s.index = r.open(i.extend({ + type: 1, + id: "layui-layer-photos", + area: function() { + var a = [n.width, n.height], + o = [i(e).width() - 100, i(e).height() - 100]; + if (!t.full && (a[0] > o[0] || a[1] > o[1])) { + var r = [a[0] / o[0], a[1] / o[1]]; + r[0] > r[1] ? (a[0] = a[0] / r[0], a[1] = a[1] / r[0]) : r[0] < r[1] && (a[0] = a[0] / r[1], a[1] = a[1] / r[1]) + } + return [a[0] + "px", a[1] + "px"] + }(), + title: !1, + shade: .9, + shadeClose: !0, + closeBtn: !1, + move: ".layui-layer-phimg img", + moveType: 1, + scrollbar: !1, + moveOut: !0, + isOutAnim: !1, + skin: "layui-layer-photos" + c("photos"), + content: '' + (u.length > 1 ? '' : "") + '' + (u[d].alt || "") + "" + s.imgIndex + "/" + u.length + "", + success: function(e, i) { + s.bigimg = e.find(".layui-layer-phimg"), s.imgsee = e.find(".layui-layer-imguide,.layui-layer-imgbar"), s.event(e), t.tab && t.tab(u[d], e), "function" == typeof y && y(e) + }, + end: function() { + s.end = !0, i(document).off("keyup", s.keyup) + } + }, t)) + }, function() { + r.close(s.loadi), r.msg("当前图片地址异常是否继续查看下一张?", { + time: 3e4, + btn: ["下一张", "不看了"], + yes: function() { + u.length > 1 && s.imgnext(!0, !0) + } + }) + }) + } + }, o.run = function(t) { + i = t, n = i(e), l.html = i("html"), r.open = function(e) { + var t = new s(e); + return t.index + } + }, e.layui && layui.define ? (r.ready(), layui.define("jquery", function(t) { + r.path = layui.cache.dir, o.run(layui.$j), e.layer = r, t("layer", r) + })) : "function" == typeof define && define.amd ? define(["jquery"], function() { + return o.run(e.jQuery), r + }) : function() { + o.run(e.jQuery), r.ready() + }() +}(window); \ No newline at end of file diff --git a/frpc/frpc/res/layer/mobile/layer.js b/frpc/frpc/res/layer/mobile/layer.js new file mode 100644 index 0000000..f9cf693 --- /dev/null +++ b/frpc/frpc/res/layer/mobile/layer.js @@ -0,0 +1,2 @@ +/*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */ + ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?''+(e?n.title[0]:n.title)+"":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e=''+n.btn[0]+"",2===t&&(e=''+n.btn[1]+""+e),''+e+""):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content=''+(n.content||"")+""),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"':"")+'"+l+''+n.content+""+c+"",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;odiv{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/frpc/frpc/res/layer/theme/default/icon-ext.png b/frpc/frpc/res/layer/theme/default/icon-ext.png new file mode 100644 index 0000000..bbbb669 Binary files /dev/null and b/frpc/frpc/res/layer/theme/default/icon-ext.png differ diff --git a/frpc/frpc/res/layer/theme/default/icon.png b/frpc/frpc/res/layer/theme/default/icon.png new file mode 100644 index 0000000..3e17da8 Binary files /dev/null and b/frpc/frpc/res/layer/theme/default/icon.png differ diff --git a/frpc/frpc/res/layer/theme/default/layer.css b/frpc/frpc/res/layer/theme/default/layer.css new file mode 100644 index 0000000..17b874e --- /dev/null +++ b/frpc/frpc/res/layer/theme/default/layer.css @@ -0,0 +1,795 @@ +.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{ + text-overflow:ellipsis; + white-space:nowrap +} +html #layuicss-layer{ + display:none; + position:absolute; + width:1989px +} +.layui-layer,.layui-layer-shade{ + position:fixed; + _position:absolute; + pointer-events:auto +} +.layui-layer-shade{ + top:0; + left:0; + width:100%; + height:100%; + _height:expression(document.body.offsetHeight+"px") +} +.layui-layer{ + -webkit-overflow-scrolling:touch; + top:150px; + left:0; + margin:0; + padding:0; + background-color:#fff; + -webkit-background-clip:content; + border-radius:2px; + box-shadow:1px 1px 50px rgba(0,0,0,.3) +} +.layui-layer-close{ + position:absolute +} +.layui-layer-content{ + position:relative +} +.layui-layer-border{ + border:1px solid #B2B2B2; + border:1px solid rgba(0,0,0,.1); + box-shadow:1px 1px 5px rgba(0,0,0,.2) +} +.layui-layer-load{ + background:url(loading-1.gif) center center no-repeat #eee +} +.layui-layer-ico{ + background:url(icon.png) no-repeat +} +.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:top +} +.layui-layer-move{ + display:none; + position:fixed; + *position:absolute; + left:0; + top:0; + width:100%; + height:100%; + cursor:move; + opacity:0; + filter:alpha(opacity=0); + background-color:#fff; + z-index:2147483647 +} +.layui-layer-resize{ + position:absolute; + width:15px; + height:15px; + right:0; + bottom:0; + cursor:se-resize +} +.layer-anim{ + -webkit-animation-fill-mode:both; + animation-fill-mode:both; + -webkit-animation-duration:.3s; + animation-duration:.3s +} +@-webkit-keyframes layer-bounceIn{ + 0%{ + opacity:0; + -webkit-transform:scale(.5); + transform:scale(.5) + } + 100%{ + opacity:1; + -webkit-transform:scale(1); + transform:scale(1) + } +} +@keyframes layer-bounceIn{ + 0%{ + opacity:0; + -webkit-transform:scale(.5); + -ms-transform:scale(.5); + transform:scale(.5) + } + 100%{ + opacity:1; + -webkit-transform:scale(1); + -ms-transform:scale(1); + transform:scale(1) + } +} +.layer-anim-00{ + -webkit-animation-name:layer-bounceIn; + animation-name:layer-bounceIn +} +@-webkit-keyframes layer-zoomInDown{ + 0%{ + opacity:0; + -webkit-transform:scale(.1) translateY(-2000px); + transform:scale(.1) translateY(-2000px); + -webkit-animation-timing-function:ease-in-out; + animation-timing-function:ease-in-out + } + 60%{ + opacity:1; + -webkit-transform:scale(.475) translateY(60px); + transform:scale(.475) translateY(60px); + -webkit-animation-timing-function:ease-out; + animation-timing-function:ease-out + } +} +@keyframes layer-zoomInDown{ + 0%{ + opacity:0; + -webkit-transform:scale(.1) translateY(-2000px); + -ms-transform:scale(.1) translateY(-2000px); + transform:scale(.1) translateY(-2000px); + -webkit-animation-timing-function:ease-in-out; + animation-timing-function:ease-in-out + } + 60%{ + opacity:1; + -webkit-transform:scale(.475) translateY(60px); + -ms-transform:scale(.475) translateY(60px); + transform:scale(.475) translateY(60px); + -webkit-animation-timing-function:ease-out; + animation-timing-function:ease-out + } +} +.layer-anim-01{ + -webkit-animation-name:layer-zoomInDown; + animation-name:layer-zoomInDown +} +@-webkit-keyframes layer-fadeInUpBig{ + 0%{ + opacity:0; + -webkit-transform:translateY(2000px); + transform:translateY(2000px) + } + 100%{ + opacity:1; + -webkit-transform:translateY(0); + transform:translateY(0) + } +} +@keyframes layer-fadeInUpBig{ + 0%{ + opacity:0; + -webkit-transform:translateY(2000px); + -ms-transform:translateY(2000px); + transform:translateY(2000px) + } + 100%{ + opacity:1; + -webkit-transform:translateY(0); + -ms-transform:translateY(0); + transform:translateY(0) + } +} +.layer-anim-02{ + -webkit-animation-name:layer-fadeInUpBig; + animation-name:layer-fadeInUpBig +} +@-webkit-keyframes layer-zoomInLeft{ + 0%{ + opacity:0; + -webkit-transform:scale(.1) translateX(-2000px); + transform:scale(.1) translateX(-2000px); + -webkit-animation-timing-function:ease-in-out; + animation-timing-function:ease-in-out + } + 60%{ + opacity:1; + -webkit-transform:scale(.475) translateX(48px); + transform:scale(.475) translateX(48px); + -webkit-animation-timing-function:ease-out; + animation-timing-function:ease-out + } +} +@keyframes layer-zoomInLeft{ + 0%{ + opacity:0; + -webkit-transform:scale(.1) translateX(-2000px); + -ms-transform:scale(.1) translateX(-2000px); + transform:scale(.1) translateX(-2000px); + -webkit-animation-timing-function:ease-in-out; + animation-timing-function:ease-in-out + } + 60%{ + opacity:1; + -webkit-transform:scale(.475) translateX(48px); + -ms-transform:scale(.475) translateX(48px); + transform:scale(.475) translateX(48px); + -webkit-animation-timing-function:ease-out; + animation-timing-function:ease-out + } +} +.layer-anim-03{ + -webkit-animation-name:layer-zoomInLeft; + animation-name:layer-zoomInLeft +} +@-webkit-keyframes layer-rollIn{ + 0%{ + opacity:0; + -webkit-transform:translateX(-100%) rotate(-120deg); + transform:translateX(-100%) rotate(-120deg) + } + 100%{ + opacity:1; + -webkit-transform:translateX(0) rotate(0); + transform:translateX(0) rotate(0) + } +} +@keyframes layer-rollIn{ + 0%{ + opacity:0; + -webkit-transform:translateX(-100%) rotate(-120deg); + -ms-transform:translateX(-100%) rotate(-120deg); + transform:translateX(-100%) rotate(-120deg) + } + 100%{ + opacity:1; + -webkit-transform:translateX(0) rotate(0); + -ms-transform:translateX(0) rotate(0); + transform:translateX(0) rotate(0) + } +} +.layer-anim-04{ + -webkit-animation-name:layer-rollIn; + animation-name:layer-rollIn +} +@keyframes layer-fadeIn{ + 0%{ + opacity:0 + } + 100%{ + opacity:1 + } +} +.layer-anim-05{ + -webkit-animation-name:layer-fadeIn; + animation-name:layer-fadeIn +} +@-webkit-keyframes layer-shake{ + 0%,100%{ + -webkit-transform:translateX(0); + transform:translateX(0) + } + 10%,30%,50%,70%,90%{ + -webkit-transform:translateX(-10px); + transform:translateX(-10px) + } + 20%,40%,60%,80%{ + -webkit-transform:translateX(10px); + transform:translateX(10px) + } +} +@keyframes layer-shake{ + 0%,100%{ + -webkit-transform:translateX(0); + -ms-transform:translateX(0); + transform:translateX(0) + } + 10%,30%,50%,70%,90%{ + -webkit-transform:translateX(-10px); + -ms-transform:translateX(-10px); + transform:translateX(-10px) + } + 20%,40%,60%,80%{ + -webkit-transform:translateX(10px); + -ms-transform:translateX(10px); + transform:translateX(10px) + } +} +.layer-anim-06{ + -webkit-animation-name:layer-shake; + animation-name:layer-shake +} +@-webkit-keyframes fadeIn{ + 0%{ + opacity:0 + } + 100%{ + opacity:1 + } +} +.layui-layer-title{ + padding:0 80px 0 20px; + height:42px; + line-height:42px; + border-bottom:1px solid #eee; + font-size:14px; + color:#333; + overflow:hidden; + background-color:#F8F8F8; + border-radius:2px 2px 0 0 +} +.layui-layer-setwin{ + position:absolute; + right:15px; + *right:0; + top:15px; + font-size:0; + line-height:initial +} +.layui-layer-setwin a{ + position:relative; + width:16px; + height:16px; + margin-left:10px; + font-size:12px; + _overflow:hidden +} +.layui-layer-setwin .layui-layer-min cite{ + position:absolute; + width:14px; + height:2px; + left:0; + top:50%; + margin-top:-1px; + background-color:#2E2D3C; + cursor:pointer; + _overflow:hidden +} +.layui-layer-setwin .layui-layer-min:hover cite{ + background-color:#2D93CA +} +.layui-layer-setwin .layui-layer-max{ + background-position:-32px -40px +} +.layui-layer-setwin .layui-layer-max:hover{ + background-position:-16px -40px +} +.layui-layer-setwin .layui-layer-maxmin{ + background-position:-65px -40px +} +.layui-layer-setwin .layui-layer-maxmin:hover{ + background-position:-49px -40px +} +.layui-layer-setwin .layui-layer-close1{ + background-position:1px -40px; + cursor:pointer +} +.layui-layer-setwin .layui-layer-close1:hover{ + opacity:.7 +} +.layui-layer-setwin .layui-layer-close2{ + position:absolute; + right:-28px; + top:-28px; + width:30px; + height:30px; + margin-left:0; + background-position:-149px -31px; + *right:-18px; + _display:none +} +.layui-layer-setwin .layui-layer-close2:hover{ + background-position:-180px -31px +} +.layui-layer-btn{ + text-align:right; + padding:0 15px 12px; + pointer-events:auto; + user-select:none; + -webkit-user-select:none +} +.layui-layer-btn a{ + height:28px; + line-height:28px; + margin:5px 5px 0; + padding:0 15px; + border:1px solid #dedede; + background-color:#fff; + color:#333; + border-radius:2px; + font-weight:400; + cursor:pointer; + text-decoration:none +} +.layui-layer-btn a:hover{ + opacity:.9; + text-decoration:none +} +.layui-layer-btn a:active{ + opacity:.8 +} +.layui-layer-btn .layui-layer-btn0{ + border-color:#1E9FFF; + background-color:#1E9FFF; + color:#fff +} +.layui-layer-btn-l{ + text-align:left +} +.layui-layer-btn-c{ + text-align:center +} +.layui-layer-dialog{ + min-width:260px +} +.layui-layer-dialog .layui-layer-content{ + position:relative; + padding:20px; + line-height:24px; + word-break:break-all; + overflow:hidden; + font-size:14px; + overflow-x:hidden; + overflow-y:auto; + color: #000; +} +.layui-layer-dialog .layui-layer-content .layui-layer-ico{ + position:absolute; + top:16px; + left:15px; + _left:-40px; + width:30px; + height:30px +} +.layui-layer-ico1{ + background-position:-30px 0 +} +.layui-layer-ico2{ + background-position:-60px 0 +} +.layui-layer-ico3{ + background-position:-90px 0 +} +.layui-layer-ico4{ + background-position:-120px 0 +} +.layui-layer-ico5{ + background-position:-150px 0 +} +.layui-layer-ico6{ + background-position:-180px 0 +} +.layui-layer-rim{ + border:6px solid #8D8D8D; + border:6px solid rgba(0,0,0,.3); + border-radius:5px; + box-shadow:none +} +.layui-layer-msg{ + min-width:180px; + border:1px solid #D3D4D3; + box-shadow:none +} +.layui-layer-hui{ + min-width:100px; + background-color:#000; + filter:alpha(opacity=60); + background-color:rgba(0,0,0,.6); + color:#fff; + border:none +} +.layui-layer-hui .layui-layer-content{ + padding:12px 25px; + text-align:center; + color: white; +} +.layui-layer-dialog .layui-layer-padding{ + padding:20px 20px 20px 55px; + text-align:left +} +.layui-layer-page .layui-layer-content{ + position:relative; + overflow:auto +} +.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{ + padding-top:10px +} +.layui-layer-nobg{ + background:0 0 +} +.layui-layer-iframe iframe{ + display:block; + width:100% +} +.layui-layer-loading{ + border-radius:100%; + background:0 0; + box-shadow:none; + border:none +} +.layui-layer-loading .layui-layer-content{ + width:60px; + height:24px; + background:url(loading-0.gif) no-repeat +} +.layui-layer-loading .layui-layer-loading1{ + width:37px; + height:37px; + background:url(loading-1.gif) no-repeat +} +.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{ + width:32px; + height:32px; + background:url(loading-2.gif) no-repeat +} +.layui-layer-tips{ + background:0 0; + box-shadow:none; + border:none +} +.layui-layer-tips .layui-layer-content{ + position:relative; + line-height:22px; + min-width:12px; + padding:8px 15px; + font-size:12px; + _float:left; + border-radius:2px; + box-shadow:1px 1px 3px rgba(0,0,0,.2); + background-color:#000; + color:#fff +} +.layui-layer-tips .layui-layer-close{ + right:-2px; + top:-1px +} +.layui-layer-tips i.layui-layer-TipsG{ + position:absolute; + width:0; + height:0; + border-width:8px; + border-color:transparent; + border-style:dashed; + *overflow:hidden +} +.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{ + left:5px; + border-right-style:solid; + border-right-color:#000 +} +.layui-layer-tips i.layui-layer-TipsT{ + bottom:-8px +} +.layui-layer-tips i.layui-layer-TipsB{ + top:-8px +} +.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{ + top:5px; + border-bottom-style:solid; + border-bottom-color:#000 +} +.layui-layer-tips i.layui-layer-TipsR{ + left:-8px +} +.layui-layer-tips i.layui-layer-TipsL{ + right:-8px +} +.layui-layer-lan[type=dialog]{ + min-width:280px +} +.layui-layer-lan .layui-layer-title{ + background:#4476A7; + color:#fff; + border:none +} +.layui-layer-lan .layui-layer-btn{ + padding:5px 10px 10px; + text-align:right; + border-top:1px solid #E9E7E7 +} +.layui-layer-lan .layui-layer-btn a{ + background:#fff; + border-color:#E9E7E7; + color:#333 +} +.layui-layer-lan .layui-layer-btn .layui-layer-btn1{ + background:#C9C5C5 +} +.layui-layer-molv .layui-layer-title{ + background:#009f95; + color:#fff; + border:none +} +.layui-layer-molv .layui-layer-btn a{ + background:#009f95; + border-color:#009f95 +} +.layui-layer-molv .layui-layer-btn .layui-layer-btn1{ + background:#92B8B1 +} +.layui-layer-iconext{ + background:url(icon-ext.png) no-repeat +} +.layui-layer-prompt .layui-layer-input{ + display:block; + width:230px; + height:36px; + margin:0 auto; + line-height:30px; + padding-left:10px; + border:1px solid #e6e6e6; + color:#333 +} +.layui-layer-prompt textarea.layui-layer-input{ + width:300px; + height:100px; + line-height:20px; + padding:6px 10px +} +.layui-layer-prompt .layui-layer-content{ + padding:20px +} +.layui-layer-prompt .layui-layer-btn{ + padding-top:0 +} +.layui-layer-tab{ + box-shadow:1px 1px 50px rgba(0,0,0,.4) +} +.layui-layer-tab .layui-layer-title{ + padding-left:0; + overflow:visible +} +.layui-layer-tab .layui-layer-title span{ + position:relative; + float:left; + min-width:80px; + max-width:260px; + padding:0 20px; + text-align:center; + overflow:hidden; + cursor:pointer +} +.layui-layer-tab .layui-layer-title span.layui-this{ + height:43px; + border-left:1px solid #eee; + border-right:1px solid #eee; + background-color:#fff; + z-index:10 +} +.layui-layer-tab .layui-layer-title span:first-child{ + border-left:none +} +.layui-layer-tabmain{ + line-height:24px; + clear:both +} +.layui-layer-tabmain .layui-layer-tabli{ + display:none +} +.layui-layer-tabmain .layui-layer-tabli.layui-this{ + display:block +} +.layui-layer-photos{ + -webkit-animation-duration:.8s; + animation-duration:.8s +} +.layui-layer-photos .layui-layer-content{ + overflow:hidden; + text-align:center +} +.layui-layer-photos .layui-layer-phimg img{ + position:relative; + width:100%; + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:top +} +.layui-layer-imgbar,.layui-layer-imguide{ + display:none +} +.layui-layer-imgnext,.layui-layer-imgprev{ + position:absolute; + top:50%; + width:27px; + _width:44px; + height:44px; + margin-top:-22px; + outline:0; + blr:expression(this.onFocus=this.blur()) +} +.layui-layer-imgprev{ + left:10px; + background-position:-5px -5px; + _background-position:-70px -5px +} +.layui-layer-imgprev:hover{ + background-position:-33px -5px; + _background-position:-120px -5px +} +.layui-layer-imgnext{ + right:10px; + _right:8px; + background-position:-5px -50px; + _background-position:-70px -50px +} +.layui-layer-imgnext:hover{ + background-position:-33px -50px; + _background-position:-120px -50px +} +.layui-layer-imgbar{ + position:absolute; + left:0; + bottom:0; + width:100%; + height:32px; + line-height:32px; + background-color:rgba(0,0,0,.8); + background-color:#000\9; + filter:Alpha(opacity=80); + color:#fff; + overflow:hidden; + font-size:0 +} +.layui-layer-imgtit *{ + display:inline-block; + *display:inline; + *zoom:1; + vertical-align:top; + font-size:12px +} +.layui-layer-imgtit a{ + max-width:65%; + overflow:hidden; + color:#fff +} +.layui-layer-imgtit a:hover{ + color:#fff; + text-decoration:underline +} +.layui-layer-imgtit em{ + padding-left:10px; + font-style:normal +} +@-webkit-keyframes layer-bounceOut{ + 100%{ + opacity:0; + -webkit-transform:scale(.7); + transform:scale(.7) + } + 30%{ + -webkit-transform:scale(1.05); + transform:scale(1.05) + } + 0%{ + -webkit-transform:scale(1); + transform:scale(1) + } +} +@keyframes layer-bounceOut{ + 100%{ + opacity:0; + -webkit-transform:scale(.7); + -ms-transform:scale(.7); + transform:scale(.7) + } + 30%{ + -webkit-transform:scale(1.05); + -ms-transform:scale(1.05); + transform:scale(1.05) + } + 0%{ + -webkit-transform:scale(1); + -ms-transform:scale(1); + transform:scale(1) + } +} +.layer-anim-close{ + -webkit-animation-name:layer-bounceOut; + animation-name:layer-bounceOut; + -webkit-animation-fill-mode:both; + animation-fill-mode:both; + -webkit-animation-duration:.2s; + animation-duration:.2s +} +@media screen and (max-width:1100px){ + .layui-layer-iframe{ + overflow-y:auto; + -webkit-overflow-scrolling:touch + } +} diff --git a/frpc/frpc/res/layer/theme/default/loading-0.gif b/frpc/frpc/res/layer/theme/default/loading-0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/frpc/frpc/res/layer/theme/default/loading-0.gif differ diff --git a/frpc/frpc/res/layer/theme/default/loading-1.gif b/frpc/frpc/res/layer/theme/default/loading-1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/frpc/frpc/res/layer/theme/default/loading-1.gif differ diff --git a/frpc/frpc/res/layer/theme/default/loading-2.gif b/frpc/frpc/res/layer/theme/default/loading-2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/frpc/frpc/res/layer/theme/default/loading-2.gif differ diff --git a/frpc/frpc/scripts/config-frpc.sh b/frpc/frpc/scripts/config-frpc.sh new file mode 100644 index 0000000..ee5cf9d --- /dev/null +++ b/frpc/frpc/scripts/config-frpc.sh @@ -0,0 +1,186 @@ +#!/bin/sh + +eval `dbus export frpc_` +source /jffs/softcenter/scripts/base.sh +NAME=frpc +BIN=/jffs/softcenter/bin/frpc +INI_FILE=/tmp/.frpc.ini +STCP_INI_FILE=/tmp/.frpc_stcp.ini +PID_FILE=/var/run/frpc.pid +alias echo_date='echo $(date +%Y年%m月%d日\ %X):' +lan_ip=`nvram get lan_ipaddr` +lan_port="80" +ddns_flag=false + +fun_ntp_sync(){ + ntp_server=`nvram get ntp_server0` + start_time="`date +%Y%m%d`" + ntpclient -h ${ntp_server} -i3 -l -s > /dev/null 2>&1 + if [ "${start_time}"x = "`date +%Y%m%d`"x ]; then + ntpclient -h ntp1.aliyun.com -i3 -l -s > /dev/null 2>&1 + fi +} +fun_start_stop(){ + dbus set frpc_client_version=`${BIN} --version` + if [ "${frpc_enable}"x = "1"x ];then + if [ "`dbus get frpc_customize_conf`"x = "1"x ];then + _frpc_customize_conf=`dbus get frpc_config | base64_decode` || "未发现配置文件" + cat > ${INI_FILE}<<-EOF +# frpc custom configuration +${_frpc_customize_conf} +EOF + else + stcp_en=`dbus list frpc_proto_node | grep stcp` + cat > ${INI_FILE}<<-EOF +# frpc configuration +[common] +server_addr = ${frpc_common_server_addr} +server_port = ${frpc_common_server_port} +token = ${frpc_common_privilege_token} +log_file = ${frpc_common_log_file} +log_level = ${frpc_common_log_level} +log_max_days = ${frpc_common_log_max_days} +tcp_mux = ${frpc_common_tcp_mux} +protocol = ${frpc_common_protocol} +login_fail_exit = ${frpc_common_login_fail_exit} +user = ${frpc_common_user} +EOF + + if [[ "${stcp_en}" != "" ]]; then + cat > ${STCP_INI_FILE}<<-EOF +[common] +server_addr = ${frpc_common_server_addr} +server_port = ${frpc_common_server_port} +token = ${frpc_common_privilege_token} +EOF + fi + server_nu=`dbus list frpc_localhost_node | sort -n -t "_" -k 4|cut -d "=" -f 1|cut -d "_" -f 4` + for nu in ${server_nu} + do + array_subname=`dbus get frpc_subname_node_$nu` + array_type=`dbus get frpc_proto_node_$nu` + array_local_ip=`dbus get frpc_localhost_node_$nu` + array_local_port=`dbus get frpc_localport_node_$nu` + array_remote_port=`dbus get frpc_remoteport_node_$nu` + array_custom_domains=`dbus get frpc_subdomain_node_$nu` + array_use_encryption=`dbus get frpc_encryption_node_$nu` + array_use_gzip=`dbus get frpc_gzip_node_$nu` + if [[ "${array_type}" == "tcp" ]] || [[ "${array_type}" == "udp" ]]; then + cat >> ${INI_FILE} <> ${INI_FILE} <> ${STCP_INI_FILE}<<-EOF +[secret_tcp_vistor] +# frpc role vistor -> frps -> frpc role server +role = vistor +type = stcp +# the server name you want to vistor +server_name = ${frpc_common_user}.${array_subname} +sk = ${array_custom_domains} +# connect this address to vistor stcp server +bind_addr = 127.0.0.1 +bind_port = 9000 +EOF + + else + cat >> ${INI_FILE} < /tmp/.frpc.log +else + echo \【警告】:进程未运行!\<\/em\> 版本:${frpc_version} > /tmp/.frpc.log +fi +echo XU6J03M6 >> /tmp/.frpc.log +sleep 2 +rm -rf /tmp/.frpc.log diff --git a/frpc/frpc/scripts/uninstall_frpc.sh b/frpc/frpc/scripts/uninstall_frpc.sh new file mode 100644 index 0000000..4a24b25 --- /dev/null +++ b/frpc/frpc/scripts/uninstall_frpc.sh @@ -0,0 +1,35 @@ +#!/bin/sh +eval `dbus export frpc_` +source /jffs/softcenter/scripts/base.sh +MODULE=frpc +/jffs/softcenter/scripts/config-frpc.sh stop +rm -f /jffs/softcenter/init.d/S98frpc.sh +rm -f /jffs/softcenter/bin/frpc +rm -f /jffs/softcenter/res/frpc-menu.js +rm -f /jffs/softcenter/res/icon-frpc.png +rm -f /jffs/softcenter/res/frpc_check.html +rm -f /jffs/softcenter/res/frpc_stcp_conf.html +rm -f /jffs/softcenter/res/frpc_conf.html +rm -f /jffs/softcenter/res/frpc.css +rm -f /jffs/softcenter/scripts/config-frpc.sh +rm -f /jffs/softcenter/scripts/frpc_status.sh +rm -f /jffs/softcenter/webs/Module_frpc.asp +rm -f /jffs/softcenter/configs/frpc.ini +rm -f /jffs/softcenter/res/layer/* +rm -f /tmp/.frpc.ini +rm -f /tmp/.frpc_stcp.ini +rm -fr /tmp/frpc* +if [ "${frpc_common_ddns}" == "1" ]; then + nvram set ddns_enable_x=0 + nvram commit +fi +values=`dbus list frpc | cut -d "=" -f 1` + +for value in $values +do +dbus remove $value +done +dbus remove __event__onwanstart_frpc +dbus remove __event__onnatstart_frpc +cru d frpc_monitor +rm -f /jffs/softcenter/scripts/uninstall_frpc.sh diff --git a/frpc/frpc/webs/Module_frpc.asp b/frpc/frpc/webs/Module_frpc.asp new file mode 100644 index 0000000..c555e94 --- /dev/null +++ b/frpc/frpc/webs/Module_frpc.asp @@ -0,0 +1,1027 @@ + + + + + + + + + + +软件中心 - Frp内网穿透 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"/> +"/> + + + + + + + + + + + + + + + + + + + 软件中心 - Frpc内网穿透 + + + * 为了Frpc稳定运行,请开启虚拟内存功能!!! 【服务器搭建教程】 + + + + + 开启Frpc + + + + + + + + + + + + + + + 插件版本:<% dbus_get_def( "frpc_version", "未知"); %> + + + 更新日志 自定义配置帮助 + + + + + 运行状态 + 获取中... + + + + + DDNS显示设置 + + + 不做更改 + 开启 + 关闭 + + + + + + + 定时注册服务(0为关闭) + + 每 + + 分钟 + 小时 + 重新注册一次服务 + + + + + 查看当前配置 + + 查看当前配置 + + + + + + + + + + + + + + + + + + + + + Frpc 简单设置 + + + + 服务器 + + + + + + + 端口 + + + + + + + 底层通信协议 + + + tcp + kcp + + + + + + TCP 多路复用 + + + 开启 + 关闭 + + + + + + 连接设置 + + + 失败后重复连接 + 失败后退出程序 + + + + + + Token + + + + + + + HTTP穿透服务端口 + + + + + + + HTTPS穿透服务端口 + + + + + + + Frpc用户名称 + + + + + + + 日志记录 + + + 关闭 + 开启 + + + + + + 日志等级 + + + info + warn + error + debug + + + + + + 日志记录天数 + + + 1 + 2 + 3 + 4 + 6 + 6 + 7 + + + + + + + + 穿透服务配置 + + + + + 协议类型 + 代理名称 + 域名配置/SK + 内网主机地址 + 内网主机端口 + 远程主机端口 + 加密 + 压缩 + 修改 + 添加/删除 + + + + + tcp + udp + stcp + http + https + router-http + router-https + router-ssh + router-ssh-stcp + + + + + + + + + + + + + + + + + + + + + 是 + 否 + + + + + 是 + 否 + + + + + + + + + + + + + + + + + + + + Frpc 高级配置 + + + + 自定义配置 + + + + + + + + + + + + + + * 注意事项: + 1. 请使用虚拟内存!请使用虚拟内存!请使用虚拟内存!重要的事说三遍 + 2. DDNS显示设置功能与系统自带的DDNS设置冲突,frp的DDNS显示设置会覆盖系统自带的DDNS设置! + 3. 上面所有内容都为必填项,请认真填写,不然无法穿透。 + 4. 每一个文字都可以点击查看相应的帮助信息。 + 5. 穿透设置中添加删除为本地实时生效,请谨慎操作,修改后请提交以便服务器端生效。 + + + + + + + + + + Frpc 配置文件 + 1 文本框内的内容保存在【/tmp/.frpc.ini】。 + 2 请自行保存到本地,并根据实际情况进行修改,如有疑问请到frp官网求助。 + + + + + + + + + Frpc stcp 配置文件参考 + 1 文本框内的内容保存在【/tmp/.frpc_stcp.ini】。 + 2 请自行保存到本地,并根据实际情况进行修改,如有疑问请到frp官网求助。 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frpc/history/2.1.15/frpc.tar.gz b/frpc/history/2.1.15/frpc.tar.gz new file mode 100644 index 0000000..ac328a7 Binary files /dev/null and b/frpc/history/2.1.15/frpc.tar.gz differ diff --git a/frpc/history/version b/frpc/history/version new file mode 100644 index 0000000..e1a3dcd --- /dev/null +++ b/frpc/history/version @@ -0,0 +1 @@ +2.1.15 6ad0d26c66249eb415af1f9c72a8e986 diff --git a/frpc/version b/frpc/version new file mode 100644 index 0000000..ea8fc28 --- /dev/null +++ b/frpc/version @@ -0,0 +1,2 @@ +2.1.15 +6ad0d26c66249eb415af1f9c72a8e986 diff --git a/frps/backup.sh b/frps/backup.sh new file mode 100644 index 0000000..97c4e02 --- /dev/null +++ b/frps/backup.sh @@ -0,0 +1,33 @@ +#! /bin/bash +MD5='md5sum' +unamestr=`uname` + +if [[ "$unamestr" == 'Darwin' ]]; then + MD5='md5' +fi +# you can do something here +# this shell scripts will run at the end of build.py scripts +MODULE=frps + + +mkdir -p history +if [ ! -f ./history/version ];then + touch ./history/version +fi + +version_old=`cat history/version | awk '{print $1}' | sort -rn |sed -n 1p` +version_new=`cat config.json.js |grep "version"|cut -d"\"" -f 4` +md5_old=`cat history/version | sort -nk1 | awk '{print $1}' |sed -n 1p` +if [[ "$unamestr" == 'Darwin' ]]; then + md5_new=`${MD5} $MODULE.tar.gz | awk '{print $4}'` +else + md5_new=`${MD5} $MODULE.tar.gz | awk '{print $1}'` +fi + +if [ -f ./$MODULE.tar.gz ];then + if [ "$version_old" != "$version_new" ];then + mkdir ./history/$version_new/ + cp ./$MODULE.tar.gz ./history/$version_new/ + echo $version_new $md5_new >> ./history/version + fi +fi diff --git a/frps/build.sh b/frps/build.sh new file mode 100755 index 0000000..6e6cf17 --- /dev/null +++ b/frps/build.sh @@ -0,0 +1,32 @@ +#!/bin/sh + + +MODULE=frps +VERSION=1.4.16 +TITLE=frps穿透 +DESCRIPTION=内网穿透利器,谁用谁知道。 +HOME_URL=Module_frps.asp + +# Check and include base +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +if [ "$MODULE" == "" ]; then + echo "module not found" + exit 1 +fi + +if [ -f "$DIR/$MODULE/$MODULE/install.sh" ]; then + echo "install script not found" + exit 2 +fi + +# now include build_base.sh +. $DIR/../softcenter/build_base.sh + +# change to module directory +cd $DIR + +# do something here + +do_build_result + +sh backup.sh $MODULE diff --git a/frps/config.json.js b/frps/config.json.js new file mode 100644 index 0000000..6221641 --- /dev/null +++ b/frps/config.json.js @@ -0,0 +1,8 @@ +{ +"version":"1.4.16", +"md5":"7fac5d6a5a6a0b1be355c21ea29f6251", +"home_url":"Module_frps.asp", +"title":"frps穿透", +"description":"内网穿透利器,谁用谁知道。", +"build_date":"2019-01-16_20:13:34" +} diff --git a/frps/frps.tar.gz b/frps/frps.tar.gz new file mode 100644 index 0000000..62a3cc7 Binary files /dev/null and b/frps/frps.tar.gz differ diff --git a/frps/frps/bin/frps b/frps/frps/bin/frps new file mode 100755 index 0000000..cd1809c Binary files /dev/null and b/frps/frps/bin/frps differ diff --git a/frps/frps/init.d/S97frps.sh b/frps/frps/init.d/S97frps.sh new file mode 100644 index 0000000..35b7c74 --- /dev/null +++ b/frps/frps/init.d/S97frps.sh @@ -0,0 +1,2 @@ +#!/bin/sh +sh /koolshare/scripts/config-frps.sh diff --git a/frps/frps/install.sh b/frps/frps/install.sh new file mode 100644 index 0000000..6563992 --- /dev/null +++ b/frps/frps/install.sh @@ -0,0 +1,34 @@ +#!/bin/sh + +MODULE=frps +VERSION="1.4.16" +cd / +rm -f /jffs/softcenter/init.d/S97frps.sh +cp -f /tmp/$MODULE/bin/* /jffs/softcenter/bin/ +cp -f /tmp/$MODULE/scripts/* /jffs/softcenter/scripts/ +cp -f /tmp/$MODULE/res/* /jffs/softcenter/res/ +cp -f /tmp/$MODULE/webs/* /jffs/softcenter/webs/ +cp -f /tmp/$MODULE/init.d/* /jffs/softcenter/init.d/ +rm -fr /tmp/frps* >/dev/null 2>&1 +killall ${MODULE} +chmod +x /jffs/softcenter/bin/${MODULE} +chmod +x /jffs/softcenter/scripts/config-frps.sh +chmod +x /jffs/softcenter/scripts/frps_status.sh +chmod +x /jffs/softcenter/scripts/uninstall_frps.sh +chmod +x /jffs/softcenter/init.d/S97frps.sh +sleep 1 +dbus set ${MODULE}_version="${VERSION}" +#dbus set __event__onwanstart_frps=/jffs/softcenter/scripts/config-frps.sh +dbus set ${MODULE}_client_version=`/jffs/softcenter/bin/${MODULE} --version` +dbus set ${MODULE}_common_cron_hour_min="hour" +dbus set ${MODULE}_common_cron_time="12" +dbus set softcenter_module_${MODULE}_install=1 +dbus set softcenter_module_${MODULE}_name=${MODULE} +dbus set softcenter_module_${MODULE}_title="Frps内网穿透" +dbus set softcenter_module_${MODULE}_description="Frps路由器服务端,内网穿透利器。" +dbus set softcenter_module_${MODULE}_version="${VERSION}" +en=`dbus get ${MODULE}_enable` +if [ "$en" == "1" ]; then + /jffs/softcenter/scripts/config-${MODULE}.sh +fi +echo "${MODULE} ${VERSION} install completed!" diff --git a/frps/frps/res/frps-menu.js b/frps/frps/res/frps-menu.js new file mode 100644 index 0000000..8627e58 --- /dev/null +++ b/frps/frps/res/frps-menu.js @@ -0,0 +1,79 @@ +function openssHint(itemNum){ + statusmenu = ""; + width="350px"; + + if(itemNum == 0){ + statusmenu ="如果发现开关不能开启,那么请检查系统管理 -- 系统设置页面内Enable JFFS custom scripts and configs是否开启。"; + _caption = "服务器说明"; + } + else if(itemNum == 1){ + statusmenu ="此处填入你的frp服务器的控制台端口,对应服务器配置文件中的节[common]下的dashboard_port字段"; + _caption = "Dashboard port"; + } + else if(itemNum == 2){ + statusmenu ="此处填入你的frp服务器的服务端口,对应服务器配置文件中的节[common]下的bind_port字段"; + _caption = "Bind port"; + } + else if(itemNum == 3){ + statusmenu ="此处填入你的frp服务器的特权授权码。对应服务器配置文件中的节[common]下的privilege_token字段。注意:使用带有特殊字符的密码,可能会导致frpc链接不上服务器。"; + _caption = "Privilege Token"; + } + else if(itemNum == 4){ + statusmenu ="此处填入你的frp服务器HTTP穿透服务的端口,对应服务器配置文件中的节[common]下的vhost_http_port字段"; + _caption = "vhost http port"; + } + else if(itemNum == 5){ + statusmenu ="此处填入你的frp服务器HTTPS穿透服务的端口,对应服务器配置文件中的节[common]下的vhost_https_port字段"; + _caption = "vhost https port"; + } + else if(itemNum == 6){ + statusmenu ="此处是否开启frpc客户端日志。注意:默认不开启,开启后日志路径为/tmp/frpc.log"; + _caption = "日志记录"; + } + else if(itemNum == 7){ + statusmenu ="此处选择日志记录等级。可选内容:info、warn、error、debug。"; + _caption = "日志等级"; + } + else if(itemNum == 8){ + statusmenu ="此处选择要保留的日志天数。"; + _caption = "日志记录天数"; + } + else if(itemNum == 9){ + statusmenu ="最大连接池数量。默认情况下,当用户请求建立连接后,frps 才会请求 frpc 主动与后端服务建立一个连接。当为指定的代理启用连接池后,frp 会预先和后端服务建立起指定数量的连接,每次接收到用户请求后,会从连接池中取出一个连接和用户连接关联起来,避免了等待与后端服务建立连接以及 frpc 和 frps 之间传递控制信息的时间"; + _caption = "max pool count"; + } + else if(itemNum == 10){ + statusmenu ="定时到Frp服务器上重新注册服务,以便Frp提供持续的服务。注意:填写内容为0时关闭该功能!"; + _caption = "定时注册服务"; + } + else if(itemNum == 11){ + statusmenu ="控制台登录用户名"; + _caption = "Dashboard User"; + } + else if(itemNum == 12){ + statusmenu ="控制台登录密码"; + _caption = "Dashboard Pas"; + } + else if(itemNum == 13){ + statusmenu ="从 v0.10.0 版本开始,客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 frp 可以承载更高的并发数。该功能默认启用,如需关闭,可以在 frps.ini 和 frpc.ini 中配置,该配置项在服务端和客户端必须一致."; + _caption = "TCP 多路复用"; + } + //return overlib(statusmenu, OFFSETX, -160, LEFT, DELAY, 200); + //return overlib(statusmenu, OFFSETX, -160, LEFT, STICKY, WIDTH, 'width', CAPTION, " ", FGCOLOR, "#4D595D", CAPCOLOR, "#000000", CLOSECOLOR, "#000000", MOUSEOFF, "1",TEXTCOLOR, "#FFF", CLOSETITLE, ''); + return overlib(statusmenu, OFFSETX, -160, LEFT, STICKY, WIDTH, 'width', CAPTION, _caption, CLOSETITLE, ''); + + var tag_name= document.getElementsByTagName('a'); + for (var i=0;i helpcontent.length) + return overlib('<#defaultHint#>', HAUTO, VAUTO); + else if(hint_array_id == 0 && hint_show_id > 21 && hint_show_id < 24) + return overlib(helpcontent[hint_array_id][hint_show_id], FIXX, 270, FIXY, 30); + else{ + if(hint_show_id > helpcontent[hint_array_id].length) + return overlib('<#defaultHint#>', HAUTO, VAUTO); + else + return overlib(helpcontent[hint_array_id][hint_show_id], HAUTO, VAUTO); + } +} diff --git a/frps/frps/res/frps_check.html b/frps/frps/res/frps_check.html new file mode 100644 index 0000000..4255b7f --- /dev/null +++ b/frps/frps/res/frps_check.html @@ -0,0 +1 @@ +<% nvram_dump(".frps.log",""); %> diff --git a/frps/frps/res/icon-frps.png b/frps/frps/res/icon-frps.png new file mode 100644 index 0000000..73df653 Binary files /dev/null and b/frps/frps/res/icon-frps.png differ diff --git a/frps/frps/scripts/config-frps.sh b/frps/frps/scripts/config-frps.sh new file mode 100644 index 0000000..9485465 --- /dev/null +++ b/frps/frps/scripts/config-frps.sh @@ -0,0 +1,107 @@ +#!/bin/sh + +eval `dbus export frps_` +source /jffs/softcenter/scripts/base.sh +NAME=frps +BIN=/jffs/softcenter/bin/${NAME} +INI_FILE=/jffs/softcenter/configs/${NAME}.ini +PID_FILE=/var/run/${NAME}.pid +alias echo_date='echo $(date +%Y年%m月%d日\ %X):' +en=${frps_enable} + +fun_ntp_sync(){ + ntp_server=`nvram get ntp_server0` + start_time="`date +%Y%m%d`" + ntpclient -h ${ntp_server} -i3 -l -s > /dev/null 2>&1 + if [ "${start_time}"x = "`date +%Y%m%d`"x ]; then + ntpclient -h ntp1.aliyun.com -i3 -l -s > /dev/null 2>&1 + fi +} +fun_nat_start(){ + if [ "${frps_enable}"x = "1"x ];then + echo_date 添加nat-start触发事件... + dbus set __event__onnatstart_frps="/jffs/softcenter/scripts/config-frps.sh" + else + echo_date 删除nat-start触发... + dbus remove __event__onnatstart_frps + fi +} +onstart() { +fun_ntp_sync +killall ${NAME} || true >/dev/null 2>&1 +dbus set ${NAME}_client_version=`${BIN} --version` + +cat > ${INI_FILE}<<-EOF +# [common] is integral section +[common] +# A literal address or host name for IPv6 must be enclosed +# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80" +bind_addr = 0.0.0.0 +bind_port = ${frps_common_bind_port} +# udp port used for kcp protocol, it can be same with 'bind_port' +# if not set, kcp is disabled in frps +kcp_bind_port = ${frps_common_bind_port} +# if you want to configure or reload frps by dashboard, dashboard_port must be set +dashboard_port = ${frps_common_dashboard_port} +# dashboard user and pwd for basic auth protect, if not set, both default value is admin +dashboard_user = ${frps_common_dashboard_user} +dashboard_pwd = ${frps_common_dashboard_pwd} +vhost_http_port = ${frps_common_vhost_http_port} +vhost_https_port = ${frps_common_vhost_https_port} +# console or real logFile path like ./frps.log +log_file = ${frps_common_log_file} +# debug, info, warn, error +log_level = ${frps_common_log_level} +log_max_days = ${frps_common_log_max_days} +# if you enable privilege mode, frpc can create a proxy without pre-configure in frps when privilege_token is correct +token = ${frps_common_privilege_token} +# only allow frpc to bind ports you list, if you set nothing, there won't be any limit +#allow_ports = 1-65535 +# pool_count in each proxy will change to max_pool_count if they exceed the maximum value +max_pool_count = ${frps_common_max_pool_count} +tcp_mux = ${frps_common_tcp_mux} +EOF + +echo -n "setting ${NAME} crontab..." +if [ "${frps_common_cron_time}" == "0" ]; then + cru d frps_monitor +else + if [ "${frps_common_cron_hour_min}" == "min" ]; then + cru a frps_monitor "*/"${frps_common_cron_time}" * * * * /bin/sh /jffs/softcenter/scripts/config-frps.sh" + elif [ "${frps_common_cron_hour_min}" == "hour" ]; then + cru a frps_monitor "0 */"${frps_common_cron_time}" * * * /bin/sh /jffs/softcenter/scripts/config-frps.sh" + fi +fi +echo " done" +if [ "$en" == "1" ]; then +echo -n "starting ${NAME}..." +export GOGC=40 +start-stop-daemon -S -q -b -m -p ${PID_FILE} -x ${BIN} -- -c ${INI_FILE} +echo " done" +fun_nat_start +else + stop +fi +} +stop() { + echo -n "stop ${NAME}..." + killall frps || true + cru d frps_monitor + fun_nat_start + echo " done" +} + +case $ACTION in +start) + if [[ "$en" == "1" ]]; then + logger "[软件中心]: 启动frps!" + onstart + fi + ;; +stop) + stop + ;; +*) + onstart + ;; +esac diff --git a/frps/frps/scripts/frps_status.sh b/frps/frps/scripts/frps_status.sh new file mode 100644 index 0000000..9605914 --- /dev/null +++ b/frps/frps/scripts/frps_status.sh @@ -0,0 +1,12 @@ +#! /bin/sh +frps_pid=`ps | grep -w frps | grep -v grep | awk '{print $1}'` +frps_status=`ps | grep -w frps | grep -cv grep` +frps_version=`/jffs/softcenter/bin/frps -v` +if [ "$frps_status" == "1" ];then + echo frps $frps_version 进程运行正常!(PID:$frps_pid) > /tmp/.frps.log +else + echo frps $frps_version 【警告】:进程未运行! > /tmp/.frps.log +fi +echo XU6J03M6 >> /tmp/.frps.log +sleep 2 +rm -rf /tmp/.frps.log diff --git a/frps/frps/scripts/uninstall_frps.sh b/frps/frps/scripts/uninstall_frps.sh new file mode 100644 index 0000000..f68040f --- /dev/null +++ b/frps/frps/scripts/uninstall_frps.sh @@ -0,0 +1,25 @@ +#!/bin/sh +eval `dbus export frps_` +source /jffs/softcenter/scripts/base.sh +MODULE=frps +cd / +rm -f /jffs/softcenter/bin/${MODULE} +rm -f /jffs/softcenter/init.d/S97${MODULE}.sh +rm -f /jffs/softcenter/res/${MODULE}_check.html +rm -f /jffs/softcenter/res/${MODULE}-menu.js +rm -f /jffs/softcenter/res/icon-${MODULE}.png +rm -f /jffs/softcenter/scripts/config-${MODULE}.sh +rm -f /jffs/softcenter/scripts/${MODULE}_status.sh +rm -f /jffs/softcenter/webs/Module_${MODULE}.asp +rm -f /jffs/softcenter/configs/${MODULE}.ini +rm -fr /tmp/frps* +values=`dbus list ${MODULE} | cut -d "=" -f 1` + +for value in $values +do +dbus remove $value +done +dbus remove __event__onwanstart_${MODULE} +dbus remove __event__onnatstart_${MODULE} +cru d ${MODULE}_monitor +rm -f /jffs/softcenter/scripts/uninstall_${MODULE}.sh diff --git a/frps/frps/webs/Module_frps.asp b/frps/frps/webs/Module_frps.asp new file mode 100644 index 0000000..0a880d7 --- /dev/null +++ b/frps/frps/webs/Module_frps.asp @@ -0,0 +1,512 @@ + + + + + + + + + +软件中心 - frps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +"/> +"/> + + + + + + + + + + + + + + + + + + + 软件中心 - Frps内网穿透 + + + * 为了Frps稳定运行,请开启虚拟内存功能!!! 服务器搭建教程 + + + + 开启Frps + + + + + + + + + + + + + + [ 更新日志 ] + + + + + + + Frps 相关设置 + + + 版本信息 + + 插件版本:<% dbus_get_def("frps_version", "未知"); %> + 获取中... + + + Dashboard port + + + + + + + Dashboard User + + + + + + + Dashboard Pass + + + + + + + Bind port + + + + + + + Privilege Token + + + + + + + vhost http port + + + + + + + vhost https port + + + + + + + TCP 多路复用 + + + 开启 + 关闭 + + + + + + 日志记录 + + + 开启 + 关闭 + + + + + + 日志等级 + + + info + warn + error + debug + + + + + + 日志记录天数 + + + 1 + 2 + 3 + 4 + 6 + 6 + 7 + 30 + + + + + + max pool count + + + 10 + 20 + 30 + 40 + 50 + 60 + 70 + 80 + 90 + 100 + 150 + 200 + + + + + + 定时注册服务(0为关闭) + + 每 + + 分钟 + 小时 + 重新注册一次服务 + + + + + * 注意事项: + 1. 请使用虚拟内存!请使用虚拟内存!请使用虚拟内存!重要的事说三遍 + 2. 上面所有内容都为必填项,请认真填写,不然无法穿透。 + 3. 每一个文字都可以点击查看相应的帮助信息。 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frps/history/1.4.16/frps.tar.gz b/frps/history/1.4.16/frps.tar.gz new file mode 100644 index 0000000..b9a709f Binary files /dev/null and b/frps/history/1.4.16/frps.tar.gz differ diff --git a/frps/history/version b/frps/history/version new file mode 100644 index 0000000..10a931f --- /dev/null +++ b/frps/history/version @@ -0,0 +1 @@ +1.4.16 f2c5e1d30873e21aca2e28f5a10d52f6 diff --git a/frps/version b/frps/version new file mode 100644 index 0000000..886abf2 --- /dev/null +++ b/frps/version @@ -0,0 +1,2 @@ +1.4.16 +7fac5d6a5a6a0b1be355c21ea29f6251 diff --git a/softcenter/app.json.js b/softcenter/app.json.js index 2f0bae0..f213113 100644 --- a/softcenter/app.json.js +++ b/softcenter/app.json.js @@ -70,6 +70,16 @@ "title": "Aria2", "version": "2.4" }, + { + "build_date": "2019-01-16_20:01:32", + "description": "内网穿透利器,谁用谁知道。", + "home_url": "Module_frpc.asp", + "md5": "6ad0d26c66249eb415af1f9c72a8e986", + "name": "frpc", + "tar_url": "frpc/frpc.tar.gz", + "title": "frpc穿透", + "version": "2.1.15" + }, { "build_date": "2019-01-13_19:04:43", "description": "kms", @@ -80,6 +90,16 @@ "title": "kms", "version": "1.5" }, + { + "build_date": "2019-01-16_20:13:34", + "description": "内网穿透利器,谁用谁知道。", + "home_url": "Module_frps.asp", + "md5": "7fac5d6a5a6a0b1be355c21ea29f6251", + "name": "frps", + "tar_url": "frps/frps.tar.gz", + "title": "frps穿透", + "version": "1.4.16" + }, { "build_date": "2019-01-12_22:19:14", "description": "阿里云解析自动更新IP",
'+(n.content||"")+"