Beispiel #1
0
    def test_good_macs(self, session, host, mac):
        interface = Interface(host=host)
        assert object_state(interface).transient

        interface.mac = mac
        session.add(interface)
        session.flush()
Beispiel #2
0
    def test_bad_macs(self, session, host, mac):
        interface = Interface(host=host)
        assert object_state(interface).transient

        with pytest.raises(InvalidMACAddressException):
            interface.mac = mac
        with pytest.raises(IntegrityError):
            session.add(interface)
            session.flush()
Beispiel #3
0
def interface_create(host, name, mac, ips, processor):
    interface = Interface(host=host, mac=mac, name=name)

    session.add(interface)

    subnets = get_subnets_for_room(interface.host.room)

    if ips is None:
        ip, _ = get_free_ip(subnets)
        ips = {ip}

    # IP added
    for ip in ips:
        subnet = next(
            iter([subnet for subnet in subnets if (ip in subnet.address)]),
            None)

        if subnet is not None:
            session.add(IP(interface=interface, address=ip, subnet=subnet))

    message = deferred_gettext(
        u"Created interface ({}, {}) with name '{}' for host '{}'.".format(
            interface.mac, ', '.join(str(ip.address) for ip in interface.ips),
            interface.name, interface.host.name))
    log_user_event(author=processor,
                   user=host.owner,
                   message=message.to_json())

    return interface
Beispiel #4
0
def move_in(user, building_id, level, room_number, mac, processor, birthdate=None,
            host_annex=False, begin_membership=True, when=None):
    """Move in a user in a given room and do some initialization.

    The user is given a new Host with an interface of the given mac, a
    UnixAccount, a finance Account, and is made member of important
    groups.  Networking is set up.

    :param User user: The user to move in
    :param int building_id:
    :param int level:
    :param str room_number:
    :param str mac: The mac address of the users pc.
    :param User processor:
    :param Date birthdate: Date of birth`
    :param bool host_annex: when true: if MAC already in use,
        annex host to new user
    :param bool begin_membership: Starts a membership if true
    :param datetime when: The date at which the user should be moved in

    :return: The user object.
    """

    if when and when > session.utcnow():
        return schedule_user_task(task_type=TaskType.USER_MOVE_IN,
                                  due=when,
                                  user=user,
                                  parameters={'building_id': building_id,
                                              'level': level,
                                              'room_number': room_number,
                                              'mac': mac,
                                              'birthdate': birthdate,
                                              'host_annex': host_annex,
                                              'begin_membership': begin_membership},
                                  processor=processor)
    else:
        room = get_room(building_id, level, room_number)

        if birthdate:
            user.birthdate = birthdate

        if begin_membership:
            if user.member_of(config.external_group):
                remove_member_of(user, config.external_group, processor,
                                 closedopen(session.utcnow(), None))

            for group in {config.member_group, config.network_access_group}:
                if not user.member_of(group):
                    make_member_of(user, group, processor, closed(session.utcnow(), None))

        if room:
            user.room = room
            user.address = room.address

            if mac and user.birthdate:
                interface_existing = Interface.q.filter_by(mac=mac).first()

                if interface_existing is not None:
                    if host_annex:
                        host_existing = interface_existing.host
                        host_existing.owner_id = user.id

                        session.session.add(host_existing)
                        migrate_user_host(host_existing, user.room, processor)
                    else:
                        raise MacExistsException
                else:
                    new_host = Host(owner=user, room=room)
                    session.session.add(new_host)
                    session.session.add(Interface(mac=mac, host=new_host))
                    setup_ipv4_networking(new_host)

        msg = deferred_gettext(u"Moved in: {room}")

        log_user_event(author=processor,
                       message=msg.format(room=room.short_name).to_json(),
                       user=user)

        return user
Beispiel #5
0
def get_interface_or_404(interface_id):
    interface = Interface.get(interface_id)
    if interface is None:
        abort(404, message=f"Interface {interface_id} does not exist")
    return interface
Beispiel #6
0
def move_in(user: User,
            building_id: int,
            level: int,
            room_number: str,
            mac: str | None,
            processor: User | None = None,
            birthdate: date = None,
            host_annex: bool = False,
            begin_membership: bool = True,
            when: datetime | None = None):
    """Move in a user in a given room and do some initialization.

    The user is given a new Host with an interface of the given mac, a
    UnixAccount, a finance Account, and is made member of important
    groups.  Networking is set up.

    :param User user: The user to move in
    :param building_id:
    :param level:
    :param room_number:
    :param mac: The mac address of the users pc.
    :param processor:
    :param birthdate: Date of birth`
    :param host_annex: when true: if MAC already in use,
        annex host to new user
    :param begin_membership: Starts a membership if true
    :param when: The date at which the user should be moved in

    :return: The user object.
    """

    if when and when > session.utcnow():
        task_params = UserMoveInParams(building_id=building_id,
                                       level=level,
                                       room_number=room_number,
                                       mac=mac,
                                       birthdate=birthdate,
                                       host_annex=host_annex,
                                       begin_membership=begin_membership)
        return schedule_user_task(task_type=TaskType.USER_MOVE_IN,
                                  due=when,
                                  user=user,
                                  parameters=task_params,
                                  processor=processor)
    if user.room is not None:
        raise ValueError("user is already living in a room.")

    room = get_room(building_id, level, room_number)

    if birthdate:
        user.birthdate = birthdate

    if begin_membership:
        for group in {config.external_group, config.pre_member_group}:
            if user.member_of(group):
                remove_member_of(user, group, processor,
                                 closedopen(session.utcnow(), None))

        for group in {config.member_group, config.network_access_group}:
            if not user.member_of(group):
                make_member_of(user, group, processor,
                               closed(session.utcnow(), None))

    if room:
        user.room = room
        user.address = room.address

        if mac and user.birthdate:
            interface_existing = Interface.q.filter_by(mac=mac).first()

            if interface_existing is not None:
                if host_annex:
                    host_existing = interface_existing.host
                    host_existing.owner_id = user.id

                    session.session.add(host_existing)
                    migrate_user_host(host_existing, user.room, processor)
                else:
                    raise MacExistsException
            else:
                new_host = Host(owner=user, room=room)
                session.session.add(new_host)
                session.session.add(Interface(mac=mac, host=new_host))
                setup_ipv4_networking(new_host)

    user_send_mail(user, UserMovedInTemplate(), True)

    msg = deferred_gettext("Moved in: {room}")

    log_user_event(author=processor if processor is not None else user,
                   message=msg.format(room=room.short_name).to_json(),
                   user=user)

    return user
Beispiel #7
0
def move_in(user,
            building,
            level,
            room_number,
            mac,
            processor,
            birthdate=None,
            traffic_group_id=None,
            host_annex=False,
            begin_membership=True):
    """Create a new user in a given room and do some initialization.

    The user is given a new Host with an interface of the given mac, a
    UnixAccount, a finance Account, and is made member of important
    groups.  Networking is set up.

    :param User user: The user to move in
    :param Building building: See :py:func:`create_member`
    :param int level: See :py:func:`create_member`
    :param str room_number: See :py:func:`create_member`
    :param str mac: The mac address of the users pc.
    :param User processor: See :py:func:`create_member
    :param Date birthdate: Date of birth`
    :param int traffic_group_id: the id of the chosen traffic group to
        be used instead of the building's default one.
    :param bool host_annex: when true: if MAC already in use,
        annex host to new user
    :param bool begin_membership: Starts a membership if true
    :return: The user object.
    """

    room = Room.q.filter_by(number=room_number, level=level,
                            building=building).one()

    user.room = room

    if birthdate:
        user.birthdate = birthdate

    if begin_membership:
        if user.member_of(config.external_group):
            remove_member_of(user, config.external_group, processor,
                             closedopen(session.utcnow(), None))

        for group in {config.member_group, config.network_access_group}:
            if not user.member_of(group):
                make_member_of(user, group, processor,
                               closed(session.utcnow(), None))

    interface_existing = Interface.q.filter_by(mac=mac).first()

    if interface_existing is not None:
        if host_annex:
            host_existing = interface_existing.host
            host_existing.owner_id = user.id

            session.session.add(host_existing)
            migrate_user_host(host_existing, user.room, processor)
        else:
            raise MacExistsException
    else:
        new_host = Host(owner=user, room=room)
        session.session.add(new_host)
        session.session.add(Interface(mac=mac, host=new_host))
        setup_ipv4_networking(new_host)

    setup_traffic_group(user, processor, traffic_group_id)
    try:
        grant_initial_credit(user)
    except NoTrafficGroup as e:
        raise ValueError("User {} could not be assigned a traffic group. "
                         "Please specify one manually.".format(user)) from e

    msg = deferred_gettext(u"Moved in: {dorm} {level}-{room}")

    log_user_event(author=processor,
                   message=msg.format(dorm=building.short_name,
                                      level=level,
                                      room=room_number).to_json(),
                   user=user)

    return user
Beispiel #8
0
def interface_edit(interface_id):
    if (interface := Interface.get(interface_id)) is None:
        flash("Interface existiert nicht.", 'error')
        abort(404)