First commit; Adding file uploading
This commit is contained in:
parent
7c738738ed
commit
e13db7ef69
0
src/__init__.py
Normal file
0
src/__init__.py
Normal file
57
src/config.py
Normal file
57
src/config.py
Normal file
@ -0,0 +1,57 @@
|
||||
import envyaml
|
||||
import os
|
||||
import logging
|
||||
from logging import Formatter, StreamHandler
|
||||
import json
|
||||
|
||||
config = envyaml.EnvYAML(os.environ.get('CONFIG_PATH', 'config.yaml'))
|
||||
|
||||
def init() -> None:
|
||||
"""
|
||||
Initializes the application and validates the config
|
||||
"""
|
||||
|
||||
initLogger()
|
||||
|
||||
if config["app.scripts.path"] == "":
|
||||
logging.error("Scripts path not set")
|
||||
exit(1)
|
||||
elif config["app.scripts.path"][-1] != "/":
|
||||
logging.error("Scripts path does not end with a slash")
|
||||
exit(1)
|
||||
|
||||
def initLogger() -> None:
|
||||
"""
|
||||
Initializes the logger
|
||||
"""
|
||||
# style the logger output to look like uvicorn for root app
|
||||
FORMAT = '%(asctime)-15s %(levelname)s %(message)s'
|
||||
DATE_FORMAT = '%b %d %H:%M:%S'
|
||||
formatter = Formatter(fmt=FORMAT, datefmt=DATE_FORMAT)
|
||||
handler = StreamHandler()
|
||||
handler.setFormatter(formatter)
|
||||
logger = logging.getLogger()
|
||||
|
||||
# remove default handler
|
||||
logger.handlers = []
|
||||
logger.addHandler(handler)
|
||||
|
||||
logging.basicConfig(level=resolveLogLevel(config["app.log.level"]))
|
||||
|
||||
def resolveLogLevel(level: str) -> int:
|
||||
"""
|
||||
Resolves a log level from a string
|
||||
"""
|
||||
if level == 'debug':
|
||||
return logging.DEBUG
|
||||
elif level == 'info':
|
||||
return logging.INFO
|
||||
elif level == 'warning':
|
||||
return logging.WARNING
|
||||
elif level == 'error':
|
||||
return logging.ERROR
|
||||
elif level == 'critical':
|
||||
return logging.CRITICAL
|
||||
else:
|
||||
logging.warning("Invalid log level. Using INFO as default")
|
||||
return logging.INFO
|
7
src/config.yaml
Normal file
7
src/config.yaml
Normal file
@ -0,0 +1,7 @@
|
||||
app:
|
||||
log:
|
||||
level: "debug"
|
||||
scripts:
|
||||
# Where uploaded scripts are to be stored
|
||||
path: "./scripts/"
|
||||
|
9
src/main.py
Normal file
9
src/main.py
Normal file
@ -0,0 +1,9 @@
|
||||
from fastapi import FastAPI
|
||||
from config import init
|
||||
from router.upload import router as uploadRouter
|
||||
|
||||
init()
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
app.include_router(uploadRouter)
|
0
src/router/__init__.py
Normal file
0
src/router/__init__.py
Normal file
46
src/router/upload.py
Normal file
46
src/router/upload.py
Normal file
@ -0,0 +1,46 @@
|
||||
from fastapi import APIRouter, UploadFile, File
|
||||
from config import config, resolveLogLevel
|
||||
from uuid import uuid4
|
||||
import magic
|
||||
import logging
|
||||
|
||||
# set logging level
|
||||
logging.basicConfig(level=resolveLogLevel(config["app.log.level"]))
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/upload",
|
||||
tags=["upload"],
|
||||
responses={404: {"description": "Not found"}},
|
||||
)
|
||||
|
||||
@router.post("/")
|
||||
async def upload(file: UploadFile):
|
||||
"""
|
||||
Upload a python script to be stored
|
||||
"""
|
||||
|
||||
logging.debug(f"File name : {file.filename}")
|
||||
|
||||
# Check if the file is a python script
|
||||
if not file.filename.endswith(".py"):
|
||||
return {"error": "File is not a python script"}
|
||||
|
||||
logging.debug(f"File content type : {file.content_type}")
|
||||
|
||||
if file.content_type != "text/x-python":
|
||||
return {"error": "File is not a python script"}
|
||||
|
||||
# reset file pointer
|
||||
await file.seek(0)
|
||||
|
||||
scriptDirectory = config["app.scripts.path"]
|
||||
|
||||
# Get UUID file name
|
||||
uuid = uuid4()
|
||||
|
||||
# Write the file to the script directory
|
||||
with open(scriptDirectory + str(uuid), "wb") as buffer:
|
||||
buffer.write(file.file.read())
|
||||
|
||||
return {"uuid": str(uuid)}
|
||||
|
Reference in New Issue
Block a user