| 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}" | |