예제 #1
0
파일: rules.py 프로젝트: 0dadj1an/exafs
def ipv4_rule():
    net_ranges = get_user_nets(session['user_id'])
    form = IPv4Form(request.form)

    # add values to form instance
    form.action.choices = get_user_actions(session['user_role_ids'])

    form.net_ranges = net_ranges

    if request.method == 'POST' and form.validate():

        model = get_ipv4_model_if_exists(form.data, 1)

        if model:
            model.expires = round_to_ten_minutes(webpicker_to_datetime(form.expires.data))
            flash_message = u'Existing IPv4 Rule found. Expiration time was updated to new value.'
        else:
            model = Flowspec4(
                source=form.source.data,
                source_mask=form.source_mask.data,
                source_port=form.source_port.data,
                destination=form.dest.data,
                destination_mask=form.dest_mask.data,
                destination_port=form.dest_port.data,
                protocol=form.protocol.data,
                flags=";".join(form.flags.data),
                packet_len=form.packet_len.data,
                expires=round_to_ten_minutes(webpicker_to_datetime(form.expires.data)),
                comment=quote_to_ent(form.comment.data),
                action_id=form.action.data,
                user_id=session['user_id'],
                rstate_id=get_state_by_time(webpicker_to_datetime(form.expires.data))
            )
            flash_message = u'IPv4 Rule saved'
            db.session.add(model)

        db.session.commit()
        flash(flash_message, 'alert-success')

        # announce route if model is in active state
        if model.rstate_id == 1:
            route = messages.create_ipv4(model, constants.ANNOUNCE)
            announce_route(route)

        # log changes
        log_route(session['user_id'], model, RULE_TYPES['IPv4'])

        return redirect(url_for('index'))
    else:
        for field, errors in form.errors.items():
            for error in errors:
                print(u"Error in the %s field - %s" % (
                    getattr(form, field).label.text,
                    error
                ))

    default_expires = datetime.now() + timedelta(days=7)
    form.expires.data = datetime_to_webpicker(default_expires)

    return render_template('forms/ipv4_rule.j2', form=form, action_url=url_for('rules.ipv4_rule'))
예제 #2
0
파일: rules.py 프로젝트: 0dadj1an/exafs
def announce_all_routes(action=constants.ANNOUNCE):
    """
    get routes from db and send it to ExaBGB api

    @TODO take the request away, use some kind of messaging (maybe celery?)
    :param action: action with routes - announce valid routes or withdraw expired routes
    """
    today = datetime.now()
    comp_func = ge if action == constants.ANNOUNCE else lt

    rules4 = db.session.query(Flowspec4).filter(Flowspec4.rstate_id == 1).filter(
        comp_func(Flowspec4.expires, today)).order_by(
        Flowspec4.expires.desc()).all()
    rules6 = db.session.query(Flowspec6).filter(Flowspec6.rstate_id == 1).filter(
        comp_func(Flowspec6.expires, today)).order_by(
        Flowspec6.expires.desc()).all()
    rules_rtbh = db.session.query(RTBH).filter(RTBH.rstate_id == 1).filter(comp_func(RTBH.expires, today)).order_by(
        RTBH.expires.desc()).all()

    output4 = [messages.create_ipv4(rule, action) for rule in rules4]
    output6 = [messages.create_ipv6(rule, action) for rule in rules6]
    output_rtbh = [messages.create_rtbh(rule, action) for rule in rules_rtbh]

    output = []
    output.extend(output4)
    output.extend(output6)
    output.extend(output_rtbh)

    for message in output:
        requests.post(app.config.get('EXA_API_URL'), data={'command': message})

    if action == constants.WITHDRAW:
        _a = [set_withdraw_state(rule) for rule in rules4]
        _a = [set_withdraw_state(rule) for rule in rules6]
        _a = [set_withdraw_state(rule) for rule in rules_rtbh]
예제 #3
0
파일: apiv1.py 프로젝트: 0dadj1an/exafs
def create_ipv4(current_user):
    """
    Api method for new IPv4 rule
    :param data: parsed json request
    :param current_user: data from jwt token
    :return: json response
    """
    net_ranges = get_user_nets(current_user['id'])
    json_request_data = request.get_json()
    form = IPv4Form(data=json_request_data, meta={'csrf': False})
    # add values to form instance
    form.action.choices = get_user_actions(current_user['role_ids'])
    form.net_ranges = net_ranges

    # if the form is not valid, we should return 404 with errors
    if not form.validate():
        form_errors = get_form_errors(form)
        if form_errors:
            return jsonify(form_errors), 400

    model = get_ipv4_model_if_exists(form.data, 1)

    if model:
        model.expires, pref_format = parse_api_time(form.expires.data)
        flash_message = u'Existing IPv4 Rule found. Expiration time was updated to new value.'
    else:
        expires, pref_format = parse_api_time(form.expires.data)
        model = Flowspec4(source=form.source.data,
                          source_mask=form.source_mask.data,
                          source_port=form.source_port.data,
                          destination=form.dest.data,
                          destination_mask=form.dest_mask.data,
                          destination_port=form.dest_port.data,
                          protocol=form.protocol.data,
                          flags=";".join(form.flags.data),
                          packet_len=form.packet_len.data,
                          expires=expires,
                          comment=quote_to_ent(form.comment.data),
                          action_id=form.action.data,
                          user_id=current_user['id'],
                          rstate_id=get_state_by_time(expires))
        flash_message = u'IPv4 Rule saved'
        db.session.add(model)

    db.session.commit()

    # announce route if model is in active state
    if model.rstate_id == 1:
        route = messages.create_ipv4(model, ANNOUNCE)
        announce_route(route)

    # log changes
    log_route(current_user['id'], model, RULE_TYPES['IPv4'])

    pref_format = output_date_format(json_request_data, pref_format)
    return jsonify({
        'message': flash_message,
        'rule': model.to_dict(pref_format)
    }), 201