add respondd-module-wifictld

This commit is contained in:
Martin/Geno 2018-07-24 23:07:13 +02:00
parent 081967e141
commit cef614a321
No known key found for this signature in database
GPG Key ID: 9D7D3C6BFF600C6A
4 changed files with 220 additions and 1 deletions

View File

@ -0,0 +1,25 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=respondd-module-wifictld
PKG_VERSION:=1
PKG_RELEASE:=1
PKG_LICENSE:=BSD-2-Clause
PKG_BUILD_DEPENDS := respondd
include $(INCLUDE_DIR)/package.mk
define Package/respondd-module-wifictld
SECTION:=wireless
CATEGORY:=Network
TITLE:=Add wifictld information to respondd
DEPENDS:=+respondd +libubus +libubox
endef
define Package/respondd-module-wifictld/install
$(INSTALL_DIR) $(1)/usr/lib/respondd
$(CP) $(PKG_BUILD_DIR)/respondd.so $(1)/usr/lib/respondd/wifictld.so
endef
$(eval $(call BuildPackage,respondd-module-wifictld))

View File

@ -0,0 +1,16 @@
# standard compliance
CFLAGS += -std=c99
# warnings
CFLAGS += -Wall -Wextra -Wformat=2 -Wshadow -Wpointer-arith
CFLAGS += -pedantic
all: respondd.so
%.c: %.h
respondd.so: respondd.c
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -shared -fPIC -lubox -lubus -D_GNU_SOURCE -o $@ $^ $(LDLIBS)
clean:
rm -rf *.so

View File

@ -0,0 +1,174 @@
#include <respondd.h>
#include <json-c/json.h>
#include <libubus.h>
#include <libubox/blobmsg.h>
#define UBUS_SOCKET "/var/run/ubus.sock"
static struct blob_attr *msg_config_store, *msg_client_store;
static void cb_config(struct ubus_request *req, int type, struct blob_attr *msg)
{
if (!msg) return;
msg_config_store = msg;
}
static void cb_client(struct ubus_request *req, int type, struct blob_attr *msg)
{
if (!msg) return;
msg_client_store = msg;
}
static int ubus_fetch(const char *method, ubus_data_handler_t cb) {
int ret;
uint32_t ubus_id;
struct ubus_context *ctx = ubus_connect(UBUS_SOCKET);
if (!ctx) {
return 1;
}
ret = ubus_lookup_id(ctx, "wifictld", &ubus_id);
if (ret) {
ubus_free(ctx);
return 2;
}
ret = ubus_invoke(ctx, ubus_id, method, NULL, cb, NULL, 100);
if (ret) {
ubus_free(ctx);
return 3;
}
ubus_free(ctx);
return 0;
}
struct json_object *respondd_provider_nodeinfo(void) {
struct json_object *ret = json_object_new_object(),
*wifictld = json_object_new_object();
json_object_object_add(ret, "wifictld", wifictld);
int ubus_ret = ubus_fetch("get_config", cb_config);
if (ubus_ret) {
json_object_object_add(wifictld, "error", json_object_new_int(ubus_ret));
}
if (!msg_config_store) {
json_object_object_add(wifictld, "error", json_object_new_string("no data"));
return ret;
}
struct blob_attr *pos;
int rem;
const char *attr_name;
blobmsg_for_each_attr(pos, blobmsg_data(msg_config_store), rem) {
attr_name = blobmsg_name(pos);
switch(blobmsg_type(pos)) {
case BLOBMSG_TYPE_UNSPEC:
json_object_object_add(wifictld, attr_name, json_object_new_string("null"));
break;
/*
case BLOBMSG_TYPE_BOOL:
json_object_object_add(wifictld, attr_name, json_object_new_boolean(blobmsg_get_bool(pos)));
break;
*/
case BLOBMSG_TYPE_INT8:
json_object_object_add(wifictld, attr_name, json_object_new_int(blobmsg_get_u8(pos)));
break;
case BLOBMSG_TYPE_INT16:
json_object_object_add(wifictld, attr_name, json_object_new_int(blobmsg_get_u16(pos)));
break;
case BLOBMSG_TYPE_INT32:
json_object_object_add(wifictld, attr_name, json_object_new_int(blobmsg_get_u32(pos)));
break;
case BLOBMSG_TYPE_INT64:
json_object_object_add(wifictld, attr_name, json_object_new_int64(blobmsg_get_u64(pos)));
break;
case BLOBMSG_TYPE_DOUBLE:
json_object_object_add(wifictld, attr_name, json_object_new_double(blobmsg_get_double(pos)));
break;
case BLOBMSG_TYPE_STRING:
json_object_object_add(wifictld, attr_name, json_object_new_string(blobmsg_get_string(pos)));
break;
default:
json_object_object_add(wifictld, attr_name, json_object_new_string("error"));
}
}
return ret;
}
struct json_object *respondd_provider_statistics(void) {
struct json_object *ret = json_object_new_object(),
*wifictld = json_object_new_object();
json_object_object_add(ret, "wifictld", wifictld);
int ubus_ret = ubus_fetch("get_clients", cb_client);
if (ubus_ret) {
json_object_object_add(wifictld, "error", json_object_new_int(ubus_ret));
}
if (!msg_client_store) {
json_object_object_add(wifictld, "error", json_object_new_string("no data"));
return ret;
}
struct blob_attr *client, *pos;
int rem, remC;
const char *attr_name;
int value;
int total = 0,
client24 = 0,
client5 = 0,
authed = 0,
connected = 0,
highest_try_probe = 0,
highest_try_auth = 0;
blobmsg_for_each_attr(client, blobmsg_data(msg_client_store), rem) {
total++;
remC = blobmsg_data_len(client);
blobmsg_for_each_attr(pos, client, remC) {
attr_name = blobmsg_name(pos);
value = blobmsg_get_u32(pos);
//TODO counter by frequence, try_auth and try_probe
if (!strcmp(attr_name, "freq_highest")){
if (value > 5000)
client5++;
else
client24++;
} else if(!strcmp(attr_name, "authed")){
if(value == 1) authed++;
} else if(!strcmp(attr_name, "connected")){
if(value == 1) connected++;
} else if(!strcmp(attr_name, "try_probe")){
if(value > highest_try_probe) highest_try_probe = value;
} else if(!strcmp(attr_name, "try_auth")){
if(value > highest_try_auth) highest_try_auth = value;
}
}
}
json_object_object_add(wifictld, "total", json_object_new_int(total));
json_object_object_add(wifictld, "client24", json_object_new_int(client24));
json_object_object_add(wifictld, "client5", json_object_new_int(client5));
json_object_object_add(wifictld, "authed", json_object_new_int(authed));
json_object_object_add(wifictld, "connected", json_object_new_int(connected));
json_object_object_add(wifictld, "highest_try_probe", json_object_new_int(highest_try_probe));
json_object_object_add(wifictld, "highest_try_auth", json_object_new_int(highest_try_auth));
return ret;
}
const struct respondd_provider_info respondd_providers[] = {
{"nodeinfo", respondd_provider_nodeinfo},
{"statistics", respondd_provider_statistics},
{0, 0},
};

View File

@ -34,7 +34,7 @@ static int ubus_get_clients(struct ubus_context *ctx, struct ubus_object *obj,
blobmsg_close_table(&b, c); blobmsg_close_table(&b, c);
} }
blobmsg_close_array(&b, list); blobmsg_close_table(&b, list);
ubus_send_reply(ctx, req, b.head); ubus_send_reply(ctx, req, b.head);
@ -73,6 +73,8 @@ static int ubus_get_config(struct ubus_context *ctx, struct ubus_object *obj,
struct ubus_request_data *req, const char *method, struct blob_attr *msg) struct ubus_request_data *req, const char *method, struct blob_attr *msg)
{ {
blob_buf_init(&b, 0); blob_buf_init(&b, 0);
void *list = blobmsg_open_table(&b, "config");
blobmsg_add_bool(&b, "verbose", config_verbose); blobmsg_add_bool(&b, "verbose", config_verbose);
blobmsg_add_u32(&b, "client_try_threashold", config_client_try_threashold); blobmsg_add_u32(&b, "client_try_threashold", config_client_try_threashold);
blobmsg_add_u32(&b, "client_signal_threashold", config_client_signal_threashold); blobmsg_add_u32(&b, "client_signal_threashold", config_client_signal_threashold);
@ -84,6 +86,8 @@ static int ubus_get_config(struct ubus_context *ctx, struct ubus_object *obj,
blobmsg_add_bool(&b, "client_probe_steering", config_client_probe_steering); blobmsg_add_bool(&b, "client_probe_steering", config_client_probe_steering);
blobmsg_add_bool(&b, "client_probe_learning", config_client_probe_learning); blobmsg_add_bool(&b, "client_probe_learning", config_client_probe_learning);
blobmsg_close_table(&b, list);
ubus_send_reply(ctx, req, b.head); ubus_send_reply(ctx, req, b.head);
return 0; return 0;