from .. import * import logging import traceback import asyncio import aiofiles import aiofiles.os import yaml async def check_yaml(data): f = "FileFormatInvalidError:" if not data.get('language'): return f'{f} Project language not found in ElevenHost.yaml' elif not data.get('version'): return f'{f} Project language version not found in ElevenHost.yaml' elif not data.get('build'): return f'{f} Build not found on ElevenHost.yaml' elif not data.get('packages'): return f'{f} Packages not found in ElevenHost.yaml' elif not data.get("start"): return f'{f} start not found in ElevenHost.yaml' else: return True async def create_docker(data): dockerfile = f"FROM {data.get('language')}:{data.get('version')}\n\n" dockerfile += ''.join([f"RUN {x}\n\n" for x in data.get('build')]) dockerfile += ''.join([f"RUN apt-get install {x} -y\n\n" for x in data.get('packages')]) dockerfile += f"COPY . /app/\n\nCMD {data.get('start')[0]}\n" return dockerfile class Host: async def host(self, user_id: int, project_id: int): database = self.database user = await database.find(user_id) project = await database.find(f"p{user_id}{project_id}", project=True) if not user: return 'not exists' elif not project: return 'Project not found' repo_id = project.get('repo', 0) repo = await database.get_repo(user_id, repo_id) if not repo: return "Repo not found" installation_id = (await self.cb.find_one({"_id": int(user_id)})).get('installation_id', None) if not installation_id: return "not exists" token = await database.gen_token(installation_id) try: folder = f"deployment{user_id}" await database.add_log(user_id, project_id, "Clonning repo from github...") await run(f"rm -rf {folder}") await run(f"mkdir {folder}") ok = await run(f"cd {folder} && git clone https://x-access-token:{token}@github.com/{repo.get('full_name')}/") repo_folder = f"{folder}/{repo.get('name')}" if not await aiofiles.os.path.isdir(repo_folder): await database.add_log(user_id, project_id, f"Error on clonning repo: {ok}") return 'Failed to host repo' ls = await run(f"ls {repo_folder}") file_count = len(ls.split('\n')) if '\n' in ls else 0 await database.add_log( user_id, project_id, f"Successfully clonned repo!, Files found in repo: {file_count}" ) if not await aiofiles.os.path.isfile(f"{repo_folder}/ElevenHost.yaml"): await database.add_log( user_id, project_id, "Error:\nCannot find ElevenHost.yaml on your repo" ) return "ElevenHost.yaml not found" async with aiofiles.open(f"{repo_folder}/ElevenHost.yaml", mode='r') as mano: ctx = await mano.read() data = yaml.safe_load(ctx) chk = await check_yaml(data) if not chk is True: await database.add_log(user_id, project_id, chk) return chk return True except Exception as w: logging.error(traceback.format_exc()) return f"Error: {w}"