Exemple #1
0
//export organize
func organize(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	var err error
	producer := (*nurs.Producer)(cproducer)
	priv := &nfctPriv{}

	priv.nl, err = mnl.NewSocket(C.NETLINK_NETFILTER)
	if err != nil {
		nurs.Log(nurs.ERROR, "mnl_socket_open: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	if err = priv.nl.Bind(C.NF_NETLINK_CONNTRACK_NEW|
		C.NF_NETLINK_CONNTRACK_UPDATE|
		C.NF_NETLINK_CONNTRACK_DESTROY,
		mnl.MNL_SOCKET_AUTOPID); err != nil {
		nurs.Log(nurs.ERROR, "mnl_socket_bind: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	if priv.fd, err = nurs.NewFd(priv.nl.Fd(), nurs.FD_F_READ); err != nil {
		nurs.Log(nurs.ERROR, "failed to create nurs_fd: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	privs[producer] = priv
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #2
0
//export interp
func interp(cplugin *C.struct_nurs_plugin, cinput *C.struct_nurs_input) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	priv := privs[plugin]
	input := (*nurs.Input)(cinput)
	buf := make([]byte, 4096)

	i, err := input.U32(0)
	if err != nil {
		nurs.Log(nurs.ERROR, "failed to get message type: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}
	msg_type := nfct.ConntrackMsgType(i)

	ptr, err := input.Pointer(1)
	if err != nil {
		nurs.Log(nurs.ERROR, "failed to get input pointer1: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}
	ct := (*nfct.Conntrack)(ptr)

	n, _ := ct.Snprintf(buf, msg_type, nfct.NFCT_O_DEFAULT, 0)
	priv.log.Printf("%s\n", string(buf[:n]))

	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #3
0
//export tickStop
func tickStop(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	producer := (*nurs.Producer)(cproducer)
	priv := privs[producer]

	if err := priv.timer.Del(); err != nil {
		nurs.Log(nurs.ERROR, "failed to del timer\n")
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #4
0
//export tickStart
func tickStart(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	producer := (*nurs.Producer)(cproducer)
	priv := privs[producer]

	if err := priv.timer.AddInterval(1, 1); err != nil {
		nurs.Log(nurs.ERROR, "failed to add itimer\n")
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #5
0
//export stop
func stop(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	producer := (*nurs.Producer)(cproducer)
	priv := privs[producer]

	if err := priv.fd.Unregister(); err != nil {
		nurs.Log(nurs.ERROR, "failed to unregister fd: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #6
0
//export tickDisorganize
func tickDisorganize(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	producer := (*nurs.Producer)(cproducer)
	priv := privs[producer]

	if err := priv.timer.Destroy(); err != nil {
		nurs.Log(nurs.ERROR, "failed to destroy timer\n")
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	delete(privs, producer)
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #7
0
//export disorganize
func disorganize(cplugin *C.struct_nurs_plugin) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	priv := privs[plugin]

	priv.log = log.New(os.Stderr, "", log.LstdFlags)
	if err := priv.file.Close(); err != nil {
		nurs.Log(nurs.ERROR, "failed to close logfile: %s\n", err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	delete(privs, plugin)
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #8
0
//export tickOrganize
func tickOrganize(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	var err error
	producer := (*nurs.Producer)(cproducer)
	priv := &tickPriv{}

	if priv.timer, err = nurs.NewTimer(timerCb, producer); err != nil {
		nurs.Log(nurs.ERROR, "failed to create timer\n")
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	config := producer.Config()
	priv.myname, _ = config.String(0)

	privs[producer] = priv
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #9
0
//export organize
func organize(cplugin *C.struct_nurs_plugin) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	config := plugin.Config()
	priv := &nfctPriv{}
	var err error

	fname, _ := config.String(0)
	priv.file, err = os.OpenFile(fname, os.O_CREATE|os.O_WRONLY, 0)
	if err != nil {
		nurs.Log(nurs.ERROR, "failed to open file %s: %s\n", fname, err)
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	priv.log = log.New(priv.file, "", log.LstdFlags)

	privs[plugin] = priv
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #10
0
//export tickOrganize
func tickOrganize(cplugin *C.struct_nurs_plugin) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	config := plugin.Config()
	priv := &tickPriv{}
	priv.name, _ = config.String(0)
	privs[plugin] = priv

	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #11
0
//export disorganize
func disorganize(cproducer *C.struct_nurs_producer) C.enum_nurs_return_t {
	var err error
	producer := (*nurs.Producer)(cproducer)
	priv := privs[producer]
	failed := false

	priv.fd.Destroy()
	if err = priv.nl.Close(); err != nil {
		failed = true
		nurs.Log(nurs.ERROR, "failed to close mnl_socket: %s\n", err)
	}

	if failed {
		return C.enum_nurs_return_t(nurs.RET_ERROR)
	}

	delete(privs, producer)
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #12
0
//export tickInterp
func tickInterp(cplugin *C.struct_nurs_plugin, cinput *C.struct_nurs_input) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	input := (*nurs.Input)(cinput)

	name := privs[plugin].name
	v, _ := input.U64(0)
	s, _ := input.String(1)
	nurs.Log(nurs.INFO, "counter x 1: %d, %s -> %s\n", v, s, name)
	return C.enum_nurs_return_t(nurs.RET_OK)
}
Exemple #13
0
//export goTimerCb
func goTimerCb(timer *C.struct_nurs_timer, data unsafe.Pointer) C.enum_nurs_return_t {
	tcb := (*timerCbData)(data)
	return C.enum_nurs_return_t(tcb.cb((*Timer)(timer), tcb.data))
}
Exemple #14
0
//export goFdCb
func goFdCb(fd C.int, when C.uint16_t, data unsafe.Pointer) C.enum_nurs_return_t {
	fcb := (*fdCbData)(data)
	return C.enum_nurs_return_t(fcb.cb(int(fd), FdEvent(when), fcb.data))
}
Exemple #15
0
//export tickDisorganize
func tickDisorganize(cplugin *C.struct_nurs_plugin) C.enum_nurs_return_t {
	plugin := (*nurs.Plugin)(cplugin)
	delete(privs, plugin)

	return C.enum_nurs_return_t(nurs.RET_OK)
}