From 0cdad100b6bef7c8627e41c8e1be53c72cc1f197 Mon Sep 17 00:00:00 2001 From: punix Date: Sat, 3 May 2025 17:58:19 +0200 Subject: [PATCH] part two more optimization with app_config file --- .idea/workspace.xml | 48 +- __pycache__/cls_mth_fc.cpython-312.pyc | Bin 25421 -> 26419 bytes __pycache__/manage_tunnel.cpython-312.pyc | Bin 0 -> 12893 bytes __pycache__/wp_app_config.cpython-312.pyc | Bin 8883 -> 8928 bytes cls_mth_fc.py | 190 +++---- manage_tunnel.py | 15 + ssl_decrypt.py | 6 +- ssl_encrypt.py | 13 +- wirepy.py | 652 ++++++++++++---------- wp_app_config.py | 1 + 10 files changed, 493 insertions(+), 432 deletions(-) create mode 100644 __pycache__/manage_tunnel.cpython-312.pyc create mode 100644 manage_tunnel.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 3af9204..e22a54e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,8 +5,12 @@ - + + + + + - { + "keyToString": { + "ASKED_ADD_EXTERNAL_FILES": "true", + "Python.INSTALL.executor": "Run", + "Python.cls_mth_fc.executor": "Run", + "Python.install.executor": "Run", + "Python.main.executor": "Run", + "Python.messagebox.executor": "Run", + "Python.start_wg.executor": "Run", + "Python.testtheme.executor": "Run", + "Python.wg_func.executor": "Run", + "Python.wg_main.executor": "Run", + "Python.wirepy.executor": "Run", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.git.unshallow": "true", + "Shell Script.install.executor": "Run", + "Shell Script.run_as.executor": "Run", + "git-widget-placeholder": "28-04-2025-more-methods-and-optimize-methods", + "last_opened_file_path": "/home/punix/Pyapps/wire-py", + "settings.editor.selected.configurable": "ml.llm.LLMConfigurable" } -}]]> +} diff --git a/__pycache__/cls_mth_fc.cpython-312.pyc b/__pycache__/cls_mth_fc.cpython-312.pyc index 3e3e5a962e62f1b0c737f31e1a2cf8fc8c9c78af..b250738e7093043a4d3def650f62d29f7bbcd3d5 100644 GIT binary patch delta 4720 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 delta 4052 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 Iplsy-04Rm}jsO4v diff --git a/__pycache__/manage_tunnel.cpython-312.pyc b/__pycache__/manage_tunnel.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50273d04311b3c76229d191a87570b7caf8abbaf GIT binary patch literal 12893 zcmdTrYfM{bmiPK?Y-1Y&7%;&=NHEV367py=4IvQ7gOEU*;5=O8djT82dhaC!*R)-! zKj=^axI zz7C;DXJx@(6g^n~TRx+X>=7F(W;y4D!vt0dj+&2#O34 zLDEH%h${k$pwgujab-XiRJ+tcjY}iuRRL{K=h6lBF1?sn2l9djmmz3$8O6LNU~-wD z4ox86l`lfG%Pc~R%OXOBO94l+P0gj|xhT8wZl6lc7BvEoe_(9Sny9ERggakw|AaG~xrMQ|xG;Q!D6BM>tqdqSuC_6$^g03%omgXjykf0f)uX4So1@+)WBtQ$QlRlR7X8I}uOD6NpJwR>{ zG~psC0%SqDl$3>1y`yreXf>s#HI#zZ(mL@^PwPs7dqkB^Da|{o?D+F&190j_6qGiH zY80uaOgRO}M=p_18}x*ppsbXhHdA@j;eJ};RWGy*;Rl<@oJ zZ4(NBLz?*bk-FiLIuIk=naL#xPAf6_brL2+sRRiPaR!O*H%gccIkSZOrAd(p0Hu0v z5?rA~rpOO7BgvsDBpL`!F-qQ3eV7@?G#MjVBUh9yt(G`RVoJl6Nc0#m6;n|Lta4gS8Q)S~A!gN#o-)PK zn2O35F%|Rs=l3gTwkn=&FP4?XwAjDg9=@fa%wqdmu2L!)(@OoLEaQ6#>{Bi0kly;M zB}|6?S{auxQFfVmnbyU$G2In{)yA|pVTr$|z#Mal+aYoL>m*EuIc?U zDHM4cr853z36mkU<$LfHAE@7fvO5V%P6dczZ z)>6*=WLGR@8$U`A%ztogQa%3N5+=hKnbXI1nJ!_{dY#UTsW)#W3YQh7DI=y;+6=_)+7KiB($y$8Nl>M@Mj0n}NFq{YR5@ke zoO@Iyt!>zyg#Tr!j0~mS3_a_RsQx1oCPT563Ti7=NjYMMQ7u(_i(~q~DkJiLD9VP*|>&eUI~-e<#+Vs zg2X99$|CokyC~8BLL=j$>YQ`_vcw_7oHOG!nJQsY?VxL9Pj6XwgMMxzXHGuxDXAVA zQnh%RL&DQ+~gdT+lKe7RI3c7HpO#v zLZ(aDQ|~7wstljs>a_8xJF1>)*qongq?$%Ga$l!3lo9nnMol$~kOV#T|BL3-g6k(& zbDGlB5Um7DPAW)Zh#=u_R(e{=~8}6z!1KS9uXxb#}_A!$z z#UapOrcG~}K$;?)B)Mo#xqMiUMN*#1YFOAukakRZ11&tC^RUF}e^bI__)O`Yx&52c zOcLoaIa{N3S3Ch9<>RItqJfMC-6R-sqZ1y6a(G4K*MY_|8?_J60ou!nHr`XOyWw@z zeD2uO?3(&!EbdeadA^X316!N&F@l=&abOthu}W?#0@YSvafdG$2{YUQhi4doV|dCj z!O~1~b90|SGEwyeH`25ZjCdU#@`fp2X!Hr$vi5s;qNaYvcLmJ$6ZDkhkRxjBpBN7K zyqR2HSBQ#)eId?qXbtaX2GtjV%!3|5*W5J2gc(66;z4#)&_XAWDCoF=o4yLByFhxL zkft>&79#|8DCiCNz>^RLGuVr606|5CC&B7Z_g+xphy;CBeu4^zIfz~e4*UXwCKP6Z zo&e<4EQh`Zy=Q_81IlpFCgWkp++0A=(^pXzBFfMqPml)GsSrCKEj;D9+U#iE1+(R0 zJYJ4w*eXE@Jrb0`FcmG9`__zgXR?AK6pk8XX*dK^DC`zz-i=+1n$o7dLmYLL^Du)( zub_bjd{<}&&qW3mO~C|n==Ovtu@uXwk!JR=NvV z2r6U|RN!NwVDyoIj}r{gJ2w}0Q=%gU3Nz>&5cDUyh6dc-y(hZ_J+iw|b`0A3LLN+$ zd(syIsSAeQQys^;-2EMcJp&Bb4TPW^7(6SeCmA0|R>O`>a6a(Tc*7BJ&USUQ zJu4`}Eczu-stg|7f{~$FnuGDs0g4s!*ool?6ZX<9D;U!rqwoY5ncxI1EIno_0tm}7 zAUZ}+LODSla1V#C!U_n%dgTP;uNLK;1U(gJ5AW%lo zB7{{WHu0^7D6rkAxL)z&${E!)&8jXxsk8GsdqTH$UEw12HLE36$&yySq;+*` z^)27L@8EX7}0i)P0bl#8PYYx_DunrfD}rAo?gOkJP)@f)+M$4a2AYlyPyTU+P1E-F__ z8)uHE%C;?>oo}8w@zA_=VcTcs?TbHH9{jAK<9;Cis_V0E*J@GeT-`$F(vC#Y0jSd2 zwoI*-Ig(|Kd|Bh-;7Zx9*-og}+V-%lV$L(aeOCKbVe#zbj}I=it`u%twbv%?Exf%Y zY2VM=_utSh97YmM__{IJ!8rGz?9?!Z#dQwN)l<^}MbA-u`66VZPz; zeLLUKm*^i#_S1Yn9UqDC{jVq3D@iuWv(a@>n8_~1*Whs>yA|IOM33Tx;xU5LNJIcE z{op0H)4fIrqj&dBfuHXXQIrt9INezg@m~{*$TX-d=uh?@HD2xg#m(?oS4m z%UAYvJy7s_j>q?$h&xZt9bdI?z12J4yD)rjDB1Kf-}G|4@$h}}e*JxWyuL4CKfPMt zmaIR>*B^{K4=tZrjxGn{J5J2?Jgls_b!Gm_V!_|URvq<=$CfVMZ-21+*X{q(9&b3C za15jz+men}-qD(Hw0&jYp0u~|_O_*S%Yg?y@mDX#FZ<%-ugBRp;=5xYfuo8Z9C}5s zV%1)Kt8c#Vb9>`gfSs5>v8elGD7ohtzvozdch3VdzUz3xe&WyDc*5TJ&}P47oHr(I zb-b-^u^?e4T5h7;sSX@F{et{oL|{07gTA%f715pzK{1UpWxei9&Ae< zzrY{Akg#2Z1-ziTW4LX&H}KKS_B zVMQly(8G#jC|v}wJbM)9(z)}vO07eR^$C*LQv0|B&Z@8R2z&B4AC4D5t!+;pZ-EU7 zXz799eH$PNi|r9X>Wfy5*4e5b^}O5jyH&GDX#+~Up!GM#U8`mXvg8s!=9gAG zrcFgddgVVW`qhw0>U5Y|JMc}aMSXt1Hnkf`se|evjrI!?@h|l1p+fB!`66DdcO6oG zQE3=zQGU@<0=S?n#I&LU(}N_W;KA znXil~pBFX(x4$B$LhEB%ajjHEKv)4awhfOQ)&O&KbB-K$aZCYiw_qS4rlyqR;7(_( zo0p2^7&pMHLSB}gXkrRVEjkAjlm_9bVpxO#1H_qVFH@y>IW#g^MRI+A%~bg zmKQU`j4@Lze^fVZ_7T&Tm>EU@L9S_Q%$n|b%mSD=mV+>kYi1R34V2KgER^W>pDu`5 zsA6n!x{xY~6`~;?E2L~xDLBLn;a!>dZcEJK&pLhOsiev!6K}dGR`j;@JGksQTm`Yh z*p^t)h-!dvRz#2HN!n66mdQFejA5cdSm&WAP?On42Ni;Z&RA8Aj*MF7%odFrF7$@L zC>im1=}S?~g?^f5E(zqJsOrFhmYt#rvxduh4Oc&dF{Cxr!q;$Fu4ypAp{=2^zlO%Z z8Y=c{223!7w+7-Q)=;}!!|0u$?MQb_P#*0YctSSzF?J;DBuhsy_CvqHQlcp^3B}xi zlyj=m=0(64qFDxA@MstW!&hiQIZAWRVlb-$thiSN9hxWsGzirqJ1Emo$}L(kYA`o~ zEQ3)2(NGe|VS)4tB*naeb&?|jIVzB2X*E@>1A@;GKu()IIxq`@bckaGZAQp~5`>JF zZrXHZCZHC!7!qlEo`wv%445O3L<=&iYK~boiG_a-5`UXmHxiXqGrCk!>5a?RFRv8U zJ|YzQ#+j~EP2HWBZol;Yp_$%PN#%l*FKKwUXI%~NK&jMQe`J2wJZDPiwx@I!5!WSj zRjHziM}$hh14^5>%qjmema^Dxn6H}`)CtRWBx!#5R+jX+W&64wnAh`(g0e@1QQtn( zk+N@FI0LGRZK>*RdAxkjpO$iV{^Vla(yqIW@$$XtnqNq9)-QG}zP?nobY_`cZe8}o z>kiNKq?`?)O53-=tzv4Q)urk|6}j6mn>V*_p=17~&n!E>2Hm@Ty#$7|?jYc*1>rT$ zXj6q1b2MMLZAO_gZ;dmvR%H0zyZX6t4^v8i4-09QRsL{-C`t+%%><*!t|3}p-j zGcTuVTkc%GeR-*GrM7eCSjt>Hr<^;#Fc~*D$92u1vk-(A6X`)a8-L%R2M9vx+55tu zd$(k`YVvbRUjyRfp{b5ISU30y&F6&EiRx{gSDB=;~R57Oj z2Wt?W3d~`o;|6w;%zgkY3c``z7?_v58_nrfK0ubEkbnV~M-&#_sJjjZ*x8kWfn>pX zzTo^yfh$??8ej0*O2P1q<_mLCs;Fe9dtFCZif2sgYNFUa*KvJlru(6}XvV}WLPeX; z3I}g;XGNX?yyer+_x-FvF7Z5fb9!c+is*r?tfjNu#19}y<~0tlIPvl0J-6YJ>Va^q5<~g#DW~f z{yhbJs*>3g@cD~D{%|K|@Ne>=i6jN7m9+HWGmq@2C4Pt0stmbm3HNW4Fd3%x#24_0 zIwXhZkoau&F-cmtd;yQBcgn$v(8WKh=c4BNf}V?7?F)J(YP&Ds5jA1C=Tss7NplAu ztQ7uHBN27=Kfy@SpV~Zso;H4JQ@AlGG*y@l{M1V`4uKW;A`(J1h1n2Fu?N0EB(mq{ z;Fynv2udITzI1fsi}zsqq-C44Tpf<6FM=LSVCBX{9`6JLo?6a<&R_>PULBk-2yqeC z;T6A2q_SmwA(0;gBs*9KdNmzz5JNyB%uMA}7l!H}TEqB8$GB|S4rY{w&;q*O9g|}|?-+KE@`2aZGetv(!(zt*^oV%T zpaOud`)uPcYVJxTw4pVKEI4{WP59nb(CC`pP|2UO%W%DHXziIUM~fy$n_w+8)drht zsixYYrrMqZwWmZyhQY7)n0t^!jpDV7>W(`yg&`vhwLky>!%*%p#0p@+L{-g@GN^We ziyGB@oS{qv3#12D!_|nJo$z`E17g0A8lE z&?H(uI$VUf{sd(RLM=K7d5mCI3=1(IVRfCD;7!V)Ez2B-M9^Wdg=1)1Fa|y2wA;gY z#~^+Lc2!WMYBP&o(7JpPj2VDY1j+|$2x5GP>Bg$?`ecq_g2o@ygGmq)r;%Ag9F+;? z?=bm$Oz^sAK7j-(3r|9n1bS^mEIS4Tj7|ee3dGr9wBZTH3xR{^2#Xdau1V<;HAX=L zB7%LJRT|UTp8+pxhK&vyOc}9t`>l)f7jIq$E#AH@X>a1~P4VWg6?^xLan-iFv_@%NI)F`7mz%mRD9QYZm%eD%-?&NlOiHsafb=>{@D1SPme!>AGodBw?vtEwbNmUw1ER7OpOG z3+^TF3Oe(()(eW|;nk9|xm~wjnt$o$p_LNn;+fA%n!(Yz!4Y51H=O#_RPr>%pQhq; zm_Hp!FcV2;if5+4hxbO>56?c=4}U4`hrcZP;oS=GzLq*RwDPBL_Yb9;abZND^n&8C z8Aq8O>$k;()waQJS#rUOB{@7T;A58jR=l!q8nJDjn1FCrw{J@V9 zh|vZFFy?MWKeqHHc}DbGo>e?9kz4v5%)F%(U5wT*j284RTA#4{U}601h^42H_=Taf zxJRq}Wt9#xzpU@D19+fS_gJ(Kj7r2UVp^#0sZ>7LNYcWq3XzHlR?7Ygl6Q!&6$-WP8;zS( z*Q|Fd35|7KQLk>9yRuFISgc)AE)6W#EMI+~{ONRj=SjZ))FXWHO_p>0JV|H@))jf` z;@Qqe1OR-OCal{;Osn29yKR=e?tDZ5nt2V_dI7vnMYvS^fv=UdYU|wYbppWBpa>pt zB8dBfB1{#Rts_&ar7aC#?tFxKvAVAnfTahD!*kjp$OuM8z&D&e)%t;$ju30PaR^|; zp@~i^2GxA{1R%h=gAlMB@rrTrbadJ@8F52gQH(|UM$_jQ9$|tO{7LB#00Lq72LxI) zq0&dD20j^p2yA+$#3?}SoI%xJo=kD7gaQZ)PedTT>j|*|n9Oh}<8>0}D2XM|7!~L3 ziSA%}@%(^!2sG5jSv*K#(URnU5w?FPs=g#@z9hDPN!0z8$p0;2`YoXsQ|p&RSCZ)B hiLQq#$J@P0m4jC~R#eq*laEzrASC#Rz*KDMe*g`aH821G literal 0 HcmV?d00001 diff --git a/__pycache__/wp_app_config.cpython-312.pyc b/__pycache__/wp_app_config.cpython-312.pyc index 92aa7ca57ab037499b2ba5f54941cd566eeb32e8..a42c96c77cf60cda1551f895732afd40d3504a79 100644 GIT binary patch delta 800 zcmdn&`oNX%G%qg~0}%LT31?_YPvm>WsIc*8IAeW^${dy`(Nv*S)>PIsCP|=*RJIgV z8z7ycmZF}bk)oNRm7<-ZlcJlVm!dz1GfE6itpP}Fs(6ZFszjCnkckG;m{N>dSXM(t zqa;(MQY=zT;3EDEQPN-`Q@9XAlnhYB5Nr)Q#7RIy%#h?|!SX=orkEp%%2gU`T5gtM zc4LySlGZORF4E7*PfpCyPc2E-FD}l}FDOsX)+c znpaZH1mr0w6j@K6$7jzNKKUMBG*FKfzd56r22iGm2ShjmiDE{OLZG^K0e!}}$=d}2 zf$BH~B^U)QF_ahySxaVs^sobo28Iu8oC4BCRzS8UQ<3rHHlb;WV6%;YBDZ*oOA<>m zlXFu`GV)W3%z;8hpxC&@ot%?cTnrU<1_=j&h)56-4I;qSf($LP1`!~uzyv3dQG9fA zt?+m08=^)ZIoXui8hj?GOemh=JfUKu-e(3jR<;i!lY2zA13lm(s?Y5i1JW7`BH}7++Kh;;?{-1Q3x3BAP)2n$2k-F%VI?d5?kj3Kv-vF0&{#Fn(vT NU}XEm03^Tx3ji-8vW5Tv delta 769 zcmZXQO-vI(6o7ZOyDe>(rBtCU)n-#bTvS^ATS|;pF(J`JVxndNvFQu~0UCGL1Wz<# zJeQ0y9=IA0ULbogUcGWM9!z?Y=tWOO4~-@!zPDh~)H!@R^UeF4{XFGNsr#+10Rh&l zN_eT>wXJ?9iM?NU$mWj6=wM+cGkH;r!9DZRo=N!9UV4W1(X&*i{q!6?PcP7c9lz1p z6q~|W7NKbtT}i{XX)TI$@Tv6X*cvg`MaSuIgSioR)kuRn1t#sb@g0o>MMfL$PrLUp zE*)#IiN`~F#z}atiK6b|TXL`C$omq>^UXk!WcioCA2PuYf}`Xnk0?2kb#5uU1eBy+ zB?g~Xm*baV%BrteTDRG{ZHaKwG;;!FgxAyv|EhMA+q|W17LsY(IO*(zJ5xbi0$2n9 z34AYjKWwb`{Pl@?^w1}Fd&}1= zJr(QamCDBUz)wMzy|plZck(Sv|F9z!oSwzJImA5T9-vAVOdAgpVgYd<@dVM-mZ3vz zIN!89iMRvdSy$XzM=u)T`J}GnyUeYB2~CxLw@j{;=%ZD3(R{|ACzJgvgv1X8WX None: - - lines = AppConfig.SETTINGS_FILE.read_text() - if "light\n" in lines: - self.tk.call("set_theme", "light") - else: - self.tk.call("set_theme", "dark") @staticmethod - def msg_window(img_w: str, img_i: str, w_title: str, w_txt: str, txt2: Optional[str] = None, + def msg_window(image_path: Path, image_path2: Path, w_title: str, w_txt: str, txt2: Optional[str] = None, com: Optional[str] = None) -> None: """ Creates message windows - :argument img_w = Image for TK window which is displayed to the left of the text - :argument img_i = Image for Task Icon + :argument AppConfig.IMAGE_PATHS["icon_info"] = Image for TK window which is displayed to the left of the text + :argument AppConfig.IMAGE_PATHS["icon_vpn"] = Image for Task Icon :argument w_title = Windows Title :argument w_txt = Text for Tk Window :argument txt2 = Text for Button two @@ -207,7 +198,7 @@ class LxTools(tk.Tk): msg.resizable(width=False, height=False) msg.title(w_title) msg.configure(pady=15, padx=15) - msg.img = tk.PhotoImage(file=img_w) + msg.img = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_info"]) msg.i_window = tk.Label(msg, image=msg.img) label: tk.Label = tk.Label(msg, text=w_txt) @@ -228,8 +219,8 @@ class LxTools(tk.Tk): button: ttk.Button = ttk.Button(msg, text="OK", command=msg.destroy, padding=4) button.grid(column=0, columnspan=2, row=1) - img_i: tk.PhotoImage = tk.PhotoImage(file=img_i) - msg.iconphoto(True, img_i) + AppConfig.IMAGE_PATHS["icon_vpn"]: tk.PhotoImage = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"]) + msg.iconphoto(True, AppConfig.IMAGE_PATHS["icon_vpn"]) msg.columnconfigure(0, weight=1) msg.rowconfigure(0, weight=1) msg.winfo_toplevel() @@ -278,85 +269,10 @@ class LxTools(tk.Tk): signal.signal(signal.SIGHUP, signal_handler) -class GiteaUpdate: - """ - Calling download requests the download URL of the running script, - the taskbar image for the “Download OK” window, the taskbar image for the - “Download error” window and the variable res - """ - - @staticmethod - def api_down(update_api_url: str, version: str, file: Optional[Path] = None) -> str: - """ - Checks for updates via API - - Args: - update_api_url: Update API URL - version: Current version - file: Optional - Configuration file - - Returns: - New version or status message - """ - try: - response: requests.Response = requests.get(update_api_url, timeout=10) - response_dict: Any = response.json() - response_dict: Dict[str, Any] = response_dict[0] - with open(file, "r", encoding="utf-8") as set_f: - set_f = set_f.read() - if "on\n" in set_f: - if version[3:] != response_dict["tag_name"]: - req: str = response_dict["tag_name"] - else: - req: str = "No Updates" - else: - req: str = "False" - return req - except requests.exceptions.RequestException: - req: str = "No Internet Connection!" - return req - - @staticmethod - def download(urld: str, res: str, img_w: str = None, img_i: str = None, img_w2: str = None, img_i2: str = None) -> None: - """ - Downloads new version of wirepy - - Args: - urld: Download URL - res: Result filename - img_w: Image for TK window which is displayed to the left of the text - img_i: Image for Task Icon - img_w2: Image for TK window which is displayed to the left of the text - img_i2: Image for Task Icon - """ - try: - to_down: str = f"wget -qP {Path.home()} {" "} {urld}" - result: int = subprocess.call(to_down, shell=True) - if result == 0: - shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000) - - wt: str = _("Download Successful") - msg_t: str = _("Your zip file is in home directory") - LxTools.msg_window(img_w, img_i, wt, msg_t) - - else: - - wt: str = _("Download error") - msg_t: str = _("Download failed! Please try again") - LxTools.msg_window(img_w2, img_i2, wt, msg_t) - - except subprocess.CalledProcessError: - - wt: str = _("Download error") - msg_t: str = _("Download failed! No internet connection!") - LxTools.msg_window(img_w2, img_i2, wt, msg_t) - - class Tunnel: """ Class of Methods for Wire-Py - """ - + """ @classmethod def con_to_dict(cls, file: TextIO) -> Tuple[str, str, str, Optional[str]]: """ @@ -426,16 +342,17 @@ class Tunnel: return wg_s @staticmethod - def export(img_w: str = None, img_i: str = None, img_w2: str = None, img_i2: str = None, sl: str = None, pfit:str = None) -> None: + def export(image_path: Path = None, image_path2: Path = None, image_path3: Path = None, image_path4: Path = None, + title: Dict = None, window_msg: Dict = None) -> None: """ This will export the tunnels. A zipfile with the current date and time is created in the user's home directory with the correct right Args: - img_w: Image for TK window which is displayed to the left of the text - img_i: Image for Task Icon - img_w2: Image for TK window which is displayed to the left of the text - img_i2: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_info"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_vpn"]: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_error"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_msg"]: Image for Task Icon """ now_time: datetime = datetime.now() now_datetime: str = now_time.strftime("wg-exp-%m-%d-%Y-%H:%M") @@ -451,20 +368,95 @@ class Tunnel: with zipfile.ZipFile(f"{wg_tar}.zip", "r") as zf: if len(zf.namelist()) != 0: - LxTools.msg_window(img_w, img_i, Msg.STR["exp_succ"], Msg.STR["exp_in_home"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], Msg.STR["exp_succ"], Msg.STR["exp_in_home"]) else: - LxTools.msg_window(img_w2, img_i2, Msg.STR["exp_err"], Msg.STR["exp_try"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["exp_err"], Msg.STR["exp_try"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) except TypeError: pass +class GiteaUpdate: + """ + Calling download requests the download URL of the running script, + the taskbar image for the “Download OK” window, the taskbar image for the + “Download error” window and the variable res + """ + + @staticmethod + def api_down(update_api_url: str, version: str, file: Optional[Path] = None) -> str: + """ + Checks for updates via API + + Args: + update_api_url: Update API URL + version: Current version + file: Optional - Configuration file + + Returns: + New version or status message + """ + try: + response: requests.Response = requests.get(update_api_url, timeout=10) + response_dict: Any = response.json() + response_dict: Dict[str, Any] = response_dict[0] + with open(file, "r", encoding="utf-8") as set_f: + set_f = set_f.read() + if "on\n" in set_f: + if version[3:] != response_dict["tag_name"]: + req: str = response_dict["tag_name"] + else: + req: str = "No Updates" + else: + req: str = "False" + return req + except requests.exceptions.RequestException: + req: str = "No Internet Connection!" + return req + + @staticmethod + def download(urld: str, res: str, image_path: Path = None, image_path2: Path = None, image_path3: Path = None, + image_path4: Path = None) -> None: + """ + Downloads new version of wirepy + + Args: + urld: Download URL + res: Result filename + AppConfig.IMAGE_PATHS["icon_info"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_vpn"]: Image for Task Icon + AppConfig.IMAGE_PATHS["icon_error"]: Image for TK window which is displayed to the left of the text + AppConfig.IMAGE_PATHS["icon_msg"]: Image for Task Icon + """ + try: + to_down: str = f"wget -qP {Path.home()} {" "} {urld}" + result: int = subprocess.call(to_down, shell=True) + if result == 0: + shutil.chown(f"{Path.home()}/{res}.zip", 1000, 1000) + + wt: str = _("Download Successful") + msg_t: str = _("Your zip file is in home directory") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], wt, msg_t) + + else: + + wt: str = _("Download error") + msg_t: str = _("Download failed! Please try again") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], wt, msg_t) + + except subprocess.CalledProcessError: + + wt: str = _("Download error") + msg_t: str = _("Download failed! No internet connection!") + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], wt, msg_t) + + class Tooltip: """ class for Tooltip diff --git a/manage_tunnel.py b/manage_tunnel.py new file mode 100644 index 0000000..04cdcb2 --- /dev/null +++ b/manage_tunnel.py @@ -0,0 +1,15 @@ +#!/usr/bin/python3 +from pathlib import Path +from subprocess import check_call +from tkinter import filedialog, ttk +from cls_mth_fc import Create, LxTools +from wp_app_config import AppConfig, Msg +import gettext +import locale +import os +import shutil +import subprocess +from typing import Optional, Dict, Any, NoReturn, TextIO, Tuple, List +# Translate +_ = AppConfig.setup_translations() + diff --git a/ssl_decrypt.py b/ssl_decrypt.py index 42015fd..66c5902 100755 --- a/ssl_decrypt.py +++ b/ssl_decrypt.py @@ -12,11 +12,11 @@ uname: Path = Path("/tmp/.log_user") log_name = Path(uname).read_text(encoding="utf-8") keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem") -PKEYFILE: Path = "/usr/local/etc/ssl/pwgk.pem" +#PKEYFILE: Path = "/usr/local/etc/ssl/pwgk.pem" if not keyfile.is_file(): - check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"]) + check_call(["openssl", "rsa", "-in", AppConfig.SYSTEM_PATHS["pkey_path"], "-out", keyfile, "-outform", "PEM", "-pubout"]) shutil.chown(keyfile, 1000, 1000) AppConfig.TEMP_DIR2 = f"/home/{log_name}/.config/wire_py/" @@ -29,6 +29,6 @@ if os.path.exists(f"{AppConfig.TEMP_DIR2}pbwgk.pem"): for detunnels in detl: tlname2 = f"{detunnels[:-4]}.conf" extpath = f"{AppConfig.TEMP_DIR}/{tlname2}" - check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", PKEYFILE, "-in", detunnels, + check_call(["openssl", "pkeyutl", "-decrypt", "-inkey", AppConfig.SYSTEM_PATHS["pkey_path"], "-in", detunnels, "-out", extpath]) shutil.chown(extpath, 1000, 1000) diff --git a/ssl_encrypt.py b/ssl_encrypt.py index 2505a59..df62157 100755 --- a/ssl_encrypt.py +++ b/ssl_encrypt.py @@ -5,23 +5,22 @@ import os import shutil from pathlib import Path from subprocess import check_call - +from cls_mth_fc import LxTools from wp_app_config import AppConfig -uname: Path = Path("/tmp/.log_user") +#uname: Path = Path("/tmp/.log_user") -log_name = Path(uname).read_text(encoding="utf-8") +#log_name = AppConfig.USER_FILE.read_text(encoding="utf-8") -keyfile: Path = Path(f"/home/{log_name}/.config/wire_py/pbwgk.pem") -PKEYFILE = "/usr/local/etc/ssl/pwgk.pem" +keyfile: Path = Path(f"/home/{AppConfig.USER_FILE.read_text(encoding="utf-8")}/.config/wire_py/pbwgk.pem") if not keyfile.is_file(): - check_call(["openssl", "rsa", "-in", PKEYFILE, "-out", keyfile, "-outform", "PEM", "-pubout"]) + check_call(["openssl", "rsa", "-in", AppConfig.SYSTEM_PATHS["pkey_path"], "-out", keyfile, "-outform", "PEM", "-pubout"]) shutil.chown(keyfile, 1000, 1000) if AppConfig.TEMP_DIR.exists(): - tl = os.listdir(f"{AppConfig.TEMP_DIR}") + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) CPTH: str = f"{keyfile}" CRYPTFILES: str = CPTH[:-9] diff --git a/wirepy.py b/wirepy.py index 144ac7e..101e3f8 100755 --- a/wirepy.py +++ b/wirepy.py @@ -14,31 +14,18 @@ from pathlib import Path from subprocess import check_call from tkinter import TclError, filedialog, ttk -from cls_mth_fc import (Create, GiteaUpdate, Tooltip, Tunnel, LxTools) +from cls_mth_fc import (Create, GiteaUpdate, Tunnel, Tooltip, LxTools) from wp_app_config import AppConfig, Msg LxTools.uos() Create.dir_and_files() Create.make_dir() Create.decrypt() - -tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) - # 1 = 1. Year, 09 = Month of the Year, 2924 = Day and Year of the Year VERSION: str = "v. 2.04.1725" res = GiteaUpdate.api_down("https://git.ilunix.de/api/v1/repos/punix/Wire-Py/releases", VERSION, AppConfig.SETTINGS_FILE) -# Translate -_ = AppConfig.setup_translations() - -img_w: str = r"/usr/share/icons/lx-icons/64/info.png" -img_i: str = r"/usr/share/icons/lx-icons/48/wg_vpn.png" -img_w2: str = r"/usr/share/icons/lx-icons/64/error.png" -img_i2: str = r"/usr/share/icons/lx-icons/48/wg_msg.png" - -LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE) - class Wirepy(tk.Tk): """ Class Wirepy this is the Main Window of wirepy @@ -58,7 +45,11 @@ class Wirepy(tk.Tk): self.rowconfigure(0, weight=1) self.style = ttk.Style(self) self.tk.call("source", f"{AppConfig.SYSTEM_PATHS["tcl_path"]}/water.tcl") - LxTools.theme_change(self) + lines = AppConfig.SETTINGS_FILE.read_text() + if "light\n" in lines: + self.tk.call("set_theme", "light") + else: + self.tk.call("set_theme", "dark") # Load the image file from the disk self.wg_icon = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_vpn"]) @@ -66,16 +57,18 @@ class Wirepy(tk.Tk): # Set it as the window icon self.iconphoto(True, self.wg_icon) - FrameWidgets(self).grid() + tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) + FrameWidgets(self, tips_enabled=tips).grid() class FrameWidgets(ttk.Frame): """ ttk frame class for better structure """ - def __init__(self, container, **kwargs): + def __init__(self, container, tips_enabled=None, **kwargs): super().__init__(container, **kwargs) + self.tunnel = Tunnel() self.lb_tunnel = None self.btn_stst = None self.endpoint = None @@ -88,7 +81,7 @@ class FrameWidgets(ttk.Frame): self.tr_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_trash"]) self.exp_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_export"]) self.warning_pic = tk.PhotoImage(file=AppConfig.IMAGE_PATHS["icon_error"]) - + self.tips_enabled = tips_enabled if tips_enabled is not None else LxTools.if_tip(AppConfig.SETTINGS_FILE) # Frame for Menu self.menu_frame = ttk.Frame(self) self.menu_frame.configure(relief="flat") @@ -99,12 +92,12 @@ class FrameWidgets(ttk.Frame): self.version_lb.config(font=("Ubuntu", 11), foreground="#00c4ff") self.version_lb.grid(column=0, row=0, rowspan=4, padx=10) - Tooltip(self.version_lb, f"Version: {VERSION[2:]}", tips) + Tooltip(self.version_lb, f"Version: {VERSION[2:]}", self.tips_enabled) self.options_btn = ttk.Menubutton(self.menu_frame, text=_("Options")) self.options_btn.grid(column=1, columnspan=1, row=0) - Tooltip(self.options_btn, _("Click for Settings"), tips) + Tooltip(self.options_btn, _("Click for Settings"), self.tips_enabled) set_update = tk.IntVar() set_tip = tk.BooleanVar() @@ -138,14 +131,14 @@ class FrameWidgets(ttk.Frame): set_update.set(value=1) self.updates_lb.configure(text=_("Update search off")) - Tooltip(self.updates_lb, _("Updates you have disabled"), tips) + Tooltip(self.updates_lb, _("Updates you have disabled"), self.tips_enabled) elif res == "No Internet Connection!": self.updates_lb.configure(text=_("No Server Connection!"), foreground="red") elif res == "No Updates": self.updates_lb.configure(text=_("No Updates")) - Tooltip(self.updates_lb, _("Congratulations! Wire-Py is up to date"), tips) + Tooltip(self.updates_lb, _("Congratulations! Wire-Py is up to date"), self.tips_enabled) else: set_update.set(value=0) @@ -155,7 +148,7 @@ class FrameWidgets(ttk.Frame): self.update_btn = ttk.Menubutton(self.menu_frame, text=text) self.update_btn.grid(column=4, columnspan=3, row=0, padx=0) - Tooltip(self.update_btn, _("Click to download new version"), tips) + Tooltip(self.update_btn, _("Click to download new version"), self.tips_enabled) self.download = tk.Menu(self, relief="flat") @@ -163,7 +156,7 @@ class FrameWidgets(ttk.Frame): self.download.add_command( label=_("Download"), command=lambda: GiteaUpdate.download(f"https://git.ilunix.de/punix/Wire-Py/archive/{res}.zip", - res, img_w, img_i, img_w2, img_i2)) + res, AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"])) # Show active Tunnel self.a = Tunnel.active() @@ -224,9 +217,9 @@ class FrameWidgets(ttk.Frame): self.l_box.configure(yscrollcommand=self.scrollbar.set) # Tunnel List - self.tl = Tunnel.list() + self.tl = LxTools.get_file_name(AppConfig.TEMP_DIR) for tunnels in self.tl: - self.l_box.insert("end", tunnels[:-5]) + self.l_box.insert("end", tunnels) self.l_box.update() # Button Vpn @@ -247,7 +240,7 @@ class FrameWidgets(ttk.Frame): self.btn_i = ttk.Button(self.lb_frame_btn_lbox, image=self.imp_pic, command=self.import_sl, padding=0) self.btn_i.grid(column=0, row=1, padx=15, pady=8) - Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), tips) + Tooltip(self.btn_i, _("Click to import a Wireguard Tunnel"), self.tips_enabled) # Button Trash self.btn_tr = ttk.Button(self.lb_frame_btn_lbox, image=self.tr_pic, command=self.delete, padding=0, @@ -255,20 +248,20 @@ class FrameWidgets(ttk.Frame): self.btn_tr.grid(column=0, row=2, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_tr, _("No tunnels to delete in the list"), tips) + Tooltip(self.btn_tr, _("No tunnels to delete in the list"), self.tips_enabled) else: - Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), tips) + Tooltip(self.btn_tr, _("Click to delete a Wireguard Tunnel\nSelect from the list!"), self.tips_enabled) # Button Export self.btn_exp = ttk.Button(self.lb_frame_btn_lbox, image=self.exp_pic, - command=lambda: Tunnel.export(img_w, img_i, img_w2, img_i2, + command=lambda: Tunnel.export(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]), padding=0) self.btn_exp.grid(column=0, row=3, padx=15, pady=8) if self.l_box.size() == 0: - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), tips) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) else: - Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), tips) + Tooltip(self.btn_exp, _("Click to export all\nWireguard Tunnel to Zipfile"), self.tips_enabled) # Label Entry self.lb_rename = ttk.Entry(self.lb_frame4, width=20) @@ -277,9 +270,9 @@ class FrameWidgets(ttk.Frame): self.lb_rename.config(state="disable") if self.l_box.size() != 0: - Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), tips) + Tooltip(self.lb_rename, _("To rename a tunnel, you need to\nselect a tunnel from the list"), self.tips_enabled) else: - Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), tips) + Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), self.tips_enabled) # Button Rename self.btn_rename = ttk.Button(self.lb_frame4, text=_("Rename"), state="disable", command=self.tl_rename, @@ -300,53 +293,17 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.grid(column=0, row=0, pady=15, padx=15, sticky="nw") if self.l_box.size() >= 1 and len(self.l_box.curselection()) >= 1: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tself.tips_enabled) if self.l_box.size() == 0: - Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart_info"], self.tips_enabled) else: - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) self.on_off() - @staticmethod - def about() -> None: - """ - a tk.Toplevel window - """ - def link_btn() -> str | None: - webbrowser.open("https://git.ilunix.de/punix/Wire-Py") - - msg_t = _("Wire-Py a simple Wireguard Gui for Linux systems.\n\n" - "Wire-Py is open source software written in Python.\n\n" - "Email: polunga40@unity-mail.de also likes for donation.\n\n" - "Use without warranty!\n") - - LxTools.msg_window(img_i, img_i, _("Info"), msg_t, _("Go to Wire-Py git"), link_btn) - - def theme_change_light(self) -> None: - """ - Set a light theme - """ - if self.tk.call("ttk::style", "theme", "use") == "water-dark": - self.tk.call("set_theme", "light") - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) # (keepends=True) = not changed - lines[3] = 'light\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - self.color_label() - - def theme_change_dark(self) -> None: - """ - Set a dark theme - """ - if not self.tk.call("ttk::style", "theme", "use") == "water-dark": - self.tk.call("set_theme", "dark") - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[3] = 'dark\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - self.color_label() @staticmethod def update_setting(update_res) -> None: @@ -382,17 +339,197 @@ class FrameWidgets(ttk.Frame): lines[5] = 'True\n' Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - def enable_check_box(self, _) -> None: + @staticmethod + def about() -> None: """ - checkbox for enable autostart Tunnel + a tk.Toplevel window """ - Create.files_for_autostart() - if self.l_box.size() != 0: - self.wg_autostart.configure(state="normal") - self.lb_rename.config(state="normal") - self.lb_rename.delete(0, tk.END) - self.btn_rename.config(state="normal") + def link_btn() -> str | None: + webbrowser.open("https://git.ilunix.de/punix/Wire-Py") + + msg_t = _("Wire-Py a simple Wireguard Gui for Linux systems.\n\n" + "Wire-Py is open source software written in Python.\n\n" + "Email: polunga40@unity-mail.de also likes for donation.\n\n" + "Use without warranty!\n") + + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_vpn"], AppConfig.IMAGE_PATHS["icon_vpn"], _("Info"), msg_t, _("Go to Wire-Py git"), link_btn) + + def theme_change_light(self) -> None: + """ + Set a light theme + """ + if self.tk.call("ttk::style", "theme", "use") == "water-dark": + self.tk.call("set_theme", "light") + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) # (keepends=True) = not changed + lines[3] = 'light\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + self.color_label() + + def theme_change_dark(self) -> None: + """ + Set a dark theme + """ + if not self.tk.call("ttk::style", "theme", "use") == "water-dark": + self.tk.call("set_theme", "dark") + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[3] = 'dark\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + self.color_label() + + def start(self) -> None: + """ + Start Button + """ + self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, + command=lambda: self.wg_switch("start"), padding=0) + self.btn_stst.grid(column=0, row=0, padx=5, pady=8) + + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) + if len(self.tl) == 0: + Tooltip(self.btn_stst, Msg.TTIP["empty_list"], self.tips_enabled) + else: + Tooltip(self.btn_stst, Msg.TTIP["start_tl"], self.tips_enabled) + + def handle_tunnel_data(self, tunnel_name: str) -> tuple[str, str, str, str | None]: + """_summary_ + + Args: + tunnel_name (str): name of a tunnel + + Returns: + tuple[str, str]: tuple with tunnel data + """ + wg_read = f"/tmp/tlecdcwg/{tunnel_name}.conf" + with open(wg_read, "r", encoding="utf-8") as file: + data = Tunnel.con_to_dict(file) + self.init_and_report(data) + self.show_data() + return data + + def color_label(self) -> None: + """ + View activ Tunnel in the color green or yellow + """ + lines = AppConfig.SETTINGS_FILE.read_text() + if "light\n" in lines: + self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="green") + + else: + self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="yellow") + + self.lb_tunnel.config(font=("Ubuntu", 11, "bold")) + self.lb_tunnel.grid(column=2, padx=10, row=1) + + def stop(self) -> None: + """ + Stop Button + """ + self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, + command=lambda: self.wg_switch("stop"), padding=0) + self.btn_stst.grid(column=0, row=0, padx=5, pady=8) + + Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], self.tips_enabled) + + def reset_fields(self) -> None: + """ + reset data from labels + """ + fields = [self.add, self.DNS, self.enp] + for field in fields: + field.set("") + + def import_sl(self) -> None: + """validity check of wireguard config files""" + + Create.dir_and_files() + try: + filepath = filedialog.askopenfilename( + initialdir=f"{Path.home()}", + title=_("Select Wireguard config File"), + filetypes=[(_("WG config files"), "*.conf")] + ) + + # Überprüfe, ob der Benutzer den Dialog abgebrochen hat + if not filepath: + print("File import: abort by user...") + return + with open(filepath, "r", encoding="utf-8") as file: + read = file.read() + + path_split = filepath.split("/") + path_split1 = path_split[-1] + + if "PrivateKey = " in read and "PublicKey = " in read and "Endpoint =" in read: + with open(filepath, "r", encoding="utf-8") as file: + key = Tunnel.con_to_dict(file) + pre_key = key[3] + + if len(pre_key) != 0: + p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8") + + if pre_key in p_key or f"{pre_key}\n" in p_key: + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["imp_err"], Msg.STR["tl_exist"]) + else: + with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile: + keyfile.write(f"{pre_key}\r") + + if len(path_split1) > 17: + p1 = shutil.copy(filepath, AppConfig.TEMP_DIR) + path_split = path_split1[len(path_split1) - 17:] + os.rename(p1, f"{AppConfig.TEMP_DIR}/{path_split}") + new_conf = f"{AppConfig.TEMP_DIR}/{path_split}" + + if self.a != "": + check_call(["nmcli", "connection", "down", self.a]) + self.reset_fields() + + subprocess.check_output(["nmcli", "connection", "import", "type", "wireguard", "file", new_conf], text=True) + Create.encrypt() + else: + shutil.copy(filepath, f"{AppConfig.TEMP_DIR}/") + + if self.a != "": + check_call(["nmcli", "connection", "down", self.a]) + self.reset_fields() + + subprocess.check_output(["nmcli", "connection", "import", "type", "wireguard", "file", filepath], text=True) + Create.encrypt() + + self.str_var.set("") + self.a = Tunnel.active() + self.l_box.insert(0, self.a) + self.wg_autostart.configure(state="normal") + self.l_box.selection_clear(0, tk.END) + self.l_box.update() + self.l_box.selection_set(0) + + Tooltip(self.wg_autostart, Msg.TTIP["autostart"], self.tips_enabled) + Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], self.tips_enabled) + Tooltip(self.btn_exp, Msg.TTIP["export_tl"], self.tips_enabled) + Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], self.tips_enabled) + + self.lb_rename.insert(0, "Max. 12 characters!") + self.str_var = tk.StringVar() + self.str_var.set(self.a) + self.color_label() + self.stop() + data = self.handle_tunnel_data(self.a) + check_call(["nmcli", "con", "mod", self.a, "connection.autoconnect", "no"]) + elif ("PrivateKey = " in read) and ("Endpoint = " in read): + pass + else: + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_error"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["imp_err"], Msg.STR["no_valid_file"]) + + except EOFError as e: + print(e) + except TypeError: + print("File import: abort by user...") + except FileNotFoundError: + print("File import: abort by user...") + except subprocess.CalledProcessError: + print("Tunnel exist!") + def delete(self) -> None: """ delete Wireguard Tunnel @@ -433,10 +570,10 @@ class FrameWidgets(ttk.Frame): self.wg_autostart.configure(state="disabled") self.lb_rename.configure(state="disabled") Tooltip(self.wg_autostart, _("You must have at least one\ntunnel in the list,to use the autostart") - , tips) + , self.tips_enabled) - Tooltip(self.btn_exp, _("No Tunnels in List for Export"), tips) - Tooltip(self.btn_stst, _("No tunnels to start in the list"), tips) + Tooltip(self.btn_exp, _("No Tunnels in List for Export"), self.tips_enabled) + Tooltip(self.btn_stst, _("No tunnels to start in the list"), self.tips_enabled) Tooltip(self.lb_rename, _("To rename a tunnel, at least one must be in the list"), tips, ) self.lb_rename.insert(0, _("Max. 12 characters!")) @@ -450,11 +587,83 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["sel_list"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) + + def enable_check_box(self, _) -> None: + """ + checkbox for enable autostart Tunnel + """ + Create.files_for_autostart() + if self.l_box.size() != 0: + self.wg_autostart.configure(state="normal") + self.lb_rename.config(state="normal") + self.lb_rename.delete(0, tk.END) + self.btn_rename.config(state="normal") + + def on_off(self) -> None: + """ + Here it is checked whether the path to the file is there, if not, it is created. + Set (on), the selected tunnel is displayed in the label. + At (off) the label is first emptied then filled with No Autoconnect + """ + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + + if lines[7] != "off\n": + print(f"{lines[7]} starts automatically when the system starts.") + self.selected_option.set(1) + self.autoconnect_var.set("") + self.auto_con = lines[7] + + else: + self.selected_option.set(0) + self.auto_con = _("no Autoconnect") + print("Autostart disabled.") + self.autoconnect_var.set("") + self.autoconnect_var = tk.StringVar() + self.autoconnect_var.set(self.auto_con) + + self.autoconnect = ttk.Label(self.lb_frame3, textvariable=self.autoconnect_var, foreground="#0071ff", width=15) + self.autoconnect.config(font=("Ubuntu", 11)) + self.autoconnect.grid(column=1, row=0, sticky="e", pady=19) + + def box_set(self) -> None: + """ + Configures the autostart for a selected tunnel. + + This method is called when the user changes the autostart checkbox. + It saves the selected tunnel in the configuration file so that it + will be automatically connected at system startup. + + If the checkbox is deactivated, 'off' is written to the configuration file + to disable the autostart. + """ + try: + select_tunnel = self.l_box.curselection() + select_tl = self.l_box.get(select_tunnel[0]) + + if self.selected_option.get() == 0: + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[7] = 'off\n' + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + + tl = LxTools.get_file_name(AppConfig.TEMP_DIR) + + if len(tl) == 0: + self.wg_autostart.configure(state="disabled") + + if self.selected_option.get() >= 1: + lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) + lines[7] = select_tl + Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") + + except IndexError: + self.selected_option.set(1) + + self.on_off() def tl_rename(self) -> None: """ @@ -465,19 +674,19 @@ class FrameWidgets(ttk.Frame): if len(self.lb_rename.get()) > 12: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sign_len"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["sign_len"]) elif len(self.lb_rename.get()) == 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["zero_signs"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["zero_signs"]) elif any(ch in special_characters for ch in self.lb_rename.get()): - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["false_signs"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["false_signs"]) elif self.lb_rename.get() in name_of_file: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["is_in_use"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["is_in_use"]) else: @@ -510,7 +719,7 @@ class FrameWidgets(ttk.Frame): except IndexError: - LxTools.msg_window(img_w, img_i2, Msg.STR["ren_err"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["ren_err"], Msg.STR["sel_list"]) except subprocess.CalledProcessError: pass @@ -518,170 +727,53 @@ class FrameWidgets(ttk.Frame): except EOFError as e: print(e) - def import_sl(self) -> None: - """ - validity check of wireguard config files - """ - Create.dir_and_files() - + def activate_tunnel(self, tunnel_name): + """Activates a tunnel after a delay""" try: - filepath = filedialog.askopenfilename(initialdir=f"{Path.home()}", title=_("Select Wireguard config File"), - filetypes=[(_("WG config files"), "*.conf")]) - - with open(filepath, "r", encoding="utf-8") as file: - read = file.read() - path_split = filepath.split("/") - path_split1 = path_split[-1] - - if "PrivateKey = " in read and "PublicKey = " in read and "Endpoint =" in read: - with open(filepath, "r", encoding="utf-8") as file: - key = Tunnel.con_to_dict(file) - pre_key = key[3] - if len(pre_key) != 0: - p_key = AppConfig.KEYS_FILE.read_text(encoding="utf-8") - if pre_key in p_key or f"{pre_key}\n" in p_key: - - LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["tl_exist"]) - - else: - - with open(AppConfig.KEYS_FILE, "a", encoding="utf-8") as keyfile: - keyfile.write(f"{pre_key}\r") - if len(path_split1) > 17: - p1 = shutil.copy(filepath, AppConfig.TEMP_DIR) - path_split = path_split1[len(path_split1) - 17:] - os.rename(p1, f"{AppConfig.TEMP_DIR}/{path_split}") - new_conf = f"{AppConfig.TEMP_DIR}/{path_split}" - if self.a != "": - check_call(["nmcli", "connection", "down", self.a]) - self.reset_fields() - - subprocess.check_output(["nmcli", "connection", "import", "type", - "wireguard", "file", new_conf], text=True) - - Create.encrypt() - - else: - shutil.copy(filepath, f"{AppConfig.TEMP_DIR}/") - if self.a != "": - check_call(["nmcli", "connection", "down", self.a]) - self.reset_fields() - - subprocess.check_output(["nmcli", "connection", "import", "type", - "wireguard", "file", filepath], text=True) - - Create.encrypt() - - self.str_var.set("") - self.a = Tunnel.active() - self.l_box.insert(0, self.a) - self.wg_autostart.configure(state="normal") - self.l_box.selection_clear(0, tk.END) - self.l_box.update() - self.l_box.selection_set(0) - - Tooltip(self.wg_autostart, Msg.TTIP["autostart"], tips) - - Tooltip(self.btn_tr, Msg.TTIP["trash_tl"], tips) - - Tooltip(self.btn_exp, Msg.TTIP["export_tl"], tips) - - Tooltip(self.btn_rename, Msg.TTIP["rename_tl"], tips) - - self.lb_rename.insert(0, "Max. 12 characters!") - self.str_var = tk.StringVar() - self.str_var.set(self.a) - self.color_label() - self.stop() - data = self.handle_tunnel_data(self.a) - check_call(["nmcli", "con", "mod", self.a, "connection.autoconnect", "no"]) - - if ("PrivateKey = " in read) and ("Endpoint = " in read): - pass + # First check if the tunnel exists in NetworkManager + nm_connections = subprocess.run( + ["nmcli", "-t", "-f", "NAME", "connection", "show"], + check=True, + stdout=subprocess.PIPE, + text=True + ).stdout.strip().split('\n') + + # Find the actual connection name (it might have been modified) + actual_name = None + for conn in nm_connections: + if tunnel_name in conn: + actual_name = conn + break + + if actual_name: + # Use the actual connection name + subprocess.run(["nmcli", "connection", "up", actual_name], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) else: - - LxTools.msg_window(img_w2, img_i2, Msg.STR["imp_err"], Msg.STR["no_valid_file"]) - - except EOFError as e: - print(e) - except TypeError: - print("File import: abort by user...") - except FileNotFoundError: - print("File import: abort by user...") - except subprocess.CalledProcessError: - print("Tunnel exist!") - - def handle_tunnel_data(self, tunnel_name: str) -> tuple[str, str, str, str | None]: - """_summary_ - - Args: - tunnel_name (str): name of a tunnel - - Returns: - tuple[str, str]: tuple with tunnel data - """ - wg_read = f"/tmp/tlecdcwg/{tunnel_name}.conf" - with open(wg_read, "r", encoding="utf-8") as file: - data = Tunnel.con_to_dict(file) - self.init_and_report(data) - self.show_data() - return data - - def box_set(self) -> None: - """ - This Method will display the autostarted label which - Tunnel is automatically started regardless of the active tunnel. - The selected tunnel is written into a file to read it after the start of the system. - """ - try: - select_tunnel = self.l_box.curselection() - select_tl = self.l_box.get(select_tunnel[0]) - - if self.selected_option.get() == 0: - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[7] = 'off\n' - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - - tl = Tunnel.list() - - if len(tl) == 0: - self.wg_autostart.configure(state="disabled") - - if self.selected_option.get() >= 1: - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - lines[7] = select_tl - Path(AppConfig.SETTINGS_FILE).write_text(''.join(lines), encoding="utf-8") - - except IndexError: - self.selected_option.set(1) - - self.on_off() - - def on_off(self) -> None: - """ - Here it is checked whether the path to the file is there, if not, it is created. - Set (on), the selected tunnel is displayed in the label. - At (off) the label is first emptied then filled with No Autoconnect - """ - lines = Path(AppConfig.SETTINGS_FILE).read_text(encoding="utf-8").splitlines(keepends=True) - - if lines[7] != "off\n": - print(f"{lines[7]} starts automatically when the system starts.") - self.selected_option.set(1) - self.autoconnect_var.set("") - self.auto_con = lines[7] - - else: - self.selected_option.set(0) - self.auto_con = _("no Autoconnect") - print("Autostart disabled.") - self.autoconnect_var.set("") - self.autoconnect_var = tk.StringVar() - self.autoconnect_var.set(self.auto_con) - - self.autoconnect = ttk.Label(self.lb_frame3, textvariable=self.autoconnect_var, foreground="#0071ff", width=15) - self.autoconnect.config(font=("Ubuntu", 11)) - self.autoconnect.grid(column=1, row=0, sticky="e", pady=19) + # Use the original name as fallback + subprocess.run(["nmcli", "connection", "up", tunnel_name], + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + # After successful activation, update the display + self.a = Tunnel.active() + self.str_var.set(self.a) + self.color_label() + + # Try to load the tunnel data + try: + data = self.handle_tunnel_data(self.a) + self.init_and_report(data) + self.show_data() + self.stop() + except Exception as e: + print(f"Error loading tunnel data: {e}") + + except subprocess.CalledProcessError as e: + print(f"Error activating tunnel: {e}", "hier simma") def init_and_report(self, data=None) -> None: """ @@ -696,14 +788,6 @@ class FrameWidgets(ttk.Frame): self.enp = tk.StringVar() self.enp.set(f"{_("Endpoint: ")}{data[2]}") - def reset_fields(self) -> None: - """ - reset data from labels - """ - fields = [self.add, self.DNS, self.enp] - for field in fields: - field.set("") - def show_data(self) -> None: """ shows data in the label @@ -723,44 +807,6 @@ class FrameWidgets(ttk.Frame): self.endpoint.grid(column=0, row=8, sticky="w", padx=10, pady=20) self.endpoint.config(font=("Ubuntu", 9)) - def stop(self) -> None: - """ - Stop Button - """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_stop, - command=lambda: self.wg_switch("stop"), padding=0) - self.btn_stst.grid(column=0, row=0, padx=5, pady=8) - - Tooltip(self.btn_stst, Msg.TTIP["stop_tl"], tips) - - def start(self) -> None: - """ - Start Button - """ - self.btn_stst = ttk.Button(self.lb_frame_btn_lbox, image=self.wg_vpn_start, - command=lambda: self.wg_switch("start"), padding=0) - self.btn_stst.grid(column=0, row=0, padx=5, pady=8) - - tl = Tunnel.list() - if len(tl) == 0: - Tooltip(self.btn_stst, Msg.TTIP["empty_list"], tips) - else: - Tooltip(self.btn_stst, Msg.TTIP["start_tl"], tips) - - def color_label(self) -> None: - """ - View activ Tunnel in the color green or yellow - """ - lines = AppConfig.SETTINGS_FILE.read_text() - if "light\n" in lines: - self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="green") - - else: - self.lb_tunnel = ttk.Label(self, textvariable=self.str_var, foreground="yellow") - - self.lb_tunnel.config(font=("Ubuntu", 11, "bold")) - self.lb_tunnel.grid(column=2, padx=10, row=1) - def wg_switch(self, event=None) -> None: """ Deals with switching the VPN connection @@ -782,11 +828,11 @@ class FrameWidgets(ttk.Frame): if self.l_box.size() != 0: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["sel_list"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["sel_list"]) else: - LxTools.msg_window(img_w, img_i2, Msg.STR["sel_tl"], Msg.STR["tl_first"]) + LxTools.msg_window(AppConfig.IMAGE_PATHS["icon_info"], AppConfig.IMAGE_PATHS["icon_msg"], Msg.STR["sel_tl"], Msg.STR["tl_first"]) def handle_connection_state(self, action: str, tunnel_name: str = None) -> None: """ @@ -833,6 +879,10 @@ class FrameWidgets(ttk.Frame): if __name__ == "__main__": + + _ = AppConfig.setup_translations() + tips = LxTools.if_tip(AppConfig.SETTINGS_FILE) + LxTools.sigi(AppConfig.TEMP_DIR, AppConfig.USER_FILE) window = Wirepy() """ the hidden files are hidden in Filedialog diff --git a/wp_app_config.py b/wp_app_config.py index fc6dbc5..26cc313 100644 --- a/wp_app_config.py +++ b/wp_app_config.py @@ -46,6 +46,7 @@ class AppConfig: "ssl_decrypt": "/usr/local/bin/ssl_decrypt.py", "ssl_encrypt": "/usr/local/bin/ssl_encrypt.py", "tcl_path": "/usr/share/TK-Themes", + "pkey_path": "/usr/local/etc/ssl/pwgk.pem" }