|
@@ -0,0 +1,92 @@ |
|
|
|
|
|
# patch manager |
|
|
|
|
|
#--------------- |
|
|
|
|
|
|
|
|
|
|
|
import webnotes |
|
|
|
|
|
|
|
|
|
|
|
def run(patch_list, overwrite = 0, log_exception=1, conn = '', db_name = '', root_pwd = ''): |
|
|
|
|
|
# db connection |
|
|
|
|
|
if not conn: |
|
|
|
|
|
connect_db(db_name, root_pwd) |
|
|
|
|
|
else: |
|
|
|
|
|
webnotes.conn = conn |
|
|
|
|
|
|
|
|
|
|
|
# session |
|
|
|
|
|
if not webnotes.session: |
|
|
|
|
|
webnotes.session = {'user':'Administrator'} |
|
|
|
|
|
|
|
|
|
|
|
# no patches on accounts |
|
|
|
|
|
if webnotes.conn.cur_db_name=='accounts': |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
# check if already applied |
|
|
|
|
|
if not overwrite: |
|
|
|
|
|
patch_list = check_already_applied_patch(patch_list) |
|
|
|
|
|
|
|
|
|
|
|
for p in patch_list: |
|
|
|
|
|
webnotes.conn.begin() |
|
|
|
|
|
|
|
|
|
|
|
# execute patch |
|
|
|
|
|
execute_patch(p, log_exception) |
|
|
|
|
|
|
|
|
|
|
|
# update patch log table |
|
|
|
|
|
webnotes.conn.sql("insert into `__PatchLog` (patch, applied_on) values (%s, now())", p) |
|
|
|
|
|
|
|
|
|
|
|
webnotes.conn.commit() |
|
|
|
|
|
|
|
|
|
|
|
print "Patch: %s applied successfully..." % p |
|
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------- |
|
|
|
|
|
def execute_patch(p, log_exception): |
|
|
|
|
|
if log_exception: |
|
|
|
|
|
try: |
|
|
|
|
|
exec('from patches import ' + p) |
|
|
|
|
|
eval(p).execute() |
|
|
|
|
|
except Exception, e: |
|
|
|
|
|
write_log() |
|
|
|
|
|
webnotes.conn.rollback() |
|
|
|
|
|
return |
|
|
|
|
|
else: |
|
|
|
|
|
exec('from patches import ' + p) |
|
|
|
|
|
eval(p).execute() |
|
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------- |
|
|
|
|
|
def check_already_applied_patch(patch_list): |
|
|
|
|
|
""" |
|
|
|
|
|
Remove if patch already applied |
|
|
|
|
|
""" |
|
|
|
|
|
webnotes.conn.sql("create table if not exists `__PatchLog` (patch TEXT, applied_on DATETIME)") |
|
|
|
|
|
|
|
|
|
|
|
already_patched = [d[0] for d in webnotes.conn.sql("select distinct patch from `__PatchLog`")] |
|
|
|
|
|
pending_patch = [] |
|
|
|
|
|
|
|
|
|
|
|
for p in patch_list: |
|
|
|
|
|
if p not in already_patched: |
|
|
|
|
|
pending_patch.append(p) |
|
|
|
|
|
|
|
|
|
|
|
return pending_patch |
|
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------- |
|
|
|
|
|
def connect_db(db_name, pwd): |
|
|
|
|
|
""" |
|
|
|
|
|
Connect database |
|
|
|
|
|
""" |
|
|
|
|
|
import webnotes.db |
|
|
|
|
|
webnotes.conn = webnotes.db.Database(user='root', password=pwd) |
|
|
|
|
|
webnotes.conn.use(db_name) |
|
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------- |
|
|
|
|
|
def write_log(): |
|
|
|
|
|
import os |
|
|
|
|
|
import webnotes.defs |
|
|
|
|
|
import webnotes |
|
|
|
|
|
|
|
|
|
|
|
patch_log = open(os.path.join(webnotes.defs.modules_path, 'patches', 'patch.log'), 'a') |
|
|
|
|
|
patch_log.write(('\n\nError in %s:\n' % webnotes.conn.cur_db_name) + webnotes.getTraceback()) |
|
|
|
|
|
patch_log.close() |
|
|
|
|
|
|
|
|
|
|
|
if getattr(webnotes.defs,'admin_email_notification',0): |
|
|
|
|
|
from webnotes.utils import sendmail |
|
|
|
|
|
subj = 'Patch Error. <br>Account: %s' % webnotes.conn.cur_db_name |
|
|
|
|
|
msg = subj + '<br><br>' + webnotes.getTraceback() |
|
|
|
|
|
print msg |
|
|
|
|
|
#sendmail(['nabin@erpnext.com'], sender='automail@erpnext.com', subject= subj, parts=[['text/plain', msg]]) |