Files
yakpanel-core/class/public/__pycache__/common.cpython-314.pyc

2943 lines
399 KiB
Plaintext
Raw Normal View History

2026-04-07 02:04:22 +05:30
+
<00><><EFBFBD>i<EFBFBD><69><00> <00>b<00>^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RIt^RI t ^RI
t
^RI t ^RI t ^RI t ^RIt^RIt^RIt^RIt^RIt^RIHt^RIHtHtHt^RIt^RIt^RIt^RIHt^RI5^RIHtH t ^RI!5^RI"H#t#^RI$H%t%H&t&]'t'](t(R t)R
t*]PTPW]*4'd<>],!]*R R R 7;_uu_4t-]-P]4t/RRR4Rt0/t1]PTPW]04'd<>],!]0R R R 7;_uu_4t2]Pf!]2P]44t1]1PiRR4'g])!4t1RRR4]/]1R&],!]0RR R 7;_uu_4t2]2Pk]Pl!]1^R74RRR4M]Pn!RRR.R7t8]8Ps4]8Pt:Rs;Rs<Rs=]P|^,^8Xd]?!]4]P<>!R4M^RIH?t?RtAER>RRlltBER?RRlltCER@RRlltD^/3RltER tFERAR!ltG^/3R"ltH/^3R#ltIR$tJR%tKR&tLR'tMR(tNR)tOERBR*ltPERBR+ltQERBR,ltRERBR-ltSERBR.ltTERCR0ltUERBR1ltVERBR2ltWR3tXR4tY!R5R64tZR7t[R8t\ERBR9lt]ERDR:lt^ERDR;lt_R<t`R=taR>tbR?tcR@tdRAteRBtfRCtgRDthREtiRFtjERBRGltkERBRHltlERBRIltmRJtnRKtoRLtpRMtqRNtrEREROltsRPttRQtuRRtvRStwERFRTltxRUtyRVtzRWt{RXt|ERGRYlt}ERHRZlt~R[tERIR\R]llt<>ERFR^R_llt<>ERFR`Rallt<>ERJRblt<>Rct<>Rdt<>ERKRelt<>ERLRflt<>Rgt<>Rht<>Rit<>Rjt<>Rkt<>Rlt<>Rmt<>ERMRnlt<>Rot<>ERNRplt<>Rqt<>RrRslt<>RtRult<>Rvt<>Rwt<>RxRylt<>Rzt<>R{R|lt<>R}R~lt<>Rt<>R<EFBFBD>R<>lt<>R<EFBFBD>R<>lt<>EROR<4F>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>R<>lt<>ERPR<50>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERQR<51>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERMR<4D>lt<>ERMR<4D>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERQR<51>lt<>ERRR<52>lt<>ERQR<51>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERSR<53>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>.3R<>lt<>.3R<>lt<>ERQR<51>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERQR<51>lt<>R<EFBFBD>t<>ERRR<52>lt<>R<EFBFBD>t<>R<EFBFBD>t<>ERTR<54>lt<>R<EFBFBD>t<>R<EFBFBD>t<>ERQR<51>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>ERUR<55>lt<>R<EFBFBD>t<>ERQR<51>lt<>R<EFBFBD>t<>R<EFBFBD>t<>ERVR<56>lt<>ERFR<46>lt<>ERWR<57>lt<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>t<>R<EFBFBD>EtR<>EtERXR<58>lEtR<>EtR<>EtR<>EtR<>EtR<>EtR<>EtR<>Et R<>Et
ERYR<59>lEt R<>Et R<>Et R<>EtR<>EtR<>EtR<>EtR<>EtR<>EtR<>EtR<>EtR<>EtERMR<4D>lEtERQERlEtERQERlEtEREtEREtEREtERZERlEtERFERlEtEREtERER lEt ER
ER lEt!ER ER lEt"ERERlEt#EREt$EREt%EREt&ERDERlEt'EREt(EREt)EREt*EREt+ER[ERlEt,^] EPZ] EP\,3ERlEt/EREt0EREt1EREt2EREt3ERQERlEt4EREt5ER Et6ER!Et7ER"Et8ER#Et9ER$Et:ER%Et;ER&Et<ERFER'lEt=ER(Et>ER\ER)lEt?]
EP<>!ER*4EtA]
EP<>!ER+4EtB.ER]OEtC!ER,ER-4EtD!ER.ER/4EtEER^ER0lEtFER_ER1lEtGER_ER2lEtHER_ER3lEtIER_ER4lEtJERQER5lEtKER6EtLER7EtMER8EtNER9EtOERDER:lEtPER;EtQER`ER<lEtRER=EtSER>EtTER`ER?lEtUER@EtVERaERAlEtWERBEtXERCEtYERDEtZEREEt[ERFEt\ERGEt]ERHEt^ERQERIlEt_ERJEt`ERKEtaERLEtbERMEtcERNEtdEROEteERbERPlEtfERbERQlEtgERcERRlEthERbERSlEti/RR3ERTlEtjERd.3ERUlEtkERd.3ERVlEtl.^R/3ERWlEtm.3ERXlEtnERYERZlEtoER[EtpER\EtqER]EtrER^EtsER_EttER`EtuERaEtvERbEtwERcEtxERdEtyEReERelEtzERfEt{ERNERglEt|ERhEt}ERiEt~ERMERjlEtERkEt<>ERlEt<>ERmEt<>ERnEt<>ERoEt<>ERpEt<>ERqEt<>ERFERrlEt<>ERsEt<>ERtEt<>ERuEt<>ERvEt<>ERwEt<>ERxEt<>ERyEt<>ERzEt<>ER{Et<>ER|Et<>ERIER}lEt<>REs<>ER~Et<>EREt<>ERfER<>lEt<>ER<>Et<>ERgER<>lEt<>ERQER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>.3ER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ERQER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>tbER<>Et<>ER<>Et<>ERhER<>lEt<>ERiER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ERLER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ERjER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ERkER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ERQER<>lEt<>ER<>Et<>ER<>Et<>ERlER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>Et<>ER<>ER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ERmER<>lEt<>ERQER<>lEt<>ER<>Et<>ERIER<>ER<>llEt<>ER<>Et<>ERQER<>lEt<>ER<>ER<>lEt<>ER<>Et<>ERQER<>lEt<>ER<>Et<>ER<>Et<>ER<>Et<>ERQER<>lEt<>ER<>ER<>lEtER<>ER<>lEtER<>EtER<>EtER<>EtER<>EtER<>EtERnER<>ER<>llEtER<>EtER<>Et ER<>Et
ER<>Et ER<>Et ERoER<>lEt ERoER<>lEtERERlEtERgERlEtERpERlEtERgERlEtERERlEt]EP(ER4EtERER lEtER
ER lEt^ER I/EHEtERqER lEtERt/EREtEREtEREtEREtERERlEtERERlEtERrERERllEt ERrERERllEt!ERLERERllEt"ERsERERllEt#EREt$ERtER lEt%ER!Et&ER"Et'ER#Et(ER$Et)ERQER%ER&llEt*ER'ER(lEt+ER)Et,ER*ER+lEt-ERuER,ER-llEt.ER.ER/lEt/ER0ER1lEt0ERvER2ER3llEt1ER4Et2ER5Et3ER6ER7lEt4ER8ER9lEt5ER:ER;lEt6ERFER<lEt7ER=Et8R# +'giE L;i +'giE L<>;i +'giE Lz;i E L<>;i(w<00>N)<01>datetime)<03>Any<6E>List<73>Set)<01>
PanelError)<01>*)<02>Db<44>
SqliteEasy)<01> is_number)<02>Param<61> trim_filterc<00><><00>RRRRRRRRRRR/RR RR RR
RR /RR RR RRRR/RRRRRRRR/RRRRRRRR/RRRRRRRR/RRRRRRRR/RRRRRR RR!/RR"RR#RR$RR$/RR%RR&RR'RR'/.
/#)(<28>default<6C>en<65> languages<65>name<6D>google<6C>title<6C>English<73>cnu英语<E88BB1>de<64>Deutschu德语<E5BEB7>fra<72>fru Françaisu法语<E6B395>spa<70>esuEspañolu 西班牙语<E78999>ptu
Portuguêsu 葡萄牙语<E78999>vie<69>viuTiếng Việtu 越南语<E58D97>ind<6E>idzBahasa Indonesiau 印尼语<E5B0BC>ruuРусскийu俄语<E4BF84>zhzzh-cnu 简体中文<E4B8AD>chtzzh-twu 繁體中文<E4B8AD>r%<00><00>=C:\wwwroot\yakpanel.com\YakPanel-master\class\public\common.py<70>default_languages_configr((s)<00><00> <15>t<EFBFBD> <17><1A>D<EFBFBD><1C>d<EFBFBD><1B>Y<EFBFBD><18>(<28> <12><1B>D<EFBFBD><1C>d<EFBFBD><1B>Y<EFBFBD><18>(<28> <12><1B>E<EFBFBD><1C>d<EFBFBD><1B>[<5B><18>(<28> <12><1B>E<EFBFBD><1C>d<EFBFBD><1B>Z<EFBFBD><18>.<2E> <12><1B>D<EFBFBD><1C>d<EFBFBD><1B>\<5C><18>.<2E> <12><1B>E<EFBFBD><1C>d<EFBFBD><1B>-<2D><18>+<2B> <12><1B>E<EFBFBD><1C>d<EFBFBD><1B>/<2F><18>+<2B> <12> <1B>D<EFBFBD><1C>d<EFBFBD><1B>-<2D><18>(<28> <12><1B>D<EFBFBD><1C>g<EFBFBD><1B>^<5E><18>.<2E> <12><1B>E<EFBFBD><1C>g<EFBFBD><1B>^<5E><18>.<2E> <12>m<<0E>?
<EFBFBD>?
r&z0/www/server/panel/YakPanel/languages/language.pl<70>r<>utf-8<><01>encoding<6E>2/www/server/panel/YakPanel/languages/settings.jsonrr<00>w)<01>indentrz2/www/server/panel/YakPanel/static/language/gettext)<02> localedirr<00>utf8)<01>reloadc<04><><00>^RIpVP4;_uu_4pVPV4uuRRR4# +'giR#;i)u<>
@name 访问面板数据库
@author hwliang<hwl@yakpanel.com>
@table 被访问的表名(必需)
@return db.Sql object
ps: 默认访问data/default.db
N)<03>db<64>Sql<71>table)r6r4<00>sqls& r'<00>Mr8<00>s,<00><00><0E> <0B><16><16><18><18>S<EFBFBD><12>y<EFBFBD>y<EFBFBD><15><1F>
<12><18><18><18>s <00>9<05> A
c<00>f<00>V^8<>dQhR\P\,R\R\/#)<04><00>
table_name<EFBFBD>db_name<6D>return)<04>typing<6E>Optional<61>strr
)<01>formats"r'<00> __annotate__rB<00>s*<00><00><11><11>&<26>/<2F>/<2F>#<23>&<26><11><03><11>J<EFBFBD>r&c<00><><00>^RIHpV!V4P4pVeG\V4P 4R8wd)VP \V4P 44V#)<03><00>r <00>)<06> sqlite_easyr <00>queryr@<00>stripr6)r;r<r rHs&& r'<00>SrJ<00>sO<00><00><1F> <0E>w<EFBFBD>K<EFBFBD> <1D> <1D> <1F>E<EFBFBD><11><1D>#<23>j<EFBFBD>/<2F>"7<>"7<>"9<>R<EFBFBD>"?<3F> <0A> <0B> <0B>C<EFBFBD>
<EFBFBD>O<EFBFBD>)<29>)<29>+<2B>,<2C> <10>Lr&c<00>0<00>V^8<>dQhR\R\/#<00>r:r<r=)r@r )rAs"r'rBrB<00>s<00><00><17><17><03><17>B<EFBFBD>r&c<00><00>\V4#<00>NrE<00>r<s&r'<00>
SqliteConnrP<00>s <00><00> <0A>g<EFBFBD>;<3B>r&c<00><><00>V^8<>dQhR\P\,R\R\P\,R\/#)r:r<<00>db_user<65>db_pwd<77>db_host)r>r?r@)rAs"r'rBrB<00>sE<00><00>D<01>D<01>v<EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>+<2B>D<01>S<EFBFBD>D<01>SY<53>Sb<53>Sb<53>cf<63>Sg<53>D<01>y|<7C>Dr&c<00> <00>^RIHpV!WW#4#)r)<01>PanelMysqlWithContext)<02>panel_mysql_v2rV)r<rRrSrTrVs&&&& r'<00> MysqlConnrX<00>s<00><00>4<> <20><17>6<EFBFBD> C<>Cr&c<04><><00>VPR4R8Xd\4'dR#^RIpVPWVRR7pVP^8XdV'dR#VP
pV#VP
p?V#)u<>
@name 发送GET请求
@author hwliang<hwl@yakpanel.com>
@url 被请求的URL地址(必需)
@timeout 超时时间默认60秒
@return string
<EFBFBD>api/user/loginFN)<03>timeout<75>headers<72>verify<66><79><EFBFBD><EFBFBD><EFBFBD>)<06>find<6E>is_local<61> http_requests<74>get<65> status_code<64>text)<06>urlr[r\ra<00>res<65>s_bodys&&& r'<00>HttpGetrh<00>si<00><00> <0B>x<EFBFBD>x<EFBFBD> <20>!<21>R<EFBFBD>'<27> <13>:<3A>:<3A>e<EFBFBD><18>
<17>
<1B>
<1B>C<EFBFBD>'<27>%<25>
<1B>
P<EFBFBD>C<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>!<21><1B> <12>5<EFBFBD><14><18><18><06><15> <0A> <10>X<EFBFBD>X<EFBFBD>F<EFBFBD> <0B> <11>Mr&c<04>b<00>RpVPV4R8XdV#Rp\PPV4'gV#\P
!\ V44pRV/pVF8pVPW74p\W<>V4p V 'gK*\RV4V u# V# Tu#;i)u
@name Get方式使用优选节点访问官网
@author hwliang<hwl@yakpanel.com>
@param url 当前官网URL地址
@param timeout 用于测试超时时间
@param ex 上一次错误的响应内容
@return string 响应内容
如果已经是优选节点将直接返回ex
<EFBFBD>www.yakpanel.comzconfig/hosts.json<6F>hostzdata/home_host.plr^)
r_<00>os<6F>path<74>exists<74>json<6F>loads<64>readFile<6C>replacerh<00> writeFile)
rer[<00>ex<65>home<6D>
hosts_file<EFBFBD>hostsr\rk<00>new_urlrfs
&&& r'<00> http_get_homerys<><00><00><12>!<21><04> <0E>8<EFBFBD>8<EFBFBD>D<EFBFBD>><3E>R<EFBFBD> <1F><02><19>(<28>
<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>j<EFBFBD>)<29>)<29>"<22>9<EFBFBD><14>
<EFBFBD>
<EFBFBD>8<EFBFBD>J<EFBFBD>/<2F>0<><05><19>4<EFBFBD>.<2E><07><19>D<EFBFBD><19>k<EFBFBD>k<EFBFBD>$<24>-<2D>G<EFBFBD><19>'<27>G<EFBFBD>4<>C<EFBFBD><12>s<EFBFBD><19>-<2D>t<EFBFBD>4<><1A>
<EFBFBD> <1A><12> <09><><12><11> <09>s)<00>B(<00>&B(<00>B(<00>A
B(<00>B(<00>$B(<00>(B.c<00><00>\W4#rN)rh)rer[s&&r'<00>httpGetr{9s <00><00> <12>3<EFBFBD> <20> r&c<04><><00>VPR4R8Xd\4'dR#^RIpVPWW#R7pVP^8XdV'dR#VP
pV#VP
pV#)u<>
发送POST请求
@url 被请求的URL地址(必需)
@data POST参数可以是字符串或字典(必需)
@timeout 超时时间默认60秒
return string
rZFN<46><03>datar[r\r^)r_r`ra<00>postrcrd)rer~r[r\rarfrgs&&&& r'<00>HttpPostr<74>=sf<00><00> <0B>x<EFBFBD>x<EFBFBD> <20>!<21>R<EFBFBD>'<27> <13>:<3A>:<3A><18><18>
<17>
<1C>
<1C>S<EFBFBD>W<EFBFBD>
<1C>
N<EFBFBD>C<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>!<21><1B> <12><18><14><18><18><06><15> <0A> <10>X<EFBFBD>X<EFBFBD>F<EFBFBD> <11>Mr&c<04><00>\WW24#)u<>
@name 发送POST请求
@author hwliang<hwl@yakpanel.com>
@param url 被请求的URL地址(必需)
@param data POST参数可以是字符串或字典(必需)
@param timeout 超时时间默认60秒
@return string
)r<>)rer~r\r[s&&&&r'<00>httpPostr<74>Ts<00><00> <14>C<EFBFBD>w<EFBFBD> 0<>0r&c<00><00>R#<00>Tr%r%r&r'<00>
check_homer<EFBFBD>`s<00><00> r&c<04><><00>\V4\8wdVP4p^RIpVP 4pVP V4VP 4#)un
@name 生成MD5
@author hwliang<hwl@yakpanel.com>
@param strings 要被处理的字符串
@return string(32)
N)<07>type<70>bytes<65>encode<64>hashlib<69>md5<64>update<74> hexdigest)<03>stringsr<73><00>ms& r'<00>Md5r<35>dsB<00><00> <0C>G<EFBFBD>}<7D><05><1D><19>.<2E>.<2E>"<22><07><12><0F> <0B> <0B> <0A>A<EFBFBD><05>H<EFBFBD>H<EFBFBD>W<EFBFBD><15> <0C>;<3B>;<3B>=<3D>r&c<00><00>\V4#rN)r<>)r<>s&r'r<>r<>ss <00><00> <0E>w<EFBFBD><<3C>r&c<04>,<00>\PPV4'gR#^RIpVP 4p\ VR4pVP R4pV'gMVPV4K.VP4VP4#)ur
@name 生成文件的MD5
@author hwliang<hwl@yakpanel.com>
@param filename 文件名
@return string(32) or False
FN<EFBFBD>rbi<62>)
rlrm<00>isfiler<65>r<><00>open<65>readr<64><00>closer<65>)<05>filenamer<65><00>my_hash<73>f<>bs& r'<00>FileMd5r<35>wsm<00><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD><12><15>k<EFBFBD>k<EFBFBD>m<EFBFBD>G<EFBFBD> <0C>X<EFBFBD>t<EFBFBD><1C>A<EFBFBD>
<0E> <0A>F<EFBFBD>F<EFBFBD>4<EFBFBD>L<EFBFBD><01><10> <11><0F><0E><0E>q<EFBFBD><19><05>G<EFBFBD>G<EFBFBD>I<EFBFBD> <12> <1C> <1C> <1E>r&c<04><><00>^RIHpRpRp\V4^,
pV!4p\V4F"pW#VP ^V4,, pK$ V#)ut
@name 取随机字符串
@author hwliang<hwl@yakpanel.com>
@param length 要获取的长度
@return string(length)
)<01>RandomrF<00>>AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789)<05>randomr<6D><00>len<65>range<67>randint)<07>lengthr<68>r<><00>chars<72>chrlenr<6E><00>is& r'<00>GetRandomStringr<67><00>sP<00><00><1E><10>G<EFBFBD> L<>E<EFBFBD> <10><15>Z<EFBFBD>!<21>^<5E>F<EFBFBD> <13>X<EFBFBD>F<EFBFBD> <12>6<EFBFBD>]<5D><01><0F><16><1E><1E><01>6<EFBFBD>2<>3<>3<><07><1B> <12>Nr&c<04><><00>^RIp\P\P,pRP VP W R74#)u<>
@name 取随机字符串(仅小写字母和数字)
@author hwliang<hwl@yakpanel.com>
@param length 要获取的长度
@return string(length)
NrF)<01>k)r<><00>string<6E>ascii_lowercase<73>digits<74>join<69>choices)r<>r<>r<>s& r'<00>GetRandomAlnumLowerr<72><00>s5<00><00><12> <12> "<22> "<22>V<EFBFBD>]<5D>]<5D> 2<>E<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>6<EFBFBD>><3E>><3E>%<25>><3E>2<> 3<>3r&c<04>,<00>\\WV44#<00>u<>
@name 取通用Json返回
@author hwliang<hwl@yakpanel.com>
@param status 返回状态
@param msg 返回消息
@return string(json)
)<02>GetJson<6F>return_msg_gettext<78><03>status<75>msg<73>argss&&&r'<00>
ReturnJsonr<EFBFBD><00>s<00><00> <13>%<25>f<EFBFBD>4<EFBFBD>8<> 9<>9r&c<04><00>\WV4#r<>)r<>r<>s&&&r'<00>
returnJsonr<EFBFBD><00>s<00><00> <16>f<EFBFBD>4<EFBFBD> (<28>(r&c<04><><00>\P!\R\4,R,44pTP 4p\ T4\ 8XdbY9d\Y1,p\\T44F;pR\ T^,4,R,pTPYbT,4pK= RTRT/# /pL<>;i)<07><>
@name 取通用dict返回
@author hwliang<hwl@yakpanel.com>
@param status 返回状态
@param msg 返回消息
@return dict {"status":bool,"msg":string}
<EFBFBD>YakPanel/static/language/<2F> /public.json<6F>{<7B>}r<>r<>)
rorp<00>ReadFile<6C> GetLanguage<67>keysr<73>r@r<>r<>rr)r<>r<>r<><00> log_messager<65>r<><00>reps&&& r'<00> ReturnMsgr<67><00>s<><00><00><19><1A>j<EFBFBD>j<EFBFBD><18>*E<> <0B> <0A>*U<>Xf<58>*f<>!g<>h<> <0B> <17> <1B> <1B> <1D>D<EFBFBD> <0B>C<EFBFBD>y<EFBFBD>C<EFBFBD><17> <0E>;<3B><1D>"<22>C<EFBFBD><1A>3<EFBFBD>t<EFBFBD>9<EFBFBD>%<25><01><19>C<EFBFBD><01>A<EFBFBD><05>J<EFBFBD>&<26><13>,<2C><03><19>k<EFBFBD>k<EFBFBD>#<23>A<EFBFBD>w<EFBFBD>/<2F><03>&<26> <15>f<EFBFBD>e<EFBFBD>S<EFBFBD> )<29>)<29><><19><18> <0B>s <00>5C<00>Cc<04>$<00>\W4pRVRV/#)u;
@name 取通用dict返回
@author hwliang
@date 2022.9.20
r<EFBFBD>r<><00><01> gettext_msgr<67>s&&&r'r<>r<><00>s<00><00> <16>c<EFBFBD>
<20>C<EFBFBD> <14>f<EFBFBD>e<EFBFBD>S<EFBFBD> )<29>)r&c<04><00>\WV4#)r<>)r<>r<>s&&&r'<00> returnMsgr<67><00>s<00><00> <15>V<EFBFBD>$<24> '<27>'r&rFc<04><><00>^RIHp\VR4'dRVnT^8XEd<>RTR\ \ P !44R//p\P!\R\4,R,44pTP4p \T4\8XdoY)9d\Y<>,p\\T44F;p
R \T
^,4,R
,p TP!Y<>T
,4pK= Y'R,R &T#\T4\
8XdY'R,R &T#\T4\"8XdY'R,R &T#\T4\$8XdY'R,R &T#\T4\&8XdY'R&T#\T4\(8XdY'R&T#\T4\*8XdY'R&T#Y'R&T#T^8XdFRTR\ \ P !44R//p\T4\8Xd Y'R,R &T#R # \dELi;i /pEL<>;i /TR&T#;i) u<>
@name 统一请求响应函数
@author hezhihong
@param status 返回状态
@param message 返回消息
@return dict {"status":0/-1,"message":any}/下载对象
)<01>g<>return_messageTr<54><00> timestamp<6D>messager<65>r<>r<>r<><00>resultN)<16>flaskr<6B><00>hasattrr<72><00> Exception<6F>int<6E>timerorpr<>r<>r<>r<>r@r<>r<>rr<00>bool<6F>float<61>dict<63>list<73>tuple) r<><00>typesr<73>r<><00>play<61>requestsr<73>r<>r<>r<>r<>r<>s &&&&&& r'r<>r<><00>sD<00><00><18> <0A> <12>1<EFBFBD>&<26> '<27> '<27>#<23>A<EFBFBD> <1C> <0A><01>z<EFBFBD>"<22>F<EFBFBD>K<EFBFBD><13>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>[<5B>9I<39>9<EFBFBD>VX<56>Y<><0E> <1D><1E>*<2A>*<2A>X<EFBFBD>.I<>K<EFBFBD>M<EFBFBD>.Y<>\j<>.j<>%k<>l<>K<EFBFBD><1B><1F><1F>!<21><04> <0F><07>=<3D>C<EFBFBD> <1F><16><EFBFBD>%<25>.<2E><07><1E>s<EFBFBD>4<EFBFBD>y<EFBFBD>)<29>A<EFBFBD><1D><03>A<EFBFBD><01>E<EFBFBD>
<EFBFBD>*<2A>S<EFBFBD>0<>C<EFBFBD>%<25>o<EFBFBD>o<EFBFBD>c<EFBFBD><01>7<EFBFBD>;<3B>G<EFBFBD>*<2A> 3:<3A>9<EFBFBD> %<25>h<EFBFBD> /<2F>$<1E><1D>#<12>'<27>]<5D>c<EFBFBD> !<21>29<32>9<EFBFBD> %<25>h<EFBFBD> /<2F> <1E><1D><12>'<27>]<5D>d<EFBFBD> "<22>29<32>9<EFBFBD> %<25>h<EFBFBD> /<2F><1E><1D><12>'<27>]<5D>e<EFBFBD> #<23>29<32>9<EFBFBD> %<25>h<EFBFBD> /<2F><1E><1D><12>'<27>]<5D>d<EFBFBD> "<22>(/<2F>9<EFBFBD> %<25><1E><1D><12>'<27>]<5D>d<EFBFBD> "<22>(/<2F>9<EFBFBD> %<25><1E><1D><12>'<27>]<5D>e<EFBFBD> #<23>(/<2F>9<EFBFBD> %<25> <1E><1D>  /<2F>,3<>y<EFBFBD>)<29><1E><1D>.
<0F>!<21><1A>"<22>F<EFBFBD>K<EFBFBD><13>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>[<5B>9I<39>9<EFBFBD>VX<56>Y<><0E> <0F><07>=<3D>C<EFBFBD> <1F>29<32>9<EFBFBD> %<25>h<EFBFBD> /<2F><1D><1D>
<14><> <15> <0A> <0C> <0A><> <1D><1C>K<EFBFBD><4B>6 /<2F>,.<2E><0E>y<EFBFBD>)<29><1D><1D>s)<00>H<00>5H-<00>H7<00> H*<03>)H*<03>-H4<03>7Ic<04>^<00>\V\4'd \W4p\^^V4#)u<>
@name V2版本的成功响应函数
@author Zhj<2024-06-05>
@param res<any> 响应数据
@param format_args<tuple> 响应文本提示时的format参数
@return dict
<EFBFBD><04>
isinstancer@r<>r<><00>rf<00> format_argss&&r'<00>
success_v2r<EFBFBD>Cs*<00><00><12>#<23>s<EFBFBD><1B><1B><19>#<23>+<2B><03> <19>!<21>Q<EFBFBD><03> $<24>$r&c<04>^<00>\V\4'd \W4p\R^V4#)u<>
@name V2版本的失败响应函数
@author Zhj<2024-06-05>
@param res<any> 响应数据
@param format_args<tuple> 响应文本提示时的format参数
@return dict
r^r<>r<>s&&r'<00>fail_v2r<32>Ss*<00><00><12>#<23>s<EFBFBD><1B><1B><19>#<23>+<2B><03> <19>"<22>a<EFBFBD><13> %<25>%r&c<04>t<00>\P!V4p\\VP4RR4pV#)u<>
@name 取文件权限字符串
@author hwliang<hwl@yakpanel.com>
@param filename 文件全路径
@return string 如644/777/755
N<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)rl<00>statr@<00>oct<63>st_mode)r<>r<><00>accepts& r'<00> GetFileModer<65>bs1<00><00> <0E>7<EFBFBD>7<EFBFBD>8<EFBFBD> <1C>D<EFBFBD> <10><13>T<EFBFBD>\<5C>\<5C>"<22>2<EFBFBD>3<EFBFBD>'<27> (<28>F<EFBFBD> <11>Mr&c<04>f<00>^RIp/p\PPV4'gR#\P!V4p\ \ VP4RR4VR&VPVP4PVR&V# \ TP4TR&T#;i)u取文件或目录权限信息N<E681AF>mode<64>userr<72>) <0B>pwdrlrmrnr<>r@r<>r<><00>getpwuid<69>st_uid<69>pw_name)rmr<>r~r<>s& r'<00>get_mode_and_userr<72>ns<><00><00><0E> <0A>D<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><04> <0A>7<EFBFBD>7<EFBFBD>4<EFBFBD>=<3D>D<EFBFBD><16>s<EFBFBD>4<EFBFBD><<3C><<3C>(<28><12><13>-<2D>.<2E>D<EFBFBD><16>L<EFBFBD>(<28><1A>|<7C>|<7C>D<EFBFBD>K<EFBFBD>K<EFBFBD>0<>8<>8<><04>V<EFBFBD> <0C> <10>K<EFBFBD><4B>(<28><1A>4<EFBFBD>;<3B>;<3B>'<27><04>V<EFBFBD> <0C> <0F>K<EFBFBD>s <00>)(B<00>B0c<00>,a<00>]tRtRtoRtRtRtVtR#)<06>ijsoni|c<08>.<00>\P!V4#rN)rorp<00><02>selfr~s&&r'rp<00> ijson.loads}s<00><00><13>z<EFBFBD>z<EFBFBD>$<24><1F>r&c
<08><><00>\P!V4# \P!TRR7u#;i \P!RRRR\T4,/4u#;i)F<><01> ensure_asciir<69>r<>zwrong response: %s)ro<00>dumpsr@r<>s&&r'r<00> ijson.dumps<70>s^<00><00> Z<01> <<3C><1B>z<EFBFBD>z<EFBFBD>$<24>'<27>'<27><> <<3C><1B>z<EFBFBD>z<EFBFBD>$<24>U<EFBFBD>;<3B>;<3B><> Z<01><17>:<3A>:<3A>x<EFBFBD><15><05>7K<37>c<EFBFBD>RV<52>i<EFBFBD>7W<37>X<>Y<> Y<>s<00><00>5<03>8<00>8<00>,A&r%N)<08>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__rpr<00>__static_attributes__<5F>__classdictcell__<5F><01> __classdict__s@r'r<>r<>|s<00><><00><00> <20>Z<01>Zr&r<>c<04>v<00>V\8XdVPR4p\4pVPV4p?V#)uG
将对象转换为JSON
@data 被转换的对象(dict/list/str/int...)
r*)r<><00>decoder<65>r)r~<00> ijson_objs& r'r<>r<><00>s5<00><00>
 <0C>u<EFBFBD>}<7D>T<EFBFBD>[<5B>[<5B><17>1<>d<EFBFBD><15><07>I<EFBFBD> <14>?<3F>?<3F>4<EFBFBD> <20>D<EFBFBD> <12> <0F>Kr&c<00><00>\V4#rN)r<><00>r~s&r'<00>getJsonr<00>s <00><00> <12>4<EFBFBD>=<3D>r&c<00>^<00>\V4P!V!pV# T#;i Tuu#;irN)<02>_rA<00>r<>r<>s&&r'r<>r<><00>s4<00><00><13><0F><03>f<EFBFBD>m<EFBFBD>m<EFBFBD>T<EFBFBD>"<22><03><13>
<EFBFBD><EFBFBD> <0A> <0C><12>
<EFBFBD><EFBFBD>s<EFBFBD>
<EFBFBD>s<00><00>"<03>%<00>%<00>,c<00><><00>\W4p^RIp^RIp^RIpRp^pRp V'g9^RIHp
RV
9d+V
R,pV
R,pV
P R4^8XdR#VP4p VP!RVP!44p W<>\V4\W,4V 3p V PR 4PR
V 4pR# Lw;i R#;i) rN<>systemrF<00><01>session<6F>username<6D>uid<69>debug<75> %Y-%m-%d %X<>logs<67>uid,username,type,log,addtime)r<>r<>r4ro<00>YakPanelrrbr5<00>strftime<6D> localtimer<00>
xssencode2r6<00>add)r<><00>logmsgr<67><00>not_webr<62>r4rorr<00>tmp_msgrr7<00>mDater~r<>s&&&& r'<00>write_log_gettextr&<00>s<><00><00> <18><16> &<26>F<EFBFBD> <0A><1D><1D><1B><08><0F><03><14><07><16> <15>,<2C><1D><17>(<28>&<26>z<EFBFBD>2<>H<EFBFBD>!<21>%<25>.<2E>C<EFBFBD><1E>{<7B>{<7B>7<EFBFBD>+<2B>q<EFBFBD>0<>&<26><11>f<EFBFBD>f<EFBFBD>h<EFBFBD><03><14> <0A> <0A>m<EFBFBD>T<EFBFBD>^<5E>^<5E>-=<3D>><3E><05><13>q<EFBFBD><14>w<EFBFBD>
<EFBFBD>6<EFBFBD>3C<EFBFBD>(D<>e<EFBFBD>L<><04><14><19><19>6<EFBFBD>"<22>&<26>&<26>'F<><04>M<><06><>  <15><14><>
 <0A> <0C>s#<00>C<00>5C<00>A1C<00>C<03>C<00>Cc<00>n<00>^RIp^RIp^RIpRp^pRp V'g9^RIHp
RV
9d+V
R,pV
R,pV
P R4^8XdR#\ 'g2VP!\R\4,R ,44s\ P4p W9da\ V,p\\V44F;p R
\V ^,4,R ,p VPW<>V ,4pK= W 9d\ V,pR X
9dR PV
R ,V4pTP!4pTP"!RTP$!44pY<>YT ,T3pTP'R4P)RT4pT# ELQ;i Lm;i R#;i)rNrrFrrrrr<>z /log.jsonr<6E>r<><00> login_addressz{} {}rrr)r<>r4rorrrb<00>_LAN_LOGrpr<>r<>r<>r<>r<>r@rrrAr5rrr6r!)r<><00>logMsgr<67>r#r<>r4rorrr$rr<>r<>r<>r7r%r~r<>s&&&& r'<00>WriteLogr+<00>sv<00><00>$<14><1D><1D><1B><08><0F><03><14><07><16> <15>,<2C><1D><17>(<28>&<26>z<EFBFBD>2<>H<EFBFBD>!<21>%<25>.<2E>C<EFBFBD><1E>{<7B>{<7B>7<EFBFBD>+<2B>q<EFBFBD>0<>&<26><18>x<EFBFBD><1B>z<EFBFBD>z<EFBFBD>(<28>+F<><1B><1D>+V<>Yd<59>+d<>"e<>f<>H<EFBFBD><17>}<7D>}<7D><EFBFBD><04> <11>><3E><1D>f<EFBFBD>%<25>F<EFBFBD><1A>3<EFBFBD>t<EFBFBD>9<EFBFBD>%<25><01><19>C<EFBFBD><01>A<EFBFBD><05>J<EFBFBD>&<26><13>,<2C><03><1F><1E><1E><03>!<21>W<EFBFBD>5<><06>&<26> <10><<3C><08><14><0E><14> <11><1E>'<27>)<29> <20><1E><1E><07><0F>(@<40>&<26>I<><06><11>f<EFBFBD>f<EFBFBD>h<EFBFBD><03><14> <0A> <0A>m<EFBFBD>T<EFBFBD>^<5E>^<5E>-=<3D>><3E><05><13>t<EFBFBD>g<EFBFBD>%5<>u<EFBFBD>=<3D><04><14><19><19>6<EFBFBD>"<22>&<26>&<26>'F<><04>M<><06><15> <0A><>- <15><14><> <11> <10><><14><13>sB<00>F/<00>5F <00> F/<00> B>F/<00> F(<00>?A F/<00> F%<03>"F/<00>(F,<03>*F/<00>/F4c<04><00>\R4#)u
取语言
<EFBFBD>language)<01>GetConfigValuer%r&r'r<>r<><00>s<00><00> <1A>*<2A> %<25>%r&c<00><00>\4#rN)r<>r%r&r'<00> get_languager0<00><00>
<00><00> <16>=<3D>r&c<00>r<00>\R4pT;'gRP4;'gR# R#;i)<03> data/port.plrF<00>7800)rqrI)<01>ps r'<00>get_panel_portr6<00>s6<00><00><16> <14>^<5E> $<24><01><11><07><07>R<EFBFBD><EFBFBD><EFBFBD> <20>*<2A>*<2A>F<EFBFBD>*<2A><><16><15>s<00>1<00>1<00>1<00>6c<00>4<00>RP\44#)zhttp://127.0.0.1:{})rAr6r%r&r'<00>PanelHttpOriginr8<00>s<00><00> <20> '<27> '<27><0E>(8<> 9<>9r&c<00><><00>\4pV'gR#VPRR4p\V\4'dV#\ V4P 4R9# R#;i)T<> self_hosted<65><04>1<>true<75>yes<65>on)<06> GetConfigrbr<>r<>r@<00>lower)<02>c<>vs r'<00>is_self_hostedrD<00>sV<00><00> <14> <15>K<EFBFBD><01><10><17> <0A>E<EFBFBD>E<EFBFBD>-<2D><14> &<26><01> <15>a<EFBFBD><14> <1E> <1E><14>H<EFBFBD><12>1<EFBFBD>v<EFBFBD>|<7C>|<7C>~<7E>!;<3B>;<3B>;<3B><><14><13>s<00>A<00>)A<00>A<00>A!c<04><><00>\4pV'g;RRRRRRRRR R
R R R RRRRRRRRRRR/ p\R\P!V44VR8XdcVP RR4p\ V\ 4'dV'd \4#\V4P4R9d \4#WP49g&VR8Xd\4'd \4#R#R#W,#)u
取配置值
<EFBFBD>productz Linux panel<65>
setup_path<EFBFBD> /www/server<65>openlitespeed_pathz
/usr/localr-rrzYakPanel Linux panel<65>brandr<00> root_path<74>/www<77>templater<00> logs_path<74> /www/wwwlogsru<00>https://www.yakpanel.comr:T<> recycle_binz$/www/server/panel/config/config.json<6F>downloadzhttp://node.yakpanel.comNr;) r@rsrorrbr<>r<>r8r@rAr<>rD)<03>key<65>configrCs& r'r.r. s<><00><00><17>[<5B>F<EFBFBD> <11><1B>]<5D>L<EFBFBD>-<2D>I]<5D>_k<5F> <13>Y<EFBFBD><07>)?<3F><17>*<2A>Va<56>ci<63> <13>Y<EFBFBD> <0B>^<5E>V<EFBFBD>E_<45> <16><04>m<EFBFBD>T<EFBFBD>3<><06> <12>8<><14><1A><1A>F<EFBFBD>9K<39>L<>
<EFBFBD>f<EFBFBD>}<7D> <12>J<EFBFBD>J<EFBFBD>}<7D>d<EFBFBD> +<2B><01> <15>a<EFBFBD><14> <1E> <1E>1<EFBFBD>"<22>$<24> $<24> <0E>q<EFBFBD>6<EFBFBD><<3C><<3C>><3E>7<> 7<>"<22>$<24> $<24> <0E>+<2B>+<2B>-<2D> <1F> <0E>*<2A> <1C><1D><1F><1F>&<26>(<28>(<28>-<2D><13> <11>;<3B>r&c<00>8<00>\4pWV&\V4R#rN)r@<00> WriteConfig)rS<00>valuerTs&& r'<00>SetConfigValuerX#s<00><00> <16>[<5B>F<EFBFBD><17>3<EFBFBD>K<EFBFBD><0F><06>r&c<04><><00>Rp\PPV4'g/#\V4pV'g/#\P
!V4#)u
取所有配置项
<EFBFBD>config/config.json<6F>rlrmrnr<>rorp)rm<00>f_bodys r'r@r@)s?<00><00> <20>D<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><02><19> <15>d<EFBFBD>^<5E>F<EFBFBD> <11>"<22>9<EFBFBD> <0F>:<3A>:<3A>f<EFBFBD> <1D>r&c<00>J<00>Rp\V\P!V44R#)rZN)<03> WriteFileror)rTrms& r'rVrV4s<00><00> <1F>D<EFBFBD> <0A>d<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>v<EFBFBD>&<26>'r&c<04><><00>\'g6\P!\R\ 4,R,44s\P 4pRpW9d\V,pV#)u
取提示消息
r<EFBFBD>z/template.jsonN)<06> _LAN_TEMPLATErorpr<>r<>r<>)rSr<>r<>s& r'<00>GetLanra9sQ<00><00>
<19>=<3D><1C>
<EFBFBD>
<EFBFBD>8<EFBFBD>,G<>+<2B>-<2D>,W<>Zj<5A>,j<>#k<>l<> <0A> <18> <1D> <1D> <1F>D<EFBFBD>
<0E>C<EFBFBD>
<EFBFBD>{<7B><1B>C<EFBFBD> <20><03> <0E>Jr&c<00><00>\V4#rN)ra<00>rSs&r'<00>getLanrdGs <00><00> <11>#<23>;<3B>r&c<00><><00>\'g6\P!\R\ 4,R,44s\P 4pRpW9da\V,p\ \V44F;pR\V^,4,R,pVPWQV,4pK= V# Tu#;i)r<>r<>Nr<4E>r<>)
<EFBFBD> _LAN_PUBLICrorpr<>r<>r<>r<>r<>r@rr)rSr<>r<>r<>r<>r<>s&& r'<00>GetMsgrgKs<><00><00> <13><1A>{<7B><1E>*<2A>*<2A>X<EFBFBD>.I<>K<EFBFBD>M<EFBFBD>.Y<>\j<>.j<>%k<>l<>K<EFBFBD><1A><1F><1F>!<21><04><12><03> <0E>;<3B><1D>c<EFBFBD>"<22>C<EFBFBD><1A>3<EFBFBD>t<EFBFBD>9<EFBFBD>%<25><01><19>C<EFBFBD><01>A<EFBFBD><05>J<EFBFBD>&<26><13>,<2C><03><19>k<EFBFBD>k<EFBFBD>#<23>A<EFBFBD>w<EFBFBD>/<2F><03>&<26><13>
<EFBFBD><EFBFBD><13><12>
<EFBFBD>s<00> C<00>B2C<00>Cc<00><00>\W4#rNr<>rs&&r'<00>get_msg_gettextri\s <00><00> <16>s<EFBFBD> !<21>!r&c<00><00>\W4#rN)rg)rSr<>s&&r'<00>getMsgrk`s <00><00> <11>#<23> <1C>r&c<00>4<00>^RIHpV!4'dd^RIHpVPP R4pV'd:\ V4P4P4pVR 9d VR8XdR#V#R P\44pR
P\44pR p\PPV4'dM\PPV4'g&\PPV4'dR#\PPV4'dRpV#\PPV4'dRpV#RpV# \dRpEL|i;i \dELi;i) r)<01>has_request_contextc<00><00>R#<00>Fr%r%r&r'<00><lambda><3E>GetWebServer.<locals>.<lambda>js<00><00>er&<00><01>requestzAap-Web-Server<65>nginx<6E>apache<68> openlitespeed<65>ols<6C>{}/nginx/sbin/nginx<6E>{}/apache/bin/apachectl<74>/usr/local/lsws/bin/lswsctrl)rtrurvrw)r<>rmr<>rsr\rbr@rIrArA<00>get_setup_pathrlrmrn)rmrs<00>
header_valrC<00> nginxSbin<69> apacheBin<69>olsBin<69> webservers r'<00> GetWebServerr<72>esJ<00><00>,<2C>-<2D><1B><1C><1C> <11> %<25> <20><1F><1F>,<2C>,<2C>-=<3D>><3E>J<EFBFBD><19><17>
<EFBFBD>O<EFBFBD>)<29>)<29>+<2B>1<>1<>3<><01><14>C<>C<><18>E<EFBFBD>z<EFBFBD>.<2E><1C>H<EFBFBD>&<26>,<2C>,<2C>^<5E>-=<3D>><3E>I<EFBFBD>)<29>0<>0<><1E>1A<31>B<>I<EFBFBD> +<2B>F<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20>b<EFBFBD>g<EFBFBD>g<EFBFBD>n<EFBFBD>n<EFBFBD>Y<EFBFBD>&?<3F>&?<3F>2<EFBFBD>7<EFBFBD>7<EFBFBD>><3E>><3E>RX<52>CY<43>CY<43><16> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20><1C> <09> <15><14>
<0C><17><17><1E><1E><06> <1F> <1F>#<23> <09> <15><14><1C> <09> <14><14><>A <15>,<2C>+<2B><1B>,<2C><><19> <11> <10> <11>s-<00>E3<00>(F<00>5F<00>6F<00>3F<03>F<03> F<03>Fc<00><00>\4#rN)r<>r%r&r'<00> get_webserverr<72><00>s
<00><00> <17>><3E>r&c<00>&<00>\4p\4pV R2RR3V R2RR3R.pRpV'dtVFkwrEp\PP V4'gK-\ V4pRV9gKAV^,P R4R 8wgK`\ V4pKm V#VFhwrEp\PP V4'gK-\ V4pRV9d)V^,P R4R 8wd \ V4pV# V#)
z/nginx/sbin/nginxz/etc/init.d/nginx reloadz4pkill -9 nginx && sleep 1 && /etc/init.d/nginx startz/apache/bin/apachectl<74>/etc/init.d/httpd reloadNrtz nginx.pid)rzz#/usr/local/lsws/bin/lswsctrl reloadNr^)<07>get_multi_webservice_statusr{rlrmrn<00> ExecShellr_)<07>is_multirG<00>servicesr<73>rm<00>cmd<6D>err_cmds r'<00> ServiceReloadr<64><00>s<00><00>*<2A>,<2C>H<EFBFBD><1F>!<21>J<EFBFBD>
<1A>l<EFBFBD>+<2B> ,<2C> &<26> B<>
<EFBFBD> <1A>l<EFBFBD>/<2F> 0<> &<26> <10>
<EFBFBD>

<EFBFBD><06>H<EFBFBD>&<12>F<EFBFBD><0F>"*<2A> <1E>D<EFBFBD>w<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>#<23>#<23>"<22>3<EFBFBD><1E><06><1A>d<EFBFBD>?<3F>v<EFBFBD>a<EFBFBD>y<EFBFBD>~<7E>~<7E>k<EFBFBD>'B<>b<EFBFBD>'H<>&<26>w<EFBFBD>/<2F>F<EFBFBD> #+<2B>" <12>M<EFBFBD>#+<2B> <1E>D<EFBFBD>w<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>#<23>#<23>"<22>3<EFBFBD><1E><06><1A>d<EFBFBD>?<3F>v<EFBFBD>a<EFBFBD>y<EFBFBD>~<7E>~<7E>k<EFBFBD>'B<>b<EFBFBD>'H<>&<26>w<EFBFBD>/<2F>F<EFBFBD><15> <11>M<EFBFBD>#+<2B> <12>Mr&c<00><00>\4#rN)r<>r%r&r'<00> serviceReloadr<64><00>s
<00><00> <18>?<3F>r&c<04>raa<05>^RIpVPV4pVPoVPoVV3RlpV#)u<>
@name 获取指定执行用户预处理函数
@author hwliang<2021-08-19>
@param run_user<string> 运行用户
@return 预处理函数
Nc<00>`<<02>\P!S4\P!S4R#rN)rl<00>setgid<69>setuid)<02>gidrs<00><>r'<00>_exec_rn<72> get_preexec_fn.<locals>._exec_rn<72>s<00><><00>
<EFBFBD> <09> <09>#<23><0E>
<EFBFBD> <09> <09>#<23>r&)r<><00>getpwnam<61>pw_uid<69>pw_gid)<06>run_userr<72><00>pidr<64>r<>rs& @@r'<00>get_preexec_fnr<6E><00>s4<00><><00><0F>
<0A>,<2C>,<2C>x<EFBFBD>
<20>C<EFBFBD>
<0A>*<2A>*<2A>C<EFBFBD>
<0A>*<2A>*<2A>C<EFBFBD><17> <14>Or&c <04>X<00>RpRp^RIp^RIp Rp
Rp V'd\V4p
Rp \V4p V P!RRRRV ,V R 7p V P!RRR
RV ,V R 7pVP VR V^<5E>W<EFBFBD>W4V
R 7 pV'd<>^pR pVP 4R8Xdo\P!V4VV, pVV8<>gK=VP'gVP4V P'gV P4R#MVP4VP^4V P^4V P4pVP4pVP'gVP4V P'gV P4\T4\ 8XdTP#R4p\T4\ 8XdTP#R4pYg3# R\43u#;i \%T4p\%T4pYg3#;i)u<>
@name 执行命令
@author hwliang<2021-08-19>
@param cmdstring 命令 [必传]
@param timeout 超时时间
@param shell 是否通过shell运行
@param cwd 进入的目录
@param env 环境变量
@param user 执行用户名
@return 命令执行结果
rFNz/dev/shm<68>/tmp<6D><00>wb+<2B>_succ<63>btex_)<05>max_sizer<65><00>suffix<69>prefix<69>dir<69>_errT)<08> close_fds<64>shell<6C>bufsize<7A>stdout<75>stderr<72>cwd<77>env<6E>
preexec_fng{<14>G<EFBFBD>z<EFBFBD>?z Timed outr*)<13>
subprocess<EFBFBD>tempfiler<65>r<><00>SpooledTemporaryFile<6C>Popen<65>pollr<6C><00>sleep<65>closedr<64><00>wait<69>seekr<6B><00>get_error_infor<6F>r<>r r@)<12> cmdstringr[r<>r<>r<>r<><00>a<>er<65>r<>r<><00>tmp_dir<69>rx<72>succ_f<5F>err_f<5F>sub<75>s<>ds&&&&&& r'r<>r<><00>s<><00><00> <0B>A<EFBFBD>
<EFBFBD>A<EFBFBD><1F><15>J<EFBFBD><18>G<EFBFBD> <0B>#<23>D<EFBFBD>)<29>
<EFBFBD><18><07>$<24> <10><19>^<5E><02><19>.<2E>.<2E><04>5<EFBFBD>QX<51>ah<61>km<6B>am<61>3:<3A><<3C><06><18>-<2D>-<2D>t<EFBFBD>%<25>PV<50>_f<5F>ik<69>_k<5F>29<32>;<3B><05><18><1E><1E>y<EFBFBD>D<EFBFBD><05>s<EFBFBD>[a<>#&<26>J<EFBFBD><1F>H<01><03> <12><11>A<EFBFBD><14>A<EFBFBD><15>(<28>(<28>*<2A><04>$<24><14>
<EFBFBD>
<EFBFBD>1<EFBFBD> <0A><11>Q<EFBFBD><06><01><14><07><<3C> <20><<3C><<3C><<3C><15><1B><1B><1D>!<21>=<3D>=<3D>=<3D>&<26>,<2C>,<2C>.<2E>&<26> %<25> <10>H<EFBFBD>H<EFBFBD>J<EFBFBD> <0A>
<EFBFBD>
<EFBFBD>1<EFBFBD> <0A><0E> <0B> <0B>A<EFBFBD><0E> <12>K<EFBFBD>K<EFBFBD>M<EFBFBD><01> <11>J<EFBFBD>J<EFBFBD>L<EFBFBD><01><14>|<7C>|<7C>|<7C>U<EFBFBD>[<5B>[<5B>]<5D><15>}<7D>}<7D>}<7D>f<EFBFBD>l<EFBFBD>l<EFBFBD>n<EFBFBD><13> <0F><01>7<EFBFBD>e<EFBFBD> <1B><11><18><18>'<27>!2<>Q<EFBFBD> <0F><01>7<EFBFBD>e<EFBFBD> <1B><11><18><18>'<27>!2<>Q<EFBFBD>
<0A>4<EFBFBD>K<EFBFBD><4B>$<24><11>><3E>#<23>#<23>#<23><>
<13> <0F><01>F<EFBFBD><01> <0F><01>F<EFBFBD><01> <0C>4<EFBFBD>K<EFBFBD>s><00>B#G:<00>G:<00>!!G:<00>G:<00>A$G:<00>:!G:<00>G:<00>-A
H <00>:H
<03> H)c<00><><00>Rp\V4pV'g<>\4'd+\4p\V4'gRp\ Y4M<>Rp\ V4p\ V\4'd5\PVPR44P^4pM$\PV4P^4p\ W4\ V\4'dVP4p\V4pV'g \4#V# RpL<>;i \d<>p\4'd4\4p\T4'd\ Y4TuRp?#Rp?R#RP\!44p\ T4p\ Y4TuRp?# \4uuRp?#;iRp?ii;i)zdata/iplist.txt<78> 127.0.0.1zhttps://ifconfig.me/ipr*Nz{}/api/common/getClientIP)rqrD<00>GetHost<73>check_ipr^rhr<>r<><00>
match_ipv4<EFBFBD>matchr <00>groupr@rIr<>rA<00>OfficialApiBase)r<><00> ipaddressre<00>m_str<74>c_ipr<70>s r'<00>
GetLocalIpr<EFBFBD>sc<00><00> <20>H<EFBFBD>%<1D><1C>X<EFBFBD>&<26> <09><18><1D><1F><1F>,<2C> '<27> <09>I<EFBFBD>#<23>I<EFBFBD>.<2E>.<2E>$/<2F> <09><1A>(<28>.<2E>.<2E><03><1F><03> <0C><05><1D>e<EFBFBD>U<EFBFBD>+<2B>+<2B> *<2A> 0<> 0<><15><1C><1C>g<EFBFBD>1F<31> G<> M<> M<>a<EFBFBD> P<>I<EFBFBD> *<2A> 0<> 0<><15> 7<> =<3D> =<3D>a<EFBFBD> @<40>I<EFBFBD><19>(<28>.<2E> <15>i<EFBFBD><13> %<25> %<25>!<21><0F><0F>)<29>I<EFBFBD><17> <09>"<22><04><13>G<EFBFBD>I<EFBFBD>%<25><18><18><>,<2C> +<2B>I<EFBFBD><49> <15> <1D> <1D><1D><1F><1F>#<23>I<EFBFBD> <09><1B>I<EFBFBD>&<26>&<26><1D>h<EFBFBD>2<>$<24>$<24>"<22>-<2D>4<>4<>_<EFBFBD>5F<35>G<>C<EFBFBD><1F><03> <0C>I<EFBFBD> <15>h<EFBFBD> *<2A><1C> <1C><> <1D><1A>9<EFBFBD> <1C><> <1D>s_<00>#D%<00>D<00>CD%<00>D%<00>D"<03> D%<00>% G<03>17F*<02>(G<03>40F*<02>$G<03>* F=<05>6G<03>7G<03>=G<03>Gc<04>F<00>\PV4'gR#\P!\PV4R# \
d9\P !T4R# \PdR#i;i\PdR#i;i)uY
@name 是否是IPV4地址
@author hwliang
@param ip<string> IP地址
@return True/False
FT)r<>r<><00>socket<65> inet_pton<6F>AF_INET<45>AttributeError<6F> inet_aton<6F>error<6F><01>ips&r'<00>is_ipv4r<34>>s<><00><00> <16> <1B> <1B>B<EFBFBD> <1F> <1F><14><15><0E><18><18><16><1E><1E><12>,<2C> <10><> <1A><19> <19> <12> <1C> <1C>R<EFBFBD> <20>
<10><> <16>|<7C>|<7C> <19><18> <19><> <11><<3C><<3C><15><14><15>s5<00>%A<00> B <03>A+<02>+B<05>B <03>B<05>B <03>B <03>B c<04><><00>\PV4'gR#\P!\PV4R# \P
dR#i;i)uW
@name 是否为IPv6地址
@author hwliang
@param ip<string> 地址
@return True/False
FT)<06>
match_ipv6r<EFBFBD>r<>r<><00>AF_INET6r<36>r<>s&r'<00>is_ipv6r<36>VsN<00><00> <16> <1B> <1B>B<EFBFBD> <1F> <1F><14><15><0E><18><18><16><1F><1F>"<22>-<2D> <10><> <12><<3C><<3C><15><14><15>s<00>%A<00>A<03>Ac<00>><00>\V4;'g \V4#rN)r<>r<>r<>s&r'r<>r<>is<00><00> <12>2<EFBFBD>;<3B> %<25> %<25>'<27>"<22>+<2B>%r&c<00>><00>^RIHpVPPR4pV'd\P V4'gRpV'gJVP 'd8\PVP 4pV'dV^,^,pV'g!R\R4P4,pVPR4R 8Xd
VR, pTPR4pT'd
TR ,#RPT^R 4# RpL<;i)
rrrrkrFz
127.0.0.1:r3<00>:z:80z127.0.0.1:7800r^)r<>rsr\rb<00>match_based_hostr<74><00>url_root<6F> find_url_root<6F>findallrqrIr_<00>splitr<74>)<05>portrs<00>host_tmp<6D>tmp<6D>hs& r'r<>r<>ms<><00><00><1D><16><EFBFBD><EFBFBD>"<22>"<22>6<EFBFBD>*<2A>H<EFBFBD><10><1F>%<25>%<25>h<EFBFBD>/<2F>/<2F><19>H<EFBFBD> <13> <12> <1B> <1B> <1B><1F>'<27>'<27><07>(8<>(8<>9<>C<EFBFBD><12>s<EFBFBD>1<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>H<EFBFBD> <13><1F>(<28>><3E>":<3A>"@<40>"@<40>"B<>B<><08>$<24> <13>=<3D>=<3D><13> <1D><12> #<23>X<EFBFBD><15>%6<>X<EFBFBD> <11><0E><0E>s<EFBFBD><1B>A<EFBFBD> <0B>A<EFBFBD>b<EFBFBD>E<EFBFBD>\<5C> <0E>8<EFBFBD>8<EFBFBD>A<EFBFBD>a<EFBFBD><02>G<EFBFBD> <1C><1C><> $<24>#<23><08>s <00>D<00>Dc<00>p<00>^RIHpVPPRR4p\ V4'gR#V#)rrrz::ffff:rFzUnknown IP address)r<>rs<00> remote_addrrrr<>)rs<00>ipaddrs r'<00> GetClientIpr<70><00>s0<00><00><1D> <14> <20> <20> (<28> (<28><19>B<EFBFBD> 7<>F<EFBFBD> <13>F<EFBFBD> <1B> <1B>$8<> <11>Mr&c<04><><00>^RIHpVPPRR4pVR8XdVPPR4p\ V4#)u,
@name 获取客户端端口号
@return int
rrz X-Real-Port<72>0<> REMOTE_PORT)r<>rsr\rb<00>environr@)rsr<>s r'<00>get_remote_portr<74><00>sA<00><00>
<1E> <12>?<3F>?<3F> <1E> <1E>}<7D>c<EFBFBD> 2<>D<EFBFBD> <0B>s<EFBFBD>{<7B>7<EFBFBD>?<3F>?<3F>.<2E>.<2E>}<7D>=<3D>D<EFBFBD> <0E>t<EFBFBD>9<EFBFBD>r&c<00><00>\4#rN)r<>r%r&r'<00> get_client_ipr<70><00>r1r&c<00>
<00>^RIpVPP\4R,V,R,4'd\ R4R#\ RV,R,4\ RP V44R#)rNz/php/z /libphp5.sor<6F>z/etc/init.d/php-fpm-z reloadz/etc/init.d/php-fpm-{} start)rlrmrnr{r<>rA)<02>versionrls& r'<00> phpReloadr<64><00>sZ<00><00> <0A> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>n<EFBFBD>&<26><17>0<>7<EFBFBD>:<3A>]<5D>J<>K<>K<><11>,<2C>-<2D><11>(<28>7<EFBFBD>2<>Y<EFBFBD>><3E>?<3F><11>0<>7<>7<><07>@<40>Ar&c<00><><00>\P!4p\\W44pV\\P!4V,
R,R,
43# Ru#;i)<03><><00><>)rF)r<>r<>r{)rer[<00>startr<74>s&& r'<00> get_timeoutr<74><00>sR<00><00><18><14> <09> <09> <0B><05><14>W<EFBFBD>S<EFBFBD>*<2A>+<2B><06><15>s<EFBFBD>D<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD>%<25>/<2F>4<EFBFBD>7<>#<23>=<3D>><3E>><3E>><3E><><18><17><0F>s <00>AA <00> A&c<00>:<00>\4'd \4#R#<00>zhttps://node.yakpanel.com<6F>rDr8<00>r[s&r'<00>get_urlr<00><00><00><00><15><17><17><1E> <20> <20> &r&c
<00><><00>V'gV#\V4\8wdV#RRRR/RRRR/RRRR/RRRR /RR
RR /RR RR /RRRR/.pVF#pVPVR,VR,4pK% V#)r<><00><r)u<>>u<>'u<>"u<>&u<>#u)r<>r@rr)r~<00> checkListrCs& r'<00>
checkInputr
<00>s<><00><00> <0F><04><1B> <0B>D<EFBFBD>z<EFBFBD>S<EFBFBD><18><14>+<2B> <0C>c<EFBFBD>3<EFBFBD><05><1E> <0C>c<EFBFBD>3<EFBFBD><05><1E> <0C>d<EFBFBD>C<EFBFBD><15><1F> <0C>c<EFBFBD>3<EFBFBD><05><1E> <0C>c<EFBFBD>3<EFBFBD><05><1E> <0C>c<EFBFBD>3<EFBFBD><05><1E> <0C>c<EFBFBD>3<EFBFBD><05><1E><06>I<EFBFBD><17><01><13>|<7C>|<7C>A<EFBFBD>c<EFBFBD>F<EFBFBD>A<EFBFBD>c<EFBFBD>F<EFBFBD>+<2B><04><17> <0F>Kr&c<00>$<00>V^8<>dQhR\/#)r:<00>num<75>r<>)rAs"r'rBrB<00>s<00><00>J<12>J<12>3<EFBFBD>Jr&c<00>@<00>\PPV4'gR#\V4'gR#\P
^,pR pV^,
V,pWQ,p\ VR4pRpVPR^4VP^4R8XdVPR^4.p ^p
Rp ^p \V4EF1p \P\V4R4pVP4pVR8wd\W<>8<EFBFBD>dGW<>^,Rp\V4pV
V, p
W<EFBFBD>,
pV^8<>dVVRpV P^V4VRVpV ^, p M<>V^8XdRp M<>\RV4pVPV)^4VPV4pV^8XdVP!RRR 7pVV,pVPV)^4VV,
^8Xd
RV,pW<>8<EFBFBD>gEK"V 'dEK2M VP#4RP%V 4p\.P0!T4p\.P2!T4P54# EL;i \&P(!R
T4'dR#\+R P-Y44^,p\T4T8<>dTT)RpL<>;i T^8XdTP!R RR 7pM)TP7RRR 7P!RRR 7pM;iTP54# R#;i)rFr<><00>
TNFr<EFBFBD>r*<00>ignore<72><01>errorsz
[`\$\&\;]+z tail -n {} {}r1<00><00>r^)rlrmrnr <00>sys<79> version_infor<6F>r<>r<>r<>r@<00>rfind<6E>tellr<6C><00>insert<72>minr r<>r<><00>rer<65>r<>rArorrprIr<>)rmr r5<00> pyVersion<6F>max_len<65>
start_line<EFBFBD>count<6E>fp<66>bufr~<00> total_lenr<6E><00>nr<6E><00> newline_pos<6F>pos<6F>line<6E>line_len<65>sp_len<65>to_read<61>t_bufr<66>s&&& r'<00> GetNumLinesr*<00>s<><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><02> <14>S<EFBFBD>><3E>><3E><11><13> <20> <20><11>#<23>I<EFBFBD><1E>G<EFBFBD>5'<27><17>!<21>e<EFBFBD>s<EFBFBD>]<5D>
<EFBFBD><1A> <20><05> <11>$<24><04> <1D><02><10><03>
<EFBFBD><07><07><02>A<EFBFBD><0E> <0A>7<EFBFBD>7<EFBFBD>1<EFBFBD>:<3A><14> <1D>r<EFBFBD>w<EFBFBD>w<EFBFBD>r<EFBFBD>1<EFBFBD>~<7E><11><04><15> <09> <10><01> <0A><01><16>u<EFBFBD><1C>A<EFBFBD><16>!<21>i<EFBFBD>i<EFBFBD><03>C<EFBFBD><08>$<24>7<> <0B><18>g<EFBFBD>g<EFBFBD>i<EFBFBD><03><1E>"<22>$<24><18><EFBFBD>"<22><11>?<3F>#3<>4<><04>#&<26>t<EFBFBD>9<EFBFBD><08>!<21>X<EFBFBD>-<2D> <09>!*<2A>!4<><06>!<21>A<EFBFBD>:<3A>#'<27><06><07>=<3D>D<EFBFBD>!<21> <20>K<EFBFBD>K<EFBFBD><01>4<EFBFBD>0<><1E>l<EFBFBD>{<7B>+<2B>C<EFBFBD><15><11>F<EFBFBD>A<EFBFBD><19><1A>a<EFBFBD>x<EFBFBD>!<21><01><1D>!<21>$<24><03>n<EFBFBD>G<EFBFBD><16>G<EFBFBD>G<EFBFBD>W<EFBFBD>H<EFBFBD>a<EFBFBD>(<28><1E>G<EFBFBD>G<EFBFBD>G<EFBFBD>,<2C>E<EFBFBD> <20>A<EFBFBD>~<7E> %<25> <0C> <0C>W<EFBFBD>X<EFBFBD> <0C> F<><05><1F>#<23>+<2B>C<EFBFBD><16>G<EFBFBD>G<EFBFBD>W<EFBFBD>H<EFBFBD>a<EFBFBD>(<28><1A>W<EFBFBD>}<7D><01>)<29>"<22>S<EFBFBD>j<EFBFBD><03><1C>'<27><15><14>1<EFBFBD>e<EFBFBD>E<1E>F <0B><08><08>
<EFBFBD><15><19><19>4<EFBFBD><1F><06> <12> b<01><19>Z<EFBFBD>Z<EFBFBD><06>'<27>F<EFBFBD><17>:<3A>:<3A>f<EFBFBD>%<25>+<2B>+<2B>-<2D> -<2D><>A!<21> <20><>,'<27> <0A>8<EFBFBD>8<EFBFBD>M<EFBFBD>4<EFBFBD> (<28> (<28><12><1A>?<3F>1<>1<>#<23><<3C>=<3D>a<EFBFBD>@<40><06> <0E>v<EFBFBD>;<3B><17> <20><1B>W<EFBFBD>H<EFBFBD>I<EFBFBD>&<26>F<EFBFBD><46>  b<01><18>A<EFBFBD>~<7E><1F><1D><1D>v<EFBFBD>h<EFBFBD><1D>?<3F><06><1F><1D><1D>w<EFBFBD>x<EFBFBD><1D>@<40>G<>G<><07>X`<60>G<>a<><06><><15>|<7C>|<7C>~<7E><1D><><12><11>s\<00>C'I#<00>=I<02>BI#<00>.I#<00>:%I#<00>!9K<00>I <05>I#<00>#J><03>7J><03>L<03>L<00>$L<03>L<00>Lc<00>0<00>V^8<>dQhR\R\/#<00>r:r<><00>
using_gzip<EFBFBD>r@r<>)rAs"r'rBrBs<00><00> 1<> 1<>S<EFBFBD> 1<>d<EFBFBD> 1r&c#<00>T"<00>\PPV4'g\\ RV44h\
pV'd\ P
pV!VR4;_uu_4pVFpVPRR4x<00>K RRR4R# +'giR#;i5i)<05>file not found: {}r<>r*rN)rlrmrn<00>
ValueError<EFBFBD>langr<67><00>gzipr )r<>r-<00>open_fnrr%s&& r'<00>read_file_eachr5sx<00><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><18><14>2<>H<EFBFBD>=<3D>><3E>><3E><13>G<EFBFBD><12><16>)<29>)<29><07> <10><18>4<EFBFBD> <20> <20>B<EFBFBD><16>D<EFBFBD><16>+<2B>+<2B>g<EFBFBD>x<EFBFBD>0<> 0<><17>
!<21> <20> <20> <20>s$<00>AB(<01> !B(<01>,B<05>
B(<01> B% <09> B(c<00>0<00>V^8<>dQhR\R\/#r,r.)rAs"r'rBrB%s<00><00><<13><<13>S<EFBFBD><<13>d<EFBFBD><r&c#<00>2aa"<00>\PPS4'g\\ RS44hSP R4'dRoVV3RlpV!4;_uu_4pRpVP ^^4p\WT, 4pRp^pW<>8d<>VP WTWH,,R
,,4VPV4p W<>,PRR4PR4p
V
^,PRR4p\V
4p V ^8<>dV
P4x<00>V ^,p K$V^, pK<>W<>8d R R R 4R #WT,p V ^8Xd R R R 4R #VP ^^4VPV 4p W<>,PRR4PR4p
\V
4p V ^8<>dV
P4x<00>V ^,p K$R R R 4R # +'giR #;i5i) r0<00>.gzTc<00><<02>S'dW\P!R4p\P!SR4;_uu_4p\P
!W4RRR4V#\SR4# +'giT#;i)r<>r<>N)r<><00>NamedTemporaryFiler3r<><00>shutil<69> copyfileobj)<04>tmp_fp<66>gz_fpr<70>r-s <20><>r'<00>
_open_file<EFBFBD>*read_file_each_reverse.<locals>._open_file,sb<00><><00> <16><1D>0<>0<><15>7<>F<EFBFBD><15><19><19>8<EFBFBD>T<EFBFBD>*<2A>*<2A>e<EFBFBD><16>"<22>"<22>5<EFBFBD>1<>+<2B><1A>M<EFBFBD><13>H<EFBFBD>d<EFBFBD>#<23>#<23> +<2B>*<2A><1A>M<EFBFBD>s <00>A,<05>, A= r<>r&r*rrNr^)rlrmrnr1r2<00>endswithr<68>r<>r<>r r<>r<>r<><00>pop) r<>r-r?r<00>
chunk_size<EFBFBD>end_pos<6F>loops<70>lastr<74><00>bs<62>linesr<73><00> remainders ff r'<00>read_file_each_reverserJ%s<><00><><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><18><14>2<>H<EFBFBD>=<3D>><3E>><3E><0F><18><18><15><1F><1F><19>
<EFBFBD> $<24>
<14><1C><1C><12><19>
<EFBFBD><14>'<27>'<27>!<21>Q<EFBFBD>-<2D><07><13>G<EFBFBD>(<28>)<29><05><12><04> <0A><01><0F>i<EFBFBD> <0E>G<EFBFBD>G<EFBFBD>G<EFBFBD>J<EFBFBD>N<EFBFBD>:<3A>b<EFBFBD>@<40>@<40> A<><13><17><17><1A>$<24>B<EFBFBD><17>Y<EFBFBD>&<26>&<26>w<EFBFBD><08>9<>?<3F>?<3F><04>E<>E<EFBFBD><18><11>8<EFBFBD>?<3F>?<3F>7<EFBFBD>H<EFBFBD>5<>D<EFBFBD><13>E<EFBFBD>
<EFBFBD>A<EFBFBD><13>a<EFBFBD>%<25><1B>i<EFBFBD>i<EFBFBD>k<EFBFBD>!<21><11>Q<EFBFBD><06><01> <0A><11>F<EFBFBD>A<EFBFBD> <0C>9<EFBFBD> <12>/
<16><1C>2<1C>(<28> <09> <14><01>><3E> <12>9
<16><1C>> <0B><07><07><01>1<EFBFBD> <0A> <0F>W<EFBFBD>W<EFBFBD>Y<EFBFBD> <1F><02><13><19>"<22>"<22>7<EFBFBD>H<EFBFBD>5<>;<3B>;<3B>D<EFBFBD>A<><05> <0F><05>J<EFBFBD><01><0F>!<21>e<EFBFBD><17>)<29>)<29>+<2B> <1D> <0A><11>F<EFBFBD>A<EFBFBD><14>M
<16><1C><1C><1C>s><00>AH<01>H<01>.C-H<05>
H<01>%H<05>5
H<01>?A9H<05>9
H<01> H <09> Hc<00>0<00>\V4# Rp\PPT4'gRp\ T4pRpTP 4P T4pRpTF<>pTPR4R
8Xd Y6,p\Y4\TR,T,R,4pT^,PR4R
8wdRp\T^,4^8<>dRpT^,PR 4R
8wgK<>RpK<> Tu#;i) <0B>/usr/local/openssl/bin/openssl<73>opensslz
-----BEGIN CERTIFICATE-----T<>-----BEGIN CERTIFICATE-----<2D>
x509 -in <20> -noout -subjectz-bash:F<>error:r^) <0B> get_cert_datarlrmrnrqrIr<>r_rsr<>r<>)<08>certPathrM<00>certPemr<6D>r<>rf<00>tmp1r<31>s& r'<00> CheckCertrVes<><00><00><13><1C>X<EFBFBD>&<26>&<26><><13>2<><07><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>g<EFBFBD>&<26>&<26>)<29><07><1A>8<EFBFBD>$<24><07> +<2B><01><15>m<EFBFBD>m<EFBFBD>o<EFBFBD>#<23>#<23>A<EFBFBD>&<26><03><12><03><17>D<EFBFBD><13>y<EFBFBD>y<EFBFBD>6<>7<>2<EFBFBD>=<3D>q<EFBFBD>x<EFBFBD><04> <15>h<EFBFBD> %<25><1E>w<EFBFBD><1C>5<><08>@<40>CU<43>U<>V<>F<EFBFBD><15>a<EFBFBD>y<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>2<EFBFBD>-<2D>T<EFBFBD>s<EFBFBD><12>6<EFBFBD>!<21>9<EFBFBD>~<7E><01>!<21><15>3<EFBFBD><15>a<EFBFBD>y<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>2<EFBFBD>-<2D>U<EFBFBD>s<EFBFBD> <18><13>
<EFBFBD>s<00>
<00>C9D<03> Dc<00><><00>^RIHp\PP R4'dRMRpWP
P R4,#)rrrz data/ssl.plzhttps://zhttp://rk)r<>rsrlrmrnr\rb)rs<00>protocols r'<00> getPanelAddrrYzs6<00><00><1D><1F>W<EFBFBD>W<EFBFBD>^<5E>^<5E>M<EFBFBD>:<3A>:<3A>z<EFBFBD> <09>H<EFBFBD> <13>o<EFBFBD>o<EFBFBD>)<29>)<29>&<26>1<> 1<>1r&c<00><><00>V'gR#\V4pRpV^,pVF.pVR8dRV,R,V,u#VR, pTpK0 RV,R,X,#)z0.00 b<>z%.2f<EFBFBD> )r<><00>KB<4B>MB<4D>GB<47>TB)r<>)<04>sizer<65>r<>r<>s& r'<00>to_sizerb<00>sf<00><00> <0F><08> <10><14>;<3B>D<EFBFBD>%<25>A<EFBFBD> <09>!<21><04>A<EFBFBD> <0E><01> <0F>$<24>;<3B><06><14> <0A><13>4<>q<EFBFBD>8<>8<><13>d<EFBFBD>{<7B><04> <0A><01><0F> <13>T<EFBFBD>M<EFBFBD>S<EFBFBD> <20>1<EFBFBD> $<24>$r&c<00><00>^RIHpHpVPR4pVP R4V'g\ R4VR&R#\ VP44V8wd\ R4VR&R#R# \ R4TR&R#;i) r)r<00>cache<68>codeStr<74> CODE_TIMEOUT<55> login_errorF<72>CODE_ERRT<52>CODE_NOT_EXISTS)rrrdrb<00>deletergr<>rA)<05>code<64>outimerrdres&& r'<00> checkCoderm<00>s{<00><00>'<27> <15><17>)<29>)<29>I<EFBFBD>&<26><07> <0A> <0C> <0C>Y<EFBFBD><1F><16>%+<2B>N<EFBFBD>%;<3B>G<EFBFBD>M<EFBFBD> "<22><18> <0E>t<EFBFBD>z<EFBFBD>z<EFBFBD>|<7C> <1C><07> '<27>%+<2B>J<EFBFBD>%7<>G<EFBFBD>M<EFBFBD> "<22><18><13><><15>!'<27>(9<>!:<3A><07> <0A><1E><14>s<00>)A4<00>A4<00>,A4<00>4Bc
<00><><00>^RIpV'gRRR^R^R^R^/pM&\RV,V, 4pRTRTRTRTRT/p\RVP!V44R # ^pL0;i)
rNr<00>progress<73>total<61>used<65>speedgY@<40>/tmp/panelSpeed.plT)ror<>rsr)rrqrprrror~ros&&&& r'<00>
writeSpeedrt<00>s{<00><00><0F> <10><17><14>z<EFBFBD>1<EFBFBD>g<EFBFBD>q<EFBFBD>&<26>!<21>W<EFBFBD>a<EFBFBD>P<><04> <19><1A>E<EFBFBD>D<EFBFBD>L<EFBFBD>5<EFBFBD>0<>2<>H<EFBFBD><18><15>
<EFBFBD>H<EFBFBD>g<EFBFBD>u<EFBFBD>f<EFBFBD>d<EFBFBD>T[<5B>]b<>c<><04> <0A>"<22>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>$4<>5<> <0F><>  <19><18>H<EFBFBD>s <00>A<00>A$c <00><><00>^RIp\R4pV'g)VP!RRR^R^R^R^/4p\RV4VP!V4#)rNrsrrorprqrr)rorqrrsrp)ror~s r'<00>getSpeedrv<00>sR<00><00><0F> <13>(<28> )<29>D<EFBFBD> <0F><13>z<EFBFBD>z<EFBFBD>7<EFBFBD>D<EFBFBD>*<2A>a<EFBFBD><17>!<21>V<EFBFBD>Q<EFBFBD>PW<50>YZ<59>[<5B>\<5C><04><11>&<26><04>-<2D> <0F>:<3A>:<3A>d<EFBFBD> <1B>r&c<00><00>RRRR/#)z Content-typez!application/x-www-form-urlencoded<65>
User-Agentz Yak-Panelr%r%r&r'<00>get_requests_headersry<00>s<00><00> <1A>?<3F><1C>{<7B> [<5B>[r&c<00><00>\4pVPVR,4'gVPV4'd<>VPV^4R ,PR4p\P
P \4VPR\P44p\P
PV4'd\P!WA4R#\P^,^8XdV^RIpRR/pTP!YRR7p\#TR4;_uu_4pTP%TP&4RRR4R#^RIp ^RIp
T
P,T
nT P0P34p R
.T nT P0P7T 4T P0P9YR7R# L<>;i +'giR#;i \;RP=Y44R#;i) <0B>/N<>
User-agent<6E>sMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36F)r\r]<00>wb)r<>z$wget -O {} {} --no-check-certificater^)r|r})r8<00>
startswithr<EFBFBD><00>lstriprlrmr<><00>get_panel_pathrr<00>sepr<70>r;<00>copyfilerrr<>rbr<><00>write<74>content<6E>urllib.request<73>ssl<73>_create_unverified_context<78>_create_default_https_contextrs<00> build_opener<65>
addheaders<EFBFBD>install_opener<65> urlretriever<65>rA) rer<><00>origin<69>rel<65>srcr<63>r\r)r<><00>urllibr<62><00>openers && r'<00> downloadFiler<65><00>s<><00><00>  <0A> <20>"<22><06> <0E>><3E>><3E>&<26>3<EFBFBD>,<2C> '<27> '<27>3<EFBFBD>><3E>><3E>&<26>+A<>+A<><15>)<29>)<29>F<EFBFBD>A<EFBFBD>&<26>r<EFBFBD>*<2A>1<>1<>#<23>6<>C<EFBFBD><14>'<27>'<27>,<2C>,<2C>~<7E>/<2F><13><1B><1B>S<EFBFBD>"<22>&<26>&<26>1I<31>J<>C<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>c<EFBFBD>"<22>"<22><16><0F><0F><03>.<2E><16>P<01> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23> <1B><1C>T<02>U<02>G<EFBFBD><18> <0C> <0C>S<EFBFBD>%<25> <0C>@<40>A<EFBFBD><15>h<EFBFBD><04>%<25>%<25><11><11><07><07><01> <09> <09>"<22>&<26>%<25> "<22> <16>03<30>0N<30>0N<30>C<EFBFBD> -<2D><1B>^<5E>^<5E>0<>0<>2<>F<EFBFBD>"Y<02>!Z<02>F<EFBFBD> <1D> <12>N<EFBFBD>N<EFBFBD> )<29> )<29>&<26> 1<> <12>N<EFBFBD>N<EFBFBD> &<26> &<26>s<EFBFBD> &<26> ><3E><>% <0A> <0C><>&<26>%<25>%<25><>P<01><11>8<>?<3F>?<3F><08>N<>O<>sD<00>>G<00>B)G<00>-A G-<00>8G<05>G-<00>A2G-<00>G<03> G* <09>$G-<00>*G-<00>-H c<04><><00>\V4\8XdVPR4pVF#pW!9dK \RP V44h R#)u<>
@name 检查参数是否存在
@author hwliang<2021-06-08>
@param args<list or str> 参数列表 允许是列表或字符串
@param get<dict_obj> 参数对像
@return bool 都存在返回True否则抛出KeyError异常
<EFBFBD>,z"Required parameters are missing:{}T)r<>r@r<><00>KeyErrorrA)r<>rb<00>args&& r'<00> exists_argsr<73><00>sH<00><00> <0C>D<EFBFBD>z<EFBFBD>S<EFBFBD><18><13>z<EFBFBD>z<EFBFBD>#<23><EFBFBD><04><13><03><12>z<EFBFBD><1A>?<3F>F<>F<>s<EFBFBD>K<>L<> L<><14> r&c<00>.<00>^RIpVP4pV#<00>rN)<02> traceback<63>
format_exc)r<><00>errorMsgs r'r<>r<><00>s<00><00><14><18>#<23>#<23>%<25>H<EFBFBD> <13>Or&c<04><00>RRRR/.#)uU
@name 获取插件文件内容替换规则
@author hwliang<2021-06-28>
@return list
r_z[PATH]rrr%r%r&r'<00>get_plugin_replace_rulesr<73><00>s<00><00> <13>H<EFBFBD> <15>x<EFBFBD>
<EFBFBD> <06>r&c<04><><00>RP\4V4p\P!\ V44R,# Tu#;i)um
@name 获取插件标题
@author hwliang<2021-06-24>
@param plugin_name<string> 插件名称
@return string
<EFBFBD>{}/{}/info.jsonr)rA<00>get_plugin_pathrorprq)<02> plugin_name<6D> info_files& r'<00>get_plugin_titler<65>sD<00><00>"<22>(<28>(<28><1F>):<3A>K<EFBFBD>H<>I<EFBFBD><1B><13>z<EFBFBD>z<EFBFBD>(<28>9<EFBFBD>-<2D>.<2E>w<EFBFBD>7<>7<><37><1B><1A><1A>s <00>%A<00>Ac <04><><00>V'g \V4p^RIHpHpRpT'd \ 4hRp\ 4P 4P T4R ,P 4pRP\4\4XP\\TP44\\TPP!444\TP"P%R44\'4\)4R7p\+RP\-444PTTTP R 4R ,TR
7pX!TR 4# RpELV;i) uR
@name 获取格式化错误响应对像
@author hwliang<2021-06-21>
@return Resp
)rs<00>RespFTz<54>404 Not Found: The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.
During handling of the above exception, another exception occurred:z<>REQUEST_DATE: {request_date}
PAN_VERSION: {panel_version}
OS_VERSION: {os_version}
REMOTE_ADDR: {remote_addr}
REQUEST_URI: {method} {full_path}
REQUEST_FORM: {request_form}
USER_AGENT: {user_agent}rx)<08> request_dater<65><00>method<6F> full_path<74> request_form<72>
user_agent<EFBFBD> panel_version<6F>
os_versionz/{}/YakPanel/templates/default/plugin_error.htmlr)r<><00> request_info<66> error_title<6C> error_msgr<67>r^)r<>rrsr<>r<>rIr<>rA<00>getDater<65>r<><00>
url_encode<EFBFBD>xsssecr<63>r@<00>form<72>to_dictr\rbr<><00>get_os_versionrqr<>) <09> plugin_titler<65>rsr<><00>is_cli<6C>ss<73>
error_infor<EFBFBD>r<>s && r'<00>get_error_objectr<74>s?<00><00> <18>(8<><1B>(E<><1C><16>*<2A><16><06><0E><1C><1E><1E>
G<01>B<EFBFBD> <20>!<21>'<27>'<27>)<29>/<2F>/<2F><02>3<>B<EFBFBD>7<>=<3D>=<3D>?<3F>J<EFBFBD><1E> %<25>f<EFBFBD><1C>Y<EFBFBD><1F>M<EFBFBD><16>~<7E>~<7E><1C>V<EFBFBD>G<EFBFBD>$5<>$5<>6<>7<><1B>C<EFBFBD><07> <0C> <0C> 4<> 4<> 6<>7<>8<><19>'<27>/<2F>/<2F>-<2D>-<2D>l<EFBFBD>;<3B><<3C><1D>i<EFBFBD>!<21>#<23>%<25> <06> <11>"<16>G<>N<>N<>~<7E>O_<4F>`<60> a<> h<> h<> <20>!<21><1E>$<24>$<24>T<EFBFBD>*<2A>2<EFBFBD>.<2E><1C> i<01><06>F<EFBFBD> <10><06><03> <1C><1C><>A<16><15><06>s <00>
E.<00>.E5c<00>*<00>VF pW!8XgK R# R#<00>TFr%)<03>arrays<79> searchStrrSs&& r'<00>inArrayr<79>>s<00><00><15><03> <0E> <1B>D<EFBFBD><16> r&c<00><><00>V'g\\P!44p\P!V4p\P!W4#rN)r<>r<>rr)rA<00>times<65>
time_locals&& r'<00> format_dater<65>Fs1<00><00> <10>#<23>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>*<2A>%<25><15><1E><1E><05>&<26>J<EFBFBD> <0F>=<3D>=<3D><16> ,<2C>,r&c<00><><00>\R4wrVP4pV'gR#\P!R4pVP V4pV'gR#VP R4pVP R4Uu.uFp\V4NK pp\V4^8d*VP^.^\V4,
,4\V4^8<>d
VR,pV#uupi)z6/www/server/nginx/sbin/nginx -V 2>&1 | grep 'version'Nz+nginx\s+version.*/(?P<ver>\d+\.\d+(\.\d+)*)<29>ver<65>.<2E>N<EFBFBD>N)
r<EFBFBD>rIr<00>compile<6C>searchr<68>r<>r<>r<><00>extend)<07>outr<00>rep_verrfr<>r<><00>ver_lists r'<00> nginx_versionr<6E>xs<><00><00> <16>O<> P<>F<EFBFBD>C<EFBFBD><12>y<EFBFBD>y<EFBFBD>{<7B>C<EFBFBD> <0E><13><10>j<EFBFBD>j<EFBFBD>G<>H<>G<EFBFBD>
<11>.<2E>.<2E><13>
<1D>C<EFBFBD> <0E><13>
<0A>)<29>)<29>E<EFBFBD>
<1A>C<EFBFBD> #<23> <09> <09>#<23><0E>/<2F><0E>1<EFBFBD><03>A<EFBFBD><06><0E>H<EFBFBD>/<2F>
<EFBFBD>8<EFBFBD>}<7D>q<EFBFBD><18><10><0F><0F><11><03>q<EFBFBD>3<EFBFBD>x<EFBFBD>=<3D>0<>1<>2<>
<EFBFBD>8<EFBFBD>}<7D>q<EFBFBD><18><1B>B<EFBFBD><<3C><08> <13>O<EFBFBD><4F> 0s<00>=C'c<00>$<00>V^8<>dQhR\/#<00>r:r=<00>r<>)rAs"r'rBrB<00>s<00><00><11><11>t<EFBFBD>r&c<00>D<00>\4pV'gR#V.RO8<>dR#R#<00>FT)rD<00>rD<00>r<><00><01> nginx_vers r'<00>is_change_nginx_http2r<32><00>s<00><00><1D><0F>I<EFBFBD> <14><14><10>J<EFBFBD><1E><13> r&c<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrB<00><00><00><00><11><11>4<EFBFBD>r&c<00>D<00>\4pV'gR#V.RO8dR#R#r<>r<>r<>s r'<00>is_change_nginx_old_http2r<32><00><00><00><00><1D><0F>I<EFBFBD> <14><14><10>:<3A><1D><13> r&c<00>H<00>\R4^,P4R8g#)z$nginx -V 2>&1| grep 'http_v3_module'rF<00>r<>rIr%r&r'<00>is_nginx_http3r<33><00>s!<00><00> <14>;<3B> <<3C>Q<EFBFBD> ?<3F> E<> E<> G<>2<EFBFBD> M<>Mr&c<00><><00>Rp\P!V4FFpVPR4'gK\PP W4p\ V4KH R#<00><03>/www/server/panel/vhost/nginx<6E>.confN)rl<00>listdirrArmr<><00>remove_nginx_server_quic<69><03>nginx_file_pathr<68><00>
nginx_files r'<00>remove_nginx_quicr<63><00>sF<00><00>5<>O<EFBFBD> <0F>Z<EFBFBD>Z<EFBFBD><0F> (<28><01><10>z<EFBFBD>z<EFBFBD>'<27>"<22>"<22> <14><17>W<EFBFBD>W<EFBFBD>\<5C>\<5C>/<2F>5<>
<EFBFBD> <20><1A>,<2C> )r&c<00>$<00>V^8<>dQhR\/#<00>r:r<><00>r@)rAs"r'rBrB<00>s<00><00> $<24> $<24><13> $r&c<00>P<00>\PPV4'gR#\V4p\ V\
4'gR#\ P!R\ P4pVPV4'gR#VPRV4p\W4R#)Nz\s*listen\s+.*quic;rF) rlrmr<>r<>r<>r@rr<>r8r<>r<>rs)r<>r~<00>rep_listen_quic<69>new_confs& r'r<>r<><00>su<00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25><0E> <13>J<EFBFBD> <1F>D<EFBFBD> <15>d<EFBFBD>C<EFBFBD> <20> <20><0E><18>j<EFBFBD>j<EFBFBD>!7<><12><14><14>><3E>O<EFBFBD> <1A> !<21> !<21>$<24> '<27> '<27><0E><1E>"<22>"<22>2<EFBFBD>t<EFBFBD>,<2C>H<EFBFBD> <0A>j<EFBFBD>#r&c<00><><00>^RIpRpVP!V4FBpVPR4'gKVPP W4p\ V4KD R#)rNr<4E>r<>)rlr<>rArmr<><00>change_nginx_server_http2)rlr<>r<>r<>s r'<00>change_nginx_http2r<32><00>sI<00><00> <0A>5<>O<EFBFBD> <0F>Z<EFBFBD>Z<EFBFBD><0F> (<28><01><10>z<EFBFBD>z<EFBFBD>'<27>"<22>"<22> <14><17>W<EFBFBD>W<EFBFBD>\<5C>\<5C>/<2F>5<>
<EFBFBD>!<21>*<2A>-<2D> )r&c<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrB<00>s<00><00>(<28>(<28>#<23>(r&c<00>X<00>\PPV4'gR#\V4p\P
!R\P 4p.p^RrTVPV4F<>pVP4pRV9d%VPRR4p\V4^,pVPWVP44VPV4VP4pK<> VPWR4V^8<>dRPV4p\W4R#R#)Nz'\s*listen\s+[\[\]:]*([0-9]+).*;[^\n]*\n<>http2rFr^)rlrmr<>r<>rr<>r8<00>finditerr<72>rrr<><00>appendr<64><00>endr<64>rs) r<>r~<00>
rep_listen<EFBFBD> conf_list<73> start_idx<64>last_listen_idxr<78><00>
listen_strr<EFBFBD>s & r'r<>r<><00>s<><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25><0E> <13>J<EFBFBD> <1F>D<EFBFBD><13><1A><1A>F<><02><04><04>M<>J<EFBFBD><12>I<EFBFBD>!"<22>B<EFBFBD><EFBFBD><19>"<22>"<22>4<EFBFBD>(<28><03><18>Y<EFBFBD>Y<EFBFBD>[<5B>
<EFBFBD> <12>j<EFBFBD> <20>#<23>+<2B>+<2B>G<EFBFBD>R<EFBFBD>8<>J<EFBFBD>!<21>)<29>n<EFBFBD>q<EFBFBD>0<>O<EFBFBD><11><18><18><14><03> <09> <09> <0B>4<>5<><11><18><18><1A>$<24><17>G<EFBFBD>G<EFBFBD>I<EFBFBD> <09>)<29><0E><14><14>T<EFBFBD>*<2A>%<25>&<26><16><11><1A><16>7<EFBFBD>7<EFBFBD>9<EFBFBD>%<25><08><11>*<2A>'<27> r&c<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrB<00>r<>r&c<00>D<00>\4pV'gR#V.RO8dR#R#r<>r<>r<>s r'r<>r<><00>r<>r&c<00><><00>Rp\P!V4FFpVPR4'gK\PP W4p\ V4KH R#r<>)rlr<>rArmr<><00>change_nginx_server_old_http2r<32>s r'<00>change_nginx_old_http2r<00>sF<00><00>5<>O<EFBFBD> <0F>Z<EFBFBD>Z<EFBFBD><0F> (<28><01><10>z<EFBFBD>z<EFBFBD>'<27>"<22>"<22> <14><17>W<EFBFBD>W<EFBFBD>\<5C>\<5C>/<2F>5<>
<EFBFBD>%<25>j<EFBFBD>1<> )r&c<00>0<00>V^8<>dQhR\R\/#)r:r<00>end_liner )rAs"r'rBrB<00>s<00><00>-<2D>-<2D><03>-<2D>s<EFBFBD>-r&c<04><><00>\VR4;_uu_4pVP4pRPWAV4uuRRR4# +'giR#;i R#;i)u<>
读取文件指定行数范围内容
Args:
filename: 文件名
start_line: 开始行号
end_line: 结束行号
Returns:
list: 指定行数范围内容列表
r)rFNu获取文件内容报错了)r<><00> readlinesr<73>)r<>rrr<>rHs&&& r'<00>read_file_lines_ranger <00>sJ<00><00>-<2D> <11>(<28>C<EFBFBD> <20> <20>A<EFBFBD><15>K<EFBFBD>K<EFBFBD>M<EFBFBD>E<EFBFBD><15>7<EFBFBD>7<EFBFBD>5<EFBFBD>H<EFBFBD>5<>6<>!<21> <20> <20> <20><>-<2D>,<2C>s'<00>A<00>#A<05>
A<00> A <09>A<00>A<00>Ac<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrBs<00><00>$<24>$<24>c<EFBFBD>$r&c<00><><00>\PPV4'gR#\V4p\ V\
4'gR#\ P!R\ P4pVPV4'gR#VPRV4p\ P!R\ P4p.p^pVPV4FDpVP4pVPWVP44VP4pKF VPWR4RP!V4p\#W4R#)Nz\s*http2\s+on;[^\n]*\nrz"\s*listen\s+[\[\]:]*443.*;[^\n]*\nrF)rlrmr<>r<>r<>r@rr<>r8r<>r<>r<>r<>r<>r<>r<>r<>rs) r<>r~<00> rep_http2_onr<6E>r<>r<>r<>rr<>s & r'rrs<><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25><0E> <13>J<EFBFBD> <1F>D<EFBFBD> <15>d<EFBFBD>C<EFBFBD> <20> <20><0E><15>:<3A>:<3A>7<><12><14><14>><3E>L<EFBFBD> <17> <1E> <1E>t<EFBFBD> $<24> $<24><0E><1B><1F><1F><04>d<EFBFBD>+<2B><04><13><1A><1A>A<>2<EFBFBD>4<EFBFBD>4<EFBFBD>H<>J<EFBFBD><12>I<EFBFBD><11>I<EFBFBD><19>"<22>"<22>4<EFBFBD>(<28><03><18>Y<EFBFBD>Y<EFBFBD>[<5B>
<EFBFBD><11><18><18><14><03> <09> <09> <0B>4<>5<><17>G<EFBFBD>G<EFBFBD>I<EFBFBD> <09> )<29> <0E><14><14>T<EFBFBD>*<2A>%<25>&<26><11>w<EFBFBD>w<EFBFBD>y<EFBFBD>!<21>H<EFBFBD> <0A>j<EFBFBD>#r&c <00>j <00>RP\44pRP\44p\4p\P
P VR,4'gEVR,p\P
P V4'd\P!V4\P
P VR,4'g<>VR,p\P
P V4'd\P!V4VR,p\P
P V4'd\P!V4M<>\P
P VR,4'd7\VR,R4\VR,R PV44MDVR,p\P
P V4'd\P!V4\4pVR
8Xg VeIR V9dB\R PVR74pRp\RPV44p V ^,p
MeVR8XdW\RPVR74p\R\R44Rp\RPV44p V ^,p
MRR.pRpRp
V^,PR4R"8wd=VR8Xd6\4'd&V^8<>dV^,p\4\V4#V^,PV4R"8XEdV^,PR4R"8wd=VR8Xd6\!4'd&V^8<>dV^,p\#4\V4#V^,PR4R"8wd=VR8Xd6\%4'g&V^8<>dV^,p\'4\V4#\)RRV^,34\*P,!RV^,4p V 'Ed\/V P1^44^8<>d[\3V P1^4\/V P1^44^,
\/V P1^44^,4M3\3V P1^4^\/V P1^444p \5RPW<>^,W<>P1^4V P1^44^V^,P7R 4^,P944V^,#R!# \:dRp\5T^,^T^,P7R 4^,P944R p?T^,#R p?ii;i)#z{}/<2F>btwafznginx/btwaf.confrpzapache/total.confznginx/total.confz/apache/modules/mod_lua.sozapache/btwaf.confz(LoadModule lua_module modules/mod_lua.soz*LuaHookLog {}/total/httpd_log.lua run_logsruNz
httpd.confz5ulimit -n 8192 ; {setup_path}/apache/bin/apachectl -t<>rGz Syntax OKz{}/apache/bin/httpd -vrtzWulimit -n 8192 ; {setup_path}/nginx/sbin/nginx -t -c {setup_path}/nginx/conf/nginx.confz/tmp/nginx_new.confz!/www/server/nginx/conf/nginx.conf<6E>
successfulz{}/nginx/sbin/nginx -vr<<00>UnknowzQthe "listen ... http2" directive is deprecated, use the "http2" directive insteadz![emerg] unknown directive "http2"z#[emerg] invalid parameter "quic" in<69> TYPE_SOFT<46>CONF_CHECK_ERRz in (.*):(\d+)uG{}
报错信息:
{}
版本信息:{}
报错文件路径:{}:{}rTr^)rA<00>get_vhost_pathr<68>r{rlrmrn<00>removersr<>r<>rqr_r<>r<><00>checkWebConfigr<67>rr<>r<>r+rr<>r<>r<>r <00> err_collectr<74>rIr<>)<0F>
repair_numrm<00>f1<66>f2rG<00>f3<66>web_sr<73>r<><00>apache_versionrr<>r<><00> err_infosr<73>s&& r'rr$s<><00><00> <0E><1C><1C>n<EFBFBD>&<26> '<27>B<EFBFBD> <0E><1C><1C>o<EFBFBD>'<27> (<28>B<EFBFBD><1F>!<21>J<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22>w<EFBFBD>,<2C> '<27> '<27> <0F>$<24> $<24><02> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22> <1D> <1D>r<EFBFBD>y<EFBFBD>y<EFBFBD><12>}<7D>
<0E>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22>w<EFBFBD>,<2C> '<27> '<27> <0F>%<25> %<25><02> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22> <1D> <1D>r<EFBFBD>y<EFBFBD>y<EFBFBD><12>}<7D> <0F>$<24> $<24><02> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22> <1D> <1D>r<EFBFBD>y<EFBFBD>y<EFBFBD><12>}<7D><> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A>'C<>C<> D<> D<> <15>b<EFBFBD>.<2E>.<2E>0Z<30> [<5B> <15>b<EFBFBD>.<2E>.<2E>0\<5C>0c<30>0c<30>dn<64>0o<30> p<><13>)<29>)<29>B<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>b<EFBFBD>!<21>!<21>2<EFBFBD>9<EFBFBD>9<EFBFBD>R<EFBFBD>=<3D> <19>O<EFBFBD>E<EFBFBD> <0C><08><18>T<EFBFBD>-<2D>,<2C>$<24>2F<32><1A>R<>Y<>Y<>eo<65>Y<>p<>q<><06><1F> <09>"<22>#;<3B>#B<>#B<>:<3A>#N<>O<><0E>%<25>a<EFBFBD>(<28> <0C> <0E>'<27> <19><1A> e<> l<> l<>%<25> m<01> '<27>(<28><06> <12>'<27><18>2U<32>)V<>W<> <20> <09>!<21>":<3A>"A<>"A<>*<2A>"M<>N<> <0A>$<24>Q<EFBFBD>'<27> <0C><15>s<EFBFBD><1A><06><17> <09><1F> <0C> <0A>a<EFBFBD>y<EFBFBD>~<7E>~<7E> _<>a<01>df<64>g<01>kp<6B>t{<7B>k{<7B>AV<02>AX<02>AX<02> <15><01>><3E> <16>!<21>O<EFBFBD>J<EFBFBD> <1E> <20>!<21>*<2A>-<2D> -<2D> <0A>a<EFBFBD>y<EFBFBD>~<7E>~<7E>i<EFBFBD> <20>B<EFBFBD>&<26> <11>!<21>9<EFBFBD>><3E>><3E>3<> 5<>8:<3A> ;<3B>?D<><07>?O<>Tm<54>To<54>To<54><19>A<EFBFBD>~<7E><1A>a<EFBFBD><0F>
<EFBFBD>&<26>(<28>%<25>j<EFBFBD>1<>1<> <11>!<21>9<EFBFBD>><3E>><3E>?<3F> @<40>B<EFBFBD> F<>5<EFBFBD>T[<5B>K[<5B>dr<64>dt<64>dt<64><19>A<EFBFBD>~<7E><1A>a<EFBFBD><0F>
<EFBFBD>!<21>#<23>%<25>j<EFBFBD>1<>1<><10><1B>.<2E><16><01><19> <0C>=<3D>
H<01><16>I<EFBFBD>I<EFBFBD>.<2E><06>q<EFBFBD> <09>:<3A>E<EFBFBD><14>u<EFBFBD>NQ<4E><19>K<EFBFBD>K<EFBFBD><01>N<EFBFBD>O$<24>'(<28>O)<29>2<>%<25>+<2B>+<2B>a<EFBFBD>.<2E>#<23>e<EFBFBD>k<EFBFBD>k<EFBFBD>RS<52>n<EFBFBD>BU<42>XY<58>BY<42>25<32>e<EFBFBD>k<EFBFBD>k<EFBFBD>!<21>n<EFBFBD>2E<32><01>2I<32>K<01>.C<>E<EFBFBD>K<EFBFBD>K<EFBFBD>PQ<50>N<EFBFBD>TU<54>WZ<57>[`<60>[f<>[f<>gh<67>[i<>Wj<57>.k<><1A><1C>i<>p<>p<><1D>a<EFBFBD>y<EFBFBD>,<2C> <0B> <0B>A<EFBFBD><0E><05> <0B> <0B>TU<54><0E>X<01><15>v<EFBFBD>a<EFBFBD>y<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>,<2C>Q<EFBFBD>/<2F>5<>5<>7<>9<> <16>a<EFBFBD>y<EFBFBD><18> <0F><> <19> H<01> <17><06>q<EFBFBD> <09>1<EFBFBD>f<EFBFBD>Q<EFBFBD>i<EFBFBD>o<EFBFBD>o<EFBFBD>d<EFBFBD>&;<3B>A<EFBFBD>&><3E>&D<>&D<>&F<> G<> G<><15>a<EFBFBD>y<EFBFBD><18><> H<01>s<00> EU<00> V2<03>!?V-<03>-V2c<04><><00>^RIHpHpHpVPP 4pRV9dRVR&RV9dRVR&RV9dRVR&R\ 4R\4R\4R \4R
VPVP,R \\V44R \VPPR 44RTR\ P"P%R4'd \'R4M \ 4RVRV/ p\)VR,4p\+V4'g5\-4'g#\/\0RV34\3V^R4R#R#R# \4d p Rp ? R#Rp ? ii;i)u@
@error_info 错误信息
@type 错误类型
@error_id 错误ID
<EFBFBD><03>redirectrs<00>Responser<00>******<2A>password<72>phone<6E> REQUEST_DATE<54> PANEL_VERSION<4F>
OS_VERSION<EFBFBD> REMOTE_ADDR<44> REQUEST_URI<52> REQUEST_FORM<52>
USER_AGENTrx<00>
ERROR_INFO<EFBFBD> PACK_TIMEz'/www/server/panel/config/update_time.pl<70>TYPE<50>ERROR_IDz0https://geterror.yakpanel.com/bt_error/index.php<68>N)r<>r#rsr$r<>r<>r<>r<>r<>r<>r<>r<>r<>r@r\rbrlrmrnrqr<><00> cache_getrD<00>
run_threadr<EFBFBD><00> cache_setr<74>)
r<EFBFBD>r<><00>error_idr#rsr$<00>_form<72> error_infos<6F>pkeyr<79>s
&&& r'rrwsI<00><00>2<>1<> <13>L<EFBFBD>L<EFBFBD> <20> <20> "<22>E<EFBFBD><11>U<EFBFBD><1A><08>E<EFBFBD>*<2A>-<2D><11>U<EFBFBD><1A><08>E<EFBFBD>*<2A>-<2D><0E>%<25><17>(<28><15>w<EFBFBD><1E> <17><07> <09><17><17><19><14>n<EFBFBD>&<26><15>{<7B>}<7D><15>w<EFBFBD>~<7E>~<7E><07>(9<>(9<>9<><16><06>s<EFBFBD>5<EFBFBD>z<EFBFBD>*<2A><14>f<EFBFBD>W<EFBFBD>_<EFBFBD>_<EFBFBD>0<>0<><1C>><3E>?<3F><14>j<EFBFBD><13>B<EFBFBD>G<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD> 5<>M7<>M7<>X<EFBFBD>G<>H<><C<>I<EFBFBD><0E><04><12>H<EFBFBD> <06>K<EFBFBD> <0F>{<7B>:<3A>&<26> '<27>D<EFBFBD> <15>T<EFBFBD>?<3F>?<3F>><3E>#3<>#3<> <11> <16>x<EFBFBD>"T<>Va<56>!b<> c<> <15>d<EFBFBD>A<EFBFBD>t<EFBFBD> $<24>$4<>?<3F><><19> <11> <10><> <11>s<00><E!<00>! E7<03>2E7c<00>@<00>\PV4'dR#R#r<>)r<>r<>r<>s&r'<00>checkIpr<<00>s<00><00><11><17><17><02><1B><1B><13>r&c<00>z<00>\V4'gR#.ROpW9dR#\V4pV^8gVR8<>dR#R#)F<><46><EFBFBD>T)<0E>21<32>25<32>443<34>8080<38>888<38>999<39>8888<38>8443r4<00>8188<38>8189<38>8288<38>8289<38>8290)r r<>)r<><00>ports<74>intports& r'<00> checkPortrN<00>s:<00><00> <14>T<EFBFBD>?<3F>?<3F>5<EFBFBD> <06>E<EFBFBD> <0C>}<7D>U<EFBFBD><11>$<24>i<EFBFBD>G<EFBFBD><0E><11>{<7B>g<EFBFBD><05>o<EFBFBD>e<EFBFBD> r&c<00><><00>VPV4pVR8XdR#VPV4pVR8XdR#W#^,V#<00>rDNr^<00>r_)<05>startStr<74>endStr<74>srcStrr<72>r<>s&&& r'<00> getStrBetweenrU<00>s?<00><00> <12>K<EFBFBD>K<EFBFBD><08> !<21>E<EFBFBD> <0C><02>{<7B>4<EFBFBD>
<10>+<2B>+<2B>f<EFBFBD>
<1D>C<EFBFBD>
<EFBFBD>b<EFBFBD>y<EFBFBD><14> <11>!<21>)<29>C<EFBFBD> <20> r&c<00>~<00>\RR4P4pRp\P!W\P4pRpV'dVP 4^,pV#\ R4^,pRp\P!W\P4pV'dVP 4^,pV#)z /proc/cpuinfor)zmodel\s+name\s+:\s+(.+)rFzLANG="en_US.UTF-8" && lscpuzModel\s+name:\s+(.+))r<>r<>rr<><00>I<>groupsr<73>)<04>cpuinfor<6F>r<><00>cpuTypes r'<00>
getCpuTyper[<00>s<><00><00><12>?<3F>C<EFBFBD>(<28>-<2D>-<2D>/<2F>G<EFBFBD>
$<24>C<EFBFBD>
<0C>)<29>)<29>C<EFBFBD>"<22>$<24>$<24>
'<27>C<EFBFBD><10>G<EFBFBD>
<EFBFBD><15>*<2A>*<2A>,<2C>q<EFBFBD>/<2F><07> <13>N<EFBFBD> <1C>9<>:<3A>1<EFBFBD>=<3D><07>%<25><03><10>i<EFBFBD>i<EFBFBD><03>b<EFBFBD>d<EFBFBD>d<EFBFBD>+<2B><03> <0E>#<23>*<2A>*<2A>,<2C>q<EFBFBD>/<2F><07> <12>Nr&c<00>j<00>\R4PRR4P4pV^8<>dR#R#)<05>tasksz status!=?FT)r<)r8<00>wherer)r s r'<00> IsRestartr_<00>s-<00><00>
<0B>G<EFBFBD>*<2A>
<1A>
<1A>;<3B><06>
/<2F>
5<EFBFBD>
5<EFBFBD>
7<EFBFBD>C<EFBFBD>
<EFBFBD>Q<EFBFBD>w<EFBFBD>u<EFBFBD> r&c<00>0<00>V^8<>dQhR\R\/#<00>r:r&r=r<>)rAs"r'rBrB<00>s<00><00>(<28>(<28>S<EFBFBD>(<28>S<EFBFBD>(r&c<00><><00>^RIpVPR4pVP4pVPW#4pVP R4#)rNr*)<05>bcryptr<74><00>gensalt<6C>hashpwr )r&rc<00>password_bytes<65>salt<6C> hashed_bytess& r'<00>hasPwdri<00>s><00><00><11><1D>_<EFBFBD>_<EFBFBD>W<EFBFBD>-<2D>N<EFBFBD> <11>><3E>><3E> <1B>D<EFBFBD><19>=<3D>=<3D><1E>6<>L<EFBFBD> <17> <1E> <1E>w<EFBFBD> '<27>'r&c<00>V<00>\P!V\P!44#rN)r<>rr<00>rAs&r'r<>r<><00>s<00><00> <0F>=<3D>=<3D><16><14><1E><1E>!1<> 2<>2r&c<00>n<00>^RIpRpVPPV4'd$\V4pVP R4R 8wdR#\ 4R,pVPPV4'gR#.ROp\V4pVF pWe9gK TpM RV: R2p\ V4VPPR 4'dV\R 4pVPPV4'd*\R4p V PR
V4p \RV 4\R R 4R#)rN<> /etc/my.cnfz[mysqld]Tz/mysql/version.plFa
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# CF='node.yakpanel.com'
# HK='www.yakpanel.com'
# HK2='103.224.251.67'
# US='128.1.164.196'
# sleep 0.5;
# CN_PING=`ping -c 1 -w 1 $CF|grep time=|awk '{print $7}'|sed "s/time=//"`
# HK_PING=`ping -c 1 -w 1 $HK|grep time=|awk '{print $7}'|sed "s/time=//"`
# HK2_PING=`ping -c 1 -w 1 $HK2|grep time=|awk '{print $7}'|sed "s/time=//"`
# US_PING=`ping -c 1 -w 1 $US|grep time=|awk '{print $7}'|sed "s/time=//"`
#
# echo "$HK_PING $HK" > ping.pl
# echo "$HK2_PING $HK2" >> ping.pl
# echo "$US_PING $US" >> ping.pl
# echo "$CF_PING $CF" >> ping.pl
# nodeAddr=`sort -V ping.pl|sed -n '1p'|awk '{print $2}'`
# if [ "$nodeAddr" == "" ];then
# nodeAddr=$CF
# fi
Download_Url=https://node.yakpanel.com
MySQL_Opt()
{
MemTotal=`free -m | grep Mem | awk '{print $2}'`
if [[ ${MemTotal} -gt 1024 && ${MemTotal} -lt 2048 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 32M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 128#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 768K#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 768K#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 8M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 16#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 16M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 32M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 128M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 32M#" /etc/my.cnf
elif [[ ${MemTotal} -ge 2048 && ${MemTotal} -lt 4096 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 64M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 256#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 1M#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 1M#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 16M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 32#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 32M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 64M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 256M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 64M#" /etc/my.cnf
elif [[ ${MemTotal} -ge 4096 && ${MemTotal} -lt 8192 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 128M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 512#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 2M#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 2M#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 32M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 64#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 64M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 64M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 512M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 128M#" /etc/my.cnf
elif [[ ${MemTotal} -ge 8192 && ${MemTotal} -lt 16384 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 256M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 1024#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 4M#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 4M#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 64M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 128#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 128M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 128M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 1024M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 256M#" /etc/my.cnf
elif [[ ${MemTotal} -ge 16384 && ${MemTotal} -lt 32768 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 512M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 2048#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 8M#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 8M#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 128M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 256#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 256M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 256M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 2048M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 512M#" /etc/my.cnf
elif [[ ${MemTotal} -ge 32768 ]]; then
sed -i "s#^key_buffer_size.*#key_buffer_size = 1024M#" /etc/my.cnf
sed -i "s#^table_open_cache.*#table_open_cache = 4096#" /etc/my.cnf
sed -i "s#^sort_buffer_size.*#sort_buffer_size = 16M#" /etc/my.cnf
sed -i "s#^read_buffer_size.*#read_buffer_size = 16M#" /etc/my.cnf
sed -i "s#^myisam_sort_buffer_size.*#myisam_sort_buffer_size = 256M#" /etc/my.cnf
sed -i "s#^thread_cache_size.*#thread_cache_size = 512#" /etc/my.cnf
sed -i "s#^query_cache_size.*#query_cache_size = 512M#" /etc/my.cnf
sed -i "s#^tmp_table_size.*#tmp_table_size = 512M#" /etc/my.cnf
sed -i "s#^innodb_buffer_pool_size.*#innodb_buffer_pool_size = 4096M#" /etc/my.cnf
sed -i "s#^innodb_log_file_size.*#innodb_log_file_size = 1024M#" /etc/my.cnf
fi
}
wget -O /etc/my.cnf $Download_Url/install/conf/mysql-z+.conf -T 5
chmod 644 /etc/my.cnf
MySQL_Opt
zdata/datadir.pl<70>/www/server/data<74> TYPE_SOFE<46>MYSQL_CHECK_ERRr^)z5.1z5.5z5.6z5.7z8.0<EFBFBD>AliSQL)
rlrmrnrqr_r{r<>rrrsr+)
rl<00>confFile<6C>conf<6E> versionFile<6C>versionsr<73>rS<00>shellStr<74>newPath<74>mycnfs
r'<00>
CheckMyCnfry<00>s<00><00> <0A><1C>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><17><08>!<21><04> <0F>9<EFBFBD>9<EFBFBD>Z<EFBFBD> <20>B<EFBFBD> &<26>t<EFBFBD> <20>"<22>%8<>8<>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26>u<EFBFBD><<3C>H<EFBFBD><16>{<7B>#<23>G<EFBFBD><17><03> <0E>><3E><19>G<EFBFBD> <11><18><>V<0F>Mf<11>H<EFBFBD>N<0E>h<EFBFBD><17> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>'<27>(<28>(<28><1A>,<2C>-<2D><07> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>'<27> "<22> "<22><1C>]<5D>+<2B>E<EFBFBD><19>M<EFBFBD>M<EFBFBD>"4<>g<EFBFBD>><3E>E<EFBFBD> <15>m<EFBFBD>U<EFBFBD> +<2B> <0C>[<5B>+<2B>,<2C> r&c<04><00>\PPV4'gR #\PPV4pVR
8<EFBFBD>dR #\ VR4;_uu_4pVP R ^4VP 4p\^<5E>V4pVP V)^4VPV4pVPR4R 8Xd R uuRRR4#VP ^4.pVP4pV'gM<>VP4pV'gK4VPR4'gKMVPR4^,PR4p V 'gK~W<>9dK<>W<>9gK<>VPV 4K<>\!V4\!V48wdG\#V4P%V4p
RRP'RP)V
443uuRRR4#RRR4R # +'giR #;i)u
同步国内的
@name 检查导出的sql文件是否完整
@param filename<string> 文件名
@param tables<list> 表名列表
@return tuple (status_code<int>,msg<string>) 状态码 0:sql文件不存在 1:无异常,-1:sql文件不完整,-2:缺少表,消息
r<EFBFBD>sDump completed onNs CREATE TABLE <20>`r*z!Missing tables in backup file :{}r<>)rzbackup file not existsr)rD<00>Normalr^)r^z$Backup file lacks termination marker<65><72><EFBFBD><EFBFBD><EFBFBD>)rlrmrn<00>getsizer<65>r<>rrr<>r_<00>readlinerIrr<>r r<>r<><00>set<65>
differencerAr<>) r<><00>tables<65> file_sizer<65>r$r(<00> last_line<6E>checked_tablesr%r6<00> empty_tabless && r'<00>check_sql_filer<65>ts<><00><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>,G<>%G<><12><07><07><0F><0F><08>)<29>I<EFBFBD><10>#<23>#<23>K<EFBFBD>%7<>
<0E>h<EFBFBD><04> <1D> <1D><11> <09><06><06>r<EFBFBD>1<EFBFBD> <0A><0F>f<EFBFBD>f<EFBFBD>h<EFBFBD><03><15>c<EFBFBD>3<EFBFBD>-<2D><07> <09><06><06><07>x<EFBFBD><11><1B><15>F<EFBFBD>F<EFBFBD>7<EFBFBD>O<EFBFBD> <09> <15>><3E>><3E>.<2E> /<2F>2<EFBFBD> 5<>=<3D>
<1E> <1D>
<EFBFBD><06><06>q<EFBFBD> <09><1B><0E><12><14>:<3A>:<3A><<3C>D<EFBFBD><17><15><17>:<3A>:<3A><<3C>D<EFBFBD><17><18><18>?<3F>?<3F>#3<>4<>4<>h<EFBFBD><19>J<EFBFBD>J<EFBFBD>t<EFBFBD>$<24>Q<EFBFBD>'<27>.<2E>.<2E>w<EFBFBD>7<>E<EFBFBD><19>(<28><15>&<26><08><15><EFBFBD><1E>%<25>%<25>e<EFBFBD>,<2C> <0F>~<7E> <1E>#<23>f<EFBFBD>+<2B> -<2D><1E>v<EFBFBD>;<3B>1<>1<>.<2E>A<>L<EFBFBD><15>:<3A>A<>A<>#<23>(<28>(<28><<3C>BX<42>Y<>Y<>[
<1E> <1D>T .<2E>U
<1E>^ <17><16>_
<1E> <1D>^ <17><16>s2<00>$A*G7<05>+G7<05>G7<05>G7<05>70G7<05>( G7<05>:A'G7<05>7 H c<00><><00>Rp\V4pRp\P!W!4P^4^,p\ V4# ^#;i)<02>/etc/ssh/sshd_configz#*Port\s+([0-9]+)\s*\n)r<>rr<>rXr<>)<04>filersr<>r<>s r'<00>
GetSSHPortr<EFBFBD><00>sL<00><00><12>%<25><04><17><04>~<7E><04>'<27><03><11>y<EFBFBD>y<EFBFBD><13>#<23>*<2A>*<2A>1<EFBFBD>-<2D>a<EFBFBD>0<><04><12>4<EFBFBD>y<EFBFBD><18><><12><11>s <00>AA<00>A c<04>6<00>^p^p\4pV'g \4pV'dX^RIpVP!V4pVP 4F+pVP
R8XgKVP ^,p^pM V'g \4pV# L;i)u4
@name 获取sshd端口
@author hwliang
@return int
N<EFBFBD>LISTEN)<08>get_sshd_pid_of_pidfile<6C>get_sshd_pid_of_binfile<6C>psutil<69>Process<73> connectionsr<73><00>laddrr<72>)<06> sshd_port<72>is_okr<6B>r<>r5<00>conns r'<00> get_sshd_portr<74><00>s<><00><00><13>I<EFBFBD> <0A>E<EFBFBD>
!<21>
#<23>C<EFBFBD> <0E>-<2D>/<2F><03>
<EFBFBD> <11> <19><16><0E><0E>s<EFBFBD>#<23>A<EFBFBD><19> <0A> <0A><0F><04><17>;<3B>;<3B>(<28>*<2A> $<24>
<EFBFBD>
<EFBFBD>1<EFBFBD> <0A>I<EFBFBD><1D>E<EFBFBD><19> (<28> <11>j<EFBFBD>l<EFBFBD>)<29> <14><14><>  <11> <10>s<00>7B<00>&B<00>=B<00>Bc<04><00>.ROpRpVF,p\PPV4'gK*TpM V'dB\V4pV'g^#\ V4pV'g^#\ V4'dV#^#^# ^#;i)uV
@name 通过PID文件获取SSH状态
@author hwliang
@return int 0:关闭 pid:开启
N)z /run/sshd.pidz/var/run/sshd.pidz /run/ssh.pidz/var/run/ssh.pid)rlrmrnrqr<><00>
pid_exists)<04> sshd_pid_list<73> sshd_pid_file<6C> spid_file<6C>sshd_pids r'r<>r<><00>s<><00><00> _<01>M<EFBFBD><18>M<EFBFBD>"<22> <09> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24>%<25>M<EFBFBD> <11>#<23>
<15><1B>M<EFBFBD>*<2A><08><17><01> <11><1A>8<EFBFBD>}<7D>H<EFBFBD><1B>A<EFBFBD><19>(<28>#<23>#<23><1F><0F>$<24> <0A><> <11> <10> <0C>s<00>B<00>,B<00>B c<04><><00>.ROpRp^pVF,p\PPV4'gK*TpM V'd$\VP R4R,VR4pV#)uO
@name 通过执行文件获取SSH状态
@author hwliang
@return int 进程pid
Nr{z-D)z/usr/sbin/sshdz /usr/bin/sshdz /usr/sbin/sshz /usr/bin/sshr^)rlrmrn<00>get_process_pidr<64>)<04> sshd_bin_list<73>sshd_binr<6E><00>sbins r'r<>r<><00>s_<00><00> Y<01>M<EFBFBD><13>H<EFBFBD>
<0B>C<EFBFBD><1D><04> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><1B>H<EFBFBD> <11><1E>
<10><1D>h<EFBFBD>n<EFBFBD>n<EFBFBD>S<EFBFBD>1<>"<22>5<>x<EFBFBD><14>F<><03> <0E>Jr&c<04>N<00>\4'dR#\4'dR#R#)<03>4
@name 获取SSH状态
@author hwliang
@return bool
TF)r<>r<>r%r&r'<00> GetSSHStatusr<73> s<00><00> <1F> <20> <20><13> <20> "<22> "<22><13> r&c<04><00>\4#)r<>)r<>r%r&r'<00>get_sshd_statusr<73> s <00><00> <18>><3E>r&c<00><><00>\V4\8Xd \V4pV^8gVR8<>dR#V'd .ROpW9dR#R#)rDr>FT) <09><00><00><00><>"i<> i<>+ixr<>ix)r<>r@r<>)r<><00>other<65>checkss&& r'<00> CheckPortr<74> s7<00><00> <0B>D<EFBFBD>z<EFBFBD>S<EFBFBD><18><13>T<EFBFBD><19>$<24> <0B>a<EFBFBD>x<EFBFBD>4<EFBFBD>%<25><<3C><05> <0C>?<3F><06> <0F>><3E>%<25> r&c<00><><00>^RIHpRp\PP V4'gR#V!\ V44pV# R#;i)r)rpzdata/token.jsonF)rorprlrmrnrq)rp<00> tokenFile<6C>tokens r'<00>GetTokenr<6E>* sB<00><00><15><1E>%<25> <09><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD>(<28>(<28><15><15>h<EFBFBD>y<EFBFBD>)<29>*<2A><05><14> <0C><><15><14>s<00>,A<00>A<00>A c<00>P<00>.pVFpVP\V44K V#rN<00>r<><00>ord)r<><00>m_listr<74>s& r'<00>to_btintr<74>5 s&<00><00> <0F>F<EFBFBD> <13><01><0E> <0A> <0A>c<EFBFBD>!<21>f<EFBFBD><1D><14> <11>Mr&c<00><><00>^RIHp^RIHpR\ V\ 4,4,pRp\ VR,4pV'dVP V4pV'Eg5\4'di\PPV4'gR#\P!\V44pT'dTP R4R8XdR#Mk^RIpVP4PR4pWR&\!R 4R
,p\#W<>4p \P!V 4pTR,R8XdR#\%T\P&!T44\P(!TR 4T'dTP+YTR 4\,P.P1W!V44p
\3VR ,P5R4VR4p W
nRV
n\;W<>P<4V
# R#;i \PPT4'gR#\P!\T44pEL!;i)r)<01>
new_module<EFBFBD>rdzdata/%sNrkFr<46>r<>ruz/api/panel/get_py_module<6C><65>r3r<>r*<00>execrF)<1F>impr<70>rrdr<><00>get_uuidrbrDrlrmrnrorpr<><00> panelAuth<74>create_serveridr.r<>r^r<00>chmodr<64>r<00>modules<65>
setdefaultr<EFBFBD>r<><00>__file__<5F> __package__r<5F><00>__dict__) <0C>
pluginCoder<EFBFBD>rd<00>p_tk<74>
pluginInfo<EFBFBD>skeyr<79><00>pdatare<00> pluginTmp<6D>modrks & r'<00> load_moduler<65>< s<><00><00><1E><1E> <14>s<EFBFBD>:<3A><08>
<EFBFBD>2<>3<> 3<>D<EFBFBD><15>J<EFBFBD> <0E>z<EFBFBD>F<EFBFBD>"<22> #<23>D<EFBFBD> <0C>5<EFBFBD>9<EFBFBD>9<EFBFBD>T<EFBFBD>?<3F>j<EFBFBD> <15>:<3A> <19> <1B> <1B><15>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24>'<27>'<27><1C> <1D>!<21>Z<EFBFBD>Z<EFBFBD><08><14><0E>7<>
<EFBFBD><1E><1A><1E><1E><08>!9<>U<EFBFBD>!B<><1C>"C<01> <1D><1D>'<27>'<27>)<29>9<>9<>$<24>?<3F>E<EFBFBD>%<25>%<25>L<EFBFBD> <20><16>(<28>+E<>E<>C<EFBFBD> <20><13>,<2C>I<EFBFBD> 8<>!<21>Z<EFBFBD>Z<EFBFBD> <09>2<>
<EFBFBD><1A>(<28>#<23>u<EFBFBD>,<2C>U<EFBFBD><11>$<24><04>
<EFBFBD>
<EFBFBD>:<3A>.<2E>/<2F>
<EFBFBD><08><08><14>s<EFBFBD><1B> <10>%<25>)<29>)<29>D<EFBFBD>d<EFBFBD>3<>
<0A>+<2B>+<2B>
<20>
<20><1A>Z<EFBFBD>
<EFBFBD>-C<>
D<EFBFBD>C<EFBFBD> <12>:<3A>e<EFBFBD>$<24>+<2B>+<2B>G<EFBFBD>4<>j<EFBFBD>&<26> I<>D<EFBFBD><1D>L<EFBFBD><18>C<EFBFBD>O<EFBFBD><08><14>|<7C>|<7C><1C> <0E>J<EFBFBD><4A>3 <1D><1C><> 8<><19>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>+<2B>+<2B>E<EFBFBD>!<21>Z<EFBFBD>Z<EFBFBD><08><14><0E>7<>
<EFBFBD>s<00>H<00>!H <00>H <03> 'I<03>6Ic<00><><00>\4pV'g \RR4#VR,VR,8wd \RR4#^RIp^RIp^RIp^RIp^RIpVP!VR,4pVP!VPVR,WsPR7P44pW<>R,8wd \RR4#VP!VPV44#) F<> REQUEST_ERR<52>
access_key<EFBFBD>
btauth_keyNr~<00>
secret_key<EFBFBD><01> digestmod<6F> signature)r<>r<><00>binasciir<69>r<><00>hmacro<00> unhexlify<66>hexlify<66>new<65>sha256<35>digestrp<00>unquote) r~r<>r<>r<>r<>r<>ro<00>tdatar<61>s & r'<00> auth_decoder<65>g s<><00><00><1A>*<2A>E<EFBFBD> <10><19>5<EFBFBD>-<2D>8<>8<> <0A>\<5C><1A>d<EFBFBD><<3C>0<>0<><19>5<EFBFBD>-<2D>9X<39>2X<32>1<>0<>0<> <14> <1E> <1E>t<EFBFBD>F<EFBFBD>|<7C> ,<2C>E<EFBFBD><19> <20> <20><14><18><18>%<25> <0C>*=<3D>u<EFBFBD>P^<5E>P^<5E><18>!_<>!f<>!f<>!h<>i<>I<EFBFBD><10><1B>%<25>%<25>i<EFBFBD><05>}<7D>.M<>'M<> <10>:<3A>:<3A>f<EFBFBD>n<EFBFBD>n<EFBFBD>U<EFBFBD>+<2B> ,<2C>,r&c<00><><00>\4p/pV'g \RR4#^RIp^RIp^RIp^RIp^RIpVPVP!V44pVP!VPVR,W<>PR7P44VR&VR,VR&VP!V4VR&\P!4VR &V#)
Fr<EFBFBD>Nr<4E>r<>r<>r<>r<>r~r<>)r<>r<>r<>r<>r<>r<>ro<00>quoterr<>r<>r<>r<>r<>) r~r<>r<>r<>r<>r<>r<>ror<>s & r'<00> auth_encoder<65>} s<><00><00> <14>J<EFBFBD>E<EFBFBD> <0E>E<EFBFBD> <11><19>5<EFBFBD>-<2D>8<>8<>1<>0<>0<> <12>L<EFBFBD>L<EFBFBD><14><1A><1A>D<EFBFBD>)<29> *<2A>E<EFBFBD>!<21>)<29>)<29>$<24>(<28>(<28>5<EFBFBD><1C>3F<33><05>Yg<59>Yg<59>(<28>*h<>*o<>*o<>*q<>r<>E<EFBFBD>+<2B><16> <20> <0C>-<2D>E<EFBFBD>,<2C><17><1C>$<24>$<24>U<EFBFBD>+<2B>E<EFBFBD>&<26>M<EFBFBD><1D><19><19><1B>E<EFBFBD>+<2B><16> <11>Lr&c<00><00>Rp\PPV4'gR#^RIp^RIpVP
!\ V44pVP!4VR,8<>dR#VPVR,8wdR#R#)zdata/tempToken.jsonFNr[r<>T)rlrmrnror<>rprqr<>)rb<00>tempFileror<><00> tempTokens& r'<00>
checkTokenr<EFBFBD><00> s]<00><00>$<24>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD><15><14>
<EFBFBD>
<EFBFBD>8<EFBFBD>H<EFBFBD>-<2D>.<2E>I<EFBFBD> <0B>y<EFBFBD>y<EFBFBD>{<7B>Y<EFBFBD>y<EFBFBD>)<29>)<29>%<25>
<EFBFBD>y<EFBFBD>y<EFBFBD>I<EFBFBD>g<EFBFBD>&<26>&<26>u<EFBFBD> r&c<00>d<00>^RIpVPVP4R7PRR#)rNr <00><><EFBFBD><EFBFBD><EFBFBD>)<04>uuid<69>UUID<49>getnode<64>hex)r<>s r'r<>r<><00> s)<00><00><0F> <0F>9<EFBFBD>9<EFBFBD><14><1C><1C><1E>9<EFBFBD> (<28> ,<2C> ,<2C>S<EFBFBD>T<EFBFBD> 2<>2r&c<00>,<00>^RIpVP!4#r<>)r<><00> gethostname<6D>r<>s r'<00> get_hostnamer<65><00> s<00><00><11> <11> <1D> <1D> <1F>r&c<00><><00>Rp\PPV4'gR#\V4p^RIpVP
!RV4pV'gR#V^,#)rmrFNzdatadir\s*=\s*(.+))rlrmrnrqrr<>)<04>
mycnf_filerxrr<>s r'<00> get_datadirr<72><00> sH<00><00><1E>J<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25>b<EFBFBD> <14>Z<EFBFBD> <20>E<EFBFBD> <0A>
<0C>*<2A>*<2A>*<2A>E<EFBFBD>
2<EFBFBD>C<EFBFBD> <0E>r<EFBFBD> <0E>q<EFBFBD>6<EFBFBD>Mr&c<00>`<00>^RIpVP!4pVF<>pVP!V4pVP4V8XdWV'g V'gR#V'dVP 4V8XdR#V'dW&P 49dR#KK<>K<> R# K<>;i R#;i)rNTF<54>r<><00>pidsr<73>r<00>exe<78>cmdline<6E><07>pnamer<65>r<>r<>r<>r<>r5s&&& r'<00>process_existsr<73><00> s<><00><00><14><15><15>{<7B>{<7B>}<7D><04><17>C<EFBFBD> <15><1A>N<EFBFBD>N<EFBFBD>3<EFBFBD>'<27><01><14>6<EFBFBD>6<EFBFBD>8<EFBFBD>u<EFBFBD>$<24><1E>w<EFBFBD>#<23><1E> <20>u<EFBFBD>u<EFBFBD>w<EFBFBD>#<23>~<7E>'+<2B>"<22>&<26>)<29>)<29>+<2B>5<>d<EFBFBD>5<>#<23>%<25><18><15><> <15><14><><14><13>sR<00>B(<00>.B <02> B <02>B(<00>B <02>B <02>4B(<00>7B <02>?B <02>B(<00>B(<00> B%<05>"B(<00>(B-c<04>j<00>^RIpVP!4pVF<>pVP!V4pVP4V8XdeV'g V'gVu#V'd%VP 4V8XdV'gVu#^#V'dW&P 49dVu#K<>K<>K<> ^# K<>;i)u<>
@name 通过进程名获取进程PID
@author hwliang
@param pname 进程名
@param exe 进程路径
@param cmdline 进程任意命令行参数
@return int 返回进程PID
Nr<EFBFBD>r<>s&&& r'r<>r<><00> s<><00><00><12> <11>;<3B>;<3B>=<3D>D<EFBFBD><13><03> <11><16><0E><0E>s<EFBFBD>#<23>A<EFBFBD><10>v<EFBFBD>v<EFBFBD>x<EFBFBD>5<EFBFBD> <20><1A>7<EFBFBD><1E>J<EFBFBD><1A><1C>5<EFBFBD>5<EFBFBD>7<EFBFBD>c<EFBFBD>><3E>#*<2A>'*<2A>
<EFBFBD>#$<24><1E>"<22>i<EFBFBD>i<EFBFBD>k<EFBFBD>1<>#<23>:<3A>1<><1F>!<21><14> <0A><> <11> <10>s5<00>.B-<02> B-<02>B-<02>B-<02>B-<02><B-<02>B-<02> B-<02>-B2c<00>r<00>\PPRPV44'dR#R#)z /proc/{}/exeTF)rlrmrnrA)r<>s&r'r<>r<><00> s&<00><00> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>n<EFBFBD>+<2B>+<2B>C<EFBFBD>0<>1<>1<><13> r&c<00>H<00>^RIpVP4PR4#r<>)r<00>ReWeb)rs r'<00> restart_panelr<00> s<00><00><11> <11>=<3D>=<3D>?<3F> <20> <20><14> &<26>&r&c <00><><00>^RIpVPVP4R7PRRpRP \ ^^ ^4Uu.uF q!W"^,NK up4#uupi)rNr r<>r<>)r<>r<>r<>r<>r<>r<>)r<><00>macr<63>s r'<00>get_mac_addressr<00> sW<00><00><0F>
<0E>)<29>)<29><04> <0C> <0C><0E>)<29>
'<27>
+<2B>
+<2B>C<EFBFBD>D<EFBFBD>
1<EFBFBD>C<EFBFBD> <0E>8<EFBFBD>8<EFBFBD>5<EFBFBD><11>B<EFBFBD><01>?<3F>;<3B>?<3F>a<EFBFBD><11>q<EFBFBD>5<EFBFBD>\<5C>?<3F>;<3B> <<3C><<3C><>;s<00> A&c<00><><00>\V4\8wdV.pRpVFTp\P^,^8Xd$V\ V4P R4, pKBV\ V4, pKV V#)rFr*)r<>r<>rr<00>unichrr<72><00>chr)<03>litesr<73><00>mus& r'<00> to_stringr 
sd<00><00> <0B>E<EFBFBD>{<7B>d<EFBFBD><1A>U<EFBFBD>G<EFBFBD>E<EFBFBD> <0E>E<EFBFBD><13><02> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23> <11>V<EFBFBD>B<EFBFBD>Z<EFBFBD>&<26>&<26>w<EFBFBD>/<2F> /<2F>E<EFBFBD> <11>S<EFBFBD><12>W<EFBFBD> <1C>E<EFBFBD> <14> <11>Lr&c<00>P<00>.pVFpVP\V44K V#rNr<>)r<><00>or<6F>s& r'<00>to_ordr
s&<00><00>
<EFBFBD>A<EFBFBD> <13><01> <09><08><08><13>Q<EFBFBD><16><18><14> <0C>Hr&c<00>><00>^RIHp.R Op.pVFpWB9dRpVPV4K RPV4pVP VRR7pV# TP RR 4P RR
4P RR 4P RR 4u#;i)r<00><01>htmlrrrrrFT<>r<><00>&amp;<3B>&quot;<3B>&lt;<3B>&gt;)<11>`<60>~rrr{r<00>$<24>@rrrr<00>;<3B>%r<>r<><00>\u)<06>cgirr<>r<><00>escaperr)rdrr<><00>retr<74><00> str_convert<72>text2s& r'<00> xssencoder#
s<><00><00> k<01><1C>h<><04><10><03><15>A<EFBFBD><10>y<EFBFBD><16><01> <0F>J<EFBFBD>J<EFBFBD>q<EFBFBD>M<EFBFBD><16><19>g<EFBFBD>g<EFBFBD>c<EFBFBD>l<EFBFBD> <0B><14> <0B> <0B>K<EFBFBD>t<EFBFBD> <0B>4<><05><14> <0C><>k<01><13>|<7C>|<7C>C<EFBFBD><17>)<29>1<>1<>#<23>x<EFBFBD>@<40>H<>H<><13>f<EFBFBD>U<>]<5D>]<5D>^a<>ci<63>j<>j<>s <00>AA<00>ABc<04>H<00>^RIHpVPV4pV# Tu#;i)ue
@name HTML解码
@author hwliang
@param text 要解码的HTML
@return string 返回解码后的HTML
r)rr<00>unescape<70>rdrr"s& r'<00> html_decoder'(
s)<00><00><14><1C><14> <0A> <0A>d<EFBFBD>#<23><05><14> <0C><><14><13> <0B><><00><00>!c<04>H<00>^RIHpVPV4pV# Tu#;i)ue
@name HTML编码
@author hwliang
@param text 要编码的HTML
@return string 返回编码后的HTML
r)rrrr&s& r'<00> html_encoder*8
s)<00><00><14><1C><14> <0B> <0B>D<EFBFBD>!<21><05><14> <0C><><14><13> <0B>r(c<00><><00>VPRR4PRR4PRR4PRR4#)rrrrrrrr<00>rr<00>rds&r'r<>r<>I
s<<00><00> <0F><<3C><<3C><03>W<EFBFBD> %<25> -<2D> -<2D>c<EFBFBD>8<EFBFBD> <<3C> D<> D<>S<EFBFBD>&<26> Q<> Y<> Y<>Z]<5D>_e<5F> f<>fr&c<00>F<00>VPRR4PRR4#)rrrrr,r-s&r'<00>xsssec2r/N
s <00><00> <0F><<3C><<3C><03>V<EFBFBD> $<24> ,<2C> ,<2C>S<EFBFBD>&<26> 9<>9r&c<00>l<00>V'd\V\4'gV#VP4p.R
Op.pVFpW19dRpVPV4K RP V4pV# TP RR4P RR4P RR4P RR 4u#;i) rrrrrrFrrrr)rrrrr{rrrrrrrrrr<>r)r<>r@rIr<>r<>rr)rdr<>r r<>r!s& r'<00> xss_versionr1S
s<><00><00> k<01><13>:<3A>d<EFBFBD>C<EFBFBD>0<>0<><14>+<2B><13>z<EFBFBD>z<EFBFBD>|<7C><04>c<><04><10><03><15>A<EFBFBD><10>y<EFBFBD><16><01> <0F>J<EFBFBD>J<EFBFBD>q<EFBFBD>M<EFBFBD><16><19>g<EFBFBD>g<EFBFBD>c<EFBFBD>l<EFBFBD> <0B><1A><1A><>k<01><13>|<7C>|<7C>C<EFBFBD><17>)<29>1<>1<>#<23>x<EFBFBD>@<40>H<>H<><13>f<EFBFBD>U<>]<5D>]<5D>^a<>ci<63>j<>j<>s<00>A-<00>A-<00>A
A-<00>-AB3c<00><00>/p\4Rp\V4pRp\P!W24P 4^,VR&Rp\P!W24P 4^,VR&V# RTR&RTR&T#;i)rmzdatadir\s*=\s*(.+)\n<>datadirzport\s*=\s*([0-9]+)\s*\nr<6E>rn<00>3306)ryrqrr<>rX)r~<00>myfilerxr<>s r'<00>get_mysql_infor6d
s<><00><00> <0A>D<EFBFBD>
<1E><12> <0C><1E><06><18><16> <20><05>%<25><03><1C>)<29>)<29>C<EFBFBD>/<2F>6<>6<>8<><11>;<3B><04>Y<EFBFBD><0F>)<29><03><19>y<EFBFBD>y<EFBFBD><13>,<2C>3<>3<>5<>a<EFBFBD>8<><04>V<EFBFBD> <0C> <10>K<EFBFBD><4B><1E>,<2C><04>Y<EFBFBD><0F><1D><04>V<EFBFBD> <0C> <0F>K<EFBFBD>s <00>A7A=<00>= B c<00><><00>^RIHpVPVRR7pV# TPRR4PRR4PRR 4PR
R 4u#;i) rrTrrrrrrrrr)rrrrrr&s& r'r r u
sd<00><00>k<01><1C><14> <0B> <0B>D<EFBFBD><04> <0B>-<2D><05><14> <0C><>k<01><13>|<7C>|<7C>C<EFBFBD><17>)<29>1<>1<>#<23>x<EFBFBD>@<40>H<>H<><13>f<EFBFBD>U<>]<5D>]<5D>^a<>ci<63>j<>j<>s
<00><00>AA#c<00>@<00>^RIHpVPV4pVfV#V#<00>rr<>)rrdrb)rSrrdrfs&& r'r4r4<00>
s!<00><00><1E>
<0F>)<29>)<29>C<EFBFBD>.<2E>C<EFBFBD>
<EFBFBD>{<7B><16><0E> <0E>Jr&c
<00>@<00>V'dH^RIHp\4R,\VPP R44,V,p\ R4PRW\P!R\P!4434R# R#;i)rrrr<>r<><00>securityztype,log,addtimerN) r<>rsr<>r@r<>rbr8r!r<>rr)r<><00>log<6F>is_iprss&&& r'<00>add_security_logsr><00>
sq<00><00> <0A> <10> %<25><1D>-<2D>#<23>%<25><03>G<EFBFBD>O<EFBFBD>O<EFBFBD>,?<3F>,?<3F> <0A>,N<>(O<>O<>RU<52>U<>C<EFBFBD> <09>*<2A> <0A><19><19>,<2C>t<EFBFBD>$<24>-<2D>-<2D> <0A>W[<5B>We<57>We<57>Wg<57>:h<>.i<>j<><6A> <0A> <0C>s<00>B<00>B B<00>Bc<00>2<00>^RIHpVR8XdzRp\V4pV'de\V4^8<>dUVP \ 4R,4'g/\ RR4VP\ 4R,^^<4VPWV4#)rr<><00>checkz$/www/server/panel/data/admin_path.pl<70>admin_path_infozSecurity entrance correctz+Successfully accessed the security entrance)rrdr<>r<>rbr<>r>r<>)rSrWr[rd<00>
admin_pathrms&&& r'r6r6<00>
su<00><00><1E> <0C><07><17>;<3B>
<EFBFBD><17>
<EFBFBD>#<23><04> <0F>C<EFBFBD><04>I<EFBFBD><01>M<EFBFBD><18>9<EFBFBD>9<EFBFBD>[<5B>]<5D>-><3E>><3E>?<3F>?<3F>!<21>"=<3D>?l<>m<><15> <09> <09>+<2B>-<2D>*;<3B>;<3B>Q<EFBFBD><02>C<> <10>9<EFBFBD>9<EFBFBD>S<EFBFBD><17> )<29>)r&c<00>0<00>^RIHpVPV4#r9)rrdrj)rSrds& r'<00> cache_removerD<00>
s<00><00><1E> <10><<3C><<3C><03> <1C>r&c<00>.<00>^RIHpW9d W,#R#)rrN<>rr<00>rSrs& r'<00>sess_getrH<00>
s<00><00> <20>
<EFBFBD>~<7E>g<EFBFBD>l<EFBFBD>*<2A> r&c<00><00>^RIHpWV&R#<00>rrTrF)rSrWrs&& r'<00>sess_setrK<00>
s<00><00> <20><18>C<EFBFBD>L<EFBFBD> r&c<00>"<00>^RIHpW9dWR#rJrFrGs& r'<00> sess_removerM<00>
s<00><00> <20>
<EFBFBD>~<7E>G<EFBFBD>L<EFBFBD> r&c
<00>
<00>^RIp^RIHp\VP4pTP 4pRTRTRTRTRT/pR TP Y<>4R
\TP4R\TP4/p T # RpLa;i) rNrrrFr<00>rowr5<00> return_js<6A>uri<72>page<67>shift)
rRrrsr<>r<><00>Page<67>GetPager@<00>SHIFT<46>ROW)
rr5<00>rows<77>callbackr<6B>rRrsrQ<00>infor~s
&&&&& r'<00>get_pager[<00>
s<><00><00><0F><11>$<24><18><17>*<2A>*<2A>+<2B><03> <10>9<EFBFBD>9<EFBFBD>;<3B>D<EFBFBD> <13>U<EFBFBD>E<EFBFBD>4<EFBFBD><13>a<EFBFBD><1B>h<EFBFBD><05>s<EFBFBD> S<>D<EFBFBD> <12>D<EFBFBD>L<EFBFBD>L<EFBFBD><14>.<2E><07><13>T<EFBFBD>Z<EFBFBD>Z<EFBFBD><1F>%<25>QT<51>UY<55>U]<5D>U]<5D>Q^<5E> _<>D<EFBFBD> <0F>K<EFBFBD><4B> <11><10><03>s <00>A<<00><Bc<00><><00>\RP\444p\P!RV4P 4^,# \ 4u#;i)<02> {}/common.pyz"g\.version\s*=\s*'(\d+\.\d+\.\d+)')r<>rA<00>get_class_pathrr<>rX<00>get_panel_version)<01>comms r'r<>r<><00>
sO<00><00>#<23><17><0E>-<2D>-<2D>n<EFBFBD>.><3E>?<3F>@<40><04><11>y<EFBFBD>y<EFBFBD>><3E><04>E<>L<>L<>N<>q<EFBFBD>Q<>Q<><51>#<23> <20>"<22>"<22>s <00>A A<00> Ac<00><><00>\RP\444pRp\V4pVP V4V,pWV^
,P 4P R4pV#)r]z g.version = r)r<>rAr^r<>r_rI)r`<00>s_key<65>s_len<65>s_leffr<66>s r'r_r_<00>
sb<00><00> <13>N<EFBFBD>)<29>)<29>.<2E>*:<3A>;<3B> <<3C>D<EFBFBD> <1A>E<EFBFBD> <0F><05>J<EFBFBD>E<EFBFBD> <11>Y<EFBFBD>Y<EFBFBD>u<EFBFBD> <1D><05> %<25>F<EFBFBD><12>&<26>2<EFBFBD>+<2B>&<26>,<2C>,<2C>.<2E>4<>4<>S<EFBFBD>9<>G<EFBFBD> <12>Nr&c<04>v<00>Rp\PPR4'd<>\R4P R4pV^,P R4R8wdS\ V4^8<>dCV^,R,V^,P R4^,P4,pRpVFApV'dK \PPV4'gK4\V4pTpM V'gV\P!R4pV'd7\P!RV4pV'dVP4^,pM@VPR R4PR
R4PR R4P4p\PpR PV\P !4P"VP$VP&VP(4p\+T4# R PYP$TP&TP(4pL@;i)uH
@name 取操作系统版本
@author hwliang<2021-08-07>
@return string
rFz/etc/.productinfor<00>Kylinr\r{z/etc/os-releasez!PRETTY_NAME=["\']?([^"\']+)["\']?zrelease <20>Linuxz(Core)z{} {}(Py{}.{}.{})z{} (Py{}.{}.{})r^)<03>/etc/redhat-releasez/etc/system-releasez/etc/amazon-linux-release)rlrmrnrqr<>r_r<>rI<00>publicrr<>rXrrrrrA<00>uname<6D>machine<6E>major<6F>minor<6F>micror<6F>)r<><00>s_tmp<6D>release_version<6F>tmp_filer<65><00> version_match<63>v_infos r'r<>r<><00>
s<><00><00><11>G<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>)<29>*<2A>*<2A><18>,<2C>-<2D>3<>3<>D<EFBFBD>9<><05> <10><11>8<EFBFBD>=<3D>=<3D><17> !<21>R<EFBFBD> '<27>C<EFBFBD><05>J<EFBFBD><11>N<EFBFBD><1B>A<EFBFBD>h<EFBFBD><13>n<EFBFBD>u<EFBFBD>Q<EFBFBD>x<EFBFBD>~<7E>~<7E>c<EFBFBD>':<3A>1<EFBFBD>'=<3D>'C<>'C<>'E<>E<>G<EFBFBD><06>O<EFBFBD>
$<24><08><16>w<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28>3<>3<><1C>X<EFBFBD>&<26>E<EFBFBD><1B>G<EFBFBD> <11> $<24> <13><14>o<EFBFBD>o<EFBFBD>/<2F>0<><03> <0E><1E>I<EFBFBD>I<EFBFBD>&J<>C<EFBFBD>P<>M<EFBFBD><1C>'<27>.<2E>.<2E>0<><11>3<><07><><19>/<2F>/<2F>*<2A>b<EFBFBD>1<>9<>9<>'<27>2<EFBFBD>F<>N<>N<>x<EFBFBD>Y[<5B>\<5C>b<>b<>d<><07> <10> <1D> <1D>F<EFBFBD>^<01>%<25>,<2C>,<2C>W<EFBFBD>b<EFBFBD>h<EFBFBD>h<EFBFBD>j<EFBFBD>6H<36>6H<36>&<26>,<2C>,<2C>X^<5E>Xd<58>Xd<58>fl<66>fr<66>fr<66>s<><07> <12>'<27>?<3F><1A><>^<01>#<23>*<2A>*<2A>7<EFBFBD>L<EFBFBD>L<EFBFBD>&<26>,<2C>,<2C>PV<50>P\<5C>P\<5C>]<5D><07>s <00>(AH<00>3H8c<00>2<00>/p\V4\8XdV.p.pVF?p\PP V4'dVP V4K;^W&KA \ V4^8<>d<>RPRPV4P44p\V4^,pVPR4FHpVPR4p\ V4^8dK&\V^,4R,W^,&KJ V# T#;i)rzdu -s {}r\r<00> r[) r<>r@rlrmrnr<>r<>rAr<>rIr<>r<>r<>)<08>pathsr~<00>n_listrmr<>rfr"r<>s& r'<00>get_size_totalrx s<><00><00> <0A>D<EFBFBD><10> <0F><05>;<3B>#<23> <1D><1A>G<EFBFBD>E<EFBFBD><13><06><19>D<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>#<23>#<23><16> <0A> <0A>d<EFBFBD>#<23><1E><04>
<EFBFBD> <1A> <0F>v<EFBFBD>;<3B><11>?<3F><1E>%<25>%<25>c<EFBFBD>h<EFBFBD>h<EFBFBD>v<EFBFBD>&6<>&<<3C>&<<3C>&><3E>?<3F>E<EFBFBD><1B>E<EFBFBD>"<22>1<EFBFBD>%<25>C<EFBFBD><18>Y<EFBFBD>Y<EFBFBD>t<EFBFBD>_<EFBFBD><01><17>g<EFBFBD>g<EFBFBD>d<EFBFBD>m<EFBFBD><03><16>s<EFBFBD>8<EFBFBD>a<EFBFBD><<3C><18>"<22>3<EFBFBD>q<EFBFBD>6<EFBFBD>{<7B>T<EFBFBD>1<><04><11>V<EFBFBD> <0C>%<25>
<10>K<EFBFBD><4B><10>4<EFBFBD> <0F>K<EFBFBD>s <00>D D<00>Dc<04>:<00>^RIp\PPV4'g^#\PP V4'd \PP V4#\ V4\ .48wdV.pVR,R8XdV^RMTp\PPV4pVR,p\V4F<>wrE\V\4'gKVPV4'dK6\PPV4pVPV4'g1VP\PPW44K<>VPVR,R4p\PPW4pVPV4K<> ^p^p \P !VRR7EF<>wr<>p VF<>p V Fyp\PPV
\PP",V,4pVP!W<>4'g W<>8XgKhV P%V4K{ K<> V ^, p V EFpRpV ^, p \PPV
\PP",V,4p\PPV4'gK{\PP'V4'dK<>\PPV4pVF'pVP!VV4'g
VV8XgK%RpM V'dK<>V\PP V4, pEK! EK<> V#) u<>根据排除目录获取路径的总大小
:path 目标路径
:exclude 排除路径单个字符串或者多个列表。匹配路径是基于path的相对路径,规则是
tar命令的--exclude规则的子集。
Nr{:rNNrFT)<01>topdownFr^)<14>fnmatchrlrmrnr<>r~r<><00>normcase<73> enumerater<65>r@r<00>basenamer<65>r<>rr<00>walkr<6B>r<00>islink)rm<00>excluder{<00>_excluder<65>r<>r~<00>new_exc<78>
total_sizer<00>root<6F>dirs<72>files<65>excr<63><00>sub_dirr<72><00>
to_excluder<EFBFBD><00> norm_filename<6D>fexcs&& r'<00> get_path_sizer<65>! s<><00><00><13> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><01> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD><1B><1B>B<EFBFBD>G<EFBFBD>G<EFBFBD>O<EFBFBD>O<EFBFBD>D<EFBFBD>$9<>9<> <0B>G<EFBFBD>}<7D><04>R<EFBFBD><08> <20><1A>)<29><07><1D>b<EFBFBD><18>S<EFBFBD><1F>4<EFBFBD><01>"<22>:<3A>d<EFBFBD>D<EFBFBD> <0A>7<EFBFBD>7<EFBFBD> <1B> <1B>D<EFBFBD> !<21>D<EFBFBD><17>r<EFBFBD>{<7B>H<EFBFBD><19>(<28>#<23><04><01> <15>a<EFBFBD><13> <1D> <1D><14><<3C><<3C><04>%<25>%<25><1D>7<EFBFBD>7<EFBFBD>+<2B>+<2B>D<EFBFBD>1<><08><18>|<7C>|<7C>H<EFBFBD>-<2D>-<2D><1B>N<EFBFBD>N<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD><<3C><<3C><04>#8<>9<><1F>i<EFBFBD>i<EFBFBD><08>3<EFBFBD><0E><02>;<3B>G<EFBFBD> <20>g<EFBFBD>g<EFBFBD>l<EFBFBD>l<EFBFBD>4<EFBFBD>9<>G<EFBFBD><1B>N<EFBFBD>N<EFBFBD>7<EFBFBD>+<2B>$<24><13>J<EFBFBD> <0A>E<EFBFBD><1F>W<EFBFBD>W<EFBFBD>T<EFBFBD>4<EFBFBD>8<>8<><19><04>E<EFBFBD><1A>C<EFBFBD><19><01><1C>'<27>'<27>*<2A>*<2A>4<EFBFBD>"<22>'<27>'<27>+<2B>+<2B>+=<3D><01>+A<>B<><07><1A>?<3F>?<3F>7<EFBFBD>0<>0<>A<EFBFBD>H<EFBFBD><18>K<EFBFBD>K<EFBFBD><01>N<EFBFBD> <1A><1B> <0E><11>
<EFBFBD><05><16>A<EFBFBD><1E>J<EFBFBD> <11>Q<EFBFBD>J<EFBFBD>E<EFBFBD><19>w<EFBFBD>w<EFBFBD>'<27>'<27><04>r<EFBFBD>w<EFBFBD>w<EFBFBD>{<7B>{<7B>(:<3A>Q<EFBFBD>(><3E>?<3F>H<EFBFBD><15>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28>+<2B>+<2B>X<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>'<27><18><1E>G<EFBFBD>G<EFBFBD>,<2C>,<2C>X<EFBFBD>6<>M<EFBFBD><1F><04><1A>?<3F>?<3F>=<3D>$<24>7<>7<>4<EFBFBD>1<EFBFBD>9<EFBFBD>!%<25>J<EFBFBD><19>  <20>
<1A><18> <16>"<22>'<27>'<27>/<2F>/<2F>(<28>3<> 3<>J<EFBFBD><17>9<>2 <16>r&c<00><><00>^RIHpHpHpVP R4^8XdR#RP \ 44p\RR7R,p\PPV4'g\P!V4.pVP\44VP\4R,\4,4VPVP4VPVP 4VPVP"P R 44VPR
8Xd<>VP$P'4pVP)4FcpVP+R 4R8wgVP+R 4R8wdR Wx&\-Wx,4R8<>gKKWx,R,R,Wx&Ke VP\/V44MVPR4VP\1\2P2!4VP4,
R,44VPVP6P84VPVP6P:4VPVP6P"P R44VPVP"P R44VP\/V44\<P>!V4R,p \AVR,V,V R4\C4R# R#;i)r)rsr<>rrNz{}/logs/request<73>%Y-%m-%drkz.jsonr<6E>rx<00>POST<53>passr<73>r%r<>:riNz -- >4096<39>{}r<><00> Content-Type<70>Hostrr{<00>a+r^)"rrsr<>rrbrAr<>r<>rlrmrn<00>makedirsr<73>r<>r<>r<>r<>r\r<>r<>r<>r_r<>r@r<>r<><00> request_time<6D>responserc<00>content_lengthrorr^<00> rep_sys_path)
<EFBFBD>requesrsr<>r<00>log_path<74>log_file<6C>log_datar<61>r<><00>log_msgs
& r'<00>write_request_logr<67>^ s1<00><00>! <0A>0<>0<> <12>;<3B>;<3B>w<EFBFBD> <1F>1<EFBFBD> $<24>f<EFBFBD>$<24>+<2B>+<2B>N<EFBFBD>,<<3C>=<3D><08><1A>*<2A>-<2D><07>7<><08><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>'<27><12><1B><1B>X<EFBFBD>)><3E><15><08><10><0F><0F><07> <09>"<22><10><0F><0F> <0B> <0A><03>+<2B>o<EFBFBD>.?<3F>?<3F>@<40><10><0F><0F><07><0E><0E>'<27><10><0F><0F><07>)<29>)<29>*<2A><10><0F><0F><07><0F><0F>+<2B>+<2B>L<EFBFBD>9<>:<3A> <12>><3E>><3E>V<EFBFBD> #<23><1A><<3C><<3C>'<27>'<27>)<29>D<EFBFBD><19>Y<EFBFBD>Y<EFBFBD>[<5B><01><14>6<EFBFBD>6<EFBFBD>&<26>><3E>R<EFBFBD>'<27>1<EFBFBD>6<EFBFBD>6<EFBFBD>&<26>><3E>R<EFBFBD>+?<3F>&<26>D<EFBFBD>G<EFBFBD><16>t<EFBFBD>w<EFBFBD><<3C>$<24>&<26>"<22>g<EFBFBD>f<EFBFBD>o<EFBFBD> <0B>;<3B>D<EFBFBD>G<EFBFBD> !<21>
<15>O<EFBFBD>O<EFBFBD>C<EFBFBD><04>I<EFBFBD> &<26> <14>O<EFBFBD>O<EFBFBD>D<EFBFBD> !<21><10><0F><0F><03>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>[<5B>1<EFBFBD>><3E>><3E>9<>T<EFBFBD>A<>B<>C<><10><0F><0F><01>
<EFBFBD>
<EFBFBD>.<2E>.<2E>/<2F><10><0F><0F><01>
<EFBFBD>
<EFBFBD>1<>1<>2<><10><0F><0F><01>
<EFBFBD>
<EFBFBD>*<2A>*<2A>.<2E>.<2E>~<7E>><3E>?<3F><10><0F><0F><07><0F><0F>+<2B>+<2B>F<EFBFBD>3<>4<><10><0F><0F><03>F<EFBFBD> <0B>$<24><16>*<2A>*<2A>X<EFBFBD>&<26><14>-<2D><07><11>(<28>S<EFBFBD>.<2E>8<EFBFBD>+<2B>W<EFBFBD>d<EFBFBD>;<3B><14><0E><> <0A> <0C>s<00> M<00>FM<00>;FM<00>Mc<00><><00>V'gR#\P^,^8Xd\V4R#^RIpVPV4R# R#;i<01>FNT)rrr2r<>)r<>r<>s& r'<00>
mod_reloadr<EFBFBD><00> sI<00><00> <0F><05> <15> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23> <12>4<EFBFBD>L<EFBFBD>
<14> <17> <0F>J<EFBFBD>J<EFBFBD>t<EFBFBD> <1C><13><><15><14>s<00>'A <00>A <00> Ac<00><><00>\PPV4'gR#\\ V4^4p\P
!W4R# R#;i<01>FT)rlrmrnr<>r@r<><00>r<>r<>s&&r'<00>set_moder<65><00> sG<00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD> <0E>s<EFBFBD>4<EFBFBD>y<EFBFBD>!<21> <1C>D<EFBFBD><15>
<EFBFBD><08><08><18> <20> <10><><15><14>s <00>A<00>Ac<04>n<00>\RPV44\RPW44R#)u<>
@name 创建系统用户
@author hwliang<2022-01-15>
@param user<string> 用户名
@param group<string> 所属组
@return bool
z groupadd {}z!useradd -s /sbin/nologin -g {} {}T<>r<>rA)r<>r<>s&&r'<00>create_linux_userr<72><00> s.<00><00><0E>m<EFBFBD>"<22>"<22>5<EFBFBD>)<29>*<2A> <0A>1<>8<>8<><14>E<>F<> r&c<00><><00>\PPV4'gR#^RIHpV!V4pVP
pV'd V!V4pVP p\P!YT4R# TR8Xd \Y4T!R4pM \Y4T!R4pM;iTP
pTP pLk;i)F)r<><00>wwwT) rlrmrnr<>r<>r<>r<>r<><00>chown)r<>r<>r<>r<><00> user_infos&&& r'<00>set_ownr<6E><00> s<><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD><1C>!<21><1C>T<EFBFBD>N<EFBFBD> <09><18><1F><1F><04> <10> <20><15><0F>I<EFBFBD><19> <20> <20><05><07>H<EFBFBD>H<EFBFBD>X<EFBFBD>U<EFBFBD>#<23> <0F><> !<21> <0F>5<EFBFBD>=<3D>+<2B>D<EFBFBD>8<> (<28> <20><15><0F>I<EFBFBD><49> (<28> <1D>d<EFBFBD> *<2A> <20><15><0F>I<EFBFBD><49><18><1F><1F><04><19> <20> <20><05>s)<00>A8<00> A8<00>8C
<03> B<02>C
<03>B-<05>+C
c<04>X<00>^RIpVP!WV4\P!V4FxwrEpVF3pVP!\PP WG4W4K5 VF3pVP!\PP WH4W4K5 Kz R#)u/递归应用public.set_own到目录及其内容N)rir<>rlrrmr<>) rmr<>r<>rir<>r<>r<><00>dir_name<6D> file_names &&& r'<00>recursive_set_ownr<6E><00> sx<00><00><11> <0B>N<EFBFBD>N<EFBFBD>4<EFBFBD>u<EFBFBD>%<25> <20>W<EFBFBD>W<EFBFBD>T<EFBFBD>]<5D><19><04>E<EFBFBD><1C>H<EFBFBD> <12>N<EFBFBD>N<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD><<3C><<3C><04>7<><14> E<><1D><1E>I<EFBFBD> <12>N<EFBFBD>N<EFBFBD>2<EFBFBD>7<EFBFBD>7<EFBFBD><<3C><<3C><04>8<>$<24> F<><1F>+r&c<00><><00>\V4R8<>dR#.ROpVFpVPV4R8wgKR# V'd\PV4'gR#R#)<05>FT)z..<2E>./<2F>\rr<00>^rrrrrr<00>|r<>r<>rr^)r<>r_<00>match_safe_pathr<68>)rm<00>forcer<65>rBs&& r'<00>path_safe_checkr<6B><00> sI<00><00>
<EFBFBD>4<EFBFBD>y<EFBFBD>3<EFBFBD><EFBFBD>u<EFBFBD> `<60>F<EFBFBD> <13><01> <0F>9<EFBFBD>9<EFBFBD>Q<EFBFBD><<3C>2<EFBFBD> <1D>e<EFBFBD><14> <0C><1E>$<24>$<24>T<EFBFBD>*<2A>*<2A>5<EFBFBD> r&c<00>^<00>\V4pVPRVP4,4p\\P
!RV^,^,4^,4p.ROpVP 4V9gR#RRRR/PVP 4V4# R#;i)zshow create database `%s`zSET\s+([\w\d-]+)\sr1r*<00>utf8mb4)r1r*<00>gbk<62>big5r<35>)<08> get_mysql_objrHrIr@rr<>rArb)r<<00>db_objr<6A><00>c_type<70>c_typess& r'<00>get_database_characterr<72><00> s<><00><00> <19><1E>w<EFBFBD>'<27><06><14>l<EFBFBD>l<EFBFBD>6<><17><1D><1D><1F>H<>I<><03><14>R<EFBFBD>Z<EFBFBD>Z<EFBFBD> 5<>s<EFBFBD>1<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>A<>!<21>D<>E<><06>=<3D><07><15>|<7C>|<7C>~<7E><17>(<28><1C> <12>I<EFBFBD> <13>Y<EFBFBD>
<EFBFBD> <0F>3<EFBFBD>v<EFBFBD>|<7C>|<7C>~<7E>v<EFBFBD> &<26> '<27><><19><18>s<00>A?B'<00>#B'<00>'B,c<00>$<00>RpV'dW\R4PRV4P4pVR,'d\VR,4#VR,R 9pV'dm^RIpVP 4p\ P!XR,4pVPVR,VR,VR ,VR
,VR ,4pV#^RIpVP 4pV# \dp\\T44hRp?ii;i) F<> databaseszname=?<3F>sid<69>db_typeN<65> conn_configrT<00>db_portr<rR<00> db_password)r<rD) r8r^r_<00>get_mysql_obj_by_sid<69>db_mysql<71>
panelMysqlrorp<00>set_hostr<74>r<00> GetMySQLError)r<<00> is_cloud_db<64>db_findr<64>r<>r<>r<>r<>s& r'r<>r<><00> s<><00><00><17>K<EFBFBD><0E><13>K<EFBFBD>.<2E>&<26>&<26>x<EFBFBD><17>9<>><3E>><3E>@<40><07> <12>5<EFBFBD>><3E>><3E>'<27><07><05><0E>7<> 7<><1D>i<EFBFBD>(<28>H<EFBFBD>4<> <0B><12><17><19>$<24>$<24>&<26><06><1A>j<EFBFBD>j<EFBFBD><17><1D>!7<>8<> <0B> /<2F><1B>_<EFBFBD>_<EFBFBD>[<5B><19>%;<3B>[<5B><19>=S<>U`<60>aj<61>Uk<55>%0<><19>%;<3B>[<5B><1D>=W<>Y<01>F<EFBFBD> <12>M<EFBFBD> <1A><1B>&<26>&<26>(<28><06> <11>M<EFBFBD><4D> <19> /<2F><1C>]<5D>1<EFBFBD>-<2D>.<2E> .<2E><> /<2F>s<00>8C+<00>+ D<03>6D
<03>
Dc<00><><00>VR9d^pV'dzV'g*\R4PRV4P4p^RIpVP 4pVP VR,VR,RVR,VR,4pV#^RIpVP 4pV# \ dp\\T44hRp?ii;i) r<><00>database_servers<72>id=?NrTr<>rRr<>)r<>rF) r8r^r_r<>r<>r<>r<>rr<>)r<>r<>r<>r<>r<>r<>s&& r'r<>r<> s<><00><00>
<EFBFBD>i<EFBFBD><17>q<EFBFBD><13>
<EFBFBD><1A>!<21>,><3E>*?<3F>*E<>*E<>f<EFBFBD>c<EFBFBD>*R<>*W<>*W<>*Y<>K<EFBFBD><17><19>$<24>$<24>&<26><06> /<2F><1B>_<EFBFBD>_<EFBFBD>[<5B><19>%;<3B>[<5B><19>=S<>UY<55>[f<>gp<67>[q<>%0<><1D>%?<3F>A<01>F<EFBFBD> <12>M<EFBFBD> <1A><1B>&<26>&<26>(<28><06> <11>M<EFBFBD><4D> <19> /<2F><1C>]<5D>1<EFBFBD>-<2D>.<2E> .<2E><> /<2F>s<00>1B!<00>! C<03>,C<03>Cc<00>^<00>RpVP^,R8Xd \R4pVP^,R8Xd \R4pVP^,R8Xd \R4pVP^,R8Xd \R4pVP^,R 8Xd \R
4pVP^,R 8Xd \R 4pVP^,R 8Xd \R4pV'd#VR,\V4,R,pV#\V4pV#)rFiz'Database username or password is wrong!izdatabase does not exist!iz8No permission, or the specified database does not exist!i&zDatabase already exists!izzTable does not exist!i<>z"Database server connection failed!ivzInsufficient user rights!z<pre>z</pre>)r<>rir@)r<>rfs& r'r<>r<> s<><00><00>
<0C>C<EFBFBD><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>G<>H<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>8<>9<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>X<>Y<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>8<>9<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>5<>6<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>B<>C<><03><08>v<EFBFBD>v<EFBFBD>a<EFBFBD>y<EFBFBD>D<EFBFBD><18><1D>9<>:<3A><03>
<EFBFBD><11>G<EFBFBD>m<EFBFBD>c<EFBFBD>!<21>f<EFBFBD>$<24>x<EFBFBD>/<2F><03> <0F>J<EFBFBD><12>!<21>f<EFBFBD><03> <0E>Jr&c<00>&<00>RRRRRRRR/pW,#)r1<00>utf8_general_cir<69><00>utf8mb4_general_cir<69><00>gbk_chinese_cir<69><00>big5_chinese_cir%)<02>codeing<6E>wheress& r'<00>get_database_codestrr<72>, s+<00><00><0E>!<21><11>'<27> <0A><1F><0E>!<21> <06>F<EFBFBD> <12>?<3F>r&c<04>
<00>/p\V4pVPR4p\V4\8XdGVF@p\ V4^8dKV^,R8XdK%\ V^,4W^,&KB V# Tu#;i)<03>
@获取数据库大小
zvselect table_schema, (sum(DATA_LENGTH)+sum(INDEX_LENGTH)) as data from information_schema.TABLES group by table_schemaN)r<>rHr<>r<>r<>r<>)rr~<00> mysql_objr<6A><00>xs& r'<00>get_database_sizer<65>6 s<><00><00> <0E>D<EFBFBD>
<14>!<21>$<24>'<27> <09><1A><1F><1F> E<02>F<02><06> <0F><06><<3C>4<EFBFBD> <1F><1B><01><16>q<EFBFBD>6<EFBFBD>A<EFBFBD>:<3A>x<EFBFBD><14>Q<EFBFBD>4<EFBFBD>4<EFBFBD><<3C><18> <20><11>1<EFBFBD><14>Y<EFBFBD><04>q<EFBFBD>T<EFBFBD>
<EFBFBD><1C> <10>K<EFBFBD><4B><14><13> <0B>s <00>A6A<<00><Bc<04><><00>^p\V4pVPRPV44pV^,^,pV'g^pV# Tu#;i)r<><00><>select table_schema, (sum(DATA_LENGTH)+sum(INDEX_LENGTH)) as data from information_schema.TABLES WHERE table_schema='{}' group by table_schema)r<>rHrA)rr~r<>r<>s& r'<00>get_database_size_by_namer<65>I si<00><00> <0A>D<EFBFBD><14>!<21>$<24>'<27> <09><1A><1F><1F> ]<02> d<02> d<02><14> <16><17><06><16>a<EFBFBD>y<EFBFBD><11>|<7C><04><13>A<EFBFBD>T<EFBFBD> <10>K<EFBFBD><4B><14><13> <0B>s <00>AA <00> Ac<04><><00>^p\R4PRV4PR4p\V4pVP RP V44pV^,^,pV'g^pV# Tu#;i)r<>r<>r<>rr<>)r8r^<00>getFieldr<64>rHrA)r!r~rr<>r<>s& r'<00>get_database_size_by_idr<64>Z s<><00><00> <0A>D<EFBFBD> <14><10><1B>~<7E>#<23>#<23>F<EFBFBD>B<EFBFBD>/<2F>8<>8<><16>@<40><04>!<21>$<24>'<27> <09><1A><1F><1F> ]<02> d<02> d<02><14> <16><17><06><16>a<EFBFBD>y<EFBFBD><11>|<7C><04><13>A<EFBFBD>T<EFBFBD> <10>K<EFBFBD><4B><14><13> <0B>s <00>A/A5<00>5A;c<00><><00>\P^,^8XdVPR4pVPR4pRpVF<>pVR8XdK \P
!RV4pV'g\P
!RV4pV'gW#R,, pK[\P^,^8Xd8VRVP R4PR 4,R,, pK<>VRVPR 4P R4,R,, pK<> V^,R8Xd
R
V,pV^R #) rr1r<>rFru[€-ÿ]+u
[一-龥]+<2B>xn--r*<00>punycodez*.r^)rrr<>r<>rr<>r )<05>domainr<6E><00> newdomain<69>dkeyr<79>s& r'<00> en_punycoder<65>l s<00><00>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F><17><1D><1D>v<EFBFBD>&<26><06>
<10>,<2C>,<2C>s<EFBFBD>
<1B>C<EFBFBD><12>I<EFBFBD><13><04> <0F>3<EFBFBD>;<3B><08><12> <09> <09>/<2F>4<EFBFBD>0<><05><14>b<EFBFBD>i<EFBFBD>i<EFBFBD>(;<3B>T<EFBFBD>B<>e<EFBFBD><14> <15><03><1A> #<23>I<EFBFBD><12><1F><1F><01>"<22>a<EFBFBD>'<27><19>V<EFBFBD>d<EFBFBD>k<EFBFBD>k<EFBFBD>'<27>&:<3A>&A<>&A<>*<2A>&M<>M<>PS<50>S<>S<> <09><19>V<EFBFBD>d<EFBFBD>k<EFBFBD>k<EFBFBD>*<2A>&=<3D>&D<>&D<>W<EFBFBD>&M<>M<>PS<50>S<>S<> <09><14> <0B>1<EFBFBD>v<EFBFBD><13>}<7D>$<24><19>"2<>i<EFBFBD> <14>Q<EFBFBD>r<EFBFBD>?<3F>r&c<00> <00>VPR4pRpVFgpVPR4^8<>d@W#PRR4PR4P R4R,, pKXW#R,, pKi V^R#)r<>rFr<>r*r<>r^)r<>r_rrr<>r )r<>r<>r<>r<>s& r'<00> de_punycoder<65><00> sy<00><00>
<10>,<2C>,<2C>s<EFBFBD>
<1B>C<EFBFBD><12>I<EFBFBD><13><04> <0F>9<EFBFBD>9<EFBFBD>V<EFBFBD> <1C><01> !<21> <15><1C><1C>f<EFBFBD>b<EFBFBD>1<>8<>8<><17>A<>H<>H<><1A>T<>WZ<57>Z<> Z<>I<EFBFBD> <15><03><1A> #<23>I<EFBFBD> <14>
<15>Q<EFBFBD>r<EFBFBD>?<3F>r&c<00>`<00>Rp\PPV4'gRpV#TpV#)z/var/spool/cron/crontabs/rootz/var/spool/cron/root<6F>rlrmrn)<02>u_filer<65>s r'<00> get_cron_pathr<68><00> s2<00><00> ,<2C>F<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>&<26> !<21> !<21>%<25><04> <10>K<EFBFBD><16><04> <0F>Kr&c<00><><00>\V4\8wdVPR4p^RIHpV!V4pVP V4pVP R4# Tu#;i<01>r*)<01>Fernet)r<>r<>r<><00>cryptography.fernetr<74><00>encryptr <00>rSr<>r<>r<>r<>s&& r'<00>en_cryptr<74><00> sU<00><00><17> <0F><07>=<3D>E<EFBFBD> !<21>W<EFBFBD>^<5E>^<5E>G<EFBFBD>-D<>7<EFBFBD>.<2E> <12>3<EFBFBD>K<EFBFBD><01><12><19><19>7<EFBFBD>#<23><06><15>}<7D>}<7D>W<EFBFBD>%<25>%<25><><17><16><0E><> <00>AA<00>Ac<00><><00>\V4\8wdVPR4p^RIHpV!V4pVP V4PR4pV# Tu#;ir<>)r<>r<>r r<>r<><00>decryptr<74>s&& r'<00>de_cryptr<00> sV<00><00><17> <0F><07>=<3D>E<EFBFBD> !<21>W<EFBFBD>^<5E>^<5E>G<EFBFBD>-D<>7<EFBFBD>.<2E> <12>3<EFBFBD>K<EFBFBD><01><12><19><19>7<EFBFBD>#<23>*<2A>*<2A>7<EFBFBD>3<><06><15> <0A><><17><16><0E>r<EFBFBD>c<00>@<00>.pRp\PPV4'gV#^RIHpRpVP V4pV'dV#.p\ V4pV'gV#VP4pVPR4FxpV'gK VPR4p/p\V^,4VR&\V4^8<>d\V^,4VR&M VR,VR&VPV4Kz VPW0R4V# T#;i)zdata/limitip.confr<66><00>limit_ipr<70><00>-r<00>max<61>) rlrmrnrrdrbr<>rIr<><00>ip2longr<67>r<>r<>)<07> iplong_list<73>ip_filerd<00>ikey<65>iplistr<00>iplongs r'<00> get_limit_ipr<00> s<00><00><14>K<EFBFBD> <0A>%<25><07><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>g<EFBFBD>&<26>&<26>{<7B>(:<3A>"<22><19><04><1B>i<EFBFBD>i<EFBFBD><04>o<EFBFBD> <0B> <16>{<7B>*<2A><18> <0B><19>'<27>"<22><06><15>k<EFBFBD>)<29><17><1C><1C><1E><06><1E> <0C> <0C>S<EFBFBD>)<29>H<EFBFBD><1B>X<EFBFBD><1F>~<7E>~<7E>c<EFBFBD>*<2A>H<EFBFBD><17>F<EFBFBD>#<23>H<EFBFBD>Q<EFBFBD>K<EFBFBD>0<>F<EFBFBD>5<EFBFBD>M<EFBFBD><12>8<EFBFBD>}<7D>q<EFBFBD> <20> '<27><08><11> <0B> 4<><06>u<EFBFBD> <0A> &<26>u<EFBFBD> <0A><06>u<EFBFBD> <0A> <17> <1E> <1E>v<EFBFBD> &<26>*<2A> <0E> <09> <09>$<24>T<EFBFBD>*<2A> <17><16><> <0A> <0C> <16><16>s(<00>&D<00>D<00> D<00>D<00>D<00>'B/D<00>Dc<04>p<00>^RIpVPV4pVPp^0Rm^0Rm/pTF<>pT'gK TP 4pYeT,9dR#RT9d<>TP R4p\ T4^8XdeTPT^,4pTPT^,4p TPTP8XdY<>u;8:dT 8:dMK<>R#K<>K<>K<>TPTRR7p
Y:9dR#K<> R# \dR#i;i \\3dEKi;i)u<>
@name 判断IP是否在限制列表中 (支持 IPv4, IPv6, CIDR, IP范围)
@param ip_list<list> 限制IP列表 (支持 '192.168.1.1', '192.168.1.0/24', '1.1.1.1-1.1.1.5', '::1')
@param client_ip<string> 客户端IP
@return bool
NFTr)<01>strict>r<00>all<6C>0.0.0.0<EFBFBD> 0.0.0.0/0>rr<00>::<3A>::/0) r<><00>
ip_addressr<EFBFBD>r1rIr<>r<><00>
ip_network<EFBFBD> TypeError) <0B>ip_list<73> client_ipr<70><00>
client_obj<EFBFBD>client_version<6F> wildcards<64>rule<6C>parts<74>start_ip<69>end_ip<69>networks && r'<00>is_api_limit_ipr#<00> s?<00><00><15><15><1E>)<29>)<29>)<29>4<>
<EFBFBD>#<23>+<2B>+<2B><0E>
<EFBFBD> 0<> <09> &<26><06>I<EFBFBD>
<18><04><13> <14><13>z<EFBFBD>z<EFBFBD>|<7C><04> <0F>^<5E>,<2C> ,<2C><17> <15><12>d<EFBFBD>{<7B><1C>
<EFBFBD>
<EFBFBD>3<EFBFBD><0F><05><16>u<EFBFBD>:<3A><11>?<3F>(<28>3<>3<>E<EFBFBD>!<21>H<EFBFBD>=<3D>H<EFBFBD>&<26>1<>1<>%<25><01>(<28>;<3B>F<EFBFBD> <20>(<28>(<28>J<EFBFBD>,><3E>,><3E>><3E>$<24><<3C>f<EFBFBD><<3C><<3C>#<23>=<3D>?<3F> #<23>$<24>.<2E>.<2E>t<EFBFBD>E<EFBFBD>.<2E>B<><07><1D>(<28><1F>)<29>-<18>8 <11><>K <16><15><14><15><>D<1B>I<EFBFBD>&<26> <15> <14> <15>s*<00>D <00>BD<02>+D<02> D<03>D<03>D5<05>4D5c<00><><00>\4pV'gR#\4pVR9dR#\V4pVF"pW#R,8<>gKW#R,8:gK!R# \R4#)FrrN<>r<><00> localhost<73>::1)rr<>r<00> error_403)r r<00>client_ip_longrs r'<00>check_ip_panelr*! sV<00><00><1E>.<2E>K<EFBFBD> <16>u<EFBFBD><1B> <0A>I<EFBFBD><10>5<>5<>e<EFBFBD><1C>Y<EFBFBD>'<27>N<EFBFBD><1F><08> <19>e<EFBFBD>_<EFBFBD> ,<2C><1E>E<EFBFBD>?<3F>1R<31><18> <20> <15>T<EFBFBD>?<3F>r&c<00>F<00>\4p\R4pV'd}\4pVR9dR#VP4P 4VP4P 48wd+\ 4'd^RIHpV!R4#\R4#R# L;i)zdata/domain.confF)<01>render_templatez error2.htmlNr%) r<>r<>r<>rIrA<00>check_client_infor<6F>r,r()r<>r<>rr,s r'<00>check_domain_panelr.4 s<><00><00>
<11>)<29>C<EFBFBD> <15>(<28> )<29>F<EFBFBD> <0A><1F>M<EFBFBD> <09> <14>9<> 9<>%<25> <0E>9<EFBFBD>9<EFBFBD>;<3B> <1C> <1C> <1E>&<26>,<2C>,<2C>.<2E>"6<>"6<>"8<> 8<> <20>"<22>"<22><19>5<>*<2A>=<3D>9<>9<><1D>T<EFBFBD>?<3F> "<22> <10><> <19><18>s <00> B<00>B c<00>r<00>RP\44p\PP V4#)z{}/data/not_network.pl<70>rAr<>rlrmrn)<01>s_files r'r`r`H s(<00><00> %<25> ,<2C> ,<2C>^<5E>-=<3D> ><3E>F<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>&<26> !<21>!r&c <00>t<00>RP\44p\PP V4'g\P
!VR4RpRRlpVF@p\ V4;_uu_4pVPRPW4V4RRR4KB R# +'giKW;i)z{}/data/db_backups<70><73>c<00>0<00>V^8<>dQhR\R\/#)r:rOr=r.)rAs"r'rB<00>*dump_panel_databases.<locals>.__annotate__X s<00><00>3<>3<>C<EFBFBD>3<>D<EFBFBD>3r&c<00>*<00>VPR4^8#)zINSERT INTO "logs" rQ)rOs&r'<00>row_check_func<6E>,dump_panel_databases.<locals>.row_check_funcX s<00><00><12>x<EFBFBD>x<EFBFBD>-<2D>.<2E><11>2<>2r&z {}/{}.sqlN<6C>r)rAr<>rlrmrnr<>rP<00>dump)<05> backup_path<74>backup_databasesr7r<r4s r'<00>dump_panel_databasesr=N s<><00><00>&<26>-<2D>-<2D>n<EFBFBD>.><3E>?<3F>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26>
<EFBFBD> <0B> <0B>K<EFBFBD><15>'<27><06><14>3<>$<24><07> <17><07> <20> <20>B<EFBFBD> <0E>G<EFBFBD>G<EFBFBD>K<EFBFBD>&<26>&<26>{<7B><<3C>n<EFBFBD> M<>!<21> <20>$<24> <20> <20> <20>s <00>6"B&<07>& B7 c<00>H<00>\4pVR,p\PPV4'dR#RP \ 44p\P !VRR7\R4pVR,V,pVR,p\PPV4'g&\PPV4'dR#^pVR,p\PPV4'd%\\VR 4P44pV^8dR#\4R
pR
p Rp
\PPR P V44V
8<EFBFBD>dR p\PPR P V44V
8<EFBFBD>dRp \P !VR4W<>RRRRRR.p \V R2V R2V R7\V R2V R24\V R2V R24\RP W%V44\RP VR74\PPV4'd\P !V4\#W&4\%4R# ELh;i R#;i)z/data/not_auto_backup.plF<6C>{}/panelT<6C><01>exist_okr<6B>r{<00>.zipz/data/backup_number.plr)rFz{}/data/default.db<64>
default.dbz{}/data/system.dbz system.dbr<62><00>wp_package_checksums<6D> wp_packages<65>maillog<6F>mailz*.sock<63> hids_dataz/data)<01>ignoresz/configz/vhostzcd {} && zip {} -r {}/z-chmod -R 600 {path};chown -R root.root {path}<7D>rmNi@)r<>rlrmrnrA<00>get_backup_pathr<68>r<>r<>r<>r<>r=r~<00>cp_dirr<72>r;<00>rmtree<65>clear_panel_backup<75>set_php_cli_env) <0C>
panel_paehrv<00>b_path<74>day_dater;<00> backup_file<6C> backup_number<65> backup_conf<6E>ignore_default<6C> ignore_systemr<6D><00> ignore_lists r'<00>auto_backup_panelrY` s(<00><00>/ <0A>#<23>%<25>
<EFBFBD><1A>7<>7<><05> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>%<25> <20> <20><15><1B>"<22>"<22>?<3F>#4<>5<><06>
<EFBFBD> <0B> <0B>F<EFBFBD>T<EFBFBD>*<2A><1E>z<EFBFBD>*<2A><08><1C>s<EFBFBD>l<EFBFBD>X<EFBFBD>-<2D> <0B>!<21>F<EFBFBD>*<2A> <0B> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26>"<22>'<27>'<27>.<2E>.<2E><1B>*E<>*E<>d<EFBFBD><18> <0A><1E>!9<>9<> <0B> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26> <15> #<23>D<EFBFBD><1B>c<EFBFBD>$:<3A>$?<3F>$?<3F>$A<> B<> <0A> <19>1<EFBFBD> <1C><18> <1D><1E><1B><0E><1A> <0A>$<24><08> <0A>7<EFBFBD>7<EFBFBD>?<3F>?<3F>/<2F>6<>6<>z<EFBFBD>B<> C<>h<EFBFBD> N<>)<29>N<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>?<3F>?<3F>.<2E>5<>5<>j<EFBFBD>A<> B<>X<EFBFBD> M<>'<27>M<EFBFBD>
<EFBFBD> <0B> <0B>K<EFBFBD><13>%<25> <19> "<22>M<EFBFBD>9<EFBFBD>f<EFBFBD>h<EFBFBD>{<7B>
<EFBFBD> <0B> <0F>*<2A><1C>U<EFBFBD>#<23> <0B>}<7D>E<EFBFBD>%:<3A>K<EFBFBD>P<><0E>*<2A><1C>W<EFBFBD>%<25>+<2B><1D>g<EFBFBD>'><3E>?<3F><0E>*<2A><1C>V<EFBFBD>$<24><1B> <0A>V<EFBFBD>&<<3C>=<3D><11>*<2A>1<>1<>&<26>x<EFBFBD>P<>Q<><11>A<>H<>H<>k<EFBFBD>H<>Z<>[<5B> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26><06> <0A> <0A>k<EFBFBD>(B<><1A>6<EFBFBD>0<><17><19><>= <15><14><>< <0A> <0C>s6<00>8J<00>BJ<00>/J<00>#J<00>1J<00>:EJ<00>J<03>J<00>J!c<00>V<00>.p\PPV4'gR#\P!V4F<>pVR,V,pRpVP R4'dRp\
P !\
P!VRV,44p\P!RVR7pVR,V,pVR,p WI8Xg,WH8Xd;\PPV4'dVPV4K<>K<>K<> VPRR7\V\V44F<>p
VR,\P!RW*,R7,pVR,p\PPV4'd\P!V4Ku\PPV4'gK<>\PPV4'gK<>\ P"!V4K<> R# EK<>;i)Nr{rFrBr<>)r<>T<><01>reverse)rlrmrnr<>rAr<><00>mktime<6D>strptimerir<><00>isdirr<72><00>sortr<74>r<>rr;rM) r;rT<00>backup_time_listr<74><00>f_path<74>
zip_stringr]rR<00> day_date_filerSr<>s && r'rNrN<00> s<><00><00><19><14> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26><0E> <0F>Z<EFBFBD>Z<EFBFBD> <0B> $<24><01><1A>S<EFBFBD> <20>!<21>#<23><06>
<11><19>J<EFBFBD><10>z<EFBFBD>z<EFBFBD>&<26>!<21>!<21>V<EFBFBD>*<2A><17>;<3B>;<3B>t<EFBFBD>}<7D>}<7D>Q<EFBFBD>z<EFBFBD>*<2A>/D<>E<>F<>F<EFBFBD><1B>'<27>'<27>
<EFBFBD><16>@<40>H<EFBFBD>'<27>#<23>-<2D><08>8<>M<EFBFBD>'<27><16>/<2F>K<EFBFBD><15>"<22>v<EFBFBD>'<<3C><12><17><17><1D><1D>v<EFBFBD>AV<41>AV<41> <20>'<27>'<27><06>/<2F>BW<01>'<<3C>%<25><15><19><19>$<24><19>'<27> <12>=<3D><13>%5<>!6<> 7<><01>!<21>C<EFBFBD>'<27>&<26>*<<3C>*<<3C>Z<EFBFBD>N^<5E>Na<4E>*b<>b<> <0A><1C>f<EFBFBD>$<24><06> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>&<26> !<21> !<21> <0E>I<EFBFBD>I<EFBFBD>f<EFBFBD> <1D> <0F>W<EFBFBD>W<EFBFBD>^<5E>^<5E>M<EFBFBD> *<2A> *<2A>r<EFBFBD>w<EFBFBD>w<EFBFBD>}<7D>}<7D>]<5D>/K<>/K<> <12>M<EFBFBD>M<EFBFBD>-<2D> (<28> 8<><38>  <11> <10>s<00>B.H"<02>H"<02>"H(c<04>.<00>^RIpVP4R#)u%
@name 重新设置php-cli.ini配置
N)<02>jobsrO)rfs r'rOrO<00> s<00><00><10><08><18><18>r&c<00><><00>^RIp/pWR&RVR&VP!4pVPR4VPW34VP4^pTR,'d
T^, pT# RTR&L%;i)rNr<4E>T<>localg333333<33>?F)r<><00>
settimeout<EFBFBD>connectr<74>)r<><00>localIPr<50><00>tempr<70>r<>s&& r'<00>check_port_statrm<00> sz<00><00><11> <0A>D<EFBFBD><17><16>L<EFBFBD><18>D<EFBFBD><17>M<EFBFBD><1E> <12>M<EFBFBD>M<EFBFBD>O<EFBFBD><01> <09> <0C> <0C>T<EFBFBD><1A> <09> <09> <09>7<EFBFBD>/<2F>"<22> <09><07><07> <09><0F>F<EFBFBD> <0B>G<EFBFBD>}<7D>}<7D>f<EFBFBD><01>k<EFBFBD>f<EFBFBD> <11>M<EFBFBD><4D> <1E><1D><04>W<EFBFBD> <0A>s <00>AA1<00>1A:c<00><><00>\4'dR#Rp\\P!44p\PP V4'd9V\\ V44,
^<8dR#\P!V4\\R4R,4p\V4p\P!V4p\P!RV4p\RV,4\V\V44R# \PP T4'd\P!T4R#;i)Fz/dev/shm/last_sync_time.plruz/api/index/get_time<6D>%Y-%m-%d %H:%M:%Sz date -s "%s"T)rDr<>r<>rlrmrnrqrrhr.rrr<>rsr@)<06>tip_file<6C>s_time<6D>time_str<74>new_time<6D>time_arr<72>date_strs r'<00> sync_daterv<00> s<><00><00><15><17><17><14>+<2B>H<EFBFBD> <10><14><19><19><1B> <1D>F<EFBFBD> <15> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><15><03>H<EFBFBD>X<EFBFBD>.<2E>/<2F>/<2F>"<22>4<>U<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>h<EFBFBD> <1F><1A>><3E>&<26>1<>4I<34>I<>J<><08><16>x<EFBFBD>=<3D><08><17>><3E>><3E>(<28>+<2B><08><17>=<3D>=<3D>!4<>h<EFBFBD>?<3F><08><11>.<2E>8<EFBFBD>+<2B>,<2C><11>(<28>C<EFBFBD><06>K<EFBFBD>(<28><13><><15> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>R<EFBFBD>Y<EFBFBD>Y<EFBFBD>x<EFBFBD>%8<><14>s<00>AD <00>;BD <00> =E c<00>(<00>.pV'd<>\V4\8XdVPR4pXF<>pV\P9d<>\ V4\P ^,^8Xd"\\PV,4M+\P!\PV,4VPVR.4K<>VPVR.4K<> V#\PP4F<>pVR9dK \\PV,RR4pV'gK8VPR4R8XdKQ\P ^,^8Xd"\\PV,4M+\P!\PV,4VPVR.4K<> V# TPTR.4EK<>;i TPTR.4EK;i)r<>TFr<46>Nzpanel/)rr^) r<>r@r<>rr<><00>printrr2<00> importlibr<62>r<><00>getattrr_)<04>mod_namer<65><00> mod_namesr<73>s& r'<00>
reload_modr}<00> s<><00><00><10>G<EFBFBD><0F> <0F><08>><3E>S<EFBFBD> <20> <20><0E><0E>s<EFBFBD>+<2B>I<EFBFBD>!<21>H<EFBFBD><17>3<EFBFBD>;<3B>;<3B>&<26><15>h<EFBFBD><0F>6<><1A>'<27>'<27><01>*<2A>a<EFBFBD>/<2F><1E>s<EFBFBD>{<7B>{<7B>8<EFBFBD>4<>5<>!<21>(<28>(<28><13><1B><1B>X<EFBFBD>)><3E>?<3F><1B>N<EFBFBD>N<EFBFBD>H<EFBFBD>d<EFBFBD>#3<>4<><18><0E><0E><08>%<25>0<>1<>"<22><17><0E><18>K<EFBFBD>K<EFBFBD>$<24>$<24>&<26><08> <13>|<7C> #<23>X<EFBFBD> <13>C<EFBFBD>K<EFBFBD>K<EFBFBD><08>)<29>:<3A>t<EFBFBD> <<3C><01> <0C>1<EFBFBD> 2<><14>6<EFBFBD>6<EFBFBD>(<28>#<23>r<EFBFBD>)<29>8<EFBFBD><16>#<23>#<23>A<EFBFBD>&<26>!<21>+<2B><1A>3<EFBFBD>;<3B>;<3B>x<EFBFBD>0<>1<><1D>$<24>$<24>S<EFBFBD>[<5B>[<5B><18>%:<3A>;<3B><17><0E><0E><08>$<24>/<2F>0<>'<27> <13>N<EFBFBD><4E>)6<><1B>N<EFBFBD>N<EFBFBD>H<EFBFBD>e<EFBFBD>#4<>5<>5<><35>" 2<><17><0E><0E><08>%<25>0<>1<>1<>s <00>A;G<02>G8<02>A;G8<02>G5<05>8Hc<00>^<00>\P^,^8wd&\V4\8XdVP R4p\
P !V4p\P^,^8wd&\V4\8XdVP R4p\P!V4#<00>rr*) rrr<>r@r<><00>base64<36> b64encoder<65>r<>)r~r<>s& r'<00>de_hexbr<62>
s}<00><00>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F> <0F><04>:<3A><13> <1C><17>;<3B>;<3B>w<EFBFBD>'<27>D<EFBFBD> <12> <1C> <1C>T<EFBFBD> "<22>E<EFBFBD>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F> <0F><05>;<3B>#<23> <1D><19>L<EFBFBD>L<EFBFBD><17>)<29>E<EFBFBD> <13> <1B> <1B>E<EFBFBD> "<22>"r&c<00>&<00>\P^,^8wd&\V4\8XdVP R4p\
P !\P!V44p\V4\8wdVPR4pV#r)
rrr<>r@r<>r<><00> b64decoder<65>r<>r <00>r~r<>s& r'<00>en_hexbr<62>sg<00><00>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F> <0F><04>:<3A><13> <1C>T<EFBFBD>[<5B>[<5B><17>%9<>d<EFBFBD> <13> <1D> <1D>h<EFBFBD>0<>0<><14>6<> 7<>F<EFBFBD> <0B>F<EFBFBD>|<7C>s<EFBFBD><1A>V<EFBFBD>]<5D>]<5D>7<EFBFBD>%;<3B>F<EFBFBD> <11>Mr&c<00><><00>^RIp\V4\8Xd \V4p\ V4pVP Wb4pVP WV4pV#r<>)<07>panelPHPr<50>r<>r<><00>get_fpm_address<73>FPM<50>load_url_public) r<>rQ<00> document_rootr<74>r<>r<><00> fpm_addressr5r<>s &&&&& r'<00> request_phpr<70>5sI<00><00><13> <0B>E<EFBFBD>{<7B>d<EFBFBD><1A>J<EFBFBD>u<EFBFBD>$5<>E<EFBFBD>!<21>'<27>*<2A>K<EFBFBD><10> <0C> <0C>[<5B>0<>A<EFBFBD> <0E> <1E> <1E>s<EFBFBD>6<EFBFBD> 2<>F<EFBFBD> <11>Mr&c<04><00>RPV4pRP\4V4p\V4p\P!RV4pV'gV#V^,P R4R8wdV#V^,P R4R8wdUV^,P R4pV'dV^,\V^,43pV#R\V^,43pV#R\V^,43pV# Tu#;i)uu
@name 获取FPM请求地址
@author hwliang<2020-10-23>
@param php_version string PHP版本
@return tuple or string
z/tmp/php-cgi-{}.sockz{}/php/{}/etc/php-fpm.confzlisten\s*=\s*(.+)<29>sockr<6B>r<>r^)rAr{rqrr<>r_r<>r<>)<07> php_version<6F>bindr<64><00> php_fpm_file<6C>fpm_confr<66><00>
listen_tmps&& r'r<>r<>>s<><00><00>)<29>/<2F>/<2F> <0B><<3C>K<EFBFBD>/<2F>6<>6<>~<7E>7G<37><1B>U<>L<EFBFBD><1B><1B>L<EFBFBD>)<29><08><10>j<EFBFBD>j<EFBFBD>-<2D>x<EFBFBD>8<><03><12>;<3B>&<26> <0E>q<EFBFBD>6<EFBFBD>;<3B>;<3B>v<EFBFBD> <1E>"<22> $<24>[<5B>&8<> <0E>q<EFBFBD>6<EFBFBD>;<3B>;<3B>s<EFBFBD> <1B>r<EFBFBD> !<21><1C>Q<EFBFBD><16><1C><1C>c<EFBFBD>*<2A>J<EFBFBD><13>)<29>!<21>}<7D>c<EFBFBD>*<2A>Q<EFBFBD>-<2D>.@<40>A<> <0B>
<1B><1A> +<2B>C<EFBFBD>
<EFBFBD>1<EFBFBD> <0A>,><3E>?<3F> <0B><1B><1A>'<27><03>C<EFBFBD><01>F<EFBFBD> <0B>4<>K<EFBFBD><1A><1A><><1B><1A><1A>s)<00>+C?<00>C?<00>8<C?<00>5C?<00>C?<00>)C?<00>?Dc<04>H<00>\V4p\V\4'd3VR8XdRPV4#VR8XdRPV4#R#VR8Xd!RPV^,V^,4#VR8Xd!RPV^,V^,4#R#)u<>
@name 获取PHP代理地址
@author hwliang<2020-10-24>
@param php_version string php版本 (52|53|54|55|56|70|71|72|73|74)
@param webserver string web服务器类型 (nginx|apache|ols)
return string
rtzunix:{}ruzunix:{}|fcgi://localhostz{}:{}z fcgi://{}:{}N)r<>r<>r@rA)r<>r<><00> php_addresss&& r'<00> get_php_proxyr<79>Ys<><00><00>"<22>+<2B>.<2E>K<EFBFBD><11>+<2B>s<EFBFBD>#<23>#<23> <14><07> <1F><1C>#<23>#<23>K<EFBFBD>0<> 0<> <16>(<28> "<22>-<2D>4<>4<>[<5B>A<> A<>#<23> <15><07> <1F><1A>><3E>><3E>+<2B>a<EFBFBD>.<2E>+<2B>a<EFBFBD>.<2E>A<> A<> <16>(<28> "<22>!<21>(<28>(<28><1B>Q<EFBFBD><1E><1B>Q<EFBFBD><1E>H<> H<>#r&c<04><><00>V'gR#VPR4R8wd-Rp\P!W4pV'gR#V^,#VPR4R8wd-Rp\P!W4pV'gR#V^,#Rp\P!W4pV'g#Rp\P!W4pV'gR#V^,#) u}
@name 从指定配置文件获取PHP版本
@author hwliang<2020-10-24>
@param conf string 配置文件内容
@return string
<EFBFBD>00z enable-php-z enable-php-(\w{2,5})[-\w]*\.confz/usr/local/lsws/lsphpz+path\s*/usr/local/lsws/lsphp(\d+)/bin/lsphpzphp-cgi-([0-9]{2,3})\.sockz\d+\.\d+\.\d+\.\d+:10(\d{2,2})1r^)r_rr<>)rsr<>r<>s& r'<00>get_php_version_confr<66>ns<><00><00> <10><04> <0B>y<EFBFBD>y<EFBFBD><1D><1F>2<EFBFBD>%<25>1<><03><10>j<EFBFBD>j<EFBFBD><13>#<23><03><12>4<EFBFBD>s<EFBFBD> <0F>q<EFBFBD>6<EFBFBD>M<EFBFBD>
<0E><19><19>*<2A> +<2B>r<EFBFBD> 1<><<3C><03><10>j<EFBFBD>j<EFBFBD><13>#<23><03><12>4<EFBFBD>s<EFBFBD> <0F>q<EFBFBD>6<EFBFBD>M<EFBFBD>,<2C><03><10>j<EFBFBD>j<EFBFBD><13>#<23><03><12>4<>C<EFBFBD><14>*<2A>*<2A>S<EFBFBD>'<27>C<EFBFBD><16><1B> <0E>q<EFBFBD>6<EFBFBD>Mr&c<04><><00>\4p\P!4'd^\P!R4P RV4P R4P 4pVR,'d
VR,MRp\4p\VR,V,R,V,R,4pVR8Xd/\VR,V,R,V,R,4p\V4#) u<>
@name 获取指定网站当前使用的PHP版本
@author hwliang<2020-10-24>
@param siteName string 网站名称
@return string
<EFBFBD>siteszname = ?<3F> service_typertr{r<>rvz/detail/)
r<EFBFBD>rir<>r8r^<00>fieldr_rrqr<>)<05>siteName<6D>
web_server<EFBFBD>site<74>
vhost_pathrss& r'<00>get_site_php_versionr<6E><00>s<><00><00><1F><1F>J<EFBFBD> <0A>)<29>)<29>+<2B>+<2B><15>x<EFBFBD>x<EFBFBD><07> <20>&<26>&<26>z<EFBFBD>(<28>;<3B>A<>A<>.<2E>Q<>V<>V<>X<><04>-1<>.<2E>-A<>-A<>T<EFBFBD>.<2E>)<29>w<EFBFBD>
<EFBFBD><1F>!<21>J<EFBFBD> <13>J<EFBFBD><13>$<24>z<EFBFBD>1<>C<EFBFBD>7<>(<28>B<>W<EFBFBD>L<> M<>D<EFBFBD><11>_<EFBFBD>$<24><17>
<EFBFBD>S<EFBFBD>(<28>:<3A>5<>
<EFBFBD>B<>X<EFBFBD>M<>PW<50>W<>X<><04> <1F><04> %<25>%r&c<04><><00>^RIpVP!4pVP^4VPVP4\ V434VP 4R# R#;i)u<>
@name 使用TCP的方式检测指定IP:端口是否能连接
@author hwliang<2021-06-01>
@param ip<string> IP地址
@param port<int> 端口
@return bool
NFT)r<>rirjrIr<>r<>)r<>r<>r<>r<>s&& r'<00> check_tcpr<70><00>sU<00><00><12><15> <12>M<EFBFBD>M<EFBFBD>O<EFBFBD><01> <09> <0C> <0C>Q<EFBFBD><0F> <09> <09> <09>2<EFBFBD>8<EFBFBD>8<EFBFBD>:<3A>s<EFBFBD>4<EFBFBD>y<EFBFBD>)<29>*<2A> <09><07><07> <09> <10><><15><14>s <00>AA$<00>$A)c<04><00>\PPV4'gR#\PPV4'gR#\ V4pV'gR#VP R4R,P VR,4^8wd\V4pWS8wdR#\P!W4pV'gR#VP4V8XdR#VPVP4V4p\W4R#)u
@name 替换新的PHP配置到配置文件
@author hwliang<2020-10-24>
@param conf_file string 配置文件全路径
@param rep string 用于查找目标替换内容的正则表达式
@param tsub string 新的内容
@param php_version string 指定PHP版本
@return bool
Frr<>Tr^) rlrmr<>rnrqr<>r_r<>rr<>r<>rrrs)<07> conf_filer<65><00>tsubr<62>rs<00>phpvr<76>s&&&& r'<00>sub_php_addressr<73><00>s<><00><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24>U<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24>U<EFBFBD> <13>I<EFBFBD> <1E>D<EFBFBD> <0F><05><10><EFBFBD><EFBFBD>s<EFBFBD><1B>B<EFBFBD><1F>$<24>$<24>[<5B>3<EFBFBD>%6<>7<>1<EFBFBD><<3C>#<23>D<EFBFBD>)<29><04> <0F> <1E>u<EFBFBD>
<0C>)<29>)<29>C<EFBFBD>
<1E>C<EFBFBD> <0E>u<EFBFBD>
<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>d<EFBFBD><1A>5<EFBFBD> <0F><<3C><<3C><03> <09> <09> <0B>T<EFBFBD> *<2A>D<EFBFBD> <0A>i<EFBFBD><1E> r&c<04>B<00>\4pVFp\V4K R#)u[
@name 同步所有PHP版本配置到配置文件
@author hwliang<2020-10-24>
@return void
N)<02>get_php_versions<6E>sync_php_address)<02> php_versionsr<73>s r'<00>sync_all_addressr<73><00>s<00><00> $<24>%<25>L<EFBFBD><1C><04><18><14><1E>r&c<04><><00>\PPRP\ 4V44'gR#RpRp\ VR4p\ VR4pRpRP\ 44p\PPV4'd^\P !V4FCpVPR4R 8wgKR PWg34p\W<>W04'gKAR
pKE R P\44p \PPV 4'dF\P !V 4F+pR PW<>34p\W<>W@4'gK)R
pK- R P\ 44p\PPV4'd\W<>W@4'dR
pV'd \4R
#)u
@name 同步PHP版本配置到所有配置文件
@author hwliang<2020-10-24>
@param php_version string PHP版本
@return void
z{}/php/{}/bin/phpFz2(unix:/tmp/php-cgi.*\.sock|\d+\.\d+\.\d+\.\d+:\d+)zK(unix:/tmp/php-cgi.*\.sock\|fcgi://localhost|fcgi://\d+\.\d+\.\d+\.\d+:\d+)rtruz {}/nginx/confz
enable-phpr{Tz {}/apachez&{}/apache/conf/extra/httpd-vhosts.confr^) rlrmrnrAr{r<>r<>r_r<>r<>rr<>)
r<EFBFBD><00>ngx_rep<65>apa_rep<65> ngx_proxy<78> apa_proxy<78>is_write<74>nginx_conf_path<74>f_namer<65><00>apache_conf_paths
& r'r<>r<><00>sg<00><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>-<2D>4<>4<>^<5E>5E<35>{<7B>S<> T<> T<><14>C<>G<EFBFBD>\<5C>G<EFBFBD><1D>k<EFBFBD>7<EFBFBD>3<>I<EFBFBD><1D>k<EFBFBD>8<EFBFBD>4<>I<EFBFBD><14>H<EFBFBD>&<26>,<2C>,<2C>^<5E>-=<3D>><3E>O<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>o<EFBFBD>&<26>&<26><18>j<EFBFBD>j<EFBFBD><1F>1<>F<EFBFBD><15>{<7B>{<7B><<3C>(<28>B<EFBFBD>.<2E><1F>H<EFBFBD>H<EFBFBD>o<EFBFBD>%><3E>?<3F> <09>"<22>9<EFBFBD>y<EFBFBD>N<>N<>#<23>H<EFBFBD> 2<>#<23>)<29>)<29>.<2E>*:<3A>;<3B><14> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>&<26>'<27>'<27><18>j<EFBFBD>j<EFBFBD>!1<>2<>F<EFBFBD><1B><08><08>"2<>!;<3B><<3C>I<EFBFBD><1E>y<EFBFBD>9<EFBFBD>J<>J<><1F><08>3<>
9<>?<3F>?<3F><0E>@P<>Q<>I<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20> <1A>9<EFBFBD>y<EFBFBD> F<> F<><1B>H<EFBFBD><0F><1D><1F> r&c<00><><00>\V4\8wdV#\P^,^8wd"^RIpVP
P V4pV#^RIpVPV4pV#r<>) r<>r@rr<00> urllib.parse<73>parser<65>r<><00> urlencode<64>r~r<>r<>s& r'r<>r<>s]<00><00> <0B>D<EFBFBD>z<EFBFBD>S<EFBFBD><18><14>+<2B>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F><1B><16> <0C> <0C>"<22>"<22>4<EFBFBD>(<28><05>
<11>L<EFBFBD> <16><16> <20> <20><14>&<26><05> <10>Lr&c<00><><00>\V4\8wdV#\P^,^8wd"^RIpVP
P V4pV#^RIpVPV4pV#r<>) r<>r@rrr<>r<>r<>r<><00> urldecoder<65>s& r'<00>
url_decoder<EFBFBD>s]<00><00> <0B>D<EFBFBD>z<EFBFBD>S<EFBFBD><18><14>+<2B>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F><1B><16> <0C> <0C>$<24>$<24>T<EFBFBD>*<2A><05>
<11>L<EFBFBD> <16><16> <20> <20><14>&<26><05> <10>Lr&c<00><><00>\P^,^8Xd\VRR7pV#VPRRR7pV# Tu#;i<01>rrrr1)rr<00>unicoder<65>r<>s& r'<00>unicode_encoder<65><00>R<00><00><14> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23><1C>T<EFBFBD>(<28>3<>F<EFBFBD><16> <0A><1A>[<5B>[<5B><16><08>[<5B>9<>F<EFBFBD><15> <0A><><14><13> <0B><><00>*A<00>A<00>Ac<00><><00>\P^,^8Xd\VRR7pV#VPRRR7pV# Tu#;ir<>)rrr<>r )r~<00>charsetr<74>s&& r'<00>unicode_decoder<65>'r<>r<>c<00><><00>Rp\PPV4'gR#^RIpR# \ T4^RIpR#;i)zplugin/static_cdnTN)rlrmrn<00>static_cdn_main<69>package_path_append)<02> plugin_pathr<68>s r'<00>import_cdn_pluginr<6E>4s6<00><00>%<25>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26>t<EFBFBD><1F><1E><><1F><1B>K<EFBFBD>(<28><1E>s <00>1<00>Ac<00><><00>\4'd.#^RIpVP4PR4# .u#;ir<>)r<>r<><00> get_hosts)r<>s r'<00> get_cdn_hostsr<73>>s=<00><00><12> <1C> <1E> <1E>r<EFBFBD> <09><1E><1E>.<2E>.<2E>0<>:<3A>:<3A>4<EFBFBD>@<40>@<40><><12><11> <09>s <00>7<00>"7<00>=c<00>8<00>\PPR4'dR#^RIHpVP R4pV'dV#\ 4'dR#^RIpVP4PR4pVPRV^4V# R#;i)zplugin/static_cdn/not_open.plFr<46><00>cdn_urlN)
rlrmrnrrdrbr<>r<>rr<>)rdr<>r<>s r'<00> get_cdn_urlr<6C>Hs|<00><00> <15> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>9<> :<3A> :<3A><18>"<22><17>)<29>)<29>I<EFBFBD>&<26><07> <12>7<EFBFBD>N<EFBFBD> <1C> <1E> <1E>u<EFBFBD><1E>!<21>1<>1<>3<>;<3B>;<3B>D<EFBFBD>A<><07> <0A> <09> <09>)<29>W<EFBFBD>a<EFBFBD>(<28><16><0E><><15><14>s"<00>$B<00>B<00>B<00>
B<00>7B<00>Bc<00><><00>V'gR#\4\4pWn^RIpVP4P V4R#r<>)r<><00>dict_objr<6A>r<><00>set_url)r<>rbr<>s& r'<00> set_cdn_urlr<6C>Ys6<00><00> <12>5<EFBFBD><15><17>
<12>*<2A>C<EFBFBD><19>K<EFBFBD><1A><13>#<23>#<23>%<25>-<2D>-<2D>c<EFBFBD>2<> r&c<00><><00>RP\44p\PP V4'dV#R#)z{}/pyenv/bin/python3z/usr/bin/pythonr0<00><01>bin_files r'<00>get_python_binr<6E>ds0<00><00>%<25>,<2C>,<2C>^<5E>-=<3D>><3E>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><17><0F> r&c<00><><00>RP\44p\PP V4'dV#R#)z{}/pyenv/bin/pipz /usr/bin/pipr0r<>s r'<00> get_pip_binr<6E>ks0<00><00>!<21>(<28>(<28><1E>)9<>:<3A>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><17><0F> r&c<00><><00>^RIp\P^,^8Xd#VPV4pVP V4#VP V4pVP V4#r<>)<06>panelAesrr<00> aescrypt_py2<79>
aesencrypt<EFBFBD> aescrypt_py3<79>r~rSr<><00>aes_objs&& r'<00> aes_encryptr<74>r<00>Z<00><00><13>
<EFBFBD><17><17><01><1A>a<EFBFBD><1F><1A>'<27>'<27><03>,<2C><07><16>!<21>!<21>$<24>'<27>'<27><1A>'<27>'<27><03>,<2C><07><16>!<21>!<21>$<24>'<27>'r&c<00><><00>^RIp\P^,^8Xd#VPV4pVP V4#VP V4pVP V4#r<>)r<>rrr<><00>
aesdecryptr<EFBFBD>r<>s&& r'<00> aes_decryptr<74>|r<>r&c<00><00>\PPV4'gR#RV,p\PPV4V8<>d\ W4p\ W4R#R# \ \44R#;i)FN<46>)rlrmrnr~r*rsrxr<>)r<>r<><00>old_line<6E>old_bodys&&& r'<00> clean_max_logr<67><00>sd<00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD><1A>X<EFBFBD>%<25>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD><EFBFBD><EFBFBD>x<EFBFBD> <20>8<EFBFBD>+<2B> $<24>"<22>8<EFBFBD>6<>H<EFBFBD> <15>h<EFBFBD> )<29>,<2C><> $<24> <11>.<2E>"<22> #<23>s <00>A0<00>0Bc<00>l<00>^RIp\4pWnVP4PV4pV#r<>)<04>panelSSLr<4C>rS<00> GetCertName)rmr<>rbr~s& r'rRrR<00>s/<00><00><13>
<12>*<2A>C<EFBFBD><17>L<EFBFBD> <13> <1C> <1C> <1E> *<2A> *<2A>3<EFBFBD> /<2F>D<EFBFBD> <0F>Kr&c<00><><00>RpRp\PPV4'd<\V4P 4^,^,pRP V4pV#V# RpT#;i)<04>ubunturhzcentos{}<7D>centos7)rlrmrnrqr<>rA)<03> distribution<6F> redhat_filer<65>s r'<00>get_linux_distributionr<6E><00>sr<00><00><1B>L<EFBFBD>'<27>K<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>k<EFBFBD>"<22>"<22> %<25><1A>;<3B>'<27>-<2D>-<2D>/<2F><01>2<>1<EFBFBD>5<>C<EFBFBD>%<25>,<2C>,<2C>S<EFBFBD>1<>L<EFBFBD> <18><17><<3C><17><> %<25>$<24>L<EFBFBD> <18><17>s <00>8A'<00>'A.c<04>J<00>\VR, 4p\WR,,
R, 4p\WR,,
VR,,
R, 4p\WR,,
VR,,
VR,,
4pRPWW44#)um
@name 将整数转换为IP地址
@author hwliang<2020-06-11>
@param ips string(ip地址整数)
@return ipv4
z {}.{}.{}.{}<7D><01>r<>)r<>rA)<05>ips<70>i1<69>i2<69>i3<69>i4s& r'<00>long2ipr<00>s}<00><00>
<0A>S<EFBFBD>G<EFBFBD>_<EFBFBD> <1D>B<EFBFBD> <0C>c<EFBFBD>'<27>N<EFBFBD>"<22>w<EFBFBD> /<2F> 0<>B<EFBFBD> <0C>s<EFBFBD>7<EFBFBD>^<5E>#<23>r<EFBFBD>W<EFBFBD>~<7E>5<>&<26> A<> B<>B<EFBFBD> <0C>s<EFBFBD>7<EFBFBD>^<5E>#<23>r<EFBFBD>W<EFBFBD>~<7E>5<><12>v<EFBFBD><1D> F<> G<>B<EFBFBD> <18> <1F> <1F><02><02> /<2F>/r&c<04>$<00>VPR4p\V4^8wd^#R\V^,4,R\V^,4,,R\V^,4,,\V^,4,pV#)ub
@name 将IP地址转换为整数
@author hwliang<2020-06-11>
@param ip string(ipv4)
@return long
r<EFBFBD>r<>r<>r<>)r<>r<>r<>)r<>r<>r s& r'rr<00>sk<00><00> <0A>(<28>(<28>3<EFBFBD>-<2D>C<EFBFBD>
<EFBFBD>3<EFBFBD>x<EFBFBD>1<EFBFBD>}<7D>Q<EFBFBD> <14>s<EFBFBD>3<EFBFBD>q<EFBFBD>6<EFBFBD>{<7B> "<22>W<EFBFBD>s<EFBFBD>3<EFBFBD>q<EFBFBD>6<EFBFBD>{<7B>%:<3A> :<3A>V<EFBFBD>c<EFBFBD>#<23>a<EFBFBD>&<26>k<EFBFBD>=Q<> Q<>TW<54>X[<5B>\]<5D>X^<5E>T_<54> _<>F<EFBFBD> <11>Mr&c<04>F<00>Rp\P!W4'dR#R#)um
@name 判断是否为本地(内网)IP地址
@author hwliang<2021-03-26>
@param ip string(ipv4)
@return bool
zK^(192\.168|127|10|172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31))\.TF<54>rr<>)r<><00>patts& r'<00> is_local_ipr<00>s<00><00> Z<01>D<EFBFBD> <09>x<EFBFBD>x<EFBFBD><04><19><19>$<24> r&c<00><00>^RIHp\4R,\VPP R44,R,\\ \P!444,R,\4,#)rrrr<>r<>r<>) rrsr<>r@r<>rbr<>r<>r<>rrs r'<00> get_debug_logr <00>sa<00><00> <20> <16>=<3D>3<EFBFBD> <1E><13>W<EFBFBD>_<EFBFBD>_<EFBFBD>%8<>%8<><1D>%G<>!H<> H<>3<EFBFBD> N<>QT<51> <0B>D<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD><18>R<1A> <1A><1F> <20>"0<>"2<> 3<>3r&c<00><><00>^RIHpHpVPP VP
R,R4p\ P!RV4'g \^@4#V#)r)rs<00>app<70>SESSION_COOKIE_NAMErFz^([\w\.-]{64,64})$) rrsr <00>cookiesrbrTrr<>r<>)rsr <00>
session_ids r'<00>get_session_idr<00>sH<00><00>%<25><18><1F><1F>$<24>$<24>S<EFBFBD>Z<EFBFBD>Z<EFBFBD>0E<30>%F<><02>K<>J<EFBFBD> <0A>:<3A>:<3A>+<2B>Z<EFBFBD> 8<> 8<><1E>r<EFBFBD>"<22>"<22> <15>r&c<00>p<00>RP\44pVR,pVR,\R4,R,pRP\44p\P
!V4pV'gR#\ VRR7pR pVFgpVR
,V,R ,p\PPV4'gKA\PPV4R 8dKgM V'gR#\R PW44\R PWQ44R#)z{}/data/rC<00>default_z %Y%m%d_%H%M%Sz.dbr?FTr[rFr{z/data/default.dbiDz\cp -arf {} {}) rAr<>r<>rKrlr<><00>sortedrmrnr~r<>)<07>db_path<74>db_file<6C> db_tmp_backup<75> panel_backup<75>bak_list<73> db_bak_file<6C>d_names r'<00>rep_default_dbr<00>s<><00><00><18><1F><1F><0E> 0<>1<>G<EFBFBD><15> <0C>$<24>G<EFBFBD><1B>j<EFBFBD>(<28>;<3B><EFBFBD>+G<>G<>%<25>O<>M<EFBFBD><1D>$<24>$<24>_<EFBFBD>%6<>7<>L<EFBFBD><11>z<EFBFBD>z<EFBFBD>,<2C>'<27>H<EFBFBD> <13>E<EFBFBD><15>h<EFBFBD><04>-<2D>H<EFBFBD><14>K<EFBFBD><1A><06>"<22>S<EFBFBD>(<28>6<EFBFBD>1<>4F<34>F<> <0B><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>k<EFBFBD>*<2A>*<2A>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>?<3F>?<3F>;<3B> '<27>%<25> /<2F><18> <0A> <1B> <17>u<EFBFBD> <0A><1F>&<26>&<26>w<EFBFBD>><3E>?<3F> <0A><1F>&<26>&<26>{<7B><<3C>=<3D> r&c<04>j<00>\R4PRR4P4'g\R4PRR4\R4PRR4P R4P 4p\ V\4'd<>VPR4R8wd<>\4\R4PRR4P4'g\R4PRR4\R4PRR4P R4P 4pVFrp\^ 4p/p\\VR,R ,4V,4VR&W#R
&\R4PR VR ,34PV4Kt R #)up
@name 检查所有用户密码是否加盐,若没有则自动加上
@author hwliang<2020-07-08>
@return void
<EFBFBD> sqlite_master<65> type=? AND name=? AND sql LIKE ?<3F>usersz#ALTER TABLE 'users' ADD 'salt' TEXTz salt is NULLzid,username,password,saltzno such table: usersr&<00>_capnis.comrgr<>r!N)r6rz%salt%r%r^) r8r^r<00>executer<65><00>selectr<74>r@r_rr<>r<>r<>)<04>u_list<73>u_inforgr<>s r'<00>
chdck_saltr$<00>sW<00><00> <0A>_<EFBFBD> <1D> #<23> #<23>$F<>Hd<48> e<> k<> k<> m<> m<> <09>'<27>
<EFBFBD><1A><1A>@<40>"<22>E<> <0E>w<EFBFBD>Z<EFBFBD> <1D> <1D>n<EFBFBD>b<EFBFBD> 1<> 7<> 7<>8S<38> T<> [<5B> [<5B> ]<5D>F<EFBFBD><11>&<26>#<23><1E><1E> <11>;<3B>;<3B>-<2D> .<2E>"<22> 4<> <1A> <1C><14>_<EFBFBD>%<25>+<2B>+<2B>,N<>Pl<50>m<>s<>s<>u<>u<><11>'<27>
<EFBFBD>"<22>"<22>#H<>"<22>M<><16>w<EFBFBD>Z<EFBFBD>%<25>%<25>n<EFBFBD>b<EFBFBD>9<>?<3F>?<3F>@[<5B>\<5C>c<>c<>e<>F<EFBFBD><18><06><1E>r<EFBFBD>"<22><04><12><05><1F><03>F<EFBFBD>:<3A>$6<><18>$A<> B<>T<EFBFBD> I<>J<><05>j<EFBFBD><19><1C>f<EFBFBD> <0A> <09>'<27>
<EFBFBD><18><18><16>&<26><14>,<2C><1F>1<>8<>8<><15>?<3F> r&c<00>p<00>\RP\444pV'g \^ 4#V#)<01>{}/data/login_token.pl)rqrAr<>r<>)<01>token_ss r'<00>get_login_tokenr(s-<00><00><16>/<2F>6<>6<>~<7E>7G<37>H<>I<>G<EFBFBD> <12>?<3F>2<EFBFBD>.<2E>.<2E> <12>Nr&c<00>F<00>\\4\4,4#rN)r<>r(<00>get_csrf_sess_html_token_valuer%r&r'<00> get_sess_keyr+s<00><00> <0E><EFBFBD> <20>#A<>#C<>C<> D<>Dr&c<04><<00>\4V'g?V'g \R4h\R4PRV34P R4p\R4PRV34P R4p\ \ VR,4V,4#)u<>
@name 为指定密码加盐
@author hwliang<2020-07-08>
@param password string(被md5加密一次的密码)
@param username string(用户名) 可选
@param uid int(uid) 可选
@return string
uusername或uid必需传一项rz
username=?r!r<>rgr)r$r<>r8r^r<>r<>)r&rrrgs&&& r'<00> password_saltr-s{<00><00><0F>L<EFBFBD> <0E><17><1B>;<3B><<3C> <<3C><0F><07>j<EFBFBD><1E><1E>|<7C>h<EFBFBD>[<5B>9<>B<>B<>4<EFBFBD>H<><03> <0C>W<EFBFBD>:<3A> <1B> <1B>F<EFBFBD>S<EFBFBD>F<EFBFBD> +<2B> 4<> 4<>V<EFBFBD> <<3C>D<EFBFBD> <0E>s<EFBFBD>8<EFBFBD>h<EFBFBD>&<26>'<27>$<24>.<2E> /<2F>/r&c<04>`<00>RpV'dRp\RPWV,44R#)u<>
@name 备份配置文件
@author zhwen<zhw@yakpanel.com>
@param file 需要备份的文件
@param act 如果存在,则备份一份作为默认配置
<EFBFBD>_bak<61>_defz/usr/bin/cp -p {0} {1}Nr<4E><00>r<><00>act<63> file_types&& r'<00> back_filer41<00>*<00><00><17>I<EFBFBD>
<EFBFBD><1A> <09> <0A>&<26>-<2D>-<2D>d<EFBFBD>9<EFBFBD>4D<34>E<>Fr&c<04>`<00>RpV'dRp\RPWV,44R#)u<>
@name 还原配置文件
@author zhwen<zhw@yakpanel.com>
@param file 需要还原的文件
@param act 如果存在,则还原默认配置
r/r0z/usr/bin/cp -p {1} {0}Nr<4E>r1s&& r'<00> restore_filer7?r5r&c<00>t<00>V\P9g#\PP^V4R#R#r<><00>rrmrrJs&r'r<>r<>Ls%<00><00> <0F>3<EFBFBD>8<EFBFBD>8<EFBFBD> <1B> <0B><08><08><0F><0F><01>4<EFBFBD> <20> r&c<00><><00>.p\PFpW9dK VPV4K V\nR#rN)rrmr<>)<02>sys_pathr5s r'r<>r<>Qs1<00><00><11>H<EFBFBD> <10>X<EFBFBD>X<EFBFBD><01> <0C>=<3D>(<28><10><0F><0F><01><1A><16><18>C<EFBFBD>Hr&c<04><><00>Rp\V4pV'gRp\P!RV4p^pVF7pRp\P!WT4pV'gK%\V^,4pK9 V#)uE
@name 获取本机SSH端口
@author hwliang<2020-08-07>
@return int
r<EFBFBD>rFz.*Port\s+[0-9]+z^\s*Port\s+([0-9]+)\s*)rqrr<>r<>)r1rs<00>port_all<6C>ssh_portr5r<>rUs r'<00> get_ssh_portr?Ysf<00><00> $<24>F<EFBFBD> <13>F<EFBFBD> <1B>D<EFBFBD> <0F><02><14><11>z<EFBFBD>z<EFBFBD>,<2C>d<EFBFBD>3<>H<EFBFBD><11>H<EFBFBD> <15><01>'<27><03><11>z<EFBFBD>z<EFBFBD>#<23>!<21><04> <0F>4<EFBFBD><1A>4<EFBFBD><01>7<EFBFBD>|<7C>H<EFBFBD> <16> <14>Or&c<04><><00>^RIHp\V4pVPV4pV'g^pMV'dVP V4R#VP W^,V4R#)u<>
@name 设置失败次数(每调用一次+1)
@author hwliang<2020-08-21>
@param key<string> 索引
@param empty<bool> 是否清空计数
@param expire<int> 计数器生命周期(秒)
@return bool
r<EFBFBD>T)rrdr<>rbrjr<>)rS<00>empty<74>expirerdr s&&& r'<00> set_error_numrCmsL<00><00><1F>
<0A>c<EFBFBD>(<28>C<EFBFBD>
<0F>)<29>)<29>C<EFBFBD>.<2E>C<EFBFBD> <0E><0F><03> <10> <11>L<EFBFBD>L<EFBFBD><13> <1D><17> <09>I<EFBFBD>I<EFBFBD>c<EFBFBD><11>7<EFBFBD>F<EFBFBD>#<23> r&c<04><><00>^RIHp\V4pVPV4pV'g^pV'gV#W8<>dR#R#)u
@name 获取失败次数
@author hwliang<2020-08-21>
@param key<string> 索引
@param limit<False or int> 如果为False则直接返回失败次数否则与失败次数比较若大于失败次数返回True否则返回False
@return int or bool
r<EFBFBD>TF)rrdr<>rb)rS<00>limitrdr s&& r'<00> get_error_numrF<00>s7<00><00><1F>
<0A>c<EFBFBD>(<28>C<EFBFBD>
<0F>)<29>)<29>C<EFBFBD>.<2E>C<EFBFBD> <0E>a<EFBFBD><03> <10><12>
<EFBFBD> <0C>{<7B><13> r&c<04><><00>^RIHp\P!\ R44p\ R4pVP R4pV'd<>\P!V4p.p\ \V44FNpW,R,V9dKW,R,R8Xd V'dK7VPW,4KP Tp??\VRR7pV#) uC
@name 获取菜单列表
@author hwliang<2020-08-31>
@return list
rzconfig/menu.jsonzconfig/hide_menu.jsonrr!<00>
memuAxtermc<00><00>VR,#)r`r%<00>r<>s&r'rp<00>get_menus.<locals>.<lambda><3E>s<00><00>q<EFBFBD><16>yr&rc)
rrrorpr<>rbr<>r<>r<>r)rr~<00> hide_menur<00> show_menur<75><00>menuss r'<00> get_menusrO<00>s<><00><00> !<21> <0F>:<3A>:<3A>h<EFBFBD>1<>2<> 3<>D<EFBFBD><18>0<>1<>I<EFBFBD> <13>K<EFBFBD>K<EFBFBD><07> <20>E<EFBFBD><10><18>J<EFBFBD>J<EFBFBD>y<EFBFBD>)<29> <09><16> <09><16>s<EFBFBD>4<EFBFBD>y<EFBFBD>!<21>A<EFBFBD><13>w<EFBFBD>t<EFBFBD>}<7D> <09>)<29><18><13>w<EFBFBD>t<EFBFBD>}<7D> <0C>,<2C><18>(<28> <15> <1C> <1C>T<EFBFBD>W<EFBFBD> %<25> "<22> <19><04> <16> <16> <12>4<EFBFBD>0<> 1<>E<EFBFBD> <10>Lr&c<00>$<00>V^8<>dQhR\/#r<><00>r<>)rAs"r'rBrB<00>s<00><00><1B><1B>d<EFBFBD>r&c<04><><00>^RIpVP4P4pVPR4^8Xd<>VPR.4Uu.uFqq"PRR4RJgKRVPR4RVPR4R VPR 4R
VPR
4R VPR 4/NKs ppV#\ 4#uupi) uO
@name 获取用户路由菜单列表
@author hwliang<2020-08-31>
@return list
Nr<EFBFBD>r<><00>showFTr<00>href<65>classr!r`)<05> config_v2rT<00> get_menu_listrbrO)rV<00> menu_listr<74>r<>s r'<00>get_menus_for_session_routerrY<00>s<><00><00> <15><19> <20> <20>"<22>0<>0<>2<>I<EFBFBD><10>}<7D>}<7D>X<EFBFBD><1E>!<21>#<23>!<21>}<7D>}<7D>Y<EFBFBD><02>3<>
<EFBFBD>4<>!<21>u<EFBFBD>u<EFBFBD>V<EFBFBD>U<EFBFBD>7K<37>t<EFBFBD>7S<37>  <0E><17><11><15><15>w<EFBFBD><1E><16><01><05><05>f<EFBFBD> <0A><17><11><15><15>w<EFBFBD><1E><14>a<EFBFBD>e<EFBFBD>e<EFBFBD>D<EFBFBD>k<EFBFBD><16><01><05><05>f<EFBFBD> <0A>  <0E> 4<> <0F>
<EFBFBD><16> <0A><18>{<7B><1A><>
s <00> C<04>)ACc<00>0<00>V^8<>dQhR\R\/#<00>r:r~r=r<>)rAs"r'rBrB<00>s<00><00><10><10>3<EFBFBD><10>3<EFBFBD>r&c<04><><00>^RIpV'gV#\V\4'gV#RFBpVPV4'gKVP V\ V4R4R,pVu# V#)u3
@name 数据解密
@param data <str>
@return str
Nr<EFBFBD>)zYP-0x:zBT-0x:)<06> PluginLoaderr<72>r@r<00>
db_decryptr<EFBFBD>)r~r]<00>_pfxrfs& r'<00>_decryptr`<00>sf<00><00> <18> <0F><13> <0B> <15>d<EFBFBD>C<EFBFBD> <20> <20><13> <0B>$<24><04> <0F>?<3F>?<3F>4<EFBFBD> <20> <20><1E>)<29>)<29>$<24>s<EFBFBD>4<EFBFBD>y<EFBFBD>{<7B>*;<3B><<3C>U<EFBFBD>C<>C<EFBFBD><16>J<EFBFBD> %<25>
<10>Kr&c<00>0<00>V^8<>dQhR\R\/#)r:<00> session_uidr=)r<>r<>)rAs"r'rBrB<00>s<00><00>!<10>!<10><13>!<10><14>!r&c <04><00>R^RRRRR^R./pRR .p\R
4PR V34P4'gV#R p\PP VR 4p\PP V4'gV#\PP V4'gV#\PP V\V44p\PP V4'gV#\V4pV'd \P!\V44MTp\VPR44VR&Y!PR.4,TR&T# \dR^RRRRRRR./u#i;i)u<>
@name 获取user解密后权限信息
@param session_uid <int>
@return {"id": 2,
"username": "test_user",
"role": "ordinary",
"state": 1,
"menu": ["/", "/site"...]}
r!rrF<00>role<6C>unknow<6F>state<74>menur{<00>/loginrr<>z/www/server/panel/plugin/users/<2F> authorityr<79>)r8r^r!rlrmr<>rnr@rqrorpr`r<>rbr<>)rbr~<00> enable_listr<74><00>authority_path<74>uid_authority_paths& r'<00>get_user_authority_inform<00>sU<00><00> <11>!<21>Z<EFBFBD><12>V<EFBFBD>X<EFBFBD>w<EFBFBD><01>6<EFBFBD>2<EFBFBD> N<>D<EFBFBD><16><08>/<2F>K<EFBFBD> <0C>W<EFBFBD>:<3A> <1B> <1B>F<EFBFBD>[<5B>N<EFBFBD> 3<> :<3A> :<3A> <<3C> <<3C><13> <0B>3<>K<EFBFBD><17>W<EFBFBD>W<EFBFBD>\<5C>\<5C>+<2B>{<7B>;<3B>N<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26><13> <0B> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>.<2E> )<29> )<29><13> <0B><1B><17><17><1C><1C>n<EFBFBD>c<EFBFBD>+<2B>6F<36>G<><16> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> -<2D> -<2D><13> <0B>U<01><17>*<2A>+<2B><04>-1<>t<EFBFBD>z<EFBFBD>z<EFBFBD>(<28>4<EFBFBD>.<2E>)<29>t<EFBFBD><04><1B>D<EFBFBD>H<EFBFBD>H<EFBFBD>W<EFBFBD>-<2D>.<2E><04>W<EFBFBD> <0A><1F><18><18>&<26>"<22>!5<>5<>D<EFBFBD><16>L<EFBFBD> <0F>K<EFBFBD><4B> <15>U<01><14>a<EFBFBD><1A>R<EFBFBD><16><18>7<EFBFBD>C<EFBFBD><16>QS<51>T<>T<>U<01>s<00>AE2<00>2F <03> F c<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrB<00>s<00><00>0<10>0<10>t<EFBFBD>0r&c<04><><00>^RIHpHpRV9dR#VR,RJdR#VPR4pV'gR#V^8XdR#\ V4pVPR4^8wdR#VPR4R8XdR#VPR 4'gR#VP
R
8XdVP
pM<VP
P R
4pV^,R 8Xd^M^pR
WE,,pVR9dR#.ROpVPR .4Uu.uFqw'gK Wv9gKV R 2NK ppVR ;;,V, uu&^RIHp V P4U
u.uFp
R V
9gK V
NK p p
V U
u.uFq<>V9gK V
R 2NK p p
W<EFBFBD>,p WM9dWCR ,9dR#R#uupiuup
iuup
i)u)
@name 校验路由权限
@return bool
<EFBFBD>rrs<00>loginTFrrfrd<00> administratorrgr{<00>v2rh<00>_ifame)<01>menu_map)r{)r{<00>/homerhz/login?dologin=True)
r<EFBFBD>rrsrbrmrmr<>rru<00>values)rrsr<00> user_datarm<00>index<65> ifame_exculder<65><00> ifame_routerrur<><00>aa_menus<75> ifame_menus<75>
full_menuss r'<00>user_router_authorityr<00>s<><00><00>
'<27><0E>g<EFBFBD><1D><13><0E>w<EFBFBD><17>5<EFBFBD> <20><13>
<11>+<2B>+<2B>e<EFBFBD>
<1C>C<EFBFBD> <0E><14>
<EFBFBD>a<EFBFBD>x<EFBFBD><13>'<27><03>,<2C>I<EFBFBD><10>}<7D>}<7D>W<EFBFBD><1D><11>"<22><14><10>}<7D>}<7D>V<EFBFBD><1C><0F>/<2F><13> <14>=<3D>=<3D><16> <20> <20><14><0E>|<7C>|<7C>s<EFBFBD><1A><16>|<7C>|<7C><04><16>|<7C>|<7C>!<21>!<21>#<23>&<26><04><19>!<21>W<EFBFBD><04>_<EFBFBD><01>!<21><05><12>T<EFBFBD>[<5B> <20><04> <0B>u<EFBFBD>}<7D><13>C<>M<EFBFBD>'<27>m<EFBFBD>m<EFBFBD>F<EFBFBD>B<EFBFBD>7<><06>7<><11>1<EFBFBD> <0C><11>AW<41> <0C>1<EFBFBD>#<23>V<EFBFBD> <0C>7<><11><06><0E>f<EFBFBD><15><1C>%<25><15>!<21><1B>?<3F>?<3F>$<24><06>$<24>a<EFBFBD><08><01>(9<><01><01>$<24> <0A><06>'<27><06>&<26><11>=<3D>*@<40> <0C>1<EFBFBD>#<23>V<EFBFBD> <0C>h<EFBFBD><10><06><1A>'<27>J<EFBFBD> <0B><19>d<EFBFBD>F<EFBFBD>*;<3B>;<3B><14> <0F><><06><> <06><>s*<00> F3<04>"F3<04>* F3<04>" F8<04>0F8<04><F=<04> F=c<04>r<00>.ROpVF,p\PPV4'gK*Vu# R#)uF
@name 取CURL执行路径
@author hwliang<2020-09-01>
@return string
<EFBFBD>curl)z/usr/local/curl2/bin/curlz/usr/local/curl/bin/curlz /usr/bin/curlr<6C>)<02>c_bin<69>cbs r'<00> get_curl_binr<6E>4s.<00><00> W<01>E<EFBFBD><13><02> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>"<22> <1D> <1D>b<EFBFBD>y<EFBFBD><14> r&c<00>0<00>RP\44p\PP V4'd=\ V4pVP R4R 8XdVR,R,p\W4RP\44p\PP V4'd=\ V4pVP R4R 8XdVR,R,p\W#4RP\44p\PP V4'g\P!VR4\R4PR 4P4pVFp\VR
,4K R # R #;i) z{}/nginx/conf/fastcgi.conf<6E> bt_safe_dirrz?fastcgi_param PHP_ADMIN_VALUE "$bt_safe_dir=$bt_safe_open";z{}/nginx/conf/proxy.confzwmap "baota_dir" $bt_safe_dir {
default "baota_dir";
}
map "baota_open" $bt_safe_open {
default "baota_open";
} z{}/open_basedir/nginxr<78>r<>z id,name,pathrNr^)rAr{rlrmrnrqr_rsrr<>r8r<>r!<00>set_site_open_basedir_nginx)<07> fastcgi_file<6C> fastcgi_body<64>
proxy_file<EFBFBD>
proxy_body<EFBFBD>open_basedir_path<74> site_list<73> site_infos r'<00>set_open_basedirr<72>As6<00><00><0F>3<>:<3A>:<3A>><3E>;K<>L<> <0C> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27>#<23>L<EFBFBD>1<>L<EFBFBD><1B> <20> <20><1D>/<2F>2<EFBFBD>5<>+<2B>d<EFBFBD>2<>5v<35>v<> <0C><19>,<2C>5<>/<2F>6<>6<>~<7E>7G<37>H<>
<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25>!<21>*<2A>-<2D>J<EFBFBD><19><EFBFBD><EFBFBD>}<7D>-<2D><12>3<>'<27>$<24>.<2E>2<06><06>
<EFBFBD> <1A>*<2A>1<>3<>:<3A>:<3A>><3E>;K<>L<><19><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>/<2F>0<>0<> <0E>K<EFBFBD>K<EFBFBD>)<29>3<EFBFBD> /<2F><15>g<EFBFBD>J<EFBFBD>$<24>$<24>^<5E>4<>;<3B>;<3B>=<3D> <09>"<22>I<EFBFBD> '<27> <09>&<26>(9<> :<3A>#<23><><0F><0E>s <00>F F<00>Fc<00><00>R# R#;irN) rlrmrnr<>rAr<>rsrqr_rrrr<>)
r<EFBFBD>r<><00> config_file<6C>open_basedir_file<6C> config_bodyrK<00> userini_file<6C> userini_body<64>open_basedir_conf<6E>open_basedir_bodys
& r'r<>r<>cs<00><00>%<0F><0E><>F<0F><0E>s<00> c<04>v<00>^RIpVP!WR7pVPV4VP4R#)u<>
@name 使用线程执行指定方法
@author hwliang<2020-10-27>
@param fun {def} 函数对像
@param args {tuple} 参数元组
@param daemon {bool} 是否守护线程
@return bool
N<EFBFBD><02>targetr<74>T)<04> threading<6E>Thread<61> setDaemonr<6E>)<05>funr<6E><00>daemonr<6E>r5s&&& r'r5r5<00>s/<00><00><15><11><18><18><03>/<2F>A<EFBFBD><05>K<EFBFBD>K<EFBFBD><06><17><05>G<EFBFBD>G<EFBFBD>I<EFBFBD> r&c<00>(<00>\\V34R#rN)r5<00>cloud_check_domain)r<>s&r'<00>check_domain_cloudr<64><00>s<00><00><0E>!<21>F<EFBFBD>9<EFBFBD>-r&c<00>N<00>\4'dR#\\R/34R#)Nz3http://brandnew.yakpanel.com/api/setupCount/setupWP)rDr5r<>r%r&r'<00>count_wpr<70><00>s<00><00><15><17><17><0E><0E>x<EFBFBD>O<>QS<51>T<>Ur&c<04>\<00>RP\44p\PP V4'g\P
!VR4\ 4pWR&\RP\44RV/4pW,R,p\WC4R# R#;i)u<>
@name 从云端验证域名的可访问性,并将结果保存到文件
@author hwliang<2020-12-10>
@param domain {string} 被验证的域名
@return void
z{}/data/check_domain/r<>r<>z{}/api/panel/checkDomainz.plN)
rAr<>rlrmrnr<><00> get_user_infor<6F>r<>rs)r<><00>check_domain_pathr<68>r<><00>cd_files& r'r<>r<><00>s<><00><00>
 <0A>3<>:<3A>:<3A>><3E>;K<>L<><19><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>/<2F>0<>0<> <0E>K<EFBFBD>K<EFBFBD>)<29>3<EFBFBD> /<2F><1D><0F><05> <20>h<EFBFBD><0F><19>4<>;<3B>;<3B>O<EFBFBD><M<>N<>QY<51>[a<>Pb<50>c<><06>#<23>,<2C>u<EFBFBD>4<><07><11>'<27>"<22><> <0A> <0C>s <00>B"B&<00>&B+c<00><><00>RP\44p\PP V4'g/#/p\
P !\V44pRV9d\VR,4^@8wd$^RI pVP4PR4pVPRR4'd
VR,MVPRR4VR&VPRR4VR&R VR&VPRR4VR&VPRR4VR&VPRR4VR &\4VR
&VR
,VR &\4VR &V# \\44T#;i)<0E>{}/data/userInfo.json<6F> server_idNr!r<00> last_login_ip<69>addressr<73>r<00>serverid<69>oemr r)<01> BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB)rAr<>rlrmrnrorprqr<>r<>r<>rb<00> get_oem_namer<00> print_logr<67>)<04> user_file<6C>userInfo<66>userTmpr<70>s r'r<>r<><00>sM<00><00>'<27>.<2E>.<2E>~<7E>/?<3F>@<40>I<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24>R<EFBFBD>i<EFBFBD><11>H<EFBFBD> <0A><16>*<2A>*<2A>X<EFBFBD>i<EFBFBD>0<>1<><07><1A>g<EFBFBD>%<25><13>W<EFBFBD>[<5B>-A<>)B<>b<EFBFBD>)H<> <1C><1F>)<29>)<29>+<2B>;<3B>;<3B>D<EFBFBD>A<>G<EFBFBD>+2<>;<3B>;<3B>t<EFBFBD>T<EFBFBD>+B<>+B<>'<27>$<24>-<2D><07> <0B> <0B>TY<54>[_<>H`<60><08><15><0F>%<25>k<EFBFBD>k<EFBFBD>/<2F>4<EFBFBD>@<40><08><19><1B>!*<2A><08><1C><1E>&<26>{<7B>{<7B>:<3A>t<EFBFBD><<3C><08><1A><1C> '<27> <0B> <0B>K<EFBFBD><14> ><3E><08><1B><1D>&<26>{<7B>{<7B>;<3B><04>=<3D><08><1A><1C>&<26>.<2E><08><15><0F> <20><15><0F><08><13> <0A>)<29>+<2B><08><15><0F> <14>O<EFBFBD><4F> <0A><11>.<2E>"<22>#<23> <0C> <13>O<EFBFBD>s<00>A7E<00><BE<00>E3c
<04><><00>\V4p^RIHpHp^RIHpV\ 8Xd
V!V4pMp\V4^<5E>8dY\PPV4'd+TpV'g \PPV4pMV!V4pMV!V4pV'gRpV'gRp^RIpVPR8dV!VVRRRV^R7#V!VVRRRV^R 7#)
u<EFBFBD>
@name 以文件流的形式返回
@author heliang<2020-10-27>
@param data {bytes|string} 文件数据或路径
@param mimetype {string} 文件类型
@param fname {string} 文件名
@return Response
)<02>BytesIO<49>StringIO)<01> send_file<6C>application/octet-streamzdoan.txtNz2.1.0T)<06>mimetype<70> as_attachment<6E> add_etags<67> conditional<61>attachment_filename<6D> cache_timeout)r<>r<><00>etagr<67><00> download_name<6D>max_age) r<><00>ior<6F>r<>r<>r<>r<>r<>rlrmrnr~<00> __version__) r~<00>fnamer<65><00>d_typer<65>r<><00>send_torr<>s &&& r'r<>r<><00>s<><00><00><12>$<24>Z<EFBFBD>F<EFBFBD>$<24>*<2A> <0A><15><EFBFBD> <14>T<EFBFBD>]<5D><02> <0E>t<EFBFBD>9<EFBFBD>s<EFBFBD>?<3F><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>#<23>#<23><19><02><1C><1E>G<EFBFBD>G<EFBFBD>,<2C>,<2C>U<EFBFBD>3<>E<EFBFBD><45><1D>d<EFBFBD>^<5E><02><19>$<24><1E>B<EFBFBD> <13> :<3A>X<EFBFBD> <10>*<2A>%<25><10> <0C><18><18>7<EFBFBD>"<22><16>r<EFBFBD> (<28>%)<29>!%<25>#'<27>+0<>%&<26> (<28> (<28><17>r<EFBFBD> (<28>%)<29> <20>#'<27>%*<2A> <20> "<22> "r&c<00>v<00>^RIHpRP\V4Uu.uF
q2!V4NK up4#uupi)r)<01>choicerF)r<>r<>r<>r<>)r<>r<>r<>r<>s&& r'<00> gen_passwordr<64>s.<00><00><1D> <0A>7<EFBFBD>7<EFBFBD>5<EFBFBD><16>=<3D>9<>=<3D>a<EFBFBD>F<EFBFBD>5<EFBFBD>M<EFBFBD>=<3D>9<> :<3A>:<3A><>9s<00>6c<04>h<00>\R4^,P4pVPR4pV#)uE
@name 获取本机IP地址
@author hwliang<2020-11-24>
@return list
z~ip a |grep inet|grep -v inet6|grep -v 127.0.0.1|grep -v 'inet 192.168.'|grep -v 'inet 10.'|awk '{print $2}'|sed 's#/[0-9]*##g'r)r<>rIr<>)<02>ipa_tmpr s r'<00> get_ipaddressr<73>s<<00><00> <18> I<02>J<02> <09> <0B> <10>5<EFBFBD>7<EFBFBD> <0C><15>]<5D>]<5D>4<EFBFBD> <20>F<EFBFBD> <11>Mr&c<04><><00>RpRP\44p\PP V4'd$\ V4pV'dVP 4pV#)uB
@name 获取OEM名称
@author hwliang<2021-03-24>
@return string
rFz {}/data/o.pl<70>rAr<>rlrmrnrqrI)r<><00>oem_files r'r<>r<>sK<00><00> <0A>C<EFBFBD><1D>$<24>$<24>^<5E>%5<>6<>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><16>x<EFBFBD> <20><03> <0E>c<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD><03> <0E>Jr&c<04>f<00>^RIpVP4PR4p\4VR&V#)uG
@name 构造POST基础参数
@author hwliang<2021-03-24>
@return dict
Nr<EFBFBD>)r<>r<>r<>)r<>r<>s r'<00> get_pdatar<61>#s0<00><00> <15> <15> <1F> <1F> !<21> 1<> 1<>$<24> 7<>E<EFBFBD><1F>><3E>E<EFBFBD>%<25>L<EFBFBD> <10>Lr&c <00><><00>^RIHpVPR4pVf-R\\ 44,pVP RV4\ R4p\RV,\VR,44\RPV4\\\P!4444R# ^R I H p\T!44R#;i)
rr<><00>p_tokenN<6E>bmac_F<5F>/tmp/<2F>pro<72> /tmp/{}.time<6D>r<>)rrdrbr<>rr<><00>load_soft_listrsr@rAr<>r<>r<>r<>r<>)rdr<><00>softListr<74>s r'<00>
refresh_pdr<EFBFBD>0s<><00><00><1E> <0A><17>)<29>)<29>I<EFBFBD>&<26><07> <12>?<3F><1D><03>O<EFBFBD>$5<> 6<>6<>G<EFBFBD> <11>I<EFBFBD>I<EFBFBD>i<EFBFBD><17> )<29>!<21>%<25>(<28><08><11>'<27>G<EFBFBD>#<23>S<EFBFBD><18>%<25><1F>%9<>:<3A><11>.<2E>'<27>'<27><07>0<>#<23>c<EFBFBD>$<24>)<29>)<29>+<2B>6F<36>2G<32>H<><48> <0A>(<28><11>*<2A>,<2C><1F> <0C>s <00>B/B9<00>9Cc<04><><00>^RIHpRpRpRp\\P!44pVP R4pVf-R\ \ 44,pVPRV4RV,pRPV4p\PPV4'dT\PPV4'd/\\V4P44R,V8:d<>RP\44p \PPV 4'd<>\PPV 4^
8<EFBFBD>d_\!4p
\#V
\$4'd?V
P R R4p\'V\)V4R
4\'V\)V4R
4\V4p V 'd \V 4pV^8d<>VR8XdR pMVR8XdRpM VR8XdR pV^8<>d`VR9dYV^8XdR p RPV 4pM{\P*!R\P,!V44p RPV 4pM>RpM;RP\P*!R\P,!V444pWBV3# ^RIHp \3T !44L;i)uE
@name 获取授权信息
@param args:
@return tuple[html, pro, ltd]
r<EFBFBD>z[<span class="btpro-free" onclick="bt.soft.renew_pro()" title="Click to get PRO">FREE</span>r<>r<>r<>r<><00><>Qr<>r<>r.z<><span class="btltd-gray"><span style="color: #fc6d26;font-weight: bold;margin-right:5px">EXPIRED</span><a class="btlink" onclick="bt.soft.updata_ltd()">RENEW</a></span>z<><span class="btpro-gray"><span style="color: #fc6d26;font-weight: bold;margin-right:5px">EXPIRED</span><a class="btlink" onclick="bt.soft.renew_pro()">RENEW</a></span><3E>Lifetimez\<span class="btpro">Expire:<span style="color: #fc6d26;font-weight: bold;">{0}</span></span>r<>z<><span class="btpro">Expire: <span style="color: #fc6d26;font-weight: bold;margin-right:5px">{0}</span><a class="btlink" onclick="bt.soft.renew_pro()">RENEW</a></span>z\<span class="btpro-gray" onclick="bt.soft.updata_pro()" title="Click to get PRO">FREE</span>z<><span class="btltd">Expire: <span style="color: #fc6d26;font-weight: bold;margin-right:5px">{}</span><a class="btlink" onclick="bt.soft.renew_pro()">RENEW</a></span>r<>r^r})r^r})rrdr<>r<>rbr<>rr<>rArlrmrnrqrIr<>r~r<>r<>r<>rsr@rrr<>r<>r<>)r<>rdr<><00>ltd<74>htm<74>cur_timer<65><00>tmp_f<5F>p_token_time_f<5F>
userinfo_f<EFBFBD> plugin_listr<74><00>tmp2r<32>s& r'<00>get_pdr<64>EsT<00><00> <1F> <0A>C<EFBFBD> <0A>C<EFBFBD> h<01>C<EFBFBD>8 <20><16>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>#<23><08><17>)<29>)<29>I<EFBFBD>&<26><07> <12>?<3F><1D><03>O<EFBFBD>$5<> 6<>6<>G<EFBFBD> <11>I<EFBFBD>I<EFBFBD>i<EFBFBD><17> )<29><17>'<27>!<21><05>'<27>.<2E>.<2E>w<EFBFBD>7<><0E><12>w<EFBFBD>w<EFBFBD>~<7E>~<7E>e<EFBFBD>$<24>$<24>B<EFBFBD>G<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD>><3E>,J<>,J<>c<EFBFBD>RZ<52>[i<>Rj<52>Rp<52>Rp<52>Rr<52>Ns<4E>v{<7B>N{<7B>@H<02>OH<02>0<>7<>7<><0E>8H<38>I<>J<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>j<EFBFBD>)<29>)<29>b<EFBFBD>g<EFBFBD>g<EFBFBD>o<EFBFBD>o<EFBFBD>j<EFBFBD>.I<>B<EFBFBD>.N<>,<2C>.<2E> <0B><1D>k<EFBFBD>4<EFBFBD>0<>0<>%<25>/<2F>/<2F>%<25><12>4<>C<EFBFBD><1E>e<EFBFBD>S<EFBFBD><13>X<EFBFBD>s<EFBFBD>3<><1D>n<EFBFBD>c<EFBFBD>(<28>m<EFBFBD>S<EFBFBD>A<><16>u<EFBFBD>o<EFBFBD><03> <0E><15>c<EFBFBD>(<28>C<EFBFBD> <0E><11>7<EFBFBD><12>b<EFBFBD>y<EFBFBD>A<03><03><14><02><19>s<><03><14><02><19>@<03><03><12>a<EFBFBD>x<EFBFBD>C<EFBFBD>8<EFBFBD>O<EFBFBD><16>!<21>8<EFBFBD>%<25>D<EFBFBD>x<><><><1C><1E>C<EFBFBD> <20>=<3D>=<3D><1A>T<EFBFBD>^<5E>^<5E>C<EFBFBD>5H<35>I<>D<EFBFBD>C<03>J<03>J<03><1C><1E>C<EFBFBD>u<01><03>z<02>A<03>A<03><14> <0A> <0A>j<EFBFBD>$<24>.<2E>.<2E><13>*=<3D>><3E>@<01>C<EFBFBD> <0F>S<EFBFBD>=<3D><18><>  <20>(<28><11>*<2A>,<2C><1F>s+<00>BJ)<00>,$J)<00>EJ)<00>*<J)<00>'J)<00>*:J)<00>)Kc<00> <00>RRRRRRRR/pVP4FpVPW!V,4pK Tp\P^,^8Xd^RIpVP V4pV#\ P V4pV# Tu#;i)rrz&quotz&#x27;rz&#x27N)r<>rrrrrr%r)rd<00>csrBr!rr"s& r'<00> xssdecoder<65><00>s<><00><00><14><16><03>W<EFBFBD>c<EFBFBD>8<EFBFBD>S<EFBFBD>'<27>3<EFBFBD> G<><02><13><17><17><19>A<EFBFBD><17><<3C><<3C><01>a<EFBFBD>5<EFBFBD>)<29>D<EFBFBD><1B><1B> <0B> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23> <17><18>M<EFBFBD>M<EFBFBD>+<2B>.<2E>E<EFBFBD><15> <0C><18>L<EFBFBD>L<EFBFBD><1B>-<2D>E<EFBFBD><14> <0C><><14><13> <0B>s<00>A-B<00>0B<00>B c<00>B<00>\R4^,P4#)z0cat /proc/cpuinfo|grep 'model name'|cut -d : -f2r<32>r%r&r'<00> get_cpunamer<65><00>s<00><00> <14>G<> H<><11> K<> Q<> Q<> S<>Sr&c<00>`<00>\R4wrV'dVPR4^,#R#)z2fdisk -l |grep 'Disk identifier' |awk {'print $3'}rN<>r<>r<><00>r)r<>s r'<00> fetch_disk_SNr<4E><00>s*<00><00> <14>I<> J<>D<EFBFBD>A<EFBFBD><08><10>w<EFBFBD>w<EFBFBD>t<EFBFBD>}<7D>Q<EFBFBD><1F><1F> r&c<00>`<00>\R4wrV'dVPR4^,#R#)z7cat /proc/cpuinfo|grep microcode|awk -F':' '{print $2}'rNr<4E>r<>s r'<00> fetch_cpu_IDr<44><00>s*<00><00> <14>N<> O<>D<EFBFBD>A<EFBFBD><08><10>w<EFBFBD>w<EFBFBD>t<EFBFBD>}<7D>Q<EFBFBD><1F><1F> r&c<00>*<00>^RIpVP4#r<><00><01>platformr<6D>s r'<00> get_platformr<6D><00>s<00><00><13> <13> <1C> <1C> <1E>r&c<00>@<00>^RIpVP!4P#r<>)r<><00>virtual_memoryrp)r<>s r'<00>
get_memoryr<EFBFBD><00>s<00><00><11> <11> <20> <20> "<22> (<28> (<28>(r&c<00>~<00>\4\4,p\4p\V4\V4,#rN)rr<>r<>r<>)<02>s1<73>s2s r'<00> gen_server_idr<64><00>s+<00><00> <18> <1A>\<5C>^<5E> +<2B>B<EFBFBD> <14><1D>B<EFBFBD> <0E>r<EFBFBD>7<EFBFBD>S<EFBFBD><12>W<EFBFBD> <1C>r&c<00>4<00>\4PR4#)r<>)<02> get_userinforbr%r&r'<00> get_server_idr<00>s<00><00> <17>><3E> <1D> <1D>k<EFBFBD> *<2A>*r&c<00>n<00>RpV'g1\PPV4'g \R4h\ V4pV'd\ V4^8dRp\ P!V4pV'gWV'g \R4hRV9d \R4h\VR,4PR4^8wd \R4hRV9d VR,VR&RV9d.\4VR&\V\ P!V44V# \\R44h;i) zdata/userInfo.jsonrFr<>r<>r<>r!rr<>zPlease login with account first)rlrmrnr1rqr<>rorpr@rr<>rsrrr2)r<><00>userPathr<68><00>userinfos& r'rr<00>s<><00><00>B<01>'<27><08><14>R<EFBFBD>W<EFBFBD>W<EFBFBD>^<5E>^<5E>H<EFBFBD>5<>5<><1C>R<EFBFBD>.<2E> <20><16>x<EFBFBD> <20><03><12>c<EFBFBD>#<23>h<EFBFBD><11>l<EFBFBD><16>C<EFBFBD><17>:<3A>:<3A>c<EFBFBD>?<3F><08><14><1B> <20><12>n<EFBFBD>$<24><16>h<EFBFBD>&<26> <20><12>n<EFBFBD>$<24><12>8<EFBFBD>G<EFBFBD>$<24>%<25>+<2B>+<2B>C<EFBFBD>0<>A<EFBFBD>5<> <20><12>n<EFBFBD>$<24> <0F>8<EFBFBD> <1B>&<26>t<EFBFBD>n<EFBFBD>H<EFBFBD>U<EFBFBD>O<EFBFBD> <16>h<EFBFBD> &<26>$1<>O<EFBFBD>H<EFBFBD>[<5B> !<21> <15>h<EFBFBD><04>
<EFBFBD>
<EFBFBD>8<EFBFBD> 4<> 5<><17><0F><>B<01><18><14>?<3F>@<40>A<>A<>s#<00> D<00>$D<00>A D<00>?D<00>BD<00>D4c<00><><00>R\4R^R\4R\4R\4R\ 4R\ 4R\ 4R\4/ # /u#;i) r<>r<>rlr<00>hdid<69>ramid<69>cpuid<69> server_name<6D> install_code)r<>r<>rr<>r<>r<>r<>rr%r&r'<00>fetch_env_infor <00>s[<00><00> <12> <10>*<2A>,<2C> <15>q<EFBFBD> <10>,<2C>.<2E> <11>?<3F>$<24> <12>M<EFBFBD>O<EFBFBD> <13>Z<EFBFBD>\<5C> <13>\<5C>^<5E> <19><<3C>><3E> <1A>M<EFBFBD>O<EFBFBD>

<EFBFBD>
<EFBFBD><EFBFBD><12><11> <09>s <00>AA<00>Ac<00>|<00>^RIpVR8Xd\pM\pVP!WW#3R7P 4R#)rNrr<>)r<>r<>r{r<>r<>)r<>rer~r[r<>s&&&& r'<00> arequestsrs3<00><00><14> <0A><16><17><19><06><18><06> <0A><14><14>F<EFBFBD>t<EFBFBD>)=<3D>><3E>D<>D<>Fr&z^[\w\s\[\]\-.]+$z^\.?__[\w\s[\]\-]+__\.?$c<00><>a<00>]tRtRtoRtRtRtRtRtRt Rt
R t ] R
4t R t]!433V3R lR lltRtRtRR.3RltV3RlRltRtVtR#)r<>ic<08>2<00>/Vn\4VnR#rN)<03>_dict_obj__storer<65><00>_dict_obj__validated<65>r<>s&r'<00>__init__<5F>dict_obj.__init__s<00><00><19><04> <0C><1F>5<EFBFBD><04>r&c<08><00>\W4#rN)r<><00>r<>rSs&&r'<00> __contains__<5F>dict_obj.__contains__<00> <00><00><16>t<EFBFBD>!<21>!r&c<08><><00>\PV4'd\PV4'd \R4hW PV&R#)<02>wrong field nameN)<05> re_key_matchr<68><00> re_key_match2r1r<00>r<>rSrWs&&&r'<00> __setitem__<5F>dict_obj.__setitem__s=<00><00><1C>!<21>!<21>#<23>&<26>&<26>-<2D>*=<3D>*=<3D>c<EFBFBD>*B<>*B<><1C>/<2F>0<> 0<>!<21> <0C> <0C>S<EFBFBD>r&c<08><00>\W4#rN)rzrs&&r'<00> __getitem__<5F>dict_obj.__getitem__$rr&c<08><00>\W4R#rN<00><01>delattrrs&&r'<00> __delitem__<5F>dict_obj.__delitem__'<00>
<00><00><0F><04>r&c<08><00>\W4R#rNr&rs&&r'<00> __delattr__<5F>dict_obj.__delattr__*r*r&c<08><><00>\PV4'd\PWV4R#W PV&R#rN)<05>match_class_private_propertyr<79><00>object<63> __setattr__rrs&&&r'r1<00>dict_obj.__setattr__-s2<00><00> '<27> -<2D> -<2D>c<EFBFBD> 2<> 2<> <12> <1E> <1E>t<EFBFBD>%<25> 0<> <12>!<21> <0C> <0C>S<EFBFBD>r&c<08><><00>WP9dVPV,#\RPVPPV44h)z!'{}' object has no attribute '{}')rr<>rA<00> __class__rrs&&r'<00> __getattr__<5F>dict_obj.__getattr__4sA<00><00> <0E>,<2C>,<2C> <1E><18><<3C><<3C><03>$<24> $<24><1C>D<>K<>K<>D<EFBFBD>N<EFBFBD>N<EFBFBD>Lc<4C>Lc<4C>eh<65>i<>j<>jr&c<08><00>VP#rN<00>rrs&r'r<><00>dict_obj.__dict__=s <00><00><13>|<7C>|<7C>r&c<08><00>VP#rNr8rs&r'<00> get_items<6D>dict_obj.get_itemsAs <00><00><13>|<7C>|<7C>r&c<00>r<<01>V^8<>dQhRS[PS[,RS[PS[,RR/#)r:<00>validate_rules<65>filtersr=N)r>rr <00>callable)rAr s"<22>r'rB<00>dict_obj.__annotate__Ds6<00><><00>)<29>)<29>v<EFBFBD>{<7B>{<7B>5<EFBFBD>'9<>)<29>F<EFBFBD>K<EFBFBD>K<EFBFBD>PX<50>DY<44>)<29>qu<71>)r&c <0C>l<00>\V4pVF<>pVPVP4VPVP9dEVP VPVP,V4VPVP&VP
P VP4K<> R#)u<>
@name 验证请求参数
@param validate_rules: list[validate.Param] 参数验证规则
@param filters: list[callable] 参数过滤器
@raise Error
N)r<><00> do_validaterr<00> do_filterrr!)r<>r>r?rCs&&& r'<00>validate<74>dict_obj.validateDsy<00><00><17>w<EFBFBD>-<2D><07><1F>A<EFBFBD> <0A>M<EFBFBD>M<EFBFBD>$<24>,<2C>,<2C> '<27><10>v<EFBFBD>v<EFBFBD><14><1C><1C>%<25>'(<28>{<7B>{<7B>4<EFBFBD><<3C><<3C><01><06><06>3G<33><17>'Q<><04> <0C> <0C>Q<EFBFBD>V<EFBFBD>V<EFBFBD>$<24> <10> <1C> <1C> <20> <20><11><16><16> (<28>  r&c<08><00>\W4#rN)r<>)r<>r<>s&&r'rn<00>dict_obj.existsUs <00><00><1A>4<EFBFBD>&<26>&r&c<08><><00>\V\4'd\V\4'gR#\PV4'd\PV4'd \ R4h\ WV4#)Fr)r<>r@rr<>rr1<00>setattrrs&&&r'r<><00> dict_obj.setXsY<00><00><19>%<25><13>%<25>%<25>Z<EFBFBD><03>S<EFBFBD>-A<>-A<>%<25><1C>!<21>!<21>#<23>&<26>&<26>-<2D>*=<3D>*=<3D>c<EFBFBD>*B<>*B<><1C>/<2F>0<> 0<><16>t<EFBFBD>%<25>(<28>(r&rFc <0C>0 <00>VPR4R8wdVPR4wr\WV4p\V\4'dVP 4pV'Ed<>VR9d\ V4pEM<>VR9d\ V4pEM<>VR 9d\V4pEMnVR!9d\P!V4pEMNVR"9d\V4pEM:VR#9d@\V4'g\RPV44hVPRR4pEM<>VR$9d^\P !R\P"4p\P$!We4'g\RPV44hEM<>VR%9d<>VR 8Xd.\'V4'g\R PV44hEMUVR
8Xd.\)V4'g\R PV44hEM!\'V4'g,\)V4'g\R PV44hEM<>VR&9d:\P$!RV4'g\RPV44hEM<>VR'9d:\P$!RV4'g\RPV44hEMcVR(9d:\P$!RV4'g\RPV44hEM#VR)9d7\ V4pVR8<>gV^8d\RPV44hTpM<>\P$!RV4'dxV^,p\ VR,P 44p \+V4p
\RPW44p VR8Xd
W<>8wdV hMkVR8Xd
W<>8dV hM[W<>8<EFBFBD>dV hMRV^,R*9gVR,R+9d7\P$!W54'g\RPW44hV'd!WT9g\RPW44hV# \RPT44h;i \RPT44h;i \RPT44h;i),u<>
@name 获取指定参数
@param key<string> 参数名称,允许在/后面限制参数格式,请参考参数值格式(format)
@param default<string> 默认值,默认空字符串
@param format<string> 参数值格式(int|str|port|float|json|xss|path|url|ip|ipv4|ipv6|letter|mail|phone|正则表达式|>1|<1|=1),默认为空
@param limit<list> 限制参数值内容
@param return mixed
r{z&Parameters: {}, requires int type dataz(Parameters: {}, float type data requiredz$Parameters: {}, requires JSON stringz3Parameters: {}, the correct path format is requiredz//z<>^(?:http|ftp)s?://(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|localhost|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::\d+)?(?:/?|[/?]\S+)$z2Parameters: {}, the correct URL format is required<65>ipv4<76>ipv6z4Parameters: {}, the correct ipv4 address is requiredz4Parameters: {}, the correct ipv6 address is requiredz9Parameters: {}, the correct ipv4/ipv6 address is required<65>^\w+$zGParameters: {}, the requirement can only be composed of English lettersz:^.+@(\[?)[a-zA-Z0-9\-.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(]?)$z<Parameters: {}, the correct email address format is requiredz ^1[3-9]\d{9}$z3Parameters: {}, mobile phone number format requiredr>z3Parameters: {}, the required port number is 0-65535z
^[<>=]\d+$<24>rDNNz)Parameters: {}, the required length is {}<7D>=rz9The format of the specified parameter is incorrect, {}:{}z7The specified parameter value range is incorrect, {}:{}r^)r@r<>r<>)r<>r<>)r<>r<>)ro<00>j)<02>xssr<73>)rmr5)re<00>u)r<>r<>r<>rMrN)r.<00>letter)<03>emailrGr<>)r'<00>mobiler<65>)r<>)r<><00>(<28>[r<>r<>)r<00>)<29>]<5D>+r<>)r_r<>rzr<>r@rIr<>r1rAr<>rorpr#r<>rrrr<><00>
IGNORECASEr<EFBFBD>r<>r<>r<>) r<>rSrrArEr<><00>regex<65> result_port<72>operatorr<72><00>
result_len<EFBFBD> error_objs &&&&& r'rb<00> dict_obj.get`s<00><00> <0F>8<EFBFBD>8<EFBFBD>C<EFBFBD>=<3D>B<EFBFBD> <1E><1D>)<29>)<29>C<EFBFBD>.<2E>K<EFBFBD>C<EFBFBD><18><14>G<EFBFBD>,<2C><06> <15>f<EFBFBD>c<EFBFBD> "<22> "<22>V<EFBFBD>\<5C>\<5C>^<5E>F<EFBFBD> <11>6<EFBFBD><15>/<2F>/<2F><1C>V<EFBFBD><1B><06><17><<3C>'<27>[<01> <20><16>[<5B>F<EFBFBD><18>><3E>)<29>]<01>"<22>6<EFBFBD>]<5D>F<EFBFBD><18>=<3D>(<28>Y<01>!<21>Z<EFBFBD>Z<EFBFBD><06>/<2F>F<EFBFBD><18><<3C>'<27>"<22>6<EFBFBD>*<2A><06><17>=<3D>(<28>&<26>v<EFBFBD>.<2E>.<2E>$<24>%Z<>%a<>%a<>be<62>%f<>g<>g<><1F><1E><1E><04>c<EFBFBD>2<><06><17><<3C>'<27><1A>
<EFBFBD>
<EFBFBD>'<27>
)+<2B> <0A> <0A> 7<><05><1A>x<EFBFBD>x<EFBFBD><05>.<2E>.<2E>$<24>%Y<>%`<60>%`<60>ad<61>%e<>f<>f<>/<2F><17>@<40>@<40><19>V<EFBFBD>#<23>"<22>6<EFBFBD>?<3F>?<3F>(<28>)_<>)f<>)f<>gj<67>)k<>l<>l<>+<2B><1B>v<EFBFBD>%<25>"<22>6<EFBFBD>?<3F>?<3F>(<28>)_<>)f<>)f<>gj<67>)k<>l<>l<>+<2B>#<23>6<EFBFBD>?<3F>?<3F>7<EFBFBD>6<EFBFBD>?<3F>?<3F>(<28>)d<>)k<>)k<>lo<6C>)p<>q<>q<><71><17>?<3F>*<2A><19>x<EFBFBD>x<EFBFBD><08>&<26>1<>1<>$<24>a<>h<>h<>il<69>m<>o<01>o<01>2<><18>1<>1<><19>x<EFBFBD>x<EFBFBD> ]<5D>_e<5F>f<>f<>$<24>%c<>%j<>%j<>kn<6B>%o<>p<>p<>g<01><17>3<>3<><19>x<EFBFBD>x<EFBFBD> 0<>&<26>9<>9<>$<24>%Z<>%a<>%a<>be<62>%f<>g<>g<>:<3A><17>8<EFBFBD>#<23>!<21>&<26>k<EFBFBD> <0B><1E><15>&<26>+<2B><01>/<2F>$<24>%Z<>%a<>%a<>be<62>%f<>g<>g<>$<24><06><13><18><18>-<2D><16>0<>0<>!<21>!<21>9<EFBFBD><08><1C>V<EFBFBD>B<EFBFBD>Z<EFBFBD>-<2D>-<2D>/<2F>0<><06> <20><16>[<5B>
<EFBFBD>&<26>'R<>'Y<>'Y<>Z]<5D>'f<>g<> <09><1B>s<EFBFBD>?<3F>!<21>+<2B>'<27><0F>,<2C><1D><13>_<EFBFBD>!<21>*<2A>'<27><0F>+<2B>"<22>*<2A>'<27><0F>+<2B><17><01><19>8<>8<>F<EFBFBD>2<EFBFBD>J<EFBFBD>Jc<4A><c<><19>x<EFBFBD>x<EFBFBD><06>/<2F>/<2F>$<24>%`<60>%g<>%g<>hk<68>%t<>u<>u<> <10><19>?<3F> <20>!Z<>!a<>!a<>be<62>!m<>n<>n<><15> <0A><>U[<01>$<24>%M<>%T<>%T<>UX<55>%Y<>Z<>Z<><5A>]<01>$<24>%O<>%V<>%V<>WZ<57>%[<5B>\<5C>\<5C><>Y<01>$<24>%K<>%R<>%R<>SV<53>%W<>X<>X<>s$<00> P;<00> Q<00>+Q9<00>;Q<03>Q6<03>9Rc<00>N<<01>V^8<>dQhRS[RS[PP/#)r:rSr=)r@<00>werkzeug<75>datastructures<65> FileStorage)rAr s"<22>r'rBrA<00>s'<00><><00> *<2A> *<2A>C<EFBFBD> *<2A>H<EFBFBD>$;<3B>$;<3B>$G<>$G<> *r&c <0C><><00>RVP9gWPR,9d\RPV44hVPR,V,#)ug
@name 获取上传文件对象
@param key: str 参数名
@return: werkzeug.datastructures.FileStorage
<EFBFBD>FILESz!not found file with param name {})rr1rArs&&r'<00>get_file<6C>dict_obj.get_file<6C>sI<00><00> <13>$<24>,<2C>,<2C> &<26>#<23>\<5C>\<5C>'<27>5J<35>*J<><1C>@<40>G<>G<><03>L<>M<> M<><13>|<7C>|<7C>G<EFBFBD>$<24>S<EFBFBD>)<29>)r&)<02>__store<72> __validatedN)rrrrrrr r#r(r,r1r5<00>propertyr<79>r;r rErnr<>rbrjrrrs@r'r<>r<>s<><00><><00><00>!<21>"<22>"<22>"<22><1B><1B>"<22>k<01><0E><1C><0E><1C><1C>^i<01>]j<>\l<>)<29>)<29>"'<27>)<29> "<22>"<22>B<EFBFBD>]<16>~ *<2A> *r&r<>c<00>Ta<00>]tRtRtoRtRtRtRtRtRt Rt
R R
lt R t Vt R #) <0A> get_modulesi<73>c<08>$<00>VPV4#rN<00><01>get_attrrs&&r'r<00>get_modules.__contains__<5F><00><00><00><13>}<7D>}<7D>S<EFBFBD>!<21>!r&c<08><00>\WV4R#rN)rJrs&&&r'r <00>get_modules.__setitem__<5F>s <00><00><0F><04>5<EFBFBD>!r&c <0C><><00>\W4p\V\4'd&\V4p\ V4\ WV4V#V# \ \44h;i)ub
尝试获取模块,若为字符串,则尝试实例化模块,否则直接返回模块对像
)rzr<>r@<00>
__import__r2rJr<>r<>)r<>rSrf<00>tmp_objs&& r'rs<00>get_modules.get_attr<74>s[<00><00><16>d<EFBFBD> <20><03> <15>c<EFBFBD>3<EFBFBD> <1F> <1F> 2<>$<24>S<EFBFBD>/<2F><07><16>w<EFBFBD><0F><17><04>7<EFBFBD>+<2B><1E><0E><13>
<EFBFBD><EFBFBD> 2<><1F><0E> 0<>1<>1<>s <00>#A <00> Ac<08>$<00>VPV4#rNrrrs&&r'r#<00>get_modules.__getitem__<5F>rur&c<08><00>\W4R#rNr&rs&&r'r(<00>get_modules.__delitem__<5F>r*r&c<08><00>\W4R#rNr&rs&&r'r,<00>get_modules.__delattr__<5F>r*r&c<08><00>V#rNr%rs&r'r;<00>get_modules.get_items<6D>s<00><00><13> r&Nc <0C><><00>\P!\44RR.pV\P9g!\PP ^V4\P !V4F<>pWC9dK RPW.4p\PPV4'dVRRR9gKNVRRpM<RPVR34p\PPV4'gK<>TpV'd8\V\4'g\V\4'gV3pWb9gK<>\WV4K<> R#)u-
@name 加载指定目录下的模块
@author hwliang<2020-08-03>
@param path<string> 指定目录,可指定绝对目录,也可指定相对于/www/server/panel的相对目录 默认加载class目录
@param limit<string/list/tuple> 指定限定加载的模块名称默认加载path目录下的所有模块
@param object
@example
p = get_modules('class')
if 'public' in p:
md5_str = p.public.md5('test')
md5_str = p['public'].md5('test')
md5_str = getattr(p['public'],'md5')('test')
else:
print(p.__dict__)
z __init__.py<70> __pycache__r{Nr<4E>)<02>.pyz.so)rl<00>chdirr<72>rrmrr<>r<>r<>rnr<>r<>r<>rJ)r<>rmrE<00> exp_filesr<73>r<>r{<00>c_files&&& r'r<00>get_modules.__init__<5F>s<><00><00>" <0B><08><08><1E>!<21>"<22>"<22>M<EFBFBD>2<> <09><13>s<EFBFBD>x<EFBFBD>x<EFBFBD><1F> <0F>H<EFBFBD>H<EFBFBD>O<EFBFBD>O<EFBFBD>A<EFBFBD>t<EFBFBD> $<24><17>Z<EFBFBD>Z<EFBFBD><04>%<25>E<EFBFBD><14>!<21>8<EFBFBD><1A>x<EFBFBD>x<EFBFBD><14> <0A>.<2E>H<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>'<27><1C>R<EFBFBD>S<EFBFBD>z<EFBFBD>^<5E>3<>X<EFBFBD> <20><13>"<22>:<3A><08><1C><18><18>8<EFBFBD>]<5D>";<3B><<3C><06><19>w<EFBFBD>w<EFBFBD>~<7E>~<7E>f<EFBFBD>-<2D>-<2D><1C> <20><08><14>!<21>%<25><14>.<2E>.<2E>z<EFBFBD>%<25><15>7O<37>7O<37>"<22>H<EFBFBD>E<EFBFBD><1F>(<28><1C> <13>D<EFBFBD>H<EFBFBD> -<2D>%&r&r%)rUN)rrrrrr rsr#r(r,r;rrrrs@r'rprp<00>s2<00><><00><00>"<22>"<22> <13>"<22><1B><1B><14>'.<2E>'.r&rpc<00>r<00>\4R,pVR8Xd<>\PPR4'gR#\PPVR,4'gR#\PPVR,4'dT\P
!\ VR,44pVR,'gR#RV9gR#VR,'gR#R#R#VR8Xd<>\\\P!4P44'gR#\PPR4'gR#\PPVR,4'gR#\P
!\ VR,44pV'gR#VR,'gR#R#VR 8Xda\PPVR
,4'gR#\P
!\ VR
,44pV'gR#R#R # R#;i) r{r z,/www/server/panel/plugin/btapp/btapp_main.pyFzconfig/api.jsonr<6E><00>appsT<73>app_bind<6E>wxappzplugin/app/user.jsonN) r<>rlrmrnrorprqr4r<>rjr<>)r@rm<00>
btapp_info<EFBFBD>app_infos& r'<00> check_appr<70>s<><00><00> <19> <1B>c<EFBFBD> !<21>D<EFBFBD> <0C><05>~<7E> <19><15>7<EFBFBD>7<EFBFBD>><3E>><3E>"P<>Q<>Q<>Z_<5A><15>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24>):<3A>":<3A>;<3B>;<3B>E<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>%6<>6<>7<>7<>!<21>Z<EFBFBD>Z<EFBFBD><08><14>8I<38>1I<31>(J<>K<>
<EFBFBD>!<21>&<26>)<29>)<29>%<25><1D><1A>+<2B>E<EFBFBD>!<21>&<26>)<29>)<29>%<25><1B><18>
<0F>*<2A> <1C><18><13>R<EFBFBD>X<EFBFBD>X<EFBFBD>Z<EFBFBD>/<2F>/<2F>0<>1<>1<>%<25><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>L<>M<>M<>V[<5B><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>%6<>6<>7<>7<><05><19>Z<EFBFBD>Z<EFBFBD><08><14>0A<30>)A<> B<>C<>
<EFBFBD><19>%<25><19>&<26>!<21>!<21>%<25><13> <0E>'<27> <19><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD>%;<3B>;<3B><<3C><<3C>U<EFBFBD><17>:<3A>:<3A>h<EFBFBD>t<EFBFBD>.D<>'D<>E<>F<><08><17><05><13>
<1A><> <19><18>s)<00>$H1<00>+H1<00>/+H1<00>5H1<00>H1<00>H1<00>1H6c<00><00>^RIpRVPRR4RV/pV'd \W14VP4PRV/4# \d&p\ RRP T44uRp?#Rp?ii;i) rNr<4E>r<00><br/>rrGF<>Failed to send: {})<07> panelPushrr<00> WriteLog2<67>push_message_immediatelyr<79>r<>rA)r<00>body<64>is_logs<67>is_typer<65><00>msg_datarts&&&& r'<00> send_mailr<6C>Zs}<00><00> A<01><18> <11>4<EFBFBD><<3C><<3C><04>g<EFBFBD>.<2E> <13>U<EFBFBD>
<EFBFBD><08> <13>I<EFBFBD>g<EFBFBD>,<2C><18>"<22>"<22>$<24>=<3D>=<3D>v<EFBFBD>x<EFBFBD>>P<>Q<>Q<><51> <14>A<01><18><15> 4<> ;<3B> ;<3B>B<EFBFBD> ?<3F>@<40>@<40><>A<01>s"<00>!A<00>+A<00> B<03>A;<03>5B<03>;Bc<00><><00>^RIpV'd \W 4VP4PRRV//4# \d&p\ RRP T44uRp?#Rp?ii;i)rN<>dingdingr<67>Fr<46><00>r<>r<>r<>r<>r<>rA<00>r<>r<>r<>r<>rts&&& r'<00> send_dingdingr<67>hsd<00><00>A<01><18> <12>I<EFBFBD>g<EFBFBD>,<2C><18>"<22>"<22>$<24>=<3D>=<3D>z<EFBFBD>E<EFBFBD>SW<53>=<3D>>Y<>Z<>Z<><5A> <14>A<01><18><15> 4<> ;<3B> ;<3B>B<EFBFBD> ?<3F>@<40>@<40><>A<01><><00> <<00>-<<00> A,<03>A'<03>!A,<03>'A,c<00><><00>^RIpV'd \W 4VP4PRRV//4# \d&p\ RRP T44uRp?#Rp?ii;i)rN<>weixinr<6E>Fr<46>r<>r<>s&&& r'<00> send_weixinr<6E>r<00>d<00><00>A<01><18> <12>I<EFBFBD>g<EFBFBD>,<2C><18>"<22>"<22>$<24>=<3D>=<3D>x<EFBFBD>%<25>QU<51><1D>>W<>X<>X<><58> <14>A<01><18><15> 4<> ;<3B> ;<3B>B<EFBFBD> ?<3F>@<40>@<40><>A<01>r<EFBFBD>c<00><><00>^RIpV'd \W 4VP4PRRV//4# \d&p\ RRP T44uRp?#Rp?ii;i)rN<>feishur<75>Fr<46>r<>r<>s&&& r'<00> send_feishur<75>|r<>r<>c <00><><00>^RIpRV/pRVRVRVRRVPRR4R V//pVP4PV4# \d&p\ R
R P T44uRp?#Rp?ii;i) rNr<4E>r<>r<>r<>rGrr<>rFr<46>)r<>rrr<>r<>r<>rA)r<>rr<><00>msg_dict<63>msg_allrts&& r'<00>send_allr<6C><00>s<><00><00>A<01><18><19>4<EFBFBD>=<3D><08> <14>h<EFBFBD> <14>h<EFBFBD> <16><08> <12><15>t<EFBFBD>|<7C>|<7C>D<EFBFBD>'<27>2<><17><15><0E> 
<EFBFBD><07><19>"<22>"<22>$<24>=<3D>=<3D>g<EFBFBD>F<>F<><46> <14>A<01><18><15> 4<> ;<3B> ;<3B>B<EFBFBD> ?<3F>@<40>@<40><>A<01>s<00>AA<00> A7<03>A2<03>,A7<03>2A7c<00><><00>RP\44p\PP V4'd\ V4pVP 4#R#)z{}/data/iplist.txtr<74>)rAr<>rlrmrnr<>rI)<02> iplist_filer~s r'<00>get_ipr<70><00>sA<00><00>&<26>-<2D>-<2D>n<EFBFBD>.><3E>?<3F>K<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>k<EFBFBD>"<22>"<22><17> <0B>$<24><04><13>z<EFBFBD>z<EFBFBD>|<7C><1B>r&c<00>\<00>\R4pV^,P4pV# R#;i)zuip addr | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -E -v \"^127\.|^255\.|^0\.\" | head -n 1r<31>r<>)r <00>local_ips r'<00> get_local_ipr<70><00>s6<00><00><1B><17> E<02>F<02><03><16>q<EFBFBD>6<EFBFBD><<3C><<3C>><3E><08><17><0F><><1B><1A>s<00>#&<00>+c<04>L<00>^RIpRpVP!VPVP4pVPR4VP 4^,pTVeVP 4## M;iTeTP 4R# TeTP 4ii;i)u获取内网IPNr<4E><00>z8.8.8.8<EFBFBD>P<00>r<>r<><00>
SOCK_DGRAMrj<00> getsocknamer<65><00>r<>r<>r<>s r'<00>get_local_ip_2r<32><00>s<><00><00><15> <10><01> <1A><16> <0A> <0A>f<EFBFBD>n<EFBFBD>n<EFBFBD>f<EFBFBD>.?<3F>.?<3F>@<40>A<EFBFBD> <0A>I<EFBFBD>I<EFBFBD>o<EFBFBD> &<26><12><1D><1D><1F><11>#<23>B<EFBFBD><15><11>}<7D><11><07><07> <09><1D><> <11> <10><>D<EFBFBD><10>}<7D><11><07><07> <09><1A><><11>}<7D><11><07><07> <09><1D>s<00>AA.<00>.A2<03>0B <00> B#c<00><><00>^RIpVP4pVPR4PRR4P 4'gRpVP VR4R#R#)rNrztype=? AND name=?z<>CREATE TABLE `logs2` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`type` TEXT,
`log` TEXT,
`addtime` TEXT
, uid integer DEFAULT '1', username TEXT DEFAULT 'system'))r6<00>logs2r%)r4r5r6r^rr )r4r7<00>csqls r'<00> create_logsr<73><00>sT<00><00> <0A>
<0C>&<26>&<26>(<28>C<EFBFBD> <0E>9<EFBFBD>9<EFBFBD>_<EFBFBD> %<25> +<2B> +<2B>,?<3F>AS<41> T<> Z<> Z<> \<5C> \<5C>><3E><04> <0C> <0B> <0B>D<EFBFBD>"<22><1D> ]r&c<00><><00>^RIp\4Rp^pRpVP4p\P!R\P
!44p WeWV,V 3p
VP R4PRV
4p R#)rNrrFrr<>r)r4r<>r5r<>rrr6r!) r<>r*r<>r#r4rrr$r7r%r~r<>s &&&& r'r<>r<><00>sh<00><00> <0A><0F>M<EFBFBD><17>H<EFBFBD>
<0B>C<EFBFBD><10>G<EFBFBD>
<0C>&<26>&<26>(<28>C<EFBFBD> <10>M<EFBFBD>M<EFBFBD>-<2D><14><1E><1E>)9<> :<3A>E<EFBFBD> <0F>4<EFBFBD>'<27>!1<>5<EFBFBD> 9<>D<EFBFBD> <10>Y<EFBFBD>Y<EFBFBD>w<EFBFBD> <1F> #<23> #<23>$C<>T<EFBFBD> J<>Fr&c<00><><00>\PPV4'd+\P!\ V44pY9dR#R#R# \ TR4R#;i)z[]FT)rlrmrnrorpr<>r^)rmr<><00> path_jsons&& r'<00>check_ip_whiter<65><00>sP<00><00> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD><1B><1B> <19><1C>
<EFBFBD>
<EFBFBD>8<EFBFBD>D<EFBFBD>><3E>2<>I<EFBFBD> <0E>?<3F><17><18><14><> <19> <15>d<EFBFBD>D<EFBFBD> !<21><18>s <00>A<00>A#c<04>j<00>Rp\V.4pRV9dRpMW0,pRV9g
VR,p/pRpRP\4V4pRP\4V4p\PP V4'dR p/p\ P!\V44pT'gnRT9dgTR,pTR,pY<>9g^YH&YH,^8d
TR
, pYH;;,^, uu&\T\ P!T44Y$R &YT3# L<>;i) u^
@name 检测登录地区
@login_type 登录类型 panel:YakPanel 面板登录, ssh:ssh登录
rFr<>u****Pro exclusive<65>cityrZF<>{}/data/{}_login_area.pl<70>{}/data/{}_login_area.jsonTu#<font color=red>异地</font><> login_ip_area) <0B> get_ips_arearAr<>rlrmrnrorprqrsr) <09>login_ip<69>
login_typer<EFBFBD><00>ip_infor~r<><00>sfile<6C>s_confr<66>s && r'<00>check_login_arear<61><00>s<00><00> <17>M<EFBFBD><1A>H<EFBFBD>:<3A>&<26>G<EFBFBD><0F>7<EFBFBD><1A>1<> <0A><19>#<23><07><15><17> <20>#<23>F<EFBFBD>O<EFBFBD>M<EFBFBD> <0A>D<EFBFBD> <12>F<EFBFBD> &<26> -<2D> -<2D>n<EFBFBD>.><3E>
<EFBFBD> K<>E<EFBFBD> )<29> 0<> 0<><1E>1A<31>:<3A> N<>F<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>e<EFBFBD><1C><1C><15><06> <0A>D<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>6<EFBFBD>*<2A>+<2B><04> <19>V<EFBFBD>w<EFBFBD>.<2E><16>v<EFBFBD><EFBFBD><04><1F><06><0F> <0A><13>|<7C><1A>D<EFBFBD>J<EFBFBD> <0F>:<3A><01>><3E> <19>B<> B<>M<EFBFBD> <0C>
<EFBFBD>a<EFBFBD><0F>
<EFBFBD><11>&<26>$<24>*<2A>*<2A>T<EFBFBD>*<2A>+<2B>)<29><1F><19> <11><<3C><17><># <0A> <0C>s <00>D.<00>.D2c<04>b<00>^RIp\4pRVnWnVP RRV4pV#)uW
@name 免费IP库 获取ip地址所在地
@author cjxin
@param ips<list>
@return list
N<EFBFBD>safe<66>freeip<69> get_ip_area<65>r]r<><00> model_indexr<78><00>
module_run<EFBFBD>r<>r]r<>rfs& r'<00>get_free_ips_arear<61>s4<00><00><18> <13>:<3A>D<EFBFBD><1D>D<EFBFBD><14><12>H<EFBFBD>
<16>
!<21>
!<21>(<28>M<EFBFBD>4<EFBFBD>
@<40>C<EFBFBD> <0E>Jr&c<04><><00>VPR4^,p\V4'gRR/#\V4'dRRRR/#/pRP\ 44p\
P !\V44pY9d Y!,#^RIH pTP4pTPR T./4pYa,# LE;i RR
/#;i) uJ
@name 免费IP库 获取ip地址所在地
@param ip<string>
@return dict
r<EFBFBD>rZre<00>intranetrhTz{}/data/ip_area.json)<01>ipsModelr<6C><00>Unknown) r<>r<>rrAr<>rorprq<00> safeModelr<6C><00>mainr<6E>)r<>r<>r<>r<>r<><00>objrfs& r'<00>get_free_ip_infor<6F>"s<><00><00>
<11><1D><1D>s<EFBFBD> <1B>A<EFBFBD> <1E>B<EFBFBD> <12>2<EFBFBD>;<3B>;<3B><16><08>!<21>!<21><12>2<EFBFBD><EFBFBD><EFBFBD><16>
<EFBFBD>G<EFBFBD>T<EFBFBD>2<>2<><10>G<EFBFBD> "<22> )<29> )<29>.<2E>*:<3A> ;<3B>E<EFBFBD> <0A><16>*<2A>*<2A>X<EFBFBD>e<EFBFBD>_<EFBFBD>-<2D><07>
<EFBFBD>}<7D><16>{<7B><1A> <0A>&<26><16>m<EFBFBD>m<EFBFBD>o<EFBFBD><03><11>o<EFBFBD>o<EFBFBD>u<EFBFBD><02>t<EFBFBD>n<EFBFBD>-<2D><03><12>w<EFBFBD><0E><> <0A> <0C><> <0A> <0C> <12>I<EFBFBD> <1E><1E>s<00>!C<00>1C<00>C<03>Cc<04><><00>\PPRP\ 4R44'dR/3#Rp\ V.4pW9gR/3#W0,pRV9g
VR,pRpRP\ 4V4p/p\ P!\V44pT'g<>RT9d<>TR,pTR,p\T4^8<>d Yv9g^Yg&Yg,^8dTR 8Xd TR
, pM TR , pYg;;,^, uu&\T\ P!T44Y&R &YF3# L<>;i) uk
@name 使用免费IP库获取IP地区
@login_type 登录类型 panel:YakPanel 面板登录, ssh:ssh登录
r<EFBFBD><00>yakpanelFrFr<>rZTr<54><00>Localu%<font color=red>Intranet</font>u+<font color=red>Abnormal login</font>r<EFBC89>) rlrmrnrAr<>r<>rorprqr<>rsr)r<>r<>r<>r<>r<>r<>r~r<>s&& r'<00>free_login_arear<61>Es5<00><00> 
<EFBFBD>w<EFBFBD>w<EFBFBD>~<7E>~<7E>0<>7<>7<><0E>8H<38>*<2A>U<>V<>V<><14>b<EFBFBD>y<EFBFBD><18><16>M<EFBFBD><1F><18>
<EFBFBD>+<2B>G<EFBFBD> <13> <1E><14>b<EFBFBD>y<EFBFBD><18><15><1F>G<EFBFBD> <11>W<EFBFBD> <1C><1F><06><0F> <0A> <11>F<EFBFBD> )<29> 0<> 0<><1E>1A<31>:<3A> N<>F<EFBFBD> <0A>D<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>6<EFBFBD>*<2A>+<2B><04> <19>V<EFBFBD>w<EFBFBD>.<2E><16>v<EFBFBD><EFBFBD><04><1F><06><0F> <0A> <0E>t<EFBFBD>9<EFBFBD><01>><3E>$<24>,<2C><1A>D<EFBFBD>J<EFBFBD> <0F>:<3A><01>><3E><13>w<EFBFBD><EFBFBD><1D>!H<>H<> <0A><1D>!N<>N<> <0A> <0C>
<EFBFBD>a<EFBFBD><0F>
<EFBFBD><11>&<26>$<24>*<2A>*<2A>T<EFBFBD>*<2A>+<2B>)<29><1F><19> <11><<3C><17><> <0A> <0C>s <00>E <00> Ec <00><><00>Rp\4pRp\PPV4'd\ V4P 4pM\PPR4'd \ R4pMN\PPR4'dRp\PPR4'dRpVR,V,p\VRR 7wr<>V'd<>R
V R ,,p
\P!R 4\V4'dg\V4p \R 4PRV 4PR4p \R 4PRV 4PRW<>,4p MRp
\RWz,R4V'gR#\!VP 44pV'gR#RP#V4p\%W<>4'dR#V
'd,RV,RV,RV,R,V,V
R.pM)RV,RV,RV,R,V,R.pR\'4RVRVRVR V
RV/p^RIHpV!RRVR7p\-V4V'dR#TR 8Xd<>/p \'4T R&\14T R!&R"P#T R,4pR#R$T,R%,R&\P2!R'\P4!44R(R$T,R%,R)T/pTP7R*\9T44pR#^R+IHpTP?T4pTP 4R,8XdU^R-I H!pTP7TP?TTTT
\P2!R'\P4!44R.74M\ER/T4pR/TR0&TPGX4R# \-\/44ELb;i)1rFz*/www/server/panel/data/panel_login_send.plz)/www/server/panel/data/login_send_type.plz)/www/server/panel/data/login_send_mail.plrGz-/www/server/panel/data/login_send_dingding.plr<6C>r<><00>panel)r<>r<>u >Locationr<EFBC9A>g<><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?rr<>r<zlogin successfulFNz{}/data/send_login_white.jsonz>Login method:z>Login account:z
>Login IP:z0>Login status:<font color=#20a53a>Success</font>r<>r<>rr<><00>msg_list)<01>push_by_task_keyword<72> panel_login)<01> push_data<74>smsr<73>u{}(外)rrYr[r<>rr<>r<><00> login_panel)<01>SitePushMsgCollect<63>
wx_account)<01>ToWechatAccountMsg)rr<>r<>r<><00>
login_timezYakPanel login alarm<72> push_type)$r<>rlrmrnr<>rIrqr<>r<>r<>r4r8r^r<><00>setFieldr><00>init_msgrAr<><00> get_server_ip<69>mod.base.push_modr<64>r<>r<><00>get_network_iprr<00>send_msg<73>check_sms_argv<67>panel_msg.collectorr<72>r<><00>push.site_pushr<68><00> get_push_infor<6F>)r<>rr<>r<><00> send_type<70>
panel_path<EFBFBD>login_send_type_conf<6E>server_ip_area<65>login_aera_status<75>
login_aerar<EFBFBD>r!rr~r0<00>send_login_white<74>plistr<74>r<>rfr<><00>sm_args<67>rdatar<61>r<>r<>rZs&&&& r'<00>login_send_bodyrms_<00><00><12>I<EFBFBD><1F>!<21>J<EFBFBD>G<><18> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>*<2A>+<2B>+<2B><1C>1<>2<>8<>8<>:<3A> <09> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>E<> F<> F<> <20>!L<>M<>I<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>I<>J<>J<>"<22> <09><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>M<>N<>N<>&<26> <09><1E><03>^<5E>d<EFBFBD>*<2A>N<EFBFBD>$3<>^<5E>X_<58>$`<60>!<21><15><18>&<26><1A>O<EFBFBD>)D<>D<> <0A> <0C>
<EFBFBD>
<EFBFBD>3<EFBFBD><0F> <14>^<5E> $<24> $<24><1A>><3E>*<2A>B<EFBFBD><14>V<EFBFBD>9<EFBFBD>?<3F>?<3F>6<EFBFBD>2<EFBFBD>.<2E>7<>7<><05>><3E>D<EFBFBD><14>V<EFBFBD>9<EFBFBD>?<3F>?<3F>6<EFBFBD>2<EFBFBD>.<2E>7<>7<><05>t<EFBFBD>?S<>T<>D<EFBFBD><44><1A> <0A><15>(<28>.<2E>*H<>%<25>P<> <14><14> <15>i<EFBFBD>o<EFBFBD>o<EFBFBD>'<27> (<28>F<EFBFBD> <11>6<EFBFBD>6<>=<3D>=<3D>j<EFBFBD>I<><14><15>&<26>1<>1<><14><14> <1C>w<EFBFBD> &<26> <1D><08> (<28> <18>8<EFBFBD> #<23>c<EFBFBD> )<29>D<EFBFBD> 0<> <19> ><3E> 
<EFBFBD><05> <1D>w<EFBFBD> &<26> <1D><08> (<28> <18>8<EFBFBD> #<23>c<EFBFBD> )<29>D<EFBFBD> 0<> ><3E> 
<EFBFBD><05> <0A>m<EFBFBD>o<EFBFBD><11>7<EFBFBD><12>H<EFBFBD><12>H<EFBFBD><17><1D><12>E<EFBFBD> <06>I<EFBFBD> <0A>:<3A>"<22>=<3D>-<2D>9<EFBFBD>U<><03><11>#<23><0E> <0E> <12> <0F> <11>E<EFBFBD><19><11><04>"<22>_<EFBFBD><04>T<EFBFBD>
<EFBFBD>)<29>+<2B><04>Z<EFBFBD><18> <16> <1D> <1D>d<EFBFBD>4<EFBFBD>j<EFBFBD> )<29><02><19>3<EFBFBD><12>8<EFBFBD>c<EFBFBD>><3E>6<EFBFBD>4<EFBFBD>=<3D>=<3D><1D>PT<50>P^<5E>P^<5E>P`<60>3a<33><19>3<EFBFBD><17>=<3D>3<EFBFBD>.<2E><19>8<EFBFBD>%<25><07><17><0F><0F> <0A>~<7E>g<EFBFBD>/F<>G<><05> ;<3B> <20>,<2C>,<2C>U<EFBFBD>3<><03> <14>?<3F>?<3F> <1C> <0C> ,<2C> 9<> <12>O<EFBFBD>O<EFBFBD>.<2E>:<3A>:<3A><1D><1B>"<22>%<25><1F>=<3D>=<3D><1D><04><0E><0E>8H<38>I<> ;<3B><0E> <0F>!<21>!7<><15>?<3F>D<EFBFBD> 6<>D<EFBFBD><1B> <1D><0E><18><18><14><1E><>C <0A><11>.<2E>"<22>#<23> <0C>s <00>+$O<00>O4c<00><><00>RP\44pRP\44p\PP V4'd!V'd\ WRV4\ W4\PP V4'd#V'd\ VRV4\ V4R#R#)z{}/data/login_send_mail.plz{}/data/login_send_dingding.plTN)rAr<>rlrmrnr<>r<>)rr<>r<>r<><00>login_send_mail<69>login_send_dingdings&&&& r'<00> send_to_bodyr
<00>s<><00><00>2<>9<>9<>.<2E>:J<>K<>O<EFBFBD>:<3A>A<>A<>.<2E>BR<42>S<><17> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>o<EFBFBD>&<26>&<26> <12> <15>e<EFBFBD>4<EFBFBD><17> 1<><11>%<25><1E> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>)<29>*<2A>*<2A> <12> <19>$<24><04>g<EFBFBD> .<2E><15>d<EFBFBD><1B>+r&c<00>N<00>VR8Xd \W4#VR8Xd \V4#R#)rGr<>N)r<>r<>)r<>rr<>s&&&r'<00>send_body_wordsr <00>s-<00><00><10>F<EFBFBD><1A><18><15>%<25>%<25><10>J<EFBFBD><1E><1C>T<EFBFBD>"<22>"<22>r&c<00><><00>^RIpVP4pVP4p/pVR,R,VR&VR,R,VR&V#)rN<> user_mail<69> user_namerGr<>)r<><00> get_settings)r<><00> send_mail22<32>tongdaor s r'<00>return_is_send_inforsQ<00><00><14><1B>%<25>%<25>'<27>K<EFBFBD><19>&<26>&<26>(<28>G<EFBFBD>
<0C>C<EFBFBD><19>+<2B>&<26>{<7B>3<>C<EFBFBD><06>K<EFBFBD><1D>j<EFBFBD>)<29>*<2A>5<>C<EFBFBD>
<EFBFBD>O<EFBFBD> <0E>Jr&c<04><00>.ROp.ROpW3#)u>
@name 关键目录
@author hwliang<2021-06-11>
@return tuple
)
rL<00>/usrr{<00>/devrv<00>/media<69>/mnt<6E>/optr<74><00>/var)<14>/www/.Recycle_bin/z /www/backup/z/www/php_session/z /www/wwwlogs/z /www/server/z/etc/z/usr/z/var/z/boot/z/proc/z/sys/r<>z/root/z/lib/z/bin/z/sbin/z/run/z/lib64/z/lib32/z/srv/r%)r<>rBs r'<00> get_sys_pathr
s<00><00> Y<01>A<EFBFBD> <1D>A<EFBFBD> <0A>4<EFBFBD>Kr&c<04>:<00>VR9dR#.ROpVFpVPV4^8XgKR# \4wr4VP4pVR,R8XdVRRpW9dR#VR, pVFpVPV4^8XgKR# R# R#;i)u<>
@name 检查网站根目录是否为系统关键目录
@author hwliang<2021-05-31>
@param site_path<string> 网站根目录全路径
@return bool
r{FTN) r{rrrvrrrr<>r)z/www/server/tomcatz/www/server/stopz/www/server/phpmyadminz/www/server/adminerr^)r_rrI)<06> site_path<74>whitesr.r<><00> error_paths<68>eps& r'<00>check_site_pathr"s<><00><00><15> <14>`<60> `<60><18>l<><06><17>A<EFBFBD><18>~<7E>~<7E>a<EFBFBD> <20>A<EFBFBD>%<25>d<EFBFBD><18>%<25><1E><0E><01><1D>O<EFBFBD>O<EFBFBD>%<25> <09> <14>R<EFBFBD>=<3D>C<EFBFBD> <1F>Y<EFBFBD>s<EFBFBD><02>^<5E><19> <14>><3E><18><11>S<EFBFBD><18> <09><1D>B<EFBFBD><18>~<7E>~<7E>b<EFBFBD>!<21>Q<EFBFBD>&<26>u<EFBFBD><1E><13><><15><14>s,<00>B<00>B<00>B<00>7B<00>(!B<00>B<00>B<00>Bc<00>r<00>RP\44p\PP V4#)z{}/data/debug.plr0)<01>
debug_files r'<00>is_debugr%1s(<00><00>#<23>*<2A>*<2A>><3E>+;<3B><<3C>J<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25>%r&c<04><><00>V\P9g#\PP^V4R#R# R#;i)u^
@name 追加引用路径
@author hwliang<2021-07-07>
@param path<string> 路径
@return void
Nr9rJs&r'<00>sys_path_appendr'6s4<00><00> <0A><13>s<EFBFBD>x<EFBFBD>x<EFBFBD><1F> <0F>H<EFBFBD>H<EFBFBD>O<EFBFBD>O<EFBFBD>A<EFBFBD>t<EFBFBD> $<24> <20><> <0A> <0C>s <00>5;<00>Ac<04>:<00>^RIpVPR4^,#)uQ
@name 获取操作系统位数
@author hwliang<2021-07-07>
@return int 32 or 64
N<EFBFBD>P)<02>struct<63>calcsize)r*s r'<00>
get_sysbitr,Ds<00><00> <12> <11>?<3F>?<3F>3<EFBFBD> <1F>!<21> #<23>#r&c<04>j<00>RP\44pV'gV#RPW4#)u<>
@name 取指定插件目录
@author hwliang<2021-07-14>
@param plugin_name<string> 插件名称 不传则返回插件根目录
@return string
z {}/plugin<69>{}/{}<7D>rAr<>)r<>rKs& r'r<>r<>Ns.<00><00><1C>"<22>"<22>><3E>#3<>4<>I<EFBFBD> <16>y<EFBFBD>(<28> <12>><3E>><3E>)<29> 1<>1r&c<04>4<00>RP\44#)uH
@name 取类库所在路径
@author hwliang<2021-07-14>
@return string
z{}/classr/r%r&r'r^r^[<00><00><00> <16> <1C> <1C>^<5E>-<2D> .<2E>.r&c<04>Z<00>.ROpVFpVPV4pW#3u# R# K#;i)u
遍历解码字符串
)r*<00>GBK<42>ANSI<53>BIG5)FN)r )<04>srcBody<64>arrsr,r~s& r'<00> decode_datar8ds@<00><00> ,<2C>D<EFBFBD><18><08> <11><1A>><3E>><3E>(<28>+<2B>D<EFBFBD><1B>><3E> !<21><19> <17><16><> <11> <10>s<00>%<02>*c<04><00>R#)uB
@name 取日志目录
@author hwliang<2021-07-14>
@return string
rOr%r%r&r'<00> get_logs_pathr:rs<00><00> r&c<04>4<00>RP\44#)uH
@name 取虚拟主机目录
@author hwliang<2021-08-14>
@return string
z{}/vhostr/r%r&r'rr{r1r&c<04><><00>Rp\R4PRR4PR4pV'gV#\PP V4'dV#V#)uB
@name 取备份目录
@author hwliang<2021-07-14>
@return string
z /www/backuprTr<>r;<00>rD<00>r8r^r<>rlrmrn)<02>default_backup_pathr;s r'rKrK<00>sR<00><00> (<28><17><13>H<EFBFBD>+<2B>#<23>#<23>F<EFBFBD>D<EFBFBD>1<>:<3A>:<3A>=<3D>I<>K<EFBFBD> <16>2<>2<> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>k<EFBFBD>"<22>"<22>;<3B>$6<> <1E>r&c<04><><00>Rp\R4PRR4PR4pV'gV#\PP V4'dV#V#)uN
@name 取站点默认存储目录
@author hwliang<2021-07-14>
@return string
z /www/wwwrootrTr<><00>
sites_pathr=r>)<02>default_site_pathrs r'<00> get_site_pathrC<00>sR<00><00> '<27><15><11>(<28> <0B>!<21>!<21>&<26>$<24>/<2F>8<>8<><1C>F<>I<EFBFBD> <14>.<2E>.<2E> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20><19>"2<> <1C>r&c<04>h<00>RP\4W4p\PP V4'g\ RPV44h\ V4pVR8Xd\P!V4pV#V# \d p\ RPT44hRp?ii;i)u<>
@name 读取指定配置文件
@author hwliang<2021-07-14>
@param config_name<string> 配置文件名称(不含扩展名)
@param ext_name<string> 配置文件扩展名默认为json
@return string 如果发生错误将抛出PanelError异常
<EFBFBD>{}/config/{}.{}z2The specified configuration file {} does not existroz>Configuration files are not standard parsable JSON content!
{}N)
rAr<>rlrmrnrrqrorpr<>)<06> config_name<6D>ext_namer<65><00>
config_strr<EFBFBD>rts&& r'<00> read_configrI<00>s<><00><00>$<24>*<2A>*<2A>><3E>+;<3B>[<5B>S<>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26><18>M<>T<>T<>U`<60>a<>b<>b<><19>+<2B>&<26>J<EFBFBD><0F>6<EFBFBD><19> k<01><1E>*<2A>*<2A>Z<EFBFBD>0<>K<EFBFBD><1B><1A> <15><15><><19> k<01><1C>^<5E>e<>e<>fh<66>i<>j<> j<><6A> k<01>s<00>-B<00> B1<03>B,<03>,B1c<04><><00>RP\4W4pVR8Xd\P!V4p\ W14# \d p\ RPT44hRp?ii;i)ut
@name 保存配置文件
@author hwliang<2021-07-14>
@param config_name<string> 配置文件名称(不含扩展名)
@param config_body<mixed> 被保存的内容, ext_name为json请传入可解析为json的参数类型如list,dict,int,str等
@param ext_name<string> 配置文件扩展名默认为json
@return string 如果发生错误将抛出PanelError异常
rEroz@The configuration content cannot be converted to json format!
{}N)rAr<>rorr<>rrs)rFr<>rGr<>rts&&& r'<00> save_configrK<00>sn<00><00>$<24>*<2A>*<2A>><3E>+;<3B>[<5B>S<>K<EFBFBD><0F>6<EFBFBD><19> m<01><1E>*<2A>*<2A>[<5B>1<>K<EFBFBD> <15>[<5B> .<2E>.<2E><><19> m<01><1C>`<60>g<>g<>hj<68>k<>l<> l<><6C> m<01>s<00>A<00> A.<03>A)<03>)A.c<04>:<00>\W4pVPW4#)uu
@name 获取指定配置文件的指定配置项
@author hwliang<2021-07-14>
@param config_name<string> 配置文件名称(不含扩展名)
@param key<string> 配置项
@param default<mixed> 获不存在则返回的默认值,默认为空字符串
@param ext_name<string> 配置文件扩展名默认为json
@return mixed 如果发生错误将抛出PanelError异常
)rIrb)rFrSrrG<00> config_datas&&&& r'<00>get_config_valuerN<00>s<00><00><1E>k<EFBFBD>4<>K<EFBFBD> <16>?<3F>?<3F>3<EFBFBD> (<28>(r&c<04>8<00>\W4pW$V&\WV4#)uD
@name 设置指定配置文件的指定配置项
@author hwliang<2021-07-14>
@param config_name<string> 配置文件名称(不含扩展名)
@param key<string> 配置项
@param value<mixed> 配置值
@param ext_name<string> 配置文件扩展名默认为json
@return mixed 如果发生错误将抛出PanelError异常
)rIrK)rFrSrWrGrMs&&&& r'<00>set_config_valuerP<00>s#<00><00><1E>k<EFBFBD>4<>K<EFBFBD><1C><03><14> <16>{<7B><18> :<3A>:r&c<04>x<00>VR8Xd V'd^M^pVR8Xd V'dRMRpRVRVR\V4RV/pV#)u<>
@name 格式化响应内容
@author hwliang<2021-07-14>
@param status<bool> 状态
@param data<mixed> 响应数据
@param status_code<int> 状态码
@param error_msg<string> 错误消息内容
@return dict
NrFz unknown errorr<72>rcr<>r~r<>)r<>r~rcr<>r<>s&&&& r'<00> return_datarR<00>sN<00><00><13>d<EFBFBD><1A>!<21>a<EFBFBD>q<EFBFBD> <0B><10>D<EFBFBD><18> <20>B<EFBFBD>o<EFBFBD> <09> <11>&<26><15>{<7B><13>S<EFBFBD><19>^<5E><0E><04> <06>F<EFBFBD> <12>Mr&c<04>B<00>V'gTp\RW!\V44#)<02><>
@name 格式化错误响应内容
@author hwliang<2021-07-15>
@param error_msg<string> 错误消息
@param status_code<int> 状态码,默认为-1
@param data<mixed> 响应数据
@return dict
F)rRr@<00>r<>rcr~s&&&r'<00> return_errorrV<00>s<00><00> <10> <09><14> <16>u<EFBFBD>d<EFBFBD><13>Y<EFBFBD><1E> @<40>@r&c<04>.<00>V'gTp\WV4#)rT)rVrUs&&&r'r<>r<> s<00><00> <10> <09><14> <17> <09><04> 5<>5r&c<04><00>\RWV4#)u<>
@name 格式化成功响应内容
@author hwliang<2021-07-15>
@param data<mixed> 响应数据
@param status_code<int> 状态码默认为0
@return dict
T)rR)r~rcr<>s&&&r'<00>successrYs<00><00> <17>t<EFBFBD>T<EFBFBD> <09> :<3A>:r&c<04><><00>\R\V44pV'g \R4h\V^,W V^,P V44#)u<>
@name 按状态码返回
@author hwliang<2021-07-15>
@param status_code<int> 状态码
@param format_body<string> 错误内容
@param data<mixed> 响应数据
@return dict
rczinvalid status_code)rNr@rrRrA)rc<00> format_bodyr~r<>s&&& r'<00>return_status_coder\#sE<00><00>!<21><1D><03>K<EFBFBD>0@<40>A<>I<EFBFBD> <14>J<EFBFBD>'<<3C>=<3D>=<3D> <16>y<EFBFBD><11>|<7C>T<EFBFBD> <09>!<21> <0C>8K<38>8K<38>K<EFBFBD>8X<38> Y<>Yr&c<00>0<00>V^8<>dQhR\R\/#r[)r<>r<>)rAs"r'rBrB1s<00><00> <11> <11>d<EFBFBD> <11>x<EFBFBD> r&c<04><><00>\V\4'g \R4h\4pVP 4F pW,W&K V#)uu
@name 将dict转换为dict_obj
@author hwliang<2021-07-15>
@param data<dict> 要被转换的数据
@return dict_obj
z9parameter error: only support transform dict to dict_obj.)r<>r<>rr<>r<>)r~r<>rSs& r'<00> to_dict_objr_1sB<00><00> <16>d<EFBFBD>D<EFBFBD> !<21> !<21><18>T<>U<>U<> <14>J<EFBFBD>E<EFBFBD><13>y<EFBFBD>y<EFBFBD>{<7B><03><19>Y<EFBFBD><05>
<EFBFBD><1B> <10>Lr&c<04>"<00>\PPVR4pV'dV#^RIHp\PP W!V44p\ V4p\W0R4pWnRVn \WAP4V#)up
@name 从脚本文件获取对像
@author hwliang<2021-07-19>
@param filename<string> 文件名
@return object
N)<01>
ModuleTyper<EFBFBD>rF) rr<>rbr<>rar<>rqr<>r<>r<>r<>r<>)r<><00>_objra<00>_code<64> _code_objects& r'<00>get_script_objectre@sq<00><00> <0F>;<3B>;<3B>?<3F>?<3F>8<EFBFBD>T<EFBFBD> *<2A>D<EFBFBD> <0B>D<EFBFBD>[<5B> <20> <0E>;<3B>;<3B> !<21> !<21>(<28>J<EFBFBD>x<EFBFBD>,@<40> A<>D<EFBFBD> <14>X<EFBFBD> <1E>E<EFBFBD><1A>5<EFBFBD>F<EFBFBD>3<>L<EFBFBD><1C>M<EFBFBD><19>D<EFBFBD><14><08><1C>}<7D>}<7D>%<25> <0F>Kr&c<04>h<00>RP\44p\PP V4'gR#\P
!V4FWpVRRR8wdK\PP W4p\V4p\VRR4pV'gKPV!4KY R#)uA
@name 自动注册HOOK
@author hwliang<2021-07-19>
@return void
z{}/hooksNr<4E>r<>r<>) rAr<>rlrmrnr<>r<>rerz)<05>
hooks_path<EFBFBD> hook_namer<65>rb<00>_mains r'<00> check_hooksrjSs<><00><00> <1C>"<22>"<22>><3E>#3<>4<>J<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25><0E><17>Z<EFBFBD>Z<EFBFBD>
<EFBFBD>+<2B> <09> <14>R<EFBFBD>S<EFBFBD>><3E>U<EFBFBD> "<22>H<EFBFBD><15>7<EFBFBD>7<EFBFBD><<3C><<3C>
<EFBFBD>6<><08> <20><18>*<2A><04><17><04>f<EFBFBD>d<EFBFBD>+<2B><05><14>h<EFBFBD> <0A><07> ,r&c<04><><00>^RIHpVP4pW9g.W &WV,9gW ,PV4R#R#)u<>
@name 注册HOOK
@author hwliang<2021-07-15>
@param hook_index<string> HOOK位置
@param hook_def<def> HOOK函数对像
@return void
<EFBFBD><01>hooksN)rrmr<>r<>)<04>
hook_index<EFBFBD>hook_defrm<00> hook_keyss&& r'<00> register_hookrqesA<00><00><1F><15>
<EFBFBD>
<EFBFBD> <0C>I<EFBFBD> <15> "<22><1E><05><19> <13>Z<EFBFBD>(<28> (<28> <0A><19> <20> <20><18>*<2A> )r&c<04>p<00>^RIHpVP4pW9gV#W ,F pV!V4pK V#)u<>
@name 执行HOOk
@author hwliang<2021-07-15>
@param hook_index<string> HOOK索引位置格式限制^\w+$
@param data<mixed> 运行数据
@return mixed
rl)rrmr<>)rnr~rmrpros&& r'<00> exec_hookrsus;<00><00><1F><15>
<EFBFBD>
<EFBFBD> <0C>I<EFBFBD> <15> "<22><13> <0B><19>%<25>%<25><08><17><04>~<7E><04>&<26> <0F>Kr&c<04><><00>VP4pVP4pRPW4pRPW4pW#3#)u<>
@name 获取HOOK位置
@author hwliang<2021-07-19>
@param mod_name<string> 模块名称
@param def_name<string> 方法名称
@return tuple
z
{}_{}_LASTz {}_{}_END)<02>upperrA)r{<00>def_name<6D>
last_index<EFBFBD> end_indexs&& r'<00>get_hook_indexry<00>sE<00><00><18>~<7E>~<7E><1F>H<EFBFBD><17>~<7E>~<7E><1F>H<EFBFBD><1D>$<24>$<24>X<EFBFBD>8<>J<EFBFBD><1B>"<22>"<22>8<EFBFBD>6<>I<EFBFBD> <15> <20> r&c<04>z<00>Rp^RIHpVPV4'dVPV4\ 4R#)uC
@name 刷新插件列表
@author hwliang<2021-07-22>
@return bool
<EFBFBD>TNaMJdG3mDHKRS6Yr<59>T)rrdrbrjr<>)r<>rds r'<00>flush_plugin_listr|<00>s-<00><00> <1E>D<EFBFBD><1E> <0C>y<EFBFBD>y<EFBFBD><14><EFBFBD><EFBFBD><05> <0C> <0C>T<EFBFBD>*<2A><12><14> r&c<04>.<00>^RIHpRpVPV4pVR8XgV#RP\ 44pRp\
P PV4'gV#\\V44pTPYR4T# RpL;i)uI
@name 获取session过期时间
@author hwliang<2021-07-28>
@return int
r<EFBFBD><00>session_timeoutNz{}/data/session_timeout.plr<6C>r) rrdrbrAr<>rlrmrnr<>rqr<>)rdr<>r~<00> sess_out_paths r'<00>get_session_timeoutr<74><00>s<><00><00> <1F> <1C>D<EFBFBD><1B>i<EFBFBD>i<EFBFBD><04>o<EFBFBD>O<EFBFBD> <1A>d<EFBFBD> "<22>?<3F>$:<3A>0<>7<>7<><0E>8H<38>I<>M<EFBFBD><1B>O<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>-<2D> (<28> (<28><1E><1E> <20><1D>h<EFBFBD>}<7D>5<>6<><0F>
<EFBFBD>I<EFBFBD>I<EFBFBD>d<EFBFBD>T<EFBFBD>*<2A> <1A><1A><> <20><1F><0F>s <00>&B<00>Bc<04><00>^RIHpRpVPV4pVR8XgV#RP\ 44pRp\
P PV4'gV#\V4pVPWR4V#)uD
@name 获取登录token
@author hwliang<2021-07-28>
@return string
r<EFBFBD><00> login_tokenNr&<00>
1234567890r)
rrdrbrAr<>rlrmrnrqr<>)rdr<>r<><00>login_token_files r'<00>get_login_token_authr<68><00>sx<00><00> <1F> <18>D<EFBFBD><17>)<29>)<29>D<EFBFBD>/<2F>K<EFBFBD> <16>$<24> <1E>{<7B> 2<>/<2F>6<>6<>~<7E>7G<37>H<><14><1E>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> +<2B> +<2B><1A><1A><1A>+<2B>,<2C>K<EFBFBD> <09>I<EFBFBD>I<EFBFBD>d<EFBFBD><14>&<26> <16>r&c<04>r<00>RP\44p\PP V4#)uA
@name 是否监听ipv6
@author hwliang<2021-08-12>
@return bool
z{}/data/ipv6.plr0)<01> ipv6_files r'<00> listen_ipv6r<36><00>s*<00><00> "<22>(<28>(<28><1E>)9<>:<3A>I<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24>$r&c<04>4<00>RP\44#)uJ
@name 获取panel日志文件
@author hwliang<2021-08-12>
@return string
z{}/logs/error.logr/r%r&r'<00>get_panel_log_filer<65><00>s<00><00> <1F> %<25> %<25>n<EFBFBD>&6<> 7<>7r&c<04><><00>\V4\8Xd\P!V4pRP \ 4VP 4V4p\\4VR4#)u<>
@name 写入日志
@author hwliang<2021-08-12>
@param _info<string> 要写入到日志文件的信息
@param _level<string> 日志级别
@return void
z[{}][{}] - {}
r<EFBFBD>) r<>r<>rorrAr<>rur^r<>)<03>_info<66>_level<65>log_bodys&& r'r<>r<><00>sM<00><00> <0C>E<EFBFBD>{<7B>d<EFBFBD><1A><14>
<EFBFBD>
<EFBFBD>5<EFBFBD>!<21><05> <20>'<27>'<27> <0B> <0A>v<EFBFBD>|<7C>|<7C>~<7E>u<EFBFBD>M<>H<EFBFBD> <14>'<27>)<29>8<EFBFBD>T<EFBFBD> :<3A>:r&c<04>.<00>\\4R4R#)uF
@name 打印错误信息到日志文件
@author hwliang
@return void
<EFBFBD>ERRORN)r<>r<>r%r&r'<00> print_errorr<72><00>s<00><00> <0E>n<EFBFBD><1E><07>(r&c<04><00>V'dW\V\4'dV#\V\4'd \V4#\V4'd \V4#M^#\P
!W4p\P !V4#)u<>
@name 格式时间转时间戳
@author hwliang<2021-08-17>
@param format<string> 时间格式
@param times<date> 时间
@return int
)r<>r<>r<>r r<>r^r])rAr<><00>tss&& r'<00>to_dater<65><00>sd<00><00> <0A> <15>e<EFBFBD>S<EFBFBD> !<21> !<21>%<25><<3C> <15>e<EFBFBD>U<EFBFBD> #<23> #<23>C<EFBFBD><05>J<EFBFBD>%6<> <14>U<EFBFBD> <1B> <1B>C<EFBFBD><05>J<EFBFBD>.<2E> <1B><10> <0A><1D><1D>u<EFBFBD> %<25>B<EFBFBD> <0F>;<3B>;<3B>r<EFBFBD>?<3F>r&c<04><><00>\R4^,pV'gR#VPR4^,P4R,pV# R#;i)uD
@name 获取glibc版本
@author hwliang<2021-08-17>
@return string
z ldd --versionrFrr^r<>)<02>
cmd_result<EFBFBD> glibc_versions r'<00>get_glibc_versionr<6E> sP<00><00> <12><1E><EFBFBD>/<2F><01>2<>
<EFBFBD><19>"<22>"<22>(<28>(<28><14>.<2E>q<EFBFBD>1<>7<>7<>9<>"<22>=<3D> <0A> <19><18><><12><11>s<00>A <00>-A <00> Ac<04><><00>\4p\PPVR,4;'g'\PPVR,4#)uH
@name 是否是apache或nginx
@author hwliang<2021-08-17>
@return bool
z/apachez/nginx)r{rlrmrnrs r'<00>is_apache_nginxr<78>s?<00><00>  <20>!<21>J<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A>y<EFBFBD>0<> 1<> Z<> Z<>R<EFBFBD>W<EFBFBD>W<EFBFBD>^<5E>^<5E>J<EFBFBD>QY<51>DY<44>5Z<35>Zr&c
<04><><00>^RIHpHpHpHp\ 4pVP PR4pV^8XdhV'dPRRR\\P!44RRRR\4//pV!\P!V4R ^<5E>R
7#V!\44#V^8XdXV'dHRRR\\P!44RRRRR //pV!\P!V4R ^<5E>R
7#V!R 4#\R 4p V R9g7V R8Xd \V4#V R8Xd \V4#V!\V 4R7#TR9d T!T4#T'dT#\T4# L(;i)un
@name 未登录时且未输入正确的安全入口时的响应
@author hwliang<2021-12-16>
@return Response
)r$r,r#rs<00> x-http-tokenr<6E>r<>r<>r<><00>?The current login session has been invalid, please login again!r#<00>application/json<6F>r<>r<>rhz autherr.html<6D>abort<72><74><00><>)r<>r^)NrDrr<>r<)rh)rr$r,r#rsr-r\rbr<>r<><00>get_admin_pathrorrI<00> error_404r()
r<EFBFBD><00>_srcr$r,r#rs<00> client_status<75> x_http_tokenr<6E><00>
abort_codes
&& r'<00>error_not_loginr<6E>$sp<00><00> F<01>E<>%<25>'<27>M<EFBFBD><1A>?<3F>?<3F>&<26>&<26>~<7E>6<>L<EFBFBD><14><01><19> <17> <19>"<22><1B>S<EFBFBD><14><19><19><1B>-<2D><19><19>\<5C><1E><0E> 0<><12><0E>F<EFBFBD><1C>D<EFBFBD>J<EFBFBD>J<EFBFBD>v<EFBFBD>.<2E>9K<39>TW<54>X<> X<><17><0E>(<28>)<29>)<29> <16>!<21> <1B> <17> <19>"<22><1B>S<EFBFBD><14><19><19><1B>-<2D><19><19>\<5C><1E><08><12><0E>F<EFBFBD><1C>D<EFBFBD>J<EFBFBD>J<EFBFBD>v<EFBFBD>.<2E>9K<39>TW<54>X<> X<><1E>~<7E>.<2E>.<2E> <0A> <20><17>)<29>
<EFBFBD><19>3<>3<><19>S<EFBFBD> <20><19>1<EFBFBD><1C>"5<><19>S<EFBFBD> <20><19>1<EFBFBD><1C>"5<><1B>3<EFBFBD>z<EFBFBD>?<3F>3<> 3<>4<> <09>J<EFBFBD><EFBFBD><17><01>{<7B><1A> <0B><10><08><18><11>|<7C><1B><> <0A> <0C>s<00>?#E,<00>#E,<00>5E,<00>,E0c<00>4<00>^RIHpHpRpRR/pV!VRVR7#)r<00>r$rz<><html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>r<><00> text/htmlr<6C><00>r<>r\<00>rr$r<00>r<>r$r<00>errorStrr\s& r'r(r(c<00>+<00><00>*<2A> <0B>H<EFBFBD> <17> <0B><06>G<EFBFBD> <14>H<EFBFBD>S<EFBFBD>'<27> :<3A>:r&c<00>4<00>^RIHpHpRpRR/pV!VRVR7#)rr<>z<><html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx</center>
</body>
</html>r<>r<>r<>r<>r<>r<>s& r'r<>r<>sr<>r&c<00>4<00>^RIHpHpRpRR/pV!VRVR7#)rr<>z<><html>
<head><title>401 Unauthorized</title></head>
<body>
<center><h1>401 Unauthorized</h1></center>
<hr><center>You must enter a valid login ID and password to access this page.</center>
</body>
</html>r<>r<>i<>r<>r<>r<>s& r'<00> error_401r<31><00>r<>r&c<04>H<00>^RIpVP4PR4#)uH
@name 获取密码安全配置
@author hwliang<2021-10-18>
@return int
N)rT<00>get_password_config)rTs r'r<>r<><00>s<00><00> <12> <11>=<3D>=<3D>?<3F> .<2E> .<2E>t<EFBFBD> 4<>4r&c<04><><00>\4pVR,^8XdR#\P!4VR,8<>dR#R#)uC
@name 密码过期检查
@author hwliang<2021-10-18>
@return bool
rBT<> expire_timeF)r<>r<>)<01>p_configs r'<00>password_expire_checkr<6B><00>s3<00><00> #<23>$<24>H<EFBFBD><0F><08><19>Q<EFBFBD><1E>t<EFBFBD> <0B>y<EFBFBD>y<EFBFBD>{<7B>X<EFBFBD>m<EFBFBD>,<2C>,<2C>U<EFBFBD> r&c <00><><00>RpRp\PPV4'd\RV: RV: R24RpRp\PPV4'd\RV: RV: R24RpRp\PPV4'd\RV: R V: RV: R24RpV'd \ 4R
#R
# R
#;i) Fz(/www/server/panel/vhost/nginx/btwaf.confzmv r\z.bakTz+/www/server/panel/vhost/nginx/free_waf.confz)/www/server/panel/vhost/apache/btwaf.conf<6E>
chattr -i z && mv N)rlrmrnr<>r<>)<03>flag<61>
nginx_path<EFBFBD> apache_paths r'<00>stop_status_mvorer<65><00>s<><00><00> <10>D<EFBFBD> <0A>?<3F>
<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25> <15><1A>Z<EFBFBD>@<40> A<><17>D<EFBFBD>B<>
<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> %<25> %<25> <15><1A>Z<EFBFBD>@<40> A<><17>D<EFBFBD>A<> <0B> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26> <15> <0B>[<5B>R]<5D>^<5E> _<><17>D<EFBFBD> <0F> <19>O<EFBFBD> <10><> <0A> <0C>s"<00>&C<00><C<00>(<C<00>%!C<00>
C<00>Cc<00>h<00>\PPR4'd \4R#R#)z"/www/server/panel/data/error_pl.plTF)rlrmrnr<>r%r&r'<00> is_error_pathr<68><00>s"<00><00> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>:<3A>;<3B>;<3B><19><1B><13> r&c<04><><00>\4R,p\PPV4'd!\P
!\ V44pM.ROp\W R7#)ue
@name 取PHP版本列表
@author hwliang<2021-12-16>
@param reverse<bool> 是否降序
@return list
z/config/php_versions.jsonr[)<10>52<35>53<35>54<35>55<35>56<35>70<37>71<37>72<37>73<37>74<37>80<38>81<38>82<38>83<38>84<38>85)r<>rlrmrnrorprqr)r\<00>_file<6C> version_lists& r'r<>r<><00>sG<00><00> <1B> <1C>:<3A> :<3A>E<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>e<EFBFBD><1C><1C><1B>z<EFBFBD>z<EFBFBD>(<28>5<EFBFBD>/<2F>2<> <0C>w<> <0C> <11>,<2C> 0<>0r&c<04><><00>^RIHpVPR,\4,p\ 4R,pVR,\ V4,#)uL
@name 获取临时SESSION文件
@author hwliang<2021-12-28>
@return string
<EFBFBD>r <00>SESSION_KEY_PREFIXz/data/session/r{)rr rTrr<>r<>)r <00>full_session_key<65> sess_paths r'<00>get_full_session_filer<65><00>sB<00><00> <1D><1A>z<EFBFBD>z<EFBFBD>"6<>7<>.<2E>:J<>J<><14><1E> <20>#3<>3<>I<EFBFBD> <14>s<EFBFBD>?<3F>S<EFBFBD>!1<>2<> 2<>2r&c<04><><00>\PPR4'dV\P!R4\PPR4'g\P!R4R#R#\PPR4'dV\P!R4\PPR4'g\P!R4R#R#R#) uE
@name 安装mysql客户端
@author hwliang<2022-01-14>
@return void
<EFBFBD> /usr/bin/yumzyum install mariadb -y<>/usr/bin/mysqlzyum reinstall mariadb -y<>/usr/bin/apt-getz!apt-get install mariadb-client -yz$apt-get reinstall mariadb-client* -yN)rlrmrnrr%r&r'<00>install_mysql_clientr<74><00>s<><00><00> 
<EFBFBD>w<EFBFBD>w<EFBFBD>~<7E>~<7E>n<EFBFBD>%<25>%<25>
<EFBFBD> <09> <09>*<2A>+<2B><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>.<2E>/<2F>/<2F> <0E>I<EFBFBD>I<EFBFBD>0<> 1<>0<> <0B><17><17><1E><1E>*<2A> +<2B> +<2B>
<EFBFBD> <09> <09>5<>6<><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>.<2E>/<2F>/<2F> <0E>I<EFBFBD>I<EFBFBD><<3C> =<3D>0<>
,r&c<04>,<00>RP\44RRRR.pVF,p\PP V4'gK*Vu# \ 4VF,p\PP V4'gK*Vu# V^,#)uH
@name 获取mysqldump路径
@author hwliang<2022-01-14>
@return string
z{}/mysql/bin/mysqldumpz/usr/bin/mysqldumpz/usr/local/bin/mysqldumpz/usr/sbin/mysqldumpz/usr/local/sbin/mysqldump<6D>rAr{rlrmrnr<><00><02> bin_filesr<73>s r'<00>get_mysqldump_binr<6E><00>s<><00><00> !<21>'<27>'<27><0E>(8<>9<><1C>"<22><1D>#<23> <06>I<EFBFBD><1E><08> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><1B>O<EFBFBD><1E><19><1A><1D><08> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><1B>O<EFBFBD><1E> <15>Q<EFBFBD><<3C>r&c<04>,<00>RP\44RRRR.pVF,p\PP V4'gK*Vu# \ 4VF,p\PP V4'gK*Vu# V^,#)uD
@name 获取mysql路径
@author hwliang<2022-01-14>
@return string
z{}/mysql/bin/mysqlr<6C>z/usr/local/bin/mysqlz/usr/sbin/mysqlz/usr/local/sbin/mysqlr<6C>r<>s r'<00> get_mysql_binr<6E> s<><00><00> <1D>#<23>#<23>N<EFBFBD>$4<>5<><18><1E><19><1F> <06>I<EFBFBD><1E><08> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><1B>O<EFBFBD><1E><19><1A><1D><08> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><1B>O<EFBFBD><1E> <15>Q<EFBFBD><<3C>r&c<04><00>RpVPR4R8wdRpVPR4R8wdRpEMVPR4R8wdRpM<>VPR4R8wdRpM<>VPR4R8wdRpM<>VPR4R8wdRpM<>VPR4R8wdRpM<>VPR 4R8wdR pM|VPR
4R8wdR
pMcVPR 4R8wdR pMJVPR 4R8wdR pM1VPR 4R8wdR pMVPR4R8wdRpRP\44p\V4pVPVR7p\ V4#)uC
@name 连接云端失败
@author hwliang<2021-12-18>
@return void
rFz502 Bad Gatewayz504 Bad GatewayzConnection refusedzConnection timed outzConnection reset by peerzName or service not knownzNo route to hostzNo such file or directoryz 404 Not Foundz 403 Forbiddenz401 Unauthorizedz400 Bad Requestz-Remote end closed connection without responsezRemote end closed connectionz0{}/YakPanel/templates/default/error_connect.html)rkr^)r_rAr<>rqr)rd<00>code_msg<73>err_template_filer<65>s& r'<00>error_conn_cloudr<64>&sl<00><00> <12>H<EFBFBD> <0B>y<EFBFBD>y<EFBFBD>"<22>#<23>r<EFBFBD>)<29>$<24><08> <0B>y<EFBFBD>y<EFBFBD>"<22>#<23>r<EFBFBD>)<29>$<24><08> <0A><19><19>'<27> (<28>B<EFBFBD> .<2E>'<27><08> <0A><19><19>)<29> *<2A>b<EFBFBD> 0<>)<29><08> <0A><19><19>-<2D> .<2E>"<22> 4<>-<2D><08> <0A><19><19>.<2E> /<2F>2<EFBFBD> 5<>.<2E><08> <0A><19><19>%<25> &<26>"<22> ,<2C>%<25><08> <0A><19><19>.<2E> /<2F>2<EFBFBD> 5<>.<2E><08> <0A><19><19>?<3F> #<23>r<EFBFBD> )<29>"<22><08> <0A><19><19>?<3F> #<23>r<EFBFBD> )<29>"<22><08> <0A><19><19>%<25> &<26>"<22> ,<2C>%<25><08> <0A><19><19>$<24> %<25><12> +<2B>$<24><08> <0A><19><19>B<> C<>r<EFBFBD> I<>1<><08>J<>Q<>Q<>R`<60>Rb<52>c<><15>
<12>$<24>
%<25>C<EFBFBD>
<0A>*<2A>*<2A>(<28>*<2A>
#<23>C<EFBFBD> <15>c<EFBFBD>?<3F>r&c<04><><00>^RIp.pVP!4FKpVPR,R8Xd VPMVPR,pVPV4KM VP RRR7V#)uF
@name 获取挂载点列表
@author hwliang<2021-12-18>
@return list
Nr{c<00><00>\V4#rN)r<>)r<>s&r'rp<00>%get_mountpoint_list.<locals>.<lambda>Ys<00><00>#<23>a<EFBFBD>&r&T<>rSr\r^)r<><00>disk_partitions<6E>
mountpointr<EFBFBD>r`)r<><00>
mount_list<EFBFBD>mountr<74>s r'<00>get_mountpoint_listr<74>Msq<00><00> <12><13>J<EFBFBD><17>'<27>'<27>)<29><05>).<2E>)9<>)9<>"<22>)=<3D><13>)D<>U<EFBFBD>%<25>%<25>%<25>JZ<4A>JZ<4A>]`<60>J`<60>
<EFBFBD><12><19><19>*<2A>%<25>*<2A><0F>O<EFBFBD>O<EFBFBD>(<28>$<24>O<EFBFBD>7<> <15>r&c<04>b<00>VPR4R8wgV^,R8wd \R4hV'g \R4h\PP V4'dVR,R8XdTMVR,p\ 4pVFpVP V4'gKVu# R#)u<>
@name 获取文件或目录目录所在挂载点
@author hwliang<2022-03-30>
@param path<string> 文件或目录路径
@return string
r<EFBFBD>r{zcannot use relative pathzpath cannot be emptyr^)r_rrlrmr_r<>r)rmr<>r<>s& r'<00>get_path_in_mountpointr<74>]s<><00><00> <0C>y<EFBFBD>y<EFBFBD><14><EFBFBD>"<22><1C><04>Q<EFBFBD><07>3<EFBFBD><0E>j<EFBFBD>A[<5B>6\<5C>0\<5C> <0F>z<EFBFBD>"8<>9<>9<>
<EFBFBD>w<EFBFBD>w<EFBFBD>}<7D>}<7D>T<EFBFBD><1A><1A><1B>B<EFBFBD>x<EFBFBD>3<EFBFBD><EFBFBD>t<EFBFBD>D<EFBFBD>3<EFBFBD>J<EFBFBD><04>%<25>&<26>J<EFBFBD> <20>
<EFBFBD> <0F>?<3F>?<3F>:<3A> &<26> &<26><1D> <1D>!<21>
r&c<04><><00>\V4pRPV4p\PP V4'g\P
!VR4V# R#;i)u<>
@name 获取指定文件或目录的回收站路径
@author hwliang<2022-03-30>
@param path<string> 文件或目录路径
@return string
z{}/.Recycle_bin/r<>r)r<>rArlrmrn<00>mkdir)rmr<><00>recycle_bin_paths& r'<00>get_recycle_bin_pathr<68>vsY<00><00>(<28><04>-<2D>J<EFBFBD>)<29>0<>0<><1A><<3C><14>$<24><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>.<2E>/<2F>/<2F> <0E>H<EFBFBD>H<EFBFBD>%<25>s<EFBFBD> +<2B> <1C><1B><>$<24>#<23>s <00><A<00>A!c<04><><00>RpRp\PPV4'd=\PPV4'g\P!W4\PPV4'g\P !VR4.p.p\4F<>pRP V4p\PPV4'g\P!VR4\PPV4'gKx\PPV4pWc9dK<>VPV4VPV4K<> VR,V9gVPVR,4V# \ RP Y44ELV;i EK;i)uF
@name 获取回收站列表
@author hwliang<2022-03-30>
@return list
z/www/.Recycle_binz/www/Recycle_binzmv {} {}r<>z{}.Recycle_bin/r{) rlrmrn<00>renamer<65>rAr<>r<>r<><00>getmtimer<65>)<07> default_path<74>default_path_src<72>recycle_bin_list<73>
mtime_listr<EFBFBD>r<><00>mtimes r'<00>get_recycle_bin_listr <00>s\<00><00>'<27>L<EFBFBD>)<29><14> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>&<26>'<27>'<27><02><07><07><0E><0E>|<7C>0L<30>0L<30> I<01> <0E>I<EFBFBD>I<EFBFBD>&<26> 5<> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27>
<EFBFBD> <0B> <0B>L<EFBFBD>#<23>&<26><1A><14><13>J<EFBFBD>)<29>+<2B>
<EFBFBD>,<2C>3<>3<>J<EFBFBD>?<3F><18> <15><15>7<EFBFBD>7<EFBFBD>><3E>><3E>"2<>3<>3<><12><08><08>)<29>3<EFBFBD>/<2F><15>7<EFBFBD>7<EFBFBD>><3E>><3E>"2<>3<>3<>X<EFBFBD><16>G<EFBFBD>G<EFBFBD>$<24>$<24>%5<>6<>E<EFBFBD><14>"<22>H<EFBFBD> <16> <1D> <1D>e<EFBFBD> $<24> <1C> #<23> #<23>$4<> 5<>,<2C> <18>#<23> <1D>!1<> 1<><18><1F><1F> <0C>s<EFBFBD> 2<>3<> <1B><1B><>7 I<01> <15>j<EFBFBD>'<27>'<27>(8<>G<> H<><48>& <15> <14>s%<00>F<00>A F?<02>(%F?<02>"F?<02>F<<03>?Gc<04><><00>^pRpRpRpRp\V4pV^8dV#VFVpVP4'dRpVP4'dRpVR9dRpVP4'gKTRpKX \\ VUu.uFqwNK up44pV^8<>d,V'dV'dV'd V'd^pV^ 8<>d^pV#uupi)uA
密码强度:
0 弱
1 中
2 强
FT)r<00>!rrrrr<>rrrXrZrrrQr\rrr<>r<>r{rr<>r<>r<00>?)r<><00>islower<65>isupper<65>isdigitr<74>) r&<00>l<>low<6F>up<75>symbol<6F>digit<69>p_lenr<6E>r<>s & r'<00>check_passwordr <00>s<><00><00>
<EFBFBD>A<EFBFBD>
<0F>C<EFBFBD> <0E>B<EFBFBD> <12>F<EFBFBD> <11>E<EFBFBD> <0F><08>M<EFBFBD>E<EFBFBD> <0C>q<EFBFBD>y<EFBFBD><10><08> <15><01> <0C>9<EFBFBD>9<EFBFBD>;<3B>;<3B><16>C<EFBFBD> <0C>9<EFBFBD>9<EFBFBD>;<3B>;<3B><15>B<EFBFBD> <0C>+<2B> +<2B><19>F<EFBFBD> <0C>9<EFBFBD>9<EFBFBD>;<3B>;<3B><18>E<EFBFBD><16> <0E>c<EFBFBD>h<EFBFBD>'<27>h<EFBFBD><11>1<EFBFBD>h<EFBFBD>'<27>(<28>
)<29>C<EFBFBD>
<EFBFBD>a<EFBFBD>x<EFBFBD> <0E>2<EFBFBD>&<26>U<EFBFBD><11>A<EFBFBD> <10>B<EFBFBD>;<3B><11>A<EFBFBD> <0C>H<EFBFBD><48> (s<00>
C c<04>n<00>^RIp/pRP\44p\PP V4'd!\ P!\V44p\V4\8wd/pVPP4PR4pWd9g/WF&WV,9g /WF,V&WV,V,9g^WF,V,V&WF,V,V;;,V, uu&\V\ P!V44R# L<>;i)u@
@模块使用次数
@mod_name 模块名称
@fun_name 函数名
Nz{}/data/mod_log.jsonr<6E>T)rrAr<>rlrmrnrorprqr<>r<><00>nowrrsr)r{<00>fun_namerrr~rmrSs&&& r'<00>set_module_logsr <00>s<><00><00> <14> <0A>D<EFBFBD> !<21> (<28> (<28><1E>)9<> :<3A>D<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD><1B><1B> <11><17>:<3A>:<3A>h<EFBFBD>t<EFBFBD>n<EFBFBD>-<2D>D<EFBFBD> <0C>D<EFBFBD>z<EFBFBD>T<EFBFBD><19><11><04>
<12>
<1B>
<1B>
<1F>
<1F>
!<21>
*<2A>
*<2A>:<3A>
6<EFBFBD>C<EFBFBD> <0E>;<3B>B<EFBFBD><04> <09> <13>C<EFBFBD>y<EFBFBD> <20> <20><04> <09>(<28><1B> <13>C<EFBFBD>y<EFBFBD><18>*<2A> *<2A>()<29><04> <09>(<28><1B>H<EFBFBD>%<25><08>I<EFBFBD>h<EFBFBD><17><08>!<21>U<EFBFBD>*<2A>!<21> <0A>d<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>$<24>%<25> <0F><>% <11> <10>s <00>D0<00>0D4c<04><><00>\'Egs/R\P!R4bR\P!R4bR\P!R4bR\P!R4bR \P!R
4bR \P!R 4bR \P!R4bR\P!R4bR\P!R4bR\P!R 4bR\P!R4bR\P!R4bR\P!R4bR\P!R4bR\P!R4bR\P!R4bs^RIHpVP
p\P 4pVFDpVPVR4pV'gK\V,PV4'dKCR# R #)!u@
@name 过滤请求头
@author hwliang<2021-12-18>
@return dict
rkz ^[\w\.\-\:]+$r<>z^[\w\s\.\-\*\/\,\=\;\+]+$zaccept-encodingz^[\w\s\.\-\*\/\,]+$zaccept-languagez^[\w\s\.\-\*\/\,\=\:\;]+$z cache-controlz^[\w\s\.\-\=\;]+$<24>
connectionz ^[\w\s\.\-]+$zcontent-lengthz^[\d]+$<24>cookiez-^[\w\s\=\%\+\&\;\:\@\$\,\.\-\_\*\/\?\!\~\#]+$r<>z$^(http|https)://[\w\.\-\?\=\&\/\:]+$<24>pragma<6D>refererz2^(http|https)://[\w\.\-\?\=\&\/\:\%\#\~\!\*\+\@]+$<24>
user-agentz/^[\w\s\.\-\*\/\,\(\)\=\+\;\:\@\$\,\.\-\_\~\#]+$zx-cookie-tokenrOr<>zX-KL-Ajax-RequestzX-Requested-WithrrNFT) <09>headers_filter_rulesrr<>r<>rsr\r<>rbr<>)rsr\<00>skeysr<73>rCs r'<00>filter_headersr <00>s<><00><00> <20> <1F>
<EFBFBD> <12>B<EFBFBD>J<EFBFBD>J<EFBFBD>/<2F>0<>
<EFBFBD> <14>b<EFBFBD>j<EFBFBD>j<EFBFBD>!=<3D>><3E>
<EFBFBD> <1E>r<EFBFBD>z<EFBFBD>z<EFBFBD>*@<40>A<>
<EFBFBD> <1E>r<EFBFBD>z<EFBFBD>z<EFBFBD>*F<>G<> 
<EFBFBD>
<1C>R<EFBFBD>Z<EFBFBD>Z<EFBFBD>(<<3C>=<3D> 
<EFBFBD> <19>"<22>*<2A>*<2A>%5<>6<> 
<EFBFBD> <1D>b<EFBFBD>j<EFBFBD>j<EFBFBD><1A>4<>
<EFBFBD> <15>b<EFBFBD>j<EFBFBD>j<EFBFBD>!Q<>R<>
<EFBFBD> <15>b<EFBFBD>j<EFBFBD>j<EFBFBD>!H<>I<>
<EFBFBD> <15>b<EFBFBD>j<EFBFBD>j<EFBFBD>!1<>2<>
<EFBFBD> <16>r<EFBFBD>z<EFBFBD>z<EFBFBD>"W<>X<>
<EFBFBD> <19>"<22>*<2A>*<2A>%W<>X<>
<EFBFBD> <1D>b<EFBFBD>j<EFBFBD>j<EFBFBD><18>2<>
<EFBFBD> <1B>B<EFBFBD>J<EFBFBD>J<EFBFBD>x<EFBFBD>0<>
<EFBFBD> <20><12><1A><1A>H<EFBFBD>!5<>
<EFBFBD> <1F><02>
<EFBFBD>
<EFBFBD>8<EFBFBD> 4<>!
<EFBFBD><1C>$<1E><15>o<EFBFBD>o<EFBFBD>G<EFBFBD> <20> %<25> %<25> '<27>E<EFBFBD> <12><01> <13>K<EFBFBD>K<EFBFBD><01>4<EFBFBD> <20><01><10>(<28>#<23>A<EFBFBD>&<26>,<2C>,<2C>Q<EFBFBD>/<2F>/<2F><18> <13>
r&c<04>B<00>VPRR4P4#)u
@去除所有空格
r\rF)rrrIrs&r'<00>trimr s<00><00> <10><<3C><<3C><03>R<EFBFBD> <20> &<26> &<26> (<28>(r&c<04>h<00>Rp\PPR4'dRpW8XdR#R#)u
@验证系统版本
<EFBFBD>windows<77>/www/server/panel<65>linuxTFr<46>)<02>_os<6F>src_oss& r'<00>get_osr& 's+<00><00><17>F<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>)<29>*<2A>*<2A>W<EFBFBD>F<EFBFBD> <0A>}<7D>T<EFBFBD> r&c<04><><00>\PPV4'd<>\P!V4pVP V4VFqp\PP VR,V,4'd\ VR,V,V4KRVP VR,V,4Ks R#R#)uS
递归获取目录所有文件列表
@path 目录路径
@flist 返回文件列表
r{N)rlrmrnr<>r<>r_<00> get_file_list)rm<00>flistr<74>r<>s&& r'r( r( 1s<><00><00> 
<EFBFBD>w<EFBFBD>w<EFBFBD>~<7E>~<7E>d<EFBFBD><1B><1B><12>
<EFBFBD>
<EFBFBD>4<EFBFBD> <20><05> <0A> <0C> <0C>T<EFBFBD><1A><19>D<EFBFBD><11>w<EFBFBD>w<EFBFBD>}<7D>}<7D>T<EFBFBD>C<EFBFBD>Z<EFBFBD>$<24>.<2E>/<2F>/<2F><1D>d<EFBFBD>S<EFBFBD>j<EFBFBD>4<EFBFBD>/<2F><15>7<><15> <0C> <0C>T<EFBFBD>C<EFBFBD>Z<EFBFBD>$<24>.<2E>/<2F> <1A>r&c<04>p<00>\W4pVPV4VP4R# R#;i)uJ
写入字节文件内容
@filename 文件名
@s_body 欲写入的内容
TF<EFBFBD>r<>r<>r<><00>r<>rgr<>rs&&& r'<00>
writeFile2r- As3<00><00><15> <11>(<28> !<21><02>
<EFBFBD><08><08><16><18>
<EFBFBD><08><08>
<EFBFBD><13><><15><14>s<00>,0<00>5c<04>t<00>^RIHpT'g TPpRP\ T44p\
P PT4pTPT4pT'gTPY44R#YT8XdR#^RI
pTP!T4TPY44R# R#;i)ux
@name 检查指定模块是否修改
@author hwliang
@param <string>文件名
@param <object>模块对象
@return void
r<EFBFBD>Nz obj_up_{}) rrdr<>rAr<>rlrmr<>rbr<>ryr2)rbr<>rdr<>r <00> old_mtimerys&& r'<00>check_obj_upgrader0 Qs<><00><00><0F>"<22>
<14><17>=<3D>=<3D><08> <17> <1D> <1D>c<EFBFBD>(<28>m<EFBFBD> ,<2C>D<EFBFBD> <0E>G<EFBFBD>G<EFBFBD> <1C> <1C>X<EFBFBD> &<26>E<EFBFBD><15> <09> <09>$<24><0F>I<EFBFBD> <15> <0A> <09> <09>$<24><1E><0E><11><19><0E><15> <0A><14><14>T<EFBFBD><1A> <09>I<EFBFBD>I<EFBFBD>d<EFBFBD><1A><>1<0F><0E>s <00>B2<00>2B7c<04><><00>V'gR#\V\4'gV#\P!RRV4pVP R4p\ \ \V44pV#)uT
@name 将版本号转为元组
@version 字符串版本号
@return 元组版本号
z[^\.\d]+rFr<>r%)r<>r@rr<>r<>r<><00>mapr<70>)r<>s&r'<00>version_to_tupler3 xsT<00><00> <13><11> <09> <15>g<EFBFBD>s<EFBFBD> #<23> #<23><16><0E><10>f<EFBFBD>f<EFBFBD>[<5B>"<22>g<EFBFBD>.<2E>G<EFBFBD><15>m<EFBFBD>m<EFBFBD>C<EFBFBD> <20>G<EFBFBD><13>C<EFBFBD><03>W<EFBFBD>%<25>&<26>G<EFBFBD> <12>Nr&c <04><><00>V'gR#^
p\4pVR,pVR,p\\V44pV'dTp/p\P!\T44pY9g/Y<>&YT,9g .Y<>,T&.p Y<>,T,F@p
T
R,P 4TP 48wgK/T P T
4KB T P RTR\\P!44/4T \T 4T,
RY<>,T&\T\P!T44R# EL;i L<>;i)uT
@保存搜索历史
@mod_name 模块名称
@key 关键字
@val string 搜索内容
Fz/data/search.limit<69>/data/search.json<6F>valr<6C>NT) r<>r<>rqrorprIr<>r<>r<>rsr) r{rSr6 r<00>p_file<6C>m_file<6C>d_file<6C>sdatar<61>rw<00>items &&& r'<00>set_search_historyr< <00>s5<00><00> <0F>u<EFBFBD>
<0C>C<EFBFBD> <1B> <1D>F<EFBFBD> <13>*<2A> *<2A>F<EFBFBD> <13>)<29> )<29>F<EFBFBD> <0A><13>H<EFBFBD>V<EFBFBD>$<24>%<25><05> <10><05>#<23><10>F<EFBFBD> <0A><15><1A><1A>H<EFBFBD>V<EFBFBD>,<2C>-<2D><06> <14> <1D>"<22>v<EFBFBD>/<2F> <0E><18>"<22> "<22>R<EFBFBD>V<EFBFBD>%5<>c<EFBFBD>%:<3A> <0F>F<EFBFBD><16> <20><13>%<25>%<25><04> <0F><05>;<3B> <1C> <1C> <1E>#<23>)<29>)<29>+<2B> -<2D>v<EFBFBD>}<7D>}<7D>T<EFBFBD>/B<>&<26> <0B>M<EFBFBD>M<EFBFBD>5<EFBFBD>#<23>v<EFBFBD>s<EFBFBD>4<EFBFBD>9<EFBFBD>9<EFBFBD>;<3B>'7<>8<>9<>"<22>3<EFBFBD>v<EFBFBD>;<3B><13>#4<>#5<>6<>F<EFBFBD><14>S<EFBFBD><19> <0A>f<EFBFBD>d<EFBFBD>j<EFBFBD>j<EFBFBD><16>(<28>)<29> <0F><>+ <0A> <0C><>
 <0A> <0C>s<00>E<00> E<00>E<03>Ec<04><><00>\W4.p\4R,p\P!\ V44V,V,p\ TRRR7pT# L;i)uI
@获取搜索历史
@mod_name string 模块名称
@key string 关键字
r5 c<00><00>VR,#)r<>r%rJs&r'rp<00>$get_search_history.<locals>.<lambda><3E>s<00><00>!<21>F<EFBFBD>)r&Tr<54>)rxr<>rorprqr<00>r{rSr<>r9 s&& r'<00>get_search_historyrA <00>sa<00><00> 
<EFBFBD>(<28><18> <0F>F<EFBFBD> <1B> <1D> 3<> 3<>F<EFBFBD> <0A><15><1A><1A>H<EFBFBD>V<EFBFBD>,<2C>-<2D>h<EFBFBD>7<><03><<3C><06><14>F<EFBFBD> 3<>T<EFBFBD> B<>F<EFBFBD> <11>M<EFBFBD><4D>  <0A> <0C>s <00>-A<00>A"c <04>x<00>V'gR#^
p/p\4R,p\P!\V44pY9g/Y@&YT,9g .Y@,T&Y@,T,pTF]pTP TR,4^8<>gK"\
P
!4TR,,
^8gKLTP T4K_ TPRTR\\
P
!44/4T^TY@,T&\T\P!T44R# L<>;i)ub
@设置目录打开历史
@mod_name string 模块名称
@key string 函数名
@val string 路径
F<EFBFBD>/data/dir_history.jsonr6 r<>T) r<>rorprqr_r<>rr<>r<>rsr)r{rSr6 rr<>r9 r~rZs&&& r'<00>set_dir_historyrD <00>s<00><00> <0F><05>
<0C>C<EFBFBD> <0F>F<EFBFBD> <1B> <1D> 8<> 8<>F<EFBFBD> <0A><15><1A><1A>H<EFBFBD>V<EFBFBD>,<2C>-<2D><06> <14> <1D>"<22>v<EFBFBD>/<2F> <0E><18>"<22> "<22>R<EFBFBD>V<EFBFBD>%5<>c<EFBFBD>%:<3A> <11> <1B>C<EFBFBD> <20>D<EFBFBD><14><04> <0E>8<EFBFBD>8<EFBFBD>D<EFBFBD><15>K<EFBFBD> <20>A<EFBFBD> %<25><13>y<EFBFBD>y<EFBFBD>{<7B>T<EFBFBD>&<26>\<5C>)<29>B<EFBFBD>.<2E><14> <0B> <0B>D<EFBFBD>!<21><15>
 <09>K<EFBFBD>K<EFBFBD><15><03>V<EFBFBD>S<EFBFBD><14><19><19><1B>%5<>6<>7<> <20><11>3<EFBFBD>K<EFBFBD>F<EFBFBD><14>S<EFBFBD><19> <0A>f<EFBFBD>d<EFBFBD>j<EFBFBD>j<EFBFBD><16>(<28>)<29> <0F><> <0A> <0C>s <00>D5<00>5D9c<04><><00>.p\4R,p\P!\V44V,V,pV# T#;i)uO
@获取目录打开历史
@mod_name string 模块名称
@key string 关键字
rC )r<>rorprqr@ s&& r'<00>get_dir_historyrF <00>sO<00><00> <10>F<EFBFBD> <1B> <1D> 8<> 8<>F<EFBFBD> <0A><15><1A><1A>H<EFBFBD>V<EFBFBD>,<2C>-<2D>h<EFBFBD>7<><03><<3C><06> <12>M<EFBFBD><4D> <0A> <0C> <11>M<EFBFBD>s <00>-A<00>A c<00><00>R#rNr%r%r&r'<00> get_run_piprH <00>s<00><00>r&c<04><><00>\R4'd2\P!\VP RR444R#\P!VP RR44R#)uG
@name 安装pip模块
@author cjxin
@param shell<string> 安装命令
r! <00>pipz[PIP]<5D>btpipN)r& rlrrH rr)r<>s&r'<00> install_piprL <00>sB<00><00> <0E>i<EFBFBD><18><18>
<EFBFBD> <09> <09>+<2B>e<EFBFBD>m<EFBFBD>m<EFBFBD>E<EFBFBD>7<EFBFBD>;<3B><<3C>=<3D>
<EFBFBD> <09> <09>%<25>-<2D>-<2D><05>w<EFBFBD>/<2F>0r&c<04>F<00>Rp\P!W4'dR#R#)u
@验证是否域名
zD^([\w\-\*]{1,100}\.){1,10}([\w\-]{1,24}|[\w\-]{1,24}\.[\w\-]{1,24})$TFr)r<><00>regs& r'<00> is_domainrO s<00><00> R<01>C<EFBFBD> <09>x<EFBFBD>x<EFBFBD><03><1C><1C>T<EFBFBD> r&c<04><><00>^RIp^RIpVPPR4'gVP!R4\ 4pRP V4pVPPV4'gR#VPP^RP V44\RP V44p\V4\RP T44# L;i)u8
初始化消息通道
@module 消息通道模块名称
Nz class/msgzclass/msg/{}_msg.pyFz {}/class/msgz{}_msgzmsg_main.{}_msg()) rlrrmrnr<>r<>rArryr<><00>eval)<06>modulerlr<00> panelPathr<68><00>msg_mains& r'r<>r<> s<><00><00>
<13> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> &<26> &<26><02> <0B> <0B>K<EFBFBD>(@<40><1E> <20>I<EFBFBD> !<21> (<28> (<28><16> 0<>E<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>%<25> <20> <20><15><07>H<EFBFBD>H<EFBFBD>O<EFBFBD>O<EFBFBD>A<EFBFBD>~<7E>,<2C>,<2C>Y<EFBFBD>7<>8<><19>(<28>/<2F>/<2F>&<26>1<>2<>H<EFBFBD> <0A><12>8<EFBFBD><1C> <10>#<23>*<2A>*<2A>6<EFBFBD>2<> 3<>3<><33> <0A> <0C>s <00> C%<00>%C)c<04><><00>\V4'd4VPR4pRPV^,V^,4pV#\V4'dVP RR4pV#)u*
@处理短信参数,否则会被拦截
r<EFBFBD>z {}.***.***.{}r)r<>r<>rArO rr)r<>rUs& r'<00> push_argvrV s[<00><00><0F>s<EFBFBD>|<7C>|<7C><12>y<EFBFBD>y<EFBFBD><13>~<7E><04><1D>$<24>$<24>T<EFBFBD>!<21>W<EFBFBD>d<EFBFBD>1<EFBFBD>g<EFBFBD>6<><03> <0F>J<EFBFBD> <15>S<EFBFBD>><3E>><3E><15>+<2B>+<2B>c<EFBFBD>3<EFBFBD>'<27>C<EFBFBD> <0E>Jr&c<04>n<00>VF.pW,p\V4\8XgK!\V4W&K0 V#)u0
@批量处理短信参数,否则会被拦截
)r<>r@rV )r~rSr6 s& r'r<>r<>-s3<00><00><14><03><12>i<EFBFBD><03> <0F><03>9<EFBFBD><03> <1B>!<21>#<23><0E>D<EFBFBD>I<EFBFBD><14> <10>Kr&c<00>,<00>\\44pV#rN)rV r<>r<>s r'<00>get_push_addressrY =s<00><00> <12>:<3A><<3C> <20>B<EFBFBD> <0A>Ir&c<04>b<00>^RIp\4pRVnWnVP RRV4pV#)uK
@name 获取ip地址所在地
@author cjxin
@param ips<list>
@return list
Nr<EFBFBD>r<>r<>r<>r<>s& r'r<>r<>Bs4<00><00><18> <13>:<3A>D<EFBFBD><1D>D<EFBFBD><14><12>H<EFBFBD>
<16>
!<21>
!<21>%<25><1D><04>
=<3D>C<EFBFBD> <0E>Jr&c<04><><00>.pVFpRVR&VPW1,4K! \V4pRV9dV#VF<>pW1,V9gKRWCV,,9dMWCV,,R,WCV,,R&WCV,,R,WCV,,R&WCV,,VR&K<> V#)<07>{
@name 格式化返回带IP归属地的数组
@param result<list> 数据数组
@param key<str> ip所在字段
@return list
rF<00>arear<61><00> en_short_coderZ<00>info_raw)r<>r<>)r<>rS<00>tmpsr~rfs&& r'<00> return_areara Rs<><00><00> <0E>D<EFBFBD><16><04><19><04>V<EFBFBD> <0C> <0C> <0B> <0B>D<EFBFBD>I<EFBFBD><1E><17> <17>t<EFBFBD>
<1C>C<EFBFBD><0F>3<EFBFBD><EFBFBD><15> <0A><16><04> <0F>9<EFBFBD><03> <1B><1E>#<23>3<EFBFBD>i<EFBFBD>.<2E>0<>-0<>c<EFBFBD><19>^<5E>F<EFBFBD>-C<><03><13>I<EFBFBD><0E>z<EFBFBD>*<2A>),<2C>#<23>Y<EFBFBD><1E><0F>)H<><03><13>I<EFBFBD><0E>v<EFBFBD>&<26><1E>C<EFBFBD>y<EFBFBD>><3E>D<EFBFBD><16>L<EFBFBD> <17> <12>Mr&c <04><><00>.pVFpRVR&VPW1,4K! \V4pRV9dV#VEF8pW1,P4pWT9gK"WCV,,R,P4'gXWCV,,R,P4'g.WCV,,R,P4'gRpMrRPWCV,,R ,WCV,,R,WCV,,R
,WCV,,R,4P4pWdW1,,R &WCV,,VR&EK; V#) r\ rFr] r<>r<><00> continent<6E>country<72>Intranetz {} {} {} {}<7D>carrier<65>provincerZ)r<><00>get_cloud_ip_info2rIrA)r<>rSr` r~rf<00> key_valuerZs&& r'<00> return_area11rj lsC<00><00> <0E>D<EFBFBD><16><04><19><04>V<EFBFBD> <0C> <0C> <0B> <0B>D<EFBFBD>I<EFBFBD><1E><17> <1D>T<EFBFBD>
"<22>C<EFBFBD><10>3<EFBFBD><EFBFBD><15> <0A><16><04><18>I<EFBFBD>O<EFBFBD>O<EFBFBD>%<25> <09> <14> <1B><16>C<EFBFBD>y<EFBFBD>><3E>&<26>)<29>/<2F>/<2F>1<>1<>#<23>3<EFBFBD>i<EFBFBD>.<2E><1B>:U<>:[<5B>:[<5B>:]<5D>:]<5D>fi<66>or<6F>js<6A>ft<66>u~<7E>f<66>gF<02>gF<02>gH<02>gH<02>!<21><04>$<24>+<2B>+<2B>C<EFBFBD>S<EFBFBD> <09>N<EFBFBD>9<EFBFBD>,E<>s<EFBFBD>PS<50>9<EFBFBD>~<7E>V_<56>G`<60>be<62>kn<6B>fo<66>bp<62>q{<7B>b|<7C>47<34>S<EFBFBD> <09>N<EFBFBD>6<EFBFBD>4J<34>L<01>LQ<4C>E<EFBFBD>G<EFBFBD><15>%)<29><04> <09>N<EFBFBD>6<EFBFBD> "<22><1E>C<EFBFBD>y<EFBFBD>><3E>D<EFBFBD><16>L<EFBFBD><17> <12>Mr&c<04><00>^RIp/pVFpp\V4p\WAPP4'gK5VP
R,pRVR&RVR&WRV&\ RPV44Kr V# T#;i)u&
@获取IP地址所在地
@param ips:
Nrd rFrf rc z222country--{})<08>geoip2<70>get_ip_locationr<6E><00>models<6C>City<74>rawr<77>rA)r<>rl rfr<><00> ip_area_dictrd s& r'rh rh <00>s<><00><00>
<12>
<0C>C<EFBFBD> <0A><15>B<EFBFBD>*<2A>2<EFBFBD>.<2E>L<EFBFBD><19>,<2C> <0A> <0A>(:<3A>(:<3A>;<3B>;<3B>&<26>*<2A>*<2A>9<EFBFBD>5<><07>%'<27><07> <09>"<22>')<29><07> <0B>$<24>!<21>B<EFBFBD><07><19>*<2A>1<>1<>'<27>:<3A>;<3B><16> <0F>J<EFBFBD><4A> <0A> <0C> <0E>J<EFBFBD>s<00>2B<00>?B<00>Bc<04><><00>^RIpVP!VPVP4pVPR4VP 4^,pVVP 4# XP 4i;i)u%
@name 获取本机ip
@return string
Nr<EFBFBD>r<>r<>s r'r<>r<><00>sX<00><00> <12><12> <12>M<EFBFBD>M<EFBFBD>&<26>.<2E>.<2E>&<26>*;<3B>*;<3B> <<3C><01> <09> <09> <09>/<2F>"<22> <0E>]<5D>]<5D>_<EFBFBD>Q<EFBFBD> <1F><02><11> <09><07><07> <09><><01><07><07> <09>s <00>AA'<00>'A9c<04><00>RP\44p\PP V4'd*\
P !\V44pVR,#\4# \4#;i)u
@获取服务器外网ip
r<EFBFBD>r<>) rAr<>rlrmrnrorprqr<>)r<>r<>s r'r<>r<><00>si<00><00>
(<28>.<2E>.<2E>~<7E>/?<3F>@<40>I<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20> <11><1A>j<EFBFBD>j<EFBFBD><18>)<29>!4<>5<>G<EFBFBD><1A>9<EFBFBD>%<25> %<25> <16><<3C><17><> <11> <10> <15><<3C><17>s <00>'A2<00>2A?c<04>|<00>/pWR&\4VR&\4VR&\4VR&\R4VR&RP VR,4RVR,,RP VR,VR,4R VR,,.pVP V4R
P V4pWBR &W2R &V#) u<>
@name 获取推送信息
@param title<str> 推送标题
@param slist<list> 推送追加的列表
slist = ['>发送内容:xxx']
@return dict
rr<>r<>r<>r
z#### {}z >ServerHost: z&>IP Address: {}(Internet) {}(Internal)z >Send Time: z
r<EFBFBD>r<>)r<>r<>r<>r.rAr<>r<>)r<00>slistr~<00>dlistr<74>s&& r'r<>r<><00>s<><00><00> <0E>D<EFBFBD><19><17>M<EFBFBD><1E><1F>D<EFBFBD><14>J<EFBFBD>%<25>'<27>D<EFBFBD><1A><14><1E>=<3D>D<EFBFBD><16>L<EFBFBD>(<28><17>1<>D<EFBFBD><1D><17> <12><18><18><14>g<EFBFBD><1D>'<27><17>$<24>}<7D>-<2D>-<2D>0<>7<>7<><04>T<EFBFBD>
<EFBFBD>D<EFBFBD><1A>DT<44>U<><16><14>f<EFBFBD><1C>%<25>  <06>E<EFBFBD> 
<EFBFBD>L<EFBFBD>L<EFBFBD><15><17>
<10>+<2B>+<2B>e<EFBFBD>
<1C>C<EFBFBD><15><15>K<EFBFBD><18><16>L<EFBFBD> <0F>Kr&c<04>6<00>RpVF,pRpW$,^8XdRpVRPWE4, pK. V'gRp\V4pV'dVPR4R,pRP\T4Y4p\ R T4R
# L-;i) uc
@name 写推送日志
@module string 模块名称
@msg string 消息内容
@res dict 推送结果
rFz+<span style="color:#20a53a;">Success</span>z$<span style="color:red;">Fail</span>u [ {}{} ] z [ Default ] Nru2Title[{}],method to informe:[{}]recipient:{}zAlarm notificationT)rAr<><00>get_version_infor<6F>r+)rR r<>rfr<>rSr<><00>msg_objr<s&&& r'<00>write_push_logrz <00>s<><00><00> <0E>D<EFBFBD><12><03>><3E><06> <0E>8<EFBFBD>q<EFBFBD>=<3D>#I<>&<26> <0C><0E>%<25>%<25>c<EFBFBD>2<>2<><04><13>
<10><0E><14> <0A><1A>6<EFBFBD>"<22><07> <12>W<EFBFBD>5<>5<>d<EFBFBD>;<3B>G<EFBFBD>D<>F<EFBFBD> ?<3F>
E<EFBFBD>
E<EFBFBD>f<EFBFBD>S<EFBFBD>k<EFBFBD>SY<EFBFBD>
`<60>C<EFBFBD> <0C> !<21>3<EFBFBD>'<27> <0F><>  <0A> <0C>s <00>+B<00>Bc<04><><00>\V4pV'g\RRPV44VPV4pV#)u^
@name 推送消息
@param module<str> 模块名称
@param msg<str> 消息内容
@return dict
FzModule {} does not exist!)r<>r<>rAr<>)rR r~ry rfs&& r'<00>push_msgr| s<<00><00><17>v<EFBFBD><1E>G<EFBFBD> <12><11>%<25>4<>;<3B>;<3B>F<EFBFBD>C<>D<>
<11>
<1B>
<1B>D<EFBFBD>
!<21>C<EFBFBD> <0E>Jr&c<04>D<00>\P!RV4'dR#R#)u)
@name 判断字符串是否包含中文
u [一-龥]TF)rr<>rs&r'<00> check_chineser~ s<00><00>
<EFBFBD>y<EFBFBD>y<EFBFBD>#<23>T<EFBFBD>*<2A>*<2A><13> r&c<04>^<00>\PP\4R,4#)u4
@name 是否开启SSL
@author hwliang
@return bool
z /data/ssl.pl)rlrmrnr<>r%r&r'<00>is_sslr<6C> s<00><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>.<2E>*<2A>^<5E>;<3B> <<3C><r&c<04>D<00>^RIHpVPPW4#)uq
@name 获取指定Cookie值
@author hwliang
@param key<str> Cookie键
@param default<str> 默认值
@return str
rr)r<>rsr rb)rSrrss&& r'<00>
get_cookier<EFBFBD> !s<00><00><1E> <12>?<3F>?<3F> <1E> <1E>s<EFBFBD> ,<2C>,r&c<04>2<00>\4'dRpV#RpV#)u<
@name 获取CSRF Cookie Key
@author hwliang
@return string
<EFBFBD> request_token<65>r<> <00><01> token_keys r'<00>get_csrf_cookie_token_keyr<79> -s%<00><00> <0E>x<EFBFBD>x<EFBFBD>#<23> <09> <15><14>$<24> <09> <14>r&c<04>,<00>\4p\V4#)u>
@name 获取CSRF Cookie Value
@author hwliang
@return string
)r<> r<> r<> s r'<00>get_csrf_cookie_token_valuer<65> :s<00><00> *<2A>+<2B>I<EFBFBD> <15>i<EFBFBD> <20> r&c<04>2<00>\4'dRpV#RpV#)u:
@name 获取CSRF HTML Key
@author hwliang
@return string
<EFBFBD>request_token_headr<64> r<> s r'<00>get_csrf_html_token_keyr<79> Ds%<00><00> <0E>x<EFBFBD>x<EFBFBD>(<28> <09> <15><14>)<29> <09> <14>r&c<04>,<00>\4p\V4#)u<
@name 获取CSRF HTML Value
@author hwliang
@return string
)r<> r<> r<> s r'<00>get_csrf_html_token_valuer<65> Qs<00><00> (<28>)<29>I<EFBFBD> <15>i<EFBFBD> <20> r&c<04>B<00>^RIHpVP\4R4#)uF
@name 从SESSION获取CSRF HTML value
@author hwliang
@return string
rrF)r<>rrbr<> rs r'r*r*[s<00><00> <1E> <12>;<3B>;<3B>.<2E>0<>"<22> 5<>5r&c<04>B<00>^RIHpVP\4R4#)uH
@name 从SESSION获取CSRF Cookie value
@author hwliang
@return string
rrF)r<>rrbr<> rs r'<00> get_csrf_sess_cookie_token_valuer<65> es<00><00> <1E> <12>;<3B>;<3B>0<>2<>B<EFBFBD> 7<>7r&c<04>r<00>.ROpVF,p\PPV4'gK*Vu# R#)uE
@name 获取系统包管理器命令
@author hwliang
@return string
rF)r<>r<>z /usr/bin/dnfr<66>)<02> install_bins<6E>bins r'<00>get_sys_install_binr<6E> os1<00><00> H<01>L<EFBFBD><1B><03> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>#<23> <1E> <1E><16>J<EFBFBD><1C> r&c
<04><><00>^RIpRRRRRRRRR R
/pVP4F<>p\PP V4'gK*W,pVR8wd/\ V4pV^,P 4'd^#^#VP!4F.pVP!V4pW&P49d^#K0 ^# R # K>;i) u^
@name 获取系统防火墙状态
@author hwliang
@return int 0.关闭 1.开启 -1.未安装
Nz/usr/sbin/firewalldr<64>z/usr/bin/firewalldz /usr/sbin/ufwz*/usr/sbin/ufw status|grep 'Status: active'z /sbin/ufwz'/sbin/ufw status |grep 'Status: active'z/usr/sbin/iptablesz*service iptables status|grep 'Chain INPUT'r^)
r<EFBFBD>r<>rlrmrnr<>rIr<>r<>r<>)r<><00>firewall_filesr<73><00>_cmdrfr<>r5s r'<00>get_firewall_statusr<73> |s<><00><00> <12>+<2B>U<EFBFBD>4H<34>%<25>%<25>'S<>!<21>#L<>*<2A>,X<>Z<01>N<EFBFBD><1C> <20> <20> "<22><01><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>a<EFBFBD> <20> <20>(<28><1D> <20><04> <0F>5<EFBFBD>=<3D><1B>D<EFBFBD>/<2F>C<EFBFBD><12>1<EFBFBD>v<EFBFBD>|<7C>|<7C>~<7E>~<7E><18><18><19>;<3B>;<3B>=<3D>C<EFBFBD> <15><1A>N<EFBFBD>N<EFBFBD>3<EFBFBD>'<27><01><14> <09> <09> <0B>#<23><1C>$<24>!<21><11>!#<23>" <0E>I<EFBFBD><49> <15><14>s <00>&C<04>Cc<04><><00>RP\44p\PP V4'gR#\ \ V44# R#;i)u6
@name 获取面板端口
@author hwliang
@return int
z{}/data/port.plr<6C>)rAr<>rlrmrnr<>rq)<01> port_files r'r6r6<00>sL<00><00> "<22>(<28>(<28><1E>)9<>:<3A>I<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24><13><14><12>8<EFBFBD>I<EFBFBD>&<26>'<27>'<27><><14><13>s <00>A<00>Ac<04>4<00>\4R 8wdR#\4pV'gR#VPR4R 8wdZ\RP V44\4R 8wd/RP \ 4\ 4R7p\V4R#VPR4R 8wgVPR4R 8wdX\R P V44\4R 8wd/R
P \ 4\ 4R7p\V4R#) u:
@name 安装系统防火墙
@author hwliang
@return bool
TFzapt-getz{} install -y ufwz<77>ufw allow 20/tcp
ufw allow 21/tcp
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow ${panelPort}/tcp
ufw allow ${sshPort}/tcp
ufw allow 39000:40000/tcp
ufw_status=`ufw status`
echo y|ufw enable
ufw default deny
ufw reload
)<02> panelPort<72>sshPort<72>yum<75>dnfz{} install -y firewalldasystemctl enable firewalld
systemctl start firewalld
firewall-cmd --set-default-zone=public > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=20/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=21/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=22/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=80/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=443/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port={panelPort}/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port={sshPort}/tcp > /dev/null 2>&1
firewall-cmd --permanent --zone=public --add-port=39000-40000/tcp > /dev/null 2>&1
firewall-cmd --reload
r^)r<> r<> r_r<>rAr6r?)<02> install_binr<6E> s r'<00>install_sys_firewallr<6C> <00>s<><00><00> <1B><1C><02>"<22>4<EFBFBD>%<25>'<27>K<EFBFBD> <16>u<EFBFBD><12><17><17> <09>"<22>b<EFBFBD>(<28><11>%<25>,<2C>,<2C>[<5B>9<>:<3A> <1E> <20>B<EFBFBD> &<26> <04> <0B>F<EFBFBD>^<5E>%<25>|<7C>~<7E>F<EFBFBD>><3E> <11> <16>d<EFBFBD>O<EFBFBD>& <11>%
<15> <19> <19>%<25> <20>B<EFBFBD> &<26>+<2B>*:<3A>*:<3A>5<EFBFBD>*A<>R<EFBFBD>*G<><11>+<2B>2<>2<>;<3B>?<3F>@<40> <1E> <20>B<EFBFBD> &<26> <04> <0B>F<EFBFBD>^<5E>%<25>|<7C>~<7E>F<EFBFBD>><3E> <11> <16>d<EFBFBD>O<EFBFBD> r&c<04>b<00>\4pRVnWn^RIpVP RRV4pV#)uW
@name 检测防火墙是否已经添加规则
@author cjxin
@param port int 端口号
r<EFBFBD>N<>firewall<6C>check_firewall_rule)r<>r<>r<>r]r<>)r<>r<>r]rfs& r'r<> r<> <00>s5<00><00> <14>:<3A>D<EFBFBD><1D>D<EFBFBD><14><14>I<EFBFBD><17>
<16>
!<21>
!<21>*<2A>.C<>T<EFBFBD>
J<EFBFBD>C<EFBFBD> <0E>Jr&c<04><><00>\4pRVnWnWnW%nW5nWEnV'g\V4Vn^RIpVPRRV4pV#)u<>
@name 添加防火墙规则
@author cjxin
@param port int 端口号
@param protocol string 协议类型 tcp udp
@param types string 添加类型 accept reject
@param address string 地址
@param brief string 描述
r<EFBFBD>Nr<4E> <00> create_rules)
r<EFBFBD>r<>r<>rXr<>r<><00>briefr@r]r<>)r<>rXr<>r<>r<> r<>r]rfs&&&&& r'<00>add_firewall_ruler<65> <00>sU<00><00> <14>:<3A>D<EFBFBD><1D>D<EFBFBD><14><14>I<EFBFBD><1C>M<EFBFBD><16>J<EFBFBD><1A>L<EFBFBD><16>J<EFBFBD> <10>s<EFBFBD>4<EFBFBD>y<EFBFBD>$<24>*<2A><17>
<16>
!<21>
!<21>*<2A>n<EFBFBD>d<EFBFBD>
C<EFBFBD>C<EFBFBD> <0E>Jr&c<04><><00>\4pRVnWnWnW$nW4n^RIpVPRRV4pV#)u<>
@name 删除防火墙规则
@author cjxin
@param port int 端口号
@param protocol str 协议
@param types str 类型
@param address str 地址
r<EFBFBD>Nr<4E> <00> remove_rules)r<>r<>r<>rXr<>r<>r]r<>)r<>rXr<>r<>r<>r]rfs&&&& r'<00>del_firewall_ruler<65> sC<00><00> <14>:<3A>D<EFBFBD><1D>D<EFBFBD><14><14>I<EFBFBD><1C>M<EFBFBD><16>J<EFBFBD><1A>L<EFBFBD><17>
<16>
!<21>
!<21>*<2A>n<EFBFBD>d<EFBFBD>
C<EFBFBD>C<EFBFBD> <0E>Jr&c<04><><00>Rp\\R4'd\P!4pRR.pVPV9# T'dTR,T9u#R#;i)u7
@name 是否是arm架构
@author hwliang
@return bool
Nrj<00>aarch64<36>aarchFr^)r<>rlrjrk)rj<00>
aarch_lists r'<00>is_aarchr<68> s_<00><00> <11>E<EFBFBD><0E>r<EFBFBD>7<EFBFBD><1B><1B>R<EFBFBD>X<EFBFBD>X<EFBFBD>Z<EFBFBD>U<EFBFBD><1B>W<EFBFBD>%<25>J<EFBFBD>+<2B><14>}<7D>}<7D>
<EFBFBD>*<2A>*<2A><>+<2B> <10><18><12>9<EFBFBD>
<EFBFBD>*<2A> *<2A> <11> <10>s <00>A<00>Ac<04>$<00>\V\4'dV.p\V\4'gR#\P!4F=p\P
!V4pVP 4pVF pWC9gK R# K? R# KH;i)uh
@name 根据命令行参数查找进程是否存在
@author hwliang
@param _cmd 命令行
@return bool
FT)r<>r@r<>r<>r<>r<>r<>)r<> r<>r5<00>cmd_line<6E>_cs& r'<00>is_process_exists_by_cmdliner<65> )sw<00><00><12>$<24><03><1C><1C><14>v<EFBFBD><04> <15>d<EFBFBD>D<EFBFBD> !<21> !<21><14><15>{<7B>{<7B>}<7D><03> <15><16><0E><0E>s<EFBFBD>#<23>A<EFBFBD><18>y<EFBFBD>y<EFBFBD>{<7B>H<EFBFBD><1A><02><15>><3E><1F><1B> <1D> <11><> <15> <14><><00> .B
<02>>B
<02>B
<02>
Bc<04><00>\V\4'dV.p\V\4'gR#\P!4F7pVP 4pVFpVP V4R8wgKR# K9 R# KB;i)uk
@name 根据执行文件路径查找进程是否存在
@author hwliang
@param _exe 命令行
@return bool
FTr^)r<>r@r<>r<><00> process_iterr<72>r_)<04>_exe<78>process<73>_exe_bin<69>_es& r'<00>is_process_exists_by_exer<65> @sw<00><00><12>$<24><03><1C><1C><14>v<EFBFBD><04> <15>d<EFBFBD>D<EFBFBD> !<21> !<21><14><19>&<26>&<26>(<28><07> <15><1E>{<7B>{<7B>}<7D>H<EFBFBD><1A><02><1B>=<3D>=<3D><12>$<24><02>*<2A>4<EFBFBD><1B>)<29> <11><> <15> <14>s<00> (B<02>8B<02><B<02>B c<04>$<00>\V\4'dV.p\V\4'gR#\P!4F=p\P
!V4pVP 4pVF pW48XgK R# K? R# KH;i)uc
@name 根据进程名查找进程是否存在
@author hwliang
@param _name 命令行
@return bool
FT)r<>r@r<>r<>r<>r<>r)<05>_namer<65>r5r<00>_ns& r'<00>is_process_exists_by_namer<65> Vsv<00><00><12>%<25><13><1D><1D><16><07><05> <15>e<EFBFBD>T<EFBFBD> "<22> "<22><14><15>{<7B>{<7B>}<7D><03> <15><16><0E><0E>s<EFBFBD>#<23>A<EFBFBD><14>6<EFBFBD>6<EFBFBD>8<EFBFBD>D<EFBFBD><1B><02><17>:<3A>d<EFBFBD><1C> <1D> <11><> <15> <14>r<EFBFBD> c<04> <00>.ROp\V4#)uB
@name 检查mysql进程是否存在
@author hwliang
@return bool
)zserver/mysql/bin/mysqld_safezserver/mysql/bin/mariadbdzserver/mysql/bin/mysqld<6C>r<> <00>r<> s r'<00>is_mysql_process_existsr<73> ls<00><00> d<01>D<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04><00>R.p\V4#)uB
@name 检查redis进程是否存在
@author hwliang
@return bool
zserver/redis/src/redis-serverr<72> r<> s r'<00>is_redis_process_existsr<73> vs<00><00> ,<2C> ,<2C>D<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04><00>R.p\V4#)uF
@name 检查pure-ftpd进程是否存在
@author hwliang
@return bool
zserver/pure-ftpd/sbin/pure-ftpdr<64> r<> s r'<00>is_pure_ftpd_process_existsr<73> <00>s<00><00> .<2E> .<2E>D<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04>l<00>VPR4R,pRPV4.p\V4#)uD
@name 检查php-fpm进程是否存在
@author hwliang
@return bool
rzserver/php/{}/sbin/php-fpmr^)r<>rAr<> )r<00> _php_versionr<6E> s& r'<00>is_php_fpm_process_existsr<73> <00>s4<00><00> <18>:<3A>:<3A>c<EFBFBD>?<3F>2<EFBFBD>&<26>L<EFBFBD> (<28> /<2F> /<2F> <0C> =<3D> ><3E>D<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04>J<00>RpVFp\V4pV'gKVu# R#)uB
@name 检查nginx进程是否存在
@author hwliang
@return bool
F)zserver/nginx/sbin/nginxzserver/nginx/nginx/sbin/nginxr<78> )r<> r<>r<>s r'<00>is_nginx_process_existsr<73> <00>s,<00><00> H<01>D<EFBFBD> <11><01>)<29>!<21>,<2C><06> <11>6<EFBFBD>&<26>=<3D><12> r&c<04>J<00>^RIpR.pVP!^4\V4#)uB
@name 检查httpd进程是否存在
@author hwliang
@return bool
Nzserver/apache/bin/httpd<70>r<>r<>r<> <00>r<>r<> s r'<00>is_httpd_process_existsr<73> <00>s%<00><00> <10> %<25> &<26>D<EFBFBD><08>J<EFBFBD>J<EFBFBD>q<EFBFBD>M<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04>J<00>^RIpR.pVP!^4\V4#)uF
@name 检查memcached进程是否存在
@author hwliang
@return bool
Nz"/usr/local/memcached/bin/memcachedr<64> r<> s r'<00>is_memcached_process_existsr<73> <00>s%<00><00> <10> 0<> 1<>D<EFBFBD><08>J<EFBFBD>J<EFBFBD>q<EFBFBD>M<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04><00>R.p\V4#)uD
@name 检查mongodb进程是否存在
@author hwliang
@return bool
zserver/mongodb/bin/mongodr<64> r<> s r'<00>is_mongodb_process_existsr<73> <00>s<00><00> (<28> (<28>D<EFBFBD> #<23>D<EFBFBD> )<29>)r&c<04>J<00>RRRR/p\4'd\4pYR&YR&T#^RIpVPR/^/R7pVP^<5E>8XdVP
VR&VPR/^/R7pVP^<5E>8XdVP
VR&V# RpL<>;i) uW
@name 检测api和www的服务器ip是否一致
@auther cjxin 2022-09-13
@return bool
r<EFBFBD>rF<00>apir<69>Nz-https://wafapi2.yakpanel.com/api/getIpAddressr}z,https://wafapi.yakpanel.com/api/getIpAddress)rDr<>rarrcrd)r<>r<>rarf<00>res1s r'<00> check_auth_ipr<70> <00>s<><00><00> <14>R<EFBFBD><15><02> #<23>F<EFBFBD><15><17><17> <1D><1B><1C>B<EFBFBD><1B>u<EFBFBD> <0A><1A>u<EFBFBD> <0A><15> <0A><18>
<17>
<1C>
<1C>L<>SU<53>_`<60>jl<6A>
<1C>
m<EFBFBD>C<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>#<23><1D><1B><08><08><06>u<EFBFBD> <0A> <18> <1D> <1D>L<>SU<53>_`<60>jl<6A> <1D> m<>D<EFBFBD> <0B><17><17>3<EFBFBD><1E><1C> <09> <09><06>u<EFBFBD> <0A> <11>M<EFBFBD><4D> <1D><1C>B<EFBFBD>s <00>
B<00>B"c<04><><00>Rp/p\P!\V44pY9g/Y0&^Y0,R&^Y0,R&\\P!44Y0,R&T^8<>d YT,R&MY0,R;;,^, uu&\ T\P !T44R# L<>;i)u8
设置指定key的操作时间
@key 面板访问函数
<EFBFBD>data/func.jsonr<6E>rN)rorprqr<>r<>rsr)rSrrmr~s&& r'<00>set_funcr<63> <00>s<><00><00>
<1C>D<EFBFBD> <0A>D<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>4<EFBFBD>.<2E>)<29><04> <0F>;<3B><16><04> <09><1D><04> <09>&<26><19><1E><04> <09>'<27><1A><1B>D<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD>(<28>D<EFBFBD>I<EFBFBD>f<EFBFBD><15> <0C>q<EFBFBD>y<EFBFBD>"<22>S<EFBFBD> <09>'<27><1A> <0C> <09>'<27><1A>a<EFBFBD><1F><1A> <0A>d<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>$<24>%<25><> <0A> <0C>s <00>B<<00><Cc<04><><00>Rp/p^VR&^VR&\PPV4'gV#/p\P!\ V44pY9gT#Y0,# L;i)u5
获取指定功能的操作时间
@key 面板函数
r<EFBFBD> rr<>)rlrmrnrorprq)rSrmr r~s& r'<00>get_funcr<63> <00>sp<00><00>
<1C>D<EFBFBD>
<0C>C<EFBFBD><14>C<EFBFBD><07>L<EFBFBD><13>C<EFBFBD><06>K<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><03><1A> <0A>D<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>4<EFBFBD>.<2E>)<29><04> <0F>;<3B>s<EFBFBD>
<EFBFBD> <0F>9<EFBFBD><14><> <0A> <0C>s <00>A(<00>(A,c<04>B<00>/pRP\44p\P!\ V44pY9g/Y &\ \ P !44Y ,R&YT,R&\T\P!T44R# Lb;i)u8
设置指定key的操作时间
@key 缓存的key函数
<EFBFBD>{}/data/cache_func.jsonr<6E>r~N) rAr<>rorprqr<>r<>rsr)rSrZr~rms&& r'<00>set_cache_funcr<63>
s<><00><00>
<0E>D<EFBFBD> $<24> +<2B> +<2B>N<EFBFBD>,<<3C> =<3D>D<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>4<EFBFBD>.<2E>)<29><04> <0F>;<3B>B<EFBFBD><04> <09><1B>D<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD>(<28>D<EFBFBD>I<EFBFBD>f<EFBFBD><15><1C><13>I<EFBFBD>f<EFBFBD><15> <0A>d<EFBFBD>D<EFBFBD>J<EFBFBD>J<EFBFBD>t<EFBFBD>$<24>%<25><> <0A> <0C>s <00>B<00>Bc<04> <00>/p/pRVR&^VR&RP\44p\PP V4'gV#\
P !\V44pY9gT#Y ,# L;i)u;
获取指定功能的操作时间
@key 缓存的key函数
rFr~r<>r<> )rAr<>rlrmrnrorprq)rSr r~rms& r'<00>get_cache_funcr<63> s<00><00> <0A>C<EFBFBD> <0A>D<EFBFBD><14>C<EFBFBD><06>K<EFBFBD><13>C<EFBFBD><06>K<EFBFBD> $<24> +<2B> +<2B>N<EFBFBD>,<<3C> =<3D>D<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><12>
<EFBFBD> <0A><13>z<EFBFBD>z<EFBFBD>(<28>4<EFBFBD>.<2E>)<29><04> <0F>;<3B>s<EFBFBD>
<EFBFBD> <0F>9<EFBFBD><14><> <0A> <0C>s <00>A?<00>?Bc<04><><00>/pRP\44p\PP V4'd!\
P !\V44pW9dW0V'dV'gR#RV9dRV9gR#W#V&\V\
P!V44\\R44p\R4PRV34P4p^RIp\4pV'g<>\!R 4R
,V,p R P\"P$4p
\W<>4\R4P'R R RRRRV\(P*!R\(P,!44^RRRRV
R34VnVP4P1V4R#\34p \PP V 4'd{\V 4p V PV4R8XdZ\R4PRV34P5R^4VR,VnVP4P1V4R# EL ;i R#;i)u<>
@name 添加日志切割
@path 日志路径,
@data dict
{
'type':'day/size'
'limit': 180,保留份数
'size': 日志超过多少进行切割,type=size时生效
'callback': 回调命令,部分日志切割后需要重启服务
}
z{}/data/cutting_log.jsonFr<46>rE<00>set_split_logs<67>crontabzecho=?NrGz/cron/z*{} -u /www/server/panel/script/logSplit.pyzgname,type,where1,where_hour,where_minute,echo,addtime,status,save,backupTo,sType,sName,sBody,urladdressu[删除]切割日志文件zminute-n<>10r<30>rrFr&<00>toShellr<6C>r!Tr^)rAr<>rlrmrnrorprqrsrr<>r8r^r_r<> r<>r.r<00>
executabler!r<>rrr!<00>set_cron_statusr<73>r<>) rmr<>rZr~r<><00>echor_r<> <00>args_obj<62>cronPathr<68><00> cron_path<74>cron_ss &&& r'r<> r<> 3s
<00><00> <0E>D<EFBFBD> &<26> -<2D> -<2D>n<EFBFBD>.><3E> ?<3F>E<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>e<EFBFBD><1C><1C> <11><17>:<3A>:<3A>h<EFBFBD>u<EFBFBD>o<EFBFBD>.<2E>D<EFBFBD> <0C>|<7C> <10>J<EFBFBD> <0A><13><18><15><14>~<7E>W<EFBFBD><04>_<EFBFBD><18><19>T<EFBFBD>
<EFBFBD> <0A>e<EFBFBD>T<EFBFBD>Z<EFBFBD>Z<EFBFBD><04>%<25>&<26> <0F>s<EFBFBD>#<23>$<24> %<25>D<EFBFBD> <0C>Y<EFBFBD><<3C> <1D> <1D>h<EFBFBD><14><07> 0<> 5<> 5<> 7<>D<EFBFBD> <0A><16><1B>:<3A><08><13>%<25>l<EFBFBD>3<>h<EFBFBD>><3E><14>E<>H<EFBFBD>@<40>G<>G<><03><0E><0E>W<>E<EFBFBD> <15>h<EFBFBD> &<26><1B>I<EFBFBD>,<2C>*<2A>*<2A>y<>-<2D>z<EFBFBD>4<EFBFBD><13>c<EFBFBD>4<EFBFBD>QU<51>Q^<5E>Q^<5E>_l<5F>nr<6E>n|<7C>n|<7C>n~<7E>Q<51>BC<02>EG<02><1C>i<EFBFBD><12>U<EFBFBD>B<EFBFBD>8<>9<>H<EFBFBD>K<EFBFBD> <14>O<EFBFBD>O<EFBFBD> <1D> -<2D> -<2D>h<EFBFBD> 7<><14>&<26><0F>I<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD>(<28>(<28>!<21>)<29>,<2C><06><19>;<3B>;<3B>t<EFBFBD>$<24><02>*<2A><15>i<EFBFBD>L<EFBFBD>&<26>&<26>x<EFBFBD>$<24><17>9<>B<>B<>8<EFBFBD>Q<EFBFBD>O<>"&<26>t<EFBFBD>*<2A>H<EFBFBD>K<EFBFBD><1B>O<EFBFBD>O<EFBFBD>%<25>5<>5<>h<EFBFBD>?<3F><13><>Q <11> <10><>P <0A> <0C> <10>s <00>I)<00>.CI1<00>>B)I1<00>)I.<03>1I6c<04> <00>RpRP\44p\PP V4'gV#\ V4pV'gV#VP 4pVR9dV#VR,R8XdVRRpV#)u6
@name 取安全入口
@author hwliang
@return string
rhz{}/data/admin_path.plr{N)rFr{r^r<>)<03>
login_pathrmrBs r'r<>r<>ts}<00><00> <1A>J<EFBFBD> "<22> )<29> )<29>.<2E>*:<3A> ;<3B>D<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F>
<EFBFBD>!2<><19>$<24><1E>J<EFBFBD> <15>j<EFBFBD>(<28><1B>!<21>!<21>#<23>J<EFBFBD><11>Y<EFBFBD><1E><19><19><11>"<22>~<7E><13><1C>:<3A>c<EFBFBD>r<EFBFBD>?<3F>j<EFBFBD> <15>r&c<04><><00>RP\44pRP\44p\PP V4'gR#\PP V4#)uI
@name 获取用户体验改进计划状态
@author hwliang
@return bool
z{}/data/improvement.plz{}/data/is_set_improvement.plTr0)rp<00> tip_file_sets r'<00>get_improvementr<74> <00>sS<00><00> (<28>.<2E>.<2E>~<7E>/?<3F>@<40>H<EFBFBD>2<>9<>9<>.<2E>:J<>K<>L<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27><13> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23>#r&c<04><><00>^RIHp^RIpVP4pVP VP
P R4VP4'*#)u*
@name 判断是否为爬虫
@return bool
rrNrx)rrs<00> panelDefense<73>bot_safe<66>spiderr\rbr<>)rsr<> r5s r'<00> is_spiderr<72> <00>sA<00><00>
!<21><17><14><1D><1D><1F>A<EFBFBD><10>x<EFBFBD>x<EFBFBD><07><0F><0F>+<2B>+<2B>L<EFBFBD>9<>7<EFBFBD>;N<>;N<>O<> O<>Or&c<04>~<00>^RIHpRpVPV4pV'g\4VPV4pV#)u9
@name 获取RSA公钥内容
@author hwliang
@return str
r<00>rsa_public_key<65>rrrb<00>create_rsa_key)r<00>pub_key<65>
public_keys r'<00>get_rsa_public_keyr
<00>s7<00><00> !<21><1E>G<EFBFBD><18><1B><1B>W<EFBFBD>%<25>J<EFBFBD> <15><16><18><1C>[<5B>[<5B><17>)<29>
<EFBFBD> <15>r&c<04>~<00>^RIHpRpVPV4pV'g\4VPV4pV#)u9
@name 获取RSA私钥内容
@author hwliang
@return str
r<00>rsa_private_keyr<79> )r<00>prv_key<65> private_keys r'<00>get_rsa_private_keyr
<00>s7<00><00> !<21><1F>G<EFBFBD><19>+<2B>+<2B>g<EFBFBD>&<26>K<EFBFBD> <16><16><18><1D>k<EFBFBD>k<EFBFBD>'<27>*<2A> <0B> <16>r&c<04>`<00>^RIHpRpRpW9d W 9dR#^RIHpVP R4pVP R4pVP 4P R4pTP#R4P%RR4Y&TP#R4Y&R# RP\44p\PPT4'g#\P!R 4\TR
4R pR p \R PT44\RPY<>44\PPT4'd&\PPT 4'gR#\TR4p\T R4p\PPT4'd\P !T4\PPT 4'd\P !T 4EL<>;i \'\)44R#;i)u4
@name 创建RSA密钥
@author hwliang
@return bool
rr<> r
T<><01>RSAr[<00>PEMz"{}/data/pycryptodome_re_install.plz2nohup btpip install pycryptodome -I &> /dev/null &<26>Truez/tmp/private.pemz/tmp/public.pemzopenssl genrsa -out {} 1024z"openssl rsa -pubout -in {} -out {}Fr<46>r*rrF)rr<00>Crypto.PublicKeyr
<00>generate<74> exportKey<65> publickeyrAr<>rlrmrnrrsr<>rqrr rrr<>r<>)
rr
r
r
rSr
r
<00> is_re_install<6C>priv_pem<65>pub_pems
r'r<> r<> <00>s<><00><00> )<15> %<25>"<22><07>#<23><07> <12> <1D>'<27>"4<><17> ;<3B> ,<2C><15>,<2C>,<2C>t<EFBFBD>$<24>C<EFBFBD><1D>-<2D>-<2D><05>.<2E>K<EFBFBD><1C><1D><1D><1F>2<>2<>5<EFBFBD>9<>J<EFBFBD>(&<26>,<2C>,<2C>W<EFBFBD>5<>=<3D>=<3D>d<EFBFBD>B<EFBFBD>G<><07><18>&<26>-<2D>-<2D>g<EFBFBD>6<><07><18><14><>1 ;<3B>@<40>G<>G<><0E>HX<48>Y<>M<EFBFBD><15>7<EFBFBD>7<EFBFBD>><3E>><3E>-<2D>0<>0<><12> <09> <09>N<>O<><19>-<2D><16>0<>)<29>H<EFBFBD>'<27>G<EFBFBD> <15>3<>:<3A>:<3A>8<EFBFBD>D<> E<> <15>:<3A>A<>A<>(<28>T<> U<><15>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28>+<2B>+<2B>2<EFBFBD>7<EFBFBD>7<EFBFBD>><3E>><3E>'<27>3J<33>3J<33><1C>"<22>8<EFBFBD>T<EFBFBD>2<>K<EFBFBD>!<21>'<27>4<EFBFBD>0<>J<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD>'<27>'<27><12><19><19>8<EFBFBD>)<<3C><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>g<EFBFBD>&<26>&<26><02> <09> <09>'<27>(:<3A><><15><11>.<2E>"<22>#<23><14>s7<00>H<00>AB<00>"6H<00>C#H<03>>H<00>A7H<03>9H<03>H<00>H-c<04><><00>^up^RIHp^RIHp\ 4pVP VP V44pVPR4p.p\^\V4V4FSpWWq,pVPV4p \P!V 4P4p
VPV
4KU RPV4# \!\#44R#;i)uF
@name RSA加密数据
@param data str 要加密的数据
@return str
r
<00><01>
PKCS1_v1_5r*rrF)r
r
<00> Crypto.Cipherr
r
r<><00> importKeyr<79>r<>r<>r<>r<>r<>r r<>r<>r<>r<>) r~<00> split_lengthr
<00> Cipher_pkcsr
<00> cipher_public<69> encrypted_arrr<72>r<><00>encrypted_data<74>encrypted_base64s & r'<00> rsa_encryptr
s<><00><00><17>L<EFBFBD><12>(<28>;<3B>(<28>)<29>
<EFBFBD>#<23><0F><0F><03> <0A> <0A>j<EFBFBD>(A<>B<> <0A><14>{<7B>{<7B>7<EFBFBD>#<23><04><1A> <0A><16>q<EFBFBD>#<23>d<EFBFBD>)<29>\<5C>2<>A<EFBFBD><14>q<EFBFBD>'<27>(<28>A<EFBFBD>*<2A>2<>2<>1<EFBFBD>5<>N<EFBFBD>%<25>/<2F>/<2F><0E>?<3F>F<>F<>H<> <1C> <19> <20> <20>!1<> 2<> 3<><14>y<EFBFBD>y<EFBFBD><1D>'<27>'<27><><12><11>.<2E>"<22>#<23><11><> <00>CC <00> C#c<04><><00>^RIHp^RIHp\ 4pVP VP V44pRpVPR4FGpV'gK \P!V4pV'gK-VPVR4pWX, pKI VPR4# \\44R#;i)uF
@name RSA解密数据
@param data str 要解密的数据
@return str
r
r
r&rNr*rF)r
r
r
r
r
r<>r
r<>r<>r<>rr r<>r<>) r~r
r
r
<00>cipher_private<74> decrypted_strr<72>rf<00>decrypted_datas & r'<00> rsa_decryptr%
$s<><00><00> <12>(<28>;<3B>*<2A>+<2B> <0B>$<24><1F><1F><13><1D><1D>{<7B>)C<>D<><0E><1C> <0A><15><1A><1A>D<EFBFBD>!<21>A<EFBFBD><14>h<EFBFBD><18>"<22>"<22>1<EFBFBD>%<25>C<EFBFBD><16><08>+<2B>3<>3<>C<EFBFBD><14>><3E>N<EFBFBD> <19> +<2B>M<EFBFBD> "<22> <1D>#<23>#<23>G<EFBFBD>,<2C>,<2C><><12><11>.<2E>"<22>#<23><11>s<00>A3B'<00>60B'<00>'B?c<04><><00>^up^RIHp^RIHp\ 4pVP VP V44pVPR4p.p\^\V4V4FSpWWq,pVPV4p \P!V 4P4p
VPV
4KU RPV4# \!\#44R#;i)u\
@name RSA私钥加密数据
@author hwliang
@param data str 要加密的数据
@return str
r
r
r*rrF)r
r
r
r
r
r<>r
r<>r<>r<>r<>r<>r<>r r<>r<>r<>r<>) r~r
r
r
r
r"
r
r<>r<>r
r
s & r'<00>rsa_encrypt_for_private_keyr'
@s<><00><00><17>L<EFBFBD><12>(<28>;<3B>*<2A>+<2B> <0B>$<24><1F><1F><13><1D><1D>{<7B>)C<>D<><0E><14>{<7B>{<7B>7<EFBFBD>#<23><04><1A> <0A><16>q<EFBFBD>#<23>d<EFBFBD>)<29>\<5C>2<>A<EFBFBD><14>q<EFBFBD>'<27>(<28>A<EFBFBD>+<2B>3<>3<>A<EFBFBD>6<>N<EFBFBD>%<25>/<2F>/<2F><0E>?<3F>F<>F<>H<> <1C> <19> <20> <20>!1<> 2<> 3<><14>y<EFBFBD>y<EFBFBD><1D>'<27>'<27><><12><11>.<2E>"<22>#<23><11>r
c<04><><00>^RIHpHpVPR4pV'd\ VP
4pV#\ R4pV#)u7
@name 获取客户端HASH
@author hwliang
@return str
rp<00> tmp_loginrF)r<>rrsrbr<>r<>)rrs<00> is_tmp_login<69> client_hashs r'<00>get_client_hashr,
asB<00><00> '<27><1A>;<3B>;<3B>{<7B>+<2B>L<EFBFBD><13><19>'<27>-<2D>-<2D>.<2E> <0B>D <17><16><1A>"<22>g<EFBFBD> <0B> <16>r&c<04>"<00>RP\44p\PP V4'dR#^RIHpHpVPR8XdR#Rp\4pW19gWAV&R#W,V8wd\RR4R#R#) u8
@name 验证客户端HASH
@author hwliang
@return bool
z{}/data/not_check_ip.plTrp<00>httpsr+
z
User loginz<Client HASH verification failed, has been forced to log out!F) rAr<>rlrmrnrrrs<00>schemer,
r+)<05>not_tiprrsr<>r+
s r'<00>check_client_hashr1
<00>st<00><00>(<28>.<2E>.<2E>~<7E>/?<3F>@<40>G<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>g<EFBFBD><1E><1E>t<EFBFBD>)<29><0E>~<7E>~<7E><17> <20><14> <18>D<EFBFBD>!<21>#<23>K<EFBFBD> <0F>?<3F>#<23><04> <0A><13><0E>}<7D> <0B>#<23><10><1C>]<5D>^<5E><14> r&c<04><00>V'gR#\V\4'dVPR4p\V\4'gV#^RIpVP V4# ^RIpTP T4u# Tuu#;i;i)uQ
@name shell转义
@author hwliang
@param cmd str 要转义的命令
@return str
rFr*N)r<>r<>r r@<00>shlexr<78><00>pipes)r<>r3
r4
s& r'<00> shell_quoter5
<00>st<00><00> <0F>r<EFBFBD><11>#<23>u<EFBFBD><1D><1D>S<EFBFBD>Z<EFBFBD>Z<EFBFBD><07>%8<>s<EFBFBD> <15>c<EFBFBD>3<EFBFBD> <1F> <1F><03><1A><17><14><14>{<7B>{<7B>3<EFBFBD><1F><1F><><17> <17> <18><18>;<3B>;<3B>s<EFBFBD>#<23> #<23><> <17><16>J<EFBFBD>s*<00> A <00> B<03>#A:<02>7B<03>:B<05>>B<03>Bc<00>F<00>\R4pVPRR4P4'gRpVPV4VP R4PRR4P R4pV'g%VP R4P RV/4TpV#)rr<00>div_listz\CREATE TABLE IF NOT EXISTS `div_list` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`div` TEXT
)zid=1<>div)r6r7
z%div%r%)r8r^rr r6r<>r)r8
r7<00>sql_str<74>my_divs& r'<00>get_divr;
<00>s<><00><00>
<0B>O<EFBFBD>
<1C>C<EFBFBD> <0E>9<EFBFBD>9<EFBFBD>7<>9W<39> X<> ^<5E> ^<5E> `<60> `<60><05><07> <0C> <0B> <0B>G<EFBFBD><1C> <10>Y<EFBFBD>Y<EFBFBD>z<EFBFBD> "<22> (<28> (<28><16><12> 4<> =<3D> =<3D>e<EFBFBD> D<>F<EFBFBD> <11> <0B> <09> <09>*<2A><1D>$<24>$<24>e<EFBFBD>S<EFBFBD>\<5C>2<><14><06> <11>Mr&c <04>r<00>RP\44p\PP V4'g\P
!VR4RPV\ \\P!4444p\V\P!V44\RV4#)uJ
@name 设置运行时间
@param data dict 数据
@param data.type int 类型 1:面板 2插件
@param data.time int 执行时间(必传)
@param data.name str 插件名称、模块名称(必传)
@param data.title str 插件中文名(必传)
@param data.fun str 执行方法(必传)
@param data.args dict 参数
z {}/data/tasksr<73>r.T) rAr<>rlrmrnr<>r<>r@r<>rsrorr<>)r~<00>spath<74> task_files& r'<00> set_tasks_runr?
<00>sw<00><00> <1C> "<22> "<22>><3E>#3<> 4<>E<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>%<25> <20> <20>"<22>+<2B>+<2B>e<EFBFBD>S<EFBFBD>"9<><17><0E><0E>u<EFBFBD>c<EFBFBD>#<23>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>*:<3A>&;<3B><<3C>I<EFBFBD> <0A>i<EFBFBD><14><1A><1A>D<EFBFBD>)<29>*<2A> <14>T<EFBFBD>9<EFBFBD> %<25>%r&c<04>L<00>\4'd+\4pRRRRRRRRRRRRR RR
RR RR RR RRRRTR^/.#\P!\ R44p\ RV4Rp.pV'd \ W44p\WV4pWV,pV'dV#R# RpL<>;i)uV
获取bt官网ip归属地列表
@author wzz <wzz@yakpanel.com>
@return: list[dict{}]
r<EFBFBD>rc rFrd rg r<><00>regionrf <00>division<6F>
en_countryr^ <00> longitude<64>latituderZ<00>#本服务器公网IP归属地信息r<E681AF><00>levelzconfig/hosts_dict.jsonz host_list: N)rDr:r<><00><00><00>r)rDr<>rorprqrx<00>get_user_server_ipaddress<73> get_bt_hosts)<08> get_speed<65>get_userr<72><00> host_listrG
<00>user_server_ipaddress<73>bt_host<73>
ips_results&& r'<00> Get_ip_inforS
<00>s<><00><00> <16><17><17> <1D><1B><1C>B<EFBFBD> <18><12>Y<EFBFBD><02>J<EFBFBD><02>F<EFBFBD>B<EFBFBD><08>RT<52>V_<56>ac<61> <16><02>L<EFBFBD>"<22>o<EFBFBD>r<EFBFBD>;<3B>PR<50>T^<5E>`b<> <12>9<>4<EFBFBD><12>W<EFBFBD>a<EFBFBD>
<EFBFBD> <0B> <0B>
<15>
<EFBFBD>
<EFBFBD>8<EFBFBD>$<<3C>=<3D>><3E>I<EFBFBD> <09>-<2D><19>#<23> "<22>E<EFBFBD><1E><19><0F> 9<>)<29> K<><1D><1A>9<EFBFBD><15>7<>G<EFBFBD>&<26>0<>J<EFBFBD><11>*<2A>$<24>z<EFBFBD><7A># <1D><1C>B<EFBFBD>s <00>
B<00>B#c<04><><00>.pRR/pVF<>pRPVR,4p\V^VR7p\P!RV4P ^4p\ RPV44pRVP 49d'RVR &VR,VR
&VPV4Vu#K<> V'g(R R R RRR RR RR RR RR RR RR RR RR R RR\4R
^/.#R# K<>;i)ui
获取服务器公网ip归属地信息
@param host_list: host列表
@param level: 等级元组
@return:
rkrjzhttps://{}/Api/getIpAddressr<73><00>r\z!^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$r<>rF
rZrG
rc rFrd u 未知地区rg r<>rA
rf rB
rC
r^ rD
rE
Nr^) rArhrr<>r<>r<>r<>r<>r<>) rO
rG
rR
r\rkrxr<>r<><00> s_ip_infos && r'rK
rK
<00>s$<00><00><14>J<EFBFBD><15>)<29>*<2A>G<EFBFBD><19><04> <15>3<>:<3A>:<3A>4<EFBFBD><04>:<3A>F<>G<EFBFBD><1B>G<EFBFBD>Q<EFBFBD><07>8<>E<EFBFBD><1A> <09> <09>"F<><05>N<>T<>T<>UV<55>W<>I<EFBFBD>(<28><14><1B><1B>Y<EFBFBD>)?<3F>@<40>I<EFBFBD><13>y<EFBFBD>~<7E>~<7E>'<27>'<27>$I<> <09>&<26>!<21>%*<2A>2<EFBFBD>Y<EFBFBD> <09>'<27>"<22><1A>!<21>!<21>)<29>,<2C>!<21>!<21> (<28> <1A> <16><1C>b<EFBFBD>)<29>^<5E>Z<EFBFBD><12>V<EFBFBD>UW<55>Ya<59>ce<63>gp<67>rt<72><1B>R<EFBFBD><1C>r<EFBFBD>?<3F>B<EFBFBD> <0B>UW<55><1B>R<EFBFBD><16>)N<>PT<50>V`<60>Vb<56>dk<64>mn<6D>p<01>q<01> q<01> <16><> <15> <14>s <00>BC#<02>#C(c<04>T<00>.pVEF<>pRRRRRRRRRRRRR RR
RR RR RR RRRRRRR/pV'd,\RPVR,4R,^4wrg\VR,4'g9VR,VR&VR,VR&V'dRVR&VPV4K<>\ RPVR,44pRVP 49d<>VR,VR&V'dl\ X4^d8d V^,VR&^d\ V4u;8dR8dMM V^,VR&\ V4R8<>d V^,VR&VR,VR&VPV4EKoRVP 49d\VR,R8XdKVR,VR&VR,VR&V^,VR&V'dRVR&RVR&VPV4EK<>EK<>EK<> \V4^8d'VR,R,R8XdVPR4V# EK";i)u<>
获取bt官网ip归属地列表
@param get_speed: 是否测速
@param host_list: 传host列表
@param level: 传等级元组
@return:
rc rFrd rg r<>u ipv6 地址rA
rf rB
rC
r^ rD
rE
rZu7该节点为ipv6地址,若服务器无ipv6请勿选择!r<>rG
N<>
https://{}z :80/net_testrrr<>r<>u未知归属地r] u;节点无法测速,请选择离您服务器最近的尝试!r}r<>r^) r<>rAr<>r<>r<>r<>r<>r<>rB) rM
rO
rG
rR
r<>rN<00>n_net<65>n_ping<6E> ip_results &&& r'rL
rL
 s#<00><00><14>J<EFBFBD><17><02> <17><12> <15>r<EFBFBD> <16><02> <12>M<EFBFBD> <14>b<EFBFBD> <15>r<EFBFBD> <16><02> <18>"<22> <1B>R<EFBFBD> <17><12> <16><02> <12>M<> <10>"<22> <13>T<EFBFBD>
<EFBFBD><04>  <15><18>+<2B>l<EFBFBD>6I<36>6I<36>"<22>T<EFBFBD>(<28>6S<36>Vd<56>6d<36>fg<66>*h<>-<2D>%<25><1A>2<EFBFBD>d<EFBFBD>8<EFBFBD>$<24>$<24><1F><04>X<EFBFBD><04>T<EFBFBD>
<EFBFBD> %<25>b<EFBFBD> <09><04>W<EFBFBD> <0A><1C>b<EFBFBD>d<EFBFBD>7<EFBFBD>m<EFBFBD><1A>!<21>!<21>$<24>'<27><18>(<28><14><1B><1B>R<EFBFBD><04>X<EFBFBD>)><3E>?<3F>I<EFBFBD><13>y<EFBFBD>~<7E>~<7E>'<27>'<27>%*<2A>2<EFBFBD>Y<EFBFBD> <09>'<27>"<22><1C><1A>6<EFBFBD>{<7B>S<EFBFBD>(<28>u<EFBFBD>Q<EFBFBD>x<EFBFBD>)<29>G<EFBFBD>*<<3C><1A>S<EFBFBD><16>[<5B>.<2E>3<EFBFBD>.<2E>U<EFBFBD>1<EFBFBD>X<EFBFBD> <09>'<27>0B<30><1A>6<EFBFBD>{<7B>S<EFBFBD>(<28>u<EFBFBD>Q<EFBFBD>x<EFBFBD>)<29>G<EFBFBD>*<<3C>)/<2F>#<23><1C>I<EFBFBD>g<EFBFBD>&<26><1A>!<21>!<21>)<29>,<2C><18><15><19><1E><1E>)<29>)<29><1C>V<EFBFBD>$<24>(9<>9<>!#<23>D<EFBFBD><18>D<EFBFBD><14>J<EFBFBD>#%<25>f<EFBFBD>:<3A>D<EFBFBD><16>L<EFBFBD>$)<29>!<21>H<EFBFBD>D<EFBFBD><17>M<EFBFBD> <20>"<22>$<24>w<EFBFBD>-<2D>#`<60>D<EFBFBD><16>L<EFBFBD><1E>%<25>%<25>d<EFBFBD>+<2B> :<3A>*<2A>K<18>^ <0B>:<3A><EFBFBD><11><1A>z<EFBFBD>"<22>~<7E>f<EFBFBD>5<><1D>F<>
<EFBFBD><0E><0E>WY<57>HZ<48> <15><15><> <15> <14>s <00>BH!<02>+CH!<02>4AH!<02>H!<02>!H'c<04><><00>Rp\RPV44p\RPV44pV^,'gV^,'g \RR4#V^,'d$\RRPV^,V44#V^,'d$\RRPV^,V44#\RRPV44#) uY
@name 设置官网hosts
@author wzz<wzz@yakpanel.com>
@param host IP地址
@return void
uk请尝试点击【清理旧节点】,如果仍然不行,请联系 YakPanel 支持: https://www.yakpanel.comz(echo "{} www.yakpanel.com" >> /etc/hostsz(echo "{} api.yakpanel.com" >> /etc/hostsTu节点设置成功Fu节点设置失败: {}, {}u节点设置失败: {})r<>rAr<>)rkr<><00>www_set<65>api_sets& r'<00>set_home_host2r_
U s<><00><00> x<01>C<EFBFBD><17>D<>K<>K<>D<EFBFBD>Q<>R<>G<EFBFBD><17>D<>K<>K<>D<EFBFBD>Q<>R<>G<EFBFBD> <12>1<EFBFBD>:<3A>:<3A>g<EFBFBD>a<EFBFBD>j<EFBFBD>j<EFBFBD><19>4<EFBFBD>AU<41>1V<31>*V<><0E>q<EFBFBD>z<EFBFBD>z<EFBFBD>)<29>E<EFBFBD>+G<>+N<>+N<>w<EFBFBD>WX<57>z<EFBFBD>[^<5E>+_<>`<60>`<60><0E>q<EFBFBD>z<EFBFBD>z<EFBFBD>)<29>E<EFBFBD>+G<>+N<>+N<>w<EFBFBD>WX<57>z<EFBFBD>[^<5E>+_<>`<60>`<60> <14>U<EFBFBD>4<>;<3B>;<3B>C<EFBFBD>@<40> A<>Ar&c<04><><00>\R4pV^,'dI\R4pV^,'d#\RRPV^,44#\RR4#\RR4#)u<>
清理面板官网节点写入的 hosts 记录(历史 capnis.com 或当前 yakpanel.com
@author wzz <wzz@yakpanel.com>
@return:
zHgrep -E "(bt\\.cn|www\\.yakpanel\\.com|api\\.yakpanel\\.com)" /etc/hostszwsed -i "/bt\.cn/d" /etc/hosts && sed -i "/www\.yakpanel\.com/d" /etc/hosts && sed -i "/api\.yakpanel\.com/d" /etc/hostsFu旧节点清理失败: {}Tu旧节点已清理u&hosts没有绑定旧节点无需清理)r<>r<>rA)<02> check_hostsr<73>s r'<00> Clean_bt_hostrb
e sm<00><00> <1C>r<>s<>K<EFBFBD><12>1<EFBFBD>~<7E>~<7E><1A>`<02>a<02><06> <11>!<21>9<EFBFBD>9<EFBFBD>Y<EFBFBD>u<EFBFBD>.I<>.P<>.P<>QW<51>XY<58>QZ<51>.[<5B>\<5C>\<5C><18><14>3<>4<>4<> <14>T<EFBFBD>C<> D<>Dr&c
<04><><00>\4V'd \V4#\RR7pRR/pVF<>pRPVR,4p\ V^VR7pV'gK3\ RP\ 44VR,4\VR,4pVR ,'gK<>\R
R PVR ,VR ,VR,44u# \RR4#)u<>
设置bt官网(www && api)指定hosts节点
@author wzz <wzz@yakpanel.com>
@param get: 手动设置 get.ip 官网传ip地址,从public.Get_ip_info方法获取 | 自动设置
@return:
F)rN
rkrjrX
r<>rU
z{}/data/home_host.plr<6C>Tu6已自动选择为{}{}的最优节点,运营商是: {}rg r<>rf u.自动选择节点失败,请尝试手动设置)rb
r_
rS
rArhrsr<>r<>)r<><00>ips_infor\rkrxrfr<>s& r'<00> Set_bt_hostre
s s<><00><00><12>O<EFBFBD> <09>.<2E><12>$<24> $<24><1A>E<EFBFBD>*<2A>H<EFBFBD><15>)<29>*<2A>G<EFBFBD><18><04><1E>%<25>%<25>d<EFBFBD>4<EFBFBD>j<EFBFBD>1<><07><15>g<EFBFBD>q<EFBFBD>'<27>2<><03> <0E>3<EFBFBD> <15>,<2C>3<>3<>N<EFBFBD>4D<34>E<>t<EFBFBD>D<EFBFBD>z<EFBFBD> R<>#<23>D<EFBFBD><14>J<EFBFBD>/<2F>F<EFBFBD><15>h<EFBFBD><1F><1F> <20><14>'_<>"(<28>&<26><14>j<EFBFBD>)9<>4<EFBFBD><06><<3C><14>i<EFBFBD><1F>"Y<>[<01>[<01><19> <15>U<EFBFBD>L<> M<>Mr&c<04><><00>^RIpVPV4PpVPV4Pp\P
!WV4\P !V4F<>wrVpVF9p\PPWX4p \P
!W<>V4K; VF9p
\PPWZ4p \P
!W<>V4K; K<> R#)um
设置指定目录及目录下所有文件、子目录所属为user
@param directory:
@param user:
@return:
N) r<>r<>r<>r<>rlr<>rrmr<>) <0C> directoryr<79>r<>rr<>r<>r<>r<>r<><00>dir_pathr<68><00> file_paths && r'<00> set_ownershiprj
<00> s<><00><00><0F>
<0A>,<2C>,<2C>t<EFBFBD>
<1C>
#<23>
#<23>C<EFBFBD>
<0A>,<2C>,<2C>t<EFBFBD>
<1C>
#<23>
#<23>C<EFBFBD><06>H<EFBFBD>H<EFBFBD>Y<EFBFBD>S<EFBFBD>!<21><1F>W<EFBFBD>W<EFBFBD>Y<EFBFBD>/<2F><19><04>E<EFBFBD><15>A<EFBFBD><19>w<EFBFBD>w<EFBFBD>|<7C>|<7C>D<EFBFBD>,<2C>H<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>X<EFBFBD>C<EFBFBD> (<28><16><17>A<EFBFBD><1A><07><07> <0C> <0C>T<EFBFBD>-<2D>I<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>Y<EFBFBD>S<EFBFBD> )<29><17> 0r&c<04>j<00>\P!W4\P!V4F<>wr#pVF8p\PP W%4p\P!Wa4K: VF8p\PP W'4p\P!W<>4K: K<> R#)u<>
设置指定目录及目录下所有文件、子目录权限为permissions
@param directory:
@param permissions: 传八进制如0o755
@return:
N)rlr<>rrmr<>) rg
<00> permissionsr<73>r<>r<>r<>rh
r<>ri
s && r'<00>set_permissionsrm
<00> sz<00><00><07>H<EFBFBD>H<EFBFBD>Y<EFBFBD>$<24><1F>W<EFBFBD>W<EFBFBD>Y<EFBFBD>/<2F><19><04>E<EFBFBD><15>A<EFBFBD><19>w<EFBFBD>w<EFBFBD>|<7C>|<7C>D<EFBFBD>,<2C>H<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>X<EFBFBD> +<2B><16><17>A<EFBFBD><1A><07><07> <0C> <0C>T<EFBFBD>-<2D>I<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>Y<EFBFBD> ,<2C><17> 0r&c<04>|<00>RV9d\V4pRV9dR#R#RpRp\PPV4'gRp\V4pRV9dbRV9d[\ VR ,V,R
,4pRp\ V^,4^8<>dRpV^,P R 4R 8wdRpV#) uI
校验面板设置SSL双向认证证书格式
@param certPath:
@return:
zcrl.pemz-----BEGIN X509 CRL-----FTrLrMrN<00> CertificaterOrPrQr^)rqrlrmrnr<>r<>r_)rS<00>certKeyrfrMrTr<>s& r'<00>check_ssl_verifyrq
<00> s<><00><00> <11>H<EFBFBD><1C><1A>8<EFBFBD>$<24><07> %<25>W<EFBFBD> 4<><18><13>
<0F>C<EFBFBD>.<2E>G<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>'<27> "<22> "<22>i<EFBFBD>G<EFBFBD><16>x<EFBFBD> <20>G<EFBFBD>$<24><07>/<2F>M<EFBFBD>W<EFBFBD>4L<34><1A>7<EFBFBD>\<5C>1<>H<EFBFBD><<3C>?Q<>Q<>R<><06><12><03> <0E>v<EFBFBD>a<EFBFBD>y<EFBFBD>><3E>A<EFBFBD> <1D>U<EFBFBD>s<EFBFBD> <11>!<21>9<EFBFBD>><3E>><3E>(<28> #<23>r<EFBFBD> )<29><15>3<EFBFBD> <0E>Jr&c<04><><00>Rp\VR4\PPV4'd?\ V4R8Xd\P
!V4R#\P
!V4R#)u0
@name 测试是否能写入文件
@return void
z/etc/init.d/bt_10000100.plr
TF)rsrlrmrnrqr)<01> test_files r'<00> is_write_filert
<00> sQ<00><00>
-<2D>I<EFBFBD> <0A>i<EFBFBD><16> <20> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20> <13>I<EFBFBD> <1E>&<26> (<28> <0E>I<EFBFBD>I<EFBFBD>i<EFBFBD> <20><17>
<EFBFBD> <09> <09>)<29><1C> r&c<04><00>\4pRP\44pV'gT\R4p\P
P V4'd$\VR4\R4\4pV#V#)u-
@name 临时停用系统加固
@return bool
<EFBFBD>{}/data/is_stop_syssafe.pl<70>syssafer
z/etc/init.d/bt_syssafe stop) rt
rAr<>r<>rlrmrnrsr<>)r <00>is_stop_syssafe_file<6C> syssafe_paths r'<00> stop_syssaferz
<00> sf<00><00> <18>/<2F>C<EFBFBD>7<>><3E>><3E>~<7E>?O<>P<><18> <0E>&<26>y<EFBFBD>1<> <0C> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27> <15>*<2A>F<EFBFBD> 3<> <15>3<> 4<> <20>/<2F>C<EFBFBD><16>J<EFBFBD> <0E>Jr&c<04><00>RP\44p\PP V4'dK\ R4\PP V4'd\P !V4R#R#R#)u6
@name 恢复系统加固的运行状态
@return void
rv
z/etc/init.d/bt_syssafe startN)rAr<>rlrmrnr<>r)rx
s r'<00> start_syssafer|
<00> s`<00><00>
8<>><3E>><3E>~<7E>?O<>P<><18> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>*<2A>+<2B>+<2B><11>0<>1<> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>.<2E> /<2F> /<2F> <0E>I<EFBFBD>I<EFBFBD>*<2A> +<2B> 0<>,r&c<04><00>\4#)u3
@name 检查关键目录是否可写
@return bool
)rz
r%r&r'<00>check_sys_writer~
<00> s <00><00>
<18>><3E>r&c<04><><00>.ROpTpRRPVPR4RR4,pRVPRR4,pRpW19dRpVR\V4)V,pVP R4^8<>d<VPR^4wrgpV'd
VR,pRPWx.4p W<>3#RpTp W<>3#) u<>
@name 根据域名查询根域名和记录值
@author cjxin<2020-12-17>
@param domain {string} 被验证的根域名
@return void
r<EFBFBD>NrFFTrP)z.ac.cnz.ah.cnz.bj.cnz.com.cnz.cq.cnz.fj.cnz.gd.cnz.gov.cnz.gs.cnz.gx.cnz.gz.cnz.ha.cnz.hb.cnz.he.cnz.hi.cnz.hk.cnz.hl.cnz.hn.cnz.jl.cnz.js.cnz.jx.cnz.ln.cnz.mo.cnz.net.cnz.nm.cnz.nx.cnz.org.cnz.cn.comr})r<><00>rsplitrrr<>r)
<EFBFBD> domain_name<6D>top_domain_list<73>old_domain_name<6D>
top_domain<EFBFBD>new_top_domain<69>
is_tow_top<EFBFBD>zone<6E>middlerFr<>s
& r'<00>get_root_domainr<6E>
!s<><00><00>`<01>O<EFBFBD>"<22>O<EFBFBD><14>s<EFBFBD>x<EFBFBD>x<EFBFBD> <0B> 2<> 2<>3<EFBFBD> 7<><02><03> <<3C>=<3D>=<3D>J<EFBFBD><18>:<3A>-<2D>-<2D>c<EFBFBD>2<EFBFBD>6<>6<>N<EFBFBD><16>J<EFBFBD><11>$<24><19>
<EFBFBD>!<21>"3<>C<EFBFBD>
<EFBFBD>O<EFBFBD>#3<>4<>~<7E>E<> <0B><12><18><18><13><1D><01>!<21>(<28>/<2F>/<2F><03>Q<EFBFBD>7<><1A><04>d<EFBFBD> <15><1D>b<EFBFBD>><3E>D<EFBFBD><12>x<EFBFBD>x<EFBFBD><16><0E>'<27><04> <10>:<3A><15><12><04><1E><04> <0F>:<3A>r&c <04><> <00>\4pVR,R8XdR#\VR,4^8XdR#\VR,R,4^8Xd[RVR,9dM\VR,R,4^8Xd/RVR,9d!\VR,R,4^8XdR#\4pVR9dR#\V4pV'gR#VPR,R,R8XdR#R P \ R
4\ R R P VPR,R,VPR,R,VPR,R,434\ R 4\ R44pVR,R8XEd<>VR,R,Frp\VPR,R,P44^8XdM;VPR,R,P4VR,9gKqR# VR,R,Frp\VPR,R,P44^8XdM;VPR,R,P4VR,9gKqR# VR,R,Fsp\VPR,R,P44^8XdV#VPR,R,P4VR,9gKrR# V#VR,R8XEd<>VR,R,Fsp\VPR,R,P44^8XdM<VPR,R,P4VR,9gKqVu# VR,R,Fsp\VPR,R,P44^8XdM<VPR,R,P4VR,9gKqVu# VR,R,Ftp\VPR,R,P44^8XdR#VPR,R,P4VR,9gKrVu# R# ^RIp\TP44R#;i)u$
@name: 检查地区限制
@return:
<EFBFBD>limit_area_status<75>falseF<65>
limit_arear<EFBFBD>rg rd zInternal network addressz<h2>{}</h2> {}</br> {}</br> {}<7D>PAGE_ERR_IP_AREA_H1<48>PAGE_ERR_IP_AREA_P1z{} {} {}<7D>PAGE_ERR_IP_AREA_P2<50>PAGE_ERR_IP_AREA_P3<50>
limit_type<EFBFBD>allowr<00>denyNr%) <0B>get_limit_arear<61>r<>rm rp rArkrIr<>rxr<>)<08>
areas_dictrrq <00> error_strr<72>rg rd r<>s r'<00>check_area_panelr<6C>
#!s:<00><00>
 <20>!<21>J<EFBFBD><12>%<25>&<26>'<27>1<>%<25>
<EFBFBD>:<3A>l<EFBFBD> #<23>$<24><01>)<29>%<25>
<EFBFBD>:<3A>l<EFBFBD> #<23>F<EFBFBD> +<2B>,<2C><01>1<> <15><1A>L<EFBFBD>1<> 1<>c<EFBFBD>*<2A>\<5C>:R<>S]<5D>:^<5E>6_<36>cd<63>6d<36><18>J<EFBFBD>|<7C>4<>4<><13>Z<EFBFBD> <0C>=U<>V_<56>=`<60>9a<39>ef<65>9f<39><1C><1B> <0A>I<EFBFBD><10>5<>5<>e<EFBFBD>"<22>9<EFBFBD>-<2D>L<EFBFBD> <17><05><13><17><17> <09>"<22>9<EFBFBD>-<2D>1K<31>K<>TY<54>=&<26>4<>;<3B>;<3B> <12>(<28> )<29> <12>(<28>:<3A>+<<3C>+<<3C><1C> <20> <20><19>+<2B>I<EFBFBD>6<><1C> <20> <20><19>+<2B>J<EFBFBD>7<><1C> <20> <20><19>+<2B>F<EFBFBD>3<>,<0E>+<10> <11>
<13>(<28> )<29> <12>(<28> )<29> 
<EFBFBD> <09> <16>l<EFBFBD> #<23>w<EFBFBD> .<2E>"<22><<3C>0<><16>8<>8<><04><16>|<7C>'<27>'<27> <09>2<>6<EFBFBD>:<3A>@<40>@<40>B<>C<>q<EFBFBD>H<><19><1F>#<23>#<23>I<EFBFBD>.<2E>v<EFBFBD>6<><<3C><<3C>><3E>$<24>v<EFBFBD>,<2C>N<> <20> 9<>'<27>|<7C>4<>Z<EFBFBD>@<40>@<40><08><16>|<7C>'<27>'<27> <09>2<>:<3A>><3E>D<>D<>F<>G<>1<EFBFBD>L<><19><1F>#<23>#<23>I<EFBFBD>.<2E>z<EFBFBD>:<3A>@<40>@<40>B<>h<EFBFBD>v<EFBFBD>FV<46>V<> <20> A<01>&<26>l<EFBFBD>3<>I<EFBFBD>><3E>><3E><07><16>|<7C>'<27>'<27> <09>2<>9<EFBFBD>=<3D>C<>C<>E<>F<>!<21>K<><19>
<1D> <1C> <20>#<23>#<23>I<EFBFBD>.<2E>y<EFBFBD>9<>?<3F>?<3F>A<>W<EFBFBD>V<EFBFBD>_<EFBFBD>T<> <20> ?<3F><1D> <1C> <16>l<EFBFBD> #<23>v<EFBFBD> -<2D>"<22><<3C>0<><16>8<>8<><04><16>|<7C>'<27>'<27> <09>2<>6<EFBFBD>:<3A>@<40>@<40>B<>C<>q<EFBFBD>H<><19><1F>#<23>#<23>I<EFBFBD>.<2E>v<EFBFBD>6<><<3C><<3C>><3E>$<24>v<EFBFBD>,<2C>N<>$<24>$<24> 9<>'<27>|<7C>4<>Z<EFBFBD>@<40>@<40><08><16>|<7C>'<27>'<27> <09>2<>:<3A>><3E>D<>D<>F<>G<>1<EFBFBD>L<><19><1F>#<23>#<23>I<EFBFBD>.<2E>z<EFBFBD>:<3A>@<40>@<40>B<>h<EFBFBD>v<EFBFBD>FV<46>V<>$<24>$<24> A<01>&<26>l<EFBFBD>3<>I<EFBFBD>><3E>><3E><07><16>|<7C>'<27>'<27> <09>2<>9<EFBFBD>=<3D>C<>C<>E<>F<>!<21>K<><19> <11>  <20>#<23>#<23>I<EFBFBD>.<2E>y<EFBFBD>9<>?<3F>?<3F>A<>W<EFBFBD>V<EFBFBD>_<EFBFBD>T<>$<24>$<24> ?<3F> <11><>&<26><18> <0A>i<EFBFBD>"<22>"<22>$<24>%<25> <10>sl<00>6DS<00>S<00>A>S<00>S<00>"A S<00>01S<00>&S<00>)S<00>-B S<00>=S<00>A>S<00>S<00>A S<00>1S<00> S<00>S<00>S6c<04>d<00>^RIHpRP\ 44pTP T4pTPT4pTP4T# \RP\ 444\RP\ 444\ RR4^RIHpL<>;i)u;
获取ip地址的地理位置
@param ip_address:
@return:
)<01>databasez{}/pyenv/bin/pip install -U pipz{}/pyenv/bin/pip install geoip2zdata/restart.plr
z{}/config/GeoLite2-City.mmdb) rl r<>
r<>rAr<>rs<00>Readerr<72>r<>)rr<>
<00> data_path<74>readerr<72>s& r'rm rm {!s<><00><00> $<24>#<23>/<2F>5<>5<>n<EFBFBD>6F<36>G<>I<EFBFBD> <15>_<EFBFBD>_<EFBFBD>Y<EFBFBD> '<27>F<EFBFBD><15>{<7B>{<7B>:<3A>&<26>H<EFBFBD>
<EFBFBD>L<EFBFBD>L<EFBFBD>N<EFBFBD> <13>O<EFBFBD><4F>$<24><11>3<>:<3A>:<3A>><3E>;K<>L<>M<><11>3<>:<3A>:<3A>><3E>;K<>L<>M<><11>#<23>V<EFBFBD>,<2C>#<23>s <00>A<00>AB/c<04>(<00>RR.R.R./RRRR/pR p\PPV4'gV#\P!\ V44pV# \P PdTu#i;i \4T#;i)
u#
获取地区限制列表
@return:
r<EFBFBD>
r<>rg rd r<>
r<>
r<>
r<>
zdata/limit_area.json) rlrmrnrorpr<><00>decoder<65>JSONDecodeErrorr<72>)<03> empty_content<6E>
areas_filer<EFBFBD>
s r'r<>
r<>
<00>!s<><00><00> <15> <12>B<EFBFBD> <16><02> <15>r<EFBFBD>
<EFBFBD>
<1C>W<EFBFBD><14>f<EFBFBD><06>M<EFBFBD> <19>+<2B>
<EFBFBD><11>w<EFBFBD>w<EFBFBD>~<7E>~<7E>j<EFBFBD>)<29>)<29>-<2D>+?<3F> !<21><1D><1A><1A>H<EFBFBD>Z<EFBFBD>$8<>9<>J<EFBFBD><1A><19><><14>|<7C>|<7C>+<2B>+<2B> !<21> <20> <20> !<21><><19><16><18> <18><18>s3<00>&B<00>B<00>A<00>B<00>!A?<03><B<00>>A?<03>?B<00> Bc<00>0<00>V^8<>dQhR\R\/#rar.)rAs"r'rBrB<00>!s<00><00><10><10>#<23><10>$<24>r&c<04>p<00>\V4^8dR#^p\P!RV4'd
V^, p\P!RV4'd
V^, p\P!RV4'd
V^, p\P!RV4'd
V^, pV^8dR#R#)uI
@name 密码复杂度验证
@param password(string) 密码
@return bool
Fz[0-9]+z[a-z]+z[A-Z]+z[^\w\s]+T)r<>rr<>)r&r s& r'<00>check_password_safer<65>
<00>!s<><00><00> <0B>8<EFBFBD>}<7D>q<EFBFBD><18><15>
<0B>C<EFBFBD> <09>y<EFBFBD>y<EFBFBD><19>H<EFBFBD>%<25>%<25>s<EFBFBD>a<EFBFBD>x<EFBFBD>s<EFBFBD> <09>y<EFBFBD>y<EFBFBD><19>H<EFBFBD>%<25>%<25>s<EFBFBD>a<EFBFBD>x<EFBFBD>s<EFBFBD> <09>y<EFBFBD>y<EFBFBD><19>H<EFBFBD>%<25>%<25>s<EFBFBD>a<EFBFBD>x<EFBFBD>s<EFBFBD> <09>y<EFBFBD>y<EFBFBD><1B>h<EFBFBD>'<27>'<27><13><01><18><13>
<EFBFBD>Q<EFBFBD>w<EFBFBD>u<EFBFBD> r&c<04><><00>RpRp.ROpTp\PPV4'd \P!\ V44p\PPV4'd_\ V4pVUu.uF qwV9gK VNK pp\ RPV44\V\P!V44T^8XdY9dTPT4MT^8XdY9dTPT4\T\P!T44\RR4#uupi Lr;i)uQ
设置显示隐藏菜单
:param menu_id: 菜单id
:param status: 0 | 1
:return:
z'/www/server/panel/config/show_menu.jsonz'/www/server/panel/config/hide_menu.jsonz rm -rf {}T<>Success)<0E>memuA<75> memuAsite<74>memuAftp<74> memuAdatabase<73>
memuDocker<EFBFBD> memuAcontrol<6F> memuAfirewall<6C>
memuAfiles<EFBFBD> memuAlogsrH<00> memuAcrontab<61> memuAsoft<66> memuAconfig<69>dologin) rlrmrnrorpr<>r<>rAr^rr<>rr<>)<08>menu_idr<64><00>show_menu_file<6C>hide_menu_file<6C> defanlt_data<74>show_menu_datarLr<>s&& r'rMrM<00>!s <00><00>?<3F>N<EFBFBD>><3E>N<EFBFBD>.<2E>L<EFBFBD>"<22>N<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>n<EFBFBD>%<25>%<25><1D><1A><1A>H<EFBFBD>^<5E>$<<3C>=<3D><0E> <0A> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>.<2E> )<29> )<29> <20><1E>0<>I<EFBFBD>)7<>N<><1E>A<EFBFBD>I<EFBFBD>;M<>a<EFBFBD>a<EFBFBD><1E>N<EFBFBD>N<> <15>k<EFBFBD>(<28>(<28><1E>8<> 9<> <15>n<EFBFBD>d<EFBFBD>j<EFBFBD>j<EFBFBD><1E>&@<40> A<><0E><11>{<7B>w<EFBFBD>4<><16><1D><1D>g<EFBFBD>&<26> <0F>1<EFBFBD><1B><17>2<><16><1D><1D>g<EFBFBD>&<26> <0A>n<EFBFBD>d<EFBFBD>j<EFBFBD>j<EFBFBD><1E>8<>9<> <14>T<EFBFBD>9<EFBFBD> %<25>%<25><>O<01><> <0A> <0C>s*<00>$E<00>5E<00>D<<04>D<<04><E<00><E<00>Ec<04><00>RP\44p\PP V4'gR#\ V4pV'gR#\PP RPV44'gR#R#)u3
@name 检查后台任务服务状态
@return bool
z{}/logs/task.pidFz/proc/{}T)rAr<>rlrmrnrq)<02>pid_filer<65>s r'<00>task_service_statusr<73>
<00>!s^<00><00>
"<22>(<28>(<28><1E>)9<>:<3A>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD>
<12>8<EFBFBD>
<1C>C<EFBFBD> <0E>u<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A>+<2B>+<2B>C<EFBFBD>0<> 1<> 1<>%<25> r&c<04><><00>\RP\44R4\4'g\ R4R#R#)u!
@name 重载面板
@return void
z{}/data/reload.plr
zbash {}/init.sh startN)r^rAr<>r<>
r<>r%r&r'<00> reload_panelr<6C>
<00>!s4<00><00><0E>!<21>(<28>(<28><1E>)9<>:<3A>F<EFBFBD>C<> <1E> <20> <20><11>)<29>*<2A> !r&c
<04><><00>^RIpVf\VP!44p\P!\ R\ 4,R,44pVP 4p\V4\8XdbW(9d\Wr,p\\V44F;p R\V ^,4,R,p
VPW<>V ,4pK= RVRVRVR VR
V/#) u
通用响应对象
@param code: 0:成功 1:失败 2:警告 ...
@param status:
@param msg: 只传msg,不传需要前端处理的数据
@param data: 只传需要前端处理的数据
@param timestamp: 秒级时间戳
@return:
使用示例:
成功return dp.returnResult(data=data)
失败return dp.returnResult(code=1, status=False, msg="获取失败!", data=[])
失败return dp.returnResult(code=1, status=False, msg="获取失败!")
警告return dp.returnResult(code=2, status=False, msg="警告xxxxxxxxxxx!")
...
Nr<EFBFBD>r<>r<>r<>rkr<>r<>r~r<>) r<>r<>rorpr<>r<>r<>r<>r@r<>r<>rr) rkr<>r<>r~r<>r<>r<>r<>r<>r<>r<>s &&&&&& r'<00> returnResultr<74>
"s<><00><00>"<10><10><18><17><04> <09> <09> <0B>$<24> <09><16>*<2A>*<2A>X<EFBFBD>&A<>K<EFBFBD>M<EFBFBD>&Q<>Tb<54>&b<>c<>d<>K<EFBFBD> <16> <1B> <1B> <1D>D<EFBFBD> <0B>C<EFBFBD>y<EFBFBD>C<EFBFBD><17> <0E>;<3B><1D>"<22>C<EFBFBD><1A>3<EFBFBD>t<EFBFBD>9<EFBFBD>%<25><01><19>C<EFBFBD><01>A<EFBFBD><05>J<EFBFBD>&<26><13>,<2C><03><19>k<EFBFBD>k<EFBFBD>#<23>A<EFBFBD>w<EFBFBD>/<2F><03>&<26>
<0F><04><10>&<26> <0A>s<EFBFBD><0E><04><13>Y<EFBFBD>  <06>r&c<04>j<00>RP\44pV'gV#RPW4#)u<>
@name 取指定插件目录
@author hwliang<2021-07-14>
@param mod_name<string> 模型名称 不传则返回模型根目录
@return string
z{}/mod/projectr.r/)r{rKs& r'<00> get_mod_pathr<68>
+"s.<00><00>!<21>'<27>'<27><0E>(8<>9<>I<EFBFBD> <13>I<EFBFBD>%<25> <12>><3E>><3E>)<29> .<2E>.r&c<04><00>RP\44pRPV4p\PP V4'g\P
!VR4\ R4pWn\PP V4'gEVPR4VPR4VPR4VPR4R pVPR
4PR 4;'g.FpV^,R 8XgKR pM V'g!VPR
4PR4V# \d+p\P!\T44Rp?T#Rp?ii;i)u;
@name 获取客户端信息数据库对象
@return object
z
{}/data/dbz{}/client_info.dbr<62>rFa,CREATE TABLE client_info (
id INTEGER PRIMARY KEY AUTOINCREMENT,
remote_addr VARCHAR(50) NOT NULL,
remote_port INTEGER DEFAULT 0,
session_id VARCHAR(32) NOT NULL,
user_agent TEXT NOT NULL,
login_time INTEGER DEFAULT 0
)z6CREATE INDEX client_ip_index ON client_info(client_ip)z8CREATE INDEX session_id_index ON client_info(session_id)z8CREATE INDEX login_time_index ON client_info(login_time)Frz!PRAGMA table_info('client_info');r<>TzCALTER TABLE `client_info` ADD COLUMN `login_type` INTEGER DEFAULT 1N)rAr<>rlrmrnr<>r8<00> _Sql__DB_FILEr r6rHr<>rir<>r@)rrr<><00>hitr<74>r<>s r'<00>get_client_info_db_objr<6A>
8"s?<00><00>
<1B>!<21>!<21>.<2E>"2<>3<>G<EFBFBD>!<21>(<28>(<28><17>1<>G<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>'<27> "<22> "<22>B<EFBFBD>K<EFBFBD>K<EFBFBD><07><13>$=<3D> <0E>r<EFBFBD>U<EFBFBD>F<EFBFBD>"<22><18> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>'<27> "<22> "<22><0E><0E><0E> <0A> <0E> <0F><0E><0E>O<>P<><0E><0E><0E>Q<>R<><0E><0E><0E>Q<>R<> !<21><13><03><17><1C><1C>o<EFBFBD>.<2E>4<>4<>5X<35>Y<>_<>_<>]_<>_<>A<EFBFBD><10><11>t<EFBFBD>|<7C>#<23><1A><03><15>`<01><13> <12>L<EFBFBD>L<EFBFBD><1F> )<29> 1<> 1<>U<> <0E> <12>M<EFBFBD><4D> <15>!<21><0E><18><18><13>Q<EFBFBD><16> <20> <20> <11>M<EFBFBD><4D>!<21>s*<00>"(E<00> E<00>! E<00>/ E<00> F<03>F<03>Fc<00>$<00>V^8<>dQhR\/#)r:r<>r )rAs"r'rBrBc"s<00><00><1B><1B>3<EFBFBD>r&c<04><><00>Rp^RIHp^RIHp\ 4p\ 4pVP PRR4pRVRVPPR4R \WE,4R
VR \\P!44R \V4/pVPR 4PV4VPRVR ,R4V'dVP'4R#R# \d-p\ P"!R\%T4 24Rp?LNRp?ii;i T'dTP'4ii;i)u_
@name 记录客户端信息
@param login_type int 登录类型 1:成功 0:失败
@return None
Nrrr<>rxrFr<><00> remote_portr<74>rr<>r<>r<><00> client_info<66>last_client_session_idzerror record_client_info: <20><00>)r<>rsrrdr<>
r<>r\rbr<>r<>r<>r<>r6rr<>r<>rir<>r@r<>)r<>r<>rsrdr<>r<>r<>r<>s& r'<00>record_client_infor<6F>
c"s <00><00> <12>F<EFBFBD><1B>!<21>"<22>'<27>)<29><06>!<21>m<EFBFBD> <0B><1C>_<EFBFBD>_<EFBFBD>(<28>(<28><1C>r<EFBFBD>:<3A>
<EFBFBD> <19>;<3B> <19>7<EFBFBD>?<3F>?<3F>.<2E>.<2E>}<7D>=<3D> <18>#<23>k<EFBFBD>6<>7<> <18>*<2A> <18>#<23>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>*<2A> <18>#<23>j<EFBFBD>/<2F> 
<EFBFBD><05> <0F> <0C> <0C>]<5D>#<23>*<2A>*<2A>5<EFBFBD>1<> <0A> <09> <09>*<2A>E<EFBFBD>,<2C>,?<3F><19>K<> <12> <12>L<EFBFBD>L<EFBFBD>N<EFBFBD> <12><> <15>@<01><0E><18><18>5<>c<EFBFBD>!<21>f<EFBFBD>X<EFBFBD>><3E>?<3F>?<3F><>@<01><> <12> <12>L<EFBFBD>L<EFBFBD>N<EFBFBD> <12>s*<00>CC1<00>1 D(<03><"D#<03>D+<00>#D(<03>(D+<00>+Ec<04>:<00>^RIHp^RIHp\ 4pVR9d^#VP
P RR4pVPR4R8Xd^#\W#,4pVP R4V8Xd^#\4pV'g^#VPR4PR4PR 4P4pV'g^#\\P!44pVR
,V8Xd>WvR ,,
pVR8dVPRVRV,
4^#VR 8d^#^#W&R ,8XdWvR ,,
R 8d^#VPR4P!RV4P#4'd^#^#)us
@name 检查客户端信息
@return int 0:陌生IP1:上次登录的IP且UA一致2:近30天内登录过的IP
rrr<>rxrF<00>Mozillar<61>
r<>
zid descz!remote_addr,session_id,login_timerr<>r<><00><00>'z remote_addr=?)rr<>r'rr^r<>
)r<>rsrrdr<>r\rbr_r<>r<>
r6<00>orderr<72>r<>r<>r<>r^r) rsrdr<>r<>rr<><00>last_login_info<66>now_timerqs r'r-r-<00>"sV<00><00>
<1E><1E><1D>-<2D>K<EFBFBD><13>;<3B>;<3B><10><18><1F><1F>$<24>$<24>\<5C>2<EFBFBD>6<>J<EFBFBD><11><EFBFBD><EFBFBD>y<EFBFBD>!<21>R<EFBFBD>'<27><10><14>[<5B>-<2D>.<2E>J<EFBFBD> <0C>y<EFBFBD>y<EFBFBD>)<29>*<2A>j<EFBFBD>8<><10> #<23> %<25>F<EFBFBD> <11><10><1C>l<EFBFBD>l<EFBFBD>=<3D>1<>7<>7<> <09>B<>H<>H<>Il<49>m<>r<>r<>t<>O<EFBFBD> <1A><10><13>4<EFBFBD>9<EFBFBD>9<EFBFBD>;<3B><1F>H<EFBFBD><16>|<7C>$<24>
<EFBFBD>2<><19>L<EFBFBD>9<>9<><06> <11>Y<EFBFBD> <1F> <11>I<EFBFBD>I<EFBFBD>.<2E>
<EFBFBD>I<EFBFBD><06><N<> O<><14> <11>Z<EFBFBD> <20><14><10><13>m<EFBFBD>4<>4<><18>T`<60>Da<44>9a<39>dk<64>9k<39><10> <0A>|<7C>|<7C>M<EFBFBD>"<22>(<28>(<28><1F>+<2B>F<>L<>L<>N<>N<><10> r&c
<04>t<00>^RIHpHpHp\ 4pVP
P RR4pV^8XdV'd V!R4#\R4#V^8XdhV'dPRRR\\P!44RRR R
\4//pV!\P!V4R ^<5E>R 7#V!\44#V^8XdXV'dHRRR\\P!44RRR R
R //pV!\P!V4R ^<5E>R 7#V!R 4#V'd V!R4#\R4#)u-
@name 重定向到登录页面
@return void
r"r<>rFNr<4E>r<>r<>r<>r<>r#r<>r<>rhr^) r<>r#rsr$r-r\rbr<>r<>r<>r<>ror)<07>default_callback_defr#rsr$r<>r<>r<>s& r'<00>redirect_to_loginr<6E>
<00>"s.<00><00>
2<>1<>%<25>'<27>M<EFBFBD><1B>?<3F>?<3F>&<26>&<26>~<7E>r<EFBFBD>:<3A>L<EFBFBD><14><01><19> <1F>'<27><04>-<2D> -<2D><18><14><EFBFBD><1E> <16>!<21> <1B> <17>
<19>"<22><1B>S<EFBFBD><14><19><19><1B>-<2D><19><19>\<5C><1E><0E> 0<><12><0E>F<EFBFBD><1C>D<EFBFBD>J<EFBFBD>J<EFBFBD>v<EFBFBD>.<2E>9K<39>TW<54>X<> X<><17><0E>(<28>)<29>)<29> <16>!<21> <1B> <17> <19>"<22><1B>S<EFBFBD><14><19><19><1B>-<2D><19><19>\<5C><1E><08><12><0E>F<EFBFBD><1C>D<EFBFBD>J<EFBFBD>J<EFBFBD>v<EFBFBD>.<2E>9K<39>TW<54>X<> X<><17><08>!<21>!<21><1B>#<23>D<EFBFBD>)<29>)<29> <14>T<EFBFBD>?<3F>r&c<00>$<00>V^8<>dQhR\/#)r:r~r<>)rAs"r'rBrB<00>"s<00><00> <15> <15>#<23> r&c <00><><00>R\P9d!\PP^R4^RIHpVP 4UUu/uF3wr#VR,\ \P!448<>gK1W#bK5 pppV/8XdR#VP 4Fwr#VR,PV4K R#uuppi R#;i)r" )<01>WS_OBJr[F<>ws_objT) rrmrrr<>
<00>itemsr<73>r<><00>send)r~r<>
r<>rRr<>
s& r'<00>ws_sendr<64>
<00>"s<><00><00> <15> <1E>c<EFBFBD>h<EFBFBD>h<EFBFBD> .<2E> <0F>H<EFBFBD>H<EFBFBD>O<EFBFBD>O<EFBFBD>A<EFBFBD>2<> 3<>#<23>#)<29><<3C><<3C>><3E>U<>><3E>4<EFBFBD>1<EFBFBD>Q<EFBFBD>y<EFBFBD>\<5C>C<EFBFBD><04> <09> <09> <0B>DT<44>5T<35>$<24>!<21>$<24>><3E><06>U<> <11>R<EFBFBD><<3C><05><1A>L<EFBFBD>L<EFBFBD>N<EFBFBD>D<EFBFBD>A<EFBFBD> <0A>h<EFBFBD>K<EFBFBD> <1C> <1C>T<EFBFBD> "<22>#<23><13><> V<01><>
<15><14>s*<00>AC<00>.C<06>C<06>
C<00>1C<00>C<00>Cc<04><><00>\4pRPW4p\PP V4'g/#\ V4pV'g/#\ P!V4pV#)us
@name 获取插件信息
@author hwliang<2021-06-15>
@param upgrade_plugin_name<string> 插件名称
@return dict
r<EFBFBD>)r<>rArlrmrnrqrorp)<05>upgrade_plugin_namer<65><00>plugin_info_file<6C> info_body<64> plugin_infos& r'<00>get_plugin_infor<6F>
<00>"s[<00><00>"<22>#<23>K<EFBFBD>(<28>/<2F>/<2F> <0B>Q<><14> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A> +<2B> +<2B>B<EFBFBD>Y<EFBFBD><18>)<29>*<2A>I<EFBFBD> <14>R<EFBFBD>i<EFBFBD><16>*<2A>*<2A>Y<EFBFBD>'<27>K<EFBFBD> <16>r&c<04>p<00>\4pVR,FpVR,V8XgKVu# \V4#)uy
@name 获取指定软件信息
@author hwliang<2021-06-15>
@param upgrade_plugin_name<string> 插件名称
@return dict
r<EFBFBD>r)r<>r<>
)r<>
<00>plugin_list_data<74> p_data_infos& r'<00>get_plugin_findr<64>
#sA<00><00>&<26>'<27><14>'<27><06>/<2F>/<2F> <0B> <16>v<EFBFBD> <1E>"5<> 5<><1E> <1E>0<>
<1B>.<2E> /<2F>/r&c<04><<00>\V4pVPVR4#)u<>
@name 获取插件配置值
@author hwliang
@param plugin_name<string> 插件名称
@param key<string> 字段名
@return mixed
N)r<>
rb)r<>rSr<>
s&& r'<00>get_plugin_valuer<65>
#s<00><00>"<22>+<2B>.<2E>K<EFBFBD> <16>?<3F>?<3F>3<EFBFBD><04> %<25>%r&c<04>P<00>\V4pV'g^#RV9d
VR,#^#)us
@name 获取指定插件的pid
@author hwliang<2021-06-15>
@param plugin_name<string> 插件名称
@return string
r<EFBFBD>)r<>
)r<>r<>
s& r'<00>get_plugin_pidr<64>
'#s)<00><00>"<22>+<2B>.<2E>K<EFBFBD> <16>q<EFBFBD> <0C> <0B><1B><1A>5<EFBFBD>!<21>!<21> r&c<04>`a<11>^RIp^RIp\4pRP\ 44p\
P PV4'g\
P!VR4RP\44p\4pWR&WR&RVR&\P!\4R R
7VR &^RIp^RIo^RIHuHuHuHp VP4P+4p
V P,p V
R 8Xd V3R lV nMV
R8Xd V3RlV nVP/Wg^\14R7p \3V4\3V P44Y<>nT P>^<5E>8wd+\9T P4PARR44hRPYP4p\CTR4;_uu_4pTPET P44TPG4RRR4\IT P44T PJPAR48wd \9R4hRPTTR7pTPL!TT4\
P PT4'd\
PN!T4\QRRP\ST4R,44R# \6d#p \9\;\=T 444hRp ? ii;i Y<>ni;i \8dh\9R4h;i +'giEL3;i)u<>
@name 下载插件主程序文件
@author hwliang<2021-06-25>
@param upgrade_plugin_name<string> 插件名称
@param upgrade_version<string> 插件版本
@return void
N<EFBFBD>{}/tempr3z!{}/api/panel/download_plugin_mainrr<>rgrlFr<46><00>environment_inforMc<00><<01>SP#rN)r<>r<>s<00>r'rp<00>download_main.<locals>.<lambda>Q#s <00><><00>&<26>.<2E>.r&rNc<00><<01>SP#rN)r<>r<>s<00>r'rpr<>
S#s <00><><00>&<26>/<2F>/r&)r[r\rfz!download plugin source code errorz{}/{}.pyr<79>z Content-md5z&Package file Hash verification failed.z1{plugin_path}/{plugin_name}/{plugin_name}_main.py)r<>r<>zSoftware managerz0Plugin [{}] was corrupted, try automatic repair.r)*r<>r;r<>rAr<>rlrmrnr<>r<>r<>rorr rTr<><00>)requests.packages.urllib3.util.connection<6F>packages<65>urllib3<62>utilr <00>get_request_iptype<70>allowed_gai_familyrryr<>r<>r<>rr<>r@rcrbr<>r<>r<>r<>r\r<>rr+r<>
)r<>
<00>upgrade_versionr<6E>r;r<><00>tmp_path<74>download_d_main_urlr<6C>rT<00> urllib3_conn<6E>_ip_type<70>
old_family<EFBFBD> download_resrtr<><00> save_script_f<5F>dst_filer<65>s&& @r'<00> download_mainr 6#s<><00><><00><1C>!<21>#<23>K<EFBFBD><18><1F><1F><0E> 0<>1<>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>
<EFBFBD> <0B> <0B>H<EFBFBD>e<EFBFBD>$<24>=<3D>D<>D<>_<EFBFBD>EV<45>W<><17> <19>O<EFBFBD>E<EFBFBD>'<27>&<26>M<EFBFBD>&<26>)<29><14><19>E<EFBFBD>$<24>K<EFBFBD> $<24>
<EFBFBD>
<EFBFBD>><3E>+;<3B>%<25> P<>E<EFBFBD>
<1C><1D><19>D<>D<><15>}<7D>}<7D><EFBFBD>1<>1<>3<>H<EFBFBD><1D>0<>0<>J<EFBFBD><0F>6<EFBFBD><19>*@<40> <0C>'<27> <11>V<EFBFBD> <1B>*A<> <0C>'<27>5<><1F>}<7D>}<7D>%8<><12>Ui<55>Uk<55>}<7D>l<> <0C><11>%<25><18><11>,<2C>&<26>&<26>'<27>+5<>'<27><14><1F><1F>3<EFBFBD>&<26> B<01><1C>\<5C>.<2E>.<2E>0<>4<>4<>U<EFBFBD><_<>`<60>a<> a<> <1A> <20> <20><18>?<3F>H<EFBFBD> <0A>h<EFBFBD><05> <1E> <1E>-<2D><15><1B><1B>L<EFBFBD>0<>0<>1<><15><1B><1B><1D>
<1F> <0B><<3C> <1F> <1F> <20>L<EFBFBD>$8<>$8<>$<<3C>$<<3C>]<5D>$K<>K<><18>A<>B<>B<>B<>I<>I<>Va<56>Vi<56>J<01>k<01>H<EFBFBD>
<EFBFBD>O<EFBFBD>O<EFBFBD>H<EFBFBD>h<EFBFBD>'<27> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><12><19><19>8<EFBFBD>!4<> <0C> <1F> ?<3F> F<> F<><EFBFBD>Wj<57>Gk<47>ls<6C>Gt<47> u<>w<01><>1 <15>4<><18>)<29>#<23>b<EFBFBD>'<27>2<>3<>3<><33>4<><34>+5<>'<27><> <1A> <12> <11> B<01><1C>@<40>A<> A<><41>
<1F> <1E> <1E>s<<00>#<K<00>8)L<00>,L<05> K3<03>K.<03>.K3<03>3K6<00>6K><03>L<03> L- c<00><><00>V'g\4R,V,pRPWR7p\V4pRV9d#VR,p\W4\ VR4pV#R#)z/plugin/z#{plugin_path}/{name}/{name}_main.py)r<>rrur<>r&)r<>rAr<>
r rq)r<>r<><00> plugin_filer<65>
r<><00> plugin_bodys&& r'<00>re_download_mainr v#sc<00><00> <16>$<24>&<26><1A>3<>k<EFBFBD>A<> <0B>7<>><3E>><3E>;<3B>><3E>i<>K<EFBFBD>!<21>+<2B>.<2E>K<EFBFBD><11>[<5B> <20><1D>j<EFBFBD>)<29><07><15>k<EFBFBD>+<2B><1E>{<7B>D<EFBFBD>1<> <0B><1A><1A> r&c<00><<00>V^8<>dQhR\R\R\/#<00>r:r<>rvr<><00>r@r<>)rAs"r'rBrB<00>#s!<00><00><0F><0F>C<EFBFBD><0F>3<EFBFBD><0F>h<EFBFBD>r&c<00>.<00>^RIpVPWV4p\V\4'diRV9dbVR,R8XdTRV9dM\VR,\4'd0VR,P R4R8wd\ VR,4hV#<00>rNr<4E>Fr<46>z
Traceback r^)r]<00>
plugin_runr<EFBFBD>r<>r@r_r)r<>rvr<>r]rfs&&& r'<00>
run_pluginr <00>#sv<00><00><17>
<16>
!<21>
!<21>+<2B><14>
><3E>C<EFBFBD><11>#<23>t<EFBFBD><1C><1C> <13>s<EFBFBD>?<3F>s<EFBFBD>8<EFBFBD>}<7D><05>5<>%<25>3<EFBFBD>,<2C><19>#<23>e<EFBFBD>*<2A>c<EFBFBD>*<2A>*<2A><16>u<EFBFBD>:<3A>?<3F>?<3F><<3C>0<>B<EFBFBD>6<>$<24>S<EFBFBD><15>Z<EFBFBD>0<>0<> <0E>Jr&c<00><<00>V^8<>dQhR\R\R\/#r r )rAs"r'rBrB<00>#s!<00><00><0F><0F>s<EFBFBD><0F>c<EFBFBD><0F><18>r&c<00><<00>^RIpVPWV4p\V\4'diRV9dbVR,R8XdTRV9dM\VR,\4'd0VR,P R4R8wd\ VR,4h\V\4'dDRV9d0RV9d)VR,'d^MRp\V^VR,4pM \^^V4p\V\\\34'd\^^V4pV#r
)
r]r r<>r<>r@r_rr<>r<>r<>)r<>rvr<>r]rfr<>s&&& r'<00> run_plugin_v2r <00>#s<><00><00><17>
<16>
!<21>
!<21>+<2B><14>
><3E>C<EFBFBD><11>#<23>t<EFBFBD><1C><1C> <13>s<EFBFBD>?<3F>s<EFBFBD>8<EFBFBD>}<7D><05>5<>%<25>3<EFBFBD>,<2C><19>#<23>e<EFBFBD>*<2A>c<EFBFBD>*<2A>*<2A><16>u<EFBFBD>:<3A>?<3F>?<3F><<3C>0<>B<EFBFBD>6<>$<24>S<EFBFBD><15>Z<EFBFBD>0<>0<><11>#<23>t<EFBFBD><1C><1C> <13>s<EFBFBD>?<3F>u<EFBFBD><03>|<7C><1D>h<EFBFBD>-<2D>-<2D>Q<EFBFBD>R<EFBFBD>F<EFBFBD> <20><16><11>C<EFBFBD><05>J<EFBFBD>7<>C<EFBFBD>!<21><11>A<EFBFBD>s<EFBFBD>+<2B>C<EFBFBD><11>#<23><04>c<EFBFBD>3<EFBFBD>'<27>(<28>(<28><1C>Q<EFBFBD><01>3<EFBFBD>'<27><03> <0E>Jr&c<00><00>VR8Xd^#^#)<01>libr%)<01>tips&r'<00>_self_hosted_tip_type_numr <00>#s<00><00><13>u<EFBFBD> <0C>1<EFBFBD>#<23>!<21>#r&c<00>8<00>T;'gRPR4Uu.uF*q"P4'gKVP4NK, ppV'gR.pV'd9T;'gRPR4Uu.uFq"P4NK upM.p\V4\V48dVPR4K,\ \V44Uu.uF%qSV,V\V48d WE,MR3NK' up#uupiuupiuupi)rFr<>r<)r<>rIr<>r<>r<>)<06>ver_str<74>upd_strr<72><00>vers<72>updsr<73>s&& r'<00>_self_hosted_version_pairsr <00>#s<><00><00> '<27> <0A> <0A>2<EFBFBD>4<>4<>S<EFBFBD>9<> G<>9<>!<21>W<EFBFBD>W<EFBFBD>Y<EFBFBD>I<EFBFBD>A<EFBFBD>G<EFBFBD>G<EFBFBD>I<EFBFBD>9<>D<EFBFBD> G<> <0F><13>u<EFBFBD><04>>E<><07> <0A> <0A>2<EFBFBD>4<>4<>S<EFBFBD>9<> :<3A>9<>!<21>G<EFBFBD>G<EFBFBD>I<EFBFBD>9<> :<3A>2<EFBFBD>D<EFBFBD>
<0A>d<EFBFBD>)<29>c<EFBFBD>$<24>i<EFBFBD>
<1F> <0C> <0B> <0B>B<EFBFBD><0F>AF<41>s<EFBFBD>4<EFBFBD>y<EFBFBD>AQ<41> R<>AQ<41>A<EFBFBD>!<21>W<EFBFBD><11>S<EFBFBD><14>Y<EFBFBD><1D>d<EFBFBD>g<EFBFBD>B<EFBFBD> 7<>AQ<41> R<>R<><52> H<01><> ;<3B><> Ss<00>D <04>D <04>D<04>+Dc<00>:<00>V'gR#VPRR4#)z /tmp/yakpanel_unconfigured_check<63>VERSION<4F> {VERSION}r,)r<>s&r'<00>_self_hosted_checks_templater <00>#s<00><00> <11>1<> <11>><3E>><3E>)<29>[<5B> 1<>1r&c<00>6<00>RTRT;'gTRRRRR^R^RR /#)
<EFBFBD> m_versionr<6E><00> dependentrF<00> mem_limiti<00> cpu_limit<69>os_limit<69>setupFr%)r<><00> display_vers&&r'<00>_self_hosted_ver_objr& <00>#s7<00><00><13>Q<EFBFBD><11>;<3B>#<23>#<23>!<21><13>R<EFBFBD><13>S<EFBFBD><13>Q<EFBFBD><12>A<EFBFBD><0F><15> <06>r&c<00><><00>RP\44p\V4pV'g R.RR)R^/#\P!V4p\ T\ 4'g R.RR)R^/#.pTEFLp\ T\4'dRT9dK#TPRR4p\T4p\TPR4TPR44p\TPR R
44pTPR TR,R ,4p TPR R
4p
TPRTR,4p TU U u.uFwr<>\Y<>;'gT 4NK pp p \T4^8:Ed<T^,wr<>T PRR
4pRT9dTPRT4MTpT ;'gT pTP/R\!TPR^44bR\!TPR^44bRTbR\#TPR^4;'g^4bRTR,bRT bR T
bRTbRR
bRR
bRR
bRTPRR
4bRTPRR
4bR T bRTbRTbRTbR^R^RTR R)R!^R"^R#^R$TPR$R
4R%TPR%R&4/ C4EKDTpR'pR(TR,,pTP/R\!TPR^44bR\!TPR^44bRTbR\#TPR^4;'g^4bRTR,bRT bR T
bRRbRTbRTbRTbRTPRR
4bRTPRR
4bR T bRTbRTbRTbR^R^RTR R)R!^R"^R#^R$TPR$R
4R%TPR%R&4/ C4EKO RTRR)R^/# R.RR)R^/u#;iuup p i)*z{}/data/list.jsonr<6E>r<>r<>rr <00>softrur<>r<>rFr<>z.sh<73>psrr<>r r!r<>r<><00>pricer<65><00> s_version<6F>manager_version<6F>c_manager_versionr <00>mutex<65>install_checks<6B>uninstall_checks<6B>uninsatll_checks<6B> compile_args<67>version_coexist<73>endtime<6D> panel_pro<72>
panel_free<EFBFBD>
panel_test<EFBFBD>authorrurr<r<>r^)rAr<>rqrorpr<>r<>r<>rbr r r r& r<>rrr<>r<>r<>)rmr<><00>raw_listr<74><00>entryr <00>type_num<75>pairs<72>
checks_tplr<EFBFBD>r) <00>
title_baser<EFBFBD><00>subv<62>vobjs<6A>vv<76>ic<69>vd<76>ichk<68>mgr<67>sprocs r'<00>get_self_hosted_soft_list_dictrG <00>#s<><00><00> <1E> %<25> %<25>n<EFBFBD>&6<> 7<>D<EFBFBD> <13>D<EFBFBD>><3E>D<EFBFBD> <0F><16><02>E<EFBFBD>2<EFBFBD>u<EFBFBD>a<EFBFBD>0<>0<>1<><17>:<3A>:<3A>d<EFBFBD>#<23><08> <16>h<EFBFBD><04> %<25> %<25><16><02>E<EFBFBD>2<EFBFBD>u<EFBFBD>a<EFBFBD>0<>0<>
<0C>C<EFBFBD><19><05><19>%<25><14>&<26>&<26>&<26><05>*=<3D> <14><13>i<EFBFBD>i<EFBFBD><05>v<EFBFBD>&<26><03>,<2C>S<EFBFBD>1<><08>*<2A>5<EFBFBD>9<EFBFBD>9<EFBFBD>Z<EFBFBD>+@<40>%<25>)<29>)<29>H<EFBFBD>BU<42>V<><05>1<>%<25>)<29>)<29>H<EFBFBD>b<EFBFBD>2I<32>J<>
<EFBFBD><15> <09> <09>'<27>5<EFBFBD><16>=<3D>5<EFBFBD>#8<>9<><05> <12>Y<EFBFBD>Y<EFBFBD>t<EFBFBD>R<EFBFBD> <20><02><1A>Y<EFBFBD>Y<EFBFBD>w<EFBFBD><05>f<EFBFBD> <0A>6<>
<EFBFBD>EJ<EFBFBD>K<>U<EFBFBD>'<27>!<21>%<25>a<EFBFBD>)<29>)<29>!<21>5<>U<EFBFBD><05>K<> <0E>u<EFBFBD>:<3A><11>?<3F><1B>A<EFBFBD>h<EFBFBD>G<EFBFBD>A<EFBFBD><12><19><19>3<EFBFBD><02>#<23>B<EFBFBD>8C<38>z<EFBFBD>8Q<38><1A>#<23>#<23>K<EFBFBD><12>4<>Wa<57>B<EFBFBD><15><19><19><11>B<EFBFBD> <0F>J<EFBFBD>J<EFBFBD><0E><14>c<EFBFBD>%<25>)<29>)<29>D<EFBFBD>!<21>,<2C>-<2D><0E><15>s<EFBFBD>5<EFBFBD>9<EFBFBD>9<EFBFBD>U<EFBFBD>A<EFBFBD>.<2E>/<2F><0E><17><08><0E><18><15>u<EFBFBD>y<EFBFBD>y<EFBFBD><17>!<21>4<>9<>9<><01>:<3A> <0E>
<17><05>f<EFBFBD> <0A> <0E> <18><1A> <0E><15>b<EFBFBD><0E><1A>2<EFBFBD><0E><1C>R<EFBFBD><0E>"<22>2<EFBFBD><0E>$<24>R<EFBFBD><0E><1C>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>{<7B>B<EFBFBD>7<><0E><18><15><19><19>7<EFBFBD>B<EFBFBD>/<2F><0E><18><15><0E>!<21>"<22><0E> #<23>B<EFBFBD>!<0E>"#<23>B<EFBFBD>#<0E>$<1F><01>!<21>1<EFBFBD><1A>E<EFBFBD><19>2<EFBFBD><1B>Q<EFBFBD><1C>a<EFBFBD><1C>a<EFBFBD><18>%<25>)<29>)<29>H<EFBFBD>b<EFBFBD>1<><16><05> <09> <09>&<26>#<23>.<2E>5<0E> <0F>:<1E>D<EFBFBD><15>C<EFBFBD><17>%<25><06>-<2D>'<27>E<EFBFBD> <0F>J<EFBFBD>J<EFBFBD><0E><14>c<EFBFBD>%<25>)<29>)<29>D<EFBFBD>!<21>,<2C>-<2D><0E><15>s<EFBFBD>5<EFBFBD>9<EFBFBD>9<EFBFBD>U<EFBFBD>A<EFBFBD>.<2E>/<2F><0E><17><08><0E><18><15>u<EFBFBD>y<EFBFBD>y<EFBFBD><17>!<21>4<>9<>9<><01>:<3A> <0E>
<17><05>f<EFBFBD> <0A> <0E> <18><1A> <0E><15>b<EFBFBD><0E><1A>;<3B><0E><1C>U<EFBFBD><0E>"<22>3<EFBFBD><0E>$<24>S<EFBFBD><0E><1C>U<EFBFBD>Y<EFBFBD>Y<EFBFBD>{<7B>B<EFBFBD>7<><0E><18><15><19><19>7<EFBFBD>B<EFBFBD>/<2F><0E><18><15><0E>!<21>$<24><0E> #<23>D<EFBFBD>!<0E>"#<23>D<EFBFBD>#<0E>$<1F><01>!<21>1<EFBFBD><1A>E<EFBFBD><19>2<EFBFBD><1B>Q<EFBFBD><1C>a<EFBFBD><1C>a<EFBFBD><18>%<25>)<29>)<29>H<EFBFBD>b<EFBFBD>1<><16><05> <09> <09>&<26>#<23>.<2E>5<0E> <0F>c<1A>\ <13>C<EFBFBD><15><02>E<EFBFBD>1<EFBFBD> -<2D>-<2D><>i1<><16><02>E<EFBFBD>2<EFBFBD>u<EFBFBD>a<EFBFBD>0<>0<><30>Ls<00>O<00> O<08>
Oc<00>0<00>V^8<>dQhR\R\/#)r:r<><00> retry_count)r<>r<>)rAs"r'rBrB'$s<00><00>T<1C>T<1C>$<24>T<1C>C<EFBFBD>Tr&c<00><><00>\4'd \4#RP\44pV'gK\P
P V4'd&\P
PV4^
8Ed<>V^8<>d%\P!^V,^,4RP\44p^RI p^RI pVP4PR4pRR/pRV9dRRPVR,4/p\P!\!44VR&R pRp VP#W6VR ^
R
7p
V
P$'d;\'VR 4;_uu_4p V P)V
P*4RRR4R pT'gJ\P
P T4;'d#\P
PT4^
8<EFBFBD>pT'gT eT h\1\3R 44h^RIp V'dL\7V R4'd$V P9^4'g \1R4hM^RIpVP<!V 4V P?^4p\AT\B4'g%T^8d\/Y^,4#\1R4hRT9dJRT9dCTR,R 8Xd5T^8d\/Y^,4#\1\ETR,44hT# +'giEL{;i \,d,p T p T^8d\/Y^,4uRp ? #Rp ? EL<>Rp ? ii;i T^8d\/Y^,4u#h;i)z{}/data/plugin_bin.plz{}/api/panel/getSoftListEnNr z YakPanel/1.0r<EFBFBD><00> authorizationzbt {}r<>
F)<04>paramsr\r]r[r.TzRLoad softlist and authorizations failed, please wait for few moment and try again.<2E>parse_plugin_listz9Sorry. failed to parse soft list. please try again later.zNSorry. failed to load soft list. please check the network and try again later.r<>r<>)#rDrG rAr<>rlrmrnr~r<>r<>r<>r<>r<>r<>rorr r<00>okr<6B>r<>rdr<>r<>rrir]r<>rM ryr2<00>get_plugin_listr<74>r<>r@)r<>rI <00>local_cache_file<6C>cloudUrlr<6C>r<>r<><00> url_headers<72> update_okrt<00>resprr<>r]ryr<>
s&& r'r<>r<>'$s<><00><00><15><17><17>-<2D>/<2F>/<2F>.<2E>5<>5<>n<EFBFBD>6F<36>G<><14> <0C>B<EFBFBD>G<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD>#3<>4<>4<><02><07><07><0F><0F>HX<48>8Y<38>\^<5E>8^<5E> <16><11>?<3F> <10>J<EFBFBD>J<EFBFBD>q<EFBFBD>;<3B><EFBFBD><11>*<2A> +<2B>/<2F>6<>6<><EFBFBD>7H<37>I<><08><18><17><19>#<23>#<23>%<25>5<>5<>d<EFBFBD>;<3B><05> <18>.<2E>
<EFBFBD> <0B> <13>e<EFBFBD> <1B>*<2A>G<EFBFBD>N<EFBFBD>N<EFBFBD>5<EFBFBD><17>><3E>,J<>K<>K<EFBFBD>$(<28>J<EFBFBD>J<EFBFBD>~<7E>/?<3F>$@<40><05> <20>!<21><19> <09> <11><02> ><3E><1B>=<3D>=<3D><18><1B>UZ<55>df<64>=<3D>g<>D<EFBFBD><14>w<EFBFBD>w<EFBFBD>w<EFBFBD><19>*<2A>C<EFBFBD>0<>0<>B<EFBFBD><16>H<EFBFBD>H<EFBFBD>T<EFBFBD>Y<EFBFBD>Y<EFBFBD>'<27>1<> <20> <09><19><1A><07><07><0E><0E>'7<>8<>d<>d<>R<EFBFBD>W<EFBFBD>W<EFBFBD>_<EFBFBD>_<EFBFBD>M]<5D>=^<5E>bd<62>=d<>I<EFBFBD><19><11>~<7E><18><08><1C>_<EFBFBD>.B<02>C<02>D<02> D<02><17><0E> <10><16>|<7C>%8<>9<>9<>#<23>5<>5<>a<EFBFBD>8<>8<>$<24>%`<60>a<>a<>9<>!<21><19> <20> <20><1C>.<2E>'<27>7<>7<><01>:<3A><18> <16>&<26><04> -<2D> -<2D> <16><11>?<3F>!<21>%<25>q<EFBFBD><1F>9<> 9<><18>i<>j<>j<><0F>#<23>#<23><05>1A<31>(A<>FV<46>W_<57>F`<60>di<64>Fi<46> <16><11>?<3F>!<21>%<25>q<EFBFBD><1F>9<> 9<><18><13>-<2D>e<EFBFBD>4<>5<>6<>6<> <1B><1B>i1<>0<>0<><30><19> ><3E><12>B<EFBFBD><1A>Q<EFBFBD><EFBFBD>%<25>e<EFBFBD>1<EFBFBD>_<EFBFBD>=<3D>=<3D><1F><> ><3E><><<0E> <16><11>?<3F>!<21>%<25>q<EFBFBD><1F>9<> 9<> <0A>sT<00><;L<00>7L<05>
L<00>M<00>(M<00>3M<00> L <09> L<00> M<03>$M
<03>>M<03>
M<03>M0<03>/M0c<00>:<00>\4'd \4#R#)rPr<>r%r&r'r<>r<>$s<00><00><15><17><17><1E> <20> <20> %r&c<00>:<00>\4'd \4#R#)zhttps://download.yakpanel.comr<6D>r%r&r'<00>sync_plugin_OfficialApiBaserW <00>$s<00><00><15><17><17><1E> <20> <20> *r&c<00>:<00>\4'd \4#R#r<>r<>r%r&r'<00>OfficialDownloadBaserY <00>$rr&c<04><00>R#)uE
@name 获取安装路径
@author hwliang<2021-07-22>
@return string
rHr%r%r&r'r{r{<00>$s<00><00> r&c<04>4<00>RP\44#)uE
@name 取面板根目录
@author hwliang<2021-07-14>
@return string
r?)rAr{r%r&r'r<>r<><00>$r1r&c <04><00>^RIpVPPV4'gR#Rp\W4pVP 4pT'd#TP'gTP4T# \
d<>p\ P^,^8wd<>\YRRR7pTP 4pRp?Lw \YRRR7pTP 4pRp?L<> Rp?T'd'TP'gTP4R#R#R#;i;iRp?T'd'TP'gTP4R#R#R#Rp?ii;i T'd%TP'gTP4iii;i)u^
读取文件内容
@filename 文件名
return string(bin) 若文件不存在则返回None
NFr*r)r,rr3)
rlrmrnr<>r<>r<>rrr<>r<>)r<>r<>rlrr\rts&& r'r<>r<><00>$s"<00><00> <0E> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>E<EFBFBD> <0A>B<EFBFBD><17> <11>(<28> !<21><02><13><17><17><19><06> <0E>b<EFBFBD>i<EFBFBD>i<EFBFBD>i<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD> <11>M<EFBFBD><4D>! <15> <19> <0E> <1B> <1B>A<EFBFBD> <1E>!<21> #<23> !<21><19>(<28>7<EFBFBD>8<EFBFBD>L<><02><1B><17><17><19><06><> !<21>!<21><1D>h<EFBFBD>u<EFBFBD>X<EFBFBD>N<>B<EFBFBD><1F>W<EFBFBD>W<EFBFBD>Y<EFBFBD>F<EFBFBD><46>!<21> <20> <0E>b<EFBFBD>i<EFBFBD>i<EFBFBD>i<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD> <20>2<EFBFBD><32><19> <0A>b<EFBFBD>i<EFBFBD>i<EFBFBD>i<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD> <20>2<EFBFBD><32> <19><> <0E>b<EFBFBD>i<EFBFBD>i<EFBFBD>i<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD> <20>2<EFBFBD>sw<00>A2<00>2 E<03>=E<03>B=<02>8E<00>=D<05>C$<04>E<03>E<00>$D<07>&D<05>'E<03>(E<00>D<05>E<03>"E<00>E<03>E<00>F <03>9F c<04><00>\W4#)u<>
@name 读取指定文件数据
@author hwliang<2021-06-09>
@param filename<string> 文件名
@param mode<string> 文件打开模式默认r
@return string or bytes or False 如果返回False则说明读取失败
)r<>r<>s&&r'rqrq<00>$s<00><00> <14>H<EFBFBD> #<23>#r&c<00>$<00>V^8<>dQhR\/#)r:r<>r<>)rAs"r'rBrB<00>$s<00><00>%<11>%<11>S<EFBFBD>%r&c<04>><00>^RIp\PPV4'gR#Rp\ VR4pVP 4pVP 4\TR4'dTPT4R,pMTPT4.pTFpTPTR,4pTu# R FpTPTRR7pTu# R# T'd#TP'gTP 4R#;i Kz;i K^;i)
u<EFBFBD>
读取文件内容, 返回本信息, 如果出错返回 False
与readFile相比可以处理更多种编码格式。
处理python项目中存在奇怪编码问题
NFr<EFBFBD><00>
detect_allr<EFBFBD>r,rr)r*r3zutf-16zutf-32r5) <0C>chardetrlrmrnr<>r<>r<>r<>r<>r` <00>detectr )r<>ra r<00> f_body_bytes<65> tmp_eng_list<73>tmp_engr\<00>engs& r'<00>read_rare_charset_filerg <00>$s <00><00> <13> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><14> <0A>B<EFBFBD><15> <11>(<28>D<EFBFBD> !<21><02> <20>g<EFBFBD>g<EFBFBD>i<EFBFBD> <0C>
<EFBFBD><08><08>
<EFBFBD> <0F>w<EFBFBD> <0C>%<25>%<25><1E>)<29>)<29>,<2C>7<><02>;<3B> <0C><1F><0E><0E>|<7C>4<>5<> <0C><1F><07> <15>!<21>(<28>(<28><17><1A>)<<3C>=<3D>F<EFBFBD><16> <0A>  <20><<3C><03> <15>!<21>(<28>(<28><13>X<EFBFBD>(<28>><3E>F<EFBFBD><16> <0A> <<3C> <11><>/<15> <0A>b<EFBFBD>i<EFBFBD>i<EFBFBD>i<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD><14><> <15> <14><>  <15> <14>s)<00>,C<00>D<02>D<02>D <03>9D <03>D<05>Dc<04><><00>\W4pVPV4VP4R# \YRR7pTPT4TP4R# R#;i;i)<05>w
写入文件内容
@filename 文件名
@s_body 欲写入的内容
return bool 若文件不存在则尝试自动创建
Tr*r+Fr+ r, s&&& r'r^r^<00>$sb<00><00> <19> <11>(<28> !<21><02>
<EFBFBD><08><08><16><18>
<EFBFBD><08><08>
<EFBFBD><13><><19> <19><15>h<EFBFBD>w<EFBFBD>7<>B<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>V<EFBFBD> <1C> <0E>H<EFBFBD>H<EFBFBD>J<EFBFBD><17><> <19><18>s <00>,0<00>A-<03>.A$<02>$A*<05>&A-<03>*A-c<04><><00>\WRR7;_uu_4pVPV4RRR4R# +'giR#;i R#;i)ri r*r+NTF)r<>r<>r, s&&& r'<00>
AppendFilerk %s?<00><00><15> <11>(<28>7<EFBFBD> 3<> 3<>r<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>V<EFBFBD> <1C>4<><13>4<> 3<><13><><15><14>s$<00>A<00>3<05>A<00> A <09>A<00>A<00>A c<04><00>\WV4#)u<>
@name 写入到指定文件
@author hwliang<2021-06-09>
@param filename<string> 文件名
@param s_boey<string/bytes> 被写入的内容,字节或字符串
@param mode<string> 文件打开模式默认w+
@return bool
)r^)r<>rgr<>s&&&r'rsrs%s<00><00> <15>X<EFBFBD>t<EFBFBD> ,<2C>,r&c<00>$<00>V^8<>dQhR\/#r<>r<>)rAs"r'rBrB*%s<00><00><14><14>S<EFBFBD>r&c<00><><00>RP\4\\P!44\ ^ 44p\
P PV4'g\
P!VR4V#)z{}/temp/tmp_{}_{}r3) rAr<>r<>r<>r<>rlrmrnr<>)r<>
s r'<00>make_panel_tmp_pathro *%sP<00><00>"<22>)<29>)<29>.<2E>*:<3A>C<EFBFBD><04> <09> <09> <0B><L<>o<EFBFBD>^`<60>Na<4E>b<>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23>
<EFBFBD> <0B> <0B>H<EFBFBD>e<EFBFBD>$<24> <13>Or&c#<00><>"<00>\4p^RIpVx<00>VP!V4R# TP!T4i;i5ir<>)ro r;rM)r<>
r;s r'<00> make_panel_tmp_path_with_contextrq 2%s4<00><00><00>"<22>$<24>H<EFBFBD><11> <20><16><0E> <0F> <0A> <0A>h<EFBFBD><1F><><06> <0A> <0A>h<EFBFBD><1F>s<00>A<01>*<00>A<01>><03>Ac<00>0<00>V^8<>dQhR\R\/#)r:r<>r=r<>)rAs"r'rBrB@%s<00><00>7<>7<>c<EFBFBD>7<>c<EFBFBD>7r&c<00>.<00>\PRV4#)z\\\g<0>)<02>search_sql_special_charsr<73>)r<>s&r'<00>escape_sql_strru @%s<00><00> #<23> '<27> '<27>
<EFBFBD>A<EFBFBD> 6<>6r&c<00>D<00>V^8<>dQhR\PR\/#r[)r><00>Dict<63>aap_t_http_multipart)rAs"r'rBrBE%s<00><00> <12> <12>&<26>+<2B>+<2B> <12>*><3E> r&c
<00>Z<00>R\^4PR4,pRpRpVP4EF<>pW,p\V\4'd<>\ V4^8Xd<>Vwrg\V\ 4'd<>\V\4'd<>VRV,V,R,VPR4,R,VPR4,R,V,R,V,V,V,V,, pK<>K<>K<>\V\4'g\V4'd\V4PR4p\V\ 4'gEKDVRV,V,R,VPR4,R,V,V,V,V,, pEK<> VRV,R,V,, p\R R
VPR4,R \\ V44/VR 7#) s----YakpanelFormBoundaryr*r&s
s--s&Content-Disposition: form-data; name="s "; filename="<22>"s&Content-Type: application/octet-streamr<6D>zmultipart/form-data; boundary=zContent-Length)r\r<>) r<>r<>r<>r<>r<>r<>r<>r@r rx r )r~<00>boundaryr<79><00>eolr<6C>rCrGr<>s& r'<00>build_multipartr} E%s.<00><00>)<29>O<EFBFBD>B<EFBFBD>,?<3F>,F<>,F<>w<EFBFBD>,O<>O<>H<EFBFBD> <0E>D<EFBFBD> <12>C<EFBFBD> <11>Y<EFBFBD>Y<EFBFBD>[<5B><01> <10>G<EFBFBD><01> <16>a<EFBFBD><15> <1F> <1F>C<EFBFBD><01>F<EFBFBD>a<EFBFBD>K<EFBFBD><1C>L<EFBFBD>B<EFBFBD><19>"<22>e<EFBFBD>$<24>$<24><1A>H<EFBFBD>c<EFBFBD>)B<>)B<><14><05><08>(<28>3<EFBFBD>.<2E>1Z<31>Z<>]^<5E>]e<>]e<>fm<66>]n<>n<>rB<02>B<02>EM<02>ET<02>ET<02>U\<02>E]<02>]<02>`d<02>d<02>gj<02>j<02>mV<03>V<03>Y\<03>\<03>_b<03>b<03>eg<03>g<03>jm<03>m<03>m<03><04>*C<01>$<24>
<1A>!<21>S<EFBFBD>!<21>!<21>Y<EFBFBD>q<EFBFBD>\<5C>\<5C><17><01>F<EFBFBD>M<EFBFBD>M<EFBFBD>'<27>*<2A><01><1A>!<21>U<EFBFBD>#<23>#<23><14><05><08>(<28>3<EFBFBD>.<2E>1Z<31>Z<>]^<5E>]e<>]e<>fm<66>]n<>n<>qu<71>u<>x{<7B>{<7B>B<02>B<02>EF<02>F<02>IL<02>L<02>L<02><04>#<19>& <09>E<EFBFBD>H<EFBFBD> <1C>u<EFBFBD> $<24>s<EFBFBD> *<2A>*<2A>D<EFBFBD> <1F><16>8<>8<EFBFBD>?<3F>?<3F>7<EFBFBD>;S<>S<><18>#<23>c<EFBFBD>$<24>i<EFBFBD>.<2E>)<06> <11> <12>r&)<01>Langc<04><<00>\4pVPV4R#)u2
@name 设置语言
@param {string} lang - 语言
N)r~ <00> setLanguage)r2<00>lang_objs& r'<00>setLangr<67> j%s<00><00>
<14>v<EFBFBD>H<EFBFBD> <0C><18><18><14>r&c<04>><00>\4pVP!V.VO5!#)u<>
@name 多语言渲染
@param {string} content - 内容
@param {any[]} args - 参数
@returns {string}
@example lang('Hello {}', 'World')
@example lang('Hello {} {}', 'World', '!')
@example lang('Hello')
)r~ <00>getLang)r<>r<>r<> s&* r'r2r2r%s#<00><00><14>v<EFBFBD>H<EFBFBD> <14> <1B> <1B>G<EFBFBD> +<2B>d<EFBFBD> +<2B>+r&c<04><><00>\PPV4'g\R\ R44#\
P !V4pV#)u
@name 获取目录可用空间
Fz&The specified directory does not exist)rlrmrnr<>r2r<><00>
disk_usage)rmrfs& r'<00>get_disk_usager<65> <00>%s?<00><00>
<0E>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24> <1F> <1F><18><15><04>%M<> N<>O<>O<>
<10>
<1B>
<1B>D<EFBFBD>
!<21>C<EFBFBD> <0E>Jr&c<00><><00>\V4pVPRPV44pRp\V\4'gRp\ V4^8:dRpV'gVP VR4R#)z=SELECT * FROM sqlite_master WHERE type='table' AND name='{}';TFr%)r8rHrAr<>r<>r<>r )r6<00> table_sqlr<6C>rf<00> is_creates&& r'<00> check_tabler<65> <00>%s_<00><00> <0E>u<EFBFBD>X<EFBFBD>F<EFBFBD>
<10>,<2C>,<2C>V<>]<5D>]<5D>^c<>d<>
e<EFBFBD>C<EFBFBD><14>I<EFBFBD> <15>c<EFBFBD>4<EFBFBD> <20> <20>e<EFBFBD>)<29>
<EFBFBD>3<EFBFBD>x<EFBFBD>1<EFBFBD>}<7D>%<25>i<EFBFBD> <14><0E><0E><0E>y<EFBFBD>"<22>%<25> r&c<04><><00>RpRp\PPV4'gV#\V4p\P
!V4R,# Tu#;i)u0
@name 获取当前设置的语言
@return list
rr-rr[)rr<>r<>s r'<00>get_set_languager<65> <00>%sU<00><00>
<13>G<EFBFBD>C<>H<EFBFBD> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23><16><0E> <13>H<EFBFBD> <1D>D<EFBFBD><17><13>z<EFBFBD>z<EFBFBD>$<24><1F> <09>*<2A>*<2A><><17><16><0E>s <00>A<00>Ac<00><><00>\PPV4'g\P!W4R#\P
!V4pVF<>p\PP W4p\PP W4p\PPV4'd\P!WE4K~\WE4K<> R#rN)
rlrmrnr;<00>copytreer<65>r<>r<>r<><00>copy_dir)r<><00>dst<73>dsr<73><00>src_path<74>dst_paths&& r'r<> r<> <00>%s<><00><00> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>#<23> <1E> <1E><0E><0F><0F><03>!<21><0E> <0B><1A><1A>C<EFBFBD><1F>B<EFBFBD> <0F><01><15>7<EFBFBD>7<EFBFBD><<3C><<3C><03>'<27><08><15>7<EFBFBD>7<EFBFBD><<3C><<3C><03>'<27><08> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>(<28> #<23> #<23> <12>O<EFBFBD>O<EFBFBD>H<EFBFBD> /<2F> <14> <11><18>$<24>r&c<00>0<00>V^8<>dQhR\R\/#rLr<>)rAs"r'rBrB<00>%s<00><00><13><13>3<EFBFBD><13>3<EFBFBD>r&c<00><><00>\R4PRV4P4'd%RPVR,\ ^44pKTV#)rDr<>rz{}_{}<7D>N<EFBFBD> N)rJr^rnrAr<>rOs&r'<00>ensure_unique_db_namer<65> <00>%sJ<00><00>
<0B> <0C>[<5B>><3E> <1F> <1F><06><07> 0<> 7<> 7<> 9<> 9<><1D>n<EFBFBD>n<EFBFBD>W<EFBFBD>R<EFBFBD>[<5B>2E<32>a<EFBFBD>2H<32>I<>G<EFBFBD> <14> <0A> <12>Nr&c<00>0<00>V^8<>dQhR\R\/#rLr<>)rAs"r'rBrB<00>%s<00><00><1F><1F>C<EFBFBD><1F>C<EFBFBD>r&c<00><><00>VR,P4p\^4pV RV 2p\R4PRV4P 4'dK[V#)Tr<54> rr<>r)rAr<>rJr^rn)r<r<>r<><00> new_db_names& r'<00>ensure_unique_db_name2r<32> <00>%sW<00><00>
<0E><18><12><1B>"<22>"<22>$<24><06>$<24>Q<EFBFBD>'<27><06><1F><08><01>&<26><18>*<2A> <0B><10><1B>~<7E>#<23>#<23>F<EFBFBD>K<EFBFBD>8<>?<3F>?<3F>A<>A<><1E> r&c<00><<00>V^8<>dQhR\R\R\/#<00>r:r~<00>
block_sizer=<00>r<>r<>)rAs"r'rBrB<00>%s!<00><00>9<>9<><05>9<>3<EFBFBD>9<><05>9r&c<00>|<00>\V4pWV,,
pV^8XdTpV\V.V,4,#<00>r)r<>r<>)r~r<> r<><00> amount_to_pads&& r'<00> pkcs7_paddingr<67> <00>%s<<00><00> <10><14>Y<EFBFBD>F<EFBFBD><1E>:<3A>"5<>6<>M<EFBFBD><14><01><19>"<22> <0A> <0F>%<25><1D><0F>-<2D>7<>8<> 8<>8r&c<00><<00>V^8<>dQhR\R\R\/#r<> r<> )rAs"r'rBrB<00>%s!<00><00><17><17>%<25><17>S<EFBFBD><17>%<25>r&c<00>><00>VR,pV^8gW!8<>d^pVRV)#rPr%)r~r<> <00>pads&& r'<00>pkcs7_unpaddingr<67> <00>%s*<00><00>
<0E>r<EFBFBD>(<28>C<EFBFBD>
<EFBFBD>Q<EFBFBD>w<EFBFBD>#<23>"<22><0F><03> <0F><05>#<23><14>;<3B>r&c<00>0<00>V^8<>dQhR\R\/#)r:<00>
machine_idr=r )rAs"r'rBrB<00>%s<00><00>']<02>']<02>3<EFBFBD>']<02>s<EFBFBD>']r&c <00>P<00>RpRp\\P!4R,4p\VR4;_uu_4p\VR4;_uu_4p\P!VP 4\P 4\P!VP 4\P4VP^4VP^4VP4P4pVP4P4pVR8XdRpVR8XdRp\V4p\V4p VP^4VP4W88Xd%V ^, p VP\V 44M<>^p VP\V 44\P!VP 4\P4VP^4VP4VP\V44\VR,
4^,\V4R,^ ,,\V 4R ,,uuRRR4uuRRR4# +'giM;iRRR4R# +'giR#;i)
z!/dev/shm/__snow_flake_last_time__z /dev/shm/__snow_flake_sequence__r<5F>r<>rFr<>l|<7C>uSNi<4E>i<>)r<>r<>r<><00>fcntl<74>flock<63>fileno<6E>LOCK_SH<53>LOCK_EXr<58>r<>rI<00>truncater<65>r@)
r<EFBFBD> <00>last_snow_flake_time_file<6C>snow_flake_sequence_file<6C>cur_snow_flake_timer<00>fp2r<32>r<><00>last_snow_flake_time<6D>snow_flake_sequences
& r'<00>
snow_flaker<EFBFBD> <00>%s<><00><00> C<><1D>A<><1C><1D>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>D<EFBFBD>0<>1<><17> <0A>'<27><14> .<2E> .<2E>"<22>d<EFBFBD>;S<>UY<55>6Z<36>6Z<36>^a<> <0A> <0B> <0B>B<EFBFBD>I<EFBFBD>I<EFBFBD>K<EFBFBD><15><1D><1D>/<2F> <0A> <0B> <0B>C<EFBFBD>J<EFBFBD>J<EFBFBD>L<EFBFBD>%<25>-<2D>-<2D>0<>
<EFBFBD><07><07><01>
<EFBFBD> <0B><08><08><11> <0B> <0F>W<EFBFBD>W<EFBFBD>Y<EFBFBD>_<EFBFBD>_<EFBFBD> <1E><02> <10>X<EFBFBD>X<EFBFBD>Z<EFBFBD> <1D> <1D> <1F><02> <0A><12>8<EFBFBD><14>B<EFBFBD> <0A><12>8<EFBFBD><14>B<EFBFBD>"<22>2<EFBFBD>w<EFBFBD><1C>!<21>"<22>g<EFBFBD><1B> <0B><08><08><11> <0B> <0B> <0C> <0C><0E> <1E> 6<> <1F>1<EFBFBD> $<24> <1F> <0F>I<EFBFBD>I<EFBFBD>c<EFBFBD>-<2D>.<2E> /<2F>"#<23> <1F> <0F>I<EFBFBD>I<EFBFBD>c<EFBFBD>-<2D>.<2E> /<2F> <11>K<EFBFBD>K<EFBFBD><02> <09> <09> <0B>U<EFBFBD>]<5D>]<5D> 3<> <0E>G<EFBFBD>G<EFBFBD>A<EFBFBD>J<EFBFBD> <0E>K<EFBFBD>K<EFBFBD>M<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>S<EFBFBD>,<2C>-<2D> .<2E><13>'<27>-<2D>7<>8<>B<EFBFBD>><3E>C<EFBFBD>
<EFBFBD>O<EFBFBD>Wd<EFBFBD>De<EFBFBD>jl<EFBFBD>Cl<EFBFBD>m<>qt<71>vI<02>rJ<02>N[<02>r\<02>]<02>C7[<01>6Z<36> .<2E> .<2E>6Z<36>6Z<36><5A> .<2E> .<2E> .<2E> .<2E>s$<00>J<05>HI7 <09>"
J<05>7 J <0A>J<05> J% c<00><<00>V^8<>dQhR\R\R\/#)r:<00>
start_time<EFBFBD>end_time<6D> date_format)r<>r@)rAs"r'rBrB&s"<00><00>><3E>><3E>#<23>><3E>c<EFBFBD>><3E>]`<60>>r&c#<00>"<00>V^8d\\P!44pW8d\\R44h\ WVR,,R4F*p\
P !V4PV4x<00>K, R#5i)rDz%end_time must greater than start_timer<65>N)r<>r<>r1r2r<>r<00> fromtimestampr)r<> r<> r<> r<>s&&& r'<00>!gen_date_sequence_by_time_sectionr<6E> &sk<00><00><00><0F>!<21>|<7C><16>t<EFBFBD>y<EFBFBD>y<EFBFBD>{<7B>#<23><08><0F><1C><18><14>E<>F<>G<>G<> <12>:<3A>8<EFBFBD>e<EFBFBD>+;<3B><<3C>e<EFBFBD> D<><01><16>$<24>$<24>Q<EFBFBD>'<27>0<>0<><1B>=<3D>=<3D>E<01>s<00>B
B c<04><><00>VPRPV44pVFpW$^,8XgKR# R# R#;i)u
@name 检查表字段是否存在
@param db_obj 数据库对象
@param table_name 表名
@param field_name 要检查的字段
zPRAGMA table_info({})TF)rHrA)r<>r;<00>
field_namerfr6 s&&& r'<00>check_field_existsr<73> &&sJ<00><00> <0A><14>l<EFBFBD>l<EFBFBD>2<>9<>9<>*<2A>E<>F<><03><16>C<EFBFBD><19><11>V<EFBFBD>#<23><1B><17>
<11><> <0A> <0C> <10>s<00>/=<00>=<00>=<00>Ac <04><><00>^RIpT'd\ T4wrTP PY4p.pTPPFipTPFVpRTPRTPP4RTPP4/p TPT 4KX Kk T# \P!RP\ 444^RIpL<>;i R#;i)u<>
@name 查询域名DNS解析
@author cjxin<2020-12-17>
@param domain {string} 被验证的根域名
@param dns_type {string} dns记录
@param is_root {bool} 是否查询根域名
@return void
Nz{} -m pip install dnspython<6F>flags<67>tagrWF)<10> dns.resolverrlrrAr<>r<>
<00>resolverrHr<><00>answerr<72>
r<> r<> r rWr<>)
r<EFBFBD><00>dns_type<70>is_root<6F>dnsr<73>
r r~r<>rRr<>s
&&& r'<00> query_dnsr<73> 8&s<><00><00><1C><1B>
<0F><EFBFBD>v<EFBFBD>6<> <0C><06> <15><11>l<EFBFBD>l<EFBFBD> <20> <20><16>2<><03><11><04><14><1C><1C>$<24>$<24>A<EFBFBD><16>W<EFBFBD>W<EFBFBD><01><1B>Q<EFBFBD>W<EFBFBD>W<EFBFBD><19>1<EFBFBD>5<EFBFBD>5<EFBFBD><<3C><<3C>><3E><1B>Q<EFBFBD>W<EFBFBD>W<EFBFBD>^<5E>^<5E>-<2D><12><03>
<15> <0B> <0B>C<EFBFBD> <20> <1D>%<25><14> <0B><>!<1C>
<EFBFBD> <09> <09>/<2F>6<>6<>~<7E>7G<37>H<>I<><1B><><15><14>s<00>B><00>B!C6<00>>3C3<03>6C;c<00>*<00>^RIpVP!RV4p^pV'dr\VP^44pVP^4pVR8Xd^pM4VR8XdRpM*VR8XdR
pM VR8XdR pMVR8XdR pM VR 8XdR pM^pWF,pV#)rNz"take up (\d+(\.\d+)?)\s*([KMGTP]?)rF<00>Kr[r8<00>G<>Tr)r<>i@ll )rr<>r<>r<>)<07>outputrr<><00> total_bytesrW<00>unit<69>
unit_values& r'<00>parse_journal_disk_usager<65> X&s<><00><00> <0A> <0E>I<EFBFBD>I<EFBFBD>;<3B>V<EFBFBD> D<>E<EFBFBD><13>K<EFBFBD> <0C><15>e<EFBFBD>k<EFBFBD>k<EFBFBD>!<21>n<EFBFBD>%<25><05><14>{<7B>{<7B>1<EFBFBD>~<7E><04> <0F>2<EFBFBD>:<3A><1A>J<EFBFBD> <11>S<EFBFBD>[<5B><1D>J<EFBFBD> <11>S<EFBFBD>[<5B>$<24>J<EFBFBD> <11>S<EFBFBD>[<5B>+<2B>J<EFBFBD> <11>S<EFBFBD>[<5B>2<>J<EFBFBD> <11>S<EFBFBD>[<5B>9<>J<EFBFBD><1A>J<EFBFBD><1C>(<28> <0B> <16>r&c <00><00>^RIp\PPV4'gR#\PP V4^,P 4pRRRRRRRR R
R R R /pVP VR4p\VR4;_uu_4pVP4pVP!V4PR4pRRR4RV RX 2# +'giL;i \d pRp?R#Rp?ii;i)rNrFz.jpgz
image/jpegz.jpegz.pngz image/pngz.gifz image/gifz.svgz image/svg+xmlz.webpz
image/webpr<70>r<>r*zdata:z;base64,) r<>rlrmrn<00>splitextrArbr<>r<>r<>r r<>) <09>
image_pathr<EFBFBD><00>ext<78>
mime_types<EFBFBD> mime_typer<65><00>img_data<74>
base64_strr<EFBFBD>s & r'<00>image_to_base64r<34> u&s<><00><00><15> <16><15>7<EFBFBD>7<EFBFBD>><3E>><3E>*<2A>-<2D>-<2D><19><15>'<27>'<27>"<22>"<22>:<3A>.<2E>q<EFBFBD>1<>7<>7<>9<>C<EFBFBD><16> <0C><17><1C><16> <0B><16> <0B><16><0F><17><1C> <0E>J<EFBFBD>#<23><0E><0E>s<EFBFBD>,F<>G<>I<EFBFBD><16>j<EFBFBD>$<24>'<27>'<27>1<EFBFBD><1C>6<EFBFBD>6<EFBFBD>8<EFBFBD><08>#<23>-<2D>-<2D>h<EFBFBD>7<>><3E>><3E>w<EFBFBD>G<>
<EFBFBD>(<28><1B>9<EFBFBD>+<2B>X<EFBFBD>j<EFBFBD>\<5C>:<3A> :<3A> (<28>'<27><>
<19> <16><15><> <16>s/<00>$C*<00>A(C*<00>2C<05>C*<00> C' <09>"C*<00>* D<03>;Dc<04><>a<04>\PPV4'd<>\VR4;_uu_4pVP 4P 4pRRR4X'g\P !V4M<>\V4o\;QJd2V3Rl\P!44F 'gK RM' RM#!V3Rl\P!444pV'dR#\P !V4\VR4;_uu_4pVPR4VP4\P!VP44RRR4R# +'giEL!;i \d?\PPT4'd\P !T4L<>i;i +'giR#;i \ dR#i;i)u<>
检查锁文件状态并获取锁:
- 锁不存在 → 获取锁
- 锁存在但文件为空 → 获取锁
- 锁存在且有内容 → 检查记录的线程ID是否存在
- 线程不存在 → 获取锁
- 线程存在 → 不允许获取
r)Nc3<00>T<"<00>TFq'gK VPS8Hx<00>K R#5irN)<01>ident)<03>.0<EFBFBD>thread<61> thread_ids& <20>r'<00> <genexpr><3E>(progress_acquire_lock.<locals>.<genexpr><3E>&s%<00><><00><00>(<16>&;<3B>F<EFBFBD>v<EFBFBD>2<><06> <0C> <0C> <09>1<>&;<3B>s<00> (<01>(TFr.rF)rlrmrnr<>r<>rIrr<><00>anyr<79>r}r1r<><00>flush<73>fsyncr<63> r<>)<05> lock_filer<65><00> thread_id_str<74> thread_existsr<73> s& @r'<00>progress_acquire_lockr<6B> <00>&sR<00><><00>)<15> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24><15>i<EFBFBD><13>%<25>%<25><11> !<21><06><06><08><0E><0E> 0<> <0A>&<26>!<21><12> <09> <09>)<29>$<24>-<2D> #<23>M<EFBFBD> 2<>I<EFBFBD>$'<27>C<EFBFBD>(<16>&/<2F>&9<>&9<>&;<3B>(<16>C<EFBFBD>C<EFBFBD>C<EFBFBD>(<16>&/<2F>&9<>&9<>&;<3B>(<16>%<16>M<EFBFBD>
%<25>$<24><1B> <09> <09>)<29>,<2C><12>)<29>S<EFBFBD> !<21> !<21>Q<EFBFBD> <0A>G<EFBFBD>G<EFBFBD>B<EFBFBD>K<EFBFBD> <0A>G<EFBFBD>G<EFBFBD>I<EFBFBD> <0E>H<EFBFBD>H<EFBFBD>Q<EFBFBD>X<EFBFBD>X<EFBFBD>Z<EFBFBD> <20>"<22><14>C&<26>%<25>%<25><>."<22>-<2D><19>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD>0<>0<><1A> <09> <09>)<29>,<2C><>-<2D><> "<22> !<21><14><> <14><15><14><15>s<EFBFBD><00>$G'<00>G'<00>E3<05>G'<00>+G'<00>=F<00>2F<00>8F<00>G'<00>#AG<05>)G'<00>3 F <09>> G'<00>/G<03>7G<03> G'<00>G<03>G'<00> G$ <09>G'<00>$G'<00>' G6<03>5G6c<00><><00>\PPV4'd\P!V4R#R# \dR#i;irN)rlrmrnr<00>OSError)r<> s&r'<00>progress_release_lockr<6B> <00>&s?<00><00> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20> <11> <0E>I<EFBFBD>I<EFBFBD>i<EFBFBD> <20>!<21><><17> <11> <10> <11>s<00>A<00> A<03>Ac<00>t<00>V^8<>dQhR\\\,,R\R\R\/#)r:r~rSrr=)r<>rr@r)rAs"r'rBrB<00>&s2<00><00> <13> <13>D<EFBFBD>4<EFBFBD><04>:<3A>-<2D> <13>C<EFBFBD> <13>#<23> <13>QT<51> r&c<04><><00>^RIpVPVRV 24pV'd
V^,#V# \d5\P!RP \ 444^RIpLfi;i)uH返回嵌套dict中第一个匹配到的key的value, 找不到返defaultNz{} -m pip install jsonpathz$..)<06>jsonpath<74> ImportErrorrlrrAr<>)r~rSrr<> <00>matchess&&& r'<00>find_value_by_keyr<79> <00>&se<00><00><18><17>
<17><1F><1F><04><03>C<EFBFBD>5<EFBFBD>k<EFBFBD>2<>G<EFBFBD><0E><16>q<EFBFBD>z<EFBFBD><19> <12>N<EFBFBD><4E> <17><18>
<EFBFBD> <09> <09>.<2E>5<>5<>n<EFBFBD>6F<36>G<>H<><17><18>s<00>.<00><A-<03>,A-c<00>$<00>V^8<>dQhR\/#)r:r<>r<>)rAs"r'rBrB<00>&s<00><00>\<01>\<01>S<EFBFBD>\r&c<04><><00>V'd\V\4'gVR3#^RIHpV!V4pVP R4P R4pVf^MVP R4^,p\V4V^,8:dVR3#RPW4)^,
R4RPVRV)^,
43#)u&分离域名的顶级域名, 子域名rF)<01>get_tldr<64>N) r<>r@<00> pubsuffixr<78> rIr<>rr<>r<>)r<>r<> <00>tldr<00>num_of_tld_partss& r'<00>split_domain_sldr<64> <00>&s<><00><00> <11><1A>F<EFBFBD>C<EFBFBD>0<>0<><15>r<EFBFBD>z<EFBFBD><19>!<21>
<11>&<26>/<2F>C<EFBFBD> <12>L<EFBFBD>L<EFBFBD><13> <1D> #<23> #<23>C<EFBFBD> (<28>E<EFBFBD><1F>K<EFBFBD>q<EFBFBD>S<EFBFBD>Y<EFBFBD>Y<EFBFBD>s<EFBFBD>^<5E>a<EFBFBD>-?<3F><14> <0B>5<EFBFBD>z<EFBFBD>%<25><01>)<29>)<29><15>r<EFBFBD>z<EFBFBD><19><12>x<EFBFBD>x<EFBFBD><05>/<2F><01>1<>2<>3<>4<>c<EFBFBD>h<EFBFBD>h<EFBFBD>u<EFBFBD>EY<45>GW<47>FW<46>XY<58>FY<46>?Z<>6[<5B>[<5B>[r&c<00>P<00>RP\44pRP\44pRp\PP V4'dM\PP V4'd(\PP V4'dR#R#)rxryrzTF)rAr{rlrmrn)r}r~rs r'r<>r<><00>&sk<00><00>%<25>,<2C>,<2C>^<5E>-=<3D>><3E>I<EFBFBD>)<29>0<>0<><1E>1A<31>B<>I<EFBFBD> +<2B>F<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20>R<EFBFBD>W<EFBFBD>W<EFBFBD>^<5E>^<5E>I<EFBFBD>%><3E>%><3E>2<EFBFBD>7<EFBFBD>7<EFBFBD>><3E>><3E>RX<52>CY<43>CY<43><13> r&c<00>$<00>V^8<>dQhR\/#r<>rQ)rAs"r'rBrB<00>&s<00><00><17><17>4<EFBFBD>r&c<00><><00>RP\44pRP\44pRp.p\PP V4'dVP R4\PP V4'dVP R4\PP V4'dVP R4V#)rxryrzrtrurv)rAr{rlrmrnr<>)r}r~r<00> server_lists r'<00>get_multi_webservice_listr <00>&s<><00><00>%<25>,<2C>,<2C>^<5E>-=<3D>><3E>I<EFBFBD>)<29>0<>0<><1E>1A<31>B<>I<EFBFBD> +<2B>F<EFBFBD><14>K<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20><13><1A><1A>7<EFBFBD>#<23> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20><13><1A><1A>8<EFBFBD>$<24> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>f<EFBFBD><1D><1D><13><1A><1A>?<3F>+<2B> <16>r&c<00>0<00>V^8<>dQhR\R\/#)r:<00>servicer=r.)rAs"r'rBrB's<00><00><15><15>#<23><15>D<EFBFBD>r&c<04><00>^RIHpVP4p\P!RVRV/4pVP V4pVP R4^8XdR#R# \dp\T4Rp?R#Rp?ii;i)u=
service 服务名称
type 类型:关闭,重启,开启
)<01> system_v2rr<>r<>TFN) <09>class_v2r rrir_<00> ServiceAdminrbr<>rx)r r<>r <00>server_restartrbrN r<>s&& r'<00>webservice_operationr 'sz<00><00>
<15>&<26>"<22>)<29>)<29>+<2B><0E><14> <20> <20> <12>G<EFBFBD> <12>D<EFBFBD>"
<EFBFBD> <0B><03><1C> (<28> (<28><13> -<2D><02> <0A>6<EFBFBD>6<EFBFBD>(<28> <1B>q<EFBFBD> <20><17><14><> <14><15> <0A>a<EFBFBD><08><14><><15>s<00>AA<00> A><03>( A9<03>9A>c<00>0<00>V^8<>dQhR\R\/#r[)r<>r@)rAs"r'rBrB%'s<00><00>G<01>G<01>5<EFBFBD>G<01>S<EFBFBD>Gr&c<00>j<00>^RIpVP!V4PR4PR4#)rN<>=r*)r<><00>urlsafe_b64encode<64>rstripr )r~r<>s& r'<00>base64url_encoder %'s,<00><00><11> <11> #<23> #<23>D<EFBFBD> )<29> 0<> 0<><14> 6<> =<3D> =<3D>g<EFBFBD> F<>Fr&c<00>0<00>V^8<>dQhR\R\/#r[)r@r<>)rAs"r'rBrB*'s<00><00>4<>4<>3<EFBFBD>4<>5<EFBFBD>4r&c<00><><00>^RIp\V4^,^8wd!R^\V4^,,
,MRpVP!W,4#)rNrQrF)r<>r<><00>urlsafe_b64decode)r~r<><00>paddings& r'<00>base64url_decoder *'s@<00><00><11>-0<><14>Y<EFBFBD><11>]<5D>a<EFBFBD>-?<3F>c<EFBFBD>Q<EFBFBD>#<23>d<EFBFBD>)<29>a<EFBFBD>-<2D>(<28>)<29>R<EFBFBD>G<EFBFBD> <11> #<23> #<23>D<EFBFBD>N<EFBFBD> 3<>3r&c
<00><><00>V^8<>dQhR\R\R\\,\\,,R\RR/#)r:r<>r<> rI<00> overwriter=N)r@rrr<>)rAs"r'rBrB0's><00><00>3'<27>3'<27><03>3'<27>#<23>3'<27><04>S<EFBFBD> <09>C<EFBFBD><03>H<EFBFBD>(<<3C>3'<27>PT<50>3'<27>bf<62>3'r&c<04>(aa<07>\PPV4'gR#\S\4'd
S^8XdRMRoV'd \ V4M \ 4p\PPV4'g\P !VRRR7RV3Rllp\P!V4F<>o\PPVS4p\PPVS4pV'dC\;QJdV3RlV4F 'gK RM RM!V3RlV44'dK<>\PPV4'd\WVVS4K<>V!WV4K<> R#) ue
site 递归复制文件夹
src: 源路径
dst: 目标路径
ignore: 忽略的 list
overwrite: 存在时是否覆盖
ps: ignore内的每个对象支持
*:匹配任意数量的任意字符(包括零个字符)。
?:匹配任意单个字符。
[abc]:匹配序列 abc中的任意字符。
[!abc]:匹配不在序列 abc中的任意字符。
NFTr3r@c<00>0<00>V^8<>dQhR\R\/#)r:<00>src_filer r<>)rAs"r'rB<00>cp_dir.<locals>.__annotate__H's<00><00>;<3B>;<3B><13>;<3B><03>;r&c<00>V<<01>S'g&\PPV4'g\P!W4R#R# \
d<>Rp\ RT 24wr4T'g.RT9d'Rp\ RT 24\P!Y4M M;iTRJd:\PPT4'd\ RT 24R#R#R# TRJd6\PPT4'd\ RT 24iii;ii;i)Fz
lsattr -d r<>Tr<54>z
chattr +i N)rlrmrnr;<00>copy2r<32>r<>)r r <00>lockr<6B>r<>r s&& <20>r'<00>_copy2<79>cp_dir.<locals>._copy2H's<><00><><00> <14>B<EFBFBD>G<EFBFBD>G<EFBFBD>N<EFBFBD>N<EFBFBD>8<EFBFBD>4<>4<> ;<3B><16> <0C> <0C>X<EFBFBD>0<>5<><35><1D> ;<3B><1C><04>
;<3B>$<24>z<EFBFBD>(<28><1A>%<<3C>=<3D>D<EFBFBD>A<EFBFBD><1C><13><01><18>#<23><04>!<21>J<EFBFBD>x<EFBFBD>j<EFBFBD>"9<>:<3A><1E> <0C> <0C>X<EFBFBD>8<><38><19><18><><1B>t<EFBFBD>|<7C><02><07><07><0E><0E>x<EFBFBD>(@<40>(@<40>!<21>J<EFBFBD>x<EFBFBD>j<EFBFBD>"9<>:<3A>)A<01>|<7C><>t<EFBFBD>t<EFBFBD>|<7C><02><07><07><0E><0E>x<EFBFBD>(@<40>(@<40>!<21>J<EFBFBD>x<EFBFBD>j<EFBFBD>"9<>:<3A>)A<01>|<7C><> ;<3B>sB<00>A
<00>
D(<03>AB<02>C'<02>B"<05> C'<02>%*D(<03>D(<03>'+D$<05>D$<05>$D(c3<00>R<"<00>TFp\P!SV4x<00>K R#5irN)r{)r<> rr; s& <20>r'r<> <00>cp_dir.<locals>.<genexpr>^'s<00><><00><00>O<>w<EFBFBD>V<EFBFBD>7<EFBFBD>?<3F>?<3F>4<EFBFBD><16>8<>8<>w<EFBFBD>s<00>$') rlrmrnr<>r<>r<>r<>r<>r<>r<> r_rL)r<>r<> rIr r <00>src_item<65>dst_itemr; s&&&f @r'rLrL0's<><00><><00> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>#<23> <1E> <1E><0E>#<23>I<EFBFBD>s<EFBFBD>3<>3<> <09>Q<EFBFBD><0E><05>D<EFBFBD>I<EFBFBD>%<25>c<EFBFBD>'<27>l<EFBFBD>3<EFBFBD>5<EFBFBD>G<EFBFBD> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>#<23> <1E> <1E>
<EFBFBD> <0B> <0B>C<EFBFBD><15><14>.<2E>;<3B>;<3B>&<13>
<EFBFBD>
<EFBFBD>3<EFBFBD><0F><04><15>7<EFBFBD>7<EFBFBD><<3C><<3C><03>T<EFBFBD>*<2A><08><15>7<EFBFBD>7<EFBFBD><<3C><<3C><03>T<EFBFBD>*<2A><08> <12>s<EFBFBD>s<EFBFBD>O<>w<EFBFBD>O<>s<EFBFBD>s<EFBFBD>s<EFBFBD>O<>w<EFBFBD>O<>O<>O<> <14> <0A>7<EFBFBD>7<EFBFBD>=<3D>=<3D><18> "<22> "<22> <12>8<EFBFBD>w<EFBFBD> <09> :<3A> <12>8<EFBFBD> &<26> r&c<04>r<00>^RIp^RIp^RIp\PP V4'gRRV 23#\PP V4'gRRV 23#\P!VRR7\PPV4^,P4p.ROpWV9dRRR PV4 23#VP!4pVR8Xd6VPVR
4;_uu_4pVPV4RRR4MHR
p VR9dR p M VR9dR p VPW 4;_uu_4p
V
PV4RRR4\P&!V4p V 'gR\"P$!VRR7#^p ^pRpV Fdp\PPVV4p\PP)V4'dV ^, p VfTpKYK[V^, pKf V ^8Xd V^8XdTpMTp\P&!V4F<>p\PPVV4p\PPVV4p\PP)V4'd\"P*!VVRR7K<>\"P,!VV4K<> R\"P$!VRR7# +'giEL<>;i +'giEL<>;i \d3p RR \!T 4 23uRp ? \"P$!TRR7#Rp ? ii;i \d5p RR\!T 4 23uRp ? u\"P$!TRR7#Rp ? ii;i \"P$!TRR7i;i)u-
解压压缩包到指定目标目录,支持多种格式并自动处理目录结构
:param archive_path: 压缩包文件路径(如 /path/to/file.zip
:param target_dir: 目标解压目录(如 /path/to/target
:return: (bool, str) 成功返回 (True, ''),失败返回 (False, 错误信息)
NFz'The compressed package does not exist: zNot a valid file: Tr@rBz#Unsupported formats are supported: z, r)zr:gzzr:bz2zDecompression failed: )<01> ignore_errors)<01> dirs_exist_okzThe file copy failed: )rBz.tar<61>.tar.gz<67>.tgz<67>.tar.bz2<7A>.tbz2r8)r) r* r8)r+ r, )Fz/The content of the compressed package is empty.)TrF)r<><00>zipfile<6C>tarfilerlrmrnr<>r<>r<> rAr<><00>mkdtemp<6D>ZipFile<6C>
extractallr<EFBFBD>r<>r@r;rMr<>r_r<> r )<15> archive_path<74>
target_dirr<EFBFBD>r- r. <00>file_ext<78> supported_ext<78>temp_dir<69>zfr<66><00>tfr<66><00>
temp_items<EFBFBD> dir_count<6E>
file_count<EFBFBD> first_dirr; <00> item_path<74> content_dirr<72>r<> s&& r'<00>extract_archive_to_targetr? f's<00><00><14><12><12> <0E>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27><14>?<3F> <0C>~<7E>N<>N<>N<> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>,<2C> '<27> '<27><14>*<2A><<3C>.<2E>9<>9<>9<><07>K<EFBFBD>K<EFBFBD>
<EFBFBD>T<EFBFBD>*<2A><12>w<EFBFBD>w<EFBFBD><1F><1F> <0C>-<2D>a<EFBFBD>0<>6<>6<>8<>H<EFBFBD>S<>M<EFBFBD><0F>$<24><14>;<3B>D<EFBFBD>I<EFBFBD>I<EFBFBD>m<EFBFBD><T<>;U<>V<>V<>V<><18><1F><1F>!<21>H<EFBFBD>;4<> <<3C><17>6<EFBFBD>!<21><1C>_<EFBFBD>_<EFBFBD>\<5C>3<EFBFBD>7<>7<>2<EFBFBD><16>M<EFBFBD>M<EFBFBD>(<28>+<2B>8<>7<><1B><04><1B>9<>9<>!<21>D<EFBFBD><1D>!6<>6<>"<22>D<EFBFBD><1C>\<5C>\<5C>,<2C>5<>5<><12><16>M<EFBFBD>M<EFBFBD>(<28>+<2B>6<> <18>Z<EFBFBD>Z<EFBFBD><08>)<29>
<EFBFBD><19>K<>N <0F> <0A> <0A>h<EFBFBD>d<EFBFBD>3<>I<16> <09><16>
<EFBFBD><18> <09><1E>D<EFBFBD><1A><07><07> <0C> <0C>X<EFBFBD>t<EFBFBD>4<>I<EFBFBD><11>w<EFBFBD>w<EFBFBD>}<7D>}<7D>Y<EFBFBD>'<27>'<27><19>Q<EFBFBD><0E> <09><1C>$<24> )<29>I<EFBFBD>%<25><1B>a<EFBFBD><0F>
<EFBFBD><1F> <15><01>><3E>j<EFBFBD>A<EFBFBD>o<EFBFBD>#<23>K<EFBFBD>#<23>K<EFBFBD><17>J<EFBFBD>J<EFBFBD>{<7B>+<2B>D<EFBFBD><14>'<27>'<27>,<2C>,<2C>{<7B>D<EFBFBD>1<>C<EFBFBD><14>'<27>'<27>,<2C>,<2C>z<EFBFBD>4<EFBFBD>0<>C<EFBFBD> @<01><15>7<EFBFBD>7<EFBFBD>=<3D>=<3D><13>%<25>%<25><1A>O<EFBFBD>O<EFBFBD>C<EFBFBD><13>D<EFBFBD>A<><1A>L<EFBFBD>L<EFBFBD><13>c<EFBFBD>*<2A>,<2C><18> <0F> <0A> <0A>h<EFBFBD>d<EFBFBD>3<>o8<>7<>7<><37>6<>5<>5<><35><18> <<3C><18>2<>3<EFBFBD>q<EFBFBD>6<EFBFBD>(<28>;<3B>;<3B> ;<3B>X <0F> <0A> <0A>h<EFBFBD>d<EFBFBD>3<><33>[ <<3C><>L<1D> @<01><1C> 6<>s<EFBFBD>1<EFBFBD>v<EFBFBD>h<EFBFBD>?<3F>?<3F>?<3F> <0F> <0A> <0A>h<EFBFBD>d<EFBFBD>3<><33> @<01><> <0F> <0A> <0A>h<EFBFBD>d<EFBFBD>3<>s<EFBFBD><00>$!L<00>K2<05>L<00>N<00> .L<00>L<05> L<00>(N<00>N<00> CN<00>=>M<02>;N<00>=M<02>N<00>2 L <09>=L<00>N<00>L<00> L <09>L<00>N<00>L<00> M<03>%M<03>4M<03>5N<00>M<03>N<00> N<05>%N<05>4N<05>5N<00>N<05>N<00>N6c<04>a<00>V3RlpV#)u<>
返回消息体中带有约定字段 'ssl_site_id' 则尝试申请ssl, 支持 ip ssl,域名ssl
尝试创建关联的dns记录.
关联site, 在site list页面中显示进度,日志
c<00>.<<01>S!V/VBp\VRRR7pV'd)\RV 24^RIHpV!\ V44V#V# \
d@p^RIp\TP44\R\T4 24Rp?T#Rp?ii;i)<06> ssl_site_idN)rSrz5Trying To Auto Apply SSL For The Site... Site ID is: )<01>apply_ssl_with_siteIdzAuto apply SSL failed: ) r<> r<><00>ssl_domainModelV2.servicerC r<>r<>r<>r<>r@)r<><00>kwargsr<73>rB rC r<>r<><00>funcs*, <20>r'<00>wrapper<65>!try_to_apply_ssl.<locals>.wrapper<65>'s<><00><><00><15>t<EFBFBD>&<26>v<EFBFBD>&<26><06>'<27><06>M<EFBFBD>4<EFBFBD>P<> <0B> <16> ><3E><19>Q<>R]<5D>Q^<5E>_<>`<60>K<>%<25>c<EFBFBD>+<2B>&6<>7<>
<16> <0A>v<EFBFBD> <0A><> <1D> ><3E> <20><19>)<29>.<2E>.<2E>0<>1<><19>3<>C<EFBFBD><01>F<EFBFBD>8<EFBFBD><<3C>=<3D>=<3D><15> <0A><>  ><3E>s<00>%A
<00>
B<03>4B<03>Br%)rF rG sf r'<00>try_to_apply_sslrI <00>'s<00><><00> <16> <13>Nr&c<00><00>V^8<>dQhRR/#)r:r=Nr%)rAs"r'rBrB<00>'s<00><00>;<3B>;<3B><04>;r&c<04>`<00>RP\44p\PP V4'dE\P
!V4pVF(p\P !RPW44K* Rp\PP V4'd\PP RPV44'dK\P !RPV44\P !RPV44RP\44p\PP V4'dE\P
!V4pVF(p\P !RPWB44K* RP\44p\PP V4'dG\P
!V4pVF(p\P !RPWR44K* R #R #)
u-
@name 清理临时文件缓存
@return void
z{}/data/compress_cachesz rm -rf {}/{}zYakPanel/static/vite/jsz{}/loginLogs.js.mapzrm -f {}/*.mapz rm -f {}/*.gzz{}/tmpr<70>
N)rAr<>rlrmrnr<>r)<06>compress_caches_path<74>dir_listr<74><00> vite_pathr<68>
<00> temp_paths r'<00>clear_tmp_filerP <00>'sr<00><00> 5<>;<3B>;<3B>N<EFBFBD><L<>M<><18> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>*<2A>+<2B>+<2B><15>:<3A>:<3A>2<>3<><08><19>A<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>n<EFBFBD>+<2B>+<2B>,@<40>D<> E<><1A>*<2A>I<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>/<2F>6<>6<>y<EFBFBD>A<> B<> B<> <0E>I<EFBFBD>I<EFBFBD>&<26>-<2D>-<2D>i<EFBFBD>8<> 9<> <0E>I<EFBFBD>I<EFBFBD>o<EFBFBD>,<2C>,<2C>Y<EFBFBD>7<> 8<><17><EFBFBD><EFBFBD>~<7E>/<2F>0<>H<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>h<EFBFBD><1F><1F><15>:<3A>:<3A>h<EFBFBD>'<27><08><19>A<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>n<EFBFBD>+<2B>+<2B>H<EFBFBD>8<> 9<><1A><19> <20> <20><1E>!1<>2<>I<EFBFBD> <09>w<EFBFBD>w<EFBFBD>~<7E>~<7E>i<EFBFBD> <20> <20><15>:<3A>:<3A>i<EFBFBD>(<28><08><19>A<EFBFBD> <0E>I<EFBFBD>I<EFBFBD>n<EFBFBD>+<2B>+<2B>I<EFBFBD>9<> :<3A><1A>!r&c<00>F<00>V^8<>dQhR\\\3,/#r<>)r<>r<>r@)rAs"r'rBrB<00>'s<00><00>%<11>%<11>5<EFBFBD><13>c<EFBFBD><18>?<3F>%r&c<04><><00>\4p\P!V4pVP^8<>d*VP^8d^\
P !R43#\P!V4pVPR8d^\
P !R43#RPV4p\VR4'dB\PPV4'd\P!V4R #R #^\
P !R43# \d/p\!RP\#T444Rp?R #Rp?ii;i)
u^
@name 检查磁盘状态
@return int 1:正常 2:磁盘已满 3:磁盘不可写 4:Inode不足
zDisk Inode is exhausted, unable to access the panel database. Please log in to SSH to manually clean up the disk and try again!z<>Disk space is insufficient, unable to access the panel database. Please log in to SSH to manually clean up the disk and try again!z{}/data/db/test.txt<78>testz"public.check_disk_status error: {}Nz<4E>Detected that the panel directory is not writable, unable to access the panel database. Please login to SSH to check, ensure that the 'panel/data' directory is writable, and then try again!i)rDrF)r<>rl<00>statvfs<66>f_files<65>f_favailrir2r<>r<> <00>freerArsrmrnrr<>r<>r@)r<><00>inode<64>diskrs
r<>s r'<00>check_disk_statusrZ <00>'s8<00><00>
 <20>!<21>J<EFBFBD> <0E>J<EFBFBD>J<EFBFBD>z<EFBFBD> "<22>E<EFBFBD> <0C>}<7D>}<7D>q<EFBFBD><18>U<EFBFBD>^<5E>^<5E>a<EFBFBD>/<2F><10>&<26>+<2B>+<2B> P<01>
<EFBFBD>
<EFBFBD>
<EFBFBD> <12> <1C> <1C>Z<EFBFBD> (<28>D<EFBFBD> <0B>y<EFBFBD>y<EFBFBD>:<3A><1D><10>&<26>+<2B>+<2B> P<01>
<EFBFBD>
<EFBFBD>
<EFBFBD> &<26>,<2C>,<2C>Z<EFBFBD>8<>I<EFBFBD><10><19>F<EFBFBD>#<23>#<23> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>)<29> $<24> $<24> O<01><12> <09> <09>)<29>$<24> <11>L<EFBFBD> %<25> <11>L<EFBFBD> <11>&<26>+<2B>+<2B> t<01>
<EFBFBD>
<EFBFBD>
<EFBFBD><EFBFBD><1D> O<01><19>><3E>E<>E<>c<EFBFBD>!<21>f<EFBFBD>M<>N<>N<> <11>L<EFBFBD><4C> O<01>s<00>#D<00> E<03>!#E
<03>
Ec<00>$<00>V^8<>dQhR\/#r<>r )rAs"r'rBrB(s<00><00><18><18>S<EFBFBD>r&c<00><><00>Rp\PP\4R4p\PP V4'dY\ V4pV'd@VP 4P4'd\VP 44pV#\h\h \d2\RT4p\TR4p\T\T44T#i;i)r<>zdata/session_timeout.pli,r<>
)rlrmr<>r<>rnrqrIr r<>r<>rrrsr@)<03> sess_expired<65>sess_expired_path<74>sess_expired_contents r'<00>get_session_expiredr` (s<><00><00><18>L<EFBFBD><1A><07><07> <0C> <0C>^<5E>%5<>7P<37>Q<><15> 8<> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>+<2B> ,<2C> ,<2C>'/<2F>0A<30>'B<>$<24>'<27>,@<40>,F<>,F<>,H<>,P<>,P<>,R<>,R<>#&<26>';<3B>'A<>'A<>'C<>#D<>L<EFBFBD> <18><17>$<24>O<EFBFBD><1B>O<EFBFBD><4F> <14>8<><1A>3<EFBFBD> <0C>-<2D> <0C><1A><<3C><1A>4<> <0C><11>#<23>S<EFBFBD><1C>%6<>7<> <17><17> 8<>s<00>AB/<00>B/<00># B/<00>/8C+<03>*C+c<04>f<00>^p\V\4;'g)\V\4;'dVP4pV'd \V4MRpV'g\V4P 4MRp\
P !RR.4F<>pRpV'dVPR,V8XdRpM(VPR,P 4V8XdRpV'dn\
P!VPR,4pV'dVP4MVP4VP^R7V^, pK<>K<> V# \
P\
P\
P3dEK\
PdEKi;i)u<>
参数:
:param target: 进程名(str)或进程号(int/str)。必须完全匹配,不支持模糊搜索。
:param force: 布尔值。True 为强制杀死 (kill)False 为温和终止 (terminate)。
返回:
:return: 成功处理的进程数量 (int)
Nr<EFBFBD>rFTr<54>)r<>r<>r@r rAr<>r<> rZr<><00>kill<6C> terminater<65><00> NoSuchProcess<73> AccessDenied<65> ZombieProcess<73>TimeoutExpired) r<>r<>r<00> target_is_num<75>
target_pid<EFBFBD> target_name<6D>proc<6F>is_matchr5s && r'<00>kill_process_strictlyrm /(sF<00><00> <0E>E<EFBFBD><1E>v<EFBFBD>s<EFBFBD>+<2B>]<5D>]<5D>
<EFBFBD>6<EFBFBD>3<EFBFBD>0G<EFBFBD>0\<5C>0\<5C>F<EFBFBD>N<EFBFBD>N<EFBFBD>L\<5C>M<EFBFBD> -<2D><13>V<EFBFBD><1B>4<EFBFBD>J<EFBFBD>-:<3A>#<23>f<EFBFBD>+<2B>#<23>#<23>%<25><04>K<EFBFBD><16>#<23>#<23>U<EFBFBD>F<EFBFBD>O<EFBFBD>4<><04> <15><1C>H<EFBFBD><1C><17>9<EFBFBD>9<EFBFBD>U<EFBFBD>#<23>z<EFBFBD>1<>#<23>H<EFBFBD><48><18>9<EFBFBD>9<EFBFBD>V<EFBFBD>$<24>*<2A>*<2A>,<2C> <0B>;<3B>#<23>H<EFBFBD><17><1A>N<EFBFBD>N<EFBFBD>4<EFBFBD>9<EFBFBD>9<EFBFBD>U<EFBFBD>#3<>4<><01><18><15>F<EFBFBD>F<EFBFBD>H<EFBFBD><15>K<EFBFBD>K<EFBFBD>M<EFBFBD><12><06><06>q<EFBFBD><06>!<21><15><11>
<EFBFBD><05><18>5<>: <11>L<EFBFBD><4C> <17>$<24>$<24>f<EFBFBD>&9<>&9<>6<EFBFBD>;O<>;O<>P<> <15> <14><15>$<24>$<24> <15> <14> <15>s+<00>AE<02>,.E<02><E<02>4F0<05>F0<05>*F0<05>/F0c<00><><00>RpRRRR/p\P!V4pV'd\P!V4pV#V# T#;i)z3/www/server/panel/data/multi_webservice_status.conf<6E>phprt<00>wprv)rirqrorp)<03> conf_pathrrss r'<00>get_default_site_confrr ^(sX<00><00>E<>I<EFBFBD> <0A>w<EFBFBD> <0C>o<EFBFBD><06>G<EFBFBD>
<12>?<3F>?<3F>9<EFBFBD> %<25>D<EFBFBD> <0B> <11><1A>j<EFBFBD>j<EFBFBD><14>&<26>G<EFBFBD> <13>N<EFBFBD>7<EFBFBD>N<EFBFBD><4E> <11> <10> <12>N<EFBFBD>s <00>A<00>A)Nrr9)Nr<4E>Nr&)rJ
)r%)r%rFr%)r%F)NTNNNro)r<>)g<00>?r=)zssl/certificate.pem)<01>xr<> )NN)roN)r:N)rrNr<>)rD<00> rFz 1,2,3,4,5,8r<38>)r<>)<02>GETr&)rt)r1)<02>drv )Fr)rFrF)Nr<4E>) rbr<>r;rnrr r#r(r,r1r5r4rjr<>)Fzyakpanel login reminder)r<>)FzYakPanel email alert)ro)rFror^)<01>DEBUG)r! )zw+)<04>tcpr<70>rN)rx r<>r)rDNr<4E>)z
ssl/ca.pem)rT<>OKNNN)Tr)r))r<>)r)<01>)r^r^z%Y%m%d)<02>AF)<01>restart)NT(9r<>r<><00>
contextlibr{<00>gettextr3ryrorlr<>rr;r<>r<>rr<>r<>r<>r>rrrrr<> <00>werkzeug.datastructuresreri<00>
exceptionsr<00> regexplibrGr r
<00>
structures<EFBFBD>toolsr rEr r <00>aap_t_simple_result<6C>aap_t_mysql_dump_infor(rmrnr<>r~r<>r2<00> settings_file<6C>settingsr<73>rprbr<>r<00> translationr<00>installrrfr)r`rr2<00>setdefaultencodingr8rJrPrXrhryr{r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rr<>r&r+r<>r0r6r8rDr.rXr@rVrardrgrirkr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rr
r*r5rJrVrYrbrmrtrvryr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rr rrrr<rNrUr[r_rir<>ryr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rrr rr#r'r*r<>r/r1r6r r4r>r6rDrHrKrMr[r<>r_r<>rxr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rrr#r*r.r`r=rYrNrOrmrvr}r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rRr<>rrrr rrr$r(r+r-r4r7r<>r<>r?rCrFrOrYr`rmrr<>r<>r<>r5r<>r<>r<>r<>r<><00> ascii_lettersr<73>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rrr rr<>rr<00>key_filter_listr<74>rpr<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>rr
r rrr"r%r'r,r<>r^r8r:rrKrCrIrKrNrPrRrVr<>rYr\r_rerjrqrsryr|r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r(r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r<>r r r r r r r& r( r- r0 r3 r< rA rD rF rH rL rO r<>rV r<>rY r<>ra rj rh r<>r<>r<>rz r| r~ r<> r<> r<> r<> r<> r<> r*r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<>r<> r<> r
r
r<> r
r%
r'
r,
r1
r5
r;
r?
rS
rK
rL
r_
rb
re
rj
rm
rq
rt
rz
r|
r~
r<>
r<>
rm r<>
r<>
rMr<>
r<>
r<>
r<>
r<>
r<>
r-r<>
r<>
r<>
r<>
r<>
r<>
r r r r r r r r& rG r<>r<>rW rY r{r<>r<>rqrg r^rk rsro <00>contextmanagerrq ru r} r~ r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<> r<>r r r r rLr? rI rP rZ r` rm rr r%r&r'<00><module>r<> s<> <00><01><0E><0F><11><0E><0E> <0B><10> <0B> <09> <0A> <09> <0A> <0A> <0A>
<EFBFBD><0F><10> <0B> <0A><1D>!<21>!<21> <0C><1E> <0A>"<22><18>'<27><19><1C>(<28>)<29><13>-<2D><15>@
<EFBFBD>F:<3A><04><05>7<EFBFBD>7<EFBFBD>><3E>><3E>$<24><17><17> <0A>d<EFBFBD>C<EFBFBD>'<27> *<2A> *<2A>d<EFBFBD><13>y<EFBFBD>y<EFBFBD>{<7B><04>
+<2B>I<01>M<EFBFBD><11>H<EFBFBD>J <0A> <0A>7<EFBFBD>7<EFBFBD>><3E>><3E>-<2D> (<28> (<28><15>m<EFBFBD>S<EFBFBD>7<EFBFBD>;<3B>;<3B>t<EFBFBD><1F>:<3A>:<3A>d<EFBFBD>i<EFBFBD>i<EFBFBD>k<EFBFBD>2<><08><1F>|<7C>|<7C>K<EFBFBD><14>6<>6<>@ 8<>9<>H<EFBFBD>G<<3C>H#'<27>H<EFBFBD>Y<EFBFBD> <1F><15>m<EFBFBD>S<EFBFBD>7<EFBFBD>;<3B>;<3B>t<EFBFBD><14>
<EFBFBD>
<EFBFBD>4<EFBFBD>:<3A>:<3A>h<EFBFBD>q<EFBFBD>9<>:<3A><<3C>;<3B>M )<29>Z <0A><18><18><14>)]<5D>jn<6A>io<69>p<><02><02>
<EFBFBD>
<EFBFBD> <0C><06>J<EFBFBD>J<EFBFBD><01><13> <0B> <0F><08><14> <0A><06><13><13>A<EFBFBD><16>!<21><1B>
<EFBFBD>3<EFBFBD>K<EFBFBD><07><1A><1A>6<EFBFBD>"<22> <20>  <20> <11><11><17><17>
D<01>D<01>
<1B>B<EFBFBD><12>,<12>T!<21>!"<22>2<EFBFBD><12>.!#<23>A<EFBFBD> 1<><10> <19><18><1F>(<13> 4<> :<3A>)<29>*<2A>6*<2A>(<28>R<1E>l %<25> &<26> <12> <10> Z<01> Z<01> <10><19><13> <0A>2&<14>R&<26><19><16>:<3A>
<14><17>4<18> <1E>(<28>
<0F><17><13>""<22><1D>
$<15>N<1A>-<12>`<1B><14>&9<10>x(<1D>V<10>0<10>&&<26><1D>0<12><15><19>B<01><18>'<27><10>$J<12>J<12>Z 1<> 1<>"<<13><<13>@<13>*2<> %<25><15>( <10><1C>\<01>P<01>@ <10> <14> <06> <1B>*<1D>\<11>-<2D>d<14>&<11><11>N<01>-<2D> $<24>.<2E>(<28>4<11>2<>-<2D>($<24>:P<10>f$<11>V<15><10>$!<21> <13> <10>(<28>3<> @<10>H=<17>~<12><15>: <0A>4<0F>(
<11><1A><10><15><12>'<0F>V-<2D>,<11>0<10>3<>  <20> <12><14>0 <0A>><11>'<27> =<3D> <11> <0A>k<01>" <14> <14>"g<01>
:<3A>
k<01>" <10>"k<01><0F> <0A> *<2A><1D> <10><10><10>
<10>#<23><13>'<1B>T<1E><10>4!#<23>9<16>z" <0A>L <15><10>
<10><10>. G<01><10> <19>"<12>.<12>"<0F>.<1B><10>&<10>"<10>$<1B>,<1B><10> <17> <17><17>x0<11>f<1B>&<11>("<22> N<01>$0 <0A>f)<29><<1B><12>&<15>,$<13>N #<23><12>><12><1B>6I<01>*<12>6&<26>$<10>&<10>6<1F>,<10>^ <11> <11> <14> <14><1F><12><15>"<10><1D><1A>(<28>(<28>$<24><10><18>" 0<>
<12> <11>3<><16><10>,@<01>2<13> E<01>0<>&
G<01>
G<01>!<21>
<18><14>(<10>,<11>(<11>4<1B><1B>.<10><10>&!<10>!<10>H0<10>0<10>j <12><0F>D&<0F>R <10> .<2E>V<01>  <0A>*<14>2,"<22>^<1A><16>!5<>!5<><06> <0A> <0A>!E<>;<3B>
<12> <0F> <11> <0A>*K<19>^<14>$T<01> <20>  <20> <1F>
)<29>
<1D>+<2B>
B<01>F<12>"G<01><12>z<EFBFBD>z<EFBFBD>-<2D>.<2E> <0C><12>
<EFBFBD>
<EFBFBD>6<>7<> <0A>Y<01><0F>x*<2A>x*<2A>xJ.<2E>J.<2E>\<14>@
A<01>A<01>A<01>A<01>A<01>&<1B><1B><1B>"
<1E> K<01> <15>+<18>\ <0F><1F>F$<18>Ph<1F>t <1C>$#<23><0F>
<10><15>4&<26>
 <0A>$<24>
2<>/<2F> <17><1A>/<2F>
<1F>
<1D><16>,/<2F>( )<29> ;<3B> <20>T<EFBFBD>T<EFBFBD><12>2)+<2B><12>
A<01>"$<24>"<22>
6<><14><11>b<EFBFBD>;<3B>79<37> Z<01> <11> <11><10>&<10>$ +<2B> <10>& !<21>
<10><1B>.<17>(%<25>8<> ;<3B>)<29><1B>$ <19>[<01><<1C>~ ;<3B> ;<3B> ;<3B> 5<> <10> <0A>*<11> 1<> 3<> ><3E> <18>6<18>4$<1B>N <16> <0F>2<1C>"'<1C>T  <0A>F<10>B<1C><14>%<10>P)<29><11> 0<> <15> $<1B>N <13> %<10>P<12>&<10>@ <12> <09> 1<><11>4<>*
<0F><10><04>
<0E>
<0F> <12>4<12>D<0F>6<17>" <18> "<22><10>:<10>2 <0F><11>=<3D> -<2D>
<15>!<21>
<15>!<21>6<>8<>
<0E><0E>> <14>-<11>` <0F> <0F>2<0F>*<11>"<11>.<11>,<11>,*<2A>*<2A>*<2A>*<2A>
<11> *<2A> *<2A>*<2A><12>6&<26>0<15>&&<26>(<15>*><11>B<16>$
$<24>P<01>8 <16>( <17>/<15>d<12>@<12>8<12>B+<17>\<10>0<17>* <12>&<26>(%<25>:q<01>8:<16>z B<01> E<01>N<01>2*<2A>,-<2D>$<0F>0 <11><0F>, ,<2C><1A><16><U<11>p<14>*<19><<10><10>2&<26>D
<10> +<2B>$<06>P
/<2F>(<12>V<1B><1B>>0 <0A>f3<1B>l <15> <15> <17> 0<>" &<26>  <0A><w<01>@ <0F> <0F><0F><0F><0F>.$<24>S<01>2<> <06>[.<2E>~T<1C>T<1C>p&<26> +<2B> '<27><19>/<2F><12>@$<24>%<11>%<11>P<19>* <15> -<2D><14><14> <0C><1A><1A>  <20><1B>  <20>7<>7<>
<12> <12>F<16><15><1F>,<2C>" <0F><04> <10> <17>"%<25>*<13><13><1F><1F>9<>9<><17><17>']<02>']<02>V><3E>><3E><11>$<15>@<17>:<16>@2<15>j<11> <13> <13>\<01>\<01>&<11><17><17>$<15><15>,G<01>G<01>
4<>4<> 3'<27>3'<27>lW4<>t<13>,;<3B>;<3B><%<11>%<11>P<18><18>&,<11>^<13>c
+<2B> *<2A> *<2A><><<3C>;<3B>;<3B><>J<<3C>;<3B>;<3B><> <0A> <0C>sU<00> s-<05>* t)<00> t)<00>At<05> t)<00>>$t<05>"t)<00>- s> <09> t <09> t)<00> t& <09> t)<00>&t)<00>)t.