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.
 
 
 
 
 
 

141 lines
4.6 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):
  15. webnotes.flags.in_install_db = True
  16. make_conf(db_name, site_config=site_config)
  17. webnotes.local.conn = make_connection(root_login, root_password)
  18. webnotes.local.session = webnotes._dict({'user':'Administrator'})
  19. create_database_and_user(force, verbose)
  20. webnotes.conf.admin_password = admin_password
  21. webnotes.connect(db_name=db_name)
  22. import_db_from_sql(source_sql, verbose)
  23. create_auth_table()
  24. webnotes.flags.in_install_db = False
  25. def create_database_and_user(force, verbose):
  26. db_name = webnotes.conf.db_name
  27. dbman = DbManager(webnotes.local.conn)
  28. if force or (db_name not in dbman.get_database_list()):
  29. dbman.delete_user(db_name)
  30. else:
  31. raise Exception("Database %s already exists" % (db_name,))
  32. dbman.create_user(db_name, webnotes.conf.db_password)
  33. if verbose: print "Created user %s" % db_name
  34. dbman.create_database(db_name)
  35. if verbose: print "Created database %s" % db_name
  36. dbman.grant_all_privileges(db_name, db_name)
  37. dbman.flush_privileges()
  38. if verbose: print "Granted privileges to user %s and database %s" % (db_name, db_name)
  39. # close root connection
  40. webnotes.conn.close()
  41. def create_auth_table():
  42. webnotes.conn.sql_ddl("""create table if not exists __Auth (
  43. `user` VARCHAR(180) NOT NULL PRIMARY KEY,
  44. `password` VARCHAR(180) NOT NULL
  45. ) ENGINE=InnoDB DEFAULT CHARSET=utf8""")
  46. def import_db_from_sql(source_sql, verbose):
  47. if verbose: print "Starting database import..."
  48. db_name = webnotes.conf.db_name
  49. if not source_sql:
  50. source_sql = os.path.join(os.path.dirname(webnotes.__file__), 'data', 'Framework.sql')
  51. DbManager(webnotes.local.conn).restore_database(db_name, source_sql, db_name, webnotes.conf.db_password)
  52. if verbose: print "Imported from database %s" % source_sql
  53. def make_connection(root_login, root_password):
  54. if root_login:
  55. if not root_password:
  56. root_password = webnotes.conf.get("root_password") or None
  57. if not root_password:
  58. root_password = getpass.getpass("MySQL root password: ")
  59. return webnotes.db.Database(user=root_login, password=root_password)
  60. def install_app(name, verbose=False):
  61. webnotes.flags.in_install_app = True
  62. webnotes.clear_cache()
  63. manage = webnotes.get_module(name + ".manage")
  64. if hasattr(manage, "before_install"):
  65. manage.before_install()
  66. sync_for(name, force=True, sync_everything=True, verbose=verbose)
  67. if hasattr(manage, "after_install"):
  68. manage.after_install()
  69. set_all_patches_as_completed(name)
  70. installed_apps = json.loads(webnotes.conn.get_global("installed_apps") or "[]") or []
  71. installed_apps.append(name)
  72. webnotes.conn.set_global("installed_apps", json.dumps(installed_apps))
  73. webnotes.clear_cache()
  74. webnotes.conn.commit()
  75. from webnotes.website.doctype.website_sitemap_config.website_sitemap_config import rebuild_website_sitemap_config
  76. rebuild_website_sitemap_config()
  77. webnotes.clear_cache()
  78. webnotes.flags.in_install_app = False
  79. def set_all_patches_as_completed(app):
  80. patch_path = os.path.join(webnotes.get_pymodule_path(app), "patches.txt")
  81. if os.path.exists(patch_path):
  82. for patch in webnotes.get_file_items(patch_path):
  83. webnotes.doc({
  84. "doctype": "Patch Log",
  85. "patch": patch
  86. }).insert()
  87. webnotes.conn.commit()
  88. def make_conf(db_name=None, db_password=None, site_config=None):
  89. site = webnotes.local.site
  90. make_site_config(db_name, db_password, site_config)
  91. webnotes.destroy()
  92. webnotes.init(site)
  93. def make_site_config(db_name=None, db_password=None, site_config=None):
  94. webnotes.create_folder(os.path.join(webnotes.local.site_path))
  95. site_file = os.path.join(webnotes.local.site_path, "site_config.json")
  96. if not os.path.exists(site_file):
  97. if not (site_config and isinstance(site_config, dict)):
  98. site_config = get_conf_params(db_name, db_password)
  99. with open(site_file, "w") as f:
  100. f.write(json.dumps(site_config, indent=1, sort_keys=True))
  101. def get_conf_params(db_name=None, db_password=None):
  102. if not db_name:
  103. db_name = raw_input("Database Name: ")
  104. if not db_name:
  105. raise Exception("Database Name Required")
  106. if not db_password:
  107. from webnotes.utils import random_string
  108. db_password = random_string(16)
  109. return {"db_name": db_name, "db_password": db_password}