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.
 
 
 
 
 
 

238 lines
6.4 KiB

  1. import os,sys
  2. cgi_bin_path = os.path.sep.join(__file__.split(os.path.sep)[:-3])
  3. sys.path.append(cgi_bin_path)
  4. #
  5. # make a copy of defs.py (if not exists)
  6. #
  7. def copy_defs():
  8. global cgi_bin_path
  9. if not os.path.exists(os.path.join(cgi_bin_path, 'webnotes', 'defs.py')):
  10. ret = os.system('cp '+ os.path.join(cgi_bin_path, 'webnotes', 'defs_template.py')+\
  11. ' '+os.path.join(cgi_bin_path, 'webnotes', 'defs.py'))
  12. print 'Made copy of defs.py'
  13. #
  14. # Main Installer Class
  15. #
  16. class Installer:
  17. def __init__(self, root_login, root_password):
  18. self.root_password = root_password
  19. from webnotes.model.db_schema import DbManager
  20. self.conn = webnotes.db.Database(user=root_login, password=root_password)
  21. webnotes.conn=self.conn
  22. webnotes.session= {'user':'Administrator'}
  23. self.dbman = DbManager(self.conn)
  24. self.mysql_path = hasattr(defs, 'mysql_path') and webnotes.defs.mysql_path or ''
  25. #
  26. # run framework related cleanups
  27. #
  28. def framework_cleanups(self, target):
  29. self.dbman.drop_table('__DocTypeCache')
  30. webnotes.conn.sql("create table `__DocTypeCache` (name VARCHAR(120), modified DATETIME, content TEXT, server_code_compiled TEXT)")
  31. # set the basic passwords
  32. webnotes.conn.begin()
  33. webnotes.conn.sql("update tabProfile set password = password('admin') where name='Administrator'")
  34. webnotes.conn.commit()
  35. def import_core_module(self):
  36. """
  37. Imports the "Core" module from .txt file and creates
  38. Creates profile Administrator
  39. """
  40. from webnotes.modules.import_module import import_module
  41. from webnotes.modules.module_manager import reload_doc
  42. reload_doc('core','doctype','doctype')
  43. reload_doc('core','doctype','docfield')
  44. reload_doc('core','doctype','docperm')
  45. import_module('core')
  46. webnotes.conn.begin()
  47. from webnotes.model.doc import Document
  48. p = Document('Profile')
  49. p.name = p.first_name = 'Administrator'
  50. p.email = 'admin@localhost'
  51. p.save(new = 1)
  52. ur = Document('UserRole')
  53. ur.parent = 'Administrator'
  54. ur.role = 'Administrator'
  55. ur.parenttype = 'Profile'
  56. ur.parentfield = 'userroles'
  57. p.enabled = 1
  58. ur.save(1)
  59. p = Document('Profile')
  60. p.name = p.first_name = 'Guest'
  61. p.email = 'guest@localhost'
  62. p.enabled = 1
  63. p.save(new = 1)
  64. ur = Document('UserRole')
  65. ur.parent = 'Guest'
  66. ur.role = 'Guest'
  67. ur.parenttype = 'Profile'
  68. ur.parentfield = 'userroles'
  69. ur.save(1)
  70. webnotes.conn.commit()
  71. #
  72. # main script to create a database from
  73. #
  74. def import_from_db(self, target, source_path='', password = 'admin', verbose=0):
  75. """
  76. a very simplified version, just for the time being..will eventually be deprecated once the framework stabilizes.
  77. """
  78. #Storing passed source path
  79. passed_source_path = source_path
  80. # get the path of the sql file to import
  81. if not source_path:
  82. source_path = os.path.join(os.path.sep.join(os.path.abspath(webnotes.__file__).split(os.path.sep)[:-3]), 'data', 'Framework.sql')
  83. # delete user (if exists)
  84. self.dbman.delete_user(target)
  85. # create user and db
  86. self.dbman.create_user(target,getattr(defs,'db_password',None))
  87. if verbose: print "Created user %s" % target
  88. # create a database
  89. self.dbman.create_database(target)
  90. if verbose: print "Created database %s" % target
  91. # grant privileges to user
  92. self.dbman.grant_all_privileges(target,target)
  93. if verbose: print "Granted privileges to user %s and database %s" % (target, target)
  94. # flush user privileges
  95. self.dbman.flush_privileges()
  96. self.conn.use(target)
  97. # import in target
  98. if verbose: print "Starting database import..."
  99. self.dbman.restore_database(target, source_path, self.root_password)
  100. if verbose: print "Imported from database %s" % source_path
  101. #If source path is passed
  102. #i.e. importing from master sql, dont import core modules
  103. if not passed_source_path: self.import_core_module()
  104. # framework cleanups
  105. self.framework_cleanups(target)
  106. if verbose: print "Ran framework startups on %s" % target
  107. return target
  108. def make_scheduler(root_login, root_password, verbose):
  109. """
  110. Make the database where all scheduler events will be stored from multiple datbases
  111. See webnotes.utils.scheduler for more information
  112. """
  113. conn = webnotes.db.Database(user=root_login, password=root_password)
  114. from webnotes.model.db_schema import DbManager
  115. dbman = DbManager(conn)
  116. # delete user (if exists)
  117. dbman.delete_user('master_scheduler')
  118. # create user and db
  119. dbman.create_user('master_scheduler', getattr(defs,'db_password',None))
  120. if verbose: print "Created user master_scheduler"
  121. # create a database
  122. dbman.create_database('master_scheduler')
  123. if verbose: print "Created database master_scheduler"
  124. # grant privileges to user
  125. dbman.grant_all_privileges('master_scheduler','master_scheduler')
  126. # flush user privileges
  127. dbman.flush_privileges()
  128. conn.use('master_scheduler')
  129. # create events table
  130. conn.sql("""create table Event(
  131. `db_name` varchar(60),
  132. `event` varchar(180),
  133. `interval` int(20),
  134. `next_execution` timestamp,
  135. `recurring` int(1),
  136. primary key (`db_name`, `event`),
  137. index next_execution(next_execution)
  138. )""")
  139. conn.sql("""create table EventLog(
  140. `db_name` varchar(180),
  141. `event` varchar(180),
  142. `executed_on` timestamp,
  143. `log` text,
  144. index executed_on(executed_on))
  145. """)
  146. #
  147. # load the options
  148. #
  149. def get_parser():
  150. from optparse import OptionParser
  151. parser = OptionParser(usage="usage: %prog [options] ROOT_LOGIN ROOT_PASSWORD DBNAME")
  152. parser.add_option("-x", "--database-password", dest="password", default="admin", help="Optional: New password for the Framework Administrator, default 'admin'")
  153. parser.add_option("-s", "--source", dest="source_path", default=None, help="Optional: Path of the sql file from which you want to import the instance, default 'data/Framework.sql'")
  154. return parser
  155. #
  156. # execution here
  157. #
  158. if __name__=='__main__':
  159. parser = get_parser()
  160. (options, args) = parser.parse_args()
  161. try:
  162. from webnotes import defs
  163. import webnotes
  164. import webnotes.db
  165. except ImportError:
  166. copy_defs()
  167. from webnotes import defs
  168. import webnotes
  169. import webnotes.db
  170. if len(args)==3:
  171. root_login, root_password, db_name = args[0], args[1], args[2]
  172. if db_name=='master_scheduler':
  173. make_scheduler(root_login, root_password, 1)
  174. else:
  175. inst = Installer(root_login, root_password)
  176. inst.import_from_db(db_name, source_path=options.source_path, \
  177. password = options.password, verbose = 1)
  178. print "Database created, please edit defs.py to get started"
  179. else:
  180. parser.print_help()