odoo_api.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. from __future__ import unicode_literals
  2. from django.conf import settings
  3. from random import randint
  4. from jinja2 import Environment, PackageLoader, select_autoescape
  5. from api.utils.docker_api import (
  6. get_all_external_ports,
  7. get_internal_ip,
  8. execute_command,
  9. run_container,
  10. start_container,
  11. stop_container,
  12. copy_in
  13. )
  14. from api.utils.git_api import clone_repo
  15. from api.utils.command import execute
  16. from api.utils.email import send_email
  17. from api.utils.logger import info
  18. import os
  19. import socket
  20. import time
  21. import unicodedata
  22. import stringcase
  23. import tarfile
  24. '''
  25. '''
  26. def normalize_name(name = None):
  27. if not name:
  28. return name
  29. try:
  30. name = unicodedata.normalize('NFKD', name)
  31. name = name.encode('ASCII', 'ignore')
  32. except TypeError:
  33. pass
  34. name = stringcase.trimcase(name)
  35. name = stringcase.lowercase(name)
  36. name = stringcase.snakecase(name)
  37. return name
  38. '''
  39. '''
  40. def randomize_port():
  41. ports = settings.ODOO_PORTS_RANGE
  42. port = 0
  43. while not check_port_from_docker(port):
  44. time.sleep(1)
  45. port = randint(ports[0], ports[1])
  46. return port
  47. '''
  48. '''
  49. def check_port(port=0):
  50. if port == 0:
  51. return False
  52. ok = False
  53. info('cheking port %d at %s' % (settings.EXTERNAL_IP, port))
  54. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  55. try:
  56. s.bind((settings.EXTERNAL_IP, port))
  57. info('%s checked at %s is success' % (settings.EXTERNAL_IP, port))
  58. ok = True
  59. except socket.error:
  60. info('%s checked at %s is failed' % (settings.EXTERNAL_IP, port))
  61. ok = False
  62. s.close()
  63. return ok
  64. '''
  65. '''
  66. def check_port_from_docker(port=0):
  67. if port == 0:
  68. return False
  69. if port in get_all_external_ports():
  70. return False
  71. return True
  72. '''
  73. '''
  74. def check_name(name=None):
  75. if not name:
  76. return False
  77. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  78. return os.path.exists(full_path)
  79. '''
  80. '''
  81. def create_folders(name=None):
  82. if not name:
  83. return False
  84. folders = settings.ODOO_DEFAULT_FOLDERS
  85. for folder in folders:
  86. full_path = os.path.join(settings.ODOO_ROOT_PATH, name, folder.strip())
  87. os.makedirs(full_path)
  88. time.sleep(1)
  89. return True
  90. '''
  91. '''
  92. def apply_permissions(name=None):
  93. if not name:
  94. return False
  95. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  96. execute(['chmod', '-Rf', '777', full_path])
  97. return True
  98. '''
  99. '''
  100. def create_configuration(name=None):
  101. if not name:
  102. return False
  103. conf_path = os.path.join(settings.ODOO_ROOT_PATH, name, 'config')
  104. if not os.path.exists(conf_path):
  105. return False
  106. env = Environment(
  107. loader=PackageLoader('api', 'templates'),
  108. autoescape=select_autoescape(['j2'])
  109. )
  110. template = env.get_template(settings.ODOO_CONF_FILENAME + '.j2')
  111. template_rendered = template.stream({
  112. 'admin_password': settings.ODOO_ADMIN_PASSWORD,
  113. 'db_host': settings.ODOO_DB_HOST,
  114. 'db_port': settings.ODOO_DB_PORT,
  115. 'db_name': name,
  116. 'db_user': settings.ODOO_DB_USER,
  117. 'db_password': settings.ODOO_DB_PASSWORD
  118. })
  119. template_rendered.dump(os.path.join(conf_path, settings.ODOO_CONF_FILENAME + '.conf'))
  120. return True
  121. '''
  122. '''
  123. def create_database(name=None):
  124. if not name:
  125. return False
  126. cmd = 'createdb -U %s %s' % (settings.ODOO_DB_USER, name)
  127. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  128. '''
  129. '''
  130. def copy_database_seed():
  131. backup_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'files', 'odoo.tar')
  132. return copy_in(settings.ODOO_DB_CONTAINER, '/tmp', backup_path)
  133. '''
  134. '''
  135. def restore_database(name=None):
  136. if not name:
  137. return False
  138. cmd = 'psql -U %s -d %s -f %s' % (settings.ODOO_DB_USER, name, '/tmp/odoo.sql')
  139. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  140. '''
  141. '''
  142. def remove_database_seed():
  143. cmd = 'rm -f %s' % ('/tmp/odoo.sql')
  144. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  145. '''
  146. '''
  147. def create_odoo_container(name=None, ports=[]):
  148. if not name:
  149. return False
  150. ports = dict(map(lambda p: ('%d/tcp' % 8069, p), ports))
  151. volumes = dict(map(lambda f: (os.path.join(settings.ODOO_ROOT_PATH, name, f.strip()), {
  152. 'bind': settings.ODOO_DEFAULT_FOLDERS[f].strip(),
  153. 'mode': 'rw'
  154. }) , settings.ODOO_DEFAULT_FOLDERS))
  155. run_container(settings.ODOO_IMAGE, name, ports, volumes, settings.INTERNAL_NETWORK_NAME)
  156. time.sleep(5)
  157. return True
  158. '''
  159. '''
  160. def get_odoo_internal_ip(name=None):
  161. if not name:
  162. return None
  163. return get_internal_ip(name)
  164. '''
  165. '''
  166. def install_modules(system_name=None, module_names=[]):
  167. if not system_name:
  168. return {'error': 'system name is required'}
  169. if len(module_names) == 0:
  170. return {'error': 'module names is required'}
  171. # 1. check system path
  172. system_path = os.path.join(settings.ODOO_ROOT_PATH, system_name)
  173. if not os.path.exists(system_path):
  174. return {'error': 'system path not exists'}
  175. # # 2. stop system container
  176. # stopped = stop_container(system_name)
  177. # if not stopped:
  178. # return {'error': 'cannot stop system'}
  179. for module_name in module_names:
  180. # 3. check module path and remove it
  181. module_path = os.path.join(system_path, 'custom-addons', module_name)
  182. if os.path.exists(module_path):
  183. execute(['rm', '-Rf', module_path])
  184. # 4. clone repo
  185. addons_path = os.path.join(system_path, 'custom-addons')
  186. cloned = clone_repo(module_name, addons_path)
  187. if not cloned:
  188. return {'error': 'cannot clone repo'}
  189. # 5. remove git data
  190. git_data_path = os.path.join(module_path, '.git')
  191. if os.path.exists(git_data_path):
  192. execute(['rm', '-Rf', git_data_path])
  193. try:
  194. execute(['chmod', '-R', '777', module_path])
  195. except Exception:
  196. pass
  197. # # 7. start system container
  198. # started = start_container(system_name)
  199. # if not started:
  200. # return {'error': 'cannot start system'}
  201. return {'result': '%s installed' % module_name}
  202. '''
  203. '''
  204. def install_module(system_name=None, module_name=None):
  205. return install_modules(system_name, [module_name])
  206. '''
  207. '''
  208. def up():
  209. pass
  210. '''
  211. '''
  212. def kill():
  213. pass