def passwdreset(self): """Render password reset page""" c.came_from = '/' c.login_counter = 0 c.form = ResetPwForm(request.POST, csrf_context=session) if request.method == 'POST' and c.form.validate(): key_seed = '%s%s' % (c.form.email.data, arrow.utcnow().ctime()) token = hashlib.sha1(key_seed).hexdigest() user = Session.query(User)\ .filter(User.email == c.form.email.data)\ .one() if not user.local: flash( _('The account %s is an external account, use your' ' External systems to change the password. ' 'Contact your system adminstrator if you do not ' 'know which external systems you authenticate to') % user.email) redirect(url('/accounts/login')) rtoken = Session\ .query(ResetToken.used)\ .filter(ResetToken.used == false())\ .filter(ResetToken.user_id == user.id)\ .all() if not rtoken: rtoken = ResetToken(token, user.id) Session.add(rtoken) Session.commit() host = URL_PREFIX_RE.sub('', request.host_url) c.username = user.username c.firstname = user.firstname or user.username c.reset_url = url('accounts-pw-token-reset', token=token, host=host) text = self.render('/email/pwreset.txt') mailer = Mailer(get_conf_options(config)) mailer.start() sdrnme = config.get('baruwa.custom.name', 'Baruwa') email = Msg(author=[(sdrnme, config.get('baruwa.reports.sender'))], to=[('', c.form.email.data)], subject=_("[%s] Password reset request") % sdrnme) email.plain = text mailer.send(email) mailer.stop() flash( _('An email has been sent to the address provided, ' 'please follow the instructions in that email to ' 'reset your password.')) redirect(url('/accounts/login')) return self.render('/accounts/login.html')
def passwdreset(self): """Render password reset page""" c.came_from = '/' c.login_counter = 0 c.form = ResetPwForm(request.POST, csrf_context=session) if request.method == 'POST' and c.form.validate(): key_seed = '%s%s' % (c.form.email.data, arrow.utcnow().ctime()) token = hashlib.sha1(key_seed).hexdigest() user = Session.query(User)\ .filter(User.email == c.form.email.data)\ .one() if not user.local: flash(_('The account %s is an external account, use your' ' External systems to change the password. ' 'Contact your system adminstrator if you do not ' 'know which external systems you authenticate to') % user.email) redirect(url('/accounts/login')) rtoken = Session\ .query(ResetToken.used)\ .filter(ResetToken.used == false())\ .filter(ResetToken.user_id == user.id)\ .all() if not rtoken: rtoken = ResetToken(token, user.id) Session.add(rtoken) Session.commit() host = URL_PREFIX_RE.sub('', request.host_url) c.username = user.username c.firstname = user.firstname or user.username c.reset_url = url('accounts-pw-token-reset', token=token, host=host) text = self.render('/email/pwreset.txt') mailer = Mailer(get_conf_options(config)) mailer.start() sdrnme = config.get('baruwa.custom.name', 'Baruwa') email = Msg(author=[(sdrnme, config.get('baruwa.reports.sender'))], to=[('', c.form.email.data)], subject=_("[%s] Password reset request") % sdrnme) email.plain = text mailer.send(email) mailer.stop() flash(_('An email has been sent to the address provided, ' 'please follow the instructions in that email to ' 'reset your password.')) redirect(url('/accounts/login')) return self.render('/accounts/login.html')
def command(self): "command" self.init() if self.options.email is None: print "\nA valid email is required\n" print self.parser.print_help() sys.exit(2) starttime = arrow.utcnow() if self.options.report_period == 'daily': endtime = starttime - datetime.timedelta(days=1) elif self.options.report_period == 'weekly': endtime = starttime - datetime.timedelta(weeks=1) else: endtime = starttime - datetime.timedelta(weeks=4) params = dict(spamscore=self.options.spamscore, num=self.options.num, starttime=starttime.datetime, endtime=endtime.datetime) sql = text("""SELECT clientip, COUNT(clientip) a FROM messages WHERE sascore <= :spamscore AND (timestamp BETWEEN :endtime AND :starttime) GROUP BY clientip HAVING COUNT(clientip) >= :num ORDER BY a DESC;""") results = Session.execute(sql, params=params) if results.rowcount: if self.options.include_count is False: records = [result.clientip for result in results] else: records = ["%s\t%d" % tuple(result) for result in results] content = "\n".join(records) if self.options.dry_run is True: print content else: mailer = Mailer(get_conf_options(self.conf)) mailer.start() email = Msg(author=self.conf['baruwa.reports.sender'], to=self.options.email, subject='TWL') email.plain = content try: mailer.send(email) except (TransportFailedException, MessageFailedException), err: print >> sys.stderr, err mailer.stop()
def command(self): "run command" self.init() self.language = 'en' self.host_url = self.conf['baruwa.default.url'] self.send_from = self.conf['baruwa.reports.sender'] self.num_of_days = self.options.number_of_days base = workout_path() path = os.path.join(base, 'baruwa', 'templates') self.logo = os.path.join(base, 'baruwa', 'public', 'imgs', 'logo.png') self.localedir = os.path.join(base, 'baruwa', 'i18n') cache_dir = os.path.join(self.conf['cache_dir'], 'templates') self.mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding='utf-8', default_filters=['escape'], output_encoding='utf-8', encoding_errors='replace', imports=['from webhelpers.html import escape'] ) self.mailer = Mailer(get_conf_options(self.conf)) self.mailer.start() if self.options.report_type == 'user': users = get_users() for user in users: self._process_user_report(user) else: period = REPORTS_MAP[self.options.report_period] domains = Session.query(Domain).filter(Domain.status == True)\ .filter(Domain.report_every == period).all() for domain in domains: admins = set() self.translator = set_lang(domain.language, PKGNAME, self.localedir) for org in domain.organizations: for admin in org.admins: admins.add(admin) pdf_file = self._process_domain_report(domain) for admin in admins: self._send_domain_report(pdf_file, domain.site_url, admin) self.mailer.stop()
def command(self): "command" self.init() if self.options.email is None: print "\nA valid email is required\n" print self.parser.print_help() sys.exit(2) starttime = arrow.utcnow().datetime if self.options.report_period == 'daily': endtime = starttime - datetime.timedelta(days=1) elif self.options.report_period == 'weekly': endtime = starttime - datetime.timedelta(weeks=1) else: endtime = starttime - datetime.timedelta(weeks=4) params = dict(spamscore=self.options.spamscore, num=self.options.num, starttime=starttime, endtime=endtime) sql = text("""SELECT clientip, COUNT(clientip) a FROM messages WHERE sascore >= :spamscore AND (timestamp BETWEEN :endtime AND :starttime) GROUP BY clientip HAVING COUNT(clientip) >= :num ORDER BY a DESC;""") results = Session.execute(sql, params=params) if results.rowcount: if self.options.include_count is False: records = [result.clientip for result in results] else: records = ["%s\t%d" % tuple(result) for result in results] content = "\n".join(records) if self.options.dry_run is True: print content else: mailer = Mailer(get_conf_options(self.conf)) mailer.start() email = Msg(author=self.conf['baruwa.reports.sender'], to=self.options.email, subject='TSL') email.plain = content try: mailer.send(email) except (TransportFailedException, MessageFailedException), err: print >> sys.stderr, err mailer.stop()
def pwtokenreset(self, token): """Reset password using token""" try: token = Session.query(ResetToken)\ .filter(ResetToken.token == token)\ .filter(ResetToken.used == false()).one() threshold = token.timestamp + timedelta(minutes=20) if arrow.utcnow().datetime > threshold: Session.delete(token) Session.commit() raise NoResultFound user = self._get_user(token.user_id) if not user or user.is_superadmin: raise NoResultFound passwd = mkpasswd() user.set_password(passwd) Session.add(user) Session.delete(token) Session.commit() c.passwd = passwd c.firstname = user.firstname or user.username text = self.render('/email/pwchanged.txt') mailer = Mailer(get_conf_options(config)) mailer.start() sdrnme = config.get('baruwa.custom.name', 'Baruwa') email = Msg(author=[(sdrnme, config.get('baruwa.reports.sender'))], to=[('', user.email)], subject=_("[%s] Password reset") % sdrnme) email.plain = text mailer.send(email) mailer.stop() flash( _('The password has been reset, check your email for' ' the temporary password you should use to login.')) except NoResultFound: msg = _('The token used is invalid or does not exist') flash_alert(msg) log.info(msg) redirect(url('/accounts/login'))
def pwtokenreset(self, token): """Reset password using token""" try: token = Session.query(ResetToken)\ .filter(ResetToken.token == token)\ .filter(ResetToken.used == false()).one() threshold = token.timestamp + timedelta(minutes=20) if arrow.utcnow().datetime > threshold: Session.delete(token) Session.commit() raise NoResultFound user = self._get_user(token.user_id) if not user or user.is_superadmin: raise NoResultFound passwd = mkpasswd() user.set_password(passwd) Session.add(user) Session.delete(token) Session.commit() c.passwd = passwd c.firstname = user.firstname or user.username text = self.render('/email/pwchanged.txt') mailer = Mailer(get_conf_options(config)) mailer.start() sdrnme = config.get('baruwa.custom.name', 'Baruwa') email = Msg(author=[(sdrnme, config.get('baruwa.reports.sender'))], to=[('', user.email)], subject=_("[%s] Password reset") % sdrnme) email.plain = text mailer.send(email) mailer.stop() flash(_('The password has been reset, check your email for' ' the temporary password you should use to login.')) except NoResultFound: msg = _('The token used is invalid or does not exist') flash_alert(msg) log.info(msg) redirect(url('/accounts/login'))
def command(self): "run command" self.init() import baruwa here = os.path.dirname( os.path.dirname(os.path.abspath(baruwa.__file__)) ) path = os.path.join(here, 'baruwa', 'templates') logo = os.path.join(here, 'baruwa', 'public', 'imgs', 'logo.png') localedir = os.path.join(here, 'baruwa', 'i18n') cache_dir = os.path.join(self.conf['cache_dir'], 'templates') pkgname = 'baruwa' if not os.path.exists(logo): print sys.STDERR ("The logo image: %s does not exist" % logo) sys.exit(2) with open(logo) as handle: logo = base64.b64encode(handle.read()) mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding='utf-8', default_filters=['escape'], output_encoding='utf-8', encoding_errors='replace', imports=['from webhelpers.html import escape'] ) mailer = Mailer(get_conf_options(self.conf)) mailer.start() users = Session.query(User)\ .filter(User.active == True)\ .filter(User.send_report == True) previous_records = Session\ .query(Release.messageid)\ .order_by(desc('timestamp')) for user in users: messages = Session.query(Message.id, Message.timestamp, Message.from_address, Message.to_address, Message.subject, case([(and_(Message.spam > 0, Message.virusinfected == 0, Message.nameinfected == 0, Message.otherinfected == 0, ), True)], else_=False).label('spam'), Message.to_domain)\ .filter(Message.isquarantined > 0)\ .filter(or_(Message.spam > 0, Message.nameinfected > 0, Message.otherinfected > 0))\ .order_by(desc('timestamp')) query = UserFilter(Session, user, messages) messages = query.filter() if int(self.options.days) > 0: a_day = datetime.timedelta(days=self.options.days) startdate = now().date() - a_day messages = messages.filter(Message.timestamp > str(startdate)) messages = messages.filter(~Message.id.in_(previous_records)) messages = messages[:25] if messages: lang = 'en' host_urls = dict([(domain.name, domain.site_url) for domain in user.domains if domain.status == True]) langs = [domain.language for domain in user.domains if domain.language != 'en'] if langs: lang = langs.pop(0) translator = set_lang(lang, pkgname, localedir) _ = translator.ugettext def make_release_records(spam): "map function" uuid = gen_uuid(user) spam.uuid = uuid return Release(uuid=uuid, messageid=spam.id) if user.is_peleb: torelease = [make_release_records(spam) for spam in messages] template = mako_lookup.get_template('/email/quarantine.html') html = template.render(messages=messages, host_urls=host_urls, url=url_for, default_url=self.conf['baruwa.default.url']) template = mako_lookup.get_template('/email/quarantine.txt') text = template.render(messages=messages) displayname = "%s %s" % (user.firstname, user.lastname) email = Msg(author=[(_('Baruwa Reports'), self.conf['baruwa.reports.sender'])], to=[(displayname, user.email)], subject=_('Baruwa quarantine report')) email.plain = text email.rich = html email.attach('logo.png', data=logo, maintype='image', subtype='png', inline=True) mailer.send(email) if 'torelease' in locals(): Session.add_all(torelease) Session.commit() mailer.stop()
def command(self): "run command" self.init() import baruwa here = os.path.dirname( os.path.dirname(os.path.abspath(baruwa.__file__))) path = os.path.join(here, 'baruwa', 'templates') logo = os.path.join(here, 'baruwa', 'public', 'imgs', 'logo.png') localedir = os.path.join(here, 'baruwa', 'i18n') cache_dir = os.path.join(self.conf['cache_dir'], 'templates') pkgname = 'baruwa' if not os.path.exists(logo): print sys.STDERR("The logo image: %s does not exist" % logo) sys.exit(2) with open(logo) as handle: logo = base64.b64encode(handle.read()) mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding='utf-8', default_filters=['escape'], output_encoding='utf-8', encoding_errors='replace', imports=['from webhelpers.html import escape']) mailer = Mailer(get_conf_options(self.conf)) mailer.start() users = Session.query(User)\ .filter(User.active == True)\ .filter(User.send_report == True) previous_records = Session\ .query(Release.messageid)\ .order_by(desc('timestamp')) for user in users: messages = Session.query(Message.id, Message.timestamp, Message.from_address, Message.to_address, Message.subject, case([(and_(Message.spam > 0, Message.virusinfected == 0, Message.nameinfected == 0, Message.otherinfected == 0, ), True)], else_=False).label('spam'), Message.to_domain)\ .filter(Message.isquarantined > 0)\ .filter(or_(Message.spam > 0, Message.nameinfected > 0, Message.otherinfected > 0))\ .order_by(desc('timestamp')) query = UserFilter(Session, user, messages) messages = query.filter() if int(self.options.days) > 0: a_day = datetime.timedelta(days=self.options.days) startdate = now().date() - a_day messages = messages.filter(Message.timestamp > str(startdate)) messages = messages.filter(~Message.id.in_(previous_records)) messages = messages[:25] if messages: lang = 'en' host_urls = dict([(domain.name, domain.site_url) for domain in user.domains if domain.status == True]) langs = [ domain.language for domain in user.domains if domain.language != 'en' ] if langs: lang = langs.pop(0) translator = set_lang(lang, pkgname, localedir) _ = translator.ugettext def make_release_records(spam): "map function" uuid = gen_uuid(user) spam.uuid = uuid return Release(uuid=uuid, messageid=spam.id) if user.is_peleb: torelease = [ make_release_records(spam) for spam in messages ] template = mako_lookup.get_template('/email/quarantine.html') html = template.render( messages=messages, host_urls=host_urls, url=url_for, default_url=self.conf['baruwa.default.url']) template = mako_lookup.get_template('/email/quarantine.txt') text = template.render(messages=messages) displayname = "%s %s" % (user.firstname, user.lastname) email = Msg(author=[(_('Baruwa Reports'), self.conf['baruwa.reports.sender'])], to=[(displayname, user.email)], subject=_('Baruwa quarantine report')) email.plain = text email.rich = html email.attach('logo.png', data=logo, maintype='image', subtype='png', inline=True) mailer.send(email) if 'torelease' in locals(): Session.add_all(torelease) Session.commit() mailer.stop()
def command(self): "send" self.init() import baruwa pkgname = 'baruwa' here = os.path.dirname( os.path.dirname(os.path.abspath(baruwa.__file__))) path = os.path.join(here, 'baruwa', 'templates') logo = os.path.join(here, 'baruwa', 'public', 'imgs', 'logo.png') localedir = os.path.join(here, 'baruwa', 'i18n') cache_dir = os.path.join(self.conf['cache_dir'], 'templates') mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding='utf-8', default_filters=['escape'], output_encoding='utf-8', encoding_errors='replace', imports=['from webhelpers.html import escape']) mailer = Mailer(get_conf_options(self.conf)) mailer.start() users = Session\ .query(User)\ .filter(User.active == True)\ .filter(User.send_report == True).all() #localedir = os.path.join(self.conf['here'], 'baruwa', 'i18n') for user in users: host_url = self.conf['baruwa.default.url'] sentry = 0 language = 'en' if user.is_domain_admin: orgs = [group.id for group in user.organizations] domains = Session\ .query(Domain.site_url, Domain.language)\ .join(domain_owners)\ .filter(Domain.status == True)\ .filter(domain_owners.c.organization_id.in_(orgs))\ .all() if domains: host_url, language = domains.pop(0) if user.is_peleb: domains = [(domain.site_url, domain.language) for domain in user.domains if domain.status == True] if domains: host_url, language = domains.pop(0) if language == 'en' and 'domains' in locals() and domains: while domains: _, language = domains.pop(0) if language != 'en': break translator = set_lang(language, pkgname, localedir) _ = translator.ugettext reports = { '1': { 'address': 'from_address', 'sort': 'count', 'title': _('Top Senders by Quantity') }, '2': { 'address': 'from_address', 'sort': 'size', 'title': _('Top Senders by Volume') }, '3': { 'address': 'from_domain', 'sort': 'count', 'title': _('Top Sender Domains by Quantity') }, '4': { 'address': 'from_domain', 'sort': 'size', 'title': _('Top Sender Domains by Volume') }, '5': { 'address': 'to_address', 'sort': 'count', 'title': _('Top Recipients by Quantity') }, '6': { 'address': 'to_address', 'sort': 'size', 'title': _('Top Recipients by Volume') }, '7': { 'address': 'to_domain', 'sort': 'count', 'title': _('Top Recipient Domains By Quantity') }, '8': { 'address': 'to_domain', 'sort': 'size', 'title': _('Top Recipient Domains By Volume') }, '9': { 'address': '', 'sort': '', 'title': _('Spam Score distribution') }, '10': { 'address': 'clientip', 'sort': 'count', 'title': _('Top mail hosts by quantity') }, '11': { 'address': '', 'sort': '', 'title': _('Total messages [ After SMTP ]') } } pieheadings = ('', _('Address'), _('Count'), _('Volume'), '') totalsheaders = dict(date=_('Date'), mail=_('Mail totals'), spam=_('Spam totals'), virus=_('Virus totals'), volume=_('Mail volume'), totals=_('Totals')) pdfcreator = PDFReport(logo, _('Baruwa mail report')) for reportid in ['1', '2', '3', '4', '5', '6', '7', '8', '10']: sortby = reports[reportid]['sort'] if user.account_type == 3 and reportid in ['7', '8']: data = None else: query = ReportQuery(user, reportid) if int(self.options.days) > 0: a_day = datetime.timedelta(days=self.options.days) startdate = datetime.date.today() - a_day query = query.get().filter( Message.timestamp > str(startdate)) data = query[:10] else: data = query.get()[:10] if data: sentry += 1 pdfcreator.add(data, reports[reportid]['title'], pieheadings, sortby) query = Session.query(Message.date, func.count(Message.date).label('mail_total'), func.sum(case([(Message.virusinfected > 0, 1)], else_=0)).label('virus_total'), func.sum(case([(and_(Message.virusinfected == 0, Message.spam > 0), 1)], else_=0))\ .label('spam_total'), func.sum(Message.size)\ .label('total_size')).group_by(Message.date)\ .order_by(desc(Message.date)) uquery = UserFilter(Session, user, query) query = uquery.filter() data = query.all() if data: if not sentry: sentry += 1 pdfcreator.add(data, _('Message Totals'), totalsheaders, chart='bar') if sentry: template = mako_lookup.get_template('/email/pdfreports.txt') text = template.render(user=user, url=host_url) displayname = '%s %s' % (user.firstname or '', user.lastname or '') email = Msg(author=[(_('Baruwa Reports'), self.conf['baruwa.reports.sender'])], to=[(displayname, user.email)], subject=_('Baruwa usage report')) email.plain = text pdf_file = base64.b64encode(pdfcreator.build()) email.attach('baruwa-reports.pdf', data=pdf_file, maintype='application/pdf', subtype='application/x-pdf') try: mailer.send(email) except (TransportFailedException, MessageFailedException), err: print >> sys.stderr, ("Error sending to: %s, Error: %s" % (user.email, err))
def command(self): "send" self.init() import baruwa pkgname = "baruwa" here = os.path.dirname(os.path.dirname(os.path.abspath(baruwa.__file__))) path = os.path.join(here, "baruwa", "templates") logo = os.path.join(here, "baruwa", "public", "imgs", "logo.png") localedir = os.path.join(here, "baruwa", "i18n") cache_dir = os.path.join(self.conf["cache_dir"], "templates") mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding="utf-8", default_filters=["escape"], output_encoding="utf-8", encoding_errors="replace", imports=["from webhelpers.html import escape"], ) mailer = Mailer(get_conf_options(self.conf)) mailer.start() users = Session.query(User).filter(User.active == True).filter(User.send_report == True).all() # localedir = os.path.join(self.conf['here'], 'baruwa', 'i18n') for user in users: host_url = self.conf["baruwa.default.url"] sentry = 0 language = "en" if user.is_domain_admin: orgs = [group.id for group in user.organizations] domains = ( Session.query(Domain.site_url, Domain.language) .join(domain_owners) .filter(Domain.status == True) .filter(domain_owners.c.organization_id.in_(orgs)) .all() ) if domains: host_url, language = domains.pop(0) if user.is_peleb: domains = [(domain.site_url, domain.language) for domain in user.domains if domain.status == True] if domains: host_url, language = domains.pop(0) if language == "en" and "domains" in locals() and domains: while domains: _, language = domains.pop(0) if language != "en": break translator = set_lang(language, pkgname, localedir) _ = translator.ugettext reports = { "1": {"address": "from_address", "sort": "count", "title": _("Top Senders by Quantity")}, "2": {"address": "from_address", "sort": "size", "title": _("Top Senders by Volume")}, "3": {"address": "from_domain", "sort": "count", "title": _("Top Sender Domains by Quantity")}, "4": {"address": "from_domain", "sort": "size", "title": _("Top Sender Domains by Volume")}, "5": {"address": "to_address", "sort": "count", "title": _("Top Recipients by Quantity")}, "6": {"address": "to_address", "sort": "size", "title": _("Top Recipients by Volume")}, "7": {"address": "to_domain", "sort": "count", "title": _("Top Recipient Domains By Quantity")}, "8": {"address": "to_domain", "sort": "size", "title": _("Top Recipient Domains By Volume")}, "9": {"address": "", "sort": "", "title": _("Spam Score distribution")}, "10": {"address": "clientip", "sort": "count", "title": _("Top mail hosts by quantity")}, "11": {"address": "", "sort": "", "title": _("Total messages [ After SMTP ]")}, } pieheadings = ("", _("Address"), _("Count"), _("Volume"), "") totalsheaders = dict( date=_("Date"), mail=_("Mail totals"), spam=_("Spam totals"), virus=_("Virus totals"), volume=_("Mail volume"), totals=_("Totals"), ) pdfcreator = PDFReport(logo, _("Baruwa mail report")) for reportid in ["1", "2", "3", "4", "5", "6", "7", "8", "10"]: sortby = reports[reportid]["sort"] if user.account_type == 3 and reportid in ["7", "8"]: data = None else: query = ReportQuery(user, reportid) if int(self.options.days) > 0: a_day = datetime.timedelta(days=self.options.days) startdate = now().date() - a_day query = query.get().filter(Message.timestamp > str(startdate)) data = query[:10] else: data = query.get()[:10] if data: sentry += 1 pdfcreator.add(data, reports[reportid]["title"], pieheadings, sortby) query = ( Session.query( Message.date, func.count(Message.date).label("mail_total"), func.sum(case([(Message.virusinfected > 0, 1)], else_=0)).label("virus_total"), func.sum(case([(and_(Message.virusinfected == 0, Message.spam > 0), 1)], else_=0)).label( "spam_total" ), func.sum(Message.size).label("total_size"), ) .group_by(Message.date) .order_by(desc(Message.date)) ) uquery = UserFilter(Session, user, query) query = uquery.filter() data = query.all() if data: if not sentry: sentry += 1 pdfcreator.add(data, _("Message Totals"), totalsheaders, chart="bar") if sentry: template = mako_lookup.get_template("/email/pdfreports.txt") text = template.render(user=user, url=host_url) displayname = "%s %s" % (user.firstname or "", user.lastname or "") email = Msg( author=[(_("Baruwa Reports"), self.conf["baruwa.reports.sender"])], to=[(displayname, user.email)], subject=_("Baruwa usage report"), ) email.plain = text pdf_file = pdfcreator.build() email.attach("baruwa-reports.pdf", data=pdf_file, maintype="application", subtype="pdf") try: mailer.send(email) except (TransportFailedException, MessageFailedException), err: print >>sys.stderr, ("Error sending to: %s, Error: %s" % (user.email, err))
def command(self): "send" self.init() import baruwa pkgname = 'baruwa' here = os.path.dirname( os.path.dirname(os.path.abspath(baruwa.__file__)) ) path = os.path.join(here, 'baruwa', 'templates') logo = os.path.join(here, 'baruwa', 'public', 'imgs', 'logo.png') localedir = os.path.join(here, 'baruwa', 'i18n') cache_dir = os.path.join(self.conf['cache_dir'], 'templates') mako_lookup = TemplateLookup( directories=[path], error_handler=handle_mako_error, module_directory=cache_dir, input_encoding='utf-8', default_filters=['escape'], output_encoding='utf-8', encoding_errors='replace', imports=['from webhelpers.html import escape'] ) mailer = Mailer(get_conf_options(self.conf)) mailer.start() users = Session\ .query(User)\ .filter(User.active == True)\ .filter(User.send_report == True).all() #localedir = os.path.join(self.conf['here'], 'baruwa', 'i18n') for user in users: host_url = self.conf['baruwa.default.url'] sentry = 0 language = 'en' if user.is_domain_admin: orgs = [group.id for group in user.organizations] domains = Session\ .query(Domain.site_url, Domain.language)\ .join(domain_owners)\ .filter(Domain.status == True)\ .filter(domain_owners.c.organization_id.in_(orgs))\ .all() if domains: host_url, language = domains.pop(0) if user.is_peleb: domains = [(domain.site_url, domain.language) for domain in user.domains if domain.status == True] if domains: host_url, language = domains.pop(0) if language == 'en' and 'domains' in locals() and domains: while domains: _, language = domains.pop(0) if language != 'en': break translator = set_lang(language, pkgname, localedir) _ = translator.ugettext reports = { '1': {'address': 'from_address', 'sort': 'count', 'title': _('Top Senders by Quantity')}, '2': {'address': 'from_address', 'sort': 'size', 'title': _('Top Senders by Volume')}, '3': {'address': 'from_domain', 'sort': 'count', 'title': _('Top Sender Domains by Quantity')}, '4': {'address': 'from_domain', 'sort': 'size', 'title': _('Top Sender Domains by Volume')}, '5': {'address': 'to_address', 'sort': 'count', 'title': _('Top Recipients by Quantity')}, '6': {'address': 'to_address', 'sort': 'size', 'title': _('Top Recipients by Volume')}, '7': {'address': 'to_domain', 'sort': 'count', 'title': _('Top Recipient Domains By Quantity')}, '8': {'address': 'to_domain', 'sort': 'size', 'title': _('Top Recipient Domains By Volume')}, '9': {'address': '', 'sort': '', 'title': _('Spam Score distribution')}, '10': {'address': 'clientip', 'sort': 'count', 'title': _('Top mail hosts by quantity')}, '11': {'address': '', 'sort': '', 'title': _('Total messages [ After SMTP ]')} } pieheadings = ('', _('Address'), _('Count'), _('Volume'), '') totalsheaders = dict(date=_('Date'), mail=_('Mail totals'), spam=_('Spam totals'), virus=_('Virus totals'), volume=_('Mail volume'), totals=_('Totals')) pdfcreator = PDFReport(logo, _('Baruwa mail report')) for reportid in ['1', '2', '3', '4', '5', '6', '7', '8', '10']: sortby = reports[reportid]['sort'] if user.account_type == 3 and reportid in ['7', '8']: data = None else: query = ReportQuery(user, reportid) if int(self.options.days) > 0: a_day = datetime.timedelta(days=self.options.days) startdate = datetime.date.today() - a_day query = query.get().filter(Message.timestamp > str(startdate)) data = query[:10] else: data = query.get()[:10] if data: sentry += 1 pdfcreator.add(data, reports[reportid]['title'], pieheadings, sortby) query = Session.query(Message.date, func.count(Message.date).label('mail_total'), func.sum(case([(Message.virusinfected > 0, 1)], else_=0)).label('virus_total'), func.sum(case([(and_(Message.virusinfected == 0, Message.spam > 0), 1)], else_=0))\ .label('spam_total'), func.sum(Message.size)\ .label('total_size')).group_by(Message.date)\ .order_by(desc(Message.date)) uquery = UserFilter(Session, user, query) query = uquery.filter() data = query.all() if data: if not sentry: sentry += 1 pdfcreator.add(data, _('Message Totals'), totalsheaders, chart='bar') if sentry: template = mako_lookup.get_template('/email/pdfreports.txt') text = template.render(user=user, url=host_url) displayname = '%s %s' % (user.firstname or '', user.lastname or '') email = Msg(author=[(_('Baruwa Reports'), self.conf['baruwa.reports.sender'])], to=[(displayname, user.email)], subject=_('Baruwa usage report')) email.plain = text pdf_file = base64.b64encode(pdfcreator.build()) email.attach('baruwa-reports.pdf', data=pdf_file, maintype='application/pdf', subtype='application/x-pdf') try: mailer.send(email) except (TransportFailedException, MessageFailedException), err: print >> sys.stderr, ("Error sending to: %s, Error: %s" % (user.email, err))