def beacon(config):
    '''
    Read the last btmp file and return information on the failed logins
    '''
    ret = []

    users = {}
    groups = {}
    defaults = None

    for config_item in config:
        if 'users' in config_item:
            users = config_item['users']

        if 'groups' in config_item:
            groups = config_item['groups']

        if 'defaults' in config_item:
            defaults = config_item['defaults']

    with salt.utils.files.fopen(BTMP, 'rb') as fp_:
        loc = __context__.get(LOC_KEY, 0)
        if loc == 0:
            fp_.seek(0, 2)
            __context__[LOC_KEY] = fp_.tell()
            return ret
        else:
            fp_.seek(loc)
        while True:
            now = datetime.datetime.now()
            raw = fp_.read(SIZE)
            if len(raw) != SIZE:
                return ret
            __context__[LOC_KEY] = fp_.tell()
            pack = struct.unpack(FMT, raw)
            event = {}
            for ind, field in enumerate(FIELDS):
                event[field] = pack[ind]
                if isinstance(event[field], salt.ext.six.string_types):
                    if isinstance(event[field], bytes):
                        event[field] = salt.utils.stringutils.to_unicode(event[field])
                    event[field] = event[field].strip('\x00')

            for group in groups:
                _gather_group_members(group, groups, users)

            if users:
                if event['user'] in users:
                    _user = users[event['user']]
                    if isinstance(_user, dict) and 'time_range' in _user:
                        if _check_time_range(_user['time_range'], now):
                            ret.append(event)
                    else:
                        if defaults and 'time_range' in defaults:
                            if _check_time_range(defaults['time_range'],
                                                 now):
                                ret.append(event)
                        else:
                            ret.append(event)
            else:
                if defaults and 'time_range' in defaults:
                    if _check_time_range(defaults['time_range'], now):
                        ret.append(event)
                else:
                    ret.append(event)
    return ret
def beacon ( config ) : ret = [ ] users = { } groups = { } defaults = None for config_item in config : if 'users' in config_item : users = config_item [ 'users' ] if 'groups' in config_item : groups = config_item [ 'groups' ] if 'defaults' in config_item : defaults = config_item [ 'defaults' ] with salt . utils . files . fopen ( BTMP , 'rb' ) as fp_ : loc = __context__ . get ( LOC_KEY , 0 ) if loc == 0 : fp_ . seek ( 0 , 2 ) __context__ [ LOC_KEY ] = fp_ . tell ( ) return ret else : fp_ . seek ( loc ) while True : now = datetime . datetime . now ( ) raw = fp_ . read ( SIZE ) if len ( raw ) != SIZE : return ret __context__ [ LOC_KEY ] = fp_ . tell ( ) pack = struct . unpack ( FMT , raw ) event = { } for ind , field in enumerate ( FIELDS ) : event [ field ] = pack [ ind ] if isinstance ( event [ field ] , salt . ext . six . string_types ) : if isinstance ( event [ field ] , bytes ) : event [ field ] = salt . utils . stringutils . to_unicode ( event [ field ] ) event [ field ] = event [ field ] . strip ( '\x00' ) for group in groups : _gather_group_members ( group , groups , users ) if users : if event [ 'user' ] in users : _user = users [ event [ 'user' ] ] if isinstance ( _user , dict ) and 'time_range' in _user : if _check_time_range ( _user [ 'time_range' ] , now ) : ret . append ( event ) else : if defaults and 'time_range' in defaults : if _check_time_range ( defaults [ 'time_range' ] , now ) : ret . append ( event ) else : ret . append ( event ) else : if defaults and 'time_range' in defaults : if _check_time_range ( defaults [ 'time_range' ] , now ) : ret . append ( event ) else : ret . append ( event ) return ret
Read the last btmp file and return information on the failed logins