From e1dcba19c1c217a9460c8ca89a0a0ebde1e95762 Mon Sep 17 00:00:00 2001 From: Dominik Chilla Date: Sat, 17 Nov 2018 13:09:06 +0100 Subject: [PATCH] uwsgi with vassals --- app/Entities.py | 5 ++ app/Gulag.py | 2 + app/Resources.py | 28 ++++++++-- app/__pycache__/Gulag.cpython-35.pyc | Bin 0 -> 3559 bytes app/__pycache__/GulagDB.cpython-35.pyc | Bin 0 -> 4751 bytes app/__pycache__/GulagMailbox.cpython-35.pyc | Bin 0 -> 3134 bytes app/__pycache__/Resources.cpython-35.pyc | Bin 0 -> 1890 bytes app/gulag_helpers.py | 54 ++++++++++++++++++++ app/gulag_server.py | 52 ++++--------------- config/gulag-config.json | 38 ++++++++++++++ config/vassals/gulag_helpers.ini | 5 ++ config/vassals/gulag_server.ini | 10 ++++ docker/gulag-server/debian/Dockerfile | 2 +- 13 files changed, 149 insertions(+), 47 deletions(-) create mode 100644 app/Entities.py create mode 100644 app/__pycache__/Gulag.cpython-35.pyc create mode 100644 app/__pycache__/GulagDB.cpython-35.pyc create mode 100644 app/__pycache__/GulagMailbox.cpython-35.pyc create mode 100644 app/__pycache__/Resources.cpython-35.pyc create mode 100755 app/gulag_helpers.py create mode 100644 config/gulag-config.json create mode 100644 config/vassals/gulag_helpers.ini create mode 100644 config/vassals/gulag_server.ini diff --git a/app/Entities.py b/app/Entities.py new file mode 100644 index 0000000..13f37a2 --- /dev/null +++ b/app/Entities.py @@ -0,0 +1,5 @@ +class Mailbox: + +class QuarMail: + +class Attachment: diff --git a/app/Gulag.py b/app/Gulag.py index 8c0589e..0a64e5c 100644 --- a/app/Gulag.py +++ b/app/Gulag.py @@ -9,10 +9,12 @@ class GulagException(Exception): self.message = message class Gulag: + version = None config = None db = None def __init__(self, path_to_config_file): + self.version = "VERSION-TODO!" try: with open(path_to_config_file, 'r') as f: self.config = json.load(f) diff --git a/app/Resources.py b/app/Resources.py index f1080b6..dc0333a 100644 --- a/app/Resources.py +++ b/app/Resources.py @@ -1,5 +1,5 @@ from flask import request -from flask_restful import Resource, Api, abort +from flask_restful import Resource, abort import json class GulagResource(Resource): @@ -29,9 +29,29 @@ class GulagResource(Resource): class ResRoot(GulagResource): def get(self): - return {"resource": "root :)"} + return {"resource": "Root :)"} + +class ResMailboxes(GulagResource): + def get(self): + return {"resource": "Mailboxes"} + +class ResMailbox(GulagResource): + def get(self,id): + return {"resource": "Mailbox by ID"} class ResQuarMails(GulagResource): def get(self): - return {"abc": "1234"} -# return self.gulag.get_quarmails() + return {"resource": "QuarMails"} + +class ResQuarMail(GulagResource): + def get(self,id): + return {"resource": "QuarMail by ID"} + +class ResAttachments(GulagResource): + def get(self): + return {"resource": "Attachments"} + +class ResAttachment(GulagResource): + def get(self,id): + return {"resource": "Attachment by ID"} + diff --git a/app/__pycache__/Gulag.cpython-35.pyc b/app/__pycache__/Gulag.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df7ccbdfa90ba3bd07fff794391a2021c106268f GIT binary patch literal 3559 zcmZu!TW{RP6+T09?-#G`Qk*!lkQUjZE1_X*naQNK)fnZy&{BELX?z+i!7g|09|m7e%T@=Ln6L|0g##u^;9%ilm9I%peN>B%5) zPxn8~TGPs-p(o?C8-*CGJ$?4cXMMLDyoiR`>W#*n$>VuuKLeEqD9H|p#5VQTcvIM> zNj@qj>w>*#Ev&4m7oE>`;PDjv<1d$oC`kikEND#RXu}=0#X(zSrM^rO_f$erE0Mv8 zDuM4Gq$>El{&4Rs>dQSp>UYEL`Cg*Dz0+>GcgnlnbK`hVue=*yW@X0#OX@gfUP~(= zMjMNY?ap}G1?CUkzI2?d>Nx$#9|T;lJI>328{{Ke6IH`}TA3T9%6&x;E{O$F7e%3a z-fqeVV0nuvVNe)xZqNeF-EYI=Gp7R{xx2H1-p{ptdFA&|w0-}B%H>Ze)mDZ8fby3u zni!M{>KQaP=qk6qNk=}>Z$3XpSI?p=B5@RcKthNV8i2n@X^DDe9)ZXP%2$HE2n8Kq z{*uxPyRZi!n6w3bw{Elw3$5Zpt3+E@miB&?j=~?4mDcFIO6qG86O-U8!s=s_dUdU* zNnaUs^aT{f3x+REI%W;f0`Lzqp+*}Ie|_-y>66amr@wmCnWOKg+nM3Nu#1UQucXSX z0V-KJc9Y~HQhsK!Z`+N`ieedNRxgP_gUI!>q8EiH-P5e#1rcP}wV9cu3gj}$%5vxd zVJDGdY^fzCCKHBh+focWdnI<$GbfFld@ARp8^}zYWJ10P9!AwIl;m9y5~f%dTcU~Y zUBd)z>gTqxEJpd^nnTwUEP&qz%10>L_phMJFf!Q{c;S1Z{pY_oC;I3D0+(${0Rc1x zoPv*$f8auH!He(>_>RK+aEz%PGoCtTjZ*jxjw!HX#6|0EZaIaMEMi)q;U5h~Rx#J& z!k83k3@ig2laj6h7?Uz%EG^R*FoV8=CKZNOuS&fdcOu?xq1P`1WGIvB;%H@Yw6-`} zT^y}1j@A}O8yaCvy4+c0t1q%OVH`wgA@o6DP~Q5MNMljt)`G~w?wX67Ep3V#+kx?q z$zg;V^`P4=@>_hC(KGx~cQ(miV$S{NeVQ!k(+H=7Z<+iR@>gkGC4Y^^OXRQ9xJCX3 zjqBuZ(iqci(HQdY&=~x;_4_XQ@3D8r2s3wRT%oQ$fsu)q!q45g!z<`4g8`nFWbwY3geO7ZnzE4}~U&gEjul68+J(e?v&3PaD9nv|d z!MCkP?&>wyc+IYkX%p-#JX(bdbCj+ZnwU-?wZ1A?`If zkWSaP%hxp-zH&}@$}-oK7pHdd%vX+gVwd@=$7)C4o$ ztJ4i)nb9gPQssteHFE|Fv=rd97~R>>1&#WU&pxCt7* z^det6(`F%vF3?+2G7el%W`!gUx~W}veV;P{mCGX2kRk4l3pY5=>b%}u?_xe*)?^7c zOjV0oeLut=HoH(!OjAodgJS5{;nQR2mw! z8;WFB?5b3KmzS&LDlxVi*V>`^#-*3Fy8Sp(>D;i%U5F1PQyUqf(T zQLKn6o@H@o`Y_)PNxjP4KZ5J z6UR3d@@BUyfB9yAh?3j~L0W~o6R8y6qX-eW4|O(!TahnQA2%sS2>o)##0mak+d3F6 zKLh-d?KIk!!*~#$N+c*HFOY7C2+>lKL61D$iKXgBe!HkX#A+J4s?9adH0)JIlP_Z> zJsdb+pNT|mVyG=Nc-}Pil3rmDU)wqYbHYgtX{%0i&ANF|KV&S_W%F@ literal 0 HcmV?d00001 diff --git a/app/__pycache__/GulagDB.cpython-35.pyc b/app/__pycache__/GulagDB.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a80b36ba2eabceca8efb91d02d252da76c6f181 GIT binary patch literal 4751 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 literal 0 HcmV?d00001 diff --git a/app/__pycache__/Resources.cpython-35.pyc b/app/__pycache__/Resources.cpython-35.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce7be94d70ff4575a958c479277ff84328bb6535 GIT binary patch literal 1890 zcmbVMUvJ|?5TEs**h!shbO-5GR9p&AmhPH6{=A$Jx{5oMsv>tZJx&-Q%eA+u6FW|K zZK;h~UXBj{;zJ<5l3#g3d;^}CS;tXZMF?=RWAE(j%x``(yBqCx>(@Jfes^vF{0`S1 zoWnC5@&^!CKx8Sc1>90v8?`n>O{Hzt+9pIg4Bgfrhyh$yT7sVyT;{G`+J{_bg$Q}6@6O`V z430CA4?;4m9}PdA;gC;Ja3JIe+|wu*M2#7scf^L+qZ%h>utbLmpyklD%l2N81fx3Q zASBQ9(3{2=IAj~eC4)-X@O+OlskCUZ`TYA&;Yx$^hd0%i8ZC9{m~2Mxr5 z@^E$lZ_XaWn;f}CwiUx~8KdSIx{ZOio{K`}Jo0BEJCC_Mihn_{rIm6igAt!^y`C;C zdSMdtY2Mp^^(crUf$Q6@DJb!BP4G0!xlejQe3Xqao1VlYVdBI!gpDt+xv+|7rAg5) zyw3ID7k)fbg{VY}+}sOKc{uTJm^rv0J1BrP*KYmxUnMR18&! zZ}0=zt!hz`pJQ99&P2wDu4;`+fVHan3kx+?bZ*j?L!d3#t4J~)rkY`UFt>JJ?LRtr z@ooGQ5-SM(d}E>No$?^!qL;=}#?#TZX9u&`pYRJA|BS}-^})-d-tOz8FJB(+doP|Z z`L?QkQqijj7kALFt5rl>3op0XY*mZ|MSi-0=8`A|w$3`N&AM!Ue-(XX>{`_A(;(%( zU$%Td&7vZqZ^!q~iXf?0DjaL*Qc!ioT@rM#t_g}L8YrkQBz1+u8q6`BHKkpBacrU4 zt&0O|LstfJO*fNKT6i=Mvn*fMmk!+WPN1k*I@}b~O`;D<8{1diTXRd`w%$`$fpnQ7 z@D|`wAMyMF`lwI&+9KKx>Ic}}_i#c1wviH<&~ong{6cUz@-k_2*6T_0`r y?PE>ylOhp1S_nFvs=Z5NEVHR<4@H=Au!`Q&{;X=u&#CyTxjSr&Ia+tKYy1sLm36TI literal 0 HcmV?d00001 diff --git a/app/gulag_helpers.py b/app/gulag_helpers.py new file mode 100755 index 0000000..9b8ce2b --- /dev/null +++ b/app/gulag_helpers.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 + +import argparse,sys,os,time,signal +from Gulag import Gulag,GulagException + +parser = argparse.ArgumentParser() +parser.add_argument('--config', required=True, help="Path to config file") +args = parser.parse_args() + +child_pids = [] +importer_pid = os.fork() +if(importer_pid == 0): + # Child process: importer + try: + gulag = Gulag(args.config) + except GulagException as e: + print(e.message) + sys.exit(1) + while True: + try: + gulag.import_quarmails() + except GulagException as e: + print("Importer-Exception: " + e.message) + time.sleep(gulag.config['importer']['interval']) + +cleaner_pid = os.fork() +if(cleaner_pid == 0): + # Child process: cleaner + try: + gulag = Gulag(args.config) + except GulagException as e: + print(e.message) + sys.exit(1) + while True: + try: + gulag.cleanup_quarmails() + except GulagException as e: + print("Cleaner-Exception: " + e.message) + time.sleep(gulag.config['cleaner']['interval']) + +# Parent +child_pids.append(importer_pid) +child_pids.append(cleaner_pid) +try: + print("Entered helpers main loop...") + while True: + time.sleep(10) +except: + print("MAIN-EXCEPTION: " + str(sys.exc_info())) + # Destroy childs + for child_pid in child_pids: + print("Killing child pid: %s", child_pid) + os.kill(child_pid, signal.SIGTERM) + diff --git a/app/gulag_server.py b/app/gulag_server.py index c45d6f1..f2a8e6b 100755 --- a/app/gulag_server.py +++ b/app/gulag_server.py @@ -1,49 +1,15 @@ #!/usr/bin/env python3 -import argparse,sys,os,time,signal +import argparse,sys from flask import Flask from flask_restful import Api from Gulag import Gulag,GulagException -from Resources import ResRoot,ResQuarMails +from Resources import ResRoot,ResMailboxes,ResQuarMails,ResAttachments parser = argparse.ArgumentParser() parser.add_argument('--config', required=True, help="Path to config file") args = parser.parse_args() -#child_pids = [] -#importer_pid = os.fork() -#if(importer_pid == 0): -# # Child process: importer -# try: -# gulag = Gulag(args.config) -# except GulagException as e: -# print(e.message) -# sys.exit(1) -# while True: -# try: -# gulag.import_quarmails() -# except GulagException as e: -# print("Importer-Exception: " + e.message) -# time.sleep(gulag.config['importer']['interval']) -# -#cleaner_pid = os.fork() -#if(cleaner_pid == 0): -# # Child process: cleaner -# try: -# gulag = Gulag(args.config) -# except GulagException as e: -# print(e.message) -# sys.exit(1) -# while True: -# try: -# gulag.cleanup_quarmails() -# except GulagException as e: -# print("Cleaner-Exception: " + e.message) -# time.sleep(gulag.config['cleaner']['interval']) - -# Parent -#child_pids.append(importer_pid) -#child_pids.append(cleaner_pid) try: try: gulag = Gulag(args.config) @@ -55,10 +21,18 @@ try: '/api/v1/', resource_class_kwargs={'gulag_object': gulag} ) + api.add_resource(ResMailboxes, + '/api/v1/mailboxes/', + resource_class_kwargs={'gulag_object': gulag} + ) api.add_resource(ResQuarMails, '/api/v1/quarmails/', resource_class_kwargs={'gulag_object': gulag} ) + api.add_resource(ResAttachments, + '/api/v1/attachments/', + resource_class_kwargs={'gulag_object': gulag} + ) if __name__ == '__main__': app.run(debug=False, # will be overriden by uwsgi.ini @@ -69,9 +43,3 @@ try: sys.exit(0) except: print("MAIN-EXCEPTION: " + str(sys.exc_info())) -# # Destroy childs -# for child_pid in child_pids: -# print("Killing child pid: %s", child_pid) -# os.kill(child_pid, signal.SIGTERM) - - diff --git a/config/gulag-config.json b/config/gulag-config.json new file mode 100644 index 0000000..db16f69 --- /dev/null +++ b/config/gulag-config.json @@ -0,0 +1,38 @@ +{ + "daemon":{ + "listen_host": "127.0.0.1", + "listen_port": 5001 + }, + "trusted_proxies": { + "rprx01":[ + "172.16.100.5", "fd00:100::5" + ], + "rprx02":[ + "172.16.100.6", "fd00:100::6" + ] + }, + "api_keys": { + "HIGHLY_SECURE_API_KEY": { + "user": "GULAG APP" + } + }, + "uri_prefixes": { + "root": "https:///api/v1/", + "mailboxes": "https:///api/v1/mailboxes/", + "quarmails": "https:///api/v1/quarmails/", + "attachments": "https:///api/v1/attachments/" + }, + "db":{ + "server": "127.0.0.1", + "user": "root", + "password": "", + "name": "Gulag" + }, + "cleaner":{ + "retention_period": "12 hour", + "interval": 10 + }, + "importer":{ + "interval": 10 + } +} diff --git a/config/vassals/gulag_helpers.ini b/config/vassals/gulag_helpers.ini new file mode 100644 index 0000000..200b354 --- /dev/null +++ b/config/vassals/gulag_helpers.ini @@ -0,0 +1,5 @@ +[uwsgi] +#uid = 65534 +#gid = 65534 +processes = 1 +privileged-binary-patch-arg = /app/gulag_helpers.py --config /config/gulag-config.json diff --git a/config/vassals/gulag_server.ini b/config/vassals/gulag_server.ini new file mode 100644 index 0000000..efa0ddc --- /dev/null +++ b/config/vassals/gulag_server.ini @@ -0,0 +1,10 @@ +[uwsgi] +processes = 4 +cheaper = 1 +cheaper-initial = 1 +cheaper-step = 1 +plugin = python3 +python-path = /app +wsgi-file = /app/uwsgi.py +pyargv = --config /config/gulag-config.json +socket = /socket/uwsgi-gulag_server.sock diff --git a/docker/gulag-server/debian/Dockerfile b/docker/gulag-server/debian/Dockerfile index 3628d9c..bd83831 100644 --- a/docker/gulag-server/debian/Dockerfile +++ b/docker/gulag-server/debian/Dockerfile @@ -9,7 +9,7 @@ RUN set -ex ; \ && apt-get -qq --no-install-recommends install \ uwsgi-plugin-python3 python3-setuptools python3-flask \ python3-flask-restful python3-mysql.connector \ - uwsgi uwsgi-plugin-python3 + uwsgi uwsgi-plugin-python3 procps net-tools RUN /bin/mkdir /config /socket /app COPY app/*.py /app/