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.
 
 
 
 
 
 

93 lines
2.4 KiB

  1. # patch manager
  2. #---------------
  3. import webnotes
  4. def run(patch_list, overwrite = 0, log_exception=1, conn = '', db_name = '', root_pwd = ''):
  5. # db connection
  6. if not conn:
  7. connect_db(db_name, root_pwd)
  8. else:
  9. webnotes.conn = conn
  10. # session
  11. if not webnotes.session:
  12. webnotes.session = {'user':'Administrator'}
  13. # no patches on accounts
  14. if webnotes.conn.cur_db_name=='accounts':
  15. return
  16. # check if already applied
  17. if not overwrite:
  18. patch_list = check_already_applied_patch(patch_list)
  19. for p in patch_list:
  20. webnotes.conn.begin()
  21. # execute patch
  22. execute_patch(p, log_exception)
  23. # update patch log table
  24. webnotes.conn.sql("insert into `__PatchLog` (patch, applied_on) values (%s, now())", p)
  25. webnotes.conn.commit()
  26. print "Patch: %s applied successfully..." % p
  27. #-----------------------------------------------------
  28. def execute_patch(p, log_exception):
  29. if log_exception:
  30. try:
  31. exec('from patches import ' + p)
  32. eval(p).execute()
  33. except Exception, e:
  34. write_log()
  35. webnotes.conn.rollback()
  36. return
  37. else:
  38. exec('from patches import ' + p)
  39. eval(p).execute()
  40. #-----------------------------------------------------
  41. def check_already_applied_patch(patch_list):
  42. """
  43. Remove if patch already applied
  44. """
  45. webnotes.conn.sql("create table if not exists `__PatchLog` (patch TEXT, applied_on DATETIME)")
  46. already_patched = [d[0] for d in webnotes.conn.sql("select distinct patch from `__PatchLog`")]
  47. pending_patch = []
  48. for p in patch_list:
  49. if p not in already_patched:
  50. pending_patch.append(p)
  51. return pending_patch
  52. #-----------------------------------------------------
  53. def connect_db(db_name, pwd):
  54. """
  55. Connect database
  56. """
  57. import webnotes.db
  58. webnotes.conn = webnotes.db.Database(user='root', password=pwd)
  59. webnotes.conn.use(db_name)
  60. #-----------------------------------------------------
  61. def write_log():
  62. import os
  63. import webnotes.defs
  64. import webnotes
  65. patch_log = open(os.path.join(webnotes.defs.modules_path, 'patches', 'patch.log'), 'a')
  66. patch_log.write(('\n\nError in %s:\n' % webnotes.conn.cur_db_name) + webnotes.getTraceback())
  67. patch_log.close()
  68. if getattr(webnotes.defs,'admin_email_notification',0):
  69. from webnotes.utils import sendmail
  70. subj = 'Patch Error. <br>Account: %s' % webnotes.conn.cur_db_name
  71. msg = subj + '<br><br>' + webnotes.getTraceback()
  72. print msg
  73. #sendmail(['nabin@erpnext.com'], sender='automail@erpnext.com', subject= subj, parts=[['text/plain', msg]])