odoo_api.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. copy_in
  11. )
  12. from api.utils.logger import info
  13. from api.utils.command import execute
  14. import os
  15. import socket
  16. import time
  17. import unicodedata
  18. import stringcase
  19. import tarfile
  20. '''
  21. '''
  22. def normalize_name(name = None):
  23. if not name:
  24. return name
  25. try:
  26. name = unicodedata.normalize('NFKD', name)
  27. name = name.encode('ASCII', 'ignore')
  28. except TypeError:
  29. pass
  30. name = stringcase.trimcase(name)
  31. name = stringcase.lowercase(name)
  32. name = stringcase.snakecase(name)
  33. return name
  34. '''
  35. '''
  36. def randomize_port():
  37. ports = settings.ODOO_PORTS_RANGE
  38. port = 0
  39. while not check_port_from_docker(port):
  40. time.sleep(1)
  41. port = randint(ports[0], ports[1])
  42. return port
  43. '''
  44. '''
  45. def check_port(port=0):
  46. if port == 0:
  47. return False
  48. ok = False
  49. info('cheking port %d at %s' % (settings.EXTERNAL_IP, port))
  50. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  51. try:
  52. s.bind((settings.EXTERNAL_IP, port))
  53. info('%s checked at %s is success' % (settings.EXTERNAL_IP, port))
  54. ok = True
  55. except socket.error:
  56. info('%s checked at %s is failed' % (settings.EXTERNAL_IP, port))
  57. ok = False
  58. s.close()
  59. return ok
  60. '''
  61. '''
  62. def check_port_from_docker(port=0):
  63. if port == 0:
  64. return False
  65. if port in get_all_external_ports():
  66. return False
  67. return True
  68. '''
  69. '''
  70. def check_name(name=None):
  71. if not name:
  72. return False
  73. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  74. return os.path.exists(full_path)
  75. '''
  76. '''
  77. def create_folders(name=None):
  78. if not name:
  79. return False
  80. folders = settings.ODOO_DEFAULT_FOLDERS
  81. for folder in folders:
  82. full_path = os.path.join(settings.ODOO_ROOT_PATH, name, folder.strip())
  83. os.makedirs(full_path)
  84. time.sleep(1)
  85. return True
  86. '''
  87. '''
  88. def apply_permissions(name=None):
  89. if not name:
  90. return False
  91. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  92. execute(['chmod', '-Rf', '777', full_path])
  93. return True
  94. '''
  95. '''
  96. def create_configuration(name=None):
  97. if not name:
  98. return False
  99. conf_path = os.path.join(settings.ODOO_ROOT_PATH, name, 'config')
  100. if not os.path.exists(conf_path):
  101. return False
  102. env = Environment(
  103. loader=PackageLoader('api', 'templates'),
  104. autoescape=select_autoescape(['j2'])
  105. )
  106. template = env.get_template(settings.ODOO_CONF_FILENAME + '.j2')
  107. template_rendered = template.stream({
  108. 'admin_password': settings.ODOO_ADMIN_PASSWORD,
  109. 'db_host': settings.ODOO_DB_HOST,
  110. 'db_port': settings.ODOO_DB_PORT,
  111. 'db_name': name,
  112. 'db_user': settings.ODOO_DB_USER,
  113. 'db_password': settings.ODOO_DB_PASSWORD
  114. })
  115. template_rendered.dump(os.path.join(conf_path, settings.ODOO_CONF_FILENAME + '.conf'))
  116. return True
  117. '''
  118. '''
  119. def create_database(name=None):
  120. if not name:
  121. return False
  122. cmd = 'createdb -U %s %s' % (settings.ODOO_DB_USER, name)
  123. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  124. '''
  125. '''
  126. def copy_database_seed():
  127. backup_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'files', 'odoo.tar')
  128. return copy_in(settings.ODOO_DB_CONTAINER, '/tmp', backup_path)
  129. '''
  130. '''
  131. def restore_database(name=None):
  132. if not name:
  133. return False
  134. cmd = 'psql -U %s -d %s -f %s' % (settings.ODOO_DB_USER, name, '/tmp/odoo.sql')
  135. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  136. '''
  137. '''
  138. def remove_database_seed():
  139. cmd = 'rm -f %s' % ('/tmp/odoo.sql')
  140. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  141. '''
  142. '''
  143. def create_odoo_container(name=None, ports=[]):
  144. if not name:
  145. return False
  146. ports = dict(map(lambda p: ('%d/tcp' % 8069, p), ports))
  147. volumes = dict(map(lambda f: (os.path.join(settings.ODOO_ROOT_PATH, name, f.strip()), {
  148. 'bind': settings.ODOO_DEFAULT_FOLDERS[f].strip(),
  149. 'mode': 'rw'
  150. }) , settings.ODOO_DEFAULT_FOLDERS))
  151. run_container(settings.ODOO_IMAGE, name, ports, volumes, settings.INTERNAL_NETWORK_NAME)
  152. time.sleep(5)
  153. return True
  154. '''
  155. '''
  156. def get_odoo_internal_ip(name=None):
  157. if not name:
  158. return None
  159. return get_internal_ip(name)
  160. '''
  161. '''
  162. def install_module(system_name=None, module_name=None):
  163. if not system_name or not module_name:
  164. return False