53 lines
1.6 KiB
Python
Executable File
53 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from buildsrht.manifest import Manifest
|
|
from buildsrht.runner import submit_build
|
|
from buildsrht.types import Job, Task, User
|
|
from getopt import getopt, GetoptError
|
|
from srht.config import cfg, get_origin
|
|
from srht.database import DbSession
|
|
import os
|
|
import shlex
|
|
import sys
|
|
import yaml
|
|
|
|
db = DbSession(cfg("builds.sr.ht", "connection-string"))
|
|
db.init()
|
|
|
|
def fail(reason):
|
|
owner = cfg("sr.ht", "owner-name")
|
|
email = cfg("sr.ht", "owner-email")
|
|
print(reason)
|
|
print(f"Please reach out to {owner} <{email}> for support.")
|
|
sys.exit(1)
|
|
|
|
username = sys.argv[1]
|
|
user = User.query.filter(User.username == username).one_or_none()
|
|
if not user:
|
|
fail(f"Unknown user {username}")
|
|
cmd = os.environ.get("SSH_ORIGINAL_COMMAND") or ""
|
|
cmd = shlex.split(cmd)
|
|
if len(cmd) == 0:
|
|
fail(f"Hi ~{username}! You've successfully authenticated, but I do not provide an interactive shell. Goodbye!")
|
|
|
|
if cmd[0] == "submit":
|
|
try:
|
|
opts, args = getopt(cmd[1:], "n:t:")
|
|
except GetoptError as ex:
|
|
fail(str(ex))
|
|
|
|
if os.isatty(sys.stdin.fileno()):
|
|
print("Enter build manifest:")
|
|
_manifest = sys.stdin.read()
|
|
_manifest = _manifest.replace("\t", " ") # Appease YAML
|
|
try:
|
|
manifest = Manifest(yaml.safe_load(_manifest))
|
|
except Exception as ex:
|
|
fail(str(ex))
|
|
note = " ".join([y for x, y in opts if x == "-n"]) or None
|
|
tags = [y for x, y in opts if x == "-t"] or None
|
|
job_id = submit_build(user, _manifest, note=note, tags=tags)
|
|
url = f"{get_origin('builds.sr.ht', external=True)}/~{username}/job/{job_id}"
|
|
print(url)
|
|
else:
|
|
fail(f"Unknown command {cmd[0]}")
|