Exemplo n.º 1
0
def do_compliance_state(compliance_name=''):
    uri = '/compliance/state'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return

    try:
        compliances = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_h1('Compliances')
    packs = {}
    for (cname, compliance) in compliances.items():
        if compliance_name and compliance['name'] != compliance_name:
            continue
        pack_name = compliance['pack_name']
        if pack_name not in packs:
            packs[pack_name] = {}
        packs[pack_name][cname] = compliance
    pnames = list(packs.keys())  # python3
    pnames.sort()
    for pname in pnames:
        pack_entries = packs[pname]
        cprint('* Pack %s' % pname, color='blue')
        cnames = list(pack_entries.keys())  # python3
        cnames.sort()
        for cname in cnames:
            cprint('  - %s' % pname, color='blue', end='')
            compliance = pack_entries[cname]
            __print_compliance_entry(compliance)
Exemplo n.º 2
0
def do_detect_list():
    try:
        (code, r) = get_opsbro_local('/agent/detectors')
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        d = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_info_title('Detectors')
    logger.debug(str(d))
    e = []
    d = sorted(d, key=lambda i: i['name'])
    for i in d:
        # aligne name too
        name = '%-20s' % i['name'].split('/')[-1]
        groups = i['add_groups']
        # align pack level
        pack_level = '%-6s' % i['pack_level']
        # Aligne pack name
        pack_name = '%-10s' % i['pack_name']
        
        print_element_breadcumb(pack_name, pack_level, 'detector', name, set_pack_color=True)
        cprint('')
        cprint('   if:         ', color='grey', end='')
        cprint(i['apply_if'], color='green')
        cprint('   add groups: ', color='grey', end='')
        cprint(','.join(groups), color='magenta')
Exemplo n.º 3
0
def do_kv_store_wait_exists(key_name, timeout=30):
    import itertools
    spinners = itertools.cycle(CHARACTERS.spinners)

    for i in range(timeout):
        try:
            (code, value) = get_opsbro_local('/kv/%s' % key_name)
        except get_request_errors() as exp:
            logger.error('Cannot join opsbro agent for info: %s' % exp)
            sys.exit(1)

        if code == 200:
            cprint('\n %s ' % CHARACTERS.arrow_left, color='grey', end='')
            cprint('%s ' % CHARACTERS.check, color='green', end='')
            cprint('The key ', end='')
            cprint('%s' % key_name, color='magenta', end='')
            cprint(' does ', end='')
            cprint('Exists', color='green')
            sys.exit(0)
        # Not detected? increase loop
        cprint('\r %s ' % next(spinners), color='blue', end='')
        cprint('%s' % key_name, color='magenta', end='')
        cprint(' is ', end='')
        cprint('not Existing', color='magenta', end='')
        cprint(' (%d/%d)' % (i, timeout), end='')
        # As we did not \n, we must flush stdout to print it
        sys.stdout.flush()
        time.sleep(1)
    cprint("\nThe key %s was not set after %s seconds" % (key_name, timeout))
    sys.exit(2)
Exemplo n.º 4
0
def do_detect_history():
    uri = '/agent/detectors/history'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        histories = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_h1('Detected groups history for this node')
    
    for history in histories:
        epoch = history['date']
        # We want only group type events
        entries = [entry for entry in history['entries'] if entry['type'] in ('group-add', 'group-remove')]
        if not entries:
            continue
        print_h2('  Date: %s ' % time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(epoch)))
        for entry in entries:
            _type = entry['type']
            op = {'group-add': '+', 'group-remove': '-'}.get(_type, '?')
            color = {'group-add': 'green', 'group-remove': 'red'}.get(_type, 'grey')
            cprint(' %s %s' % (op, entry['group']), color=color)
Exemplo n.º 5
0
def do_stop():
    try:
        (code, r) = get_opsbro_local('/stop')
    except get_request_errors() as exp:
        logger.error(exp)
        return
    cprint(r, color='green')
Exemplo n.º 6
0
def do_exec(group='*', cmd='uname -a'):
    if cmd == '':
        logger.error('Missing command')
        return
    # The information is available only if the agent is started
    wait_for_agent_started(visual_wait=True)

    try:
        (code, r) = get_opsbro_local('/exec/%s?cmd=%s' % (group, cmd))
    except get_request_errors() as exp:
        logger.error(exp)
        return
    print(r)
    cid = r
    print("Command group launch as cid", cid)
    time.sleep(5)  # TODO: manage a real way to get the result..
    try:
        (code, r) = get_opsbro_local('/exec-get/%s' % cid)
    except get_request_errors() as exp:
        logger.error(exp)
        return
    j = jsoner.loads(r)

    res = j['res']
    for (uuid, e) in res.items():
        node = e['node']
        nname = node['name']
        color = {
            'alive': 'green',
            'dead': 'red',
            'suspect': 'yellow',
            'leave': 'cyan'
        }.get(node['state'], 'cyan')
        cprint(nname, color=color)
        cprint('Return code:', end='')
        color = {0: 'green', 1: 'yellow', 2: 'red'}.get(e['rc'], 'cyan')
        cprint(e['rc'], color=color)
        cprint('Output:', end='')
        cprint(e['output'].strip(), color=color)
        if e['err']:
            cprint('Error:', end='')
            cprint(e['err'].strip(), color='red')
        cprint('')
Exemplo n.º 7
0
def do_kv_store_get(key_name):
    try:
        (code, value) = get_opsbro_local('/kv/%s' % key_name)
    except get_request_errors() as exp:
        logger.error('Cannot join opsbro agent for info: %s' % exp)
        sys.exit(1)
    if code == 404:
        cprint('ERROR: the key %s does not exist' % key_name, color='red')
        sys.exit(2)
    value = bytes_to_unicode(value)
    cprint("%s::%s" % (key_name, value))
Exemplo n.º 8
0
def do_evaluator_list(details=False):
    try:
        (code, r) = get_opsbro_local('/agent/evaluator/list')
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        d = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    
    # Group by
    groups = {}
    for f in d:
        fname = f['name']
        gname = f['group']
        if gname not in groups:
            groups[gname] = {}
        groups[gname][fname] = f
    
    gnames = groups.keys()
    gnames.sort()
    
    for gname in gnames:
        print_h1(gname)
        group_functions = groups[gname]
        fnames = group_functions.keys()
        fnames.sort()
        
        for fname in fnames:
            f = group_functions[fname]
            prototype = f['prototype']
            doc = f['doc']
            
            cprint(fname, color='green', end='')
            cprint('(', end='')
            if prototype:
                _s_args = []
                for arg in prototype:
                    kname = arg[0]
                    def_value = arg[1]
                    if def_value != '__NO_DEFAULT__':
                        _s_args.append('%s=%s' % (kname, def_value))
                    else:
                        _s_args.append('%s' % kname)
                cprint(', '.join(_s_args), color='yellow', end='')
            cprint(')')
            if details:
                cprint(doc, color='grey')
Exemplo n.º 9
0
def do_wait_ok(check_name, timeout=30):
    import itertools
    spinners = itertools.cycle(CHARACTERS.spinners)
    
    name = check_name
    
    state_string = 'UNKNOWN'
    for i in range(timeout):
        
        uri = '/monitoring/state'
        try:
            (code, r) = get_opsbro_local(uri)
        except get_request_errors() as exp:
            logger.error(exp)
            return
        
        try:
            states = jsoner.loads(r)
        except ValueError as exp:  # bad json
            logger.error('Bad return from the server %s' % exp)
            return
        checks = states['checks']
        check = None
        for (cname, c) in checks.items():
            if c['display_name'] == name:
                check = c
        if not check:
            logger.error("Cannot find the check '%s'" % name)
            sys.exit(2)
        state_id = check['state_id']
        
        c = STATE_ID_COLORS.get(state_id, 'cyan')
        state_string = STATE_ID_STRINGS.get(state_id, 'UNKNOWN')
        
        cprint('\r %s ' % next(spinners), color='blue', end='')
        cprint('%s' % name, color='magenta', end='')
        cprint(' is ', end='')
        cprint('%s' % state_string.ljust(10), color=c, end='')
        cprint(' (%d/%d)' % (i, timeout), end='')
        # As we did not \n, we must flush stdout to print it
        sys.stdout.flush()
        if state_id == 0:
            cprint("\nThe check %s is OK" % name)
            sys.exit(0)
        logger.debug("Current state %s" % state_id)
        
        time.sleep(1)
    cprint("\nThe check %s is not OK after %s seconds (currently %s)" % (name, timeout, state_string))
    sys.exit(2)
Exemplo n.º 10
0
def do_compliance_history():
    uri = '/compliance/history'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return

    try:
        histories = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_h1('Compliance history')

    for history in histories:
        epoch = history['date']
        entries = history['entries']
        print_h2('  Date: %s ' %
                 time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(epoch)))
        entries_by_compliances = {}
        for entry in entries:
            compliance_name = entry['compliance_name']
            pack_name = entry['pack_name']
            mode = entry['mode']
            if compliance_name not in entries_by_compliances:
                entries_by_compliances[compliance_name] = {
                    'pack_name': pack_name,
                    'mode': mode,
                    'entries': []
                }
            entries_by_compliances[compliance_name]['entries'].append(entry)
        for (compliance_name, d) in entries_by_compliances.items():
            pack_name = d['pack_name']
            mode = d['mode']
            entries = d['entries']
            cprint('  - %s' % pack_name, color='blue', end='')
            cprint(' > compliance > ', color='grey', end='')
            cprint('[%s] ' % (compliance_name.ljust(30)),
                   color='magenta',
                   end='')
            cprint('[mode:%10s] ' % mode, color='magenta')
            for entry in entries:
                # rule_name = entry['name']
                # cprint('[%s] ' % (rule_name.ljust(30)), color='magenta', end='')
                __print_rule_entry(entry)
        cprint("\n")
Exemplo n.º 11
0
def do_generators_wait_compliant(generator_name, timeout=30):
    import itertools
    spinners = itertools.cycle(CHARACTERS.spinners)

    current_state = 'UNKNOWN'
    for i in range(timeout):
        uri = '/generators/state'
        try:
            (code, r) = get_opsbro_local(uri)
        except get_request_errors() as exp:
            logger.error(exp)
            return

        try:
            generators = jsoner.loads(r)
        except ValueError as exp:  # bad json
            logger.error('Bad return from the server %s' % exp)
            return
        generator = None
        for (cname, c) in generators.items():
            if c['name'] == generator_name:
                generator = c
        if not generator:
            logger.error("Cannot find the generator '%s'" % generator_name)
            sys.exit(2)
        current_state = generator['state']
        cprint('\r %s ' % next(spinners), color='blue', end='')
        cprint('%s' % generator_name, color='magenta', end='')
        cprint(' is ', end='')
        cprint('%15s ' % current_state,
               color=GENERATOR_STATE_COLORS.get(current_state, 'cyan'),
               end='')
        cprint(' (%d/%d)' % (i, timeout), end='')
        # As we did not \n, we must flush stdout to print it
        sys.stdout.flush()
        if current_state == 'COMPLIANT':
            cprint("\nThe generator %s is compliant" % generator_name)
            sys.exit(0)
        logger.debug("Current state %s" % current_state)

        time.sleep(1)
    cprint(
        "\nThe generator %s is not compliant after %s seconds (currently %s)" %
        (generator_name, timeout, current_state))
    sys.exit(2)
Exemplo n.º 12
0
def do_history():
    uri = '/monitoring/history/checks'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        history_entries = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    
    print_h1('History')
    for history_entry in history_entries:
        epoch_date = history_entry['date']
        entries = history_entry['entries']
        print_h2('  Date: %s ' % time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(epoch_date)))
        for entry in entries:
            pname = entry['pack_name']
            
            check_display_name = entry['display_name']
            
            cprint('  - %s' % pname, color='blue', end='')
            cprint(' > checks > ', color='grey', end='')
            cprint('%s ' % (check_display_name.ljust(30)), color='magenta', end='')
            
            old_state = entry['old_state_id']
            c = STATE_ID_COLORS.get(old_state, 'cyan')
            old_state = STATE_ID_STRINGS.get(old_state, 'UNKNOWN')
            cprint('%s' % old_state.ljust(10), color=c, end='')
            
            cprint(' %s ' % CHARACTERS.arrow_left, color='grey', end='')
            
            state = entry['state_id']
            c = STATE_ID_COLORS.get(state, 'cyan')
            state = STATE_ID_STRINGS.get(state, 'UNKNOWN')
            cprint('%s' % state.ljust(10), color=c)
            
            # Now print output the line under
            output = entry['output']
            output_lines = output.strip().splitlines()
            for line in output_lines:
                cprint(' ' * 4 + '| ' + line, color='grey')
Exemplo n.º 13
0
def do_detect_state():
    try:
        (code, r) = get_opsbro_local('/agent/detectors/state')
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        groups = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    
    print_info_title('Current detected groups')
    groups.sort()
    for group in groups:
        cprint(' * ', end='')
        cprint('%s' % group, color='magenta')
Exemplo n.º 14
0
def do_join(seed=''):
    if seed == '':
        logger.error('Missing target argument. For example 192.168.0.1:6768')
        return
    # The information is available only if the agent is started
    wait_for_agent_started(visual_wait=True)

    try:
        (code, r) = get_opsbro_local('/agent/join/%s' % seed)
    except get_request_errors() as exp:
        logger.error(exp)
        return
    try:
        b = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    cprint('Joining %s : ' % seed, end='')
    if b:
        cprint('OK', color='green')
    else:
        cprint('FAILED', color='red')
Exemplo n.º 15
0
def do_detect_run():
    try:
        (code, r) = get_opsbro_local('/agent/detectors/run')
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        d = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    
    print_info_title('Detectors results')
    all_groups = []
    new_groups = []
    for (k, v) in d.items():
        all_groups.extend(v['groups'])
        new_groups.extend(v['new_groups'])
    e = [('Groups', ','.join(all_groups))]
    e.append(('New groups', {'value': ','.join(new_groups), 'color': 'green'}))
    print_2tab(e)
Exemplo n.º 16
0
def do_leave(nuuid=''):
    # The information is available only if the agent is started
    wait_for_agent_started(visual_wait=True)

    # Lookup at the localhost name first
    if not nuuid:
        try:
            nuuid = get_opsbro_json('/agent/uuid')
        except get_request_errors() as exp:
            logger.error('Cannot join opsbro agent to get our uuid: %s' % exp)
            sys.exit(2)
    uri = '/agent/leave/%s' % nuuid
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return

    if code != 200:
        logger.error('Node %s is missing (return=%s)' % (nuuid, r))
        return
    cprint('Node %s is set to leave state' % nuuid, end='')
    cprint(': OK', color='green')
Exemplo n.º 17
0
def do_generators_state(show_diff=False):
    uri = '/generators/state'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return

    try:
        generators = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_h1('Generators')
    packs = {}
    for (cname, generator) in generators.items():
        pack_name = generator['pack_name']
        if pack_name not in packs:
            packs[pack_name] = {}
        packs[pack_name][cname] = generator
    pnames = list(packs.keys())
    pnames.sort()
    for pname in pnames:
        pack_entries = packs[pname]
        cprint('* Pack %s' % pname, color='blue')
        cnames = list(pack_entries.keys())
        cnames.sort()
        for cname in cnames:
            cprint('  - %s' % pname, color='blue', end='')
            generator = pack_entries[cname]
            __print_generator_entry(generator, show_diff=show_diff)

    if not show_diff:
        cprint('')
        cprint(
            '  | Note: you can see the modification diff with the --show-diff parameter',
            color='grey')
Exemplo n.º 18
0
def do_generators_history():
    uri = '/generators/history'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return

    try:
        histories = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    print_h1('Generators history')

    for history in histories:
        epoch = history['date']
        entries = history['entries']
        print_h2('  Date: %s ' %
                 time.strftime("%a, %d %b %Y %H:%M:%S", time.localtime(epoch)))
        for entry in entries:
            cprint('  - %s' % entry['pack_name'], color='blue', end='')
            __print_generator_entry(entry, show_diff=True)
        cprint("\n")
Exemplo n.º 19
0
def do_compliance_wait_compliant(compliance_name, timeout=30, exit_if_ok=True):
    import itertools
    spinners = itertools.cycle(CHARACTERS.spinners)

    current_state = COMPLIANCE_STATES.UNKNOWN
    for i in range(timeout):  # no xrange in python3
        uri = '/compliance/state'
        try:
            (code, r) = get_opsbro_local(uri)
        except get_request_errors() as exp:
            logger.error(exp)
            return

        try:
            compliances = jsoner.loads(r)
        except ValueError as exp:  # bad json
            logger.error('Bad return from the server %s' % exp)
            return
        compliance = None
        for (cname, c) in compliances.items():
            if c['name'] == compliance_name:
                compliance = c
        if not compliance:
            logger.error("Cannot find the compliance '%s'" % compliance_name)
            sys.exit(2)
        logger.debug('Current compliance data', compliance)
        current_step = ''
        current_state = compliance['state']
        if compliance['is_running']:
            current_state = COMPLIANCE_STATES.RUNNING
            current_step = compliance['current_step']
        # Clean line
        try:
            terminal_height, terminal_width = get_terminal_size()
        except:  # beware, maybe we don't have a tty
            terminal_width = 100
        cprint('\r' + ' ' * terminal_width, end='')
        cprint('\r %s ' % next(spinners), color='blue',
               end='')  # no spinnner.next in python3
        cprint('%s' % compliance_name, color='magenta', end='')
        cprint(' is ', end='')
        cprint('%15s ' % current_state,
               color=COMPLIANCE_STATE_COLORS.get(current_state, 'cyan'),
               end='')
        cprint(' (%d/%d)' % (i, timeout), end='')
        if current_step:
            cprint(' [ in step ', end='')
            cprint(current_step, color='magenta', end='')
            cprint(' ]', end='')
        # As we did not \n, we must flush stdout to print it
        sys.stdout.flush()
        if current_state == COMPLIANCE_STATES.COMPLIANT:
            cprint("\nThe compliance rule %s is compliant" % compliance_name)
            if exit_if_ok:
                sys.exit(0)
            else:
                return
        logger.debug("Current state %s" % current_state)

        time.sleep(1)
    cprint(
        "\nThe compliance rule %s is not compliant after %s seconds (currently %s)"
        % (compliance_name, timeout, current_state))
    sys.exit(2)
Exemplo n.º 20
0
def do_state(name=''):
    uri = '/monitoring/state/%s' % name
    if not name:
        uri = '/monitoring/state'
    try:
        (code, r) = get_opsbro_local(uri)
    except get_request_errors() as exp:
        logger.error(exp)
        return
    
    try:
        d = jsoner.loads(r)
    except ValueError as exp:  # bad json
        logger.error('Bad return from the server %s' % exp)
        return
    
    services = d['services']
    print_h1('Services')
    if len(services) == 0:
        cprint('No services', color='grey')
    else:
        for (sname, service) in services.items():
            state = service['state_id']
            cprint('\t%s ' % sname.ljust(20), end='')
            c = {0: 'green', 2: 'red', 1: 'yellow', 3: 'cyan'}.get(state, 'cyan')
            state = {0: 'OK', 2: 'CRITICAL', 1: 'WARNING', 3: 'UNKNOWN'}.get(state, 'UNKNOWN')
            cprint('%s - ' % state.ljust(8), color=c, end='')
            output = service['check']['output']
            cprint(output.strip(), color='grey')
    
    checks = d['checks']
    if len(checks) == 0:
        cprint('No checks', color='grey')
        return  # nothing to do more
    
    print_h1('Checks')
    packs = {}
    for (cname, check) in checks.items():
        pack_name = check['pack_name']
        if pack_name not in packs:
            packs[pack_name] = {}
        packs[pack_name][cname] = check
    pnames = list(packs.keys())
    pnames.sort()
    for pname in pnames:
        pack_entries = packs[pname]
        cprint('* Pack %s' % pname, color='blue')
        cnames = list(pack_entries.keys())
        cnames.sort()
        for cname in cnames:
            check = pack_entries[cname]
            check_display_name = check['display_name']
            
            cprint('  - %s' % pname, color='blue', end='')
            cprint(' > checks > ', color='grey', end='')
            cprint('%s ' % (check_display_name.ljust(30)), color='magenta', end='')
            
            state = check['state_id']
            c = STATE_ID_COLORS.get(state, 'cyan')
            state = STATE_ID_STRINGS.get(state, 'UNKNOWN')
            cprint('%s' % state.ljust(10), color=c)
            # Now print output the line under
            output = check['output']
            output_lines = output.strip().splitlines()
            for line in output_lines:
                cprint(' ' * 4 + '| ' + line, color='grey')