You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
преди 11 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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)