Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

173 řádky
5.4 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. # called from wnf.py
  4. # lib/wnf.py --install [rootpassword] [dbname] [source]
  5. from __future__ import unicode_literals
  6. import os, sys, json
  7. import webnotes
  8. import webnotes.db
  9. import getpass
  10. from webnotes.model.db_schema import DbManager
  11. from webnotes.model.sync import sync_for
  12. from webnotes.utils import cstr
  13. def install_db(root_login="root", root_password=None, db_name=None, source_sql=None,
  14. admin_password = 'admin', verbose=True, force=0, site_config=None, reinstall=False):
  15. webnotes.flags.in_install_db = True
  16. make_conf(db_name, site_config=site_config)
  17. if reinstall:
  18. webnotes.connect(db_name=db_name)
  19. dbman = DbManager(webnotes.local.conn)
  20. dbman.create_database(db_name)
  21. else:
  22. webnotes.local.conn = make_connection(root_login, root_password)
  23. webnotes.local.session = webnotes._dict({'user':'Administrator'})
  24. create_database_and_user(force, verbose)
  25. webnotes.conf.admin_password = admin_password
  26. webnotes.connect(db_name=db_name)
  27. import_db_from_sql(source_sql, verbose)
  28. create_auth_table()
  29. webnotes.flags.in_install_db = False
  30. def create_database_and_user(force, verbose):
  31. db_name = webnotes.conf.db_name
  32. dbman = DbManager(webnotes.local.conn)
  33. if force or (db_name not in dbman.get_database_list()):
  34. dbman.delete_user(db_name)
  35. dbman.drop_database(db_name)
  36. else:
  37. raise Exception("Database %s already exists" % (db_name,))
  38. dbman.create_user(db_name, webnotes.conf.db_password)
  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)
  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. webnotes.conn.close()
  47. def create_auth_table():
  48. webnotes.conn.sql_ddl("""create table if not exists __Auth (
  49. `user` VARCHAR(180) NOT NULL PRIMARY KEY,
  50. `password` VARCHAR(180) NOT NULL
  51. ) ENGINE=InnoDB DEFAULT CHARSET=utf8""")
  52. def import_db_from_sql(source_sql, verbose):
  53. if verbose: print "Starting database import..."
  54. db_name = webnotes.conf.db_name
  55. if not source_sql:
  56. source_sql = os.path.join(os.path.dirname(webnotes.__file__), 'data', 'Framework.sql')
  57. DbManager(webnotes.local.conn).restore_database(db_name, source_sql, db_name, webnotes.conf.db_password)
  58. if verbose: print "Imported from database %s" % source_sql
  59. def make_connection(root_login, root_password):
  60. if root_login:
  61. if not root_password:
  62. root_password = webnotes.conf.get("root_password") or None
  63. if not root_password:
  64. root_password = getpass.getpass("MySQL root password: ")
  65. return webnotes.db.Database(user=root_login, password=root_password)
  66. @webnotes.whitelist()
  67. def install_app(name, verbose=False):
  68. webnotes.flags.in_install_app = name
  69. webnotes.clear_cache()
  70. app_hooks = webnotes.get_hooks(app_name=name)
  71. installed_apps = webnotes.get_installed_apps()
  72. if name in installed_apps:
  73. print "App Already Installed"
  74. webnotes.msgprint("App Already Installed.")
  75. return
  76. if name != "webnotes":
  77. webnotes.only_for("System Manager")
  78. for before_install in app_hooks.before_install or []:
  79. webnotes.get_attr(before_install)()
  80. sync_for(name, force=True, sync_everything=True, verbose=verbose)
  81. add_to_installed_apps(name)
  82. set_all_patches_as_completed(name)
  83. for after_install in app_hooks.after_install or []:
  84. webnotes.get_attr(after_install)()
  85. webnotes.flags.in_install_app = False
  86. def add_to_installed_apps(app_name):
  87. installed_apps = webnotes.get_installed_apps()
  88. if not app_name in installed_apps:
  89. installed_apps.append(app_name)
  90. webnotes.conn.set_global("installed_apps", json.dumps(installed_apps))
  91. webnotes.conn.commit()
  92. from webnotes.website.doctype.website_sitemap_config.website_sitemap_config import rebuild_website_sitemap_config
  93. rebuild_website_sitemap_config()
  94. webnotes.clear_cache()
  95. def set_all_patches_as_completed(app):
  96. patch_path = os.path.join(webnotes.get_pymodule_path(app), "patches.txt")
  97. if os.path.exists(patch_path):
  98. for patch in webnotes.get_file_items(patch_path):
  99. webnotes.doc({
  100. "doctype": "Patch Log",
  101. "patch": patch
  102. }).insert()
  103. webnotes.conn.commit()
  104. def make_conf(db_name=None, db_password=None, site_config=None):
  105. site = webnotes.local.site
  106. make_site_config(db_name, db_password, site_config)
  107. webnotes.destroy()
  108. webnotes.init(site)
  109. def make_site_config(db_name=None, db_password=None, site_config=None):
  110. webnotes.create_folder(os.path.join(webnotes.local.site_path))
  111. site_file = os.path.join(webnotes.local.site_path, "site_config.json")
  112. if not os.path.exists(site_file):
  113. if not (site_config and isinstance(site_config, dict)):
  114. site_config = get_conf_params(db_name, db_password)
  115. with open(site_file, "w") as f:
  116. f.write(json.dumps(site_config, indent=1, sort_keys=True))
  117. def get_conf_params(db_name=None, db_password=None):
  118. if not db_name:
  119. db_name = raw_input("Database Name: ")
  120. if not db_name:
  121. raise Exception("Database Name Required")
  122. if not db_password:
  123. from webnotes.utils import random_string
  124. db_password = random_string(16)
  125. return {"db_name": db_name, "db_password": db_password}
  126. def make_site_dirs():
  127. site_public_path = os.path.join(webnotes.local.site_path, 'public')
  128. for dir_path in (
  129. os.path.join(site_public_path, 'backups'),
  130. os.path.join(site_public_path, 'files')):
  131. if not os.path.exists(dir_path):
  132. os.makedirs(dir_path)