Skip to content

Commit

Permalink
Native binary progress. Issue #50
Browse files Browse the repository at this point in the history
  • Loading branch information
theypsilon committed Feb 28, 2025
1 parent 02d8488 commit f191832
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 9 deletions.
22 changes: 22 additions & 0 deletions src/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM arm32v7/python:3.9-bullseye

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential libssl-dev libffi-dev wget tar python3.9-dev patchelf upx-ucl \
&& python3.9 -m pip install nuitka

WORKDIR /app
COPY downloader /app/downloader/
COPY __main__.py commit.py /app/

ENV CFLAGS="-Os -march=armv7-a"
RUN nuitka --lto=no --follow-imports \
--remove-output \
--include-module=_json \
--python-flag=no_site \
--python-flag=-OO \
--jobs=$(nproc) \
--include-package=downloader __main__.py

RUN upx --best __main__.bin

CMD ["cat", "__main__.bin"]
10 changes: 10 additions & 0 deletions src/compile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env bash
# Copyright (c) 2021-2022 José Manuel Barroso Galindo <[email protected]>

set -euo pipefail

cd src

echo "default_commit = '$(git rev-parse --short HEAD)'" > "commit.py"
docker build --platform=linux/arm/v7 -t downloader-nuitka . > /dev/null
docker run --platform linux/arm/v7 downloader-nuitka
25 changes: 16 additions & 9 deletions src/debug.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ def scp_file(src, dest, **kwargs): _ssh_pass('scp', [scp_path(src), scp_path(des
def exec_ssh(cmd, env=None, **kwargs): return _ssh_pass('ssh', [f'root@{mister_ip()}', f'{exports(env)}{cmd}'], **kwargs)
def run_build(**kwargs): send_build(env={"SKIP_REMOVALS": "true"}), exec_ssh(f'/media/fat/downloader.sh', **kwargs)
def run_launcher(**kwargs): send_build(**kwargs), exec_ssh(f'/media/fat/Scripts/downloader.sh', **kwargs)
def run_compile(**kwargs): send_compile(**kwargs), exec_ssh(f'/media/fat/downloader_bin', **kwargs)
def store_push(**kwargs): scp_file('downloader.json', '/media/fat/Scripts/.config/downloader/downloader.json', **kwargs)
def store_pull(**kwargs): scp_file('/media/fat/Scripts/.config/downloader/downloader.json', 'downloader.json', **kwargs)
def log_pull(**kwargs): scp_file('/media/fat/Scripts/.config/downloader/downloader.log', 'downloader.log', **kwargs)


def send_build(env=None, **kwargs):
env = {'DEBUG': 'true', **os.environ.copy(), **(env or {}), 'MISTER': 'true'}
with tempfile.NamedTemporaryFile(delete=False) as tmp: subprocess.run(['./src/build.sh'], stdout=tmp, env=env, check=True)
Expand All @@ -39,17 +39,24 @@ def send_build(env=None, **kwargs):

os.remove(tmp.name)

def send_compile(env=None, **kwargs):
with tempfile.NamedTemporaryFile(delete=False) as tmp: subprocess.run(['./src/compile.sh'], stdout=tmp, env=env, check=True)
os.chmod(tmp.name, 0o755)
scp_file(tmp.name, '/media/fat/downloader_bin', **kwargs)
os.remove(tmp.name)

def run_operation(op, env=None, retries=False):
{
def operations_dict(env=None, retries=False):
return {
'store_push': lambda: store_push(retries=retries),
'store_pull': lambda: store_pull(retries=retries),
'log_pull': lambda: log_pull(retries=retries),
'build': lambda: [send_build(env=env, retries=retries), print('OK')],
'run': lambda: run_build(env=env, retries=retries),
'compile': lambda: send_compile(env=env, retries=retries),
'run_compile': lambda: run_compile(env=env, retries=retries),
'launcher': lambda: run_launcher(env=env, retries=retries),
'copy': lambda: scp_file(sys.argv[2], f'/media/fat/{sys.argv[2]}'),
}.get(op, lambda: [send_build(env=env, retries=retries), print('OK')])()

}

def _ssh_pass(cmd, args, out=None, retries=True):
for i in range(4):
Expand All @@ -59,13 +66,13 @@ def _ssh_pass(cmd, args, out=None, retries=True):
traceback.print_exc()
time.sleep(30 * (i + 1))


def _main():
operations = operations_dict()
parser = argparse.ArgumentParser()
parser.add_argument('command', choices=['store_push', 'store_pull', 'log_pull', 'run', 'launcher', 'copy'], nargs='?', default=None)
parser.add_argument('command', choices=list(operations), nargs='?', default=None)
parser.add_argument('parameter', nargs='?', default='')
run_operation(parser.parse_args().command)

op = operations.get(parser.parse_args().command, operations['build'])
op()

if __name__ == '__main__':
_main()

0 comments on commit f191832

Please sign in to comment.