64 lines
1.6 KiB
Python
64 lines
1.6 KiB
Python
import asyncio
|
|
import os
|
|
|
|
from .build import Build
|
|
from .visitable import Visitable
|
|
|
|
|
|
class BuildStreamProtocol(asyncio.subprocess.SubprocessStreamProtocol):
|
|
def __init__(self, service, *args, **kwargs):
|
|
self.service = service
|
|
super().__init__(*args, **kwargs)
|
|
|
|
def pipe_data_received(self, fd, data):
|
|
if fd in (1, 2):
|
|
for line in data.split(b'\n'):
|
|
if not line:
|
|
continue
|
|
sys.stdout.buffer.write(
|
|
self.service.name.encode('utf8') + b' | ' + line + b'\n'
|
|
)
|
|
sys.stdout.flush()
|
|
super().pipe_data_received(fd, data)
|
|
|
|
|
|
def protocol_factory():
|
|
loop = asyncio.events.get_event_loop()
|
|
return BuildStreamProtocol(
|
|
service,
|
|
limit=asyncio.streams._DEFAULT_LIMIT,
|
|
loop=loop,
|
|
)
|
|
|
|
|
|
class Container(Visitable):
|
|
default_scripts = dict(
|
|
build=Build,
|
|
)
|
|
paths = [
|
|
'/bin',
|
|
'/sbin',
|
|
'/usr/bin',
|
|
'/usr/sbin',
|
|
]
|
|
|
|
async def script(self, name, loop):
|
|
self.packages = []
|
|
for visitor in self.visitors:
|
|
self.packages += getattr(visitor, 'packages', [])
|
|
result = await super().script(name, loop)
|
|
return result
|
|
|
|
def script_run(self, name, debug):
|
|
script = f'.podctl_build_{name}.sh'
|
|
with open(script, 'w+') as f:
|
|
f.write(str(self.script('build')))
|
|
|
|
if os.getenv('BUILDAH_ISOLATION') == 'chroot':
|
|
prefix = ''
|
|
else:
|
|
prefix = 'buildah unshare '
|
|
|
|
x = 'x' if debug else ''
|
|
return prefix + f'bash -eu{x} {script}'
|