//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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) }
//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)) }
//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)) }
//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) }