works
This commit is contained in:
@@ -4,5 +4,5 @@
|
|||||||
|
|
||||||
rex "doas sqlite3 /4server/data/contracts.db <<'EOF'
|
rex "doas sqlite3 /4server/data/contracts.db <<'EOF'
|
||||||
ALTER TABLE containers
|
ALTER TABLE containers
|
||||||
ADD COLUMN config TEXT NOT NULL DEFAULT '';
|
ALTER COLUMN contract DROP NOT NULL;
|
||||||
EOF"
|
EOF"
|
||||||
|
|||||||
40
app/sbin/api
40
app/sbin/api
@@ -71,7 +71,8 @@ def init_db():
|
|||||||
status CHAR(20),
|
status CHAR(20),
|
||||||
created DATE,
|
created DATE,
|
||||||
bump DATE,
|
bump DATE,
|
||||||
secret TEXT
|
secret TEXT,
|
||||||
|
contract TEXT
|
||||||
)
|
)
|
||||||
''')
|
''')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
@@ -92,6 +93,12 @@ def execute_db(query: str, params: tuple = (), fetch: bool = False):
|
|||||||
|
|
||||||
|
|
||||||
# ---------------------- Models ----------------------
|
# ---------------------- Models ----------------------
|
||||||
|
class ContractItem(BaseModel):
|
||||||
|
quantity: int
|
||||||
|
name: str
|
||||||
|
product_id: int
|
||||||
|
features: Dict[str, Any]
|
||||||
|
|
||||||
class ContainerModel(BaseModel):
|
class ContainerModel(BaseModel):
|
||||||
UUID: str
|
UUID: str
|
||||||
email: Optional[str] = None
|
email: Optional[str] = None
|
||||||
@@ -107,7 +114,7 @@ class ContainerModel(BaseModel):
|
|||||||
created: Optional[str] = None
|
created: Optional[str] = None
|
||||||
bump: Optional[str] = None
|
bump: Optional[str] = None
|
||||||
secret: Optional[Dict[str, Any]] = None
|
secret: Optional[Dict[str, Any]] = None
|
||||||
|
contract: Optional[str] = None
|
||||||
class UUIDRequest(BaseModel):
|
class UUIDRequest(BaseModel):
|
||||||
UUID: str
|
UUID: str
|
||||||
|
|
||||||
@@ -129,22 +136,6 @@ import json
|
|||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
# ---------------------- Models ----------------------
|
|
||||||
class ContainerModel(BaseModel):
|
|
||||||
UUID: str
|
|
||||||
email: Optional[str] = None
|
|
||||||
expires: Optional[str] = None
|
|
||||||
tags: Optional[str] = None
|
|
||||||
env: Optional[Dict[str, Any]] = None
|
|
||||||
affiliate: Optional[str] = None
|
|
||||||
image: Optional[str] = None
|
|
||||||
history: Optional[str] = None
|
|
||||||
comment: Optional[str] = None
|
|
||||||
domains: Optional[str] = None
|
|
||||||
status: Optional[str] = None
|
|
||||||
created: Optional[str] = None
|
|
||||||
bump: Optional[str] = None
|
|
||||||
secret: Optional[Dict[str, Any]] = None
|
|
||||||
|
|
||||||
# ---------------------- Routes ----------------------
|
# ---------------------- Routes ----------------------
|
||||||
@app.get("/", include_in_schema=False)
|
@app.get("/", include_in_schema=False)
|
||||||
@@ -157,6 +148,8 @@ def update_container(request: ContainerModel):
|
|||||||
# Convert dict fields to JSON strings
|
# Convert dict fields to JSON strings
|
||||||
env_str = json.dumps(request.env) if isinstance(request.env, dict) else None
|
env_str = json.dumps(request.env) if isinstance(request.env, dict) else None
|
||||||
secret_str = json.dumps(request.secret) if isinstance(request.secret, dict) else None
|
secret_str = json.dumps(request.secret) if isinstance(request.secret, dict) else None
|
||||||
|
contract_str = json.dumps(request.contract) if isinstance(request.contract, dict) else None
|
||||||
|
|
||||||
|
|
||||||
# Fetch existing record
|
# Fetch existing record
|
||||||
existing = execute_db("SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True)
|
existing = execute_db("SELECT * FROM containers WHERE UUID = ?", (request.UUID,), fetch=True)
|
||||||
@@ -164,12 +157,12 @@ def update_container(request: ContainerModel):
|
|||||||
# If record does not exist, insert a new one with all given fields
|
# If record does not exist, insert a new one with all given fields
|
||||||
execute_db("""
|
execute_db("""
|
||||||
INSERT INTO containers (UUID, email, expires, tags, env, affiliate, image, history,
|
INSERT INTO containers (UUID, email, expires, tags, env, affiliate, image, history,
|
||||||
comment, domains, status, created, bump, secret)
|
comment, domains, status, created, bump, secret, contract)
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
""", (
|
""", (
|
||||||
request.UUID, request.email, request.expires, request.tags, env_str,
|
request.UUID, request.email, request.expires, request.tags, env_str,
|
||||||
request.affiliate, request.image, request.history, request.comment,
|
request.affiliate, request.image, request.history, request.comment,
|
||||||
request.domains, request.status, request.created, request.bump, secret_str
|
request.domains, request.status, request.created, request.bump, secret_str, contract_str
|
||||||
))
|
))
|
||||||
return {"UUID": request.UUID, "status": "created"}
|
return {"UUID": request.UUID, "status": "created"}
|
||||||
|
|
||||||
@@ -184,8 +177,9 @@ def update_container(request: ContainerModel):
|
|||||||
continue
|
continue
|
||||||
value = getattr(request, field)
|
value = getattr(request, field)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
if field in ["env", "secret"]:
|
if field in ["env", "secret", "contract"]:
|
||||||
value = json.dumps(value)
|
value = json.dumps(value)
|
||||||
|
|
||||||
updates[field] = value
|
updates[field] = value
|
||||||
params.append(value)
|
params.append(value)
|
||||||
|
|
||||||
@@ -222,7 +216,7 @@ def info_container(request: Optional[UUIDRequest] = None):
|
|||||||
# Fields to select
|
# Fields to select
|
||||||
fields = [
|
fields = [
|
||||||
"ID", "UUID", "email", "expires", "tags", "env", "affiliate",
|
"ID", "UUID", "email", "expires", "tags", "env", "affiliate",
|
||||||
"image", "history", "comment", "domains", "status", "created"
|
"image", "history", "comment", "domains", "status", "created", "contract"
|
||||||
]
|
]
|
||||||
field_str = ", ".join(fields)
|
field_str = ", ".join(fields)
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ doas docker exec "$UUID" chown odoo:odoo -R /mnt/backup
|
|||||||
# Remove old backups beyond the configured slots
|
# Remove old backups beyond the configured slots
|
||||||
ls -t "$BACKUP_DIR"/[0-9]*.zip 2>/dev/null | tail -n +$((BACKUP_SLOTS + 1)) | while read -r file; do
|
ls -t "$BACKUP_DIR"/[0-9]*.zip 2>/dev/null | tail -n +$((BACKUP_SLOTS + 1)) | while read -r file; do
|
||||||
echo "Deleting old backup: $file"
|
echo "Deleting old backup: $file"
|
||||||
rm -f "$file"
|
doas rm -f "$file"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
find /tmp -type f -atime +2 -delete
|
find /4server/tmp -type f -atime +2 -delete
|
||||||
find /tmp -type d -empty -delete
|
find /4server/tmp -type d -empty -delete
|
||||||
sleep 1d
|
sleep 1d
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,14 @@ rex doas mkdir -p /BACKUP
|
|||||||
rex doas chmod 777 /BACKUP
|
rex doas chmod 777 /BACKUP
|
||||||
rex doas chown 4server:4server /BACKUP
|
rex doas chown 4server:4server /BACKUP
|
||||||
|
|
||||||
|
|
||||||
|
### TMP DIR
|
||||||
|
rex doas mkdir -p /4server/tmp
|
||||||
|
rex doas chmod 777 /4server/tmp
|
||||||
|
rex doas chown 4server:4server /4server/tmp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template templates/.profile /home/4server/.profile
|
template templates/.profile /home/4server/.profile
|
||||||
|
|
||||||
### PACKAGES
|
### PACKAGES
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user