From f939933a7ce7f25d57906c23023ededbbe7de6bb Mon Sep 17 00:00:00 2001 From: pika Date: Sun, 30 Mar 2025 20:32:22 +0200 Subject: [PATCH] wip --- __pycache__/config.cpython-313.pyc | Bin 0 -> 1762 bytes app/__init__.py | 11 +++ app/__pycache__/__init__.cpython-313.pyc | Bin 8222 -> 8827 bytes .../template_filters.cpython-313.pyc | Bin 0 -> 1781 bytes .../__pycache__/db_seed.cpython-313.pyc | Bin 1813 -> 2362 bytes app/templates/dashboard/server_view.html | 72 ++++-------------- config.py | 28 +++++++ instance/app.db | Bin 0 -> 36864 bytes wsgi.py | 10 ++- 9 files changed, 62 insertions(+), 59 deletions(-) create mode 100644 __pycache__/config.cpython-313.pyc create mode 100644 app/core/__pycache__/template_filters.cpython-313.pyc create mode 100644 config.py create mode 100644 instance/app.db diff --git a/__pycache__/config.cpython-313.pyc b/__pycache__/config.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad7ce61480dca938aa82e1e1e9e8e43af2cd5741 GIT binary patch literal 1762 zcmZ{k&2Ji45Wsg~`SgOp_#?)cI#yGODluxM^kB7>U|AAs8DAa?2@-@ zOXg&$Qg4-#LzL!}9^3y0$(QZ+*pqLmpsLhUXBLPt!E>0Moq2EG>~H4nAQB04Akxnl z&9A*2_ZPlQ#5XnuM_|0<2uJumj&V1*ZH{=79P!@uj8-t-^$FnfRr$M+2ZecDuOGaD zDX-V{2EiMe@(N8p6TZN0+@GW};%8xaE|35do54)T@k@sOxYfMC`g>x&W@=k?*R$hh7`a4(7M4TX{daa{T>Vzrn7>(mL+9IXTj%)34WRcRxEoNHn zmagdrgaec|j5-(|!*l|ge$rxw?s%J;#r#l;lO_-MbNkYL`QQ;%m7KIk4=ROHu_Wcx zQl(6s*f(mCN<=AAxtz=I%LQkJ$b>+QN|nl9Nv2T!p&~mgl$ut}YSn4YvRLcr*wRc& zSpW_hASdT`wxe6wCq_rhHfmNaTQKU!9Zk2)EPQje(XuQfJ4VtyW!M{6Au#hcsGqn$ zgjGA9c$IvSe3gEY{#ESnNayjw*;n?hkNd*5y|&R8mhIHdb77q=Pqxo*__q*#zv0Bo zd{w^^h2V@R@fioa5`p;MH9Z7-!_f4FW*`%E;sxzQYa3nsym8<0CiD_h{z>~)M=a#j zTs}u+dZ_IG7c-x=Tb8z)&1P%e?oQ*#MOe;=EC?xB2o)w{3#f2F9bZAtAKqgTbYSre zN7PxH>g?1BC1-IeAWQcvEP;ElQ6p?CXst~Yo@L$wh5R>dF?J@~>8&?UUq5}Lzt(^I zuKz{lJpG_AY}l*GA1k8_xOqPK?;$cDJOK1p14;}Q%!q>Z&Bzt_E_i@1!flJVw=MR7 z!TqRPEkhsk$Gp9zOZNnSk*!07B|)iU($Q;4vkh401XP)*rSdFrmcm3!xMEe259EWq ztX#b#b3uQAyHH_;<|m*KbjlXv06LmDyLS!k)K*_uw>M$hlOyPu;|g>h94LbiL0tn~ zV1D>b1pr>qo!p43nN~}0j;Y;%oxR1eZ-PwiEnUv&Zb$1F>~yy{h8MaX-c3k0f`qqe zE)1-cp~8dBRZs|H-Ht9Hhfi_J)>7xf^5~0kVa7L_djagx(7Hg~L{~@J34T8MX@1E* zg2hP3{0!7vFVFLTa-n|(AHV%K2Wl7<_>EuuLk=E8(a&!`KN)iH7{&yC^Lgm F{0}iMcM|{r literal 0 HcmV?d00001 diff --git a/app/__init__.py b/app/__init__.py index 9c3210c..4ce705f 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -108,6 +108,17 @@ def create_app(config_name='development'): except ImportError as e: print(f"Could not import API blueprint: {e}") + # Register template filters - IMPORTANT FOR MARKDOWN FILTER + from app.core.template_filters import bp as filters_bp + app.register_blueprint(filters_bp) + + # Register template filters directly if the blueprint method doesn't work + from app.core.template_filters import markdown_filter, ip_network_filter, ip_address_filter, get_ip_network + app.jinja_env.filters['markdown'] = markdown_filter + app.jinja_env.filters['ip_network'] = ip_network_filter + app.jinja_env.filters['ip_address'] = ip_address_filter + app.jinja_env.globals['get_ip_network'] = get_ip_network + # Create database tables with app.app_context(): try: diff --git a/app/__pycache__/__init__.cpython-313.pyc b/app/__pycache__/__init__.cpython-313.pyc index 0ea6980dc63903200ecbb4dca1a0b7c2be53aab3..25aafc2cbc39c9a07a125cb0834f95ccdb4dae6f 100644 GIT binary patch delta 1932 zcmb7DT}&fY6ux(UI_&^0KmDNtohb#%?{xcY?1%MgPj5s5$e=b#sB2XEX9iwDghh7jC z*MIv6is)^4!Y#>Gosw-jEtl(zT%ogarEbC$33(|8=Ip{cTEr_mRfku-d3-jH*Qq*( z*aJyl0KB9@`IudHta#8Tl$-WMMD#T^QdYzWi>Q{a$5qbJ^=+ckyQeJ1h|~>LhX9t$ zJ^Nw31gqYn2e9f(dK9CTAsEi%Cexe7ZL7x`WKpjq=TgoVm)r9rm5*)Gi`k8OmF(B; za+B_mn{}rbM5?e>IjmK}hhu786Anh~c}4nA{z!>0FLC^jCiQuR^BBb?qpjU=08kr< z1Pi9n`!)gn&TtT4qNxQvU`rYbw}Z#zQJycz3{RQO%U)z{Y5!P<+^M_pSX@3}+=LfQ z4;x&ysW8&8#|PAAwM=app!DiUwGuU01*^6e@g-%UkTElN6Qd(424Ryh)0i%w3QaCt}?#8n^irsO*?kr*p$FRE&*rx;#Hm0T597FFup!XCN zuMLY0pbkuz8k^>T)|r1*9RB`?I1m2jpUdORoCGtd!`y`KZ~{$DsOTr|8Eh|MdlFqX z3odG6N(H)Y*tP%{z!S6t79g%1N4s1NY)5yw8g$2OhkNT2XxAKqy_qL1pYiDyCTCmG zlFRd}*Yw$iSbQy-%vHn^vwC#x+G=vSIHb+bC!?v95wb2u*JcaMoY^RoJOimFX&oCK50cQ|yqO|jsz0^!m zig)$H+i1k~>R#$fQ7Y>?Q~m*2zd)b^LrZ@~s=f-xb8an>2wYiBMgwcnl|)=yi|!vO zl^iAH3k04bKsKDSEXDLCZ8oZ3&2f7JO69o4`0AV%Poa0*r{Fkx;2wlt#0c6Vd80Wl zme5va=Mp)SmWUC{@9VICREy*|X*NmVGJ$CV8UgZXl5PTC0#z7N#6zD7Rp_q3eL zW!xLBS*CHP_4H%0_AJwMWGpaL%-a&MxNX-2__CYQo6?UKVV81RdUi7RYDEZNLce%E zrY=BqQw*mk&VYN3zR4kQ-|P$e!2LE~$P6AfKxL4A=s&C2sjvLQ9iagAjg!KmZ_o5i z4$$BALxMwmP@=a?)}TOd2`uq_e2AsD+N~i#X90`-teFqB(b-CC$WLeeEb#-pQo&~X ztx74oZDRUyhi#se-Y#WvV!MJS5j(H+vD>0m>0-CrO(fgJl1Lv-{6Su|piQaY6vwko U-a(zgT^PF8}}l delta 1290 zcmai!U1%It6vywGyOYk&va{RlZg*!U?S3S28@FjDiTNtJX|Msao6JsTc55*uMKBS> zj_wV(E(o+gHVhfT#~*@!V`(7t-Q9{O8p>3yEt=c`gS zp-+M6%~(b>iI(G~#KjbTDd{{_({V?7GTft})&qQys+{J71>K$Q%_G+I zmE%LT*#F7gHL(qN1kW8xZ|UxZgN3}2e`|P;8mxO@aXOI)sS928i5_+0A?net`lP{5 zb&DT)hzNn?l=fesdkF*&TDpzH)Ar{O;fdtyg97dbG$hxlidQf zGQ?XUt&--gv@Gnr>Zo#STytc(H6NIz4s9+wH+1cd{+Ff02vpyjpPO_dQ{HQ#B@ulZpesQB%f0JDCgSnI>>~R3N!-}_9 S@ivRxX2IVBXC;X2Py7cdxa_U~ diff --git a/app/core/__pycache__/template_filters.cpython-313.pyc b/app/core/__pycache__/template_filters.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f27479d67f728cd1e2e3ffdb8e5f973a4c086cb7 GIT binary patch literal 1781 zcmcJPO>f*p7{_P)vT?jGE_6fEmNsUS&}>!krBQ{%o7zw)rK>6igw#luW6v&2)-M`Q zS{ex{;?yq?kz*yedOfIDIW4m$%4UO5NskF+4u&c!xmEso~0Y|=L%I!w5-&SEibDJ(r^qd zEEkrHe4_oiXHMQFwEHXd)^5z%3z}%G% zNqDhILXY^47x@J8)xkr;q#cC`M|Fwof$zkwx9YYC6&Zp>5%VM>b(4Q&1tGJ(jRIo% zE_1EL$Xg3Y$P&vZcPzinSY)|zY3^kr}Og zM?7|I8}ov&c&xE4^YM1<`aUH|LQkYi_}Ya^`GnGlf>H6>J{>ZqWzqfG{t9zar{KMy zHMj_}f%*kmt?n69yT;5TW9Gr)!-*Z^a#y?j&t7q2fUsJ9Y@F=N(Ed9p!GIsDljtXX zR{j~!$|=7rn-};A0%=X&g5Y@k@;z}RK|CTTtzR4wOo1H+n5C2fY}92s0eR3jg}ea* z#VEDo!{O;KWy%qz>xY|+u?W9ah|+RZuF1n(wJI8`AGs-o=wU zcydec;hE=>f-3_VNwa+s^-D-nvhGq3&pnq^Tov7K_eIpN9JjkWHQ&Sa(eMjtl&1Y3 Di+y^D literal 0 HcmV?d00001 diff --git a/app/scripts/__pycache__/db_seed.cpython-313.pyc b/app/scripts/__pycache__/db_seed.cpython-313.pyc index 9f31c6dbdbdc7001887bc8dc0084eb65dbce8703..02a29fe84be3d508f10ddce0bd537b626582f999 100644 GIT binary patch literal 2362 zcmbVNO>7fK6rT0&dMA#Z#0ep>(i`yqa;OL=xFAL4P>%G*y%#PZq+YO+D%RAfhn~0vC5NiL^v&9vSQHhNkv;R~&3oT_ z^WK}cJF!>~cF+z@P9hpvmQvwY955xYkXcAcEUZ-uHt}F3bd^vho-LP|H0Mwc zM5LTc=tYAo1Oo#h!heUtd><_ad^8_8y2n9iUT)j8$cfgf38%kCNdE<)MIn&VLYk;a zix7h5nCI5s7>7{?O|&#Lc}lX;q8~giHXnUMnDe^-&CBf}sAw@BoNHlC$srAE9e^sl z2dWVG1*m;{sF9qYb!yQm(GI-_W~dFbKfug|w3ybVb!$CS(qcO|4%}YO&4g_69o7Z{ zwEZ`s-(R)9HrxL{qtd?i$h#_Hc;9M3 z1yu=|8x45c!F|l-!9!?K4NerKPa`RnJkql_p)#;lc8USnbMA9ZzQ`KTc=U$1=xH zvhby)CCeZS@Z=@KGAYAF$Iv~?u~~;+@tnMC=r)V$hG(sk{EFjxE>i#udP24u-3QAa zs~#Cso6SPaMj{IMq`?m6D7IcAEMk@Ox@l74x-9HA8&1r0j7o{vp6^6e zxk3sm^q%U8G4%>58cvDui?z6Kv7?vEMXPy(bV_8BZz$ZfPWkJ5H3t(D7rvNd(w7Sh zbKsE(O02UC%`IL0atIR`U{R|C;$y`fgvTl|vyBhbGGvvA- z`7}5PR&fOk`j%x<(yb!HmJ2uK@*kXs-0*y;E+Hm?lvNA^0N{I6{fu$i?wrK-e?Q-~zXh=K)EV zZ?G6A@?6WW+bn=`V0Q(g{~g*5BiwcS=B=AsN}{GDHk6_Ds~d{ih!51`hwA;q^@GVq zV))1856Oq;9*n&1kb5I*;oT_e=)4=b6S>=Ur|aJ8CLRHp-obkRNPXbLdS9ZRJojIc z-M#gA(igk@T9LXVYvOLC9njsxL%SHo;`g+Ng~t<5mTJ+j8qpru8IPx*T&qPdZOdXj zvL=I2(~m8jtl{MP#3nw(FBH99y;a>(25QQ{hLTvnyrGOVdJe2FzZgIB{A8_XZcVP^ zSWD;BCLU|x$lh%#n|OFzlI3)ZxrGxooB)p+IQF9J=&yME&qn8g9TaMl7^>kRP~#Fk zA3cgc5{^jyE|1_GKocchGvrqF@WKi9DMIsgCw literal 1813 zcmbtUO>7%Q6rTO_Zk()}G-=Z$v|Sv8FiPyCrJ)WGQ8hux5kbjf3bK&3-W?|^?A>K% zT@oXt

^p4phpKW4ZOnomTW1t3jzot~k(3Z$U-^!G$-DH?9z(hrGkQZ{E+mpM7sz zx*kVB;rg@HpCp8S<(G)W4rt8)xPwe&3X3Qw5W(PBToiK>k#aJTa|%(~GHEfEQ;7;# z9z{f3RZ_8M{E?KvM5mOJSj?=IJRAbYs!d;4k`$d z!W2x=luS7*d8oiG+GHwbERReTq(VVCmTGyy>@nkJZ&voiLM)Q6Xc6l2mEJCn(3K7_ z`({5u$eKl{!1HR8sY4cttmsL3X+@8uU2dMb(#hFCg+wG@>5ovCuMBo^g!0mfywQog zg%f#;UGEDos{Bk;ZzOMW96!>UsJ`FvqidozZik9OLOeu@e_R7@N z8@Ob^y3~ipjT^XP`&Dd&KENaCMB%Gs;FB;pYh0b0Fp}X$fB`2%J4nLS!PMqgFi(E{ zSxRPdJ5cN>7p6PDU8`a*Jjym!Y+gT%(ATq=ve02%m zQ^FUGDPPnu*n{z}j;7K7ZXZpf5?xM1J2ux{g^ z-F}Vul}gF7KTj!yuOKIpiMTk$-fU3F#L=1W&QDdYF+3FjWMn@p_0o z{yFK<*FANtsrnAC(0|Pc(~tGAU2E-;X}A1))Pk6ZjKjgSx52qq!E@wwxblB8JqyR7 ZBnZM2l>7x{8YuGwU1-T?g)~Wl>K}&VfT92Z diff --git a/app/templates/dashboard/server_view.html b/app/templates/dashboard/server_view.html index b6a8ae4..5629817 100644 --- a/app/templates/dashboard/server_view.html +++ b/app/templates/dashboard/server_view.html @@ -103,79 +103,37 @@

-
+

Applications

-
{% if server.apps %} -
+
{% for app in server.apps %} -
-

- -

-
-
-
- - Edit - - -
- - - {% if app.ports %} -
-
Ports
-
- - - - - - - - - - {% for port in app.ports %} - - - - - - {% endfor %} - -
PortProtocolDescription
{{ port.port_number }}{{ port.protocol }}{{ port.description }}
-
-
- {% endif %} - - {% if app.documentation %}
Documentation
- {{ app.documentation|markdown }} + {{ app.documentation|markdown|safe }}
{% else %} diff --git a/config.py b/config.py new file mode 100644 index 0000000..7f66bca --- /dev/null +++ b/config.py @@ -0,0 +1,28 @@ +import os + +class Config: + """Base config.""" + SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-key-placeholder') + SQLALCHEMY_TRACK_MODIFICATIONS = False + WTF_CSRF_ENABLED = True + SESSION_COOKIE_SECURE = False # Set to True in production with HTTPS + +class DevelopmentConfig(Config): + """Development config.""" + DEBUG = True + SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'sqlite:///app.db') + SQLALCHEMY_ECHO = True + +class ProductionConfig(Config): + """Production config.""" + DEBUG = False + TESTING = False + SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'sqlite:///app.db') + SESSION_COOKIE_SECURE = True + REMEMBER_COOKIE_SECURE = True + +class TestingConfig(Config): + """Testing config.""" + TESTING = True + SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' + WTF_CSRF_ENABLED = False \ No newline at end of file diff --git a/instance/app.db b/instance/app.db new file mode 100644 index 0000000000000000000000000000000000000000..43782aae130898b5f34ec3f6eb0ac8636a3e6a59 GIT binary patch literal 36864 zcmeI*-*4MQ00(e8>GEp?Zz@xSinbfwL?dmf?KHpk0P|XRZI`BPlD3ww&*>g?X8bztHAGcmzUe&7i$Q}J2nK9cu{o-0xU%p-O z!e;!#Nt3F+s8{vMyj~+L$l+iC>vkn;x2njeUmW@VQrhz7-kZZB~{y zHg(nx7WBL1m84$Phtw6IlTK`#Xo)md)e)6SXoBea<_=`}Wq=Uc{%Gxs9{TBya z3|7;Q-SV66u*|Iadj&9BuKAEQyq4gQVYBuRzhzh!Z3jwV?7McuVG;kr;5B{;4659W zSAujReLWOOX;Y%W>yz_YhxO_k-YfI%#sH$B3|7MIjV9*3*(BK%lI{x9_iTm%0uX=z z1Rwwb2tWV=5P$##AOL~a64(gEh3TpDLQK;XIm3Tu)ww0ROUp*{{sUE3bJykU^{h;k z;tjQQBdcVJN+DM$jEgC%H8C!v-#;(JS(YU=qvVSjB_p$3*LHTy7Ck0Yxsb`0WVxum zlIbuepJ1g5NzVl7ne@kN6%dIb009U<00Izz00bZa0SG_<0ucD02uR^+@ukZTq4VK% zJb3NEyZf-Q~{}ifTSLHm2m={}-j-1vX-U00bZa0SG_<0uX=z1Rwwb2teTN z7kDo`8-L|`gWvyuE=bSc{sN)|5P$##AOHafKmY;|fB*y_009UD1Y+Toe=WfO{=aL2 z^qq7qkOCVJfB*y_009U<00Izz00bZafm15*AQTfWUlKpkG^hWNJ=eE z^fYm)!$$9kAi;mQ&&oICQYNn!=1TdoF(pTg2~$_&n=E_&R1xLHC-oJ1n$&n8Q4)#z zuIUgq8pPqB8z6rAOfYNqrGoyq{N+ofF);;M@%#T51?gMq;we3?C^iHj009U<00Izz z00bZa0SKIW0W%a8E{Uv1-n8vK$2D4eUN`^1+%uDjWa49T|8jkK{eidkqEGIcy5OMOt`XJzM7WcNx literal 0 HcmV?d00001 diff --git a/wsgi.py b/wsgi.py index 0895bb8..a5de29a 100644 --- a/wsgi.py +++ b/wsgi.py @@ -1,7 +1,13 @@ +import os from app import create_app -# Create application instance - production +# Set the environment variable for database URL if needed +# os.environ['DATABASE_URL'] = 'your_production_database_url' + +# Create a production application app = create_app('production') if __name__ == '__main__': - app.run() \ No newline at end of file + # This is only used for development + # In production, a WSGI server would import this file + app.run(host='0.0.0.0', port=5000) \ No newline at end of file