diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 27b1d61541..f0ea41d98c 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -12,8 +12,8 @@ include $(INCLUDE_DIR)/version.mk include $(INCLUDE_DIR)/feeds.mk PKG_NAME:=base-files -PKG_RELEASE:=218 PKG_FLAGS:=nonshared +PKG_RELEASE:=$(COMMITCOUNT) PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/ PKG_BUILD_DEPENDS:=usign/host ucert/host diff --git a/package/boot/uboot-envtools/Makefile b/package/boot/uboot-envtools/Makefile index 8bc2c00ba5..5014b71ef6 100644 --- a/package/boot/uboot-envtools/Makefile +++ b/package/boot/uboot-envtools/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uboot-envtools PKG_DISTNAME:=u-boot PKG_VERSION:=2020.04 -PKG_RELEASE:=17 +PKG_RELEASE:=$(AUTORELEASE) PKG_SOURCE:=$(PKG_DISTNAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:= \ diff --git a/package/ctcgfw/luci-app-jd-dailybonus/Makefile b/package/ctcgfw/luci-app-jd-dailybonus/Makefile index b8a76bbd41..406342eeed 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/Makefile +++ b/package/ctcgfw/luci-app-jd-dailybonus/Makefile @@ -8,12 +8,13 @@ include $(TOPDIR)/rules.mk LUCI_TITLE:=Luci for JD dailybonus Script -LUCI_DEPENDS:=+node +node-request +coreutils +coreutils-nohup +wget +LUCI_DEPENDS:=+coreutils +coreutils-nohup +node +node-request \ + +lua +luasocket +lua-cjson +lua-md5 +luasec +wget-ssl LUCI_PKGARCH:=all PKG_NAME:=luci-app-jd-dailybonus -PKG_VERSION:=0.8.9 -PKG_RELEASE:=20201230 +PKG_VERSION:=1.0.1 +PKG_RELEASE:=20210123 include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/JDCookie.zip b/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/JDCookie.zip deleted file mode 100644 index 54bcf0cd5c..0000000000 Binary files a/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/JDCookie.zip and /dev/null differ diff --git a/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/qrcode.min.js b/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/qrcode.min.js new file mode 100644 index 0000000000..993e88f396 --- /dev/null +++ b/package/ctcgfw/luci-app-jd-dailybonus/htdocs/jd-dailybonus/qrcode.min.js @@ -0,0 +1 @@ +var QRCode;!function(){function a(a){this.mode=c.MODE_8BIT_BYTE,this.data=a,this.parsedData=[];for(var b=[],d=0,e=this.data.length;e>d;d++){var f=this.data.charCodeAt(d);f>65536?(b[0]=240|(1835008&f)>>>18,b[1]=128|(258048&f)>>>12,b[2]=128|(4032&f)>>>6,b[3]=128|63&f):f>2048?(b[0]=224|(61440&f)>>>12,b[1]=128|(4032&f)>>>6,b[2]=128|63&f):f>128?(b[0]=192|(1984&f)>>>6,b[1]=128|63&f):b[0]=f,this.parsedData=this.parsedData.concat(b)}this.parsedData.length!=this.data.length&&(this.parsedData.unshift(191),this.parsedData.unshift(187),this.parsedData.unshift(239))}function b(a,b){this.typeNumber=a,this.errorCorrectLevel=b,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=[]}function i(a,b){if(void 0==a.length)throw new Error(a.length+"/"+b);for(var c=0;c=f;f++){var h=0;switch(b){case d.L:h=l[f][0];break;case d.M:h=l[f][1];break;case d.Q:h=l[f][2];break;case d.H:h=l[f][3]}if(h>=e)break;c++}if(c>l.length)throw new Error("Too long data");return c}function s(a){var b=encodeURI(a).toString().replace(/\%[0-9a-fA-F]{2}/g,"a");return b.length+(b.length!=a?3:0)}a.prototype={getLength:function(){return this.parsedData.length},write:function(a){for(var b=0,c=this.parsedData.length;c>b;b++)a.put(this.parsedData[b],8)}},b.prototype={addData:function(b){var c=new a(b);this.dataList.push(c),this.dataCache=null},isDark:function(a,b){if(0>a||this.moduleCount<=a||0>b||this.moduleCount<=b)throw new Error(a+","+b);return this.modules[a][b]},getModuleCount:function(){return this.moduleCount},make:function(){this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(a,c){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var d=0;d=7&&this.setupTypeNumber(a),null==this.dataCache&&(this.dataCache=b.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,c)},setupPositionProbePattern:function(a,b){for(var c=-1;7>=c;c++)if(!(-1>=a+c||this.moduleCount<=a+c))for(var d=-1;7>=d;d++)-1>=b+d||this.moduleCount<=b+d||(this.modules[a+c][b+d]=c>=0&&6>=c&&(0==d||6==d)||d>=0&&6>=d&&(0==c||6==c)||c>=2&&4>=c&&d>=2&&4>=d?!0:!1)},getBestMaskPattern:function(){for(var a=0,b=0,c=0;8>c;c++){this.makeImpl(!0,c);var d=f.getLostPoint(this);(0==c||a>d)&&(a=d,b=c)}return b},createMovieClip:function(a,b,c){var d=a.createEmptyMovieClip(b,c),e=1;this.make();for(var f=0;f=g;g++)for(var h=-2;2>=h;h++)this.modules[d+g][e+h]=-2==g||2==g||-2==h||2==h||0==g&&0==h?!0:!1}},setupTypeNumber:function(a){for(var b=f.getBCHTypeNumber(this.typeNumber),c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[Math.floor(c/3)][c%3+this.moduleCount-8-3]=d}for(var c=0;18>c;c++){var d=!a&&1==(1&b>>c);this.modules[c%3+this.moduleCount-8-3][Math.floor(c/3)]=d}},setupTypeInfo:function(a,b){for(var c=this.errorCorrectLevel<<3|b,d=f.getBCHTypeInfo(c),e=0;15>e;e++){var g=!a&&1==(1&d>>e);6>e?this.modules[e][8]=g:8>e?this.modules[e+1][8]=g:this.modules[this.moduleCount-15+e][8]=g}for(var e=0;15>e;e++){var g=!a&&1==(1&d>>e);8>e?this.modules[8][this.moduleCount-e-1]=g:9>e?this.modules[8][15-e-1+1]=g:this.modules[8][15-e-1]=g}this.modules[this.moduleCount-8][8]=!a},mapData:function(a,b){for(var c=-1,d=this.moduleCount-1,e=7,g=0,h=this.moduleCount-1;h>0;h-=2)for(6==h&&h--;;){for(var i=0;2>i;i++)if(null==this.modules[d][h-i]){var j=!1;g>>e));var k=f.getMask(b,d,h-i);k&&(j=!j),this.modules[d][h-i]=j,e--,-1==e&&(g++,e=7)}if(d+=c,0>d||this.moduleCount<=d){d-=c,c=-c;break}}}},b.PAD0=236,b.PAD1=17,b.createData=function(a,c,d){for(var e=j.getRSBlocks(a,c),g=new k,h=0;h8*l)throw new Error("code length overflow. ("+g.getLengthInBits()+">"+8*l+")");for(g.getLengthInBits()+4<=8*l&&g.put(0,4);0!=g.getLengthInBits()%8;)g.putBit(!1);for(;;){if(g.getLengthInBits()>=8*l)break;if(g.put(b.PAD0,8),g.getLengthInBits()>=8*l)break;g.put(b.PAD1,8)}return b.createBytes(g,e)},b.createBytes=function(a,b){for(var c=0,d=0,e=0,g=new Array(b.length),h=new Array(b.length),j=0;j=0?p.get(q):0}}for(var r=0,m=0;mm;m++)for(var j=0;jm;m++)for(var j=0;j=0;)b^=f.G15<=0;)b^=f.G18<>>=1;return b},getPatternPosition:function(a){return f.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,b,c){switch(a){case e.PATTERN000:return 0==(b+c)%2;case e.PATTERN001:return 0==b%2;case e.PATTERN010:return 0==c%3;case e.PATTERN011:return 0==(b+c)%3;case e.PATTERN100:return 0==(Math.floor(b/2)+Math.floor(c/3))%2;case e.PATTERN101:return 0==b*c%2+b*c%3;case e.PATTERN110:return 0==(b*c%2+b*c%3)%2;case e.PATTERN111:return 0==(b*c%3+(b+c)%2)%2;default:throw new Error("bad maskPattern:"+a)}},getErrorCorrectPolynomial:function(a){for(var b=new i([1],0),c=0;a>c;c++)b=b.multiply(new i([1,g.gexp(c)],0));return b},getLengthInBits:function(a,b){if(b>=1&&10>b)switch(a){case c.MODE_NUMBER:return 10;case c.MODE_ALPHA_NUM:return 9;case c.MODE_8BIT_BYTE:return 8;case c.MODE_KANJI:return 8;default:throw new Error("mode:"+a)}else if(27>b)switch(a){case c.MODE_NUMBER:return 12;case c.MODE_ALPHA_NUM:return 11;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 10;default:throw new Error("mode:"+a)}else{if(!(41>b))throw new Error("type:"+b);switch(a){case c.MODE_NUMBER:return 14;case c.MODE_ALPHA_NUM:return 13;case c.MODE_8BIT_BYTE:return 16;case c.MODE_KANJI:return 12;default:throw new Error("mode:"+a)}}},getLostPoint:function(a){for(var b=a.getModuleCount(),c=0,d=0;b>d;d++)for(var e=0;b>e;e++){for(var f=0,g=a.isDark(d,e),h=-1;1>=h;h++)if(!(0>d+h||d+h>=b))for(var i=-1;1>=i;i++)0>e+i||e+i>=b||(0!=h||0!=i)&&g==a.isDark(d+h,e+i)&&f++;f>5&&(c+=3+f-5)}for(var d=0;b-1>d;d++)for(var e=0;b-1>e;e++){var j=0;a.isDark(d,e)&&j++,a.isDark(d+1,e)&&j++,a.isDark(d,e+1)&&j++,a.isDark(d+1,e+1)&&j++,(0==j||4==j)&&(c+=3)}for(var d=0;b>d;d++)for(var e=0;b-6>e;e++)a.isDark(d,e)&&!a.isDark(d,e+1)&&a.isDark(d,e+2)&&a.isDark(d,e+3)&&a.isDark(d,e+4)&&!a.isDark(d,e+5)&&a.isDark(d,e+6)&&(c+=40);for(var e=0;b>e;e++)for(var d=0;b-6>d;d++)a.isDark(d,e)&&!a.isDark(d+1,e)&&a.isDark(d+2,e)&&a.isDark(d+3,e)&&a.isDark(d+4,e)&&!a.isDark(d+5,e)&&a.isDark(d+6,e)&&(c+=40);for(var k=0,e=0;b>e;e++)for(var d=0;b>d;d++)a.isDark(d,e)&&k++;var l=Math.abs(100*k/b/b-50)/5;return c+=10*l}},g={glog:function(a){if(1>a)throw new Error("glog("+a+")");return g.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;a>=256;)a-=255;return g.EXP_TABLE[a]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},h=0;8>h;h++)g.EXP_TABLE[h]=1<h;h++)g.EXP_TABLE[h]=g.EXP_TABLE[h-4]^g.EXP_TABLE[h-5]^g.EXP_TABLE[h-6]^g.EXP_TABLE[h-8];for(var h=0;255>h;h++)g.LOG_TABLE[g.EXP_TABLE[h]]=h;i.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var b=new Array(this.getLength()+a.getLength()-1),c=0;cf;f++)for(var g=c[3*f+0],h=c[3*f+1],i=c[3*f+2],k=0;g>k;k++)e.push(new j(h,i));return e},j.getRsBlockTable=function(a,b){switch(b){case d.L:return j.RS_BLOCK_TABLE[4*(a-1)+0];case d.M:return j.RS_BLOCK_TABLE[4*(a-1)+1];case d.Q:return j.RS_BLOCK_TABLE[4*(a-1)+2];case d.H:return j.RS_BLOCK_TABLE[4*(a-1)+3];default:return void 0}},k.prototype={get:function(a){var b=Math.floor(a/8);return 1==(1&this.buffer[b]>>>7-a%8)},put:function(a,b){for(var c=0;b>c;c++)this.putBit(1==(1&a>>>b-c-1))},getLengthInBits:function(){return this.length},putBit:function(a){var b=Math.floor(this.length/8);this.buffer.length<=b&&this.buffer.push(0),a&&(this.buffer[b]|=128>>>this.length%8),this.length++}};var l=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]],o=function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){function g(a,b){var c=document.createElementNS("http://www.w3.org/2000/svg",a);for(var d in b)b.hasOwnProperty(d)&&c.setAttribute(d,b[d]);return c}var b=this._htOption,c=this._el,d=a.getModuleCount();Math.floor(b.width/d),Math.floor(b.height/d),this.clear();var h=g("svg",{viewBox:"0 0 "+String(d)+" "+String(d),width:"100%",height:"100%",fill:b.colorLight});h.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink"),c.appendChild(h),h.appendChild(g("rect",{fill:b.colorDark,width:"1",height:"1",id:"template"}));for(var i=0;d>i;i++)for(var j=0;d>j;j++)if(a.isDark(i,j)){var k=g("use",{x:String(i),y:String(j)});k.setAttributeNS("http://www.w3.org/1999/xlink","href","#template"),h.appendChild(k)}},a.prototype.clear=function(){for(;this._el.hasChildNodes();)this._el.removeChild(this._el.lastChild)},a}(),p="svg"===document.documentElement.tagName.toLowerCase(),q=p?o:m()?function(){function a(){this._elImage.src=this._elCanvas.toDataURL("image/png"),this._elImage.style.display="block",this._elCanvas.style.display="none"}function d(a,b){var c=this;if(c._fFail=b,c._fSuccess=a,null===c._bSupportDataURI){var d=document.createElement("img"),e=function(){c._bSupportDataURI=!1,c._fFail&&_fFail.call(c)},f=function(){c._bSupportDataURI=!0,c._fSuccess&&c._fSuccess.call(c)};return d.onabort=e,d.onerror=e,d.onload=f,d.src="data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",void 0}c._bSupportDataURI===!0&&c._fSuccess?c._fSuccess.call(c):c._bSupportDataURI===!1&&c._fFail&&c._fFail.call(c)}if(this._android&&this._android<=2.1){var b=1/window.devicePixelRatio,c=CanvasRenderingContext2D.prototype.drawImage;CanvasRenderingContext2D.prototype.drawImage=function(a,d,e,f,g,h,i,j){if("nodeName"in a&&/img/i.test(a.nodeName))for(var l=arguments.length-1;l>=1;l--)arguments[l]=arguments[l]*b;else"undefined"==typeof j&&(arguments[1]*=b,arguments[2]*=b,arguments[3]*=b,arguments[4]*=b);c.apply(this,arguments)}}var e=function(a,b){this._bIsPainted=!1,this._android=n(),this._htOption=b,this._elCanvas=document.createElement("canvas"),this._elCanvas.width=b.width,this._elCanvas.height=b.height,a.appendChild(this._elCanvas),this._el=a,this._oContext=this._elCanvas.getContext("2d"),this._bIsPainted=!1,this._elImage=document.createElement("img"),this._elImage.style.display="none",this._el.appendChild(this._elImage),this._bSupportDataURI=null};return e.prototype.draw=function(a){var b=this._elImage,c=this._oContext,d=this._htOption,e=a.getModuleCount(),f=d.width/e,g=d.height/e,h=Math.round(f),i=Math.round(g);b.style.display="none",this.clear();for(var j=0;e>j;j++)for(var k=0;e>k;k++){var l=a.isDark(j,k),m=k*f,n=j*g;c.strokeStyle=l?d.colorDark:d.colorLight,c.lineWidth=1,c.fillStyle=l?d.colorDark:d.colorLight,c.fillRect(m,n,f,g),c.strokeRect(Math.floor(m)+.5,Math.floor(n)+.5,h,i),c.strokeRect(Math.ceil(m)-.5,Math.ceil(n)-.5,h,i)}this._bIsPainted=!0},e.prototype.makeImage=function(){this._bIsPainted&&d.call(this,a)},e.prototype.isPainted=function(){return this._bIsPainted},e.prototype.clear=function(){this._oContext.clearRect(0,0,this._elCanvas.width,this._elCanvas.height),this._bIsPainted=!1},e.prototype.round=function(a){return a?Math.floor(1e3*a)/1e3:a},e}():function(){var a=function(a,b){this._el=a,this._htOption=b};return a.prototype.draw=function(a){for(var b=this._htOption,c=this._el,d=a.getModuleCount(),e=Math.floor(b.width/d),f=Math.floor(b.height/d),g=[''],h=0;d>h;h++){g.push("");for(var i=0;d>i;i++)g.push('');g.push("")}g.push("
"),c.innerHTML=g.join("");var j=c.childNodes[0],k=(b.width-j.offsetWidth)/2,l=(b.height-j.offsetHeight)/2;k>0&&l>0&&(j.style.margin=l+"px "+k+"px")},a.prototype.clear=function(){this._el.innerHTML=""},a}();QRCode=function(a,b){if(this._htOption={width:256,height:256,typeNumber:4,colorDark:"#000000",colorLight:"#ffffff",correctLevel:d.H},"string"==typeof b&&(b={text:b}),b)for(var c in b)this._htOption[c]=b[c];"string"==typeof a&&(a=document.getElementById(a)),this._android=n(),this._el=a,this._oQRCode=null,this._oDrawing=new q(this._el,this._htOption),this._htOption.text&&this.makeCode(this._htOption.text)},QRCode.prototype.makeCode=function(a){this._oQRCode=new b(r(a,this._htOption.correctLevel),this._htOption.correctLevel),this._oQRCode.addData(a),this._oQRCode.make(),this._el.title=a,this._oDrawing.draw(this._oQRCode),this.makeImage()},QRCode.prototype.makeImage=function(){"function"==typeof this._oDrawing.makeImage&&(!this._android||this._android>=3)&&this._oDrawing.makeImage()},QRCode.prototype.clear=function(){this._oDrawing.clear()},QRCode.CorrectLevel=d}(); \ No newline at end of file diff --git a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua index 38914fe751..f284836d32 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua +++ b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/controller/jd-dailybonus.lua @@ -1,82 +1,112 @@ -- Copyright (C) 2020 jerrykuku -- Licensed to the public under the GNU General Public License v3. -module("luci.controller.jd-dailybonus", package.seeall) -function index() - if not nixio.fs.access("/etc/config/jd-dailybonus") then - return +module('luci.controller.jd-dailybonus', package.seeall) +package.path = package.path .. ';/usr/share/jd-dailybonus/?.lua' +function index() + if not nixio.fs.access('/etc/config/jd-dailybonus') then + return end - entry({"admin", "services", "jd-dailybonus"}, alias("admin", "services", "jd-dailybonus", "client"), _("JD-DailyBonus"), 10).dependent = true -- 首页 - entry({"admin", "services", "jd-dailybonus", "client"}, cbi("jd-dailybonus/client"),_("Client"), 10).leaf = true -- 基本设置 - entry({"admin", "services", "jd-dailybonus", "log"},form("jd-dailybonus/log"),_("Log"), 30).leaf = true -- 日志页面 - entry({"admin", "services", "jd-dailybonus", "script"},form("jd-dailybonus/script"),_("Script"), 20).leaf = true -- 直接配置脚本 - entry({"admin", "services", "jd-dailybonus", "run"}, call("run")) -- 执行程序 - entry({"admin", "services", "jd-dailybonus", "update"}, call("update")) -- 执行更新 - entry({"admin", "services", "jd-dailybonus", "check_update"}, call("check_update")) -- 检查更新 + entry({'admin', 'services', 'jd-dailybonus'}, alias('admin', 'services', 'jd-dailybonus', 'client'), _('京东签到服务'), 10).dependent = true -- 首页 + entry({'admin', 'services', 'jd-dailybonus', 'client'}, cbi('jd-dailybonus/client', {hidesavebtn = true, hideresetbtn = true}), _('客户端'), 10).leaf = true -- 基本设置 + entry({'admin', 'services', 'jd-dailybonus', 'log'}, form('jd-dailybonus/log'), _('日志'), 30).leaf = true -- 日志页面 + entry({'admin', 'services', 'jd-dailybonus', 'script'}, form('jd-dailybonus/script'), _('脚本查看'), 20).leaf = true -- 直接配置脚本 + entry({'admin', 'services', 'jd-dailybonus', 'run'}, call('run')) -- 执行程序 + entry({'admin', 'services', 'jd-dailybonus', 'update'}, call('update')) -- 执行更新 + entry({'admin', 'services', 'jd-dailybonus', 'check_update'}, call('check_update')) -- 检查更新 + entry({'admin', 'services', 'jd-dailybonus', 'qrcode'}, call('qrcode')) -- 获取二维码 + entry({'admin', 'services', 'jd-dailybonus', 'check_login'}, call('check_login')) -- 获取二维码 end - +-- 写入配置 +function write_json(file, content) + local json = require 'luci.jsonc' + local f = assert(io.open(file, 'w')) + f:write(json.stringify(content, 1)) + f:close() +end -- 执行程序 - function run() local e = {} local uci = luci.model.uci.cursor() - local cookie = luci.http.formvalue("cookies") - local cookie2 = luci.http.formvalue("cookies2") - local auto_update = luci.http.formvalue("auto_update") - local auto_update_time = luci.http.formvalue("auto_update_time") - local auto_run = luci.http.formvalue("auto_run") - local auto_run_time = luci.http.formvalue("auto_run_time") - local stop = luci.http.formvalue("stop") - local serverchan = luci.http.formvalue("serverchan") - local failed = luci.http.formvalue("failed") - local name = "" - uci:foreach("vssr", "global", function(s) name = s[".name"] end) + local data = luci.http.formvalue() - if cookie ~= " " then - uci:set("jd-dailybonus", '@global[0]', 'auto_update', auto_update) - uci:set("jd-dailybonus", '@global[0]', 'auto_update_time', auto_update_time) - uci:set("jd-dailybonus", '@global[0]', 'auto_run', auto_run) - uci:set("jd-dailybonus", '@global[0]', 'auto_run_time', auto_run_time) - uci:set("jd-dailybonus", '@global[0]', 'stop', stop) - uci:set("jd-dailybonus", '@global[0]', 'cookie', cookie) - uci:set("jd-dailybonus", '@global[0]', 'cookie2', cookie2) - uci:set("jd-dailybonus", '@global[0]', 'serverchan', serverchan) - uci:set("jd-dailybonus", '@global[0]', 'failed', failed) - uci:save("jd-dailybonus") - uci:commit("jd-dailybonus") - luci.sys.call("/usr/share/jd-dailybonus/newapp.sh -r") - luci.sys.call("/usr/share/jd-dailybonus/newapp.sh -a") - e.error = 0 - else - e.error = 1 - end + data.auto_run = data.auto_run ~= nil and data.auto_run or 0 + data.auto_update = data.auto_update ~= nil and data.auto_update or 0 + uci:tset('jd-dailybonus', '@global[0]', data) + uci:commit('jd-dailybonus') + local json_data = { + CookieJD = data.cookie, + CookieJD2 = data.cookie2:len() == 0 and nil or data.cookie2, + JD_DailyBonusDelay = data.stop, + JD_DailyBonusTimeOut = data.out + } + write_json('/root/CookieSet.json', json_data) + write_json('/www/CookieSet.json', json_data) + luci.sys.call('/usr/share/jd-dailybonus/newapp.sh -r') + luci.sys.call('/usr/share/jd-dailybonus/newapp.sh -a') + e.error = 0 - luci.http.prepare_content("application/json") + luci.http.prepare_content('application/json') luci.http.write_json(e) - end --检查更新 function check_update() - local jd = "jd-dailybonus" + local jd = 'jd-dailybonus' local e = {} - local new_version = luci.sys.exec("/usr/share/jd-dailybonus/newapp.sh -n") + local new_version = luci.sys.exec('/usr/share/jd-dailybonus/newapp.sh -n') e.new_version = new_version e.error = 0 - luci.http.prepare_content("application/json") + luci.http.prepare_content('application/json') luci.http.write_json(e) end --执行更新 function update() - local jd = "jd-dailybonus" + local jd = 'jd-dailybonus' local e = {} local uci = luci.model.uci.cursor() - local version = luci.http.formvalue("version") + local version = luci.http.formvalue('version') --下载脚本 - local code = luci.sys.exec("/usr/share/jd-dailybonus/newapp.sh -u") + local code = luci.sys.exec('/usr/share/jd-dailybonus/newapp.sh -u') e.error = code - luci.http.prepare_content("application/json") + luci.http.prepare_content('application/json') luci.http.write_json(e) -end \ No newline at end of file +end + +--获取二维码 +function qrcode() + local jd_cookie = require 'jd_cookie' + local e = {} + e.error = 0 + e.data = jd_cookie.get_qrcode() + luci.http.prepare_content('application/json') + luci.http.write_json(e) +end + +--检测登录 +function check_login() + local jd_cookie = require 'jd_cookie' + local uci = luci.model.uci.cursor() + local data = luci.http.formvalue() + local id = data.id + local e = jd_cookie.checkLogin(data.check_url, data.cookies) + if e.error == 0 then + local cookieStr = 'pt_key=' .. e.cookie.pt_key .. ';pt_pin=' .. e.cookie.pt_pin .. ';' + uci:set('jd-dailybonus', '@global[0]', id, cookieStr) + local json_data = { + CookieJD = uci:get('jd-dailybonus', '@global[0]', 'cookie'), + CookieJD2 = uci:get('jd-dailybonus', '@global[0]', 'cookie2'), + JD_DailyBonusDelay = uci:get('jd-dailybonus', '@global[0]', 'stop'), + JD_DailyBonusTimeOut = uci:get('jd-dailybonus', '@global[0]', 'out') + } + write_json('/root/CookieSet.json', json_data) + write_json('/www/CookieSet.json', json_data) + uci:commit('jd-dailybonus') + e.cstr = cookieStr + end + + luci.http.prepare_content('application/json') + luci.http.write_json(e) +end diff --git a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/client.lua b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/client.lua index 72a252472f..d1cf607662 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/client.lua +++ b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/model/cbi/jd-dailybonus/client.lua @@ -1,75 +1,101 @@ -local jd = "jd-dailybonus" +local jd = 'jd-dailybonus' local uci = luci.model.uci.cursor() -local sys = require "luci.sys" +local sys = require 'luci.sys' m = Map(jd) -- [[ 基本设置 ]]-- -s = m:section(TypedSection, "global", - translate("Base Config")) +s = m:section(TypedSection, 'global', translate('基本设置')) s.anonymous = true -o = s:option(DummyValue, "", "") +o = s:option(DummyValue, '', '') o.rawhtml = true -o.template = "jd-dailybonus/cookie_tools" +o.template = 'jd-dailybonus/cookie_tools' -o = s:option(ListValue, "remote_url", translate("Source Update Url")) -o:value("https://cdn.jsdelivr.net/gh/NobyDa/Script/JD-DailyBonus/JD_DailyBonus.js", translate("GitHub")) -o:value("https://gitee.com/jerrykuku/staff/raw/master/JD_DailyBonus.js", translate("Gitee")) -o.default = "nil" -o.rmempty = false -o.description = translate('当GitHub源无法更新时,可以选择使用国内Gitee源') - -o = s:option(Value, "cookie", translate("First Cookie")) +o = s:option(Value, 'cookie', translate('第一账号Cookie')) o.rmempty = false -o = s:option(Value, "cookie2", translate("Second Cookie")) +o = s:option(Value, 'cookie2', translate('第二账号Cookie')) o.rmempty = true -o.description = translate('双账号用户抓取"账号1"Cookie后, 请勿点击退出账号(可能会导致Cookie失效), 需清除浏览器资料或更换浏览器登录"账号2"抓取.') -o = s:option(Value, "stop", translate("Execute Delay")) +o = s:option(Value, 'stop', translate('延迟签到')) o.rmempty = false o.default = 0 o.datatype = integer -o.description = translate("自定义延迟签到,单位毫秒. 默认分批并发无延迟. (延迟作用于每个签到接口, 如填入延迟则切换顺序签到. ) ") +o.description = translate('自定义延迟签到,单位毫秒. 默认分批并发无延迟. (延迟作用于每个签到接口, 如填入延迟则切换顺序签到. ) ') -o = s:option(ListValue, "serverurl", translate("ServerURL")) -o:value("scu", translate("SCU")) -o:value("sct", translate("SCT")) -o.default = "scu" +o = s:option(Value, 'out', translate('接口超时')) +o.rmempty = false +o.default = 0 +o.datatype = integer +o.description = translate('接口超时退出,单位毫秒 用于可能发生的网络不稳定, 0则关闭.') + +-- server chan +o = s:option(ListValue, 'serverurl', translate('Server酱的推送接口地址')) +o:value('scu', translate('SCU')) +o:value('sct', translate('SCT')) +o.default = 'scu' o.rmempty = false o.description = translate('选择Server酱的推送接口') -o = s:option(Value, "serverchan", translate("ServerChan SCKEY")) +o = s:option(Value, 'serverchan', translate('Server酱 SCKEY')) o.rmempty = true -o.description = translate("微信推送,基于Server酱服务,请自行登录 http://sc.ftqq.com/ 绑定并获取 SCKEY (仅在自动签到时推送)") +o.description = translate('微信推送,基于Server酱服务,请自行登录 http://sc.ftqq.com/ 绑定并获取 SCKEY。') -o = s:option(Flag, "failed", translate("Failed Push")) +-- telegram + +o = s:option(Value, 'tg_token', translate('Telegram Bot Token')) +o.rmempty = true +o.description = translate('首先在Telegram上搜索BotFather机器人,创建一个属于自己的通知机器人,并获取Token。') + +o = s:option(Value, 'tg_userid', translate('Telegram UserID')) +o.rmempty = true +o.description = translate('在Telegram上搜索getuserIDbot机器人,获取UserID。') + +--Auto Run Script Service + +o = s:option(Flag, 'auto_run', translate('自动签到')) o.rmempty = false -o.description = translate("仅当cookie失效时推送") -o = s:option(Flag, "auto_update", translate("Auto Update")) -o.rmempty = false -o.description = translate("Auto Update Script Service") - -o =s:option(ListValue, "auto_update_time", translate("Update time (every day)")) -for t = 0, 23 do o:value(t, t .. ":01") end +o = s:option(ListValue, 'auto_run_time_h', translate('每天签到时间(小时)')) +for t = 0, 23 do + o:value(t, t) +end o.default = 1 o.rmempty = true -o:depends("auto_update", "1") - -o = s:option(Flag, "auto_run", translate("Auto Run")) -o.rmempty = false -o.description = translate("Auto Run Script Service") - -o =s:option(ListValue, "auto_run_time", translate("Run time (every day)")) -for t = 0, 23 do o:value(t, t .. ":05") end +o:depends('auto_run', '1') +o = s:option(ListValue, 'auto_run_time_m', translate('每天签到时间(分钟)')) +for t = 0, 59 do + o:value(t, t) +end o.default = 1 o.rmempty = true -o:depends("auto_run", "1") +o:depends('auto_run', '1') -o = s:option(DummyValue, "", "") +-- Auto Update Script Service + +o = s:option(Flag, 'auto_update', translate('自动更新')) +o.rmempty = false + +o = s:option(ListValue, 'auto_update_time', translate('每天更新时间')) +for t = 0, 23 do + o:value(t, t .. ':01') +end +o.default = 1 +o.rmempty = true +o:depends('auto_update', '1') + +o = s:option(Value, 'remote_url', translate('更新源地址')) +o:value('https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js', translate('GitHub')) +o:value('https://cdn.jsdelivr.net/gh/NobyDa/Script/JD-DailyBonus/JD_DailyBonus.js', translate('GitHub CDN')) +o:value('https://gitee.com/jerrykuku/staff/raw/master/JD_DailyBonus.js', translate('Gitee')) +o.default = 'nil' +o.rmempty = false +o.description = translate('当GitHub源无法更新时,可以选择使用国内Gitee源,GitHub CDN可能比原地址更晚更新,但速度快') + +o = s:option(DummyValue, '', '') o.rawhtml = true o.version = sys.exec('uci get jd-dailybonus.@global[0].version') -o.template = "jd-dailybonus/update_service" +o.template = 'jd-dailybonus/update_service' + return m diff --git a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/cookie_tools.htm b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/cookie_tools.htm index a88d8248be..bb00927d86 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/cookie_tools.htm +++ b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/cookie_tools.htm @@ -1,25 +1,13 @@ <%+cbi/valueheader%> - +
- + +
帮助 - <%= translate("Click to download the JDCookie.zip,unzip it,and use load Unpacked extensions to install.link:[chrome://extensions/]")%> -
-
- -<%+cbi/valuefooter%> -<%+cbi/valueheader%> - - -
- -
-
- 帮助 - <%= translate("Sign in ,then click JDCookie button.you will copy JD cookies, paste the cookie below.")%> + <%= translate("点击上面按钮使用京东手机app扫码获取Cookie")%>
diff --git a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm index 947f9d5057..6ef9b0ff9c 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm +++ b/package/ctcgfw/luci-app-jd-dailybonus/luasrc/view/jd-dailybonus/update_service.htm @@ -1,5 +1,9 @@ <%+cbi/valueheader%> + + - +
"> + value="<%= translate("保存Cookie,并马上进行签到") %>">
-<%+cbi/valuefooter%> -<%+cbi/valueheader%> - -
-
- v<%=self.version%> -
- -
<%+cbi/valuefooter%> <%+cbi/valueheader%> - +
"> - + value="<%= translate("手动检查脚本更新,当前版本:v")..self.version %>">
<%+cbi/valuefooter%> + + diff --git a/package/ctcgfw/luci-app-jd-dailybonus/po/zh-cn/jd-dailybonus.po b/package/ctcgfw/luci-app-jd-dailybonus/po/zh-cn/jd-dailybonus.po deleted file mode 100644 index 22daa12df6..0000000000 --- a/package/ctcgfw/luci-app-jd-dailybonus/po/zh-cn/jd-dailybonus.po +++ /dev/null @@ -1,111 +0,0 @@ -msgid "" -msgstr "Content-Type: text/plain; charset=UTF-8\n" - -msgid "JD-DailyBonus" -msgstr "京东签到服务" - -msgid "Enable" -msgstr "启用" - -msgid "Disable" -msgstr "停用" - -msgid "Log" -msgstr "日志" - -msgid "Script" -msgstr "脚本" - -msgid "Base Config" -msgstr "基本设置" - -msgid "Cookie Tools" -msgstr "Cookie 工具" - -msgid "JDCookie Tools" -msgstr "获取京东cookie扩展工具" - -msgid "Source Update Url" -msgstr "更新源地址" - -msgid "First Cookie" -msgstr "主账号Cookie" - -msgid "Second Cookie" -msgstr "第二账号Cookie" - -msgid "Click to download the JDCookie.zip,unzip it,and use load Unpacked extensions to install.link:[chrome://extensions/]")" -msgstr "点击上面的按钮安装下载JDCookie.zip(获取京东cookie扩展工具),解压后在[chrome://extensions/]中使用加载已解压的扩展程序进行安装。 " - -msgid "JD Url" -msgstr "京东链接" - -msgid "Sign in ,then click JDCookie button.you will copy JD cookies, paste the cookie below." -msgstr "登录后点击JDCookie 扩展工具复制cookie,然后粘贴到下面输入框中。(请使用F12调试工具,进入模拟手机浏览器模式)" - -msgid "Auto Update Script Service" -msgstr "自动更新脚本服务" - -msgid "Update time (every day)" -msgstr "更新时间 (每天)" - -msgid "Update Script" -msgstr "更新脚本" - -msgid "Execute Delay" -msgstr "延迟签到" - -msgid "ServerChan SCKEY" -msgstr "Server酱 SCKEY" - -msgid "ServerURL" -msgstr "Server酱的推送接口地址" - -msgid "SCT" -msgstr "测试版推送接口地址" - -msgid "SCU" -msgstr "原版推送接口地址" - -msgid "Failed Push" -msgstr "失效时推送" - -msgid "Auto Run" -msgstr "自动签到" - -msgid "Run" -msgstr "执行" - -msgid "Auto Run Script Service" -msgstr "自动签到服务" - -msgid "Run time (every day)" -msgstr "签到时间 (每天)" - -msgid "Save Cookies And Run Service" -msgstr "保存Cookie并签到" - -msgid "Sign in info" -msgstr "签到信息" - -msgid "Service is running,Please do not refresh!" -msgstr "服务正在执行中,请勿刷新!" - -msgid "Updating script,please wait ..." -msgstr "正在更新脚本,请稍候 ..." - -msgid "Is currently the latest version" -msgstr "当前已是最新版本。" - -msgid "There is a new version, click to update" -msgstr "有新的版本,请点击更新" - -msgid "Checking the New Version ..." -msgstr "正在检查是否存在新的版本 ..." - -msgid "Check Script Version" -msgstr "手动检查脚本更新" - -msgid "Current Script Version" -msgstr "当前脚本版本" - diff --git a/package/ctcgfw/luci-app-jd-dailybonus/root/etc/config/jd-dailybonus b/package/ctcgfw/luci-app-jd-dailybonus/root/etc/config/jd-dailybonus index 14a038cb7c..8002200ac1 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/root/etc/config/jd-dailybonus +++ b/package/ctcgfw/luci-app-jd-dailybonus/root/etc/config/jd-dailybonus @@ -1,9 +1,14 @@ config global - option version '1.87' - option auto_run_time '1' - option auto_run '1' - option auto_update_time '1' + option version '1.90' + option out '0' + option stop '100' + option serverchan '' + option remote_url 'https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js' + option serverurl 'scu' option auto_update '1' - option stop '0' - option failed '0' - option remote_url 'https://cdn.jsdelivr.net/gh/NobyDa/Script/JD-DailyBonus/JD_DailyBonus.js' \ No newline at end of file + option auto_update_time '23' + option auto_run '1' + option auto_run_time '0' + option auto_run_time_m '1' + option auto_run_time_h '1' + option cookie '' \ No newline at end of file diff --git a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js index c6d411f1fc..467ff87d1b 100644 --- a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js +++ b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/JD_DailyBonus.js @@ -2,7 +2,7 @@ 京东多合一签到脚本 -更新时间: 2020.12.25 17:50 v1.89 +更新时间: 2021.01.07 17:00 v1.90 有效接口: 40+ 脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js 电报频道: @NobyDa @@ -13,7 +13,7 @@ 【 JSbox, Node.js 说明 】 : ************************* -开启抓包app后, Safari浏览器登录 https://bean.m.jd.com 点击签到并且出现签到日历后, 返回抓包app搜索关键字 functionId=signBean 复制请求头Cookie填入以下Key处的单引号内即可 */ +开启抓包app后, Safari浏览器登录 https://bean.m.jd.com/bean/signIndex.action 点击签到并且出现签到日历后, 返回抓包app搜索关键字 functionId=signBean 复制请求头Cookie填入以下Key处的单引号内即可 */ var Key = ''; //单引号内自行填写您抓取的Cookie @@ -30,7 +30,7 @@ var DualKey = ''; //如需双账号签到,此处单引号内填写抓取的"账 【 QX, Surge, Loon 说明 】 : ************************* -初次使用时, app配置文件添加脚本配置,并启用Mitm后, Safari浏览器打开登录 https://bean.m.jd.com ,点击签到并且出现签到日历后, 如果通知获得cookie成功, 则可以使用此签到脚本。 注: 请勿在京东APP内获取!!! +初次使用时, app配置文件添加脚本配置,并启用Mitm后, Safari浏览器打开登录 https://bean.m.jd.com/bean/signIndex.action ,点击签到并且出现签到日历后, 如果通知获得cookie成功, 则可以使用此签到脚本。 注: 请勿在京东APP内获取!!! 由于cookie的有效性(经测试网页Cookie有效周期最长31天),如果脚本后续弹出cookie无效的通知,则需要重复上述步骤。 签到脚本将在每天的凌晨0:05执行, 您可以修改执行时间。 因部分接口京豆限量领取, 建议调整为凌晨签到。 @@ -108,14 +108,12 @@ async function all() { case 0: await Promise.all([ JingDongBean(stop), //京东京豆 - JDTakeaLook(stop), //京东发现-看一看 JingDongStore(stop), //京东超市 JingDongWebcasts(stop), //京东直播 JingRongBean(stop), //金融简单赚钱 JingRongSteel(stop), //金融钢镚 JingDongTurn(stop), //京东转盘 JDFlashSale(stop), //京东闪购 - JDOverseas(stop), //京东国际 JingDongCash(stop), //京东现金红包 JDMagicCube(stop, 2), //京东小魔方 JingDongSubsidy(stop), //京东金贴 @@ -131,15 +129,13 @@ async function all() { JingRongDoll(stop, 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F') ]); await Promise.all([ - JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰 - JDUserSignPre(stop, 'JDUnderwear', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆 JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴 JDUserSignPre(stop, 'JDCalendar', '京东日历-翻牌', '36V2Qw59VPNsuLxY84vCFtxFzrFs'), //京东日历翻牌 JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆 JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆 JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆 - JDUserSignPre(stop, 'JDSubsidy', '京东晚市-补贴', 'xK148m4kWj5hBcTPuJUNNXH3AkJ'), //京东晚市补贴金 - JDUserSignPre(stop, 'JDDrug', '京东商城-医药', '3tqTG5sF1xCUyC6vgEF5CLCxGn7w'), //京东医药馆 + // JDUserSignPre(stop, 'JDSubsidy', '京东晚市-补贴', 'xK148m4kWj5hBcTPuJUNNXH3AkJ'), //京东晚市补贴金 + // JDUserSignPre(stop, 'JDDrug', '京东商城-医药', '3tqTG5sF1xCUyC6vgEF5CLCxGn7w'), //京东医药馆 JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆 JDUserSignPre(stop, 'JDFineWine', '京东商城-酒饮', 'zGwAUzL3pVGjptBBGeYfpKjYdtX'), //京东酒饮馆 JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书 @@ -147,15 +143,17 @@ async function all() { JingRongDoll(stop, 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin') //京东金融 现金双签 ]); await Promise.all([ + JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰 + JDUserSignPre(stop, 'JDUnderwear', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆 JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆 JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '4812pn2PAcUyfNdWr7Cvpww5MCyW'), //京东校园 JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康 - JDUserSignPre(stop, 'JDPet', '京东商城-宠物', '37ta5sh5ocrMZF3Fz5UMJbTsL42'), //京东宠物馆 - JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手 + // JDUserSignPre(stop, 'JDPet', '京东商城-宠物', '37ta5sh5ocrMZF3Fz5UMJbTsL42'), //京东宠物馆 + // JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手 JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆 JDUserSignPre(stop, 'JDCare', '京东商城-个护', 'NJ1kd1PJWhwvhtim73VPsD1HwY3'), //京东个人护理馆 JDUserSignPre(stop, 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'), //京东珠宝馆 - JDUserSignPre(stop, 'JDClocks', '京东商城-钟表', '2BcJPCVVzMEtMUynXkPscCSsx68W'), //京东钟表馆 + // JDUserSignPre(stop, 'JDClocks', '京东商城-钟表', '2BcJPCVVzMEtMUynXkPscCSsx68W'), //京东钟表馆 JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'), //京东美妆馆 JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64') //京东菜场 ]); @@ -164,14 +162,12 @@ async function all() { break; default: await JingDongBean(stop); //京东京豆 - await JDTakeaLook(stop); //京东发现-看一看 await JingDongStore(stop); //京东超市 await JingDongWebcasts(stop); //京东直播 await JingRongBean(stop); //金融简单赚钱 await JingRongSteel(stop); //金融钢镚 await JingDongTurn(stop); //京东转盘 await JDFlashSale(stop); //京东闪购 - await JDOverseas(stop); //京东国际 await JingDongCash(stop); //京东现金红包 await JDMagicCube(stop, 2); //京东小魔方 await JingDongGetCash(stop); //京东领现金 @@ -197,13 +193,13 @@ async function all() { await JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆 await JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆 await JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆 - await JDUserSignPre(stop, 'JDSubsidy', '京东晚市-补贴', 'xK148m4kWj5hBcTPuJUNNXH3AkJ'); //京东晚市补贴金 - await JDUserSignPre(stop, 'JDClocks', '京东商城-钟表', '2BcJPCVVzMEtMUynXkPscCSsx68W'); //京东钟表馆 - await JDUserSignPre(stop, 'JDDrug', '京东商城-医药', '3tqTG5sF1xCUyC6vgEF5CLCxGn7w'); //京东医药馆 + // await JDUserSignPre(stop, 'JDSubsidy', '京东晚市-补贴', 'xK148m4kWj5hBcTPuJUNNXH3AkJ'); //京东晚市补贴金 + // await JDUserSignPre(stop, 'JDClocks', '京东商城-钟表', '2BcJPCVVzMEtMUynXkPscCSsx68W'); //京东钟表馆 + // await JDUserSignPre(stop, 'JDDrug', '京东商城-医药', '3tqTG5sF1xCUyC6vgEF5CLCxGn7w'); //京东医药馆 await JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆 - await JDUserSignPre(stop, 'JDPet', '京东商城-宠物', '37ta5sh5ocrMZF3Fz5UMJbTsL42'); //京东宠物馆 + // await JDUserSignPre(stop, 'JDPet', '京东商城-宠物', '37ta5sh5ocrMZF3Fz5UMJbTsL42'); //京东宠物馆 await JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书 - await JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手 + // await JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手 await JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'); //京东美妆馆 await JDUserSignPre(stop, 'JDFineWine', '京东商城-酒饮', 'zGwAUzL3pVGjptBBGeYfpKjYdtX'); //京东酒饮馆 await JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'); //京东菜场 @@ -1700,56 +1696,6 @@ function JingRongDoll(s, key, title, code, type, num, award, belong) { }); } -function JDOverseas(s) { - merge.Overseas = {}; - return new Promise(resolve => { - if (disable("Overseas")) return resolve() - setTimeout(() => { - const OverseasUrl = { - url: 'https://api.m.jd.com/client.action?functionId=checkin', - headers: { - Cookie: KEY - }, - body: "body=%7B%7D&build=167237&client=apple&clientVersion=9.0.0&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&partner=apple&scope=11&sign=e27f8b904040a0e3c99b87fc27e09c87&st=1591730990449&sv=101" - }; - $nobyda.post(OverseasUrl, function(error, response, data) { - try { - if (error) { - throw new Error(error) - } else { - const Details = LogDetails ? "response:\n" + data : ''; - if (data.match(/\"type\":\d+?,/)) { - console.log("\n" + "京东商城-国际签到成功 " + Details) - merge.Overseas.success = 1 - if (data.match(/\"jdBeanAmount\":[1-9]+/)) { - merge.Overseas.bean = data.match(/\"jdBeanAmount\":(\d+)/)[1] - merge.Overseas.notify = "京东商城-国际: 成功, 明细: " + merge.Overseas.bean + "京豆 🐶" - } else { - merge.Overseas.notify = "京东商城-国际: 成功, 明细: 无京豆 🐶" - } - } else { - console.log("\n" + "京东商城-国际签到失败 " + Details) - merge.Overseas.fail = 1 - if (data.match(/(\"code\":\"13\"|重复签到)/)) { - merge.Overseas.notify = "京东商城-国际: 失败, 原因: 已签过 ⚠️" - } else if (data.match(/\"code\":\"(-1|3)\"/)) { - merge.Overseas.notify = "京东商城-国际: 失败, 原因: Cookie失效‼️" - } else { - merge.Overseas.notify = "京东商城-国际: 失败, 原因: 未知 ⚠️" - } - } - } - } catch (eor) { - $nobyda.AnError("京东商城-国际", "Overseas", eor, response, data) - } finally { - resolve() - } - }) - }, s) - if (out) setTimeout(resolve, out + s) - }); -} - function JingDongGetCash(s) { merge.JDGetCash = {}; return new Promise(resolve => { @@ -1834,45 +1780,6 @@ function JingDongWebcasts(s) { }); } -function JDTakeaLook(s) { - merge.TakeaLook = {}; - return new Promise(resolve => { - if (disable("TakeaLook")) return resolve() - setTimeout(() => { - $nobyda.get({ - url: 'https://api.m.jd.com/client.action?functionId=discTaskList&body=%7B%22bizType%22%3A1%2C%22referPageId%22%3A%22discRecommend%22%7D&client=apple&clientVersion=9.1.6&openudid=1fce88cd05c42fe2b054e846f11bdf33f016d676&sign=17061147fe8e0eb10edfe8d9968b6d66&st=1601138337675&sv=102', - headers: { - Cookie: KEY - } - }, (error, response, data) => { - try { - if (error) throw new Error(error); - const cc = JSON.parse(data); - const Details = LogDetails ? "response:\n" + data : ''; - const tm = parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000 - if (data.match(/签到成功/) && !data.match(tm)) { - console.log(`\n京东发现-看看签到成功 ${Details}`) - const aw = data.match(/\"签到成功,获得(\d+)京豆\"/) - merge.TakeaLook.success = 1 - merge.TakeaLook.bean = aw ? aw[1] : 0 - merge.TakeaLook.notify = `京东发现-看看: 成功, 明细: ${merge.TakeaLook.bean||`无`}京豆 🐶` - } else { - console.log(`\n京东发现-看看签到失败 ${Details}`) - const tp = data.match(tm) ? `已签过` : cc.busiCode == 2001 ? `Cookie失效` : `${cc.message||`未知`}` - merge.TakeaLook.notify = `京东发现-看看: 失败, 原因: ${tp}${cc.busiCode==2001?`‼️`:` ⚠️`}` - merge.TakeaLook.fail = 1 - } - } catch (eor) { - $nobyda.AnError("京东发现-看看", "TakeaLook", eor, response, data) - } finally { - resolve() - } - }) - }, s) - if (out) setTimeout(resolve, out + s) - }); -} - function JingDongStore(s) { merge.JDGStore = {}; return new Promise(resolve => { diff --git a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/jd_cookie.lua b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/jd_cookie.lua new file mode 100644 index 0000000000..a1ddffac18 --- /dev/null +++ b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/jd_cookie.lua @@ -0,0 +1,168 @@ +-- Copyright (C) 2021 jerrykuku +-- Licensed to the public under the GNU General Public License v3. + +local uci = require 'luci.model.uci'.cursor() +local config = 'jd-dailybonus' +package.path = package.path .. ';/usr/share/jd-dailybonus/?.lua' +local requests = require 'requests' +local socket = require 'socket' +local tinsert = table.insert +local ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub +local User_Agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36' +local Host = 'plogin.m.jd.com' +local jd_cookie = {} + +--打印table +function print_r(t) + local print_r_cache = {} + local function sub_print_r(t, indent) + if (print_r_cache[tostring(t)]) then + print(indent .. '*' .. tostring(t)) + else + print_r_cache[tostring(t)] = true + if (type(t) == 'table') then + for pos, val in pairs(t) do + if (type(val) == 'table') then + print(indent .. '[' .. pos .. '] => ' .. tostring(t) .. ' {') + sub_print_r(val, indent .. string.rep(' ', string.len(pos) + 8)) + print(indent .. string.rep(' ', string.len(pos) + 6) .. '}') + elseif (type(val) == 'string') then + print(indent .. '[' .. pos .. '] => "' .. val .. '"') + else + print(indent .. '[' .. pos .. '] => ' .. tostring(val)) + end + end + else + print(indent .. tostring(t)) + end + end + end + if (type(t) == 'table') then + print(tostring(t) .. ' {') + sub_print_r(t, ' ') + print('}') + else + sub_print_r(t, ' ') + end + print() +end + +-- 分割字符串 +local function split(full, sep) + full = full:gsub('%z', '') -- 这里不是很清楚 有时候结尾带个\0 + local off, result = 1, {} + while true do + local nStart, nEnd = full:find(sep, off) + if not nEnd then + local res = ssub(full, off, slen(full)) + if #res > 0 then -- 过滤掉 \0 + tinsert(result, res) + end + break + else + tinsert(result, ssub(full, off, nStart - 1)) + off = nEnd + 1 + end + end + return result +end + +--获取unix时间戳 +function jd_cookie.timestamp() + return math.floor(socket.gettime() * 1000) +end + +--延时函数 +function sleep(n) + os.execute('sleep ' .. n) +end + +--解析cookie +function praseSetCookies(rcookie) + local tbl = {} + for k, v in rcookie:gmatch('([^;%s]+)=([^;]+)') do + tbl[k] = v + end + return tbl +end + +--获取二维码链接和检测URL +function jd_cookie.get_qrcode() + local timeStamp = jd_cookie.timestamp() + local url = + 'https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=' .. + timeStamp .. '&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' + local xformHeaders = { + ['Content-Type'] = 'application/x-www-form-urlencoded', + ['Connection'] = 'Keep-Alive', + ['Accept'] = 'application/json, text/plain, */*', + ['Accept-Language'] = 'zh-cn', + ['Referer'] = 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=' .. + timeStamp .. '&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport', + ['User-Agent'] = User_Agent, + ['Host'] = Host + } + local response = requests.get {url, headers = xformHeaders} + local s_token = response.json().s_token + local dat = split(string.gsub(response.headers['set-cookie'], ' DOMAIN=.plogin.m.jd.com', ''), ';') + local cookies = string.gsub(dat[1] .. dat[4] .. dat[6] .. dat[8], ',', ';') .. ';' + + local timeStamp = jd_cookie.timestamp() + local url = 'https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=' .. s_token .. '&v=' .. timeStamp .. '&remember=true' + local xformHeaders = { + ['Content-Type'] = 'application/x-www-form-urlencoded', + ['Connection'] = 'Keep-Alive', + ['Accept'] = 'application/json, text/plain, */*', + ['Accept-Language'] = 'zh-cn', + ['Referer'] = 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=' .. + timeStamp .. '&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport', + ['User-Agent'] = User_Agent, + ['Host'] = Host + } + local response = requests.post {url, cookies = cookies, headers = xformHeaders} + local json_body, error = response.json() + local token = json_body['token'] + local ou_state = json_body['ou_state'] + local okl_token = praseSetCookies(response.headers['set-cookie']).okl_token + local return_json = { + qrcode_url = 'https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=' .. token, + check_url = 'https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=' .. token .. '&ou_state=' .. ou_state .. '&okl_token=' .. okl_token, + cookies = cookies + } + return return_json +end + +--检测扫码状态 并返回cookie +function jd_cookie.checkLogin(url, cookies) + local xformHeaders = { + ['Content-Type'] = 'application/x-www-form-urlencoded', + ['Connection'] = 'Keep-Alive', + ['Accept'] = 'application/json, text/plain, */*', + ['Accept-Language'] = 'zh-cn', + ['Referer'] = 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=', + ['User-Agent'] = User_Agent, + ['Host'] = Host + } + local data = + 'lang=chs&appid=300&source=wq_passport&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=1100399130787&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action' + local response = requests.post {url, data = data, cookies = cookies, headers = xformHeaders} + --local cookie = jd_cookie.praseSetCookies(response.headers['set-cookie']) + local json = response.json() + local return_json = {} + if json.errcode == 0 then + local ucookie = praseSetCookies(response.headers['set-cookie']) + return_json = { + error = 0, + cookie = ucookie + } + else + return_json = { + error = json.errcode, + msg = json.message + } + end + + return return_json +end + +return jd_cookie diff --git a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh index 938461c032..c91e838b4d 100755 --- a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh +++ b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/newapp.sh @@ -49,78 +49,58 @@ cancel() { exit 1 } -fill_cookie() { - cookie1=$(uci_get_by_type global cookie) - if [ ! "$cookie1" = "" ]; then - varb="var Key = '$cookie1';" - a=$(sed -n '/var Key =/=' $JD_SCRIPT) - b=$((a-1)) - sed -i "${a}d" $JD_SCRIPT - sed -i "${b}a ${varb}" $JD_SCRIPT - fi - - cookie2=$(uci_get_by_type global cookie2) - if [ ! "$cookie2" = "" ]; then - varb2="var DualKey = '$cookie2';" - aa=$(sed -n '/var DualKey =/=' $JD_SCRIPT) - bb=$((aa-1)) - sed -i "${aa}d" $JD_SCRIPT - sed -i "${bb}a ${varb2}" $JD_SCRIPT - fi - - stop=$(uci_get_by_type global stop) - if [ ! "$stop" = "" ]; then - varb3="var stop = $stop;" - sed -i "s/^var stop =.*/$varb3/g" $JD_SCRIPT - fi -} - add_cron() { sed -i '/jd-dailybonus/d' $CRON_FILE - [ $(uci_get_by_type global auto_run 0) -eq 1 ] && echo '5 '$(uci_get_by_type global auto_run_time)' * * * sleep '$(expr $(head -n 128 /dev/urandom | tr -dc "0123456789" | head -c4) % 180)'s; /usr/share/jd-dailybonus/newapp.sh -w' >>$CRON_FILE + [ $(uci_get_by_type global auto_run 0) -eq 1 ] && echo $(uci_get_by_type global auto_run_time_m)' '$(uci_get_by_type global auto_run_time_h)' * * * /usr/share/jd-dailybonus/newapp.sh -w' >>$CRON_FILE [ $(uci_get_by_type global auto_update 0) -eq 1 ] && echo '1 '$(uci_get_by_type global auto_update_time)' * * * /usr/share/jd-dailybonus/newapp.sh -u' >>$CRON_FILE crontab $CRON_FILE + /etc/init.d/cron restart } # Run Script -serverchan() { - sckey=$(uci_get_by_type global serverchan) - failed=$(uci_get_by_type global failed) - desc=$(cat /www/JD_DailyBonus.htm | grep -E '签到号|签到概览|签到奖励|其他奖励|账号总计|其他总计' | sed 's/$/&\n/g') - serverurlflag=$(uci_get_by_type global serverurl) - serverurl=https://sc.ftqq.com/ - if [ "$serverurlflag" = "sct" ]; then - serverurl=https://sctapi.ftqq.com/ - fi - if [ $failed -eq 1 ]; then - grep "Cookie失效" /www/JD_DailyBonus.htm > /dev/null - if [ $? -eq 0 ]; then - title="$(date '+%Y年%m月%d日') 京东签到 Cookie 失效" - wget-ssl -q --output-document=/dev/null --post-data="text=$title~&desp=$desc" $serverurl$sckey.send - fi +notify() { + grep "Cookie失效" /www/JD_DailyBonus.htm >/dev/null + if [ $? -eq 0 ]; then + title="$(date '+%Y年%m月%d日') 京东签到 Cookie 失效" else title="$(date '+%Y年%m月%d日') 京东签到" + fi + desc=$(cat /www/JD_DailyBonus.htm | grep -E '签到号|签到概览|签到奖励|其他奖励|账号总计|其他总计' | sed 's/$/&\n/g') + #serverchan + sckey=$(uci_get_by_type global serverchan) + if [ ! -z $sckey ]; then + serverurlflag=$(uci_get_by_type global serverurl) + serverurl=https://sc.ftqq.com/ + if [ "$serverurlflag" = "sct" ]; then + serverurl=https://sctapi.ftqq.com/ + fi wget-ssl -q --output-document=/dev/null --post-data="text=$title~&desp=$desc" $serverurl$sckey.send fi + #telegram + TG_BOT_TOKEN=$(uci_get_by_type global tg_token) + TG_USER_ID=$(uci_get_by_type global tg_userid) + API_URL="https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" + if [ ! -z $TG_BOT_TOKEN ] && [ ! -z $TG_USER_ID ]; then + text="*$title* + +\`\`\` +"$desc" +==================================== +本消息来自京东签到插件 jd-dailybonus +\`\`\`" + wget-ssl -q --output-document=/dev/null --post-data="chat_id=$TG_USER_ID&text=$text&parse_mode=markdownv2" $API_URL + fi } run() { - fill_cookie echo -e $(date '+%Y-%m-%d %H:%M:%S %A') >$LOG_HTM 2>/dev/null - [ ! -f "/usr/bin/node" ] && echo -e "未安装node.js,请安装后再试!\nNode.js is not installed, please try again after installation!">>$LOG_HTM && exit 1 - node $JD_SCRIPT >>$LOG_HTM 2>/dev/null -} - -back_run() { - run - sleep 1s - serverchan + [ ! -f "/usr/bin/node" ] && echo -e "未安装node.js,请安装后再试!\nNode.js is not installed, please try again after installation!" >>$LOG_HTM && exit 1 + node $JD_SCRIPT >>$LOG_HTM 2>/dev/null && notify & } save() { - fill_cookie add_cron } @@ -156,7 +136,6 @@ update() { fi remote_ver=$(get_ver $TEMP_SCRIPT) cp -r $TEMP_SCRIPT $JD_SCRIPT - fill_cookie uci set jd-dailybonus.@global[0].version=$remote_ver uci commit jd-dailybonus cancel "0" @@ -169,7 +148,7 @@ while getopts ":alnruswh" arg; do exit 0 ;; l) - serverchan + notify exit 0 ;; n) @@ -189,7 +168,7 @@ while getopts ":alnruswh" arg; do exit 0 ;; w) - back_run + run exit 0 ;; h) diff --git a/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/requests.lua b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/requests.lua new file mode 100644 index 0000000000..c2fc4d702e --- /dev/null +++ b/package/ctcgfw/luci-app-jd-dailybonus/root/usr/share/jd-dailybonus/requests.lua @@ -0,0 +1,303 @@ +-- Lua Requests library for http ease + +local http_socket = require('socket.http') +local https_socket = require('ssl.https') +local url_parser = require('socket.url') +local ltn12 = require('ltn12') +local json = require('cjson.safe') +local md5sum = require('md5') -- TODO: Make modular? +local mime = require('mime') + +local requests = { + _DESCRIPTION = 'Http requests made simpler', + http_socket = http_socket, + https_socket = https_socket +} + +local _requests = {} + +--User facing function the make a request use Digest Authentication +--TODO: Determine what else should live in authentication +function requests.HTTPDigestAuth(user, password) + return { _type = 'digest', user = user, password = password} +end + +--User facing function the make a request use Basic Authentication +--TODO: Determine what else should live in authentication +function requests.HTTPBasicAuth(user, password) + return { _type = 'basic', user = user, password = password} +end + +function requests.post(url, args) + return requests.request("POST", url, args) +end + +function requests.get(url, args) + return requests.request("GET", url, args) +end + +function requests.delete(url, args) + return requests.request("DELETE", url, args) +end + +function requests.patch(url, args) + return requests.request("PATCH", url, args) +end + +function requests.put(url, args) + return requests.request("PUT", url, args) +end + +function requests.options(url, args) + return requests.request("OPTIONS", url, args) +end + +function requests.head(url, args) + return requests.request("HEAD", url, args) +end + +function requests.trace(url, args) + return requests.request("TRACE", url, args) +end + +--Sets up all the data for a request and makes the request +function requests.request(method, url, args) + local request + + if type(url) == "table" then + request = url + if not request.url and request[1] then + request.url = table.remove(request, 1) + end + else + request = args or {} + request.url = url + end + + request.method = method + _requests.parse_args(request) + + -- TODO: Find a better way to do this + if request.auth and request.auth._type == 'digest' then + local response = _requests.make_request(request) + return _requests.use_digest(response, request) + else + return _requests.make_request(request) + end +end + +--Makes a request +function _requests.make_request(request) + local response_body = {} + local full_request = { + method = request.method, + url = request.url, + headers = request.headers, + sink = ltn12.sink.table(response_body), + redirect = request.allow_redirects, + proxy = request.proxy + } + if request.data then + full_request.source = ltn12.source.string(request.data) + end + + local response = {} + local ok + local socket = string.find(full_request.url, '^https:') and not request.proxy and https_socket or http_socket + + ok, response.status_code, response.headers, response.status = socket.request(full_request) + + assert(ok, 'error in '..request.method..' request: '..response.status_code) + response.text = table.concat(response_body) + response.json = function () return json.decode(response.text) end + + return response +end + +--Parses through all the possible arguments for a request +function _requests.parse_args(request) + _requests.check_url(request) + _requests.check_data(request) + _requests.create_header(request) + _requests.check_timeout(request.timeout) + _requests.check_redirect(request.allow_redirects) +end + +--Format the the url based on the params argument +function _requests.format_params(url, params) -- TODO: Clean + if not params or next(params) == nil then return url end + + url = url..'?' + for key, value in pairs(params) do + if tostring(value) then + url = url..tostring(key)..'=' + + if type(value) == 'table' then + local val_string = '' + + for _, val in ipairs(value) do + val_string = val_string..tostring(val)..',' + end + + url = url..val_string:sub(0, -2) + else + url = url..tostring(value) + end + + url = url..'&' + end + end + + return url:sub(0, -2) +end + +--Check that there is a URL given and append to it if params are passed in. +function _requests.check_url(request) + assert(request.url, 'No url specified for request') + request.url = _requests.format_params(request.url, request.params) +end + +-- Add to the HTTP header +function _requests.create_header(request) + request.headers = request.headers or {} + if request.data then + request.headers['Content-Length'] = request.data:len() + end + + if request.cookies then + if request.headers.cookie then + request.headers.cookie = request.headers.cookie..'; '..request.cookies + else + request.headers.cookie = request.cookies + end + end + + if request.auth then + _requests.add_auth_headers(request) + end +end + +--Makes sure that the data is in a format that can be sent +function _requests.check_data(request) + if type(request.data) == "table" then + request.data = json.encode(request.data) + elseif request.data then + request.data = tostring(request.data) + end +end + +--Set the timeout +function _requests.check_timeout(timeout) + http_socket.TIMEOUT = timeout or 5 + https_socket.TIMEOUT = timeout or 5 +end + +--Checks is allow_redirects parameter is set correctly +function _requests.check_redirect(allow_redirects) + if allow_redirects and type(allow_redirects) ~= "boolean" then + error("allow_redirects expects a boolean value. received type = "..type(allow_redirects)) + end +end + +--Create the Authorization header for Basic Auth +function _requests.basic_auth_header(request) + local encoded = mime.b64(request.auth.user..':'..request.auth.password) + request.headers.Authorization = 'Basic '..encoded +end + +-- Create digest authorization string for request header TODO: Could be better, but it should work +function _requests.digest_create_header_string(auth) + local authorization = 'Digest username="'..auth.user..'", realm="'..auth.realm..'", nonce="'..auth.nonce + authorization = authorization..'", uri="'..auth.uri..'", qop='..auth.qop..', nc='..auth.nc + authorization = authorization..', cnonce="'..auth.cnonce..'", response="'..auth.response..'"' + + if auth.opaque then + authorization = authorization..', opaque="'..auth.opaque..'"' + end + + return authorization +end + +--MD5 hash all parameters +local function md5_hash(...) + return md5sum.sumhexa(table.concat({...}, ":")) +end + +-- Creates response hash TODO: Add functionality +function _requests.digest_hash_response(auth_table) + return md5_hash( + md5_hash(auth_table.user, auth_table.realm, auth_table.password), + auth_table.nonce, + auth_table.nc, + auth_table.cnonce, + auth_table.qop, + md5_hash(auth_table.method, auth_table.uri) + ) +end + +-- Add digest authentication to the request header +function _requests.digest_auth_header(request) + if not request.auth.nonce then return end + + request.auth.cnonce = request.auth.cnonce or string.format("%08x", os.time()) + + request.auth.nc_count = request.auth.nc_count or 0 + request.auth.nc_count = request.auth.nc_count + 1 + + request.auth.nc = string.format("%08x", request.auth.nc_count) + + local url = url_parser.parse(request.url) + request.auth.uri = url_parser.build{path = url.path, query = url.query} + request.auth.method = request.method + request.auth.qop = 'auth' + + request.auth.response = _requests.digest_hash_response(request.auth) + + request.headers.Authorization = _requests.digest_create_header_string(request.auth) +end + +--Checks the resonse code and adds additional headers for Digest Auth +-- TODO: Rename this +function _requests.use_digest(response, request) + if response.status_code == 401 then + _requests.parse_digest_response_header(response,request) + _requests.create_header(request) + response = _requests.make_request(request) + response.auth = request.auth + response.cookies = request.headers.cookie + return response + else + response.auth = request.auth + response.cookies = request.headers.cookie + return response + end +end + +--Parse the first response from the host to make the Authorization header +function _requests.parse_digest_response_header(response, request) + for key, value in response.headers['www-authenticate']:gmatch('(%w+)="(%S+)"') do + request.auth[key] = value + end + + if request.headers.cookie then + request.headers.cookie = request.headers.cookie..'; '..response.headers['set-cookie'] + else + request.headers.cookie = response.headers['set-cookie'] + end + + request.auth.nc_count = 0 +end + +-- Call the correct authentication header function +function _requests.add_auth_headers(request) + local auth_func = { + basic = _requests.basic_auth_header, + digest = _requests.digest_auth_header + } + + auth_func[request.auth._type](request) +end + +--Return public functions +requests._private = _requests +return requests diff --git a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/other-rules-edit.lua b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/other-rules-edit.lua index 9e2f35fd98..b66002523d 100644 --- a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/other-rules-edit.lua +++ b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/other-rules-edit.lua @@ -36,6 +36,10 @@ s = m:section(NamedSection, sid, "other_rules") s.anonymous = true s.addremove = false +o = s:option(Value, "Note", translate("Note")) +o.default = "default" +o.rmempty = false + o = s:option(ListValue, "config", translate("Config File")) local e,a={} local groupnames,filename diff --git a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua index f12c59e065..57b333c31f 100644 --- a/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua +++ b/package/ctcgfw/luci-app-openclash/luasrc/model/cbi/openclash/settings.lua @@ -34,6 +34,7 @@ s:tab("dashboard", translate("Dashboard Settings")) s:tab("rules_update", translate("Rules Update")) s:tab("geo_update", translate("GEOIP Update")) s:tab("chnr_update", translate("Chnroute Update")) +s:tab("auto_restart", translate("Auto Restart")) s:tab("version_update", translate("Version Update")) s:tab("debug", translate("Debug Logs")) @@ -469,6 +470,27 @@ o.write = function() end end +o = s:taboption("auto_restart", Flag, "auto_restart", translate("Auto Restart")) +o.description = translate("Auto Restart OpenClash") +o.default=0 + +o = s:taboption("auto_restart", ListValue, "auto_restart_week_time", translate("Restart Time (Every Week)")) +o:value("*", translate("Every Day")) +o:value("1", translate("Every Monday")) +o:value("2", translate("Every Tuesday")) +o:value("3", translate("Every Wednesday")) +o:value("4", translate("Every Thursday")) +o:value("5", translate("Every Friday")) +o:value("6", translate("Every Saturday")) +o:value("0", translate("Every Sunday")) +o.default=1 + +o = s:taboption("auto_restart", ListValue, "auto_restart_day_time", translate("Restart time (every day)")) +for t = 0,23 do +o:value(t, t..":00") +end +o.default=0 + ---- Dashboard Settings local lan_ip=SYS.exec("uci get network.lan.ipaddr 2>/dev/null |awk -F '/' '{print $1}' 2>/dev/null |tr -d '\n'") local cn_port=SYS.exec("uci get openclash.config.cn_port 2>/dev/null |tr -d '\n'") @@ -593,6 +615,11 @@ function o.cfgvalue(...) end end +o = ss:option(DummyValue, "Note", translate("Note")) +function o.cfgvalue(...) + return Value.cfgvalue(...) or translate("None") +end + -- [[ Edit Authentication ]] -- s = m:section(TypedSection, "authentication", translate("Set Authentication of SOCKS5/HTTP(S)")) s.anonymous = true diff --git a/package/ctcgfw/luci-app-openclash/po/zh-cn/openclash.zh-cn.po b/package/ctcgfw/luci-app-openclash/po/zh-cn/openclash.zh-cn.po index 0fb33bd8b3..02a7727ecd 100644 --- a/package/ctcgfw/luci-app-openclash/po/zh-cn/openclash.zh-cn.po +++ b/package/ctcgfw/luci-app-openclash/po/zh-cn/openclash.zh-cn.po @@ -1424,3 +1424,18 @@ msgstr "选择配置文件后请点击以获取对应的策略组" msgid "Other Rules Name" msgstr "第三方规则" + +msgid "Note" +msgstr "备注" + +msgid "Auto Restart" +msgstr "定时重启" + +msgid "Auto Restart OpenClash" +msgstr "定时重启插件" + +msgid "Restart Time (Every Week)" +msgstr "重启时间(每周)" + +msgid "Restart time (every day)" +msgstr "重启时间(每天)" \ No newline at end of file diff --git a/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash b/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash index 01cca803da..21fad97232 100755 --- a/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash +++ b/package/ctcgfw/luci-app-openclash/root/etc/init.d/openclash @@ -48,6 +48,9 @@ add_cron() [ -z "$(grep "openclash_chnroute.sh" "$CRON_FILE" 2>/dev/null)" ] && { [ "$(uci get openclash.config.chnr_auto_update 2>/dev/null)" -eq 1 ] && echo "0 $(uci get openclash.config.chnr_update_day_time 2>/dev/null) * * $(uci get openclash.config.chnr_update_week_time 2>/dev/null) /usr/share/openclash/openclash_chnroute.sh" >> $CRON_FILE } + [ -z "$(grep "/etc/init.d/openclash" "$CRON_FILE" 2>/dev/null)" ] && { + [ "$(uci get openclash.config.auto_restart 2>/dev/null)" -eq 1 ] && echo "0 $(uci get openclash.config.auto_restart_day_time 2>/dev/null) * * $(uci get openclash.config.auto_restart_week_time 2>/dev/null) /etc/init.d/openclash restart 2>/dev/null" >> $CRON_FILE + } crontab $CRON_FILE nohup /usr/share/openclash/openclash_watchdog.sh & } @@ -1291,11 +1294,13 @@ fi fi #common ports -common_port="21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889" -ipset create common_ports bitmap:port range 0-65535 -for i in $common_port; do - ipset add common_ports $i -done +if [ "$common_ports" = "1" ]; then + common_port="21 22 23 53 80 123 143 194 443 465 587 853 993 995 998 2052 2053 2082 2083 2086 2095 2096 5222 5228 5229 5230 8080 8443 8880 8888 8889" + ipset create common_ports bitmap:port range 0-65535 + for i in $common_port; do + ipset add common_ports $i + done +fi if [ -z "$en_mode_tun" ] || [ "$en_mode_tun" -eq 3 ]; then #tcp @@ -1308,9 +1313,7 @@ if [ -z "$en_mode_tun" ] || [ "$en_mode_tun" -eq 3 ]; then iptables -t nat -A openclash -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1 iptables -t nat -A openclash -m set ! --match-set lan_ac_white_ips src -j RETURN >/dev/null 2>&1 if [ "$en_mode" = "redir-host" ]; then - if [ "$common_ports" = "1" ]; then - iptables -t nat -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 - fi + iptables -t nat -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 iptables -t nat -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1 fi iptables -t nat -A openclash -p tcp -j REDIRECT --to-ports "$proxy_port" @@ -1333,9 +1336,7 @@ if [ -z "$en_mode_tun" ] || [ "$en_mode_tun" -eq 3 ]; then iptables -t mangle -A openclash -m set ! --match-set lan_ac_white_ips src -j RETURN >/dev/null 2>&1 iptables -t mangle -A openclash -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1 if [ "$en_mode" = "redir-host" ]; then - if [ "$common_ports" = "1" ]; then - iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 - fi + iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1 fi iptables -t mangle -A openclash -p udp --dport 53 -j RETURN >/dev/null 2>&1 @@ -1444,9 +1445,7 @@ if [ -n "$en_mode_tun" ]; then iptables -t mangle -A openclash -m set ! --match-set lan_ac_white_ips src -j RETURN >/dev/null 2>&1 iptables -t mangle -A openclash -m set ! --match-set lan_ac_white_macs src -j RETURN >/dev/null 2>&1 if [ "$en_mode" = "redir-host" ]; then - if [ "$common_ports" = "1" ]; then - iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 - fi + iptables -t mangle -A openclash -m set ! --match-set common_ports dst -j RETURN >/dev/null 2>&1 iptables -t mangle -A openclash -m set --match-set china_ip_route dst -j RETURN >/dev/null 2>&1 fi iptables -t mangle -A openclash -j MARK --set-mark "$PROXY_FWMARK" diff --git a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh index a2d76b39ea..4827a1af70 100755 --- a/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh +++ b/package/ctcgfw/luci-app-openclash/root/usr/share/openclash/yml_proxys_set.sh @@ -48,7 +48,7 @@ yml_other_rules_del() if [ "$enabled" = "0" ] || [ "$config" != "$2" ] || [ "$rule_name" != "$3" ]; then return else - uci delete openclash."$section" 2>/dev/null + uci set openclash."$section".enabled=0 2>/dev/null fi } #写入代理集到配置文件 diff --git a/package/ctcgfw/luci-app-vssr/Makefile b/package/ctcgfw/luci-app-vssr/Makefile index b68b9cf547..b27cfdc19f 100644 --- a/package/ctcgfw/luci-app-vssr/Makefile +++ b/package/ctcgfw/luci-app-vssr/Makefile @@ -1,8 +1,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-vssr -PKG_VERSION:=1.21 -PKG_RELEASE:=20210114 +PKG_VERSION:=1.22 +PKG_RELEASE:=20210119 include $(INCLUDE_DIR)/package.mk @@ -46,7 +46,7 @@ define Package/luci-app-vssr SUBMENU:=3. Applications TITLE:=A New SS/SSR/V2Ray/Trojan LuCI interface PKGARCH:=all - DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +bash +pdnsd-alt +wget-ssl +luasocket +lua-maxminddb \ + DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +bash +pdnsd-alt +wget-ssl +lua +luasocket +lua-maxminddb \ +shadowsocks-libev-ss-local +shadowsocksr-libev-ssr-local +shadowsocks-libev-ss-redir +simple-obfs \ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin:v2ray-plugin \ +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \ diff --git a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua index 55c4eef4fe..303d6062f5 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/controller/vssr.lua @@ -12,12 +12,13 @@ function index() entry({'admin', 'services', 'vssr', 'client'}, cbi('vssr/client'), _('SSR Client'), 10).leaf = true -- 基本设置 entry({'admin', 'services', 'vssr', 'servers'}, cbi('vssr/servers'), _('Severs Nodes'), 11).leaf = true -- 服务器节点 entry({'admin', 'services', 'vssr', 'servers'}, arcombine(cbi('vssr/servers'), cbi('vssr/client-config')), _('Severs Nodes'), 11).leaf = true -- 编辑节点 - entry({'admin', 'services', 'vssr', 'control'}, cbi('vssr/control'), _('Access Control'), 12).leaf = true -- 访问控制 - entry({'admin', 'services', 'vssr', 'router'}, cbi('vssr/router'), _('Router Config'), 13).leaf = true -- 访问控制 + entry({'admin', 'services', 'vssr', 'subscribe_config'}, cbi('vssr/subscribe-config', {hideapplybtn = true, hidesavebtn = true, hideresetbtn = true}), _('Subscribe'), 12).leaf = true -- 订阅设置 + entry({'admin', 'services', 'vssr', 'control'}, cbi('vssr/control'), _('Access Control'), 13).leaf = true -- 访问控制 + entry({'admin', 'services', 'vssr', 'router'}, cbi('vssr/router'), _('Router Config'), 14).leaf = true -- 访问控制 if nixio.fs.access('/usr/bin/v2ray/v2ray') or nixio.fs.access('/usr/bin/v2ray') or nixio.fs.access('/usr/bin/xray') or nixio.fs.access('/usr/bin/xray/xray') then - entry({'admin', 'services', 'vssr', 'socks5'}, cbi('vssr/socks5'), _('Socks5'), 14).leaf = true -- Socks5代理 + entry({'admin', 'services', 'vssr', 'socks5'}, cbi('vssr/socks5'), _('Local Proxy'), 15).leaf = true -- Socks5代理 end - entry({'admin', 'services', 'vssr', 'advanced'}, cbi('vssr/advanced'), _('Advanced Settings'), 15).leaf = true -- 高级设置 + entry({'admin', 'services', 'vssr', 'advanced'}, cbi('vssr/advanced'), _('Advanced Settings'), 16).leaf = true -- 高级设置 elseif nixio.fs.access('/usr/bin/ssr-server') then entry({'admin', 'services', 'vssr'}, alias('admin', 'services', 'vssr', 'server'), _('vssr'), 10).dependent = true else @@ -240,11 +241,7 @@ function refresh_data() local icount = 0 if set == 'gfw_data' then - if nixio.fs.access('/usr/bin/wget-ssl') then - refresh_cmd = 'wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64' - else - refresh_cmd = 'wget -O /tmp/gfw.b64 http://iytc.net/tools/list.b64' - end + refresh_cmd = 'wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64' sret = luci.sys.call(refresh_cmd .. ' 2>/dev/null') if sret == 0 then luci.sys.call('/usr/bin/vssr-gfw') @@ -265,7 +262,7 @@ function refresh_data() retstring = '-1' end elseif set == 'ip_data' then - refresh_cmd ="wget -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt 2>/dev/null" + refresh_cmd = "wget-ssl -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt 2>/dev/null" sret = luci.sys.call(refresh_cmd) icount = luci.sys.exec('cat /tmp/china_ssr.txt | wc -l') if sret == 0 and tonumber(icount) > 1000 then @@ -282,12 +279,8 @@ function refresh_data() luci.sys.exec('rm -f /tmp/china_ssr.txt ') else local need_process = 0 - if nixio.fs.access('/usr/bin/wget-ssl') then - refresh_cmd = 'wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf' - need_process = 1 - else - refresh_cmd = 'wget -O /tmp/ad.conf http://iytc.net/tools/ad.conf' - end + refresh_cmd = 'wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf' + need_process = 1 sret = luci.sys.call(refresh_cmd .. ' 2>/dev/null') if sret == 0 then if need_process == 1 then @@ -319,4 +312,4 @@ function refresh_data() end luci.http.prepare_content('application/json') luci.http.write_json({ret = retstring, retcount = icount}) -end \ No newline at end of file +end diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua index 6b63bb8e7b..1489811092 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/advanced.lua @@ -61,59 +61,6 @@ o.datatype = 'uinteger' o:depends('enable_switch', '1') o.default = 3 --- [[ 节点订阅 ]]-- - -s = m:section(TypedSection, 'server_subscribe', translate('Servers subscription and manage')) -s.anonymous = true - -o = s:option(Flag, 'auto_update', translate('Auto Update')) -o.rmempty = false -o.description = translate('Auto Update Server subscription, GFW list and CHN route') - -o = s:option(ListValue, 'auto_update_time', translate('Update time (every day)')) -for t = 0, 23 do - o:value(t, t .. ':00') -end -o.default = 2 -o.rmempty = false - -o = s:option(DynamicList, 'subscribe_url', translate('Subscribe URL')) -o.rmempty = true -o.description = translate('You can manually add group names in front of the URL, splited by ,') - -o = s:option(Value, "filter_words", translate("Subscribe Filter Words")) -o.rmempty = true -o.description = translate("Filter Words splited by /") - -o = s:option(Flag, 'proxy', translate('Through proxy update')) -o.rmempty = false -o.description = translate('Through proxy update list, Not Recommended ') - -o = s:option(DummyValue, '', '') -o.rawhtml = true -o.template = 'vssr/update_subscribe' - -o = s:option(Button, 'delete', translate('Delete All Subscribe Severs')) -o.inputstyle = 'reset' -o.description = string.format(translate('Server Count') .. ': %d', server_count) -o.write = function() - uci:delete_all( - 'vssr', - 'servers', - function(s) - if s.hashkey or s.isSubscribe then - return true - else - return false - end - end - ) - uci:save('vssr') - uci:commit('vssr') - luci.sys.exec('/etc/init.d/vssr restart') - luci.http.redirect(luci.dispatcher.build_url('admin', 'services', 'vssr', 'servers')) - return -end -- [[ adblock ]]-- s = m:section(TypedSection, 'global', translate('adblock settings')) diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua index 9d77400f59..2a70cd38a8 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/client.lua @@ -93,15 +93,7 @@ for i, v in pairs(route_name) do o = s:option(ListValue, v, translate(route_label[i])) o:value('nil', translate('Same as Main Server')) for _, key in pairs(server_table) do - if(v == 'tw_video_server' and key.flag == "tw") then - o:value(key.name, key.gname) - end - if(v == 'tvb_server' and key.flag == "hk") then - o:value(key.name, key.gname) - end - if(v ~= 'tvb_server' and v ~= 'tw_video_server') then - o:value(key.name, key.gname) - end + o:value(key.name, key.gname) end o:depends('v2ray_flow', '1') o.default = 'nil' diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua index f3e30fd5aa..e56eb1be77 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/log.lua @@ -2,7 +2,8 @@ local fs = require 'nixio.fs' local conffile = '/tmp/ssrpro.log' f = SimpleForm('logview') - +f.submit = false +f.reset = false t = f:field(TextValue, 'conf') t.rmempty = true t.rows = 20 diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/router.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/router.lua index 3ac396f22b..9d5d162085 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/router.lua +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/router.lua @@ -1,31 +1,31 @@ local m, s, o local NXFS = require 'nixio.fs' local router_table = { - yotube = { + a1 = { name = 'youtube', des = 'Youtube Domain' }, - tw_video = { + a2 = { name = 'tw_video', des = 'Tw Video Domain' }, - netflix = { + a3 = { name = 'netflix', des = 'Netflix Domain' }, - disney = { + a4 = { name = 'disney', des = 'Disney+ Domain' }, - prime = { + a5 = { name = 'prime', des = 'Prime Video Domain' }, - tvb = { + a6 = { name = 'tvb', des = 'TVB Domain' }, - custom = { + a7 = { name = 'custom', des = 'Custom Domain' } @@ -39,6 +39,7 @@ for _, v in pairs(router_table) do local conf = '/etc/vssr/'.. v.name ..'_domain.list' o = s:taboption(v.name, TextValue, v.name ..'conf') o.rows = 13 + o.description = translate('↑ Put your domain list here') o.wrap = 'off' o.rmempty = true o.cfgvalue = function(self, section) @@ -50,6 +51,23 @@ for _, v in pairs(router_table) do o.remove = function(self, section, value) NXFS.writefile(conf, '') end + + + local conf1 = '/etc/vssr/'.. v.name ..'_ip.list' + o = s:taboption(v.name, TextValue, v.name ..'conf1') + o.rows = 13 + o.wrap = 'off' + o.description = translate('↑ Put your IP list here') + o.rmempty = true + o.cfgvalue = function(self, section) + return NXFS.readfile(conf1) or ' ' + end + o.write = function(self, section, value) + NXFS.writefile(conf1, value:gsub('\r\n', '\n')) + end + o.remove = function(self, section, value) + NXFS.writefile(conf1, '') + end end return m diff --git a/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/subscribe-config.lua b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/subscribe-config.lua new file mode 100644 index 0000000000..9b8d5eb5a9 --- /dev/null +++ b/package/ctcgfw/luci-app-vssr/luasrc/model/cbi/vssr/subscribe-config.lua @@ -0,0 +1,77 @@ +local vssr = 'vssr' +local uci = luci.model.uci.cursor() +local server_table = {} + +local gfwmode = 0 +local gfw_count = 0 +local ip_count = 0 +local ad_count = 0 +local server_count = 0 + +local sys = require 'luci.sys' + +uci:foreach( + 'vssr', + 'servers', + function(s) + server_count = server_count + 1 + end +) + +m = Map(vssr) + +-- [[ 节点订阅 ]]-- + +s = m:section(TypedSection, 'server_subscribe', translate('Servers subscription and manage')) +s.anonymous = true + +o = s:option(Flag, 'auto_update', translate('Auto Update')) +o.rmempty = false +o.description = translate('Auto Update Server subscription, GFW list and CHN route') + +o = s:option(ListValue, 'auto_update_time', translate('Update time (every day)')) +for t = 0, 23 do + o:value(t, t .. ':00') +end +o.default = 2 +o.rmempty = false + +o = s:option(DynamicList, 'subscribe_url', translate('Subscribe URL')) +o.rmempty = true +o.description = translate('You can manually add group names in front of the URL, splited by ,') + +o = s:option(Value, 'filter_words', translate('Subscribe Filter Words')) +o.rmempty = true +o.description = translate('Filter Words splited by /') + +o = s:option(Flag, 'proxy', translate('Through proxy update')) +o.rmempty = false +o.description = translate('Through proxy update list, Not Recommended ') + +o = s:option(DummyValue, '', '') +o.rawhtml = true +o.template = 'vssr/update_subscribe' + +o = s:option(Button, 'delete', translate('Delete All Subscribe Severs')) +o.inputstyle = 'reset' +o.description = string.format(translate('Server Count') .. ': %d', server_count) +o.write = function() + uci:delete_all( + 'vssr', + 'servers', + function(s) + if s.hashkey or s.isSubscribe then + return true + else + return false + end + end + ) + uci:save('vssr') + uci:commit('vssr') + luci.sys.exec('/etc/init.d/vssr restart') + luci.http.redirect(luci.dispatcher.build_url('admin', 'services', 'vssr', 'servers')) + return +end + +return m diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm index 6ee2b76ed4..d8db64c56e 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/ssrurl.htm @@ -2,304 +2,305 @@ - - +
diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm index c77c412093..289cb6b9bf 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/tblsection.htm @@ -3,87 +3,113 @@
- 总计 - <%- print(self.des)-%>个节点 +
+ 总计 + <%- print(self.des)-%>个节点 + +
+
+
- <%- local count = 0 -%> -
+ <%- local count=0 -%> + +
+ + <%- local isempty=true for i, k in ipairs(self.serverTable) do section=k isempty=false local + fc=(section.name==self.current) and "fast" or "" local flag_icon=(section.flag ~=nil) + and "flag-icon-" .. section.flag or "flag-icon-un" local switch_enable=(section.switch_enable=="1" ) + and "" or "hidden" scope={ valueheader="cbi/cell_valueheader" , valuefooter="cbi/cell_valuefooter" } + -%> - <%- local isempty = true - for i, k in ipairs(self.serverTable) do - section = k - isempty = false - local fc = (section.name == self.current) and "fast" or "" - local flag_icon = (section.flag ~= nil) and "flag-icon-" .. section.flag or "flag-icon-un" - local switch_enable = (section.switch_enable == "1") and "" or "hidden" - scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" } - -%> - -
-
-
-
- -
<%=section.type%>
-
-
<%=section.alias%>
- <%- if self.extedit or self.addremove then -%> -
-
- <%:Apply%> - <%- if self.extedit then -%> - onclick="location.href='<%=self.extedit:format(section.name)%>'" <%- elseif type(self.extedit) == "function" then - %> onclick="location.href='<%=self:extedit(section.name)%>'" <%- end - %> alt="<%:Edit%>" title="<%:Edit%>"> <%:Edit%> - <%- end; if self.addremove then %> - <%:Delete%> - <%- end -%> +
+
+
+
+ +
+ <%=section.type%> +
+
+
+ <%=section.alias%> +
+ <%- if self.extedit or self.addremove then -%> + + <%- end -%> +
<%- end -%> + + <%- if isempty then -%> +
+

+ <%:This section contains no values yet%> +
+
+ <%- end -%> +
+ + <% if self.error then %> +
+
    + <% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%> +
  • + <%=pcdata(e):gsub("\n","
    ")%> +
  • + <%- end end %> +
-
- <%- end -%> + <% end %> - <%- if isempty then -%> -
-

<%:This section contains no values yet%>
-
- <%- end -%> -
- - <% if self.error then %> -
-
    <% for _, c in pairs(self.error) do for _, e in ipairs(c) do -%> -
  • <%=pcdata(e):gsub("\n","
    ")%>
  • - <%- end end %>
-
- <% end %> - - <%- if self.addremove then -%> - <% if self.template_addremove then include(self.template_addremove) else -%> -
- <% if self.anonymous then %> - - <% else %> - <% if self.invalid_cts then -%>
<% end %> - - - <% if self.invalid_cts then -%> -
<%:Invalid%>
- <%- end %> - <% end %> -
- <%- end %> - <%- end -%> + <%- if self.addremove then -%> + <% if self.template_addremove then include(self.template_addremove) else -%> +
+ <% if self.anonymous then %> + + <% else %> + <% if self.invalid_cts then -%> +
+ <% end %> + + + <% if self.invalid_cts then -%> +
+ <%:Invalid%> +
+ <%- end %> + <% end %> +
+ <%- end %> + <%- end -%>
@@ -120,15 +146,15 @@ $html += '
'; $html += '
'; $html += '
'; - if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "tw") { + //if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "tw") { $html += '
'; - } + //} $html += '
'; $html += '
'; $html += '
'; - if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "hk") { + //if ($('#cbi-' + CONFIG + '-' + node).attr("data-flag") == "hk") { $html += '
'; - } + //} $html += '
'; $html += '
'; Swal.fire({ @@ -165,9 +191,9 @@ } }) } - + //删除节点 - function delete_node(node){ + function delete_node(node) { XHR.halt(); $.each(ajaxArray, function (n, value) { value.abort(); }) //中断所有的ajax请求 $.get(DELETE_NODE_URL, { node: node }, @@ -223,10 +249,7 @@ function (data, status) { currentCheckCount++ var host_con = $(target).find(".host_con"); - host_con.removeClass("fast"); - host_con.removeClass("middle"); - host_con.removeClass("slow"); - host_con.removeClass("nopass"); + host_con.removeClass("fast middle slow nopass"); if (data.ret == 1) { if (data.used == "") { host_con.addClass("nopass"); diff --git a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm index 412d6916b2..ae787ab59f 100644 --- a/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm +++ b/package/ctcgfw/luci-app-vssr/luasrc/view/vssr/update_subscribe.htm @@ -1,5 +1,6 @@ <%+cbi/valueheader%> +
<%+cbi/valuefooter%> diff --git a/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po b/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po index d39453b898..bfebab30af 100644 --- a/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po +++ b/package/ctcgfw/luci-app-vssr/po/zh-cn/vssr.po @@ -128,13 +128,13 @@ msgid "SSR Server" msgstr "服务端" msgid "vssr Server" -msgstr "vssr 服务端" +msgstr "Hello World 服务端" msgid "vssr Server is running" -msgstr "vssr 服务端运行中" +msgstr "Hello World 服务端运行中" msgid "vssr Server is not running" -msgstr "vssr 服务端未运行" +msgstr "Hello World 服务端未运行" msgid "Enable Server" msgstr "启动服务端" @@ -710,3 +710,15 @@ msgstr "TVB 域名" msgid "Custom Domain" msgstr "自定义域名" + +msgid "Subscribe" +msgstr "订阅设置" + +msgid "Local Proxy" +msgstr "本地代理" + +msgid "↑ Put your IP list here" +msgstr "↑ 在上面放置你需要分流的IP列表" + +msgid "↑ Put your domain list here" +msgstr "↑ 在上面放置你需要分流的域名列表" diff --git a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr index b8175707e0..dd75665473 100755 --- a/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr +++ b/package/ctcgfw/luci-app-vssr/root/etc/init.d/vssr @@ -609,6 +609,7 @@ EOF /etc/init.d/dnsmasq restart >/dev/null 2>&1 start_server start_local + scount=$(count_shunt) if [ $scount != "0" ]; then start_shunt fi diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/custom_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/custom_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/disney_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/disney_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/netflix_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/netflix_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/prime_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/prime_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/tvb_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/tvb_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/tw_video_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/tw_video_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/etc/vssr/youtube_ip.list b/package/ctcgfw/luci-app-vssr/root/etc/vssr/youtube_ip.list new file mode 100644 index 0000000000..e69de29bb2 diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua index c1c8ccdc1b..53e80ae4b8 100755 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/genconfig_v2ray.lua @@ -1,6 +1,7 @@ local ucursor = require 'luci.model.uci'.cursor() local name = 'vssr' local json = require 'luci.jsonc' +local nixio = require 'nixio' local server_section = arg[1] local proto = arg[2] local local_port = arg[3] @@ -8,6 +9,9 @@ local outbounds_table = {} local rules_table = {} function read_conf(file) + if not nixio.fs.access(file) then + return nil + end local rfile = io.open(file, "r") local ltable = {} for line in rfile:lines() do @@ -18,15 +22,30 @@ function read_conf(file) return rtable end + local v2ray_flow = ucursor:get_first(name, 'global', 'v2ray_flow', '0') local custom_domain = read_conf("/etc/vssr/custom_domain.list") +local custom_ip = read_conf("/etc/vssr/custom_ip.list") + local youtube_domain = read_conf("/etc/vssr/youtube_domain.list") +local youtube_ip = read_conf("/etc/vssr/youtube_ip.list") + local tw_video_domain = read_conf("/etc/vssr/tw_video_domain.list") +local tw_video_ip = read_conf("/etc/vssr/tw_video_ip.list") + local netflix_domain = read_conf("/etc/vssr/netflix_domain.list") +local netflix_ip = read_conf("/etc/vssr/netflix_ip.list") + local disney_domain = read_conf("/etc/vssr/disney_domain.list") +local disney_ip = read_conf("/etc/vssr/disney_ip.list") + local prime_domain = read_conf("/etc/vssr/prime_domain.list") +local prime_ip = read_conf("/etc/vssr/prime_ip.list") + local tvb_domain = read_conf("/etc/vssr/tvb_domain.list") +local tvb_ip = read_conf("/etc/vssr/tvb_ip.list") + local flow_table = { yotube = { @@ -35,6 +54,7 @@ local flow_table = { rules = { type = 'field', domain = youtube_domain, + ip = youtube_ip, outboundTag = 'youtube' } }, @@ -44,6 +64,7 @@ local flow_table = { rules = { type = 'field', domain = tw_video_domain, + ip = tw_video_ip, outboundTag = 'tw_video' } }, @@ -53,6 +74,7 @@ local flow_table = { rules = { type = 'field', domain = netflix_domain, + ip = netflix_ip, outboundTag = 'netflix' } }, @@ -62,6 +84,7 @@ local flow_table = { rules = { type = 'field', domain = disney_domain, + ip = disney_ip, outboundTag = 'disney' } }, @@ -71,6 +94,7 @@ local flow_table = { rules = { type = 'field', domain = prime_domain, + ip = prime_ip, outboundTag = 'prime' } }, @@ -80,6 +104,7 @@ local flow_table = { rules = { type = 'field', domain = tvb_domain, + ip = tvb_ip, outboundTag = 'tvb' } }, @@ -89,6 +114,7 @@ local flow_table = { rules = { type = 'field', domain = custom_domain, + ip = custom_ip, outboundTag = 'custom' } } @@ -113,7 +139,7 @@ local bt_rules1 = { 'BitTorrent', 'announce_peer', 'announce.php?passkey=' - }, + } } function gen_outbound(server_node, tags, local_ports) @@ -210,12 +236,30 @@ function gen_bt_outbounds() end if v2ray_flow == '1' then + table.insert(outbounds_table, gen_outbound(server_section, 'global', 2080)) for _, v in pairs(flow_table) do - if(v.rules.domain ~= nil) then + if(v.rules.domain ~= nil or v.rules.ip ~= nil) then local server = ucursor:get_first(name, 'global', v.name .. '_server') table.insert(outbounds_table, gen_outbound(server, v.name, v.port)) - table.insert(rules_table, (server ~= nil and server ~= 'nil' ) and v.rules or nil) + + if(v.rules.domain ~= nil) then + domain_rules = { + type = 'field', + domain = v.rules.domain, + outboundTag = v.rules.outboundTag + } + table.insert(rules_table, (server ~= nil and server ~= 'nil' ) and domain_rules or nil) + end + + if(v.rules.ip ~= nil) then + ip_rules = { + type = 'field', + ip = v.rules.ip, + outboundTag = v.rules.outboundTag + } + table.insert(rules_table, (server ~= nil and server ~= 'nil' ) and ip_rules or nil) + end end end else @@ -246,6 +290,6 @@ local v2ray = { }, -- 传出连接 outbounds = outbounds_table, - routing = {domainStrategy = 'AsIs', rules = rules_table} + routing = {domainStrategy = 'IPIfNonMatch', rules = rules_table} } print(json.stringify(v2ray, 1)) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua index 6397a5b543..5a7e00c2cc 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/subscribe.lua @@ -33,6 +33,40 @@ local switch = '0' local subscribe_url = ucic:get_first(name, 'server_subscribe', 'subscribe_url', {}) local filter_words = ucic:get_first(name, 'server_subscribe', 'filter_words', '过期时间/剩余流量') +function print_r ( t ) + local print_r_cache={} + local function sub_print_r(t,indent) + if (print_r_cache[tostring(t)]) then + print(indent.."*"..tostring(t)) + else + print_r_cache[tostring(t)]=true + if (type(t)=="table") then + for pos,val in pairs(t) do + if (type(val)=="table") then + print(indent.."["..pos.."] => "..tostring(t).." {") + sub_print_r(val,indent..string.rep(" ",string.len(pos)+8)) + print(indent..string.rep(" ",string.len(pos)+6).."}") + elseif (type(val)=="string") then + print(indent.."["..pos..'] => "'..val..'"') + else + print(indent.."["..pos.."] => "..tostring(val)) + end + end + else + print(indent..tostring(t)) + end + end + end + if (type(t)=="table") then + print(tostring(t).." {") + sub_print_r(t," ") + print("}") + else + sub_print_r(t," ") + end + print() +end + local log = function(...) print(os.date('%Y-%m-%d %H:%M:%S ') .. table.concat({...}, ' ')) end @@ -55,6 +89,43 @@ local function split(full, sep) end return result end + +--table去重 + +local function clone( object ) + local lookup_table = {} + local function copyObj( object ) + if type( object ) ~= "table" then + return object + elseif lookup_table[object] then + return lookup_table[object] + end + + local new_table = {} + lookup_table[object] = new_table + for key, value in pairs( object ) do + new_table[copyObj( key )] = copyObj( value ) + end + return setmetatable( new_table, getmetatable( object ) ) + end + return copyObj( object ) +end + +local function table_unique(list) + local temp1 = clone(list) + local temp2 = clone(list) + for k1, v1 in ipairs(temp1) do + for k2, v2 in ipairs(temp2) do + if v1.alias ~= v2.alias and v1.hashkey == v2.hashkey then + table.remove(temp1, k1) + table.remove(temp2, k1) + + end + end + end + return temp1 +end + -- urlencode local function get_urlencode(c) return sformat('%%%02X', sbyte(c)) @@ -385,12 +456,21 @@ local execute = function() end end log('成功解析节点数量: ' .. #nodes) - end + else + log(url .. ': 获取内容为空') + end end end -- diff do - assert(next(nodeResult), '获取不到节点信息,请检查路由器是否能够访问网络,或者订阅链接是否正确') + if next(nodeResult) == nil then + log("更新失败,没有可用的节点信息") + if proxy == '0' then + luci.sys.init.start(name) + log('订阅失败, 恢复服务') + end + return + end local add, del = 0, 0 ucic:foreach( name, @@ -407,17 +487,24 @@ local execute = function() setmetatable(nodeResult[old.grouphashkey][old.hashkey], {__index = {_ignore = true}}) end else - if (old.alias ~= nil) then - log('忽略手动添加的节点: ' .. old.alias) + if not old.alias then + if not old.server or old.server_port then + ucic:delete(name, old['.name']) + else + old.alias = old.server .. ':' .. old.server_port + log('忽略手动添加的节点: ' .. old.alias) + end else - log('忽略手动添加的无效节点') + log('忽略手动添加的节点: ' .. old.alias) end end end ) - + for k, v in ipairs(nodeResult) do - for kk, vv in ipairs(v) do + -- 如果订阅节点中有相同的节点信息 需要先去重。 + new_nodes = table_unique(v) + for kk, vv in ipairs(new_nodes) do if not vv._ignore then local section = ucic:add(name, uciType) ucic:tset(name, section, vv) diff --git a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua index 525970a7c8..94bcf307a2 100644 --- a/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua +++ b/package/ctcgfw/luci-app-vssr/root/usr/share/vssr/update.lua @@ -16,11 +16,7 @@ local log = function(...) end log('正在更新【GFW列表】数据库') -if nixio.fs.access('/usr/bin/wget-ssl') then - refresh_cmd = 'wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64' -else - refresh_cmd = 'wget -O /tmp/gfw.b64 http://iytc.net/tools/list.b64' -end +refresh_cmd = 'wget-ssl --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O /tmp/gfw.b64' sret = luci.sys.call(refresh_cmd .. ' 2>/dev/null') if sret == 0 then luci.sys.call('/usr/bin/vssr-gfw') @@ -43,7 +39,7 @@ else end log('正在更新【国内IP段】数据库') -refresh_cmd ="wget -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt 2>/dev/null" +refresh_cmd ="wget-ssl -O- 'https://ispip.clang.cn/all_cn.txt' > /tmp/china_ssr.txt 2>/dev/null" sret = luci.sys.call(refresh_cmd) icount = luci.sys.exec('cat /tmp/china_ssr.txt | wc -l') if sret == 0 then @@ -69,12 +65,8 @@ end if ucic:get_first('vssr', 'global', 'adblock', '') == '1' then log('正在更新【广告屏蔽】数据库') local need_process = 0 - if nixio.fs.access('/usr/bin/wget-ssl') then - refresh_cmd = 'wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf' - need_process = 1 - else - refresh_cmd = 'wget -O /tmp/ad.conf http://iytc.net/tools/ad.conf' - end + refresh_cmd = 'wget-ssl --no-check-certificate -O - https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt > /tmp/adnew.conf' + need_process = 1 sret = luci.sys.call(refresh_cmd .. ' 2>/dev/null') if sret == 0 then if need_process == 1 then diff --git a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/pure.css b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/pure.css new file mode 100644 index 0000000000..530341299d --- /dev/null +++ b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/pure.css @@ -0,0 +1,232 @@ +/*! +Pure v1.0.1 +Copyright 2013 Yahoo! +Licensed under the BSD License. +https://github.com/pure-css/pure/blob/master/LICENSE.md +*/ +.pure-g { + letter-spacing: -.31em; + text-rendering: optimizespeed; + font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + -webkit-align-content: flex-start; + -ms-flex-line-pack: start; + align-content: flex-start +} + +@media all and (-ms-high-contrast:none), +(-ms-high-contrast:active) { + table .pure-g { + display: block + } +} + +.opera-only :-o-prefocus, +.pure-g { + word-spacing: -.43em +} + +.pure-u { + display: inline-block; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto +} + +.pure-g [class*=pure-u] { + font-family: sans-serif +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-1-12, +.pure-u-1-2, +.pure-u-1-24, +.pure-u-1-3, +.pure-u-1-4, +.pure-u-1-5, +.pure-u-1-6, +.pure-u-1-8, +.pure-u-10-24, +.pure-u-11-12, +.pure-u-11-24, +.pure-u-12-24, +.pure-u-13-24, +.pure-u-14-24, +.pure-u-15-24, +.pure-u-16-24, +.pure-u-17-24, +.pure-u-18-24, +.pure-u-19-24, +.pure-u-2-24, +.pure-u-2-3, +.pure-u-2-5, +.pure-u-20-24, +.pure-u-21-24, +.pure-u-22-24, +.pure-u-23-24, +.pure-u-24-24, +.pure-u-3-24, +.pure-u-3-4, +.pure-u-3-5, +.pure-u-3-8, +.pure-u-4-24, +.pure-u-4-5, +.pure-u-5-12, +.pure-u-5-24, +.pure-u-5-5, +.pure-u-5-6, +.pure-u-5-8, +.pure-u-6-24, +.pure-u-7-12, +.pure-u-7-24, +.pure-u-7-8, +.pure-u-8-24, +.pure-u-9-24 { + display: inline-block; + zoom: 1; + letter-spacing: normal; + word-spacing: normal; + vertical-align: top; + text-rendering: auto +} + +.pure-u-1-24 { + width: 4.1667% +} + +.pure-u-1-12, +.pure-u-2-24 { + width: 8.3333% +} + +.pure-u-1-8, +.pure-u-3-24 { + width: 12.5% +} + +.pure-u-1-6, +.pure-u-4-24 { + width: 16.6667% +} + +.pure-u-1-5 { + width: 20% +} + +.pure-u-5-24 { + width: 20.8333% +} + +.pure-u-1-4, +.pure-u-6-24 { + width: 25% +} + +.pure-u-7-24 { + width: 29.1667% +} + +.pure-u-1-3, +.pure-u-8-24 { + width: 33.3333% +} + +.pure-u-3-8, +.pure-u-9-24 { + width: 37.5% +} + +.pure-u-2-5 { + width: 40% +} + +.pure-u-10-24, +.pure-u-5-12 { + width: 41.6667% +} + +.pure-u-11-24 { + width: 45.8333% +} + +.pure-u-1-2, +.pure-u-12-24 { + width: 50% +} + +.pure-u-13-24 { + width: 54.1667% +} + +.pure-u-14-24, +.pure-u-7-12 { + width: 58.3333% +} + +.pure-u-3-5 { + width: 60% +} + +.pure-u-15-24, +.pure-u-5-8 { + width: 62.5% +} + +.pure-u-16-24, +.pure-u-2-3 { + width: 66.6667% +} + +.pure-u-17-24 { + width: 70.8333% +} + +.pure-u-18-24, +.pure-u-3-4 { + width: 75% +} + +.pure-u-19-24 { + width: 79.1667% +} + +.pure-u-4-5 { + width: 80% +} + +.pure-u-20-24, +.pure-u-5-6 { + width: 83.3333% +} + +.pure-u-21-24, +.pure-u-7-8 { + width: 87.5% +} + +.pure-u-11-12, +.pure-u-22-24 { + width: 91.6667% +} + +.pure-u-23-24 { + width: 95.8333% +} + +.pure-u-1, +.pure-u-1-1, +.pure-u-24-24, +.pure-u-5-5 { + width: 100% +} \ No newline at end of file diff --git a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css index 394ed97a77..b696f7e5f0 100644 --- a/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css +++ b/package/ctcgfw/luci-app-vssr/root/www/luci-static/vssr/css/vssr.css @@ -1,245 +1,73 @@ @import url("flag-icon.min.css?v=1.16"); @import url("sweetalert2.css?v=1.16"); -/*! -Pure v1.0.1 -Copyright 2013 Yahoo! -Licensed under the BSD License. -https://github.com/pure-css/pure/blob/master/LICENSE.md -*/ +@import url("pure.css?v=1.16"); - -.pure-g { - letter-spacing: -.31em; - text-rendering: optimizespeed; - font-family: FreeSans, Arimo, "Droid Sans", Helvetica, Arial, sans-serif; - display: -webkit-box; - display: -webkit-flex; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -webkit-flex-flow: row wrap; - -ms-flex-flow: row wrap; - flex-flow: row wrap; - -webkit-align-content: flex-start; - -ms-flex-line-pack: start; - align-content: flex-start +/** Common **/ +.pure-img { + max-height: 100%; + width: auto; } -@media all and (-ms-high-contrast:none), -(-ms-high-contrast:active) { - table .pure-g { - display: block - } +.pure-imgw { + max-width: 100%; + height: auto; } -.opera-only :-o-prefocus, -.pure-g { - word-spacing: -.43em -} - -.pure-u { - display: inline-block; - zoom: 1; - letter-spacing: normal; - word-spacing: normal; - vertical-align: top; - text-rendering: auto -} - -.pure-g [class*=pure-u] { - font-family: sans-serif -} - -.pure-u-1, -.pure-u-1-1, -.pure-u-1-12, -.pure-u-1-2, -.pure-u-1-24, -.pure-u-1-3, -.pure-u-1-4, -.pure-u-1-5, -.pure-u-1-6, -.pure-u-1-8, -.pure-u-10-24, -.pure-u-11-12, -.pure-u-11-24, -.pure-u-12-24, -.pure-u-13-24, -.pure-u-14-24, -.pure-u-15-24, -.pure-u-16-24, -.pure-u-17-24, -.pure-u-18-24, -.pure-u-19-24, -.pure-u-2-24, -.pure-u-2-3, -.pure-u-2-5, -.pure-u-20-24, -.pure-u-21-24, -.pure-u-22-24, -.pure-u-23-24, -.pure-u-24-24, -.pure-u-3-24, -.pure-u-3-4, -.pure-u-3-5, -.pure-u-3-8, -.pure-u-4-24, -.pure-u-4-5, -.pure-u-5-12, -.pure-u-5-24, -.pure-u-5-5, -.pure-u-5-6, -.pure-u-5-8, -.pure-u-6-24, -.pure-u-7-12, -.pure-u-7-24, -.pure-u-7-8, -.pure-u-8-24, -.pure-u-9-24 { - display: inline-block; - zoom: 1; - letter-spacing: normal; - word-spacing: normal; - vertical-align: top; - text-rendering: auto -} - -.pure-u-1-24 { - width: 4.1667% -} - -.pure-u-1-12, -.pure-u-2-24 { - width: 8.3333% -} - -.pure-u-1-8, -.pure-u-3-24 { - width: 12.5% -} - -.pure-u-1-6, -.pure-u-4-24 { - width: 16.6667% -} - -.pure-u-1-5 { - width: 20% -} - -.pure-u-5-24 { - width: 20.8333% -} - -.pure-u-1-4, -.pure-u-6-24 { - width: 25% -} - -.pure-u-7-24 { - width: 29.1667% -} - -.pure-u-1-3, -.pure-u-8-24 { - width: 33.3333% -} - -.pure-u-3-8, -.pure-u-9-24 { - width: 37.5% -} - -.pure-u-2-5 { - width: 40% -} - -.pure-u-10-24, -.pure-u-5-12 { - width: 41.6667% -} - -.pure-u-11-24 { - width: 45.8333% -} - -.pure-u-1-2, -.pure-u-12-24 { - width: 50% -} - -.pure-u-13-24 { - width: 54.1667% -} - -.pure-u-14-24, -.pure-u-7-12 { - width: 58.3333% -} - -.pure-u-3-5 { - width: 60% -} - -.pure-u-15-24, .pure-u-5-8 { - width: 62.5% + display: flex; + align-items: center; + } -.pure-u-16-24, -.pure-u-2-3 { - width: 66.6667% +.gap { + margin-right: 0.5rem; } -.pure-u-17-24 { - width: 70.8333% + +/** 复写theme **/ + +.cbi-section { + + border: 0; + border-radius: .375rem; + + overflow-x: auto; + overflow-y: hidden; } -.pure-u-18-24, -.pure-u-3-4 { - width: 75% +.cbi-section-node { + + border: 0; + border-radius: .375rem; + margin-bottom: 0px; + overflow-x: auto; + overflow-y: hidden; + padding: 0rem 0; } -.pure-u-19-24 { - width: 79.1667% +#cbi-vssr { + overflow-x: hidden; } -.pure-u-4-5 { - width: 80% -} - -.pure-u-20-24, -.pure-u-5-6 { - width: 83.3333% -} - -.pure-u-21-24, -.pure-u-7-8 { - width: 87.5% -} - -.pure-u-11-12, -.pure-u-22-24 { - width: 91.6667% -} - -.pure-u-23-24 { - width: 95.8333% -} - -.pure-u-1, -.pure-u-1-1, -.pure-u-24-24, -.pure-u-5-5 { - width: 100% +#cbi-vssr .panel-title { + width: 100%; + display: block; + margin-bottom: 0; + padding: .8755rem 1.5rem; + + margin-bottom: 0rem; + letter-spacing: .1rem; + + font-weight: 600; + box-sizing: border-box; } +/** Top StatusBar **/ .status { - margin: 1rem -0.5rem 1rem -0.5rem; + margin: 0.5rem -0.5rem 1rem -0.5rem; } -.block { +.status .block { margin: 0.5rem 0.5rem; padding: 0; font-weight: normal; @@ -255,56 +83,28 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md box-shadow: 0 0 2rem 0 rgba(136, 152, 170, .15); } -.img-con { +.status .block .img-con { margin: 1rem; } -.pure-img { - max-height: 100%; - width: auto; -} - -.pure-imgw { - max-width: 100%; - height: auto; -} - -.green { +.status .block .green { font-size: 1.25rem; color: #2dce89; } -.red { +.status .block .red { font-size: 1.25rem; color: #fb6340; } -.sk-text-success { - color: #2dce89; -} - -.sk-text-error { - color: #fb6340; -} - -.gap { - margin-right: 0.5rem; -} - -.block img { +.status .block img { width: 48px; height: auto; float: right; } -.pure-u-5-8 { - display: flex; - align-items: center; - -} - -.block h4 { +.status .block h4 { font-size: .8125rem; font-weight: 600; margin: 1rem; @@ -312,12 +112,10 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md line-height: 1.8em; } -.p-in5 { - padding: 8px; -} +/** Server List **/ -.flag-icon:before { - position: absolute; +.p-in5 { + margin: 8px !important; } .cbi-section-table-row { @@ -346,6 +144,17 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md color: #fff; } +.ssr-button:link, +.ssr-button:hover, +.ssr-button:focus, +.ssr-button:visited, +.ssr-button:active { + + outline: 0; + text-decoration: none; + box-shadow: none; +} + .cbi-section-table-row.fast .ssr-button { color: #fff; } @@ -363,6 +172,15 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md color: #fff !important; } +.host_con { + position: absolute; + left: 0; + width: 70px; + text-align: left; + height: 22px; + font-weight: bold; +} + .host_con.fast { color: #6f9a37; } @@ -379,7 +197,19 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md color: #fb6340; } +.host_ok { + color: #fff; + background: #2dce89; + padding: 0.1rem 0.5rem; + border-radius: 0.2rem; +} +.host_error { + color: #fff; + background: #f5365c; + padding: 0.1rem 0.5rem; + border-radius: 0.2rem; +} .loadings.hide { opacity: 0; @@ -392,20 +222,20 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md height: 30px; } +.flag-icon:before { + position: absolute; +} .alias { margin-bottom: 1px; + padding-left: 0px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } .incon { cursor: pointer; -} - -.incon .pure-imgw { - transition: all 0.2s; -} - -.incon:nth-child(2) { position: absolute; left: 0; top: 0; @@ -414,10 +244,13 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md border: 0; border-right: #d1dfed 1px solid; background-position: top; - } -.incon:nth-child(2) .tp { +.incon .pure-imgw { + transition: all 0.2s; +} + +.incon .tp { position: absolute; left: 0; bottom: 0; @@ -430,34 +263,29 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md background: #525f7f; } -.incon:nth-child(3) { - padding-left: 0px; - text-overflow: ellipsis; - overflow: hidden; - white-space: nowrap; -} - -.incon:nth-child(5), -.incon:nth-child(6) { - display: none; -} .cbi-section-table-cell { text-align: right; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + position: relative; } .ssr-button { background: none; + border: none; color: #525f7f; - padding: 0 0 0 0; + padding: 0 0.2rem 0 0; height: auto; line-height: 1.5em; + box-shadow: none; } .ssr-button:hover, .ssr-button:focus, .ssr-button:active { - color: #525f7f; + outline: 0; text-decoration: none; box-shadow: none; @@ -472,37 +300,18 @@ https://github.com/pure-css/pure/blob/master/LICENSE.md color: #fff !important; background-color: #337ab7 !important; border-color: #2e6da4 !important; + background-image: none; float: right; margin-right: 18px; - margin-top: 1rem; + margin-top: .25rem !important; + outline: none; } -.cbi-section-table-cell { - position: relative; +.cbi-button-check:focus { + outline: none; } -.host_con { - position: absolute; - left: 0; - width: 70px; - text-align: left; - height: 22px; - font-weight: bold; -} - -.host_ok { - color: #fff; - background: #2dce89; - padding: 0.1rem 0.5rem; - border-radius: 0.2rem; -} - -.host_error { - color: #fff; - background: #f5365c; - padding: 0.1rem 0.5rem; - border-radius: 0.2rem; -} +/** Bottom StatusBar **/ footer.mobile-hide { display: block; @@ -537,6 +346,7 @@ footer.mobile-hide { .status-bar .inner .status-info { font-weight: bold; + line-height: 1.5em; } .status-bar .icon-con { @@ -544,6 +354,8 @@ footer.mobile-hide { text-align: right; } +/** Node choose panel **/ + .choose_node .gap { margin: 0.5rem 1rem; position: relative; @@ -553,66 +365,8 @@ footer.mobile-hide { width: 100% !important; } -@media screen and (max-width: 2000px) { - .pure-u-1-5 { - width: 25%; - } -} -@media screen and (max-width: 1600px) { - .pure-u-1-5 { - width: 33.33333333%; - } -} - -@media screen and (max-width: 1200px) { - .pure-u-1-5 { - width: 50%; - } - - .status .pure-u-1-5 { - width: 33.333%; - } -} - -@media screen and (max-width: 700px) { - .pure-u-1-4 { - width: 50%; - } - - .pure-u-1-2 { - width: 100%; - } - - .pure-u-1-5 { - width: 100%; - font-size: 14px; - } - - .status .pure-u-1-5 { - width: 50%; - } - - .cbi-button-add { - position: fixed; - padding: 0.3rem 0.5rem; - z-index: 1000; - width: 50px !important; - height: 50px; - bottom: 90px; - right: 5px; - font-size: 16px; - border-radius: 50%; - display: block; - background-color: #fb6340 !important; - border-color: #fb6340 !important; - box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .75); - } - - .choose_node .pure-u-1-2 { - width: 50%; - } -} +/** Subscribe panel **/ .modals-bg { position: fixed; @@ -625,7 +379,7 @@ footer.mobile-hide { transition: all 0.2s; } -.modals-bg.hide{ +.modals-bg.hide { visibility: hidden; opacity: 0; } @@ -651,7 +405,7 @@ footer.mobile-hide { transform: scale(1); } -.modals.hide{ +.modals.hide { visibility: hidden; opacity: 0; transform: scale(0.5); @@ -688,7 +442,27 @@ footer.mobile-hide { overflow: hidden } -@media screen and (max-width: 1024px) { +@media screen and (max-width: 2000px) { + .pure-u-1-5 { + width: 25%; + } +} + +@media screen and (max-width: 1600px) { + .pure-u-1-5 { + width: 33.33333333%; + } +} + +@media screen and (max-width: 1200px) { + .pure-u-1-5 { + width: 50%; + } + + .status .pure-u-1-5 { + width: 33.333%; + } + .modals { position: fixed; z-index: 100; @@ -704,6 +478,45 @@ footer.mobile-hide { } @media screen and (max-width: 700px) { + .pure-u-1-4 { + width: 50%; + } + + .pure-u-1-2 { + width: 100%; + } + + .pure-u-1-5 { + width: 100%; + font-size: 14px; + } + + .status .pure-u-1-5 { + width: 50%; + } + + .cbi-button-add { + position: fixed; + padding: 0.3rem 0.5rem; + z-index: 1000; + width: 50px !important; + height: 50px !important; + bottom: 90px; + color: #fff; + right: 5px; + font-size: 16px; + border-radius: 50%; + display: block; + background-color: #fb6340 !important; + border-color: #fb6340 !important; + box-shadow: 0 0 1rem 0 rgba(136, 152, 170, .75); + background-image: none; + } + + .choose_node .pure-u-1-2 { + width: 50%; + } + .modals-bg { position: fixed; z-index: 100000; @@ -732,6 +545,14 @@ footer.mobile-hide { height: 2.5em; text-align: right; } + + .p-in5 { + padding-bottom: 3rem; + } + + .cbi-page-actions { + padding-bottom: 4rem !important; + } } @media (prefers-color-scheme: dark) { @@ -753,4 +574,5 @@ footer.mobile-hide { .ssr-button { color: #ccc; } + } \ No newline at end of file diff --git a/package/lean/autocore/Makefile b/package/lean/autocore/Makefile index 609960464d..ffbda07f73 100644 --- a/package/lean/autocore/Makefile +++ b/package/lean/autocore/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=autocore PKG_VERSION:=1 -PKG_RELEASE:=36 +PKG_RELEASE:=37 include $(INCLUDE_DIR)/package.mk diff --git a/package/lean/autocore/files/arm/sbin/cpuinfo b/package/lean/autocore/files/arm/sbin/cpuinfo index d64b95e6c9..f02c232b29 100755 --- a/package/lean/autocore/files/arm/sbin/cpuinfo +++ b/package/lean/autocore/files/arm/sbin/cpuinfo @@ -1,7 +1,6 @@ #!/bin/sh cpu_arch="$(cat "/proc/cpuinfo" | grep "model name" | sed -n "1p" | awk -F ': ' '{print $2}')" -[ -z "${cpu_arch}" ] && cpu_arch="ARMv8 Processor" cpu_cores="$(cat "/proc/cpuinfo" | grep "processor" | wc -l)" if grep -q "bcm27xx" "/etc/openwrt_release"; then diff --git a/package/lean/default-settings/files/zzz-default-settings b/package/lean/default-settings/files/zzz-default-settings index 863f81f921..9ba13df5d1 100755 --- a/package/lean/default-settings/files/zzz-default-settings +++ b/package/lean/default-settings/files/zzz-default-settings @@ -31,7 +31,6 @@ ln -sf /sbin/ip /usr/bin/ip sed -i 's#https://downloads.openwrt.org#https://mirrors.cloud.tencent.com/lede#g' /etc/opkg/distfeeds.conf sed -i '/openwrt_luci/ { s/snapshots/releases\/18.06.9/g; }' /etc/opkg/distfeeds.conf -sed -i '/openwrt_packages/ { s/snapshots/releases\/19.07.5/g; }' /etc/opkg/distfeeds.conf sed -i "s/# //g" /etc/opkg/distfeeds.conf sed -i 's/root::0:0:99999:7:::/root:$1$V4UetPzk$CYXluq4wUazHjmCDBCqXF.:0:0:99999:7:::/g' /etc/shadow diff --git a/package/lean/luci-app-ssr-plus/Makefile b/package/lean/luci-app-ssr-plus/Makefile index 21104075ad..395f4e4864 100644 --- a/package/lean/luci-app-ssr-plus/Makefile +++ b/package/lean/luci-app-ssr-plus/Makefile @@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-ssr-plus PKG_VERSION:=182 -PKG_RELEASE:=5 +PKG_RELEASE:=9 define Package/$(PKG_NAME)/conffiles /etc/config/shadowsocksr @@ -10,69 +10,89 @@ define Package/$(PKG_NAME)/conffiles endef define Package/$(PKG_NAME)/config -config PACKAGE_$(PKG_NAME)_INCLUDE_Xray - bool "Include Xray" - default y if i386||x86_64||arm||aarch64 - -config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan - bool "Include Trojan" - default y if i386||x86_64||arm||aarch64 - -config PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 - bool "Include Redsocks2" - default y if i386||x86_64||arm||aarch64 +config PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun + bool "Include Kcptun" + default n config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy bool "Include NaiveProxy" depends on !(arc||armeb||mips||mips64||powerpc) default y if i386||x86_64||arm||aarch64 -config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray - bool "Include V2ray" +config PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 + bool "Include Redsocks2" default n -config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go - bool "Include Trojan-Go" - default n +config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks + bool "Include Shadowsocks-libev" + default y -config PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun - bool "Include Kcptun" - default n - -config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin - bool "Include Shadowsocks V2ray Plugin" - default n +config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR + bool "Include ShadowsocksR-libev" + default y config PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server bool "Include ShadowsocksR Server" default y if i386||x86_64||arm||aarch64 + +config PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs + bool "Include Shadowsocks Simple Obfs Plugin" + default y + +config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan + bool "Include Trojan" + default y if i386||arm + +config PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go + bool "Include Trojan-Go" + default y if x86_64||aarch64 + +config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray + bool "Include V2ray" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin + bool "Include Shadowsocks V2ray Plugin" + default n + +config PACKAGE_$(PKG_NAME)_INCLUDE_Xray + bool "Include Xray" + default y if i386||x86_64||arm||aarch64 endef PKG_CONFIG_DEPENDS:= \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \ CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \ - CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin \ + CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Socks5/Tun LuCI interface LUCI_PKGARCH:=all -LUCI_DEPENDS:=+shadowsocksr-libev-alt +ipset +ip-full +iptables-mod-tproxy +dnsmasq-full +coreutils +coreutils-base64 +pdnsd-alt +wget-ssl +lua +libuci-lua \ - +microsocks +dns2socks +shadowsocks-libev-ss-local +shadowsocksr-libev-ssr-local +shadowsocks-libev-ss-redir +simple-obfs +tcping +resolveip\ - +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_plugin:v2ray-plugin \ - +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go:trojan-go \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:ipt2socks \ +LUCI_DEPENDS:=+coreutils +coreutils-base64 +dns2socks +dnsmasq-full +ipset +ip-full \ + +iptables-mod-tproxy +lua +libuci-lua +microsocks +pdnsd-alt +tcping +resolveip \ + +shadowsocksr-libev-alt +wget-ssl \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \ +PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \ +PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2:redsocks2 \ - +PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \ - +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server:shadowsocksr-libev-server + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-redir \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR:shadowsocksr-libev-ssr-local \ + +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server:shadowsocksr-libev-server \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs:simple-obfs \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:ipt2socks \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Go:trojan-go \ + +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin:v2ray-plugin \ + +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \ + +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray include $(TOPDIR)/feeds/luci/luci.mk diff --git a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm index 66284ffbab..5ed71f082d 100644 --- a/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +++ b/package/lean/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm @@ -361,8 +361,8 @@ function import_ssr_url(btn, urlname, sid) { document.getElementsByName('cbid.shadowsocksr.' + sid + '.vless_encryption')[0].value = queryParam.encryption || "none"; if (queryParam.security == "tls") { document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; - document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = queryParam.sni || serverPart[0]; document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); + document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = queryParam.sni || serverPart[0]; } switch (queryParam.type) { case "ws": diff --git a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr index 6396d14274..2689f47d9b 100755 --- a/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr +++ b/package/lean/luci-app-ssr-plus/root/etc/init.d/shadowsocksr @@ -44,7 +44,6 @@ CRON_FILE=/etc/crontabs/root EXTRA_COMMANDS='reset' EXTRA_HELP=" reset Reset to default settings" #extra_command "reset" "Reset to default settings" -trap 'rm -f "$LOCK_FILE"; exit $?' INT TERM EXIT uci_get_by_name() { local ret=$(uci get $NAME.$1.$2 2>/dev/null) @@ -283,7 +282,7 @@ gen_config_file() { #server1 type2 code3 local_port4 socks_port5 threads5 vmess | vless) lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 >$config_file ;; - trojan | trojan-go) + trojan) case "$3" in 1) lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file @@ -292,10 +291,25 @@ gen_config_file() { #server1 type2 code3 local_port4 socks_port5 threads5 lua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file ;; 3) + lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file lua /usr/share/shadowsocksr/gen_config.lua $1 client $tmp_port >$shunt_dns_config_file ;; 4) - lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$config_file + lua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file + ;; + esac + ;; + trojan-go) + case "$3" in + 1 | 2) + lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file + ;; + 3) + lua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file + lua /usr/share/shadowsocksr/gen_config.lua $1 client $tmp_port >$shunt_dns_config_file + ;; + 4) + lua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file ;; esac ;; @@ -342,20 +356,29 @@ start_udp() { ln_start_bin $(first_type xray v2ray) v2ray -config $udp_config_file echolog "UDP TPROXY Relay:$($(first_type "xray" "v2ray") -version | head -1) Started!" ;; - trojan | trojan-go) #client + trojan) #client gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port ln_start_bin $(first_type trojan-go trojan) $type --config $udp_config_file ln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port echolog "UDP TPROXY Relay:$($(first_type trojan-go trojan) --version 2>&1 | head -1) Started!" ;; + trojan-go) + gen_config_file $UDP_RELAY_SERVER $type 2 $udp_config_file + ln_start_bin $(first_type trojan-go trojan) $type --config $udp_config_file + echolog "UDP TPROXY Relay:$($(first_type trojan-go trojan) --version 2>&1 | head -1) Started!" + ;; naiveproxy) echolog "NaïveProxy UDP TPROXY Relay not supported!" redir_udp=0 ARG_UDP="" ;; socks5) - gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port - ln_start_bin $(first_type redsocks2) redsocks2 -c $udp_config_file + if [ "$(uci_get_by_name $UDP_RELAY_SERVER auth_enable 0)" == "1" ]; then + local auth="-a $(uci_get_by_name $UDP_RELAY_SERVER username) -k $(uci_get_by_name $UDP_RELAY_SERVER password)" + fi + ln_start_bin $(first_type ipt2socks) ipt2socks $udp_config_file -U -4 -s $(uci_get_by_name $UDP_RELAY_SERVER server) -p $(uci_get_by_name $UDP_RELAY_SERVER server_port) -l $tmp_udp_port $auth + #gen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port + #ln_start_bin $(first_type redsocks2) redsocks2 -c $udp_config_file echolog "UDP TPROXY Relay:Socks5 REDIRECT/TPROXY Started!" ;; tun) @@ -371,7 +394,6 @@ start_shunt() { case "$type" in ss | ssr) gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port - #gen_config_file $SHUNT_SERVER $type 3 $tmp_local_port ln_start_bin $(first_type ${type}-redir) ${type}-redir -c $shunt_config_file if [ -n "$tmp_local_port" ]; then local tmp_port=$tmp_local_port @@ -418,6 +440,22 @@ start_shunt() { echolog "shunt:$($(first_type "naive") --version 2>&1 | head -1) Started!" redir_udp=0 ;; + socks5) + if [ "$(uci_get_by_name $SHUNT_SERVER auth_enable 0)" == "1" ]; then + local auth="-a $(uci_get_by_name $SHUNT_SERVER username) -k $(uci_get_by_name $SHUNT_SERVER password)" + fi + ln_start_bin $(first_type ipt2socks) ipt2socks $shunt_config_file -R -4 -s $(uci_get_by_name $SHUNT_SERVER server) -p $(uci_get_by_name $SHUNT_SERVER server_port) -l $tmp_shunt_port $auth + #gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port + #ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file + if [ -n "$tmp_local_port" ]; then + local tmp_port=$tmp_local_port + else + local tmp_port=$tmp_shunt_local_port + ln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_port shunt-dns-ssr-plus + fi + ln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_port 8.8.8.8:53 127.0.0.1:$tmp_shunt_dns_port -q + echolog "shunt:$type REDIRECT/TPROXY Started!" + ;; *) gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file @@ -445,7 +483,7 @@ start_local() { echolog "Global_Socks5:$(get_name $type) Started!" ;; vmess | vless) - if [ "_local" == "1" ]; then + if [ "$_local" == "2" ]; then gen_config_file $LOCAL_SERVER $type 4 0 $local_port ln_start_bin $(first_type xray v2ray) v2ray -config $local_config_file echolog "Global_Socks5:$($(first_type "xray" "v2ray") -version | head -1) Started!" @@ -514,7 +552,7 @@ Start_Run() { trojan | trojan-go) gen_config_file $GLOBAL_SERVER $type 1 $tcp_port ln_start_bin $(first_type trojan-go trojan) $type --config $tcp_config_file - echolog "Main node:$($(first_type $type) --version 2>&1 | head -1) Started!" + echolog "Main node:$($(first_type trojan-go trojan) --version 2>&1 | head -1) Started!" ;; naiveproxy) gen_config_file $GLOBAL_SERVER $type 1 $tcp_port @@ -522,10 +560,14 @@ Start_Run() { echolog "Main node:$($(first_type naive) --version 2>&1 | head -1) , $threads Threads Started!" ;; socks5) - gen_config_file $GLOBAL_SERVER $type 1 $tcp_port - for i in $(seq 1 $threads); do - ln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file - done + if [ "$(uci_get_by_name $GLOBAL_SERVER auth_enable 0)" == "1" ]; then + local auth="-a $(uci_get_by_name $GLOBAL_SERVER username) -k $(uci_get_by_name $GLOBAL_SERVER password)" + fi + ln_start_bin $(first_type ipt2socks) ipt2socks $tcp_config_file -R -4 -j $threads -s $(uci_get_by_name $GLOBAL_SERVER server) -p $(uci_get_by_name $GLOBAL_SERVER server_port) -l $tcp_port $auth + #gen_config_file $GLOBAL_SERVER $type 1 $tcp_port + #for i in $(seq 1 $threads); do + # ln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file + #done echolog "Main node:Socks5 REDIRECT/TPROXY $threads Threads Started!" ;; tun) @@ -729,7 +771,6 @@ start_rules() { w | W | b | B) local ac_ips="$lan_ac_mode$lan_ac_ips" ;; esac fi - #deal gfw firewall rule gfwmode() { case "$(uci_get_by_type global run_mode)" in gfw) echo "-g" ;; @@ -830,7 +871,6 @@ stop() { ps -w | grep -v "grep" | grep ssr-monitor | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & ps -w | grep -v "grep" | grep "sleep 0000" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & ps -w | grep -v "grep" | grep "$TMP_PATH" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 & - #killall -q -9 ss-redir ss-local obfs-local ssr-redir ssr-local ssr-server v2ray v2ray-plugin xray trojan naive microsocks ipt2socks dns2socks redsocks2 pdnsd killall -q -9 v2ray-plugin obfs-local rm -f /var/lock/ssr-monitor.lock if [ -f "/var/dnsmasq.d/dnsmasq-ssrplus.conf" ]; then diff --git a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index f4c8eb761f..f42809776f 100644 --- a/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -18,7 +18,7 @@ local Xray = { sniffing = {enabled = true, destOverride = {"http", "tls"}} } or nil, -- 开启 socks 代理 - inboundDetour = (proto == "tcp" and socks_port ~= "0") and { + inboundDetour = (proto:find("tcp") and socks_port ~= "0") and { { protocol = "socks", port = tonumber(socks_port), diff --git a/package/lean/luci-app-uugamebooster/Makefile b/package/lean/luci-app-uugamebooster/Makefile index 9c407fb4ad..de6094f98c 100644 --- a/package/lean/luci-app-uugamebooster/Makefile +++ b/package/lean/luci-app-uugamebooster/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 2020 Openwrt.org +# Copyright (C) 2021 Openwrt.org # # This is free software, licensed under the Apache License, Version 2.0 . # @@ -10,8 +10,8 @@ LUCI_DEPENDS:=+uugamebooster LUCI_PKGARCH:=all PKG_NAME:=luci-app-uugamebooster PKG_VERSION:=1.0 -PKG_RELEASE:=5 +PKG_RELEASE:=7 include $(TOPDIR)/feeds/luci/luci.mk -# call BuildPackage - OpenWrt buildroot signature +# call BuildPackage - OpenWrt buildroot signature \ No newline at end of file diff --git a/package/lean/luci-app-uugamebooster/luasrc/controller/uugamebooster.lua b/package/lean/luci-app-uugamebooster/luasrc/controller/uugamebooster.lua deleted file mode 100644 index 830cffd05a..0000000000 --- a/package/lean/luci-app-uugamebooster/luasrc/controller/uugamebooster.lua +++ /dev/null @@ -1,15 +0,0 @@ -module("luci.controller.uugamebooster",package.seeall) - -function index() - if not nixio.fs.access("/etc/config/uugamebooster") then return end - - entry({"admin", "services", "uugamebooster"}, cbi("uugamebooster/uugamebooster"), ("UU Game Booster"),99).dependent=true - entry({"admin","services","uugamebooster","status"},call("act_status")).leaf=true -end - -function act_status() - local e={} - e.running=luci.sys.call("pgrep -f uugamebooster >/dev/null")==0 - luci.http.prepare_content("application/json") - luci.http.write_json(e) -end diff --git a/package/lean/luci-app-uugamebooster/luasrc/controller/uuplugin.lua b/package/lean/luci-app-uugamebooster/luasrc/controller/uuplugin.lua new file mode 100644 index 0000000000..f67e4cb7e1 --- /dev/null +++ b/package/lean/luci-app-uugamebooster/luasrc/controller/uuplugin.lua @@ -0,0 +1,15 @@ +module("luci.controller.uuplugin",package.seeall) + +function index() + if not nixio.fs.access("/etc/config/uuplugin") then return end + + entry({"admin", "services", "uuplugin"}, cbi("uuplugin/uuplugin"), ("UU GameAcc"),99).dependent=true + entry({"admin","services","uuplugin","status"},call("act_status")).leaf=true +end + +function act_status() + local e={} + e.running=luci.sys.call("pgrep -f uuplugin >/dev/null")==0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uugamebooster/uugamebooster.lua b/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uugamebooster/uugamebooster.lua deleted file mode 100644 index 07333798bf..0000000000 --- a/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uugamebooster/uugamebooster.lua +++ /dev/null @@ -1,24 +0,0 @@ -require("luci.util") - -mp = Map("uugamebooster", translate("UU Game Booster")) -mp.description = translate("A Paid Game Acceleration service") -mp:section(SimpleSection).template = "uugamebooster/uugamebooster_status" - -s = mp:section(TypedSection, "uugamebooster") -s.anonymous=true -s.addremove=false - -o = s:option(Flag, "enabled", translate("Enable")) -o.default = 0 -o.optional = false - -function o.write(self, section, value) - if value == "1" then - luci.sys.call("/etc/init.d/uugamebooster start >/dev/null && /etc/init.d/uugamebooster enable >/dev/null") - else - luci.sys.call("/etc/init.d/uugamebooster stop >/dev/null && /etc/init.d/uugamebooster disable >/dev/null") - end - return Flag.write(self, section, value) -end - -return mp diff --git a/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uuplugin/uuplugin.lua b/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uuplugin/uuplugin.lua new file mode 100644 index 0000000000..0bf3c5aa35 --- /dev/null +++ b/package/lean/luci-app-uugamebooster/luasrc/model/cbi/uuplugin/uuplugin.lua @@ -0,0 +1,17 @@ +require("luci.util") + +mp = Map("uuplugin", translate("UU Game Accelerator")) +mp.description = translate("A Paid Game Acceleration service") +mp:section(SimpleSection).template = "uuplugin/uuplugin_status" + +s = mp:section(TypedSection, "uuplugin") +s.anonymous=true +s.addremove=false + +o = s:option(Flag, "enabled", translate("Enable")) +o.default = 0 +o.optional = false + +mp:section(SimpleSection).template = "uuplugin/uuplugin_qcode" + +return mp diff --git a/package/lean/luci-app-uugamebooster/luasrc/view/uugamebooster/uugamebooster_status.htm b/package/lean/luci-app-uugamebooster/luasrc/view/uugamebooster/uugamebooster_status.htm deleted file mode 100644 index 2b83098754..0000000000 --- a/package/lean/luci-app-uugamebooster/luasrc/view/uugamebooster/uugamebooster_status.htm +++ /dev/null @@ -1,21 +0,0 @@ - - -
-

- <%:Collecting data...%> -

-
diff --git a/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_qcode.htm b/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_qcode.htm new file mode 100644 index 0000000000..12cb2e9743 --- /dev/null +++ b/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_qcode.htm @@ -0,0 +1,6 @@ + +
+

+ +

+
diff --git a/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_status.htm b/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_status.htm new file mode 100644 index 0000000000..c4930636ee --- /dev/null +++ b/package/lean/luci-app-uugamebooster/luasrc/view/uuplugin/uuplugin_status.htm @@ -0,0 +1,21 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/package/lean/luci-app-uugamebooster/po/zh-cn/uugamebooster.po b/package/lean/luci-app-uugamebooster/po/zh-cn/uugamebooster.po deleted file mode 100644 index e91029e72c..0000000000 --- a/package/lean/luci-app-uugamebooster/po/zh-cn/uugamebooster.po +++ /dev/null @@ -1,9 +0,0 @@ - -msgid "Enable" -msgstr "启用" - -msgid "UU Game Booster" -msgstr "网易UU网游加速器" - -msgid "A Paid Game Acceleration service" -msgstr "一个富家子弟用的游戏加速器" diff --git a/package/lean/luci-app-uugamebooster/po/zh-cn/uuplugin.po b/package/lean/luci-app-uugamebooster/po/zh-cn/uuplugin.po new file mode 100644 index 0000000000..d2a3ddbb4e --- /dev/null +++ b/package/lean/luci-app-uugamebooster/po/zh-cn/uuplugin.po @@ -0,0 +1,12 @@ + +msgid "Enable" +msgstr "启用" + +msgid "UU GameAcc" +msgstr "UU游戏加速器" + +msgid "UU Game Accelerator" +msgstr "UU游戏加速器" + +msgid "A Paid Game Acceleration service" +msgstr "一个富家子弟用的主机游戏加速器 (开启服务后,使用手机APP绑定路由器并指定加速主机)" diff --git a/package/lean/luci-app-uugamebooster/root/etc/config/uugamebooster b/package/lean/luci-app-uugamebooster/root/etc/config/uugamebooster deleted file mode 100644 index ed8a894041..0000000000 --- a/package/lean/luci-app-uugamebooster/root/etc/config/uugamebooster +++ /dev/null @@ -1,4 +0,0 @@ - -config uugamebooster 'uugamebooster' - option enabled '0' - diff --git a/package/lean/luci-app-uugamebooster/root/etc/config/uuplugin b/package/lean/luci-app-uugamebooster/root/etc/config/uuplugin new file mode 100644 index 0000000000..3df3127498 --- /dev/null +++ b/package/lean/luci-app-uugamebooster/root/etc/config/uuplugin @@ -0,0 +1,4 @@ + +config uuplugin 'uuplugin' + option enabled '0' + diff --git a/package/lean/luci-app-uugamebooster/root/etc/init.d/uuplugin b/package/lean/luci-app-uugamebooster/root/etc/init.d/uuplugin new file mode 100755 index 0000000000..6eec9607de --- /dev/null +++ b/package/lean/luci-app-uugamebooster/root/etc/init.d/uuplugin @@ -0,0 +1,23 @@ +#!/bin/sh /etc/rc.common + +START=99 +STOP=10 + +USE_PROCD=1 + +NAME="uugamebooster" +UU_BIN="/usr/share/uugamebooster/uuplugin" +UU_CONF="/usr/share/uugamebooster/uu.conf" +UU_LOGFILE="/tmp/uugamebooster.log" + +start_service() { + config_load uuplugin + local enable + config_get_bool enable uuplugin enabled + if [ "$enable" -eq 1 ]; then + procd_open_instance + procd_set_param command $UU_BIN $UU_CONF >$UU_LOGFILE 2>&1 + procd_set_param respawn + procd_close_instance + fi +} diff --git a/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uugamebooster b/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uugamebooster deleted file mode 100644 index 4eeb70d8e1..0000000000 --- a/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uugamebooster +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -uci -q batch <<-EOF >/dev/null - delete ucitrack.@uugamebooster[-1] - add ucitrack uugamebooster - set ucitrack.@uugamebooster[-1].init=uugamebooster - commit ucitrack -EOF - -rm -f /tmp/luci-indexcache -exit 0 diff --git a/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uuplugin b/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uuplugin new file mode 100644 index 0000000000..e65f87ecec --- /dev/null +++ b/package/lean/luci-app-uugamebooster/root/etc/uci-defaults/45_luci-uuplugin @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@uuplugin[-1] + add ucitrack uuplugin + set ucitrack.@uuplugin[-1].init=uuplugin + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/package/lean/shadowsocksr-libev/Makefile b/package/lean/shadowsocksr-libev/Makefile index 29d2d032f3..c5409d3f8e 100644 --- a/package/lean/shadowsocksr-libev/Makefile +++ b/package/lean/shadowsocksr-libev/Makefile @@ -23,18 +23,19 @@ PKG_BUILD_PARALLEL:=1 include $(INCLUDE_DIR)/package.mk -define Package/shadowsocksr-libev +define Package/shadowsocksr-libev/Default SECTION:=net CATEGORY:=Network SUBMENU:=Web Servers/Proxies TITLE:=Lightweight Secured Socks5 Proxy URL:=https://github.com/shadowsocksrr/shadowsocksr-libev DEPENDS:=+libev +libsodium +libopenssl +libpthread +libpcre +libudns +zlib + PROVIDES:=shadowsocksr-libev endef -Package/shadowsocksr-libev-server = $(Package/shadowsocksr-libev) -Package/shadowsocksr-libev-alt = $(Package/shadowsocksr-libev) -Package/shadowsocksr-libev-ssr-local = $(Package/shadowsocksr-libev) +Package/shadowsocksr-libev-server = $(Package/shadowsocksr-libev/Default) +Package/shadowsocksr-libev-alt = $(Package/shadowsocksr-libev/Default) +Package/shadowsocksr-libev-ssr-local = $(Package/shadowsocksr-libev/Default) CONFIGURE_ARGS += --disable-documentation --disable-ssp --disable-assert \ --enable-system-shared-lib @@ -42,15 +43,6 @@ CONFIGURE_ARGS += --disable-documentation --disable-ssp --disable-assert \ TARGET_CFLAGS += -flto TARGET_LDFLAGS += -Wl,--gc-sections,--as-needed -define Package/shadowsocksr-libev/install - $(INSTALL_DIR) $(1)/usr/bin - $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-redir $(1)/usr/bin/ssr-redir - $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-local $(1)/usr/bin/ssr-local - $(LN) ssr-local $(1)/usr/bin/ssr-tunnel - $(INSTALL_BIN) $(PKG_BUILD_DIR)/server/ss-check $(1)/usr/bin/ssr-check - $(INSTALL_BIN) $(PKG_BUILD_DIR)/server/ss-server $(1)/usr/bin/ssr-server -endef - define Package/shadowsocksr-libev-alt/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/src/ss-redir $(1)/usr/bin/ssr-redir @@ -68,7 +60,6 @@ define Package/shadowsocksr-libev-ssr-local/install $(LN) ssr-local $(1)/usr/bin/ssr-tunnel endef -$(eval $(call BuildPackage,shadowsocksr-libev)) $(eval $(call BuildPackage,shadowsocksr-libev-alt)) $(eval $(call BuildPackage,shadowsocksr-libev-server)) $(eval $(call BuildPackage,shadowsocksr-libev-ssr-local)) diff --git a/package/lean/uugamebooster/Makefile b/package/lean/uugamebooster/Makefile index cdf7226bed..10a075b0bc 100644 --- a/package/lean/uugamebooster/Makefile +++ b/package/lean/uugamebooster/Makefile @@ -13,7 +13,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=uugamebooster PKG_VERSION:=v2.7.2 -PKG_RELEASE:=6 +PKG_RELEASE:=5 include $(INCLUDE_DIR)/package.mk @@ -70,8 +70,8 @@ define Build/Compile endef define Package/$(PKG_NAME)/install - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_BIN) ./files/uugamebooster.init $(1)/etc/init.d/uugamebooster + # $(INSTALL_DIR) $(1)/etc/init.d + # $(INSTALL_BIN) ./files/uugamebooster.init $(1)/etc/init.d/uuplugin $(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME) $(INSTALL_BIN) $(UNTAR_DIR)/uuplugin $(1)/usr/share/$(PKG_NAME)/uuplugin diff --git a/package/lean/uugamebooster/files/uugamebooster.init b/package/lean/uugamebooster/files/uugamebooster.init deleted file mode 100755 index 7fa2ea8acc..0000000000 --- a/package/lean/uugamebooster/files/uugamebooster.init +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh /etc/rc.common - -START=99 -STOP=10 - -USE_PROCD=1 - -NAME="uugamebooster" -UU_BIN="/usr/share/uugamebooster/uuplugin" -UU_CONF="/usr/share/uugamebooster/uu.conf" -UU_LOGFILE="/tmp/uugamebooster.log" - -start_service() { - procd_open_instance - procd_set_param command $UU_BIN $UU_CONF >$UU_LOGFILE 2>&1 - procd_set_param respawn - procd_close_instance -} diff --git a/package/lean/xray/Makefile b/package/lean/xray/Makefile index 89b5a7129b..3f955c8d2b 100644 --- a/package/lean/xray/Makefile +++ b/package/lean/xray/Makefile @@ -9,13 +9,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=xray -PKG_VERSION:=1.2.2 +PKG_VERSION:=1.2.3 PKG_RELEASE:=1 PKG_BUILD_DIR:=$(BUILD_DIR)/Xray-core-$(PKG_VERSION) PKG_SOURCE:=xray-core-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/xray-core/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=b9b38bc69e660d3a6d0545efea4d0891ee81a2d55c83a6fa893cbd680a071023 +PKG_HASH:=1deed281d2b976c0132b57194a09b62a1b978ec1b35d8329894b80f8d47befb7 PKG_LICENSE:=MPL PKG_LICENSE_FILES:=LICENSE @@ -79,7 +79,6 @@ endef ifeq ($(CONFIG_XRAY_COMPRESS_GOPROXY),y) export GO111MODULE=on export GOPROXY=https://goproxy.io -#export GOPROXY=https://mirrors.aliyun.com/goproxy/ endif GEOIP_VER:=latest diff --git a/package/lienol/luci-app-passwall/Makefile b/package/lienol/luci-app-passwall/Makefile index f4e631b6d2..8c22904f91 100644 --- a/package/lienol/luci-app-passwall/Makefile +++ b/package/lienol/luci-app-passwall/Makefile @@ -7,8 +7,8 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall PKG_VERSION:=4 -PKG_RELEASE:=7 -PKG_DATE:=20210111 +PKG_RELEASE:=10 +PKG_DATE:=20210122 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) @@ -69,10 +69,6 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG bool "Include ChinaDNS-NG" default n -config PACKAGE_$(PKG_NAME)_INCLUDE_https_dns_proxy - bool "Include Https DNS Proxy(DoH)" - default y - config PACKAGE_$(PKG_NAME)_INCLUDE_dns2socks bool "Include dns2socks" default n @@ -96,7 +92,6 @@ define Package/$(PKG_NAME) DEPENDS:=+libmbedtls +iptables-mod-tproxy +ip +ipset +coreutils +coreutils-base64 +coreutils-nohup +luci-lib-jsonc \ +curl +ca-certificates +resolveip +unzip +dnsmasq-full +tcping +libuci-lua \ +ipt2socks \ - +ssocks \ +microsocks \ +pdnsd-alt \ +PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks:shadowsocks-libev-ss-redir \ @@ -106,7 +101,6 @@ define Package/$(PKG_NAME) +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR:shadowsocksr-libev-ssr-local \ +PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Server:shadowsocksr-libev-server \ +PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray \ - +PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray \ +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_Plus:trojan-plus \ +PACKAGE_$(PKG_NAME)_INCLUDE_Trojan_GO:trojan-go \ +PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \ @@ -114,7 +108,6 @@ define Package/$(PKG_NAME) +PACKAGE_$(PKG_NAME)_INCLUDE_kcptun:kcptun-client \ +PACKAGE_$(PKG_NAME)_INCLUDE_haproxy:haproxy \ +PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG:chinadns-ng \ - +PACKAGE_$(PKG_NAME)_INCLUDE_https_dns_proxy:https-dns-proxy \ +PACKAGE_$(PKG_NAME)_INCLUDE_dns2socks:dns2socks \ +PACKAGE_$(PKG_NAME)_INCLUDE_v2ray-plugin:v2ray-plugin \ +PACKAGE_$(PKG_NAME)_INCLUDE_simple-obfs:simple-obfs diff --git a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua index 099dd6a054..8731d7d906 100644 --- a/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua +++ b/package/lienol/luci-app-passwall/luasrc/controller/passwall.lua @@ -9,7 +9,6 @@ local api = require "luci.model.cbi.passwall.api.api" local kcptun = require "luci.model.cbi.passwall.api.kcptun" local brook = require "luci.model.cbi.passwall.api.brook" local xray = require "luci.model.cbi.passwall.api.xray" -local v2ray = require "luci.model.cbi.passwall.api.v2ray" local trojan_go = require "luci.model.cbi.passwall.api.trojan_go" function index() @@ -72,8 +71,6 @@ function index() entry({"admin", "services", appname, "brook_update"}, call("brook_update")).leaf = true entry({"admin", "services", appname, "xray_check"}, call("xray_check")).leaf = true entry({"admin", "services", appname, "xray_update"}, call("xray_update")).leaf = true - entry({"admin", "services", appname, "v2ray_check"}, call("v2ray_check")).leaf = true - entry({"admin", "services", appname, "v2ray_update"}, call("v2ray_update")).leaf = true entry({"admin", "services", appname, "trojan_go_check"}, call("trojan_go_check")).leaf = true entry({"admin", "services", appname, "trojan_go_update"}, call("trojan_go_update")).leaf = true end @@ -191,12 +188,12 @@ function socks_status() local index = luci.http.formvalue("index") local id = luci.http.formvalue("id") e.index = index - e.socks_status = luci.sys.call(string.format("ps -w | grep -v grep | grep '%s/bin/' | grep 'SOCKS_%s' > /dev/null", appname, id)) == 0 + e.socks_status = luci.sys.call(string.format("ps -w | grep -v grep | grep '%s/bin/' | grep '%s' | grep 'SOCKS_' > /dev/null", appname, id)) == 0 local use_http = ucic:get(appname, id, "http_port") or 0 e.use_http = 0 if tonumber(use_http) > 0 then e.use_http = 1 - e.http_status = luci.sys.call(string.format("ps -w | grep -v grep | grep '%s/bin/' | grep 'SOCKS2HTTP_%s' > /dev/null", appname, id)) == 0 + e.http_status = luci.sys.call(string.format("ps -w | grep -v grep | grep '%s/bin/' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null", appname, id)) == 0 end luci.http.prepare_content("application/json") luci.http.write_json(e) @@ -413,25 +410,6 @@ function xray_update() http_write_json(json) end -function v2ray_check() - local json = v2ray.to_check("") - http_write_json(json) -end - -function v2ray_update() - local json = nil - local task = http.formvalue("task") - if task == "extract" then - json = v2ray.to_extract(http.formvalue("file"), http.formvalue("subfix")) - elseif task == "move" then - json = v2ray.to_move(http.formvalue("file")) - else - json = v2ray.to_download(http.formvalue("url")) - end - - http_write_json(json) -end - function trojan_go_check() local json = trojan_go.to_check("") http_write_json(json) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/api.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/api.lua index c2bb2a8a88..7df868e616 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/api.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/api.lua @@ -149,31 +149,6 @@ function get_xray_version(file) return "" end -function get_v2ray_path() - local path = uci_get_type("global_app", "v2ray_file") - return path -end - -function get_v2ray_version(file) - if file == nil then file = get_v2ray_path() end - chmod_755(file) - if fs.access(file) then - if file == get_v2ray_path() then - local md5 = sys.exec("echo -n $(md5sum " .. file .. " | awk '{print $1}')") - if fs.access("/tmp/psw_" .. md5) then - return sys.exec("cat /tmp/psw_" .. md5) - else - local version = sys.exec("echo -n $(%s -version | awk '{print $2}' | sed -n 1P)" % file) - sys.call("echo '" .. version .. "' > " .. "/tmp/psw_" .. md5) - return version - end - else - return sys.exec("echo -n $(%s -version | awk '{print $2}' | sed -n 1P)" % file) - end - end - return "" -end - function get_trojan_go_path() local path = uci_get_type("global_app", "trojan_go_file") return path diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_xray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_xray.lua index 0302032b64..9bb67237c2 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_xray.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/gen_xray.lua @@ -1,15 +1,8 @@ module("luci.model.cbi.passwall.api.gen_xray", package.seeall) local api = require "luci.model.cbi.passwall.api.api" -local ucursor = require"luci.model.uci".cursor() -local sys = require "luci.sys" -local json = require "luci.jsonc" -local appname = "passwall" -local inbounds = {} -local outbounds = {} -local routing = nil local myarg = { - "-node", "-proto", "-redir_port", "-socks_proxy_port", "-loglevel" + "-node", "-proto", "-redir_port", "-socks_proxy_port", "-http_proxy_port", "-dns_listen_port", "-dns_server", "-doh_url", "-doh_host", "-doh_socks_address", "-doh_socks_port", "-loglevel" } local var = api.get_args(arg, myarg) @@ -18,10 +11,26 @@ local node_section = var["-node"] local proto = var["-proto"] local redir_port = var["-redir_port"] local socks_proxy_port = var["-socks_proxy_port"] +local http_proxy_port = var["-http_proxy_port"] +local dns_listen_port = var["-dns_listen_port"] +local dns_server = var["-dns_server"] +local doh_url = var["-doh_url"] +local doh_host = var["-doh_host"] +local doh_socks_address = var["-doh_socks_address"] +local doh_socks_port = var["-doh_socks_port"] local loglevel = var["-loglevel"] or "warning" local network = proto local new_port +local ucursor = require"luci.model.uci".cursor() +local sys = require "luci.sys" +local json = require "luci.jsonc" +local appname = "passwall" +local dns = nil +local inbounds = {} +local outbounds = {} +local routing = nil + local function get_new_port() if new_port then new_port = tonumber(sys.exec(string.format("echo -n $(/usr/share/%s/app.sh get_new_port %s tcp)", appname, new_port + 1))) @@ -48,13 +57,13 @@ function gen_outbound(node, tag, relay_port) node.port = new_port sys.call(string.format('/usr/share/%s/app.sh run_socks "%s" "%s" "%s" "%s" "%s" "%s" "%s" "%s"> /dev/null', appname, + new_port, node_id, "127.0.0.1", new_port, string.format("/var/etc/%s/v2_%s_%s.json", appname, node_type, node_id), "0", "nil", - "4", relay_port and tostring(relay_port) or "" ) ) @@ -142,7 +151,7 @@ function gen_outbound(node, tag, relay_port) { id = node.uuid, alterId = tonumber(node.alter_id), - level = node.level and tonumber(node.level) or 0, + level = 0, security = (node.protocol == "vmess") and node.security or nil, encryption = node.encryption or "none", flow = node.flow or nil @@ -178,6 +187,14 @@ if node_section then }) network = "tcp,udp" end + if http_proxy_port then + table.insert(inbounds, { + listen = "0.0.0.0", + port = tonumber(http_proxy_port), + protocol = "http", + settings = {allowTransparent = false} + }) + end if redir_port then table.insert(inbounds, { @@ -269,6 +286,38 @@ if node_section then local default_node_id = node.default_node or nil if default_node_id and default_node_id ~= "nil" then local default_node = ucursor:get_all(appname, default_node_id) + if "1" == node.default_proxy then + local node_id = node.main_node or nil + if node_id and node_id ~= "nil" then + if node_id == default_node_id then + else + new_port = get_new_port() + table.insert(inbounds, { + tag = "proxy_default", + listen = "127.0.0.1", + port = new_port, + protocol = "dokodemo-door", + settings = {network = "tcp,udp", address = default_node.address, port = tonumber(default_node.port)} + }) + if default_node.tls_serverName == nil then + default_node.tls_serverName = default_node.address + end + default_node.address = "127.0.0.1" + default_node.port = new_port + local node = ucursor:get_all(appname, node_id) + local outbound = gen_outbound(node, "main") + if outbound then + table.insert(outbounds, outbound) + local rule = { + type = "field", + inboundTag = {"proxy_default"}, + outboundTag = "main" + } + table.insert(rules, rule) + end + end + end + end local default_outbound = gen_outbound(default_node, "default") if default_outbound then table.insert(outbounds, default_outbound) @@ -307,21 +356,132 @@ if node_section then local outbound = gen_outbound(node) if outbound then table.insert(outbounds, outbound) end end +end - -- 额外传出连接 - table.insert(outbounds, {protocol = "freedom", tag = "direct", settings = {keep = ""}}) +if dns_server then + local rules = {} + + dns = { + tag = "dns-in1", + servers = { + dns_server + } + } + if doh_url and doh_host then + dns.hosts = { + [doh_host] = dns_server + } + dns.servers = { + doh_url + } + end + + if dns_listen_port then + table.insert(inbounds, { + listen = "127.0.0.1", + port = tonumber(dns_listen_port), + protocol = "dokodemo-door", + tag = "dns-in", + settings = { + address = dns_server, + port = 53, + network = "udp" + } + }) + table.insert(outbounds, { + protocol = "dns", + tag = "dns-out" + }) + end + + table.insert(rules, { + type = "field", + inboundTag = { + "dns-in" + }, + outboundTag = "dns-out" + }) + + if doh_socks_address and doh_socks_port then + table.insert(outbounds, { + tag = "out", + protocol = "socks", + streamSettings = { + network = "tcp", + security = "none" + }, + settings = { + servers = { + { + address = doh_socks_address, + port = tonumber(doh_socks_port) + } + } + } + }) + table.insert(rules, { + type = "field", + inboundTag = { + "dns-in1" + }, + outboundTag = "out" + }) + else + table.insert(rules, { + type = "field", + inboundTag = { + "dns-in1" + }, + outboundTag = "direct" + }) + end + + routing = { + domainStrategy = "IPOnDemand", + rules = rules + } +end + +if inbounds or outbounds then + table.insert(outbounds, { + protocol = "freedom", + tag = "direct", + settings = {domainStrategy = "UseIPv4"} + }) local xray = { log = { -- error = string.format("/var/etc/passwall/%s.log", node[".name"]), loglevel = loglevel }, + -- DNS + dns = dns, -- 传入连接 inbounds = inbounds, -- 传出连接 outbounds = outbounds, -- 路由 - routing = routing + routing = routing, + -- 本地策略 + --[[ + policy = { + levels = { + [0] = { + handshake = 4, + connIdle = 300, + uplinkOnly = 2, + downlinkOnly = 5, + bufferSize = 10240, + statsUserUplink = false, + statsUserDownlink = false + } + }, + system = { + statsInboundUplink = false, + statsInboundDownlink = false + } + } + ]]-- } print(json.stringify(xray, 1)) end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/v2ray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/v2ray.lua deleted file mode 100644 index 60841d6bcb..0000000000 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/api/v2ray.lua +++ /dev/null @@ -1,173 +0,0 @@ -module("luci.model.cbi.passwall.api.v2ray", package.seeall) -local fs = require "nixio.fs" -local sys = require "luci.sys" -local util = require "luci.util" -local i18n = require "luci.i18n" -local api = require "luci.model.cbi.passwall.api.api" - -local v2ray_api = "https://api.github.com/repos/v2fly/v2ray-core/releases/latest" -local is_armv7 = false - -function to_check(arch) - local app_path = api.get_v2ray_path() or "" - if app_path == "" then - return { - code = 1, - error = i18n.translatef("You did not fill in the %s path. Please save and apply then update manually.", "V2ray") - } - end - if not arch or arch == "" then arch = api.auto_get_arch() end - - local file_tree, sub_version = api.get_file_info(arch) - if sub_version == "7" then is_armv7 = true end - - if file_tree == "" then - return { - code = 1, - error = i18n.translate("Can't determine ARCH, or ARCH not supported.") - } - end - - if file_tree == "amd64" then file_tree = "64" end - if file_tree == "386" then file_tree = "32" end - - local json = api.get_api_json(v2ray_api) - - if json.tag_name == nil then - return { - code = 1, - error = i18n.translate("Get remote version info failed.") - } - end - - local now_version = api.get_v2ray_version() - local remote_version = json.tag_name:match("[^v]+") - local needs_update = api.compare_versions(now_version, "<", remote_version) - local html_url, download_url - - if needs_update then - html_url = json.html_url - for _, v in ipairs(json.assets) do - if v.name and v.name:match("linux%-" .. file_tree) then - download_url = v.browser_download_url - break - end - end - end - - if needs_update and not download_url then - return { - code = 1, - now_version = now_version, - version = remote_version, - html_url = html_url, - error = i18n.translate("New version found, but failed to get new version download url.") - } - end - - return { - code = 0, - update = needs_update, - now_version = now_version, - version = remote_version, - url = {html = html_url, download = download_url} - } -end - -function to_download(url) - local app_path = api.get_v2ray_path() or "" - if app_path == "" then - return { - code = 1, - error = i18n.translatef("You did not fill in the %s path. Please save and apply then update manually.", "V2ray") - } - end - if not url or url == "" then - return {code = 1, error = i18n.translate("Download url is required.")} - end - - sys.call("/bin/rm -f /tmp/v2ray_download.*") - - local tmp_file = util.trim(util.exec("mktemp -u -t v2ray_download.XXXXXX")) - - local result = api.exec(api.curl, {api._unpack(api.curl_args), "-o", tmp_file, url}, nil, api.command_timeout) == 0 - - if not result then - api.exec("/bin/rm", {"-f", tmp_file}) - return { - code = 1, - error = i18n.translatef("File download failed or timed out: %s", url) - } - end - - return {code = 0, file = tmp_file} -end - -function to_extract(file, subfix) - local app_path = api.get_v2ray_path() or "" - if app_path == "" then - return { - code = 1, - error = i18n.translatef("You did not fill in the %s path. Please save and apply then update manually.", "V2ray") - } - end - - if not file or file == "" or not fs.access(file) then - return {code = 1, error = i18n.translate("File path required.")} - end - - if sys.exec("echo -n $(opkg list-installed | grep -c unzip)") ~= "1" then - api.exec("/bin/rm", {"-f", file}) - return { - code = 1, - error = i18n.translate("Not installed unzip, Can't unzip!") - } - end - - sys.call("/bin/rm -rf /tmp/v2ray_extract.*") - local tmp_dir = util.trim(util.exec("mktemp -d -t v2ray_extract.XXXXXX")) - - local output = {} - api.exec("/usr/bin/unzip", {"-o", file, "-d", tmp_dir}, - function(chunk) output[#output + 1] = chunk end) - - local files = util.split(table.concat(output)) - - api.exec("/bin/rm", {"-f", file}) - - return {code = 0, file = tmp_dir} -end - -function to_move(file) - local app_path = api.get_v2ray_path() or "" - if app_path == "" then - return { - code = 1, - error = i18n.translatef("You did not fill in the %s path. Please save and apply then update manually.", "V2ray") - } - end - if not file or file == "" then - sys.call("/bin/rm -rf /tmp/v2ray_extract.*") - return {code = 1, error = i18n.translate("Client file is required.")} - end - - if not arch or arch == "" then arch = api.auto_get_arch() end - local file_tree, sub_version = api.get_file_info(arch) - local t = "" - sys.call("/etc/init.d/passwall stop") - local result = nil - if sub_version and sub_version == "7" then t = "_armv7" end - result = api.exec("/bin/mv", { "-f", file .. "/v2ray" .. t, app_path }, nil, api.command_timeout) == 0 - sys.call("/bin/rm -rf /tmp/v2ray_extract.*") - if not result or not fs.access(app_path) then - return { - code = 1, - error = i18n.translatef("Can't move new file to path: %s", app_path) - } - end - - api.chmod_755(app_path) - sys.call("/etc/init.d/passwall restart >/dev/null 2>&1 &") - - return {code = 0} -end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/app_update.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/app_update.lua index dbbad8e5b0..d7f7e7e2db 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/app_update.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/app_update.lua @@ -10,7 +10,6 @@ s = m:section(TypedSection, "global_app", translate("App Update"), "") s.anonymous = true s:append(Template(appname .. "/app_update/xray_version")) -s:append(Template(appname .. "/app_update/v2ray_version")) s:append(Template(appname .. "/app_update/trojan_go_version")) s:append(Template(appname .. "/app_update/kcptun_version")) s:append(Template(appname .. "/app_update/brook_version")) @@ -19,10 +18,6 @@ o = s:option(Value, "xray_file", translatef("%s App Path", "Xray")) o.default = "/usr/bin/xray" o.rmempty = false -o = s:option(Value, "v2ray_file", translatef("%s App Path", "V2ray")) -o.default = "/usr/bin/v2ray" -o.rmempty = false - o = s:option(Value, "trojan_go_file", translatef("%s App Path", "Trojan-Go")) o.default = "/usr/bin/trojan-go" o.rmempty = false diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua index 458a2dda94..19e65ce419 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua @@ -2,16 +2,27 @@ local d = require "luci.dispatcher" local uci = require"luci.model.uci".cursor() local api = require "luci.model.cbi.passwall.api.api" local appname = "passwall" +local has_xray = api.is_finded("xray") + +m = Map(appname) local nodes_table = {} for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = { id = e[".name"], - remarks = e.remarks_name + remarks = e.remarks_name, + type = e["type"] } end local socks_table = {} +if tonumber(m:get("@global[0]", "tcp_node_socks") or 0) == 1 then + local id = "127.0.0.1" .. ":" .. m:get("@global[0]", "tcp_node_socks_port") + socks_table[#socks_table + 1] = { + id = id, + remarks = id .. " - " .. translate("TCP Node") + } +end uci:foreach(appname, "socks", function(s) if s.enabled == "1" and s.node then local id, remarks @@ -25,7 +36,7 @@ uci:foreach(appname, "socks", function(s) end end end - id = "0.0.0.0" .. ":" .. s.port + id = "127.0.0.1" .. ":" .. s.port socks_table[#socks_table + 1] = { id = id, remarks = id .. " - " .. (remarks or translate("Misconfigured")) @@ -55,7 +66,6 @@ local doh_validate = function(self, value, t) return nil, translate("DoH request address") .. " " .. translate("Format must be:") .. " URL,IP" end -m = Map(appname) local status = m:get("@global_other[0]", "status") or "" if status:find("big_icon") then m:append(Template(appname .. "/global/status")) @@ -74,11 +84,11 @@ o = s:taboption("Main", Flag, "enabled", translate("Main switch")) o.rmempty = false ---- TCP Node -o = s:taboption("Main", ListValue, "tcp_node", translate("TCP Node")) -o.title = translate("TCP Node") -o.description = "" ---o.description = translate("For proxy specific list.") ---o.description = o.description .. "
" +tcp_node = s:taboption("Main", ListValue, "tcp_node", translate("TCP Node")) +tcp_node.title = translate("TCP Node") +tcp_node.description = "" +--tcp_node.description = translate("For proxy specific list.") +--tcp_node.description = o.description .. "
" local current_node = luci.sys.exec(string.format("[ -f '/var/etc/%s/id/TCP' ] && echo -n $(cat /var/etc/%s/id/TCP)", appname, appname)) if current_node and current_node ~= "" and current_node ~= "nil" then local n = uci:get_all(appname, current_node) @@ -86,7 +96,7 @@ if current_node and current_node ~= "" and current_node ~= "nil" then if tonumber(m:get("@auto_switch[0]", "enable") or 0) == 1 then local remarks = api.get_full_node_remarks(n) local url = d.build_url("admin", "services", appname, "node_config", current_node) - o.description = o.description .. translatef("Current node: %s", string.format('%s', url, remarks)) .. "
" + tcp_node.description = tcp_node.description .. translatef("Current node: %s", string.format('%s', url, remarks)) .. "
" end if n.protocol and n.protocol == "_shunt" then uci:foreach(appname, "shunt_rules", function(e) @@ -95,7 +105,7 @@ if current_node and current_node ~= "" and current_node ~= "nil" then if n[id] and n[id] ~= "nil" then local url = d.build_url("admin", "services", appname, "node_config", n[id]) local r = api.get_full_node_remarks(uci:get_all(appname, n[id])) - o.description = o.description .. remarks .. ":" .. string.format('%s', url, r) .. "
" + tcp_node.description = tcp_node.description .. remarks .. ":" .. string.format('%s', url, r) .. "
" end end) local id = "default_node" @@ -103,22 +113,32 @@ if current_node and current_node ~= "" and current_node ~= "nil" then if n[id] and n[id] ~= "nil" then local url = d.build_url("admin", "services", appname, "node_config", n[id]) local r = api.get_full_node_remarks(uci:get_all(appname, n[id])) - o.description = o.description .. remarks .. ":" .. string.format('%s', url, r) .. "
" + tcp_node.description = tcp_node.description .. remarks .. ":" .. string.format('%s', url, r) .. "
" end end end end -o:value("nil", translate("Close")) -for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end +tcp_node:value("nil", translate("Close")) -o = s:taboption("Main", ListValue, "udp_node", translate("UDP Node")) -o:value("nil", translate("Close")) -o.title = translate("UDP Node") ---o.description = translate("For proxy game network, DNS hijack etc.") .. "
" .. translate("The selected server will not use Kcptun.") -o:value("tcp_", translate("Same as the tcp node")) ---o:value("tcp", translate("Same as the tcp node")) ---o:value("tcp_", translate("Same as the tcp node") .. "(" .. translate("New process") .. ")") -for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end +udp_node = s:taboption("Main", ListValue, "udp_node", translate("UDP Node")) +udp_node:value("nil", translate("Close")) +udp_node.title = translate("UDP Node") +--udp_node.description = translate("For proxy game network, DNS hijack etc.") .. "
" .. translate("The selected server will not use Kcptun.") +udp_node:value("tcp_", translate("Same as the tcp node")) +--udp_node:value("tcp", translate("Same as the tcp node")) +--udp_node:value("tcp_", translate("Same as the tcp node") .. "(" .. translate("New process") .. ")") + +tcp_node_socks = s:taboption("Main", Flag, "tcp_node_socks", translate("Enable") .. translate("TCP Node") .. "Socks") +o = s:taboption("Main", Value, "tcp_node_socks_port", "Socks" .. translate("Listen Port")) +o.default = 1080 +o.datatype = "port" +o:depends("tcp_node_socks", true) + +tcp_node_http = s:taboption("Main", Flag, "tcp_node_http", translate("Enable") .. translate("TCP Node") .. "Http") +o = s:taboption("Main", Value, "tcp_node_http_port", "HTTP" .. translate("Listen Port")) +o.default = 1180 +o.datatype = "port" +o:depends("tcp_node_http", true) s:tab("DNS", translate("DNS")) @@ -131,12 +151,12 @@ if api.is_finded("chinadns-ng") then o:depends("chinadns_ng", "1") end -o = s:taboption("DNS", Value, "up_china_dns", translate("Resolver For Local/WhiteList Domains") .. "(UDP)") +o = s:taboption("DNS", Value, "up_china_dns", translate("Local DNS") .. "(UDP)") o.description = translate("IP:Port mode acceptable, multi value split with english comma.") .. "
" .. translate("When the selection is not the default, this DNS is forced to be set to dnsmasq upstream DNS.") o.default = "default" o:value("default", translate("Default")) -if api.is_finded("https-dns-proxy") then - o:value("https-dns-proxy", "https-dns-proxy(DoH)") +if has_xray then + o:value("xray_doh", "Xray DNS(DoH)") end o:value("223.5.5.5", "223.5.5.5 (" .. translate("Ali") .. "DNS)") o:value("223.6.6.6", "223.6.6.6 (" .. translate("Ali") .. "DNS)") @@ -150,24 +170,24 @@ o:value("180.76.76.76", "180.76.76.76 (" .. translate("Baidu") .. "DNS)") ---- DoH o = s:taboption("DNS", Value, "up_china_dns_doh", translate("DoH request address")) -o:value("https://dns.alidns.com/dns-query,223.5.5.5,223.6.6.6", "AliDNS") -o:value("https://doh.pub/dns-query,119.29.29.29,119.28.28.28", "DNSPod") -o.default = "https://dns.alidns.com/dns-query,223.5.5.5,223.6.6.6" +o:value("https://dns.alidns.com/dns-query,223.5.5.5", "AliDNS") +o:value("https://doh.pub/dns-query,119.29.29.29", "DNSPod") +o.default = "https://dns.alidns.com/dns-query,223.5.5.5" o.validate = doh_validate -o:depends("up_china_dns", "https-dns-proxy") +o:depends("up_china_dns", "xray_doh") ---- DNS Forward Mode o = s:taboption("DNS", ListValue, "dns_mode", translate("Filter Mode")) o.rmempty = false o:reset_values() if api.is_finded("pdnsd") then - o:value("pdnsd", "pdnsd") + o:value("pdnsd", "pdnsd " .. translatef("Requery DNS By %s", translate("TCP Node"))) end if api.is_finded("dns2socks") then o:value("dns2socks", "dns2socks") end -if api.is_finded("https-dns-proxy") then - o:value("https-dns-proxy", "https-dns-proxy(DoH)") +if has_xray then + o:value("xray_doh", "Xray DNS(DoH)") end o:value("udp", translatef("Requery DNS By %s", translate("UDP Node"))) o:value("nonuse", translate("No Filter")) @@ -185,17 +205,10 @@ o.validate = function(self, value, t) end o:depends({dns_mode = "custom"}) -o = s:taboption("DNS", ListValue, "up_trust_pdnsd_dns", translate("Resolver For The List Proxied")) --- o.description = translate("You can use other resolving DNS services as trusted DNS, Example: dns2socks, dns-forwarder... 127.0.0.1#5353
Only use two at most, english comma separation, If you do not fill in the # and the following port, you are using port 53.") -o.default = "tcp" -o:value("tcp", translatef("Requery DNS By %s", translate("TCP Node"))) -o:value("udp", translatef("Requery DNS By %s", translate("UDP Node"))) -o:depends("dns_mode", "pdnsd") - o = s:taboption("DNS", ListValue, "up_trust_doh_dns", translate("Resolver For The List Proxied")) o:value("tcp", translatef("Requery DNS By %s", translate("TCP Node"))) o:value("socks", translatef("Requery DNS By %s", translate("Socks Node"))) -o:depends("dns_mode", "https-dns-proxy") +o:depends("dns_mode", "xray_doh") o = s:taboption("DNS", Value, "socks_server", translate("Socks Server"), translate("Make sure socks service is available on this address.")) for k, v in pairs(socks_table) do o:value(v.id, v.remarks) end @@ -206,27 +219,28 @@ o.validate = function(self, value, t) return value end o:depends({dns_mode = "dns2socks"}) -o:depends({dns_mode = "https-dns-proxy", up_trust_doh_dns = "socks"}) +o:depends({dns_mode = "xray_doh", up_trust_doh_dns = "socks"}) ---- DoH o = s:taboption("DNS", Value, "up_trust_doh", translate("DoH request address")) -o:value("https://dns.adguard.com/dns-query,176.103.130.130,176.103.130.131", "AdGuard") -o:value("https://cloudflare-dns.com/dns-query,1.1.1.1,1.0.0.1", "Cloudflare") -o:value("https://security.cloudflare-dns.com/dns-query,1.1.1.2,1.0.0.2", "Cloudflare-Security") -o:value("https://doh.opendns.com/dns-query,208.67.222.222,208.67.220.220", "OpenDNS") -o:value("https://dns.google/dns-query,8.8.8.8,8.8.4.4", "Google") +o:value("https://dns.adguard.com/dns-query,176.103.130.130", "AdGuard") +o:value("https://cloudflare-dns.com/dns-query,1.1.1.1", "Cloudflare") +o:value("https://security.cloudflare-dns.com/dns-query,1.1.1.2", "Cloudflare-Security") +o:value("https://doh.opendns.com/dns-query,208.67.222.222", "OpenDNS") +o:value("https://dns.google/dns-query,8.8.8.8", "Google") o:value("https://doh.libredns.gr/dns-query,116.202.176.26", "LibreDNS") o:value("https://doh.libredns.gr/ads,116.202.176.26", "LibreDNS (No Ads)") -o:value("https://dns.quad9.net/dns-query,9.9.9.9,149.112.112.112", "Quad9-Recommended") -o.default = "https://dns.google/dns-query,8.8.8.8,8.8.4.4" +o:value("https://dns.quad9.net/dns-query,9.9.9.9", "Quad9-Recommended") +o.default = "https://dns.google/dns-query,8.8.8.8" o.validate = doh_validate -o:depends({dns_mode = "https-dns-proxy"}) +o:depends({dns_mode = "xray_doh"}) ---- DNS Forward -o = s:taboption("DNS", Value, "dns_forward", translate("Filtered DNS(For Proxied Domains)"), translate("IP:Port mode acceptable, the 1st for 'dns2socks' if split with english comma.")) -o.default = "8.8.4.4" -o:value("8.8.4.4", "8.8.4.4 (Google DNS)") +o = s:taboption("DNS", Value, "dns_forward", translate("Remote DNS")) +--o.description = translate("IP:Port mode acceptable, multi value split with english comma.") .. " " .. translate("If you use dns2socks, only the first one is valid.") +o.default = "8.8.8.8" o:value("8.8.8.8", "8.8.8.8 (Google DNS)") +o:value("8.8.4.4", "8.8.4.4 (Google DNS)") o:value("208.67.222.222", "208.67.222.222 (Open DNS)") o:value("208.67.220.220", "208.67.220.220 (Open DNS)") o:depends({dns_mode = "dns2socks"}) @@ -240,9 +254,6 @@ o:depends({dns_mode = "dns2socks"}) o:depends({dns_mode = "pdnsd"}) ]]-- -o = s:taboption("DNS", Flag, "use_chnlist", translate("Use ChinaList"), translate("Only useful in non-gfwlist mode.") .. "
" .. translate("When used, the domestic DNS will be used only when the chnlist rule is hit, and the domain name that misses the rule will be resolved by remote DNS.")) -o.default = "0" - o = s:taboption("DNS", Button, "clear_ipset", translate("Clear IPSET"), translate("Try this feature if the rule modification does not take effect.")) o.inputstyle = "remove" function o.write(e, e) @@ -344,21 +355,35 @@ o = s:option(Flag, "enabled", translate("Enable")) o.default = 1 o.rmempty = false -o = s:option(ListValue, "node", translate("Socks Node")) -o:value("tcp", translate("Same as the tcp node")) -for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end +socks_node = s:option(ListValue, "node", translate("Socks Node")) o = s:option(Value, "port", "Socks" .. translate("Listen Port")) o.default = 9050 o.datatype = "port" o.rmempty = false -if api.is_finded("xray") or api.is_finded("v2ray") then +if has_xray then o = s:option(Value, "http_port", "HTTP" .. translate("Listen Port") .. " " .. translate("0 is not use")) o.default = 0 o.datatype = "port" end +for k, v in pairs(nodes_table) do + tcp_node:value(v.id, v.remarks) + tcp_node_socks:depends("tcp_node", v.id) + if has_xray then + tcp_node_http:depends("tcp_node", v.id) + end + udp_node:value(v.id, v.remarks) + if v.type == "Socks" then + if has_xray then + socks_node:value(v.id, v.remarks) + end + else + socks_node:value(v.id, v.remarks) + end +end + m:append(Template(appname .. "/global/footer")) --[[ diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_config.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_config.lua index f11d3f3cf1..61186e3ce3 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_config.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_config.lua @@ -83,9 +83,6 @@ if api.is_finded("xray") then type:value("Xray", translate("Xray")) type.description = translate("Xray is currently directly compatible with V2ray and used.") end -if api.is_finded("v2ray") then - type:value("V2ray", translate("V2ray")) -end if api.is_finded("brook") then type:value("Brook", translate("Brook")) end @@ -113,7 +110,6 @@ protocol:value("shadowsocks", translate("Shadowsocks")) protocol:value("trojan", translate("Trojan")) protocol:value("_balancing", translate("Balancing")) protocol:value("_shunt", translate("Shunt")) -protocol:depends("type", "V2ray") protocol:depends("type", "Xray") local nodes_table = {} @@ -155,6 +151,14 @@ default_node:value("nil", translate("Close")) for k, v in pairs(nodes_table) do default_node:value(v.id, v.remarks) end default_node:depends("protocol", "_shunt") +default_proxy = s:option(Flag, "default_proxy", translate("Default") .. translate("Node") .. translate("Preproxy"), translate("Use the under node for the transit.")) +default_proxy.default = 0 +default_proxy:depends("protocol", "_shunt") + +o = s:option(ListValue, "main_node", " ") +for k, v in pairs(nodes_table) do o:value(v.id, v.remarks) end +o:depends("default_proxy", "1") + domainStrategy = s:option(ListValue, "domainStrategy", translate("Domain Strategy")) domainStrategy:value("AsIs") domainStrategy:value("IPIfNonMatch") @@ -209,12 +213,6 @@ address:depends({ type = "Xray", protocol = "http" }) address:depends({ type = "Xray", protocol = "socks" }) address:depends({ type = "Xray", protocol = "shadowsocks" }) address:depends({ type = "Xray", protocol = "trojan" }) -address:depends({ type = "V2ray", protocol = "vmess" }) -address:depends({ type = "V2ray", protocol = "vless" }) -address:depends({ type = "V2ray", protocol = "http" }) -address:depends({ type = "V2ray", protocol = "socks" }) -address:depends({ type = "V2ray", protocol = "shadowsocks" }) -address:depends({ type = "V2ray", protocol = "trojan" }) --[[ use_ipv6 = s:option(Flag, "use_ipv6", translate("Use IPv6")) @@ -232,12 +230,6 @@ use_ipv6:depends({ type = "Xray", protocol = "http" }) use_ipv6:depends({ type = "Xray", protocol = "socks" }) use_ipv6:depends({ type = "Xray", protocol = "shadowsocks" }) use_ipv6:depends({ type = "Xray", protocol = "trojan" }) -use_ipv6:depends({ type = "V2ray", protocol = "vmess" }) -use_ipv6:depends({ type = "V2ray", protocol = "vless" }) -use_ipv6:depends({ type = "V2ray", protocol = "http" }) -use_ipv6:depends({ type = "V2ray", protocol = "socks" }) -use_ipv6:depends({ type = "V2ray", protocol = "shadowsocks" }) -use_ipv6:depends({ type = "V2ray", protocol = "trojan" }) --]] port = s:option(Value, "port", translate("Port")) @@ -257,20 +249,12 @@ port:depends({ type = "Xray", protocol = "http" }) port:depends({ type = "Xray", protocol = "socks" }) port:depends({ type = "Xray", protocol = "shadowsocks" }) port:depends({ type = "Xray", protocol = "trojan" }) -port:depends({ type = "V2ray", protocol = "vmess" }) -port:depends({ type = "V2ray", protocol = "vless" }) -port:depends({ type = "V2ray", protocol = "http" }) -port:depends({ type = "V2ray", protocol = "socks" }) -port:depends({ type = "V2ray", protocol = "shadowsocks" }) -port:depends({ type = "V2ray", protocol = "trojan" }) username = s:option(Value, "username", translate("Username")) username:depends("type", "Socks") username:depends("type", "Naiveproxy") username:depends({ type = "Xray", protocol = "http" }) username:depends({ type = "Xray", protocol = "socks" }) -username:depends({ type = "V2ray", protocol = "http" }) -username:depends({ type = "V2ray", protocol = "socks" }) password = s:option(Value, "password", translate("Password")) password.password = true @@ -286,10 +270,6 @@ password:depends({ type = "Xray", protocol = "http" }) password:depends({ type = "Xray", protocol = "socks" }) password:depends({ type = "Xray", protocol = "shadowsocks" }) password:depends({ type = "Xray", protocol = "trojan" }) -password:depends({ type = "V2ray", protocol = "http" }) -password:depends({ type = "V2ray", protocol = "socks" }) -password:depends({ type = "V2ray", protocol = "shadowsocks" }) -password:depends({ type = "V2ray", protocol = "trojan" }) ss_encrypt_method = s:option(ListValue, "ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(ss_encrypt_method_list) do ss_encrypt_method:value(t) end @@ -314,12 +294,10 @@ end security = s:option(ListValue, "security", translate("Encrypt Method")) for a, t in ipairs(security_list) do security:value(t) end security:depends({ type = "Xray", protocol = "vmess" }) -security:depends({ type = "V2ray", protocol = "vmess" }) encryption = s:option(Value, "encryption", translate("Encrypt Method")) encryption.default = "none" encryption:depends({ type = "Xray", protocol = "vless" }) -encryption:depends({ type = "V2ray", protocol = "vless" }) v_ss_encrypt_method = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(v_ss_encrypt_method_list) do v_ss_encrypt_method:value(t) end @@ -411,21 +389,10 @@ uuid = s:option(Value, "uuid", translate("ID")) uuid.password = true uuid:depends({ type = "Xray", protocol = "vmess" }) uuid:depends({ type = "Xray", protocol = "vless" }) -uuid:depends({ type = "V2ray", protocol = "vmess" }) -uuid:depends({ type = "V2ray", protocol = "vless" }) alter_id = s:option(Value, "alter_id", translate("Alter ID")) alter_id:depends("protocol", "vmess") -level = s:option(Value, "level", translate("User Level")) -level.default = 1 -level:depends({ type = "Xray", protocol = "vmess" }) -level:depends({ type = "Xray", protocol = "vless" }) -level:depends({ type = "Xray", protocol = "trojan" }) -level:depends({ type = "V2ray", protocol = "vmess" }) -level:depends({ type = "V2ray", protocol = "vless" }) -level:depends({ type = "V2ray", protocol = "trojan" }) - tls = s:option(Flag, "tls", translate("TLS")) tls.default = 0 tls.validate = function(self, value, t) @@ -442,11 +409,6 @@ tls:depends({ type = "Xray", protocol = "vless" }) tls:depends({ type = "Xray", protocol = "socks" }) tls:depends({ type = "Xray", protocol = "trojan" }) tls:depends({ type = "Xray", protocol = "shadowsocks" }) -tls:depends({ type = "V2ray", protocol = "vmess" }) -tls:depends({ type = "V2ray", protocol = "vless" }) -tls:depends({ type = "V2ray", protocol = "socks" }) -tls:depends({ type = "V2ray", protocol = "shadowsocks" }) -tls:depends({ type = "Xray", protocol = "trojan" }) tls:depends("type", "Trojan") tls:depends("type", "Trojan-Plus") tls:depends("type", "Trojan-Go") @@ -535,11 +497,6 @@ transport:depends({ type = "Xray", protocol = "vless" }) transport:depends({ type = "Xray", protocol = "socks" }) transport:depends({ type = "Xray", protocol = "shadowsocks" }) transport:depends({ type = "Xray", protocol = "trojan" }) -transport:depends({ type = "V2ray", protocol = "vmess" }) -transport:depends({ type = "V2ray", protocol = "vless" }) -transport:depends({ type = "V2ray", protocol = "socks" }) -transport:depends({ type = "V2ray", protocol = "shadowsocks" }) -transport:depends({ type = "V2ray", protocol = "trojan" }) --[[ ss_transport = s:option(ListValue, "ss_transport", translate("Transport")) @@ -547,7 +504,6 @@ ss_transport:value("ws", "WebSocket") ss_transport:value("h2", "HTTP/2") ss_transport:value("h2+ws", "HTTP/2 & WebSocket") ss_transport:depends({ type = "Xray", protocol = "shadowsocks" }) -ss_transport:depends({ type = "V2ray", protocol = "shadowsocks" }) ]]-- -- [[ TCP部分 ]]-- @@ -667,11 +623,6 @@ mux:depends({ type = "Xray", protocol = "vless", xtls = false }) mux:depends({ type = "Xray", protocol = "http" }) mux:depends({ type = "Xray", protocol = "socks" }) mux:depends({ type = "Xray", protocol = "shadowsocks" }) -mux:depends({ type = "V2ray", protocol = "vmess" }) -mux:depends({ type = "V2ray", protocol = "vless" }) -mux:depends({ type = "V2ray", protocol = "http" }) -mux:depends({ type = "V2ray", protocol = "socks" }) -mux:depends({ type = "V2ray", protocol = "shadowsocks" }) mux:depends("type", "Trojan-Go") mux_concurrency = s:option(Value, "mux_concurrency", translate("Mux Concurrency")) @@ -683,7 +634,6 @@ mux_concurrency:depends("mux", "1") tcp_socks = s:option(Flag, "tcp_socks", translate("TCP Open Socks"), translate("When using this TCP node, whether to open the socks proxy at the same time")) tcp_socks.default = 0 tcp_socks:depends("type", "Xray") -tcp_socks:depends("type", "V2ray") tcp_socks_port = s:option(Value, "tcp_socks_port", "Socks " .. translate("Port"), translate("Do not conflict with other ports")) tcp_socks_port.datatype = "port" diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_list.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_list.lua index 4c194ce938..f34553fac4 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_list.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/node_list.lua @@ -63,7 +63,7 @@ if nodes_display:find("compact_display_nodes") then local remarks = m:get(n, "remarks") or "" local type = m:get(n, "type") or "" str = str .. string.format("", appname, n, type) - if type == "Xray" or type == "V2ray" then + if type == "Xray" then local protocol = m:get(n, "protocol") if protocol == "_balancing" then type = type .. " 负载均衡" @@ -106,7 +106,7 @@ else local v = Value.cfgvalue(t, n) if v then result = translate(v) - if v == "Xray" or v == "V2ray" then + if v == "Xray" then local protocol = m:get(n, "protocol") if protocol == "_balancing" then result = result .. " 负载均衡" diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua index 51fb136942..7ae5807c99 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua @@ -49,7 +49,7 @@ for e = 0, 23 do o:value(e, e .. translate("oclock")) end o.default = 0 o:depends("auto_update", 1) -s = m:section(TypedSection, "shunt_rules", "Xray/V2ray" .. translate("Shunt") .. translate("Rule")) +s = m:section(TypedSection, "shunt_rules", "Xray" .. translate("Shunt") .. translate("Rule")) s.template = "cbi/tblsection" s.anonymous = false s.addremove = true diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua index ce6b3cc34f..94af7757c6 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua @@ -1,7 +1,7 @@ local d = require "luci.dispatcher" local appname = "passwall" -m = Map(appname, "Xray/V2ray" .. translate("Shunt") .. translate("Rule")) +m = Map(appname, "Xray" .. translate("Shunt") .. translate("Rule")) m.redirect = d.build_url("admin", "services", appname) s = m:section(NamedSection, arg[1], "shunt_rules", "") diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua index dd9e62994c..e7372f7e26 100755 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/app.lua @@ -112,9 +112,6 @@ local function start() elseif type == "Xray" then config = require("luci.model.cbi.passwall.server.api.xray").gen_config(user) bin = ln_start(_api.get_xray_path(), "xray", "-config=" .. config_file, log_path) - elseif type == "V2ray" then - config = require("luci.model.cbi.passwall.server.api.v2ray").gen_config(user) - bin = ln_start(_api.get_v2ray_path(), "v2ray", "-config=" .. config_file, log_path) elseif type == "Trojan" then config = require("luci.model.cbi.passwall.server.api.trojan").gen_config(user) bin = ln_start("/usr/sbin/trojan", "trojan", "-c " .. config_file, log_path) diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua deleted file mode 100644 index d4da4ab8fa..0000000000 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/api/v2ray.lua +++ /dev/null @@ -1,177 +0,0 @@ -module("luci.model.cbi.passwall.server.api.v2ray", package.seeall) -local ucic = require"luci.model.uci".cursor() - -function gen_config(user) - local settings = nil - local routing = nil - local outbounds = { - {protocol = "freedom", tag = "direct"}, {protocol = "blackhole", tag = "blocked"} - } - - if user.protocol == "vmess" or user.protocol == "vless" then - if user.uuid then - local clients = {} - for i = 1, #user.uuid do - clients[i] = { - id = user.uuid[i], - flow = user.flow or nil, - level = tonumber(user.level), - alterId = tonumber(user.alter_id) - } - end - settings = { - clients = clients, - decryption = user.decryption or "none" - } - end - elseif user.protocol == "socks" then - settings = { - auth = (user.auth and user.auth == "1") and "password" or "noauth", - accounts = (user.auth and user.auth == "1") and { - { - user = user.username, - pass = user.password - } - } - } - elseif user.protocol == "http" then - settings = { - allowTransparent = false, - accounts = (user.auth and user.auth == "1") and { - { - user = user.username, - pass = user.password - } - } - } - user.transport = "tcp" - user.tcp_guise = "none" - elseif user.protocol == "shadowsocks" then - settings = { - method = user.method, - password = user.password, - level = tonumber(user.level) or 1, - network = user.ss_network or "TCP,UDP" - } - elseif user.protocol == "trojan" then - if user.uuid then - local clients = {} - for i = 1, #user.uuid do - clients[i] = { - password = user.uuid[i], - level = tonumber(user.level) - } - end - settings = { - clients = clients - } - end - elseif user.protocol == "mtproto" then - settings = { - users = { - { - level = tonumber(user.level) or 1, - secret = (user.password == nil) and "" or user.password - } - } - } - end - - routing = { - domainStrategy = "IPOnDemand", - rules = { - { - type = "field", - ip = {"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"}, - outboundTag = (user.accept_lan == nil or user.accept_lan == "0") and "blocked" or "direct" - } - } - } - - if user.transit_node and user.transit_node ~= "nil" then - local gen_v2ray = require("luci.model.cbi.passwall.api.gen_v2ray") - local client = gen_v2ray.gen_outbound(ucic:get_all("passwall", user.transit_node), "transit") - table.insert(outbounds, 1, client) - end - - local config = { - log = { - -- error = "/var/etc/passwall_server/log/" .. user[".name"] .. ".log", - loglevel = (user.log and user.log == "1") and user.loglevel or "none" - }, - -- 传入连接 - inbounds = { - { - listen = (user.bind_local == "1") and "127.0.0.1" or nil, - port = tonumber(user.port), - protocol = user.protocol, - settings = settings, - streamSettings = { - network = user.transport, - security = "none", - tlsSettings = (user.tls and user.tls == "1") and { - disableSystemRoot = false, - certificates = { - { - certificateFile = user.tls_certificateFile, - keyFile = user.tls_keyFile - } - } - } or nil, - tcpSettings = (user.transport == "tcp") and { - header = { - type = user.tcp_guise, - request = (user.tcp_guise == "http") and { - path = user.tcp_guise_http_path or {"/"}, - headers = { - Host = user.tcp_guise_http_host or {} - } - } or nil - } - } or nil, - kcpSettings = (user.transport == "mkcp") and { - mtu = tonumber(user.mkcp_mtu), - tti = tonumber(user.mkcp_tti), - uplinkCapacity = tonumber(user.mkcp_uplinkCapacity), - downlinkCapacity = tonumber(user.mkcp_downlinkCapacity), - congestion = (user.mkcp_congestion == "1") and true or false, - readBufferSize = tonumber(user.mkcp_readBufferSize), - writeBufferSize = tonumber(user.mkcp_writeBufferSize), - seed = (user.mkcp_seed and user.mkcp_seed ~= "") and user.mkcp_seed or nil, - header = {type = user.mkcp_guise} - } or nil, - wsSettings = (user.transport == "ws") and { - acceptProxyProtocol = false, - headers = (user.ws_host) and {Host = user.ws_host} or nil, - path = user.ws_path - } or nil, - httpSettings = (user.transport == "h2") and { - path = user.h2_path, host = user.h2_host - } or nil, - dsSettings = (user.transport == "ds") and { - path = user.ds_path - } or nil, - quicSettings = (user.transport == "quic") and { - security = user.quic_security, - key = user.quic_key, - header = {type = user.quic_guise} - } or nil - } - } - }, - -- 传出连接 - outbounds = outbounds, - routing = routing - } - - if user.tls and user.tls == "1" then - config.inbounds[1].streamSettings.security = "tls" - end - - if user.transport == "mkcp" or user.transport == "quic" then - config.inbounds[1].streamSettings.security = "none" - config.inbounds[1].streamSettings.tlsSettings = nil - end - - return config -end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua index 21020bced7..b452a89512 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua @@ -47,7 +47,7 @@ e = t:option(DummyValue, "type", translate("Type")) e.cfgvalue = function(t, n) local v = Value.cfgvalue(t, n) if v then - if v == "Xray" or v == "V2ray" then + if v == "Xray" then local protocol = m:get(n, "protocol") return v .. " -> " .. protocol end diff --git a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua index 863cc07131..bd2df888d8 100644 --- a/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua +++ b/package/lienol/luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua @@ -80,9 +80,6 @@ end if api.is_finded("xray") then type:value("Xray", translate("Xray")) end -if api.is_finded("v2ray") then - type:value("V2ray", translate("V2ray")) -end if api.is_finded("brook") then type:value("Brook", translate("Brook")) end @@ -107,7 +104,6 @@ protocol:value("shadowsocks", "Shadowsocks") protocol:value("trojan", "Trojan") protocol:value("mtproto", "MTProto") protocol:depends("type", "Xray") -protocol:depends("type", "V2ray") -- Brook协议 brook_protocol = s:option(ListValue, "brook_protocol", translate("Protocol")) @@ -142,8 +138,6 @@ end auth:depends("type", "Socks") auth:depends({ type = "Xray", protocol = "socks" }) auth:depends({ type = "Xray", protocol = "http" }) -auth:depends({ type = "V2ray", protocol = "socks" }) -auth:depends({ type = "V2ray", protocol = "http" }) username = s:option(Value, "username", translate("Username")) username:depends("auth", "1") @@ -155,11 +149,9 @@ password:depends("type", "SS") password:depends("type", "SSR") password:depends("type", "Brook") password:depends({ type = "Xray", protocol = "shadowsocks" }) -password:depends({ type = "V2ray", protocol = "shadowsocks" }) mtproto_password = s:option(Value, "mtproto_password", translate("Password"), translate("The MTProto protocol must be 32 characters and can only contain characters from 0 to 9 and a to f.")) mtproto_password:depends({ type = "Xray", protocol = "mtproto" }) -mtproto_password:depends({ type = "V2ray", protocol = "mtproto" }) mtproto_password.default = arg[1] function mtproto_password.cfgvalue(self, section) return m:get(section, "password") @@ -171,7 +163,6 @@ end decryption = s:option(Value, "decryption", translate("Encrypt Method")) decryption.default = "none" decryption:depends({ type = "Xray", protocol = "vless" }) -decryption:depends({ type = "V2ray", protocol = "vless" }) ss_encrypt_method = s:option(ListValue, "ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(ss_encrypt_method_list) do ss_encrypt_method:value(t) end @@ -196,7 +187,6 @@ end v_ss_encrypt_method = s:option(ListValue, "v_ss_encrypt_method", translate("Encrypt Method")) for a, t in ipairs(v_ss_encrypt_method_list) do v_ss_encrypt_method:value(t) end v_ss_encrypt_method:depends({ type = "Xray", protocol = "shadowsocks" }) -v_ss_encrypt_method:depends({ type = "V2ray", protocol = "shadowsocks" }) function v_ss_encrypt_method.cfgvalue(self, section) return m:get(section, "method") end @@ -210,7 +200,6 @@ ss_network:value("tcp", "TCP") ss_network:value("udp", "UDP") ss_network:value("tcp,udp", "TCP,UDP") ss_network:depends({ type = "Xray", protocol = "shadowsocks" }) -ss_network:depends({ type = "V2ray", protocol = "shadowsocks" }) ssr_protocol = s:option(ListValue, "ssr_protocol", translate("Protocol")) for a, t in ipairs(ssr_protocol_list) do ssr_protocol:value(t) end @@ -250,16 +239,12 @@ end uuid:depends({ type = "Xray", protocol = "vmess" }) uuid:depends({ type = "Xray", protocol = "vless" }) uuid:depends({ type = "Xray", protocol = "trojan" }) -uuid:depends({ type = "V2ray", protocol = "vmess" }) -uuid:depends({ type = "V2ray", protocol = "vless" }) -uuid:depends({ type = "V2ray", protocol = "trojan" }) uuid:depends("type", "Trojan") uuid:depends("type", "Trojan-Go") uuid:depends("type", "Trojan-Plus") alter_id = s:option(Value, "alter_id", translate("Alter ID")) alter_id:depends({ type = "Xray", protocol = "vmess" }) -alter_id:depends({ type = "V2ray", protocol = "vmess" }) level = s:option(Value, "level", translate("User Level")) level:depends({ type = "Xray", protocol = "vmess" }) @@ -267,11 +252,6 @@ level:depends({ type = "Xray", protocol = "vless" }) level:depends({ type = "Xray", protocol = "shadowsocks" }) level:depends({ type = "Xray", protocol = "trojan" }) level:depends({ type = "Xray", protocol = "mtproto" }) -level:depends({ type = "V2ray", protocol = "vmess" }) -level:depends({ type = "V2ray", protocol = "vless" }) -level:depends({ type = "V2ray", protocol = "shadowsocks" }) -level:depends({ type = "V2ray", protocol = "trojan" }) -level:depends({ type = "V2ray", protocol = "mtproto" }) tls = s:option(Flag, "tls", translate("TLS")) tls.default = 0 @@ -296,10 +276,6 @@ tls:depends({ type = "Xray", protocol = "vless" }) tls:depends({ type = "Xray", protocol = "socks" }) tls:depends({ type = "Xray", protocol = "shadowsocks" }) tls:depends({ type = "Xray", protocol = "trojan" }) -tls:depends({ type = "V2ray", protocol = "vmess" }) -tls:depends({ type = "V2ray", protocol = "vless" }) -tls:depends({ type = "V2ray", protocol = "socks" }) -tls:depends({ type = "V2ray", protocol = "shadowsocks" }) tls:depends("type", "Trojan") tls:depends("type", "Trojan-Plus") tls:depends("type", "Trojan-Go") @@ -374,11 +350,6 @@ transport:depends({ type = "Xray", protocol = "vless" }) transport:depends({ type = "Xray", protocol = "socks" }) transport:depends({ type = "Xray", protocol = "shadowsocks" }) transport:depends({ type = "Xray", protocol = "trojan" }) -transport:depends({ type = "V2ray", protocol = "vmess" }) -transport:depends({ type = "V2ray", protocol = "vless" }) -transport:depends({ type = "V2ray", protocol = "socks" }) -transport:depends({ type = "V2ray", protocol = "shadowsocks" }) -transport:depends({ type = "V2ray", protocol = "trojan" }) trojan_transport = s:option(ListValue, "trojan_transport", translate("Transport")) trojan_transport:value("original", "Original") @@ -512,15 +483,11 @@ quic_guise:depends("transport", "quic") acceptProxyProtocol = s:option(Flag, "acceptProxyProtocol", translate("acceptProxyProtocol"), translate("Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.")) acceptProxyProtocol:depends({ type = "Xray", transport = "tcp" }) acceptProxyProtocol:depends({ type = "Xray", transport = "ws" }) -acceptProxyProtocol:depends({ type = "V2ray", transport = "tcp" }) -acceptProxyProtocol:depends({ type = "V2ray", transport = "ws" }) -- [[ Fallback部分 ]]-- fallback = s:option(Flag, "fallback", translate("Fallback")) fallback:depends({ type = "Xray", protocol = "vless", transport = "tcp" }) fallback:depends({ type = "Xray", protocol = "trojan", transport = "tcp" }) -fallback:depends({ type = "V2ray", protocol = "vless", transport = "tcp" }) -fallback:depends({ type = "V2ray", protocol = "trojan", transport = "tcp" }) --[[ fallback_alpn = s:option(Value, "fallback_alpn", "Fallback alpn") @@ -580,17 +547,15 @@ remote_port:depends("remote_enable", 1) bind_local = s:option(Flag, "bind_local", translate("Bind Local"), translate("When selected, it can only be accessed locally, It is recommended to turn on when using reverse proxies or be fallback.")) bind_local.default = "0" bind_local:depends("type", "Xray") -bind_local:depends("type", "V2ray") accept_lan = s:option(Flag, "accept_lan", translate("Accept LAN Access"), translate("When selected, it can accessed lan , this will not be safe!")) accept_lan.default = "0" accept_lan.rmempty = false accept_lan:depends("type", "Xray") -accept_lan:depends("type", "V2ray") local nodes_table = {} for k, e in ipairs(api.get_valid_nodes()) do - if e.node_type == "normal" and e.type == "Xray" or e.type == "V2ray" then + if e.node_type == "normal" and e.type == "Xray" then nodes_table[#nodes_table + 1] = { id = e[".name"], remarks = e.remarks_name @@ -603,7 +568,6 @@ transit_node:value("nil", translate("Close")) for k, v in pairs(nodes_table) do transit_node:value(v.id, v.remarks) end transit_node.default = "nil" transit_node:depends("type", "Xray") -transit_node:depends("type", "V2ray") log = s:option(Flag, "log", translate("Enable") .. translate("Log")) log.default = "1" @@ -616,7 +580,6 @@ loglevel:value("info") loglevel:value("warning") loglevel:value("error") loglevel:depends({ type = "Xray", log = true }) -loglevel:depends({ type = "V2ray", log = true }) trojan_loglevel = s:option(ListValue, "trojan_loglevel", translate("Log Level")) trojan_loglevel.default = "2" diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/app_update/v2ray_version.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/app_update/v2ray_version.htm deleted file mode 100644 index 467a5ad229..0000000000 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/app_update/v2ray_version.htm +++ /dev/null @@ -1,172 +0,0 @@ -<% -local v2ray_version = require "luci.model.cbi.passwall.api.api".get_v2ray_version() --%> - - - -
- -
-
- 【 <%=v2ray_version%> 】 - - -
-
-
\ No newline at end of file diff --git a/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm b/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm index c22b9b4883..75aa1eb9b7 100644 --- a/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm +++ b/package/lienol/luci-app-passwall/luasrc/view/passwall/node_list/link_share_man.htm @@ -1,8 +1,6 @@ <%+cbi/valueheader%> <% local dsp = require "luci.dispatcher" -local api = require "luci.model.cbi.passwall.api.api" - -%>