From f654fb1dd0871d07641b4a84a79033127211cc57 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 4 Sep 2025 17:10:11 +0200 Subject: [PATCH] v --- app/migrate | 3 +-- app/sbin/api | 43 ++++++++++++++++++++++++++++++---------- app/test/test | 5 ++++- app/vault/host_vars.img | Bin 26214400 -> 26214400 bytes 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/app/migrate b/app/migrate index 337f443..8d037fe 100755 --- a/app/migrate +++ b/app/migrate @@ -3,6 +3,5 @@ #!/bin/bash rex "doas sqlite3 /4server/data/contracts.db <<'EOF' -ALTER TABLE containers -ADD COLUMN secrets TEXT; +ALTER TABLE containers RENAME COLUMN secrets TO secret; EOF" diff --git a/app/sbin/api b/app/sbin/api index f03a775..5b25ef0 100755 --- a/app/sbin/api +++ b/app/sbin/api @@ -59,7 +59,8 @@ def init_db(): domains TEXT, status CHAR(20), created DATE, - bump DATE + bump DATE, + secret TEXT ) ''') conn.commit() @@ -94,7 +95,7 @@ class ContainerModel(BaseModel): status: Optional[str] = None created: Optional[str] = None bump: Optional[str] = None - + secret: Optional[Dict[str, Any]] = None class UUIDRequest(BaseModel): UUID: str @@ -109,27 +110,27 @@ def redirect_to_odoo(): @app.post("/container/update", dependencies=[Depends(verify_api_key)]) def update_container(request: ContainerModel): env_str = json.dumps(request.env) if isinstance(request.env, dict) else request.env - + secret_str = json.dumps(request.secret) if isinstance(request.secret, dict) else request.secret existing = execute_db("SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True) if existing: execute_db(""" UPDATE containers SET email=?, expires=?, tags=?, env=?, affiliate=?, image=?, - history=?, comment=?, domains=?, status=?, created=?, bump=? + history=?, comment=?, domains=?, status=?, created=?, bump=?, secret=? WHERE UUID=? """, ( request.email, request.expires, request.tags, env_str, request.affiliate, request.image, request.history, request.comment, request.domains, request.status, - request.created, request.bump, request.UUID + request.created, request.bump, secret_str, request.UUID )) else: execute_db(""" INSERT INTO containers (UUID, email, expires, tags, env, affiliate, image, history, - comment, domains, status, created, bump) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + comment, domains, status, created, bump, secret) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( request.UUID, request.email, request.expires, request.tags, env_str, request.affiliate, request.image, request.history, request.comment, - request.domains, request.status, request.created, request.bump + request.domains, request.status, request.created, request.bump, secret_str )) return {"message": "Container updated or created"} @@ -154,11 +155,31 @@ def nuke_container(request: UUIDRequest): @app.post("/container/info", dependencies=[Depends(verify_api_key)]) def info_container(request: Optional[UUIDRequest] = None): + fields = [ + "ID", "UUID", "email", "expires", "tags", "env", "affiliate", + "image", "history", "comment", "domains", "status", "created" + ] + field_str = ", ".join(fields) + if request: - rows = execute_db("SELECT * FROM containers WHERE UUID=?", (request.UUID,), fetch=True) + rows = execute_db( + f"SELECT {field_str} FROM containers WHERE UUID=?", + (request.UUID,), + fetch=True + ) else: - rows = execute_db("SELECT * FROM containers", fetch=True) - return {"containers": rows} + rows = execute_db( + f"SELECT {field_str} FROM containers", + fetch=True + ) + + # Map rows to dicts with field names + containers = [dict(zip(fields, row)) for row in rows] + + # Wrap in N8N JSON format + n8n_items = [{"json": container} for container in containers] + + return n8n_items @app.post("/container/bump", dependencies=[Depends(verify_api_key)]) diff --git a/app/test/test b/app/test/test index 8939cd5..7e125a7 100755 --- a/app/test/test +++ b/app/test/test @@ -30,9 +30,12 @@ update_container() { "domains": "N8N.local", "status":"hot", "env": { - "p": "123", "BRANCH": "release" + }, + "secret": { + "psql": "5Sg9gDxYQH44QNSPyOx" } + }' } diff --git a/app/vault/host_vars.img b/app/vault/host_vars.img index be98ed9474b76cbda32151b51e8e834cefe8ca1b..441d3941f907bfd385ea8fb8608b80abb4971a88 100644 GIT binary patch delta 1931 zcmWm9c_7qz9LDi}MW$3H3gu`i=tzri%uQn z+E#7oqLY&D4P9HU688J~VCgIKIW99Clu;*o&0ScgQc#|CV~CTxZj zG9+OOwgN~-3br8?X-LO*WFQk+$VLuwu>(7?3%jugdH5ZBu@Ctuzg?e1a z4g8IpXh0*Ha0|C_2X}D~&1k`WJitRd!ecx^E86fB&(MzN=)eoS#4EhU8@$Ck{Db%C zL>Id80Uz-RpYa9%;w!%4JN`ote&8p1@e6(E$G{~{ASXDiw=&MOZoz?ykPAK^HaT2W zw)Bzz*7t6|@QvyqC)>St6=FHgl;bC^-+n8$v_a)mrN2DS^|MojOrDD!%uknAty5gG zUPX7x>O!96N8c45$4}++y0eZ?@cA_URZ*UMZNC2Zd_fLp$`AUQai{*3*^h#zXZM8z zQFZyjIb06EHt$7iQ?x;k%b9(9@-Ba=OwZ-Aayiyu))1B)OP)29rNH8`hOvgT6j>u! zBUz(ZN-REWG)tMK!WzRG%Ti^jvD8`PSmRk5EKQacOPe);C143zI;@E-U6vkKnmdUr z6s*%%IeY%6PO!vYF7uXuh_hvqrv72q=7z=n(bbDQ&+1kSOhw!sC4Pjx{#P&Gk-C=M z)9YG)RkfCiMVy>;?p{T+q&%I->YpQ@5yf-RYIx2mam1B&2g_d=^w9IH%dELhF zye^)^$1b=+zAsS2Ps6*a{LG4}#r*2HhqKna4hxZs?r%5Tv9{$cGKg3B_pV+tyEiqlT%MJFs?HtC*qm3NAp;){;~Z`vYVJdA}A#VI=~hmXDYHmB>C zg!jR&U6y9rs~6^Rv@=8MYIf2jx3I`r#0jK_!dJc7cyQavj3s8x&hPrCWH*@F#^z5n z&rIp^?wKv=Ey3NYN0~->&F)3NHdz`UOaEq@Hz;maRfq9gx%PR*e8qYLeb^5PYD|v& zu58t%vUzmsnAgJS!Ajab+4U9*hkHsB{pybB7JBlP+TtB=Hgzkw2qjup9rtr9ZPd(` zJGS`Sw0Vy1JLl1Bb*Xj3+cEcgL~1WX4Ks55jLZkNsD^7whXzV^cB(6vc?UE;z5TwS zI94`%M@xMF(?<^7z0(^53S}-Lu7+^zu<`ZRo@fgt~`U86FIpzgIi)j8(DX!Ez-d z^`4#Q{2WpqIL{LqNxQSfULua6PZ$uBi7A93VMG`cCWI+5l`tdB2@7HxVM$mK(+O+B zhWL%JCF}@$!hsMIj)W62gK#EXh?#^d;YPRxD5TQgEv6KiWB8X+gaw3vgL98UAh-e~)h$U7Lal~q3 z4G~Wy5NnBbL?W@C*g$L~HW8Z%DIp`0h%Llc0z@*ALTn>ai8Lae*iK{+nM4*>E%wUh HYRdixnL{Ex delta 1931 zcmWm9d0fnS9LMp;Psa{jQ_(TVM2w;uO-TvqQjwxUuFBOhN}|iv^_CQwB1_ncqIGn+ zJ4XszIxHKDvX$Jo9A#Vk{rvHI{`LOnosb|`O`yPG2o#_QB`D(;@Gum^paNB>K^+?4 zLlaui#&C>)4s@XheF!iTqc9o<7y}^;F&5)sgz=aF5hlVICYXfDFohY+A;uI~Kmtox zVJfUK4K}dFbl71AW?~lXF&hqWgcF?Mf;n)78{9D$^WcH`@Pro@U?IHW179q{Vl06l zmSP!}V+B^i9{~u&Dy+sDti?J6As8VDg%s-%hHz{^1U4cPo3I&Ch(-)z5r-|#7Ue&5q`&MoWWU~LorHFiZYbrJTBlOF5xn+;3_Imi7Hg12DOmm8tQNz^=QBi z+{7*XfkrgpHk#3bRqdVJWZ_SxPKr)-Nm`Yba|NONFJ% zQe&yJG+2C=CQFN@%^J=c!O~&rvh-N`ECFjIYZPlV%YZe8C1e@0#-zL zuCOXFNYn6=q+id*tE091Oh{SjjS{84-M+~QGg~%#CA-%O#UidvgJ1k+LyALu>%~D& z<-vQFaqY$SB2F=W@$~UhHP?^}QCas7t-a>n-f@Dmo{3)<)(2>vv$*Z|yy)u;{}GOP-iqDM zGmoz5o+X$1tG_$kp!3))V~1(g>E-KXZbwI)oUaoq@O9U=vW<^0+``LxFf=>xW_d+_ zWw-0IK~C>v9WJcYfg`I+rB2TUBr=b zlD#Q!e7?{1{*hyBquuZMFxX2|Zx5HLq8u-UeT-naw@+QxtY-d#H%Fco=@05bB zw(@iJ`AHunwr9gziUyljt?A&LU3EkCL9(xV$=#*WjS9efeDAyj(9Ac28)z&ZuV5 z4OxjmE5=m6=~%j1o$#9q3#zDP(X0IG$n+mIUx~;33oWFA6VS~6b>r*QE zmzpG{6~iXW&fZurJ^t=Vb>lvJFA>L>NEj0)#3W)eVM>@0=7gA-LRb(I!jiBerV`e~ zG{T0kC8iU0#0+94F^jM#W)lvCBjH3i6E4IY!j*6%+=;owJi>#RPk0hu!~$X=;Z67u zzQiJ8F|ma3BbE}&h~>lzVkO~E1Q3D5Dq=OUhFD9iBZ7!vB7_Jfq{Mn6j0h(-5D~;i zB9hodY$l?JXd;G)CE|!J#8zS(v7OjK#1jcbB9TNS6CidHDa0-!mDo+B5$VJpVlR=w M)!KXQ