def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "update_dt": now, } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) # select2 #obj.iphosts = ";".join(self.request.POST.getlist("iphosts",[])) #return super(QBaseDetailView, self).form_valid(form) ## m2m field update obj.save() tasks = self.request.POST.get("tasks", None) if not tasks: return self.ret_err_msg("tasks", "任务", "任务不能为空") taskids = [int(tid) for tid in str(tasks).strip("|").split("|")] #print tasks, taskids for tct in obj.comm_tasks.all(): ## 先删除 obj.comm_tasks.remove(tct) for tid in taskids: ## 顺序新增 ct = models.Comm_Task_Def.objects.get(id=tid) obj.comm_tasks.add(ct) return QBaseDetailView.form_valid(self, form)
def stop(self, section_id=None): itemconf = self._chp.get_section_dict(section_id) appname = itemconf.get("appname", None) stop_cmd = itemconf.get("stop_cmd", None) self._logger.dictlog(level="info", width=20, **itemconf) scolor.info(u"#### [%s] 停止应用【%s】 ####" % (sdate().datetime_human(), appname)) if str(stop_cmd).strip() == None: scolor.warn(u"应用【%s】停止命令为空" % (appname)) return c2 = cmds(stop_cmd) stdo = c2.stdo() stde = c2.stde() retcode = c2.code() #exeop = str("%s\n%s" % (stdo,stde)).strip() if retcode == 0 and str(stde).strip() == "": scolor.info(u"停止应用【%s】成功!" % (appname)) else: scolor.error(u"停止应用【%s】失败!" % (appname)) logobj = { u"命令": stop_cmd, u"标准输出": stdo, u"错误输出": stde, u"返回码": retcode, u"orders": [u"命令", u"标准输出", u"错误输出", u"返回码"] } self._logger.dictlog(level="info", width=12, **logobj)
def form_valid(self, form): now = sdate().datetime_human() super(AddView, self).form_valid(form) # 这里要加上 form.instance.create_dt = now form.instance.update_dt= now return super(AddView, self).form_valid(form)
def post(self, request, *args, **kwargs): obj = {} exclude_fields = ["__action" , "csrfmiddlewaretoken" , "create_dt", "update_dt", "create_user"] actions = ["clone", "update", "delete"] postdic = dict(request.POST) action = postdic.get("__action", "None") action = str(action[0]).lower() print postdic for k,vs in postdic.items(): if k in exclude_fields: continue obj[k] = vs[0] if action not in actions or "id" not in obj: return HttpResponse(status=403) mdl = models.Task_Def.objects resp_data = {"action":action} if action == "clone": del(obj["id"]) obj["create_user"] = self.request.user.get_username() crt_obj = mdl.create(**obj) new_url = reverse_lazy("jobtask:taskdef-detail", args=(crt_obj.id,)) resp_data["new_url"] = new_url resp_data["id"] = crt_obj.id if action == "update": obj["update_dt"] = sdate().datetime_human() rows = mdl.filter(id=int(obj["id"])).update(**obj) resp_data["rows"] = rows if action == "delete": deleted, _rows_count = mdl.filter(id=int(obj["id"])).delete() resp_data["deleted"] = deleted return HttpResponse(JsonResponse(resp_data), content_type="application/json")
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "create_dt": now, "update_dt": now, "create_user": self.request.user.username or 'Admin', } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) #obj.iphosts = ";".join(self.request.POST.getlist("iphosts",[])) #return super(QBaseCreateView, self).form_valid(form) #print self.request.POST.getlist("comm_tasks") obj.save() #comm_tasks = form.cleaned_data["comm_tasks"] tasks = self.request.POST.get("tasks", None) if not tasks: return self.ret_err_msg("tasks", "任务", "任务不能为空") taskids = [int(tid) for tid in str(tasks).strip("|").split("|")] #print tasks, taskids for tid in taskids: ct = models.Comm_Task_Def.objects.get(id=tid) models.CommJobTaskConfig.objects.create(comm_job_id=obj.id, comm_task_id=ct.id) #obj.comm_tasks.add(ct) return QBaseCreateView.form_valid(self, form)
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "update_dt": now, } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) #return super(QBaseDetailView, self).form_valid(form) return QBaseDetailView.form_valid(self, form)
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "create_dt": now, "update_dt": now, "create_user": self.request.user.username or 'Admin', } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) #return super(QBaseCreateView, self).form_valid(form) return QBaseCreateView.form_valid(self, form)
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "update_dt": now, } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) # select2 obj.iphosts = ";".join(self.request.POST.getlist("iphosts", [])) #return super(QBaseDetailView, self).form_valid(form) return QBaseDetailView.form_valid(self, form)
def form_valid(self, form): self.taskdef = taskdef = form.save(commit=False) now = sdate().datetime_human() taskdef.create_user = self.request.user.username or 'Admin' taskdef.create_dt = now taskdef.update_dt = now taskdef.save() result = super(AddView, self).form_valid( form) # django.http.response.HttpResponseRedirect #return result respdata = {"id": taskdef.id, "msg": "success"} # 返回JSON,可以在同一个页面多次添加 return HttpResponse(JsonResponse(respdata), content_type="application/json")
def add(request): if request.method == "POST": form = forms.TaskDefForm(request.POST, request.FILES) ## 文件上传,注意写法 if form.is_valid(): cd = form.cleaned_data now = sdate().datetime_human() cd["create_dt"] = now cd["update_dt"] = now models.Task_Def.objects.create(**cd) return HttpResponseRedirect("/thanks/") else: form = forms.TaskDefForm() context = locals() context["form"] = form context["title"] = u"任务定义" return render(request, "jobtask/taskdef_new.html", context) ## 为让csrf生效,需要使用render函数,而不能使用render_to_response
def send_mail(self, tolist, title, content, fmt="plain"): assert type(tolist) == types.ListType self._login() try: appstr = self._app + ", " if self._app else "" m_content = "\ %s \ \n\n\ -------------------------------------------------------------------------\n\ %sAuto Send @%s, Please Do Not Reply! \n\ " % (content, appstr, sdate().datetime()) if fmt == "html": m_content = m_content.replace("\n", "<br />") m_charset = "utf-8" msg = MIMEText(m_content, _subtype=fmt, _charset=m_charset) msg['Subject'] = title #email title msg['From'] = self._username #sender msg['To'] = ','.join(tolist) #recipient msg['date'] = time.strftime( '%a, %d %b %Y %H:%M:%S %z') #define send datetime res = self._smtp.sendmail(self._username, tolist, msg.as_string()) if self._logger: logobj = {} logobj['Topic'] = "SEND MAIL" logobj['Subject'] = title #email title logobj['From'] = self._username #sender logobj['To'] = ','.join(tolist) #recipient logobj['date'] = time.strftime( '%a, %d %b %Y %H:%M:%S %z') #define send datetime logobj['result'] = res logobj['orders'] = [ "Topic", "Subject", "From", "To", "res", "date" ] self._logger.dictlog("info", width=8, **logobj) if not res: ## 返回空字典,说明都发送成功 return True except Exception, data: import traceback tb = traceback.format_exc() if self._logger: logobj = {} logobj['traceback'] = tb #email title self._logger.dictlog("warn", width=10, **logobj)
def form_valid(self, form): ## form_valid验证通过后,这里才能做更新 self.taskdef = taskdef = form.save(commit=False) now = sdate().datetime_human() taskdef.create_user = self.request.user.username or 'Admin' taskdef.create_dt = now taskdef.update_dt = now taskdef.save() #print self.request.META.get("PATH_INFO",None) respdata = { "code": 0, "errmsg": "success", "action": self.request.GET.get("_action", "None") } self.respdata.update(respdata) # 返回JSON,可以在同一个页面多次添加 return HttpResponse(JsonResponse(respdata), content_type="application/json")
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "update_dt": now, } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) # select2 #obj.iphosts = ";".join(self.request.POST.getlist("iphosts",[])) #return super(QBaseDetailView, self).form_valid(form) ## m2m field update obj.save() comm_tasks = form.cleaned_data["comm_tasks"] obj.comm_tasks.set(comm_tasks) return QBaseDetailView.form_valid(self, form)
def status(self, section_id=None): itemconf = self._chp.get_section_dict(section_id) appname = itemconf.get("appname", None) process_uniq_flag = itemconf.get("process_uniq_flag", None) process_port = itemconf.get("process_port", None) status_cmd = itemconf.get("status_cmd", None) self._logger.dictlog(level="info", width=20, **itemconf) scolor.info(u"#### [%s] 检测应用【%s】状态 ####" % (sdate().datetime_human(), appname)) if status_cmd and str(status_cmd).strip(): c2 = cmds(status_cmd, timeout=10) stdo, stde, retcode = c2.stdo(), c2.stde(), c2.code() logdict = { "命令": status_cmd, "标准输出": stdo, "标准错误输出": stde, "返回码": retcode, "orders": ["命令", "标准输出", "标准错误输出", "返回码"], } self._logger.dictlog(level="info", width=10, **logdict) scolor.info(u"-> 根据用户指定的状态命令检测应用状态") print " 命令:%s" % (status_cmd) print "执行结果:" print "=========" print str(str(stdo).strip() + "\n" + str(stde).strip()).strip() if process_uniq_flag and str(process_uniq_flag).strip(): (flag, cmdstr, stdo, stde, retcode) = self.is_process_exist(process_uniq_flag) scolor.info(u"-> 根据应用进程唯一标识检测") print " 命令:%s" % (cmdstr) print "执行结果:" print "=========" print str(str(stdo).strip() + "\n" + str(stde).strip()).strip() if process_port: (flag, cmdstr, stdo, stde, retcode) = self.is_port_exist(process_port) scolor.info(u"-> 根据应用进程端口检测") print " 命令:%s" % (cmdstr) print "执行结果:" print "=========" print str(str(stdo).strip() + "\n" + str(stde).strip()).strip()
def send_mail(self, tolist, title, content, fmt="plain"): assert type(tolist) == types.ListType self._login() try: appstr = self._app+", " if self._app else "" m_content = "\ %s \ \n\n\ -------------------------------------------------------------------------\n\ %sAuto Send @%s, Please Do Not Reply! \n\ " % (content, appstr, sdate().datetime()) if fmt == "html": m_content = m_content.replace("\n", "<br />") m_charset = "utf-8" msg=MIMEText(m_content, _subtype=fmt, _charset=m_charset) msg['Subject']= title #email title msg['From']= self._username #sender msg['To']=','.join(tolist) #recipient msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z') #define send datetime res = self._smtp.sendmail(self._username , tolist , msg.as_string()) if self._logger: logobj = {} logobj['Topic']= "SEND MAIL" logobj['Subject']= title #email title logobj['From']= self._username #sender logobj['To']=','.join(tolist) #recipient logobj['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z') #define send datetime logobj['result'] = res logobj['orders']= ["Topic", "Subject", "From", "To", "res", "date"] self._logger.dictlog("info", width=8, **logobj) if not res: ## 返回空字典,说明都发送成功 return True except Exception,data: import traceback tb = traceback.format_exc() if self._logger: logobj = {} logobj['traceback']= tb #email title self._logger.dictlog("warn", width=10, **logobj)
def form_valid(self, form): obj = form.save(commit=False) now = sdate().datetime_human() update_or_add_fds = { "update_dt": now, } for (k, v) in update_or_add_fds.iteritems(): setattr(obj, k, v) obj.save() tasks = self.request.POST.get("tasks", None) if not tasks: return self.ret_err_msg("tasks", "任务", "任务不能为空") taskids = [int(tid) for tid in str(tasks).strip("|").split("|")] models.CommJobTaskConfig.objects.filter(comm_job_id=obj.id).delete() for tid in taskids: ## 顺序新增 ct = models.Comm_Task_Def.objects.get(id=tid) models.CommJobTaskConfig.objects.create(comm_job_id=obj.id, comm_task_id=ct.id) #obj.comm_tasks.add(ct) return QBaseDetailView.form_valid(self, form)
def check(self, section_id=None): itemconf = self._chp.get_section_dict(section_id) appname = itemconf.get("appname", None) process_uniq_flag = itemconf.get("process_uniq_flag", None) process_port = itemconf.get("process_port", None) check_cmd = itemconf.get("check_cmd", None) check_str = itemconf.get("check_str", None) self._logger.dictlog(level="info", width=20, **itemconf) scolor.info(u"#### [%s] 检测应用【%s】运行状态 ####" % (sdate().datetime_human(), appname)) is_ok = True mt_method = {"False": scolor.error, "True": scolor.info} if check_cmd and check_str: check_flag, cmdstr, stdo, stde, retcode = self.is_check_ok( check_cmd, check_str) is_ok = is_ok and check_flag scolor.info(u"-> 根据检测命令检测") mt_method[str(check_flag)](str(check_flag)) if process_uniq_flag: chk_proc_flag, cmdstr, stdo, stde, retcode = self.is_process_exist( process_uniq_flag) is_ok = is_ok and chk_proc_flag scolor.info(u"-> 根据应用进程唯一标识检测") mt_method[str(chk_proc_flag)](str(chk_proc_flag)) if process_port: chk_proc_port_flag, cmdstr, stdo, stde, retcode = self.is_port_exist( process_port) is_ok = is_ok and chk_proc_port_flag scolor.info(u"-> 根据应用进程端口检测") mt_method[str(chk_proc_port_flag)](str(chk_proc_port_flag)) return is_ok
def post(self, request, *args, **kwargs): try: jobdef = get_object_or_404(models.Comm_Job_Def, id=args[0]) now = timezone.now() jobid = sdate().datetime_ex() #new job job = { "jobid": jobid, "create_dt": now, "create_user": self.request.user.get_username(), "job_status": 2, } job = models.Job(**job) job.jobdef = jobdef job.job_class = jobdef.job_class job.save() for ct in jobdef.comm_tasks.all(): jobtask = { "file_loc": ct.task.file_loc, "file": ct.task.file or ct.task.remote_file, "main_script_name": ct.task.main_script_name, "exe_user": ct.exe_user, "params": ct.params, "iphosts": ct.iphosts, "timeout": ct.timeout, "create_user": self.request.user.get_username(), "create_dt": timezone.now(), "job_task_status": 2 } jt = models.Job_Task(**jobtask) jt.job = job jt.comm_task = ct jt.save() iphosts = re.split("[;|,|\s]+", ct.iphosts) for iphost in iphosts: jobsubtask = { "file_loc": ct.task.file_loc, "file": ct.task.file or ct.task.remote_file, "main_script_name": ct.task.main_script_name, "params": ct.params or ct.task.params, "executor": ct.task.executor, "exe_user": ct.exe_user, "iphost": iphost, "create_dt": timezone.now(), "task_status": 2, } jstask = models.Job_SubTask(**jobsubtask) jstask.jobtask = jt jstask.save() newurl = reverse_lazy("jobtask:job-detail", kwargs={ 'pk': job.id, "jobid": jobid }) data = { "jobid": jobid, "msg": "success", "code": 0, "url": newurl } ## 必填} return JsonResponse(data) except Exception: import traceback data = {"jobid": "", "msg": traceback.format_exc(), "code": 1} return JsonResponse(data)
def backup_one(conffile, input_section, debug=False): bc = conf_helper(conffile) itemconf = bc.get_section_dict(input_section) srcdir = itemconf.get("srcdir", None) destdir = itemconf.get("destdir", None) brange = itemconf.get("range", None) files = itemconf.get("files", None) logger = slog("/tmp/backup.log", debug=debug) if bc.has_section(input_section) == False: scolor.info("备份标识不存在: %s" % (input_section)) return logobj = { u"备份标识": input_section, u"备份目录": srcdir, u"存储目录": destdir, u"范围(包含or不包含)": brange, u"文件(夹)列表": files, u"orders": [u"section", u"备份目录", u"存储目录", u"范围(包含or不包含)"] } logger.dictlog(level="info", width=20, **logobj) scolor.info(u"尝试执行备份任务,备份信息如下: ") scolor.info(u"===============================") print sstr().dictstr(width=20, **logobj) try: ## src dir srcdir = str(srcdir).strip() while '//' in str(srcdir): srcdir = str(srcdir).replace('//', '/') while str(srcdir).endswith('/'): srcdir = srcdir[:-1] pos = str(srcdir).rfind('/') dirroot = srcdir[:pos] ## dirname = srcdir[pos + 1:] ## relative dir name ## dest dir destdir = str(destdir).strip() while '//' in str(destdir): destdir = str(destdir).replace('//', '/') while str(destdir).endswith('/') and len(destdir) > 2: destdir = destdir[:-1] if os.path.exists(srcdir) == False or os.path.exists(destdir) == False: scolor.error(u"=> 备份任务") infobj = { u"状态": u"失败", u"错误": u"备份目录或存储目录不存在", u"备份目录": srcdir, u"存储目录": destdir, u"orders": [u"状态", u"错误", u"备份目录", u"存储目录"] } scolor.error(sstr().dictstr(width=8, **infobj)) return if str(brange).lower().strip() not in ["include", "exclude"]: scolor.error(u"=> 备份任务") infobj = { u"状态": u"失败", u"错误": u"备份范围错误,只能是include或exclude", u"orders": [u"状态", u"错误"] } scolor.error(sstr().dictstr(width=4, **infobj)) return ## include or exclude files files = str(files).strip() files_ary = re.split("[ |,|;]+", files) last_files = [] if files_ary: for each_file in files_ary: if not each_file: continue while '//' in str(each_file): each_file = str(each_file).replace('//', '/') while str(each_file).endswith('/'): each_file = each_file[:-1] while str(each_file).startswith('/'): each_file = each_file[1:] each_file = each_file.replace(" ", "") last_files.append(each_file) nowdt = sdate().datetime() nd = sdate().date() tarname = "%s_%s.tar.gz " % (dirname, nowdt) tmpfile = "/tmp/%s" % (tarname) last_destdir = "%s/%s/" % (destdir, nd) subffix = "" tar_cmdstr = "" if str(brange).lower().strip() == "include": for ef in last_files: subffix = subffix + dirname + "/" + ef + " " if str(subffix).strip() == "": ## 备份整个目录 tar_cmdstr = "cd %s && tar czf %s %s" % (dirroot, tmpfile, dirname) else: ## 备份指定的目录 tar_cmdstr = "cd %s && tar czf %s %s" % (dirroot, tmpfile, subffix) if str(brange).lower().strip() == "exclude": for ef in last_files: subffix = subffix + "--exclude=" + dirname + "/" + ef + " " tar_cmdstr = "cd %s && tar czf %s %s %s" % (dirroot, tmpfile, dirname, subffix) c1 = cmds(tar_cmdstr, timeout=1800) stdo1 = c1.stdo() stde1 = c1.stde() retcode1 = c1.code() logobj = { u"命令": tar_cmdstr, u"标准输出": stdo1, u"错误输出": stde1, u"返回码": retcode1, u"orders": [u"命令", u"标准输出", u"错误输出", u"返回码"] } logger.dictlog(level="info", width=12, **logobj) ## 打包归档失败 if retcode1 != 0: scolor.error(u"=> 备份任务") infobj = { u"状态": u"失败", u"错误": u"打包归档失败,具体:%s" % (stde1), u"orders": [u"状态", u"错误"] } scolor.error(sstr().dictstr(width=4, **infobj)) return #cmdstr = "mkdir -p %s && mv %s %s && rm -frv %s" % (last_destdir, tmpfile, last_destdir, tmpfile) cmdstr = "mkdir -p %s && mv -v %s %s" % (last_destdir, tmpfile, last_destdir) c2 = cmds(cmdstr) stdo2 = c2.stdo() stde2 = c2.stde() retcode2 = c2.code() logobj = { u"命令": cmdstr, u"标准输出": stdo2, u"错误输出": stde2, u"返回码": retcode2, u"orders": [u"命令", u"标准输出", u"错误输出", u"返回码"] } logger.dictlog(level="info", width=12, **logobj) if retcode2 != 0: scolor.error(u"=> 备份任务") infobj = { u"状态": u"失败", u"错误": u"创建目录或移动文件失败,具体:%s" % (stde1), u"orders": [u"状态", u"错误"] } scolor.error(sstr().dictstr(width=4, **infobj)) return scolor.info(u"=> 备份任务") infobj = { u"状态": u"成功", u"原目录": srcdir, u"备份位置": "%s%s" % (last_destdir, tarname), u"orders": [u"状态", u"原目录"] } scolor.info(sstr().dictstr(width=8, **infobj)) except: print traceback.format_exc()
def get_initial(self): default_init = {} now = sdate().datetime_human() default_init['create_dt'] = now default_init['update_dt'] = now return default_init
def post(self, request, *args, **kwargs): try: comm_taskdef = get_object_or_404(models.Comm_Task_Def, id=args[0]) now = timezone.now() taskid = sdate().datetime_ex() #new job task_conf = { "taskid": taskid, "create_dt": now, "create_user": request.user.get_username(), "task_status": 2, "params": comm_taskdef.params or comm_taskdef.task.params, "exe_user": comm_taskdef.exe_user, "iphosts": comm_taskdef.iphosts, "timeout": comm_taskdef.timeout, "fromip": request.META.get("HTTP_X_FORWARDED_FOR", request.META.get("REMOTE_ADDR", None)) } task = models.Task(**task_conf) task.taskdef = comm_taskdef.task task.save() ct = comm_taskdef iphosts = re.split("[;|,|\s]+", comm_taskdef.iphosts) for iphost in iphosts: subtask = { "file_loc": ct.task.file_loc, "file": ct.task.file or ct.task.remote_file, "params": ct.params or ct.task.params, "executor": ct.task.executor, "exe_user": ct.exe_user, "iphost": iphost, "create_dt": timezone.now(), "task_status": 2, } stask = models.SubTask(**subtask) stask.task = task stask.save() newurl = reverse_lazy("jobtask:task-detail", kwargs={ 'pk': task.id, "taskid": taskid }) data = { "taskid": taskid, "msg": "success", "code": 0, "url": newurl } ## 必填} return JsonResponse(data) except Exception: import traceback data = {"taskid": "", "msg": traceback.format_exc(), "code": 1} return JsonResponse(data)
def post(self, request, *args, **kwargs): try: request.POST.get("") taskdef = get_object_or_404(models.Task_Def, id=args[0]) params = request.POST.get("params", None) exe_user = request.POST.get("exe_user", None) iphosts = request.POST.get("iphosts", None) timeout = request.POST.get("timeout", None) note = request.POST.get("note", None) if None in [iphosts, timeout, note]: data = {"taskid": "", "msg": "必填项不能为空", "code": 1} return JsonResponse(data) now = timezone.now() taskid = sdate().datetime_ex() #new job task_new = { "taskid": taskid, "params": params if params else taskdef.params, "iphosts": iphosts, "timeout": int(timeout), "create_dt": now, "create_user": self.request.user.get_username(), "task_status": 2, "note": note, } task = models.Task(**task_new) task.taskdef = taskdef task.save() iphosts = re.split("[;|,|\s]+", iphosts) for iphost in iphosts: subtask = { "file_loc": taskdef.file_loc, "file": taskdef.file or taskdef.remote_file, "main_script_name": taskdef.main_script_name, "params": params or taskdef.params, "executor": taskdef.executor, "exe_user": exe_user, "iphost": iphost, "create_dt": timezone.now(), "task_status": 2, } m_subtask = models.SubTask(**subtask) m_subtask.task = task m_subtask.save() newurl = reverse_lazy("jobtask:task-detail", kwargs={ 'pk': task.id, "taskid": taskid }) data = { "taskid": taskid, "msg": "success", "code": 0, "url": newurl } ## 必填} return JsonResponse(data) except Exception: import traceback tb = traceback.format_exc() print tb data = {"taskid": "", "msg": tb, "code": 1} return JsonResponse(data)
def run(self, sid): try: conf = self.get_backup_conf(sid) if not conf: return False srcfiles = conf.get("srcfiles", "") destdir = conf.get("destdir", "") excludes = conf.get("excludes", "") zip_flag = conf.get("zip", "") keep = conf.get("keep", "") timeout = int(conf.get("timeout", 0)) srcfiles = srcfiles.strip() destdir = destdir.strip() if srcfiles == "" or destdir == "": msg = u"srcfiles:{0} or destdir:{1} is empty.".format( srcfiles, destdir) print msg self._logger.warn(msg) return False file_ln = re.split("[,|;|\s]+", srcfiles) if not file_ln: return False auto_destdir = os.path.join(destdir, sdate().datetime_ex()) if not os.path.exists(destdir): os.makedirs(destdir) os.makedirs(auto_destdir) for (idx, f) in enumerate(file_ln): f = unicode(f.strip(), "utf-8") if not f: continue if not os.path.exists(f): msg = u"File Not Exist. File: {0}".format(f) print msg self._logger.warn(msg) continue cmdstr = self.oh(f, auto_destdir, excludes) print u"[FILE-{0}]".format(idx + 1) print u" FROM: {0}".format(f) print u" TO: {0}".format(auto_destdir) print u" KEEP: {0}".format(keep) print u" ZIP: {0}".format(zip_flag) #print u"CMDSTR: {0}".format(cmdstr) if sys.platform == 'win32': ## 解决中文路径引起的错误 cmdstr = cmdstr.encode("gbk") command = cmds(cmdstr, timeout=timeout) (stdo, stde, retcode) = (command.stdo(), command.stde(), command.code()) logdict = { "cmdstr": get_right_content(cmdstr), "stdo": stdo, "stde": stde, "retcode": retcode, } self._logger.dictlog(level="info", **logdict) if retcode == 0: print(u"=> backup result: SUCCESS") if zip_flag.strip() == "1": directory = os.path.join(auto_destdir, f.split(os.path.sep)[-1]) tarflag = self.tar_gz(directory) if tarflag == True: print(u"=> tar result: SUCCESS") self.delete(directory) else: print(u"=> tar result: SUCCESS") else: print(u"=> backup result: FAILURE") ## sort dir desc by ctime dirs = self.sort_file(destdir) keep = int(str(keep).strip()) if keep <= 0: return ## delete old version del_dirs = dirs[keep - 1:] for d in del_dirs: del_path = os.path.join(destdir, d) self.delete(del_path) print u"=> Delete: {0}".format(del_path) except: tb = traceback.format_exc() self._logger.error(tb)