aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Nazaryev <sergey@nazaryev.ru>2018-11-06 16:49:15 +0000
committerSergey Nazaryev <sergey@nazaryev.ru>2018-11-06 16:54:01 +0000
commit013563a8065725111b093c9be200485b02354685 (patch)
tree2a18dba5ef3d81aa0278105fcfaadece162855de
parenta81fb2b2681fe901079aa380b5008252e175387c (diff)
downloadifstat-013563a8065725111b093c9be200485b02354685.zip
ifstat-013563a8065725111b093c9be200485b02354685.tar.gz
ifstat-013563a8065725111b093c9be200485b02354685.tar.bz2
Избавился от вызова bcc-probe для запуска ifstatd, добавил логирование
-rw-r--r--README.md4
-rwxr-xr-xifstatd.lua44
2 files changed, 39 insertions, 9 deletions
diff --git a/README.md b/README.md
index 624feff..83044f4 100644
--- a/README.md
+++ b/README.md
@@ -37,8 +37,8 @@ ifstat
## Запуск и конфигурация
```shell
-sudo bcc/src/lua/bcc-probe ifstatd.lua # сервер (компиляция, инъекция eBPF, отправка)
-./ifstat.lua # клиент (отображение статистики от сервера)
+sudo ./ifstatd.lua # сервер (компиляция, инъекция eBPF, отправка)
+./ifstat.lua # клиент (отображение статистики от сервера)
```
В качестве конфига используется находящийся рядом с `ifstatd.lua`
diff --git a/ifstatd.lua b/ifstatd.lua
index b5098e4..09c7a27 100755
--- a/ifstatd.lua
+++ b/ifstatd.lua
@@ -1,3 +1,8 @@
+#!/usr/bin/env luajit
+
+require "ubus"
+require "uloop"
+
local ANY = -1
local MAX_FILTER_COUNT = 5
@@ -52,7 +57,7 @@ local defines_to_cflags = function(filters)
return cflags
end
-local get_ifstat_data = function(bpf, filters)
+local serialize_ifstat_data = function(bpf, filters)
local ifstat_data = {}
local filter_data_columns = {
@@ -89,7 +94,6 @@ local inject_ifstat_bpf = function(BPF, iface, filters)
local cflags = defines_to_cflags(defines)
local bpf = BPF:new{src_file="ifstat_kern.c", debug=0, cflags=cflags}
bpf:attach_xdp{device=iface, fn_name="packet_handler"}
- -- TODO: error check
return bpf
end
@@ -107,24 +111,25 @@ end
local ubus_objects = { ifstat = {} }
-return function(BPF)
- local config = parse_config()
+local main_loop = function(BPF, config)
+ local conn = ubus.connect()
local iface = config["iface"]
local filters = config["filters"]
local delay = config["delay_ms"]
- local conn = ubus.connect()
if not conn then
error("Failed to connect to ubus")
end
+ log.info("Connected to ubus")
conn:add(ubus_objects)
- local bpf = inject_ifstat_bpf(BPF, iface, filters)
+ local ifstat = inject_ifstat_bpf(BPF, iface, filters)
+ log.info("eBPF/XDP injected to iface \"%s\"" % { iface })
local timer
local publish = function()
- local data = get_ifstat_data(bpf, filters)
+ local data = serialize_ifstat_data(ifstat, filters)
conn:notify(ubus_objects.ifstat.__ubusobj, "ifstat.data", data)
timer:set(delay)
end
@@ -132,5 +137,30 @@ return function(BPF)
uloop.init()
timer = uloop.timer(publish)
timer:set(delay)
+ log.info("Ubus data publish rate set to %d ms" % { delay })
+
uloop.run()
+
+ return 0
end
+
+function main()
+ local str = require("debug").getinfo(1, "S").source:sub(2)
+ local script_path = str:match("(.*/)").."/?.lua;"
+ package.path = "bcc/src/lua/"..script_path..package.path
+ require("bcc.vendor.helpers")
+
+ local BPF = require("bcc.bpf")
+ local config = parse_config()
+
+ log.enabled = true
+ local res, err = xpcall(main_loop, debug.traceback, BPF, config)
+ if not res then
+ io.stderr:write("[ERROR] "..err.."\n")
+ end
+
+ -- TODO: Код ниже выполняется при SIGINT
+ BPF.cleanup()
+end
+
+main()