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'}
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='取消失败')
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='订阅失败')
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)
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 }
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='订阅失败')
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}
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'))
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
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
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
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='取消失败')
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)
'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
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
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
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