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