void AlarmTrapSender::issue_alarm(const std::string& issuer, const std::string& identifier)
{
  unsigned int index;
  unsigned int severity;

  if (sscanf(identifier.c_str(), "%u.%u", &index, &severity) != 2)
  {
    snmp_log(LOG_ERR, "malformed alarm identifier: %s", identifier.c_str());
    return;
  }

  AlarmTableDef& alarm_table_def = AlarmTableDefs::get_instance().get_definition(index, severity);

  if (alarm_table_def.is_valid())
  {
    if (_active_alarms.update(alarm_table_def, issuer))
    {
      if (!AlarmFilter::get_instance().alarm_filtered(index, severity))
      {
        send_trap(alarm_table_def);
      }
    }
  }
  else
  {
    snmp_log(LOG_ERR, "unknown alarm definition: %s", identifier.c_str());
  }
}
Ejemplo n.º 2
0
/*
 * Отсылка trap-ов, возвращает:
 *   0 - не требуется посылки trap-ов
 *   >0 - успешная отсылка всех имеющихся trap-ов
 *   <0 - неудачная отсылка
 */
static small_int_t trap_try (void)
{
	small_int_t result = 0;
	trap_t* t, *e;

	t = first; e = last;
	while (t != e) {
		if (trap_should_delay (t)) {
			/* Trap должен быть задержен,
			 * переставим его в конец очереди и продолжим. */
			*last = *t;
			last = trap_queue_next (last);
		} else if (send_trap (t)) {
			/* Пакет отправлен удачно. */
			result = 1;
		} else {
			/* Ошибка отсылки trap-пакетов. */
			result = -1;
			break;	/* перестаем посылать trap-пакеты */
		}
		delay_ds = 0;
		t = trap_queue_next (t);
	}
	first = t;
	return result;
}
Ejemplo n.º 3
0
int process_send_trap(char *trap_name)
{
	int i;

	for (i = 0; traps[i].trap_name; i++)
		if (strcmp(traps[i].trap_name, trap_name) == 0)
			return send_trap(trap_name, traps[i].build_func);
	ibdiag_show_usage();
	return 1;
}
void AlarmTrapSender::sync_alarms(bool do_clear)
{
  AlarmTableDefs& defs = AlarmTableDefs::get_instance();

  if (do_clear)
  {
    for (AlarmTableDefsIterator it = defs.begin(); it != defs.end(); it++)
    {
      if (it->severity() == AlarmDef::CLEARED)
      {
        send_trap(*it);
      }
    }
  }

  for (ActiveAlarmIterator it = _active_alarms.begin(); it != _active_alarms.end(); it++)
  {
    send_trap(it->alarm_table_def());
  }
}
Ejemplo n.º 5
0
int main(int argc, char **argv)
{
	int mgmt_classes[2] = { IB_SMI_CLASS, IB_SMI_DIRECT_CLASS };
	int ch = 0;
	char *trap_name = NULL;
	char *ca = NULL;
	int ca_port = 0;

	static char const str_opts[] = "hVP:C:";
	static const struct option long_opts[] = {
		{"Version", 0, 0, 'V'},
		{"P", 1, 0, 'P'},
		{"C", 1, 0, 'C'},
		{"help", 0, 0, 'h'},
		{}
	};

	argv0 = argv[0];

	while ((ch = getopt_long(argc, argv, str_opts, long_opts, NULL)) != -1) {
		switch (ch) {
		case 'V':
			fprintf(stderr, "%s %s\n", argv0, get_build_version());
			exit(-1);
		case 'C':
			ca = optarg;
			break;
		case 'P':
			ca_port = strtoul(optarg, NULL, 0);
			break;
		case 'h':
		default:
			usage();
		}
	}
	argc -= optind;
	argv += optind;

	if (!argv[0]) {
		trap_name = traps[0].trap_name;
	} else {
		trap_name = argv[0];
	}

	madrpc_show_errors(1);
	madrpc_init(ca, ca_port, mgmt_classes, 2);

	return (send_trap(trap_name));
}
Ejemplo n.º 6
0
static void set_issm(Port *port, unsigned issm)
{
	uint32_t old_capmask, capmask;

	capmask = mad_get_field(port->portinfo, 0, IB_PORT_CAPMASK_F);
	old_capmask = capmask;
	if (issm)
		capmask |= CAPMASK_ISSM;
	else
		capmask &= ~CAPMASK_ISSM;
	mad_set_field(port->portinfo, 0, IB_PORT_CAPMASK_F, capmask);
	if (old_capmask != capmask && capmask&(CAPMASK_ISNOTICE|CAPMASK_ISTRAP)
	    && capmask&CAPMASK_ISCAPMASKTRAP)
		send_trap(port, TRAP_144);
}
void AlarmTrapSender::clear_alarms(const std::string& issuer)
{
  AlarmTableDefs& defs = AlarmTableDefs::get_instance();

  ActiveAlarmIterator it = _active_alarms.begin();
  while (it != _active_alarms.end())
  {
    if (it->issuer() == issuer)
    {
      AlarmTableDef& clear_def = defs.get_definition(it->alarm_table_def().index(), AlarmDef::CLEARED);

      if (!AlarmFilter::get_instance().alarm_filtered(clear_def.index(), clear_def.severity()))
      {
        send_trap(clear_def);
      }

      _active_alarms.remove(it);
    }
    else
    {
      ++it;
    }
  }
}