No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

165 líneas
5.3 KiB

  1. import frappe
  2. import os
  3. from frappe.database.db_manager import DbManager
  4. expected_settings_10_2_earlier = {
  5. "innodb_file_format": "Barracuda",
  6. "innodb_file_per_table": "ON",
  7. "innodb_large_prefix": "ON",
  8. "character_set_server": "utf8mb4",
  9. "collation_server": "utf8mb4_unicode_ci"
  10. }
  11. expected_settings_10_3_later = {
  12. "character_set_server": "utf8mb4",
  13. "collation_server": "utf8mb4_unicode_ci"
  14. }
  15. def get_mariadb_versions():
  16. # MariaDB classifies their versions as Major (1st and 2nd number), and Minor (3rd number)
  17. # Example: Version 10.3.13 is Major Version = 10.3, Minor Version = 13
  18. mariadb_variables = frappe._dict(frappe.db.sql("""show variables"""))
  19. version_string = mariadb_variables.get('version').split('-')[0]
  20. versions = {}
  21. versions['major'] = version_string.split(
  22. '.')[0] + '.' + version_string.split('.')[1]
  23. versions['minor'] = version_string.split('.')[2]
  24. return versions
  25. def setup_database(force, source_sql, verbose, no_mariadb_socket=False):
  26. frappe.local.session = frappe._dict({'user':'Administrator'})
  27. db_name = frappe.local.conf.db_name
  28. root_conn = get_root_connection(frappe.flags.root_login, frappe.flags.root_password)
  29. dbman = DbManager(root_conn)
  30. dbman_kwargs = {}
  31. if no_mariadb_socket:
  32. dbman_kwargs["host"] = "%"
  33. if force or (db_name not in dbman.get_database_list()):
  34. dbman.delete_user(db_name, **dbman_kwargs)
  35. dbman.drop_database(db_name)
  36. else:
  37. raise Exception("Database %s already exists" % (db_name,))
  38. dbman.create_user(db_name, frappe.conf.db_password, **dbman_kwargs)
  39. if verbose: print("Created user %s" % db_name)
  40. dbman.create_database(db_name)
  41. if verbose: print("Created database %s" % db_name)
  42. dbman.grant_all_privileges(db_name, db_name, **dbman_kwargs)
  43. dbman.flush_privileges()
  44. if verbose: print("Granted privileges to user %s and database %s" % (db_name, db_name))
  45. # close root connection
  46. root_conn.close()
  47. bootstrap_database(db_name, verbose, source_sql)
  48. def setup_help_database(help_db_name):
  49. dbman = DbManager(get_root_connection(frappe.flags.root_login, frappe.flags.root_password))
  50. dbman.drop_database(help_db_name)
  51. # make database
  52. if not help_db_name in dbman.get_database_list():
  53. try:
  54. dbman.create_user(help_db_name, help_db_name)
  55. except Exception as e:
  56. # user already exists
  57. if e.args[0] != 1396: raise
  58. dbman.create_database(help_db_name)
  59. dbman.grant_all_privileges(help_db_name, help_db_name)
  60. dbman.flush_privileges()
  61. def drop_user_and_database(db_name, root_login, root_password):
  62. frappe.local.db = get_root_connection(root_login, root_password)
  63. dbman = DbManager(frappe.local.db)
  64. dbman.delete_user(db_name, host="%")
  65. dbman.delete_user(db_name)
  66. dbman.drop_database(db_name)
  67. def bootstrap_database(db_name, verbose, source_sql=None):
  68. import sys
  69. frappe.connect(db_name=db_name)
  70. if not check_database_settings():
  71. print('Database settings do not match expected values; stopping database setup.')
  72. sys.exit(1)
  73. import_db_from_sql(source_sql, verbose)
  74. frappe.connect(db_name=db_name)
  75. if 'tabDefaultValue' not in frappe.db.get_tables(cached=False):
  76. from click import secho
  77. secho(
  78. "Table 'tabDefaultValue' missing in the restored site. "
  79. "Database not installed correctly, this can due to lack of "
  80. "permission, or that the database name exists. Check your mysql"
  81. " root password, validity of the backup file or use --force to"
  82. " reinstall",
  83. fg="red"
  84. )
  85. sys.exit(1)
  86. def import_db_from_sql(source_sql=None, verbose=False):
  87. if verbose: print("Starting database import...")
  88. db_name = frappe.conf.db_name
  89. if not source_sql:
  90. source_sql = os.path.join(os.path.dirname(__file__), 'framework_mariadb.sql')
  91. DbManager(frappe.local.db).restore_database(db_name, source_sql, db_name, frappe.conf.db_password)
  92. if verbose: print("Imported from database %s" % source_sql)
  93. def check_database_settings():
  94. versions = get_mariadb_versions()
  95. if versions['major'] <= '10.2':
  96. expected_variables = expected_settings_10_2_earlier
  97. else:
  98. expected_variables = expected_settings_10_3_later
  99. mariadb_variables = frappe._dict(frappe.db.sql("""show variables"""))
  100. # Check each expected value vs. actuals:
  101. result = True
  102. for key, expected_value in expected_variables.items():
  103. if mariadb_variables.get(key) != expected_value:
  104. print("For key %s. Expected value %s, found value %s" %
  105. (key, expected_value, mariadb_variables.get(key)))
  106. result = False
  107. if not result:
  108. site = frappe.local.site
  109. msg = ("Creation of your site - {x} failed because MariaDB is not properly {sep}"
  110. "configured. If using version 10.2.x or earlier, make sure you use the {sep}"
  111. "the Barracuda storage engine. {sep}{sep}"
  112. "Please verify the settings above in MariaDB's my.cnf. Restart MariaDB. And {sep}"
  113. "then run `bench new-site {x}` again.{sep2}"
  114. "").format(x=site, sep2="\n"*2, sep="\n")
  115. print_db_config(msg)
  116. return result
  117. def get_root_connection(root_login, root_password):
  118. import getpass
  119. if not frappe.local.flags.root_connection:
  120. if not root_login:
  121. root_login = 'root'
  122. if not root_password:
  123. root_password = frappe.conf.get("root_password") or None
  124. if not root_password:
  125. root_password = getpass.getpass("MySQL root password: ")
  126. frappe.local.flags.root_connection = frappe.database.get_db(user=root_login, password=root_password)
  127. return frappe.local.flags.root_connection
  128. def print_db_config(explanation):
  129. print("="*80)
  130. print(explanation)
  131. print("="*80)