42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
import textwrap
|
|
|
|
from .proc import Proc
|
|
|
|
|
|
class Script:
|
|
async def exec(self, *args, **kwargs):
|
|
"""Execute a command on the host."""
|
|
kwargs.setdefault('prefix', self.container.name)
|
|
proc = await Proc(*args, **kwargs)()
|
|
if kwargs.get('wait', True):
|
|
await proc.wait()
|
|
return proc
|
|
|
|
async def __call__(self, name, loop=None):
|
|
script = copy(self.scripts[name])
|
|
script.loop = loop or asyncio.events.get_event_loop()
|
|
results = []
|
|
|
|
async def clean():
|
|
for visitor in self.visitors:
|
|
if hasattr(visitor, 'clean_' + name):
|
|
result = getattr(visitor, 'clean_' + name)(script)
|
|
if result:
|
|
await result
|
|
|
|
for prefix in ('init_', 'pre_', '', 'post_', 'clean_'):
|
|
method = prefix + name
|
|
for visitor in self.visitors:
|
|
if not hasattr(visitor, method):
|
|
continue
|
|
|
|
rep = {k: v if not isinstance(v, object) else type(v).__name__ for k, v in visitor.__dict__.items()}
|
|
print(self.name + ' | ', type(visitor).__name__, method, rep)
|
|
result = getattr(visitor, method)(script)
|
|
if result:
|
|
try:
|
|
await result
|
|
except Exception as e:
|
|
await clean()
|
|
raise
|