You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.5 KiB

from datetime import datetime
5 years ago
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from zipfile import ZipFile
from io import BytesIO
5 years ago
import middleware
from starlette.responses import StreamingResponse
5 years ago
import schemas
import script.wireguard
import db.wireguard
5 years ago
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"'
})