示例#1
0
 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'))
示例#2
0
 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'))
示例#3
0
 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)
示例#4
0
 def remove_job(self):
     try:
         sched.remove_job(str(self.id))
     except:
         pass
     return
示例#5
0
    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
示例#6
0
 def delete(self):
     sched.remove_job(self.id)