diff options
author | Sergey Nazaryev <sergey@nazaryev.ru> | 2018-11-06 16:49:15 +0000 |
---|---|---|
committer | Sergey Nazaryev <sergey@nazaryev.ru> | 2018-11-06 16:54:01 +0000 |
commit | 013563a8065725111b093c9be200485b02354685 (patch) | |
tree | 2a18dba5ef3d81aa0278105fcfaadece162855de | |
parent | a81fb2b2681fe901079aa380b5008252e175387c (diff) | |
download | ifstat-013563a8065725111b093c9be200485b02354685.zip ifstat-013563a8065725111b093c9be200485b02354685.tar.gz ifstat-013563a8065725111b093c9be200485b02354685.tar.bz2 |
Избавился от вызова bcc-probe для запуска ifstatd, добавил логирование
-rw-r--r-- | README.md | 4 | ||||
-rwxr-xr-x | ifstatd.lua | 44 |
2 files changed, 39 insertions, 9 deletions
@@ -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() |