def get(self,id): next = request.headers.get('Referer') task = Task.query.filter_by(id=id).first() try: sched.remove_job(str(id)) task.yunxing_status=u'关闭' db.session.commit() flash(u'定时任务移除成功!') return redirect(next or url_for('home.timingtask')) except: task.yunxing_status = u'创建' db.session.commit() flash(u'定时任务移除失败!已经为您初始化') return redirect(next or url_for('home.timingtask'))
def get(self, id): next = request.headers.get('Referer') task = Task.query.filter_by(id=id).first() try: sched.remove_job(str(id)) task.yunxing_status = u'关闭' db.session.commit() flash(MessageEnum.remove_success.value[1]) return redirect(next or url_for('home.timingtask')) except Exception as e: logger.exception(e) task.yunxing_status = u'创建' db.session.commit() flash(MessageEnum.remove_fail.value[1]) return redirect(next or url_for('home.timingtask'))
def post(self): res = ResMsg() data = request.get_json() flag, mes = format_checker(statistics_task_schema, data) if not flag: res.update(code=-1, data=mes, msg=param_format_error) return jsonify(res.data) password = data.get('password') if password != 'za-test': res.update(code=-1, data='', msg=password_error) return jsonify(res.data) job_name = 'case_statistics_%s' % password if sched.get_job(job_name): sched.remove_job(job_name) res.update(code=1, data='', msg=request_success) return jsonify(res.data) else: mes = {'error': '缓存中不存在任务 %s 信息' % job_name} res.update(code=-1, data=mes, msg=task_stop_error) return jsonify(res.data)
def remove_job(self): try: sched.remove_job(str(self.id)) except: pass return
def run_campaign(self, mail, base_url, url): # Since this function is in a different thread, it doesn't have the app's context by default with app.app_context(): unsent_results = [ x for x in Campaign.query.filter_by(id=self.id).first().results if x.status == 'Scheduled' ] campaign = Campaign.query.filter_by(id=self.id).first( ) # since in diff thread, references to self will not update the database # start the worker and send emails job_id = str(self.id) if self is None: sched.remove_job(job_id) app.logger.info( f'Campaign ID {job_id} does not exist - Campaign will not start, scheduled job will be removed' ) return # Before sending emails, ensure the web server starts on the worker # If the worker gives an issue, kill off the campaign and log the error if campaign.status == 'Scheduled': worker_response = self.start_worker() if not worker_response['success']: msg = worker_response['msg'] campaign.status = msg db.session.commit() app.logger.error( f'Failed to start campaign {self.name} (ID: {self.id}) - Worker web server failed to start on server {self.server.alias} (IP: {self.server.ip}) - Reason: {msg}' ) sched.remove_job(job_id) return else: app.logger.info( f'Campaign {self.name} (ID: {self.id}) successfully started web server on {self.server.alias} (IP: {self.server.ip})' ) campaign.status = 'Active' db.session.commit() for _ in range(int(self.batch_size)): if unsent_results: result = unsent_results.pop() recipient = result.person msg = Message(subject=self.email.subject, sender=self.profile.from_address, recipients=[recipient.email]) msg.html = self.email.prep_html(base_url=base_url, target=recipient, result=result, url=url) msg.body = html2text.html2text(msg.html.decode()) if self.attachment: # Determine mimetype of attachment from bytes mime = Magic(mime=True) mimetype = mime.from_buffer(self.attachment) # attach the file msg.attach(self.attachment_name, mimetype, self.attachment) status = '' try: mail.send(msg) except Exception as e: status = 'Error' app.logger.exception( f'Error sending email to {recipient.email} for {self.name} (ID: {self.id}) - {e}' ) else: status = 'Sent' app.logger.info( f'Email succesflly sent to {recipient.email} for campaign {self.name} (ID: {self.id})' ) # Updates email's status in database result.status = status event = Event(action=status, time=datetime.now(), ip_address='N/A') result.events.append(event) db.session.commit() # When all targets have been emailed, the job has to be explicitly removed else: sched.remove_job(job_id=job_id) app.logger.info( f'Finished sending emails for campaign {self.name} (ID: {self.id})' ) return return
def delete(self): sched.remove_job(self.id)