56 lines
1.8 KiB
Python
56 lines
1.8 KiB
Python
|
|
import click
|
|
import os
|
|
import asyncio
|
|
from sanic import Sanic
|
|
from sanic.exceptions import ServerError
|
|
from sanic.response import file_stream
|
|
from pinecrypt.server import const
|
|
|
|
app = Sanic("builder")
|
|
app.config.RESPONSE_TIMEOUT = 300
|
|
|
|
@app.route("/api/build/")
|
|
async def view_build(request):
|
|
build_script_path = "/builder/script/mfp.sh"
|
|
suffix = "-glinet_gl-ar150-squashfs-sysupgrade.bin"
|
|
suggested_filename = "mfp%s" % suffix
|
|
build = "/builder/src"
|
|
log_path = build + "/build.log"
|
|
|
|
proc = await asyncio.create_subprocess_exec(
|
|
build_script_path,
|
|
stdout=open(log_path, "w"),
|
|
close_fds=True,
|
|
shell=False,
|
|
cwd=os.path.dirname(os.path.realpath(build_script_path)),
|
|
env={
|
|
"PROFILE": "glinet_gl-ar150",
|
|
"PATH": "/usr/sbin:/usr/bin:/sbin:/bin",
|
|
"AUTHORITY_NAMESPACE": const.AUTHORITY_NAMESPACE,
|
|
"BUILD": build,
|
|
"OVERLAY": build + "/overlay/"
|
|
},
|
|
startupinfo=None,
|
|
creationflags=0,
|
|
)
|
|
|
|
stdout, stderr = await proc.communicate()
|
|
|
|
if proc.returncode:
|
|
raise ServerError("Build script finished with non-zero exitcode, see %s for more information" % log_path)
|
|
|
|
for root, dirs, files in os.walk("/builder/src/bin/targets"):
|
|
for filename in files:
|
|
if filename.endswith(suffix):
|
|
path = os.path.join(root, filename)
|
|
click.echo("Serving: %s" % path)
|
|
return await file_stream(
|
|
path,
|
|
headers={
|
|
"Content-Disposition": "attachment; filename=%s" % suggested_filename
|
|
}
|
|
)
|
|
raise ServerError("Failed to find image builder directory in %s" % build)
|
|
|