Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

156 rader
4.6 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  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
  7. import webnotes, conf
  8. import webnotes.db
  9. import getpass
  10. from webnotes.model.db_schema import DbManager
  11. from webnotes.model.sync import sync_for
  12. class Installer:
  13. def __init__(self, root_login, root_password=None):
  14. if root_login:
  15. if not root_password:
  16. root_password = getattr(conf, "root_password", None)
  17. if not root_password:
  18. root_password = getpass.getpass("MySQL root password: ")
  19. self.root_password = root_password
  20. self.conn = webnotes.db.Database(user=root_login, password=root_password)
  21. webnotes.conn=self.conn
  22. webnotes.session= webnotes._dict({'user':'Administrator'})
  23. self.dbman = DbManager(self.conn)
  24. def import_from_db(self, target, source_path='', password = 'admin', verbose=0):
  25. """
  26. a very simplified version, just for the time being..will eventually be deprecated once the framework stabilizes.
  27. """
  28. # delete user (if exists)
  29. self.dbman.delete_user(target)
  30. # create user and db
  31. self.dbman.create_user(target, conf.db_password)
  32. if verbose: print "Created user %s" % target
  33. # create a database
  34. self.dbman.create_database(target)
  35. if verbose: print "Created database %s" % target
  36. # grant privileges to user
  37. self.dbman.grant_all_privileges(target,target)
  38. if verbose: print "Granted privileges to user %s and database %s" % (target, target)
  39. # flush user privileges
  40. self.dbman.flush_privileges()
  41. self.conn.use(target)
  42. # import in target
  43. if verbose: print "Starting database import..."
  44. # get the path of the sql file to import
  45. source_given = True
  46. if not source_path:
  47. source_given = False
  48. source_path = os.path.join(os.path.dirname(webnotes.__file__), "..", 'conf', 'Framework.sql')
  49. self.dbman.restore_database(target, source_path, target, conf.db_password)
  50. if verbose: print "Imported from database %s" % source_path
  51. # fresh app
  52. if 'Framework.sql' in source_path:
  53. print "Installing app..."
  54. self.install_app()
  55. # update admin password
  56. self.create_auth_table()
  57. self.update_admin_password(password)
  58. return target
  59. def install_app(self):
  60. sync_for("lib", force=True, sync_everything=True)
  61. self.import_core_docs()
  62. try:
  63. from startup import install
  64. except ImportError, e:
  65. print "No app install found"
  66. return
  67. install.pre_import()
  68. sync_for("app", force=True, sync_everything=True)
  69. print "Completing App Import..."
  70. install.post_import()
  71. print "Updating patches..."
  72. self.set_all_patches_as_completed()
  73. def update_admin_password(self, password):
  74. from webnotes.auth import update_password
  75. webnotes.conn.begin()
  76. update_password("Administrator", getattr(conf, "admin_password", password))
  77. webnotes.conn.commit()
  78. def import_core_docs(self):
  79. install_docs = [
  80. {'doctype':'Module Def', 'name': 'Core', 'module_name':'Core'},
  81. # roles
  82. {'doctype':'Role', 'role_name': 'Administrator', 'name': 'Administrator'},
  83. {'doctype':'Role', 'role_name': 'All', 'name': 'All'},
  84. {'doctype':'Role', 'role_name': 'System Manager', 'name': 'System Manager'},
  85. {'doctype':'Role', 'role_name': 'Report Manager', 'name': 'Report Manager'},
  86. {'doctype':'Role', 'role_name': 'Website Manager', 'name': 'Website Manager'},
  87. {'doctype':'Role', 'role_name': 'Blogger', 'name': 'Blogger'},
  88. {'doctype':'Role', 'role_name': 'Guest', 'name': 'Guest'},
  89. # profiles
  90. {'doctype':'Profile', 'name':'Administrator', 'first_name':'Administrator',
  91. 'email':'admin@localhost', 'enabled':1},
  92. {'doctype':'Profile', 'name':'Guest', 'first_name':'Guest',
  93. 'email':'guest@localhost', 'enabled':1},
  94. # userroles
  95. {'doctype':'UserRole', 'parent': 'Administrator', 'role': 'Administrator',
  96. 'parenttype':'Profile', 'parentfield':'user_roles'},
  97. {'doctype':'UserRole', 'parent': 'Guest', 'role': 'Guest',
  98. 'parenttype':'Profile', 'parentfield':'user_roles'}
  99. ]
  100. webnotes.conn.begin()
  101. for d in install_docs:
  102. doc = webnotes.doc(fielddata=d)
  103. doc.insert()
  104. webnotes.conn.commit()
  105. def set_all_patches_as_completed(self):
  106. try:
  107. from patches.patch_list import patch_list
  108. except ImportError, e:
  109. print "No patches to update."
  110. return
  111. webnotes.conn.begin()
  112. for patch in patch_list:
  113. webnotes.doc({
  114. "doctype": "Patch Log",
  115. "patch": patch
  116. }).insert()
  117. webnotes.conn.commit()
  118. def create_auth_table(self):
  119. webnotes.conn.sql("""drop table if exists __Auth""")
  120. webnotes.conn.sql("""create table __Auth (
  121. `user` VARCHAR(180) NOT NULL PRIMARY KEY,
  122. `password` VARCHAR(180) NOT NULL
  123. ) ENGINE=InnoDB DEFAULT CHARSET=utf8""")