52 lines
1.5 KiB

from datetime import datetime
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from zipfile import ZipFile
from io import BytesIO
import middleware
from starlette.responses import StreamingResponse
import schemas
import script.wireguard
import db.wireguard
router = APIRouter()
@router.get("/generate_psk", response_model=schemas.PSK)
def generate_psk():
return schemas.PSK(
psk=script.wireguard.generate_psk()
)
@router.get("/generate_keypair", response_model=schemas.KeyPair)
def generate_key_pair():
keys = script.wireguard.generate_keys()
private_key = keys["private_key"]
public_key = keys["public_key"]
return schemas.KeyPair(
private_key=private_key,
public_key=public_key
)
@router.get("/dump")
def dump_database(
sess: Session = Depends(middleware.get_db)
):
in_memory = BytesIO()
zf = ZipFile(in_memory, mode="w")
for server in db.wireguard.server_get_all(sess):
zf.writestr(f"{server.interface}/{server.interface}.conf", server.configuration)
for peer in server.peers:
zf.writestr(f"{server.interface}/peers/{peer.name}_{peer.address.replace('.','-')}.conf", server.configuration)
zf.close()
in_memory.seek(0)
now = datetime.now().strftime("%m-%d-%Y-%H:%M:%S")
return StreamingResponse(in_memory, media_type="application/zip", headers={
"Content-Disposition": f'attachment; filename="wg-manager-dump-{now}.zip"'
})