Пример #1
0
def ack(sakuya_db, id):

    def error(msg):
        return {'status': 'error', 'msg': msg}

    def log(chart, category):
        with open(get_config('webapp')['chart_ack_log'], 'a') as f:
            l = u'[%s] user: %s, chart: %d-%s, category: %d-%s\n' %\
                (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                 auth.get_user()['username'],
                 chart.id, chart.name,
                 category.id, category.name)
            f.write(l.encode('utf-8'))

    chart = sakuya_db.query(Charts).get(id)
    if chart is None:
        return error('图表不存在')

    if haopan.is_haopan(chart.cate_id):
        return error('栏目不正确')

    if 'cl2' in request.params: # create category and move into it
        cl2 = sakuya_db.query(Categories).get(request.params['cl2'])
        if cl2 is None:
            return error('参数不正确')

        cl3_name = request.params.get('cl3')
        if not cl3_name:
            return error('栏目名称不能为空')

        cl3_exists = sakuya_db.query(Categories).\
                     filter_by(parent_cate_id=cl2.id, name=cl3_name).\
                     count() > 0
        if cl3_exists:
            return error('栏目已存在')

        cl3 = Categories()
        cl3.name = cl3_name
        cl3.parent_cate_id = cl2.id
        cl3.is_parent = False
        sakuya_db.add(cl3)
        sakuya_db.commit()

        chart.cate_id = cl3.id
        chart.owner = auth.get_user()['username']
        sakuya_db.commit()

    else: # move to category
        cl3 = sakuya_db.query(Categories).get(request.params.get('cl3'))
        if cl3 is None:
            return error('栏目不存在')

        chart.cate_id = cl3.id
        chart.owner = auth.get_user()['username']
        sakuya_db.commit()

    log(chart, cl3)
    return {'status': 'ok'}
Пример #2
0
def ack(sakuya_db, id):
    def error(msg):
        return {'status': 'error', 'msg': msg}

    def log(chart, category):
        with open(get_config('webapp')['chart_ack_log'], 'a') as f:
            l = u'[%s] user: %s, chart: %d-%s, category: %d-%s\n' %\
                (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
                 auth.get_user()['username'],
                 chart.id, chart.name,
                 category.id, category.name)
            f.write(l.encode('utf-8'))

    chart = sakuya_db.query(Charts).get(id)
    if chart is None:
        return error('图表不存在')

    if haopan.is_haopan(chart.cate_id):
        return error('栏目不正确')

    if 'cl2' in request.params:  # create category and move into it
        cl2 = sakuya_db.query(Categories).get(request.params['cl2'])
        if cl2 is None:
            return error('参数不正确')

        cl3_name = request.params.get('cl3')
        if not cl3_name:
            return error('栏目名称不能为空')

        cl3_exists = sakuya_db.query(Categories).\
                     filter_by(parent_cate_id=cl2.id, name=cl3_name).\
                     count() > 0
        if cl3_exists:
            return error('栏目已存在')

        cl3 = Categories()
        cl3.name = cl3_name
        cl3.parent_cate_id = cl2.id
        cl3.is_parent = False
        sakuya_db.add(cl3)
        sakuya_db.commit()

        chart.cate_id = cl3.id
        chart.owner = auth.get_user()['username']
        sakuya_db.commit()

    else:  # move to category
        cl3 = sakuya_db.query(Categories).get(request.params.get('cl3'))
        if cl3 is None:
            return error('栏目不存在')

        chart.cate_id = cl3.id
        chart.owner = auth.get_user()['username']
        sakuya_db.commit()

    log(chart, cl3)
    return {'status': 'ok'}
Пример #3
0
def unfollow(sakuya_db, id):

    try:
        chart = sakuya_db.query(Charts).get(id)
        if chart is None:
            return util.output('error', msg='Chart not found.')

        user = auth.get_user()

        row = sakuya_db.query(Follows).filter_by(
            cid=id, follower=user['userid']).first()
        if row is not None:
            sakuya_db.delete(row)

            if chart.followers:
                chart.followers -= 1

            sakuya_db.commit()

        return util.output('ok')

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return util.output('error', msg='取消失败')
Пример #4
0
def follow(sakuya_db, id):

    try:
        chart = sakuya_db.query(Charts).get(id)
        if chart is None:
            return util.output('error', msg='Chart not found.')

        user = auth.get_user()

        follow = sakuya_db.query(Follows).filter_by(
            cid=id, follower=user['userid']).first()
        if follow is None:
            follow = Follows()
            follow.cid = id
            follow.follower = user['userid']
            follow.recv_warning = False
            sakuya_db.add(follow)

            if not chart.followers:
                chart.followers = 1
            else:
                chart.followers += 1

            sakuya_db.commit()

        return util.output('ok')

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return util.output('error', msg='订阅失败')
Пример #5
0
def profile(sakuya_db):

    user = auth.get_user()
    row = sakuya_db.query(Users).get(user['userid'])

    rt = {}

    msg = (None, False)
    if request.method == 'POST':

        rt['forms'] = request.forms

        try:
            # parse email list
            email = request.forms.get('email', '')
            email_list = util.unique(email.split('\n'))
            if not email_list:
                raise ValueError('接警邮箱不能为空')
            email = '\n'.join(email_list)

        except Exception, e:
            msg = (str(e), True)

        else:
            row.email = email
            rt['forms']['email'] = row.email

            sakuya_db.commit()
            msg = ('修改成功', False)
Пример #6
0
def follow(sakuya_db):

    user = auth.get_user()

    chart_list = []
    invalids = []
    for row in sakuya_db.\
               query(Follows).\
               filter_by(follower=user['userid']).\
               order_by(Follows.id.desc()):

        chart = sakuya_db.query(Charts).get(row.cid)
        if chart is None:
            invalids.append(row)
            continue

        if haopan.is_haopan(chart.cate_id):
            title = haopan.format_title(chart.name)
        else:
            title = chart.name

        chart_list.append({
            'id': chart.id,
            'name': title,
            'recv_warning': row.recv_rules == 'all'
        })

    if invalids:
        for row in invalids:
            sakuya_db.delete(row)
        sakuya_db.commit()

    return {
        'chart_list': chart_list
    }
Пример #7
0
def follow(sakuya_db, id):

    try:
        chart = sakuya_db.query(Charts).get(id)
        if chart is None:
            return util.output('error', msg='Chart not found.')

        user = auth.get_user()

        follow = sakuya_db.query(Follows).filter_by(cid=id, follower=user['userid']).first()
        if follow is None:
            follow = Follows()
            follow.cid = id
            follow.follower = user['userid']
            follow.recv_warning = False
            sakuya_db.add(follow)

            if not chart.followers:
                chart.followers = 1
            else:
                chart.followers += 1

            sakuya_db.commit()

        return util.output('ok')

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return util.output('error', msg='订阅失败')
Пример #8
0
def profile(sakuya_db):

    user = auth.get_user()
    row = sakuya_db.query(Users).get(user['userid'])

    rt = {}

    msg = (None, False)
    if request.method == 'POST':

        rt['forms'] = request.forms

        try:
            # parse email list
            email = request.forms.get('email', '')
            email_list = util.unique(email.split('\n'))
            if not email_list:
                raise ValueError('接警邮箱不能为空')
            email = '\n'.join(email_list)

        except Exception, e:
            msg = (str(e), True)

        else:
            row.email = email
            rt['forms']['email'] = row.email

            sakuya_db.commit()
            msg = ('修改成功', False)
Пример #9
0
def follow(sakuya_db):

    user = auth.get_user()

    chart_list = []
    invalids = []
    for row in sakuya_db.\
               query(Follows).\
               filter_by(follower=user['userid']).\
               order_by(Follows.id.desc()):

        chart = sakuya_db.query(Charts).get(row.cid)
        if chart is None:
            invalids.append(row)
            continue

        if haopan.is_haopan(chart.cate_id):
            title = haopan.format_title(chart.name)
        else:
            title = chart.name

        chart_list.append({
            'id': chart.id,
            'name': title,
            'recv_warning': row.recv_rules == 'all'
        })

    if invalids:
        for row in invalids:
            sakuya_db.delete(row)
        sakuya_db.commit()

    return {'chart_list': chart_list}
Пример #10
0
 def log(chart, category):
     with open(get_config('webapp')['chart_ack_log'], 'a') as f:
         l = u'[%s] user: %s, chart: %d-%s, category: %d-%s\n' %\
             (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
              auth.get_user()['username'],
              chart.id, chart.name,
              category.id, category.name)
         f.write(l.encode('utf-8'))
Пример #11
0
 def log(chart, category):
     with open(get_config('webapp')['chart_ack_log'], 'a') as f:
         l = u'[%s] user: %s, chart: %d-%s, category: %d-%s\n' %\
             (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
              auth.get_user()['username'],
              chart.id, chart.name,
              category.id, category.name)
         f.write(l.encode('utf-8'))
Пример #12
0
def new(sakuya_db, cid=None):

    if cid is not None\
            and not sakuya_db.query(Categories).filter_by(id=cid, is_parent=False).count():
        abort(404)

    rt = _rt(sakuya_db)
    rt['forms'] = {
        'name': '',
        'cid': cid,
        'owner': auth.get_user()['username'],
        'owner_name': auth.get_user()['truename'],
        'rule': {},
        'warn': [],
        'alert_enable': 0
    }
    rt['warn_only'] = False
    rt['is_haopan'] = False

    return rt
Пример #13
0
def new(sakuya_db, cid=None):

    if cid is not None\
            and not sakuya_db.query(Categories).filter_by(id=cid, is_parent=False).count():
        abort(404)

    rt = _rt(sakuya_db)
    rt['forms'] = {
        'name': '',
        'cid': cid,
        'owner': auth.get_user()['username'],
        'owner_name': auth.get_user()['truename'],
        'rule': {},
        'warn': [],
        'alert_enable': 0
    }
    rt['warn_only'] = False
    rt['is_haopan'] = False

    return rt
Пример #14
0
def edit(sakuya_db, id):

    row = sakuya_db.query(Charts).get(id)
    if row is None:
        abort(404)

    is_haopan = haopan.is_haopan(row.cate_id)
    is_copy = request.params.get('copy') == '1'

    if auth.is_role('sa'):
        warn_only = False
    elif auth.is_role(
            'haopan'
    ) and is_haopan:  # this can be replaced with userid-cid authorization
        warn_only = True
    elif auth.get_user()['username'] == row.owner:
        warn_only = True
    else:
        abort(403)

    if is_copy and (is_haopan or warn_only):
        abort(400)

    rt = _rt(sakuya_db)
    rt['id'] = id
    rt['editing'] = not is_copy
    rt['warn_only'] = warn_only
    rt['is_haopan'] = is_haopan

    forms = {
        'name': haopan.format_title(row.name) if is_haopan else row.name,
        'cid': row.cate_id,
        'owner': row.owner,
        'alert_enable': row.alert_enable
    }

    ext = row.get_ext()
    forms['rule'] = dump_rule(ext.get('rule'))
    forms['warn'] = dump_warn(warn.get_warn(sakuya_db, id))

    forms['owner_name'] = '系统'
    for item in rt['users']:
        if item['username'] == forms['owner']:
            forms['owner_name'] = item['truename']

    rt['forms'] = forms

    return rt
Пример #15
0
def edit(sakuya_db, id):

    row = sakuya_db.query(Charts).get(id)
    if row is None:
        abort(404)

    is_haopan = haopan.is_haopan(row.cate_id)
    is_copy = request.params.get('copy') == '1'

    if auth.is_role('sa'):
        warn_only = False
    elif auth.is_role('haopan') and is_haopan: # this can be replaced with userid-cid authorization
        warn_only = True
    elif auth.get_user()['username'] == row.owner:
        warn_only = True
    else:
        abort(403)

    if is_copy and (is_haopan or warn_only):
        abort(400)

    rt = _rt(sakuya_db)
    rt['id'] = id
    rt['editing'] = not is_copy
    rt['warn_only'] = warn_only
    rt['is_haopan'] = is_haopan

    forms = {
        'name': haopan.format_title(row.name) if is_haopan else row.name,
        'cid': row.cate_id,
        'owner': row.owner,
        'alert_enable': row.alert_enable
    }

    ext = row.get_ext()
    forms['rule'] = dump_rule(ext.get('rule'))
    forms['warn'] = dump_warn(warn.get_warn(sakuya_db, id))

    forms['owner_name'] = '系统'
    for item in rt['users']:
        if item['username'] == forms['owner']:
            forms['owner_name'] = item['truename']

    rt['forms'] = forms

    return rt
Пример #16
0
def unfollow(sakuya_db, id):

    try:
        chart = sakuya_db.query(Charts).get(id)
        if chart is None:
            return util.output('error', msg='Chart not found.')

        user = auth.get_user()

        row = sakuya_db.query(Follows).filter_by(cid=id, follower=user['userid']).first()
        if row is not None:
            sakuya_db.delete(row)

            if chart.followers:
                chart.followers -= 1

            sakuya_db.commit()

        return util.output('ok')

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return util.output('error', msg='取消失败')
Пример #17
0
def update(sakuya_db, id):

    row = sakuya_db.query(Charts).get(id)
    if row is None:
        abort(404)

    is_haopan = haopan.is_haopan(row.cate_id)

    if auth.is_role('sa'):
        warn_only = False
    elif auth.is_role('haopan') and is_haopan:
        warn_only = True
    elif auth.get_user()['username'] == row.owner:
        warn_only = True
    else:
        abort(403)

    rule = None
    warn = None

    def error(msg):
        rt = _rt(sakuya_db)
        rt['id'] = id
        rt['editing'] = True
        rt['warn_only'] = warn_only
        rt['is_haopan'] = is_haopan
        rt['forms'] = request.forms
        rt['forms']['rule'] = dump_rule(rule)
        rt['forms']['warn'] = dump_warn(warn)
        rt['error_msg'] = msg
        return rt

    try:

        alert_enable = request.forms['alert_enable'] == '1'
        warn = make_warn()
        if alert_enable and not warn:
            raise ValueError

        if not warn_only and not is_haopan:

            use_storm = request.forms['use_storm'] == '1'
            if use_storm:
                rule = make_rule()
                if not rule['datasource'] or not rule['filters']:
                    raise ValueError

            name = request.forms['name']
            if not name:
                raise ValueError

            cid = int(request.forms['cid'])
            if not sakuya_db.\
                   query(Categories).\
                   filter_by(id=cid, is_parent=False).\
                   count():
                raise ValueError

            owner = request.forms['owner']
            if not sakuya_db.\
                   query(Users).\
                   filter_by(username=owner).\
                   count():
                raise ValueError

    except Exception:
        return error('参数错误。')

    try:
        row.alert_enable = int(alert_enable)
        row.warnings = 0
        row.criticals = 0
        process_warn_rules(sakuya_db, id, warn)

        if not warn_only and not is_haopan:
            row.name = name
            row.cate_id = cid
            row.root_category = get_parent_category(sakuya_db, cid)
            row.owner = owner

            ext = row.get_ext()
            if use_storm:
                ext['rule'] = rule
                storm.set_rule(id, json.dumps(rule))
            else:
                ext.pop('rule', None)
                storm.delete_rule(id)
            row.ext_info = json.dumps(ext)

        sakuya_db.commit()

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return error('图表更新失败。')

    if warn_only or is_haopan:
        redirect('/chart/%d' % id)
    redirect('/admin/category/%d' % cid)
Пример #18
0
                'time':
                row.time.strftime('%Y-%m-%d %H:%M')
            })

    # initial start/end time
    now = datetime.datetime.now()

    def before_days(days):
        tmp_dt = now + datetime.timedelta(days=days)
        return tmp_dt.strftime('%Y-%m-%d')

    rt['dt_range'] = dict(
        (days, before_days(days)) for days in [0, -1, -2, -6, -14, -29])

    # whether followed
    user = auth.get_user()
    if user is not None:
        follow = sakuya_db.query(Follows).filter_by(
            cid=id, follower=user['userid']).first()
        if follow is not None:
            rt['following'] = True
            if follow.recv_warning:
                rt['recv_warning'] = True
                rt['recv_rules'] = follow.get_recv_rules()
            else:
                rt['recv_warning'] = False
        else:
            rt['following'] = False
    else:
        rt['following'] = False
Пример #19
0
            rt['warning_logs'].append({
                'id': row.id,
                'level': 'critical' if row.type == Events.CONST_TYPE_CRITICAL else 'warning',
                'content': row.info,
                'time': row.time.strftime('%Y-%m-%d %H:%M')
            })
    
    # initial start/end time
    now = datetime.datetime.now()
    def before_days(days):
        tmp_dt = now + datetime.timedelta(days=days)
        return tmp_dt.strftime('%Y-%m-%d')
    rt['dt_range'] = dict((days, before_days(days)) for days in [0, -1, -2, -6, -14, -29])

    # whether followed
    user = auth.get_user()
    if user is not None:
        follow = sakuya_db.query(Follows).filter_by(cid=id, follower=user['userid']).first()
        if follow is not None:
            rt['following'] = True
            if follow.recv_warning:
                rt['recv_warning'] = True
                rt['recv_rules'] = follow.get_recv_rules()
            else:
                rt['recv_warning'] = False
        else:
            rt['following'] = False
    else:
        rt['following'] = False

    # authorization
Пример #20
0
def index(sakuya_db):

    rt = {}
    rt['stats'] = {
        'charts': sakuya_db.query(Charts).count(),
        'users': sakuya_db.query(Users).count(),
        'follows': sakuya_db.query(Follows).count()
    }

    rt['events'] = []
    for row in sakuya_db.\
               query(Events).\
               order_by(Events.id.desc()).\
               limit(7):

        if row.type == Events.CONST_TYPE_CRITICAL:
            type_text = 'Critical'
        else:
            type_text = 'Warning'

        rt['events'].append({
            'cid': row.cid,
            'info': row.info,
            'time': row.time.strftime('%H:%M'),
            'type': type_text
        })

    rt['top_monitor'] = []
    for row in sakuya_db.\
               query(Charts).\
               filter_by(root_category=2).\
               order_by(Charts.followers.desc(), Charts.id).\
               limit(7):

        rt['top_monitor'].append({
            'id': row.id,
            'name': haopan.format_title(row.name),
            'num': row.followers
        })

    rt['top_speed'] = []
    for row in sakuya_db.\
               query(Charts).\
               filter_by(root_category=3).\
               order_by(Charts.followers.desc(), Charts.id).\
               limit(7):

        rt['top_speed'].append({
            'id': row.id,
            'name': row.name,
            'num': row.followers
        })

    user = auth.get_user()
    if user is None:
        rt['login_info'] = auth.get_login_info()

    else:
        rt['my_follows'] = []
        for row in sakuya_db.\
                   query(Follows).\
                   filter_by(follower=user['userid']).\
                   limit(8):

            chart = sakuya_db.query(Charts).get(row.cid)
            if chart is None:
                continue
            rt['my_follows'].append({
                'id': chart.id,
                'name': haopan.format_title(chart.name)
            })

        rt['my_charts'] = []
        for row in sakuya_db.\
                   query(Charts).\
                   filter_by(owner=user['username']).\
                   limit(8):

            rt['my_charts'].append({
                'id': row.id,
                'name': row.name
            })

    return rt
Пример #21
0
def index(sakuya_db):

    rt = {}
    rt['stats'] = {
        'charts': sakuya_db.query(Charts).count(),
        'users': sakuya_db.query(Users).count(),
        'follows': sakuya_db.query(Follows).count()
    }

    rt['events'] = []
    for row in sakuya_db.\
               query(Events).\
               order_by(Events.id.desc()).\
               limit(7):

        if row.type == Events.CONST_TYPE_CRITICAL:
            type_text = 'Critical'
        else:
            type_text = 'Warning'

        rt['events'].append({
            'cid': row.cid,
            'info': row.info,
            'time': row.time.strftime('%H:%M'),
            'type': type_text
        })

    rt['top_monitor'] = []
    for row in sakuya_db.\
               query(Charts).\
               filter_by(root_category=2).\
               order_by(Charts.followers.desc(), Charts.id).\
               limit(7):

        rt['top_monitor'].append({
            'id': row.id,
            'name': haopan.format_title(row.name),
            'num': row.followers
        })

    rt['top_speed'] = []
    for row in sakuya_db.\
               query(Charts).\
               filter_by(root_category=3).\
               order_by(Charts.followers.desc(), Charts.id).\
               limit(7):

        rt['top_speed'].append({
            'id': row.id,
            'name': row.name,
            'num': row.followers
        })

    user = auth.get_user()
    if user is None:
        rt['login_info'] = auth.get_login_info()

    else:
        rt['my_follows'] = []
        for row in sakuya_db.\
                   query(Follows).\
                   filter_by(follower=user['userid']).\
                   limit(8):

            chart = sakuya_db.query(Charts).get(row.cid)
            if chart is None:
                continue
            rt['my_follows'].append({
                'id': chart.id,
                'name': haopan.format_title(chart.name)
            })

        rt['my_charts'] = []
        for row in sakuya_db.\
                   query(Charts).\
                   filter_by(owner=user['username']).\
                   limit(8):

            rt['my_charts'].append({'id': row.id, 'name': row.name})

    return rt
Пример #22
0
def update(sakuya_db, id):

    row = sakuya_db.query(Charts).get(id)
    if row is None:
        abort(404)

    is_haopan = haopan.is_haopan(row.cate_id)

    if auth.is_role('sa'):
        warn_only = False
    elif auth.is_role('haopan') and is_haopan:
        warn_only = True
    elif auth.get_user()['username'] == row.owner:
        warn_only = True
    else:
        abort(403)

    rule = None
    warn = None

    def error(msg):
        rt = _rt(sakuya_db)
        rt['id'] = id
        rt['editing'] = True
        rt['warn_only'] = warn_only
        rt['is_haopan'] = is_haopan
        rt['forms'] = request.forms
        rt['forms']['rule'] = dump_rule(rule)
        rt['forms']['warn'] = dump_warn(warn)
        rt['error_msg'] = msg
        return rt

    try:

        alert_enable = request.forms['alert_enable'] == '1'
        warn = make_warn()
        if alert_enable and not warn:
            raise ValueError

        if not warn_only and not is_haopan:

            use_storm = request.forms['use_storm'] == '1'
            if use_storm:
                rule = make_rule()
                if not rule['datasource'] or not rule['filters']:
                    raise ValueError

            name = request.forms['name']
            if not name:
                raise ValueError

            cid = int(request.forms['cid'])
            if not sakuya_db.\
                   query(Categories).\
                   filter_by(id=cid, is_parent=False).\
                   count():
                raise ValueError

            owner = request.forms['owner']
            if not sakuya_db.\
                   query(Users).\
                   filter_by(username=owner).\
                   count():
                raise ValueError

    except Exception:
        return error('参数错误。')

    try:
        row.alert_enable = int(alert_enable)
        row.warnings = 0
        row.criticals = 0
        process_warn_rules(sakuya_db, id, warn)

        if not warn_only and not is_haopan:
            row.name = name
            row.cate_id = cid
            row.root_category = get_parent_category(sakuya_db, cid)
            row.owner = owner

            ext = row.get_ext()
            if use_storm:
                ext['rule'] = rule
                storm.set_rule(id, json.dumps(rule))
            else:
                ext.pop('rule', None)
                storm.delete_rule(id)
            row.ext_info = json.dumps(ext)

        sakuya_db.commit()

    except Exception:
        traceback.print_exc()
        sakuya_db.rollback()
        return error('图表更新失败。')

    if warn_only or is_haopan:
        redirect('/chart/%d' % id)
    redirect('/admin/category/%d' % cid)