Пример #1
0
def on_wapt_pong():
    uuid = None
    try:
        uuid = session.get('uuid')
        if not uuid:
            logger.critical(u'SocketIO %s connected but no host uuid in session: asking connected host to reconnect' % (request.sid))
            emit('wapt_force_reconnect')
            return False
        else:
            logger.debug(u'Socket.IO pong from wapt client sid %s (uuid: %s)' % (request.sid, session.get('uuid',None)))
            # stores sid in database
            try:
                if wapt_db.is_closed():
                    wapt_db.connect()
                with wapt_db.atomic() as trans:
                    hostcount = Hosts.update(
                        server_uuid=get_server_uuid(),
                        listening_timestamp=datetime2isodate(),
                        listening_protocol='websockets',
                        listening_address=request.sid,
                        reachable='OK',
                    ).where(Hosts.uuid == uuid).execute()
                    # if not known, reject the connection
                    if hostcount == 0:
                        logger.warning(u'SocketIO sid %s connected but no match in database for uuid %s : asking to reconnect' % (request.sid,uuid))
                        emit('wapt_force_reconnect')
                        return False
            finally:
                if not wapt_db.is_closed():
                    wapt_db.close()
            return True
    except Exception as e:
        logger.critical(u'SocketIO pong error for uuid %s and sid %s : %s, instance: %s' % (uuid,request.sid,traceback.format_exc(),app.conf.get('application_root')))
        return False
Пример #2
0
def on_waptclient_connect():
    try:
        uuid = request.args.get('uuid', None)
        if not uuid:
            raise EWaptForbiddden('Missing source host uuid')
        allow_unauthenticated_connect = app.conf.get(
            'allow_unauthenticated_connect', False)
        if not allow_unauthenticated_connect:
            try:
                token_gen = get_secured_token_generator()
                token_data = token_gen.loads(request.args['token'])
                uuid = token_data.get('uuid', None)
                if not uuid:
                    raise EWaptAuthenticationFailure('Bad host UUID')
                if token_data['server_uuid'] != get_server_uuid():
                    raise EWaptAuthenticationFailure('Bad server UUID')
            except Exception as e:
                raise EWaptAuthenticationFailure(
                    u'SocketIO connection not authorized, invalid token: %s' %
                    e)
            logger.info(
                u'Socket.IO connection from wapt client sid %s (uuid: %s fqdn:%s)'
                % (request.sid, uuid, token_data.get('computer_fqdn')))
        else:
            logger.info(
                u'Unauthenticated Socket.IO connection from wapt client sid %s (uuid: %s)'
                % (request.sid, uuid))

        with WaptDB():
            # update the db
            with wapt_db.atomic() as trans:
                # stores sid in database
                hostcount = Hosts.update(
                    server_uuid=get_server_uuid(),
                    listening_protocol='websockets',
                    listening_address=request.sid,
                    listening_timestamp=datetime2isodate(),
                    last_seen_on=datetime2isodate()).where(
                        Hosts.uuid == uuid).execute()
                # if not known, reject the connection
                if hostcount == 0:
                    raise EWaptForbiddden('Host is not registered')

            session['uuid'] = uuid
        return True

    except Exception as e:
        if 'uuid' in session:
            session.pop('uuid')
        logger.warning(
            u'SocketIO connection refused for uuid %s, sid %s: %s, instance %s'
            % (uuid, request.sid, e, app.conf.get('application_root')))
        disconnect()
        return False
Пример #3
0
def on_waptclient_disconnect():
    uuid = session.get('uuid', None)
    logger.info(u'Socket.IO disconnection from wapt client sid %s (uuid: %s)' %
                (request.sid, uuid))
    # clear sid in database
    with WaptDB():
        with wapt_db.atomic() as trans:
            Hosts.update(
                listening_timestamp=datetime2isodate(),
                listening_protocol=None,
                listening_address=None,
                reachable='DISCONNECTED',
            ).where((Hosts.uuid == uuid)
                    & (Hosts.listening_address == request.sid)).execute()
    return True