Beispiel #1
0
def master_slave_analysis(log_file, log_level, warning_interval, sender_alias,
                          receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = "select a.role, a.master_link_status, a.master_host from redis_slave as a,redis_role as b where a.record_time=b.record_time and a.role=b.role"
    data = db.query_one(sql)
    if data is not None:
        logger.logger.debug("开始分析Redis主从信息")
        if data[1] == "up" or data[1] == "online":
            flag = 0
        else:
            flag = 1
    else:
        flag = 0

    warning_flag = warning.warning(logger, db, flag, "redis", "slave",
                                   warning_interval)
    if warning_flag:
        warning_msg = f"Redis预警:\nRedis slave无法连接master({data[2]})\n"
        mail.send(logger,
                  warning_msg,
                  sender_alias,
                  receive,
                  subject,
                  msg=f'redis_slave')
Beispiel #2
0
def master_slave_analysis(log_file, log_level, seconds_behind_master,
                          warning_interval, sender_alias, receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = "select role, slave_io_thread, slave_sql_thread, seconds_behind_master, slave_io_state, slave_sql_state from mysql_slave, mysql_role where mysql_role.record_time=mysql_slave.record_time"
    data = db.query_one(sql)
    conn_msg = "slave_conn"
    delay_msg = "slave_delay"
    if data is not None and data[0] == "slave":
        logger.logger.debug("开始分析MySQL主从信息")
        if data[1].lower() == data[2].lower() == "yes":
            conn_flag = 0
            delay_flag = 1 if data[3] >= seconds_behind_master else 0
        else:
            conn_flag = 1
            delay_flag = None

        for flag, msg in [(conn_flag, conn_msg), (delay_flag, delay_msg)]:
            if flag is not None:
                warning_flag = warning.warning(logger, db, flag, "mysql", msg,
                                               warning_interval)
                if warning_flag:
                    warning_msg="MySQL预警:\n"\
                            "MySQL主从连接:\n"\
                            f"Slave_IO_Running: {data[1]}\n"\
                            f"Slave_SQL_Running: {data[2]}\n"\
                            f"Slave_IO_State: {data[4]}\n"\
                            f"Slave_SQL_Running_State: {data[5]}\n"\
                            f"Seconds_Behind_Master: {data[3]}"
                    mail.send(logger,
                              warning_msg,
                              sender_alias,
                              receive,
                              subject,
                              msg=msg)
Beispiel #3
0
def running_analysis(log_file, log_level, warning_interval, sender_alias,
                     receive, subject):
    logger = log.Logger(log_file, log_level)
    logger.logger.debug("开始分析Tomcat运行情况...")
    db = database.db()
    """
    sql="select record_time, port, pid from tomcat_constant where (port,record_time) in (select port,max(record_time) from tomcat_constant group by port)"
    sqlite3低版本不支持多列in查询, 无语... 
    """
    sql = "select port, pid from tomcat_constant where record_time=(select max(record_time) from tomcat_constant)"
    data = db.query_all(sql)
    for i in data:
        flag = 0
        if i[1] == 0:
            flag = 1
        warning_flag = warning.warning(logger, db, flag, i[0], "running",
                                       warning_interval)
        if warning_flag:
            warning_msg = f"Tomcat预警:\nTomcat({i[0]})未运行\n"
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=f'tomcat{i[0]}_running')
Beispiel #4
0
def send_email(m):
    msg = Message('Inscription {} RN réussie'.format(m.__class__.__name__),
                  recipients=[m.user.email])
    msg.body = "Bonjour {}. Ton inscription au site des volontaires de la RN ({}) \
a bien été enregistrée.\n \
Cordialement.".format(m.user.name, url_for('views.basic.index', _external=True))
    mail.send(msg)
Beispiel #5
0
def invite():
    if request.method == "POST":
        if 'cancel' in request.form:
            return redirect(url_front())

        email_addresses = request.form['email']
        for email_address in email_addresses.splitlines():
            key = generate_key()
            url = config.URL + url_for("usermanager.new", key=key)
            text = invite_mail.format(url=url)

            data.execute("UPDATE User_creation_keys SET email = ? WHERE key = ?", email_address, key)

            mail.send(email_address, "Invitation til GRIS", text)
        flash("Invitationer sendt")


        message = mail.invitation_send_adminmail.format(email=request.form['email'])
        mail.admin("User Invited", message)

        return redirect(url_for("usermanager.overview"))

    else:
        w = html.WebBuilder()
        w.form()
        w.formtable()
        w.textarea("email", "Emails (1 pr. linje)")
        form = w.create()
        return render_template("form.html", form=form)
Beispiel #6
0
Datei: basic.py Projekt: vddd/rn
def register():
    form = forms.Registration(request.form)
    if form.validate_on_submit():
        password = login.hash_password(form.password.data)
        user = models.User(form.email.data,
                password,
                form.name.data,
                form.sexe.data,
                form.ecole.data,
                form.portable.data)

        volontaire = models.Volontaire(user)
        models.db.session.add(volontaire)
        models.db.session.commit()

        user_for_login = login.User(user)
        login_user(user_for_login)

        msg = Message('Inscription volontaire RN réussie', recipients=[user.email])
        msg.body = config.REGISTRATION_EMAIL_TEMPLATE.format(nom=user.name,
                            profil=url_for('.profil', _external=True),
                            index=url_for('.index', _external=True))
        mail.send(msg)

        return redirect(url_for('.profil'))

    return render_template('register.html', form=form)
Beispiel #7
0
def invite():
    if request.method == "POST":
        if 'cancel' in request.form:
            return redirect(url_front())

        email_addresses = request.form['email']
        for email_address in email_addresses.splitlines():
            key = generate_key()
            url = config.URL + url_for("usermanager.new", key=key)
            text = invite_mail.format(url=url)

            data.execute(
                "UPDATE User_creation_keys SET email = ? WHERE key = ?",
                email_address, key)

            mail.send(email_address, "Invitation til GRIS", text)
        flash("Invitationer sendt")

        message = mail.invitation_send_adminmail.format(
            email=request.form['email'])
        mail.admin("User Invited", message)

        return redirect(url_for("usermanager.overview"))

    else:
        w = html.WebBuilder()
        w.form()
        w.formtable()
        w.textarea("email", "Emails (1 pr. linje)")
        form = w.create()
        return render_template("form.html", form=form)
Beispiel #8
0
def send_email(m):
    msg = Message('Inscription {} RN réussie'.format(m.__class__.__name__),
                  recipients=[m.user.email])
    msg.body = "Bonjour {}. Ton inscription au site des volontaires de la RN ({}) \
a bien été enregistrée.\n \
Cordialement.".format(m.user.name, url_for('views.basic.index',
                                           _external=True))
    mail.send(msg)
Beispiel #9
0
def jvm_analysis(log_file, log_level, warning_interval, sender_alias, receive,
                 subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()

    logger.logger.debug("开始分析Jvm内存情况...")
    java_version = db.query_one("select version from tomcat_java_version")[0]
    table_name = f"tomcat_jstat{java_version}"

    sql = f"select port, ygc, ygct, fgc, fgct from {table_name} where record_time=(select max(record_time) from {table_name})"
    data = db.query_all(sql)

    ygc_warning_time = 1
    fgc_warning_time = 10
    #ygc_warning_time=0.01
    #fgc_warning_time=0

    for i in data:
        port = i[0]
        if i[1] == 0:
            ygc_time = 0
        else:
            ygc_time = i[2] / i[1]

        if i[3] == 0:
            fgc_time = 0
        else:
            fgc_time = i[4] / i[3]

        ygc_flag = 0
        if ygc_time >= ygc_warning_time:
            ygc_flag = 1
            logger.logger.warning(f"Tomcat({port})的YGC平均时间: {ygc_time}")
        warning_flag = warning.warning(logger, db, ygc_flag, port, "ygc",
                                       warning_interval)
        if warning_flag:
            warning_msg = f"Tomcat预警:\nTomcat({port})YGC平均时间为{ygc_time}\n"
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=f'tomcat{port}_ygc')

        fgc_flag = 0
        if fgc_time >= fgc_warning_time:
            fgc_flag = 1
            logger.logger.warning(f"Tomcat({port})的FGC平均时间: {fgc_time}")
        warning_flag = warning.warning(logger, db, fgc_flag, port, "fgc",
                                       warning_interval)
        if warning_flag:
            warning_msg = f"Tomcat预警:\nTomcat({port})FGC平均时间为{fgc_time}\n"
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=f'tomcat{port}_fgc')
Beispiel #10
0
def send_final_mail(subject, message):
    sent = 0
    for vol in models.Volontaire.query.all():
        msg = Message(subject, recipients=[vol.user.email])
        msg.body = full_message.format(custom_message=message,
                                       tasks=pp_activities(vol.activites),
                                       url=url_for('views.activite.my_assignements', _external=True))
        mail.send(msg)
        sent += 1
    return sent
Beispiel #11
0
def send_final_mail(subject, message):
    sent = 0
    for vol in models.Volontaire.query.all():
        msg = Message(subject, recipients=[vol.user.email])
        msg.body = full_message.format(custom_message=message,
                                       tasks=pp_activities(vol.activites),
                                       url=url_for(
                                           'views.activite.my_assignements',
                                           _external=True))
        mail.send(msg)
        sent += 1
    return sent
Beispiel #12
0
def analysis(log_file, log_level, warning_interval, sender_alias, receive,
             subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    logger.logger.debug(f"分析用户的资源限制...")
    sql = "select user, nofile, nproc from users_limit where record_time=(select max(record_time) from users_limit)"
    data = db.query_all(sql)

    min_limit = 5000
    for i in data:
        flag = 0
        arg = "nofile"
        if i[1].isdigit():
            if int(i[1]) < min_limit:
                flag = 1
                cmd = f"echo '{i[0]} - {arg} 65536' >> /etc/security/limits.conf"
                warning_msg=f"用户资源限制预警:\n" \
                        f"用户({i[0]})的{arg}参数值({i[1]})过低.\n"\
                        f"请在root用户下执行命令: {cmd}, 然后重启登录该用户再重启该用户下相应软件"
        warning_flag = warning.warning(logger, db, flag, f"{i[0]}_limit", arg,
                                       warning_interval)
        if warning_flag:
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=f"{i[0]}_limit nofile")

        flag = 0
        arg = "nproc"
        if i[2].isdigit():
            if int(i[2]) < min_limit:
                flag = 1
                cmd = f"echo '{i[0]} - {arg} 65536' >> /etc/security/limits.conf"
                warning_msg=f"用户资源限制预警:\n" \
                        f"用户({i[0]})的{arg}参数值({i[2]})过低.\n"\
                        f"请在root用户下执行命令: {cmd}, 然后重启登录该用户再重启该用户下相应软件"
            warning_flag = warning.warning(logger, db, flag,
                                           f"{i[0]}_nproc_limit", arg,
                                           warning_interval)
            if warning_flag:
                mail.send(logger,
                          warning_msg,
                          sender_alias,
                          receive,
                          subject,
                          msg=f"{i[0]}_limit nproc")
Beispiel #13
0
 def test_acc_and_alias(self):
     # send to acc-and-alias
     token = mail.send(to=['acc-and-alias@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #14
0
 def test_send_to_alias_with_mulitple_destinations(self):
     token = mail.send(to=['alias2@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #15
0
def warn_for_cancellation(assignement, unav):
    raw_txt = u"{} n'est plus affecté(e) à '{}' ({}): il/elle est indisponible à ce moment (%s entre %s et %s)."
    activite_url = url_for('views.responsable.activite_get',
                           a_id=assignement.activite.id,
                           _external=True)
    txt = raw_txt.format(assignement.volontaire.user.name,
                         assignement.activite.nom, activite_url, unav.reason,
                         to_time(unav.begin), to_time(unav.end))

    recipient = assignement.activite.responsable.user.email
    msg = Message(u'[RN] Affectation manuelle supprimée',
                  recipients=[recipient])
    msg.body = txt
    mail.send(msg)

    flash(u"Envoi d'un email au responsable %s" % recipient)
    return True
Beispiel #16
0
def warn_for_cancellation(assignement, unav):
    raw_txt = u"{} n'est plus affecté(e) à '{}' ({}): il/elle est indisponible à ce moment (%s entre %s et %s)."
    activite_url = url_for('views.responsable.activite_get',
                           a_id=assignement.activite.id, _external=True)
    txt = raw_txt.format(assignement.volontaire.user.name,
                         assignement.activite.nom,
                         activite_url,
                         unav.reason, to_time(unav.begin), to_time(unav.end))

    recipient = assignement.activite.responsable.user.email
    msg = Message(u'[RN] Affectation manuelle supprimée',
                  recipients=[recipient])
    msg.body = txt
    mail.send(msg)

    flash(u"Envoi d'un email au responsable %s" % recipient)
    return True
Beispiel #17
0
def running_analysis(log_file, log_level, warning_interval, sender_alias,
                     receive, subject):
    logger = log.Logger(log_file, log_level)
    logger.logger.debug("开始分析MySQL运行情况...")
    db = database.db()
    sql = "select port, pid from mysql_constant where record_time=(select max(record_time) from mysql_constant)"
    port, pid = db.query_one(sql)
    flag = 1 if pid == 0 else 0  # 是否预警
    warning_flag = warning.warning(logger, db, flag, "mysql", "running",
                                   warning_interval)
    if warning_flag:
        warning_msg = f"MySQL预警:\nMySQL({port})未运行"
        mail.send(logger,
                  warning_msg,
                  sender_alias,
                  receive,
                  subject,
                  msg=f'mysql_running')
Beispiel #18
0
 def test_alias_loop(self):
     token = mail.send(to=['alias5@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
Beispiel #19
0
def forgot_password(username):
    user = data.execute("SELECT name, email from Users WHERE username = ?",
                        username)
    if len(user) != 1:
        raise Exception("No such user/No valid email")

    min = config.USER_CREATION_KEY_MIN_LENGTH
    max = config.USER_CREATION_KEY_MAX_LENGTH
    length = random.randrange(min, max)
    alphabet = string.ascii_letters + string.digits

    finished = False
    while not finished:
        key = ''.join(random.choice(alphabet) for x in range(length))
        try:
            b = data.Bucket()
            b.username = username
            b.key = key
            b.created = now()
            b >= "User_forgotten_password_keys"
            finished = True
            break
        except psycopg2.IntegrityError as e:
            if e.pgerror.startswith(
                    'ERROR:  duplicate key value violates unique constraint "user_forgotten_password_keys_pkey"'
            ):
                finished = False
                continue
            else:
                raise
    user = user[0]
    email = user['email']

    if email == None or email == '':
        raise Exception("No such user/No valid email")

    url = config.URL + url_for("usermanager.renew_password", key=key)
    text = forgot_password_mail.format(name=user['name'], url=url)
    mail.send(email, "Glemt løsen", text)
Beispiel #20
0
def analysis(log_file, log_level, directory, warning_interval, sender_alias, receive, subject):
    """对备份文件进行预警
    1. 备份目录不存在则提示
    2. 当天的备份文件未生成则提示
    3. 当天的备份文件小于上一个的大小的99%则提示
    """
    logger=log.Logger(log_file, log_level)
    db=database.db()
    logger.logger.info(f"分析备份目录{directory}文件...")
    sql="select record_time, directory, filename, size, ctime from backup where directory=? order by record_time, ctime desc limit 2"
    data=db.query_all(sql, (directory, ))
    now_time=datetime.datetime.now().strftime("%Y-%m-%d")

    flag=0                 # 是否有预警信息
    value=None
    if len(data) < 2:
        if data[0][2] is None:
            flag=1
            value="dir_is_None"
            warning_msg=f"备份预警:\n备份目录({directory})不存在"
        else:
            if now_time not in data[0][4]:
                flag=1
                warning_msg=f"备份预警:\n备份目录({directory})当天备份文件未生成"
                value="file_is_None"
    else:
        if now_time not in data[0][4]:
            flag=1
            warning_msg=f"备份预警:\n备份目录({directory})当天备份文件未生成"
            value="file_is_None"
        elif  data[0][3] < data[1][3] * 0.99:
            flag=1
            warning_msg=f"备份预警:\n备份目录({directory})当天备份文件({format_size(data[0][3])})与上一次({format_size(data[1][3])})相比相差较大"
            value="file_is_small"

    warning_flag=warning.warning(logger, db, flag, f"backup {directory}", value, warning_interval)
    if warning_flag:
        mail.send(logger, warning_msg, sender_alias, receive, subject, msg=f"{directory} {value}")
Beispiel #21
0
def memory_analysis(log_file, log_level, warning_percent, warning_interval,
                    sender_alias, receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = "select record_time, used_percent from memory order by record_time desc"
    data = db.query_one(sql)
    mem_used_percent = float(data[1])

    logger.logger.debug("分析Mem...")
    flag = 0  # 是否有预警信息
    if mem_used_percent > warning_percent:
        flag = 1
        logger.logger.warning(f"内存当前使用率当前已达到{mem_used_percent}%")
    warning_flag = warning.warning(logger, db, flag, "mem", "used_percent",
                                   warning_interval)
    if warning_flag:
        warning_msg = f"内存预警:\n内存当前使用率当前已达到{mem_used_percent}%"
        mail.send(logger,
                  warning_msg,
                  sender_alias,
                  receive,
                  subject,
                  msg='mem_used_percent')
Beispiel #22
0
def tablespace_analysis(log_file, log_level, warning_percent, warning_interval,
                        sender_alias, receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = f"select tablespace_name, used_percent from oracle where record_time=(select max(record_time) from oracle)"
    data = db.query_all(sql)

    logger.logger.debug("分析表空间...")
    for i in data:
        flag = 0  # 是否有预警信息
        if i[1] >= warning_percent:
            flag = 1
            logger.logger.warning(f"{i[0]}表空间已使用{i[1]}%")
        warning_flag = warning.warning(logger, db, flag, "oracle", i[0],
                                       warning_interval)
        if warning_flag:
            warning_msg = f"Oracle表空间预警:\n{i[0]}表空间已使用{i[1]}%"
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=i[0])
Beispiel #23
0
def cpu_analysis(log_file, log_level, warning_percent, warning_interval,
                 sender_alias, receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = "select record_time, cpu_used_percent from cpu order by record_time desc"
    data = db.query_one(sql)
    cpu_used_percent = float(data[1])

    logger.logger.debug("分析CPU...")
    flag = 0  # 是否有预警信息
    if cpu_used_percent >= warning_percent:
        flag = 1
        logger.logger.warning(f"CPU当前使用率已达到{cpu_used_percent}%")
    warning_flag = warning.warning(logger, db, flag, "cpu", "used_percent",
                                   warning_interval)
    if warning_flag:
        warning_msg = f"CPU预警:\nCPU使用率当前已达到{cpu_used_percent}%"
        mail.send(logger,
                  warning_msg,
                  sender_alias,
                  receive,
                  subject,
                  msg='cpu_used_percent')
Beispiel #24
0
def disk_analysis(log_file, log_level, warning_percent, warning_interval,
                  sender_alias, receive, subject):
    logger = log.Logger(log_file, log_level)
    db = database.db()
    sql = f"select record_time, name, used_percent, mounted from disk where record_time=(select max(record_time) from disk)"
    data = db.query_all(sql)

    logger.logger.debug("分析disk...")
    for i in data:
        flag = 0  # 是否有预警信息
        if i[2] >= warning_percent:
            flag = 1
            logger.logger.warning(f"{i[3]}目录({i[1]})已使用{i[2]}%")
        warning_flag = warning.warning(logger, db, flag, "disk", i[3],
                                       warning_interval)
        if warning_flag:
            warning_msg = f"磁盘预警:\n{i[3]}目录({i[1]})已使用{i[2]}%\n"
            mail.send(logger,
                      warning_msg,
                      sender_alias,
                      receive,
                      subject,
                      msg=i[3])
Beispiel #25
0
def forgot_password(username):
    user = data.execute("SELECT name, email from Users WHERE username = ?", username)
    if len(user) != 1:
        raise Exception("No such user/No valid email")

    min = config.USER_CREATION_KEY_MIN_LENGTH
    max = config.USER_CREATION_KEY_MAX_LENGTH
    length = random.randrange(min, max)
    alphabet = string.ascii_letters + string.digits

    finished = False
    while not finished:
        key = ''.join(random.choice(alphabet) for x in range(length))
        try:
            b = data.Bucket()
            b.username = username
            b.key = key
            b.created = now()
            b >= "User_forgotten_password_keys"
            finished = True
            break
        except psycopg2.IntegrityError as e:
            if e.pgerror.startswith('ERROR:  duplicate key value violates unique constraint "user_forgotten_password_keys_pkey"'):
                finished = False
                continue
            else:
                raise
    user = user[0]
    email = user['email']

    if email == None or email == '':
        raise Exception("No such user/No valid email")

    url = config.URL + url_for("usermanager.renew_password", key=key)
    text = forgot_password_mail.format(name=user['name'], url=url)
    mail.send(email, "Glemt løsen", text)
Beispiel #26
0
 def test_catchall(self):
     token = mail.send(to=['does-not-exist@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #27
0
 def test_alias_to_external(self):
     token = mail.send(to=['alias4@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     for ext in CONFIG['external']:
         mail.waitformail(
             token=token,
             server=ext['mailbox_server'],
             port=ext['mailbox_port'],
             user=ext['username'],
             password=ext['password'],
             debug=CONFIG['debug'],
             ssl=True,
         )
Beispiel #28
0
 def test_basic_account(self):
     # send mail directly to account, should still work
     token = mail.send(to=['acc1@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #29
0
 def test_basic_alias(self):
     # send mail to existing alias, should also still work
     token = mail.send(to=['alias1@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #30
0
 def test_send_indirect_double_via_alias(self):
     token = mail.send(to=['alias3@' + CONFIG['test_domain']],
                       from_addr='acc1@' + CONFIG['test_domain'],
                       server=CONFIG['submission_server'],
                       port='587',
                       user='******' + CONFIG['test_domain'],
                       password=PASS,
                       debug=CONFIG['debug'],
                       ssl=True)
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
     mail.waitformail(
         token=token,
         server=CONFIG['mailbox_server'],
         port="993",
         user='******' + CONFIG['test_domain'],
         password=PASS,
         debug=CONFIG['debug'],
         ssl=True,
     )
Beispiel #31
0
def resource_show(hostname, check_dict, granularity_level, sender_alias,
                  receive, subject):
    log_file, log_level = log.get_log_args()
    logger = log.Logger(log_file, log_level)
    db = database.db()
    now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    modifier = "-24 hour"
    message = ""

    # 重置统计文件
    report_dir = "report"
    shutil.rmtree(report_dir, ignore_errors=True)
    os.makedirs(report_dir, exist_ok=True)

    logger.logger.info("统计资源记录信息...")

    printf(f"统计开始时间: {now_time}")
    printf(f"主机名: {hostname}")
    printf("-" * 100)

    # 系统启动时间
    sql = "select boot_time from boot_time order by record_time desc"
    boot_time = db.query_one(sql)[0]
    printf(f"系统启动时间: {boot_time}")
    printf("*" * 100)

    # 磁盘
    logger.logger.info("统计Disk记录信息...")
    printf("磁盘统计:")
    sql = "select distinct mounted from disk"
    disk_names = db.query_all(sql)
    disk_granularity_level = int(60 / int(check_dict['host_check'][0]) *
                                 granularity_level)
    disk_granularity_level = disk_granularity_level if disk_granularity_level != 0 else 1
    for i in disk_names:
        i = i[0]
        table = pt.PrettyTable(
            ["记录时间", "挂载点", "磁盘名称", "磁盘大小", "已使用大小", "已使用百分比", "可用"])
        sql=f"select record_time, name, total, used, used_percent, avail from disk "\
                f"where mounted=? "\
                f"and record_time > datetime('{now_time}', '{modifier}') "\
                f"order by record_time"
        disk_data = db.query_all(sql, (i, ))
        for index, item in enumerate(disk_data):
            if index % disk_granularity_level == 0 or index == 0:
                total = format_size(item[2])
                used = format_size(item[3])
                used_percent = f"{item[4]}%"
                avail = format_size(item[5])
                table.add_row(
                    (item[0], i, item[1], total, used, used_percent, avail))
        printf(f"{i}磁盘统计:")
        printf(table)
        printf("*" * 100)

    # CPU
    logger.logger.info("统计CPU记录信息...")
    printf("CPU统计:")
    cpu_granularity_level = int(60 / int(check_dict['host_check'][1]) *
                                granularity_level)
    cpu_granularity_level = cpu_granularity_level if cpu_granularity_level != 0 else 1
    table = pt.PrettyTable(["记录时间", "CPU核心数", "CPU使用率"])
    sql=f"select record_time, cpu_count, cpu_used_percent from cpu "\
            f"where record_time > datetime('{now_time}', '{modifier}') "\
            f"order by record_time"
    cpu_data = db.query_all(sql)
    for index, item in enumerate(cpu_data):
        if index % cpu_granularity_level == 0 or index == 0:
            used_percent = f"{item[2]}%"
            table.add_row((item[0], item[1], used_percent))
    printf(table)
    printf("*" * 100)

    # MEM
    logger.logger.info("统计Mem记录信息...")
    printf("内存统计:")
    mem_granularity_level = int(60 / int(check_dict['host_check'][2]) *
                                granularity_level)
    mem_granularity_level = mem_granularity_level if mem_granularity_level != 0 else 1
    table = pt.PrettyTable(
        ["记录时间", "内存大小", "可用(avail)", "已使用", "已使用百分比", "剩余(free)"])
    sql=f"select record_time, total, avail, used, used_percent, free from memory "\
            f"where record_time > datetime('{now_time}', '{modifier}') "\
            f"order by record_time"
    mem_data = db.query_all(sql)
    for index, item in enumerate(mem_data):
        if index % mem_granularity_level == 0 or index == 0:
            total = format_size(item[1])
            avail = format_size(item[2])
            used = format_size(item[3])
            used_percent = f"{item[4]}%"
            free = format_size(item[5])
            table.add_row((item[0], total, avail, used, used_percent, free))
    printf(table)
    printf("*" * 100)

    # Swap
    logger.logger.info("统计Swap记录信息...")
    printf("Swap统计:")
    swap_granularity_level = int(60 / int(check_dict['host_check'][3]) *
                                 granularity_level)
    swap_granularity_level = swap_granularity_level if swap_granularity_level != 0 else 1
    table = pt.PrettyTable(["记录时间", "Swap大小", "已使用", "已使用百分比", "剩余"])
    sql=f"select record_time, total, used, used_percent, free from swap "\
            f"where record_time > datetime('{now_time}', '{modifier}') "\
            f"order by record_time"
    swap_data = db.query_all(sql)
    for index, item in enumerate(swap_data):
        if index % swap_granularity_level == 0 or index == 0:
            total = format_size(item[1])
            used = format_size(item[2])
            used_percent = f"{item[3]}%"
            free = format_size(item[4])
            table.add_row((item[0], total, used, used_percent, free))
    printf(table)
    printf("*" * 100)

    # Tomcat
    if check_dict["tomcat_check"][0] == "1":
        logger.logger.info("统计Tomcat记录信息...")
        printf("Tomcat统计:")
        tomcat_granularity_level = int(
            60 / int(check_dict['tomcat_check'][1]) * granularity_level)
        tomcat_granularity_level = tomcat_granularity_level if tomcat_granularity_level != 0 else 1
        version = db.query_one("select version from tomcat_java_version")[0]
        printf(f"Java版本: {version}")
        printf("*" * 100)
        #sql="select distinct port from tomcat_constant"
        #tomcat_ports=db.query_all(sql)
        tomcat_ports = conf.get("tomcat", "tomcat_port")[0].split(",")
        tomcat_constant_data = []
        for i in tomcat_ports:
            port = int(i.strip())
            constant_sql=f"select record_time, pid, port, boot_time, cmdline from tomcat_constant "\
                    f"where port=? "\
                    f"and '{now_time}' >= record_time "\
                    f"order by record_time desc"
            variable_sql=f"select record_time, pid, men_used, mem_used_percent, connections, threads_num from tomcat_variable "\
                    f"where port=? "\
                    f"and record_time > datetime('{now_time}', '{modifier}') "\
                    f"order by record_time"
            if version == "8":
                jvm_sql=f"select record_time, S0, S1, E, O, M, CCS, YGC, YGCT, FGC, FGCT, GCT from tomcat_jstat8 "\
                        f"where port=? "\
                        f"and record_time > datetime('{now_time}', '{modifier}') "\
                        f"order by record_time"
                jvm_table = pt.PrettyTable([
                    "记录时间", "S0", "S1", "E", "O", "M", "CCS", "YGC", "YGCT",
                    "FGC", "FGCT", "GCT"
                ])
            elif version == "7":
                jvm_sql=f"select record_time, S0, S1, E, O, P, YGC, YGCT, FGC, FGCT, GCT from tomcat_jstat7 "\
                        f"where port=? "\
                        f"and record_time > datetime('{now_time}', '{modifier}') "\
                        f"order by record_time"
                jvm_table = pt.PrettyTable([
                    "记录时间", "S0", "S1", "E", "O", "P", "YGC", "YGCT", "FGC",
                    "FGCT", "GCT"
                ])

            constant_table = pt.PrettyTable(
                ["记录时间", "Pid", "端口", "启动时间", "启动参数"])
            tomcat_constant_data = (db.query_one(constant_sql, (port, )))
            constant_table.add_row(tomcat_constant_data)

            variable_table = pt.PrettyTable(
                ["记录时间", "Pid", "内存使用", "内存使用率", "连接数", "线程数"])
            tomcat_variable_data = (db.query_all(variable_sql, (port, )))
            for index, item in enumerate(tomcat_variable_data):
                if index % tomcat_granularity_level == 0 or index == 0:
                    mem_used = format_size(item[2])
                    mem_used_percent = f"{item[3]:.2f}%"
                    variable_table.add_row(
                        (item[0], item[1], mem_used, mem_used_percent, item[4],
                         item[5]))

            tomcat_jvm_data = (db.query_all(jvm_sql, (port, )))
            for index, item in enumerate(tomcat_jvm_data):
                if index % tomcat_granularity_level == 0 or index == 0:
                    jvm_table.add_row(item)

            printf(f"Tomcat({port})统计信息:")
            printf("启动信息:")
            printf(constant_table)
            printf("运行信息:")
            printf(variable_table)
            printf("Jvm内存信息:")
            printf(jvm_table)
            printf("*" * 100)

    # Redis
    if check_dict["redis_check"][0] == "1":
        logger.logger.info("统计Redis记录信息...")
        printf("Redis统计:")
        redis_granularity_level = int(60 / int(check_dict['redis_check'][1]) *
                                      granularity_level)
        redis_granularity_level = redis_granularity_level if redis_granularity_level != 0 else 1
        printf("*" * 100)

        constant_sql=f"select record_time, pid, port, boot_time from redis_constant "\
                f"where '{now_time}' >= record_time "\
                f"order by record_time desc"
        variable_sql=f"select record_time, pid, mem_used, mem_used_percent, connections, threads_num from redis_variable "\
                f"where record_time > datetime('{now_time}', '{modifier}') "\
                f"order by record_time"

        # 启动信息
        constant_table = pt.PrettyTable(["记录时间", "Pid", "端口", "启动时间"])
        constant_data = (db.query_one(constant_sql))
        constant_table.add_row(constant_data)

        # 运行信息
        variable_table = pt.PrettyTable(
            ["记录时间", "Pid", "内存使用", "内存使用率", "连接数", "线程数"])
        variable_data = (db.query_all(variable_sql))
        for index, item in enumerate(variable_data):
            if index % tomcat_granularity_level == 0 or index == 0:
                mem_used = format_size(item[2])
                mem_used_percent = f"{item[3]:.2f}%"
                variable_table.add_row((item[0], item[1], mem_used,
                                        mem_used_percent, item[4], item[5]))

        # master_slave信息
        role = db.query_one("select role from redis_role")[0]
        if role == "master":
            master_slave_sql = "select a.record_time, connected_slave, slave_ip, slave_port, slave_state from redis_master a ,redis_slaves_info b on a.record_time=b.record_time where a.record_time=(select max(record_time) from redis_master)"
            master_slave_table = pt.PrettyTable(
                ["记录时间", "Slave数量", "Slave IP", "Slave端口", "Slave状态"])
            master_slave_data = (db.query_all(master_slave_sql))
            for i in master_slave_data:
                master_slave_table.add_row(i)
        elif role == "slave":
            master_slave_sql = "select record_time, pid, master_host, master_port, master_link_status from redis_slave order by record_time desc"
            master_slave_table = pt.PrettyTable(
                ["记录时间", "Pid", "master主机", "master端口", "与master连接状态"])
            master_slave_data = (db.query_one(master_slave_sql))
            master_slave_table.add_row(master_slave_data)

        # sentinel监控信息
        sentinel_sql = "select a.record_time, role, host, a.port from redis_sentinel a, redis_constant b on a.record_time=b.record_time where b.record_time=(select max(record_time) from redis_constant)"
        sentinel_table = pt.PrettyTable(["记录时间", "角色", "IP", "端口"])
        sentinel_data = (db.query_all(sentinel_sql))
        for i in sentinel_data:
            sentinel_table.add_row(i)

        printf("启动信息:")
        printf(constant_table)
        printf("运行信息:")
        printf(variable_table)
        printf("集群信息:")
        printf(f"当前角色: {role}")
        printf(master_slave_table)
        printf("Sentinel监控信息:")
        printf(sentinel_table)
        printf("*" * 100)

    # backup
    if check_dict["backup_check"] == "1":
        logger.logger.info("统计备份记录信息...")
        printf("备份统计:")
        backup_dirs = conf.get("backup", "dir")[0].split(",")
        for i in backup_dirs:
            directory = i.strip()
            table = pt.PrettyTable(["记录时间", "备份文件", "大小", "创建时间"])
            sql=f"select record_time, filename, size, ctime from backup "\
                    f"where directory=?"\
                    f"order by ctime"
            backup_data = db.query_all(sql, (directory, ))
            for j in backup_data:
                if j[2] is not None:
                    size = format_size(j[2])
                    table.add_row((j[0], j[1], size, j[3]))

            printf(f"备份({directory})统计信息:")
            printf(table)
            printf("*" * 100)

    # MySQL
    if check_dict["mysql_check"][0] == "1":
        logger.logger.info("统计MySQL记录信息...")
        printf("MySQL统计:")
        mysql_granularity_level = int(60 / int(check_dict['mysql_check'][1]) *
                                      granularity_level)
        mysql_granularity_level = mysql_granularity_level if mysql_granularity_level != 0 else 1
        printf("*" * 100)

        constant_sql=f"select record_time, pid, port, boot_time from mysql_constant "\
                f"where '{now_time}' >= record_time "\
                f"order by record_time desc"
        variable_sql=f"select record_time, pid, mem_used, mem_used_percent, connections, threads_num from mysql_variable "\
                f"where record_time > datetime('{now_time}', '{modifier}') "\
                f"order by record_time"

        # 启动信息
        constant_table = pt.PrettyTable(["记录时间", "Pid", "端口", "启动时间"])
        constant_data = (db.query_one(constant_sql))
        constant_table.add_row(constant_data)

        # 运行信息
        variable_table = pt.PrettyTable(
            ["记录时间", "Pid", "内存使用", "内存使用率", "连接数", "线程数"])
        variable_data = (db.query_all(variable_sql))
        for index, item in enumerate(variable_data):
            if index % mysql_granularity_level == 0 or index == 0:
                mem_used = format_size(item[2])
                mem_used_percent = f"{item[3]:.2f}%"
                variable_table.add_row((item[0], item[1], mem_used,
                                        mem_used_percent, item[4], item[5]))

        # master_slave信息
        role = db.query_one("select role from mysql_role")[0]
        if role == "master":
            master_slave_sql = "select record_time, pid, slave_num, binlog_do_db, binlog_ignore_db from mysql_master order by record_time desc"
            master_slave_table = pt.PrettyTable(
                ["记录时间", "Pid", "Slave数量", "Binlog_do_db", "Binlog_ignore_db"])
        elif role == "slave":
            master_slave_sql="select record_time, pid, master_host, master_port, replicate_do_db, replicate_ignore_db, "\
                    "slave_io_thread, slave_io_state, slave_sql_thread, slave_sql_state, "\
                    "master_uuid, retrieved_gtid_set, executed_gtid_set, seconds_behind_master "\
                    "from mysql_slave order by record_time desc"
            master_slave_table = pt.PrettyTable([
                "记录时间", "Pid", "Master主机", "Master端口", "同步数据库", "非同步数据库",
                "Slave_IO线程", "Slave_IO状态", "Slave_SQL线程", "Slave_SQL状态",
                "Master_UUID", "已接收的GTID集合", "已执行的GTID集合", "Slave落后Master的秒数"
            ])
        master_slave_data = (db.query_one(master_slave_sql))
        if master_slave_data is not None:
            master_slave_table.add_row(master_slave_data)

        printf("启动信息:")
        printf(constant_table)
        printf("运行信息:")
        printf(variable_table)
        printf("集群信息:")
        printf(f"当前角色: {role}")
        printf(master_slave_table)
        printf("*" * 100)

        # 慢日志
        printf("慢日志信息:")
        mysql_user, mysql_ip, mysql_port, mysql_password = conf.get(
            "mysql", "mysql_user", "mysql_ip", "mysql_port", "mysql_password")
        mysql_flag, msg = mysql.export_slow_log(
            logger, mysql_user, mysql_ip, mysql_password, mysql_port,
            f"{report_dir}/slow_analysis.log", f"{report_dir}/slow.log")
        if mysql_flag == 1:
            message = f"该附件存在MySQL慢日志"
        printf(msg)
        printf("*" * 100)

    # Oracle表空间
    if check_dict["oracle_check"][0] == "1":
        logger.logger.info("统计Oracle表空间记录信息...")
        printf("Oracle表空间统计:")
        oracle_granularity_level = int(
            60 / int(check_dict['oracle_check'][1]) * granularity_level)
        oracle_granularity_level = oracle_granularity_level if oracle_granularity_level != 0 else 1

        sql = "select distinct tablespace_name from oracle"
        tablespace_names = db.query_all(sql)
        for i in tablespace_names:
            i = i[0]
            table = pt.PrettyTable(
                ["记录时间", "表空间名称", "表空间大小", "已使用", "已使用百分比", "可用"])
            sql=f"select record_time, size, used, used_percent, free from oracle "\
                    f"where tablespace_name=? "\
                    f"and record_time > datetime('{now_time}', '{modifier}') "\
                    f"order by record_time"
            tablespace_data = db.query_all(sql, (i, ))
            for index, item in enumerate(tablespace_data):
                if index % oracle_granularity_level == 0 or index == 0:
                    total = format_size(item[1])
                    used = format_size(item[2])
                    used_percent = f"{item[3]}%"
                    free = format_size(item[4])
                    table.add_row(
                        (item[0], i, total, used, used_percent, free))
            printf(f"{i}表空间统计:")
            printf(table)
            printf("*" * 100)
        # war
        logger.logger.info("生成awr报告...")
        printf("awr报告信息:")
        awr_hours = conf.get("oracle", "awr_hours")[0]
        if oracle.generate_awr(int(awr_hours), report_dir) == 0:
            printf("请在附件中查看awr.html文件")
        else:
            printf("生成awr报告失败, 请自行手动生成")

    logger.logger.info("统计资源结束...")
    printf("-" * 100)
    end_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    printf(f"统计结束时间: {end_time}")

    tar_file = tar_report(logger, report_dir)
    sender_alias, receive, subject = conf.get("mail", "sender", "receive",
                                              "subject")

    warning_msg = f"\n请查看统计报告.\n\n{message}"
    mail.send(logger,
              warning_msg,
              sender_alias,
              receive,
              subject,
              msg="report",
              attachment_file=tar_file)
Beispiel #32
0
Datei: api.py Projekt: brunal/rn
def send_registration_email(user):
    msg = Message(u'Inscription volontaire RN réussie', recipients=[user.email])
    msg.body = REGISTRATION_EMAIL_TEMPLATE.format(nom=user.name,
                        profil=url_for('views.basic.profil', _external=True),
                        index=url_for('views.basic.index', _external=True))
    mail.send(msg)