File size: 3,164 Bytes
d384b52 06c6bf6 d384b52 06c6bf6 350c204 d384b52 350c204 d384b52 350c204 d384b52 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
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}"
|